commit 735633853a0df6d8982940ae2b6377b0ab833f8d Author: Dmitry Afanasyev Date: Wed Jul 28 02:15:48 2021 +0300 initial commit diff --git a/examples/celery-rabbit-example/.gitignore b/examples/celery-rabbit-example/.gitignore new file mode 100644 index 0000000..8e0776e --- /dev/null +++ b/examples/celery-rabbit-example/.gitignore @@ -0,0 +1 @@ +!.env diff --git a/examples/celery-rabbit-example/Dockerfile b/examples/celery-rabbit-example/Dockerfile new file mode 100644 index 0000000..f2b4d46 --- /dev/null +++ b/examples/celery-rabbit-example/Dockerfile @@ -0,0 +1,34 @@ +FROM python:3.8.6-buster + +ENV PYTHONFAULTHANDLER=1 \ + PYTHONUNBUFFERED=1 \ + PYTHONHASHSEED=random \ + PYTHONDONTWRITEBYTECODE=1 \ + # pip: + PIP_NO_CACHE_DIR=off \ + PIP_DISABLE_PIP_VERSION_CHECK=on \ + PIP_DEFAULT_TIMEOUT=100 + +RUN apt-get update \ + && apt-get install --no-install-recommends -y \ + bash \ + build-essential \ + curl \ + gettext \ + git \ + libpq-dev \ + nano + +WORKDIR /code + +# Copy and install dependencies: +COPY requirements.txt /code/ +RUN python -m pip install --upgrade pip +RUN pip install --no-cache-dir -r /code/requirements.txt + +# Copy source files: +COPY . /code/ +# COPY app.py /code/ + + + diff --git a/examples/celery-rabbit-example/README.md b/examples/celery-rabbit-example/README.md new file mode 100644 index 0000000..792d838 --- /dev/null +++ b/examples/celery-rabbit-example/README.md @@ -0,0 +1,6 @@ +# celery first example + +Steps: +1. Run `docker-compose up` +2. Show logs +3. In a new terminal run `docker-compose exec worker python` diff --git a/examples/celery-rabbit-example/celery_config/__init__.py b/examples/celery-rabbit-example/celery_config/__init__.py new file mode 100644 index 0000000..d5dc429 --- /dev/null +++ b/examples/celery-rabbit-example/celery_config/__init__.py @@ -0,0 +1,3 @@ +# from app_celery import app as my_celery_app +# +# __all__ = ('my_celery_app', ) diff --git a/examples/celery-rabbit-example/celery_config/app_celery.py b/examples/celery-rabbit-example/celery_config/app_celery.py new file mode 100644 index 0000000..8fa81eb --- /dev/null +++ b/examples/celery-rabbit-example/celery_config/app_celery.py @@ -0,0 +1,25 @@ +from celery import Celery +from pathlib import Path +from decouple import AutoConfig + +BASE_DIR = Path.cwd().parent +config = AutoConfig(search_path=BASE_DIR.joinpath('config')) + + +RABBITMQ_DEFAULT_USER = config('RABBITMQ_DEFAULT_USER') +RABBITMQ_DEFAULT_PASS = config('RABBITMQ_DEFAULT_PASS') +RABBITMQ_PORT = config('RABBITMQ_PORT', cast=int, default=5672) +RABBITMQ_HOST = config('RABBITMQ_HOST') + + +app_celery_instance = Celery( + 'tasks', + broker='amqp://{login}:{password}@{host}:{port}'.format( + login=RABBITMQ_DEFAULT_USER, + password=RABBITMQ_DEFAULT_PASS, + host=RABBITMQ_HOST, + port=RABBITMQ_PORT, + ), + # TODO: try to get async results with and without backend configured + backend='rpc://', +) diff --git a/examples/celery-rabbit-example/config/.env b/examples/celery-rabbit-example/config/.env new file mode 100644 index 0000000..d2258a6 --- /dev/null +++ b/examples/celery-rabbit-example/config/.env @@ -0,0 +1,6 @@ +# RabbitMQ settings: + +RABBITMQ_DEFAULT_USER=rabbit_admin +RABBITMQ_DEFAULT_PASS=mypass +RABBITMQ_PORT=5672 +RABBITMQ_HOST=rabbitmq_host diff --git a/examples/celery-rabbit-example/docker-compose.yml b/examples/celery-rabbit-example/docker-compose.yml new file mode 100644 index 0000000..7f75a24 --- /dev/null +++ b/examples/celery-rabbit-example/docker-compose.yml @@ -0,0 +1,28 @@ +version: '3.7' + +services: + + rabbitmq: + hostname: rabbitmq_host + image: 'rabbitmq:3.8.18-management-alpine' + container_name: first_rabbit + env_file: config/.env + restart: unless-stopped + ports: + - 8080:15672 + - 5672:5672 + + worker: + container_name: first_celery + build: . + command: celery --app=my_app:app_celery_instance worker --loglevel=INFO + env_file: config/.env + depends_on: + - rabbitmq + restart: unless-stopped + +networks: + default: + name: celery_network + driver: bridge + diff --git a/examples/celery-rabbit-example/my_app.py b/examples/celery-rabbit-example/my_app.py new file mode 100644 index 0000000..99efd1f --- /dev/null +++ b/examples/celery-rabbit-example/my_app.py @@ -0,0 +1,14 @@ +from celery_config.app_celery import app_celery_instance + + +@app_celery_instance.task +def add(first: int, second: int) -> int: + print(first + second) + return first + second + + +# TODO: try with `@app.task(throws=(ZeroDivisionError,))` +@app_celery_instance.task +def div(first: int, second: int) -> float: + # TODO: show how errors work + return first / second diff --git a/examples/celery-rabbit-example/requirements.txt b/examples/celery-rabbit-example/requirements.txt new file mode 100644 index 0000000..34b6537 --- /dev/null +++ b/examples/celery-rabbit-example/requirements.txt @@ -0,0 +1,2 @@ +celery==5.0.2 +python-decouple==3.3 diff --git a/examples/celery_progress_demo/.venv/bin/Activate.ps1 b/examples/celery_progress_demo/.venv/bin/Activate.ps1 new file mode 100644 index 0000000..2fb3852 --- /dev/null +++ b/examples/celery_progress_demo/.venv/bin/Activate.ps1 @@ -0,0 +1,241 @@ +<# +.Synopsis +Activate a Python virtual environment for the current PowerShell session. + +.Description +Pushes the python executable for a virtual environment to the front of the +$Env:PATH environment variable and sets the prompt to signify that you are +in a Python virtual environment. Makes use of the command line switches as +well as the `pyvenv.cfg` file values present in the virtual environment. + +.Parameter VenvDir +Path to the directory that contains the virtual environment to activate. The +default value for this is the parent of the directory that the Activate.ps1 +script is located within. + +.Parameter Prompt +The prompt prefix to display when this virtual environment is activated. By +default, this prompt is the name of the virtual environment folder (VenvDir) +surrounded by parentheses and followed by a single space (ie. '(.venv) '). + +.Example +Activate.ps1 +Activates the Python virtual environment that contains the Activate.ps1 script. + +.Example +Activate.ps1 -Verbose +Activates the Python virtual environment that contains the Activate.ps1 script, +and shows extra information about the activation as it executes. + +.Example +Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv +Activates the Python virtual environment located in the specified location. + +.Example +Activate.ps1 -Prompt "MyPython" +Activates the Python virtual environment that contains the Activate.ps1 script, +and prefixes the current prompt with the specified string (surrounded in +parentheses) while the virtual environment is active. + +.Notes +On Windows, it may be required to enable this Activate.ps1 script by setting the +execution policy for the user. You can do this by issuing the following PowerShell +command: + +PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser + +For more information on Execution Policies: +https://go.microsoft.com/fwlink/?LinkID=135170 + +#> +Param( + [Parameter(Mandatory = $false)] + [String] + $VenvDir, + [Parameter(Mandatory = $false)] + [String] + $Prompt +) + +<# Function declarations --------------------------------------------------- #> + +<# +.Synopsis +Remove all shell session elements added by the Activate script, including the +addition of the virtual environment's Python executable from the beginning of +the PATH variable. + +.Parameter NonDestructive +If present, do not remove this function from the global namespace for the +session. + +#> +function global:deactivate ([switch]$NonDestructive) { + # Revert to original values + + # The prior prompt: + if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) { + Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt + Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT + } + + # The prior PYTHONHOME: + if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) { + Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME + Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME + } + + # The prior PATH: + if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) { + Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH + Remove-Item -Path Env:_OLD_VIRTUAL_PATH + } + + # Just remove the VIRTUAL_ENV altogether: + if (Test-Path -Path Env:VIRTUAL_ENV) { + Remove-Item -Path env:VIRTUAL_ENV + } + + # Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether: + if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) { + Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force + } + + # Leave deactivate function in the global namespace if requested: + if (-not $NonDestructive) { + Remove-Item -Path function:deactivate + } +} + +<# +.Description +Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the +given folder, and returns them in a map. + +For each line in the pyvenv.cfg file, if that line can be parsed into exactly +two strings separated by `=` (with any amount of whitespace surrounding the =) +then it is considered a `key = value` line. The left hand string is the key, +the right hand is the value. + +If the value starts with a `'` or a `"` then the first and last character is +stripped from the value before being captured. + +.Parameter ConfigDir +Path to the directory that contains the `pyvenv.cfg` file. +#> +function Get-PyVenvConfig( + [String] + $ConfigDir +) { + Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg" + + # Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue). + $pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue + + # An empty map will be returned if no config file is found. + $pyvenvConfig = @{ } + + if ($pyvenvConfigPath) { + + Write-Verbose "File exists, parse `key = value` lines" + $pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath + + $pyvenvConfigContent | ForEach-Object { + $keyval = $PSItem -split "\s*=\s*", 2 + if ($keyval[0] -and $keyval[1]) { + $val = $keyval[1] + + # Remove extraneous quotations around a string value. + if ("'""".Contains($val.Substring(0, 1))) { + $val = $val.Substring(1, $val.Length - 2) + } + + $pyvenvConfig[$keyval[0]] = $val + Write-Verbose "Adding Key: '$($keyval[0])'='$val'" + } + } + } + return $pyvenvConfig +} + + +<# Begin Activate script --------------------------------------------------- #> + +# Determine the containing directory of this script +$VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition +$VenvExecDir = Get-Item -Path $VenvExecPath + +Write-Verbose "Activation script is located in path: '$VenvExecPath'" +Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)" +Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)" + +# Set values required in priority: CmdLine, ConfigFile, Default +# First, get the location of the virtual environment, it might not be +# VenvExecDir if specified on the command line. +if ($VenvDir) { + Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values" +} +else { + Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir." + $VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/") + Write-Verbose "VenvDir=$VenvDir" +} + +# Next, read the `pyvenv.cfg` file to determine any required value such +# as `prompt`. +$pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir + +# Next, set the prompt from the command line, or the config file, or +# just use the name of the virtual environment folder. +if ($Prompt) { + Write-Verbose "Prompt specified as argument, using '$Prompt'" +} +else { + Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value" + if ($pyvenvCfg -and $pyvenvCfg['prompt']) { + Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'" + $Prompt = $pyvenvCfg['prompt']; + } + else { + Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virutal environment)" + Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'" + $Prompt = Split-Path -Path $venvDir -Leaf + } +} + +Write-Verbose "Prompt = '$Prompt'" +Write-Verbose "VenvDir='$VenvDir'" + +# Deactivate any currently active virtual environment, but leave the +# deactivate function in place. +deactivate -nondestructive + +# Now set the environment variable VIRTUAL_ENV, used by many tools to determine +# that there is an activated venv. +$env:VIRTUAL_ENV = $VenvDir + +if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) { + + Write-Verbose "Setting prompt to '$Prompt'" + + # Set the prompt to include the env name + # Make sure _OLD_VIRTUAL_PROMPT is global + function global:_OLD_VIRTUAL_PROMPT { "" } + Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT + New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt + + function global:prompt { + Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) " + _OLD_VIRTUAL_PROMPT + } +} + +# Clear PYTHONHOME +if (Test-Path -Path Env:PYTHONHOME) { + Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME + Remove-Item -Path Env:PYTHONHOME +} + +# Add the venv to the PATH +Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH +$Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH" diff --git a/examples/celery_progress_demo/.venv/bin/activate b/examples/celery_progress_demo/.venv/bin/activate new file mode 100644 index 0000000..926be29 --- /dev/null +++ b/examples/celery_progress_demo/.venv/bin/activate @@ -0,0 +1,76 @@ +# This file must be used with "source bin/activate" *from bash* +# you cannot run it directly + +deactivate () { + # reset old environment variables + if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then + PATH="${_OLD_VIRTUAL_PATH:-}" + export PATH + unset _OLD_VIRTUAL_PATH + fi + if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then + PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}" + export PYTHONHOME + unset _OLD_VIRTUAL_PYTHONHOME + fi + + # This should detect bash and zsh, which have a hash command that must + # be called to get it to forget past commands. Without forgetting + # past commands the $PATH changes we made may not be respected + if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then + hash -r + fi + + if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then + PS1="${_OLD_VIRTUAL_PS1:-}" + export PS1 + unset _OLD_VIRTUAL_PS1 + fi + + unset VIRTUAL_ENV + if [ ! "${1:-}" = "nondestructive" ] ; then + # Self destruct! + unset -f deactivate + fi +} + +# unset irrelevant variables +deactivate nondestructive + +VIRTUAL_ENV="/home/balsh/Techschool/Python-20/celery_progress_demo/.venv" +export VIRTUAL_ENV + +_OLD_VIRTUAL_PATH="$PATH" +PATH="$VIRTUAL_ENV/bin:$PATH" +export PATH + +# unset PYTHONHOME if set +# this will fail if PYTHONHOME is set to the empty string (which is bad anyway) +# could use `if (set -u; : $PYTHONHOME) ;` in bash +if [ -n "${PYTHONHOME:-}" ] ; then + _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}" + unset PYTHONHOME +fi + +if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then + _OLD_VIRTUAL_PS1="${PS1:-}" + if [ "x(.venv) " != x ] ; then + PS1="(.venv) ${PS1:-}" + else + if [ "`basename \"$VIRTUAL_ENV\"`" = "__" ] ; then + # special case for Aspen magic directories + # see https://aspen.io/ + PS1="[`basename \`dirname \"$VIRTUAL_ENV\"\``] $PS1" + else + PS1="(`basename \"$VIRTUAL_ENV\"`)$PS1" + fi + fi + export PS1 +fi + +# This should detect bash and zsh, which have a hash command that must +# be called to get it to forget past commands. Without forgetting +# past commands the $PATH changes we made may not be respected +if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then + hash -r +fi diff --git a/examples/celery_progress_demo/.venv/bin/activate.csh b/examples/celery_progress_demo/.venv/bin/activate.csh new file mode 100644 index 0000000..f9beabc --- /dev/null +++ b/examples/celery_progress_demo/.venv/bin/activate.csh @@ -0,0 +1,37 @@ +# This file must be used with "source bin/activate.csh" *from csh*. +# You cannot run it directly. +# Created by Davide Di Blasi . +# Ported to Python 3.3 venv by Andrew Svetlov + +alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; test "\!:*" != "nondestructive" && unalias deactivate' + +# Unset irrelevant variables. +deactivate nondestructive + +setenv VIRTUAL_ENV "/home/balsh/Techschool/Python-20/celery_progress_demo/.venv" + +set _OLD_VIRTUAL_PATH="$PATH" +setenv PATH "$VIRTUAL_ENV/bin:$PATH" + + +set _OLD_VIRTUAL_PROMPT="$prompt" + +if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then + if (".venv" != "") then + set env_name = ".venv" + else + if (`basename "VIRTUAL_ENV"` == "__") then + # special case for Aspen magic directories + # see https://aspen.io/ + set env_name = `basename \`dirname "$VIRTUAL_ENV"\`` + else + set env_name = `basename "$VIRTUAL_ENV"` + endif + endif + set prompt = "[$env_name] $prompt" + unset env_name +endif + +alias pydoc python -m pydoc + +rehash diff --git a/examples/celery_progress_demo/.venv/bin/activate.fish b/examples/celery_progress_demo/.venv/bin/activate.fish new file mode 100644 index 0000000..7e70d47 --- /dev/null +++ b/examples/celery_progress_demo/.venv/bin/activate.fish @@ -0,0 +1,75 @@ +# This file must be used with ". bin/activate.fish" *from fish* (http://fishshell.org) +# you cannot run it directly + +function deactivate -d "Exit virtualenv and return to normal shell environment" + # reset old environment variables + if test -n "$_OLD_VIRTUAL_PATH" + set -gx PATH $_OLD_VIRTUAL_PATH + set -e _OLD_VIRTUAL_PATH + end + if test -n "$_OLD_VIRTUAL_PYTHONHOME" + set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME + set -e _OLD_VIRTUAL_PYTHONHOME + end + + if test -n "$_OLD_FISH_PROMPT_OVERRIDE" + functions -e fish_prompt + set -e _OLD_FISH_PROMPT_OVERRIDE + functions -c _old_fish_prompt fish_prompt + functions -e _old_fish_prompt + end + + set -e VIRTUAL_ENV + if test "$argv[1]" != "nondestructive" + # Self destruct! + functions -e deactivate + end +end + +# unset irrelevant variables +deactivate nondestructive + +set -gx VIRTUAL_ENV "/home/balsh/Techschool/Python-20/celery_progress_demo/.venv" + +set -gx _OLD_VIRTUAL_PATH $PATH +set -gx PATH "$VIRTUAL_ENV/bin" $PATH + +# unset PYTHONHOME if set +if set -q PYTHONHOME + set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME + set -e PYTHONHOME +end + +if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" + # fish uses a function instead of an env var to generate the prompt. + + # save the current fish_prompt function as the function _old_fish_prompt + functions -c fish_prompt _old_fish_prompt + + # with the original prompt function renamed, we can override with our own. + function fish_prompt + # Save the return status of the last command + set -l old_status $status + + # Prompt override? + if test -n "(.venv) " + printf "%s%s" "(.venv) " (set_color normal) + else + # ...Otherwise, prepend env + set -l _checkbase (basename "$VIRTUAL_ENV") + if test $_checkbase = "__" + # special case for Aspen magic directories + # see https://aspen.io/ + printf "%s[%s]%s " (set_color -b blue white) (basename (dirname "$VIRTUAL_ENV")) (set_color normal) + else + printf "%s(%s)%s" (set_color -b blue white) (basename "$VIRTUAL_ENV") (set_color normal) + end + end + + # Restore the return status of the previous command. + echo "exit $old_status" | . + _old_fish_prompt + end + + set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" +end diff --git a/examples/celery_progress_demo/.venv/bin/celery b/examples/celery_progress_demo/.venv/bin/celery new file mode 100755 index 0000000..e5b869a --- /dev/null +++ b/examples/celery_progress_demo/.venv/bin/celery @@ -0,0 +1,8 @@ +#!/home/balsh/Techschool/Python-20/celery_progress_demo/.venv/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from celery.__main__ import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/examples/celery_progress_demo/.venv/bin/confusable_homoglyphs b/examples/celery_progress_demo/.venv/bin/confusable_homoglyphs new file mode 100755 index 0000000..3661e88 --- /dev/null +++ b/examples/celery_progress_demo/.venv/bin/confusable_homoglyphs @@ -0,0 +1,8 @@ +#!/home/balsh/Techschool/Python-20/celery_progress_demo/.venv/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from confusable_homoglyphs.cli import cli +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(cli()) diff --git a/examples/celery_progress_demo/.venv/bin/django-admin b/examples/celery_progress_demo/.venv/bin/django-admin new file mode 100755 index 0000000..b92ca97 --- /dev/null +++ b/examples/celery_progress_demo/.venv/bin/django-admin @@ -0,0 +1,8 @@ +#!/home/balsh/Techschool/Python-20/celery_progress_demo/.venv/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from django.core.management import execute_from_command_line +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(execute_from_command_line()) diff --git a/examples/celery_progress_demo/.venv/bin/django-admin.py b/examples/celery_progress_demo/.venv/bin/django-admin.py new file mode 100755 index 0000000..19c57b4 --- /dev/null +++ b/examples/celery_progress_demo/.venv/bin/django-admin.py @@ -0,0 +1,21 @@ +#!/home/balsh/Techschool/Python-20/celery_progress_demo/.venv/bin/python3 +# When the django-admin.py deprecation ends, remove this script. +import warnings + +from django.core import management + +try: + from django.utils.deprecation import RemovedInDjango40Warning +except ImportError: + raise ImportError( + 'django-admin.py was deprecated in Django 3.1 and removed in Django ' + '4.0. Please manually remove this script from your virtual environment ' + 'and use django-admin instead.' + ) + +if __name__ == "__main__": + warnings.warn( + 'django-admin.py is deprecated in favor of django-admin.', + RemovedInDjango40Warning, + ) + management.execute_from_command_line() diff --git a/examples/celery_progress_demo/.venv/bin/easy_install b/examples/celery_progress_demo/.venv/bin/easy_install new file mode 100755 index 0000000..e5d34ff --- /dev/null +++ b/examples/celery_progress_demo/.venv/bin/easy_install @@ -0,0 +1,8 @@ +#!/home/balsh/Techschool/Python-20/celery_progress_demo/.venv/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from setuptools.command.easy_install import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/examples/celery_progress_demo/.venv/bin/easy_install-3.8 b/examples/celery_progress_demo/.venv/bin/easy_install-3.8 new file mode 100755 index 0000000..e5d34ff --- /dev/null +++ b/examples/celery_progress_demo/.venv/bin/easy_install-3.8 @@ -0,0 +1,8 @@ +#!/home/balsh/Techschool/Python-20/celery_progress_demo/.venv/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from setuptools.command.easy_install import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/examples/celery_progress_demo/.venv/bin/gunicorn b/examples/celery_progress_demo/.venv/bin/gunicorn new file mode 100755 index 0000000..8998e0b --- /dev/null +++ b/examples/celery_progress_demo/.venv/bin/gunicorn @@ -0,0 +1,8 @@ +#!/home/balsh/Techschool/Python-20/celery_progress_demo/.venv/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from gunicorn.app.wsgiapp import run +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(run()) diff --git a/examples/celery_progress_demo/.venv/bin/pip b/examples/celery_progress_demo/.venv/bin/pip new file mode 100755 index 0000000..a7ed669 --- /dev/null +++ b/examples/celery_progress_demo/.venv/bin/pip @@ -0,0 +1,8 @@ +#!/home/balsh/Techschool/Python-20/celery_progress_demo/.venv/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/examples/celery_progress_demo/.venv/bin/pip3 b/examples/celery_progress_demo/.venv/bin/pip3 new file mode 100755 index 0000000..a7ed669 --- /dev/null +++ b/examples/celery_progress_demo/.venv/bin/pip3 @@ -0,0 +1,8 @@ +#!/home/balsh/Techschool/Python-20/celery_progress_demo/.venv/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/examples/celery_progress_demo/.venv/bin/pip3.8 b/examples/celery_progress_demo/.venv/bin/pip3.8 new file mode 100755 index 0000000..a7ed669 --- /dev/null +++ b/examples/celery_progress_demo/.venv/bin/pip3.8 @@ -0,0 +1,8 @@ +#!/home/balsh/Techschool/Python-20/celery_progress_demo/.venv/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/examples/celery_progress_demo/.venv/bin/python b/examples/celery_progress_demo/.venv/bin/python new file mode 120000 index 0000000..b8a0adb --- /dev/null +++ b/examples/celery_progress_demo/.venv/bin/python @@ -0,0 +1 @@ +python3 \ No newline at end of file diff --git a/examples/celery_progress_demo/.venv/bin/python3 b/examples/celery_progress_demo/.venv/bin/python3 new file mode 120000 index 0000000..79ab74b --- /dev/null +++ b/examples/celery_progress_demo/.venv/bin/python3 @@ -0,0 +1 @@ +/usr/local/bin/python3 \ No newline at end of file diff --git a/examples/celery_progress_demo/.venv/bin/sqlformat b/examples/celery_progress_demo/.venv/bin/sqlformat new file mode 100755 index 0000000..b8c76a7 --- /dev/null +++ b/examples/celery_progress_demo/.venv/bin/sqlformat @@ -0,0 +1,8 @@ +#!/home/balsh/Techschool/Python-20/celery_progress_demo/.venv/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from sqlparse.__main__ import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/Django-3.2.5.dist-info/AUTHORS b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/Django-3.2.5.dist-info/AUTHORS new file mode 100644 index 0000000..256118a --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/Django-3.2.5.dist-info/AUTHORS @@ -0,0 +1,1003 @@ +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 Swartz + Aaron T. Myers + Abeer Upadhyay + Abhijeet Viswa + Abhinav Patil + Abhishek Gautam + Abhyudai + Adam Allred + Adam Bogdał + Adam Donaghy + Adam Johnson + Adam Malinowski + Adam Vandenberg + Adiyat Mubarak + Adnan Umer + Adrian Holovaty + Adrien Lemaire + Afonso Fernández Nogueira + AgarFu + Ahmad Alhashemi + Ahmad Al-Ibrahim + Ahmed Eltawela + ajs + Akash Agrawal + Akis Kesoglou + Aksel Ethem + Akshesh Doshi + alang@bright-green.com + Alasdair Nicol + Albert Wang + Alcides Fonseca + Aldian Fazrihady + Aleksandra Sendecka + Aleksi Häkli + Alexander Dutton + 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 + Aljosa Mohorovic + 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 + Andrew Brehaut + Andrew Clark + Andrew Durdin + Andrew Godwin + Andrew Pinkham + Andrews Medina + Andriy Sokolovskiy + Andy Chosak + Andy Dustman + Andy Gayton + andy@jadedplanet.net + Anssi Kääriäinen + ant9000@netwise.it + Anthony Briggs + Anton Samarchyan + Antoni Aloy + Antonio Cavedoni + Antonis Christofides + Antti Haapala + Antti Kaihola + Anubhav Joshi + Aram Dulyan + arien + Armin Ronacher + Aron Podrigal + Artem Gnilov + Arthur + Arthur Jovart + Arthur Koziel + Arthur Rio + Arvis Bickovskis + 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 Dean Kawamura + Ben Firshman + Ben Godfrey + Benjamin Wohlwend + Ben Khoo + Ben Slavin + Ben Sturmfels + Berker Peksag + Bernd Schlapsi + Bernhard Essl + berto + 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 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 + 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 + 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 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 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 + 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 + Erwin Junge + Esdras Beleza + Espen Grindhaug + Étienne Beaulé + Eugene Lazutkin + Evan Grim + Fabrice Aneche + Farhaan Bukhsh + favo@exoweb.net + fdr + Federico Capoano + Felipe Lee + Filip Noetzel + Filip Wasilewski + Finn Gruwier Larsen + Flávio Juvenal da Silva Junior + flavio.curella@gmail.com + Florian Apolloner + Florian Demmer + Florian Moussous + Fran Hrženjak + Francisco Albarran Cristobal + Francisco Couzo + François Freitag + Frank Tegtmeyer + Frank Wierzbicki + Frank Wiles + František Malina + Fraser Nevett + Gabriel Grant + Gabriel Hurley + gandalf@owca.info + Garry Lawrence + Garry Polley + Garth Kidd + Gary Wilson + Gasper Koren + Gasper Zejn + Gavin Wahl + Ge Hanbin + geber@datacollect.com + Geert Vanderkelen + George Karpenkov + George Song + George Vilches + Georg "Hugo" Bauer + Georgi Stanojevski + Gerardo Orozco + Gil Gonçalves + Girish Kumar + Gisle Aas + Glenn Maynard + glin@seznam.cz + GomoX + Gonzalo Saavedra + Gopal Narayanan + Graham Carlyle + Grant Jenks + Greg Chapple + Gregor Allensworth + Gregor Müllegger + Grigory Fateyev + Grzegorz Ślusarek + Guilherme Mesquita Gondim + Guillaume Pannatier + Gustavo Picon + hambaloney + Hang Park + Hannes Ljungberg + Hannes Struß + Harm Geerts + Hasan Ramezani + Hawkeye + Helen Sherwood-Taylor + Henrique Romano + Henry Dang + Hidde Bultsma + Himanshu Chauhan + hipertracker@gmail.com + Hiroki Kiyohara + Honza Král + Horst Gutmann + Hugo Osvaldo Barrera + HyukJin Jang + Hyun Mi Ae + Iacopo Spalletti + Ian A Wilson + Ian Clelland + Ian G. Kelly + Ian Holsman + Ian Lee + Ibon + Idan Gazit + Idan Melamed + Ifedapo Olarewaju + Igor Kolar + Illia Volochii + 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 Walls + Jakub Paczkowski + Jakub Wilk + Jakub Wiśniowski + james_027@yahoo.com + James Aylett + James Bennett + James Murty + James Tauber + James Timmins + James Turk + James Wheare + Jannis Leidel + Janos Guljas + Jan Pazdziora + Jan Rademaker + Jarek Głowacki + Jarek Zgoda + 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é + 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 + 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 + Jonas Haag + Jonatas C. D. + Jonathan Buchanan + Jonathan Daugherty (cygnus) + Jonathan Feignberg + Jonathan Slenders + 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 + Julien Phalip + Junyoung Choi + junzhang.jn@gmail.com + Jure Cuhalev + Justin Bronn + Justine Tunney + Justin Lilly + Justin Michalicek + Justin Myles Holmes + Jyrki Pulliainen + Kadesarin Sanjek + Karderio + Karen Tracey + Karol Sikora + Katherine “Kati” Michel + Kathryn Killebrew + Katie Miller + Keith Bussell + Kenneth Love + Kent Hauser + Kevin Grinberg + Kevin Kubasik + Kevin McConnell + Kieran Holland + kilian + Kim Joon Hwan 김준환 + Klaas van Schelven + knox + konrad@gwu.edu + Kowito Charoenratchatabhan + Krišjānis Vaiders + krzysiek.pawlik@silvermedia.pl + 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 + Leo "hylje" Honkanen + Leo Shklovskii + Leo Soto + lerouxb@gmail.com + Lex Berezhny + Liang Feng + limodou + Lincoln Smith + Liu Yijie <007gzs@gmail.com> + Loek van Gent + Loïc Bistuer + Lowe Thiderman + Luan Pablo + Lucas Connors + Luciano Ramalho + 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 + Marc Fargas + Marc Garcia + Marcin Wróbel + Marc Remolt + Marc Tamlyn + Marc-Aurèle Brothier + Marian Andre + Marijn Vriens + Mario Gonzalez + Mariusz Felisiak + Mark Biggers + 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 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 Turcotte + Maximilian Merz + Maximillian Dornseif + mccutchen@gmail.com + Meghana Bhange + Meir Kriheli + Michael S. Brown + Michael Hall + Michael Josephson + 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 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é + Niran Babalola + Nis Jørgensen + Nowell Strite + Nuno Mariz + Octavio Peri + oggie rob + oggy + Oliver Beattie + Oliver Rutherfurd + Olivier Sels + Olivier Tabone + Orestis Markou + Orne Brocaar + Oscar Ramirez + Ossama M. Khayat + Owen Griffiths + 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 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 + Preston Holmes + Preston Timmons + Priyansh Saxena + Przemysław Buczkowski + Przemysław Suliga + Qi Zhao + Rachel Tobin + Rachel Willmer + Radek Švarz + Raffaele Salmaso + Rajesh Dhawan + Ramez Ashraf + 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 + Romain Garrigues + Ronny Haryanto + Ross Poulton + Rozza + Rudolph Froger + Rudy Mutter + Rune Rønde Laursen + Russell Cloran + Russell Keith-Magee + Russ Webber + Ryan Hall + ryankanno + Ryan Kelly + Ryan Niemeyer + Ryan Petrello + Ryan Rubin + Ryno Mathee + Sachin Jat + Sage M. Abdullah + Sam Newman + Sander Dijkhuis + Sanket Saurav + Sanyam Khurana + 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 + Shai Berger + Shannon -jj Behrens + Shawn Milochik + 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 + 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 + 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 + Tim Allen + Tim Givois + Tim Graham + Tim Heap + Tim Saylor + Tobias Kunze + Tobias McNulty + tobias@neuyork.de + Todd O'Bryan + Tom Carrick + Tom Christie + Tom Forbes + Tom Insam + Tom Tobin + 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 + 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 + Wilson Miner + Wim Glenn + wojtek + Xavier Francisco + Xia Kai + Yann Fouillat + Yann Malet + Yasushi Masuda + ye7cakf02@sneakemail.com + ymasuda@ethercube.com + Yoong Kang Lim + Yusuke Miyazaki + 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://www.diveinto.org/python3/). + + Guido van Rossum for creating Python. diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/Django-3.2.5.dist-info/INSTALLER b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/Django-3.2.5.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/Django-3.2.5.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/Django-3.2.5.dist-info/LICENSE b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/Django-3.2.5.dist-info/LICENSE new file mode 100644 index 0000000..5f4f225 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/Django-3.2.5.dist-info/LICENSE @@ -0,0 +1,27 @@ +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/Django-3.2.5.dist-info/LICENSE.python b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/Django-3.2.5.dist-info/LICENSE.python new file mode 100644 index 0000000..8e1c618 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/Django-3.2.5.dist-info/LICENSE.python @@ -0,0 +1,265 @@ +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 http://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 http://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 http://www.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 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, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, +2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 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. diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/Django-3.2.5.dist-info/METADATA b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/Django-3.2.5.dist-info/METADATA new file mode 100644 index 0000000..90c809d --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/Django-3.2.5.dist-info/METADATA @@ -0,0 +1,97 @@ +Metadata-Version: 2.1 +Name: Django +Version: 3.2.5 +Summary: A high-level Python Web framework that encourages rapid development and clean, pragmatic design. +Home-page: https://www.djangoproject.com/ +Author: Django Software Foundation +Author-email: foundation@djangoproject.com +License: BSD-3-Clause +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/ +Platform: UNKNOWN +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.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +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.6 +Requires-Dist: asgiref (<4,>=3.3.2) +Requires-Dist: pytz +Requires-Dist: sqlparse (>=0.2.2) +Provides-Extra: argon2 +Requires-Dist: argon2-cffi (>=19.1.0) ; extra == 'argon2' +Provides-Extra: bcrypt +Requires-Dist: bcrypt ; extra == 'bcrypt' + +====== +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. See https://web.libera.chat if you're new to IRC. + +* Join the django-users mailing list, or read the archives, at + https://groups.google.com/group/django-users. + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/Django-3.2.5.dist-info/RECORD b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/Django-3.2.5.dist-info/RECORD new file mode 100644 index 0000000..f3ae0e8 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/Django-3.2.5.dist-info/RECORD @@ -0,0 +1,4377 @@ +../../../bin/__pycache__/django-admin.cpython-38.pyc,, +../../../bin/django-admin,sha256=wbQH4FKsXHOjU1HLD_WSR29jlRzZeZeSw46-WtpRBz8,318 +../../../bin/django-admin.py,sha256=Pn4NyuLiOfbJedriyzMlXOSYwIoYB34w6oxCk80WMqE,643 +Django-3.2.5.dist-info/AUTHORS,sha256=9MnhZ18vr5pbicYVTBz2psQVvl4Vt2R_0AGr7T8gRA4,38678 +Django-3.2.5.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Django-3.2.5.dist-info/LICENSE,sha256=uEZBXRtRTpwd_xSiLeuQbXlLxUbKYSn5UKGM0JHipmk,1552 +Django-3.2.5.dist-info/LICENSE.python,sha256=KGS1UtMEsSD14oP7_VTQphIi5e4tJ_dmgieAi2_og3A,13227 +Django-3.2.5.dist-info/METADATA,sha256=529R0nDRcPYlyDChfofKvf-526eWiSiPcXuy1mAGMag,3939 +Django-3.2.5.dist-info/RECORD,, +Django-3.2.5.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +Django-3.2.5.dist-info/WHEEL,sha256=g4nMs7d-Xl9-xC9XovUrsDHGXt-FT0E17Yqo92DEfvY,92 +Django-3.2.5.dist-info/entry_points.txt,sha256=daYW_s0r8Z5eiRi_bNU6vodHqVUXQWzm-DHFOQHTV2Q,83 +Django-3.2.5.dist-info/top_level.txt,sha256=V_goijg9tfO20ox_7os6CcnPvmBavbxu46LpJiNLwjA,7 +django/__init__.py,sha256=nLARC6yU6StCz-tj4uaazbtasluTnN72WdA_jlFlSEQ,799 +django/__main__.py,sha256=9a5To1vQXqf2Jg_eh8nLvIc0GXmDjEXv4jE1QZEqBFk,211 +django/__pycache__/__init__.cpython-38.pyc,, +django/__pycache__/__main__.cpython-38.pyc,, +django/__pycache__/shortcuts.cpython-38.pyc,, +django/apps/__init__.py,sha256=t0F4yceU4SbybMeWBvpuE6RsGaENmQCVbNSdSuXiEMs,90 +django/apps/__pycache__/__init__.cpython-38.pyc,, +django/apps/__pycache__/config.cpython-38.pyc,, +django/apps/__pycache__/registry.cpython-38.pyc,, +django/apps/config.py,sha256=jClakIsqtkVqCEBdJLUkviiG9UHUPSqfjxKfc_0wCXI,13302 +django/apps/registry.py,sha256=LY1_wYiHKjGZCKPmAB612fUje69mtrkth5vhBvE5UrM,17513 +django/bin/__pycache__/django-admin.cpython-38.pyc,, +django/bin/django-admin.py,sha256=jrlSFh4UnmMJLqRJNdJKgA_2nm24FYIEUBM0kL2RV8s,656 +django/conf/__init__.py,sha256=ocXk33i1TKVsddQ4cVkYGS2-2ilIZnm6srdxjFXPWb0,10509 +django/conf/__pycache__/__init__.cpython-38.pyc,, +django/conf/__pycache__/global_settings.cpython-38.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=mH0AcvVy2wX9CqazZhR6YoU50qJ6tYHnABngR2ayCbI,22752 +django/conf/locale/__init__.py,sha256=iIM8lCB1ze6jqCA-mYk1JWn987kTMi_d3oMkhtLf2HQ,13460 +django/conf/locale/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/af/LC_MESSAGES/django.mo,sha256=3KYsjZe0UVNs12pbY1C71twF3KuIQAnLD6yyFPxG0CM,21840 +django/conf/locale/af/LC_MESSAGES/django.po,sha256=v1ebpND1kYlrQFEWhYwCq-Zbe1ujvf3xYqcmUBDmvZk,26530 +django/conf/locale/ar/LC_MESSAGES/django.mo,sha256=QO9CMIzKOV56Mve13lc3KvkbLTQXNDxizLNsYzQWs78,35328 +django/conf/locale/ar/LC_MESSAGES/django.po,sha256=wtuLy6Ty3XdTicasSbv_2TZXM75KUQCFt3oXad_iiD0,38269 +django/conf/locale/ar/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/ar/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/ar/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/ar/formats.py,sha256=nm5cnBh1YYjwD4eydBZ5AoknwN54piwrpB25ijpDT-o,696 +django/conf/locale/ar_DZ/LC_MESSAGES/django.mo,sha256=1LjYIo3qTIliodHd4Mm7Gmh2tzuZRZzc6s0zohGsiNU,35409 +django/conf/locale/ar_DZ/LC_MESSAGES/django.po,sha256=a5lRnz_D4NgsMxCnU_lxE8JsQb3VEfXQ3xIXgH-VQrI,38151 +django/conf/locale/ar_DZ/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/ar_DZ/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/ar_DZ/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/ar_DZ/formats.py,sha256=qYoVLwXYkSbP13DGt8xHaNzru9v-7rhl_vUrpdz3Aos,907 +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=lsm6IvKmBmUxUCqVW3RowQxKXd6TPzwGKGw7jeO5FX0,27170 +django/conf/locale/az/LC_MESSAGES/django.po,sha256=yO6Qd6eTX9Z9JRVAynpwlZNz8Q8VFgNEkjw8-v9A-Ck,29059 +django/conf/locale/az/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/az/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/az/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/az/formats.py,sha256=Nk4qQqSl5CVtmA2sPA2WQAm12JZowENXH3TjiMxFZuk,1105 +django/conf/locale/be/LC_MESSAGES/django.mo,sha256=IrObGY3L3hf4NuAusYrbwulOK9MCxLJXW4BMHGQGYhE,36239 +django/conf/locale/be/LC_MESSAGES/django.po,sha256=jYUPKFD52M3aYKMJ_05rzMIF-fq_qtnjW0A2412DZEE,38798 +django/conf/locale/bg/LC_MESSAGES/django.mo,sha256=CEeXFNvizpLjS7RcTeiohGJN_s6YqpPn8JUMwjb6lHY,23422 +django/conf/locale/bg/LC_MESSAGES/django.po,sha256=4YwzvFO8IBWjWbMIMBMZBa9HnbJHWoI24zD1cWhl1tI,30133 +django/conf/locale/bg/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/bg/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/bg/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/bg/formats.py,sha256=iC9zYHKphMaSnluBZfYvH1kV5aDyl3ycsqVjxOoqfOY,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-38.pyc,, +django/conf/locale/bn/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/bn/formats.py,sha256=INeNl0xlt9B-YJTkcdC2kSpJLly9d5AKT60GMyS-Bm4,964 +django/conf/locale/br/LC_MESSAGES/django.mo,sha256=_FgUCO-4axk8vTwhhf0JejW8jNjk8lmJEcha8V4vP_U,14291 +django/conf/locale/br/LC_MESSAGES/django.po,sha256=6AExAxT4GQRuzTgv6rtAJkxPEhUXWZeNqFVzNTF9jRs,24356 +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-38.pyc,, +django/conf/locale/bs/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/bs/formats.py,sha256=NltIKZw0-WnZW0QY2D2EqqdctUyNc8FEARZ1RRYKtHo,705 +django/conf/locale/ca/LC_MESSAGES/django.mo,sha256=Jkn81L1cKRUxA1Ea_KwTL2eb93aq45FCUweAkNSKcCk,26414 +django/conf/locale/ca/LC_MESSAGES/django.po,sha256=4A9osLUdzYk2JYpvucf227eeLYn1eU-Q8opHkai-AVg,29390 +django/conf/locale/ca/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/ca/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/ca/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/ca/formats.py,sha256=rQJTIIy-DNSu0mASIoXLHWpS8rVar64zkJ-NTM1VMTM,951 +django/conf/locale/cs/LC_MESSAGES/django.mo,sha256=OYfRm7uMXwPzMeGOk6HnQuwqSz8p-aE5FRJumLGHbRE,29027 +django/conf/locale/cs/LC_MESSAGES/django.po,sha256=19qv8rtJ1wm_C_82bwUAi_NlByONaFpaXzqK9_0PP2w,31791 +django/conf/locale/cs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/cs/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/cs/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/cs/formats.py,sha256=SdYIul8ycV5SOzm1gCYmZLqYfZnlxqPbPFW8KuwevnM,1549 +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-38.pyc,, +django/conf/locale/cy/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/cy/formats.py,sha256=Rg9qe-bsk7MXrSfQyDOHOsa9m0qey18nqocar93GuF4,1594 +django/conf/locale/da/LC_MESSAGES/django.mo,sha256=0JF9j6U_rL2W-ZWccdacEQe0YWFrEoC_-uiqvTDKIkk,26810 +django/conf/locale/da/LC_MESSAGES/django.po,sha256=gYJmSGK4o56GoVSB4Obihl2iAs6pC1k_QhgyOFlGlZA,29183 +django/conf/locale/da/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/da/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/da/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/da/formats.py,sha256=jquE6tLj9nOxcGtH_326w57sH9BKhP4BKtPz6eCi4k8,941 +django/conf/locale/de/LC_MESSAGES/django.mo,sha256=mJi5sIz8AXi5UG37KwF3ZeuqyCM4wAKXZ6qTeDgauTU,28125 +django/conf/locale/de/LC_MESSAGES/django.po,sha256=G_HkvboL5tJNlY3b-B3k0UXvXIPLz_2tJX5zJZCMqko,30312 +django/conf/locale/de/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/de/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/de/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/de/formats.py,sha256=cboIdd5DucaqpBdqckaZG6rEhu-OYubCNzrq-qYx0Uo,992 +django/conf/locale/de_CH/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/de_CH/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/de_CH/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/de_CH/formats.py,sha256=EIMNT_qD3RAyWYNbDh7EeKwDN_B4sij6PCy64Ypts-I,1373 +django/conf/locale/dsb/LC_MESSAGES/django.mo,sha256=WFMXoI8OOsBZIS55Xd3b5XWZyhplgcGtv_t_o9djQMk,29585 +django/conf/locale/dsb/LC_MESSAGES/django.po,sha256=LPUqiRhs64nJnXEZR8Ow8eKD8Tb922jaYcTO3XRNl3o,32041 +django/conf/locale/el/LC_MESSAGES/django.mo,sha256=NHyfX4V00FKgGev0vrjo_2GtXtGdhnCBFcg2n2rJn48,34298 +django/conf/locale/el/LC_MESSAGES/django.po,sha256=z1mRXQQry_1W5x3Jkor2ccOEF4wCTsbhCmUkfGXLZPA,37315 +django/conf/locale/el/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/el/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/el/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/el/formats.py,sha256=w_3KgU9IKNr7BUQw81drogSqEyK8Zw8W0O73EGiRxIw,1257 +django/conf/locale/en/LC_MESSAGES/django.mo,sha256=mVpSj1AoAdDdW3zPZIg5ZDsDbkSUQUMACg_BbWHGFig,356 +django/conf/locale/en/LC_MESSAGES/django.po,sha256=xBs1yW9APHIOKRxkUYELndKLUB8e78PjEFsFKHEVjcI,29394 +django/conf/locale/en/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/en/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/en/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/en/formats.py,sha256=sr2fzOex-HRdvbYTr_bUiZFSQWyPpN2y5eq_h6zyceQ,1620 +django/conf/locale/en_AU/LC_MESSAGES/django.mo,sha256=js3_n3k5hOtU15__AYZ7pFtpfubIeoXZlav05O27sNg,15223 +django/conf/locale/en_AU/LC_MESSAGES/django.po,sha256=lvkcp457FspF5rNwHKY4RndXCdcjaRVygndWRsdKm4M,23302 +django/conf/locale/en_AU/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/en_AU/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/en_AU/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/en_AU/formats.py,sha256=q_a1ONYb130Lb5XIAbkbFRO_qgRk71tDi2grqiClAhw,1889 +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-38.pyc,, +django/conf/locale/en_GB/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/en_GB/formats.py,sha256=vJUVE_XIGGcwvGiO6tl2oNNzKSz1KjYOc8HnSvqhokg,1889 +django/conf/locale/eo/LC_MESSAGES/django.mo,sha256=G5VNi-7AMozkh0vK3UhPJi1tCbqJWSTeFSMoHo4jfvM,20433 +django/conf/locale/eo/LC_MESSAGES/django.po,sha256=0UwyG4ncz-dI6tkC2gLWg56EgmU1YLBspAh50Caj7-o,26212 +django/conf/locale/eo/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/eo/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/eo/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/eo/formats.py,sha256=MTipqX6SDmgmGbY9gVTMdthz2lvF_caBNgzWDxYVt50,2162 +django/conf/locale/es/LC_MESSAGES/django.mo,sha256=-7dqO1YrC5WPMz-oa90Nb9DT2Q2ZBVHvv77D_6tchnc,27567 +django/conf/locale/es/LC_MESSAGES/django.po,sha256=FHDorWXhlIltTaptu0Lda6hLWV_jX8Bfb_Xw_F9YKSo,30791 +django/conf/locale/es/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/es/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/es/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/es/formats.py,sha256=Z-aM3Z7h7Fjk2SAWKhnUYiuKbHpc7nZZ3-wnelK0NwI,949 +django/conf/locale/es_AR/LC_MESSAGES/django.mo,sha256=tOu9LkbltfWklTlCRdR_n8_XfqPGblDINQXoGmOiSE8,27925 +django/conf/locale/es_AR/LC_MESSAGES/django.po,sha256=ek_VC-_rVpU9PXJsFPRK0NV9WWSkqF06uCQDd5_jeK0,30086 +django/conf/locale/es_AR/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/es_AR/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/es_AR/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/es_AR/formats.py,sha256=wY64-6a2hajRveIgJLpkKES_v-QejkkgExdnnJdYN1E,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-38.pyc,, +django/conf/locale/es_CO/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/es_CO/formats.py,sha256=kvTsKSaK7oDWK6a-SeO3V3e__64SjtDBMWoq0ouVDJ4,700 +django/conf/locale/es_MX/LC_MESSAGES/django.mo,sha256=CWpmhzGDdfUZ1k59EqU9MmZI_fvzFHsnDFTwV_qWqj0,17424 +django/conf/locale/es_MX/LC_MESSAGES/django.po,sha256=BLUYqbCL9Jw_S5f-7Us_vLbkc8Qjz1Uq83bdX6rg4zU,25029 +django/conf/locale/es_MX/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/es_MX/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/es_MX/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/es_MX/formats.py,sha256=tny9CPrJJV5qRJ_myuiQ8fMfg3fnNtv3q6aOSxLdK0E,799 +django/conf/locale/es_NI/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/es_NI/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/es_NI/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/es_NI/formats.py,sha256=QMfHoEWcpR_8yLaE66w5UjmPjtgTAU7Yli8JHgSxGRI,740 +django/conf/locale/es_PR/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/es_PR/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/es_PR/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/es_PR/formats.py,sha256=mYKWumkfGElGDL92G0nO_loBoSOOFKs0ktsI3--nlLQ,671 +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=Ca2VcfkCDlKm64IohDlZ_JPTpk09BZJ1qhttUHz0CXg,26646 +django/conf/locale/et/LC_MESSAGES/django.po,sha256=mf16HWWeQpCnvghI3fHB9vHj8hb_5HDLKms73cUgces,29176 +django/conf/locale/et/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/et/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/et/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/et/formats.py,sha256=kD0IrKxW4AlMhS6fUEXUtyPWfsdLuBzdDHiEmdfzadQ,707 +django/conf/locale/eu/LC_MESSAGES/django.mo,sha256=EFcIbNvLcmCCW2S2A5icZ7pArQzjEgQhGtXuU3NMEPA,21743 +django/conf/locale/eu/LC_MESSAGES/django.po,sha256=aZR0jWdLCcfMfWIc-WErfNpeEa3rz3SkTKFmL97OKs0,27112 +django/conf/locale/eu/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/eu/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/eu/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/eu/formats.py,sha256=R-Ex1e1CoDDIul2LGuhXH5-ZBsiRpTerqxqRAmB8gFM,749 +django/conf/locale/fa/LC_MESSAGES/django.mo,sha256=9YYslrspOQN7Jd1pr1U9I64h35hpNkvGdTC77DKw1S4,31497 +django/conf/locale/fa/LC_MESSAGES/django.po,sha256=jyKkkTekW10qKAnq1SKiPQJj5oS1SYq4LhRII4f5dZ8,34304 +django/conf/locale/fa/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/fa/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/fa/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/fa/formats.py,sha256=RCDlj-iiAS7MVgWwOFSvQ_-QROhBm-7d8OP6QhkcGZw,722 +django/conf/locale/fi/LC_MESSAGES/django.mo,sha256=nv_oUXyAkazEJOoi7o-KVZa1T5bV240fvjQbJakDLpA,27292 +django/conf/locale/fi/LC_MESSAGES/django.po,sha256=xeT795wRyv6fc4X67rRT644ZWxbcE1y5Zc__8i4vpO8,29547 +django/conf/locale/fi/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/fi/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/fi/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/fi/formats.py,sha256=j0LGmhPEQWf6rpShWVu5Vk-C7PaZrjZNpYzQf0HPAGA,1241 +django/conf/locale/fr/LC_MESSAGES/django.mo,sha256=61txaIVtXAt5qXgPwIOEUwUFuo5uqTpKj2TrnJO7Fvs,28479 +django/conf/locale/fr/LC_MESSAGES/django.po,sha256=FfhJ9CZd-SrEG2STJcu4KAMYsQTT5AKOed4jI8m0vP8,30876 +django/conf/locale/fr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/fr/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/fr/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/fr/formats.py,sha256=3cj753pnN0YY-EUjyCIkiSAnpHpoE02eNB9UCtd2d88,1286 +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-38.pyc,, +django/conf/locale/fy/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/fy/formats.py,sha256=mJXj1dHUnO883PYWPwuI07CNbjmnfBTQVRXZMg2hmOk,658 +django/conf/locale/ga/LC_MESSAGES/django.mo,sha256=abQpDgeTUIdZzldVuZLZiBOgf1s2YVSyrvEhxwl0GK8,14025 +django/conf/locale/ga/LC_MESSAGES/django.po,sha256=rppcWQVozZdsbl7Gud6KnJo6yDB8T0xH6hvIiLFi_zA,24343 +django/conf/locale/ga/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/ga/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/ga/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/ga/formats.py,sha256=Kotsp4o-6XvJ1sQrxIaab3qEW2k4oyPdJhcqvlgbGnU,682 +django/conf/locale/gd/LC_MESSAGES/django.mo,sha256=g8tn9MsfYK0rnPAY6R3vtznqtTRBBJ6mZDhj-42lO4c,29604 +django/conf/locale/gd/LC_MESSAGES/django.po,sha256=VXKJ67LTz1PNHoTcm5qRq2rgxYeRloVEg-iIm-B_YjQ,32574 +django/conf/locale/gd/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/gd/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/gd/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/gd/formats.py,sha256=tWbR1bTImiH457bq3pEyqdr4H2ONUdhOv2rZ2cYUdC8,715 +django/conf/locale/gl/LC_MESSAGES/django.mo,sha256=utB99vnkb5SLff8K0i3gFI8Nu_eirBxDEpFKbZ_voPY,14253 +django/conf/locale/gl/LC_MESSAGES/django.po,sha256=rvhCJsURGjM2ekm6NBjY5crVGc5lrQv2qpHj35dM3qc,23336 +django/conf/locale/gl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/gl/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/gl/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/gl/formats.py,sha256=Tr41ECf7XNn4iekgPGUSKI6-lDkcHj1SaHno5gPa5hw,757 +django/conf/locale/he/LC_MESSAGES/django.mo,sha256=6SM5oV1-EvXtELx77SyH16DCtJ2mgr2v6NliXrYD2Pw,31202 +django/conf/locale/he/LC_MESSAGES/django.po,sha256=pnL2ePAMKbg9JiEHJtTaMEvdVufJMeqBfKNumCKlqKE,33600 +django/conf/locale/he/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/he/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/he/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/he/formats.py,sha256=-3Yt81fQFRo7ZwRpwTdTTDLLtbMdGSyC5n5RWcnqINU,712 +django/conf/locale/hi/LC_MESSAGES/django.mo,sha256=Zi72xDA1RVm3S5Y9_tRA52_wke8PlvomklvUJBXwiF0,17619 +django/conf/locale/hi/LC_MESSAGES/django.po,sha256=R_DRspzGYZ5XxXS4OvpVD4EEVZ9LY3NzrfzD2LbXqIg,27594 +django/conf/locale/hi/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/hi/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/hi/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/hi/formats.py,sha256=dBY0JvWinGeNiDy4ZrnrtPaZQdwU7JugkzHE22C-M0A,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-38.pyc,, +django/conf/locale/hr/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/hr/formats.py,sha256=raeIndCpFhC146U_RnfVZPgBzqyHSEYRmWytkuYXvsY,1802 +django/conf/locale/hsb/LC_MESSAGES/django.mo,sha256=1bmQrnUPSUob97hyck-IJz-UjjQ2KJiCWvRvSvPbYZE,29253 +django/conf/locale/hsb/LC_MESSAGES/django.po,sha256=KKERxHid9-31LiUQ6s966X23HWS-f_FO1YPeTWNgkqU,31678 +django/conf/locale/hu/LC_MESSAGES/django.mo,sha256=zORP8fLsHnlY5RRY7i_mlVlx8f3erqSfPziYNAOIAe8,28217 +django/conf/locale/hu/LC_MESSAGES/django.po,sha256=6zz8Tvs_InxZDyuSKyo7f-JbNVM2JjkE_XXYbb0skMk,30680 +django/conf/locale/hu/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/hu/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/hu/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/hu/formats.py,sha256=weO4ndGVlEDNDLKYi2YRtCeyxoUj2kSrYYPO_cV1I7Q,1008 +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=drP4pBfkeaVUGO2tAB6r-IUu2cvDQiOWUJfPqsA0iEo,18430 +django/conf/locale/ia/LC_MESSAGES/django.po,sha256=VKowp9naiGfou8TrMutWPoUob-tDFB6W99yswHInNcw,24900 +django/conf/locale/id/LC_MESSAGES/django.mo,sha256=cy4STOBeJFJ5AqCK2s2kXfKRcN-1vp_T_Sev0L3OlXM,26111 +django/conf/locale/id/LC_MESSAGES/django.po,sha256=OL3bUbqB2muAgoL9AErXFXqYeKvnGZCnnJIZIMUtB2g,28753 +django/conf/locale/id/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/id/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/id/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/id/formats.py,sha256=1nQp6j9Vfn7RQLsGV1bGdrLpgouo_ePnLnRXpOfNjD8,1920 +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-38.pyc,, +django/conf/locale/ig/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/ig/formats.py,sha256=x9zavr9_4PcNhy3CslobP2vYY4eEyjHavNFYIQtMu_Q,1161 +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=maGVBXO0fgqWsPbW76d27KpZ7HWwJc3QYFlMiWp_-uk,25331 +django/conf/locale/is/LC_MESSAGES/django.po,sha256=MSXrykvaFIMMp07dGV656mwl4hvoapq42ltNtvvWlrI,28802 +django/conf/locale/is/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/is/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/is/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/is/formats.py,sha256=4BbmtZUfTOsQ818Qi6NEZ54QUwd2I8H2wbnaTe0Df74,688 +django/conf/locale/it/LC_MESSAGES/django.mo,sha256=q8Yb29m2wz6CTcPj_jxau4At0ogMaja88ZwJjxuOMeY,27284 +django/conf/locale/it/LC_MESSAGES/django.po,sha256=vniTmzgNshqTbnCAczDEUopQsw1gAJNFB0Yw_iTSvUM,30040 +django/conf/locale/it/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/it/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/it/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/it/formats.py,sha256=BZvSU2pEB_5L3onVxeUXmASHn7HihVmNxNgubOTkMF4,1801 +django/conf/locale/ja/LC_MESSAGES/django.mo,sha256=YvoSgafrPT6X3sV2n8pRVI_uLFmFua-STAxI9uVU84M,29240 +django/conf/locale/ja/LC_MESSAGES/django.po,sha256=cM3GnHJgFqCdfPB-Fo12M47enZi_8B92Ez2eVEeeEhM,31939 +django/conf/locale/ja/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/ja/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/ja/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/ja/formats.py,sha256=V6eTbaEUuWeJr-2NEAdQr08diKzOlFox1DbugC5xHpk,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-38.pyc,, +django/conf/locale/ka/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/ka/formats.py,sha256=5QZHpBvZ91i_hjfv_aoI6tq1EuSNp6Oq_wqmrJlrJjg,1897 +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-38.pyc,, +django/conf/locale/km/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/km/formats.py,sha256=o0v-vZQaH-v-7ttAc0H0tSWAQPYQlxHDm0tvLzuPJfw,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-38.pyc,, +django/conf/locale/kn/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/kn/formats.py,sha256=FK0SWt0_88-SJkA1xz01sKOkAce5ZEyF-F0HUlO5N4k,680 +django/conf/locale/ko/LC_MESSAGES/django.mo,sha256=VioAHuoN4Lm_GWSwMczgeEKACmLVDfExQpR8VDEEoIE,28133 +django/conf/locale/ko/LC_MESSAGES/django.po,sha256=Jvfg_JyZByK_mVyY96a3BTFTWLXEfoFeBX9dgaPdFTs,30604 +django/conf/locale/ko/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/ko/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/ko/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/ko/formats.py,sha256=XTtpMsB_y_rRjsBoEV3ZXl77MLnlh0tcW0vj1o0I_WM,2125 +django/conf/locale/ky/LC_MESSAGES/django.mo,sha256=te3l2Kzai1NNkqVyfd5q6jf9AIgrBC5-CyQWVL0M4SY,31377 +django/conf/locale/ky/LC_MESSAGES/django.po,sha256=v_PAV5FLgcxiwdP-q8rJRGkJmgsbwjBZRoljdEn3B9U,33259 +django/conf/locale/ky/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/ky/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/ky/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/ky/formats.py,sha256=EtnZLr0bi2-yShgyfOIseNVRUtWQEp1-0N5FW5gQv4s,1220 +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=VWrkGGbkN_1UKH9QJcPqKVSRIY2JSJjK23B7oXQqpcA,22750 +django/conf/locale/lt/LC_MESSAGES/django.po,sha256=GDdmsy8FopCM8_VTQKoeGWB918aCT1su4VZktAbnmqA,28534 +django/conf/locale/lt/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/lt/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/lt/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/lt/formats.py,sha256=tEP5X-VHEikeb7BBkWoW4uuJQw6_OfVh5l_x_hKoGGU,1679 +django/conf/locale/lv/LC_MESSAGES/django.mo,sha256=vlmPk9M8gFLW2x4Rg_HDTpIh-iaedioZADkpL7hGpyE,28193 +django/conf/locale/lv/LC_MESSAGES/django.po,sha256=eqnApvNzJ_KgROWd2GBAVcpvDCApZbNTlf0kZ1VS-e4,30762 +django/conf/locale/lv/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/lv/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/lv/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/lv/formats.py,sha256=72AwivAdil7DNTMeaZTRAHXt04PuN6gkw4uDeODlIpM,1755 +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-38.pyc,, +django/conf/locale/mk/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/mk/formats.py,sha256=8FUX0RYKaUN3_9g9JcGCl-W7q4_U-rUwgSDd5B6F7zE,1493 +django/conf/locale/ml/LC_MESSAGES/django.mo,sha256=NTiGRfaWimmV1bxyqzDeN6fqxxtiobN9MbRVeo1qWYg,32498 +django/conf/locale/ml/LC_MESSAGES/django.po,sha256=gvHg9YKgEp2W6sFKYtdp8eU0ZnHues_rw4LnilkAdmQ,38035 +django/conf/locale/ml/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/ml/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/ml/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/ml/formats.py,sha256=sr2fzOex-HRdvbYTr_bUiZFSQWyPpN2y5eq_h6zyceQ,1620 +django/conf/locale/mn/LC_MESSAGES/django.mo,sha256=sd860BHXfgAjDzU3CiwO3JirA8S83nSr4Vy3QUpXHyU,24783 +django/conf/locale/mn/LC_MESSAGES/django.po,sha256=VBgXVee15TTorC7zwYFwmHM4qgpYy11yclv_u7UTNwA,30004 +django/conf/locale/mn/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/mn/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/mn/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/mn/formats.py,sha256=ET9fum7iEOCGRt9E-tWXjvHHvr9YmAR5UxmEHXjJsTc,676 +django/conf/locale/mr/LC_MESSAGES/django.mo,sha256=aERpEBdJtkSwBj6zOtiKDaXuFzepi8_IwvPPHi8QtGU,1591 +django/conf/locale/mr/LC_MESSAGES/django.po,sha256=GFtk4tVQVi8b7N7KEhoNubVw_PV08pyRvcGOP270s1Q,19401 +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=XDCGV0qH1f2V-w_Hp2uqkl5w08--EGoqHKAnrBdViGo,26572 +django/conf/locale/nb/LC_MESSAGES/django.po,sha256=DGM90Bk4YsbVffQ18ECsWV4QsZcjw3sCblA_lbt2PNM,28941 +django/conf/locale/nb/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/nb/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/nb/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/nb/formats.py,sha256=gfpEc1o0dLP11NK8miHV-jDMLxWzGvxYv8eayXbkbwM,1571 +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=yIiuxrpS6L0qVxm11jnXphVICeyer7Dp-LwSmfb1omQ,27117 +django/conf/locale/nl/LC_MESSAGES/django.po,sha256=S-T7QOXjAJoJz2Vsb1uWQi0h69y9bWdeG9LnYrvmkQ4,29653 +django/conf/locale/nl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/nl/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/nl/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/nl/formats.py,sha256=2z34kqQeiIUg5P4Yme0sHw5r65GkO_iTsxpXhBZBcqM,4095 +django/conf/locale/nn/LC_MESSAGES/django.mo,sha256=8CoLejnImo9TMbt-CR7NK8WAbX3wm89AgZOuPn-werQ,13212 +django/conf/locale/nn/LC_MESSAGES/django.po,sha256=AWPfAtzROtcEjxr0YWGTcNBWF7qnyF3wxhGkLiBIQ5k,22582 +django/conf/locale/nn/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/nn/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/nn/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/nn/formats.py,sha256=gfpEc1o0dLP11NK8miHV-jDMLxWzGvxYv8eayXbkbwM,1571 +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=fARx7bIFQGw6NsaHNJ3et8HW7D1IZoND2y8Y2BV8zPQ,29577 +django/conf/locale/pl/LC_MESSAGES/django.po,sha256=jNee5Z8NfSD0ZynlSoOCv0uX6s_pK-KpU0WBSRjS_Ls,33279 +django/conf/locale/pl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/pl/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/pl/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/pl/formats.py,sha256=6aBumG-WeA7mWnDlfoP0_VadHiBZdYXCvPwT6JG2md8,1038 +django/conf/locale/pt/LC_MESSAGES/django.mo,sha256=nlj_L7Z2FkXs1w6wCGGseuZ_U-IecnlfYRtG5jPkGrs,20657 +django/conf/locale/pt/LC_MESSAGES/django.po,sha256=ETTedbjU2J4FLi2QDHNN8C7zlAsvLWNUlYzkEV1WB6s,26224 +django/conf/locale/pt/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/pt/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/pt/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/pt/formats.py,sha256=LeVTwDFRHkY9786T-lZx-iKOHTPiFReAiUPYdbrDcmI,1522 +django/conf/locale/pt_BR/LC_MESSAGES/django.mo,sha256=JqEgQtawdFXNy_RCuZTYxO93S5xXnO0nx-s8KG9KuvI,27452 +django/conf/locale/pt_BR/LC_MESSAGES/django.po,sha256=GTyrk_r-3sFTZGn5zFzQ8uXTnXnzRxWGHrbO5u-_rsQ,30954 +django/conf/locale/pt_BR/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/pt_BR/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/pt_BR/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/pt_BR/formats.py,sha256=YvB8w7UVjacsAQgbSY76tQTX-W3pucfeAGPFIHwWcBo,1283 +django/conf/locale/ro/LC_MESSAGES/django.mo,sha256=IMUybfJat0koxf_jSv6urQQuiHlldUhjrqo3FR303WA,22141 +django/conf/locale/ro/LC_MESSAGES/django.po,sha256=mdMWVR6kXJwUSxul2bpu3IoWom6kWDiES6Iw5ziynj0,27499 +django/conf/locale/ro/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/ro/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/ro/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/ro/formats.py,sha256=hpxpg6HcFGX5HFpypZ-GA4GkAsXCWuivMHLyyV1U2Rw,928 +django/conf/locale/ru/LC_MESSAGES/django.mo,sha256=6vnvXJpZoxLfNrOM69r-DnGRcxTGluQCrtwG8eLD16Y,37637 +django/conf/locale/ru/LC_MESSAGES/django.po,sha256=2XPGmtNxxlPmCiL76oXmSaysClxbs84cHixxPJ7lSc4,40896 +django/conf/locale/ru/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/ru/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/ru/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/ru/formats.py,sha256=o9xwvKn2hIshuaZ4nea4Ecx-jBhxTzPDLg2W-gygkLw,1116 +django/conf/locale/sk/LC_MESSAGES/django.mo,sha256=hF4gNKo3rYbtCzRuHOtofA_UUMO2MwovfR5uOqi1F0M,22708 +django/conf/locale/sk/LC_MESSAGES/django.po,sha256=A5o5gBcRE1FToEO7yhnZ05bZHRkYnSZ-SagLfE2YfUs,28524 +django/conf/locale/sk/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/sk/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/sk/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/sk/formats.py,sha256=YXxNfnkRJvAei2la5L-9m1IplCOouo3Jhxn0YKpSZ0w,1064 +django/conf/locale/sl/LC_MESSAGES/django.mo,sha256=uaPbjsAAam_SrzenHjeHgTC3Pxn6BEecXgnDY9HOzwg,21921 +django/conf/locale/sl/LC_MESSAGES/django.po,sha256=MZ8Lz3dN5JSxw7l8bFRN0ozeW4Sue0jnRURm2zpOcuI,27860 +django/conf/locale/sl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/sl/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/sl/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/sl/formats.py,sha256=iIH0ZrXpUEDQ1NvzND-e-UGAHiM8d4NDha8o9U1YPFY,1798 +django/conf/locale/sq/LC_MESSAGES/django.mo,sha256=otSWTfAkMmoEcphsk7DOoTiZWhP808hSlDagLGK0dBk,27682 +django/conf/locale/sq/LC_MESSAGES/django.po,sha256=3kMx282KvzOtyohbnZXyQ7-YVRV7DWN6yrR9OdlXG40,30046 +django/conf/locale/sq/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/sq/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/sq/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/sq/formats.py,sha256=X7IXRLlVWmlgNSa2TSvshv8Vhtjfv0V1Okg0adqVl3o,688 +django/conf/locale/sr/LC_MESSAGES/django.mo,sha256=GjjkLO-zeZXCzK08Jy-dhNy9HvwtWxKp9TUl9m3nqOI,33844 +django/conf/locale/sr/LC_MESSAGES/django.po,sha256=7jjGgdXiGau2u9bEzfT1_8uC_tqSArH38ajPeotvr6g,36242 +django/conf/locale/sr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/sr/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/sr/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/sr/formats.py,sha256=1v-fbUFCpU1mjwQJX8-qZMFYUU0-d-9w_uFJ7NgMweY,1754 +django/conf/locale/sr_Latn/LC_MESSAGES/django.mo,sha256=rmf3rXfKKBcl4kx6qpFqm6hrPFKc4GNWIAbSc7GQKSw,21917 +django/conf/locale/sr_Latn/LC_MESSAGES/django.po,sha256=My5dodRD2ZT1vVx8SmQwUuxsTnlzqsu5IaaVx-A5tC4,27268 +django/conf/locale/sr_Latn/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/sr_Latn/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/sr_Latn/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/sr_Latn/formats.py,sha256=1v-fbUFCpU1mjwQJX8-qZMFYUU0-d-9w_uFJ7NgMweY,1754 +django/conf/locale/sv/LC_MESSAGES/django.mo,sha256=0W60cBGm7HAqKWtFyZjVGo511N3XNOm2yqk2xfg065c,21718 +django/conf/locale/sv/LC_MESSAGES/django.po,sha256=o5NYw82Qu6lFCz6nLaphtmN1oEz3pG_bB6AI_ClTv04,27117 +django/conf/locale/sv/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/sv/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/sv/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/sv/formats.py,sha256=46MJnftY5MjzTqgvNfBTV-nVAkbY--8NbXtiLFhT_Lg,1374 +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-38.pyc,, +django/conf/locale/ta/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/ta/formats.py,sha256=LbLmzaXdmz4UbzNCbINYOJLggyU1ytxWAME3iHVt9NY,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-38.pyc,, +django/conf/locale/te/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/te/formats.py,sha256=aSddq7fhlOce3zBLdTNDQA5L_gfAhsmKRCuyQ8O5TyY,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-38.pyc,, +django/conf/locale/tg/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/tg/formats.py,sha256=wM47-gl6N2XbknMIUAvNmqxNyso6bNnwU11RzoLK3RM,1202 +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-38.pyc,, +django/conf/locale/th/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/th/formats.py,sha256=vBGsPtMZkJZN0gVcX3eCDVE3KHsjJJ94EW2_9tCT0W4,1072 +django/conf/locale/tk/LC_MESSAGES/django.mo,sha256=HM4-efqIOSqXPpG139jZXI2WymL2b5GtnUxCXPlFgr8,27139 +django/conf/locale/tk/LC_MESSAGES/django.po,sha256=p-XA0sclJU0-5T9lRI1lQTxDpH0MGVPwn5rYHtABpCI,29133 +django/conf/locale/tk/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/tk/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/tk/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/tk/formats.py,sha256=wM47-gl6N2XbknMIUAvNmqxNyso6bNnwU11RzoLK3RM,1202 +django/conf/locale/tr/LC_MESSAGES/django.mo,sha256=UsB8cqqfqIy5gHWnbbazrwaOw8Un6Fzao9lKJH3S__M,27846 +django/conf/locale/tr/LC_MESSAGES/django.po,sha256=vd-k43i8LblXeqL9-B-K9K7JEwiw6HrGO2OK2t2l0nM,30371 +django/conf/locale/tr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/tr/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/tr/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/tr/formats.py,sha256=bzEkWCwULHmwyMHqN-1ACBn6Lr8VbvoL9TuvO4KInVI,1032 +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/uk/LC_MESSAGES/django.mo,sha256=yCf4RAtmTckj2K3jD6quwThbJMlbmrGNousTqkd_VzQ,27319 +django/conf/locale/uk/LC_MESSAGES/django.po,sha256=ZpWZKz3GVaOP3kZRzAYNoXodM4yqkebfnvxmizoI0P8,34032 +django/conf/locale/uk/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/uk/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/uk/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/uk/formats.py,sha256=R4i56pYlss2Ui6zyDT5OvwFZq0SBIxzf4hsyzmnip5U,1268 +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=c8eHLqubZqScsU8LjGK-j2uAGeWzHCSmCy-tYu9x_FA,27466 +django/conf/locale/uz/LC_MESSAGES/django.po,sha256=TxmmhZCC1zrAgo0xM0JQKywju0XBd1BujMKZ9HtOLKY,29376 +django/conf/locale/uz/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/uz/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/uz/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/uz/formats.py,sha256=VJC2U61827xc8v7XTv3eKfySbZUHL34KpCmQyWMKRQ0,1199 +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-38.pyc,, +django/conf/locale/vi/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/vi/formats.py,sha256=H_lZwBQUKUWjtoN0oZOxXw0SsoNWnXg3pKADPYX3RrI,762 +django/conf/locale/zh_Hans/LC_MESSAGES/django.mo,sha256=-tAzfwPrqHJIV29t6BO5Kk9ZxnHNF5dtDItiR7LXbGg,26047 +django/conf/locale/zh_Hans/LC_MESSAGES/django.po,sha256=Rvr3XFGNg6OTKXF8JEO6sBWyh6V-j-gxj7McuVKR_2E,28957 +django/conf/locale/zh_Hans/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/zh_Hans/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/zh_Hans/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/zh_Hans/formats.py,sha256=U-1yJketLR187TFCBAzgUCt0UlZNvCxoLgBkYhZz2Ts,1745 +django/conf/locale/zh_Hant/LC_MESSAGES/django.mo,sha256=1U3cID-BpV09p0sgYryzJCCApQYVlCtb4fJ5IPB8wtc,19560 +django/conf/locale/zh_Hant/LC_MESSAGES/django.po,sha256=buHXYy_UKFoGW8xz6PNrSwbMx-p8gwmPRgdWGBYwT2U,24939 +django/conf/locale/zh_Hant/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/zh_Hant/__pycache__/__init__.cpython-38.pyc,, +django/conf/locale/zh_Hant/__pycache__/formats.cpython-38.pyc,, +django/conf/locale/zh_Hant/formats.py,sha256=U-1yJketLR187TFCBAzgUCt0UlZNvCxoLgBkYhZz2Ts,1745 +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=rd5deHQnwKeAjq6tCKOfuZRmeOBfgdohow0nNdieEfk,3360 +django/conf/project_template/project_name/urls.py-tpl,sha256=vrokVPIRgYajr3Osw2_D1gCndrJ-waGU3tkpnzhWync,775 +django/conf/project_template/project_name/wsgi.py-tpl,sha256=OCfjjCsdEeXPkJgFIrMml_FURt7msovNUPnjzb401fs,428 +django/conf/urls/__init__.py,sha256=kHy9_mgebuUHAbAMFrFJ1badWEJvbeZH_YMZA1FC_zQ,656 +django/conf/urls/__pycache__/__init__.cpython-38.pyc,, +django/conf/urls/__pycache__/i18n.cpython-38.pyc,, +django/conf/urls/__pycache__/static.cpython-38.pyc,, +django/conf/urls/i18n.py,sha256=TG_09WedGtcOhijJtDxxcQkcOU15Dikq0NkLGVvwvCI,1184 +django/conf/urls/static.py,sha256=WHZ7JNbBEQVshD0-sdImvAW635uV-msIyP2VYntzrPk,886 +django/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/__pycache__/__init__.cpython-38.pyc,, +django/contrib/admin/__init__.py,sha256=XAnhrz85PswJx5qVok6lLvRkNQvdUPE39UEeQWl3tJs,1065 +django/contrib/admin/__pycache__/__init__.cpython-38.pyc,, +django/contrib/admin/__pycache__/actions.cpython-38.pyc,, +django/contrib/admin/__pycache__/apps.cpython-38.pyc,, +django/contrib/admin/__pycache__/checks.cpython-38.pyc,, +django/contrib/admin/__pycache__/decorators.cpython-38.pyc,, +django/contrib/admin/__pycache__/exceptions.cpython-38.pyc,, +django/contrib/admin/__pycache__/filters.cpython-38.pyc,, +django/contrib/admin/__pycache__/forms.cpython-38.pyc,, +django/contrib/admin/__pycache__/helpers.cpython-38.pyc,, +django/contrib/admin/__pycache__/models.cpython-38.pyc,, +django/contrib/admin/__pycache__/options.cpython-38.pyc,, +django/contrib/admin/__pycache__/sites.cpython-38.pyc,, +django/contrib/admin/__pycache__/tests.cpython-38.pyc,, +django/contrib/admin/__pycache__/utils.cpython-38.pyc,, +django/contrib/admin/__pycache__/widgets.cpython-38.pyc,, +django/contrib/admin/actions.py,sha256=Pahf6ipI3clajrmKH7nq6aWv3bpTic4NgoL8cPMVrXw,3037 +django/contrib/admin/apps.py,sha256=RgAgnpSJproS0C-3ED5QFuORJ9MCcGxZHt1nFPYvr1w,840 +django/contrib/admin/checks.py,sha256=-7wrSRCOIyzDfztIP06Ce2ojuqH4pOiuzWe7Bj1_R3Y,45659 +django/contrib/admin/decorators.py,sha256=SJVppNNCIrsJUHV7sZjjrVqVqHKvGRSKs4sMm4wb_N4,3428 +django/contrib/admin/exceptions.py,sha256=lWAupa8HTBROgZbDeYS1n_vOl_85dcmPhDwz0-Ke1ug,331 +django/contrib/admin/filters.py,sha256=oOvdarUzouFpTomGC1z8lBhh61XzZr1fDtbD7sGirLU,19661 +django/contrib/admin/forms.py,sha256=uJth9S0kX0yijCg6uvbcV4fil5bAoJsZmoKWmvg31tA,1021 +django/contrib/admin/helpers.py,sha256=jrnJhqmTizO0IvyqIOYbL_CSqqARcxaFH5EC36N4Nbw,16218 +django/contrib/admin/locale/af/LC_MESSAGES/django.mo,sha256=3VNfQp5JaJy4XRqxM7Uu9uKHDihJCvKXYhdWPXOofc8,16216 +django/contrib/admin/locale/af/LC_MESSAGES/django.po,sha256=R2ix5AnK5X35wnhjT38K85JgwewQkmwrYwyVx4YqikQ,17667 +django/contrib/admin/locale/af/LC_MESSAGES/djangojs.mo,sha256=dmctO7tPkPwdbpp-tVmZrR0QLZekrJ1aE3rnm6vvUQM,4477 +django/contrib/admin/locale/af/LC_MESSAGES/djangojs.po,sha256=1wwspqp0rsSupVes7zjYLyNT_wY4lFefqhpXH5wBdJM,4955 +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=e1TPsXhFUpNGLgdsOdF3VJgX4fqozB3jGhDLAY-DiOk,19693 +django/contrib/admin/locale/ar/LC_MESSAGES/django.po,sha256=5Kw2JgaC7H6UNoblB2ZmHrFCsS_KkT0Z8kLooogSk78,21173 +django/contrib/admin/locale/ar/LC_MESSAGES/djangojs.mo,sha256=5G1bV_2YhASuQqUgYY6mQDoV3zcJlRx70iPqDUxcCbU,5843 +django/contrib/admin/locale/ar/LC_MESSAGES/djangojs.po,sha256=BMi2aVzpeJtSIbpB0Ivhbj5WaKgNlrpQquYRqFcWpl8,6502 +django/contrib/admin/locale/ar_DZ/LC_MESSAGES/django.mo,sha256=IJlPu_ROkcvVEyTej2un1WMuCueOYBMYNxAmTCK7NbU,19657 +django/contrib/admin/locale/ar_DZ/LC_MESSAGES/django.po,sha256=qEHImGRyP-cOeA66387z9glbIhUEeliq-dI-iLhuweM,21027 +django/contrib/admin/locale/ar_DZ/LC_MESSAGES/djangojs.mo,sha256=bNJysHeUsNaSg2BgFh9r4FEnRAee9w6DNN4OvfQfYnc,5721 +django/contrib/admin/locale/ar_DZ/LC_MESSAGES/djangojs.po,sha256=dGIamisxnWLYkxJOsJQLqXTy9zC3B6Tn3gtPKlRiMBQ,6302 +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=pOABf7ef6c4Apn3e0YE0bm-GJzXfKUsBYL7iUK5NdQs,14807 +django/contrib/admin/locale/az/LC_MESSAGES/django.po,sha256=ZQVARobZ9XzSbP9HLDV8DhmQpe08ExhoTj5RBpFu__g,17299 +django/contrib/admin/locale/az/LC_MESSAGES/djangojs.mo,sha256=3P3iKDFi9G1iMmxTVHWol1FgczmMl4gYHRoBT5W3fYw,4598 +django/contrib/admin/locale/az/LC_MESSAGES/djangojs.po,sha256=BpFkIKu93AVAYKPnCKSPswCIAm8L2909oh6NJSZJLu8,5125 +django/contrib/admin/locale/be/LC_MESSAGES/django.mo,sha256=CBomfJ6N52rJdkbZPuuyODMPPS7AJZnC4vUS8Qt_D5k,21096 +django/contrib/admin/locale/be/LC_MESSAGES/django.po,sha256=9nPIJ5aw1i4cTn_LN706sTnNWNngFt_1HArzCU3pE3M,22364 +django/contrib/admin/locale/be/LC_MESSAGES/djangojs.mo,sha256=ujRhIpDAf0W8YQpXiWgVOsbjpmS6QqI9I49WkKfqDpc,6558 +django/contrib/admin/locale/be/LC_MESSAGES/djangojs.po,sha256=Gg9mu6NJp4K0Fqs7TSPbGkTyn5YkXICHTAlRqL57rMw,7190 +django/contrib/admin/locale/bg/LC_MESSAGES/django.mo,sha256=uDQB5G5S--ff1vGwfe37aQxWVFqLf3fBXgnUKs2SpZw,15320 +django/contrib/admin/locale/bg/LC_MESSAGES/django.po,sha256=SXIW1Wz1Mtl_SqZwsjdIotFPYd9DUwl22Hp1YDxGhhA,19148 +django/contrib/admin/locale/bg/LC_MESSAGES/djangojs.mo,sha256=TGNzP1smzgZmo5-s4VKD1E-nWTMtCSjp_hco1a0j4BQ,5565 +django/contrib/admin/locale/bg/LC_MESSAGES/djangojs.po,sha256=5uiQqnTyz0R-1vJTHqY0opwnQhMfgPoB-PxOkGpxNwk,6016 +django/contrib/admin/locale/bn/LC_MESSAGES/django.mo,sha256=fKmzDwzLp0Qlv4bvWscf0evanPRAXwR04B6IeJ7wGSw,15247 +django/contrib/admin/locale/bn/LC_MESSAGES/django.po,sha256=-go1WtUozfqbnKlUQr-jNnvEXf98eIZjq-C8KjRJ6NA,19812 +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=tu97JMcpnH4wTL9Obz7HJh13QLBbvYJnn_7fdq4P3pg,17235 +django/contrib/admin/locale/ca/LC_MESSAGES/django.po,sha256=CL18wSkaPQgh0zUz5Z8bIR6DwJr47Bd16bSmMHB5PSs,18818 +django/contrib/admin/locale/ca/LC_MESSAGES/djangojs.mo,sha256=xEkD4j5aPzRddlLC8W3aCZ7ah5RHC-MKTgFXI2uTPTI,4519 +django/contrib/admin/locale/ca/LC_MESSAGES/djangojs.po,sha256=CLxLUlg5GUQyWa-SC-8QpKdmdcpuzJl6TXHNRlO2s_E,5098 +django/contrib/admin/locale/cs/LC_MESSAGES/django.mo,sha256=kdfKK6BUnysuDqKyv6REMmzA-_BgYy2BpXmieYVzSQY,17448 +django/contrib/admin/locale/cs/LC_MESSAGES/django.po,sha256=K7ZZGmEP9X8Vq1mir6VZHfaZS_4IcMuk0ZJI0uaX1QM,18941 +django/contrib/admin/locale/cs/LC_MESSAGES/djangojs.mo,sha256=7JR9YG_KB_aA8HQpMOON7CdTGYx-q3fjXvdvXBPv354,5679 +django/contrib/admin/locale/cs/LC_MESSAGES/djangojs.po,sha256=_isJkLp5vzX3WbEnnve63QjtVRKUCZDOiz8Ng0_reho,6415 +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=jTtKti7NsWwvMyDA_sD8EWFjWopp7pUaSc4B8Imk2GE,16680 +django/contrib/admin/locale/da/LC_MESSAGES/django.po,sha256=kBfGE2OfUXd-Q8UALsQDErpiwxeaQX0lP4d9FIvyBTM,18093 +django/contrib/admin/locale/da/LC_MESSAGES/djangojs.mo,sha256=TFo-KibDumqVFkHFlIDP87O3pLoXyliuf-K8maH3rl0,5098 +django/contrib/admin/locale/da/LC_MESSAGES/djangojs.po,sha256=80URMUS7fIcBM3Qx97Wa9Gg_QV7Zcp4J2R-4FeEHgo8,5873 +django/contrib/admin/locale/de/LC_MESSAGES/django.mo,sha256=Bf2WUKVyn8BpytW_v41pp4V-GtqvgeJ-12zB5pX5j7k,17517 +django/contrib/admin/locale/de/LC_MESSAGES/django.po,sha256=nXHESFCYsDtz_fwX3zhAGr6xzIlSOB6aDaVv3mloqoA,19021 +django/contrib/admin/locale/de/LC_MESSAGES/djangojs.mo,sha256=b_NzGtn_jeOUkPH_BweWuRtsT1Hts2AEDP-byynEB1I,4591 +django/contrib/admin/locale/de/LC_MESSAGES/djangojs.po,sha256=usHJodylqb3QltvaYYfyhUeP9-OpLoAXUE3lRKTQD2w,5198 +django/contrib/admin/locale/dsb/LC_MESSAGES/django.mo,sha256=xxvchve6F4k4rgc5N8hlOotmv3-2y9kx-FQn-7506vY,17570 +django/contrib/admin/locale/dsb/LC_MESSAGES/django.po,sha256=74YowJk3U5JApK8luxJ32HFoj6RTuVsoi4yg6kf2i_U,18784 +django/contrib/admin/locale/dsb/LC_MESSAGES/djangojs.mo,sha256=TNj2M3uToLfTRR2fI47MZoZJdCbYs-tifz8vSz6M4Do,5609 +django/contrib/admin/locale/dsb/LC_MESSAGES/djangojs.po,sha256=agDAUc7ktsqx37XhaIXkPB3TIFV5mqdFW23WGdS1SBU,6206 +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=vfha6S1wDTxgteeprHdCY6j1SnSWDdbC67aoks7TVFw,5888 +django/contrib/admin/locale/el/LC_MESSAGES/djangojs.po,sha256=GJQytMIHNrJeWWnpaoGud4M6aiJCtJ7csyXzmfS6GZs,6560 +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=bLNeZc57WHeM0Zgup4LUca6SsOSyJ2mpbuAtNZ_ZW6Q,23545 +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=ziLBiK7Fw6IGf-ytCHNMk4NmKifDMv8zwNH9a9KPItI,7480 +django/contrib/admin/locale/en_AU/LC_MESSAGES/django.mo,sha256=DVjhYEbArfdAQLuE0YAG99eWxa9_eNEz2o9A6X6MrEY,2894 +django/contrib/admin/locale/en_AU/LC_MESSAGES/django.po,sha256=CO7AV-NmmmwnXyBIybSfNZLdXiavphWsd9LNZQNqDL4,11800 +django/contrib/admin/locale/en_AU/LC_MESSAGES/djangojs.mo,sha256=LWNYXUicANYZeiNx4mb6pFpjnsaggPTxTBCbNKxPtFw,1714 +django/contrib/admin/locale/en_AU/LC_MESSAGES/djangojs.po,sha256=UZk0oHToRtHzlviraFzWcZlpVAOk_W2oq4NquxevQoE,3966 +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=rrRYsz82QIaUEuHREYIw7mPLBhUhJ4EcX8PdND7btyk,13656 +django/contrib/admin/locale/eo/LC_MESSAGES/django.po,sha256=2AacIHf1R3030J0Deo-2LR8VZhmPmG4nii6mi8q9kbY,16778 +django/contrib/admin/locale/eo/LC_MESSAGES/djangojs.mo,sha256=I1Ue345qSHPmJpX4yiYgomQ8vMgshRt1S1D_ZVJWf7g,4452 +django/contrib/admin/locale/eo/LC_MESSAGES/djangojs.po,sha256=BdSRWCYCDxLxtbcPSfRdAMGoTRWOWaxRGpdCIm-3HA0,5040 +django/contrib/admin/locale/es/LC_MESSAGES/django.mo,sha256=8wTwwjDHa-vq64nEkJJVk-yWobNj7kRHsrI_3Y81SIk,17509 +django/contrib/admin/locale/es/LC_MESSAGES/django.po,sha256=PAXUTRrMzwBDcEwPuljyiqg0cbKRgv5I63Xv5aWsNig,19458 +django/contrib/admin/locale/es/LC_MESSAGES/djangojs.mo,sha256=FWXwW5YUTD6HHoYV2Snc2WeNmllz9vJVy5rjSCjQlA4,5203 +django/contrib/admin/locale/es/LC_MESSAGES/djangojs.po,sha256=v1xp_eeyFsrW9rvXk5V6pOVyzHP_ZX06_fCbQppdE-4,6035 +django/contrib/admin/locale/es_AR/LC_MESSAGES/django.mo,sha256=8K2frakJyZHI42JAyid08zpmomre2mvH1VPOAa7ns1g,17658 +django/contrib/admin/locale/es_AR/LC_MESSAGES/django.po,sha256=v6vTPdV_MYytF3aQ-2y1mxECtAKyb9kc6U9at5Adpi8,18929 +django/contrib/admin/locale/es_AR/LC_MESSAGES/djangojs.mo,sha256=odNv6CkDux2LhzpJX3Dnh66cHQOFDSlbal5eQGZIyjw,5409 +django/contrib/admin/locale/es_AR/LC_MESSAGES/djangojs.po,sha256=t6bJnFzl5Pid7PqEBNDm4QmlAqLaU4zyeOXXWocazyI,5990 +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=oZQndBnTu5o0IwQIZCKjTtS5MGhRgsDipzQuIniRgSE,11628 +django/contrib/admin/locale/es_MX/LC_MESSAGES/django.po,sha256=oFhdB2JtS8zCPK5Zf9KFbm-B1M1u83nO5p0rfaVkL78,16138 +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=glFzba5o4yqusgsbxgRN7sJhTRqAtbxYhiKi-opDDv0,16555 +django/contrib/admin/locale/et/LC_MESSAGES/django.po,sha256=0bku_wIqmVY7J2hukwv6aFpJoNaJKmXqHwcURIp_rTg,18001 +django/contrib/admin/locale/et/LC_MESSAGES/djangojs.mo,sha256=kxz2ZDbL-1BxlF6iYTIk2tl5yefzh1NCHRdoJI4xlJ8,4965 +django/contrib/admin/locale/et/LC_MESSAGES/djangojs.po,sha256=fEGMNYwWRUXoJcb8xi95SYOcdm4FYxwAzearlMk76yc,5694 +django/contrib/admin/locale/eu/LC_MESSAGES/django.mo,sha256=vA5uxffIq16C1hBztWR-5XXmqnHtK57iH5FBgk7DoU0,13665 +django/contrib/admin/locale/eu/LC_MESSAGES/django.po,sha256=JCEgbT6Y8okN675f3DEOAJwY9xnyEBAlUPOAjV-QWkI,16725 +django/contrib/admin/locale/eu/LC_MESSAGES/djangojs.mo,sha256=bZHiuTFj8MNrO3AntBAY5iUhmCa6LSluGLYw504RKWg,4522 +django/contrib/admin/locale/eu/LC_MESSAGES/djangojs.po,sha256=eMpM70UTWIiCDigCgYVOZ9JKQ2IidYZxYcUWunvG8js,5051 +django/contrib/admin/locale/fa/LC_MESSAGES/django.mo,sha256=MA_fSEofWoIgJ_Bzf7lN0W5poJDqjKIOwWkT1VKgZL8,20069 +django/contrib/admin/locale/fa/LC_MESSAGES/django.po,sha256=Fhi3d1AjUkA2lhdAChTR8I6L8jcnTDQjQw2GQ1V-rTM,21703 +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=_VYESi8y2__R9MNNT7eItdzOpKBtO6P0C_LtiKs4J-I,16601 +django/contrib/admin/locale/fi/LC_MESSAGES/django.po,sha256=m1fQI68Pq0FeSu6hZ9P_hJoHFc37FSKlRzyYzoKYbhk,17946 +django/contrib/admin/locale/fi/LC_MESSAGES/djangojs.mo,sha256=PtdmimFeCuhnPBhURSpbrE3LobqSmHvVovauR705vAo,5174 +django/contrib/admin/locale/fi/LC_MESSAGES/djangojs.po,sha256=KIKHcUBhIZodbc9dBc8FOEhz3ZdBi7shR76lPpJ34UM,5784 +django/contrib/admin/locale/fr/LC_MESSAGES/django.mo,sha256=GRJvPVpRudS3lHx_xKdBwRshrEwOZQOSUMEi2cj3FXg,18311 +django/contrib/admin/locale/fr/LC_MESSAGES/django.po,sha256=Cpi0rXkY8RV1_ctWKkW7STXHCam1a1sSbULjFt2ppXQ,19641 +django/contrib/admin/locale/fr/LC_MESSAGES/djangojs.mo,sha256=gxMws51GbzrgGA2b0oMFvujuO97g-GdLJDgIb0biiIk,5324 +django/contrib/admin/locale/fr/LC_MESSAGES/djangojs.po,sha256=j78nbvunsFPNzE3ebSLaQ21nQxI_vapJf3LmZQclmi0,5940 +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=cIOjVge5KC37U6g-0MMaP5p8N0XJxzK6oJqWNUw9jfI,15075 +django/contrib/admin/locale/ga/LC_MESSAGES/django.po,sha256=Qx1D0cEGIIPnO10I_83IfU3faEYpp0lm-KHg48lJMxE,17687 +django/contrib/admin/locale/ga/LC_MESSAGES/djangojs.mo,sha256=G-9VfhiMcooTbAI1IMvbvUwj_h_ttNyxGS89nIgrpw4,5247 +django/contrib/admin/locale/ga/LC_MESSAGES/djangojs.po,sha256=DsDMYhm5PEpFBBGepf2iRD0qCkh2r45Y4tIHzFtjJAo,5920 +django/contrib/admin/locale/gd/LC_MESSAGES/django.mo,sha256=kEshne-LdMmLV-kbDMGUkdBPxI4uMRo0O0Xg3vO6e9k,18664 +django/contrib/admin/locale/gd/LC_MESSAGES/django.po,sha256=gw60FvWiiFJ4-RG01FTbfA9nROy3YY2iUn1FGBdN54g,19963 +django/contrib/admin/locale/gd/LC_MESSAGES/djangojs.mo,sha256=MHKCPa0zUdp76nbzy96fK3DsaWmtTs_HoOD1G0s4TRY,5278 +django/contrib/admin/locale/gd/LC_MESSAGES/djangojs.po,sha256=QMMFZMl6zjz9CoZzlzmGej0vPgvrxIy_xeDl6xlymJw,6492 +django/contrib/admin/locale/gl/LC_MESSAGES/django.mo,sha256=_9JW7LdCw2on4M1oz3Iyl_VMrhrw_0oVIQl4h_rCX6g,13246 +django/contrib/admin/locale/gl/LC_MESSAGES/django.po,sha256=xqdcVwIX5zPxq471crW0yxcOYcbZVaRwKiKx-MAGiqk,16436 +django/contrib/admin/locale/gl/LC_MESSAGES/djangojs.mo,sha256=YkT7l3U9ffSGqXmu6S41Ex0r7tbK-0BKH5lS6O8PAGs,3279 +django/contrib/admin/locale/gl/LC_MESSAGES/djangojs.po,sha256=EDccOpm1mpT8mVRvu5LBsq8nao50oP1V7aKEnuRmtF8,4803 +django/contrib/admin/locale/he/LC_MESSAGES/django.mo,sha256=0afg9nan7nwEChy6dJtLzexdQK_rPT_k1LhjA_QnIoM,16250 +django/contrib/admin/locale/he/LC_MESSAGES/django.po,sha256=QPOorIn6TOY8UFgK0mcVTZ1gxq2uacdE7JhV8H-qAyw,18811 +django/contrib/admin/locale/he/LC_MESSAGES/djangojs.mo,sha256=odvNcABcTGzBw9u3CYoUjG58toB_IVPV4B45NT6Qj8I,5117 +django/contrib/admin/locale/he/LC_MESSAGES/djangojs.po,sha256=Cx6k80Xb4jowscPTwMGjw69kpyeLq3LGmccHoPwk_YM,5781 +django/contrib/admin/locale/hi/LC_MESSAGES/django.mo,sha256=EogCHT8iAURSuE34kZ0kwEIoz5VjgUQUG2eAIqDxReU,18457 +django/contrib/admin/locale/hi/LC_MESSAGES/django.po,sha256=NcTFbFyHhWOIieUpzIVL7aSDWZ8ZNmfnv5gcxhON1zc,21770 +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=xdFfD6IiKou_-oWJDKZt-L-FoxaYFXcqbh0LJ2tlXhQ,17310 +django/contrib/admin/locale/hsb/LC_MESSAGES/django.po,sha256=sBWUnTFK-d6ZAtmfk_RqyoreuXLZYeteOt75vvDl-bc,18520 +django/contrib/admin/locale/hsb/LC_MESSAGES/djangojs.mo,sha256=nx5PHpjnFVOL_64Ui3HGTgUOZWnIUy5HF0DxHi7Dyz0,5681 +django/contrib/admin/locale/hsb/LC_MESSAGES/djangojs.po,sha256=XMpmL1mYKGymExY5KXl9FBBZgMrJIGNSBBvc92y8yno,6281 +django/contrib/admin/locale/hu/LC_MESSAGES/django.mo,sha256=O_QBDJcYI_rVYvXdI3go3YA2Y1u-NOuKOwshF6Ic7bs,17427 +django/contrib/admin/locale/hu/LC_MESSAGES/django.po,sha256=Gt0lw5n8KxK0ReE0HWrMjPFOXxVGZxxZ3YX4MiV9z1M,18962 +django/contrib/admin/locale/hu/LC_MESSAGES/djangojs.mo,sha256=CgDVu17Y4DDNfuzUGWyfHyAMFc4ZulYcTFPcU7Yot74,5121 +django/contrib/admin/locale/hu/LC_MESSAGES/djangojs.po,sha256=U52dESIGFfZIzUTgeNUKcLjZGGFmTGU0fSxDw2LMhiQ,5816 +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=RsmykBQKAWODi-L74zHjhxv82jb96LpvJ1TXkXNYyc8,16474 +django/contrib/admin/locale/id/LC_MESSAGES/django.po,sha256=6e_BBHUtcnMY7OK7eXQKbGWv-ba-2M8KVB79Q759Jw4,17946 +django/contrib/admin/locale/id/LC_MESSAGES/djangojs.mo,sha256=Qxy1U7XeN_YLy19vRrn0pom2FD2iMUTDAtAc7XKZazg,4373 +django/contrib/admin/locale/id/LC_MESSAGES/djangojs.po,sha256=zEz-pQryKAi75nve5849v1nzN-X4GUCHg5U1KZ4gBDo,5620 +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=VcJvjwOJ8FgYiGRWVD1sPi-yuhFMR19ejIewhOQyP84,4554 +django/contrib/admin/locale/is/LC_MESSAGES/djangojs.po,sha256=lpbOnRlgNaESvPfojZskcAn4HNnsFfYK9rxV8D6ucQg,5150 +django/contrib/admin/locale/it/LC_MESSAGES/django.mo,sha256=Pk4GFKmpamyy3YpDbij4Z1NR_whRb00tUsrchoqpmwY,17108 +django/contrib/admin/locale/it/LC_MESSAGES/django.po,sha256=BWXpcabtGkczT2JYuZ6KeyNfGQoA_KZUUPq7IrQU3vg,18769 +django/contrib/admin/locale/it/LC_MESSAGES/djangojs.mo,sha256=dZ-_EjmtlPHhaOgnz1ISFAYkaSkuEpw_d-sdU7BZeaU,5119 +django/contrib/admin/locale/it/LC_MESSAGES/djangojs.po,sha256=ixWfLqf2WwFnkn63WR1DzY4GWXHXSa9eyoxTNPAFDGA,5919 +django/contrib/admin/locale/ja/LC_MESSAGES/django.mo,sha256=hm9obimsew7xXJ1TbN61cW_nKp6L_nDxAY4OxtAnk9w,18371 +django/contrib/admin/locale/ja/LC_MESSAGES/django.po,sha256=EFG0PQ9ygHR_CmZvoh0ldJjbs2seKFfGWDaXD5JBvrY,19886 +django/contrib/admin/locale/ja/LC_MESSAGES/djangojs.mo,sha256=W_m4kF7EVFZzW_BZAsvti79739ijFgAPHiaENk_9IRs,4638 +django/contrib/admin/locale/ja/LC_MESSAGES/djangojs.po,sha256=UNzTc5BrNBlUyBaIzgcdIrd4vkIJqsoSGWJVmX3hjYY,5789 +django/contrib/admin/locale/ka/LC_MESSAGES/django.mo,sha256=M3FBRrXFFa87DlUi0HDD_n7a_0IYElQAOafJoIH_i60,20101 +django/contrib/admin/locale/ka/LC_MESSAGES/django.po,sha256=abkt7pw4Kc-Y74ZCpAk_VpFWIkr7trseCtQdM6IUYpQ,23527 +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=xMGtsVCItMTs18xdFQHELdVZKCwTNNyKfb8n1ARcFws,16053 +django/contrib/admin/locale/kn/LC_MESSAGES/djangojs.mo,sha256=dHzxizjDQWiZeRfBqnVFcK1yk1-M5p1KOfQ1ya9TMVU,1872 +django/contrib/admin/locale/kn/LC_MESSAGES/djangojs.po,sha256=MqRj6ozyr1e9-qNORUTJXNahe6SL3ee3OveSm3efV4g,4214 +django/contrib/admin/locale/ko/LC_MESSAGES/django.mo,sha256=t-VhuZQjQDfGOyrvtvRvIrGvxEZ01cz-9SeYy5OHr80,17852 +django/contrib/admin/locale/ko/LC_MESSAGES/django.po,sha256=nlMbskDxKxE0ywhyEYfOUNc2Jp8WtLh3GFzZdx5UiTA,19587 +django/contrib/admin/locale/ko/LC_MESSAGES/djangojs.mo,sha256=StaaunOE52Uo9MgCvyTQpgKhicFsHlXktYSZAOn7u_Y,4462 +django/contrib/admin/locale/ko/LC_MESSAGES/djangojs.po,sha256=Tv1_SxJW_5y2tXMNVom5MxxTVt-sYiXvf5QMFloiJD4,5080 +django/contrib/admin/locale/ky/LC_MESSAGES/django.mo,sha256=oiXcQY5ZiwbTHE19fK_Ru5SPoR7Ap5vpemHP7awrxNM,19917 +django/contrib/admin/locale/ky/LC_MESSAGES/django.po,sha256=qUPSbpaQe-P40ywplZwbk1GB4vkPefR_jrlKOg9BdT0,21154 +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=X8X5_tms9JliGku_YG-z21TnB6WLhVkxUx4fI3UPfyY,16880 +django/contrib/admin/locale/lv/LC_MESSAGES/django.po,sha256=ky9VntKirOLFY-TG_Mx4VsE691ZEreihW0BlgY2NYzc,18290 +django/contrib/admin/locale/lv/LC_MESSAGES/djangojs.mo,sha256=m2v9CtKlzh10brhZelAruNj0var77Mr1N0uoeetqW-4,5491 +django/contrib/admin/locale/lv/LC_MESSAGES/djangojs.po,sha256=1hCp5ziBGVDokhDDU0wRCeGeLkWuhTyI291oX3m0boM,6165 +django/contrib/admin/locale/mk/LC_MESSAGES/django.mo,sha256=0lnlstwZKEB-RvsQ2VE0QFbxszjLXahoNJgpOsfJH6E,15672 +django/contrib/admin/locale/mk/LC_MESSAGES/django.po,sha256=liRNtoZV26sqc0A35lcdDON-kQzbM_21YLW3O4VF1eg,19452 +django/contrib/admin/locale/mk/LC_MESSAGES/djangojs.mo,sha256=ZyQQ49zqs8GiS73XBaSd5l3Rh3vOA0glMpX98GH6nhU,5633 +django/contrib/admin/locale/mk/LC_MESSAGES/djangojs.po,sha256=bWph0TVgwC-Fmlof8_4SiR21uCFm9rftp59AMZ3WIYA,6188 +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=tsi1Lc7qcDD5dTjMQKy-9Hq-V2Akzyi994QY8wVaqNk,20545 +django/contrib/admin/locale/mn/LC_MESSAGES/django.po,sha256=T9WZQ5k0M9_pLCf5A-fDFIXKgN9fRisfsoZNnm4u-jk,21954 +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=UAxGnGliid2PTx6SMgIuHVfbCcqVvcwC4FQUWtDuSTc,468 +django/contrib/admin/locale/mr/LC_MESSAGES/django.po,sha256=TNARpu8Pfmu9fGOLUP0bRwqqDdyFmlh9rWjFspboTyc,10491 +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/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=r01XjvWuPnnyQ8RXqK4-LsyFKA4WAFl5WNJ1g-UFIvk,15882 +django/contrib/admin/locale/ne/LC_MESSAGES/django.po,sha256=UNTRvBq1FpftJJpveiyC7VHxctbxhnrbC1ybDRYj-MA,20221 +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=ndq_k6QUL6hwc9iuI-rlPbML_-HdcUslCXLRxiV10yw,17070 +django/contrib/admin/locale/nl/LC_MESSAGES/django.po,sha256=SaTkp0m6wEbwl79Q3Lj6vICGw61HI5Um4_8Bs2hfhg0,18768 +django/contrib/admin/locale/nl/LC_MESSAGES/djangojs.mo,sha256=yHX5iQjKqqrIxl_K-AQkBMFNQ8YmgdUxAJVkOEfWDE4,4592 +django/contrib/admin/locale/nl/LC_MESSAGES/djangojs.po,sha256=B9y-TjAFtDgnX7RcPlWWgCqdOUzWY5EWV-buuXtP468,5457 +django/contrib/admin/locale/nn/LC_MESSAGES/django.mo,sha256=zKIlvBLMvoqrXO90TqPJcdTEXkVweUWpz6ynsWeg8mU,10943 +django/contrib/admin/locale/nn/LC_MESSAGES/django.po,sha256=-CFana0-PPFwv1jcdyjYuLK2OYOPva-xxMjlVhvsoCw,14999 +django/contrib/admin/locale/nn/LC_MESSAGES/djangojs.mo,sha256=A7MT59BoyOSiM7W0phx8LLKQyH4Q8AEu6jUsBjUBOoE,3120 +django/contrib/admin/locale/nn/LC_MESSAGES/djangojs.po,sha256=tCXUV4F6FhMa-K0SBw9lQ0U2KY5kcMpGzT7jzKSvceo,4578 +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=n31qIjOVaJRpib4VU4EHZRua3tBnBM6t_ukH9Aj37GM,10185 +django/contrib/admin/locale/pa/LC_MESSAGES/django.po,sha256=MR6ZOTypay-qCvafn0J0rZF06rOsWz771CLDD1qvISE,16446 +django/contrib/admin/locale/pa/LC_MESSAGES/djangojs.mo,sha256=vdEMaVBuJtK1bnECgbqd_dS06PcmN7cgdv0hKGH5UKA,1207 +django/contrib/admin/locale/pa/LC_MESSAGES/djangojs.po,sha256=xU8tchSEH3MCLFSu4-71oVCR8pliKmILqFevM13IQ5M,3717 +django/contrib/admin/locale/pl/LC_MESSAGES/django.mo,sha256=hw_xkSdgLd1AjnjzMUqX_dFR43caBerEBLEuTRL55ZU,17544 +django/contrib/admin/locale/pl/LC_MESSAGES/django.po,sha256=FO8Cguc9_dN0PtlTOKkRnasRnbHh89eFHHw1PH3IcQ4,19371 +django/contrib/admin/locale/pl/LC_MESSAGES/djangojs.mo,sha256=6Oi_eVA7sYkM7xHROBdaSnfSOBBGijyW4_EA_z63Bfk,5702 +django/contrib/admin/locale/pl/LC_MESSAGES/djangojs.po,sha256=xAEEIhbbqbEHDZa9QCAH7ccgFdO4vMRcSZLFrhwF778,6662 +django/contrib/admin/locale/pt/LC_MESSAGES/django.mo,sha256=MTFRTfUKot-0r-h7qtggPe8l_q0JPAzVF9GzdtB9600,16912 +django/contrib/admin/locale/pt/LC_MESSAGES/django.po,sha256=gzRkbl35HZ-88mlA1Bdj1Y-CUJ752pZKCUIG-NNw2os,18436 +django/contrib/admin/locale/pt/LC_MESSAGES/djangojs.mo,sha256=D6-8QwX6lsACkEcYXq1tK_4W2q_NMc6g5lZQJDZRFHw,4579 +django/contrib/admin/locale/pt/LC_MESSAGES/djangojs.po,sha256=__a9WBgO_o0suf2xvMhyRk_Wkg2tfqNHmJOM5YF86sk,5118 +django/contrib/admin/locale/pt_BR/LC_MESSAGES/django.mo,sha256=s4TU28oyJkcmjawja2KOvBPVgXBPnAE4N0T6Yw8xdnw,17151 +django/contrib/admin/locale/pt_BR/LC_MESSAGES/django.po,sha256=dwb6qnw8lWlSrCj9kpZ9v_DXJl--E7aXtmHPHqewwfI,19492 +django/contrib/admin/locale/pt_BR/LC_MESSAGES/djangojs.mo,sha256=moTW7LW6HTDEGGpzq8JxPZ8_xNWjABPK-qkIVpgcshY,5208 +django/contrib/admin/locale/pt_BR/LC_MESSAGES/djangojs.po,sha256=FsmX0dINSguDwJUOWZqmbbV529VeA--_iU1wINdRTUE,6073 +django/contrib/admin/locale/ro/LC_MESSAGES/django.mo,sha256=vkDRRqbQXemsY69kUYonzahIeafWAoIWEJ85aS33Hk8,14387 +django/contrib/admin/locale/ro/LC_MESSAGES/django.po,sha256=fyO2ylCXWZqU3GgHnZJtZfr5tssHMv8RUfkJFKhlvt0,17365 +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=QJ6L9257dATWvsiBLc9QLn886vKaaEIFWglBBG5zWJo,22080 +django/contrib/admin/locale/ru/LC_MESSAGES/django.po,sha256=GFDQeIY3pDT7CbKCttBkz81AzUE1ztaUUCLd62Il_vg,23779 +django/contrib/admin/locale/ru/LC_MESSAGES/djangojs.mo,sha256=RiHcf9X0qZaOjCeaJKnyNpoEV52AQ4NRe3ANgAyQ5u8,7149 +django/contrib/admin/locale/ru/LC_MESSAGES/djangojs.po,sha256=RmQxQ4zn3rJgeHYvVBcQ_svbkBklIhExAw4v8jTtYhI,8161 +django/contrib/admin/locale/sk/LC_MESSAGES/django.mo,sha256=PU6IoeAF8JFMWKO-_n_wzzW5rLi50OM6tTO1mWfDpCY,13416 +django/contrib/admin/locale/sk/LC_MESSAGES/django.po,sha256=WkgdfaJT94lZ0FAy2RtPwjFLddOJ-4hidirMi5VIGVU,16892 +django/contrib/admin/locale/sk/LC_MESSAGES/djangojs.mo,sha256=0FifzbnJmubmNNUsePBcbM2MwExXmtnt699xtY2_uzo,4677 +django/contrib/admin/locale/sk/LC_MESSAGES/djangojs.po,sha256=F9lWj_7Ir6-VBYosrtbQnkxHR_tOVFO1V3VUnvfWNeI,5382 +django/contrib/admin/locale/sl/LC_MESSAGES/django.mo,sha256=iqcg1DYwwDVacRAKJ3QR4fTmKQhRGXU4WkwYco9ASaA,16136 +django/contrib/admin/locale/sl/LC_MESSAGES/django.po,sha256=VeIJDh1PojyUy-4AdPcVezbQ-XVWqp04vFE_u3KU2tU,17508 +django/contrib/admin/locale/sl/LC_MESSAGES/djangojs.mo,sha256=0jqGv5lgcfyxh9pdnB0Nt7e0bF2G0nO-iVWJjKwyZqI,4724 +django/contrib/admin/locale/sl/LC_MESSAGES/djangojs.po,sha256=1DEs7obfCCf-hNM2nIkMizcRcq1KoLBvngMaXLlozUo,5269 +django/contrib/admin/locale/sq/LC_MESSAGES/django.mo,sha256=uyn8IzRKrCUsVMgkkKiv8QFqtNC9c9nVr6Uw6E7sdrc,17324 +django/contrib/admin/locale/sq/LC_MESSAGES/django.po,sha256=nFyndUnCwyAgsPWMlM_fTcQlOO2q2NOeMMFNOjnglDc,18640 +django/contrib/admin/locale/sq/LC_MESSAGES/djangojs.mo,sha256=ZeCPydr-jAYr2tx50e4cdFAVsh4nJ1MJn-buqChlG2Q,5179 +django/contrib/admin/locale/sq/LC_MESSAGES/djangojs.po,sha256=kU02h9ZaAamXIrEFBTIl9zLGgzFxXEHQPNFEh8FC1SQ,5819 +django/contrib/admin/locale/sr/LC_MESSAGES/django.mo,sha256=Dj_vd6vp-NNeiB46bfcNXxcmnbqoEyPzWiOziVHpFko,15414 +django/contrib/admin/locale/sr/LC_MESSAGES/django.po,sha256=827weBLl0b41B9v4oEkZeVYBgSQQBiM2xZ5nCQO3sVE,19194 +django/contrib/admin/locale/sr/LC_MESSAGES/djangojs.mo,sha256=sUOlK4V6-Ct0VKemqbcHPMk81jEGumujgorhpUVD6yw,6125 +django/contrib/admin/locale/sr/LC_MESSAGES/djangojs.po,sha256=GGzmoBQBaFHy9QB_PkUUIxWy0Ot-GL5BfY-jWVtNmS0,6785 +django/contrib/admin/locale/sr_Latn/LC_MESSAGES/django.mo,sha256=8wcRn4O2WYMFJal760MvjtSPBNoDgHAEYtedg8CC7Ao,12383 +django/contrib/admin/locale/sr_Latn/LC_MESSAGES/django.po,sha256=N4fPEJTtUrQnc8q1MioPZ2a7E55YXrE-JvfAcWZubfA,16150 +django/contrib/admin/locale/sr_Latn/LC_MESSAGES/djangojs.mo,sha256=eE2Xu7W3ggV0lo62WghIbME2jkAVZXMUWGexwz2V0fI,5136 +django/contrib/admin/locale/sr_Latn/LC_MESSAGES/djangojs.po,sha256=YuKlU4CyKwrc0yumnUH_6tetOzBwbjTCjkhcO8VcTyU,5753 +django/contrib/admin/locale/sv/LC_MESSAGES/django.mo,sha256=LbQrBeUhFggf7OJm7xc79r8B3r0CSC4ObTddnIzilNo,16436 +django/contrib/admin/locale/sv/LC_MESSAGES/django.po,sha256=8AUaeZ2A0EvGYyve97UBcVmbUc_XsS-Ob8d-xLY5fBg,18150 +django/contrib/admin/locale/sv/LC_MESSAGES/djangojs.mo,sha256=D7Bo8rFeCT6daVSdjr8QWdmDpN5UYdFnwviV3zZW0_o,4500 +django/contrib/admin/locale/sv/LC_MESSAGES/djangojs.po,sha256=qdD922JzhXE5WK54ZYtgq9uL80n1tum0q5tEo1kHBqY,5182 +django/contrib/admin/locale/sw/LC_MESSAGES/django.mo,sha256=Mtj7jvbugkVTj0qyJ_AMokWEa2btJNSG2XrhpY0U1Mc,14353 +django/contrib/admin/locale/sw/LC_MESSAGES/django.po,sha256=ElU-s0MgtNKF_aXdo-uugBnuJIDzHqMmy1ToMDQhuD0,16419 +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/tr/LC_MESSAGES/django.mo,sha256=lIH6Rxbni7csB5cHmZwmHQnpxa1SCwPr_8nAPFR9WJY,17266 +django/contrib/admin/locale/tr/LC_MESSAGES/django.po,sha256=GAm62Lh7u0T1aiNI5BjidNzOKTCHOiGAca8eAIgKvPE,18789 +django/contrib/admin/locale/tr/LC_MESSAGES/djangojs.mo,sha256=GBahBmPERR7nnaf8ruY-XTq_GDn_Km80IW8yny-4dXc,5121 +django/contrib/admin/locale/tr/LC_MESSAGES/djangojs.po,sha256=iHYckcDAbOkxL4wREObIUnoEIjQL9i51CRaYwL4wI4Y,5764 +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/uk/LC_MESSAGES/django.mo,sha256=Wc1E8kLHTeu0GRg1vkj_kataySFcnrVk_oCLYMUpa6M,20988 +django/contrib/admin/locale/uk/LC_MESSAGES/django.po,sha256=n7NqZajp0dDWD9r5o1Aot8pQski1gtp6eZziqHg0gEU,22827 +django/contrib/admin/locale/uk/LC_MESSAGES/djangojs.mo,sha256=YL-bL4CeoOsvcXKY30FsakS6A8kG0egbvDf2yYdFfU8,5930 +django/contrib/admin/locale/uk/LC_MESSAGES/djangojs.po,sha256=lKHsuFkzp8_evIKm8mVyZKIf99EIo8BsLYkIiyN29UY,6654 +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=EY1JuM2_Ulx2vZzWZPSmaFpPO-v9Npr6SvmUQHKvOns,3984 +django/contrib/admin/locale/uz/LC_MESSAGES/django.po,sha256=IGSgnKiE_DImS0LjrUhPXptg1-cNLRCQ_KQ__QrebNs,12803 +django/contrib/admin/locale/uz/LC_MESSAGES/djangojs.mo,sha256=LhMWp7foVSN65gP4RqFGzkLlSaEfqVQ8kW16X-5kJVs,4517 +django/contrib/admin/locale/uz/LC_MESSAGES/djangojs.po,sha256=-YpHNtdwmKeavDSVZZMUsNQ9MirfhNS_Kzox72FatS4,4950 +django/contrib/admin/locale/vi/LC_MESSAGES/django.mo,sha256=nkSrBQaktbMGWr8IMNoPoOVQBAIR1GJF13BvKLu2CeM,14860 +django/contrib/admin/locale/vi/LC_MESSAGES/django.po,sha256=FxcEsnT3-FvPXjnHp9y51jFPILUgSx27egwtwU_wbS0,17847 +django/contrib/admin/locale/vi/LC_MESSAGES/djangojs.mo,sha256=M_wqHg1NO-I7xfY-mMZ29BqUAqGzlizgJ3_DIGBWOUc,3733 +django/contrib/admin/locale/vi/LC_MESSAGES/djangojs.po,sha256=d3YtQhNuCqtfMO3u5-6zoNhhGBNYkoUhTrxz7I3PRkQ,5018 +django/contrib/admin/locale/zh_Hans/LC_MESSAGES/django.mo,sha256=54flhrIfCICEolonPNRcP1Bfa6Zb2BUKREmP7TQwq7c,15844 +django/contrib/admin/locale/zh_Hans/LC_MESSAGES/django.po,sha256=-VcDFuL6GQn6SBktuCrdBIDnboFzwVnfxp_X3GZmtT0,17811 +django/contrib/admin/locale/zh_Hans/LC_MESSAGES/djangojs.mo,sha256=WbSCAiqttOXlVFh64D4gLTZIX5C_JYAQBCD3TrE842E,4831 +django/contrib/admin/locale/zh_Hans/LC_MESSAGES/djangojs.po,sha256=cQKCmWwRnAzL9RHKWENfT_4j-Pu-7xF_ZtQP5i-oOew,5752 +django/contrib/admin/locale/zh_Hant/LC_MESSAGES/django.mo,sha256=kEKX-cQPRFCNkiqNs1BnyzEvJQF-EzA814ASnYPFMsw,15152 +django/contrib/admin/locale/zh_Hant/LC_MESSAGES/django.po,sha256=iH3w7Xt_MelkZefKi8F0yAWN6QGdQCJBz8VaFY4maUg,16531 +django/contrib/admin/locale/zh_Hant/LC_MESSAGES/djangojs.mo,sha256=yFwS8aTJUAG5lN4tYLCxx-FLfTsiOxXrCEhlIA-9vcs,4230 +django/contrib/admin/locale/zh_Hant/LC_MESSAGES/djangojs.po,sha256=C4Yk5yuYcmaovVs_CS8YFYY2iS4RGi0oNaUpTm7akeU,4724 +django/contrib/admin/migrations/0001_initial.py,sha256=9EuqU1zlIQtP_U2z1orVgxGvIhZ57df9S3GhpDhNWgM,1892 +django/contrib/admin/migrations/0002_logentry_remove_auto_add.py,sha256=_7XFWubtQ7NG0eQ02MqtxXQmjBmYc6Od5rwcAiT1aCs,554 +django/contrib/admin/migrations/0003_logentry_add_action_flag_choices.py,sha256=UCS9mPrkhZ5YL_9RMSrgA7uWDTzvLzqSLq_LSXVXimM,539 +django/contrib/admin/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/admin/migrations/__pycache__/0001_initial.cpython-38.pyc,, +django/contrib/admin/migrations/__pycache__/0002_logentry_remove_auto_add.cpython-38.pyc,, +django/contrib/admin/migrations/__pycache__/0003_logentry_add_action_flag_choices.cpython-38.pyc,, +django/contrib/admin/migrations/__pycache__/__init__.cpython-38.pyc,, +django/contrib/admin/models.py,sha256=qqwq3V_KqV4_WJIYqKjIQnVxZZnIPzyHBDhnMg101Ho,5672 +django/contrib/admin/options.py,sha256=Ouy0052pCOkVeukOTd9yNCPac8nq6meRgAiF2MjvNGs,92875 +django/contrib/admin/sites.py,sha256=XeDxjtCJFLZU_CrcWr9meOtd0EbREWlgXAFxMjVI_H8,21926 +django/contrib/admin/static/admin/css/autocomplete.css,sha256=6-fcQdqClpGf8EpH1NxgS8YL-diGXc8CFq3Sw2I9K8k,9114 +django/contrib/admin/static/admin/css/base.css,sha256=uIqqrMcVS8cUSwazn-SVHKwzrZsB3k-Hhw4MOMBs74c,19513 +django/contrib/admin/static/admin/css/changelists.css,sha256=iu5vcArMuGfTXzmilFiXTZ-YtdYAQBv2gFG2B1FDnPQ,6874 +django/contrib/admin/static/admin/css/dashboard.css,sha256=i2OcDTa1R_bO6aBTZ66-aRlTXl0l4sjeHfasUrfzjd0,380 +django/contrib/admin/static/admin/css/fonts.css,sha256=SnBl3KjeUZqRmZw3F0iNm1YpqFhjrNC_fNN0H2TkuYc,423 +django/contrib/admin/static/admin/css/forms.css,sha256=9cjBZtfQuzda7S-X_8tpbSFo2xGpXI_ZIPD2V_g8QaM,8804 +django/contrib/admin/static/admin/css/login.css,sha256=grNYganuogydcA6Z4E-wNkB8_n4v7E70ILY0N8TYhNo,939 +django/contrib/admin/static/admin/css/nav_sidebar.css,sha256=_Bck_vuBIoRDeNWj7LHY3bNhQR4nTcdDiSphJYV64Q4,2271 +django/contrib/admin/static/admin/css/responsive.css,sha256=VqiYdkqye_cMzg6ZNfcuDQIdx_AKvolWoHdasXmmpGw,18545 +django/contrib/admin/static/admin/css/responsive_rtl.css,sha256=iM8FIfXLuXgurjYK0JwboVuilUg1hnaZw7wa3hx8aI0,1741 +django/contrib/admin/static/admin/css/rtl.css,sha256=1omOH5YP-blvLuFKw1fFtPiMaKlC7UDmT2T2JvM7D4o,3234 +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=RYVncctTggpZ1eBo8QCavypH4ug8rySk8MzQeCYur8U,11097 +django/contrib/admin/static/admin/fonts/LICENSE.txt,sha256=Pd-b5cKP4n2tFDpdx27qJSIq0d1ok0oEcGTlbtL6QMU,11560 +django/contrib/admin/static/admin/fonts/README.txt,sha256=E4rvl9Y9cvKx2wpkrgQZjhaKfRhEUG8pNLCoZoBq-rE,214 +django/contrib/admin/static/admin/fonts/Roboto-Bold-webfont.woff,sha256=sXZ6DD5d-zpQCe_uREX_FdY2LpKFRh4Xve0Ybx6UVvA,86184 +django/contrib/admin/static/admin/fonts/Roboto-Light-webfont.woff,sha256=GIJzScf-vUuNAaqQfGfqm4ARJCB4MmskcDl4RU_fNRo,85692 +django/contrib/admin/static/admin/fonts/Roboto-Regular-webfont.woff,sha256=munWVF19fYI_ipQBDbd8Gg_3Hjcei7FY3xy5g5UWJQc,85876 +django/contrib/admin/static/admin/img/LICENSE,sha256=0RT6_zSIwWwxmzI13EH5AjnT1j2YU3MwM9j3U19cAAQ,1081 +django/contrib/admin/static/admin/img/README.txt,sha256=XqN5MlT1SIi6sdnYnKJrOiJ6h9lTIejT7nLSY-Y74pk,319 +django/contrib/admin/static/admin/img/calendar-icons.svg,sha256=gbMu26nfxZphlqKFcVOXpcv5zhv5x_Qm_P4ba0Ze84I,1094 +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=kBtPJJ3qeQPWeNftvprZiR51NYaZ2n_ZwJatY9-Zx1Q,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=clM2ew94bwVa2xQ6bvfKx8xLtk0i-u5AybNlyP8k-UM,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-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=Ni1z8eDYBOveVDqtoaGyEMWG5Mdnt9dniiuBWTlnr5Y,560 +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=FLFCFiaO4KziwueL83Un_WCR0-Lf66PhVqpvnbat50s,4360 +django/contrib/admin/static/admin/js/SelectFilter2.js,sha256=Nkgyinav9IBHIkJf8zCfAwArDZnY2Jbji2847SByUoU,12350 +django/contrib/admin/static/admin/js/actions.js,sha256=alN6-Bf1Jx3qXHvzwG29yZ5Q-SObo9Gu_5Dk_7nQ--Y,7664 +django/contrib/admin/static/admin/js/admin/DateTimeShortcuts.js,sha256=7tcIrJeL0C8WtUHCohivb_2n9i1XnbUi1-3a4H_5DNc,19634 +django/contrib/admin/static/admin/js/admin/RelatedObjectLookups.js,sha256=pZamCGsBc4mp14Fbzyaq4agdOhktSby3B9eZXDsa494,5984 +django/contrib/admin/static/admin/js/autocomplete.js,sha256=5XwFfi-ziyvI1FTFi_-lUu8Dur_TMNAL6La8g2WOTyA,1320 +django/contrib/admin/static/admin/js/calendar.js,sha256=vsYjQ4Nv6LPpqMVMhko8mnsv6U5EXkk5hOHhmkC5m7g,8466 +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/collapse.js,sha256=UONBUueHwsm5SMlG0Ufp4mlqdgu7UGimU6psKzpxbuE,1803 +django/contrib/admin/static/admin/js/core.js,sha256=BhyKmeEBYz6lwUZ7q3J3O7f4spPsC-uuhADEYRPOOzs,5698 +django/contrib/admin/static/admin/js/inlines.js,sha256=dSEFix4uxQPiv4U8WDt3JTWuczG4yc9kCdemKxt4V6Q,15225 +django/contrib/admin/static/admin/js/jquery.init.js,sha256=uM_Kf7EOBMipcCmuQHbyubQkycleSWDCS8-c3WevFW0,347 +django/contrib/admin/static/admin/js/nav_sidebar.js,sha256=Ufbx1cSAoDA8ovlBg6VPSdDArY_-fRzt_YnQ-snuSHk,1360 +django/contrib/admin/static/admin/js/popup_response.js,sha256=H4ppG14jfrxB1XF5xZp5SS8PapYuYou5H7uwYjHd7eI,551 +django/contrib/admin/static/admin/js/prepopulate.js,sha256=UYkWrHNK1-OWp1a5IWZdg0udfo_dcR-jKSn5AlxxqgU,1531 +django/contrib/admin/static/admin/js/prepopulate_init.js,sha256=JdhYQLmheJU2wK3xAelyDN5VVesDXT9XU_xwRnKhlKA,492 +django/contrib/admin/static/admin/js/urlify.js,sha256=ksu4cDd9JpFsN5cLT8BpOtg0JkkrIlWR1yr3nLlWXbI,7902 +django/contrib/admin/static/admin/js/vendor/jquery/LICENSE.txt,sha256=H_YDEY79sxN5lWfLSkCFlJVDhPQIQ8pvKcWW9bH4kH0,1095 +django/contrib/admin/static/admin/js/vendor/jquery/jquery.js,sha256=QWo7LDvxbWT2tbbQ97B53yJnYU3WhH_C8ycbRAkjPDc,287630 +django/contrib/admin/static/admin/js/vendor/jquery/jquery.min.js,sha256=9_aliU8dGd2tb6OSsuzixeV4y_faTqgFtohetphbbj0,89476 +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=xnYLh4GL4QG4S1G_JWwF_AR18rY9KmrwD3kxq7PTZNw,1103 +django/contrib/admin/static/admin/js/vendor/xregexp/xregexp.js,sha256=rtvcVZex5zUbQQpBDEwPXetC28nAEksnAblw2Flt9tA,232381 +django/contrib/admin/static/admin/js/vendor/xregexp/xregexp.min.js,sha256=e2iDfG6V1sfGUB92i5yNqQamsMCc8An0SFzoo3vbylg,125266 +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=pTlhPi66D3Lrm2RQdAWHqUVdyJECbqx1Oj86Fkv-fPk,1245 +django/contrib/admin/templates/admin/app_index.html,sha256=X-ISFsSrON8osoS93ywjM11MLGhrcx-U0o6tJfpWRqY,389 +django/contrib/admin/templates/admin/app_list.html,sha256=Zg5jM2ehz66QsuxYIghQ0OyqDjhDMnvLoNeduulP7Ng,1686 +django/contrib/admin/templates/admin/auth/user/add_form.html,sha256=5DL3UbNWW2rTvWrpMsxy5XcVNT6_uYv8DjDZZksiVKQ,320 +django/contrib/admin/templates/admin/auth/user/change_password.html,sha256=RdRA3izwkR7q3r3uiZWMtRtCAfCCNMJLVufCJ5ylrTI,2262 +django/contrib/admin/templates/admin/base.html,sha256=8x0eJfHMDWy0pykkShldGLmt6B_F5fd0otJ-60sDRi8,4341 +django/contrib/admin/templates/admin/base_site.html,sha256=3ckWrcAdd7Pw1hk6Zwyknab_Qb-rteV9-mXhMnfo6VI,361 +django/contrib/admin/templates/admin/change_form.html,sha256=f58vbrT4Wv_nzYtV7ohffAOEFw8y91mnaGlemtsOGa8,3051 +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=FSuAcw7c_Gb4F2SP8-Wt6oAsFZYgCHnlgQMzL9ux0nk,3258 +django/contrib/admin/templates/admin/change_list_object_tools.html,sha256=-AX0bYTxDsdLtEpAEK3RFpY89tdvVChMAWPYBLqPn48,378 +django/contrib/admin/templates/admin/change_list_results.html,sha256=qbyav3RbkwkvN0OCT1XIKQqgsSNUsqo4Kuxi-yVQTPU,1550 +django/contrib/admin/templates/admin/date_hierarchy.html,sha256=I9Nj9WJb3JM_9ZBHrg4xIFku_a59U-KoqO5yuSaqVJQ,518 +django/contrib/admin/templates/admin/delete_confirmation.html,sha256=GfcMpSIo6Xy4QWX1_oNYilY7c1C8FKSbGWiWfw61VlY,2426 +django/contrib/admin/templates/admin/delete_selected_confirmation.html,sha256=i2sUDTPuSlJqOh_JMKx5VsxOpZC9W5zD94R2XpiNPBk,2341 +django/contrib/admin/templates/admin/edit_inline/stacked.html,sha256=pT9vuDv0vbgsaQlU6tDZAJuY08L-c-5_vPm0w5EskA0,2561 +django/contrib/admin/templates/admin/edit_inline/tabular.html,sha256=w3SBaL5OTZ7I2zwe_ZZ4h6nR_MBhge3iObnzPx8Md7k,4485 +django/contrib/admin/templates/admin/filter.html,sha256=V1sWCmJMSvBC_GzTtJkNWn-FfdzPpcBySERTVH5i8HY,338 +django/contrib/admin/templates/admin/includes/fieldset.html,sha256=DgcBbVUfkho33IMZGEg42Xr9P5y3ZAefFzqkxf74v1Q,1787 +django/contrib/admin/templates/admin/includes/object_delete_summary.html,sha256=OC7VhKQiczmi01Gt_3jyemelerSNrGyDiWghUK6xKEI,192 +django/contrib/admin/templates/admin/index.html,sha256=IJV2pH-Xi8rYmR1TzckraJ3A2fSjzejV6Dpk-oPqCEA,1861 +django/contrib/admin/templates/admin/invalid_setup.html,sha256=F5FS3o7S3l4idPrX29OKlM_azYmCRKzFdYjV_jpTqhE,447 +django/contrib/admin/templates/admin/login.html,sha256=yhk3veXIvM_efQLL4NcjfYWxZKqqAct3hPS6mYaWBJ0,1912 +django/contrib/admin/templates/admin/nav_sidebar.html,sha256=wZjmLWbRHWrCaBH0ZyMhWeYlAeTIS3PGWNmcBmWINVw,276 +django/contrib/admin/templates/admin/object_history.html,sha256=hr_yKkciaPU-ljl3XM_87c2q0076YhAQXHy7buayLIc,1472 +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=vVRsVT_TxUddTdKI7ADfIbwg5Mog4XVQwoBWlivEjRc,214 +django/contrib/admin/templates/admin/search_form.html,sha256=Ea8OEGFRyiTpkqdeWGyQ0mVWK0tuHXVndnO77xmjBYg,1044 +django/contrib/admin/templates/admin/submit_line.html,sha256=DgxKlyJ2b8o5NVWzE47yt_2X-xnbobKjdIVK2Y7jXBU,1052 +django/contrib/admin/templates/admin/widgets/clearable_file_input.html,sha256=NWjHNdkTZMAxU5HWXrOQCReeAO5A6PXBDRWO8S9gSGI,618 +django/contrib/admin/templates/admin/widgets/foreign_key_raw_id.html,sha256=Sp46OiJ5ViQMXfSaug4UkqIiXbiGdlQ8GNEhA8kVLUo,341 +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=LN8EMnad8qnyi2HIbOes3DkdbGkEsX4R4szGf_KByGM,1490 +django/contrib/admin/templates/admin/widgets/split_datetime.html,sha256=BQ9XNv3eqtvNqZZGW38VBM2Nan-5PBxokbo2Fm_wwCQ,238 +django/contrib/admin/templates/admin/widgets/url.html,sha256=Tf7PwdoKAiimfmDTVbWzRVxxUeyfhF0OlsuiOZ1tHgI,218 +django/contrib/admin/templates/registration/logged_out.html,sha256=CUO9snYMIOwRkd0j-Uk75xNyio7s_YezY9hnXZFt4QU,425 +django/contrib/admin/templates/registration/password_change_done.html,sha256=Zmw7eNYw8wa8tem8xVBG5C2Oavcz8Fxsst4xfxzqOdo,592 +django/contrib/admin/templates/registration/password_change_form.html,sha256=-j_Khtxde2DRGu5G9xXZ3PGPMqDfT9U-soEXY6h0MJM,1980 +django/contrib/admin/templates/registration/password_reset_complete.html,sha256=_fc5bDeYBaI5fCUJZ0ZFpmOE2CUqlbk3npGk63uc_Ks,417 +django/contrib/admin/templates/registration/password_reset_confirm.html,sha256=3OqkroQSoGf-jh0xofN4BBWoDKpeqeY8xxuBe_cfBBM,1382 +django/contrib/admin/templates/registration/password_reset_done.html,sha256=SQsksjWN8vPLpvtFYPBFMMqZtLeiB4nesPq2VxpB3Y8,588 +django/contrib/admin/templates/registration/password_reset_email.html,sha256=rqaoGa900-rsUasaGYP2W9nBd6KOGZTyc1PsGTFozHo,612 +django/contrib/admin/templates/registration/password_reset_form.html,sha256=yZ0bRooNSKEyiG2KK8nplisKLQTxGk55rdzZxVybeaM,885 +django/contrib/admin/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/admin/templatetags/__pycache__/__init__.cpython-38.pyc,, +django/contrib/admin/templatetags/__pycache__/admin_list.cpython-38.pyc,, +django/contrib/admin/templatetags/__pycache__/admin_modify.cpython-38.pyc,, +django/contrib/admin/templatetags/__pycache__/admin_urls.cpython-38.pyc,, +django/contrib/admin/templatetags/__pycache__/base.cpython-38.pyc,, +django/contrib/admin/templatetags/__pycache__/log.cpython-38.pyc,, +django/contrib/admin/templatetags/admin_list.py,sha256=utue6tYsek6X2KRfBLUlBHRGvAh8rlGPiWlFzvY86Ns,17397 +django/contrib/admin/templatetags/admin_modify.py,sha256=KFbvwVixlzFuXEnZx1MVu77_7ZhV9B94JPR8MnHiVw8,4399 +django/contrib/admin/templatetags/admin_urls.py,sha256=b_RxDLR7yLBTMe-_ylzO-m0R3ITq3ZP_pnddRyM_Nos,1791 +django/contrib/admin/templatetags/base.py,sha256=mCcrwBWbgutR3tpaduRKNG3ShTu5Yl0Tjba5O5Rp5hU,1318 +django/contrib/admin/templatetags/log.py,sha256=mxV6mvfVJo0qRCelkjRBNWfrurLABhZvGQlcp5Bn4IU,2079 +django/contrib/admin/tests.py,sha256=O5yjYbAYCEiextaNL-amFfZkwefypnP6RN0CShtPncQ,7602 +django/contrib/admin/utils.py,sha256=IyzizG6_AVb0SniSmWqXhRS9R6jK84rXP0RkJUZJxyo,19788 +django/contrib/admin/views/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/admin/views/__pycache__/__init__.cpython-38.pyc,, +django/contrib/admin/views/__pycache__/autocomplete.cpython-38.pyc,, +django/contrib/admin/views/__pycache__/decorators.cpython-38.pyc,, +django/contrib/admin/views/__pycache__/main.cpython-38.pyc,, +django/contrib/admin/views/autocomplete.py,sha256=hDgWRwFPgE4k1OUWhwDNrmbkpflBrqCbdO8Kt1CSydc,3888 +django/contrib/admin/views/decorators.py,sha256=J4wYcyaFr_-xY1ANl6QF4cFhOupRvjjmBotN0FshVYg,658 +django/contrib/admin/views/main.py,sha256=T_tq6NVYdxJ6fjaE_3JfY3G_jwED8gcpkkdeuqsJYD8,23030 +django/contrib/admin/widgets.py,sha256=9cS7et45j9fPYVx2jj1oANV6wHXMkgtwdcC06S6pdUw,17388 +django/contrib/admindocs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/admindocs/__pycache__/__init__.cpython-38.pyc,, +django/contrib/admindocs/__pycache__/apps.cpython-38.pyc,, +django/contrib/admindocs/__pycache__/middleware.cpython-38.pyc,, +django/contrib/admindocs/__pycache__/urls.cpython-38.pyc,, +django/contrib/admindocs/__pycache__/utils.cpython-38.pyc,, +django/contrib/admindocs/__pycache__/views.cpython-38.pyc,, +django/contrib/admindocs/apps.py,sha256=rV3aWVevgI6o8_9WY0yQ62O5CSMRRZrVwZFt1gpfKk0,216 +django/contrib/admindocs/locale/af/LC_MESSAGES/django.mo,sha256=RnpPLulXkAXe6s5TmlkNbHWyK5R-0nGlOv-3TOFT_JU,702 +django/contrib/admindocs/locale/af/LC_MESSAGES/django.po,sha256=18HnMLlT8NzeujAJRPHGmwkKesl9Uy8Fllt3AP_lYgw,4608 +django/contrib/admindocs/locale/ar/LC_MESSAGES/django.mo,sha256=Gt6tFwPvlcMaOYZYGgKOFJBqF-TUoEm4tr4Ff3LYjUQ,7421 +django/contrib/admindocs/locale/ar/LC_MESSAGES/django.po,sha256=eO8WOK-lHFS0YaxjvW3M_gqwaWVrJbCpQm0MMmT_tdI,8025 +django/contrib/admindocs/locale/ar_DZ/LC_MESSAGES/django.mo,sha256=JfZf3pQPepUkAqcWj4XEKHGVg59E8U4sHI7wXxZ1F9Q,7445 +django/contrib/admindocs/locale/ar_DZ/LC_MESSAGES/django.po,sha256=fQLd1eOQppL7PFnjqDYq1cEJchxzNxi5ALOldU_68XA,7942 +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=yWjmqVrGit7XjELYepZ9R48eOKma5Wau2RkkSSiJrgc,1687 +django/contrib/admindocs/locale/az/LC_MESSAGES/django.po,sha256=wGdq-g4u8ssHHvODJB-knjZdrP6noxRW9APn_kmOz7w,4993 +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=n9GdBZljKJBmfups8Zt82lpHgEWvonacXztOS6qbAjM,7837 +django/contrib/admindocs/locale/bg/LC_MESSAGES/django.po,sha256=SrmOtJ6nOi3lrgEwr-s76jYzN7lZs05dbEwh9OFxFHU,8692 +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=0elCZBJul-zx5ofeQ7vu7hVYb5JEl5jo5vgSiKp2HOY,6661 +django/contrib/admindocs/locale/ca/LC_MESSAGES/django.po,sha256=5owS4x9uNL5ZMbh38DFL9GpVZ3MzUtXEv8o7bJTDy7Q,7402 +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=tsaEPab2JJpJRq7hYbPK9Ulh_gK9rkbMXrsadyAqK1g,6561 +django/contrib/admindocs/locale/de/LC_MESSAGES/django.po,sha256=6g8iEaTVsrXYctYRM4LUqhUSaQ65ZNvz7pPLERA98x0,7125 +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=dJy15irtJqzPFc_yHS3LTeXYmPu0-bIlyrDPfbE5pSE,8598 +django/contrib/admindocs/locale/el/LC_MESSAGES/django.po,sha256=82wcERwp7_v3l66v3GKdlT-lVGhwGs8DK0184SbV3zk,9259 +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=KwJDXghEgvQTDs7Tp2FM0EUedEtB2hvtd1D7neBFHB0,6380 +django/contrib/admindocs/locale/et/LC_MESSAGES/django.po,sha256=EDiJDtGgj7WwVhu0IlfV4HRrbHVxvElljF2Lt8GpI8Y,7062 +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=PkY5sLKd7gEIE2IkuuNJXP5RmjC-D4OODRv6KCCUDX8,1940 +django/contrib/admindocs/locale/ga/LC_MESSAGES/django.po,sha256=-l6VME96KR1KKNACVu7oHzlhCrnkC1PaJQyskOUqOvk,5211 +django/contrib/admindocs/locale/gd/LC_MESSAGES/django.mo,sha256=1cfTNUgFPK9zGj6r6y7jGGiHcW9QpCq5XAb5yvAawiU,6939 +django/contrib/admindocs/locale/gd/LC_MESSAGES/django.po,sha256=nUKSAF7cI9pjxV4qLswYMrPWUsD__rNRtD-j-Ir8efg,7476 +django/contrib/admindocs/locale/gl/LC_MESSAGES/django.mo,sha256=CYtHrSyH_Lw0YxmmmndEnMPU-cw5TMr-8NHUjz6v7JM,2265 +django/contrib/admindocs/locale/gl/LC_MESSAGES/django.po,sha256=0S2CJju3EIiEp6kqJIn0Jl1IyRAg2-5ovYMOW0YRtVA,5188 +django/contrib/admindocs/locale/he/LC_MESSAGES/django.mo,sha256=g9HBtvV5UTZg3V9TE4Q-qsF5apyMeLcPIJr1494PGXg,6985 +django/contrib/admindocs/locale/he/LC_MESSAGES/django.po,sha256=GX8X7-aPN9sbgbT_paJCFNYnq00b09fZ0HuZ4Jn3hT0,7522 +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=55ze7c7MwxHf27I9Q6n9h--pczff43TWeUiMPjRw2zY,6337 +django/contrib/admindocs/locale/id/LC_MESSAGES/django.po,sha256=N7NrFJdFTpiIjKDPWMpa1FyOVpxdqZ9QChzOVbws6kE,7027 +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=fbiHUPdw_iXrOvgiIvPTJI3WPLD_T77VBfhqW6gjq1c,5178 +django/contrib/admindocs/locale/ko/LC_MESSAGES/django.mo,sha256=SZynW9hR503fzQCXSSeYvwwZChBF7ff3iHGMESh4ayA,6592 +django/contrib/admindocs/locale/ko/LC_MESSAGES/django.po,sha256=E81VE22vrKjgxDthgxOIO3sxgTVmNf-gZMba9Qcr9yY,7352 +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=KqdcvSpqmjRfA8M4nGB9Cnu9Auj4pTu9aH07XtCep3I,7607 +django/contrib/admindocs/locale/mn/LC_MESSAGES/django.po,sha256=PGhlnzDKyAIRzaPCbNujpxSpf_JaOG66LK_NMlnZy6I,8316 +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/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=nZwZekyuJi9U8WhJHasdQ05O1Qky8kJzj3i6c4lj3rw,6463 +django/contrib/admindocs/locale/nl/LC_MESSAGES/django.po,sha256=aP59hIiCQwGCKyHnoJXYJIChzYMbNFlb2IotTX4WBwU,7188 +django/contrib/admindocs/locale/nn/LC_MESSAGES/django.mo,sha256=Dx-A4dlDEoOKrtvis1mWfvwA2Urj-QAiKNmBy--v0oY,1662 +django/contrib/admindocs/locale/nn/LC_MESSAGES/django.po,sha256=VAHAyol0YEaHd0TaGxaQuVUIR72QB3VUnB1ARtr-AWw,4974 +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=WcXhSlbGdJgVMvydkPYYee7iOQ9SYdrLkquzgIBhVWU,6566 +django/contrib/admindocs/locale/pt/LC_MESSAGES/django.po,sha256=J98Hxa-ApyzRevBwcAldK9bRYbkn5DFw3Z5P7SMEwx0,7191 +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=Y9vQluxcGX9liYofnZb80iwgrdLs9WneKHX4-JX4evY,6644 +django/contrib/admindocs/locale/sk/LC_MESSAGES/django.po,sha256=X9eNfQfHj-SBIEUq5beCU3l5hpVPgv5ktn7GHT__2Qc,7337 +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=XvNDzCc3-Hh5Pz7SHhG8zCT_3dtqGzBLkDqhim4jJpc,6551 +django/contrib/admindocs/locale/sq/LC_MESSAGES/django.po,sha256=0GZvLpxbuYln7GrTsFyzgjIleSw6Z9IRSPgAWWdx6Eo,7165 +django/contrib/admindocs/locale/sr/LC_MESSAGES/django.mo,sha256=PyE8DXRYELzSs4RWh1jeADXOPrDEN3k-nLr8sbM1Ssw,3672 +django/contrib/admindocs/locale/sr/LC_MESSAGES/django.po,sha256=ri7v9WHXORY-3Dl-YDKGsCFfQzH-a5y8t1vT6yziIyo,6108 +django/contrib/admindocs/locale/sr_Latn/LC_MESSAGES/django.mo,sha256=au90IT43VR162L2jEsYqhRpso2dvOjpCPSCFiglokTc,1932 +django/contrib/admindocs/locale/sr_Latn/LC_MESSAGES/django.po,sha256=tJ4tHLJj0tDaVZba3WIkI0kg95_jEYWTmqXD0rFb6T8,5140 +django/contrib/admindocs/locale/sv/LC_MESSAGES/django.mo,sha256=FsErCRG8EAsZB7DhFxnvU_GeAv9gy5VC0gOYgV7-teA,6417 +django/contrib/admindocs/locale/sv/LC_MESSAGES/django.po,sha256=1sPLsQ6XXpmeIvqtKTFrsYpD39tg1ijy37iaBEmsq5Y,7042 +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/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=7c2QywaTzF_GX8T2PUknQ_PN5s0Cx37_cO-walIg8mk,4725 +django/contrib/admindocs/locale/zh_Hant/LC_MESSAGES/django.po,sha256=uX-3zu8RQdntg__qYBweKtcuBgLsXPUYApf4bQx9eSU,6153 +django/contrib/admindocs/middleware.py,sha256=Ua-a8Ylsr47RU8BWnuHsOzZ3g0ZnGdf6bj3H9xAR7_4,1225 +django/contrib/admindocs/templates/admin_doc/bookmarklets.html,sha256=PnfojSYh6lJA03UPjWbvxci64CNPQmrhJhycdyqlT5U,1281 +django/contrib/admindocs/templates/admin_doc/index.html,sha256=o710lPn-AHBJfKSUS6x1eUjAOZYRO9dbnuq_Cg7HEiY,1369 +django/contrib/admindocs/templates/admin_doc/missing_docutils.html,sha256=f8CcVOHCgUmbG_V56rVLV1tttQYPdkcxAHY_IWiMPK4,786 +django/contrib/admindocs/templates/admin_doc/model_detail.html,sha256=0O5-Kxf8RNyZ_slYJ1kq26HmKoarGMkf0S27fqhrFYE,1880 +django/contrib/admindocs/templates/admin_doc/model_index.html,sha256=7fgybgDWYcWZaDPgf25DxFkdxtnrqnpLem7iVmPQmLk,1346 +django/contrib/admindocs/templates/admin_doc/template_detail.html,sha256=C_shsOpJiW0Rngv8ZSXi12dgoepUUCqU3dPdaq9Bmio,1049 +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=u2rjpM0cLlHxSY-Na7wxqnv76zaGf0P1FgdnHl9XqdQ,928 +django/contrib/admindocs/templates/admin_doc/view_index.html,sha256=ZLfmxMkVlPYETRFnjLmU3bagve4ZvY1Xzsya1Lntgkw,1734 +django/contrib/admindocs/urls.py,sha256=zdHaV60yJMjuLqO9xU0H-j7hz1PmSsepEWZA2GH-eI0,1310 +django/contrib/admindocs/utils.py,sha256=tCEGbV5-NyO6qkLIXjl-MX8kT9BgfWkiJuzgkfO1Mso,7735 +django/contrib/admindocs/views.py,sha256=SyS5eZk5yv-MDtHih96mXPC1muxcsiRWlBC_u0WjgYY,16610 +django/contrib/auth/__init__.py,sha256=rKe8ZkIy6BdifutPxw64Qw2RPNYPrUX7t4491mBKS40,8129 +django/contrib/auth/__pycache__/__init__.cpython-38.pyc,, +django/contrib/auth/__pycache__/admin.cpython-38.pyc,, +django/contrib/auth/__pycache__/apps.cpython-38.pyc,, +django/contrib/auth/__pycache__/backends.cpython-38.pyc,, +django/contrib/auth/__pycache__/base_user.cpython-38.pyc,, +django/contrib/auth/__pycache__/checks.cpython-38.pyc,, +django/contrib/auth/__pycache__/context_processors.cpython-38.pyc,, +django/contrib/auth/__pycache__/decorators.cpython-38.pyc,, +django/contrib/auth/__pycache__/forms.cpython-38.pyc,, +django/contrib/auth/__pycache__/hashers.cpython-38.pyc,, +django/contrib/auth/__pycache__/middleware.cpython-38.pyc,, +django/contrib/auth/__pycache__/mixins.cpython-38.pyc,, +django/contrib/auth/__pycache__/models.cpython-38.pyc,, +django/contrib/auth/__pycache__/password_validation.cpython-38.pyc,, +django/contrib/auth/__pycache__/signals.cpython-38.pyc,, +django/contrib/auth/__pycache__/tokens.cpython-38.pyc,, +django/contrib/auth/__pycache__/urls.cpython-38.pyc,, +django/contrib/auth/__pycache__/validators.cpython-38.pyc,, +django/contrib/auth/__pycache__/views.cpython-38.pyc,, +django/contrib/auth/admin.py,sha256=YbVtoNYWSkoLWKePeJ0Pl6u6wrhaoxeS8dTd3n7hXws,8607 +django/contrib/auth/apps.py,sha256=DgNZlcp3k1Q0rextjMNEtabiYJovxYLseqamxFcvt_k,1222 +django/contrib/auth/backends.py,sha256=fvm2NFyd90CSCzv66G7RA8x5zszGu2u_0YnHhB_JlpY,8584 +django/contrib/auth/base_user.py,sha256=cfEtOcBOBiIU_WZ3yrXU0RbJEQRg0IxEoLUosf_gsVU,4995 +django/contrib/auth/checks.py,sha256=tq__evaH98gSiOojZkB9tyPxpBZb1YWaV9Ki5xvfSes,8270 +django/contrib/auth/common-passwords.txt.gz,sha256=CnCdMuzzpa5EVwTpCqtO7-x3CIPsy47PWWw7GUT9C5M,81355 +django/contrib/auth/context_processors.py,sha256=Vb91feuKV9a3BBgR0hrrGmZvVPw0JyYgeA_mRX9QK1c,1822 +django/contrib/auth/decorators.py,sha256=2iowUAGrkZBzaX_Wf0UkUbd0po00UCxtdFQxXj1HIyo,2892 +django/contrib/auth/forms.py,sha256=EOK1aJnd3aq3HWwCOiqpE5YkD8d3qtCkTVm-wjW4JY0,15860 +django/contrib/auth/handlers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/auth/handlers/__pycache__/__init__.cpython-38.pyc,, +django/contrib/auth/handlers/__pycache__/modwsgi.cpython-38.pyc,, +django/contrib/auth/handlers/modwsgi.py,sha256=bTXKVMezywsn1KA2MVyDWeHvTNa2KrwIxn2olH7o_5I,1248 +django/contrib/auth/hashers.py,sha256=lCOVpC2etwCXkHEnA5shHmseAEQrqbWeDpUsOLWTFIA,24886 +django/contrib/auth/locale/af/LC_MESSAGES/django.mo,sha256=UKEGdzrpTwNnuhPcejOS-682hL88yV83xh-55dMZzyg,7392 +django/contrib/auth/locale/af/LC_MESSAGES/django.po,sha256=GFM0MbuRB9axSqvFQzZXhyeZF9JTKqoMMdfNEgNQVFY,7618 +django/contrib/auth/locale/ar/LC_MESSAGES/django.mo,sha256=qZHGbagURzeNxkWTntpWSgdXUPip-DLEKOcqVaDwEms,9983 +django/contrib/auth/locale/ar/LC_MESSAGES/django.po,sha256=4YFAblOEgpwlFfSNp0ok4RhUNoygfBvYlbkH5SqCwn0,10464 +django/contrib/auth/locale/ar_DZ/LC_MESSAGES/django.mo,sha256=s6EoUozLpEw-OT2WllVMl8SwKrkBmIWgGO9qbG80xsQ,10167 +django/contrib/auth/locale/ar_DZ/LC_MESSAGES/django.po,sha256=P7GHKRC3hZiyVtbfzVGTcY81FuAGf0LFUgR6TZSEwfY,10494 +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=h1bem16bDuYOFR7NEGt2b3ssLOXMHqeWmnZtlni4e9g,7448 +django/contrib/auth/locale/az/LC_MESSAGES/django.po,sha256=euNyhutfYGtuMhUHpGJrLVXnlhPEGkJOV4d_gEJn5no,7735 +django/contrib/auth/locale/be/LC_MESSAGES/django.mo,sha256=SgSeUlTJuQ4-YZj7h6WltiuUVcYldlBcVdlynQ4bT80,9976 +django/contrib/auth/locale/be/LC_MESSAGES/django.po,sha256=LFiM8UDOCw2AY_GAL3Sbwrah_Umg32Q5phkbvjV8UlE,10299 +django/contrib/auth/locale/bg/LC_MESSAGES/django.mo,sha256=ZwwXfAeWM92GObhxU6zzGu36KJUpkGOuEeprRMu5mZc,8751 +django/contrib/auth/locale/bg/LC_MESSAGES/django.po,sha256=_a2hoIiJRbvW3ymKAkAp-UZNk5AiUy5HqPBBby74Jew,9492 +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=1i1CxyXwfskDZtItZQuEpZFlV3cpIo6Ls7Ocs0X3VTA,2963 +django/contrib/auth/locale/bs/LC_MESSAGES/django.po,sha256=C5CQ5vqjuLscWSKHVu0niGzmhxX0y-pf_eiuEr-ZmGU,5793 +django/contrib/auth/locale/ca/LC_MESSAGES/django.mo,sha256=Jdp-SfCkSmIOlNKB2lkSn-F6tiSHQdeNoa46GMnhCns,7600 +django/contrib/auth/locale/ca/LC_MESSAGES/django.po,sha256=N3MrFenu4UdQa90RW3sg5L1KhUdz99YSi7lHXugqyBY,8153 +django/contrib/auth/locale/cs/LC_MESSAGES/django.mo,sha256=HeVt40NO0DW62ZyRYDvKI4AulvMuQzbwJJvwvhXGWQo,7786 +django/contrib/auth/locale/cs/LC_MESSAGES/django.po,sha256=CXv_geqSBQPoEtRtTHg_PxzbIP35vfOkZ2_F4b1_Hm0,8243 +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=321FuiFJg-xSrNri8oPSLKLU4OPqQBQBxd_w_tRFUQI,7418 +django/contrib/auth/locale/da/LC_MESSAGES/django.po,sha256=jv5xZta-NXpaJNdwpMapg3QCUy0-KwVrDx2JeMH7Bok,7811 +django/contrib/auth/locale/de/LC_MESSAGES/django.mo,sha256=b7ZXlKTff2vYkY7ldkQVD6SX-36KgWBW8VsuP4m8bSY,7477 +django/contrib/auth/locale/de/LC_MESSAGES/django.po,sha256=W9MRGmYgNk5n-nMd6SKfL3kQ-YjsUh_vOZ818CR10Tw,7938 +django/contrib/auth/locale/dsb/LC_MESSAGES/django.mo,sha256=iYj_y2xE4yetsuFgDAfpr5iQgyVCfJL4x5qPIuVPCO0,8081 +django/contrib/auth/locale/dsb/LC_MESSAGES/django.po,sha256=657tWjp8Wowyib_uQh2tFULEETaavrI9zqgmkKq2TCw,8381 +django/contrib/auth/locale/el/LC_MESSAGES/django.mo,sha256=tfjgL-_ZACj_GjsfR7jw1PTjxovgR51-LSo5ngtRX-U,10150 +django/contrib/auth/locale/el/LC_MESSAGES/django.po,sha256=IXkrUAGvMZrQTUb6DpdgftRkWg4aKy9vwyO6i-ajsjU,10753 +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=cPtY1qLoggZk3h9DztguWtUaLkeE4uQr3yVQfBesyh8,8012 +django/contrib/auth/locale/en_AU/LC_MESSAGES/django.mo,sha256=74v8gY8VcSrDgsPDaIMET5frCvtzgLE8oHgX1xNWUvw,3650 +django/contrib/auth/locale/en_AU/LC_MESSAGES/django.po,sha256=lg-LFEeZXxGsNNZ656ePDvAAncjuy0LKuQxUFvQCUJk,5921 +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=0Z-qGFJc_j9rV2-BN4YoVTeGQd15yoHHpt0fSEMwiwg,7329 +django/contrib/auth/locale/eo/LC_MESSAGES/django.po,sha256=cghgKB3ZOFTNdjBuCpWXn1WFXJQLRCQGEzBwiLU5D-c,7731 +django/contrib/auth/locale/es/LC_MESSAGES/django.mo,sha256=gajANBcmH_eF4cnVZpKyhpnVWXJr8r7SWOzm5FwN0-k,7729 +django/contrib/auth/locale/es/LC_MESSAGES/django.po,sha256=aUVmLldyKIQCnWkLrMMEt1n5kfkqnOTzaxR7YnFjbn4,8469 +django/contrib/auth/locale/es_AR/LC_MESSAGES/django.mo,sha256=ow-0zlgfVDS_IAr6OLoPqXdVrFGo02EZCPf3Hw3JGyQ,7890 +django/contrib/auth/locale/es_AR/LC_MESSAGES/django.po,sha256=c0z6f_s47yZ1UyaUY7dTr9S_v5dj6mL2YyuhK0qWBOs,8162 +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=yilio-iPwr09MPHPgrDLQ-G5d2xNg1o75lcv5-yzcM4,7393 +django/contrib/auth/locale/et/LC_MESSAGES/django.po,sha256=OvUyjbna_KS-bI4PUUHagS-JuwtB7G0J1__MtFGxB-M,7886 +django/contrib/auth/locale/eu/LC_MESSAGES/django.mo,sha256=K0AoFJGJJSnD1IzYqCY9qB4HZHwx-F7QaDTAGehyo7w,7396 +django/contrib/auth/locale/eu/LC_MESSAGES/django.po,sha256=y9BAASQYTTYfoTKWFVQUYs5-zPlminfJ6C5ZORD6g-s,7749 +django/contrib/auth/locale/fa/LC_MESSAGES/django.mo,sha256=eYicBjtar7IU6zkldkNtcbewhv4DGhf2xIt2pEnrCss,8944 +django/contrib/auth/locale/fa/LC_MESSAGES/django.po,sha256=JEnOdy86onxyUvfNQ6sVY76SG1XSoB6ePZgIlBXQGdI,9431 +django/contrib/auth/locale/fi/LC_MESSAGES/django.mo,sha256=OPQ9WRAp6F6TERy-r62D0hNDPQcmH2zGFlEqZab3keY,7492 +django/contrib/auth/locale/fi/LC_MESSAGES/django.po,sha256=bhwFsyeQtr_dCu3QU8EuyyVnHegU-78AfXp0ptCWcV0,7848 +django/contrib/auth/locale/fr/LC_MESSAGES/django.mo,sha256=CiCGqwKFoJnWDqi7QgHcLEkayZTA9JZX3SWCsIBxTK8,8105 +django/contrib/auth/locale/fr/LC_MESSAGES/django.po,sha256=Kij98WD0TShBZdMYXmjINji3SuCmKTafmxUL8-JLJt0,8481 +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=Nd02Ed9ACCY6JCCSwtiWl3DTODLFFu9Mq6JVlr5YbYk,3572 +django/contrib/auth/locale/ga/LC_MESSAGES/django.po,sha256=FQJMR5DosuKqo4vvF0NAQnjfqbH54MSzqL2-4BO4-uM,6127 +django/contrib/auth/locale/gd/LC_MESSAGES/django.mo,sha256=-GSChZnB8t2BR6KoF-ZU2qlvfXNq5fAbomOBdoefEZE,8687 +django/contrib/auth/locale/gd/LC_MESSAGES/django.po,sha256=SN-QSmEG04qXHwoIzBgMjHEkqYqFQeJ7OvFXg496A6c,9044 +django/contrib/auth/locale/gl/LC_MESSAGES/django.mo,sha256=ZqVb1YCn_0_HyVtb_rnxmn0BSYAuKTVTFNHf2gftt5c,4022 +django/contrib/auth/locale/gl/LC_MESSAGES/django.po,sha256=YN_7iJTGc1Kh5llxHnwqq1kZmdQVMUMv1bkti30fMCI,6371 +django/contrib/auth/locale/he/LC_MESSAGES/django.mo,sha256=MeI7B43KSAIZL7_qxceKnnFKnyoUVYeZDRkGWabrclw,8606 +django/contrib/auth/locale/he/LC_MESSAGES/django.po,sha256=aDJlOsxyGpm-t6BydtqPMDB9lPcBCie8a1IfW_Ennvc,9012 +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=EPvlwd_NX7HEYa9exou0QWR501uyNr8_3tRMz-l1_FA,7922 +django/contrib/auth/locale/hsb/LC_MESSAGES/django.po,sha256=oylGjyfqTtyTJGRpBEI3xfN5MFzgklZ5FtNVe54ugKM,8213 +django/contrib/auth/locale/hu/LC_MESSAGES/django.mo,sha256=TLGY7EaLD12NHYM1hQlqb4D4BM0T68jv8yhECOHIgcA,7655 +django/contrib/auth/locale/hu/LC_MESSAGES/django.po,sha256=E51MM5qqplgrOSrh60bfz-EvyL91Ik3kL3YJOK-dqzk,8040 +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=oTzOm7fRjn79_pU9zy6D_Ehex5FK7hjQYe4soeHhRkk,3314 +django/contrib/auth/locale/ia/LC_MESSAGES/django.po,sha256=LzJOXjj1Fa61zk3v2d-aWS48eva2S0b0jJ9r5CqiFDY,5881 +django/contrib/auth/locale/id/LC_MESSAGES/django.mo,sha256=gCVLTVK24TVnaaeb3JAqQ9Wzt0Cad0FLcCBr0gD76kU,7170 +django/contrib/auth/locale/id/LC_MESSAGES/django.po,sha256=0bxsUqjQMA2qCjBkx1Q62v007ow3S5J3UgcV2ll9sL4,7589 +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=dI8wYt63mrZ02kL3r1XVY-AIussOMwQyvWBfefM4Zw0,7539 +django/contrib/auth/locale/it/LC_MESSAGES/django.po,sha256=wnIrW0RSky6QG7hrmof8Ow3-4YLouN6izMC2kik-PHA,8069 +django/contrib/auth/locale/ja/LC_MESSAGES/django.mo,sha256=qzCIy4-2ZpAPjeiBJWcrvcOCP6YyJl7CwdJtI8kn4P4,8024 +django/contrib/auth/locale/ja/LC_MESSAGES/django.po,sha256=l-txD5McDJSjRIG5t3XFWjaezvy0gmnGl3SUUVwumDg,8376 +django/contrib/auth/locale/ka/LC_MESSAGES/django.mo,sha256=0QWYd58Dz5Az3OfZo7wV3o-QCre2oc5dgEPu0rnLVJI,10625 +django/contrib/auth/locale/ka/LC_MESSAGES/django.po,sha256=oCtz7gS4--mhv7biS1rIh43I4v1UpZX4DKdrB-xZ2RA,11217 +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=HKQ1t2yhh9OwsqvMft337VpPmi8KU8PhF2M8gKOdtXw,6951 +django/contrib/auth/locale/ko/LC_MESSAGES/django.mo,sha256=eeIHHuqWmYIKdg4Awtzuiq73nJYGZGL912jDSKdK0tc,7578 +django/contrib/auth/locale/ko/LC_MESSAGES/django.po,sha256=ch1Eoy8J5B7wu35yvYPz5mhuXYzIxDocvVEsuICpv0M,8308 +django/contrib/auth/locale/ky/LC_MESSAGES/django.mo,sha256=BNywf3uEH-pgTQpXBupcIfmlijKSXVOzRpRv9BSW8GM,8867 +django/contrib/auth/locale/ky/LC_MESSAGES/django.po,sha256=Ta2eoSIa3EMAGwMg_ZLMXY4ycd4ncCS9do97kU60sVE,9114 +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=MeaR3wk2dhEJl0ib7sfLomLmO14r1dDDf9UCGkzgUtA,7582 +django/contrib/auth/locale/lv/LC_MESSAGES/django.po,sha256=o-lm18LyXAna2tVM4BX2aLYdLKsr59m_VWImsYaSvN8,7970 +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=zGuqUTqcWZZn8lZY56lf5tB0_lELn7Dd0Gj78wwO5T4,468 +django/contrib/auth/locale/mr/LC_MESSAGES/django.po,sha256=yLW9WuaBHqdp9PXoDEw7c05Vt0oOtlks5TS8oxYPAO8,3696 +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=T6aK_x_t3c0uoALxmraqrK4--Ln5vTUMPb2m7iuR9bM,7191 +django/contrib/auth/locale/nb/LC_MESSAGES/django.po,sha256=jwECmnO6m_sk9O3PXnmEnh3FC9LJKVdSliRZ8nNPNLY,7585 +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=g29u9ZMWBkbkWw6jA0UU74pMCAh9s-Gb9Ft3zi9aNn4,7451 +django/contrib/auth/locale/nl/LC_MESSAGES/django.po,sha256=U9JaMXlbuY9Lvu2pUK6x5vSD5m7ROaKt2P2rbBTDZ30,8176 +django/contrib/auth/locale/nn/LC_MESSAGES/django.mo,sha256=020nmL8b1yQL0ZyrDAdr0ZOsEGmNxvUpp9ISPBOVI8U,2801 +django/contrib/auth/locale/nn/LC_MESSAGES/django.po,sha256=SKgBiBM1llWFIvVjWRR0r2i3O8VcAdWe-PUhxckqmbE,5590 +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=aFiv3R2tRWOKs2UOBg9s35wbYnOIxgLCEfr8fIJbIEw,7908 +django/contrib/auth/locale/pl/LC_MESSAGES/django.po,sha256=pHr8LAF2bobzBHnteZrNS_NL5pbzn-LW4uhWff5UGwA,8619 +django/contrib/auth/locale/pt/LC_MESSAGES/django.mo,sha256=oyKCSXRo55UiO3-JKcodMUnK7fuOuQxQrXcU7XkWidA,7756 +django/contrib/auth/locale/pt/LC_MESSAGES/django.po,sha256=tEazw0kctJ3BaP21IblsMhno6qooOGW54zwende522Q,8128 +django/contrib/auth/locale/pt_BR/LC_MESSAGES/django.mo,sha256=5oeVsEZTpuSXrh05QhaMDtgh-Lju6HdE8QROe-_uV_0,7546 +django/contrib/auth/locale/pt_BR/LC_MESSAGES/django.po,sha256=IFe28giz1RoK9IPKbXi4kJj8PYKqHvEtFuYGuBmGitY,8521 +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=4MRl7yEBk9G9R_GewxkBxHK5ic4ww_WopNQymluwbYs,10347 +django/contrib/auth/locale/ru/LC_MESSAGES/django.po,sha256=y9e6hrsZO4GwIOWedYNuU2h7PX9Sa0uomKTyOlKGPw0,10963 +django/contrib/auth/locale/sk/LC_MESSAGES/django.mo,sha256=hJ_ep7FCbG4DVZawMfx4GjOPcJc4ruFSki8bkYn2l2Y,7838 +django/contrib/auth/locale/sk/LC_MESSAGES/django.po,sha256=NOYdZ3dv3Vtl-5vOwJH26Rthl-5nn4JrXgnm3i-d0bY,8199 +django/contrib/auth/locale/sl/LC_MESSAGES/django.mo,sha256=UAzD5UAqHBdiCMIPjZdouGt14xoHuo5EXDctNSDTEJk,7552 +django/contrib/auth/locale/sl/LC_MESSAGES/django.po,sha256=tUqZLZJegGLteWOQiDwFRUGayBB2j9qATmL6SMgEhb8,7943 +django/contrib/auth/locale/sq/LC_MESSAGES/django.mo,sha256=3bm81rsRuQmV_1mD9JrAwSjRIDUlsb3lPmBxRNHfz8w,7813 +django/contrib/auth/locale/sq/LC_MESSAGES/django.po,sha256=BWfyT4qg1jMoDGwmpLq4uPHJ1hJXLHI7gyo4BnzVHZI,8128 +django/contrib/auth/locale/sr/LC_MESSAGES/django.mo,sha256=yVXEIE4iXPxxwIBp5H6P5tCPUoBaFdHYD5D6gIDAI5I,9698 +django/contrib/auth/locale/sr/LC_MESSAGES/django.po,sha256=-MA4QO64bs3Hk7k4h7hvv2njyib_o6gIvTz0jofLGTo,10019 +django/contrib/auth/locale/sr_Latn/LC_MESSAGES/django.mo,sha256=hwAo5ishpZZ9kb9WHrSMHdxmWV9afdxOHgVEwWqb4VE,3293 +django/contrib/auth/locale/sr_Latn/LC_MESSAGES/django.po,sha256=qccS0IkO-JT504Y2uVGY5nPYfN8EA_58I9z492iQHKI,5934 +django/contrib/auth/locale/sv/LC_MESSAGES/django.mo,sha256=cYfXonEKxA6H7RNn3dOxDKTwujEBfYDLb2b41nWmv2s,7416 +django/contrib/auth/locale/sv/LC_MESSAGES/django.po,sha256=xtFMHCNOC1Zwx32zxhTmh3RMfx9fU-Xe944l4-26kdE,8029 +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=AqCIDe-6QrLMN3CNbMZsfrL0KxnQ3zuZwN8KvFmwRhE,7343 +django/contrib/auth/locale/tk/LC_MESSAGES/django.po,sha256=LpVXh4T0ZS3EzbIpJud8Dlms0Bu1vWf6c0JqkpoD8q8,7605 +django/contrib/auth/locale/tr/LC_MESSAGES/django.mo,sha256=XtrQms_lCzSfOlPaCKO-S_r7ATlqapeNxXaFeBKeR5I,7459 +django/contrib/auth/locale/tr/LC_MESSAGES/django.po,sha256=xLy4T5XqKYwu_WNi0nPeHRr1u9HjSvKl-RRkIUY9DfU,8049 +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/uk/LC_MESSAGES/django.mo,sha256=4Q872RPjz9d_FkIrV29AebGdKeUkdqkoGwVfzraHC1c,10030 +django/contrib/auth/locale/uk/LC_MESSAGES/django.po,sha256=vwPQoOqriNLj2jXJzixqQwiL7w9DWaNdLrL_bJZkw7Y,10730 +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=4YOb_ZbCI90UB01DpNsBAe6qqrc3P209Bz22FSVqvog,4703 +django/contrib/auth/locale/vi/LC_MESSAGES/django.po,sha256=1YjTrGYr04j9GtG8w0c7v71pHjHU8mHzT7tChroyfaw,6723 +django/contrib/auth/locale/zh_Hans/LC_MESSAGES/django.mo,sha256=-lHBBA2wJ_5II1b95faiXUBAJ5-eL7DwpF8husPB8rw,6866 +django/contrib/auth/locale/zh_Hans/LC_MESSAGES/django.po,sha256=YGpvA-isPZV6Wj0bXDIPGKP6cMY9APNcZ9TjyBJbWl8,7563 +django/contrib/auth/locale/zh_Hant/LC_MESSAGES/django.mo,sha256=yQ5Gllu4hXzuBpBNAgtJaBMVivJeXUUlpfDS4CT1wg4,6728 +django/contrib/auth/locale/zh_Hant/LC_MESSAGES/django.po,sha256=Rw18_ZEtobUhmj2oF544zdQ6Vrac0T9UI9RJO4plOdc,7145 +django/contrib/auth/management/__init__.py,sha256=FZbrn--_vNJ5MA-fXVSUoHTbq_9Io_IAXxT1kMJQXrw,5136 +django/contrib/auth/management/__pycache__/__init__.cpython-38.pyc,, +django/contrib/auth/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/auth/management/commands/__pycache__/__init__.cpython-38.pyc,, +django/contrib/auth/management/commands/__pycache__/changepassword.cpython-38.pyc,, +django/contrib/auth/management/commands/__pycache__/createsuperuser.cpython-38.pyc,, +django/contrib/auth/management/commands/changepassword.py,sha256=gBOnRnh8rHTbkW3i5A7BHsd7mLMunEYN0fK-VGuSt5U,2541 +django/contrib/auth/management/commands/createsuperuser.py,sha256=cUSI2CBlmIl48clgdbA78NP4OgxS1hqsjinXfJnN-vw,11457 +django/contrib/auth/middleware.py,sha256=uM_M3pXiyfjwWQFJRYdT1tsWm4R8wrq34Oks1FKcWck,5310 +django/contrib/auth/migrations/0001_initial.py,sha256=q5UGhGKIHnJD9gJOfnhHDVp3NWpH-NUMAD1mUIBGZ_U,4960 +django/contrib/auth/migrations/0002_alter_permission_name_max_length.py,sha256=xSlhMiUbrVCPMOwmwVNAUgYjZih3t-ieALNm7rQ1OI0,347 +django/contrib/auth/migrations/0003_alter_user_email_max_length.py,sha256=bPcpCTPAJV2NgrwEa6WFfxkhbPmj5J-EqU1HM3RXtq0,389 +django/contrib/auth/migrations/0004_alter_user_username_opts.py,sha256=aN0oHoA5q2bKpJN8SnI8T9GNtTBKzLRFozL87tNh8_I,785 +django/contrib/auth/migrations/0005_alter_user_last_login_null.py,sha256=0s9ZPGWNP9HT7TmXAuChMLLwL1Ml5SdQwNs9qfy5dN4,381 +django/contrib/auth/migrations/0006_require_contenttypes_0002.py,sha256=_S7o_MhU0lAnPhDEt0kh1sBmpCLXW88VBuATERiMBlk,370 +django/contrib/auth/migrations/0007_alter_validators_add_error_messages.py,sha256=JeJpm_jyu2CbBckw4xJt0DlwQ4SDg2fyHqduRLZ1HFI,740 +django/contrib/auth/migrations/0008_alter_user_username_max_length.py,sha256=KpeVuknt_7WErQO_WLDSCMg1sJkXCXjNQ5I4u_l99kc,752 +django/contrib/auth/migrations/0009_alter_user_last_name_max_length.py,sha256=rwLs5SDzFJsDKtCfyMP6XueUPHiRvRMein3wXMzHeDk,386 +django/contrib/auth/migrations/0010_alter_group_name_max_length.py,sha256=JQ2cqUnTooqDKlZ5LcXQDbQld9xQmC3up5_wCWn1LFg,379 +django/contrib/auth/migrations/0011_update_proxy_permissions.py,sha256=uSc1MAiLarJWy_SuoFAYrgUBoaTALUJ3Qq9Svqv5tZ0,2795 +django/contrib/auth/migrations/0012_alter_user_first_name_max_length.py,sha256=b_Xd1QsaC5Gc4kuJ-fQ5zKdheVkj4Yd6Asmno8iNkKM,382 +django/contrib/auth/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/auth/migrations/__pycache__/0001_initial.cpython-38.pyc,, +django/contrib/auth/migrations/__pycache__/0002_alter_permission_name_max_length.cpython-38.pyc,, +django/contrib/auth/migrations/__pycache__/0003_alter_user_email_max_length.cpython-38.pyc,, +django/contrib/auth/migrations/__pycache__/0004_alter_user_username_opts.cpython-38.pyc,, +django/contrib/auth/migrations/__pycache__/0005_alter_user_last_login_null.cpython-38.pyc,, +django/contrib/auth/migrations/__pycache__/0006_require_contenttypes_0002.cpython-38.pyc,, +django/contrib/auth/migrations/__pycache__/0007_alter_validators_add_error_messages.cpython-38.pyc,, +django/contrib/auth/migrations/__pycache__/0008_alter_user_username_max_length.cpython-38.pyc,, +django/contrib/auth/migrations/__pycache__/0009_alter_user_last_name_max_length.cpython-38.pyc,, +django/contrib/auth/migrations/__pycache__/0010_alter_group_name_max_length.cpython-38.pyc,, +django/contrib/auth/migrations/__pycache__/0011_update_proxy_permissions.cpython-38.pyc,, +django/contrib/auth/migrations/__pycache__/0012_alter_user_first_name_max_length.cpython-38.pyc,, +django/contrib/auth/migrations/__pycache__/__init__.cpython-38.pyc,, +django/contrib/auth/mixins.py,sha256=YUGeNQFuJZr0L1tp9JovNWyxoPDR7SXO8TdxRXGqbTI,4501 +django/contrib/auth/models.py,sha256=Ahrr6TKvlHzUZRwplH_a4uir5VX40IcK-FqSDZKn3s8,15954 +django/contrib/auth/password_validation.py,sha256=RAMoa_8HHQZkJ_X9H3TTluCNvgGXL7CQbHbSiMu4yL8,7566 +django/contrib/auth/signals.py,sha256=BFks70O0Y8s6p1fr8SCD4-yk2kjucv7HwTcdRUzVDFM,118 +django/contrib/auth/templates/auth/widgets/read_only_password_hash.html,sha256=cMrG-iMsrVQ6Qd6T_Xz21b6WIWhXxaIwgNDW2NpDpuM,185 +django/contrib/auth/templates/registration/password_reset_subject.txt,sha256=-TZcy_r0vArBgdPK7feeUY6mr9EkYwy7esQ62_onbBk,132 +django/contrib/auth/tokens.py,sha256=1yWQXaDJK6PKbBb8-eqSHzreo0jOfcGtlbbFdr4bxNg,4587 +django/contrib/auth/urls.py,sha256=riSsFkaDjHBAi-OXwUSL-eqCkWivK_YvfZWb_pHEE7k,1049 +django/contrib/auth/validators.py,sha256=4SU1JF5Dc4A3WTbdc45PxGusO8r6rgztgG5oEb_JhKw,687 +django/contrib/auth/views.py,sha256=b48oMCGgdg2wg131_uobg_7mqnl_bksLyO3CosbwqrE,13466 +django/contrib/contenttypes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/contenttypes/__pycache__/__init__.cpython-38.pyc,, +django/contrib/contenttypes/__pycache__/admin.cpython-38.pyc,, +django/contrib/contenttypes/__pycache__/apps.cpython-38.pyc,, +django/contrib/contenttypes/__pycache__/checks.cpython-38.pyc,, +django/contrib/contenttypes/__pycache__/fields.cpython-38.pyc,, +django/contrib/contenttypes/__pycache__/forms.cpython-38.pyc,, +django/contrib/contenttypes/__pycache__/models.cpython-38.pyc,, +django/contrib/contenttypes/__pycache__/views.cpython-38.pyc,, +django/contrib/contenttypes/admin.py,sha256=fKJoxKO6BtKbR_IiMRbU_eJiGWSedDYwyCNghAIDU84,4915 +django/contrib/contenttypes/apps.py,sha256=ueCXt0w5BCo8UYP7cV06kVb_8oD90g3PLp_42M1NbSM,851 +django/contrib/contenttypes/checks.py,sha256=ooW997jE1y5goWgO3dzc7tfJt5Z4tJPWRRSG1P1-AcU,1234 +django/contrib/contenttypes/fields.py,sha256=XNm_52qKE2AqotlCLT0THRxoO4luaUb4DetxruEhr6M,27526 +django/contrib/contenttypes/forms.py,sha256=pr-gnBUkL7WAcXqwpIrYbmm2Km5cdtfq5cKVOL0X9rE,3761 +django/contrib/contenttypes/locale/af/LC_MESSAGES/django.mo,sha256=93nlniPFfVcxfBCs_PsLtMKrJ2BqpcofPRNYYTTlels,1070 +django/contrib/contenttypes/locale/af/LC_MESSAGES/django.po,sha256=SY04sW55-xpO_qBjv8pHoN7eqB2C5q_9CxQguMz7Q94,1244 +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=VTQ2qQ7aoZYUVl2yht2DbYzj2acs71Szqz7iZyySAqI,1065 +django/contrib/contenttypes/locale/az/LC_MESSAGES/django.po,sha256=9NcmP1jMQPfjPraoXui6iqJn3z3f3uG1RYN7K5-_-dU,1359 +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=yVH2saAhE3bVtamkCeIBDQuJpn2awfF2M7ISujswiRU,1267 +django/contrib/contenttypes/locale/bg/LC_MESSAGES/django.po,sha256=YdzC82ifG-pPY5Iy4mXIBj9Qq583g37OqZir-jpbUpc,1576 +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/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=MFC-mQeWLeFry7d2EXeAf2G47YRLLKFhenGLCwo5O9A,1087 +django/contrib/contenttypes/locale/eo/LC_MESSAGES/django.po,sha256=BgQ7lRtsjD-XHaNvlHMu9AxCCqx38XdOCG4zYpKgDn4,1279 +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=GYQYfYWbgwL3nQJR5d7XGjc5KeYYXsB0yRQJz7zxd_k,1097 +django/contrib/contenttypes/locale/ga/LC_MESSAGES/django.po,sha256=byvw9sQ9VLVjS7Au81LcNpxOzwA29_4Al9nB1ZyV2b4,1408 +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=gMDLuxVazSNvwLmi5AqJEsxugmDVLk8DlxseHRRoQoc,1072 +django/contrib/contenttypes/locale/gl/LC_MESSAGES/django.po,sha256=hFPL2GH-o6XN0SKu5kqgiEaGT8lKnbi_zmlUNCn3Obg,1364 +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=3yDFJFxh16B2WigXeJxZV9vOyRxnjZ4MAUq3T_-PHGs,1079 +django/contrib/contenttypes/locale/ia/LC_MESSAGES/django.po,sha256=4JsXrJxsMVVu9Y6OuFrwMV5L4Dglh9XJ5sp9CHDGHaA,1288 +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=fr8rGQDWgUQSv-ZjXhSAR5P_zWLhQ7bq1cHLKIzY4bY,1649 +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=QDD_q_loZtGRlhmaqgNDtJ_5AjVFQ8fSmypvaWLOwp4,1162 +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=2Z5jaGJzpiJTCnhCk8ulCDeAdj-WwR99scdHFPRoHoA,468 +django/contrib/contenttypes/locale/mr/LC_MESSAGES/django.po,sha256=FgZKD9E-By0NztUnBM4llpR59K0MJSIMZIrJYGKDqpc,983 +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=jfxiglKOxjX2xdbLDnJhujJiGcbDJv3NDcUUCWrZmuU,1054 +django/contrib/contenttypes/locale/nn/LC_MESSAGES/django.po,sha256=c1sz3ssHULL1c5gpbEOy4Xo2Nh0_2ar_Zg4nECouM4k,1299 +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=MjyyKlA75YtEG9m6hm0GxKhU-cF3m1PA_j63BuIPPlE,1125 +django/contrib/contenttypes/locale/pt/LC_MESSAGES/django.po,sha256=X2Rec6LXIqPa9AVqF4J2mzYrwfls1BdUfN8XOe0zkdQ,1379 +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=Wkcfu7VTpa6IMqGHUH6Rra42ydbyyaLnMa6wg137E7o,1104 +django/contrib/contenttypes/locale/sk/LC_MESSAGES/django.po,sha256=oFmpjsUP8WXXd6TpObHcnM-mstebPAB4wCjsluH5EFc,1398 +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=I5bmwlJ8jVHoJW6-uGZ6r8FRIEVdg3xQseenfnhKkpg,1066 +django/contrib/contenttypes/locale/sv/LC_MESSAGES/django.po,sha256=KybZ8wY7r_ZU0beG8plP36ba8CEMKa3MTWwbL_Sf8zg,1331 +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/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=TXx5LvsBtM-750d_ImI4zpHKrXmsfVVXSgOxwecW11Y,4850 +django/contrib/contenttypes/management/__pycache__/__init__.cpython-38.pyc,, +django/contrib/contenttypes/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/contenttypes/management/commands/__pycache__/__init__.cpython-38.pyc,, +django/contrib/contenttypes/management/commands/__pycache__/remove_stale_contenttypes.cpython-38.pyc,, +django/contrib/contenttypes/management/commands/remove_stale_contenttypes.py,sha256=1wDE5cS2qIPc8qq6QeyhxKAPLXWFLIqajCnJuzaLhmY,3838 +django/contrib/contenttypes/migrations/0001_initial.py,sha256=o3bVVr-O_eUNiloAC1z-JIHDoCJQ4ifdA-6DhdVUrp8,1157 +django/contrib/contenttypes/migrations/0002_remove_content_type_name.py,sha256=4h1AUWSWAvwfEMAaopJZce-yNj1AVpCYFAk2E-Ur-wM,1103 +django/contrib/contenttypes/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/contenttypes/migrations/__pycache__/0001_initial.cpython-38.pyc,, +django/contrib/contenttypes/migrations/__pycache__/0002_remove_content_type_name.cpython-38.pyc,, +django/contrib/contenttypes/migrations/__pycache__/__init__.cpython-38.pyc,, +django/contrib/contenttypes/models.py,sha256=kkLMgaQGfqBKEV-d7SKlU8Hik6dvu0uGBARADFmylN0,6662 +django/contrib/contenttypes/views.py,sha256=fnoup7g6T17YpfCkffdWehuaWlo-KPAZj0p7kkk7v1E,3549 +django/contrib/flatpages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/flatpages/__pycache__/__init__.cpython-38.pyc,, +django/contrib/flatpages/__pycache__/admin.cpython-38.pyc,, +django/contrib/flatpages/__pycache__/apps.cpython-38.pyc,, +django/contrib/flatpages/__pycache__/forms.cpython-38.pyc,, +django/contrib/flatpages/__pycache__/middleware.cpython-38.pyc,, +django/contrib/flatpages/__pycache__/models.cpython-38.pyc,, +django/contrib/flatpages/__pycache__/sitemaps.cpython-38.pyc,, +django/contrib/flatpages/__pycache__/urls.cpython-38.pyc,, +django/contrib/flatpages/__pycache__/views.cpython-38.pyc,, +django/contrib/flatpages/admin.py,sha256=m_TsFRA36bunPrg2dSdxDJpWLfJkiaVmE3kcYAO9trY,654 +django/contrib/flatpages/apps.py,sha256=K07x0pM4R4Hy6GWG7EytmW2SpWONoNhadIORTP13Q_c,252 +django/contrib/flatpages/forms.py,sha256=XOqw37h_Itd4CU4qDk0K03Ql7y6oMkr-sC6Oj52YHZg,2420 +django/contrib/flatpages/locale/af/LC_MESSAGES/django.mo,sha256=c0XEKXJYgpy2snfmWFPQqeYeVla1F5s_wXIBaioiyPc,2297 +django/contrib/flatpages/locale/af/LC_MESSAGES/django.po,sha256=_psp14JfICDxrKx_mKF0uLnItkJPkCNMvrNOyE35nFw,2428 +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=6ID6KejChxQzsUT4wevUAjd9u7Ly21mfJ22dgbitNN4,2373 +django/contrib/flatpages/locale/az/LC_MESSAGES/django.po,sha256=v7tkbuUUqkbUzXoOOWxS75TpvuMESqoZAEXDXisfbiA,2679 +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=p3RZmS9PAqdlAmbc7UswSoG0t1eeuXYDp1WZ3mWfFow,2569 +django/contrib/flatpages/locale/bg/LC_MESSAGES/django.po,sha256=DqRp9KTLxks9tNEXs2g_jvIp7dI92jXLkKNDNyLhHac,2779 +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/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=WxBbtlMvLwH2e7KUP7RcrxgEHP4DC9MKiO_KLCuFbmc,2870 +django/contrib/flatpages/locale/el/LC_MESSAGES/django.po,sha256=oIgwZoftZQVOrfsTDdL8iN9CpPN7UdmkCfpFOJoNHt0,3141 +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=cuifXT2XlF4c_bR6ECRhlraSZyA7q4ZLhUgwvW73miw,486 +django/contrib/flatpages/locale/en_AU/LC_MESSAGES/django.po,sha256=ZMAJRrjovd_cdWvzkuEiJ-9ZU9rqRTwoA3x8uY2khcs,1533 +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=QsmIOjVlQGcgeAFTa8ND9Uuuihyl63OIJnFwh4MkvZ0,2032 +django/contrib/flatpages/locale/eo/LC_MESSAGES/django.po,sha256=uVTSEAswL_siMnbhOsqWyMGziQr9byUQPiltEEZpS7I,2530 +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=KKvDhZULHQ4JQ_31ltLkk88H2BKUbBXDQFSvdKFqjn8,2191 +django/contrib/flatpages/locale/ga/LC_MESSAGES/django.po,sha256=Yat7oU2XPQFQ8vhNq1nJFAlX2rqfxz4mjpU5TcnaYO8,2400 +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=VXyPsc6cXB97dJJFGfD8Oh2lYpn8TFYjIOeFUQeYpVU,2039 +django/contrib/flatpages/locale/gl/LC_MESSAGES/django.po,sha256=MzE7lepmRu60wy9gn6Wxx-LtKIO9JwScSdJ3SyLRU9s,2366 +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=YCVnkX9uayvAQjYy_2jS7fYb36meoMJTKSc2lfoUbeM,3301 +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=o9xnLjwDw7L49Mkyr8C6aQZ13Yq5MYx1JYXEtcIsiWU,2437 +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=GvSfsp0Op7st6Ifd8zp8Cj4tTHoFMltQb4p64pebrqI,468 +django/contrib/flatpages/locale/mr/LC_MESSAGES/django.po,sha256=sayU0AfVaSFpBj0dT32Ri55LRafQFUHLi03K06kI7gc,1515 +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=A50zQJ-0YYPjPCeeEa-gwqA2N5eON13YW8SJZvtJBZc,1693 +django/contrib/flatpages/locale/nn/LC_MESSAGES/django.po,sha256=H5hnBsH3sUdlPkMjxiqNnh8izcrTSAs6o-ywlNCTKtw,2119 +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=xD2pWdS3XMg7gAqBrUBmCEXFsOzEs0Npe8AJnlpueRY,2115 +django/contrib/flatpages/locale/pt/LC_MESSAGES/django.po,sha256=-K2jipPUWjXpfSPq3upnC_bvtaRAeOw0OLRFv03HWFY,2326 +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=f_qbUdkwYKzg3DQT5x-ab883NUWF80gNMc7yekFctPM,2145 +django/contrib/flatpages/locale/sk/LC_MESSAGES/django.po,sha256=OD_E2Z-nElhfFcsnuK8Y3r341OXjLON2CoWjNJfHIt8,2482 +django/contrib/flatpages/locale/sl/LC_MESSAGES/django.mo,sha256=MBjwhw6wppQUl0Lb_rShXZj_Sq-JLSkdYU5Xhi0OtYY,2173 +django/contrib/flatpages/locale/sl/LC_MESSAGES/django.po,sha256=6zbOXzkLTsdWRKAhuLzBVBc53n6MQKpvOeHw4cRrAlc,2400 +django/contrib/flatpages/locale/sq/LC_MESSAGES/django.mo,sha256=Jv2sebdAM6CfiLzgi1b7rHo5hp-6_BFeeMQ4_BwYpjk,2328 +django/contrib/flatpages/locale/sq/LC_MESSAGES/django.po,sha256=Xm87FbWaQ1JGhhGx8uvtqwUltkTkwk5Oysagu8qIPUA,2548 +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=ATOsOiNTLlCDWZO630xUUdnXfs7YW4nuqy9wUVOfzmU,2288 +django/contrib/flatpages/locale/sv/LC_MESSAGES/django.po,sha256=4bhfJNUKc1K1Z8IWSB9_YQVk_Gy3q4ZhkhfDS9FKaaw,2562 +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=5iVSzjcnJLfdAnrI1yOKua_OfHmgUu6ydixKkvayrzQ,753 +django/contrib/flatpages/locale/tk/LC_MESSAGES/django.po,sha256=0VK0Ju55wTvmYXqS9hPKLJXyTtTz9Z8mv_qw66ck5gg,1824 +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/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=Y5nDMQ3prLJ6OHuQEeEqjDLBC9_L-4XHDGJSLNoCgqg,2200 +django/contrib/flatpages/locale/zh_Hant/LC_MESSAGES/django.po,sha256=6dKCSJpw_8gnunfTY86_apXdH5Pqe0kKYSVaqRtOIh0,2475 +django/contrib/flatpages/middleware.py,sha256=aXeOeOkUmpdkGOyqZnkR-l1VrDQ161RWIWa3WPBhGac,784 +django/contrib/flatpages/migrations/0001_initial.py,sha256=7lhJRTsJCQrf_jyKbg9VXcyjPIWJSqLir-WgKQjJcl8,1719 +django/contrib/flatpages/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/flatpages/migrations/__pycache__/0001_initial.cpython-38.pyc,, +django/contrib/flatpages/migrations/__pycache__/__init__.cpython-38.pyc,, +django/contrib/flatpages/models.py,sha256=_CeWgWjhuD_y8FgMKpv9kvgolNz1on3DH0NkvJnwlOM,1742 +django/contrib/flatpages/sitemaps.py,sha256=0WGMLfr61H5aVX1inE4X_BJhx2b_lw4LKMO4OQGiDX4,554 +django/contrib/flatpages/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/flatpages/templatetags/__pycache__/__init__.cpython-38.pyc,, +django/contrib/flatpages/templatetags/__pycache__/flatpages.cpython-38.pyc,, +django/contrib/flatpages/templatetags/flatpages.py,sha256=q0wsGQqXHhSCH4_UR-wHkj_pJsxBOo_liODBT_BZcTc,3561 +django/contrib/flatpages/urls.py,sha256=v_bP8Axlf0XLgb2kJVdEPDqW8WY7RkwSwm7_BH_0eWE,179 +django/contrib/flatpages/views.py,sha256=ywkDuZHZwu_kZx6frjAFt7MAB3mo6-mLicyByw13EfY,2723 +django/contrib/gis/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/gis/__pycache__/__init__.cpython-38.pyc,, +django/contrib/gis/__pycache__/apps.cpython-38.pyc,, +django/contrib/gis/__pycache__/feeds.cpython-38.pyc,, +django/contrib/gis/__pycache__/geometry.cpython-38.pyc,, +django/contrib/gis/__pycache__/measure.cpython-38.pyc,, +django/contrib/gis/__pycache__/ptr.cpython-38.pyc,, +django/contrib/gis/__pycache__/shortcuts.cpython-38.pyc,, +django/contrib/gis/__pycache__/views.cpython-38.pyc,, +django/contrib/gis/admin/__init__.py,sha256=fFeTcK_K9Djj7J7aA93DdHqpgEi2xDecTNH5LavSG8Q,524 +django/contrib/gis/admin/__pycache__/__init__.cpython-38.pyc,, +django/contrib/gis/admin/__pycache__/options.cpython-38.pyc,, +django/contrib/gis/admin/__pycache__/widgets.cpython-38.pyc,, +django/contrib/gis/admin/options.py,sha256=z4UrI7Pzb73FsT2WgIMX9zsMG_Hg6g89vkkvgKPHOz8,5145 +django/contrib/gis/admin/widgets.py,sha256=_X3Li-k9q0m7soBvu0Vu3jwwmODZWTx9A3IswYKeXLM,4720 +django/contrib/gis/apps.py,sha256=bqwbH70dnlB1MBr6USXiIZ3GxYCKuR1aAkezb5dwgKE,395 +django/contrib/gis/db/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/gis/db/__pycache__/__init__.cpython-38.pyc,, +django/contrib/gis/db/backends/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/gis/db/backends/__pycache__/__init__.cpython-38.pyc,, +django/contrib/gis/db/backends/__pycache__/utils.cpython-38.pyc,, +django/contrib/gis/db/backends/base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/gis/db/backends/base/__pycache__/__init__.cpython-38.pyc,, +django/contrib/gis/db/backends/base/__pycache__/adapter.cpython-38.pyc,, +django/contrib/gis/db/backends/base/__pycache__/features.cpython-38.pyc,, +django/contrib/gis/db/backends/base/__pycache__/models.cpython-38.pyc,, +django/contrib/gis/db/backends/base/__pycache__/operations.cpython-38.pyc,, +django/contrib/gis/db/backends/base/adapter.py,sha256=sdZlHGUfz2eSPsTjlO9xBoGSz7BqKD_NhURW8fzz26o,579 +django/contrib/gis/db/backends/base/features.py,sha256=6ZAZlkhWMuK-0Dh15sKopLRCz9v2E282avWR4miw3ks,3718 +django/contrib/gis/db/backends/base/models.py,sha256=vkDweNsExmKWkHNSae9G6P-fT-SMdIgHZ85i31ihXg0,3962 +django/contrib/gis/db/backends/base/operations.py,sha256=gEsPQMT49P6nOZh8bCbbOtdoosLoKvioYBJj1TuLntg,6264 +django/contrib/gis/db/backends/mysql/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/gis/db/backends/mysql/__pycache__/__init__.cpython-38.pyc,, +django/contrib/gis/db/backends/mysql/__pycache__/base.cpython-38.pyc,, +django/contrib/gis/db/backends/mysql/__pycache__/features.cpython-38.pyc,, +django/contrib/gis/db/backends/mysql/__pycache__/introspection.cpython-38.pyc,, +django/contrib/gis/db/backends/mysql/__pycache__/operations.cpython-38.pyc,, +django/contrib/gis/db/backends/mysql/__pycache__/schema.cpython-38.pyc,, +django/contrib/gis/db/backends/mysql/base.py,sha256=rz8tnvXJlY4V6liWxYshuxQE-uTNuKSBogCz_GtXoaY,507 +django/contrib/gis/db/backends/mysql/features.py,sha256=Yv8V7FrMCLLT_Uri7J6iXWIOgGelv4tUzCA26LiAhlc,1481 +django/contrib/gis/db/backends/mysql/introspection.py,sha256=QuoJOaHeTxqr0eju8HWA5AmzGYpC15Kt9U5uCNxJWHA,1834 +django/contrib/gis/db/backends/mysql/operations.py,sha256=Gmeyln2BjxjFbXYAsXANXZUH5A3nOD9JQIERQ6pRvH8,4098 +django/contrib/gis/db/backends/mysql/schema.py,sha256=B86TeF5hvlmLzgY7TFZGTKaIzVbK87ByPmjhNz83JTA,2976 +django/contrib/gis/db/backends/oracle/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/gis/db/backends/oracle/__pycache__/__init__.cpython-38.pyc,, +django/contrib/gis/db/backends/oracle/__pycache__/adapter.cpython-38.pyc,, +django/contrib/gis/db/backends/oracle/__pycache__/base.cpython-38.pyc,, +django/contrib/gis/db/backends/oracle/__pycache__/features.cpython-38.pyc,, +django/contrib/gis/db/backends/oracle/__pycache__/introspection.cpython-38.pyc,, +django/contrib/gis/db/backends/oracle/__pycache__/models.cpython-38.pyc,, +django/contrib/gis/db/backends/oracle/__pycache__/operations.cpython-38.pyc,, +django/contrib/gis/db/backends/oracle/__pycache__/schema.cpython-38.pyc,, +django/contrib/gis/db/backends/oracle/adapter.py,sha256=4S7lzuIOxOFm1MTE3TtLGqs3tfRXp34vRb_wI0gg4LQ,2043 +django/contrib/gis/db/backends/oracle/base.py,sha256=NQYlEvE4ioobvMd7u2WC7vMtDiRq_KtilGprD6qfJCo,516 +django/contrib/gis/db/backends/oracle/features.py,sha256=x6IeC2cw3DdB_4abrTQNQyUfWiW403E7R8GLMe8NMas,566 +django/contrib/gis/db/backends/oracle/introspection.py,sha256=EfGUexqpa3yDX3IQ4PVx9AjVX8qY9djZtFLwdiqyNL8,1889 +django/contrib/gis/db/backends/oracle/models.py,sha256=pT32f_A1FRYwO5hWMigX7PU_ojpRmIhdUlhOqdz2R9k,2084 +django/contrib/gis/db/backends/oracle/operations.py,sha256=8zhgMQamyeBXLEGW8a1Sj2x5iqgX1KH4rCyxAgGJD_w,8468 +django/contrib/gis/db/backends/oracle/schema.py,sha256=EJOTAG4rPrnOMAWmwecnVwFSwmJOjZS5R_p48NybDi0,3909 +django/contrib/gis/db/backends/postgis/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/gis/db/backends/postgis/__pycache__/__init__.cpython-38.pyc,, +django/contrib/gis/db/backends/postgis/__pycache__/adapter.cpython-38.pyc,, +django/contrib/gis/db/backends/postgis/__pycache__/base.cpython-38.pyc,, +django/contrib/gis/db/backends/postgis/__pycache__/const.cpython-38.pyc,, +django/contrib/gis/db/backends/postgis/__pycache__/features.cpython-38.pyc,, +django/contrib/gis/db/backends/postgis/__pycache__/introspection.cpython-38.pyc,, +django/contrib/gis/db/backends/postgis/__pycache__/models.cpython-38.pyc,, +django/contrib/gis/db/backends/postgis/__pycache__/operations.cpython-38.pyc,, +django/contrib/gis/db/backends/postgis/__pycache__/pgraster.cpython-38.pyc,, +django/contrib/gis/db/backends/postgis/__pycache__/schema.cpython-38.pyc,, +django/contrib/gis/db/backends/postgis/adapter.py,sha256=jhXBRB4TCl48h2bjLDyMKeY2kWXSZB3GcOTcz01JFYE,2188 +django/contrib/gis/db/backends/postgis/base.py,sha256=sFCNoMHRzd-a_MRc9hv-tyVHEODmGveyIopbP6CTPCg,937 +django/contrib/gis/db/backends/postgis/const.py,sha256=CMe_bpzcOcYakC3mu64EKfF2HgRxBT4yhoRX6zg3O_k,1967 +django/contrib/gis/db/backends/postgis/features.py,sha256=GuBG7N5_zUuyf49ZIOLMI0AxQciUMav5A1VxAmWlCuk,457 +django/contrib/gis/db/backends/postgis/introspection.py,sha256=htz45PonMVDsdiSLsQJg4xOlysaXdaXdyjiDNJxm6WI,2977 +django/contrib/gis/db/backends/postgis/models.py,sha256=tKiRZzO6p2YJnPbPXReMlFcAiFij-C_H_6w8FHhLqxk,2000 +django/contrib/gis/db/backends/postgis/operations.py,sha256=_Faugb1A4-cfoH89bDynpH13NPevfruCMXlwRAUYNuQ,15778 +django/contrib/gis/db/backends/postgis/pgraster.py,sha256=nVS1pSMQFKffKcJNNvHMWDX8HxcYRIWG4RvK9fiwbH8,4558 +django/contrib/gis/db/backends/postgis/schema.py,sha256=5z4OlLjQGwVE-cLNHFhLVK8XsL-5Z6ixfmYRoUvwF7A,2921 +django/contrib/gis/db/backends/spatialite/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/gis/db/backends/spatialite/__pycache__/__init__.cpython-38.pyc,, +django/contrib/gis/db/backends/spatialite/__pycache__/adapter.cpython-38.pyc,, +django/contrib/gis/db/backends/spatialite/__pycache__/base.cpython-38.pyc,, +django/contrib/gis/db/backends/spatialite/__pycache__/client.cpython-38.pyc,, +django/contrib/gis/db/backends/spatialite/__pycache__/features.cpython-38.pyc,, +django/contrib/gis/db/backends/spatialite/__pycache__/introspection.cpython-38.pyc,, +django/contrib/gis/db/backends/spatialite/__pycache__/models.cpython-38.pyc,, +django/contrib/gis/db/backends/spatialite/__pycache__/operations.cpython-38.pyc,, +django/contrib/gis/db/backends/spatialite/__pycache__/schema.cpython-38.pyc,, +django/contrib/gis/db/backends/spatialite/adapter.py,sha256=y74p_UEgLtoYjNZEi72mwcJOh_b-MzJ7sZd68WJXBiY,317 +django/contrib/gis/db/backends/spatialite/base.py,sha256=pg7m0arvmnwOsDJo-Mj9NudCclRMThEhQzDBjQWQLNI,3011 +django/contrib/gis/db/backends/spatialite/client.py,sha256=NsqD2vAnfjqn_FbQnCQeAqbGyZf9oa6gl7EPsMTPf8c,138 +django/contrib/gis/db/backends/spatialite/features.py,sha256=Wid-w2AJTAtyNgMWUtdCCmWN5Dbj2jEfrgLI497TMVk,836 +django/contrib/gis/db/backends/spatialite/introspection.py,sha256=NQ2T3GsDYBrbTiVzjWPp_RElKMP-qNxUiGEnOFZTSrg,3076 +django/contrib/gis/db/backends/spatialite/models.py,sha256=iiodcKYWAMIz_xrJagr-1nbiiO2YJY_Q0vt_0uyaD54,1928 +django/contrib/gis/db/backends/spatialite/operations.py,sha256=p6VKrtXtOjngk7XZYqwnli7L91VCf1TWqjoSAvT6kMw,7857 +django/contrib/gis/db/backends/spatialite/schema.py,sha256=yGarSHxvb0f7pZ2CP5DnkhB4P2Pt14j6qfZuULZE4Sk,6800 +django/contrib/gis/db/backends/utils.py,sha256=y4q0N0oDplot6dZQIFnjGPqVsTiGyLTmEMt5-xj-2b4,784 +django/contrib/gis/db/models/__init__.py,sha256=BR3kQAefIv4O1NksiVCUShwlSO4OCNoUGan6dCRGIyU,817 +django/contrib/gis/db/models/__pycache__/__init__.cpython-38.pyc,, +django/contrib/gis/db/models/__pycache__/aggregates.cpython-38.pyc,, +django/contrib/gis/db/models/__pycache__/fields.cpython-38.pyc,, +django/contrib/gis/db/models/__pycache__/functions.cpython-38.pyc,, +django/contrib/gis/db/models/__pycache__/lookups.cpython-38.pyc,, +django/contrib/gis/db/models/__pycache__/proxy.cpython-38.pyc,, +django/contrib/gis/db/models/aggregates.py,sha256=dGTRWMPhKO94XNf8U8VDoiwuYWOtaxQEYXhumCCdHqM,2832 +django/contrib/gis/db/models/fields.py,sha256=DsBUuL8kSx2kZ6b5DuEHCuwqQFzmRJ2_lsKGPRb-MAA,13824 +django/contrib/gis/db/models/functions.py,sha256=IBVa0k51r-uE3HtSqRuoqBuMUhugLLfn0Zu7B4feTSo,17493 +django/contrib/gis/db/models/lookups.py,sha256=3zvAOFS0qy3vr5ZGWk5Vq8so5yPPgrLwTJoJHCDzXfU,11491 +django/contrib/gis/db/models/proxy.py,sha256=BSZoCQ1IG8n_M6dSOdF3wAzIHfMElSVnIGu8ZWj1-_0,3122 +django/contrib/gis/db/models/sql/__init__.py,sha256=oYJYL-5DAO-DIcpIQ7Jmeq_cuKapRB83V1KLVIs_5iU,139 +django/contrib/gis/db/models/sql/__pycache__/__init__.cpython-38.pyc,, +django/contrib/gis/db/models/sql/__pycache__/conversion.cpython-38.pyc,, +django/contrib/gis/db/models/sql/conversion.py,sha256=gG1mTUWb33YK_Uf1ZJRg5MRhkCTLtgajD3xxi7thODA,2400 +django/contrib/gis/feeds.py,sha256=43TmSa40LR3LguE4VDeBThJZgO_rbtfrT5Y6DQ7RBiQ,5732 +django/contrib/gis/forms/__init__.py,sha256=fREam1OSkDWr9ugUMNZMFn8Y9TufpRCn3Glj14DTMbQ,298 +django/contrib/gis/forms/__pycache__/__init__.cpython-38.pyc,, +django/contrib/gis/forms/__pycache__/fields.cpython-38.pyc,, +django/contrib/gis/forms/__pycache__/widgets.cpython-38.pyc,, +django/contrib/gis/forms/fields.py,sha256=iFXKmHxs5c74Q_O9cLXlTyPm8aLQyoq_PerOrihvuWQ,4483 +django/contrib/gis/forms/widgets.py,sha256=Ksh8NEaoBO1vsrbJusvxACCuEb9wnrWNISmal3fkbCo,3816 +django/contrib/gis/gdal/LICENSE,sha256=VwoEWoNyts1qAOMOuv6OPo38Cn_j1O8sxfFtQZ62Ous,1526 +django/contrib/gis/gdal/__init__.py,sha256=UCuq9p1azua2uui6zycmyhwiRYtvyhX0UzZ0pu5z364,1793 +django/contrib/gis/gdal/__pycache__/__init__.cpython-38.pyc,, +django/contrib/gis/gdal/__pycache__/base.cpython-38.pyc,, +django/contrib/gis/gdal/__pycache__/datasource.cpython-38.pyc,, +django/contrib/gis/gdal/__pycache__/driver.cpython-38.pyc,, +django/contrib/gis/gdal/__pycache__/envelope.cpython-38.pyc,, +django/contrib/gis/gdal/__pycache__/error.cpython-38.pyc,, +django/contrib/gis/gdal/__pycache__/feature.cpython-38.pyc,, +django/contrib/gis/gdal/__pycache__/field.cpython-38.pyc,, +django/contrib/gis/gdal/__pycache__/geometries.cpython-38.pyc,, +django/contrib/gis/gdal/__pycache__/geomtype.cpython-38.pyc,, +django/contrib/gis/gdal/__pycache__/layer.cpython-38.pyc,, +django/contrib/gis/gdal/__pycache__/libgdal.cpython-38.pyc,, +django/contrib/gis/gdal/__pycache__/srs.cpython-38.pyc,, +django/contrib/gis/gdal/base.py,sha256=yymyL0vZRMBfiFUzrehvaeaunIxMH5ucGjPRfKj-rAo,181 +django/contrib/gis/gdal/datasource.py,sha256=HDGVVh_6S-mQOIKiVGtmjL8djSpwAg3oZTqUIyWIaL0,4523 +django/contrib/gis/gdal/driver.py,sha256=E7Jj4z3z--WC2Idm5GvYtDGGErdtm1tAqzN8Lil-yRg,3264 +django/contrib/gis/gdal/envelope.py,sha256=lL13BYlaEyxDNkCJCPnFZk13eyRb9pOkOOrAdP16Qtw,6970 +django/contrib/gis/gdal/error.py,sha256=yv9yvtBPjLWRqQHlzglF-gLDW-nR7zF_F5xsej_oBx4,1576 +django/contrib/gis/gdal/feature.py,sha256=KYGyQYNWXrEJm2I0eIG1Kcd7WTOZWiC-asIjF5DmO9I,3926 +django/contrib/gis/gdal/field.py,sha256=AerdJ9sLeru9Z39PEtTAXp14vabMcwX_LIZjg0EyDAE,6626 +django/contrib/gis/gdal/geometries.py,sha256=VAcd9Kcy971d6_6ORZpdHhXeUjb3s0v_RmSY6U9WH8Y,23869 +django/contrib/gis/gdal/geomtype.py,sha256=hCHfxQsecBakIZUDZwEkECdH7dg3CdF4Y_kAFYkW9Og,3071 +django/contrib/gis/gdal/layer.py,sha256=2PPP3lpmljIA-KcuN1FI5dNQPkELR3eyPmarP2KYfYk,8527 +django/contrib/gis/gdal/libgdal.py,sha256=qv9Tp0DwbTemfriVe7UzrwV8ikq1yNxb1kNt0nHXtAA,3431 +django/contrib/gis/gdal/prototypes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/gis/gdal/prototypes/__pycache__/__init__.cpython-38.pyc,, +django/contrib/gis/gdal/prototypes/__pycache__/ds.cpython-38.pyc,, +django/contrib/gis/gdal/prototypes/__pycache__/errcheck.cpython-38.pyc,, +django/contrib/gis/gdal/prototypes/__pycache__/generation.cpython-38.pyc,, +django/contrib/gis/gdal/prototypes/__pycache__/geom.cpython-38.pyc,, +django/contrib/gis/gdal/prototypes/__pycache__/raster.cpython-38.pyc,, +django/contrib/gis/gdal/prototypes/__pycache__/srs.cpython-38.pyc,, +django/contrib/gis/gdal/prototypes/ds.py,sha256=GnxQ4229MOZ5NQjJTtmCcstxGPH6HhUd9AsCWsih6_s,4586 +django/contrib/gis/gdal/prototypes/errcheck.py,sha256=ckjyqcZtrVZctrw-HvQb1isDavhUAblLqKuno9U4upw,4137 +django/contrib/gis/gdal/prototypes/generation.py,sha256=9UdPSqWR28AsUG7HDdHMRG2nI1-iKr1ru1V998uifP8,4867 +django/contrib/gis/gdal/prototypes/geom.py,sha256=ELRO7bR8RxO3HIuxtitr06yhsG4DxYTlRsTa6NenTqI,4946 +django/contrib/gis/gdal/prototypes/raster.py,sha256=zPIc-Vahtau1XQTADqxQNtzcAv6LunbhVHkWkMOEWKo,5690 +django/contrib/gis/gdal/prototypes/srs.py,sha256=zu98VgVLNI_lwTpq9YQ1Ht1F9oOkBqInKztmS8V7d5Y,3685 +django/contrib/gis/gdal/raster/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/gis/gdal/raster/__pycache__/__init__.cpython-38.pyc,, +django/contrib/gis/gdal/raster/__pycache__/band.cpython-38.pyc,, +django/contrib/gis/gdal/raster/__pycache__/base.cpython-38.pyc,, +django/contrib/gis/gdal/raster/__pycache__/const.cpython-38.pyc,, +django/contrib/gis/gdal/raster/__pycache__/source.cpython-38.pyc,, +django/contrib/gis/gdal/raster/band.py,sha256=dRikGQ6-cKCgOj3bjRSnIKd196FGRGM2Ee9BtPQGVk0,8247 +django/contrib/gis/gdal/raster/base.py,sha256=WLdZNgRlGAT6kyIXz5bBhPbpNY53ImxQkSeVLyv4Ohc,2861 +django/contrib/gis/gdal/raster/const.py,sha256=uPk8859YSREMtiQtXGkVOhISmgsF6gXP7JUfufQDXII,2891 +django/contrib/gis/gdal/raster/source.py,sha256=3CbkxyDalxrByJQXMG7vfL8iFPuSnuAS7zqzw-MPv8k,17965 +django/contrib/gis/gdal/srs.py,sha256=r3AHXDhKuofiYyJP3QENgHpDZq1u2dFZinxADpwiIqo,12611 +django/contrib/gis/geoip2/__init__.py,sha256=uIUWQyMsbSrYL-oVqFsmhqQkYGrh7pHLIVvIM3W_EG4,822 +django/contrib/gis/geoip2/__pycache__/__init__.cpython-38.pyc,, +django/contrib/gis/geoip2/__pycache__/base.cpython-38.pyc,, +django/contrib/gis/geoip2/__pycache__/resources.cpython-38.pyc,, +django/contrib/gis/geoip2/base.py,sha256=yx8gZUBCkrVurux06tuJhnXsamzj7hg0iiGFYmfu0yE,8976 +django/contrib/gis/geoip2/resources.py,sha256=u39vbZzNV5bQKS0nKb0VbHsSRm3m69r29bZwpNbNs3Y,819 +django/contrib/gis/geometry.py,sha256=hA1SQGzGfTyV7A5kaBuxCzwkqZNAYz0kqZMaz3E1zIQ,662 +django/contrib/gis/geos/LICENSE,sha256=CL8kt1USOK4yUpUkVCWxyuua0PQvni0wPHs1NQJjIEU,1530 +django/contrib/gis/geos/__init__.py,sha256=DXFaljVp6gf-E0XAbfO1JnYjPYSDfGZQ2VLtGYBcUZQ,648 +django/contrib/gis/geos/__pycache__/__init__.cpython-38.pyc,, +django/contrib/gis/geos/__pycache__/base.cpython-38.pyc,, +django/contrib/gis/geos/__pycache__/collections.cpython-38.pyc,, +django/contrib/gis/geos/__pycache__/coordseq.cpython-38.pyc,, +django/contrib/gis/geos/__pycache__/error.cpython-38.pyc,, +django/contrib/gis/geos/__pycache__/factory.cpython-38.pyc,, +django/contrib/gis/geos/__pycache__/geometry.cpython-38.pyc,, +django/contrib/gis/geos/__pycache__/io.cpython-38.pyc,, +django/contrib/gis/geos/__pycache__/libgeos.cpython-38.pyc,, +django/contrib/gis/geos/__pycache__/linestring.cpython-38.pyc,, +django/contrib/gis/geos/__pycache__/mutable_list.cpython-38.pyc,, +django/contrib/gis/geos/__pycache__/point.cpython-38.pyc,, +django/contrib/gis/geos/__pycache__/polygon.cpython-38.pyc,, +django/contrib/gis/geos/__pycache__/prepared.cpython-38.pyc,, +django/contrib/gis/geos/base.py,sha256=NdlFg5l9akvDp87aqzh9dk0A3ZH2TI3cOq10mmmuHBk,181 +django/contrib/gis/geos/collections.py,sha256=yUMj02Akhu1BN9zpaPMSaoyfpRJWi282kkY_R6MF-kY,3895 +django/contrib/gis/geos/coordseq.py,sha256=kJEdoM6L_TW5SZYAgTivMnZbFRRm1ojf_2ycxjF7Ks0,7232 +django/contrib/gis/geos/error.py,sha256=r3SNTnwDBI6HtuyL3mQ_iEEeKlOqqqdkHnhNoUkMohw,104 +django/contrib/gis/geos/factory.py,sha256=f6u2m1AtmYYHk_KrIC9fxt7VGsJokJVoSWEx-DkPWx0,961 +django/contrib/gis/geos/geometry.py,sha256=S8TMiNBNUPwU8FAKHvRAgJwQ7NUlqRzVSkLyc_qJm_M,25544 +django/contrib/gis/geos/io.py,sha256=Om5DBSlttixUc3WQAGZDhzPdb5JTe82728oImIj_l3k,787 +django/contrib/gis/geos/libgeos.py,sha256=dmktmuklfnViT3m3qQEwssEzOkCqyNDyg5ajuUw9HCM,4999 +django/contrib/gis/geos/linestring.py,sha256=mZnjmJQ3IUtwR8oKZsReTJ5nqZjLBv0cJqqoAlBfSvw,6293 +django/contrib/gis/geos/mutable_list.py,sha256=8uJ_9r48AlIIDzYaUb_qAD0eYslek9yvAX9ICdCmh5A,10131 +django/contrib/gis/geos/point.py,sha256=_5UI0cfAax9Q8_UuQeO25E3XhuS8PEVwkeZ2dgO0yQM,4757 +django/contrib/gis/geos/polygon.py,sha256=nAJFsaBXbIM9ZA_gSxVB_3WNXJHwakmhlxN_VzKs4WQ,6664 +django/contrib/gis/geos/prepared.py,sha256=rJf35HOTxPrrk_yA-YR9bQlL_pPDKecuhwZlcww8lxY,1575 +django/contrib/gis/geos/prototypes/__init__.py,sha256=gJo1iIH3eOITX_p20QqbWqOPAPps6fnhWQ8jPMzGMAY,1236 +django/contrib/gis/geos/prototypes/__pycache__/__init__.cpython-38.pyc,, +django/contrib/gis/geos/prototypes/__pycache__/coordseq.cpython-38.pyc,, +django/contrib/gis/geos/prototypes/__pycache__/errcheck.cpython-38.pyc,, +django/contrib/gis/geos/prototypes/__pycache__/geom.cpython-38.pyc,, +django/contrib/gis/geos/prototypes/__pycache__/io.cpython-38.pyc,, +django/contrib/gis/geos/prototypes/__pycache__/misc.cpython-38.pyc,, +django/contrib/gis/geos/prototypes/__pycache__/predicates.cpython-38.pyc,, +django/contrib/gis/geos/prototypes/__pycache__/prepared.cpython-38.pyc,, +django/contrib/gis/geos/prototypes/__pycache__/threadsafe.cpython-38.pyc,, +django/contrib/gis/geos/prototypes/__pycache__/topology.cpython-38.pyc,, +django/contrib/gis/geos/prototypes/coordseq.py,sha256=aBm_yTkis2ZloQeHqimjbMGYDkhEvv0FzeQGH3pVuqc,3103 +django/contrib/gis/geos/prototypes/errcheck.py,sha256=YTUBFoHU5pZOAamBPgogFymDswgnMr1_KL59sZfInYo,2654 +django/contrib/gis/geos/prototypes/geom.py,sha256=zKB1r_-6faLyq8OL4qJdM-lbMMpw8NKYYl8L9tCesBQ,3074 +django/contrib/gis/geos/prototypes/io.py,sha256=V2SlUEniZGfVnj_9r17XneT7w-OoCUpkL_sumKIhLbU,11229 +django/contrib/gis/geos/prototypes/misc.py,sha256=7Xwk0HG__JtPt6wJD-ieMkD-7KxpnofYrHSk6NEUeJo,1161 +django/contrib/gis/geos/prototypes/predicates.py,sha256=Ya06ir7LZQBSUypB05iv9gpvZowOSLIKa4fhCnhZuYY,1587 +django/contrib/gis/geos/prototypes/prepared.py,sha256=SC7g9_vvsW_ty7LKqlMzJfF9v3EvsJX9-j3kpSeCRfY,1184 +django/contrib/gis/geos/prototypes/threadsafe.py,sha256=Ll_TmpfJhRTmWV5dgKJx_Dh67ay1pa-SdlH558NRPw4,2309 +django/contrib/gis/geos/prototypes/topology.py,sha256=wd0OxkUQiMNioDXpJdRc1h9swsZ2CeOgqMvHxqJFY5s,2256 +django/contrib/gis/locale/af/LC_MESSAGES/django.mo,sha256=TN3GddZjlqXnhK8UKLlMoMIXNw2szzj7BeRjoKjsR5c,470 +django/contrib/gis/locale/af/LC_MESSAGES/django.po,sha256=XPdXaQsZ6yDPxF3jVMEI4bli_5jrEawoO-8DHMk8Q_A,1478 +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=liiZOQ712WIdLolC8_uIHY6G4QPJ_sYhp5CfwxTXEv0,1976 +django/contrib/gis/locale/az/LC_MESSAGES/django.po,sha256=kUxBJdYhLZNnAO3IWKy4R3ijTZBiG-OFMg2wrZ7Jh28,2172 +django/contrib/gis/locale/be/LC_MESSAGES/django.mo,sha256=4B6F3HmhZmk1eLi42Bw90aipUHF4mT-Zlmsi0aKojHg,2445 +django/contrib/gis/locale/be/LC_MESSAGES/django.po,sha256=4QgQvhlM_O4N_8uikD7RASkS898vov-qT_FkQMhg4cE,2654 +django/contrib/gis/locale/bg/LC_MESSAGES/django.mo,sha256=qZKt6jmYT9ecax0Z1H8nCKWwL5qLoUiZB2MfYMu-SQs,2389 +django/contrib/gis/locale/bg/LC_MESSAGES/django.po,sha256=4MDPVwks5pLvqsXQVA2M9m_3nMFEWMsivkLEWkYm1LA,2654 +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=nPWtfc4Fbm2uaY-gCASaye9CxzOYIfjG8mDTQGvn2As,2007 +django/contrib/gis/locale/ca/LC_MESSAGES/django.po,sha256=pPMDNc3hAWsbC_BM4UNmziX2Bq7vs6bHbNqVkEvCSic,2359 +django/contrib/gis/locale/cs/LC_MESSAGES/django.mo,sha256=V7MNXNsOaZ3x1G6LqYu6KJn6zeiFQCZKvF7Xk4J0fkg,2071 +django/contrib/gis/locale/cs/LC_MESSAGES/django.po,sha256=mPkcIWtWRILisD6jOlBpPV7CKYJjhTaBcRLf7OqifdM,2321 +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=kH8GcLFe-XvmznQbiY5Ce2-Iz4uKJUfF4Be0yY13AEs,1894 +django/contrib/gis/locale/da/LC_MESSAGES/django.po,sha256=JOVTWeTnSUASbupCd2Fo0IY_veJb6XKDhyKFu6M2J_8,2179 +django/contrib/gis/locale/de/LC_MESSAGES/django.mo,sha256=1PBxHsFHDrbkCslumxKVD_kD2eIElGWOq2chQopcorY,1965 +django/contrib/gis/locale/de/LC_MESSAGES/django.po,sha256=0XnbUsy9yZHhFsGGhcSnXUqJpDlMVqmrRl-0c-kdcYk,2163 +django/contrib/gis/locale/dsb/LC_MESSAGES/django.mo,sha256=NzmmexcIC525FHQ5XvsKdzCZtkkb5wnrSd12fdAkZ-0,2071 +django/contrib/gis/locale/dsb/LC_MESSAGES/django.po,sha256=aTBfL_NB8uIDt2bWBxKCdKi-EUNo9lQ9JZ0ekWeI4Yk,2234 +django/contrib/gis/locale/el/LC_MESSAGES/django.mo,sha256=8QAS4MCktYLFsCgcIVflPXePYAWwr6iEZ7K8_axi_5U,2519 +django/contrib/gis/locale/el/LC_MESSAGES/django.po,sha256=6JVoYCUCUznxgQYlOCWJw1Ad6SR3Fa9jlorSCYkiwLw,2886 +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=8yvqHG1Mawkhx9RqD5tDXX8U0-a7RWr-wCQPGHWAqG0,2225 +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=qls9V1jybymGCdsutcjP6fT5oMaI-GXnt_oNfwq-Yhs,1960 +django/contrib/gis/locale/eo/LC_MESSAGES/django.po,sha256=WPSkCxwq3ZnR-_L-W-CnS0_Qne3ekX7ZAZVaubiWw5s,2155 +django/contrib/gis/locale/es/LC_MESSAGES/django.mo,sha256=oMQQrOdtyzvfCE844C5vM7wUuqtjMQ_HsG0TkKmfhr4,2025 +django/contrib/gis/locale/es/LC_MESSAGES/django.po,sha256=Tqmpl0-dMQELpOc7o-ig9pf6W4p8X-7Hn1EhLTnBN4Q,2476 +django/contrib/gis/locale/es_AR/LC_MESSAGES/django.mo,sha256=J-A7H9J3DjwlJ-8KvO5MC-sq4hUsJhmioAE-wiwOA8E,2012 +django/contrib/gis/locale/es_AR/LC_MESSAGES/django.po,sha256=uWqoO-Tw7lOyPnOKC2SeSFD0MgPIQHWqTfroAws24aQ,2208 +django/contrib/gis/locale/es_CO/LC_MESSAGES/django.mo,sha256=P79E99bXjthakFYr1BMobTKqJN9S1aj3vfzMTbGRhCY,1865 +django/contrib/gis/locale/es_CO/LC_MESSAGES/django.po,sha256=tyu8_dFA9JKeQ2VCpCUy_6yX97SPJcDwVqqAuf_xgks,2347 +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=xrNWaGCM9t14hygJ7a2g3KmhnFIAxVPrfKdJmP9ysrg,1921 +django/contrib/gis/locale/et/LC_MESSAGES/django.po,sha256=ejWpn0QAyxGCsfY1VpsJhUcY4ngNXG5vcwt_qOF5jbA,2282 +django/contrib/gis/locale/eu/LC_MESSAGES/django.mo,sha256=VCs3BT_AwXUHmLnAftVWs9C9rZl1FYB33u4kkQyoedY,1936 +django/contrib/gis/locale/eu/LC_MESSAGES/django.po,sha256=IrFIeK0oZNh3y3RodKxqG_1c84DdPHYqdfufY5a9C6g,2197 +django/contrib/gis/locale/fa/LC_MESSAGES/django.mo,sha256=5S15sLEZkbyZJ_GaWfysYbSo49X2U15ZFqfRHf-q0ZY,2242 +django/contrib/gis/locale/fa/LC_MESSAGES/django.po,sha256=SBQDQA2E3e1e2XniZtEu4dr6-MwNh-q_uJ022xHO_34,2596 +django/contrib/gis/locale/fi/LC_MESSAGES/django.mo,sha256=wbBTW0tVHJZbyVYDLdHourHKw5m6joaX1X_eP9uD6vY,1887 +django/contrib/gis/locale/fi/LC_MESSAGES/django.po,sha256=FYB9ZYdGMBtxt-7ZkxjtsgxVYFLDLOlscqaeSnNUa4s,2114 +django/contrib/gis/locale/fr/LC_MESSAGES/django.mo,sha256=BpmQ_09rbzFR-dRjX0_SbFAHQJs7bZekLTGwsN96j8A,2052 +django/contrib/gis/locale/fr/LC_MESSAGES/django.po,sha256=Nqsu2ILMuPVFGhHo7vYdQH7lwNupJRjl1SsMmFEo_Dw,2306 +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=m6Owcr-5pln54TXcZFAkYEYDjYiAkT8bGFyw4nowNHA,1420 +django/contrib/gis/locale/ga/LC_MESSAGES/django.po,sha256=I0kyTnYBPSdYr8RontzhGPShJhylVAdRLBGWRQr2E7g,1968 +django/contrib/gis/locale/gd/LC_MESSAGES/django.mo,sha256=8TAogB3fzblx48Lv6V94mOlR6MKAW6NjZOkKmAhncRY,2082 +django/contrib/gis/locale/gd/LC_MESSAGES/django.po,sha256=vBafKOhKlhMXU2Qzgbiy7GhEGy-RBdHJi5ey5sHx5_I,2259 +django/contrib/gis/locale/gl/LC_MESSAGES/django.mo,sha256=4OUuNpkYRWjKz_EoY1zDzKOK8YptrwUutQqFvSKsLUs,1421 +django/contrib/gis/locale/gl/LC_MESSAGES/django.po,sha256=s9tiYQLnv1_uzyLpi3qqV_zwJNic1AGFsUGc3FhJbMo,2006 +django/contrib/gis/locale/he/LC_MESSAGES/django.mo,sha256=ngfIMxGYVgNCVs_bfNI2PwjSyj03DF3FmSugZuVti60,2190 +django/contrib/gis/locale/he/LC_MESSAGES/django.po,sha256=N-FTLS0TL8AW5Owtfuqt7mlmqszgfXLUZ_4MQo23F2w,2393 +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=hA9IBuEZ6JHsTIVjGZdlvD8NcFy6v56pTy1fmA_lWwo,2045 +django/contrib/gis/locale/hsb/LC_MESSAGES/django.po,sha256=LAGSJIa6wd3Dh4IRG5DLigL-mjQzmYwn0o2RmSAdBdw,2211 +django/contrib/gis/locale/hu/LC_MESSAGES/django.mo,sha256=9P8L1-RxODT4NCMBUQnWQJaydNs9FwcAZeuoVmaQUDY,1940 +django/contrib/gis/locale/hu/LC_MESSAGES/django.po,sha256=qTC31EofFBS4HZ5SvxRKDIt2afAV4OS52_LYFnX2OB8,2261 +django/contrib/gis/locale/hy/LC_MESSAGES/django.mo,sha256=4D6em091yzO4s3U_DIdocdlvxtAbXdMt6Ig1ATxRGrQ,2535 +django/contrib/gis/locale/hy/LC_MESSAGES/django.po,sha256=0nkAba1H7qrC5JSakzJuAqsldWPG7lsjH7H8jVfG1SU,2603 +django/contrib/gis/locale/ia/LC_MESSAGES/django.mo,sha256=9MZnSXkQUIfbYB2f4XEtYo_FzuVi5OlsYcX9K_REz3c,1899 +django/contrib/gis/locale/ia/LC_MESSAGES/django.po,sha256=f7OuqSzGHQNldBHp62VIWjqP0BB0bvo8qEx9_wzH090,2116 +django/contrib/gis/locale/id/LC_MESSAGES/django.mo,sha256=FPjGhjf4wy-Wi6f3GnsBhmpBJBFnAPOw5jUPbufHISM,1938 +django/contrib/gis/locale/id/LC_MESSAGES/django.po,sha256=ap7GLVlZO6mmAs6PHgchU5xrChWF-YbwtJU7t0tqz0k,2353 +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=Ro8-P0647LU_963TJT1uOWTohB77YaGGci_2sMLJwEo,2096 +django/contrib/gis/locale/ja/LC_MESSAGES/django.po,sha256=shMi1KrURuWbFGc3PpSrpatfEQJlW--QTDH6HwHbtv4,2352 +django/contrib/gis/locale/ka/LC_MESSAGES/django.mo,sha256=iqWQ9j8yanPjDhwi9cNSktYgfLVnofIsdICnAg2Y_to,1991 +django/contrib/gis/locale/ka/LC_MESSAGES/django.po,sha256=tWoXkbWfNsZ2A28_JUvc1wtyVT6m7Hl9nJgfxXGqkgY,2566 +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=_wNvDk36C_UegH0Ex6ov8P--cKm-J7XtusXYsjVVZno,1974 +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=NM3FRy48SSVsUIQc8xh0ZKAgTVAP8iK8elp7NQ6-IdE,1469 +django/contrib/gis/locale/ko/LC_MESSAGES/django.mo,sha256=3cvrvesJ_JU-XWI5oaYSAANVjwFxn3SLd3UrdRSMAfA,1939 +django/contrib/gis/locale/ko/LC_MESSAGES/django.po,sha256=Gg9s__57BxLIYJx5O0c-UJ8cAzsU3TcLuKGE7abn1rE,2349 +django/contrib/gis/locale/ky/LC_MESSAGES/django.mo,sha256=1z_LnGCxvS3_6OBr9dBxsyHrDs7mR3Fzm76sdgNGJrU,2221 +django/contrib/gis/locale/ky/LC_MESSAGES/django.po,sha256=NyWhlb3zgb0iAa6C0hOqxYxA7zaR_XgyjJHffoCIw1g,2438 +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=9I8bq0gbDGv7wBe60z3QtWZ5x_NgALjCTvR6rBtPPBY,2113 +django/contrib/gis/locale/lt/LC_MESSAGES/django.po,sha256=jD2vv47dySaH1nVzzf7mZYKM5vmofhmaKXFp4GvX1Iw,2350 +django/contrib/gis/locale/lv/LC_MESSAGES/django.mo,sha256=KkVqgndzTA8WAagHB4hg65PUvQKXl_O79fb2r04foXw,2025 +django/contrib/gis/locale/lv/LC_MESSAGES/django.po,sha256=21VWQDPMF27yZ-ctKO-f0sohyvVkIaTXk9MKF-WGmbo,2253 +django/contrib/gis/locale/mk/LC_MESSAGES/django.mo,sha256=PVw73LWWNvaNd95zQbAIA7LA7JNmpf61YIoyuOca2_s,2620 +django/contrib/gis/locale/mk/LC_MESSAGES/django.po,sha256=eusHVHXHRfdw1_JyuBW7H7WPCHFR_z1NBqr79AVqAk0,2927 +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=-Nn70s2On94C-jmSZwTppW2q7_W5xgMpzPXYmxZSKXs,2433 +django/contrib/gis/locale/mn/LC_MESSAGES/django.po,sha256=I0ZHocPlRYrogJtzEGVPsWWHpoVEa7e2KYP9Ystlj60,2770 +django/contrib/gis/locale/mr/LC_MESSAGES/django.mo,sha256=sO2E__g61S0p5I6aEwnoAsA3epxv7_Jn55TyF0PZCUA,468 +django/contrib/gis/locale/mr/LC_MESSAGES/django.po,sha256=McWaLXfWmYTDeeDbIOrV80gwnv07KCtNIt0OXW_v7vw,1476 +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=a89qhy9BBE_S-MYlOMLaYMdnOvUEJxh8V80jYJqFEj0,1879 +django/contrib/gis/locale/nb/LC_MESSAGES/django.po,sha256=UIk8oXTFdxTn22tTtIXowTl3Nxn2qvpQO72GoQDUmaw,2166 +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=d22j68OCI1Bevtl2WgXHSQHFCiDgkPXmrFHca_uUm14,1947 +django/contrib/gis/locale/nl/LC_MESSAGES/django.po,sha256=ffytg6K7pTQoIRfxY35i1FpolJeox-fpSsG1JQzvb-0,2381 +django/contrib/gis/locale/nn/LC_MESSAGES/django.mo,sha256=32x5_V6o_BQBefFmyajOg3ssClw-DMEdvzXkY90fV3Q,1202 +django/contrib/gis/locale/nn/LC_MESSAGES/django.po,sha256=NWA3nD8ZwAZxG9EkE6TW0POJgB6HTeC4J6GOlTMD7j4,1796 +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=BkGcSOdz9VE7OYEeFzC9OLANJsTB3pFU1Xs8-CWFgb4,2095 +django/contrib/gis/locale/pl/LC_MESSAGES/django.po,sha256=IIy2N8M_UFanmHB6Ajne9g5NQ7tJCF5JvgrzasFUJDY,2531 +django/contrib/gis/locale/pt/LC_MESSAGES/django.mo,sha256=sE5PPOHzfT8QQXuV5w0m2pnBTRhKYs_vFhk8p_A4Jg0,2036 +django/contrib/gis/locale/pt/LC_MESSAGES/django.po,sha256=TFt6Oj1NlCM3pgs2dIgFZR3S3y_g7oR7S-XRBlM4924,2443 +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=brEMR8zmBMK6otF_kmR2IVuwM9UImo24vwSVUdRysAY,1829 +django/contrib/gis/locale/ro/LC_MESSAGES/django.po,sha256=EDdumoPfwMHckneEl4OROll5KwYL0ljdY-yJTUkK2JA,2242 +django/contrib/gis/locale/ru/LC_MESSAGES/django.mo,sha256=Beo_YLNtenVNPIyWB-KKMlbxeK0z4DIxhLNkAE8p9Ko,2542 +django/contrib/gis/locale/ru/LC_MESSAGES/django.po,sha256=GKPf50Wm3evmbOdok022P2YZxh-6ROKgDRLyxewPy1g,2898 +django/contrib/gis/locale/sk/LC_MESSAGES/django.mo,sha256=bws9O1h9u-ia1FraYJNIsRCf78_cSo9PNVo802hCMMQ,2043 +django/contrib/gis/locale/sk/LC_MESSAGES/django.po,sha256=DAAMn59_3-aTD8qimDetbY6GFqC311lTD3VOxz80xNQ,2375 +django/contrib/gis/locale/sl/LC_MESSAGES/django.mo,sha256=9-efMT2MoEMa5-SApGWTRiyfvI6vmZzLeMg7qGAr7_A,2067 +django/contrib/gis/locale/sl/LC_MESSAGES/django.po,sha256=foZY7N5QkuAQS7nc3CdnJerCPk-lhSb1xZqU11pNGNo,2303 +django/contrib/gis/locale/sq/LC_MESSAGES/django.mo,sha256=WEq6Bdd9fM_aRhWUBpl_qTc417U9708u9sXNgyB8o1k,1708 +django/contrib/gis/locale/sq/LC_MESSAGES/django.po,sha256=mAOImw7HYWDO2VuoHU-VAp08u5DM-BUC633Lhkc3vRk,2075 +django/contrib/gis/locale/sr/LC_MESSAGES/django.mo,sha256=cQzh-8YOz0FSIE0-BkeQHiqG6Tl4ArHvSN3yMXiaoec,2454 +django/contrib/gis/locale/sr/LC_MESSAGES/django.po,sha256=PQ3FYEidoV200w8WQBFsid7ULKZyGLzCjfCVUUPKWrk,2719 +django/contrib/gis/locale/sr_Latn/LC_MESSAGES/django.mo,sha256=SASOtA8mOnMPxh1Lr_AC0yR82SqyTiPrlD8QmvYgG58,2044 +django/contrib/gis/locale/sr_Latn/LC_MESSAGES/django.po,sha256=BPkwFmsLHVN8jwjf1pqmrTXhxO0fgDzE0-C7QvaBeVg,2271 +django/contrib/gis/locale/sv/LC_MESSAGES/django.mo,sha256=XVr0uSQnEIRNJoOpgFlxvYnpF4cGDP2K2oTjqVHhmuA,1987 +django/contrib/gis/locale/sv/LC_MESSAGES/django.po,sha256=fqUAyUbjamnqbdie8Ecek0v99uo-4uUfaSvtFffz8v4,2275 +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=_bNVyXHbuyM42-fAsL99wW7_Hwu5hF_WD7FzY-yfS8k,1961 +django/contrib/gis/locale/tr/LC_MESSAGES/django.po,sha256=W0pxShIqMePnQvn_7zcY_q4_C1PCnWwFMastDo_gHd0,2242 +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/uk/LC_MESSAGES/django.mo,sha256=Pnot1RDsNa4HYvy_6ZsFFMGhJ4JyEn6qWbDPPFUXDzg,2586 +django/contrib/gis/locale/uk/LC_MESSAGES/django.po,sha256=uJfVys_Tzi99yJ7F5IEbIDJTcM1MzCz2vpiVv_fVRmc,3090 +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=g_8mpfbj-6HJ-g1PrFU2qTTfvCbztNcjDym_SegaI8Q,1812 +django/contrib/gis/locale/zh_Hans/LC_MESSAGES/django.po,sha256=MBJpb5IJxUaI2k0Hq8Q1GLXHJPFAA-S1w6NRjsmrpBw,2286 +django/contrib/gis/locale/zh_Hant/LC_MESSAGES/django.mo,sha256=jEgcPJy_WzZa65-5rXb64tN_ehUku_yIj2d7tXwweP8,1975 +django/contrib/gis/locale/zh_Hant/LC_MESSAGES/django.po,sha256=iVnQKpbsQ4nJi65PHAO8uGRO6jhHWs22gTOUKPpb64s,2283 +django/contrib/gis/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/gis/management/__pycache__/__init__.cpython-38.pyc,, +django/contrib/gis/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/gis/management/commands/__pycache__/__init__.cpython-38.pyc,, +django/contrib/gis/management/commands/__pycache__/inspectdb.cpython-38.pyc,, +django/contrib/gis/management/commands/__pycache__/ogrinspect.cpython-38.pyc,, +django/contrib/gis/management/commands/inspectdb.py,sha256=tpyZFocjeeRN6hE1yXfp1CANzyaQYqQpI8RLhKtGzBA,717 +django/contrib/gis/management/commands/ogrinspect.py,sha256=huTEev5RAMZU9axT9ZMmrlfd3BVZ_0lNbeuW-9XLwGU,5711 +django/contrib/gis/measure.py,sha256=8RQbkuhUQjg6mvjK17XULYx5LwXGWkydM7EkEj0xsdQ,12070 +django/contrib/gis/ptr.py,sha256=RK-5GCUUaQtBuDD3lAoraS7G05fzYhR5p0acKrzpQVE,1289 +django/contrib/gis/serializers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/gis/serializers/__pycache__/__init__.cpython-38.pyc,, +django/contrib/gis/serializers/__pycache__/geojson.cpython-38.pyc,, +django/contrib/gis/serializers/geojson.py,sha256=IWR-98IYQXvJSJ4y3d09kh3ZxuFZuEKg-T9eAig5GEA,2710 +django/contrib/gis/shortcuts.py,sha256=fHf3HYP6MP8GeuBW6G3y6d30Mjxa6IL2xtmblDjS8k4,1027 +django/contrib/gis/sitemaps/__init__.py,sha256=eVHUxfzw1VQn6bqH3D8bE471s8bNJSB3phuAI-zg9gA,138 +django/contrib/gis/sitemaps/__pycache__/__init__.cpython-38.pyc,, +django/contrib/gis/sitemaps/__pycache__/kml.cpython-38.pyc,, +django/contrib/gis/sitemaps/__pycache__/views.cpython-38.pyc,, +django/contrib/gis/sitemaps/kml.py,sha256=yg-soUBEFDRSmf7iIPzdOFEi3lvcQNKp_Jisk-cwiR4,2406 +django/contrib/gis/sitemaps/views.py,sha256=vJt4Oya4IL6BHE7x8Z_FkQn1Do6caVRL8d5hE2XKVCo,2306 +django/contrib/gis/static/gis/css/ol3.css,sha256=pJADzfx4_NL2C1onFpU-muconAA5NThN4sEqSNyY_So,657 +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=QOOHCR4CyAljFTtXTP_MNKN5RTplp3lvDKxHJj3J4KY,8813 +django/contrib/gis/templates/gis/admin/openlayers.html,sha256=41MtWKVz6IR-_-c0zIQi1hvA9wXpD-g5VDJdojkcMgE,1441 +django/contrib/gis/templates/gis/admin/openlayers.js,sha256=KoT3VUMAez9-5QoT5U6OJXzt3MLxlTrJMMwINjQ_k7M,8975 +django/contrib/gis/templates/gis/admin/osm.html,sha256=yvYyZPmgP64r1JT3eZCDun5ENJaaN3d3wbTdCxIOvSo,111 +django/contrib/gis/templates/gis/admin/osm.js,sha256=0wFRJXKZ2plp7tb0F9fgkMzp4NrKZXcHiMkKDJeHMRw,128 +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=gp49iEA82IgDWPHRrAYyCqC0pvInPxTw5674RuxPM_M,1897 +django/contrib/gis/utils/__init__.py,sha256=F0GOFeUMUtapxuZ306T8d3uNblMhfWftOlpc84HeFVs,596 +django/contrib/gis/utils/__pycache__/__init__.cpython-38.pyc,, +django/contrib/gis/utils/__pycache__/layermapping.cpython-38.pyc,, +django/contrib/gis/utils/__pycache__/ogrinfo.cpython-38.pyc,, +django/contrib/gis/utils/__pycache__/ogrinspect.cpython-38.pyc,, +django/contrib/gis/utils/__pycache__/srs.cpython-38.pyc,, +django/contrib/gis/utils/layermapping.py,sha256=wHlFJ0hiEmImFW3vOe862g7LJ0Czya16csaaq7knw9A,27663 +django/contrib/gis/utils/ogrinfo.py,sha256=VmbxQ5Ri4zjtTxNymuxJp3t3cAntUC83YBMp9PuMMSU,1934 +django/contrib/gis/utils/ogrinspect.py,sha256=4lZA5_rbdo-IG7DnqddQyT_2JI_AXhuW9nduBwMWrQY,8924 +django/contrib/gis/utils/srs.py,sha256=5D5lPZwFYgZiVaKD7eCkl9vj-pGRB11HEgeNlxUAjfo,2991 +django/contrib/gis/views.py,sha256=zZfnPHc8wxomPp9NcpOfISLhwBKkVG-EtRTm90d2X_Q,700 +django/contrib/humanize/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/humanize/__pycache__/__init__.cpython-38.pyc,, +django/contrib/humanize/__pycache__/apps.cpython-38.pyc,, +django/contrib/humanize/apps.py,sha256=ODfDrSH8m3y3xYlyIIwm7DZmrNcoYKG2K8l5mU64V7g,194 +django/contrib/humanize/locale/af/LC_MESSAGES/django.mo,sha256=bNLjjeZ3H-KD_pm-wa1_5eLCDOmG2FXgDHVOg5vgL7o,5097 +django/contrib/humanize/locale/af/LC_MESSAGES/django.po,sha256=p3OduzjtTGkwlgDJhPgSm9aXI2sWzORspsPf7_RnWjs,8923 +django/contrib/humanize/locale/ar/LC_MESSAGES/django.mo,sha256=-YDFm-RPAWqjWquABE0D-Y4WfELU2RTEjWGiHVFq2Uw,9580 +django/contrib/humanize/locale/ar/LC_MESSAGES/django.po,sha256=_LmxY73PR0hjoK6cqibEdfrczCtnqYGnNo8-v0rZrF4,15386 +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=G9dyDa8T8wwEJDVw5rrajGLQo2gfs7XqsW6LbURELvA,5286 +django/contrib/humanize/locale/az/LC_MESSAGES/django.po,sha256=G0_M87HUGSH280uvUzni0qlCGviv2uwtyr6gne5SszA,9139 +django/contrib/humanize/locale/be/LC_MESSAGES/django.mo,sha256=qpbjGVSQnPESRACvTjzc3p5REpxyRGv7qgxQCigrNBY,8409 +django/contrib/humanize/locale/be/LC_MESSAGES/django.po,sha256=pyudF4so8SQG-gfmSNcNdG5BQA27Q0p_nQF1tYMuw88,13148 +django/contrib/humanize/locale/bg/LC_MESSAGES/django.mo,sha256=1mRaFPsm5ITFyfdFdqdeY-_Om2OYKua5YWSEP192WR8,4645 +django/contrib/humanize/locale/bg/LC_MESSAGES/django.po,sha256=kTyRblfWlBUMxd_czXTOe-39CcX68X6e4DTmYm3V2gc,6684 +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=I0A0wyJlSfGw34scNPoj9itqU8iz0twcyxUS15u5nJE,5230 +django/contrib/humanize/locale/ca/LC_MESSAGES/django.po,sha256=t-wxHJ0ZrXrc3bAjavz40eSu5HTJqJjz5wvfdiydJ6k,9153 +django/contrib/humanize/locale/cs/LC_MESSAGES/django.mo,sha256=jhc_EBxxvTREfZ_aaqLTBgdTv0ETP_NfI658jOG5-wQ,5119 +django/contrib/humanize/locale/cs/LC_MESSAGES/django.po,sha256=hxVcvCScc4Sl2wjr4uXNWVDin1Ps1HdVAKOmU9tIluM,9167 +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=V8u7uq8GNU7Gk3urruDnM2iR6fiio9RvLB8ou4e3EWY,5298 +django/contrib/humanize/locale/da/LC_MESSAGES/django.po,sha256=AnAvSgks2ph0MS2ZJlYKddKwQTbduEIpHK0kzsNphWM,9151 +django/contrib/humanize/locale/de/LC_MESSAGES/django.mo,sha256=7HZDGVn4FuGS2nNqHLg1RrnmQLB2Ansbri0ysHq-GfM,5418 +django/contrib/humanize/locale/de/LC_MESSAGES/django.po,sha256=wNFP1wO9hDhgyntigfVcHr7ZGao8a2PPgU24j4nl_O8,9184 +django/contrib/humanize/locale/dsb/LC_MESSAGES/django.mo,sha256=w2rgnclJnn1QQjqufly0NjUlP6kS6N8dcGwhbeBLq-w,7036 +django/contrib/humanize/locale/dsb/LC_MESSAGES/django.po,sha256=AAbtZ32HrIeB1SDn3xenPU8pFUL0Fy6D9eYlObt6EdU,11690 +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=ioDdn19UOz4rbUVzbTbV7T4qBKUD5OhdntfPzkbbTFQ,8930 +django/contrib/humanize/locale/en_AU/LC_MESSAGES/django.mo,sha256=dTndJxA-F1IE_nMUOtf1sRr7Kq2s_8yjgKk6mkWkVu4,486 +django/contrib/humanize/locale/en_AU/LC_MESSAGES/django.po,sha256=dVOlMtk3-d-KrNLM5Rji-Xrk6Y_n801ofjGQvxSu67M,4742 +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=qBSk64IcMaTrjGtTrlHP3qmNbKpA3rPz7ikNSwvOTKg,5393 +django/contrib/humanize/locale/es/LC_MESSAGES/django.po,sha256=YyTW90cMUAiF-Xec7aH6l-hBFu7mg9HFzYolkjw-wXw,9436 +django/contrib/humanize/locale/es_AR/LC_MESSAGES/django.mo,sha256=w3GNYZ0Cg9u7QTGWWnTPNI5JNS3PQkk0_XOlReDzLa4,5461 +django/contrib/humanize/locale/es_AR/LC_MESSAGES/django.po,sha256=zk18690pQF6URZmvOISW6OsoRQNiiU5lt_q07929Rko,9360 +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=qid7q1XcaF4Yso9EMvjjYHa4GpS2gEABZsjM6K7kvaw,5409 +django/contrib/humanize/locale/et/LC_MESSAGES/django.po,sha256=NwshOQjWccRg8Mc7l6W3am0BxEVM8xHSzRYtCeThWe8,9352 +django/contrib/humanize/locale/eu/LC_MESSAGES/django.mo,sha256=w2TlBudWWTI1M7RYCl_n2UY7U1CBzxIuwXl-7DCVl8o,5287 +django/contrib/humanize/locale/eu/LC_MESSAGES/django.po,sha256=77QrRqIsMuu-6HxHvaifKsPA9OVZR7686WFp26dQFMg,9146 +django/contrib/humanize/locale/fa/LC_MESSAGES/django.mo,sha256=-EfCvMVkX5VqYlXxiX8fLQntzZx8pBjmjtjvIdsaPvU,5808 +django/contrib/humanize/locale/fa/LC_MESSAGES/django.po,sha256=Xxv-FVTrSjbx0JB33F6O1wBzodwkHJpmTEiNssNTeYQ,9775 +django/contrib/humanize/locale/fi/LC_MESSAGES/django.mo,sha256=JoIeXlbKa9AD06oFeaeA9OQ2OOrLxUcLZOStczKMIGM,4190 +django/contrib/humanize/locale/fi/LC_MESSAGES/django.po,sha256=W9aUxxRF9c8aa9-kbkKmHkdQEkcfTRd8gRzWZwlTChw,7567 +django/contrib/humanize/locale/fr/LC_MESSAGES/django.mo,sha256=M7Qw0-T3752Scd4KXukhQHriG_2hgC8zYnGZGwBo_r8,5461 +django/contrib/humanize/locale/fr/LC_MESSAGES/django.po,sha256=xyn-d8-_ozUhfr25hpuUU5IQhZvtNI0JVDoUYoRzO88,9311 +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=AOEiBNOak_KQkBeGyUpTNO12zyg3CiK66h4kMoS15_0,5112 +django/contrib/humanize/locale/ga/LC_MESSAGES/django.po,sha256=jTXihbd-ysAUs0TEKkOBmXJJj69V0cFNOHM6VbcPCWw,11639 +django/contrib/humanize/locale/gd/LC_MESSAGES/django.mo,sha256=XNSpJUu4DxtlXryfUVeBOrvl2-WRyj2nKjips_qGDOg,7232 +django/contrib/humanize/locale/gd/LC_MESSAGES/django.po,sha256=I7s86NJDzeMsCGgXja--fTZNFm9bM7Cd8M1bstxabSY,11874 +django/contrib/humanize/locale/gl/LC_MESSAGES/django.mo,sha256=ChoVHsJ_bVIaHtHxhxuUK99Zu1tvRu0iY5vhtB1LDMg,3474 +django/contrib/humanize/locale/gl/LC_MESSAGES/django.po,sha256=U5D505aBKEdg80BGWddcwWuzmYdoNHx1WEPzVHQfbTE,5903 +django/contrib/humanize/locale/he/LC_MESSAGES/django.mo,sha256=zV7tqLeq2al9nSDKcTGp7cDD2pEuHD-J_34roqIYvZc,7857 +django/contrib/humanize/locale/he/LC_MESSAGES/django.po,sha256=gvUe-8PJc6dn-6lLpEi_PCDgITgJ6UzZls9cUHSA4Ss,12605 +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=4ZQDrpkEyLSRtVHEbP31ejNrR6y-LSNDfW1Hhi7VczI,7146 +django/contrib/humanize/locale/hsb/LC_MESSAGES/django.po,sha256=GtSTgK-cKHMYeOYFvHtcUtUnLyWPP05F0ZM3tEYfshs,11800 +django/contrib/humanize/locale/hu/LC_MESSAGES/django.mo,sha256=8tEqiZHEc6YmfWjf7hO0Fb3Xd-HSleKaR1gT_XFTQ8g,5307 +django/contrib/humanize/locale/hu/LC_MESSAGES/django.po,sha256=KDVYBAGSuMrtwqO98-oGOOAp7Unfm7ode1sv8lfe81c,9124 +django/contrib/humanize/locale/hy/LC_MESSAGES/django.mo,sha256=C1yx1DrYTrZ7WkOzZ5hvunphWABvGX-DqXbChNQ5_yg,1488 +django/contrib/humanize/locale/hy/LC_MESSAGES/django.po,sha256=MGbuYylBt1C5hvSlktydD4oMLZ1Sjzj7DL_nl7uluTg,7823 +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=Wb_pFDfiAow4QUsbBiqvRYt49T6cBVFTMTB_F2QUbWI,4653 +django/contrib/humanize/locale/id/LC_MESSAGES/django.po,sha256=sNc4OeIE9wvxxOQlFC9xNawJkLxa2gPUVlaKGljovOw,8116 +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=nOn-bSN3OVnqLwTlUfbb_iHLzwWt9hsR2GVHh4GZJZE,5940 +django/contrib/humanize/locale/it/LC_MESSAGES/django.po,sha256=r7sg7QtNFPzrENz5kj1wdktqdqMluA_RRtM8TKwe7PQ,10046 +django/contrib/humanize/locale/ja/LC_MESSAGES/django.mo,sha256=kYDryScxMRi2u2iOmpXc2dMytZ9_9DQMU3C3xD2REDE,4799 +django/contrib/humanize/locale/ja/LC_MESSAGES/django.po,sha256=6-W89FFg7x_JxJjACQhb4prK2Y7i1vlzm_nnIkgpNGw,8141 +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=yrXx6TInsxjnyJfhl8sXTLmYedd2jaAku9L_38CKR5A,4353 +django/contrib/humanize/locale/ko/LC_MESSAGES/django.mo,sha256=hDb7IOB8PRflKkZ81yQbgHtvN4TO35o5kWTK3WpiL4A,4817 +django/contrib/humanize/locale/ko/LC_MESSAGES/django.po,sha256=dZpSVF3l5wGTwKOXn0looag7Q23jyLGlzs083kpnqFc,8217 +django/contrib/humanize/locale/ky/LC_MESSAGES/django.mo,sha256=Az1jPnIXkf3NWnrfHUaptfRChqcgY5IzqO07fjBfswo,5039 +django/contrib/humanize/locale/ky/LC_MESSAGES/django.po,sha256=RZRDS9Fyd7wT9EYkGHdSipsYdXZB3FzbOPgbMrzBPHo,8297 +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=-XzcL0rlKmGkt28ukVIdwQZobR7RMmsOSstKH9eezuQ,6211 +django/contrib/humanize/locale/lv/LC_MESSAGES/django.po,sha256=fJOCQcPLCw1g-q8g4UNWR3MYFtBWSNkeOObjCMdWUp4,10572 +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=gi-b-GRPhg2s2O9wP2ENx4bVlgHBo0mSqoi58d_QpCw,6020 +django/contrib/humanize/locale/mn/LC_MESSAGES/django.po,sha256=0zV7fYPu6xs_DVOCUQ6li36JWOnpc-RQa0HXwo7FrWc,9797 +django/contrib/humanize/locale/mr/LC_MESSAGES/django.mo,sha256=2Z5jaGJzpiJTCnhCk8ulCDeAdj-WwR99scdHFPRoHoA,468 +django/contrib/humanize/locale/mr/LC_MESSAGES/django.po,sha256=M44sYiBJ7woVZZlDO8rPDQmS_Lz6pDTCajdheyxtdaI,4724 +django/contrib/humanize/locale/ms/LC_MESSAGES/django.mo,sha256=xSHIddCOU0bnfiyzQLaDaHAs1E4CaBlkyeXdLhJo1A8,842 +django/contrib/humanize/locale/ms/LC_MESSAGES/django.po,sha256=YhBKpxsTw9BleyaDIoDJAdwDleBFQdo1LckqLRmN8x4,7127 +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=ZQ8RSlS3DXBHmpjZrZza9FPSxb1vDBN87g87dRbGMkQ,5317 +django/contrib/humanize/locale/nb/LC_MESSAGES/django.po,sha256=fpfJStyZSHz0A6fVoRSOs_NKcUGo9fFKmXme4yll62s,9134 +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=xSGou2yFmVuiMH3C1IefwHBSys0YI_qW8ZQ9rwLdlPQ,5262 +django/contrib/humanize/locale/nl/LC_MESSAGES/django.po,sha256=s7LbdXpSQxkqSr666oTwTNlfdrJpLeYGoCe1xlAkGH8,9217 +django/contrib/humanize/locale/nn/LC_MESSAGES/django.mo,sha256=_Qbyf366ApSCU09Er6CvEf5WrA8s6ZzsyZXs44BoT10,3482 +django/contrib/humanize/locale/nn/LC_MESSAGES/django.po,sha256=qkEeQKQ8XwPKtTv2Y8RscAnE4QarinOze3Y3BTIEMCk,5818 +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=UT-bQF-nGA9XBIuitXuld4JKrJKRct_HAbmHdPOE0eg,6977 +django/contrib/humanize/locale/pl/LC_MESSAGES/django.po,sha256=hgqkd9mPgYmacnv0y2RwMn5svKQO4BCSvh-0zuG2yeQ,11914 +django/contrib/humanize/locale/pt/LC_MESSAGES/django.mo,sha256=El9Sdr3kXS-yTol_sCg1dquxf0ThDdWyrWGjjim9Dj4,5408 +django/contrib/humanize/locale/pt/LC_MESSAGES/django.po,sha256=XudOc67ybF_fminrTR2XOCKEKwqB5FX14pl3clCNXGE,9281 +django/contrib/humanize/locale/pt_BR/LC_MESSAGES/django.mo,sha256=5GqZStkWlU0gGvtk_ufR3ZdLRqLEkSF6KJtbTuJb3pc,5427 +django/contrib/humanize/locale/pt_BR/LC_MESSAGES/django.po,sha256=Hz2kgq9Nv4jjGCyL16iE9ctJElxcLoIracR7DuVY-BE,9339 +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=tkKePMXIA1h_TXxXmB2m-QbelTteNKEc5-SEzs7u6FM,8569 +django/contrib/humanize/locale/ru/LC_MESSAGES/django.po,sha256=fXkT7XpiU2_wmnR1__QCxIdndI2M3ssNus8rMM-TSOw,13609 +django/contrib/humanize/locale/sk/LC_MESSAGES/django.mo,sha256=uUeDN0iYDq_3vT3NcTOTpKCGcv2ner5WtkIk6GVIsu0,6931 +django/contrib/humanize/locale/sk/LC_MESSAGES/django.po,sha256=cwmpA5EbD4ZE8aK0I1enRE_4RVbtfp1HQy0g1n_IYAE,11708 +django/contrib/humanize/locale/sl/LC_MESSAGES/django.mo,sha256=f_07etc_G4OdYiUBKPkPqKm2iINqXoNsHUi3alUBgeo,5430 +django/contrib/humanize/locale/sl/LC_MESSAGES/django.po,sha256=mleF0fvn0oEfszhGLoaQkWofTwZJurKrJlIH8o-6kAI,8166 +django/contrib/humanize/locale/sq/LC_MESSAGES/django.mo,sha256=1XXRe0nurGUUxI7r7gbSIuluRuza7VOeNdkIVX3LIFU,5280 +django/contrib/humanize/locale/sq/LC_MESSAGES/django.po,sha256=BS-5o3aG8Im9dWTkx4E_IbbeTRFcjjohinz1823ZepI,9127 +django/contrib/humanize/locale/sr/LC_MESSAGES/django.mo,sha256=kBcoXTmJJlXEOk2M3l-k0PisT2jN_jXXhcOdPLBAiUY,5415 +django/contrib/humanize/locale/sr/LC_MESSAGES/django.po,sha256=u9ECn0qC8OPkHC9n10rljZc1vxed10eI0OOG7iPyA2w,9055 +django/contrib/humanize/locale/sr_Latn/LC_MESSAGES/django.mo,sha256=Z4hRzn0ks-vAj2ia4ovbsv00pOoZ973jRThbtlLKe5U,1017 +django/contrib/humanize/locale/sr_Latn/LC_MESSAGES/django.po,sha256=T9CYAx-KhtXwrlY4ol3hFv8dzxyJ1FTqeMBgtjYMEj8,6875 +django/contrib/humanize/locale/sv/LC_MESSAGES/django.mo,sha256=Vb7VkAhhLbFdki1vUbFVAW5Dy5vUS8XWqr2T78-dTMg,4066 +django/contrib/humanize/locale/sv/LC_MESSAGES/django.po,sha256=4ccBM3edMXFOv4o30Zxmm9mbKRRcOkVttfeWHkSNmFg,7526 +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/tr/LC_MESSAGES/django.mo,sha256=Z7-3YuSHL0_5sVzsUglegY-jD9uQvw3nAzf2LVomTzU,5263 +django/contrib/humanize/locale/tr/LC_MESSAGES/django.po,sha256=aNI_MjfKWeb4UmukfkYWs1ZXj8JabBYG3WKkADGyOK8,9160 +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/uk/LC_MESSAGES/django.mo,sha256=Y1DAAowIHg4ibKYa6blAjm_OAjE9DppWN0HIkW7FNCg,8809 +django/contrib/humanize/locale/uk/LC_MESSAGES/django.po,sha256=Kv644K7dXfAt4tustWP-2dVT5aV26wBlUeBHfYo1D50,13754 +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=JcMWgxYXOPXTCR6t8szkuDHSQ6p0RJX7Tggq84gJhwQ,4709 +django/contrib/humanize/locale/zh_Hans/LC_MESSAGES/django.po,sha256=L7SmGldceykiGHJe42Hxx_qyJa9rBuAnJdYgIY-L-6o,8242 +django/contrib/humanize/locale/zh_Hant/LC_MESSAGES/django.mo,sha256=qYO9_rWuIMxnlL9Q8V9HfhUu7Ebv1HGOlvsnh7MvZkE,4520 +django/contrib/humanize/locale/zh_Hant/LC_MESSAGES/django.po,sha256=AijEfvIlJK9oVaLJ7lplmbvhGRKIbYcLh8WxoBYoQkA,7929 +django/contrib/humanize/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/humanize/templatetags/__pycache__/__init__.cpython-38.pyc,, +django/contrib/humanize/templatetags/__pycache__/humanize.cpython-38.pyc,, +django/contrib/humanize/templatetags/humanize.py,sha256=Y6J-BQC4NzosmYWXoRACmEbW-yj5N_TtRhk-GMv4Uns,11203 +django/contrib/messages/__init__.py,sha256=6myQIwIFgc3SAyH5P1soIjwELREVgbxgxP85fJcge04,106 +django/contrib/messages/__pycache__/__init__.cpython-38.pyc,, +django/contrib/messages/__pycache__/api.cpython-38.pyc,, +django/contrib/messages/__pycache__/apps.cpython-38.pyc,, +django/contrib/messages/__pycache__/constants.cpython-38.pyc,, +django/contrib/messages/__pycache__/context_processors.cpython-38.pyc,, +django/contrib/messages/__pycache__/middleware.cpython-38.pyc,, +django/contrib/messages/__pycache__/utils.cpython-38.pyc,, +django/contrib/messages/__pycache__/views.cpython-38.pyc,, +django/contrib/messages/api.py,sha256=sWP2DP-n8ZWOTM-BLFDGrH_l-voGwrSxC0OgEyJt1F4,3071 +django/contrib/messages/apps.py,sha256=yGXBKfV5WF_ElcPbX4wJjXq6jzp39ttnO7sp8N_IzOQ,194 +django/contrib/messages/constants.py,sha256=WZxjzvEoKI7mgChSFp_g9e-zUH8r6JLhu9sFsftTGNA,312 +django/contrib/messages/context_processors.py,sha256=0LniZjxZ7Fx2BxYdJ0tcruhG4kkBEEhsc7Urcf31NnE,354 +django/contrib/messages/middleware.py,sha256=4L-bzgSjTw-Kgh8Wg8MOqkJPyilaxyXi_jH1UpP1h-U,986 +django/contrib/messages/storage/__init__.py,sha256=gXDHbQ9KgQdfhYOla9Qj59_SlE9WURQiKzIA0cFH0DQ,392 +django/contrib/messages/storage/__pycache__/__init__.cpython-38.pyc,, +django/contrib/messages/storage/__pycache__/base.cpython-38.pyc,, +django/contrib/messages/storage/__pycache__/cookie.cpython-38.pyc,, +django/contrib/messages/storage/__pycache__/fallback.cpython-38.pyc,, +django/contrib/messages/storage/__pycache__/session.cpython-38.pyc,, +django/contrib/messages/storage/base.py,sha256=Yv87oNn-aAFMatjSmwMJDzMw7rs_ip4F0mBkmiaFPY4,5675 +django/contrib/messages/storage/cookie.py,sha256=O0gc4dWBZqIrZCoA3V6qbfnU513hhdxoLsV_rRbnu1o,7868 +django/contrib/messages/storage/fallback.py,sha256=IbyyZg8cTU-19ZeRg6LndLfRK0SoevDwqKtrqzhVp6c,2095 +django/contrib/messages/storage/session.py,sha256=g95KozBe893u5bZXGqyjwxnzqHuH1WoTTIoFGpxwz6Q,1619 +django/contrib/messages/utils.py,sha256=6PzAryJ0e6oOwtSAMrjAIsYGu_nWIpgMG0p8f_rzOrg,256 +django/contrib/messages/views.py,sha256=R5xD2DLmAO0x6EGpE8TX5bku4zioOiYkQnAtf6r-VAE,523 +django/contrib/postgres/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/postgres/__pycache__/__init__.cpython-38.pyc,, +django/contrib/postgres/__pycache__/apps.cpython-38.pyc,, +django/contrib/postgres/__pycache__/constraints.cpython-38.pyc,, +django/contrib/postgres/__pycache__/functions.cpython-38.pyc,, +django/contrib/postgres/__pycache__/indexes.cpython-38.pyc,, +django/contrib/postgres/__pycache__/lookups.cpython-38.pyc,, +django/contrib/postgres/__pycache__/operations.cpython-38.pyc,, +django/contrib/postgres/__pycache__/search.cpython-38.pyc,, +django/contrib/postgres/__pycache__/serializers.cpython-38.pyc,, +django/contrib/postgres/__pycache__/signals.cpython-38.pyc,, +django/contrib/postgres/__pycache__/utils.cpython-38.pyc,, +django/contrib/postgres/__pycache__/validators.cpython-38.pyc,, +django/contrib/postgres/aggregates/__init__.py,sha256=QCznqMKqPbpraxSi1Y8-B7_MYlL42F1kEWZ1HeLgTKs,65 +django/contrib/postgres/aggregates/__pycache__/__init__.cpython-38.pyc,, +django/contrib/postgres/aggregates/__pycache__/general.cpython-38.pyc,, +django/contrib/postgres/aggregates/__pycache__/mixins.cpython-38.pyc,, +django/contrib/postgres/aggregates/__pycache__/statistics.cpython-38.pyc,, +django/contrib/postgres/aggregates/general.py,sha256=iv15n2eLinHplH-aN8RshqIuiphElyDhArqqDl6ZMw0,1744 +django/contrib/postgres/aggregates/mixins.py,sha256=kx0asjl1rWyuCc115jGlAAR4B-oIxCNuSBN3YLVs4_o,2064 +django/contrib/postgres/aggregates/statistics.py,sha256=Snn2JTyiri0m9k64ZWl7pr0LtN5D8N8oi2FIu2qoJ0o,1462 +django/contrib/postgres/apps.py,sha256=pbelRLsdlD9OeCRylcxTVUClrqBpEnCOdBa9RKKN9WM,3139 +django/contrib/postgres/constraints.py,sha256=MeG1czYHitrndtuA2BPbKokvGKFU5s3vikaoBD1Y95o,7100 +django/contrib/postgres/fields/__init__.py,sha256=Xo8wuWPwVNOkKY-EwV9U1zusQ2DjMXXtL7_8R_xAi5s,148 +django/contrib/postgres/fields/__pycache__/__init__.cpython-38.pyc,, +django/contrib/postgres/fields/__pycache__/array.cpython-38.pyc,, +django/contrib/postgres/fields/__pycache__/citext.cpython-38.pyc,, +django/contrib/postgres/fields/__pycache__/hstore.cpython-38.pyc,, +django/contrib/postgres/fields/__pycache__/jsonb.cpython-38.pyc,, +django/contrib/postgres/fields/__pycache__/ranges.cpython-38.pyc,, +django/contrib/postgres/fields/__pycache__/utils.cpython-38.pyc,, +django/contrib/postgres/fields/array.py,sha256=0-5iXKvWs01MjfVevlaQJR1lMhtDpguVuebhLtb-jyk,10543 +django/contrib/postgres/fields/citext.py,sha256=G40UZv4zop8Zrq2vMhluZ-MT7yPLEc8IEDi3hZ27gGw,439 +django/contrib/postgres/fields/hstore.py,sha256=BfQ3ifm7NGTlKHqYvazgaWoDf6GDRiqDwAcdMgnZ0co,3243 +django/contrib/postgres/fields/jsonb.py,sha256=7OGh-sP4qtQkAZWLZf_2F0UBAOVAK8W5oUW2JcxiukU,1428 +django/contrib/postgres/fields/ranges.py,sha256=sW35EO9kLeEUXowMntEDak4FTEiNQ8k8jRShkDedLyU,9579 +django/contrib/postgres/fields/utils.py,sha256=TV-Aj9VpBb13I2iuziSDURttZtz355XakxXnFwvtGio,95 +django/contrib/postgres/forms/__init__.py,sha256=GSqucR50I9jrZUYZUFVmb8nV_FSlXu1BcCpFck2pVXI,118 +django/contrib/postgres/forms/__pycache__/__init__.cpython-38.pyc,, +django/contrib/postgres/forms/__pycache__/array.cpython-38.pyc,, +django/contrib/postgres/forms/__pycache__/hstore.cpython-38.pyc,, +django/contrib/postgres/forms/__pycache__/jsonb.cpython-38.pyc,, +django/contrib/postgres/forms/__pycache__/ranges.cpython-38.pyc,, +django/contrib/postgres/forms/array.py,sha256=qWmxMDlo5UfKTET03kqyhXF1-b3rGCnuuAOhyvbzHL8,8065 +django/contrib/postgres/forms/hstore.py,sha256=f7PJ41fsd8D7cvyJG-_ugslM-hXL7qnZPdx08UZQNXY,1766 +django/contrib/postgres/forms/jsonb.py,sha256=WmDxuxhULUYO8_nKXXsOz26ta4oye0MQwHhDCW5Oe5g,484 +django/contrib/postgres/forms/ranges.py,sha256=GZX5dB4q5G1-FMo54r_gW3Jl89rbnL-EnDetSFNRH_A,3344 +django/contrib/postgres/functions.py,sha256=zHeAyKR5MhnsIGI5qbtmRdxPm8OtycEBE5OmCNyynD8,252 +django/contrib/postgres/indexes.py,sha256=a0q9tl0tTyPVSonmCU2unKCWJQ_AjWeO2OcR6TTs9TA,8222 +django/contrib/postgres/jinja2/postgres/widgets/split_array.html,sha256=AzaPLlNLg91qkVQwwtAJxwOqDemrtt_btSkWLpboJDs,54 +django/contrib/postgres/locale/af/LC_MESSAGES/django.mo,sha256=kDeL_SZezO8DRNMRh2oXz94YtAK1ZzPiK5dftqAonKI,2841 +django/contrib/postgres/locale/af/LC_MESSAGES/django.po,sha256=ALKUHbZ8DE6IH80STMJhGOoyHB8HSSxI4PlX_SfxJWc,3209 +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=K-2weZNapdDjP5-ecOfQhhhWmVR53JneJ2n4amA_zTk,2855 +django/contrib/postgres/locale/az/LC_MESSAGES/django.po,sha256=Pn47g_NvMgSBjguFLT_AE1QzxOGXOYjA-g_heXAT_tU,3214 +django/contrib/postgres/locale/be/LC_MESSAGES/django.mo,sha256=0Y6S-XR45rgw0zEZgjpRJyNm7szHxr9XOUyolo_5cN0,4134 +django/contrib/postgres/locale/be/LC_MESSAGES/django.po,sha256=KIkbhabWDYo4iDaQ8Dt0kxH_VB2wTFsS0rGs9zzKoKU,4635 +django/contrib/postgres/locale/bg/LC_MESSAGES/django.mo,sha256=5YRXtACYtWmAdz7Nmr9Btqypb5Ncu8dswf8gzurOJuo,2969 +django/contrib/postgres/locale/bg/LC_MESSAGES/django.po,sha256=CN_a4ac_1ZLxUHFTbYf5BmYHKBaxuHd7OIBFep558m0,3645 +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/cs/LC_MESSAGES/django.mo,sha256=_EmT9NnoX3xeRU-AI5sPlAszjzC0XwryWOmj8d07ox8,3388 +django/contrib/postgres/locale/cs/LC_MESSAGES/django.po,sha256=dkWVucs3-avEVtk_Xh5p-C8Tvw_oKDASdgab_-ByP-w,3884 +django/contrib/postgres/locale/da/LC_MESSAGES/django.mo,sha256=Pi841HD7j9mPiKNTaBvQP2aa5cF9MtwqbY6zfiouwu4,2916 +django/contrib/postgres/locale/da/LC_MESSAGES/django.po,sha256=3D8kRTXX2nbuvRoDlTf5tHB2S_k2d571L678wa3nBA8,3339 +django/contrib/postgres/locale/de/LC_MESSAGES/django.mo,sha256=B3HwniAOjSHmhuuqpLVa3nqYD5HPzZ7vwtQ_oPKiByE,2993 +django/contrib/postgres/locale/de/LC_MESSAGES/django.po,sha256=dZu8_1FIFKw67QnhXsGibfWT2W3d07Ro9CU8Y_HolvE,3468 +django/contrib/postgres/locale/dsb/LC_MESSAGES/django.mo,sha256=4Ymt58bCjpZlmNDZbFO8TtI6agusGvTwlDCjip_q8nQ,3573 +django/contrib/postgres/locale/dsb/LC_MESSAGES/django.po,sha256=m1PlbIRBIkTnbe2jLzcR0_Oi9MujrsS82apXd8GDkcs,4033 +django/contrib/postgres/locale/el/LC_MESSAGES/django.mo,sha256=haeVSD4yQq0zxi5mpDItnRv9DpBVOgQ2IOIS6T9OGxQ,3428 +django/contrib/postgres/locale/el/LC_MESSAGES/django.po,sha256=VeB_UwU4IFZCSVum_vTekAaDsYEvanmDywLj3EsPYBo,4013 +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=FtuWLiTQcIvK-kpbZujmawA0yQeRERhzfoJeEiOAyJw,2865 +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=GoDmVupnksF_ypFyzFSjsGYb6EKA--HwvJfByZtSlTA,2917 +django/contrib/postgres/locale/es/LC_MESSAGES/django.po,sha256=kPsH3ohAmLLkEI5xKqge39SDF8FrNTx1emhPPeReYUg,3518 +django/contrib/postgres/locale/es_AR/LC_MESSAGES/django.mo,sha256=f_gM-9Y0FK-y67lU2b4yYiFt0hz4ps9gH0NhCZScwaE,2917 +django/contrib/postgres/locale/es_AR/LC_MESSAGES/django.po,sha256=0qNlBk5v2QhZsb90xX3xHp8gw6jXevERbkOLBjwtJOc,3278 +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=gB2z3nI8Bz-km3DngYfJulwelHSlWgZeBXlj5yWyA08,2943 +django/contrib/postgres/locale/fi/LC_MESSAGES/django.po,sha256=LNVTHv4-FWT5KOre5qTwLEpKIQbaSIusFH2uUmbwYBg,3315 +django/contrib/postgres/locale/fr/LC_MESSAGES/django.mo,sha256=wmlIBo9os5o1u04uSvk9-VBCCfK47MWj6kIirqMvHMA,3081 +django/contrib/postgres/locale/fr/LC_MESSAGES/django.po,sha256=sLwnf7qCGv5buhPp6kEJhsjx_BqFTxT5k5o3gQQ8fEI,3463 +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=MjJ8iObaHWyy2vFg_pDepfkiVH8LlTVHdy5tSqt8Wbw,539 +django/contrib/postgres/locale/gl/LC_MESSAGES/django.po,sha256=uI-7M-VYa4rqbEZcNwfQHUYDGRsz5mmksdigRywKDQc,2222 +django/contrib/postgres/locale/he/LC_MESSAGES/django.mo,sha256=UDu--EyjTrPOqf-XI9rH_Z9z7mhBGnXvrpHrfdGBlKk,3713 +django/contrib/postgres/locale/he/LC_MESSAGES/django.po,sha256=ekkwIceJdQKqL9VlCYwipnrsckSLhGi5OwBKEloZWlU,4188 +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=fnzghbobisOaQTMu6Fm7FMAv7r6afzc8_hFHwlrHU0Y,3482 +django/contrib/postgres/locale/hsb/LC_MESSAGES/django.po,sha256=V35au4H4RIMcVq_T-KEfnQ2oUqxJqyXP--YFHWt_DNw,3933 +django/contrib/postgres/locale/hu/LC_MESSAGES/django.mo,sha256=6-9w_URPmVzSCcFea7eThbIE5Q-QSr5Q-i0zvKhpBBI,2872 +django/contrib/postgres/locale/hu/LC_MESSAGES/django.po,sha256=fx4w4FgjfP0dlik7zGCJsZEHmmwQUSA-GRzg4KeVd_s,3394 +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=KKI5fjmuD7jqiGe7SgGkWmF6unHNe8JMVoOSDVemB8o,2733 +django/contrib/postgres/locale/id/LC_MESSAGES/django.po,sha256=Me13R5Oi89IZ0T3CtY0MZ34YK3T-HIZ7GbtFiXl2h50,3300 +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=m7bI5A6ER8TNWQH7m5-vU4xbFeqDlw-Tslv02oLLWJs,2978 +django/contrib/postgres/locale/it/LC_MESSAGES/django.po,sha256=FgyUi-A3zHv-UC21oqQ8NuHKSccRaH5_UqSuOpJFlKk,3600 +django/contrib/postgres/locale/ja/LC_MESSAGES/django.mo,sha256=Up-87OUoJEieJkp8QecimVE-9q2krKt0pdHw1CcSxXs,3027 +django/contrib/postgres/locale/ja/LC_MESSAGES/django.po,sha256=mq2YnEbj6R6EEic2Gyhc56o-BbyJFv4PoJjXzz1CauI,3416 +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=vK52cwamFt1mrvpSaoVcf2RAmQghw_EbPVrx_EA9onI,2897 +django/contrib/postgres/locale/ko/LC_MESSAGES/django.po,sha256=N_HTD-HK_xI27gZJRm_sEX4qM_Wtgdy5Pwqb8A6h9C8,3445 +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=zSCp3i4tUkXh-o0uCnOntFhohUId8ctOQIooEgPbrtw,3099 +django/contrib/postgres/locale/lv/LC_MESSAGES/django.po,sha256=HaGoMy-idXgYHqxczydnQSZdzRv-YaShFU2ns4yuPAY,3626 +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/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=ttUzGWvxJYw71fVbcXCwzetyTWERBsURTe_nsf_axq0,2951 +django/contrib/postgres/locale/nl/LC_MESSAGES/django.po,sha256=ENw-dI6FHFqxclQKdefthCIVgp41HoIYj0IBmRCz0Vw,3515 +django/contrib/postgres/locale/pl/LC_MESSAGES/django.mo,sha256=HZOPQ8tC_vWEqsCAtDquwnyhEiECyKSmVHuoklAj6hA,3444 +django/contrib/postgres/locale/pl/LC_MESSAGES/django.po,sha256=gKrgT2Mpuxhs6ym_D4yJQVC0tVr9KSaZBP7Fc4yW-wY,4150 +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=y4D_g5Er3BpERdgloYcjvrhd2b_H77HzLkNUPiQY7d4,2903 +django/contrib/postgres/locale/pt_BR/LC_MESSAGES/django.po,sha256=NTn26DdAGB90QPXwiWmhuB6un6sL2Rff5DJddtjLid4,3648 +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=TQ7EuEipMb-vduqTGhQY8PhjmDrCgujKGRX7Im0BymQ,4721 +django/contrib/postgres/locale/ru/LC_MESSAGES/django.po,sha256=Me728Qfq_PXRZDxjGQbs3lLMueG3bNaqGZuZPgqsZQA,5495 +django/contrib/postgres/locale/sk/LC_MESSAGES/django.mo,sha256=0LY5Axf2dGDPCe0d2eQgEJY6OI3VORrIU9IiXPF2MD8,3358 +django/contrib/postgres/locale/sk/LC_MESSAGES/django.po,sha256=jtXuD3iUdd0_COtBzW57sNgWZ9jgXhNNiWKTj8M2X1A,3846 +django/contrib/postgres/locale/sl/LC_MESSAGES/django.mo,sha256=rBO3S_wTGtqYq3PPasYZ9fMIxbNsCevNwNlj-csP53Y,3026 +django/contrib/postgres/locale/sl/LC_MESSAGES/django.po,sha256=-hQIB9eapgVP-jrewMbtlwZfiNn8N9w03BF9OkP73xE,3642 +django/contrib/postgres/locale/sq/LC_MESSAGES/django.mo,sha256=Pm-uXjVgLGsPwPueqLL4bLJooVzeRFwqk-gpIlxXRDE,2899 +django/contrib/postgres/locale/sq/LC_MESSAGES/django.po,sha256=hQq8PofZztjMCuvv4vZuWYIwHYErygvCz2zAsplfgWs,3281 +django/contrib/postgres/locale/sr/LC_MESSAGES/django.mo,sha256=xNuocml3ql2Cz5cp74N525eaJ7erKcEwLbFc6IZqYBk,3753 +django/contrib/postgres/locale/sr/LC_MESSAGES/django.po,sha256=jQJQzmmrdVOEQRFSmzPPW_rUOeCS6T-1u5_pRDXWRLI,4190 +django/contrib/postgres/locale/sr_Latn/LC_MESSAGES/django.mo,sha256=RsF_fhesv3GZ0cLY3sLrLjNWxy--tUnU3jj8zEDWu2g,3092 +django/contrib/postgres/locale/sr_Latn/LC_MESSAGES/django.po,sha256=6DwzkQTrhF-hhDd6GfyOZsthi84HKVy7mszvGYJXFpk,3488 +django/contrib/postgres/locale/sv/LC_MESSAGES/django.mo,sha256=ASNm2ZJRX_EDsz-4kUGiDlqZc62GzYceT76Yg_CqdDY,2787 +django/contrib/postgres/locale/sv/LC_MESSAGES/django.po,sha256=dVEH6Cuf-2afXl7tkaNK5vKRbrxyPGFz18MZ4MnyMFU,3342 +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=2wed5sCHeOFoykqShgnZ1aJ2dF6b6RbygraHUBhcysU,2898 +django/contrib/postgres/locale/tr/LC_MESSAGES/django.po,sha256=9xd_-n_JNSZ8GeYI0NeegzLLsTvREWsD0xbBx6otQQ4,3267 +django/contrib/postgres/locale/uk/LC_MESSAGES/django.mo,sha256=8Hd-F7RZgoSrBlWYHSUw6uhXHdVFiEcWHWuXxJhYrU8,4418 +django/contrib/postgres/locale/uk/LC_MESSAGES/django.po,sha256=jFuGp_wSpAEZ91at1WUhS-S6k5JGv10kbVu4YoDsoDo,5116 +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=jUqnfwS-XMNKVytVLEcyVsxqyfIHGkSJfW0hi7Sh7w4,2574 +django/contrib/postgres/locale/zh_Hans/LC_MESSAGES/django.po,sha256=7L9pBCN-dScEAfPIe4u-jY14S6NgVe6seZHaqthgms0,3060 +django/contrib/postgres/locale/zh_Hant/LC_MESSAGES/django.mo,sha256=Twqt8SVetuVV6UQ8ne48RfXILh2I9_-5De7cIrd5Lvc,2586 +django/contrib/postgres/locale/zh_Hant/LC_MESSAGES/django.po,sha256=5qE-q9uXlHM59soKgNSqeCfP-DnFuYI4fXLAbQctJ8c,2962 +django/contrib/postgres/lookups.py,sha256=PzWopUkxh5JRkqAozJN-RaLs7gwaKhXzHkIE75yQ-g4,1478 +django/contrib/postgres/operations.py,sha256=Nt-prrtntlN1GSGTe6zz4m-Y5J9AR4ysn0HqaJes0MA,9240 +django/contrib/postgres/search.py,sha256=8MtUU6278Rov1qQLubZanx3O1DKT7RhKRrm4bWS6nf0,10427 +django/contrib/postgres/serializers.py,sha256=EPW4-JtgMV_x4_AosG4C-HLX3K4O9ls9Ezw9f07iHd8,435 +django/contrib/postgres/signals.py,sha256=MmUklgaTW1-UBMGQTxNO_1fsO7mZugGs9ScovuCIyJo,2245 +django/contrib/postgres/templates/postgres/widgets/split_array.html,sha256=AzaPLlNLg91qkVQwwtAJxwOqDemrtt_btSkWLpboJDs,54 +django/contrib/postgres/utils.py,sha256=gBGBmAYMKLkB6nyaRgx5Yz_00bXaOA6BDK9koiE-_co,1187 +django/contrib/postgres/validators.py,sha256=CA_iygE2q3o8tXlQ9JfMYxoO6HDJk3D0PIcmGrahwdI,2675 +django/contrib/redirects/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/redirects/__pycache__/__init__.cpython-38.pyc,, +django/contrib/redirects/__pycache__/admin.cpython-38.pyc,, +django/contrib/redirects/__pycache__/apps.cpython-38.pyc,, +django/contrib/redirects/__pycache__/middleware.cpython-38.pyc,, +django/contrib/redirects/__pycache__/models.cpython-38.pyc,, +django/contrib/redirects/admin.py,sha256=P9wp8yIvDjJSfIXpWYM2ftDlVhKvte_0AM9Ky_j1JIs,314 +django/contrib/redirects/apps.py,sha256=GtzXJDrUGaZQPHBr8ciXPtb76urejXkuG-A34NvSwJ8,251 +django/contrib/redirects/locale/af/LC_MESSAGES/django.mo,sha256=UqXzx3fQxw4n7RGNgnp4lzLJ93DPRAgIAg6bwPs5GFY,1119 +django/contrib/redirects/locale/af/LC_MESSAGES/django.po,sha256=JvDnHyWH_-IyOTSR36hwSBmd_fXa3trpUAgEThdtDvM,1260 +django/contrib/redirects/locale/ar/LC_MESSAGES/django.mo,sha256=45kuFTs85G4XxI1OrBnkrgQJJfQE0cveTs1GEsf3un4,1311 +django/contrib/redirects/locale/ar/LC_MESSAGES/django.po,sha256=L_mv0nptTvKi3ONK2yJBINoqPkQ0-FIpWu1FWKlzI-s,1565 +django/contrib/redirects/locale/ar_DZ/LC_MESSAGES/django.mo,sha256=Nt17Ugj4UVEsyg-y7UYgCnAttSX_pRR5OLS-qRbpZvI,1336 +django/contrib/redirects/locale/ar_DZ/LC_MESSAGES/django.po,sha256=ckrjwULi4Sx_mBOxadvywXOy6vyecQYWryACnyg1XGA,1511 +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=KzpRUrONOi5Cdr9sSRz3p0X-gGhD1-3LNhen-XDhO3g,1092 +django/contrib/redirects/locale/az/LC_MESSAGES/django.po,sha256=RGjd2J_pRdSkin4UlKxg7kc3aA8PCQRjDPXkpGZHdn0,1347 +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=fEXrzyixSGCWaWu5XxVsjRKMlPwYkORpFtAiwNNShvM,1268 +django/contrib/redirects/locale/bg/LC_MESSAGES/django.po,sha256=_Xha-uOePDqOqOVmYgcR8auVgNT3CS-Z_V_vwyTlwfk,1493 +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=sp3kaIhlTGdtYeHjZ8fQypdYKINsea8C0tufuCAlFBY,1106 +django/contrib/redirects/locale/ca/LC_MESSAGES/django.po,sha256=SMB90_SWZQF1cpWYjEzwy9w3Y9w8rtZND6WW-degBCs,1417 +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=8Zn398kFjKp-I9CLi6wAMw_0PmDrK4cJc1SjnQ_K8bY,1095 +django/contrib/redirects/locale/de/LC_MESSAGES/django.po,sha256=hXoA4dzgP29HekziQtDHeQb_GcRCK9xAhICB7gMeHgE,1315 +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=kzCurtbtzdZsJOzqLbTtn3kjltOnBq6Nd8p8EFTllF0,1384 +django/contrib/redirects/locale/el/LC_MESSAGES/django.po,sha256=-lFhtPYSaYaS81Zh1CX9vxx0lvQDpAUsTBRNT48ne94,1611 +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=dTndJxA-F1IE_nMUOtf1sRr7Kq2s_8yjgKk6mkWkVu4,486 +django/contrib/redirects/locale/en_AU/LC_MESSAGES/django.po,sha256=CcP5GVZaImhRgohA5zy5K3rCscOlBtn81DB-V26-Wxg,958 +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=pZo0DSbfGGTHi-jgaTGp29kJK-iplaai-WXJoOPluMA,1138 +django/contrib/redirects/locale/eo/LC_MESSAGES/django.po,sha256=3AxFPHffYw3svHe-MR3zuVGLMtkJPL_SX_vB_ztx98c,1414 +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=10TVT6ftY7UuZwJsUImwNuqo6mcHGgVG-YVNiyGd9Y4,1097 +django/contrib/redirects/locale/et/LC_MESSAGES/django.po,sha256=fI2Wf7WcAV2n-weyPMrQot-c7VOtciTks6QzGzh_RQE,1404 +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=blwOMshClFZKvOZXVvqENK_E_OkdS1ydbjQCDXcHXd4,1075 +django/contrib/redirects/locale/ga/LC_MESSAGES/django.po,sha256=76rdrG4GVbcKwgUQN4bB-B0t6hpivCA_ehf4uzGM_mY,1341 +django/contrib/redirects/locale/gd/LC_MESSAGES/django.mo,sha256=D_gqvGcUh2X9888kwDdFG1tjuAJUtQ2LhK4K4xCyiuI,1219 +django/contrib/redirects/locale/gd/LC_MESSAGES/django.po,sha256=PnKpFPVIzSpflfuobqU6Z5aV3ke5kNWJHWfDl1oCF3w,1397 +django/contrib/redirects/locale/gl/LC_MESSAGES/django.mo,sha256=LoMrpBThJSmWzZ1wT66xGndnNCVCOq2eCEyo88qKwkA,1127 +django/contrib/redirects/locale/gl/LC_MESSAGES/django.po,sha256=d8qXhC2wI45yXtFJuMBgibzHsCkZSxAD3I6pVdpxlSU,1313 +django/contrib/redirects/locale/he/LC_MESSAGES/django.mo,sha256=MnCcK4Vb3Z5ZQ2A52tb0kM60hmoHQJ0UrWcrhuI2RK0,1204 +django/contrib/redirects/locale/he/LC_MESSAGES/django.po,sha256=gjFr6b15s5JoAT6OoLCA3ApfwiqZ_vhB-EXEWOiUEwo,1427 +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=O7EKMm1GR4o1JXQV5vFP58nFK-__2evesMPJFucOxsc,1067 +django/contrib/redirects/locale/id/LC_MESSAGES/django.po,sha256=4qK_1_82j2RmRm4d6JWMskOCy1QIeuNral9xP1x2s10,1364 +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=gE1gwugGwKaDtpGI1PuThkuy8rBhxpoAO8Ecucp1iUY,1133 +django/contrib/redirects/locale/ja/LC_MESSAGES/django.po,sha256=aXGFOdUr825bNhtXi8ZMTLysw6MydtkIoztqPT1qO38,1402 +django/contrib/redirects/locale/ka/LC_MESSAGES/django.mo,sha256=0aOLKrhUX6YAIMNyt6KES9q2iFk2GupEr76WeGlJMkk,1511 +django/contrib/redirects/locale/ka/LC_MESSAGES/django.po,sha256=bK3ULAIG00Nszoz74r-W3W8CihaoijYkWlc6sUqJXrg,1720 +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=k3TtiYJ7x50M19DCu2eLcsCroKusJ3paiC2RvZ-920A,1473 +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=-gqNBZVFvxqOiPWUb9jH4myXufHHfdyr_yROTfpk2jU,1396 +django/contrib/redirects/locale/kn/LC_MESSAGES/django.po,sha256=qFM2v3ys7E5u-WJE7CR-2IMrDTqFjNq96OQ1syMDWoI,1588 +django/contrib/redirects/locale/ko/LC_MESSAGES/django.mo,sha256=RJRxocjiFAeDTEVtAawhpkv99axVeNmLDyBhwmjGCcM,1079 +django/contrib/redirects/locale/ko/LC_MESSAGES/django.po,sha256=QNDHQmvOgJnfpv9vMIIZVw--4YXSArJeOJks75m3zKo,1445 +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=3D3sSO1D9XyRpiT57l-0emy7V11uKCWJYqpEzmmpUzE,1377 +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=2Z5jaGJzpiJTCnhCk8ulCDeAdj-WwR99scdHFPRoHoA,468 +django/contrib/redirects/locale/mr/LC_MESSAGES/django.po,sha256=0aGKTlriCJoP-Tirl-qCl7tjjpjURhgCjRGmurHVO3c,940 +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=uGVQu5YnzWjf2aBtxY2ZdCHXz7M8T2GKz5EcQ20ODvM,1080 +django/contrib/redirects/locale/nl/LC_MESSAGES/django.po,sha256=fnEiqRdM-BOP2_6v4U-FC4cCmcVgXAXloiWKhYu-uOE,1400 +django/contrib/redirects/locale/nn/LC_MESSAGES/django.mo,sha256=oiw7wSgqGUrHIdec6sIa7OlHXGME5iWA9h1UUlhl6Mw,1072 +django/contrib/redirects/locale/nn/LC_MESSAGES/django.po,sha256=pfu1XKvB-9DS_5dAbvjGzZCKAYxBEtnStJlBJxRSEXk,1267 +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=SkjPoylTfT7ygiHOT6M5BbhcL1J5lG8MvSwSHfVC5cU,1281 +django/contrib/redirects/locale/pl/LC_MESSAGES/django.po,sha256=9YkvmU8c4jRRUm4JijWq-tKwAqMp3A1BBxVcG0reHAU,1601 +django/contrib/redirects/locale/pt/LC_MESSAGES/django.mo,sha256=WocPaVk3fQEz_MLmGVtFBGwsThD-gNU7GDocqEbeaBA,1129 +django/contrib/redirects/locale/pt/LC_MESSAGES/django.po,sha256=ptCzoE41c9uFAbgSjb6VHSFYPEUv_51YyBdoThXN3XA,1350 +django/contrib/redirects/locale/pt_BR/LC_MESSAGES/django.mo,sha256=LxFEZCH75ucCaB5fEmdsjEJi5aJa3barRLqcd6r-gj0,1171 +django/contrib/redirects/locale/pt_BR/LC_MESSAGES/django.po,sha256=PO5whkwiagEN_s8ViBDN41dW35wdjAuXZBB1j2m09lY,1615 +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=4U3JX_UnnYmBNtKseSUobgTslILeZWfn37Dg7q52svY,1160 +django/contrib/redirects/locale/sk/LC_MESSAGES/django.po,sha256=8tDwfdkGAXo4eAR66nfkIdegbyjc3-qBfrMZgrf_cF4,1376 +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=f2HyVjWFGnjNXV-EIk0YMFaMH6_ZwYLYgSDwU4fIJfM,1165 +django/contrib/redirects/locale/sq/LC_MESSAGES/django.po,sha256=gbd4JxoevGfDTRx3iYfDtlnh54EwyRKYXxs4XagHvRM,1453 +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=y1KpTjzF2FWY_x373UyaEFTTNYPT6hroB6zvA1ev010,1147 +django/contrib/redirects/locale/sv/LC_MESSAGES/django.po,sha256=7Us64PRHRyIZ8D7lY6HCef9xXnoSfwWI3YYtlNEaFSo,1362 +django/contrib/redirects/locale/sw/LC_MESSAGES/django.mo,sha256=oJnTp9CTgNsg5TSOV_aPZIUXdr6-l65hAZbaARZCO2w,1078 +django/contrib/redirects/locale/sw/LC_MESSAGES/django.po,sha256=CTVwA3O7GUQb7l1WpbmT8kOfqr7DpqnIyQt3HWJ6YTQ,1245 +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=KhWOArsItusTEzoZZflZ75hl9hhMU0lkm_p8foe8QiU,1113 +django/contrib/redirects/locale/tk/LC_MESSAGES/django.po,sha256=nBeAakgUKhHB21jEiwFrwLSyrJq2XYl8-N6Tq1Klq_Q,1292 +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/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=-H2o5p5v8j5RqKZ6vOsWToFWGOn8CaO3KSTiU42Zqjk,1071 +django/contrib/redirects/locale/zh_Hant/LC_MESSAGES/django.po,sha256=fQicS5nmJLgloKM83l6NcSJp36-Wjn2Dl9jf03e0pGo,1334 +django/contrib/redirects/middleware.py,sha256=kJfTIj8G2loRgiEJkqiYEredzt4xhNAfDaTZkk9Coyo,1926 +django/contrib/redirects/migrations/0001_initial.py,sha256=-JUuBA7Ynmpo_RHV-_uQR2x-yT6RbJs9SwTpA_PwuAQ,1498 +django/contrib/redirects/migrations/0002_alter_redirect_new_path_help_text.py,sha256=JwejmL986nbhP88Qa2PZxukFxv1B8g0pTzSc0tBbWpw,636 +django/contrib/redirects/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/redirects/migrations/__pycache__/0001_initial.cpython-38.pyc,, +django/contrib/redirects/migrations/__pycache__/0002_alter_redirect_new_path_help_text.cpython-38.pyc,, +django/contrib/redirects/migrations/__pycache__/__init__.cpython-38.pyc,, +django/contrib/redirects/models.py,sha256=dN6ZpYv4KgAXR6bhycqa5iE3pLFIC1fSj7PZBbeVED0,1046 +django/contrib/sessions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/sessions/__pycache__/__init__.cpython-38.pyc,, +django/contrib/sessions/__pycache__/apps.cpython-38.pyc,, +django/contrib/sessions/__pycache__/base_session.cpython-38.pyc,, +django/contrib/sessions/__pycache__/exceptions.cpython-38.pyc,, +django/contrib/sessions/__pycache__/middleware.cpython-38.pyc,, +django/contrib/sessions/__pycache__/models.cpython-38.pyc,, +django/contrib/sessions/__pycache__/serializers.cpython-38.pyc,, +django/contrib/sessions/apps.py,sha256=q_fkp7a7_1GT14XHkHgNIET0sItgfBeFT7B137_KeZM,194 +django/contrib/sessions/backends/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/sessions/backends/__pycache__/__init__.cpython-38.pyc,, +django/contrib/sessions/backends/__pycache__/base.cpython-38.pyc,, +django/contrib/sessions/backends/__pycache__/cache.cpython-38.pyc,, +django/contrib/sessions/backends/__pycache__/cached_db.cpython-38.pyc,, +django/contrib/sessions/backends/__pycache__/db.cpython-38.pyc,, +django/contrib/sessions/backends/__pycache__/file.cpython-38.pyc,, +django/contrib/sessions/backends/__pycache__/signed_cookies.cpython-38.pyc,, +django/contrib/sessions/backends/base.py,sha256=LZGbZDSQdvRzOFq1l_Ir6FBBU_UlvDKPywQXo-OTAiM,13900 +django/contrib/sessions/backends/cache.py,sha256=-qeSz07gUidiY_xq7imMJ3SP17J_rLsIO50KxOhq_8E,2713 +django/contrib/sessions/backends/cached_db.py,sha256=c9JtGXxyJYRT7MMVrqwo0jw1v3JCpaBNXeL8d1tAfBE,2011 +django/contrib/sessions/backends/db.py,sha256=zzhv0nQ4OIFeyM2QXrIUG26l_IJosagKaGOI2NcZnz4,3770 +django/contrib/sessions/backends/file.py,sha256=0L3yDX0_eFtP9_GVl79OpRfHRtJ9o5vOUsRCYHFHOEA,7740 +django/contrib/sessions/backends/signed_cookies.py,sha256=L43gDpk-RFbMF_-fluEjzyUO5nKrEiCTX0yZs7cd5eI,2665 +django/contrib/sessions/base_session.py,sha256=5FofwClB_ukwCsXPfJbzUvKoYaMQ78B_lWXU0fqSg1k,1490 +django/contrib/sessions/exceptions.py,sha256=ckmS8rDOBIyTDE9PzBdD1VQKeYsYjFNHob3-n9Q5CPw,356 +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=DGp3j3E0-5bBjFCKx9c6Jcz9ZaXysd2DgVPuxROWDmU,783 +django/contrib/sessions/locale/bg/LC_MESSAGES/django.po,sha256=AEgnW2F8S85JZOh4JVJ6nLynsmHRZOBBoOluVxHosVo,942 +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/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=dTndJxA-F1IE_nMUOtf1sRr7Kq2s_8yjgKk6mkWkVu4,486 +django/contrib/sessions/locale/en_AU/LC_MESSAGES/django.po,sha256=gvnvUpim1l7oImnzPXqBww-Uz0TgGjzCLaaszpdkQ10,761 +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=NgJlLPsS9FXjRzKqGgUTkNG9puYrBRf0KQK-QqXMIxQ,916 +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=uQ2ZmtUNoVCB2mSlMGSy-j4a_hu9PBfJDo796d8beFA,701 +django/contrib/sessions/locale/gl/LC_MESSAGES/django.po,sha256=FovTLHdVK15N9FI9lFFAOP4zt7GsvO0kKdocgeVDkNk,902 +django/contrib/sessions/locale/he/LC_MESSAGES/django.mo,sha256=qhgjSWfGAOgl-i7iwzSrJttx88xcj1pB0iLkEK64mJU,809 +django/contrib/sessions/locale/he/LC_MESSAGES/django.po,sha256=gtBgkC2bpVyWm8B5pjV3-9tBo0xqUsJuJz2neN79isg,969 +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=MDOG7BAO8Ez75CfgERCq1zA3syJbvQKpc4wBVlryfqQ,950 +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=l5gu1XfvRMNhCHBl-NTGoUHWa0nRSxqSDt0zljpr7Kg,1024 +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=X5svX5_r3xZUy4OjUuo2gItc5PIOSjZOvE5IZwnM6Io,814 +django/contrib/sessions/locale/kn/LC_MESSAGES/django.po,sha256=Rq-I2veQe5l7Q7HG9pRY_mKeNcxhSRDgqphKbuNpoNc,961 +django/contrib/sessions/locale/ko/LC_MESSAGES/django.mo,sha256=EUyVQYGtiFJg01mP30a0iOqBYHvpzHAcGTZM28Ubs5Q,700 +django/contrib/sessions/locale/ko/LC_MESSAGES/django.po,sha256=PjntvSzRz_Aekj9VFhGsP5yO6rAsxTMzwFj58JqToIU,855 +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=7e5BmXuaHHgGX5W1eC6wIH2QyMTNOg4JZjkZM0i-jTc,952 +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=2Z5jaGJzpiJTCnhCk8ulCDeAdj-WwR99scdHFPRoHoA,468 +django/contrib/sessions/locale/mr/LC_MESSAGES/django.po,sha256=FQRdZ-qIDuvTCrwbnWfxoxNi8rywLSebcNbxGvr-hb0,743 +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=042gOyJuXb51nG7gxI_rYst9QWuB3thtAeevKpDLFVQ,695 +django/contrib/sessions/locale/nn/LC_MESSAGES/django.po,sha256=j2kDL1vDsHoBX_ky6_S0tWxaqFst6v7OLqqlt6N2ECI,842 +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=JIvzoKw_r4jZXWEaHvIYAZDAzrEkfpr0WM9dNfUlzBE,924 +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/uk/LC_MESSAGES/django.mo,sha256=jzNrLuFghQMCHNRQ0ihnKMCicgear0yWiTOLnvdPszw,841 +django/contrib/sessions/locale/uk/LC_MESSAGES/django.po,sha256=GM9kNL1VoFSRfbHB5KiivIbp-nJl1aZ69wL2xszNqlM,1017 +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=WZzfpFKZ41Pu8Q9SuhGu3hXwp4eiq8Dt8vdiQfxvF9M,733 +django/contrib/sessions/locale/zh_Hant/LC_MESSAGES/django.po,sha256=6IRDQu6-PAYh6SyEIcKdhuR172lX0buY8qqsU0QXlYU,898 +django/contrib/sessions/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/sessions/management/__pycache__/__init__.cpython-38.pyc,, +django/contrib/sessions/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/sessions/management/commands/__pycache__/__init__.cpython-38.pyc,, +django/contrib/sessions/management/commands/__pycache__/clearsessions.cpython-38.pyc,, +django/contrib/sessions/management/commands/clearsessions.py,sha256=MUZi9sKifcRq9_6WsGD9CbGsdBW6IwSFt-Nba0RaEuw,679 +django/contrib/sessions/middleware.py,sha256=kzP7OIxHKduwDhnME1K-mi9WW7yfERXoF-cn4RPDWgk,3568 +django/contrib/sessions/migrations/0001_initial.py,sha256=F7fzk2d9hDPjUwx2w-lXdZcFG1h4HyHnkfcJ6aK7C-0,955 +django/contrib/sessions/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/sessions/migrations/__pycache__/0001_initial.cpython-38.pyc,, +django/contrib/sessions/migrations/__pycache__/__init__.cpython-38.pyc,, +django/contrib/sessions/models.py,sha256=vmROoszsXHnPHoSbFca8k-U9Z8Wg6EAHYeEK87VHHk8,1257 +django/contrib/sessions/serializers.py,sha256=clq2ENNQ3ujEuuc5gHSDvaz30kWWHelnQPY6tzUu0qs,424 +django/contrib/sitemaps/__init__.py,sha256=JigPeY8NHVtVjZcHM2p0kfI0_I0o4LoXlvjpOQ4NWV4,7705 +django/contrib/sitemaps/__pycache__/__init__.cpython-38.pyc,, +django/contrib/sitemaps/__pycache__/apps.cpython-38.pyc,, +django/contrib/sitemaps/__pycache__/views.cpython-38.pyc,, +django/contrib/sitemaps/apps.py,sha256=ZV4hW6wALz7H60KWKpx68lz0sLBdM4uD5nQ2LRjfHRg,249 +django/contrib/sitemaps/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/sitemaps/management/__pycache__/__init__.cpython-38.pyc,, +django/contrib/sitemaps/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/sitemaps/management/commands/__pycache__/__init__.cpython-38.pyc,, +django/contrib/sitemaps/management/commands/__pycache__/ping_google.cpython-38.pyc,, +django/contrib/sitemaps/management/commands/ping_google.py,sha256=gqfCpod-Wp3nFBc8mpWhbP2QSWsWE74IJ-hlcm8_7SY,558 +django/contrib/sitemaps/templates/sitemap.xml,sha256=L092SHTtwtmNJ_Lj_jLrzHhfI0-OKKIw5fpyOfr4qRs,683 +django/contrib/sitemaps/templates/sitemap_index.xml,sha256=VqDmRlWMx9kC6taiBoi1h9JVspV54ou3nFjE8Nfofl8,209 +django/contrib/sitemaps/views.py,sha256=mW1KQu9EA-wixh4jc01tB27JmuiGLTO0OG7sZmM2-ns,3532 +django/contrib/sites/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/sites/__pycache__/__init__.cpython-38.pyc,, +django/contrib/sites/__pycache__/admin.cpython-38.pyc,, +django/contrib/sites/__pycache__/apps.cpython-38.pyc,, +django/contrib/sites/__pycache__/checks.cpython-38.pyc,, +django/contrib/sites/__pycache__/management.cpython-38.pyc,, +django/contrib/sites/__pycache__/managers.cpython-38.pyc,, +django/contrib/sites/__pycache__/middleware.cpython-38.pyc,, +django/contrib/sites/__pycache__/models.cpython-38.pyc,, +django/contrib/sites/__pycache__/requests.cpython-38.pyc,, +django/contrib/sites/__pycache__/shortcuts.cpython-38.pyc,, +django/contrib/sites/admin.py,sha256=ClzCRn4fUPWO1dNlEWEPjSDInnK87XbNRmadvjYs1go,214 +django/contrib/sites/apps.py,sha256=fdo4csb3NT4qt_AhCGaYmbkRLSZFqztKPXHnShGkgjY,562 +django/contrib/sites/checks.py,sha256=hUrMy0WTDkv-WSjnePl4rkdOi36qQLgenqXpu65w8NM,350 +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/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=dTndJxA-F1IE_nMUOtf1sRr7Kq2s_8yjgKk6mkWkVu4,486 +django/contrib/sites/locale/en_AU/LC_MESSAGES/django.po,sha256=7V9dBdbfHa9aGAfs9nw6ivSxX30CqaYc1ptfplTAPJc,791 +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=uL2I9XjqIxqTUKf6buewtm9rwflM23pxspFMs7w4SPM,1088 +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=g5popLirHXWn6ZWJHESQaG5MmKWZL_JNI_5Vgn5FTqU,683 +django/contrib/sites/locale/ga/LC_MESSAGES/django.po,sha256=34hj3ELt7GQ7CaHL246uBDmvsVUaaN5kTrzt8j7eETM,962 +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=QUJdJV71VT-4iVQ5mUAeyszTVhD2LlmmPQv0WpPWttU,742 +django/contrib/sites/locale/gl/LC_MESSAGES/django.po,sha256=cLcejsFyoFk0fRX9fAcl9owHoxiD593QZZeZTfObBVw,940 +django/contrib/sites/locale/he/LC_MESSAGES/django.mo,sha256=L3bganfG4gHqp2WXGh4rfWmmbaIxHaGc7-ypAqjSL_E,820 +django/contrib/sites/locale/he/LC_MESSAGES/django.po,sha256=nT0Gu0iWpFV7ZJ6SAdcogZccCz3CV-R5rgqwEl5NA6c,985 +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=BCsMvNq-3Pi9-VnUvpUQaGx6pbCgI8rCcIHUA8VL4as,1155 +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=9ixNnoE3BxfBj4Xza0FM5qInd0uiNnAlXgDb_KaICn4,1057 +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=fikclDn-FKU_t9lZeBtQciisS3Kqv4tJHtu923OXLJI,676 +django/contrib/sites/locale/kn/LC_MESSAGES/django.po,sha256=p_P7L0KAUoKNLH8vuHV4_2mTWK1m1tjep5XgRqbWd2k,904 +django/contrib/sites/locale/ko/LC_MESSAGES/django.mo,sha256=wlfoWG-vmMSCipUJVVC0Y_W7QbGNNE-oEnVwl_6-AmY,807 +django/contrib/sites/locale/ko/LC_MESSAGES/django.po,sha256=TENAk9obGUxFwMnJQj_V9sZxEKJj4DyWMuGpx3Ft_pM,1049 +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=9q7QfFf_IR2A1Cr_9aLVIWf-McR0LivtRC284w2_bo0,1124 +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=2Z5jaGJzpiJTCnhCk8ulCDeAdj-WwR99scdHFPRoHoA,468 +django/contrib/sites/locale/mr/LC_MESSAGES/django.po,sha256=pqnjF5oxvpMyjijy6JfI8qJbbbowZzE5tZF0DMYiCBs,773 +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=m1SUw5bhDUemD8yMGDxcWdhbUMtzZ9WXWXtV2AHIzBs,633 +django/contrib/sites/locale/nn/LC_MESSAGES/django.po,sha256=i8BQyewiU2ymkAkj12M2MJBVbCJPp8PB8_NcQiScaD4,861 +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=L2YRNq26DdT3OUFhw25ncZBgs232v6kSsAUTc0beIC8,1019 +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=qmhdn3N2C_DR_FYrUaFSacVjghgfb0CuWKanVRJSTq8,792 +django/contrib/sites/locale/sv/LC_MESSAGES/django.po,sha256=dDVuuuHGpZIoT6dU48aT2j4nEuGrd6zZ3FiZEs3TCeE,987 +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/uk/LC_MESSAGES/django.mo,sha256=H4806mPqOoHJFm549F7drzsfkvAXWKmn1w_WVwQx9rk,960 +django/contrib/sites/locale/uk/LC_MESSAGES/django.po,sha256=jmJKTuGLhfP4rg8M_d86XR4X8qYB-JAtEf6jRKuzi3w,1187 +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=0F6Qmh1smIXlOUNDaDwDajyyGecc1azfwh8BhXrpETo,790 +django/contrib/sites/locale/zh_Hant/LC_MESSAGES/django.po,sha256=ixbXNBNKNfrpI_B0O_zktTfo63sRFMOk1B1uIh4DGGg,1046 +django/contrib/sites/management.py,sha256=K6cgSOdN4ins_TiWjUIkGFwuibJmshTlFonqYT2QKrw,1597 +django/contrib/sites/managers.py,sha256=OJfKicEOuqcD0B7NuH4scszrknQZ-X1Nf1PL0XgWqLM,1929 +django/contrib/sites/middleware.py,sha256=qYcVHsHOg0VxQNS4saoLHkdF503nJR-D7Z01vE0SvUM,309 +django/contrib/sites/migrations/0001_initial.py,sha256=7plQm1loCP4AuC1wwCpXlX3Fw8q5V0T6Vxi7lNzbyoY,1068 +django/contrib/sites/migrations/0002_alter_domain_unique.py,sha256=HECWqP0R0hp77p_ubI5bI9DqEXIiGOTTszAr4EpgtVE,517 +django/contrib/sites/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/sites/migrations/__pycache__/0001_initial.cpython-38.pyc,, +django/contrib/sites/migrations/__pycache__/0002_alter_domain_unique.cpython-38.pyc,, +django/contrib/sites/migrations/__pycache__/__init__.cpython-38.pyc,, +django/contrib/sites/models.py,sha256=fChMnUtphdlXyzGPh7uSDzjWBS3xJ0mIpjLRFk1Z54E,3696 +django/contrib/sites/requests.py,sha256=74RhONzbRqEGoNXLu4T7ZjAFKYvCLmY_XQWnGRz6jdw,640 +django/contrib/sites/shortcuts.py,sha256=RZr1iT8zY_z8o52PIWEBFCQL03pE28pp6708LveS240,581 +django/contrib/staticfiles/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/staticfiles/__pycache__/__init__.cpython-38.pyc,, +django/contrib/staticfiles/__pycache__/apps.cpython-38.pyc,, +django/contrib/staticfiles/__pycache__/checks.cpython-38.pyc,, +django/contrib/staticfiles/__pycache__/finders.cpython-38.pyc,, +django/contrib/staticfiles/__pycache__/handlers.cpython-38.pyc,, +django/contrib/staticfiles/__pycache__/storage.cpython-38.pyc,, +django/contrib/staticfiles/__pycache__/testing.cpython-38.pyc,, +django/contrib/staticfiles/__pycache__/urls.cpython-38.pyc,, +django/contrib/staticfiles/__pycache__/utils.cpython-38.pyc,, +django/contrib/staticfiles/__pycache__/views.cpython-38.pyc,, +django/contrib/staticfiles/apps.py,sha256=4682vA5WgXhJ8DgOFQmGTBBw3b-xsYjkV1n-TVIc25o,423 +django/contrib/staticfiles/checks.py,sha256=rH9A8NIYtEkA_PRYXQJxndm243O6Mz6GwyqWSUe3f24,391 +django/contrib/staticfiles/finders.py,sha256=D_M2N12Tvwn8P3vcmh4yCJhjNf4x_wB0uapXDsThmCE,10366 +django/contrib/staticfiles/handlers.py,sha256=dxjjvVISnAlCmFebHdiylRT16Ac2ddPXtu8WL0Dr49w,3462 +django/contrib/staticfiles/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/staticfiles/management/__pycache__/__init__.cpython-38.pyc,, +django/contrib/staticfiles/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/staticfiles/management/commands/__pycache__/__init__.cpython-38.pyc,, +django/contrib/staticfiles/management/commands/__pycache__/collectstatic.cpython-38.pyc,, +django/contrib/staticfiles/management/commands/__pycache__/findstatic.cpython-38.pyc,, +django/contrib/staticfiles/management/commands/__pycache__/runserver.cpython-38.pyc,, +django/contrib/staticfiles/management/commands/collectstatic.py,sha256=8l6nSPW7RZr_spM67tZmUvlGC_43BB_xEr_N9Ku8d34,14932 +django/contrib/staticfiles/management/commands/findstatic.py,sha256=m4EXJJQwzvYGOPrcANJe3ihZPWGAZV5lvky8jAbZdKI,1561 +django/contrib/staticfiles/management/commands/runserver.py,sha256=uv-h6a8AOs0c92ILT_3Mu0UTBoCiQzThpUEmR-blj70,1318 +django/contrib/staticfiles/storage.py,sha256=FglRyoP7UuJdOSHuTud8Cukzwn8Lcb4_XmCJUVAiTsA,17618 +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=S-x2G7gXp67kjJ8cKLCljXETZt20UqsRdhjPyJTbLcg,2276 +django/contrib/staticfiles/views.py,sha256=43bHYTHVMWjweU_tqzXpBKEp7EtHru_7rwr2w7U-AZk,1261 +django/contrib/syndication/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/syndication/__pycache__/__init__.cpython-38.pyc,, +django/contrib/syndication/__pycache__/apps.cpython-38.pyc,, +django/contrib/syndication/__pycache__/views.cpython-38.pyc,, +django/contrib/syndication/apps.py,sha256=hXquFH_3BL6NNR2cxLU-vHlBJZ3OCjbcl8jkzCNvE64,203 +django/contrib/syndication/views.py,sha256=qjrDJkXOU8aJZosx9aIJcrAkkKCJrhy9kXXLeRUIBJA,8743 +django/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/core/__pycache__/__init__.cpython-38.pyc,, +django/core/__pycache__/asgi.cpython-38.pyc,, +django/core/__pycache__/exceptions.cpython-38.pyc,, +django/core/__pycache__/paginator.cpython-38.pyc,, +django/core/__pycache__/signals.cpython-38.pyc,, +django/core/__pycache__/signing.cpython-38.pyc,, +django/core/__pycache__/validators.cpython-38.pyc,, +django/core/__pycache__/wsgi.cpython-38.pyc,, +django/core/asgi.py,sha256=N2L3GS6F6oL-yD9Tu2otspCi2UhbRQ90LEx3ExOP1m0,386 +django/core/cache/__init__.py,sha256=bllGi5g80kdZnxPwEB_GmUlZouCy1Q9Y0UUJX8ZOHpw,2208 +django/core/cache/__pycache__/__init__.cpython-38.pyc,, +django/core/cache/__pycache__/utils.cpython-38.pyc,, +django/core/cache/backends/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/core/cache/backends/__pycache__/__init__.cpython-38.pyc,, +django/core/cache/backends/__pycache__/base.cpython-38.pyc,, +django/core/cache/backends/__pycache__/db.cpython-38.pyc,, +django/core/cache/backends/__pycache__/dummy.cpython-38.pyc,, +django/core/cache/backends/__pycache__/filebased.cpython-38.pyc,, +django/core/cache/backends/__pycache__/locmem.cpython-38.pyc,, +django/core/cache/backends/__pycache__/memcached.cpython-38.pyc,, +django/core/cache/backends/base.py,sha256=5FLTKYtLuI-mwMlpb6MAuaV3F9NK_zhYuBGEsYVv25M,10322 +django/core/cache/backends/db.py,sha256=GmfhmwwPGnJd3wH16qxj1m-RTRfGpRNJ-L7GQDZZd_M,11063 +django/core/cache/backends/dummy.py,sha256=DcfckCOdsfrmqarEQYyeLRDyI73PU3beCfltpofAYSc,1137 +django/core/cache/backends/filebased.py,sha256=6DqOisTScyE0F_q5xL6PmcIKqRiCERezNOkLnUPpNBo,5687 +django/core/cache/backends/locmem.py,sha256=BN3AG5c5A97q0nGAQKeaGNeB-xebRV1f40MKMRlmExg,4161 +django/core/cache/backends/memcached.py,sha256=7NsGWhex0mKKvT2OuVOJNg97e9Y_K__pmP1ru94_bfo,9298 +django/core/cache/utils.py,sha256=nf_f2V3ToTSwtFftQ8fNgN0tsGylo_IE8kTL_Vq7OaI,375 +django/core/checks/__init__.py,sha256=BPnStYHYfhBvSIONGxIKP2Xj-01niFcnCjtVGL0PG2A,994 +django/core/checks/__pycache__/__init__.cpython-38.pyc,, +django/core/checks/__pycache__/async_checks.cpython-38.pyc,, +django/core/checks/__pycache__/caches.cpython-38.pyc,, +django/core/checks/__pycache__/database.cpython-38.pyc,, +django/core/checks/__pycache__/messages.cpython-38.pyc,, +django/core/checks/__pycache__/model_checks.cpython-38.pyc,, +django/core/checks/__pycache__/registry.cpython-38.pyc,, +django/core/checks/__pycache__/templates.cpython-38.pyc,, +django/core/checks/__pycache__/translation.cpython-38.pyc,, +django/core/checks/__pycache__/urls.cpython-38.pyc,, +django/core/checks/async_checks.py,sha256=rtYPbvAzZUbB23OTdfJgArNhVGCrepctB82PLaFTZ9k,403 +django/core/checks/caches.py,sha256=zrr_yP3FuSBo8rll_UtL6DrWEpJfQNTLldyMgFXij4w,2547 +django/core/checks/compatibility/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/core/checks/compatibility/__pycache__/__init__.cpython-38.pyc,, +django/core/checks/database.py,sha256=sBj-8o4DmpG5QPy1KXgXtZ0FZ0T9xdlT4XBIc70wmEQ,341 +django/core/checks/messages.py,sha256=ZbasGH7L_MeIGIwb_nYiO9Z_MXF0-aXO1ru2xFACj6Y,2161 +django/core/checks/model_checks.py,sha256=8j97FXQ2mTTNhOQcFhlvxFkoMXiAn4ezqqN4t44Y3G4,8597 +django/core/checks/registry.py,sha256=rt9v24JoPrCd1BV1rsAWAJN7FUGOMhIV1-QhEEKu_Fk,3239 +django/core/checks/security/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/core/checks/security/__pycache__/__init__.cpython-38.pyc,, +django/core/checks/security/__pycache__/base.cpython-38.pyc,, +django/core/checks/security/__pycache__/csrf.cpython-38.pyc,, +django/core/checks/security/__pycache__/sessions.cpython-38.pyc,, +django/core/checks/security/base.py,sha256=tDSpqh4E-9Rc9sP35V-kupb7vPY9JQc6lNoKYNLFKCo,8149 +django/core/checks/security/csrf.py,sha256=OKfJW-_gkbpY9EGmgHnE-uDunzzsr-JJS6zzUK8Ah50,2044 +django/core/checks/security/sessions.py,sha256=vvsxKEwb3qHgnCG0R5KUkfUpMHuZMfxjo9-X-2BTp-4,2558 +django/core/checks/templates.py,sha256=9_qZn_MWX94i209MVu2uS66NPRgbKWtk_XxetKczyfU,1092 +django/core/checks/translation.py,sha256=CkywI7a5HvzyWeJxKGaj54AKIynfxSMswGgg6NVV2LM,1974 +django/core/checks/urls.py,sha256=lA8wbw2WDC-e4ZAr-9ooEWtGvrNyMh1G-MZbojGq9W8,3246 +django/core/exceptions.py,sha256=tv-SBj73Sr-UJhkZIpCP0ZZVptXWuhVf-gih6DRMlg8,6231 +django/core/files/__init__.py,sha256=OjalFLvs-vPaTE3vP0eYZWyNwMj9pLJZNgG4AcGn2_Y,60 +django/core/files/__pycache__/__init__.cpython-38.pyc,, +django/core/files/__pycache__/base.cpython-38.pyc,, +django/core/files/__pycache__/images.cpython-38.pyc,, +django/core/files/__pycache__/locks.cpython-38.pyc,, +django/core/files/__pycache__/move.cpython-38.pyc,, +django/core/files/__pycache__/storage.cpython-38.pyc,, +django/core/files/__pycache__/temp.cpython-38.pyc,, +django/core/files/__pycache__/uploadedfile.cpython-38.pyc,, +django/core/files/__pycache__/uploadhandler.cpython-38.pyc,, +django/core/files/__pycache__/utils.cpython-38.pyc,, +django/core/files/base.py,sha256=jsYsE3bNpAgaQcUvTE8m1UTj6HVXkHd4bh-Y38JmF84,4812 +django/core/files/images.py,sha256=jmF29FQ1RHZ1Sio6hNjJ6FYVAiz5JQTkAyqX7qWSAFA,2569 +django/core/files/locks.py,sha256=pOsArksRTvk1wn8Sm1dribFKmvcsZZcfc6ew4wcyuXQ,3583 +django/core/files/move.py,sha256=_4xGm6hCV05X54VY0AkEjYFaNcN85x3hablD2J9jyS4,2973 +django/core/files/storage.py,sha256=oCM3Ro-Dl_WMgJPg6q5K2pKdhX972VNote_gijJNrsU,14927 +django/core/files/temp.py,sha256=yy1ye2buKU2PB884jKmzp8jBGIPbPhCa3nflXulVafQ,2491 +django/core/files/uploadedfile.py,sha256=_FZW5J9ewwE2oZmT0qhfT9bQmuryzvSkXMPWFr0CU8A,3990 +django/core/files/uploadhandler.py,sha256=R6Eyg7K2H-oOaer-OjFSWAV7H_4Z0jRbK6UAF759p3Y,6958 +django/core/files/utils.py,sha256=kfeJJWwFgGtwBmQhupLA-ufvEv_6PJBLcBdHafLPHuE,2659 +django/core/handlers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/core/handlers/__pycache__/__init__.cpython-38.pyc,, +django/core/handlers/__pycache__/asgi.cpython-38.pyc,, +django/core/handlers/__pycache__/base.cpython-38.pyc,, +django/core/handlers/__pycache__/exception.cpython-38.pyc,, +django/core/handlers/__pycache__/wsgi.cpython-38.pyc,, +django/core/handlers/asgi.py,sha256=S7STi-d4_-2np_jqjdZZpYuU_2enrfPnGCTZvsTuYdo,11170 +django/core/handlers/base.py,sha256=jtGOg6E_whcOF6nmSfqx4iqke0mPYO1KD0Dc6a4ZNoY,14427 +django/core/handlers/exception.py,sha256=dJzaaOP67wPexKjofiqH68_sUVaBW_uJpXi0J26BkCM,5646 +django/core/handlers/wsgi.py,sha256=qIfieIyZapfpIR1GmuIaBejuI9brrv_Po3SezAd-glQ,7829 +django/core/mail/__init__.py,sha256=LS59oJ0C1vGsNtVcAoEyLgYlDIAHVnHMLfqiMDauQfE,4875 +django/core/mail/__pycache__/__init__.cpython-38.pyc,, +django/core/mail/__pycache__/message.cpython-38.pyc,, +django/core/mail/__pycache__/utils.cpython-38.pyc,, +django/core/mail/backends/__init__.py,sha256=VJ_9dBWKA48MXBZXVUaTy9NhgfRonapA6UAjVFEPKD8,37 +django/core/mail/backends/__pycache__/__init__.cpython-38.pyc,, +django/core/mail/backends/__pycache__/base.cpython-38.pyc,, +django/core/mail/backends/__pycache__/console.cpython-38.pyc,, +django/core/mail/backends/__pycache__/dummy.cpython-38.pyc,, +django/core/mail/backends/__pycache__/filebased.cpython-38.pyc,, +django/core/mail/backends/__pycache__/locmem.cpython-38.pyc,, +django/core/mail/backends/__pycache__/smtp.cpython-38.pyc,, +django/core/mail/backends/base.py,sha256=f9Oeaw1RAiPHmsTdQakeYzEabfOtULz0UvldP4Cydpk,1660 +django/core/mail/backends/console.py,sha256=l1XFESBbk1Ney5bUgjCYVPoSDzjobzIK3GMQyxQX1Qk,1402 +django/core/mail/backends/dummy.py,sha256=sI7tAa3MfG43UHARduttBvEAYYfiLasgF39jzaZPu9E,234 +django/core/mail/backends/filebased.py,sha256=yriBReURf6y1c9fT2vnA2f_czy9cRJ9fSMipq9BX7tE,2300 +django/core/mail/backends/locmem.py,sha256=OgTK_4QGhsBdqtDKY6bwYNKw2MXudc0PSF5GNVqS7gk,884 +django/core/mail/backends/smtp.py,sha256=wJ3IsY94ust3PtXDUu-Vf59BuRUZIKb0ivJ7YCocKL0,5262 +django/core/mail/message.py,sha256=k7fyPYk6ecQTHDia6gfOSgv7LKrmR7L3hLku5egVL8Y,17026 +django/core/mail/utils.py,sha256=us5kx4w4lSev93Jjpv9chldLuxh3dskcQ1yDVS09MgM,506 +django/core/management/__init__.py,sha256=VqzDcs6AU0NtaVjRPmdapdMUFsIyV0m9N1hjIFkmr-M,17079 +django/core/management/__pycache__/__init__.cpython-38.pyc,, +django/core/management/__pycache__/base.cpython-38.pyc,, +django/core/management/__pycache__/color.cpython-38.pyc,, +django/core/management/__pycache__/sql.cpython-38.pyc,, +django/core/management/__pycache__/templates.cpython-38.pyc,, +django/core/management/__pycache__/utils.cpython-38.pyc,, +django/core/management/base.py,sha256=lrUiEhdj5zC3jh97GR3x_gNSVfWPFmQGYTLk3uT9GXU,22671 +django/core/management/color.py,sha256=Hd3YHJqt_mvIZvpECw50C4dNsk1pj3F9vDSXnLS_pg0,2854 +django/core/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/core/management/commands/__pycache__/__init__.cpython-38.pyc,, +django/core/management/commands/__pycache__/check.cpython-38.pyc,, +django/core/management/commands/__pycache__/compilemessages.cpython-38.pyc,, +django/core/management/commands/__pycache__/createcachetable.cpython-38.pyc,, +django/core/management/commands/__pycache__/dbshell.cpython-38.pyc,, +django/core/management/commands/__pycache__/diffsettings.cpython-38.pyc,, +django/core/management/commands/__pycache__/dumpdata.cpython-38.pyc,, +django/core/management/commands/__pycache__/flush.cpython-38.pyc,, +django/core/management/commands/__pycache__/inspectdb.cpython-38.pyc,, +django/core/management/commands/__pycache__/loaddata.cpython-38.pyc,, +django/core/management/commands/__pycache__/makemessages.cpython-38.pyc,, +django/core/management/commands/__pycache__/makemigrations.cpython-38.pyc,, +django/core/management/commands/__pycache__/migrate.cpython-38.pyc,, +django/core/management/commands/__pycache__/runserver.cpython-38.pyc,, +django/core/management/commands/__pycache__/sendtestemail.cpython-38.pyc,, +django/core/management/commands/__pycache__/shell.cpython-38.pyc,, +django/core/management/commands/__pycache__/showmigrations.cpython-38.pyc,, +django/core/management/commands/__pycache__/sqlflush.cpython-38.pyc,, +django/core/management/commands/__pycache__/sqlmigrate.cpython-38.pyc,, +django/core/management/commands/__pycache__/sqlsequencereset.cpython-38.pyc,, +django/core/management/commands/__pycache__/squashmigrations.cpython-38.pyc,, +django/core/management/commands/__pycache__/startapp.cpython-38.pyc,, +django/core/management/commands/__pycache__/startproject.cpython-38.pyc,, +django/core/management/commands/__pycache__/test.cpython-38.pyc,, +django/core/management/commands/__pycache__/testserver.cpython-38.pyc,, +django/core/management/commands/check.py,sha256=ForUXuDlVDXWrt6xeMo6bC8E3XoC9g2BkzFG8lgqUZg,2460 +django/core/management/commands/compilemessages.py,sha256=hLywDb4YQon5qWmDT0S7yfJUrOMuCgjvo061Z2vQ7SE,6749 +django/core/management/commands/createcachetable.py,sha256=4s1T7DVbgO4qONQqgNSqsd9-vxz7vRfhyXSM3JMl2NE,4292 +django/core/management/commands/dbshell.py,sha256=_xJesr2QTeJVXrFpFoOqDe29Dzz7xdAkB4FbgAjo1UE,1652 +django/core/management/commands/diffsettings.py,sha256=K5HU5H75py6854mm-iJbN_MN9DE7Hjk_TjPnPgkmOT8,3370 +django/core/management/commands/dumpdata.py,sha256=jIeeHp3jXmf8dhoiFCx3AJ4OD2K0gsg21XqZCP-Ahpk,10395 +django/core/management/commands/flush.py,sha256=ALubZDzzOlxRfzsxBt-3YDLkDBEYHlff7DBLiEpN0Go,3527 +django/core/management/commands/inspectdb.py,sha256=uvY5BAlhqEthYOSBthkvqI1JSpAWcYPNflAfjW07FFU,13810 +django/core/management/commands/loaddata.py,sha256=zFEYTesoAK9PB57JlttgCgwhpONfDV2GTNMNBIfOUIE,14632 +django/core/management/commands/makemessages.py,sha256=hP8OfT5QmdYPv0X069GqguOGI5oBAJJJ3BGK_WxXWVo,26517 +django/core/management/commands/makemigrations.py,sha256=I7NYrtBxHC74R4Yd4ajy9BurEXpz5VBq40GQEYOksrw,15241 +django/core/management/commands/migrate.py,sha256=rMLWzdPyiZTm6bf-E06wnfYdSB6QnqfwEWxT4i1irw0,16863 +django/core/management/commands/runserver.py,sha256=ejXjKOJgI1Y41ldHKac34lBYZB4usKa5g8iNjGCYkHE,6267 +django/core/management/commands/sendtestemail.py,sha256=LsiP5Xg4AWLtc0vS0JinaaAAKjBbLUnfCq0pa0r4FFw,1456 +django/core/management/commands/shell.py,sha256=5cd91a465PQ3SUdmQA07IwTj2VyPP-EQIAZiFFZTE_o,4049 +django/core/management/commands/showmigrations.py,sha256=EYtkzVgj_utUogsQ_y7qoCpMQvAXY1u4KchtcVdH7hU,5855 +django/core/management/commands/sqlflush.py,sha256=SKRkk3MXuo7zc8ooWhxBZLdLJShD-VzaTJiGBn5AU6Q,928 +django/core/management/commands/sqlmigrate.py,sha256=iSaF13OoO5jSeW4mK-8WlnUaYkkb2Q1mJO_4dRPoHPc,3102 +django/core/management/commands/sqlsequencereset.py,sha256=whux0yEJxQDbZ-6B_PYOnAVkcrwLUZOrca0ZFynh97w,982 +django/core/management/commands/squashmigrations.py,sha256=TjKfRi5f_oXJJsTS5a0z5S9RP-Peb00Dqf_uaiJdFHg,9728 +django/core/management/commands/startapp.py,sha256=rvXApmLdP3gBinKaOMJtT1g3YrgVTlHteqNqFioNu8Y,503 +django/core/management/commands/startproject.py,sha256=HTxPhSOdteOaqA51UZI5h75ebFIR2x8rvIsMKoYbD9Y,789 +django/core/management/commands/test.py,sha256=-zi3NpOrkYjoHGNmKQXETa8wDiWfyWqWN3r2ShD5jKE,2248 +django/core/management/commands/testserver.py,sha256=8fEHJtw-k4nX8fgLA2cEHEiS2PYT2Qmhm86JnZFsbMM,2114 +django/core/management/sql.py,sha256=uwvdf0YDSGiTAJKLOmD9bKXH3DUD_s95fmy9Bc3noqY,1641 +django/core/management/templates.py,sha256=f5CFqBr2TN1hrDqgg540IFNzN7bZ5zfDUE6vhXKZJlo,13653 +django/core/management/utils.py,sha256=k_YvRKOkaVDUjrRWkZe3MDGg6kB3iaCFymJDs30pJ_A,4873 +django/core/paginator.py,sha256=6aZ3fyTVY2AsIxAoimlrt6K7gnuiqqxB8Xtqc6P1N9s,7521 +django/core/serializers/__init__.py,sha256=EODXMotb1Jg3Rkedjdqi5QUg84w4_jfDlnbaulUOIE8,8628 +django/core/serializers/__pycache__/__init__.cpython-38.pyc,, +django/core/serializers/__pycache__/base.cpython-38.pyc,, +django/core/serializers/__pycache__/json.cpython-38.pyc,, +django/core/serializers/__pycache__/jsonl.cpython-38.pyc,, +django/core/serializers/__pycache__/python.cpython-38.pyc,, +django/core/serializers/__pycache__/pyyaml.cpython-38.pyc,, +django/core/serializers/__pycache__/xml_serializer.cpython-38.pyc,, +django/core/serializers/base.py,sha256=G9Ev7aLCMJxZzylZDU7uxd44A7MDI5WJag3X0iEpNes,11740 +django/core/serializers/json.py,sha256=peWRUbvjFzrMKl7wdF5gucyG68en8DvMrKKd9Y-qNB8,3411 +django/core/serializers/jsonl.py,sha256=cWEF6GD3lhDsupZk9uAWm2uXSbAbgfLHYkVjS7xA5sU,1845 +django/core/serializers/python.py,sha256=SEKlPPvYau0FgQPv4wE6WDzKK_AKoGXVFEknfBA1888,6078 +django/core/serializers/pyyaml.py,sha256=4uBpVQt05FCGSBd7j3KklqEQPYVrrEeWSy9-_6noVEM,2896 +django/core/serializers/xml_serializer.py,sha256=Kv7Xj2P0My4DWBD85jegn6Msv5eTMIOqS_PAK3v1xI0,17257 +django/core/servers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/core/servers/__pycache__/__init__.cpython-38.pyc,, +django/core/servers/__pycache__/basehttp.cpython-38.pyc,, +django/core/servers/basehttp.py,sha256=amRRVXIaMgSvy767N0H6_z8eC-NX34li_vSXjwKH3Us,7970 +django/core/signals.py,sha256=5vh1e7IgPN78WXPo7-hEMPN9tQcqJSZHu0WCibNgd-E,151 +django/core/signing.py,sha256=JFwxHIBbpAvpmMlqc43Y8TdAXYa735tDfrvYqhntH2U,8163 +django/core/validators.py,sha256=OBoi9MyUXLrwCHPCzHsNz48uruiH-EIXXY049LfFpqk,20667 +django/core/wsgi.py,sha256=2sYMSe3IBrENeQT7rys-04CRmf8hW2Q2CjlkBUIyjHk,388 +django/db/__init__.py,sha256=w5hqZD3iUCresDu9m4_J6JC4Nv9JIEGtbtw2Ak95qt4,1365 +django/db/__pycache__/__init__.cpython-38.pyc,, +django/db/__pycache__/transaction.cpython-38.pyc,, +django/db/__pycache__/utils.cpython-38.pyc,, +django/db/backends/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/db/backends/__pycache__/__init__.cpython-38.pyc,, +django/db/backends/__pycache__/ddl_references.cpython-38.pyc,, +django/db/backends/__pycache__/signals.cpython-38.pyc,, +django/db/backends/__pycache__/utils.cpython-38.pyc,, +django/db/backends/base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/db/backends/base/__pycache__/__init__.cpython-38.pyc,, +django/db/backends/base/__pycache__/base.cpython-38.pyc,, +django/db/backends/base/__pycache__/client.cpython-38.pyc,, +django/db/backends/base/__pycache__/creation.cpython-38.pyc,, +django/db/backends/base/__pycache__/features.cpython-38.pyc,, +django/db/backends/base/__pycache__/introspection.cpython-38.pyc,, +django/db/backends/base/__pycache__/operations.cpython-38.pyc,, +django/db/backends/base/__pycache__/schema.cpython-38.pyc,, +django/db/backends/base/__pycache__/validation.cpython-38.pyc,, +django/db/backends/base/base.py,sha256=ZtZwAyIBXINSYIPZf-pAhIiolgaL9fmZIg_PuKmCWoQ,24749 +django/db/backends/base/client.py,sha256=I5cq6_iCIfoYkygvWOSMXQNZW8NF-WYBy5MKI9KXlXA,914 +django/db/backends/base/creation.py,sha256=8pzAFoOBZERV57N0s9_4NKLUZqEqwQfOJlfFiKmlYB0,14643 +django/db/backends/base/features.py,sha256=Wfd1qu2jGCfWZ61z-NljRtzkmIOiXTfa7slvxEmr3DQ,13713 +django/db/backends/base/introspection.py,sha256=-q0LR9IHMrSrIkT6lwqOSEMPoqjj9uMzQiclDXfo76M,7745 +django/db/backends/base/operations.py,sha256=N5CJ4_u1C-3UG8fbcbf9cJzbFvaaNZuUj2RQSMBi66Y,26839 +django/db/backends/base/schema.py,sha256=_kEIILMPwgE4xvaMGt2pTIUIqpN5HqKtr1s-rUBu09I,62622 +django/db/backends/base/validation.py,sha256=4zIAVsePyETiRtK7CAw78y4ZiCPISs0Pv17mFWy2Tr4,1040 +django/db/backends/ddl_references.py,sha256=f0zcaGRwhG2W-hbUiXquzRuEBftMo0Ve8OTHKZKuHTQ,8052 +django/db/backends/dummy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/db/backends/dummy/__pycache__/__init__.cpython-38.pyc,, +django/db/backends/dummy/__pycache__/base.cpython-38.pyc,, +django/db/backends/dummy/__pycache__/features.cpython-38.pyc,, +django/db/backends/dummy/base.py,sha256=ZsB_hKOW9tuaNbZt64fGY6tk0_FqMiF72rp8TE3NrDA,2244 +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-38.pyc,, +django/db/backends/mysql/__pycache__/base.cpython-38.pyc,, +django/db/backends/mysql/__pycache__/client.cpython-38.pyc,, +django/db/backends/mysql/__pycache__/compiler.cpython-38.pyc,, +django/db/backends/mysql/__pycache__/creation.cpython-38.pyc,, +django/db/backends/mysql/__pycache__/features.cpython-38.pyc,, +django/db/backends/mysql/__pycache__/introspection.cpython-38.pyc,, +django/db/backends/mysql/__pycache__/operations.cpython-38.pyc,, +django/db/backends/mysql/__pycache__/schema.cpython-38.pyc,, +django/db/backends/mysql/__pycache__/validation.cpython-38.pyc,, +django/db/backends/mysql/base.py,sha256=6Qb9anWVdgP4eNeOFeFmlDPDc9yUS0aTV0tySIIzsOU,16208 +django/db/backends/mysql/client.py,sha256=_ckHjGopeVXMWu5vtSA5GQBIrO-wWtOKI4VyYZ4uGMU,2580 +django/db/backends/mysql/compiler.py,sha256=dqo5iPN7qDFCIW-J5qqLkIOonD5RmE-Z2Jx63SibBN8,2997 +django/db/backends/mysql/creation.py,sha256=KGvNrvPt2Qy84S_d_kwv8Zsod4-P1aUQjBn7aLM1OOg,3096 +django/db/backends/mysql/features.py,sha256=O7fkTubc9jFnxxSp4WxZaPZxe5x5spUiuaHGOkAn-v8,9116 +django/db/backends/mysql/introspection.py,sha256=7SwmXKUAtJmxXVXHohw3tu4F6Y2zBKewRHnHbawlEtQ,13737 +django/db/backends/mysql/operations.py,sha256=fiEhJHwgFbgXLHBE1jeYGbGND6wRpd3c-Shlge8OEI0,16104 +django/db/backends/mysql/schema.py,sha256=JJaZkF-ZCrnCi79Klyavu1JsWzRXIUATq4uqluKyWBM,7132 +django/db/backends/mysql/validation.py,sha256=U11SbB91lcWzaZZPxY96Cik9s9wO61cm_fOxnX-Cvzo,2920 +django/db/backends/oracle/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/db/backends/oracle/__pycache__/__init__.cpython-38.pyc,, +django/db/backends/oracle/__pycache__/base.cpython-38.pyc,, +django/db/backends/oracle/__pycache__/client.cpython-38.pyc,, +django/db/backends/oracle/__pycache__/creation.cpython-38.pyc,, +django/db/backends/oracle/__pycache__/features.cpython-38.pyc,, +django/db/backends/oracle/__pycache__/functions.cpython-38.pyc,, +django/db/backends/oracle/__pycache__/introspection.cpython-38.pyc,, +django/db/backends/oracle/__pycache__/operations.cpython-38.pyc,, +django/db/backends/oracle/__pycache__/schema.cpython-38.pyc,, +django/db/backends/oracle/__pycache__/utils.cpython-38.pyc,, +django/db/backends/oracle/__pycache__/validation.cpython-38.pyc,, +django/db/backends/oracle/base.py,sha256=rhJ8S1qq3muH28GlU-xFrx-yXbXrU_GOeAqjpgs-ICA,22773 +django/db/backends/oracle/client.py,sha256=8vh5J141-xep7KCgylRkQkqZb7EeptT1MnOhBO7TKOY,784 +django/db/backends/oracle/creation.py,sha256=PIK2aKSL7ITWPV-HePu0jp0hab34b9iYXZKhQndEJog,19630 +django/db/backends/oracle/features.py,sha256=cVISrqh6crqMReGsR_fxm1Ibe2BQaQ2jv1zDxar7zyw,4867 +django/db/backends/oracle/functions.py,sha256=PHMO9cApG1EhZPD4E0Vd6dzPmE_Dzouf9GIWbF1X7kc,768 +django/db/backends/oracle/introspection.py,sha256=qh2jcooRMM8DW2inwW-qhZisgfmBI1A6vV6U2wVVSSw,14144 +django/db/backends/oracle/operations.py,sha256=MAKOvWff-dVtuNvJO4gb3X0aR2szX8TTvwcx3kN7MP4,27792 +django/db/backends/oracle/schema.py,sha256=RxDpQJKxcJriPJf2s2HuWcOGy8R7yb_9Bkebebs3Ww0,9149 +django/db/backends/oracle/utils.py,sha256=Vx9HvK3GKgqMW9CYVkVXsaF9uVwchVC7IjrrkGo1tfY,2656 +django/db/backends/oracle/validation.py,sha256=O1Vx5ljfyEVo9W-o4OVsu_OTfZ5V5P9HX3kNMtdE75o,860 +django/db/backends/postgresql/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/db/backends/postgresql/__pycache__/__init__.cpython-38.pyc,, +django/db/backends/postgresql/__pycache__/base.cpython-38.pyc,, +django/db/backends/postgresql/__pycache__/client.cpython-38.pyc,, +django/db/backends/postgresql/__pycache__/creation.cpython-38.pyc,, +django/db/backends/postgresql/__pycache__/features.cpython-38.pyc,, +django/db/backends/postgresql/__pycache__/introspection.cpython-38.pyc,, +django/db/backends/postgresql/__pycache__/operations.cpython-38.pyc,, +django/db/backends/postgresql/__pycache__/schema.cpython-38.pyc,, +django/db/backends/postgresql/base.py,sha256=OhEp8JRbV1C0MNQ6P3Kv77DbOJZi5Ql1I5Xg6oOsTlA,13221 +django/db/backends/postgresql/client.py,sha256=4Ur2Mr32i0DddxflHt4eXSsqMKITUrSZI_akPJPRouc,1705 +django/db/backends/postgresql/creation.py,sha256=YtzTqKB1406xZhJkPd4auKRoTpxyY74ZvDIhwVGYGW8,3344 +django/db/backends/postgresql/features.py,sha256=OqQ-cIhRxRpTSYXP1e0cSHjCbO1HHwCz933KVeZCbso,3969 +django/db/backends/postgresql/introspection.py,sha256=kFtbD2R1F4K8zHk-wfNcCyZm_VQA6YfVTeTyCxT2TTI,10345 +django/db/backends/postgresql/operations.py,sha256=Z3qLSXIu5xAD5CRO0BVoY33XSmPH5sJfff9WlsRQtMg,11471 +django/db/backends/postgresql/schema.py,sha256=vl9aWYLMIjpmTXTAMT4r-oyD0UqMruMuRXjnFR5NVGg,11091 +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-38.pyc,, +django/db/backends/sqlite3/__pycache__/base.cpython-38.pyc,, +django/db/backends/sqlite3/__pycache__/client.cpython-38.pyc,, +django/db/backends/sqlite3/__pycache__/creation.cpython-38.pyc,, +django/db/backends/sqlite3/__pycache__/features.cpython-38.pyc,, +django/db/backends/sqlite3/__pycache__/introspection.cpython-38.pyc,, +django/db/backends/sqlite3/__pycache__/operations.cpython-38.pyc,, +django/db/backends/sqlite3/__pycache__/schema.cpython-38.pyc,, +django/db/backends/sqlite3/base.py,sha256=xhSrOTjoMHaMLYT2jenw4-gTcBRCACQvD1-tINLDfdc,26116 +django/db/backends/sqlite3/client.py,sha256=z5Y5RRyT5dwRSaQ0hhS5EYBuSt-CB2g79AKdgGOdzxw,522 +django/db/backends/sqlite3/creation.py,sha256=Z54YcyMPiVqGPwoMsVE4RWd5Bi3G7Yt4RaniLqgLTkw,4370 +django/db/backends/sqlite3/features.py,sha256=_-ods9b47DYwXueye4PpRiqBwvPcZ4oUQTOG9gxN5cI,4815 +django/db/backends/sqlite3/introspection.py,sha256=_3jUocpL34mVHIAI3IlWGB5dMhlaPZLTGBvxcC1699M,20361 +django/db/backends/sqlite3/operations.py,sha256=szVT6ZgY1v-P-fasiklI-OA6rLcA8LJidTCVagni7zA,14934 +django/db/backends/sqlite3/schema.py,sha256=7A_oBdg7ujFfadHpZc94ElEngU7g8Z91JNglOCeFp5E,20748 +django/db/backends/utils.py,sha256=ze_39D7cNv6fVgnVgc5GC85PDuvGE0xdEXluWTtOlPo,8433 +django/db/migrations/__init__.py,sha256=Oa4RvfEa6hITCqdcqwXYC66YknFKyluuy7vtNbSc-L4,97 +django/db/migrations/__pycache__/__init__.cpython-38.pyc,, +django/db/migrations/__pycache__/autodetector.cpython-38.pyc,, +django/db/migrations/__pycache__/exceptions.cpython-38.pyc,, +django/db/migrations/__pycache__/executor.cpython-38.pyc,, +django/db/migrations/__pycache__/graph.cpython-38.pyc,, +django/db/migrations/__pycache__/loader.cpython-38.pyc,, +django/db/migrations/__pycache__/migration.cpython-38.pyc,, +django/db/migrations/__pycache__/optimizer.cpython-38.pyc,, +django/db/migrations/__pycache__/questioner.cpython-38.pyc,, +django/db/migrations/__pycache__/recorder.cpython-38.pyc,, +django/db/migrations/__pycache__/serializer.cpython-38.pyc,, +django/db/migrations/__pycache__/state.cpython-38.pyc,, +django/db/migrations/__pycache__/utils.cpython-38.pyc,, +django/db/migrations/__pycache__/writer.cpython-38.pyc,, +django/db/migrations/autodetector.py,sha256=48V1Fm-CIvFBhKdpyE8A6EJ_fxpBdwRI-YDyUN5Whbc,64174 +django/db/migrations/exceptions.py,sha256=XLTZ_ufpVJX_nL4egDEG5DqvB8eqSGUuVoMNZ1lpXek,1198 +django/db/migrations/executor.py,sha256=DYSnPD6fc-r5QTslLf3yjyNizp9XYQ5V9nDVXeu_5jg,17841 +django/db/migrations/graph.py,sha256=qho3dqkbm8QyaRebGQUBQWFv1TQ-70AS8aWtOmw3Ius,12841 +django/db/migrations/loader.py,sha256=7N0hsdU5HEBxWt8A3NyBlQ9plVvImJ7GQK2YIy3oUfM,16330 +django/db/migrations/migration.py,sha256=nqKwXxVJjSMvsebByz4Up1Js1yC1FgSU-4Z9fmHzdPY,9108 +django/db/migrations/operations/__init__.py,sha256=48VoWNmXeVdSqnMql-wdWVGmv8BWpfFLz2pH3I5RDCY,778 +django/db/migrations/operations/__pycache__/__init__.cpython-38.pyc,, +django/db/migrations/operations/__pycache__/base.cpython-38.pyc,, +django/db/migrations/operations/__pycache__/fields.cpython-38.pyc,, +django/db/migrations/operations/__pycache__/models.cpython-38.pyc,, +django/db/migrations/operations/__pycache__/special.cpython-38.pyc,, +django/db/migrations/operations/__pycache__/utils.cpython-38.pyc,, +django/db/migrations/operations/base.py,sha256=-r6c4Q7CICBT9574H73dR5pv94EqsozS5P2aNX8VyTk,5016 +django/db/migrations/operations/fields.py,sha256=UVNS04FHYbj8-e2AK7Rt--lnmZzr1OsHhNsW8yHNVsg,15452 +django/db/migrations/operations/models.py,sha256=ugrht02R5f4DUvXYVKARgt1hfWQNFgl_kU47LtHhgHI,34907 +django/db/migrations/operations/special.py,sha256=6vO2RRgaUPnxEjbkTX3QwAN-LaadZFHYpFHouAaMmig,7792 +django/db/migrations/operations/utils.py,sha256=Lxt1i442JmLmvhEY0EEPaO2UgU7mQfrYSpynC9XiKeM,3816 +django/db/migrations/optimizer.py,sha256=9taqZs5iJLXngtpgpN_DLOT8h61bimFGaP46yKjL_9o,3251 +django/db/migrations/questioner.py,sha256=Dvvktl3jWqmQMVRrTp7dNDBEm6an5L5nQFr25RSpMuE,9911 +django/db/migrations/recorder.py,sha256=ZOWNP5bCjsV9QpL54q0jhiKhdy2OfERB5-MWEMRrmkE,3457 +django/db/migrations/serializer.py,sha256=MiQ_RxXGbSpeltZ9V0PKYdE22muP8iS_LCm3SikL3yQ,12935 +django/db/migrations/state.py,sha256=mkXs4ta0quldv0dCu03LopRZOdZl7ptrRYd46oxMujU,25195 +django/db/migrations/utils.py,sha256=ApIIVhNrnnZ79yzrbPeREFsk5kxLCuOd1rwh3dDaNLI,388 +django/db/migrations/writer.py,sha256=6QsSQ6jOSPBjMduPWEsLzibi4_Cr3Rd8wY7TdCWiNRU,11293 +django/db/models/__init__.py,sha256=7WtGjLKaxGsQomDTe1AOpm0qJkteGoDW163y5uc8SwU,2522 +django/db/models/__pycache__/__init__.cpython-38.pyc,, +django/db/models/__pycache__/aggregates.cpython-38.pyc,, +django/db/models/__pycache__/base.cpython-38.pyc,, +django/db/models/__pycache__/constants.cpython-38.pyc,, +django/db/models/__pycache__/constraints.cpython-38.pyc,, +django/db/models/__pycache__/deletion.cpython-38.pyc,, +django/db/models/__pycache__/enums.cpython-38.pyc,, +django/db/models/__pycache__/expressions.cpython-38.pyc,, +django/db/models/__pycache__/indexes.cpython-38.pyc,, +django/db/models/__pycache__/lookups.cpython-38.pyc,, +django/db/models/__pycache__/manager.cpython-38.pyc,, +django/db/models/__pycache__/options.cpython-38.pyc,, +django/db/models/__pycache__/query.cpython-38.pyc,, +django/db/models/__pycache__/query_utils.cpython-38.pyc,, +django/db/models/__pycache__/signals.cpython-38.pyc,, +django/db/models/__pycache__/utils.cpython-38.pyc,, +django/db/models/aggregates.py,sha256=c6JnF1FfI1-h90zX0-Ts2lpDwsl5raNoOC9SF_LfvkE,5933 +django/db/models/base.py,sha256=8k3Q4ggSKtVVSJyJpGQcJlFn3whq7AvFzBIfNfQKQP4,89461 +django/db/models/constants.py,sha256=BstFLrG_rKBHL-IZ7iqXY9uSKLL6IOKOjheXBetCan0,117 +django/db/models/constraints.py,sha256=uAEiBQgc3Iyjl4pEE7NT3NKChb9zM3oUqcTb4QutX28,7796 +django/db/models/deletion.py,sha256=q09Z-ZbLWQ-u749ns6-StTr37bOzRWIsiAm_IILY418,19750 +django/db/models/enums.py,sha256=qfJQ6IXCU72CMizCDOj5vH_-f44TwESP750Nc3m7cuY,2756 +django/db/models/expressions.py,sha256=sPdWEXvn_2hB-Q5NU8S6UMJJZN0ARKqQ5qqRXLZ1EbE,52085 +django/db/models/fields/__init__.py,sha256=BBJrciB7s49ICXczAEBVRJJSs0gAbQ0PI9arSHLmcjg,92398 +django/db/models/fields/__pycache__/__init__.cpython-38.pyc,, +django/db/models/fields/__pycache__/files.cpython-38.pyc,, +django/db/models/fields/__pycache__/json.cpython-38.pyc,, +django/db/models/fields/__pycache__/mixins.cpython-38.pyc,, +django/db/models/fields/__pycache__/proxy.cpython-38.pyc,, +django/db/models/fields/__pycache__/related.cpython-38.pyc,, +django/db/models/fields/__pycache__/related_descriptors.cpython-38.pyc,, +django/db/models/fields/__pycache__/related_lookups.cpython-38.pyc,, +django/db/models/fields/__pycache__/reverse_related.cpython-38.pyc,, +django/db/models/fields/files.py,sha256=K64EHJ-wol3CVBd-Mvo5dkIi5P9q41PK7dHK1fBhFcY,18417 +django/db/models/fields/json.py,sha256=YIt9B7RGLDsn_Fa02liFxKOai2p2XF_OO70o-d5e4lQ,19459 +django/db/models/fields/mixins.py,sha256=9KF0Yg0MpeSHYJFu0D4kSOq_hye0TxnofdfaOmG_NsY,1801 +django/db/models/fields/proxy.py,sha256=fcJ2d1ZiY0sEouSq9SV7W1fm5eE3C_nMGky3Ma347dk,515 +django/db/models/fields/related.py,sha256=Qf1lGG317UEb5r1P8vrsjTGP0t9aiKIMsK6ETqG5Teg,70194 +django/db/models/fields/related_descriptors.py,sha256=yAupS1SqCYf90aykRRscEmYUjStI2DzrXDPsgEjUeNc,54061 +django/db/models/fields/related_lookups.py,sha256=aVkqKHxLqFpt5toGqyMUM-zUSuHxNc5e5B4dXUFIAjs,7073 +django/db/models/fields/reverse_related.py,sha256=JxTeGIPuxShD7lzW56Ou3-M-WG7O4a2izcBxkt2aWDI,11195 +django/db/models/functions/__init__.py,sha256=fve5gEF4bL_4n_ywzrrZ33qGRTg_whrzzLQ5RLx_58o,2083 +django/db/models/functions/__pycache__/__init__.cpython-38.pyc,, +django/db/models/functions/__pycache__/comparison.cpython-38.pyc,, +django/db/models/functions/__pycache__/datetime.cpython-38.pyc,, +django/db/models/functions/__pycache__/math.cpython-38.pyc,, +django/db/models/functions/__pycache__/mixins.cpython-38.pyc,, +django/db/models/functions/__pycache__/text.cpython-38.pyc,, +django/db/models/functions/__pycache__/window.cpython-38.pyc,, +django/db/models/functions/comparison.py,sha256=mLUsq1_4cDe8h3tpWJxKZ9IvvqFSKn2kyyz8MSJuE1M,7311 +django/db/models/functions/datetime.py,sha256=44R-UkfpbVigU_r2xl63qNWP8Gljf7B9n8OFI6LtWHk,11827 +django/db/models/functions/math.py,sha256=mJDDUYXvBtiQ9WkraR5vv3ZdOHM1lOqc8bqPh7Plodc,5243 +django/db/models/functions/mixins.py,sha256=BB5sSl-lVaFI5LkxK1BvhRl-2Z5UPBIMLrDc3VHMRwk,2111 +django/db/models/functions/text.py,sha256=NZSWxzN7bcHffSGWXK38vhM7tOIZQTFiDwji9mjqDmY,10302 +django/db/models/functions/window.py,sha256=yL07Blhu1WudxHMbIfRA2bBIXuwZec8wLPbW6N5eOyc,2761 +django/db/models/indexes.py,sha256=bfkWnneFf2gdBvmTeDh876jm7IYSR8vcEAAV2UGz6qk,11281 +django/db/models/lookups.py,sha256=p_k3K-tzTcvlxSPEP6P8-g9C3gUeGzy5PxMuZ853atE,23101 +django/db/models/manager.py,sha256=IJ88ywyCPbepMmZRLdnIZ05E8aomx7RmA2XIvKPi7YA,6778 +django/db/models/options.py,sha256=I7tai20uoV7ssQ_jJVwWwRGjDKhAQqyc7kUwHHwUyfA,36791 +django/db/models/query.py,sha256=2lorBXqrgp2v1iqywVHEUloX3HMl2LTvbOWsns-emkU,84236 +django/db/models/query_utils.py,sha256=Qc9PydA1acqXUJiNn50royeYaTheiko4MS_pgHObYY0,12421 +django/db/models/signals.py,sha256=qCf59m4zcQX6wXrbNSxIQCvWaFhaKagb6IxEkdx_5VY,1573 +django/db/models/sql/__init__.py,sha256=iwBpPl3WxYM7qrQ1qKaFGG-loqKwU5OOJt0SVH0m3RE,229 +django/db/models/sql/__pycache__/__init__.cpython-38.pyc,, +django/db/models/sql/__pycache__/compiler.cpython-38.pyc,, +django/db/models/sql/__pycache__/constants.cpython-38.pyc,, +django/db/models/sql/__pycache__/datastructures.cpython-38.pyc,, +django/db/models/sql/__pycache__/query.cpython-38.pyc,, +django/db/models/sql/__pycache__/subqueries.cpython-38.pyc,, +django/db/models/sql/__pycache__/where.cpython-38.pyc,, +django/db/models/sql/compiler.py,sha256=DBnM7sZHHhstUX6pIEQ0n9I-lDrVcupxQnYMc9ns3DU,75108 +django/db/models/sql/constants.py,sha256=wtO4kqA_ItJS51LrVhtwL-vbKzR8fgAEbnCBMDRIgYI,638 +django/db/models/sql/datastructures.py,sha256=a79Kx2yTbY5jbT-kZn48QybeXhOemDcpWuJO1eEfg64,6911 +django/db/models/sql/query.py,sha256=cWzcLOu1jDI3Or5_340TJ2IMDN2DMsSOiAAjbTRRXXw,111332 +django/db/models/sql/subqueries.py,sha256=DKda9DC1mIpsReUNdfV-9n3TczH9GCkYKVP17yjw8Is,5744 +django/db/models/sql/where.py,sha256=tEeYXit18WhCHiXuglA54G18dF4y4jtO8Yl8a3uUfOo,8746 +django/db/models/utils.py,sha256=vwhObJeHlfFp_nBU3L3cL2PsYIOXH7jOtNVqTf0uO-s,1612 +django/db/transaction.py,sha256=Khrj3g4N2_vq1WjukuV64r7C-VWHzxID4AN8KAZzkRY,12229 +django/db/utils.py,sha256=3sqS6C2Lg4k9uRiiMcB_Krnq9_yjEfE3rJMKzAfF2JE,9854 +django/dispatch/__init__.py,sha256=qP203zNwjaolUFnXLNZHnuBn7HNzyw9_JkODECRKZbc,286 +django/dispatch/__pycache__/__init__.cpython-38.pyc,, +django/dispatch/__pycache__/dispatcher.cpython-38.pyc,, +django/dispatch/dispatcher.py,sha256=V_aUtHcvUrIXPgKHXWShPTFFMGrmgVLJDUUx6fWplqM,11142 +django/dispatch/license.txt,sha256=VABMS2BpZOvBY68W0EYHwW5Cj4p4oCb-y1P3DAn0qU8,1743 +django/forms/__init__.py,sha256=S6ckOMmvUX-vVST6AC-M8BzsfVQwuEUAdHWabMN-OGI,368 +django/forms/__pycache__/__init__.cpython-38.pyc,, +django/forms/__pycache__/boundfield.cpython-38.pyc,, +django/forms/__pycache__/fields.cpython-38.pyc,, +django/forms/__pycache__/forms.cpython-38.pyc,, +django/forms/__pycache__/formsets.cpython-38.pyc,, +django/forms/__pycache__/models.cpython-38.pyc,, +django/forms/__pycache__/renderers.cpython-38.pyc,, +django/forms/__pycache__/utils.cpython-38.pyc,, +django/forms/__pycache__/widgets.cpython-38.pyc,, +django/forms/boundfield.py,sha256=IRad_GjJb8UwQlqxr3o4fs17LmpHEQ7ds7g_2U1BkqY,10246 +django/forms/fields.py,sha256=jMvPsqvHSuWVzCU7n7c-TjY0PgMZN4jy_praBBNkFo8,46707 +django/forms/forms.py,sha256=yzNt1qEEWrm8Rn_jYFSbZl7BwX_Z9VxyGTD9zzs-POw,19804 +django/forms/formsets.py,sha256=L5SE0e6-_qEgdillfEDZ8M_8pdNYTvfCF0zT7wSGU7k,19864 +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=h5_tWYnKRjGTYkzOq6AfDpkffj31DdEolpdtInilitM,511 +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=O9W9tLA_gdxNqN_No2Tesd8_2GhOTyKEkCOnp_rUBn4,431 +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/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/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=KJvlZioaiTFigqwaUHQiyrAfTTQttjjVfbLKhYod3XU,58083 +django/forms/renderers.py,sha256=2jxMO8pIjEKJ_Putd_Y5fv1pElwMKP7O8Y65tLwZnxA,1917 +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=h5_tWYnKRjGTYkzOq6AfDpkffj31DdEolpdtInilitM,511 +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=HwEaZLEiZYdPJ6brC9QWRGaIKzcX5UA2Tj5Rsq_NvOk,462 +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/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/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=fhEwzt5GMyxJIKIF-WELl-jeIOOJygnAaI9VmD68iKg,5996 +django/forms/widgets.py,sha256=HUfspqbpHNV0rtJpt5Kxj2zFqnG91bfHS0-LKAc1M-4,37564 +django/http/__init__.py,sha256=5JImoB1BZNuZBOt5qyDX7t51McYbkDLX45eKmNN_Fes,1010 +django/http/__pycache__/__init__.cpython-38.pyc,, +django/http/__pycache__/cookie.cpython-38.pyc,, +django/http/__pycache__/multipartparser.cpython-38.pyc,, +django/http/__pycache__/request.cpython-38.pyc,, +django/http/__pycache__/response.cpython-38.pyc,, +django/http/cookie.py,sha256=Zpg6OEW9-dGvr5ByQhlHyGjLJzvNNrnGL1WzolnsM6U,818 +django/http/multipartparser.py,sha256=3JML9I4OYoJjkGvE0tfR5E9j3VWDkrDzHYo3Y_LWLaA,26029 +django/http/request.py,sha256=O_tKtMaDYqeGJnYZaxYXHRlgLstajzOUcbBpNkjLDF4,25416 +django/http/response.py,sha256=OT3u98hQT9AntyfHny0GfR47ngtLpV-M176ha4yQBrc,21227 +django/middleware/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/middleware/__pycache__/__init__.cpython-38.pyc,, +django/middleware/__pycache__/cache.cpython-38.pyc,, +django/middleware/__pycache__/clickjacking.cpython-38.pyc,, +django/middleware/__pycache__/common.cpython-38.pyc,, +django/middleware/__pycache__/csrf.cpython-38.pyc,, +django/middleware/__pycache__/gzip.cpython-38.pyc,, +django/middleware/__pycache__/http.cpython-38.pyc,, +django/middleware/__pycache__/locale.cpython-38.pyc,, +django/middleware/__pycache__/security.cpython-38.pyc,, +django/middleware/cache.py,sha256=R53yhubcKlNhcS2ujCnqmXcwHm00ShMNAz_qLRIOh2k,8227 +django/middleware/clickjacking.py,sha256=4o-qDAZJTe8HFV_UjHCPkRiWJ8bBJwnDvzHEp28RQoQ,1696 +django/middleware/common.py,sha256=zFTZRKnxLHCBX0Qev90flckgCMNJ86NIeNTucx4bbTM,7457 +django/middleware/csrf.py,sha256=KJgUcXSlb29bjlNF7nX_iOSTFtueSH5BsxXRyd-lw6c,13796 +django/middleware/gzip.py,sha256=Gq1DVIBjW5W3nxn-DA2spZI3BMYUusOUp-EM0q-_lys,2142 +django/middleware/http.py,sha256=JiRGXvtfmXxYTomy7gde5pcG45GX7R0qpXiI5Fk06dE,1624 +django/middleware/locale.py,sha256=60giIJJ_Xnv0LKmO25QUqSfLtIYr9CvDP6hbuE0PVXA,3014 +django/middleware/security.py,sha256=lkL91YPA9TNqDDYjUOxfaW4EEdp6jpDo9sbKz1NLzcc,2524 +django/shortcuts.py,sha256=3sywVfNhusraJcqmqQk-aooxYaP0YINJv-1b0spaDhM,4880 +django/template/__init__.py,sha256=SjShaTKH9sPyLdd7m8FzksxANvGYhtr7XDJZyWgWe9o,2010 +django/template/__pycache__/__init__.cpython-38.pyc,, +django/template/__pycache__/autoreload.cpython-38.pyc,, +django/template/__pycache__/base.cpython-38.pyc,, +django/template/__pycache__/context.cpython-38.pyc,, +django/template/__pycache__/context_processors.cpython-38.pyc,, +django/template/__pycache__/defaultfilters.cpython-38.pyc,, +django/template/__pycache__/defaulttags.cpython-38.pyc,, +django/template/__pycache__/engine.cpython-38.pyc,, +django/template/__pycache__/exceptions.cpython-38.pyc,, +django/template/__pycache__/library.cpython-38.pyc,, +django/template/__pycache__/loader.cpython-38.pyc,, +django/template/__pycache__/loader_tags.cpython-38.pyc,, +django/template/__pycache__/response.cpython-38.pyc,, +django/template/__pycache__/smartif.cpython-38.pyc,, +django/template/__pycache__/utils.cpython-38.pyc,, +django/template/autoreload.py,sha256=X5G6vil-nhJly0vBEFFKfW6gpI_MQRlqu0MO6EbipuM,1744 +django/template/backends/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/template/backends/__pycache__/__init__.cpython-38.pyc,, +django/template/backends/__pycache__/base.cpython-38.pyc,, +django/template/backends/__pycache__/django.cpython-38.pyc,, +django/template/backends/__pycache__/dummy.cpython-38.pyc,, +django/template/backends/__pycache__/jinja2.cpython-38.pyc,, +django/template/backends/__pycache__/utils.cpython-38.pyc,, +django/template/backends/base.py,sha256=P8dvOmQppJ8YMZ5_XyOJGDzspbQMNGV82GxL5IwrMFM,2751 +django/template/backends/django.py,sha256=4RaYN7vAbNbPUY8G3Fkk0oR1z41NmIBzJQXZ_GKamc8,4179 +django/template/backends/dummy.py,sha256=GRerKCIHVU0LjcioT9CmY8NaP0yIeQA4Wrv6lxdY9NM,1720 +django/template/backends/jinja2.py,sha256=nJBIoZ3nb3wq_5zSab9BlXnTyYdUF39fAERaAmaOpok,4075 +django/template/backends/utils.py,sha256=NORFWk_tz1IsX6WNZjP7Iz5Az6X8pUP0dmBfNC4vodk,418 +django/template/base.py,sha256=AcpakRI_AOiVAN7c4rwauxXa2ujf_q8tMSqwEFJegMA,38288 +django/template/context.py,sha256=4Zgmka6B7nfNsoIXD6O-f6FlnCH2IyCQxxXI8qesORU,8940 +django/template/context_processors.py,sha256=l7ZmqrfkR2KY-52TXWQHg-QkfeeoYLlCjL8mZvTrxgs,2408 +django/template/defaultfilters.py,sha256=QifvFRXjWE8ZCapZMpEfNyJ-ujUP5XD5y_1paDE_Dfk,26556 +django/template/defaulttags.py,sha256=sDOiBrALTzbhP7Zw-90WH75vz92atqiu2jZ-GqRA08I,50026 +django/template/engine.py,sha256=HPV4TrvBvq_--wmnJzKhnnUYTj1pR1-ASRgdmxIhOeU,6882 +django/template/exceptions.py,sha256=awd7B80xhFB574Lt2IdIyHCpD6KGGyuKGkIoalr9deo,1340 +django/template/library.py,sha256=ehca-hPsWo00yH07zINB6lA7IeEoZZ9ncoMzUpci9uU,12826 +django/template/loader.py,sha256=-t5cTnWJrxtS2vyg9cguz4rXxlTBni4XoJUuqJNglPI,2054 +django/template/loader_tags.py,sha256=mRr9dm2HkTn9ar3wXAQKUIvFLMA4Rg6zTzcPezU3fKM,12797 +django/template/loaders/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/template/loaders/__pycache__/__init__.cpython-38.pyc,, +django/template/loaders/__pycache__/app_directories.cpython-38.pyc,, +django/template/loaders/__pycache__/base.cpython-38.pyc,, +django/template/loaders/__pycache__/cached.cpython-38.pyc,, +django/template/loaders/__pycache__/filesystem.cpython-38.pyc,, +django/template/loaders/__pycache__/locmem.cpython-38.pyc,, +django/template/loaders/app_directories.py,sha256=w3a84EAXWX12w7F1CyxIQ_lFiTwxFS7xf3rCEcnUqyc,313 +django/template/loaders/base.py,sha256=UcziL0Vj0jUQl-_vDi3uJUBClJI4lcsmDcZhcv1PlLI,1577 +django/template/loaders/cached.py,sha256=KVJFU9LbTqOp96Yz9CejD9wP-LMtbDU9pMPxVABbeL4,3655 +django/template/loaders/filesystem.py,sha256=OWTnIwWbVj-Td5VrOkKw1G_6pIuz1Vnh5CedZN5glyU,1507 +django/template/loaders/locmem.py,sha256=8cBYI8wPOOnIx_3v7fC5jezA_6pJLqgqObeLwHXQJKo,673 +django/template/response.py,sha256=6InrgDfplDjejgV1NyNsTYPnEKDwHKkm6PqQUxGDtuE,5461 +django/template/smartif.py,sha256=QBvsTtD4YiyGoU4hXrW8vqR0CBAFOZGuDoRP3aGEgOs,6408 +django/template/utils.py,sha256=7bjK3PEM-yEu6LbMVsAh3VQqXEguYBDJSRIPWBII52c,3560 +django/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/templatetags/__pycache__/__init__.cpython-38.pyc,, +django/templatetags/__pycache__/cache.cpython-38.pyc,, +django/templatetags/__pycache__/i18n.cpython-38.pyc,, +django/templatetags/__pycache__/l10n.cpython-38.pyc,, +django/templatetags/__pycache__/static.cpython-38.pyc,, +django/templatetags/__pycache__/tz.cpython-38.pyc,, +django/templatetags/cache.py,sha256=otY3c4Ti9YLxFfOuIX5TZ7w12aGDPkyGfQNsaPVZ_M0,3401 +django/templatetags/i18n.py,sha256=l4gH7h7WJHfqbzw_iM45DE5IZPTn_wPuse3IYli6DsY,19355 +django/templatetags/l10n.py,sha256=I6jRSBLvL34H-_rwGuHfU22VBhO2IHNRue78KWb8pTc,1723 +django/templatetags/static.py,sha256=om3cu4NVaH4MVUq-XPLxPVNlLUCxTbbp0qAVVSaClj4,4502 +django/templatetags/tz.py,sha256=HFzJsvh-x9yjoju4kiIpKAI0U_4crtoftqiT8llM_u8,5400 +django/test/__init__.py,sha256=QtKYTxK0z6qQQk1M4q_QQ1jztJce7Gfs_bPdNWHhl68,767 +django/test/__pycache__/__init__.cpython-38.pyc,, +django/test/__pycache__/client.cpython-38.pyc,, +django/test/__pycache__/html.cpython-38.pyc,, +django/test/__pycache__/runner.cpython-38.pyc,, +django/test/__pycache__/selenium.cpython-38.pyc,, +django/test/__pycache__/signals.cpython-38.pyc,, +django/test/__pycache__/testcases.cpython-38.pyc,, +django/test/__pycache__/utils.cpython-38.pyc,, +django/test/client.py,sha256=DFS8cvLRb3hoH-V1EBraykKIiUK9UQGa5seJ-Xfin1M,37255 +django/test/html.py,sha256=St7XLT5y8yHvfQb84_NmNGXzxiqQ-oS6akHOajdjzvM,8524 +django/test/runner.py,sha256=zUccKa23D_iUR5uIQsWnKElSetJnpO_z0ZfdzPKke1w,30148 +django/test/selenium.py,sha256=MN1zXbgesil9CIJ1JmjEJyEXxg8IJVgcbiTcm20BMDg,5129 +django/test/signals.py,sha256=MQSaRkR2YWWQIaZHo1Yq1ZU0Ik_tSuneqPf5Z0SJl_w,6807 +django/test/testcases.py,sha256=0IKRXXSe7kc4hii1DCaGqgK0FJebtcuXgo4FUas4YrY,64617 +django/test/utils.py,sha256=zo984qWWIbcKR99_voh_sFfobgpT2La9ctdfDRI6WQw,30706 +django/urls/__init__.py,sha256=FdHfNv5NwWEIt1EqEpRY7xJ-i4tD-SCLj0tq3qT6X1E,959 +django/urls/__pycache__/__init__.cpython-38.pyc,, +django/urls/__pycache__/base.cpython-38.pyc,, +django/urls/__pycache__/conf.cpython-38.pyc,, +django/urls/__pycache__/converters.cpython-38.pyc,, +django/urls/__pycache__/exceptions.cpython-38.pyc,, +django/urls/__pycache__/resolvers.cpython-38.pyc,, +django/urls/__pycache__/utils.cpython-38.pyc,, +django/urls/base.py,sha256=sfqdc9ycaHNQSrJwtGRuuR5c0gL58Kn___I0LiGD2Ks,5587 +django/urls/conf.py,sha256=8Xug9NhJXDEysRXWrY2iHf0snfJMUmQkYZAomPltWMY,2946 +django/urls/converters.py,sha256=_eluhZBczkfMwCZJEQtM7s7KJQYbwoO4lygFQvtWSHA,1216 +django/urls/exceptions.py,sha256=alLNjkORtAxneC00g4qnRpG5wouOHvJvGbymdpKtG_I,115 +django/urls/resolvers.py,sha256=7_qCuQerfppRHVQscmykGp_g3XXWtSyoC8Cmi_j86Lo,27894 +django/urls/utils.py,sha256=VHDcmggNRHSbPJAql5KJhe7wX4pSjrKb64Fu-p14D9Q,2152 +django/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/utils/__pycache__/__init__.cpython-38.pyc,, +django/utils/__pycache__/_os.cpython-38.pyc,, +django/utils/__pycache__/archive.cpython-38.pyc,, +django/utils/__pycache__/asyncio.cpython-38.pyc,, +django/utils/__pycache__/autoreload.cpython-38.pyc,, +django/utils/__pycache__/baseconv.cpython-38.pyc,, +django/utils/__pycache__/cache.cpython-38.pyc,, +django/utils/__pycache__/connection.cpython-38.pyc,, +django/utils/__pycache__/crypto.cpython-38.pyc,, +django/utils/__pycache__/datastructures.cpython-38.pyc,, +django/utils/__pycache__/dateformat.cpython-38.pyc,, +django/utils/__pycache__/dateparse.cpython-38.pyc,, +django/utils/__pycache__/dates.cpython-38.pyc,, +django/utils/__pycache__/datetime_safe.cpython-38.pyc,, +django/utils/__pycache__/deconstruct.cpython-38.pyc,, +django/utils/__pycache__/decorators.cpython-38.pyc,, +django/utils/__pycache__/deprecation.cpython-38.pyc,, +django/utils/__pycache__/duration.cpython-38.pyc,, +django/utils/__pycache__/encoding.cpython-38.pyc,, +django/utils/__pycache__/feedgenerator.cpython-38.pyc,, +django/utils/__pycache__/formats.cpython-38.pyc,, +django/utils/__pycache__/functional.cpython-38.pyc,, +django/utils/__pycache__/hashable.cpython-38.pyc,, +django/utils/__pycache__/html.cpython-38.pyc,, +django/utils/__pycache__/http.cpython-38.pyc,, +django/utils/__pycache__/inspect.cpython-38.pyc,, +django/utils/__pycache__/ipv6.cpython-38.pyc,, +django/utils/__pycache__/itercompat.cpython-38.pyc,, +django/utils/__pycache__/jslex.cpython-38.pyc,, +django/utils/__pycache__/log.cpython-38.pyc,, +django/utils/__pycache__/lorem_ipsum.cpython-38.pyc,, +django/utils/__pycache__/module_loading.cpython-38.pyc,, +django/utils/__pycache__/numberformat.cpython-38.pyc,, +django/utils/__pycache__/regex_helper.cpython-38.pyc,, +django/utils/__pycache__/safestring.cpython-38.pyc,, +django/utils/__pycache__/termcolors.cpython-38.pyc,, +django/utils/__pycache__/text.cpython-38.pyc,, +django/utils/__pycache__/timesince.cpython-38.pyc,, +django/utils/__pycache__/timezone.cpython-38.pyc,, +django/utils/__pycache__/topological_sort.cpython-38.pyc,, +django/utils/__pycache__/tree.cpython-38.pyc,, +django/utils/__pycache__/version.cpython-38.pyc,, +django/utils/__pycache__/xmlutils.cpython-38.pyc,, +django/utils/_os.py,sha256=_C_v7KbojT-CD3fn2yJGFbjCbV5HkJr3MBqZrjjxK-s,2295 +django/utils/archive.py,sha256=PnKzyQtuG_m7DXeyaE_m34vH5hzO2uPWm6APos2gP5A,7855 +django/utils/asyncio.py,sha256=sFRUKbrTnXo5uGRNI9RHOZ1bb0dFFOge5UzT7qwGyQ8,1165 +django/utils/autoreload.py,sha256=ZZ1kJEMlnbwU_d_PmwPGEjjFpl8y1hE4WxRBiHo8qMo,24245 +django/utils/baseconv.py,sha256=xYReIqcF2FFD85BqDrl48xo4UijII9D6YyC-FHsUPbw,2989 +django/utils/cache.py,sha256=K72VksIJHEGP3uPsWNJW1HVp764QAwiPDjzqEqGQQ_M,16256 +django/utils/connection.py,sha256=HlxWNMBDM26anSkDHpOkbkiX1qWimrNdi23SypAb4TY,2239 +django/utils/crypto.py,sha256=J1XbnBi-bheoxToEZbSvkEHJoiuD3hsxq88bD2uG12w,3139 +django/utils/datastructures.py,sha256=92cjzQ_w9PhTKXA6OgwOYUnmIpX5vqforHo0JiL2EsA,9891 +django/utils/dateformat.py,sha256=ntU_c6plSP2k8g6uCoDd0wIuVdMIIcfW84TORbhKWY0,10205 +django/utils/dateparse.py,sha256=DeWXc3cZXanT2yuEQlbhG82mheIGEborN1IQpKhxBiI,4894 +django/utils/dates.py,sha256=hl7plurNHC7tj_9Olb7H7-LCtOhOV71oWg-xx5PBFh4,2021 +django/utils/datetime_safe.py,sha256=JsosYYXcRNqnHSCC2VajcW5tC4KnkxUb5gOYmDURRkY,2854 +django/utils/deconstruct.py,sha256=hcO_7qassSI5dTfQ5CPttA8s3f9yaF8UnqKKma3bI6M,1975 +django/utils/decorators.py,sha256=P3Is7I_Xe_evMKH5ho_ssHynuFmTzB7uTysnJwW-XnI,6834 +django/utils/deprecation.py,sha256=OJg5lZbyZk4xzJi8mgnmLlLBLC1Qsye8fB3RJYQ-MAM,5198 +django/utils/duration.py,sha256=VtDUAQKIPFuv6XkwG6gIjLQYtcs8vgGMcS4OQpSFx-E,1234 +django/utils/encoding.py,sha256=g41xTq1TPKSstCG0sD47-GfPLyiB18w8xCF7danfrcI,9336 +django/utils/feedgenerator.py,sha256=rI74OiJ8cWgt9AhA0RnYdKTVi7IXUM6FCLpFUQjDRmc,15109 +django/utils/formats.py,sha256=sORcm7Pr_hBG4kfZYC8Dp7pCP2o-CSjpBKJmluWRjbU,9033 +django/utils/functional.py,sha256=Dkqp_2JZ54pdU-pNG6VM5IWdfW8ZgUzHj28iw7dPWCI,14146 +django/utils/hashable.py,sha256=O8ypHtccXZKg1T7XX8u_H8iTFXnKBKnKmf46OBcbf9k,706 +django/utils/html.py,sha256=9bDmR5GPXrTUGIJjO8pCm2vZrOuB4U37Y6zAOeBl2Is,13151 +django/utils/http.py,sha256=vHOsKd-jfMDawqCxzmn7LCrPo8lsGIQpMmrIFYCTpJI,17700 +django/utils/inspect.py,sha256=O5KdAnq5wd61Hh7VfgsmKycsi13SR7SubmeRDebIuTQ,2279 +django/utils/ipv6.py,sha256=WBkmZXdtbIHgcaWDKm4ElRvzyu_wKLCW2aA18g1RCJo,1350 +django/utils/itercompat.py,sha256=lacIDjczhxbwG4ON_KfG1H6VNPOGOpbRhnVhbedo2CY,184 +django/utils/jslex.py,sha256=FkgHjH5lbd9i0X-ockJlVK6TAa8iq22qR3Y1qrnmLDY,7695 +django/utils/log.py,sha256=EPL1Ns4NX_oUzYZ-yWYOcGP6StU3-eBBVHWE6Uaubgg,7737 +django/utils/lorem_ipsum.py,sha256=P_BSLsITDP2ZW9EJPy6ciFneib0iz9ezBz2LD7CViRE,4775 +django/utils/module_loading.py,sha256=0aH8A5ceSe90pYMpm04JkiUSSivkVqCtyQduDmKlIJM,3592 +django/utils/numberformat.py,sha256=vZy07ugV3tUwTPqDYLyJuuNKxPkIbed2pNcRZT_rUUY,3619 +django/utils/regex_helper.py,sha256=rDwP-EYSHtD_tLLiNG3RCx7rOi5t_FH7COfhDPO1rKg,12739 +django/utils/safestring.py,sha256=zesWIkFq4lAONEDpDVsIxwTDV0wHGq-duKQQGMdzh0w,1764 +django/utils/termcolors.py,sha256=sXUFjND4TFmBqJgoMex1IMhoDGzD5U27iHqNtIMa3rk,7362 +django/utils/text.py,sha256=VS1FOLMJP-nK7zWuMhGPzytEXuZ_Lt1_X7XsFiiYJtc,14309 +django/utils/timesince.py,sha256=k2-fRJCKn45mwqE4l8rgSjbX6a2FWSU9kPXXWstj2e4,3494 +django/utils/timezone.py,sha256=NcsMRbyTY-GndAJ67P0QOa1N7gZ9DRAi-S9Dxiib_hA,8084 +django/utils/topological_sort.py,sha256=JAPUKIset8fuFwQT2FYjyTR8zjJWv3QplaBN0nAVdhQ,1206 +django/utils/translation/__init__.py,sha256=Cx0JVXSGsVtCsM8unby1kadp2lWH4QlqBRdgbqEQlJc,10874 +django/utils/translation/__pycache__/__init__.cpython-38.pyc,, +django/utils/translation/__pycache__/reloader.cpython-38.pyc,, +django/utils/translation/__pycache__/template.cpython-38.pyc,, +django/utils/translation/__pycache__/trans_null.cpython-38.pyc,, +django/utils/translation/__pycache__/trans_real.cpython-38.pyc,, +django/utils/translation/reloader.py,sha256=C3NrDtG_M_hFjfYNYG2B_D1kdy4XEcJ9FMNnyxjnzgI,1113 +django/utils/translation/template.py,sha256=SVpfKA8df41wf7Q-WqNluORBWhL4pHiAv5FNufWP9Lo,10035 +django/utils/translation/trans_null.py,sha256=yp82bHt5oqqL95Z5PFoYCZeENOulxzp-IqMmkWz0l9Y,1257 +django/utils/translation/trans_real.py,sha256=D-3v-8HfqGQJ6nEN9K9EoppBl085NibMdo3VYQu_4Mo,19914 +django/utils/tree.py,sha256=f6GbmuLRerOzV5VxfWpG8Ph85aDd7RdhZCs6eLvBZyE,4918 +django/utils/version.py,sha256=lf4G3gOmEBh8O8mmWl3u6ZoEgQR5bqqfmmh0IvTJT_0,3219 +django/utils/xmlutils.py,sha256=ABVrtMX1Vbv3z8BM8-oc2Bi1FxmwTgvSqafZM0gxVjM,1142 +django/views/__init__.py,sha256=DGdAuGC0t1bMju9i-B9p_gqPgRIFHtLXTdIxNKWFGsw,63 +django/views/__pycache__/__init__.cpython-38.pyc,, +django/views/__pycache__/csrf.cpython-38.pyc,, +django/views/__pycache__/debug.cpython-38.pyc,, +django/views/__pycache__/defaults.cpython-38.pyc,, +django/views/__pycache__/i18n.cpython-38.pyc,, +django/views/__pycache__/static.cpython-38.pyc,, +django/views/csrf.py,sha256=BlyqQhqrVIQFRALKoWnAFkF21AcMAaWo1JxtI84ersw,6282 +django/views/debug.py,sha256=7e9RM6lKTeMw8jjVUQJiwetUBRBOUDmUsFU-7slF01g,22408 +django/views/decorators/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/views/decorators/__pycache__/__init__.cpython-38.pyc,, +django/views/decorators/__pycache__/cache.cpython-38.pyc,, +django/views/decorators/__pycache__/clickjacking.cpython-38.pyc,, +django/views/decorators/__pycache__/common.cpython-38.pyc,, +django/views/decorators/__pycache__/csrf.cpython-38.pyc,, +django/views/decorators/__pycache__/debug.cpython-38.pyc,, +django/views/decorators/__pycache__/gzip.cpython-38.pyc,, +django/views/decorators/__pycache__/http.cpython-38.pyc,, +django/views/decorators/__pycache__/vary.cpython-38.pyc,, +django/views/decorators/cache.py,sha256=bBPXOx7_yZogkQwp_82AkjAtn49kgIjJvwcDfmXWX9o,1705 +django/views/decorators/clickjacking.py,sha256=EW-DRe2dR8yg4Rf8HRHl8c4-C8mL3HKGa6PxZRKmFtU,1565 +django/views/decorators/common.py,sha256=2AE4jUJSVf32_EtO_yddqvGLaYQ1dJbdXA-3TUTKD9s,488 +django/views/decorators/csrf.py,sha256=xPWVVNw_DBidvX_ZVYvN7CePt1HpxpUxsb6wMr0Oe4Y,2073 +django/views/decorators/debug.py,sha256=RbK_DO_Vg_120u0-tEqW1BcTYqcgZRccYMuW-X7JjnQ,3090 +django/views/decorators/gzip.py,sha256=PtpSGd8BePa1utGqvKMFzpLtZJxpV2_Jej8llw5bCJY,253 +django/views/decorators/http.py,sha256=SNeC4LhD0S7_NCf2LsQ3mT_5phEup-l4s6si3T8-O1o,4729 +django/views/decorators/vary.py,sha256=6wEXI5yBFZYDVednNPc0bYbXGG-QzkIUQ-50ErDrA_k,1084 +django/views/defaults.py,sha256=cFxfvjxuyvV9d0X5FQEB6Pd52lCRcxk5Y1xmC_NsMx8,4923 +django/views/generic/__init__.py,sha256=WTnzEXnKyJqzHlLu_VsXInYg-GokDNBCUYNV_U6U-ok,822 +django/views/generic/__pycache__/__init__.cpython-38.pyc,, +django/views/generic/__pycache__/base.cpython-38.pyc,, +django/views/generic/__pycache__/dates.cpython-38.pyc,, +django/views/generic/__pycache__/detail.cpython-38.pyc,, +django/views/generic/__pycache__/edit.cpython-38.pyc,, +django/views/generic/__pycache__/list.cpython-38.pyc,, +django/views/generic/base.py,sha256=I3oi9x5_ZkPjtnwfbI0W9B3l5muUGwyzna2wFcg6q-s,7787 +django/views/generic/dates.py,sha256=scFoB5TCuelE4q_IFJXGQZXDZVAx1LFwPFJitH61vYc,25716 +django/views/generic/detail.py,sha256=m8otoffJXPW9ml-vAtXeM4asTT5I4pvuoR4BhjpWB6A,6507 +django/views/generic/edit.py,sha256=zPO3D8rFrSDjJG1OnRYn0frGqVq8VMKAEUihZU2NrIk,8332 +django/views/generic/list.py,sha256=whDapHWQc65L-jspWDMegzGGo6pJ_4pYsDSGQ2vukwg,7676 +django/views/i18n.py,sha256=9YUj0NCIizFirafwxX5D5CltTXILha80IvWDibxO39Y,11410 +django/views/static.py,sha256=CLZ-fOqDw3gdRiFcgwnK_FrJTxhGh4Uyzx3vqapOL8o,4569 +django/views/templates/default_urlconf.html,sha256=VuT3cVYagdn5Kb94DGpfJyZhPpNtgC4HjuY8v8eEq5I,11150 +django/views/templates/technical_404.html,sha256=dJEOimEguJg6g4IhdRPG5HmdMy8D30U-lNI8wC8wwQs,2706 +django/views/templates/technical_500.html,sha256=mhvde7Ad4DbUyBh8HQyYwlmBGahobg6_H1c8h0MPm1I,17606 +django/views/templates/technical_500.txt,sha256=yMJiwQ_H3MkoJgLnlBDM52zVjiYxw_HamQv9eWheiso,3573 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/Django-3.2.5.dist-info/REQUESTED b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/Django-3.2.5.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/Django-3.2.5.dist-info/WHEEL b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/Django-3.2.5.dist-info/WHEEL new file mode 100644 index 0000000..b552003 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/Django-3.2.5.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.34.2) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/Django-3.2.5.dist-info/entry_points.txt b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/Django-3.2.5.dist-info/entry_points.txt new file mode 100644 index 0000000..22df67e --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/Django-3.2.5.dist-info/entry_points.txt @@ -0,0 +1,3 @@ +[console_scripts] +django-admin = django.core.management:execute_from_command_line + diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/Django-3.2.5.dist-info/top_level.txt b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/Django-3.2.5.dist-info/top_level.txt new file mode 100644 index 0000000..d3e4ba5 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/Django-3.2.5.dist-info/top_level.txt @@ -0,0 +1 @@ +django diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/_cffi_backend.cpython-38-x86_64-linux-gnu.so b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/_cffi_backend.cpython-38-x86_64-linux-gnu.so new file mode 100755 index 0000000..6155404 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/_cffi_backend.cpython-38-x86_64-linux-gnu.so differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp-5.0.6.dist-info/INSTALLER b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp-5.0.6.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp-5.0.6.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp-5.0.6.dist-info/LICENSE b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp-5.0.6.dist-info/LICENSE new file mode 100644 index 0000000..46087c2 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp-5.0.6.dist-info/LICENSE @@ -0,0 +1,47 @@ +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp-5.0.6.dist-info/METADATA b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp-5.0.6.dist-info/METADATA new file mode 100644 index 0000000..f0e1bf4 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp-5.0.6.dist-info/METADATA @@ -0,0 +1,239 @@ +Metadata-Version: 2.1 +Name: amqp +Version: 5.0.6 +Summary: Low-level AMQP client for Python (fork of amqplib). +Home-page: http://github.com/celery/py-amqp +Author: Barry Pederson +Author-email: pyamqp@celeryproject.org +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.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +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 +Requires-Dist: vine (==5.0.0) + +===================================================================== + Python AMQP 0.9.1 client library +===================================================================== + +|build-status| |coverage| |license| |wheel| |pyversion| |pyimp| + +:Version: 5.0.6 +: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://api.travis-ci.com/celery/py-amqp.png?branch=master + :alt: Build status + :target: https://travis-ci.com/celery/py-amqp + +.. |coverage| image:: https://codecov.io/github/celery/py-amqp/coverage.svg?branch=master + :target: https://codecov.io/github/celery/py-amqp?branch=master + +.. |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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp-5.0.6.dist-info/RECORD b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp-5.0.6.dist-info/RECORD new file mode 100644 index 0000000..cf8a9bb --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp-5.0.6.dist-info/RECORD @@ -0,0 +1,39 @@ +amqp-5.0.6.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +amqp-5.0.6.dist-info/LICENSE,sha256=9e9fEoLq4ZMcdGRfhxm2xps9aizyd7_aJJqCcM1HOvM,2372 +amqp-5.0.6.dist-info/METADATA,sha256=uZooClF-L109Esb-3gjeqt-SR69fRJaVaiGP_H610QQ,8790 +amqp-5.0.6.dist-info/RECORD,, +amqp-5.0.6.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +amqp-5.0.6.dist-info/WHEEL,sha256=g4nMs7d-Xl9-xC9XovUrsDHGXt-FT0E17Yqo92DEfvY,92 +amqp-5.0.6.dist-info/top_level.txt,sha256=tWQNmFVhU4UtDgB6Yy2lKqRz7LtOrRcN8_bPFVcVVR8,5 +amqp/__init__.py,sha256=bkKeN2xNBGYhX34ibhVrUMl1BEWMylpF-RfvuhBAUnY,2365 +amqp/__pycache__/__init__.cpython-38.pyc,, +amqp/__pycache__/abstract_channel.cpython-38.pyc,, +amqp/__pycache__/basic_message.cpython-38.pyc,, +amqp/__pycache__/channel.cpython-38.pyc,, +amqp/__pycache__/connection.cpython-38.pyc,, +amqp/__pycache__/exceptions.cpython-38.pyc,, +amqp/__pycache__/five.cpython-38.pyc,, +amqp/__pycache__/method_framing.cpython-38.pyc,, +amqp/__pycache__/platform.cpython-38.pyc,, +amqp/__pycache__/protocol.cpython-38.pyc,, +amqp/__pycache__/sasl.cpython-38.pyc,, +amqp/__pycache__/serialization.cpython-38.pyc,, +amqp/__pycache__/spec.cpython-38.pyc,, +amqp/__pycache__/transport.cpython-38.pyc,, +amqp/__pycache__/types.cpython-38.pyc,, +amqp/__pycache__/utils.cpython-38.pyc,, +amqp/abstract_channel.py,sha256=qJ-btd8_37svD9xwTSAfC0nfGBmlHFIfOslDtrKoko4,4659 +amqp/basic_message.py,sha256=A-84F6w9dtbujtzdkXnm3tATkZyXH14GkusJ2gNcsTM,3268 +amqp/channel.py,sha256=KqbqEi7yj8zK4eBkc95NlEi5lSR_4bqO4G95KRsnOBQ,74115 +amqp/connection.py,sha256=FTX8elrF0T0fR6pWdBJ2MJUNg3MVuJKZZ7zoQ5qH_zQ,27249 +amqp/exceptions.py,sha256=yqjoFIRue2rvK7kMdvkKsGOD6dMOzzzT3ZzBwoGWAe4,7166 +amqp/five.py,sha256=N2j8UuGkMEjFmBM3dbEpN2HnDeka6K_Gq29Fsz2VNcM,178 +amqp/method_framing.py,sha256=mkM0k9Vv7r9X5VBOjs1M_lrBU6egV1LTwp0FUAeFk4k,6516 +amqp/platform.py,sha256=cyLevv6E15P9zhMo_fV84p67Q_A8fdsTq9amjvlUwqE,2379 +amqp/protocol.py,sha256=Di3y6qqhnOV4QtkeYKO-zryfWqwl3F1zUxDOmVSsAp0,291 +amqp/sasl.py,sha256=yBcLmrDYQniL_fAXCT1mXD6bTYcW3vUm3izIs0XKj2c,5693 +amqp/serialization.py,sha256=-5QLtS7kIACWx8Y26AK-iSHq0bDME0dd0KP018-D8Ww,16878 +amqp/spec.py,sha256=2ZjbL4FR4Fv67HA7HUI9hLUIvAv3A4ZH6GRPzrMRyWg,2121 +amqp/transport.py,sha256=4UxpYEmflIGZW-_aL05AWcUy7Zkr3K4SLSd2nCulk2Q,24048 +amqp/types.py,sha256=Zcpcl56TTiv-IAdXJsiF3a_3CDW1MvHP5QgImH5EgJ8,14042 +amqp/utils.py,sha256=JjjY040LwsDUc1zmKP2VTzXBioVXy48DUZtWB8PaPy0,1456 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp-5.0.6.dist-info/REQUESTED b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp-5.0.6.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp-5.0.6.dist-info/WHEEL b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp-5.0.6.dist-info/WHEEL new file mode 100644 index 0000000..b552003 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp-5.0.6.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.34.2) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp-5.0.6.dist-info/top_level.txt b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp-5.0.6.dist-info/top_level.txt new file mode 100644 index 0000000..5e610d3 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp-5.0.6.dist-info/top_level.txt @@ -0,0 +1 @@ +amqp diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp/__init__.py new file mode 100644 index 0000000..9144b11 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp/__init__.py @@ -0,0 +1,75 @@ +"""Low-level AMQP client for Python (fork of amqplib).""" +# Copyright (C) 2007-2008 Barry Pederson + +import re +from collections import namedtuple + +__version__ = '5.0.6' +__author__ = 'Barry Pederson' +__maintainer__ = 'Asif Saif Uddin, Matus Valo' +__contact__ = 'pyamqp@celeryproject.org' +__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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp/abstract_channel.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp/abstract_channel.py new file mode 100644 index 0000000..f09c2ee --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp/abstract_channel.py @@ -0,0 +1,150 @@ +"""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() + + 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 overriden 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp/basic_message.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp/basic_message.py new file mode 100644 index 0000000..222d366 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp/basic_message.py @@ -0,0 +1,116 @@ +"""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 + + @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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp/channel.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp/channel.py new file mode 100644 index 0000000..dcf02c0 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp/channel.py @@ -0,0 +1,2111 @@ +"""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 + + 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) + connection._avail_channel_ids.append(channel_id) + 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 mesages. + + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp/connection.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp/connection.py new file mode 100644 index 0000000..e8aaacf --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp/connection.py @@ -0,0 +1,776 @@ +"""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, 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 extention. + """ + + 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, + 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._avail_channel_ids = array('H', range(self.channel_max, 0, -1)) + + # 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): + try: + 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() + except OSError: + pass # connection already closed on the other end + finally: + self._transport = self.connection = self.channels = None + + def _get_free_channel_id(self): + try: + return self._avail_channel_ids.pop() + except IndexError: + 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): + try: + return self._avail_channel_ids.remove(channel_id) + except ValueError: + raise ConnectionError(f'Channel {channel_id!r} already open') + + 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): Previously used, but ignored now. + """ + AMQP_HEARTBEAT_LOGGER.debug('heartbeat_tick : for connection %s', + self._connection_id) + if not self.heartbeat: + return + + # 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: + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp/exceptions.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp/exceptions.py new file mode 100644 index 0000000..0098dba --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp/exceptions.py @@ -0,0 +1,288 @@ +"""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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp/five.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp/five.py new file mode 100644 index 0000000..3a148da --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp/five.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- +"""Python 2/3 compatibility.""" +from __future__ import absolute_import, unicode_literals + +import sys + +import vine.five + +sys.modules[__name__] = vine.five diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp/method_framing.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp/method_framing.py new file mode 100644 index 0000000..5fe0505 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp/method_framing.py @@ -0,0 +1,186 @@ +"""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 + 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 + # 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 + view = buffer_store.view + 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: + # ## 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(view[:offset]) + + connection.bytes_sent += 1 + return write_frame diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp/platform.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp/platform.py new file mode 100644 index 0000000..6f6c6f3 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp/platform.py @@ -0,0 +1,79 @@ +"""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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp/protocol.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp/protocol.py new file mode 100644 index 0000000..b58d5c9 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp/protocol.py @@ -0,0 +1,12 @@ +"""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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp/sasl.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp/sasl.py new file mode 100644 index 0000000..9a98a7a --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp/sasl.py @@ -0,0 +1,174 @@ +"""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 + + 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 + + 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 + + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp/serialization.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp/serialization.py new file mode 100644 index 0000000..90f5857 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp/serialization.py @@ -0,0 +1,569 @@ +"""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 + + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp/spec.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp/spec.py new file mode 100644 index 0000000..2a1169e --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp/spec.py @@ -0,0 +1,121 @@ +"""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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp/transport.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp/transport.py new file mode 100644 index 0000000..7056be8 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp/transport.py @@ -0,0 +1,675 @@ +"""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 + + def __repr__(self): + if self.sock: + src = f'{self.sock.getsockname()[0]}:{self.sock.getsockname()[1]}' + dst = f'{self.sock.getpeername()[0]}:{self.sock.getpeername()[1]}' + 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): + e = None + + # Below we are trying to avoid additional DNS requests for AAAA if A + # succeeds. This helps a lot in case when a hostname has an IPv4 entry + # in /etc/hosts but not IPv6. Without the (arguably somewhat twisted) + # logic below, getaddrinfo would attempt to resolve the hostname for + # both IP versions, which would make the resolver talk to configured + # DNS servers. If those servers are for some reason not available + # during resolution attempt (either because of system misconfiguration, + # or network connectivity problem), resolution process locks the + # _connect call for extended time. + addr_types = (socket.AF_INET, socket.AF_INET6) + addr_types_num = len(addr_types) + for n, family in enumerate(addr_types): + # first, resolve the address for a single address family + try: + entries = socket.getaddrinfo( + host, port, family, socket.SOCK_STREAM, SOL_TCP) + entries_num = len(entries) + except socket.gaierror: + # we may have depleted all our options + if n + 1 >= addr_types_num: + # if getaddrinfo succeeded before for another address + # family, reraise the previous socket.error since it's more + # relevant to users + raise (e + if e is not None + else socket.error( + "failed to resolve broker hostname")) + continue # pragma: no cover + + # now that we have address(es) for the hostname, connect to broker + for i, res in enumerate(entries): + af, socktype, proto, _, 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 OSError as ex: + e = ex + if self.sock is not None: + self.sock.close() + self.sock = None + # we may have depleted all our options + if i + 1 >= entries_num and n + 1 >= addr_types_num: + raise + else: + # hurray, we established connection + return + + 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 overriden 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 overriden in subclass') + + def close(self): + if self.sock is not None: + self._shutdown_transport() + # Call shutdown first to make sure that pending messages + # reach the AMQP broker if the program exits after + # calling this method. + self.sock.shutdown(socket.SHUT_RDWR) + self.sock.close() + 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) + + def _setup_transport(self): + """Wrap the socket in an SSL object.""" + self.sock = self._wrap_socket(self.sock, **self.sslopts) + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp/types.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp/types.py new file mode 100644 index 0000000..0118573 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp/types.py @@ -0,0 +1,566 @@ +"""Abstract types.""" +import abc +import asyncio +import socket +from array import array +from datetime import datetime +from typing import ( + Any, Awaitable, Callable, IO, List, Mapping, + MutableMapping, NamedTuple, Optional, Sequence, SupportsInt, + TypeVar, Tuple, Union, +) +from .protocol import queue_declare_ok_t +from .spec import method_sig_t +from vine import Thenable + +Fd = TypeVar('Fd', int, IO) +Int = TypeVar('Int', SupportsInt, str) + + +class Frame(NamedTuple): + type: int + channel: int + data: bytes + + +ConnectionBlockedCallbackT = Callable[[str], Optional[Awaitable]] +ConnectionUnblockedCallbackT = Callable[[], Optional[Awaitable]] +ConnectionFrameHandlerT = Callable[[Frame], Awaitable] +ConnectionFrameWriterT = Callable[ + [int, + int, + Optional[method_sig_t], + Optional[bytes], + Optional['MessageT'], + Optional[float]], + Awaitable, +] + +WaitMethodT = Union[method_sig_t, Sequence[method_sig_t]] + + +class TransportT(metaclass=abc.ABCMeta): + """Transport type.""" + + rstream: asyncio.StreamReader + wstream: asyncio.StreamWriter + + connected: bool = False + host: str + port: int + ssl: Any + connect_timeout: float + read_timeout: float + write_timeout: float + socket_settings: Mapping + sock: socket.socket + + @abc.abstractmethod + async def connect(self) -> None: + ... + + @abc.abstractmethod + def close(self) -> None: + ... + + @abc.abstractmethod + async def read_frame(self, timeout: float = None) -> Frame: + ... + + @abc.abstractmethod + async def write(self, s: bytes, timeout: float = None) -> None: + ... + + +class ContentT(metaclass=abc.ABCMeta): + """Generic content type.""" + + CLASS_ID: int + PROPERTIES: Sequence[Tuple[str, str]] + + properties: MutableMapping + body_received: int = 0 + body_size: int = 0 + ready: bool = False + + frame_method: method_sig_t + frame_args: str + + @abc.abstractmethod + def _load_properties( + self, + class_id: int, + buf: bytes, + offset: int = 0, + classes: Mapping = None, + unpack_from: Callable = None) -> int: + ... + + @abc.abstractmethod + def _serialize_properties(self) -> bytes: + ... + + @abc.abstractmethod + def inbound_header(self, buf: bytes, offset: int = 0) -> int: + ... + + @abc.abstractmethod + def inbound_body(self, buf: bytes): + ... + + +class MessageT(ContentT, metaclass=abc.ABCMeta): + """Basic message type.""" + + body: bytes + children: Any + channel: 'ChannelT' + delivery_info: Mapping[str, Any] + + content_type: str + content_encoding: str + application_headers: MutableMapping + delivery_mode: int + priority: int + correlation_id: str + reply_to: str + expiration: str + message_id: str + timestamp: datetime + type: str + user_id: str + app_id: str + cluster_id: str + + @abc.abstractmethod + def __init__(self, + body: bytes=b'', + *, + children: Any = None, + channel: 'ChannelT' = None) -> None: + ... + + @property + @abc.abstractmethod + def headers(self) -> MutableMapping: + ... + + @property + @abc.abstractmethod + def delivery_tag(self) -> str: + ... + + +class AbstractChannelT(metaclass=abc.ABCMeta): + """Abstract channel type.""" + + connection: 'ConnectionT' + channel_id: int + auto_decode: bool = False + is_open: bool = False + + @abc.abstractmethod + def __enter__(self) -> 'AbstractChannelT': + ... + + @abc.abstractmethod + def __exit__(self, *exc_info) -> None: + ... + + @abc.abstractmethod + async def __aenter__(self) -> 'AbstractChannelT': + ... + + @abc.abstractmethod + async def __aexit__(self, *exc_info) -> None: + ... + + @abc.abstractmethod + def _setup_listeners(self): + ... + + @abc.abstractmethod + async def send_method( + self, sig: method_sig_t, + format: str = None, + args: Sequence = None, + *, + content: MessageT = None, + wait: WaitMethodT = None, + callback: Callable = None, + returns_tuple: bool = False) -> Thenable: + ... + + @abc.abstractmethod + async def close( + self, + *, + reply_code: int = 0, + reply_text: str = '', + method_sig: method_sig_t = method_sig_t(0, 0), + argsig: str = 'BsBB') -> None: + ... + + @abc.abstractmethod + def collect(self) -> None: + ... + + @abc.abstractmethod + async def wait( + self, + method: WaitMethodT, + *, + callback: Callable = None, + timeout: float = None, + returns_tuple: bool = False) -> Any: + ... + + async def dispatch_method( + self, + method_sig: method_sig_t, + payload: bytes, + content: MessageT) -> None: + ... + + +class ConnectionT(AbstractChannelT): + """Connection channel type.""" + + Channel: type + Transport: type + + host: str + userid: str + password: str + login_method: str + login_response: Any + virtual_host: str + locale: str + client_properties: MutableMapping + ssl: Any + channel_max: int + frame_max: int + on_open: Thenable + on_tune_ok: Thenable + confirm_publish: bool + connect_timeout: float + read_timeout: float + write_timeout: float + socket_settings: Mapping + + negotiate_capabilities: Mapping[str, bool] + library_properties: Mapping[str, Any] + heartbeat: float + client_heartbeat: float + server_heartbeat: float + last_heartbeat_sent: float + last_heartbeat_received: float + bytes_sent: int = 0 + bytes_recv: int = 0 + prev_sent: int + prev_recv: int + + connection_errors: Tuple[type, ...] + channel_errors: Tuple[type, ...] + recoverable_connection_errors: Tuple[type, ...] + recoverable_channel_errors: Tuple[type, ...] + + transport: TransportT + channels: MutableMapping[int, AbstractChannelT] + loop: asyncio.AbstractEventLoop + + mechanisms: List[str] + locales: List[str] + + _avail_channel_ids: array + + def __init__( + self, + host: str = 'localhost:5672', + userid: str = 'guest', + password: str = 'guest', + *, + login_method: str = 'AMQPLAIN', + login_response: Any = None, + virtual_host: str = '/', + locale: str = 'en_US', + client_properties: Mapping = None, + ssl: Any = False, + connect_timeout: float = None, + channel_max: int = None, + frame_max: int = None, + heartbeat: float = 0.0, + on_open: Thenable = None, + on_blocked: ConnectionBlockedCallbackT = None, + on_unblocked: ConnectionUnblockedCallbackT = None, + confirm_publish: bool = False, + on_tune_ok: Callable = None, + read_timeout: float = None, + write_timeout: float = None, + socket_settings: Mapping = None, + frame_handler: ConnectionFrameHandlerT = None, + frame_writer: ConnectionFrameWriterT = None, + loop: asyncio.AbstractEventLoop = None, + transport: TransportT = None, + **kwargs) -> None: + self.frame_writer = frame_writer + self.frame_handler = frame_handler + + @property + @abc.abstractmethod + def server_capabilities(self) -> Mapping: + ... + + @property + @abc.abstractmethod + def sock(self) -> socket.socket: + pass + + @abc.abstractmethod + async def connect(self, callback: Callable[[], None] = None) -> None: + ... + + @property + @abc.abstractmethod + def connected(self) -> bool: + ... + + @abc.abstractmethod + def channel(self, channel_id: int, + callback: Callable = None) -> 'AbstractChannelT': + ... + + @abc.abstractmethod + def is_alive(self) -> bool: + ... + + @abc.abstractmethod + async def drain_events(self, timeout: float = None) -> None: + ... + + @abc.abstractmethod + async def on_inbound_method( + self, + channel_id: int, + method_sig: method_sig_t, + payload: bytes, + content: MessageT) -> None: + ... + + @abc.abstractmethod + async def send_heartbeat(self) -> None: + ... + + @abc.abstractmethod + async def heartbeat_tick(self, rate: int = 2) -> None: + ... + + def _get_free_channel_id(self) -> int: + ... + + @abc.abstractmethod + def _claim_channel_id(self, channel_id: int) -> None: + ... + + +class ChannelT(AbstractChannelT, metaclass=abc.ABCMeta): + """Channel type.""" + + @abc.abstractmethod + async def flow(self, active: bool) -> None: + ... + + @abc.abstractmethod + async def open(self) -> None: + ... + + @abc.abstractmethod + async def exchange_declare( + self, exchange: str, type: str, + *, + passive: bool = False, + durable: bool = False, + auto_delete: bool = True, + nowait: bool = False, + arguments: Mapping[str, Any] = None, + argsig: str = 'BssbbbbbF') -> None: + ... + + @abc.abstractmethod + async def exchange_delete( + self, exchange: str, + *, + if_unused: bool = False, + nowait: bool = False, + argsig: str = 'Bsbb') -> None: + ... + + @abc.abstractmethod + async def exchange_bind( + self, destination: str, + source: str = '', + routing_key: str = '', + *, + nowait: bool = False, + arguments: Mapping[str, Any] = None, + argsig: str = 'BsssbF') -> None: + ... + + @abc.abstractmethod + async def exchange_unbind( + self, destination: str, + source: str = '', + routing_key: str = '', + *, + nowait: bool = False, + arguments: Mapping[str, Any] = None, + argsig: str = 'BsssbF') -> None: + ... + + @abc.abstractmethod + async def queue_bind( + self, queue: str, + exchange: str = '', + routing_key: str = '', + *, + nowait: bool = False, + arguments: Mapping[str, Any] = None, + argsig: str = 'BsssbF') -> None: + ... + + @abc.abstractmethod + async def queue_unbind( + self, queue: str, exchange: str, + routing_key: str = '', + *, + nowait: bool = False, + arguments: Mapping[str, Any] = None, + argsig: str = 'BsssF') -> None: + ... + + @abc.abstractmethod + async def queue_declare( + self, + queue: str = '', + *, + passive: bool = False, + durable: bool = False, + exclusive: bool = False, + auto_delete: bool = True, + nowait: bool = False, + arguments: Mapping[str, Any] = None, + argsig: str = 'BsbbbbbF') -> queue_declare_ok_t: + ... + + @abc.abstractmethod + async def queue_delete( + self, + queue: str = '', + *, + if_unused: bool = False, + if_empty: bool = False, + nowait: bool = False, + argsig: str = 'Bsbbb') -> None: + ... + + @abc.abstractmethod + async def queue_purge( + self, + queue: str = '', + *, + nowait: bool = False, + argsig: str = 'Bsb') -> Optional[int]: + ... + + @abc.abstractmethod + async def basic_ack( + self, delivery_tag: str, + *, + multiple: bool = False, + argsig: str = 'Lb') -> None: + ... + + @abc.abstractmethod + async def basic_cancel( + self, consumer_tag: str, + *, + nowait: bool = False, + argsig: str = 'sb') -> None: + ... + + @abc.abstractmethod + async def basic_consume( + self, + queue: str = '', + consumer_tag: str = '', + *, + no_local: bool = False, + no_ack: bool = False, + exclusive: bool = False, + nowait: bool = False, + callback: Callable = None, + arguments: Mapping[str, Any] = None, + on_cancel: Callable = None, + argsig: str = 'BssbbbbF') -> None: + ... + + @abc.abstractmethod + async def basic_get( + self, + queue: str = '', + *, + no_ack: bool = False, + argsig: str = 'Bsb') -> Optional[MessageT]: + ... + + @abc.abstractmethod + async def basic_publish( + self, msg: MessageT, + exchange: str = '', + routing_key: str = '', + *, + mandatory: bool = False, + immediate: bool = False, + timeout: float = None, + argsig: str = 'Bssbb') -> None: + ... + + @abc.abstractmethod + async def basic_qos( + self, + prefetch_size: int, + prefetch_count: int, + a_global: bool, + argsig: str = 'lBb') -> None: + ... + + @abc.abstractmethod + async def basic_recover(self, *, requeue: bool = False) -> None: + ... + + @abc.abstractmethod + async def basic_recover_async(self, *, requeue: bool = False) -> None: + ... + + @abc.abstractmethod + async def basic_reject(self, delivery_tag: str, + *, + requeue: bool = False, + argsig: str = 'Lb') -> None: + ... + + @abc.abstractmethod + async def tx_commit(self) -> None: + ... + + @abc.abstractmethod + async def tx_rollback(self) -> None: + ... + + @abc.abstractmethod + async def tx_select(self) -> None: + ... + + @abc.abstractmethod + async def confirm_select(self, *, nowait: bool = False) -> None: + ... \ No newline at end of file diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp/utils.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp/utils.py new file mode 100644 index 0000000..8ba5f67 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/amqp/utils.py @@ -0,0 +1,64 @@ +"""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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref-3.4.1.dist-info/INSTALLER b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref-3.4.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref-3.4.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref-3.4.1.dist-info/LICENSE b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref-3.4.1.dist-info/LICENSE new file mode 100644 index 0000000..5f4f225 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref-3.4.1.dist-info/LICENSE @@ -0,0 +1,27 @@ +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref-3.4.1.dist-info/METADATA b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref-3.4.1.dist-info/METADATA new file mode 100644 index 0000000..7add538 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref-3.4.1.dist-info/METADATA @@ -0,0 +1,248 @@ +Metadata-Version: 2.1 +Name: asgiref +Version: 3.4.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 +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 +Platform: UNKNOWN +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.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Topic :: Internet :: WWW/HTTP +Requires-Python: >=3.6 +License-File: LICENSE +Requires-Dist: typing-extensions ; python_version < "3.8" +Provides-Extra: tests +Requires-Dist: pytest ; extra == 'tests' +Requires-Dist: pytest-asyncio ; extra == 'tests' +Requires-Dist: mypy (>=0.800) ; extra == 'tests' + +asgiref +======= + +.. image:: https://api.travis-ci.org/django/asgiref.svg + :target: https://travis-ci.org/django/asgiref + +.. 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.6 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref-3.4.1.dist-info/RECORD b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref-3.4.1.dist-info/RECORD new file mode 100644 index 0000000..87cd66e --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref-3.4.1.dist-info/RECORD @@ -0,0 +1,30 @@ +asgiref-3.4.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +asgiref-3.4.1.dist-info/LICENSE,sha256=uEZBXRtRTpwd_xSiLeuQbXlLxUbKYSn5UKGM0JHipmk,1552 +asgiref-3.4.1.dist-info/METADATA,sha256=TZrVDUz2BP8ewHAkOyGQ8izCsiaq6YHMvj_TW5W7i2E,9162 +asgiref-3.4.1.dist-info/RECORD,, +asgiref-3.4.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +asgiref-3.4.1.dist-info/WHEEL,sha256=OqRkF0eY5GHssMorFjlbTIq072vpHpF60fIQA6lS9xA,92 +asgiref-3.4.1.dist-info/top_level.txt,sha256=bokQjCzwwERhdBiPdvYEZa4cHxT4NCeAffQNUqJ8ssg,8 +asgiref/__init__.py,sha256=z3MJNttjzZJkd4Yv_Ut_X2qO_gIKi4TijrHVpefXuRM,22 +asgiref/__pycache__/__init__.cpython-38.pyc,, +asgiref/__pycache__/_pep562.cpython-38.pyc,, +asgiref/__pycache__/compatibility.cpython-38.pyc,, +asgiref/__pycache__/current_thread_executor.cpython-38.pyc,, +asgiref/__pycache__/local.cpython-38.pyc,, +asgiref/__pycache__/server.cpython-38.pyc,, +asgiref/__pycache__/sync.cpython-38.pyc,, +asgiref/__pycache__/testing.cpython-38.pyc,, +asgiref/__pycache__/timeout.cpython-38.pyc,, +asgiref/__pycache__/typing.cpython-38.pyc,, +asgiref/__pycache__/wsgi.cpython-38.pyc,, +asgiref/_pep562.py,sha256=fyD3JhfLtViIGeXBtvhhbnbQ-R_8-nmwzbXHhncY6ow,2684 +asgiref/compatibility.py,sha256=4Plx8PT3wlDzZeuCN2cATfaXq6rya1OuSdJ262I5S6Y,2022 +asgiref/current_thread_executor.py,sha256=oeH8zv2tTmcbpxdUmOSMzbEXzeY5nJzIMFvzprE95gA,2801 +asgiref/local.py,sha256=D9kRIDARSUixNbxK8HL2O8vFhRCx_fc3fFB9uv0vG-g,4892 +asgiref/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +asgiref/server.py,sha256=lAxZxOxkdvxB073ZtYOAzN1JZ8aV-DOiFpVQJZ0X2FI,6018 +asgiref/sync.py,sha256=LCEHMPNiuoVtKrmI0kksoHeFjoSS5zLEG-n95UNd91Q,20310 +asgiref/testing.py,sha256=3byNRV7Oto_Fg8Z-fErQJ3yGf7OQlcUexbN_cDQugzQ,3119 +asgiref/timeout.py,sha256=UUYuUSY30dsqBsVzVAS7z9raQ9ntZGktScJw_Y_9iSU,3889 +asgiref/typing.py,sha256=-2wmtHqkhzV52rbMfipGTJmo8jUoU0i5AQECFH6y7aY,6722 +asgiref/wsgi.py,sha256=-L0eo_uK_dq7EPjv1meW1BRGytURaO9NPESxnJc9CtA,6575 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref-3.4.1.dist-info/REQUESTED b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref-3.4.1.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref-3.4.1.dist-info/WHEEL b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref-3.4.1.dist-info/WHEEL new file mode 100644 index 0000000..385faab --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref-3.4.1.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.36.2) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref-3.4.1.dist-info/top_level.txt b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref-3.4.1.dist-info/top_level.txt new file mode 100644 index 0000000..ddf99d3 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref-3.4.1.dist-info/top_level.txt @@ -0,0 +1 @@ +asgiref diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref/__init__.py new file mode 100644 index 0000000..a5cfdf5 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref/__init__.py @@ -0,0 +1 @@ +__version__ = "3.4.1" diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref/_pep562.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref/_pep562.py new file mode 100644 index 0000000..3059257 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref/_pep562.py @@ -0,0 +1,61 @@ +""" +Backport of PEP 562. +https://pypi.org/search/?q=pep562 +Licensed under MIT +Copyright (c) 2018 Isaac Muse +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. +""" +import sys +from typing import Any, Callable, List, Optional + + +class Pep562: + """ + Backport of PEP 562 . + Wraps the module in a class that exposes the mechanics to override `__dir__` and `__getattr__`. + The given module will be searched for overrides of `__dir__` and `__getattr__` and use them when needed. + """ + + def __init__(self, name: str) -> None: + """Acquire `__getattr__` and `__dir__`, but only replace module for versions less than Python 3.7.""" + + self._module = sys.modules[name] + self._get_attr = getattr(self._module, "__getattr__", None) + self._get_dir: Optional[Callable[..., List[str]]] = getattr( + self._module, "__dir__", None + ) + sys.modules[name] = self # type: ignore[assignment] + + def __dir__(self) -> List[str]: + """Return the overridden `dir` if one was provided, else apply `dir` to the module.""" + + return self._get_dir() if self._get_dir else dir(self._module) + + def __getattr__(self, name: str) -> Any: + """ + Attempt to retrieve the attribute from the module, and if missing, use the overridden function if present. + """ + + try: + return getattr(self._module, name) + except AttributeError: + if self._get_attr: + return self._get_attr(name) + raise + + +def pep562(module_name: str) -> None: + """Helper function to apply PEP 562.""" + + if sys.version_info < (3, 7): + Pep562(module_name) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref/compatibility.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref/compatibility.py new file mode 100644 index 0000000..614b2e6 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref/compatibility.py @@ -0,0 +1,61 @@ +import asyncio +import inspect +import sys + + +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 asyncio.iscoroutinefunction(application.__call__): + return False + # Non-classes we just check directly + return not asyncio.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 + + +if sys.version_info >= (3, 7): + # these were introduced in 3.7 + get_running_loop = asyncio.get_running_loop + run_future = asyncio.run + create_task = asyncio.create_task +else: + # marked as deprecated in 3.10, did not exist before 3.7 + get_running_loop = asyncio.get_event_loop + run_future = asyncio.ensure_future + # does nothing, this is fine for <3.7 + create_task = lambda task: task diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref/current_thread_executor.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref/current_thread_executor.py new file mode 100644 index 0000000..a7898f8 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref/current_thread_executor.py @@ -0,0 +1,81 @@ +import queue +import threading +from concurrent.futures import Executor, Future + + +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, fn, args, kwargs): + self.future = future + self.fn = fn + self.args = args + self.kwargs = kwargs + + def run(self): + 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 + 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): + self._work_thread = threading.current_thread() + self._work_queue = queue.Queue() + self._broken = False + + def run_until_future(self, future): + """ + 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 + work_item.run() + del work_item + finally: + self._broken = True + + def submit(self, fn, *args, **kwargs): + # 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() + work_item = _WorkItem(f, fn, args, kwargs) + self._work_queue.put(work_item) + # Return the future + return f diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref/local.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref/local.py new file mode 100644 index 0000000..4a17052 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref/local.py @@ -0,0 +1,122 @@ +import random +import string +import sys +import threading +import weakref + + +class Local: + """ + A drop-in replacement for threading.locals that also works with asyncio + Tasks (via the current_task asyncio method), and passes locals through + sync_to_async and async_to_sync. + + Specifically: + - Locals work per-coroutine on any thread not spawned using asgiref + - Locals work per-thread on any thread not spawned using asgiref + - Locals are shared with the parent coroutine when using sync_to_async + - Locals are shared with the parent thread when using async_to_sync + (and if that thread was launched using sync_to_async, with its parent + coroutine as well, with this working for indefinite levels of nesting) + + Set thread_critical to True to not allow locals to pass from an async Task + to a thread it spawns. This is needed for code that truly needs + thread-safety, as opposed to things used for helpful context (e.g. sqlite + does not like being called from a different thread to the one it is from). + Thread-critical code will still be differentiated per-Task within a thread + as it is expected it does not like concurrent access. + + This doesn't use contextvars as it needs to support 3.6. Once it can support + 3.7 only, we can then reimplement the storage more nicely. + """ + + CLEANUP_INTERVAL = 60 # seconds + + def __init__(self, thread_critical: bool = False) -> None: + self._thread_critical = thread_critical + self._thread_lock = threading.RLock() + self._context_refs: "weakref.WeakSet[object]" = weakref.WeakSet() + # Random suffixes stop accidental reuse between different Locals, + # though we try to force deletion as well. + self._attr_name = "_asgiref_local_impl_{}_{}".format( + id(self), + "".join(random.choice(string.ascii_letters) for i in range(8)), + ) + + def _get_context_id(self): + """ + Get the ID we should use for looking up variables + """ + # Prevent a circular reference + from .sync import AsyncToSync, SyncToAsync + + # First, pull the current task if we can + context_id = SyncToAsync.get_current_task() + context_is_async = True + # OK, let's try for a thread ID + if context_id is None: + context_id = threading.current_thread() + context_is_async = False + # If we're thread-critical, we stop here, as we can't share contexts. + if self._thread_critical: + return context_id + # Now, take those and see if we can resolve them through the launch maps + for i in range(sys.getrecursionlimit()): + try: + if context_is_async: + # Tasks have a source thread in AsyncToSync + context_id = AsyncToSync.launch_map[context_id] + context_is_async = False + else: + # Threads have a source task in SyncToAsync + context_id = SyncToAsync.launch_map[context_id] + context_is_async = True + except KeyError: + break + else: + # Catch infinite loops (they happen if you are screwing around + # with AsyncToSync implementations) + raise RuntimeError("Infinite launch_map loops") + return context_id + + def _get_storage(self): + context_obj = self._get_context_id() + if not hasattr(context_obj, self._attr_name): + setattr(context_obj, self._attr_name, {}) + self._context_refs.add(context_obj) + return getattr(context_obj, self._attr_name) + + def __del__(self): + try: + for context_obj in self._context_refs: + try: + delattr(context_obj, self._attr_name) + except AttributeError: + pass + except TypeError: + # WeakSet.__iter__ can crash when interpreter is shutting down due + # to _IterationGuard being None. + pass + + def __getattr__(self, key): + with self._thread_lock: + storage = self._get_storage() + if key in storage: + return storage[key] + else: + raise AttributeError(f"{self!r} object has no attribute {key!r}") + + def __setattr__(self, key, value): + if key in ("_context_refs", "_thread_critical", "_thread_lock", "_attr_name"): + return super().__setattr__(key, value) + with self._thread_lock: + storage = self._get_storage() + storage[key] = value + + def __delattr__(self, key): + with self._thread_lock: + storage = self._get_storage() + if key in storage: + del storage[key] + else: + raise AttributeError(f"{self!r} object has no attribute {key!r}") diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref/py.typed b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref/server.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref/server.py new file mode 100644 index 0000000..fb1c394 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref/server.py @@ -0,0 +1,157 @@ +import asyncio +import logging +import time +import traceback + +from .compatibility import get_running_loop, guarantee_single_callable, run_future + +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 = get_running_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 = run_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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref/sync.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref/sync.py new file mode 100644 index 0000000..0d9464f --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref/sync.py @@ -0,0 +1,548 @@ +import asyncio.coroutines +import functools +import inspect +import os +import sys +import threading +import warnings +import weakref +from concurrent.futures import Future, ThreadPoolExecutor +from typing import Any, Callable, Dict, Optional, overload + +from .compatibility import get_running_loop +from .current_thread_executor import CurrentThreadExecutor +from .local import Local + +if sys.version_info >= (3, 7): + import contextvars +else: + contextvars = None + + +def _restore_context(context): + # Check for changes in contextvars, and set them to the current + # context for downstream consumers + for cvar in context: + try: + if cvar.get() != context.get(cvar): + cvar.set(context.get(cvar)) + except LookupError: + cvar.set(context.get(cvar)) + + +def _iscoroutinefunction_or_partial(func: Any) -> bool: + # Python < 3.8 does not correctly determine partially wrapped + # coroutine functions are coroutine functions, hence the need for + # this to exist. Code taken from CPython. + if sys.version_info >= (3, 8): + return asyncio.iscoroutinefunction(func) + else: + while inspect.ismethod(func): + func = func.__func__ + while isinstance(func, functools.partial): + func = func.func + + return asyncio.iscoroutinefunction(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. + + In Python 3.7+, the ThreadSensitiveContext() context manager may be used to + specify a thread pool per context. + + In Python 3.6, usage of this context manager has no effect. + + 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 + + if contextvars: + + 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) + + else: + + async def __aenter__(self): + return self + + async def __aexit__(self, exc, value, tb): + pass + + +class AsyncToSync: + """ + 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. + """ + + # Maps launched Tasks to the threads that launched them (for locals impl) + launch_map: "Dict[asyncio.Task[object], threading.Thread]" = {} + + # Keeps track of which CurrentThreadExecutor to use. This uses an asgiref + # Local, not a threadlocal, so that tasks can work out what their parent used. + executors = Local() + + def __init__(self, awaitable, force_new_loop=False): + if not callable(awaitable) or not _iscoroutinefunction_or_partial(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") + self.awaitable = awaitable + try: + self.__self__ = self.awaitable.__self__ + except AttributeError: + pass + if force_new_loop: + # They have asked that we always run in a new sub-loop. + self.main_event_loop = None + else: + try: + self.main_event_loop = get_running_loop() + except RuntimeError: + # 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 + ) + else: + self.main_event_loop = None + + def __call__(self, *args, **kwargs): + # You can't call AsyncToSync from a thread with a running event loop + try: + event_loop = 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." + ) + + if contextvars is not None: + # Wrapping context in list so it can be reassigned from within + # `main_wrap`. + context = [contextvars.copy_context()] + else: + context = None + + # Make a future for the return information + call_result = Future() + # Get the source thread + source_thread = threading.current_thread() + # 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. + if hasattr(self.executors, "current"): + old_current_executor = self.executors.current + else: + old_current_executor = None + current_executor = CurrentThreadExecutor() + self.executors.current = current_executor + # 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( + args, kwargs, call_result, source_thread, sys.exc_info(), context + ) + + 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() + 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 hasattr(self.executors, "current"): + del self.executors.current + if old_current_executor: + self.executors.current = old_current_executor + if contextvars is not None: + _restore_context(context[0]) + + # 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 + if sys.version_info >= (3, 7, 0): + tasks = asyncio.all_tasks(loop) + else: + tasks = asyncio.Task.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, objtype): + """ + Include self for methods + """ + func = functools.partial(self.__call__, parent) + return functools.update_wrapper(func, self.awaitable) + + async def main_wrap( + self, args, kwargs, call_result, source_thread, exc_info, context + ): + """ + Wraps the awaitable with something that puts the result into the + result/exception future. + """ + if context is not None: + _restore_context(context[0]) + + current_task = SyncToAsync.get_current_task() + self.launch_map[current_task] = source_thread + 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: + del self.launch_map[current_task] + + if context is not None: + context[0] = contextvars.copy_context() + + +class SyncToAsync: + """ + 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. + """ + + # If they've set ASGI_THREADS, update the default asyncio executor for now + if "ASGI_THREADS" in os.environ: + loop = get_running_loop() + loop.set_default_executor( + ThreadPoolExecutor(max_workers=int(os.environ["ASGI_THREADS"])) + ) + + # Maps launched threads to the coroutines that spawned them + launch_map: "Dict[threading.Thread, asyncio.Task[object]]" = {} + + # 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. + if sys.version_info >= (3, 7): + thread_sensitive_context: "contextvars.ContextVar[str]" = ( + contextvars.ContextVar("thread_sensitive_context") + ) + else: + thread_sensitive_context: None = None + + # Contextvar that is used to detect if the single thread executor + # would be awaited on while already being used in the same context + if sys.version_info >= (3, 7): + deadlock_context: "contextvars.ContextVar[bool]" = contextvars.ContextVar( + "deadlock_context" + ) + else: + deadlock_context: None = None + + # 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[object, ThreadPoolExecutor]" = ( + weakref.WeakKeyDictionary() + ) + + def __init__( + self, + func: Callable[..., Any], + thread_sensitive: bool = True, + executor: Optional["ThreadPoolExecutor"] = None, + ) -> None: + if not callable(func) or _iscoroutinefunction_or_partial(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 + self._is_coroutine = asyncio.coroutines._is_coroutine # type: ignore + 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, **kwargs): + loop = get_running_loop() + + # Work out what thread to run the code in + if self._thread_sensitive: + if hasattr(AsyncToSync.executors, "current"): + # If we have a parent sync thread above somewhere, use that + executor = AsyncToSync.executors.current + elif self.thread_sensitive_context and 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 self.deadlock_context and 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 + if self.deadlock_context: + self.deadlock_context.set(True) + else: + # Use the passed in executor, or the loop's default if it is None + executor = self._executor + + if contextvars is not None: + context = contextvars.copy_context() + child = functools.partial(self.func, *args, **kwargs) + func = context.run + args = (child,) + kwargs = {} + else: + func = self.func + + try: + # Run the code in the right thread + future = loop.run_in_executor( + executor, + functools.partial( + self.thread_handler, + loop, + self.get_current_task(), + sys.exc_info(), + func, + *args, + **kwargs, + ), + ) + ret = await asyncio.wait_for(future, timeout=None) + + finally: + if contextvars is not None: + _restore_context(context) + if self.deadlock_context: + self.deadlock_context.set(False) + + return ret + + def __get__(self, parent, objtype): + """ + Include self for methods + """ + return functools.partial(self.__call__, parent) + + def thread_handler(self, loop, source_task, exc_info, func, *args, **kwargs): + """ + Wraps the sync application with exception handling. + """ + # Set the threadlocal for AsyncToSync + self.threadlocal.main_event_loop = loop + self.threadlocal.main_event_loop_pid = os.getpid() + # Set the task mapping (used for the locals module) + current_thread = threading.current_thread() + if AsyncToSync.launch_map.get(source_task) == current_thread: + # Our parent task was launched from this same thread, so don't make + # a launch map entry - let it shortcut over us! (and stop infinite loops) + parent_set = False + else: + self.launch_map[current_thread] = source_task + parent_set = True + # Run the function + 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: + return func(*args, **kwargs) + else: + return func(*args, **kwargs) + finally: + # Only delete the launch_map parent if we set it, otherwise it is + # from someone else. + if parent_set: + del self.launch_map[current_thread] + + @staticmethod + def get_current_task(): + """ + Cross-version implementation of asyncio.current_task() + + Returns None if there is no task. + """ + try: + if hasattr(asyncio, "current_task"): + # Python 3.7 and up + return asyncio.current_task() + else: + # Python 3.6 + return asyncio.Task.current_task() + except RuntimeError: + return None + + +# Lowercase aliases (and decorator friendliness) +async_to_sync = AsyncToSync + + +@overload +def sync_to_async( + func: None = None, + thread_sensitive: bool = True, + executor: Optional["ThreadPoolExecutor"] = None, +) -> Callable[[Callable[..., Any]], SyncToAsync]: + ... + + +@overload +def sync_to_async( + func: Callable[..., Any], + thread_sensitive: bool = True, + executor: Optional["ThreadPoolExecutor"] = None, +) -> SyncToAsync: + ... + + +def sync_to_async( + func=None, + thread_sensitive=True, + executor=None, +): + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref/testing.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref/testing.py new file mode 100644 index 0000000..6624317 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref/testing.py @@ -0,0 +1,97 @@ +import asyncio +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() + self.future = asyncio.ensure_future( + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref/timeout.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref/timeout.py new file mode 100644 index 0000000..2171a26 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref/timeout.py @@ -0,0 +1,127 @@ +# 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 sys +from types import TracebackType +from typing import Any, 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_event_loop() + 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 = 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 + + +def current_task(loop: asyncio.AbstractEventLoop) -> "Optional[asyncio.Task[Any]]": + if sys.version_info >= (3, 7): + task = asyncio.current_task(loop=loop) + else: + task = asyncio.Task.current_task(loop=loop) + if task is None: + # this should be removed, tokio must use register_task and family API + fn = getattr(loop, "current_task", None) + if fn is not None: + task = fn() + + return task diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref/typing.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref/typing.py new file mode 100644 index 0000000..c8c2e78 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref/typing.py @@ -0,0 +1,287 @@ +import sys +import warnings +from typing import ( + Any, + Awaitable, + Callable, + Dict, + Iterable, + List, + Optional, + Tuple, + Type, + Union, +) + +from asgiref._pep562 import pep562 + +if sys.version_info >= (3, 8): + from typing import Literal, Protocol, TypedDict +else: + from typing_extensions import Literal, Protocol, TypedDict + +__all__ = ( + "ASGIVersions", + "HTTPScope", + "WebSocketScope", + "LifespanScope", + "WWWScope", + "Scope", + "HTTPRequestEvent", + "HTTPResponseStartEvent", + "HTTPResponseBodyEvent", + "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]]] + 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] + extensions: Optional[Dict[str, Dict[object, object]]] + + +class LifespanScope(TypedDict): + type: Literal["lifespan"] + asgi: ASGIVersions + + +WWWScope = Union[HTTPScope, WebSocketScope] +Scope = Union[HTTPScope, WebSocketScope, LifespanScope] + + +class HTTPRequestEvent(TypedDict): + type: Literal["http.request"] + body: bytes + more_body: bool + + +class HTTPResponseStartEvent(TypedDict): + type: Literal["http.response.start"] + status: int + headers: Iterable[Tuple[bytes, bytes]] + + +class HTTPResponseBodyEvent(TypedDict): + type: Literal["http.response.body"] + body: bytes + more_body: bool + + +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, + 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] + +__deprecated__ = { + "WebsocketConnectEvent": WebSocketConnectEvent, + "WebsocketAcceptEvent": WebSocketAcceptEvent, + "WebsocketReceiveEvent": WebSocketReceiveEvent, + "WebsocketSendEvent": WebSocketSendEvent, + "WebsocketResponseStartEvent": WebSocketResponseStartEvent, + "WebsocketResponseBodyEvent": WebSocketResponseBodyEvent, + "WebsocketDisconnectEvent": WebSocketDisconnectEvent, + "WebsocketCloseEvent": WebSocketCloseEvent, +} + + +def __getattr__(name: str) -> Any: + deprecated = __deprecated__.get(name) + if deprecated: + stacklevel = 3 if sys.version_info >= (3, 7) else 4 + warnings.warn( + f"'{name}' is deprecated. Use '{deprecated.__name__}' instead.", + category=DeprecationWarning, + stacklevel=stacklevel, + ) + return deprecated + raise AttributeError(f"module '{__name__}' has no attribute '{name}'") + + +def __dir__() -> List[str]: + return sorted(list(__all__) + list(__deprecated__.keys())) + + +pep562(__name__) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref/wsgi.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref/wsgi.py new file mode 100644 index 0000000..40fba20 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/asgiref/wsgi.py @@ -0,0 +1,162 @@ +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. + """ + environ = { + "REQUEST_METHOD": scope["method"], + "SCRIPT_NAME": scope.get("root_path", "").encode("utf8").decode("latin1"), + "PATH_INFO": scope["path"].encode("utf8").decode("latin1"), + "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 "client" in scope: + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/__init__.py new file mode 100644 index 0000000..521048d --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/__init__.py @@ -0,0 +1,8 @@ +from pkg_resources import get_distribution + +import django + +if django.VERSION < (3, 2): + default_app_config = "axes.apps.AppConfig" + +__version__ = get_distribution("django-axes").version diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/admin.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/admin.py new file mode 100644 index 0000000..ee36b31 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/admin.py @@ -0,0 +1,83 @@ +from django.contrib import admin +from django.utils.translation import gettext_lazy as _ + +from axes.conf import settings +from axes.models import AccessAttempt, AccessLog + + +class AccessAttemptAdmin(admin.ModelAdmin): + list_display = ( + "attempt_time", + "ip_address", + "user_agent", + "username", + "path_info", + "failures_since_start", + ) + + list_filter = ["attempt_time", "path_info"] + + search_fields = ["ip_address", "username", "user_agent", "path_info"] + + date_hierarchy = "attempt_time" + + fieldsets = ( + (None, {"fields": ("path_info", "failures_since_start")}), + (_("Form Data"), {"fields": ("get_data", "post_data")}), + (_("Meta Data"), {"fields": ("user_agent", "ip_address", "http_accept")}), + ) + + readonly_fields = [ + "user_agent", + "ip_address", + "username", + "http_accept", + "path_info", + "attempt_time", + "get_data", + "post_data", + "failures_since_start", + ] + + def has_add_permission(self, request): + return False + + +class AccessLogAdmin(admin.ModelAdmin): + list_display = ( + "attempt_time", + "logout_time", + "ip_address", + "username", + "user_agent", + "path_info", + ) + + list_filter = ["attempt_time", "logout_time", "path_info"] + + search_fields = ["ip_address", "user_agent", "username", "path_info"] + + date_hierarchy = "attempt_time" + + fieldsets = ( + (None, {"fields": ("path_info",)}), + (_("Meta Data"), {"fields": ("user_agent", "ip_address", "http_accept")}), + ) + + readonly_fields = [ + "user_agent", + "ip_address", + "username", + "http_accept", + "path_info", + "attempt_time", + "logout_time", + ] + + def has_add_permission(self, request): + return False + + +if settings.AXES_ENABLE_ADMIN: + admin.site.register(AccessAttempt, AccessAttemptAdmin) + admin.site.register(AccessLog, AccessLogAdmin) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/apps.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/apps.py new file mode 100644 index 0000000..52737ba --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/apps.py @@ -0,0 +1,49 @@ +from logging import getLogger + +from django import apps +from pkg_resources import get_distribution + +log = getLogger(__name__) + + +class AppConfig(apps.AppConfig): + default_auto_field = "django.db.models.AutoField" + name = "axes" + initialized = False + + @classmethod + def initialize(cls): + """ + Initialize Axes logging and show version information. + + This method is re-entrant and can be called multiple times. + It displays version information exactly once at application startup. + """ + + if cls.initialized: + return + cls.initialized = True + + # Only import settings, checks, and signals one time after Django has been initialized + from axes.conf import settings # noqa + from axes import checks, signals # noqa + + # Skip startup log messages if Axes is not set to verbose + if settings.AXES_VERBOSE: + log.info("AXES: BEGIN LOG") + log.info( + "AXES: Using django-axes version %s", + get_distribution("django-axes").version, + ) + + if settings.AXES_ONLY_USER_FAILURES: + log.info("AXES: blocking by username only.") + elif settings.AXES_LOCK_OUT_BY_COMBINATION_USER_AND_IP: + log.info("AXES: blocking by combination of username and IP.") + elif settings.AXES_LOCK_OUT_BY_USER_OR_IP: + log.info("AXES: blocking by username or IP.") + else: + log.info("AXES: blocking by IP only.") + + def ready(self): + self.initialize() diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/attempts.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/attempts.py new file mode 100644 index 0000000..a47eb60 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/attempts.py @@ -0,0 +1,99 @@ +from logging import getLogger +from typing import List + +from django.db.models import QuerySet +from django.utils.timezone import datetime, now + +from axes.conf import settings +from axes.helpers import get_client_username, get_client_parameters, get_cool_off +from axes.models import AccessAttempt + +log = getLogger(__name__) + + +def get_cool_off_threshold(attempt_time: datetime = None) -> datetime: + """ + Get threshold for fetching access attempts from the database. + """ + + cool_off = get_cool_off() + if cool_off is None: + raise TypeError( + "Cool off threshold can not be calculated with settings.AXES_COOLOFF_TIME set to None" + ) + + if attempt_time is None: + return now() - cool_off + return attempt_time - cool_off + + +def filter_user_attempts(request, credentials: dict = None) -> List[QuerySet]: + """ + Return a list querysets of AccessAttempts that match the given request and credentials. + """ + + username = get_client_username(request, credentials) + + filter_kwargs_list = get_client_parameters( + username, request.axes_ip_address, request.axes_user_agent + ) + attempts_list = [ + AccessAttempt.objects.filter(**filter_kwargs) + for filter_kwargs in filter_kwargs_list + ] + return attempts_list + + +def get_user_attempts(request, credentials: dict = None) -> List[QuerySet]: + """ + Get list of querysets with valid user attempts that match the given request and credentials. + """ + + attempts_list = filter_user_attempts(request, credentials) + + if settings.AXES_COOLOFF_TIME is None: + log.debug( + "AXES: Getting all access attempts from database because no AXES_COOLOFF_TIME is configured" + ) + return attempts_list + + threshold = get_cool_off_threshold(request.axes_attempt_time) + log.debug("AXES: Getting access attempts that are newer than %s", threshold) + return [attempts.filter(attempt_time__gte=threshold) for attempts in attempts_list] + + +def clean_expired_user_attempts(attempt_time: datetime = None) -> int: + """ + Clean expired user attempts from the database. + """ + + if settings.AXES_COOLOFF_TIME is None: + log.debug( + "AXES: Skipping clean for expired access attempts because no AXES_COOLOFF_TIME is configured" + ) + return 0 + + threshold = get_cool_off_threshold(attempt_time) + count, _ = AccessAttempt.objects.filter(attempt_time__lt=threshold).delete() + log.info( + "AXES: Cleaned up %s expired access attempts from database that were older than %s", + count, + threshold, + ) + return count + + +def reset_user_attempts(request, credentials: dict = None) -> int: + """ + Reset all user attempts that match the given request and credentials. + """ + + attempts_list = filter_user_attempts(request, credentials) + + count = 0 + for attempts in attempts_list: + _count, _ = attempts.delete() + count += _count + log.info("AXES: Reset %s access attempts from database.", count) + + return count diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/backends.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/backends.py new file mode 100644 index 0000000..5616979 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/backends.py @@ -0,0 +1,62 @@ +from django.contrib.auth.backends import ModelBackend + +from axes.exceptions import ( + AxesBackendPermissionDenied, + AxesBackendRequestParameterRequired, +) +from axes.handlers.proxy import AxesProxyHandler +from axes.helpers import get_credentials, get_lockout_message, toggleable + + +class AxesBackend(ModelBackend): + """ + Authentication backend class that forbids login attempts for locked out users. + + Use this class as the first item of ``AUTHENTICATION_BACKENDS`` to + prevent locked out users from being logged in by the Django authentication flow. + + .. note:: This backend does not log your user in. It monitors login attempts. + Authentication is handled by the following backends that are configured in ``AUTHENTICATION_BACKENDS``. + """ + + @toggleable + def authenticate( + self, request, username: str = None, password: str = None, **kwargs: dict + ): + """ + Checks user lockout status and raises an exception if user is not allowed to log in. + + This method interrupts the login flow and inserts error message directly to the + ``response_context`` attribute that is supplied as a keyword argument. + + :keyword response_context: kwarg that will be have its ``error`` attribute updated with context. + :raises AxesBackendRequestParameterRequired: if request parameter is not passed. + :raises AxesBackendPermissionDenied: if user is already locked out. + """ + + if request is None: + raise AxesBackendRequestParameterRequired( + "AxesBackend requires a request as an argument to authenticate" + ) + + credentials = get_credentials(username=username, password=password, **kwargs) + + if AxesProxyHandler.is_allowed(request, credentials): + return + + # Locked out, don't try to authenticate, just update response_context and return. + # Its a bit weird to pass a context and expect a response value but its nice to get a "why" back. + + error_msg = get_lockout_message() + response_context = kwargs.get("response_context", {}) + response_context["error"] = error_msg + + # Raise an error that stops the authentication flows at django.contrib.auth.authenticate. + # This error stops bubbling up at the authenticate call which catches backend PermissionDenied errors. + # After this error is caught by authenticate it emits a signal indicating user login failed, + # which is processed by axes.signals.log_user_login_failed which logs and flags the failed request. + # The axes.middleware.AxesMiddleware further processes the flagged request into a readable response. + + raise AxesBackendPermissionDenied( + "AxesBackend detected that the given user is locked out" + ) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/checks.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/checks.py new file mode 100644 index 0000000..249eb22 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/checks.py @@ -0,0 +1,144 @@ +from django.core.checks import ( # pylint: disable=redefined-builtin + Tags, + Warning, + register, +) +from django.utils.module_loading import import_string + +from axes.backends import AxesBackend +from axes.conf import settings + + +class Messages: + CACHE_INVALID = ( + "You are using the django-axes cache handler for login attempt tracking." + " Your cache configuration is however invalid and will not work correctly with django-axes." + " This can leave security holes in your login systems as attempts are not tracked correctly." + " Reconfigure settings.AXES_CACHE and settings.CACHES per django-axes configuration documentation." + ) + MIDDLEWARE_INVALID = ( + "You do not have 'axes.middleware.AxesMiddleware' in your settings.MIDDLEWARE." + ) + BACKEND_INVALID = "You do not have 'axes.backends.AxesBackend' or a subclass in your settings.AUTHENTICATION_BACKENDS." + SETTING_DEPRECATED = "You have a deprecated setting {deprecated_setting} configured in your project settings" + + +class Hints: + CACHE_INVALID = None + MIDDLEWARE_INVALID = None + BACKEND_INVALID = ( + "AxesModelBackend was renamed to AxesBackend in django-axes version 5.0." + ) + SETTING_DEPRECATED = None + + +class Codes: + CACHE_INVALID = "axes.W001" + MIDDLEWARE_INVALID = "axes.W002" + BACKEND_INVALID = "axes.W003" + SETTING_DEPRECATED = "axes.W004" + + +@register(Tags.security, Tags.caches, Tags.compatibility) +def axes_cache_check(app_configs, **kwargs): # pylint: disable=unused-argument + axes_handler = getattr(settings, "AXES_HANDLER", "") + + axes_cache_key = getattr(settings, "AXES_CACHE", "default") + axes_cache_config = settings.CACHES.get(axes_cache_key, {}) + axes_cache_backend = axes_cache_config.get("BACKEND", "") + + axes_cache_backend_incompatible = [ + "django.core.cache.backends.dummy.DummyCache", + "django.core.cache.backends.locmem.LocMemCache", + "django.core.cache.backends.filebased.FileBasedCache", + ] + + warnings = [] + + if axes_handler == "axes.handlers.cache.AxesCacheHandler": + if axes_cache_backend in axes_cache_backend_incompatible: + warnings.append( + Warning( + msg=Messages.CACHE_INVALID, + hint=Hints.CACHE_INVALID, + id=Codes.CACHE_INVALID, + ) + ) + + return warnings + + +@register(Tags.security, Tags.compatibility) +def axes_middleware_check(app_configs, **kwargs): # pylint: disable=unused-argument + warnings = [] + + if "axes.middleware.AxesMiddleware" not in settings.MIDDLEWARE: + warnings.append( + Warning( + msg=Messages.MIDDLEWARE_INVALID, + hint=Hints.MIDDLEWARE_INVALID, + id=Codes.MIDDLEWARE_INVALID, + ) + ) + + return warnings + + +@register(Tags.security, Tags.compatibility) +def axes_backend_check(app_configs, **kwargs): # pylint: disable=unused-argument + warnings = [] + + found = False + for name in settings.AUTHENTICATION_BACKENDS: + try: + backend = import_string(name) + except ModuleNotFoundError as e: + raise ModuleNotFoundError( + "Can not find module path defined in settings.AUTHENTICATION_BACKENDS" + ) from e + except ImportError as e: + raise ImportError( + "Can not import backend class defined in settings.AUTHENTICATION_BACKENDS" + ) from e + + if issubclass(backend, AxesBackend): + found = True + break + + if not found: + warnings.append( + Warning( + msg=Messages.BACKEND_INVALID, + hint=Hints.BACKEND_INVALID, + id=Codes.BACKEND_INVALID, + ) + ) + + return warnings + + +@register(Tags.compatibility) +def axes_deprecation_check(app_configs, **kwargs): # pylint: disable=unused-argument + warnings = [] + + deprecated_settings = [ + "AXES_DISABLE_SUCCESS_ACCESS_LOG", + "AXES_LOGGER", + ] + + for deprecated_setting in deprecated_settings: + try: + getattr(settings, deprecated_setting) + warnings.append( + Warning( + msg=Messages.SETTING_DEPRECATED.format( + deprecated_setting=deprecated_setting + ), + hint=None, + id=Codes.SETTING_DEPRECATED, + ) + ) + except AttributeError: + pass + + return warnings diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/conf.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/conf.py new file mode 100644 index 0000000..4747f1b --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/conf.py @@ -0,0 +1,131 @@ +from django.conf import settings +from django.utils.translation import gettext_lazy as _ + + +# disable plugin when set to False +settings.AXES_ENABLED = getattr(settings, "AXES_ENABLED", True) + +# see if the user has overridden the failure limit +settings.AXES_FAILURE_LIMIT = getattr(settings, "AXES_FAILURE_LIMIT", 3) + +# see if the user has set axes to lock out logins after failure limit +settings.AXES_LOCK_OUT_AT_FAILURE = getattr(settings, "AXES_LOCK_OUT_AT_FAILURE", True) + +# lock out with the combination of username and IP address +settings.AXES_LOCK_OUT_BY_COMBINATION_USER_AND_IP = getattr( + settings, "AXES_LOCK_OUT_BY_COMBINATION_USER_AND_IP", False +) + +# lock out with the username or IP address +settings.AXES_LOCK_OUT_BY_USER_OR_IP = getattr( + settings, "AXES_LOCK_OUT_BY_USER_OR_IP", False +) + +# lock out with username and never the IP or user agent +settings.AXES_ONLY_USER_FAILURES = getattr(settings, "AXES_ONLY_USER_FAILURES", False) + +# lock out just for admin site +settings.AXES_ONLY_ADMIN_SITE = getattr(settings, "AXES_ONLY_ADMIN_SITE", False) + +# show Axes logs in admin +settings.AXES_ENABLE_ADMIN = getattr(settings, "AXES_ENABLE_ADMIN", True) + +# lock out with the user agent, has no effect when ONLY_USER_FAILURES is set +settings.AXES_USE_USER_AGENT = getattr(settings, "AXES_USE_USER_AGENT", False) + +# use a specific username field to retrieve from login POST data +settings.AXES_USERNAME_FORM_FIELD = getattr( + settings, "AXES_USERNAME_FORM_FIELD", "username" +) + +# use a specific password field to retrieve from login POST data +settings.AXES_PASSWORD_FORM_FIELD = getattr( + settings, "AXES_PASSWORD_FORM_FIELD", "password" +) # noqa + +# use a provided callable to transform the POSTed username into the one used in credentials +settings.AXES_USERNAME_CALLABLE = getattr(settings, "AXES_USERNAME_CALLABLE", None) + +# determine if given user should be always allowed to attempt authentication +settings.AXES_WHITELIST_CALLABLE = getattr(settings, "AXES_WHITELIST_CALLABLE", None) + +# return custom lockout response if configured +settings.AXES_LOCKOUT_CALLABLE = getattr(settings, "AXES_LOCKOUT_CALLABLE", None) + +# reset the number of failed attempts after one successful attempt +settings.AXES_RESET_ON_SUCCESS = getattr(settings, "AXES_RESET_ON_SUCCESS", False) + +settings.AXES_DISABLE_ACCESS_LOG = getattr(settings, "AXES_DISABLE_ACCESS_LOG", False) + +settings.AXES_HANDLER = getattr( + settings, "AXES_HANDLER", "axes.handlers.database.AxesDatabaseHandler" +) + +settings.AXES_LOCKOUT_TEMPLATE = getattr(settings, "AXES_LOCKOUT_TEMPLATE", None) + +settings.AXES_LOCKOUT_URL = getattr(settings, "AXES_LOCKOUT_URL", None) + +settings.AXES_COOLOFF_TIME = getattr(settings, "AXES_COOLOFF_TIME", None) + +settings.AXES_VERBOSE = getattr(settings, "AXES_VERBOSE", settings.AXES_ENABLED) + +# whitelist and blacklist +settings.AXES_NEVER_LOCKOUT_WHITELIST = getattr( + settings, "AXES_NEVER_LOCKOUT_WHITELIST", False +) + +settings.AXES_NEVER_LOCKOUT_GET = getattr(settings, "AXES_NEVER_LOCKOUT_GET", False) + +settings.AXES_ONLY_WHITELIST = getattr(settings, "AXES_ONLY_WHITELIST", False) + +settings.AXES_IP_WHITELIST = getattr(settings, "AXES_IP_WHITELIST", None) + +settings.AXES_IP_BLACKLIST = getattr(settings, "AXES_IP_BLACKLIST", None) + +# message to show when locked out and have cooloff enabled +settings.AXES_COOLOFF_MESSAGE = getattr( + settings, + "AXES_COOLOFF_MESSAGE", + _("Account locked: too many login attempts. Please try again later."), +) + +# message to show when locked out and have cooloff disabled +settings.AXES_PERMALOCK_MESSAGE = getattr( + settings, + "AXES_PERMALOCK_MESSAGE", + _( + "Account locked: too many login attempts. Contact an admin to unlock your account." + ), +) + +# if your deployment is using reverse proxies, set this value to 'left-most' or 'right-most' per your configuration +settings.AXES_PROXY_ORDER = getattr(settings, "AXES_PROXY_ORDER", "left-most") + +# if your deployment is using reverse proxies, set this value to the number of proxies in front of Django +settings.AXES_PROXY_COUNT = getattr(settings, "AXES_PROXY_COUNT", None) + +# if your deployment is using reverse proxies, set to your trusted proxy IP addresses prefixes if needed +settings.AXES_PROXY_TRUSTED_IPS = getattr(settings, "AXES_PROXY_TRUSTED_IPS", None) + +# set to the names of request.META attributes that should be checked for the IP address of the client +# if your deployment is using reverse proxies, ensure that the header attributes are securely set by the proxy +# ensure that the client can not spoof the headers by setting them and sending them through the proxy +settings.AXES_META_PRECEDENCE_ORDER = getattr( + settings, + "AXES_META_PRECEDENCE_ORDER", + getattr(settings, "IPWARE_META_PRECEDENCE_ORDER", ("REMOTE_ADDR",)), +) + +# set CORS allowed origins when calling authentication over ajax +settings.AXES_ALLOWED_CORS_ORIGINS = getattr(settings, "AXES_ALLOWED_CORS_ORIGINS", "*") + +# set the list of sensitive parameters to cleanse from get/post data before logging +settings.AXES_SENSITIVE_PARAMETERS = getattr( + settings, + "AXES_SENSITIVE_PARAMETERS", + [], +) + +# set the callable for the readable string that can be used in +# e.g. logging to distinguish client requests +settings.AXES_CLIENT_STR_CALLABLE = getattr(settings, "AXES_CLIENT_STR_CALLABLE", None) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/decorators.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/decorators.py new file mode 100644 index 0000000..6ad41c6 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/decorators.py @@ -0,0 +1,26 @@ +from functools import wraps + +from axes.handlers.proxy import AxesProxyHandler +from axes.helpers import get_lockout_response + + +def axes_dispatch(func): + @wraps(func) + def inner(request, *args, **kwargs): + if AxesProxyHandler.is_allowed(request): + return func(request, *args, **kwargs) + + return get_lockout_response(request) + + return inner + + +def axes_form_invalid(func): + @wraps(func) + def inner(self, *args, **kwargs): + if AxesProxyHandler.is_allowed(self.request): + return func(self, *args, **kwargs) + + return get_lockout_response(self.request) + + return inner diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/exceptions.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/exceptions.py new file mode 100644 index 0000000..007d446 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/exceptions.py @@ -0,0 +1,13 @@ +from django.core.exceptions import PermissionDenied + + +class AxesBackendPermissionDenied(PermissionDenied): + """ + Raised by authentication backend on locked out requests to stop the Django authentication flow. + """ + + +class AxesBackendRequestParameterRequired(ValueError): + """ + Raised by authentication backend on invalid or missing request parameter value. + """ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/handlers/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/handlers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/handlers/base.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/handlers/base.py new file mode 100644 index 0000000..b115013 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/handlers/base.py @@ -0,0 +1,193 @@ +import re +from abc import ABC, abstractmethod + +from django.urls import reverse +from django.urls.exceptions import NoReverseMatch + +from axes.conf import settings +from axes.helpers import ( + get_failure_limit, + is_client_ip_address_blacklisted, + is_client_ip_address_whitelisted, + is_client_method_whitelisted, + is_user_attempt_whitelisted, +) + + +class AbstractAxesHandler(ABC): + """ + Contract that all handlers need to follow + """ + + @abstractmethod + def user_login_failed(self, sender, credentials: dict, request=None, **kwargs): + """ + Handles the Django ``django.contrib.auth.signals.user_login_failed`` authentication signal. + """ + raise NotImplementedError("user_login_failed should be implemented") + + @abstractmethod + def user_logged_in(self, sender, request, user, **kwargs): + """ + Handles the Django ``django.contrib.auth.signals.user_logged_in`` authentication signal. + """ + raise NotImplementedError("user_logged_in should be implemented") + + @abstractmethod + def user_logged_out(self, sender, request, user, **kwargs): + """ + Handles the Django ``django.contrib.auth.signals.user_logged_out`` authentication signal. + """ + raise NotImplementedError("user_logged_out should be implemented") + + @abstractmethod + def get_failures(self, request, credentials: dict = None) -> int: + """ + Checks the number of failures associated to the given request and credentials. + + This is a virtual method that needs an implementation in the handler subclass + if the ``settings.AXES_LOCK_OUT_AT_FAILURE`` flag is set to ``True``. + """ + raise NotImplementedError("get_failures should be implemented") + + +class AxesBaseHandler: # pylint: disable=unused-argument + """ + Handler API definition for implementations that are used by the ``AxesProxyHandler``. + + If you wish to specialize your own handler class, override the necessary methods + and configure the class for use by setting ``settings.AXES_HANDLER = 'module.path.to.YourClass'``. + Make sure that new the handler is compliant with AbstractAxesHandler and make sure it extends from this mixin. + Refer to `AxesHandler` for an example. + + The default implementation that is actually used by Axes is ``axes.handlers.database.AxesDatabaseHandler``. + + .. note:: This is a virtual class and **can not be used without specialization**. + """ + + def is_allowed(self, request, credentials: dict = None) -> bool: + """ + Checks if the user is allowed to access or use given functionality such as a login view or authentication. + + This method is abstract and other backends can specialize it as needed, but the default implementation + checks if the user has attempted to authenticate into the site too many times through the + Django authentication backends and returns ``False`` if user exceeds the configured Axes thresholds. + + This checker can implement arbitrary checks such as IP whitelisting or blacklisting, + request frequency checking, failed attempt monitoring or similar functions. + + Please refer to the ``axes.handlers.database.AxesDatabaseHandler`` for the default implementation + and inspiration on some common checks and access restrictions before writing your own implementation. + """ + + if self.is_admin_site(request): + return True + + if self.is_blacklisted(request, credentials): + return False + + if self.is_whitelisted(request, credentials): + return True + + if self.is_locked(request, credentials): + return False + + return True + + def is_blacklisted(self, request, credentials: dict = None) -> bool: + """ + Checks if the request or given credentials are blacklisted from access. + """ + + if is_client_ip_address_blacklisted(request): + return True + + return False + + def is_whitelisted(self, request, credentials: dict = None) -> bool: + """ + Checks if the request or given credentials are whitelisted for access. + """ + + if is_user_attempt_whitelisted(request, credentials): + return True + + if is_client_ip_address_whitelisted(request): + return True + + if is_client_method_whitelisted(request): + return True + + return False + + def is_locked(self, request, credentials: dict = None) -> bool: + """ + Checks if the request or given credentials are locked. + """ + + if settings.AXES_LOCK_OUT_AT_FAILURE: + # get_failures will have to be implemented by each specialized handler + return self.get_failures( # type: ignore + request, credentials + ) >= get_failure_limit(request, credentials) + + return False + + def is_admin_site(self, request) -> bool: + """ + Checks if the request is for admin site. + """ + if settings.AXES_ONLY_ADMIN_SITE and hasattr(request, "path"): + try: + admin_url = reverse("admin:index") + except NoReverseMatch: + return True + return not re.match("^%s" % admin_url, request.path) + + return False + + def reset_attempts( + self, + *, + ip_address: str = None, + username: str = None, + ip_or_username: bool = False, + ) -> int: + """ + Resets access attempts that match the given IP address or username. + + This method makes more sense for the DB backend, but as it is used by the ProxyHandler + (via inherent), it needs to be defined here so we get compliant with all proxy methods. + + Please overwrite it on each specialized handler as needed. + """ + return 0 + + def reset_logs(self, *, age_days: int = None) -> int: + """ + Resets access logs that are older than given number of days. + + This method makes more sense for the DB backend, but as it is used by the ProxyHandler + (via inherent), it needs to be defined here so we get compliant with all proxy methods. + + Please overwrite it on each specialized handler as needed. + """ + return 0 + + +class AxesHandler(AbstractAxesHandler, AxesBaseHandler): + """ + Signal bare handler implementation without any storage backend. + """ + + def user_login_failed(self, sender, credentials: dict, request=None, **kwargs): + pass + + def user_logged_in(self, sender, request, user, **kwargs): + pass + + def user_logged_out(self, sender, request, user, **kwargs): + pass + + def get_failures(self, request, credentials: dict = None) -> int: + return 0 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/handlers/cache.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/handlers/cache.py new file mode 100644 index 0000000..dd266fb --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/handlers/cache.py @@ -0,0 +1,174 @@ +from logging import getLogger + +from axes.conf import settings +from axes.handlers.base import AxesBaseHandler, AbstractAxesHandler +from axes.helpers import ( + get_cache, + get_cache_timeout, + get_client_cache_key, + get_client_str, + get_client_username, + get_credentials, + get_failure_limit, +) +from axes.models import AccessAttempt +from axes.signals import user_locked_out + +log = getLogger(__name__) + + +class AxesCacheHandler(AbstractAxesHandler, AxesBaseHandler): + """ + Signal handler implementation that records user login attempts to cache and locks users out if necessary. + """ + + def __init__(self): + self.cache = get_cache() + self.cache_timeout = get_cache_timeout() + + def reset_attempts( + self, + *, + ip_address: str = None, + username: str = None, + ip_or_username: bool = False, + ) -> int: + cache_keys: list = [] + count = 0 + + if ip_address is None and username is None: + raise NotImplementedError("Cannot clear all entries from cache") + if ip_or_username: + raise NotImplementedError( + "Due to the cache key ip_or_username=True is not supported" + ) + + cache_keys.extend( + get_client_cache_key( + AccessAttempt(username=username, ip_address=ip_address) + ) + ) + + for cache_key in cache_keys: + deleted = self.cache.delete(cache_key) + count += int(deleted) if deleted is not None else 1 + + log.info("AXES: Reset %d access attempts from database.", count) + + return count + + def get_failures(self, request, credentials: dict = None) -> int: + cache_keys = get_client_cache_key(request, credentials) + failure_count = max( + self.cache.get(cache_key, default=0) for cache_key in cache_keys + ) + return failure_count + + def user_login_failed( + self, sender, credentials: dict, request=None, **kwargs + ): # pylint: disable=too-many-locals + """ + When user login fails, save attempt record in cache and lock user out if necessary. + + :raises AxesSignalPermissionDenied: if user should be locked out. + """ + + if request is None: + log.error( + "AXES: AxesCacheHandler.user_login_failed does not function without a request." + ) + return + + username = get_client_username(request, credentials) + if settings.AXES_ONLY_USER_FAILURES and username is None: + log.warning( + "AXES: Username is None and AXES_ONLY_USER_FAILURES is enabled, new record will NOT be created." + ) + return + + client_str = get_client_str( + username, + request.axes_ip_address, + request.axes_user_agent, + request.axes_path_info, + ) + + if self.is_whitelisted(request, credentials): + log.info("AXES: Login failed from whitelisted client %s.", client_str) + return + + failures_since_start = 1 + self.get_failures(request, credentials) + + if failures_since_start > 1: + log.warning( + "AXES: Repeated login failure by %s. Count = %d of %d. Updating existing record in the cache.", + client_str, + failures_since_start, + get_failure_limit(request, credentials), + ) + else: + log.warning( + "AXES: New login failure by %s. Creating new record in the cache.", + client_str, + ) + + cache_keys = get_client_cache_key(request, credentials) + for cache_key in cache_keys: + failures = self.cache.get(cache_key, default=0) + self.cache.set(cache_key, failures + 1, self.cache_timeout) + + if ( + settings.AXES_LOCK_OUT_AT_FAILURE + and failures_since_start >= get_failure_limit(request, credentials) + ): + log.warning( + "AXES: Locking out %s after repeated login failures.", client_str + ) + + request.axes_locked_out = True + user_locked_out.send( + "axes", + request=request, + username=username, + ip_address=request.axes_ip_address, + ) + + def user_logged_in( + self, sender, request, user, **kwargs + ): # pylint: disable=unused-argument + """ + When user logs in, update the AccessLog related to the user. + """ + + username = user.get_username() + credentials = get_credentials(username) + client_str = get_client_str( + username, + request.axes_ip_address, + request.axes_user_agent, + request.axes_path_info, + ) + + log.info("AXES: Successful login by %s.", client_str) + + if settings.AXES_RESET_ON_SUCCESS: + cache_keys = get_client_cache_key(request, credentials) + for cache_key in cache_keys: + failures_since_start = self.cache.get(cache_key, default=0) + self.cache.delete(cache_key) + log.info( + "AXES: Deleted %d failed login attempts by %s from cache.", + failures_since_start, + client_str, + ) + + def user_logged_out(self, sender, request, user, **kwargs): + username = user.get_username() if user else None + client_str = get_client_str( + username, + request.axes_ip_address, + request.axes_user_agent, + request.axes_path_info, + ) + + log.info("AXES: Successful logout by %s.", client_str) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/handlers/database.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/handlers/database.py new file mode 100644 index 0000000..912449d --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/handlers/database.py @@ -0,0 +1,270 @@ +from logging import getLogger + +from django.db.models import Sum, Value, Q +from django.db.models.functions import Concat +from django.utils import timezone + +from axes.attempts import ( + clean_expired_user_attempts, + get_user_attempts, + reset_user_attempts, +) +from axes.conf import settings +from axes.handlers.base import AxesBaseHandler, AbstractAxesHandler +from axes.helpers import ( + get_client_str, + get_client_username, + get_credentials, + get_failure_limit, + get_query_str, +) +from axes.models import AccessLog, AccessAttempt +from axes.signals import user_locked_out + +log = getLogger(__name__) + + +class AxesDatabaseHandler(AbstractAxesHandler, AxesBaseHandler): + """ + Signal handler implementation that records user login attempts to database and locks users out if necessary. + + .. note:: The get_user_attempts function is called several time during the authentication and lockout + process, caching its output can be dangerous. + """ + + def reset_attempts( + self, + *, + ip_address: str = None, + username: str = None, + ip_or_username: bool = False, + ) -> int: + attempts = AccessAttempt.objects.all() + + if ip_or_username: + attempts = attempts.filter(Q(ip_address=ip_address) | Q(username=username)) + else: + if ip_address: + attempts = attempts.filter(ip_address=ip_address) + if username: + attempts = attempts.filter(username=username) + + count, _ = attempts.delete() + log.info("AXES: Reset %d access attempts from database.", count) + + return count + + def reset_logs(self, *, age_days: int = None) -> int: + if age_days is None: + count, _ = AccessLog.objects.all().delete() + log.info("AXES: Reset all %d access logs from database.", count) + else: + limit = timezone.now() - timezone.timedelta(days=age_days) + count, _ = AccessLog.objects.filter(attempt_time__lte=limit).delete() + log.info( + "AXES: Reset %d access logs older than %d days from database.", + count, + age_days, + ) + + return count + + def get_failures(self, request, credentials: dict = None) -> int: + attempts_list = get_user_attempts(request, credentials) + attempt_count = max( + ( + attempts.aggregate(Sum("failures_since_start"))[ + "failures_since_start__sum" + ] + or 0 + ) + for attempts in attempts_list + ) + return attempt_count + + def user_login_failed( + self, sender, credentials: dict, request=None, **kwargs + ): # pylint: disable=too-many-locals + """ + When user login fails, save AccessAttempt record in database, mark request with lockout attribute and emit lockout signal. + """ + + log.info("AXES: User login failed, running database handler for failure.") + + if request is None: + log.error( + "AXES: AxesDatabaseHandler.user_login_failed does not function without a request." + ) + return + + # 1. database query: Clean up expired user attempts from the database before logging new attempts + clean_expired_user_attempts(request.axes_attempt_time) + + username = get_client_username(request, credentials) + client_str = get_client_str( + username, + request.axes_ip_address, + request.axes_user_agent, + request.axes_path_info, + ) + + # This replaces null byte chars that crash saving failures. + get_data = get_query_str(request.GET).replace("\0", "0x00") + post_data = get_query_str(request.POST).replace("\0", "0x00") + + if self.is_whitelisted(request, credentials): + log.info("AXES: Login failed from whitelisted client %s.", client_str) + return + + # 2. database query: Get or create access record with the new failure data + if settings.AXES_ONLY_USER_FAILURES and username is None: + log.warning( + "AXES: Username is None and AXES_ONLY_USER_FAILURES is enabled, new record will NOT be created." + ) + else: + attempt, created = AccessAttempt.objects.get_or_create( + username=username, + ip_address=request.axes_ip_address, + user_agent=request.axes_user_agent, + defaults={ + "get_data": get_data, + "post_data": post_data, + "http_accept": request.axes_http_accept, + "path_info": request.axes_path_info, + "failures_since_start": 1, + "attempt_time": request.axes_attempt_time, + }, + ) + + # Record failed attempt with all the relevant information. + # Filtering based on username, IP address and user agent handled elsewhere, + # and this handler just records the available information for further use. + if created: + log.warning( + "AXES: New login failure by %s. Created new record in the database.", + client_str, + ) + + # 3. database query if there were previous attempts in the database + # Update failed attempt information but do not touch the username, IP address, or user agent fields, + # because attackers can request the site with multiple different configurations + # in order to bypass the defense mechanisms that are used by the site. + else: + separator = "\n---------\n" + + attempt.get_data = Concat("get_data", Value(separator + get_data)) + attempt.post_data = Concat("post_data", Value(separator + post_data)) + attempt.http_accept = request.axes_http_accept + attempt.path_info = request.axes_path_info + attempt.failures_since_start += 1 + attempt.attempt_time = request.axes_attempt_time + attempt.save() + + log.warning( + "AXES: Repeated login failure by %s. Count = %d of %d. Updated existing record in the database.", + client_str, + attempt.failures_since_start, + get_failure_limit(request, credentials), + ) + + # 3. or 4. database query: Calculate the current maximum failure number from the existing attempts + failures_since_start = self.get_failures(request, credentials) + + if ( + settings.AXES_LOCK_OUT_AT_FAILURE + and failures_since_start >= get_failure_limit(request, credentials) + ): + log.warning( + "AXES: Locking out %s after repeated login failures.", client_str + ) + + request.axes_locked_out = True + user_locked_out.send( + "axes", + request=request, + username=username, + ip_address=request.axes_ip_address, + ) + + def user_logged_in( + self, sender, request, user, **kwargs + ): # pylint: disable=unused-argument + """ + When user logs in, update the AccessLog related to the user. + """ + + # 1. database query: Clean up expired user attempts from the database + clean_expired_user_attempts(request.axes_attempt_time) + + username = user.get_username() + credentials = get_credentials(username) + client_str = get_client_str( + username, + request.axes_ip_address, + request.axes_user_agent, + request.axes_path_info, + ) + + log.info("AXES: Successful login by %s.", client_str) + + if not settings.AXES_DISABLE_ACCESS_LOG: + # 2. database query: Insert new access logs with login time + AccessLog.objects.create( + username=username, + ip_address=request.axes_ip_address, + user_agent=request.axes_user_agent, + http_accept=request.axes_http_accept, + path_info=request.axes_path_info, + attempt_time=request.axes_attempt_time, + ) + + if settings.AXES_RESET_ON_SUCCESS: + # 3. database query: Reset failed attempts for the logging in user + count = reset_user_attempts(request, credentials) + log.info( + "AXES: Deleted %d failed login attempts by %s from database.", + count, + client_str, + ) + + def user_logged_out( + self, sender, request, user, **kwargs + ): # pylint: disable=unused-argument + """ + When user logs out, update the AccessLog related to the user. + """ + + # 1. database query: Clean up expired user attempts from the database + clean_expired_user_attempts(request.axes_attempt_time) + + username = user.get_username() if user else None + client_str = get_client_str( + username, + request.axes_ip_address, + request.axes_user_agent, + request.axes_path_info, + ) + + log.info("AXES: Successful logout by %s.", client_str) + + if username and not settings.AXES_DISABLE_ACCESS_LOG: + # 2. database query: Update existing attempt logs with logout time + AccessLog.objects.filter( + username=username, logout_time__isnull=True + ).update(logout_time=request.axes_attempt_time) + + def post_save_access_attempt(self, instance, **kwargs): + """ + Handles the ``axes.models.AccessAttempt`` object post save signal. + + When needed, all post_save actions for this backend should be located + here. + """ + + def post_delete_access_attempt(self, instance, **kwargs): + """ + Handles the ``axes.models.AccessAttempt`` object post delete signal. + + When needed, all post_delete actions for this backend should be located + here. + """ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/handlers/dummy.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/handlers/dummy.py new file mode 100644 index 0000000..0e40ace --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/handlers/dummy.py @@ -0,0 +1,22 @@ +from axes.handlers.base import AxesBaseHandler, AbstractAxesHandler + + +class AxesDummyHandler(AbstractAxesHandler, AxesBaseHandler): + """ + Signal handler implementation that does nothing and can be used to disable signal processing. + """ + + def is_allowed(self, request, credentials: dict = None) -> bool: + return True + + def user_login_failed(self, sender, credentials: dict, request=None, **kwargs): + pass + + def user_logged_in(self, sender, request, user, **kwargs): + pass + + def user_logged_out(self, sender, request, user, **kwargs): + pass + + def get_failures(self, request, credentials: dict = None) -> int: + return 0 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/handlers/proxy.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/handlers/proxy.py new file mode 100644 index 0000000..8027b3e --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/handlers/proxy.py @@ -0,0 +1,124 @@ +from logging import getLogger + +from django.utils.module_loading import import_string +from django.utils.timezone import now + +from axes.conf import settings +from axes.handlers.base import AxesBaseHandler, AbstractAxesHandler, AxesHandler +from axes.helpers import ( + get_client_ip_address, + get_client_user_agent, + get_client_path_info, + get_client_http_accept, + toggleable, +) + +log = getLogger(__name__) + + +class AxesProxyHandler(AbstractAxesHandler, AxesBaseHandler): + """ + Proxy interface for configurable Axes signal handler class. + + If you wish to implement a custom version of this handler, + you can override the settings.AXES_HANDLER configuration string + with a class that implements a compatible interface and methods. + + Defaults to using axes.handlers.proxy.AxesProxyHandler if not overridden. + Refer to axes.handlers.proxy.AxesProxyHandler for default implementation. + """ + + implementation = None # type: AxesHandler + + @classmethod + def get_implementation(cls, force: bool = False) -> AxesHandler: + """ + Fetch and initialize configured handler implementation and memoize it to avoid reinitialization. + + This method is re-entrant and can be called multiple times from e.g. Django application loader. + """ + + if force or not cls.implementation: + cls.implementation = import_string(settings.AXES_HANDLER)() + return cls.implementation + + @classmethod + def reset_attempts( + cls, + *, + ip_address: str = None, + username: str = None, + ip_or_username: bool = False, + ) -> int: + return cls.get_implementation().reset_attempts( + ip_address=ip_address, username=username, ip_or_username=ip_or_username + ) + + @classmethod + def reset_logs(cls, *, age_days: int = None) -> int: + return cls.get_implementation().reset_logs(age_days=age_days) + + @staticmethod + def update_request(request): + """ + Update request attributes before passing them into the selected handler class. + """ + + if request is None: + log.error( + "AXES: AxesProxyHandler.update_request can not set request attributes to a None request" + ) + return + if not hasattr(request, "axes_updated"): + request.axes_locked_out = False + request.axes_attempt_time = now() + request.axes_ip_address = get_client_ip_address(request) + request.axes_user_agent = get_client_user_agent(request) + request.axes_path_info = get_client_path_info(request) + request.axes_http_accept = get_client_http_accept(request) + request.axes_updated = True + + @classmethod + def is_locked(cls, request, credentials: dict = None) -> bool: + cls.update_request(request) + return cls.get_implementation().is_locked(request, credentials) + + @classmethod + def is_allowed(cls, request, credentials: dict = None) -> bool: + cls.update_request(request) + return cls.get_implementation().is_allowed(request, credentials) + + @classmethod + def get_failures(cls, request, credentials: dict = None) -> int: + cls.update_request(request) + return cls.get_implementation().get_failures(request, credentials) + + @classmethod + @toggleable + def user_login_failed(cls, sender, credentials: dict, request=None, **kwargs): + cls.update_request(request) + return cls.get_implementation().user_login_failed( + sender, credentials, request, **kwargs + ) + + @classmethod + @toggleable + def user_logged_in(cls, sender, request, user, **kwargs): + cls.update_request(request) + return cls.get_implementation().user_logged_in(sender, request, user, **kwargs) + + @classmethod + @toggleable + def user_logged_out(cls, sender, request, user, **kwargs): + cls.update_request(request) + return cls.get_implementation().user_logged_out(sender, request, user, **kwargs) + + @classmethod + @toggleable + def post_save_access_attempt(cls, instance, **kwargs): + return cls.get_implementation().post_save_access_attempt(instance, **kwargs) + + @classmethod + @toggleable + def post_delete_access_attempt(cls, instance, **kwargs): + return cls.get_implementation().post_delete_access_attempt(instance, **kwargs) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/handlers/test.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/handlers/test.py new file mode 100644 index 0000000..c345104 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/handlers/test.py @@ -0,0 +1,25 @@ +from axes.handlers.base import AxesHandler + + +class AxesTestHandler(AxesHandler): # pylint: disable=unused-argument + """ + Signal handler implementation that does nothing, ideal for a test suite. + """ + + def reset_attempts( + self, + *, + ip_address: str = None, + username: str = None, + ip_or_username: bool = False, + ) -> int: + return 0 + + def reset_logs(self, *, age_days: int = None) -> int: + return 0 + + def is_allowed(self, request, credentials: dict = None) -> bool: + return True + + def get_failures(self, request, credentials: dict = None) -> int: + return 0 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/helpers.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/helpers.py new file mode 100644 index 0000000..dff7f18 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/helpers.py @@ -0,0 +1,517 @@ +from datetime import timedelta +from hashlib import md5 +from logging import getLogger +from string import Template +from typing import Callable, Optional, Type, Union +from urllib.parse import urlencode + +import ipware.ip +from django.core.cache import caches, BaseCache +from django.http import HttpRequest, HttpResponse, JsonResponse, QueryDict +from django.shortcuts import render, redirect +from django.utils.module_loading import import_string + +from axes.conf import settings +from axes.models import AccessBase + +log = getLogger(__name__) + + +def get_cache() -> BaseCache: + """ + Get the cache instance Axes is configured to use with ``settings.AXES_CACHE`` and use ``'default'`` if not set. + """ + + return caches[getattr(settings, "AXES_CACHE", "default")] + + +def get_cache_timeout() -> Optional[int]: + """ + Return the cache timeout interpreted from settings.AXES_COOLOFF_TIME. + + The cache timeout can be either None if not configured or integer of seconds if configured. + + Notice that the settings.AXES_COOLOFF_TIME can be None, timedelta, integer, callable, or str path, + and this function offers a unified _integer or None_ representation of that configuration + for use with the Django cache backends. + """ + + cool_off = get_cool_off() + if cool_off is None: + return None + return int(cool_off.total_seconds()) + + +def get_cool_off() -> Optional[timedelta]: + """ + Return the login cool off time interpreted from settings.AXES_COOLOFF_TIME. + + The return value is either None or timedelta. + + Notice that the settings.AXES_COOLOFF_TIME is either None, timedelta, or integer of hours, + and this function offers a unified _timedelta or None_ representation of that configuration + for use with the Axes internal implementations. + + :exception TypeError: if settings.AXES_COOLOFF_TIME is of wrong type. + """ + + cool_off = settings.AXES_COOLOFF_TIME + + if isinstance(cool_off, int): + return timedelta(hours=cool_off) + if isinstance(cool_off, str): + return import_string(cool_off)() + if callable(cool_off): + return cool_off() + + return cool_off + + +def get_cool_off_iso8601(delta: timedelta) -> str: + """ + Return datetime.timedelta translated to ISO 8601 formatted duration for use in e.g. cool offs. + """ + + seconds = delta.total_seconds() + minutes, seconds = divmod(seconds, 60) + hours, minutes = divmod(minutes, 60) + days, hours = divmod(hours, 24) + + days_str = f"{days:.0f}D" if days else "" + + time_str = "".join( + f"{value:.0f}{designator}" + for value, designator in [[hours, "H"], [minutes, "M"], [seconds, "S"]] + if value + ) + + if time_str: + return f"P{days_str}T{time_str}" + return f"P{days_str}" + + +def get_credentials(username: str = None, **kwargs) -> dict: + """ + Calculate credentials for Axes to use internally from given username and kwargs. + + Axes will set the username value into the key defined with ``settings.AXES_USERNAME_FORM_FIELD`` + and update the credentials dictionary with the kwargs given on top of that. + """ + + credentials = {settings.AXES_USERNAME_FORM_FIELD: username} + credentials.update(kwargs) + return credentials + + +def get_client_username(request, credentials: dict = None) -> str: + """ + Resolve client username from the given request or credentials if supplied. + + The order of preference for fetching the username is as follows: + + 1. If configured, use ``AXES_USERNAME_CALLABLE``, and supply ``request, credentials`` as arguments + 2. If given, use ``credentials`` and fetch username from ``AXES_USERNAME_FORM_FIELD`` (defaults to ``username``) + 3. Use request.POST and fetch username from ``AXES_USERNAME_FORM_FIELD`` (defaults to ``username``) + + :param request: incoming Django ``HttpRequest`` or similar object from authentication backend or other source + :param credentials: incoming credentials ``dict`` or similar object from authentication backend or other source + """ + + if settings.AXES_USERNAME_CALLABLE: + log.debug("Using settings.AXES_USERNAME_CALLABLE to get username") + + if callable(settings.AXES_USERNAME_CALLABLE): + return settings.AXES_USERNAME_CALLABLE(request, credentials) + if isinstance(settings.AXES_USERNAME_CALLABLE, str): + return import_string(settings.AXES_USERNAME_CALLABLE)(request, credentials) + raise TypeError( + "settings.AXES_USERNAME_CALLABLE needs to be a string, callable, or None." + ) + + if credentials: + log.debug( + "Using parameter credentials to get username with key settings.AXES_USERNAME_FORM_FIELD" + ) + return credentials.get(settings.AXES_USERNAME_FORM_FIELD, None) + + log.debug( + "Using parameter request.POST to get username with key settings.AXES_USERNAME_FORM_FIELD" + ) + + request_data = getattr(request, "data", request.POST) + return request_data.get(settings.AXES_USERNAME_FORM_FIELD, None) + + +def get_client_ip_address(request) -> str: + """ + Get client IP address as configured by the user. + + The django-ipware package is used for address resolution + and parameters can be configured in the Axes package. + """ + + client_ip_address, _ = ipware.ip.get_client_ip( + request, + proxy_order=settings.AXES_PROXY_ORDER, + proxy_count=settings.AXES_PROXY_COUNT, + proxy_trusted_ips=settings.AXES_PROXY_TRUSTED_IPS, + request_header_order=settings.AXES_META_PRECEDENCE_ORDER, + ) + + return client_ip_address + + +def get_client_user_agent(request) -> str: + return request.META.get("HTTP_USER_AGENT", "")[:255] + + +def get_client_path_info(request) -> str: + return request.META.get("PATH_INFO", "")[:255] + + +def get_client_http_accept(request) -> str: + return request.META.get("HTTP_ACCEPT", "")[:1025] + + +def get_client_parameters(username: str, ip_address: str, user_agent: str) -> list: + """ + Get query parameters for filtering AccessAttempt queryset. + + This method returns a dict that guarantees iteration order for keys and values, + and can so be used in e.g. the generation of hash keys or other deterministic functions. + + Returns list of dict, every item of list are separate parameters + """ + + if settings.AXES_ONLY_USER_FAILURES: + # 1. Only individual usernames can be tracked with parametrization + filter_query = [{"username": username}] + else: + if settings.AXES_LOCK_OUT_BY_USER_OR_IP: + # One of `username` or `IP address` is used + filter_query = [{"username": username}, {"ip_address": ip_address}] + elif settings.AXES_LOCK_OUT_BY_COMBINATION_USER_AND_IP: + # 2. A combination of username and IP address can be used as well + filter_query = [{"username": username, "ip_address": ip_address}] + else: + # 3. Default case is to track the IP address only, which is the most secure option + filter_query = [{"ip_address": ip_address}] + + if settings.AXES_USE_USER_AGENT: + # 4. The HTTP User-Agent can be used to track e.g. one browser + filter_query.append({"user_agent": user_agent}) + + return filter_query + + +def make_cache_key_list(filter_kwargs_list): + cache_keys = [] + for filter_kwargs in filter_kwargs_list: + cache_key_components = "".join( + value for value in filter_kwargs.values() if value + ) + cache_key_digest = md5(cache_key_components.encode()).hexdigest() + cache_keys.append(f"axes-{cache_key_digest}") + return cache_keys + + +def get_client_cache_key( + request_or_attempt: Union[HttpRequest, AccessBase], credentials: dict = None +) -> str: + """ + Build cache key name from request or AccessAttempt object. + + :param request_or_attempt: HttpRequest or AccessAttempt object + :param credentials: credentials containing user information + :return cache_key: Hash key that is usable for Django cache backends + """ + + if isinstance(request_or_attempt, AccessBase): + username = request_or_attempt.username + ip_address = request_or_attempt.ip_address + user_agent = request_or_attempt.user_agent + else: + username = get_client_username(request_or_attempt, credentials) + ip_address = get_client_ip_address(request_or_attempt) + user_agent = get_client_user_agent(request_or_attempt) + + filter_kwargs_list = get_client_parameters(username, ip_address, user_agent) + + return make_cache_key_list(filter_kwargs_list) + + +def get_client_str( + username: str, ip_address: str, user_agent: str, path_info: str +) -> str: + """ + Get a readable string that can be used in e.g. logging to distinguish client requests. + + Example log format would be + ``{username: "example", ip_address: "127.0.0.1", path_info: "/example/"}`` + """ + + if settings.AXES_CLIENT_STR_CALLABLE: + log.debug("Using settings.AXES_CLIENT_STR_CALLABLE to get client string.") + + if callable(settings.AXES_CLIENT_STR_CALLABLE): + return settings.AXES_CLIENT_STR_CALLABLE( + username, ip_address, user_agent, path_info + ) + if isinstance(settings.AXES_CLIENT_STR_CALLABLE, str): + return import_string(settings.AXES_CLIENT_STR_CALLABLE)( + username, ip_address, user_agent, path_info + ) + raise TypeError( + "settings.AXES_CLIENT_STR_CALLABLE needs to be a string, callable or None." + ) + + client_dict = dict() + + if settings.AXES_VERBOSE: + # Verbose mode logs every attribute that is available + client_dict["username"] = username + client_dict["ip_address"] = ip_address + client_dict["user_agent"] = user_agent + else: + # Other modes initialize the attributes that are used for the actual lockouts + client_list = get_client_parameters(username, ip_address, user_agent) + client_dict = {} + for client in client_list: + client_dict.update(client) + + # Path info is always included as last component in the client string for traceability purposes + if path_info and isinstance(path_info, (tuple, list)): + path_info = path_info[0] + client_dict["path_info"] = path_info + + # Template the internal dictionary representation into a readable and concatenated {key: "value"} format + template = Template('$key: "$value"') + items = [{"key": k, "value": v} for k, v in client_dict.items()] + client_str = ", ".join(template.substitute(item) for item in items) + client_str = "{" + client_str + "}" + return client_str + + +def cleanse_parameters(params: dict) -> dict: + """ + Replace sensitive parameter values in a parameter dict with + a safe placeholder value. + + Parameters name ``'password'`` will always be cleansed. Additionally, + parameters named in ``settings.AXES_SENSITIVE_PARAMETERS`` and + ``settings.AXES_PASSWORD_FORM_FIELD will be cleansed. + + This is used to prevent passwords and similar values from + being logged in cleartext. + """ + sensitive_parameters = ["password"] + settings.AXES_SENSITIVE_PARAMETERS + if settings.AXES_PASSWORD_FORM_FIELD: + sensitive_parameters.append(settings.AXES_PASSWORD_FORM_FIELD) + + if sensitive_parameters: + cleansed = params.copy() + for param in sensitive_parameters: + if param in cleansed: + cleansed[param] = "********************" + return cleansed + return params + + +def get_query_str(query: Type[QueryDict], max_length: int = 1024) -> str: + """ + Turns a query dictionary into an easy-to-read list of key-value pairs. + + If a field is called either ``'password'`` or ``settings.AXES_PASSWORD_FORM_FIELD`` or if the fieldname is included + in ``settings.AXES_SENSITIVE_PARAMETERS`` its value will be masked. + + The length of the output is limited to max_length to avoid a DoS attack via excessively large payloads. + """ + + query_dict = cleanse_parameters(query.copy()) + + template = Template("$key=$value") + items = [{"key": k, "value": v} for k, v in query_dict.items()] + query_str = "\n".join(template.substitute(item) for item in items) + + return query_str[:max_length] + + +def get_failure_limit(request, credentials) -> int: + if callable(settings.AXES_FAILURE_LIMIT): + return settings.AXES_FAILURE_LIMIT(request, credentials) + if isinstance(settings.AXES_FAILURE_LIMIT, str): + return import_string(settings.AXES_FAILURE_LIMIT)(request, credentials) + if isinstance(settings.AXES_FAILURE_LIMIT, int): + return settings.AXES_FAILURE_LIMIT + raise TypeError("settings.AXES_FAILURE_LIMIT needs to be a callable or an integer") + + +def get_lockout_message() -> str: + if settings.AXES_COOLOFF_TIME: + return settings.AXES_COOLOFF_MESSAGE + return settings.AXES_PERMALOCK_MESSAGE + + +def get_lockout_response(request, credentials: dict = None) -> HttpResponse: + if settings.AXES_LOCKOUT_CALLABLE: + if callable(settings.AXES_LOCKOUT_CALLABLE): + return settings.AXES_LOCKOUT_CALLABLE(request, credentials) + if isinstance(settings.AXES_LOCKOUT_CALLABLE, str): + return import_string(settings.AXES_LOCKOUT_CALLABLE)(request, credentials) + raise TypeError( + "settings.AXES_LOCKOUT_CALLABLE needs to be a string, callable, or None." + ) + + status = 403 + context = { + "failure_limit": get_failure_limit(request, credentials), + "username": get_client_username(request, credentials) or "", + } + + cool_off = get_cool_off() + if cool_off: + context.update( + { + "cooloff_time": get_cool_off_iso8601( + cool_off + ), # differing old name is kept for backwards compatibility + "cooloff_timedelta": cool_off, + } + ) + + if request.META.get("HTTP_X_REQUESTED_WITH") == "XMLHttpRequest": + json_response = JsonResponse(context, status=status) + json_response[ + "Access-Control-Allow-Origin" + ] = settings.AXES_ALLOWED_CORS_ORIGINS + json_response["Access-Control-Allow-Methods"] = "POST, OPTIONS" + json_response[ + "Access-Control-Allow-Headers" + ] = "Origin, Content-Type, Accept, Authorization, x-requested-with" + return json_response + + if settings.AXES_LOCKOUT_TEMPLATE: + return render(request, settings.AXES_LOCKOUT_TEMPLATE, context, status=status) + + if settings.AXES_LOCKOUT_URL: + lockout_url = settings.AXES_LOCKOUT_URL + query_string = urlencode({"username": context["username"]}) + url = "{}?{}".format(lockout_url, query_string) + return redirect(url) + + return HttpResponse(get_lockout_message(), status=status) + + +def is_ip_address_in_whitelist(ip_address: str) -> bool: + if not settings.AXES_IP_WHITELIST: + return False + + return ip_address in settings.AXES_IP_WHITELIST + + +def is_ip_address_in_blacklist(ip_address: str) -> bool: + if not settings.AXES_IP_BLACKLIST: + return False + + return ip_address in settings.AXES_IP_BLACKLIST + + +def is_client_ip_address_whitelisted(request): + """ + Check if the given request refers to a whitelisted IP. + """ + + if settings.AXES_NEVER_LOCKOUT_WHITELIST and is_ip_address_in_whitelist( + request.axes_ip_address + ): + return True + + if settings.AXES_ONLY_WHITELIST and is_ip_address_in_whitelist( + request.axes_ip_address + ): + return True + + return False + + +def is_client_ip_address_blacklisted(request) -> bool: + """ + Check if the given request refers to a blacklisted IP. + """ + + if is_ip_address_in_blacklist(request.axes_ip_address): + return True + + if settings.AXES_ONLY_WHITELIST and not is_ip_address_in_whitelist( + request.axes_ip_address + ): + return True + + return False + + +def is_client_method_whitelisted(request) -> bool: + """ + Check if the given request uses a whitelisted method. + """ + + if settings.AXES_NEVER_LOCKOUT_GET and request.method == "GET": + return True + + return False + + +def is_user_attempt_whitelisted(request, credentials: dict = None) -> bool: + """ + Check if the given request or credentials refer to a whitelisted username. + + This method invokes the ``settings.AXES_WHITELIST`` callable + with ``request`` and ``credentials`` arguments. + + This function could use the following implementation for checking + the lockout flags from a specific property in the user object: + + .. code-block: python + + username_value = get_client_username(request, credentials) + username_field = getattr( + get_user_model(), + "USERNAME_FIELD", + "username" + ) + kwargs = {username_field: username_value} + + user_model = get_user_model() + user = user_model.objects.get(**kwargs) + return user.nolockout + """ + + whitelist_callable = settings.AXES_WHITELIST_CALLABLE + if whitelist_callable is None: + return False + if callable(whitelist_callable): + return whitelist_callable(request, credentials) + if isinstance(whitelist_callable, str): + return import_string(whitelist_callable)(request, credentials) + + raise TypeError( + "settings.AXES_WHITELIST_CALLABLE needs to be a string, callable, or None." + ) + + +def toggleable(func) -> Callable: + """ + Decorator that toggles function execution based on settings. + + If the ``settings.AXES_ENABLED`` flag is set to ``False`` + the decorated function never runs and a None is returned. + + This decorator is only suitable for functions that do not + require return values to be passed back to callers. + """ + + def inner(*args, **kwargs): # pylint: disable=inconsistent-return-statements + if settings.AXES_ENABLED: + return func(*args, **kwargs) + + return inner diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/locale/de/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/locale/de/LC_MESSAGES/django.mo new file mode 100644 index 0000000..807c36d Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/locale/de/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/locale/de/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/locale/de/LC_MESSAGES/django.po new file mode 100644 index 0000000..e9745c9 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/locale/de/LC_MESSAGES/django.po @@ -0,0 +1,97 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-07-17 15:56+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \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" + +#: axes/admin.py:38 +msgid "Form Data" +msgstr "Form-Daten" + +#: axes/admin.py:41 axes/admin.py:95 +msgid "Meta Data" +msgstr "Meta-Daten" + +#: axes/conf.py:58 +msgid "Account locked: too many login attempts. Please try again later." +msgstr "" +"Zugang gesperrt: zu viele fehlgeschlagene Anmeldeversuche. Bitte versuchen " +"Sie es später erneut." + +#: axes/conf.py:61 +msgid "" +"Account locked: too many login attempts. Contact an admin to unlock your " +"account." +msgstr "" +"Zugang gesperrt: zu viele fehlgeschlagene Anmeldeversuche. Kontaktieren Sie " +"einen Administrator, um Ihren Zugang zu entsperren." + +#: axes/models.py:9 +msgid "User Agent" +msgstr "Browserkennung" + +#: axes/models.py:15 +msgid "IP Address" +msgstr "IP-Adresse" + +#: axes/models.py:21 +msgid "Username" +msgstr "Benutzername" + +#: axes/models.py:35 +msgid "HTTP Accept" +msgstr "" + +#: axes/models.py:40 +msgid "Path" +msgstr "Pfad" + +#: axes/models.py:45 +msgid "Attempt Time" +msgstr "Zugriffszeitpunkt" + +#: axes/models.py:57 +msgid "GET Data" +msgstr "GET-Daten" + +#: axes/models.py:61 +msgid "POST Data" +msgstr "POST-Daten" + +#: axes/models.py:65 +msgid "Failed Logins" +msgstr "Fehlgeschlagene Anmeldeversuche" + +#: axes/models.py:76 +msgid "access attempt" +msgstr "Zugriffsversuch" + +#: axes/models.py:77 +msgid "access attempts" +msgstr "Zugriffsversuche" + +#: axes/models.py:81 +msgid "Logout Time" +msgstr "Abmeldezeitpunkt" + +#: axes/models.py:90 +msgid "access log" +msgstr "Zugriffslog" + +#: axes/models.py:91 +msgid "access logs" +msgstr "Zugriffslogs" diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/locale/pl/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/locale/pl/LC_MESSAGES/django.mo new file mode 100644 index 0000000..f7a01c5 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/locale/pl/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/locale/pl/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/locale/pl/LC_MESSAGES/django.po new file mode 100644 index 0000000..f82030e --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/locale/pl/LC_MESSAGES/django.po @@ -0,0 +1,100 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2021-06-11 23:36+0200\n" +"PO-Revision-Date: 2021-06-16 10:51+0300\n" +"Language: pl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=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" +"Last-Translator: \n" +"Language-Team: \n" +"X-Generator: Poedit 3.0\n" + +#: .\axes\admin.py:26 +msgid "Form Data" +msgstr "Dane formularza" + +#: .\axes\admin.py:27 .\axes\admin.py:64 +msgid "Meta Data" +msgstr "Metadane" + +#: .\axes\conf.py:89 +msgid "Account locked: too many login attempts. Please try again later." +msgstr "" +"Konto zablokowane: zbyt wiele prób logowania. Spróbuj ponownie później." + +#: .\axes\conf.py:97 +msgid "" +"Account locked: too many login attempts. Contact an admin to unlock your " +"account." +msgstr "" +"Konto zablokowane: zbyt wiele prób logowania. Skontaktuj się z " +"administratorem, aby odblokować swoje konto." + +#: .\axes\models.py:6 +#, fuzzy +msgid "User Agent" +msgstr "User Agent" + +#: .\axes\models.py:8 +msgid "IP Address" +msgstr "Adres IP" + +#: .\axes\models.py:10 +msgid "Username" +msgstr "Nazwa Użytkownika" + +#: .\axes\models.py:12 +#, fuzzy +msgid "HTTP Accept" +msgstr "HTTP Accept" + +#: .\axes\models.py:14 +msgid "Path" +msgstr "Ścieżka" + +#: .\axes\models.py:16 +msgid "Attempt Time" +msgstr "Czas wystąpienia" + +#: .\axes\models.py:25 +msgid "GET Data" +msgstr "Dane GET" + +#: .\axes\models.py:27 +msgid "POST Data" +msgstr "Dane POST" + +#: .\axes\models.py:29 +msgid "Failed Logins" +msgstr "Nieudane logowania" + +#: .\axes\models.py:35 +msgid "access attempt" +msgstr "próba dostępu" + +#: .\axes\models.py:36 +msgid "access attempts" +msgstr "próby dostępu" + +#: .\axes\models.py:40 +msgid "Logout Time" +msgstr "Czas wylogowania" + +#: .\axes\models.py:46 +msgid "access log" +msgstr "dziennik logowania" + +#: .\axes\models.py:47 +msgid "access logs" +msgstr "dzienniki logowania" diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/locale/ru/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/locale/ru/LC_MESSAGES/django.mo new file mode 100644 index 0000000..e617ee8 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/locale/ru/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/locale/ru/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/locale/ru/LC_MESSAGES/django.po new file mode 100644 index 0000000..b5089d4 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/locale/ru/LC_MESSAGES/django.po @@ -0,0 +1,97 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-11 12:20+0300\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \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" + +#: axes/admin.py:38 +msgid "Form Data" +msgstr "Данные формы" + +#: axes/admin.py:41 axes/admin.py:95 +msgid "Meta Data" +msgstr "Метаданные" + +#: axes/conf.py:58 +msgid "Account locked: too many login attempts. Please try again later." +msgstr "" +"Учетная запись заблокирована: слишком много попыток входа. " +"Повторите попытку позже." + +#: axes/conf.py:61 +msgid "" +"Account locked: too many login attempts. Contact an admin to unlock your " +"account." +msgstr "" +"Учетная запись заблокирована: слишком много попыток входа. " +"Обратитесь к администратору для разблокирования учетной записи." + +#: axes/models.py:9 +msgid "User Agent" +msgstr "Браузер пользователя" + +#: axes/models.py:15 +msgid "IP Address" +msgstr "Адрес IP" + +#: axes/models.py:21 +msgid "Username" +msgstr "Пользователь" + +#: axes/models.py:35 +msgid "HTTP Accept" +msgstr "Запрос HTTP" + +#: axes/models.py:40 +msgid "Path" +msgstr "Путь" + +#: axes/models.py:45 +msgid "Attempt Time" +msgstr "Время входа" + +#: axes/models.py:57 +msgid "GET Data" +msgstr "Данные GET-запроса" + +#: axes/models.py:61 +msgid "POST Data" +msgstr "Данные POST-запроса" + +#: axes/models.py:65 +msgid "Failed Logins" +msgstr "Ошибочные попытки" + +#: axes/models.py:76 +msgid "access attempt" +msgstr "Запись о попытке доступа" + +#: axes/models.py:77 +msgid "access attempts" +msgstr "Попытки доступа" + +#: axes/models.py:81 +msgid "Logout Time" +msgstr "Время выхода" + +#: axes/models.py:90 +msgid "access log" +msgstr "Запись о доступе" + +#: axes/models.py:91 +msgid "access logs" +msgstr "Логи доступа" diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/locale/tr/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/locale/tr/LC_MESSAGES/django.mo new file mode 100644 index 0000000..b4151bf Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/locale/tr/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/locale/tr/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/locale/tr/LC_MESSAGES/django.po new file mode 100644 index 0000000..0df99b8 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/locale/tr/LC_MESSAGES/django.po @@ -0,0 +1,96 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-07-17 15:56+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \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" + +#: axes/admin.py:38 +msgid "Form Data" +msgstr "Form-Verisi" + +#: axes/admin.py:41 axes/admin.py:95 +msgid "Meta Data" +msgstr "Meta-Verisi" + +#: axes/conf.py:58 +msgid "Account locked: too many login attempts. Please try again later." +msgstr "" +"Hesap kilitlendi: cok fazla erişim denemesi. Lütfen daha sonra tekrar deneyiniz." + +#: axes/conf.py:61 +msgid "" +"Account locked: too many login attempts. Contact an admin to unlock your " +"account." +msgstr "" +"Hesap kilitlendi: cok fazla erişim denemesi. Hesabını açtırmak için yöneticiyle iletişime" +"geçin." + +#: axes/models.py:9 +msgid "User Agent" +msgstr "" + +#: axes/models.py:15 +msgid "IP Address" +msgstr "IP-Adresi" + +#: axes/models.py:21 +msgid "Username" +msgstr "Kullanıcı Adı" + +#: axes/models.py:35 +msgid "HTTP Accept" +msgstr "" + +#: axes/models.py:40 +msgid "Path" +msgstr "Yol" + +#: axes/models.py:45 +msgid "Attempt Time" +msgstr "Girişim Zamanı" + +#: axes/models.py:57 +msgid "GET Data" +msgstr "GET-Verisi" + +#: axes/models.py:61 +msgid "POST Data" +msgstr "POST-Verisi" + +#: axes/models.py:65 +msgid "Failed Logins" +msgstr "Geçersiz Girişler" + +#: axes/models.py:76 +msgid "access attempt" +msgstr "erişim denemesi" + +#: axes/models.py:77 +msgid "access attempts" +msgstr "erişim denemeleri" + +#: axes/models.py:81 +msgid "Logout Time" +msgstr "Çıkış Zamanı" + +#: axes/models.py:90 +msgid "access log" +msgstr "erişim kaydı" + +#: axes/models.py:91 +msgid "access logs" +msgstr "erişim kayıtları" diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/management/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/management/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/management/commands/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/management/commands/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/management/commands/axes_list_attempts.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/management/commands/axes_list_attempts.py new file mode 100644 index 0000000..ad4da8d --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/management/commands/axes_list_attempts.py @@ -0,0 +1,13 @@ +from django.core.management.base import BaseCommand + +from axes.models import AccessAttempt + + +class Command(BaseCommand): + help = "List access attempts" + + def handle(self, *args, **options): # pylint: disable=unused-argument + for obj in AccessAttempt.objects.all(): + self.stdout.write( + f"{obj.ip_address}\t{obj.username}\t{obj.failures_since_start}" + ) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/management/commands/axes_reset.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/management/commands/axes_reset.py new file mode 100644 index 0000000..70187e5 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/management/commands/axes_reset.py @@ -0,0 +1,15 @@ +from django.core.management.base import BaseCommand + +from axes.utils import reset + + +class Command(BaseCommand): + help = "Reset all access attempts and lockouts" + + def handle(self, *args, **options): # pylint: disable=unused-argument + count = reset() + + if count: + self.stdout.write(f"{count} attempts removed.") + else: + self.stdout.write("No attempts found.") diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/management/commands/axes_reset_ip.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/management/commands/axes_reset_ip.py new file mode 100644 index 0000000..e043497 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/management/commands/axes_reset_ip.py @@ -0,0 +1,21 @@ +from django.core.management.base import BaseCommand + +from axes.utils import reset + + +class Command(BaseCommand): + help = "Reset all access attempts and lockouts for given IP addresses" + + def add_arguments(self, parser): + parser.add_argument("ip", nargs="+", type=str) + + def handle(self, *args, **options): + count = 0 + + for ip in options["ip"]: + count += reset(ip=ip) + + if count: + self.stdout.write(f"{count} attempts removed.") + else: + self.stdout.write("No attempts found.") diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/management/commands/axes_reset_logs.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/management/commands/axes_reset_logs.py new file mode 100644 index 0000000..4cdad84 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/management/commands/axes_reset_logs.py @@ -0,0 +1,22 @@ +from django.core.management.base import BaseCommand + +from axes.handlers.proxy import AxesProxyHandler + + +class Command(BaseCommand): + help = "Reset access log records older than given days." + + def add_arguments(self, parser): + parser.add_argument( + "--age", + type=int, + default=30, + help="Maximum age for records to keep in days", + ) + + def handle(self, *args, **options): + count = AxesProxyHandler.reset_logs(age_days=options["age"]) + if count: + self.stdout.write(f"{count} logs removed.") + else: + self.stdout.write("No logs found.") diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/management/commands/axes_reset_user.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/management/commands/axes_reset_user.py new file mode 100644 index 0000000..85bf9ef --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/management/commands/axes_reset_user.py @@ -0,0 +1,21 @@ +from django.core.management.base import BaseCommand + +from axes.utils import reset + + +class Command(BaseCommand): + help = "Reset all access attempts and lockouts for given usernames" + + def add_arguments(self, parser): + parser.add_argument("username", nargs="+", type=str) + + def handle(self, *args, **options): + count = 0 + + for username in options["username"]: + count += reset(username=username) + + if count: + self.stdout.write(f"{count} attempts removed.") + else: + self.stdout.write("No attempts found.") diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/management/commands/axes_reset_username.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/management/commands/axes_reset_username.py new file mode 100644 index 0000000..85bf9ef --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/management/commands/axes_reset_username.py @@ -0,0 +1,21 @@ +from django.core.management.base import BaseCommand + +from axes.utils import reset + + +class Command(BaseCommand): + help = "Reset all access attempts and lockouts for given usernames" + + def add_arguments(self, parser): + parser.add_argument("username", nargs="+", type=str) + + def handle(self, *args, **options): + count = 0 + + for username in options["username"]: + count += reset(username=username) + + if count: + self.stdout.write(f"{count} attempts removed.") + else: + self.stdout.write("No attempts found.") diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/middleware.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/middleware.py new file mode 100644 index 0000000..b493f2c --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/middleware.py @@ -0,0 +1,42 @@ +from typing import Callable + +from django.conf import settings + +from axes.helpers import get_lockout_response + + +class AxesMiddleware: + """ + Middleware that calculates necessary HTTP request attributes for attempt monitoring + and maps lockout signals into readable HTTP 403 Forbidden responses. + + If a project uses ``django rest framework`` then the middleware updates the + request and checks whether the limit has been exceeded. It's needed only + for integration with DRF because it uses its own request object. + + This middleware recognizes a logout monitoring flag in the request and + and uses the ``axes.helpers.get_lockout_response`` handler for returning + customizable and context aware lockout message to the end user if necessary. + + To customize the lockout handling behaviour further, you can subclass this middleware + and change the ``__call__`` method to your own liking. + + Please see the following configuration flags before customizing this handler: + + - ``AXES_LOCKOUT_TEMPLATE``, + - ``AXES_LOCKOUT_URL``, + - ``AXES_COOLOFF_MESSAGE``, and + - ``AXES_PERMALOCK_MESSAGE``. + """ + + def __init__(self, get_response: Callable): + self.get_response = get_response + + def __call__(self, request): + response = self.get_response(request) + + if settings.AXES_ENABLED: + if getattr(request, "axes_locked_out", None): + response = get_lockout_response(request) # type: ignore + + return response diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/migrations/0001_initial.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/migrations/0001_initial.py new file mode 100644 index 0000000..1535183 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/migrations/0001_initial.py @@ -0,0 +1,72 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [] + + operations = [ + migrations.CreateModel( + name="AccessAttempt", + fields=[ + ( + "id", + models.AutoField( + verbose_name="ID", + serialize=False, + auto_created=True, + primary_key=True, + ), + ), + ("user_agent", models.CharField(max_length=255)), + ( + "ip_address", + models.GenericIPAddressField(null=True, verbose_name="IP Address"), + ), + ("username", models.CharField(max_length=255, null=True)), + ("trusted", models.BooleanField(default=False)), + ( + "http_accept", + models.CharField(max_length=1025, verbose_name="HTTP Accept"), + ), + ("path_info", models.CharField(max_length=255, verbose_name="Path")), + ("attempt_time", models.DateTimeField(auto_now_add=True)), + ("get_data", models.TextField(verbose_name="GET Data")), + ("post_data", models.TextField(verbose_name="POST Data")), + ( + "failures_since_start", + models.PositiveIntegerField(verbose_name="Failed Logins"), + ), + ], + options={"ordering": ["-attempt_time"], "abstract": False}, + ), + migrations.CreateModel( + name="AccessLog", + fields=[ + ( + "id", + models.AutoField( + verbose_name="ID", + serialize=False, + auto_created=True, + primary_key=True, + ), + ), + ("user_agent", models.CharField(max_length=255)), + ( + "ip_address", + models.GenericIPAddressField(null=True, verbose_name="IP Address"), + ), + ("username", models.CharField(max_length=255, null=True)), + ("trusted", models.BooleanField(default=False)), + ( + "http_accept", + models.CharField(max_length=1025, verbose_name="HTTP Accept"), + ), + ("path_info", models.CharField(max_length=255, verbose_name="Path")), + ("attempt_time", models.DateTimeField(auto_now_add=True)), + ("logout_time", models.DateTimeField(null=True, blank=True)), + ], + options={"ordering": ["-attempt_time"], "abstract": False}, + ), + ] diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/migrations/0002_auto_20151217_2044.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/migrations/0002_auto_20151217_2044.py new file mode 100644 index 0000000..62bc371 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/migrations/0002_auto_20151217_2044.py @@ -0,0 +1,53 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [("axes", "0001_initial")] + + operations = [ + migrations.AlterField( + model_name="accessattempt", + name="ip_address", + field=models.GenericIPAddressField( + db_index=True, null=True, verbose_name="IP Address" + ), + ), + migrations.AlterField( + model_name="accessattempt", + name="trusted", + field=models.BooleanField(db_index=True, default=False), + ), + migrations.AlterField( + model_name="accessattempt", + name="user_agent", + field=models.CharField(db_index=True, max_length=255), + ), + migrations.AlterField( + model_name="accessattempt", + name="username", + field=models.CharField(db_index=True, max_length=255, null=True), + ), + migrations.AlterField( + model_name="accesslog", + name="ip_address", + field=models.GenericIPAddressField( + db_index=True, null=True, verbose_name="IP Address" + ), + ), + migrations.AlterField( + model_name="accesslog", + name="trusted", + field=models.BooleanField(db_index=True, default=False), + ), + migrations.AlterField( + model_name="accesslog", + name="user_agent", + field=models.CharField(db_index=True, max_length=255), + ), + migrations.AlterField( + model_name="accesslog", + name="username", + field=models.CharField(db_index=True, max_length=255, null=True), + ), + ] diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/migrations/0003_auto_20160322_0929.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/migrations/0003_auto_20160322_0929.py new file mode 100644 index 0000000..18e3941 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/migrations/0003_auto_20160322_0929.py @@ -0,0 +1,58 @@ +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [("axes", "0002_auto_20151217_2044")] + + operations = [ + migrations.AlterField( + model_name="accessattempt", + name="failures_since_start", + field=models.PositiveIntegerField(verbose_name="Failed Logins"), + ), + migrations.AlterField( + model_name="accessattempt", + name="get_data", + field=models.TextField(verbose_name="GET Data"), + ), + migrations.AlterField( + model_name="accessattempt", + name="http_accept", + field=models.CharField(verbose_name="HTTP Accept", max_length=1025), + ), + migrations.AlterField( + model_name="accessattempt", + name="ip_address", + field=models.GenericIPAddressField( + null=True, verbose_name="IP Address", db_index=True + ), + ), + migrations.AlterField( + model_name="accessattempt", + name="path_info", + field=models.CharField(verbose_name="Path", max_length=255), + ), + migrations.AlterField( + model_name="accessattempt", + name="post_data", + field=models.TextField(verbose_name="POST Data"), + ), + migrations.AlterField( + model_name="accesslog", + name="http_accept", + field=models.CharField(verbose_name="HTTP Accept", max_length=1025), + ), + migrations.AlterField( + model_name="accesslog", + name="ip_address", + field=models.GenericIPAddressField( + null=True, verbose_name="IP Address", db_index=True + ), + ), + migrations.AlterField( + model_name="accesslog", + name="path_info", + field=models.CharField(verbose_name="Path", max_length=255), + ), + ] diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/migrations/0004_auto_20181024_1538.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/migrations/0004_auto_20181024_1538.py new file mode 100644 index 0000000..fc88826 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/migrations/0004_auto_20181024_1538.py @@ -0,0 +1,68 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [("axes", "0003_auto_20160322_0929")] + + operations = [ + migrations.AlterModelOptions( + name="accessattempt", + options={ + "verbose_name": "access attempt", + "verbose_name_plural": "access attempts", + }, + ), + migrations.AlterModelOptions( + name="accesslog", + options={ + "verbose_name": "access log", + "verbose_name_plural": "access logs", + }, + ), + migrations.AlterField( + model_name="accessattempt", + name="attempt_time", + field=models.DateTimeField(auto_now_add=True, verbose_name="Attempt Time"), + ), + migrations.AlterField( + model_name="accessattempt", + name="user_agent", + field=models.CharField( + db_index=True, max_length=255, verbose_name="User Agent" + ), + ), + migrations.AlterField( + model_name="accessattempt", + name="username", + field=models.CharField( + db_index=True, max_length=255, null=True, verbose_name="Username" + ), + ), + migrations.AlterField( + model_name="accesslog", + name="attempt_time", + field=models.DateTimeField(auto_now_add=True, verbose_name="Attempt Time"), + ), + migrations.AlterField( + model_name="accesslog", + name="logout_time", + field=models.DateTimeField( + blank=True, null=True, verbose_name="Logout Time" + ), + ), + migrations.AlterField( + model_name="accesslog", + name="user_agent", + field=models.CharField( + db_index=True, max_length=255, verbose_name="User Agent" + ), + ), + migrations.AlterField( + model_name="accesslog", + name="username", + field=models.CharField( + db_index=True, max_length=255, null=True, verbose_name="Username" + ), + ), + ] diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/migrations/0005_remove_accessattempt_trusted.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/migrations/0005_remove_accessattempt_trusted.py new file mode 100644 index 0000000..c7711fb --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/migrations/0005_remove_accessattempt_trusted.py @@ -0,0 +1,8 @@ +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [("axes", "0004_auto_20181024_1538")] + + operations = [migrations.RemoveField(model_name="accessattempt", name="trusted")] diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/migrations/0006_remove_accesslog_trusted.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/migrations/0006_remove_accesslog_trusted.py new file mode 100644 index 0000000..347e0f0 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/migrations/0006_remove_accesslog_trusted.py @@ -0,0 +1,10 @@ +# Generated by Django 2.0.4 on 2019-03-13 08:55 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [("axes", "0005_remove_accessattempt_trusted")] + + operations = [migrations.RemoveField(model_name="accesslog", name="trusted")] diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/migrations/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/models.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/models.py new file mode 100644 index 0000000..a5a807c --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/models.py @@ -0,0 +1,47 @@ +from django.db import models +from django.utils.translation import gettext_lazy as _ + + +class AccessBase(models.Model): + user_agent = models.CharField(_("User Agent"), max_length=255, db_index=True) + + ip_address = models.GenericIPAddressField(_("IP Address"), null=True, db_index=True) + + username = models.CharField(_("Username"), max_length=255, null=True, db_index=True) + + http_accept = models.CharField(_("HTTP Accept"), max_length=1025) + + path_info = models.CharField(_("Path"), max_length=255) + + attempt_time = models.DateTimeField(_("Attempt Time"), auto_now_add=True) + + class Meta: + app_label = "axes" + abstract = True + ordering = ["-attempt_time"] + + +class AccessAttempt(AccessBase): + get_data = models.TextField(_("GET Data")) + + post_data = models.TextField(_("POST Data")) + + failures_since_start = models.PositiveIntegerField(_("Failed Logins")) + + def __str__(self): + return f"Attempted Access: {self.attempt_time}" + + class Meta: + verbose_name = _("access attempt") + verbose_name_plural = _("access attempts") + + +class AccessLog(AccessBase): + logout_time = models.DateTimeField(_("Logout Time"), null=True, blank=True) + + def __str__(self): + return f"Access Log for {self.username} @ {self.attempt_time}" + + class Meta: + verbose_name = _("access log") + verbose_name_plural = _("access logs") diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/signals.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/signals.py new file mode 100644 index 0000000..4a61402 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/signals.py @@ -0,0 +1,61 @@ +from logging import getLogger + +from django.contrib.auth.signals import ( + user_logged_in, + user_logged_out, + user_login_failed, +) +from django.core.signals import setting_changed +from django.db.models.signals import post_save, post_delete +from django.dispatch import Signal +from django.dispatch import receiver + +from axes.handlers.proxy import AxesProxyHandler +from axes.models import AccessAttempt + +log = getLogger(__name__) + + +# This signal provides the following arguments to any listeners: +# request - The current Request object. +# username - The username of the User who has been locked out. +# ip_address - The IP of the user who has been locked out. +user_locked_out = Signal() + + +@receiver(user_login_failed) +def handle_user_login_failed(*args, **kwargs): + AxesProxyHandler.user_login_failed(*args, **kwargs) + + +@receiver(user_logged_in) +def handle_user_logged_in(*args, **kwargs): + AxesProxyHandler.user_logged_in(*args, **kwargs) + + +@receiver(user_logged_out) +def handle_user_logged_out(*args, **kwargs): + AxesProxyHandler.user_logged_out(*args, **kwargs) + + +@receiver(post_save, sender=AccessAttempt) +def handle_post_save_access_attempt(*args, **kwargs): + AxesProxyHandler.post_save_access_attempt(*args, **kwargs) + + +@receiver(post_delete, sender=AccessAttempt) +def handle_post_delete_access_attempt(*args, **kwargs): + AxesProxyHandler.post_delete_access_attempt(*args, **kwargs) + + +@receiver(setting_changed) +def handle_setting_changed( + sender, setting, value, enter, **kwargs +): # pylint: disable=unused-argument + """ + Reinitialize handler implementation if a relevant setting changes + in e.g. application reconfiguration or during testing. + """ + + if setting == "AXES_HANDLER": + AxesProxyHandler.get_implementation(force=True) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/utils.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/utils.py new file mode 100644 index 0000000..2cdd9d7 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/axes/utils.py @@ -0,0 +1,57 @@ +""" +Axes utility functions that are publicly available. + +This module is separate for historical reasons +and offers a backwards compatible import path. +""" + +from logging import getLogger +from typing import Optional + +from django.http import HttpRequest + +from axes.conf import settings +from axes.handlers.proxy import AxesProxyHandler +from axes.helpers import get_client_ip_address + +log = getLogger(__name__) + + +def reset(ip: str = None, username: str = None, ip_or_username=False) -> int: + """ + Reset records that match IP or username, and return the count of removed attempts. + + This utility method is meant to be used from the CLI or via Python API. + """ + + return AxesProxyHandler.reset_attempts( + ip_address=ip, username=username, ip_or_username=ip_or_username + ) + + +def reset_request(request: HttpRequest) -> int: + """ + Reset records that match IP or username, and return the count of removed attempts. + + This utility method is meant to be used from the CLI or via Python API. + """ + + ip: Optional[str] = get_client_ip_address(request) + username = request.GET.get("username", None) + + ip_or_username = settings.AXES_LOCK_OUT_BY_USER_OR_IP + if settings.AXES_ONLY_USER_FAILURES: + ip = None + elif not ( + settings.AXES_LOCK_OUT_BY_USER_OR_IP + or settings.AXES_LOCK_OUT_BY_COMBINATION_USER_AND_IP + ): + username = None + + if not ip and not username: + return 0 + # We don't want to reset everything, if there is some wrong request parameter + + # if settings.AXES_USE_USER_AGENT: + # TODO: reset based on user_agent? + return reset(ip, username, ip_or_username) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/bcrypt-3.2.0.dist-info/INSTALLER b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/bcrypt-3.2.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/bcrypt-3.2.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/bcrypt-3.2.0.dist-info/LICENSE b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/bcrypt-3.2.0.dist-info/LICENSE new file mode 100644 index 0000000..11069ed --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/bcrypt-3.2.0.dist-info/LICENSE @@ -0,0 +1,201 @@ + 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 + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/bcrypt-3.2.0.dist-info/METADATA b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/bcrypt-3.2.0.dist-info/METADATA new file mode 100644 index 0000000..e712e1f --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/bcrypt-3.2.0.dist-info/METADATA @@ -0,0 +1,252 @@ +Metadata-Version: 2.1 +Name: bcrypt +Version: 3.2.0 +Summary: Modern password hashing for your software and your servers +Home-page: https://github.com/pyca/bcrypt/ +Author: The Python Cryptographic Authority developers +Author-email: cryptography-dev@python.org +License: Apache License, Version 2.0 +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: License :: OSI Approved :: Apache Software License +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Requires-Python: >=3.6 +Requires-Dist: cffi (>=1.1) +Requires-Dist: six (>=1.4.1) +Provides-Extra: tests +Requires-Dist: pytest (!=3.3.0,>=3.2.1) ; extra == 'tests' +Provides-Extra: typecheck +Requires-Dist: mypy ; extra == 'typecheck' + +bcrypt +====== + +.. image:: https://img.shields.io/pypi/v/bcrypt.svg + :target: https://pypi.org/project/bcrypt/ + :alt: Latest Version + +.. image:: https://travis-ci.org/pyca/bcrypt.svg?branch=master + :target: https://travis-ci.org/pyca/bcrypt + +.. image:: https://github.com/pyca/bcrypt/workflows/CI/badge.svg?branch=master + :target: https://github.com/pyca/bcrypt/actions?query=workflow%3ACI+branch%3Amaster + +Good password hashing for your software and your servers + + +Installation +============ + +To install bcrypt, simply: + +.. code:: bash + + $ pip install bcrypt + +Note that bcrypt should build very easily on Linux provided you have a C compiler, headers for Python (if you're not using pypy), and headers for the libffi libraries available on your system. + +For Debian and Ubuntu, the following command will ensure that the required dependencies are installed: + +.. code:: bash + + $ sudo apt-get install build-essential libffi-dev python-dev + +For Fedora and RHEL-derivatives, the following command will ensure that the required dependencies are installed: + +.. code:: bash + + $ sudo yum install gcc libffi-devel python-devel + +For Alpine, the following command will ensure that the required dependencies are installed: + +.. code:: bash + + $ apk add --update musl-dev gcc libffi-dev + + +Alternatives +============ + +While bcrypt remains a good choice for password storage depending on your specific use case you may also want to consider using scrypt (either via `standard library`_ or `cryptography`_) or argon2id via `argon2_cffi`_. + +Changelog +========= + + +3.2.0 +----- + +* Added typehints for library functions. +* Dropped support for Python versions less than 3.6 (2.7, 3.4, 3.5). +* Shipped ``abi3`` Windows wheels (requires pip >= 20). + +3.1.7 +----- + +* Set a ``setuptools`` lower bound for PEP517 wheel building. +* We no longer distribute 32-bit ``manylinux1`` wheels. Continuing to produce + them was a maintenance burden. + +3.1.6 +----- + +* Added support for compilation on Haiku. + +3.1.5 +----- + +* Added support for compilation on AIX. +* Dropped Python 2.6 and 3.3 support. +* Switched to using ``abi3`` wheels for Python 3. If you are not getting a + wheel on a compatible platform please upgrade your ``pip`` version. + +3.1.4 +----- + +* Fixed compilation with mingw and on illumos. + +3.1.3 +----- +* Fixed a compilation issue on Solaris. +* Added a warning when using too few rounds with ``kdf``. + +3.1.2 +----- +* Fixed a compile issue affecting big endian platforms. +* Fixed invalid escape sequence warnings on Python 3.6. +* Fixed building in non-UTF8 environments on Python 2. + +3.1.1 +----- +* Resolved a ``UserWarning`` when used with ``cffi`` 1.8.3. + +3.1.0 +----- +* Added support for ``checkpw``, a convenience method for verifying a password. +* Ensure that you get a ``$2y$`` hash when you input a ``$2y$`` salt. +* Fixed a regression where ``$2a`` hashes were vulnerable to a wraparound bug. +* Fixed compilation under Alpine Linux. + +3.0.0 +----- +* Switched the C backend to code obtained from the OpenBSD project rather than + openwall. +* Added support for ``bcrypt_pbkdf`` via the ``kdf`` function. + +2.0.0 +----- +* Added support for an adjustible prefix when calling ``gensalt``. +* Switched to CFFI 1.0+ + +Usage +----- + +Password Hashing +~~~~~~~~~~~~~~~~ + +Hashing and then later checking that a password matches the previous hashed +password is very simple: + +.. code:: pycon + + >>> import bcrypt + >>> password = b"super secret password" + >>> # Hash a password for the first time, with a randomly-generated salt + >>> hashed = bcrypt.hashpw(password, bcrypt.gensalt()) + >>> # Check that an unhashed password matches one that has previously been + >>> # hashed + >>> if bcrypt.checkpw(password, hashed): + ... print("It Matches!") + ... else: + ... print("It Does not Match :(") + +KDF +~~~ + +As of 3.0.0 ``bcrypt`` now offers a ``kdf`` function which does ``bcrypt_pbkdf``. +This KDF is used in OpenSSH's newer encrypted private key format. + +.. code:: pycon + + >>> import bcrypt + >>> key = bcrypt.kdf( + ... password=b'password', + ... salt=b'salt', + ... desired_key_bytes=32, + ... rounds=100) + + +Adjustable Work Factor +~~~~~~~~~~~~~~~~~~~~~~ +One of bcrypt's features is an adjustable logarithmic work factor. To adjust +the work factor merely pass the desired number of rounds to +``bcrypt.gensalt(rounds=12)`` which defaults to 12): + +.. code:: pycon + + >>> import bcrypt + >>> password = b"super secret password" + >>> # Hash a password for the first time, with a certain number of rounds + >>> hashed = bcrypt.hashpw(password, bcrypt.gensalt(14)) + >>> # Check that a unhashed password matches one that has previously been + >>> # hashed + >>> if bcrypt.checkpw(password, hashed): + ... print("It Matches!") + ... else: + ... print("It Does not Match :(") + + +Adjustable Prefix +~~~~~~~~~~~~~~~~~ + +Another one of bcrypt's features is an adjustable prefix to let you define what +libraries you'll remain compatible with. To adjust this, pass either ``2a`` or +``2b`` (the default) to ``bcrypt.gensalt(prefix=b"2b")`` as a bytes object. + +As of 3.0.0 the ``$2y$`` prefix is still supported in ``hashpw`` but deprecated. + +Maximum Password Length +~~~~~~~~~~~~~~~~~~~~~~~ + +The bcrypt algorithm only handles passwords up to 72 characters, any characters +beyond that are ignored. To work around this, a common approach is to hash a +password with a cryptographic hash (such as ``sha256``) and then base64 +encode it to prevent NULL byte problems before hashing the result with +``bcrypt``: + +.. code:: pycon + + >>> password = b"an incredibly long password" * 10 + >>> hashed = bcrypt.hashpw( + ... base64.b64encode(hashlib.sha256(password).digest()), + ... bcrypt.gensalt() + ... ) + +Compatibility +------------- + +This library should be compatible with py-bcrypt and it will run on Python +3.6+, and PyPy 3. + +C Code +------ + +This library uses code from OpenBSD. + +Security +-------- + +``bcrypt`` follows the `same security policy as cryptography`_, if you +identify a vulnerability, we ask you to contact us privately. + +.. _`same security policy as cryptography`: https://cryptography.io/en/latest/security/ +.. _`standard library`: https://docs.python.org/3/library/hashlib.html#hashlib.scrypt +.. _`argon2_cffi`: https://argon2-cffi.readthedocs.io +.. _`cryptography`: https://cryptography.io/en/latest/hazmat/primitives/key-derivation-functions/#cryptography.hazmat.primitives.kdf.scrypt.Scrypt + + diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/bcrypt-3.2.0.dist-info/RECORD b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/bcrypt-3.2.0.dist-info/RECORD new file mode 100644 index 0000000..7cff944 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/bcrypt-3.2.0.dist-info/RECORD @@ -0,0 +1,13 @@ +bcrypt-3.2.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +bcrypt-3.2.0.dist-info/LICENSE,sha256=gXPVwptPlW1TJ4HSuG5OMPg-a3h43OGMkZRR1rpwfJA,10850 +bcrypt-3.2.0.dist-info/METADATA,sha256=GdD7y9zNFz4pIwJMsoqoBNMUi0F8KmOPAEWWPZ86gWw,7471 +bcrypt-3.2.0.dist-info/RECORD,, +bcrypt-3.2.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +bcrypt-3.2.0.dist-info/WHEEL,sha256=anfJboABYoHdkg0AA4Ga5g8v1QHyNq_zIyy3oKyWQ14,111 +bcrypt-3.2.0.dist-info/top_level.txt,sha256=igJttN6fNWPEzk4lnCMzlitVT_1PlLVJzxzogMWGARU,15 +bcrypt/__about__.py,sha256=R9tFLrp54uy-g5mKOLOr8ZaJASKzpn8pf_FHWoBh_HM,1320 +bcrypt/__init__.py,sha256=Kcn4lm_wsTtTMKBqHQYsHTHQz3xSZlLwMbQT6gKbhIg,5774 +bcrypt/__pycache__/__about__.cpython-38.pyc,, +bcrypt/__pycache__/__init__.cpython-38.pyc,, +bcrypt/_bcrypt.abi3.so,sha256=RGDqDI8HZJIbzrAenMXe8ZHG34tvXxaOjCjtMi1FErg,139632 +bcrypt/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/bcrypt-3.2.0.dist-info/REQUESTED b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/bcrypt-3.2.0.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/bcrypt-3.2.0.dist-info/WHEEL b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/bcrypt-3.2.0.dist-info/WHEEL new file mode 100644 index 0000000..274d629 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/bcrypt-3.2.0.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.35.1) +Root-Is-Purelib: false +Tag: cp36-abi3-manylinux2010_x86_64 + diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/bcrypt-3.2.0.dist-info/top_level.txt b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/bcrypt-3.2.0.dist-info/top_level.txt new file mode 100644 index 0000000..9fd6492 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/bcrypt-3.2.0.dist-info/top_level.txt @@ -0,0 +1,2 @@ +_bcrypt +bcrypt diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/bcrypt/__about__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/bcrypt/__about__.py new file mode 100644 index 0000000..0d9b6bf --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/bcrypt/__about__.py @@ -0,0 +1,41 @@ +# Author:: Donald Stufft () +# Copyright:: Copyright (c) 2013 Donald Stufft +# License:: Apache License, Version 2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from __future__ import absolute_import +from __future__ import division +from __future__ import unicode_literals + +__all__ = [ + "__title__", + "__summary__", + "__uri__", + "__version__", + "__author__", + "__email__", + "__license__", + "__copyright__", +] + +__title__ = "bcrypt" +__summary__ = "Modern password hashing for your software and your servers" +__uri__ = "https://github.com/pyca/bcrypt/" + +__version__ = "3.2.0" + +__author__ = "The Python Cryptographic Authority developers" +__email__ = "cryptography-dev@python.org" + +__license__ = "Apache License, Version 2.0" +__copyright__ = "Copyright 2013-2020 {0}".format(__author__) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/bcrypt/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/bcrypt/__init__.py new file mode 100644 index 0000000..0a8cc05 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/bcrypt/__init__.py @@ -0,0 +1,178 @@ +# Author:: Donald Stufft () +# Copyright:: Copyright (c) 2013 Donald Stufft +# License:: Apache License, Version 2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from __future__ import absolute_import +from __future__ import division + +import os +import re +import warnings + +import six + +from . import _bcrypt # type: ignore +from .__about__ import ( + __author__, + __copyright__, + __email__, + __license__, + __summary__, + __title__, + __uri__, + __version__, +) + + +__all__ = [ + "__title__", + "__summary__", + "__uri__", + "__version__", + "__author__", + "__email__", + "__license__", + "__copyright__", + "gensalt", + "hashpw", + "kdf", + "checkpw", +] + + +_normalize_re = re.compile(br"^\$2y\$") + + +def gensalt(rounds: int = 12, prefix: bytes = b"2b") -> bytes: + if prefix not in (b"2a", b"2b"): + raise ValueError("Supported prefixes are b'2a' or b'2b'") + + if rounds < 4 or rounds > 31: + raise ValueError("Invalid rounds") + + salt = os.urandom(16) + output = _bcrypt.ffi.new("char[]", 30) + _bcrypt.lib.encode_base64(output, salt, len(salt)) + + return ( + b"$" + + prefix + + b"$" + + ("%2.2u" % rounds).encode("ascii") + + b"$" + + _bcrypt.ffi.string(output) + ) + + +def hashpw(password: bytes, salt: bytes) -> bytes: + if isinstance(password, six.text_type) or isinstance(salt, six.text_type): + raise TypeError("Unicode-objects must be encoded before hashing") + + if b"\x00" in password: + raise ValueError("password may not contain NUL bytes") + + # bcrypt originally suffered from a wraparound bug: + # http://www.openwall.com/lists/oss-security/2012/01/02/4 + # This bug was corrected in the OpenBSD source by truncating inputs to 72 + # bytes on the updated prefix $2b$, but leaving $2a$ unchanged for + # compatibility. However, pyca/bcrypt 2.0.0 *did* correctly truncate inputs + # on $2a$, so we do it here to preserve compatibility with 2.0.0 + password = password[:72] + + # When the original 8bit bug was found the original library we supported + # added a new prefix, $2y$, that fixes it. This prefix is exactly the same + # as the $2b$ prefix added by OpenBSD other than the name. Since the + # OpenBSD library does not support the $2y$ prefix, if the salt given to us + # is for the $2y$ prefix, we'll just mugne it so that it's a $2b$ prior to + # passing it into the C library. + original_salt, salt = salt, _normalize_re.sub(b"$2b$", salt) + + hashed = _bcrypt.ffi.new("char[]", 128) + retval = _bcrypt.lib.bcrypt_hashpass(password, salt, hashed, len(hashed)) + + if retval != 0: + raise ValueError("Invalid salt") + + # Now that we've gotten our hashed password, we want to ensure that the + # prefix we return is the one that was passed in, so we'll use the prefix + # from the original salt and concatenate that with the return value (minus + # the return value's prefix). This will ensure that if someone passed in a + # salt with a $2y$ prefix, that they get back a hash with a $2y$ prefix + # even though we munged it to $2b$. + return original_salt[:4] + _bcrypt.ffi.string(hashed)[4:] + + +def checkpw(password: bytes, hashed_password: bytes) -> bool: + if isinstance(password, six.text_type) or isinstance( + hashed_password, six.text_type + ): + raise TypeError("Unicode-objects must be encoded before checking") + + if b"\x00" in password or b"\x00" in hashed_password: + raise ValueError( + "password and hashed_password may not contain NUL bytes" + ) + + ret = hashpw(password, hashed_password) + + if len(ret) != len(hashed_password): + return False + + return _bcrypt.lib.timingsafe_bcmp(ret, hashed_password, len(ret)) == 0 + + +def kdf( + password: bytes, + salt: bytes, + desired_key_bytes: int, + rounds: int, + ignore_few_rounds: bool = False, +) -> bytes: + if isinstance(password, six.text_type) or isinstance(salt, six.text_type): + raise TypeError("Unicode-objects must be encoded before hashing") + + if len(password) == 0 or len(salt) == 0: + raise ValueError("password and salt must not be empty") + + if desired_key_bytes <= 0 or desired_key_bytes > 512: + raise ValueError("desired_key_bytes must be 1-512") + + if rounds < 1: + raise ValueError("rounds must be 1 or more") + + if rounds < 50 and not ignore_few_rounds: + # They probably think bcrypt.kdf()'s rounds parameter is logarithmic, + # expecting this value to be slow enough (it probably would be if this + # were bcrypt). Emit a warning. + warnings.warn( + ( + "Warning: bcrypt.kdf() called with only {0} round(s). " + "This few is not secure: the parameter is linear, like PBKDF2." + ).format(rounds), + UserWarning, + stacklevel=2, + ) + + key = _bcrypt.ffi.new("uint8_t[]", desired_key_bytes) + res = _bcrypt.lib.bcrypt_pbkdf( + password, len(password), salt, len(salt), key, len(key), rounds + ) + _bcrypt_assert(res == 0) + + return _bcrypt.ffi.buffer(key, desired_key_bytes)[:] + + +def _bcrypt_assert(ok: bool) -> None: + if not ok: + raise SystemError("bcrypt assertion failed") diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/bcrypt/_bcrypt.abi3.so b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/bcrypt/_bcrypt.abi3.so new file mode 100755 index 0000000..e02aaf2 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/bcrypt/_bcrypt.abi3.so differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/bcrypt/py.typed b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/bcrypt/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard-3.6.4.0.dist-info/INSTALLER b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard-3.6.4.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard-3.6.4.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard-3.6.4.0.dist-info/LICENSE.txt b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard-3.6.4.0.dist-info/LICENSE.txt new file mode 100644 index 0000000..b9920ed --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard-3.6.4.0.dist-info/LICENSE.txt @@ -0,0 +1,29 @@ +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard-3.6.4.0.dist-info/METADATA b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard-3.6.4.0.dist-info/METADATA new file mode 100644 index 0000000..eef0cba --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard-3.6.4.0.dist-info/METADATA @@ -0,0 +1,112 @@ +Metadata-Version: 2.1 +Name: billiard +Version: 3.6.4.0 +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 +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Programming Language :: Python +Classifier: Programming Language :: C +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.5 +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 :: 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 +Description-Content-Type: text/markdown + +======== +billiard +======== +:version: 3.6.4.0 + +|build-status-lin| |build-status-win| |license| |wheel| |pyversion| |pyimp| + +.. |build-status-lin| image:: https://secure.travis-ci.org/celery/billiard.png?branch=master + :alt: Build status on Linux + :target: https://travis-ci.org/celery/billiard + +.. |build-status-win| image:: https://ci.appveyor.com/api/projects/status/github/celery/billiard?png=true&branch=master + :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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard-3.6.4.0.dist-info/RECORD b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard-3.6.4.0.dist-info/RECORD new file mode 100644 index 0000000..2dc7d9e --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard-3.6.4.0.dist-info/RECORD @@ -0,0 +1,65 @@ +billiard-3.6.4.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +billiard-3.6.4.0.dist-info/LICENSE.txt,sha256=ZjLlmsq9u77CYoN9RHJKBlMYlJ8ALv0GAtZCcRrjpFc,1483 +billiard-3.6.4.0.dist-info/METADATA,sha256=vuSGzLNS74m40sl9XXGu1OqEb4SHQuz4JWa6pyNZ7zI,4480 +billiard-3.6.4.0.dist-info/RECORD,, +billiard-3.6.4.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +billiard-3.6.4.0.dist-info/WHEEL,sha256=g4nMs7d-Xl9-xC9XovUrsDHGXt-FT0E17Yqo92DEfvY,92 +billiard-3.6.4.0.dist-info/top_level.txt,sha256=52Kkdlqn9Np8pbpkTVd_1KZTZLGjupUzhUw8QsW-B-U,9 +billiard/__init__.py,sha256=5ZCRrQvZQ0e189Dx_5QzyXm-s2QflZOAwMbiMSdeLlE,1598 +billiard/__pycache__/__init__.cpython-38.pyc,, +billiard/__pycache__/_ext.cpython-38.pyc,, +billiard/__pycache__/_win.cpython-38.pyc,, +billiard/__pycache__/common.cpython-38.pyc,, +billiard/__pycache__/compat.cpython-38.pyc,, +billiard/__pycache__/connection.cpython-38.pyc,, +billiard/__pycache__/context.cpython-38.pyc,, +billiard/__pycache__/einfo.cpython-38.pyc,, +billiard/__pycache__/exceptions.cpython-38.pyc,, +billiard/__pycache__/five.cpython-38.pyc,, +billiard/__pycache__/forkserver.cpython-38.pyc,, +billiard/__pycache__/heap.cpython-38.pyc,, +billiard/__pycache__/managers.cpython-38.pyc,, +billiard/__pycache__/pool.cpython-38.pyc,, +billiard/__pycache__/popen_fork.cpython-38.pyc,, +billiard/__pycache__/popen_forkserver.cpython-38.pyc,, +billiard/__pycache__/popen_spawn_posix.cpython-38.pyc,, +billiard/__pycache__/popen_spawn_win32.cpython-38.pyc,, +billiard/__pycache__/process.cpython-38.pyc,, +billiard/__pycache__/queues.cpython-38.pyc,, +billiard/__pycache__/reduction.cpython-38.pyc,, +billiard/__pycache__/resource_sharer.cpython-38.pyc,, +billiard/__pycache__/semaphore_tracker.cpython-38.pyc,, +billiard/__pycache__/sharedctypes.cpython-38.pyc,, +billiard/__pycache__/spawn.cpython-38.pyc,, +billiard/__pycache__/synchronize.cpython-38.pyc,, +billiard/__pycache__/util.cpython-38.pyc,, +billiard/_ext.py,sha256=JE-Yc_T1SSZ40pnEQSY7P2gVsjnF4fGO1nCPZqMnSlg,912 +billiard/_win.py,sha256=Qb6pNOyqkjTQJbieQ9laK34maNymXRl7YllXV33vc6I,2982 +billiard/common.py,sha256=0MvDZ1K0ttqTPeJ0H8CVeckK6NcwZQ6ZWfYP7RdEav4,4556 +billiard/compat.py,sha256=4hUPL5yMXaoTnw9zHG0Mt_O2ciT75zk9NmZVsNbWsFM,8938 +billiard/connection.py,sha256=KE-sIfd6GJ_U3TagV5_oTl04MfUjuqobaceXFuYAg-c,32759 +billiard/context.py,sha256=b9WZwt_jUlhhh1_8dbuAc-veMso6DGgmr6zsAhaeVGs,13202 +billiard/dummy/__init__.py,sha256=IVBv7GdN40dJjT7qRGfNB6dUtqkJjztZRUeIWQx3lh0,4680 +billiard/dummy/__pycache__/__init__.cpython-38.pyc,, +billiard/dummy/__pycache__/connection.cpython-38.pyc,, +billiard/dummy/connection.py,sha256=i2_VZhEkcfLazb_Pi-Qk7K_6eK4N0ieBYT99rnBHHS4,2954 +billiard/einfo.py,sha256=EctNy7BxU02lmADS6CIY_Y-0uFBIF0vwsAKkBJf55uw,3671 +billiard/exceptions.py,sha256=U1I3miQnFdEr-GpYswFk-tI8pnuRj9fRwFEB6kmpVvs,1312 +billiard/five.py,sha256=LIXMZrpp7tmM-9gxtxGEdhJ2q_h97Bt1VFm2gehKYF0,5544 +billiard/forkserver.py,sha256=Wgpz2mDIR6rLg8M2vAPvt3bkWVad6Kq422qgI_08yD0,8346 +billiard/heap.py,sha256=tcdgH5eM9zJHY747zEYm4wMLqdCfjoaYWZKkasrG33c,9349 +billiard/managers.py,sha256=U3ZyW1zzXjoDnjkHi52RT83h2GaXcEcKIuNzTHNHGHU,36841 +billiard/pool.py,sha256=9_v_BU9gskUJgE9EB4pU-9yXDHuTNpfS6m-c2J1egpE,69071 +billiard/popen_fork.py,sha256=a8Rn2ILCNIcHxFSwqbVSHFaPL_TTp2Ez5osXFDS3-4o,2600 +billiard/popen_forkserver.py,sha256=Ow8Rr6WjrYrJqsNE5ljnNEAbgleXyQXurn59qNlmDIs,1829 +billiard/popen_spawn_posix.py,sha256=Z2jsrtRWd-LAGacckULHyvxOpE61Ne7fp-Mel3FRvR8,1981 +billiard/popen_spawn_win32.py,sha256=8_cHhSa9jiwkDU7txMVJctjGuj0UoZxm9CF5Hj0s_0s,3591 +billiard/process.py,sha256=PRJDWKPQHUByPTtU1BtmFh6FOCfIbhkysaVjW9e6ndY,11138 +billiard/queues.py,sha256=ckMNodfWoYrKA6fAR3Hwamj4HZdwzAumYYQOpseUPxY,12778 +billiard/reduction.py,sha256=VXGE8g4pzhaPrIefdo-_LVTP-hIRvxo2mMOk9MveDYo,9429 +billiard/resource_sharer.py,sha256=OuKRJ2k0IwMUn8ykZ4lJ1p30X9sPc_UbHToXnJmqXf8,5361 +billiard/semaphore_tracker.py,sha256=PEhEgEJ8v7KbyYjzkmgxosRqnP3w50oC2Q9gHUeCEQU,4893 +billiard/sharedctypes.py,sha256=HuxgwfqDq5zapUBhe_JhASbowcLJ_ZAdky95sYRxtw8,6746 +billiard/spawn.py,sha256=xBVAxE0cWzVZEpGhzm28xFTEZJcHJDRzW1M7jpvhJIg,11779 +billiard/synchronize.py,sha256=lyhels1MI2syYyLqGTpnrexjlnmzCF6h43UKt8YwBHM,13041 +billiard/util.py,sha256=YAwBHvTST0iTyoLJ4Zo8HskwpCKtzvkd_nM_jZYgXL8,6021 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard-3.6.4.0.dist-info/REQUESTED b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard-3.6.4.0.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard-3.6.4.0.dist-info/WHEEL b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard-3.6.4.0.dist-info/WHEEL new file mode 100644 index 0000000..b552003 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard-3.6.4.0.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.34.2) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard-3.6.4.0.dist-info/top_level.txt b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard-3.6.4.0.dist-info/top_level.txt new file mode 100644 index 0000000..7ac9b31 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard-3.6.4.0.dist-info/top_level.txt @@ -0,0 +1 @@ +billiard diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/__init__.py new file mode 100644 index 0000000..9ec84c2 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/__init__.py @@ -0,0 +1,61 @@ +"""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. +# + +from __future__ import absolute_import + +import sys +from . import context + +VERSION = (3, 6, 4, 0) +__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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/_ext.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/_ext.py new file mode 100644 index 0000000..29f2555 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/_ext.py @@ -0,0 +1,34 @@ +from __future__ import absolute_import + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/_win.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/_win.py new file mode 100644 index 0000000..edd43a2 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/_win.py @@ -0,0 +1,116 @@ +# -*- coding: utf-8 -*- +""" + billiard._win + ~~~~~~~~~~~~~ + + Windows utilities to terminate process groups. + +""" +from __future__ import absolute_import + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/common.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/common.py new file mode 100644 index 0000000..0b7bec2 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/common.py @@ -0,0 +1,169 @@ +# -*- coding: utf-8 -*- +""" +This module contains utilities added by billiard, to keep +"non-core" functionality out of ``.util``.""" +from __future__ import absolute_import + +import os +import signal +import sys + +import pickle as pypickle +try: + import cPickle as cpickle +except ImportError: # pragma: no cover + cpickle = None # noqa + +from .exceptions import RestartFreqExceeded +from .five import monotonic + +pickle = cpickle or pypickle +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. +if sys.version_info[0] == 3: + from io import BytesIO +else: + try: + from cStringIO import StringIO as BytesIO # noqa + except ImportError: + from StringIO import StringIO as BytesIO # noqa + +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', + 'SIGUSR2' +} + +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(object): + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/compat.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/compat.py new file mode 100644 index 0000000..b5ce7c7 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/compat.py @@ -0,0 +1,312 @@ +from __future__ import absolute_import + +import errno +import numbers +import os +import sys + +from .five import range, 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 + +try: + from io import UnsupportedOperation + FILENO_ERRORS = (AttributeError, ValueError, UnsupportedOperation) +except ImportError: # pragma: no cover + # Py2 + FILENO_ERRORS = (AttributeError, ValueError) # noqa + + +if sys.version_info > (2, 7, 5): + buf_t, is_new_buffer = memoryview, True # noqa +else: + buf_t, is_new_buffer = buffer, False # noqa + +if hasattr(os, 'write'): + __write__ = os.write + + if is_new_buffer: + + def send_offset(fd, buf, offset): + return __write__(fd, buf[offset:]) + + else: # Py<2.7.6 + + def send_offset(fd, buf, offset): # noqa + return __write__(fd, buf_t(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 + + +if sys.version_info[0] == 3: + bytes = bytes +else: + _bytes = bytes + + # the 'bytes' alias in Python2 does not support an encoding argument. + + class bytes(_bytes): # noqa + + def __new__(cls, *args): + if len(args) > 1: + return _bytes(args[0]).encode(*args[1:]) + return _bytes(*args) + + +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: + try: + # e.args = (errno, reason) + if isinstance(exc.args, tuple) and len(exc.args) == 2: + return exc.args[0] + except AttributeError: + pass + 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, 9): + args.extend((None, None, None, -1)) # group, extra_groups, user, umask + args.append(None) # preexec_fn + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/connection.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/connection.py new file mode 100644 index 0000000..627ed9b --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/connection.py @@ -0,0 +1,1037 @@ +# -*- coding: utf-8 -*- +# +# 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. +# + +from __future__ import absolute_import + +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 .five 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(object): + + def __init__(self, sock): + self.sock = sock + + +class _ConnectionBase(object): + _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(object): + ''' + 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(object): + ''' + 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(object): + ''' + 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(object): + + 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 sharable 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/context.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/context.py new file mode 100644 index 0000000..3bfa8dc --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/context.py @@ -0,0 +1,422 @@ +from __future__ import absolute_import + +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(object): + + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/dummy/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/dummy/__init__.py new file mode 100644 index 0000000..032f5f1 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/dummy/__init__.py @@ -0,0 +1,167 @@ +# +# 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. +# +from __future__ import absolute_import + +# +# Imports +# + +import threading +import sys +import weakref +import array + +from threading import Lock, RLock, Semaphore, BoundedSemaphore +from threading import Event + +from billiard.five 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/dummy/connection.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/dummy/connection.py new file mode 100644 index 0000000..6bf6b9d --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/dummy/connection.py @@ -0,0 +1,93 @@ +# +# 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 __future__ import absolute_import + +from billiard.five 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/einfo.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/einfo.py new file mode 100644 index 0000000..236f400 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/einfo.py @@ -0,0 +1,135 @@ +from __future__ import absolute_import + +import sys +import traceback + +__all__ = ['ExceptionInfo', 'Traceback'] + +DEFAULT_MAX_FRAMES = sys.getrecursionlimit() // 8 + + +class _Code(object): + + 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 = () + + +class _Frame(object): + 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 + + +class _Object(object): + + def __init__(self, **kw): + [setattr(self, k, v) for k, v in kw.items()] + + +class _Truncated(object): + + 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 + + +class Traceback(object): + 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 ExceptionInfo(object): + """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, self.exception, tb = exc_info or sys.exc_info() + try: + self.tb = Traceback(tb) + self.traceback = ''.join( + traceback.format_exception(self.type, self.exception, tb), + ) + self.internal = internal + finally: + del(tb) + + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/exceptions.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/exceptions.py new file mode 100644 index 0000000..24818a7 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/exceptions.py @@ -0,0 +1,54 @@ +from __future__ import absolute_import + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/five.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/five.py new file mode 100644 index 0000000..5997f65 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/five.py @@ -0,0 +1,191 @@ +# -*- coding: utf-8 -*- +""" + celery.five + ~~~~~~~~~~~ + + Compatibility implementations of features + only available in newer Python versions. + + +""" +from __future__ import absolute_import + +# ############# py3k ######################################################### +import sys +PY3 = sys.version_info[0] == 3 + +try: + reload = reload # noqa +except NameError: # pragma: no cover + try: + from importlib import reload # noqa + except ImportError: # pragma: no cover + from imp import reload # noqa + +try: + from UserList import UserList # noqa +except ImportError: # pragma: no cover + from collections import UserList # noqa + +try: + from UserDict import UserDict # noqa +except ImportError: # pragma: no cover + from collections import UserDict # noqa + +# ############# time.monotonic ############################################### + +if sys.version_info < (3, 3): + + import platform + SYSTEM = platform.system() + + try: + import ctypes + except ImportError: # pragma: no cover + ctypes = None # noqa + + if SYSTEM == 'Darwin' and ctypes is not None: + from ctypes.util import find_library + libSystem = ctypes.CDLL(find_library('libSystem.dylib')) + CoreServices = ctypes.CDLL(find_library('CoreServices'), + use_errno=True) + mach_absolute_time = libSystem.mach_absolute_time + mach_absolute_time.restype = ctypes.c_uint64 + absolute_to_nanoseconds = CoreServices.AbsoluteToNanoseconds + absolute_to_nanoseconds.restype = ctypes.c_uint64 + absolute_to_nanoseconds.argtypes = [ctypes.c_uint64] + + def _monotonic(): + return absolute_to_nanoseconds(mach_absolute_time()) * 1e-9 + + elif SYSTEM == 'Linux' and ctypes is not None: + # from stackoverflow: + # questions/1205722/how-do-i-get-monotonic-time-durations-in-python + import ctypes + import os + + CLOCK_MONOTONIC = 1 # see + + class timespec(ctypes.Structure): + _fields_ = [ + ('tv_sec', ctypes.c_long), + ('tv_nsec', ctypes.c_long), + ] + + librt = ctypes.CDLL('librt.so.1', use_errno=True) + clock_gettime = librt.clock_gettime + clock_gettime.argtypes = [ + ctypes.c_int, ctypes.POINTER(timespec), + ] + + def _monotonic(): # noqa + t = timespec() + if clock_gettime(CLOCK_MONOTONIC, ctypes.pointer(t)) != 0: + errno_ = ctypes.get_errno() + raise OSError(errno_, os.strerror(errno_)) + return t.tv_sec + t.tv_nsec * 1e-9 + else: + from time import time as _monotonic + +try: + from time import monotonic +except ImportError: + monotonic = _monotonic # noqa + +if PY3: + import builtins + + from queue import Queue, Empty, Full + from itertools import zip_longest + from io import StringIO, BytesIO + + map = map + string = str + string_t = str + long_t = int + text_t = str + range = range + int_types = (int, ) + + def items(d): + return d.items() + + def keys(d): + return d.keys() + + def values(d): + return d.values() + + def nextfun(it): + return it.__next__ + + exec_ = getattr(builtins, 'exec') + + def reraise(tp, value, tb=None): + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + + class WhateverIO(StringIO): + + def write(self, data): + if isinstance(data, bytes): + data = data.encode() + StringIO.write(self, data) + +else: + import __builtin__ as builtins # noqa + from Queue import Queue, Empty, Full # noqa + from itertools import imap as map, izip_longest as zip_longest # noqa + from StringIO import StringIO # noqa + string = unicode # noqa + string_t = basestring # noqa + text_t = unicode + long_t = long # noqa + range = xrange + int_types = (int, long) + + def items(d): # noqa + return d.iteritems() + + def keys(d): # noqa + return d.iterkeys() + + def values(d): # noqa + return d.itervalues() + + def nextfun(it): # noqa + return it.next + + def exec_(code, globs=None, locs=None): + """Execute code in a namespace.""" + if globs is None: + frame = sys._getframe(1) + globs = frame.f_globals + if locs is None: + locs = frame.f_locals + del frame + elif locs is None: + locs = globs + exec("""exec code in globs, locs""") + + exec_("""def reraise(tp, value, tb=None): raise tp, value, tb""") + + BytesIO = WhateverIO = StringIO # noqa + + +def with_metaclass(Type, skip_attrs=set(['__dict__', '__weakref__'])): + """Class decorator to set metaclass. + + Works with both Python 2 and Python 3 and it does not add + an extra class in the lookup order like ``six.with_metaclass`` does + (that is -- it copies the original class instead of using inheritance). + + """ + + def _clone_with_metaclass(Class): + attrs = dict((key, value) for key, value in items(vars(Class)) + if key not in skip_attrs) + return Type(Class.__name__, Class.__bases__, attrs) + + return _clone_with_metaclass diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/forkserver.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/forkserver.py new file mode 100644 index 0000000..a963edb --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/forkserver.py @@ -0,0 +1,266 @@ +from __future__ import absolute_import, print_function + +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(object): + + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/heap.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/heap.py new file mode 100644 index 0000000..b7581ce --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/heap.py @@ -0,0 +1,289 @@ +# +# 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. +# +from __future__ import absolute_import + +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(object): + + _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(object): + + 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: + name = tempfile.mktemp( + prefix='pym-%d-' % (os.getpid(),), + dir=util.get_temp_dir(), + ) + self.fd = os.open( + name, os.O_RDWR | os.O_CREAT | os.O_EXCL, 0o600, + ) + util.Finalize(self, os.close, (self.fd,)) + os.unlink(name) + 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(object): + + _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(object): + + _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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/managers.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/managers.py new file mode 100644 index 0000000..78e24f4 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/managers.py @@ -0,0 +1,1210 @@ +# +# 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. +# +from __future__ import absolute_import + +# +# 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 .five import Queue, items, 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(object): + ''' + Type to uniquely indentify 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(object): + ''' + 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(object): + __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(object): + ''' + 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 items(method_to_typeid): + 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(object): + ''' + 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(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__, ', '.join(temp)) + + +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 + + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/pool.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/pool.py new file mode 100644 index 0000000..597c765 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/pool.py @@ -0,0 +1,2055 @@ +# -*- coding: utf-8 -*- +# +# 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. +# +from __future__ import absolute_import + +# +# 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 .five import Empty, Queue, range, values, reraise, monotonic +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(MaybeEncodingError, self).__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(object): + + 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, + ) + + 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(Supervisor, self).__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 maintaing workers until the cache gets drained, unless + # the pool is termianted + 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(TaskHandler, self).__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(TimeoutHandler, self).__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(ResultHandler, self).__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(object): + ''' + 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 values(cleaned): + 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 values(self._cache): + 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: + reraise(MemoryError, + MemoryError(str(exc)), + sys.exc_info()[2]) + 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 values(self._poolctrl): + 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(object): + _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 '<%s: {id} ack:{ack} ready:{ready}>'.format( + self.__class__.__name__, + id=self._job, ack=self._accepted, ready=self.ready(), + ) + + def ready(self): + return self._event.isSet() + + 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(object): + _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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/popen_fork.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/popen_fork.py new file mode 100644 index 0000000..8e03f4f --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/popen_fork.py @@ -0,0 +1,91 @@ +from __future__ import absolute_import + +import os +import sys +import errno + +from .common import TERM_SIGNAL + +__all__ = ['Popen'] + +# +# Start child process using fork +# + + +class Popen(object): + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/popen_forkserver.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/popen_forkserver.py new file mode 100644 index 0000000..d4b18d5 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/popen_forkserver.py @@ -0,0 +1,70 @@ +from __future__ import absolute_import + +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(object): + + 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(Popen, self).__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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/popen_spawn_posix.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/popen_spawn_posix.py new file mode 100644 index 0000000..a3f1111 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/popen_spawn_posix.py @@ -0,0 +1,76 @@ +from __future__ import absolute_import + +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(object): + + 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(Popen, self).__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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/popen_spawn_win32.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/popen_spawn_win32.py new file mode 100644 index 0000000..20fcc77 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/popen_spawn_win32.py @@ -0,0 +1,123 @@ +from __future__ import absolute_import + +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(object): + ''' + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/process.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/process.py new file mode 100644 index 0000000..37b28da --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/process.py @@ -0,0 +1,404 @@ +# +# 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. +# +from __future__ import absolute_import + +# +# Imports +# + +import os +import sys +import signal +import itertools +import logging +import threading +from _weakrefset import WeakSet + +from multiprocessing import process as _mproc + +from .five import items, string_t + +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(object): + ''' + Process objects represent activity that is run in a separate process + + The class is analagous 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, string_t), '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 items(signal.__dict__): + if name[:3] == 'SIG' and '_' not in name: + _exitcode_to_name[-signum] = name + +# For debug and leak testing +_dangling = WeakSet() diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/queues.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/queues.py new file mode 100644 index 0000000..0a2daa5 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/queues.py @@ -0,0 +1,403 @@ +# +# Module implementing queues +# +# multiprocessing/queues.py +# +# Copyright (c) 2006-2008, R Oudkerk +# Licensed to PSF under a Contributor Agreement. +# +from __future__ import absolute_import + +import sys +import os +import threading +import collections +import weakref +import errno + +from . import connection +from . import context + +from .compat import get_errno +from .five import monotonic, Empty, Full +from .util import ( + debug, error, info, Finalize, register_after_fork, is_exiting, +) +from .reduction import ForkingPickler + +__all__ = ['Queue', 'SimpleQueue', 'JoinableQueue'] + + +class Queue(object): + ''' + 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(object): + ''' + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/reduction.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/reduction.py new file mode 100644 index 0000000..a2fae25 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/reduction.py @@ -0,0 +1,294 @@ +# +# Module which deals with pickling of objects. +# +# multiprocessing/reduction.py +# +# Copyright (c) 2006-2008, R Oudkerk +# Licensed to PSF under a Contributor Agreement. +# +from __future__ import absolute_import + +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(object): + '''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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/resource_sharer.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/resource_sharer.py new file mode 100644 index 0000000..e10f6cd --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/resource_sharer.py @@ -0,0 +1,163 @@ +# +# 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. +# +from __future__ import absolute_import + +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(object): + '''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(object): + '''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(object): + '''Manager for resouces 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/semaphore_tracker.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/semaphore_tracker.py new file mode 100644 index 0000000..d1388bb --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/semaphore_tracker.py @@ -0,0 +1,147 @@ +# +# 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. +# +from __future__ import absolute_import + +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(object): + + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/sharedctypes.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/sharedctypes.py new file mode 100644 index 0000000..97675df --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/sharedctypes.py @@ -0,0 +1,260 @@ +# +# 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. +# +from __future__ import absolute_import + +import ctypes +import sys +import weakref + +from . import heap +from . import get_context +from .context import assert_spawning +from .five import int_types +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_types): + 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(object): + + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/spawn.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/spawn.py new file mode 100644 index 0000000..ac34c5d --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/spawn.py @@ -0,0 +1,390 @@ +# +# 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. +# +from __future__ import absolute_import + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/synchronize.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/synchronize.py new file mode 100644 index 0000000..b97fbfb --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/synchronize.py @@ -0,0 +1,437 @@ +# +# Module implementing synchronization primitives +# +# multiprocessing/synchronize.py +# +# Copyright (c) 2006-2008, R Oudkerk +# Licensed to PSF under a Contributor Agreement. +# +from __future__ import absolute_import + +import errno +import sys +import tempfile +import threading + +from . import context +from . import process +from . import util + +from ._ext import _billiard, ensure_SemLock +from .five import range, 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(object): + _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(object): + ''' + 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(object): + + 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(object): # noqa + + def __init__(self, *args, **kwargs): + raise NotImplementedError('Barrier only supported on Py3') diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/util.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/util.py new file mode 100644 index 0000000..1c74cca --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/billiard/util.py @@ -0,0 +1,233 @@ +# +# 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. +# +from __future__ import absolute_import + +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 + + logging._acquireLock() + 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: + logging._releaseLock() + + 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() + 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, sig) + except Exception: + raise OSError() + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery-5.1.2.dist-info/INSTALLER b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery-5.1.2.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery-5.1.2.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery-5.1.2.dist-info/LICENSE b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery-5.1.2.dist-info/LICENSE new file mode 100644 index 0000000..c0fdb26 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery-5.1.2.dist-info/LICENSE @@ -0,0 +1,54 @@ +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery-5.1.2.dist-info/METADATA b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery-5.1.2.dist-info/METADATA new file mode 100644 index 0000000..300ab82 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery-5.1.2.dist-info/METADATA @@ -0,0 +1,645 @@ +Metadata-Version: 2.1 +Name: celery +Version: 5.1.2 +Summary: Distributed Task Queue. +Home-page: http://celeryproject.org +Author: Ask Solem +Author-email: auvipy@gmail.com +License: BSD +Project-URL: Documentation, http://docs.celeryproject.org/en/latest/index.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: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3 +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 :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Operating System :: OS Independent +Requires-Python: >=3.6, +License-File: LICENSE +Requires-Dist: pytz (>dev) +Requires-Dist: billiard (<4.0,>=3.6.4.0) +Requires-Dist: kombu (<6.0,>=5.1.0) +Requires-Dist: vine (<6.0,>=5.0.0) +Requires-Dist: click (<8.0,>=7.0) +Requires-Dist: click-didyoumean (>=0.0.3) +Requires-Dist: click-repl (>=0.1.6) +Requires-Dist: click-plugins (>=1.1.1) +Requires-Dist: setuptools +Provides-Extra: arangodb +Requires-Dist: pyArango (>=1.3.2) ; extra == 'arangodb' +Provides-Extra: auth +Requires-Dist: cryptography ; extra == 'auth' +Provides-Extra: azureblockblob +Requires-Dist: azure-storage-blob (==12.6.0) ; extra == 'azureblockblob' +Provides-Extra: brotli +Requires-Dist: brotli (>=1.0.0) ; (platform_python_implementation == "CPython") and extra == 'brotli' +Requires-Dist: brotlipy (>=0.7.0) ; (platform_python_implementation == "PyPy") and extra == 'brotli' +Provides-Extra: cassandra +Requires-Dist: cassandra-driver (<3.21.0) ; extra == 'cassandra' +Provides-Extra: consul +Requires-Dist: python-consul2 ; extra == 'consul' +Provides-Extra: cosmosdbsql +Requires-Dist: pydocumentdb (==2.3.2) ; extra == 'cosmosdbsql' +Provides-Extra: couchbase +Requires-Dist: couchbase (>=3.0.0) ; (platform_python_implementation != "PyPy") and extra == 'couchbase' +Provides-Extra: couchdb +Requires-Dist: pycouchdb ; extra == 'couchdb' +Provides-Extra: django +Requires-Dist: Django (>=1.11) ; extra == 'django' +Provides-Extra: dynamodb +Requires-Dist: boto3 (>=1.9.178) ; extra == 'dynamodb' +Provides-Extra: elasticsearch +Requires-Dist: elasticsearch ; extra == 'elasticsearch' +Provides-Extra: eventlet +Requires-Dist: eventlet (>=0.26.1) ; extra == 'eventlet' +Provides-Extra: gevent +Requires-Dist: gevent (>=1.0.0) ; extra == 'gevent' +Provides-Extra: librabbitmq +Requires-Dist: librabbitmq (>=1.5.0) ; extra == 'librabbitmq' +Provides-Extra: memcache +Requires-Dist: pylibmc ; (platform_system != "Windows") and extra == 'memcache' +Provides-Extra: mongodb +Requires-Dist: pymongo[srv] (>=3.3.0) ; extra == 'mongodb' +Provides-Extra: msgpack +Requires-Dist: msgpack ; extra == 'msgpack' +Provides-Extra: pymemcache +Requires-Dist: python-memcached ; extra == 'pymemcache' +Provides-Extra: pyro +Requires-Dist: pyro4 ; extra == 'pyro' +Provides-Extra: pytest +Requires-Dist: pytest-celery ; extra == 'pytest' +Provides-Extra: redis +Requires-Dist: redis (>=3.2.0) ; extra == 'redis' +Provides-Extra: s3 +Requires-Dist: boto3 (>=1.9.125) ; extra == 's3' +Provides-Extra: slmq +Requires-Dist: softlayer-messaging (>=1.0.3) ; extra == 'slmq' +Provides-Extra: solar +Requires-Dist: ephem ; (platform_python_implementation != "PyPy") and extra == 'solar' +Provides-Extra: sqlalchemy +Requires-Dist: sqlalchemy ; extra == 'sqlalchemy' +Provides-Extra: sqs +Requires-Dist: boto3 (>=1.9.125) ; extra == 'sqs' +Requires-Dist: pycurl (==7.43.0.5) ; extra == 'sqs' +Provides-Extra: tblib +Requires-Dist: tblib (>=1.3.0) ; (python_version < "3.8.0") and extra == 'tblib' +Requires-Dist: tblib (>=1.5.0) ; (python_version >= "3.8.0") and extra == 'tblib' +Provides-Extra: yaml +Requires-Dist: PyYAML (>=3.10) ; extra == 'yaml' +Provides-Extra: zookeeper +Requires-Dist: kazoo (>=1.3.1) ; extra == 'zookeeper' +Provides-Extra: zstd +Requires-Dist: zstandard ; extra == 'zstd' + +.. image:: http://docs.celeryproject.org/en/latest/_images/celery-banner-small.png + +|build-status| |coverage| |license| |wheel| |pyversion| |pyimp| |ocbackerbadge| |ocsponsorbadge| + +:Version: 5.1.2 (sun-harmonics) +:Web: https://docs.celeryproject.org/en/stable/index.html +:Download: https://pypi.org/project/celery/ +:Source: https://github.com/celery/celery/ +:Keywords: task, queue, job, async, rabbitmq, amqp, redis, + python, distributed, actors + +Donations +========= + +This project relies on your generous donations. + +If you are using Celery to create a commercial product, please consider becoming our `backer`_ or our `sponsor`_ to ensure Celery's future. + +.. _`backer`: https://opencollective.com/celery#backer +.. _`sponsor`: https://opencollective.com/celery#sponsor + +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. `_ + +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`_ for golang, 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 +.. _rusty-celery: https://github.com/rusty-celery/rusty-celery + +What do I need? +=============== + +Celery version 5.1.2 runs on, + +- Python (3.6, 3.7, 3.8, 3.9) +- PyPy3.6 (7.6) + + +This is the next version of celery which will support Python 3.6 or newer. + +If you're running an older version of Python, you need to be running +an older version of Celery: + +- 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. +- Python 2.7: Celery 4.x series. + +Celery is a project with minimal funding, +so we don't support Microsoft Windows. +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 5.0.5 or 5.1.2 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`: + http://docs.celeryproject.org/en/latest/getting-started/first-steps-with-celery.html + +.. _`Next steps`: + http://docs.celeryproject.org/en/latest/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 + + - **Concurrency** + + - Prefork, Eventlet_, gevent_, single threaded (``solo``) + + - **Result Stores** + + - AMQP, Redis + - memcached + - SQLAlchemy, Django ORM + - Apache Cassandra, IronCache, Elasticsearch + + - **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`_ | + +--------------------+------------------------+ + +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`: http://flask.pocoo.org/ +.. _`web2py`: http://web2py.com/ +.. _`Bottle`: https://bottlepy.org/ +.. _`Pyramid`: http://docs.pylonsproject.org/en/latest/docs/pyramid.html +.. _`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`: http://www.tornadoweb.org/ +.. _`tornado-celery`: https://github.com/mher/tornado-celery/ + +.. _celery-documentation: + +Documentation +============= + +The `latest documentation`_ is hosted at Read The Docs, containing user guides, +tutorials, and an API reference. + +最新的中文文档托管在 https://www.celerycn.io/ 中,包含用户指南、教程、API接口等。 + +.. _`latest documentation`: http://docs.celeryproject.org/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[librabbitmq]" + + $ pip install "celery[librabbitmq,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[librabbitmq]``: + for using the librabbitmq C 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 as a result backend with 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[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-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/master#egg=celery + $ pip install https://github.com/celery/billiard/zipball/master#egg=billiard + $ pip install https://github.com/celery/py-amqp/zipball/master#egg=amqp + $ pip install https://github.com/celery/kombu/zipball/master#egg=kombu + $ pip install https://github.com/celery/vine/zipball/master#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 `Freenode`_ +network. + +.. _`Freenode`: https://freenode.net + +.. _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`: + http://docs.celeryproject.org/en/master/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 + +Sponsors +-------- + +Support this project by becoming a sponsor. Your logo will show up here with a +link to your website. [`Become a sponsor`_] + +.. _`Become a sponsor`: https://opencollective.com/celery#sponsor + +|oc-sponsors| + +.. |oc-sponsors| image:: https://opencollective.com/celery/sponsor/0/avatar.svg + :target: https://opencollective.com/celery/sponsor/0/website + +.. _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=master + :target: https://codecov.io/github/celery/celery?branch=master + +.. |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/ + +.. |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 + + diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery-5.1.2.dist-info/RECORD b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery-5.1.2.dist-info/RECORD new file mode 100644 index 0000000..1fb82f0 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery-5.1.2.dist-info/RECORD @@ -0,0 +1,320 @@ +../../../bin/celery,sha256=Uk5KW6W71R88YmS-ApMutbB0Jyj0U9pcvwbVtF2nDbM,269 +celery-5.1.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +celery-5.1.2.dist-info/LICENSE,sha256=OPfyaTUqhatgAqmGqGPC73aDk2xXbtiejt3gvKB6yMc,2631 +celery-5.1.2.dist-info/METADATA,sha256=aYluGTxMn-I3AKs5ikbynBZBgVjYpS6RrPPytyLrYFY,20069 +celery-5.1.2.dist-info/RECORD,, +celery-5.1.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +celery-5.1.2.dist-info/WHEEL,sha256=OqRkF0eY5GHssMorFjlbTIq072vpHpF60fIQA6lS9xA,92 +celery-5.1.2.dist-info/entry_points.txt,sha256=y-9XhDI_sXAtYn8ayrWDhRcZmiY4tsmIoa5braB_WVA,49 +celery-5.1.2.dist-info/top_level.txt,sha256=sQQ-a5HNsZIi2A8DiKQnB1HODFMfmrzIAZIE8t_XiOA,7 +celery/__init__.py,sha256=u20ixkziiQW-k43vDDRfp7bIpjrdYkuLrj6X6sziGBA,6080 +celery/__main__.py,sha256=-2sIMgK0_-22t6i19645vA-CfBFvHnzIuZ8les4AmdE,401 +celery/__pycache__/__init__.cpython-38.pyc,, +celery/__pycache__/__main__.cpython-38.pyc,, +celery/__pycache__/_state.cpython-38.pyc,, +celery/__pycache__/beat.cpython-38.pyc,, +celery/__pycache__/bootsteps.cpython-38.pyc,, +celery/__pycache__/canvas.cpython-38.pyc,, +celery/__pycache__/exceptions.cpython-38.pyc,, +celery/__pycache__/local.cpython-38.pyc,, +celery/__pycache__/platforms.cpython-38.pyc,, +celery/__pycache__/result.cpython-38.pyc,, +celery/__pycache__/schedules.cpython-38.pyc,, +celery/__pycache__/signals.cpython-38.pyc,, +celery/__pycache__/states.cpython-38.pyc,, +celery/_state.py,sha256=bGNKTgAdtn2VIkePeCzXBfKkMiJz3iqDlYVupM1uA1M,5049 +celery/app/__init__.py,sha256=iadhB_pmHYrlqaOMge-aO2CLQKxlG18yHaNYtiHL-3Y,2459 +celery/app/__pycache__/__init__.cpython-38.pyc,, +celery/app/__pycache__/amqp.cpython-38.pyc,, +celery/app/__pycache__/annotations.cpython-38.pyc,, +celery/app/__pycache__/autoretry.cpython-38.pyc,, +celery/app/__pycache__/backends.cpython-38.pyc,, +celery/app/__pycache__/base.cpython-38.pyc,, +celery/app/__pycache__/builtins.cpython-38.pyc,, +celery/app/__pycache__/control.cpython-38.pyc,, +celery/app/__pycache__/defaults.cpython-38.pyc,, +celery/app/__pycache__/events.cpython-38.pyc,, +celery/app/__pycache__/log.cpython-38.pyc,, +celery/app/__pycache__/registry.cpython-38.pyc,, +celery/app/__pycache__/routes.cpython-38.pyc,, +celery/app/__pycache__/task.cpython-38.pyc,, +celery/app/__pycache__/trace.cpython-38.pyc,, +celery/app/__pycache__/utils.cpython-38.pyc,, +celery/app/amqp.py,sha256=_VFMp7yuYA2ckiGz7J7zmAzgBt4ZQN0Iush81x9nAKw,23000 +celery/app/annotations.py,sha256=93zuKNCE7pcMD3K5tM5HMeVCQ5lfJR_0htFpottgOeU,1445 +celery/app/autoretry.py,sha256=kyBQXI75-96GNbu1uNfU135SgoaEI_0w0G4VjLsfHdE,2288 +celery/app/backends.py,sha256=BrxQl3ZS8Otl0t9cDO2hSJlKoCiLuN5jChb2GOsLOwU,2765 +celery/app/base.py,sha256=jeumbVKjjm0zh6SWZ-1cxYvc0eOi2munec2weJLm50Q,47384 +celery/app/builtins.py,sha256=gnOyE07M8zgxatTmb0D0vKztx1sQZaRi_hO_d-FLNUs,6673 +celery/app/control.py,sha256=ec_-DWF9zHsznHK_e7hHGM87aFAxw2YwrB-AtDgJxUE,27887 +celery/app/defaults.py,sha256=WYHpng7Ee5GoPKiHBX3yurEsl-7rCc20ENCQtWtRm1E,14587 +celery/app/events.py,sha256=9ZyjdhUVvrt6xLdOMOVTPN7gjydLWQGNr4hvFoProuA,1326 +celery/app/log.py,sha256=boRudy2dgGU0DQVO_Oe34TayDAxXtAZeIIq83D-obUM,9169 +celery/app/registry.py,sha256=RdwOWprajMrg4fHMeRbcrH5VgHMNRCks34xhroXZCPA,2002 +celery/app/routes.py,sha256=DMdr5nmEnqJWXkLFIzWWxM2sz9ZYeA--8FeSaxKcBCg,4527 +celery/app/task.py,sha256=TTx7YKp9iR9vbtyz2XUno353eMULUQ53eZKBqraWp3o,40917 +celery/app/trace.py,sha256=CSem7RA4yTHFD4m73hUsR7JT1RCJDi3_cbB54gVhxw0,27152 +celery/app/utils.py,sha256=sGqiAc10BSOWi_fmtgvixo04batVDwuFr2SFPriDkyU,13185 +celery/apps/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +celery/apps/__pycache__/__init__.cpython-38.pyc,, +celery/apps/__pycache__/beat.cpython-38.pyc,, +celery/apps/__pycache__/multi.cpython-38.pyc,, +celery/apps/__pycache__/worker.cpython-38.pyc,, +celery/apps/beat.py,sha256=ydCugmuv1kcjKptBzk77AbL5dz_OqP4WYj4v_xtRJdc,5161 +celery/apps/multi.py,sha256=MTRwjZNfve8ZMxdQlXyS16A3iFYzrt1DbS9jeojPb8U,16398 +celery/apps/worker.py,sha256=lajKhyZAuojirtzf_pjXH2EhGYelSr8wlBEXQZ9SW-o,13474 +celery/backends/__init__.py,sha256=1kN92df1jDp3gC6mrGEZI2eE-kOEUIKdOOHRAdry2a0,23 +celery/backends/__pycache__/__init__.cpython-38.pyc,, +celery/backends/__pycache__/arangodb.cpython-38.pyc,, +celery/backends/__pycache__/asynchronous.cpython-38.pyc,, +celery/backends/__pycache__/azureblockblob.cpython-38.pyc,, +celery/backends/__pycache__/base.cpython-38.pyc,, +celery/backends/__pycache__/cache.cpython-38.pyc,, +celery/backends/__pycache__/cassandra.cpython-38.pyc,, +celery/backends/__pycache__/consul.cpython-38.pyc,, +celery/backends/__pycache__/cosmosdbsql.cpython-38.pyc,, +celery/backends/__pycache__/couchbase.cpython-38.pyc,, +celery/backends/__pycache__/couchdb.cpython-38.pyc,, +celery/backends/__pycache__/dynamodb.cpython-38.pyc,, +celery/backends/__pycache__/elasticsearch.cpython-38.pyc,, +celery/backends/__pycache__/filesystem.cpython-38.pyc,, +celery/backends/__pycache__/mongodb.cpython-38.pyc,, +celery/backends/__pycache__/redis.cpython-38.pyc,, +celery/backends/__pycache__/rpc.cpython-38.pyc,, +celery/backends/__pycache__/s3.cpython-38.pyc,, +celery/backends/arangodb.py,sha256=6hi2LLazXccKb2rxiaDvmDmcYEdmRvXABK5in90mMlo,7651 +celery/backends/asynchronous.py,sha256=gxQ6LWmo2aIFaZh-Ou6YOJSdW27_TBIuuetUhpLS5Zg,9464 +celery/backends/azureblockblob.py,sha256=ziJsS4KwnuWrxsxUvMpVXEvLvyavYjsX82ZLbhzf2zg,4124 +celery/backends/base.py,sha256=sUMESW1LLVJGywhlmzr1Lgiq-hTl_IUi5y52JuoO7cE,40351 +celery/backends/cache.py,sha256=1ZL5MMsmJdEOfQnDhpeGpy5L2M8DHVqZIjshpamkpto,4833 +celery/backends/cassandra.py,sha256=AhODTfBNKDsfuKRYVjy8_8iHBM1cahJggrb23GJmIr4,7899 +celery/backends/consul.py,sha256=SJ4vTIHiXyEUqQKG-gu4qFLUN5xeNGG_pomW8JlZd5c,3113 +celery/backends/cosmosdbsql.py,sha256=iyTV3M0xVllzNrMMHTWHHJoEbU0W0wHtjzuBzlf-1Wc,6847 +celery/backends/couchbase.py,sha256=xRw4mbgjfyNtfd1X1mox3cPbcR4-emeJ6Re56F-X0Gk,3173 +celery/backends/couchdb.py,sha256=25gqM84J7PHqDrxbanXEqI0DmM1y1-imcXiFlRTjKEY,2951 +celery/backends/database/__init__.py,sha256=ukNFAyO1PK8F9bm9S9VzDydCJVgAB3N-pSLufYyuQig,7771 +celery/backends/database/__pycache__/__init__.cpython-38.pyc,, +celery/backends/database/__pycache__/models.cpython-38.pyc,, +celery/backends/database/__pycache__/session.cpython-38.pyc,, +celery/backends/database/models.py,sha256=_6WZMv53x8I1iBRCa4hY35LaBUeLIZJzDusjvS-8aAg,3351 +celery/backends/database/session.py,sha256=3zu7XwYoE52aS6dsSmJanqlvS6ssjet7hSNUbliwnLo,3011 +celery/backends/dynamodb.py,sha256=cNfi97bZxyfFR3pwQpueJQBbZmSWq3I9NpLgGyGPLq8,17262 +celery/backends/elasticsearch.py,sha256=99Hf8o8lCWgFHBvN-cu5ARR2cSBWrywBKzOBc1K_djs,8469 +celery/backends/filesystem.py,sha256=WeRkNaOcR63n6Gz89gokK-FYQeJA7MIETrUJatpciw8,3054 +celery/backends/mongodb.py,sha256=pQbJVYZyUmu0P9yT7LQWlmUTQP5lFirbGBuRC3HqGE4,11163 +celery/backends/redis.py,sha256=VtCD5x6byuO3A3q4wuqrvOuv6LBjjjReRAP9c3D2OdA,25860 +celery/backends/rpc.py,sha256=Pfzjpz7znOfmHRERuQfOlTW-entAsl803oc1-EWpnTY,12077 +celery/backends/s3.py,sha256=MUL4-bEHCcTL53XXyb020zyLYTr44DDjOh6BXtkp9lQ,2752 +celery/beat.py,sha256=L-8Y3nM3cxwMviQuWUsYuSOYROTViyORYyPzMdrsc4U,24431 +celery/bin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +celery/bin/__pycache__/__init__.cpython-38.pyc,, +celery/bin/__pycache__/amqp.cpython-38.pyc,, +celery/bin/__pycache__/base.cpython-38.pyc,, +celery/bin/__pycache__/beat.cpython-38.pyc,, +celery/bin/__pycache__/call.cpython-38.pyc,, +celery/bin/__pycache__/celery.cpython-38.pyc,, +celery/bin/__pycache__/control.cpython-38.pyc,, +celery/bin/__pycache__/events.cpython-38.pyc,, +celery/bin/__pycache__/graph.cpython-38.pyc,, +celery/bin/__pycache__/list.cpython-38.pyc,, +celery/bin/__pycache__/logtool.cpython-38.pyc,, +celery/bin/__pycache__/migrate.cpython-38.pyc,, +celery/bin/__pycache__/multi.cpython-38.pyc,, +celery/bin/__pycache__/purge.cpython-38.pyc,, +celery/bin/__pycache__/result.cpython-38.pyc,, +celery/bin/__pycache__/shell.cpython-38.pyc,, +celery/bin/__pycache__/upgrade.cpython-38.pyc,, +celery/bin/__pycache__/worker.cpython-38.pyc,, +celery/bin/amqp.py,sha256=GRyqsBHtR4ubEdjjPYD8cpGg4uPkHJ889wtzSklRxMg,10030 +celery/bin/base.py,sha256=pYAfOP0CnqA15gla3Yp7xTxpAS9tlaXTVtaV8yGurFA,7780 +celery/bin/beat.py,sha256=Iyn8Qz8vVCePCw5jhLC3X-YxxzOlwG2mYKt6VqyuDWE,2583 +celery/bin/call.py,sha256=56zufLTp-DCyaVUS7VFqLMn38J_auhh545V3F1tQugc,2338 +celery/bin/celery.py,sha256=VmBZI7BMc08osuE04AEKMdx0ZM7UMnIDuJecpW7IPN0,6684 +celery/bin/control.py,sha256=brKBg7o2kDBmC7g7w96ngFvlCwtIxVF3wrQPhl1bJ1s,7073 +celery/bin/events.py,sha256=KGq_RdSpLjYd1wkyeliQPWZPXwxMosq1_Fk9cbtsG2M,2825 +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=3BcuNiigoqsE8PNtMYuZ3162LYeV9b3ILP2VggAyR0o,2139 +celery/bin/multi.py,sha256=AKKMnm__5b2jIiOtZBeEsHUDrXLBE5RTlJeTMQk6Ir8,15364 +celery/bin/purge.py,sha256=WudoOOROcIh3yFVb2vHyZ9pRkrpKoebE_gFJz4rXQxw,2578 +celery/bin/result.py,sha256=TK2k84Mqh1nQ3XIOT_EN3Y4Y3h5ZcJIH8MEU-YIgJIE,1007 +celery/bin/shell.py,sha256=HxSoyFIpwEY9vp6bt6_5XDN4R2hfm0bVO7Ska2Y7R60,4809 +celery/bin/upgrade.py,sha256=S9QjG6Dq87G0JE3hro3Ri_1AexQddql_4X6Fcsj_340,3095 +celery/bin/worker.py,sha256=vm_P-EKFBUpoxV3am0MJoPanzddXGfujJGZj4y7X79I,12620 +celery/bootsteps.py,sha256=ddrxGDRCc2ra2ug0X5NBEI3fqPjkSlNRiYSXg2vGCq0,12297 +celery/canvas.py,sha256=-Rq-uKUA4Tlz4V9q-mBQ-k6PzbKKe4-2NXvnCRYG23w,61615 +celery/concurrency/__init__.py,sha256=VbmcXYILbO6wUYaIS3zocU_XhUArX8Pt36yXuqFJJKY,995 +celery/concurrency/__pycache__/__init__.cpython-38.pyc,, +celery/concurrency/__pycache__/asynpool.cpython-38.pyc,, +celery/concurrency/__pycache__/base.cpython-38.pyc,, +celery/concurrency/__pycache__/eventlet.cpython-38.pyc,, +celery/concurrency/__pycache__/gevent.cpython-38.pyc,, +celery/concurrency/__pycache__/prefork.cpython-38.pyc,, +celery/concurrency/__pycache__/solo.cpython-38.pyc,, +celery/concurrency/__pycache__/thread.cpython-38.pyc,, +celery/concurrency/asynpool.py,sha256=TQRgSA3umdLEAEPBXCrtdChhHmByn2Jpn0JUVXm2J9s,50516 +celery/concurrency/base.py,sha256=MXjG1Aft74cXG5c7VL1afmDA68ZBz0HqunhRSD55JVE,4373 +celery/concurrency/eventlet.py,sha256=lXSf5bT3F2aOMWKfupt7jBCIPJGEjbEpX-ucKETe22Y,4156 +celery/concurrency/gevent.py,sha256=M5emMhoGweaAjOCw-caO96rPrV_yLSLyBTNi6bAV08c,3415 +celery/concurrency/prefork.py,sha256=p74jbWLZc1gjM1JAL3Y5piipg9lfK8tmHIT20QdXwQ0,5680 +celery/concurrency/solo.py,sha256=WcOi0h4sJlE7WbR7DbHwZiHRE1-jlwMPW_4ENckQFKk,693 +celery/concurrency/thread.py,sha256=n-7ayKpyM80nRIQcxUVJo1yZLezI4n5IjWkfkXqTA6g,1248 +celery/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +celery/contrib/__pycache__/__init__.cpython-38.pyc,, +celery/contrib/__pycache__/abortable.cpython-38.pyc,, +celery/contrib/__pycache__/migrate.cpython-38.pyc,, +celery/contrib/__pycache__/pytest.cpython-38.pyc,, +celery/contrib/__pycache__/rdb.cpython-38.pyc,, +celery/contrib/__pycache__/sphinx.cpython-38.pyc,, +celery/contrib/abortable.py,sha256=ugEGSW0AO10Cee5sFrZMLL2H2r1b_ubbCXcbJNMjyw0,5091 +celery/contrib/migrate.py,sha256=-kCp6B4C6-HdK9YGDxjSDyROF_0VLIV5PzVJXmhJKrw,14163 +celery/contrib/pytest.py,sha256=nPnnS2e4VkbFdlNcWvwfUNHJ8t6HvsWCnuygtH5hf0A,6507 +celery/contrib/rdb.py,sha256=rjMinsMu3oL28OpV__pomtAUe0_Oy0HrVsbcvmJ2i2E,5021 +celery/contrib/sphinx.py,sha256=2qLMuKpKm5Kwtvjfx_brDDjonIMaZptypMMuhDWShRc,3410 +celery/contrib/testing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +celery/contrib/testing/__pycache__/__init__.cpython-38.pyc,, +celery/contrib/testing/__pycache__/app.cpython-38.pyc,, +celery/contrib/testing/__pycache__/manager.cpython-38.pyc,, +celery/contrib/testing/__pycache__/mocks.cpython-38.pyc,, +celery/contrib/testing/__pycache__/tasks.cpython-38.pyc,, +celery/contrib/testing/__pycache__/worker.cpython-38.pyc,, +celery/contrib/testing/app.py,sha256=nOcIjxGleSGp1HG9g3NqkeqOpvB_J370BqRldY1g97o,3017 +celery/contrib/testing/manager.py,sha256=Ck91OdYTt9SV-V1yrozr0ztlqErwvDvl-2i0Yf9a6OA,7646 +celery/contrib/testing/mocks.py,sha256=tqWzr_NscWpCZhogLr3K1h8Fi4WBkBKeX_R8sf-8dlQ,3394 +celery/contrib/testing/tasks.py,sha256=pJM3aabw7udcppz4QNeUg1-6nlnbklrT-hP5JXmL-gM,208 +celery/contrib/testing/worker.py,sha256=POrlDmFAN7Dn45Zcw-WbG-hbvIVZG79cDMeITpptn_0,5491 +celery/events/__init__.py,sha256=9d2cviCw5zIsZ3AvQJkx77HPTlxmVIahRR7Qa54nQnU,477 +celery/events/__pycache__/__init__.cpython-38.pyc,, +celery/events/__pycache__/cursesmon.cpython-38.pyc,, +celery/events/__pycache__/dispatcher.cpython-38.pyc,, +celery/events/__pycache__/dumper.cpython-38.pyc,, +celery/events/__pycache__/event.cpython-38.pyc,, +celery/events/__pycache__/receiver.cpython-38.pyc,, +celery/events/__pycache__/snapshot.cpython-38.pyc,, +celery/events/__pycache__/state.cpython-38.pyc,, +celery/events/cursesmon.py,sha256=pDPV1roUP08zo_Io6-8oP0Qr1KSs1eO1Pp6sB3A43fA,18050 +celery/events/dispatcher.py,sha256=7b3-3d_6ukvRNajyfiHMX1YvoWNIzaB6zS3-zEUQhG4,8987 +celery/events/dumper.py,sha256=7zOVmAVfG2HXW79Fuvpo_0C2cjztTzgIXnaiUc4NL8c,3116 +celery/events/event.py,sha256=nt1yRUzDrYp9YLbsIJD3eo_AoMhT5sQtZAX-vEkq4Q8,1736 +celery/events/receiver.py,sha256=7dVvezYkBQOtyI-rH77-5QDJztPLB933VF7NgmezSuU,4998 +celery/events/snapshot.py,sha256=OLQuxx1af29LKnYKDoTesnPfK_5dFx3zCZ7JSdg9t7A,3294 +celery/events/state.py,sha256=D2tWItcs3i47Rj8W_eTGPhDbuJgWykuBIqHocvIKKoQ,25773 +celery/exceptions.py,sha256=9s8HEpXEF0h1QmyOEFedfVb7g2TxaLtrJPmDh8EgVFc,9052 +celery/fixups/__init__.py,sha256=7ctNaKHiOa2fVePcdKPU9J-_bQ0k1jFHaoZlCHXY0vU,14 +celery/fixups/__pycache__/__init__.cpython-38.pyc,, +celery/fixups/__pycache__/django.cpython-38.pyc,, +celery/fixups/django.py,sha256=8YLxkFOPIFV_4RYNtEbk3Bc-MJkJo42mqHnv3UdH4EU,6596 +celery/loaders/__init__.py,sha256=LnRTWk8pz2r7BUj2VUJiBstPjSBwCP0gUDRkbchGW24,490 +celery/loaders/__pycache__/__init__.cpython-38.pyc,, +celery/loaders/__pycache__/app.cpython-38.pyc,, +celery/loaders/__pycache__/base.cpython-38.pyc,, +celery/loaders/__pycache__/default.cpython-38.pyc,, +celery/loaders/app.py,sha256=xqRpRDJkGmTW21N_7zx5F4Na-GCTbNs6Q6tGfInnZnU,199 +celery/loaders/base.py,sha256=vImYhKI3NfS97gQ9pIMmVZAa2sPeqm7EA8nNAfLZhcY,8731 +celery/loaders/default.py,sha256=TZq6zR4tg_20sVJAuSwSBLVRHRyfevHkHhUYrNRYkTU,1520 +celery/local.py,sha256=OW4OUr9A-dbH-syk1ZbfzXBz-taMc4msms-rTV5ObXU,17016 +celery/platforms.py,sha256=QHuMElhtEKK0_mSgVOyRVgWYVzVYjdiDjTABlvqqPCk,25458 +celery/result.py,sha256=iz50QTqMt8MNjz5_-aGvPAlzZTjakltAV7Ht5yJL36E,34176 +celery/schedules.py,sha256=JoarLbaT-n7NbmFNiQH-hMsfAdslctTCbiivwU_fL_o,29259 +celery/security/__init__.py,sha256=SCOoCLegztDzK7rQsLeuF0QBtyyZagChR1S7QDqDIDU,2278 +celery/security/__pycache__/__init__.cpython-38.pyc,, +celery/security/__pycache__/certificate.cpython-38.pyc,, +celery/security/__pycache__/key.cpython-38.pyc,, +celery/security/__pycache__/serialization.cpython-38.pyc,, +celery/security/__pycache__/utils.cpython-38.pyc,, +celery/security/certificate.py,sha256=Cv45TdLkgAtEE_y68ux-cA4G8IpShksmzIKQpobVjjA,2997 +celery/security/key.py,sha256=AP-8kBfqaT8a6IpZsf2qALTCVB36RsoqN7e555VF6mw,1042 +celery/security/serialization.py,sha256=bOPi_ugy9EhmneLjjALvt-ZrwFCtPqQwH7f4zcqdq3I,4206 +celery/security/utils.py,sha256=VJuWxLZFKXQXzlBczuxo94wXWSULnXwbO_5ul_hwse0,845 +celery/signals.py,sha256=CgnwpZUNMZZqKIKOrCjsDnmxCSHSNgRXIjZFZ0uqlt4,4273 +celery/states.py,sha256=iIBdd02UPwDKTIYm9MGlIgHGBmrr9AzGgvbeBkPgSyU,3260 +celery/utils/__init__.py,sha256=lIJjBxvXCspC-ib-XasdEPlB0xAQc16P0eOPb0gWsL0,935 +celery/utils/__pycache__/__init__.cpython-38.pyc,, +celery/utils/__pycache__/abstract.cpython-38.pyc,, +celery/utils/__pycache__/collections.cpython-38.pyc,, +celery/utils/__pycache__/debug.cpython-38.pyc,, +celery/utils/__pycache__/deprecated.cpython-38.pyc,, +celery/utils/__pycache__/functional.cpython-38.pyc,, +celery/utils/__pycache__/graph.cpython-38.pyc,, +celery/utils/__pycache__/imports.cpython-38.pyc,, +celery/utils/__pycache__/iso8601.cpython-38.pyc,, +celery/utils/__pycache__/log.cpython-38.pyc,, +celery/utils/__pycache__/nodenames.cpython-38.pyc,, +celery/utils/__pycache__/objects.cpython-38.pyc,, +celery/utils/__pycache__/saferepr.cpython-38.pyc,, +celery/utils/__pycache__/serialization.cpython-38.pyc,, +celery/utils/__pycache__/sysinfo.cpython-38.pyc,, +celery/utils/__pycache__/term.cpython-38.pyc,, +celery/utils/__pycache__/text.cpython-38.pyc,, +celery/utils/__pycache__/threads.cpython-38.pyc,, +celery/utils/__pycache__/time.cpython-38.pyc,, +celery/utils/__pycache__/timer2.cpython-38.pyc,, +celery/utils/abstract.py,sha256=xN2Qr-TEp12P8AYO6WigxFr5p8kJPUUb0f5UX3FtHjI,2874 +celery/utils/collections.py,sha256=ev8AkR6oiLJ_jSs1VLCitnRVkJmJh5BRPOOGZowyr_w,25648 +celery/utils/debug.py,sha256=IGV3yJYfGMZvd2SEyWu4QWkCHpvySouRdH9Fx2i1OhQ,4717 +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-38.pyc,, +celery/utils/dispatch/__pycache__/signal.cpython-38.pyc,, +celery/utils/dispatch/signal.py,sha256=doeFQ3GQXsVkTvJbq9FOtvxeKPAAKvhem4WlapBPBWs,13587 +celery/utils/functional.py,sha256=MEr5_Em5LRThWg8QB79RUZAtHdeK8WsEfnDCtLbKlZA,11761 +celery/utils/graph.py,sha256=oP25YXsQfND-VwF-MGolOGX0GbReIzVc9SJfIP1rUIc,9041 +celery/utils/imports.py,sha256=q1kpv59JU5WOgbPH7YNEKGn0YDzKrM-tpzdq6t6knvg,4826 +celery/utils/iso8601.py,sha256=GaYiljjWBC42I1MXK2wljO2rupplPIibIcnSGWb7Pzs,2776 +celery/utils/log.py,sha256=GgMg3X2BGmdigLgIaNlI-rrxnTrBrzxDmuejWuZVxTo,8786 +celery/utils/nodenames.py,sha256=URBwdtWR_CF8Ldf6tjxE4y7rl0KxFFD36HjjZcrwQ5Y,2858 +celery/utils/objects.py,sha256=NZ_Nx0ehrJut91sruAI2kVGyjhaDQR_ntTmF9Om_SI8,4215 +celery/utils/saferepr.py,sha256=0STn4Ycsb--KBk13It8dPxYP9PpNfKTTDNdKFrakqx4,9076 +celery/utils/serialization.py,sha256=BzUNRW6rBO5bMwzEkBlJCZyFMm_KzsTJ-NkNR64i6-0,8069 +celery/utils/static/__init__.py,sha256=KwDq8hA-Xd721HldwJJ34ExwrIEyngEoSIzeAnqc5CA,299 +celery/utils/static/__pycache__/__init__.cpython-38.pyc,, +celery/utils/static/celery_128.png,sha256=8NmZxCALQPp3KVOsOPfJVaNLvwwLYqiS5ViOc6x0SGU,2556 +celery/utils/sysinfo.py,sha256=ILWTSSh2X2NT8enI3hkkZsFttJyPa8_FszwYIbG8IvI,1093 +celery/utils/term.py,sha256=iHs42Ou4NEv57gxLWXqDNeT21YouhjK02vJ0bbltD5k,4568 +celery/utils/text.py,sha256=CEZjIYUNC4LYnJuyATByOEofmAkIJk5lHOJ--bCNn5o,5767 +celery/utils/threads.py,sha256=IkcWdcW7IwBK319Et0JkU_PfAEKMbdousKhrhCtIClE,9632 +celery/utils/time.py,sha256=Loeewk5YgtQpEnV4E2auVgzm3LGWVL_sccOr2XNJoRk,12375 +celery/utils/timer2.py,sha256=rKlJqyovS-ry-g--yH-LadTEvLNwpQD-A76Kfem_A3o,4826 +celery/worker/__init__.py,sha256=EKUgWOMq_1DfWb-OaAWv4rNLd7gi91aidefMjHMoxzI,95 +celery/worker/__pycache__/__init__.cpython-38.pyc,, +celery/worker/__pycache__/autoscale.cpython-38.pyc,, +celery/worker/__pycache__/components.cpython-38.pyc,, +celery/worker/__pycache__/control.cpython-38.pyc,, +celery/worker/__pycache__/heartbeat.cpython-38.pyc,, +celery/worker/__pycache__/loops.cpython-38.pyc,, +celery/worker/__pycache__/pidbox.cpython-38.pyc,, +celery/worker/__pycache__/request.cpython-38.pyc,, +celery/worker/__pycache__/state.cpython-38.pyc,, +celery/worker/__pycache__/strategy.cpython-38.pyc,, +celery/worker/__pycache__/worker.cpython-38.pyc,, +celery/worker/autoscale.py,sha256=kzb1GTwRyw9DZFjwIvHrcLdJxuIGI8HaHdtvtr31i9A,4593 +celery/worker/components.py,sha256=Zlu5I0maDCaF1qSNtwS8jJe2okISsQc5KFvfuzBiZvs,7517 +celery/worker/consumer/__init__.py,sha256=yKaGZtBzYKADZMzbSq14_AUYpT4QAY9nRRCf73DDhqc,391 +celery/worker/consumer/__pycache__/__init__.cpython-38.pyc,, +celery/worker/consumer/__pycache__/agent.cpython-38.pyc,, +celery/worker/consumer/__pycache__/connection.cpython-38.pyc,, +celery/worker/consumer/__pycache__/consumer.cpython-38.pyc,, +celery/worker/consumer/__pycache__/control.cpython-38.pyc,, +celery/worker/consumer/__pycache__/events.cpython-38.pyc,, +celery/worker/consumer/__pycache__/gossip.cpython-38.pyc,, +celery/worker/consumer/__pycache__/heart.cpython-38.pyc,, +celery/worker/consumer/__pycache__/mingle.cpython-38.pyc,, +celery/worker/consumer/__pycache__/tasks.cpython-38.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=LkhU-c61uiUVvFEBRsAbY_QOQv8LSy1QdngPvtrS9KE,22769 +celery/worker/consumer/control.py,sha256=0NiJ9P-AHdv134mXkgRgU9hfhdJ_P7HKb7z9A4Xqa2Q,946 +celery/worker/consumer/events.py,sha256=FgDwbV0Jbj9aWPbV3KAUtsXZq4JvZEfrWfnrYgvkMgo,2054 +celery/worker/consumer/gossip.py,sha256=g-WJL2rr_q9aM_SaTUrQlPj2ONf8vHs2LvmyRQtDMEU,6833 +celery/worker/consumer/heart.py,sha256=IenkkliKk6sAk2a1NfYyh-doNDlmFWGRiaJd5e8ALpI,930 +celery/worker/consumer/mingle.py,sha256=UG8K6sXF1KUJXNiJ4eMHUMIg4_7K1tDWqYRNfd9Nz9k,2519 +celery/worker/consumer/tasks.py,sha256=lYjn-Mt2ZulQyO1lwSoMRzCKeWd8f955H_VfGG0-cyg,1959 +celery/worker/control.py,sha256=2M9ed8Ss_ueQdpFa1HBWnPm-Z9yab0nQcBa85e4APzs,16771 +celery/worker/heartbeat.py,sha256=sTV_d0RB9M6zsXIvLZ7VU6teUfX3IK1ITynDpxMS298,2107 +celery/worker/loops.py,sha256=zLKqw_AXKIT77pBbtUa7u6n8iWhVf3cy7WLIi7M10DI,3857 +celery/worker/pidbox.py,sha256=LcQsKDkd8Z93nQxk0SOLulB8GLEfIjPkN-J0pGk7dfM,3630 +celery/worker/request.py,sha256=i98IMon43-XwwFkNKtifbrzJxH7F2RppAaiurR5jwYA,24653 +celery/worker/state.py,sha256=oQBgncMN68m1IYncf8AuHaIKvJK0qajSTmo3X3LV1v0,8193 +celery/worker/strategy.py,sha256=p_OoMJuekubARVtfNK3kAH_WZXYuSgKZeUwvUyxpr_g,7165 +celery/worker/worker.py,sha256=_OANCvxBkT0S9bQ6Woxbuq2tcAnk0RIG38YhmkR8RtM,14521 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery-5.1.2.dist-info/REQUESTED b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery-5.1.2.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery-5.1.2.dist-info/WHEEL b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery-5.1.2.dist-info/WHEEL new file mode 100644 index 0000000..385faab --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery-5.1.2.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.36.2) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery-5.1.2.dist-info/entry_points.txt b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery-5.1.2.dist-info/entry_points.txt new file mode 100644 index 0000000..fb04d7b --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery-5.1.2.dist-info/entry_points.txt @@ -0,0 +1,3 @@ +[console_scripts] +celery = celery.__main__:main + diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery-5.1.2.dist-info/top_level.txt b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery-5.1.2.dist-info/top_level.txt new file mode 100644 index 0000000..74f9e8f --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery-5.1.2.dist-info/top_level.txt @@ -0,0 +1 @@ +celery diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/__init__.py new file mode 100644 index 0000000..ae287ea --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/__init__.py @@ -0,0 +1,174 @@ +"""Distributed Task Queue.""" +# :copyright: (c) 2016-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 # noqa + +SERIES = 'sun-harmonics' + +__version__ = '5.1.2' +__author__ = 'Ask Solem' +__contact__ = 'auvipy@gmail.com' +__homepage__ = 'http://celeryproject.org' +__docformat__ = 'restructuredtext' +__keywords__ = 'task job queue distributed messaging actor' + +# -eof meta- + +__all__ = ( + 'Celery', 'bugreport', 'shared_task', '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 # noqa + from celery.app import shared_task # noqa + from celery.app.base import Celery # noqa + from celery.app.task import Task # noqa + from celery.app.utils import bugreport # noqa + from celery.canvas import (chain, chord, chunks, group, # noqa + maybe_signature, signature, subtask, xmap, + xstarmap) + from celery.utils import uuid # noqa + +# 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'], + }, + direct={'task': 'celery.task'}, + __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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/__main__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/__main__.py new file mode 100644 index 0000000..e865ea4 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/__main__.py @@ -0,0 +1,19 @@ +"""Entry-point for the :program:`celery` umbrella command.""" + +import sys + +from . import maybe_patch_concurrency + +__all__ = ('main',) + + +def main(): + """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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/_state.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/_state.py new file mode 100644 index 0000000..0e67115 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/_state.py @@ -0,0 +1,197 @@ +"""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(): # noqa + import traceback + print('-- USES CURRENT_APP', file=sys.stderr) # noqa+ + 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 --') # noqa+ + print_stack() + return _tls.current_app + if not current_process or current_process()._name == 'MainProcess': + raise Exception('DEFAULT APP') + print('-- RETURNING TO DEFAULT APP --') # noqa+ + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/app/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/app/__init__.py new file mode 100644 index 0000000..2bb1c13 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/app/__init__.py @@ -0,0 +1,77 @@ +"""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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/app/amqp.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/app/amqp.py new file mode 100644 index 0000000..a574b2d --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/app/amqp.py @@ -0,0 +1,607 @@ +"""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): + dict.__init__(self) + 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 dict.__getitem__(self, name) + + def __setitem__(self, name, queue): + if self.default_exchange and not queue.exchange: + queue.exchange = self.default_exchange + dict.__setitem__(self, 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: + queues = (Queue(conf.task_default_queue, + exchange=self.default_exchange, + routing_key=default_routing_key),) + 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): + 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 + + return task_message( + 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, + }, + 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.result_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, **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, + **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 # noqa + 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 diuspatcher 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/app/annotations.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/app/annotations.py new file mode 100644 index 0000000..1c0631f --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/app/annotations.py @@ -0,0 +1,52 @@ +"""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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/app/autoretry.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/app/autoretry.py new file mode 100644 index 0000000..a22b9f0 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/app/autoretry.py @@ -0,0 +1,60 @@ +"""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', ())) + ) + retry_kwargs = options.get( + 'retry_kwargs', getattr(task, 'retry_kwargs', {}) + ) + retry_backoff = int( + 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 occures task shouldn't be retried, + # even if it suits autoretry_for list + raise + except Retry: + raise + except autoretry_for as exc: + if retry_backoff: + retry_kwargs['countdown'] = \ + get_exponential_backoff_interval( + factor=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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/app/backends.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/app/backends.py new file mode 100644 index 0000000..8f0390b --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/app/backends.py @@ -0,0 +1,70 @@ +"""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 = { + 'amqp': 'celery.backends.amqp:AMQPBackend', + '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', +} + + +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) or {}) + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/app/base.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/app/base.py new file mode 100644 index 0000000..4757076 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/app/base.py @@ -0,0 +1,1304 @@ +"""Actual App instance implementation.""" +import inspect +import os +import sys +import threading +import warnings +from collections import UserDict, defaultdict, deque +from datetime import datetime +from operator import attrgetter + +from click.exceptions import Exit +from kombu import pools +from kombu.clocks import LamportClock +from kombu.common import oid_from +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 timezone, to_utc + +# Load all builtin tasks +from . import builtins # noqa +from . import backends +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) + +__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) + + +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.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.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.Lock() + 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: + 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 _task_from_fun(self, fun, name=None, base=None, bind=False, **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: + 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__': staticmethod(head_from_fun(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): + """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) + 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, 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. + 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, 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, **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) + + 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')) + + 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, + argsrepr=options.get('argsrepr'), + kwargsrepr=options.get('kwargsrepr'), + ) + + 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.utcnow()) + 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. + """ + conf = self._conf = self._load_config() + 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: + self._add_periodic_task(*pending_beat.popleft()) + + 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): + key, entry = self._sig_to_periodic_task_entry( + schedule, sig, args, kwargs, name, **opts) + if self.configured: + self._add_periodic_task(key, entry) + else: + self._pending_periodic_tasks.append((key, entry)) + 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): + 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): + """Current backend instance.""" + try: + return self._local.backend + except AttributeError: + self._local.backend = new_backend = self._get_backend() + return new_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): # noqa + 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 # noqa: E305 XXX compat diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/app/builtins.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/app/builtins.py new file mode 100644 index 0000000..1a79c40 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/app/builtins.py @@ -0,0 +1,187 @@ +"""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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/app/control.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/app/control.py new file mode 100644 index 0000000..05b7012 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/app/control.py @@ -0,0 +1,744 @@ +"""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. + + Returns: + Dict: Dictionary ``{HOSTNAME: [TASK_INFO,...]}``. + + See Also: + For ``TASK_INFO`` details see :func:`query_task` return value. + + Note: + ``safe`` is ignored since 4.0 as no objects will need + serialization now that we have argsrepr/kwargsrepr. + """ + return self._request('active') + + 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 processin 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 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.task.base.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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/app/defaults.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/app/defaults.py new file mode 100644 index 0000000..1883f25 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/app/defaults.py @@ -0,0 +1,406 @@ +"""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'), + ), + 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_max_retries=Option(100, type='int'), + failover_strategy=Option(None, type='string'), + heartbeat=Option(120, type='int'), + heartbeat_checkrate=Option(3.0, type='int'), + login_method=Option(None, 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'), + 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'), + ), + 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'), + 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'}), + ), + 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_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'), + ), + 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' + ), + concurrency=Option(0, 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'), + 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'), + ), +) + + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/app/events.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/app/events.py new file mode 100644 index 0000000..f2ebea0 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/app/events.py @@ -0,0 +1,40 @@ +"""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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/app/log.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/app/log.py new file mode 100644 index 0000000..7e03674 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/app/log.py @@ -0,0 +1,250 @@ +"""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 ColorFormatter.format(self, 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: + if 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 # noqa + def already_setup(self, was_setup): + self._setup = was_setup diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/app/registry.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/app/registry.py new file mode 100644 index 0000000..574457a --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/app/registry.py @@ -0,0 +1,68 @@ +"""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.task.base.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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/app/routes.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/app/routes.py new file mode 100644 index 0000000..a56ce59 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/app/routes.py @@ -0,0 +1,136 @@ +"""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', '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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/app/task.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/app/task.py new file mode 100644 index 0000000..1e50e61 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/app/task.py @@ -0,0 +1,1084 @@ +"""Task implementation: request context and the task base class.""" +import sys + +from billiard.einfo import ExceptionInfo +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 + retries = 0 + reply_to = None + root_id = None + shadow = None + taskset = None # compat alias to group + timelimit = None + utc = None + + def __init__(self, *args, **kwargs): + self.update(*args, **kwargs) + + 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) + return { + '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, + 'origin': self.origin, + } + + @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 *just 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): Re-use 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. + + 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)``. + 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.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() + 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. + ... 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, + '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'), + }, + } + 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, 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) + + 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. + + 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 + sig.set( + chord=chord, + group_id=self.request.group, + group_index=self.request.group_index, + root_id=self.request.root_id, + ) + # 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 []): + sig |= signature(t, app=self.app) + # 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_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 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 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, **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): + backend = self._backend + if backend is None: + return self.app.backend + return backend + + @backend.setter + def backend(self, value): # noqa + self._backend = value + + @property + def __name__(self): + return self.__class__.__name__ + + +BaseTask = Task # noqa: E305 XXX compat alias diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/app/trace.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/app/trace.py new file mode 100644 index 0000000..9a56f87 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/app/trace.py @@ -0,0 +1,734 @@ +"""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 +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.""" + _, _, tb = sys.exc_info() + try: + exc = self.retval + # make sure we only send pickleable exceptions back to parent. + einfo = ExceptionInfo() + einfo.exception = get_pickleable_exception(einfo.exception) + einfo.type = get_pickleable_etype(einfo.type) + + 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=tb, + einfo=einfo) + self._log_error(task, req, einfo) + return einfo + finally: + del tb + + def _log_error(self, task, req, einfo): + eobj = einfo.exception = get_pickled_exception(einfo.exception) + exception, traceback, exc_info, sargs, skwargs = ( + safe_repr(eobj), + safe_str(einfo.traceback), + einfo.exc_info, + safe_repr(req.args), + 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. + + """ + # noqa: C901 + # 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 + backend = task.backend + 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_on_success = None + task_after_return = None + 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 + + store_result = backend.store_result + mark_as_done = backend.mark_as_done + backend_cleanup = backend.process_cleanup + + 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, uuid, 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: + store_result( + uuid, {'pid': pid, 'hostname': hostname}, STARTED, + request=task_request, + ) + + # -*- TRACE -*- + try: + 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, uuid, RETRY, call_errbacks=False) + traceback_clear(exc) + except Exception as exc: + I, R, state, retval = on_error(task_request, exc, uuid) + 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 + ) + mark_as_done( + uuid, retval, task_request, publish_result, + ) + except EncodeError as exc: + I, R, state, retval = on_error(task_request, exc, uuid) + 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, + }) + + # -* 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: + backend_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, uuid) + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/app/utils.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/app/utils.py new file mode 100644 index 0000000..8b72652 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/app/utils.py @@ -0,0 +1,416 @@ +"""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', + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/apps/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/apps/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/apps/beat.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/apps/beat.py new file mode 100644 index 0000000..4143771 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/apps/beat.py @@ -0,0 +1,152 @@ +"""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. +""" +import numbers +import socket +import sys +from datetime import datetime + +from celery import VERSION_BANNER, 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 = None + + def __init__(self, max_interval=None, app=None, + socket_timeout=30, pidfile=None, no_color=None, + loglevel='WARN', logfile=None, schedule=None, + scheduler=None, + scheduler_cls=None, # XXX use scheduler + redirect_stdouts=None, + redirect_stdouts_level=None, **kwargs): + 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.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): + 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=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): + 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, + ) + + 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): + c = self.colored + return str( # flake8: noqa + c.blue('__ ', c.magenta('-'), + c.blue(' ... __ '), c.magenta('-'), + c.blue(' _\n'), + c.reset(self.startup_info(service))), + ) + + def init_loader(self): + # Run the worker init handler. + # (Usually imports task modules and such.) + self.app.loader.init_worker() + self.app.finalize() + + def startup_info(self, service): + 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): + 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): + """Install a `SIGTERM` + `SIGINT` handler saving the schedule.""" + def _sync(signum, frame): + service.sync() + raise SystemExit() + platforms.signals.update(SIGTERM=_sync, SIGINT=_sync) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/apps/multi.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/apps/multi.py new file mode 100644 index 0000000..6137434 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/apps/multi.py @@ -0,0 +1,507 @@ +"""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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/apps/worker.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/apps/worker.py new file mode 100644 index 0000000..c220857 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/apps/worker.py @@ -0,0 +1,391 @@ +"""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.exceptions import WorkerShutdown, WorkerTerminate +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): + print(f'\n{msg}', file=sys.__stderr__, flush=True) + + +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 + WorkController.on_start(self) + + # 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, sig='TERM', how='Warm', + exc=WorkerShutdown, callback=None, exitcode=EX_OK): + def _handle_request(*args): + with in_sighandler(): + from celery.worker import state + if current_process()._name == 'MainProcess': + if callback: + callback(worker) + safe_say(f'worker: {how} shutdown (MainProcess)') + signals.worker_shutting_down.send( + sender=worker.hostname, sig=sig, how=how, + exitcode=exitcode, + ) + if active_thread_count() > 1: + setattr(state, {'Warm': 'should_stop', + 'Cold': 'should_terminate'}[how], exitcode) + else: + raise exc(exitcode) + _handle_request.__name__ = str(f'worker_{how}') + platforms.signals[sig] = _handle_request + + +if REMAP_SIGTERM == "SIGQUIT": + install_worker_term_handler = partial( + _shutdown_handler, sig='SIGTERM', how='Cold', exc=WorkerTerminate, exitcode=EX_FAILURE, + ) +else: + install_worker_term_handler = partial( + _shutdown_handler, sig='SIGTERM', how='Warm', exc=WorkerShutdown, + ) + +if not is_jython: # pragma: no cover + install_worker_term_hard_handler = partial( + _shutdown_handler, sig='SIGQUIT', how='Cold', exc=WorkerTerminate, + 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 terminate all running tasks!') + install_worker_term_hard_handler(worker, sig='SIGINT') + + +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)})") + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/__init__.py new file mode 100644 index 0000000..ae2b485 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/__init__.py @@ -0,0 +1 @@ +"""Result Backends.""" diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/arangodb.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/arangodb.py new file mode 100644 index 0000000..8297398 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/arangodb.py @@ -0,0 +1,230 @@ +"""ArangoDb result store backend.""" + +# pylint: disable=W1202,W0703 + +import json +import logging +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 # noqa + +__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' + + # 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.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 + ) + 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=self.expires) + + def get(self, key): + try: + logging.debug( + 'RETURN DOCUMENT("{collection}/{key}").task'.format( + collection=self.collection, key=key + ) + ) + query = self.db.AQLQuery( + 'RETURN DOCUMENT("{collection}/{key}").task'.format( + collection=self.collection, key=key + ) + ) + result = query.response["result"][0] + if result is None: + return None + return json.dumps(result) + except AQLQueryError as aql_err: + logging.error(aql_err) + return None + except Exception as err: + logging.error(err) + return None + + def set(self, key, value): + """Insert a doc with value into task attribute and _key as key.""" + try: + logging.debug( + 'INSERT {{ task: {task}, _key: "{key}" }} INTO {collection}' + .format( + collection=self.collection, key=key, task=value + ) + ) + self.db.AQLQuery( + 'INSERT {{ task: {task}, _key: "{key}" }} INTO {collection}' + .format( + collection=self.collection, key=key, task=value + ) + ) + except AQLQueryError as aql_err: + logging.error(aql_err) + except Exception as err: + logging.error(err) + + def mget(self, keys): + try: + json_keys = json.dumps(keys) + logging.debug( + """ + FOR key in {keys} + RETURN DOCUMENT(CONCAT("{collection}/", key).task + """.format( + collection=self.collection, keys=json_keys + ) + ) + query = self.db.AQLQuery( + """ + FOR key in {keys} + RETURN DOCUMENT(CONCAT("{collection}/", key).task + """.format( + collection=self.collection, keys=json_keys + ) + ) + results = [] + while True: + results.extend(query.response['result']) + query.nextBatch() + except StopIteration: + values = [ + result if result is None else json.dumps(result) + for result in results + ] + return values + except AQLQueryError as aql_err: + logging.error(aql_err) + return [None] * len(keys) + except Exception as err: + logging.error(err) + return [None] * len(keys) + + def delete(self, key): + try: + logging.debug( + 'REMOVE {{ _key: "{key}" }} IN {collection}'.format( + key=key, collection=self.collection + ) + ) + self.db.AQLQuery( + 'REMOVE {{ _key: "{key}" }} IN {collection}'.format( + key=key, collection=self.collection + ) + ) + except AQLQueryError as aql_err: + logging.error(aql_err) + except Exception as err: + logging.error(err) + + def cleanup(self): + """Delete expired meta-data.""" + remove_before = (self.app.now() - self.expires_delta).isoformat() + try: + query = ( + 'FOR item IN {collection} ' + 'FILTER item.task.date_done < "{remove_before}" ' + 'REMOVE item IN {collection}' + ).format(collection=self.collection, remove_before=remove_before) + logging.debug(query) + self.db.AQLQuery(query) + except AQLQueryError as aql_err: + logging.error(aql_err) + except Exception as err: + logging.error(err) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/asynchronous.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/asynchronous.py new file mode 100644 index 0000000..32475d5 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/asynchronous.py @@ -0,0 +1,311 @@ +"""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 + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self._started = threading.Event() + self._stopped = threading.Event() + self._shutdown = threading.Event() + + def run(self): + self._started.set() + while not self._stopped.is_set(): + try: + self.result_consumer.drain_events(timeout=1) + 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._shutdown.wait(THREAD_TIMEOUT_MAX) + + +@register_drainer('eventlet') +class eventletDrainer(greenletDrainer): + + def spawn(self, func): + from eventlet import sleep, spawn + g = spawn(func) + sleep(0) + return g + + def wait_for(self, p, wait, timeout=None): + self.start() + if not p.ready: + self._g._exit_event.wait(timeout=timeout) + + +@register_drainer('gevent') +class geventDrainer(greenletDrainer): + + def spawn(self, func): + import gevent + g = gevent.spawn(func) + gevent.sleep(0) + return g + + def wait_for(self, p, wait, timeout=None): + import gevent + self.start() + if not p.ready: + gevent.wait([self._g], timeout=timeout) + + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/azureblockblob.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/azureblockblob.py new file mode 100644 index 0000000..972baaf --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/azureblockblob.py @@ -0,0 +1,137 @@ +"""The Azure Storage Block Blob backend for Celery.""" +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__) + + +class AzureBlockBlobBackend(KeyValueStoreBackend): + """Azure Storage Block Blob backend for Celery.""" + + def __init__(self, + url=None, + container_name=None, + *args, + **kwargs): + 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', '') + + @classmethod + def _parse_url(cls, url, prefix="azureblockblob://"): + 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. + + """ + client = BlobServiceClient.from_connection_string(self._connection_string) + + 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() diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/base.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/base.py new file mode 100644 index 0000000..f7ef15f --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/base.py @@ -0,0 +1,1040 @@ +"""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 datetime, 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_utf8 +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, 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 # noqa: E501 + 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._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: + chain_elem_opts = chain_elem['options'] + # 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. + if self.store_result and state in states.PROPAGATE_STATES: + try: + chained_task_id = chain_elem_opts['task_id'] + except KeyError: + pass + else: + self.store_result( + chained_task_id, exc, state, + traceback=traceback, request=chain_elem + ) + # 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_opts: + failed_ctx = Context(chain_elem) + failed_ctx.update(failed_ctx.options) + failed_ctx.id = failed_ctx.options['task_id'] + failed_ctx.group = failed_ctx.options['group_id'] + self.on_chord_part_return(failed_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 exc: + if not isinstance(exc, BaseException): + exc_module = exc.get('exc_module') + if exc_module is None: + cls = create_exception_cls( + from_utf8(exc['exc_type']), __name__) + else: + exc_module = from_utf8(exc_module) + exc_type = from_utf8(exc['exc_type']) + 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['exc_message'] + 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})') + if self.serializer in EXCEPTION_ABLE_CODECS: + exc = get_pickled_exception(exc) + 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 = datetime.utcnow() + 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 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: + warnings.warn( + "Shouldn't retrieve result with task_always_eager 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. + + Note: + This is run by :class:`celery.task.DeleteExpiredTaskMetaTask`. + """ + + 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] + queue = body.options.get('queue', getattr(body.type, 'queue', None)) + 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 # noqa: E305 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 + self._encode_prefixes() + super().__init__(*args, **kwargs) + if self.implements_incr: + self.apply_chord = self._apply_chord_incr + + 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.""" + key_t = self.key_t + return key_t('').join([ + self.task_keyprefix, key_t(task_id), key_t(key), + ]) + + def get_key_for_group(self, group_id, key=''): + """Get the cache key for a group by id.""" + key_t = self.key_t + return key_t('').join([ + self.group_keyprefix, key_t(group_id), key_t(key), + ]) + + def get_key_for_chord(self, group_id, key=''): + """Get the cache key for the chord waiting on group with given id.""" + key_t = self.key_t + return key_t('').join([ + self.chord_keyprefix, key_t(group_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.client.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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/cache.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/cache.py new file mode 100644 index 0000000..f3d13d9 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/cache.py @@ -0,0 +1,163 @@ +"""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 # noqa + 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 + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/cassandra.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/cassandra.py new file mode 100644 index 0000000..1220063 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/cassandra.py @@ -0,0 +1,232 @@ +"""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: # pragma: no cover + cassandra = None # noqa + + +__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. +""" + +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 backend utilizing DataStax driver. + + Raises: + celery.exceptions.ImproperlyConfigured: + if module :pypi:`cassandra-driver` is not available, + or if the :setting:`cassandra_servers` setting is not set. + """ + + #: List of Cassandra servers with format: ``hostname``. + servers = None + + supports_autoexpire = True # autoexpire supported via entry_ttl + + def __init__(self, servers=None, keyspace=None, table=None, entry_ttl=None, + port=9042, **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.port = port or conf.get('cassandra_port', None) + 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', {}) + + if not self.servers or not self.keyspace or not self.table: + raise ImproperlyConfigured('Cassandra backend not configured.') + + 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 + self._cluster = cassandra.cluster.Cluster( + self.servers, port=self.port, + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/consul.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/consul.py new file mode 100644 index 0000000..106953a --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/consul.py @@ -0,0 +1,100 @@ +"""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 + + client = None + consistency = 'consistent' + path = None + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + if self.consul is None: + raise ImproperlyConfigured(CONSUL_MISSING) + + 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.client = consul.Consul(host=hostname, port=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) + session_id = self.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 self.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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/cosmosdbsql.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/cosmosdbsql.py new file mode 100644 index 0000000..899cbcb --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/cosmosdbsql.py @@ -0,0 +1,219 @@ +"""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: # pragma: no cover + pydocumentdb = DocumentClient = ConsistencyLevel = PartitionKind = \ + HTTPFailure = ConnectionPolicy = RetryOptions = None # noqa + +__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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/couchbase.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/couchbase.py new file mode 100644 index 0000000..9ed594c --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/couchbase.py @@ -0,0 +1,106 @@ +"""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, ClusterOptions + from couchbase_core._libcouchbase import FMT_AUTO +except ImportError: + Cluster = PasswordAuthenticator = ClusterOptions = 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): + self.connection.upsert(key, value, ttl=self.expires, format=FMT_AUTO) + + def mget(self, keys): + return self.connection.get_multi(keys) + + def delete(self, key): + self.connection.remove(key) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/couchdb.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/couchdb.py new file mode 100644 index 0000000..43470ed --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/couchdb.py @@ -0,0 +1,99 @@ +"""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 # noqa + +__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) # noqa + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/database/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/database/__init__.py new file mode 100644 index 0000000..fb26d55 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/database/__init__.py @@ -0,0 +1,222 @@ +"""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: # pragma: no cover + 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?') + + @property + def extended_result(self): + return self.app.conf.find_value_for_key('extended', 'result') + + def ResultSession(self, session_manager=SessionManager()): + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/database/models.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/database/models.py new file mode 100644 index 0000000..1c766b5 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/database/models.py @@ -0,0 +1,108 @@ +"""Database models used by the SQLAlchemy result store backend.""" +from datetime import datetime + +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.utcnow, + onupdate=datetime.utcnow, 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.utcnow, + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/database/session.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/database/session.py new file mode 100644 index 0000000..415d462 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/database/session.py @@ -0,0 +1,89 @@ +"""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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/dynamodb.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/dynamodb.py new file mode 100644 index 0000000..25a8e34 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/dynamodb.py @@ -0,0 +1,496 @@ +"""AWS DynamoDB result store backend.""" +from collections import namedtuple +from time import sleep, time + +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: # pragma: no cover + boto3 = ClientError = None # noqa + +__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') + _value_field = DynamoDBAttribute(name='result', data_type='B') + _timestamp_field = DynamoDBAttribute(name='timestamp', data_type='N') + _ttl_field = DynamoDBAttribute(name='ttl', data_type='N') + _available_fields = None + + 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': + # We are using the downloadable, local version of DynamoDB + self.endpoint_url = f'http://localhost:{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( + '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 + ) + + 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: + 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 + except ClientError as e: + error_code = e.response['Error'].get('Code', 'Unknown') + + # If table exists, do not fail, just return the description. + if error_code == 'ResourceInUseException': + return self._client.describe_table( + TableName=self.table_name + ) + 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 _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) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/elasticsearch.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/elasticsearch.py new file mode 100644 index 0000000..886acd0 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/elasticsearch.py @@ -0,0 +1,248 @@ +"""Elasticsearch result store backend.""" +from datetime import datetime + +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: # pragma: no cover + elasticsearch = None # noqa + +__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 = 'backend' + 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) # noqa + 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.TransportError)): + # 401: Unauthorized + # 409: Conflict + # 429: Too Many Requests + # 500: Internal Server Error + # 502: Bad Gateway + # 503: Service Unavailable + # 504: Gateway Timeout + # N/A: Low level exception (i.e. socket exception) + if exc.status_code in {401, 409, 429, 500, 502, 503, 504, 'N/A'}: + 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): + return self.server.get( + index=self.index, + doc_type=self.doc_type, + id=key, + ) + + def _set_with_state(self, key, value, state): + body = { + 'result': value, + '@timestamp': '{}Z'.format( + datetime.utcnow().isoformat()[:-3] + ), + } + 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()} + return self.server.index( + id=bytes_to_str(id), + index=self.index, + doc_type=self.doc_type, + 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 + 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 + ) + # 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(409, 'conflicting update occurred concurrently', {}) + return res + + def encode(self, data): + if self.es_save_meta_as_text: + return KeyValueStoreBackend.encode(self, data) + else: + if not isinstance(data, dict): + return KeyValueStoreBackend.encode(self, 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 KeyValueStoreBackend.decode(self, payload) + else: + if not isinstance(payload, dict): + return KeyValueStoreBackend.decode(self, payload) + if payload.get("result"): + payload["result"] = KeyValueStoreBackend.decode(self, payload["result"]) + if payload.get("traceback"): + payload["traceback"] = KeyValueStoreBackend.decode(self, payload["traceback"]) + return payload + + def mget(self, keys): + return [self.get(key) for key in keys] + + def delete(self, key): + self.server.delete(index=self.index, doc_type=self.doc_type, 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.host}:{self.port}', + retry_on_timeout=self.es_retry_on_timeout, + max_retries=self.es_max_retries, + timeout=self.es_timeout, + scheme=self.scheme, + http_auth=http_auth, + ) + + @property + def server(self): + if self._server is None: + self._server = self._get_server() + return self._server diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/filesystem.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/filesystem.py new file mode 100644 index 0000000..26a48ae --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/filesystem.py @@ -0,0 +1,96 @@ +"""File-system result store backend.""" +import locale +import os + +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 + + # Lets verify that we've everything setup right + self._do_directory_test(b'.fs-backend-' + uuid().encode(encoding)) + + def __reduce__(self, args=(), kwargs={}): + kwargs.update( + dict(url=self.url)) + return super().__reduce__(args, kwargs) + + 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)) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/mongodb.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/mongodb.py new file mode 100644 index 0000000..6044866 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/mongodb.py @@ -0,0 +1,326 @@ +"""MongoDB result store backend.""" +from datetime import datetime, timedelta + +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: # pragma: no cover + pymongo = None # noqa + +if pymongo: + try: + from bson.binary import Binary + except ImportError: # pragma: no cover + from pymongo.binary import Binary # noqa + from pymongo.errors import InvalidDocument # noqa +else: # pragma: no cover + Binary = None # noqa + + class InvalidDocument(Exception): # noqa + 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) + # 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: + 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.utcnow(), + } + 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() + db = conn[self.database_name] + if self.user and self.password: + source = self.options.get( + 'authsource', + self.database_name or 'admin' + ) + if not db.authenticate(self.user, self.password, source=source): + raise ImproperlyConfigured( + 'Invalid MongoDB username or password.') + return db + + @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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/redis.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/redis.py new file mode 100644 index 0000000..23d7ac3 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/redis.py @@ -0,0 +1,660 @@ +"""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: # pragma: no cover + redis = None # noqa + get_redis_error_classes = None # noqa + +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 + 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, + ) + self._pubsub.subscribe(*self.subscribed_to) + + @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 + + @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__( + (self.url,), {'expires': self.expires}, + ) + + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/rpc.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/rpc.py new file mode 100644 index 0000000..399c1dc --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/rpc.py @@ -0,0 +1,342 @@ +"""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 do 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/s3.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/s3.py new file mode 100644 index 0000000..ea04ae3 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/backends/s3.py @@ -0,0 +1,87 @@ +"""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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/beat.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/beat.py new file mode 100644 index 0000000..74c67f9 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/beat.py @@ -0,0 +1,739 @@ +"""The periodic task scheduler.""" + +import copy +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.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: + """An 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.schedule.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 __ne__(self, other): + """Test schedule entries inequality. + + Will only compare "editable" fields: + ``task``, ``schedule``, ``args``, ``kwargs``, ``options``. + """ + return not self == 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: + debug('%s sent. id->%s', entry.task, result.id) + + 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 currect 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) + return min(adjust(next_time_to_run) or 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') + Scheduler.__init__(self, *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: + # new schedule db + try: + self._store['entries'] = {} + except KeyError 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) or {}) + 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): # noqa + + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/amqp.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/amqp.py new file mode 100644 index 0000000..d94c916 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/amqp.py @@ -0,0 +1,312 @@ +"""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() + + +repl = register_repl(amqp) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/base.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/base.py new file mode 100644 index 0000000..0eba53e --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/base.py @@ -0,0 +1,254 @@ +"""Click customizations for Celery.""" +import json +from collections import OrderedDict +from functools import update_wrapper +from pprint import pformat + +import click +from click import 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): + if self.default_value_from_context: + self.default = ctx.obj[self.default_value_from_context] + return super().get_default(ctx) + + 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 CeleryDaemonCommand(CeleryCommand): + """Daemon commands.""" + + def __init__(self, *args, **kwargs): + """Initialize a Celery command with common daemon options.""" + super().__init__(*args, **kwargs) + self.params.append(CeleryOption(('-f', '--logfile'), help_group="Daemonization Options")) + self.params.append(CeleryOption(('--pidfile',), help_group="Daemonization Options")) + self.params.append(CeleryOption(('--uid',), help_group="Daemonization Options")) + self.params.append(CeleryOption(('--uid',), help_group="Daemonization Options")) + self.params.append(CeleryOption(('--gid',), help_group="Daemonization Options")) + self.params.append(CeleryOption(('--umask',), help_group="Daemonization Options")) + self.params.append(CeleryOption(('--executable',), help_group="Daemonization Options")) + + +class CommaSeparatedList(ParamType): + """Comma separated list argument.""" + + name = "comma separated list" + + def convert(self, value, param, ctx): + return text.str_to_list(value) + + +class Json(ParamType): + """JSON formatted argument.""" + + name = "json" + + def convert(self, value, param, ctx): + try: + return json.loads(value) + except ValueError as e: + self.fail(str(e)) + + +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): + value = value.upper() + value = super().convert(value, param, ctx) + return mlevel(value) + + +JSON = Json() +ISO8601 = ISO8601DateTime() +ISO8601_OR_FLOAT = ISO8601DateTimeOrFloat() +LOG_LEVEL = LogLevel() +COMMA_SEPARATED_LIST = CommaSeparatedList() diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/beat.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/beat.py new file mode 100644 index 0000000..145b44e --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/beat.py @@ -0,0 +1,72 @@ +"""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, **kwargs) + + if detach: + with detached(logfile, pidfile, uid, gid, umask, workdir): + return beat().run() + else: + return beat().run() diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/call.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/call.py new file mode 100644 index 0000000..35ca34e --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/call.py @@ -0,0 +1,71 @@ +"""The ``celery call`` program used to send tasks from the command-line.""" +import click + +from celery.bin.base import (ISO8601, ISO8601_OR_FLOAT, JSON, CeleryCommand, + CeleryOption, handle_preload_options) + + +@click.command(cls=CeleryCommand) +@click.argument('name') +@click.option('-a', + '--args', + cls=CeleryOption, + type=JSON, + default='[]', + help_group="Calling Options", + help="Positional arguments.") +@click.option('-k', + '--kwargs', + cls=CeleryOption, + type=JSON, + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/celery.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/celery.py new file mode 100644 index 0000000..c6b862d --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/celery.py @@ -0,0 +1,213 @@ +"""Celery Command Line Interface.""" +import os +import pathlib +import traceback + +import click +import click.exceptions +from click.types import ParamType +from click_didyoumean import DYMGroup +from click_plugins import with_plugins +from pkg_resources import iter_entry_points + +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}""") + + +class App(ParamType): + """Application option.""" + + name = "application" + + def convert(self, value, param, ctx): + try: + return find_app(value) + except ModuleNotFoundError as e: + if e.name != value: + exc = traceback.format_exc() + self.fail( + UNABLE_TO_LOAD_APP_ERROR_OCCURRED.format(value, exc) + ) + self.fail(UNABLE_TO_LOAD_APP_MODULE_NOT_FOUND.format(e.name)) + except AttributeError as e: + attribute_name = e.args[0].capitalize() + self.fail(UNABLE_TO_LOAD_APP_APP_MISSING.format(attribute_name)) + except Exception: + exc = traceback.format_exc() + self.fail( + UNABLE_TO_LOAD_APP_ERROR_OCCURRED.format(value, exc) + ) + + +APP = App() + + +@with_plugins(iter_entry_points('celery.commands')) +@click.group(cls=DYMGroup, invoke_without_command=True) +@click.option('-A', + '--app', + envvar='APP', + cls=CeleryOption, + type=APP, + 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.pass_context +def celery(ctx, app, broker, result_backend, loader, config, workdir, + no_color, quiet, version): + """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 + 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): + """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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/control.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/control.py new file mode 100644 index 0000000..a13963a --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/control.py @@ -0,0 +1,202 @@ +"""The ``celery control``, ``. inspect`` and ``. status`` programs.""" +from functools import partial + +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(action, args): + meta = Panel.meta[action] + arguments = {} + if meta.args: + arguments.update({ + k: v for k, v in _consume_arguments(meta, action, args) + }) + if meta.variadic: + arguments.update({meta.variadic: args}) + return arguments + + +@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("action", type=click.Choice([ + name for name, info in Panel.meta.items() + if info.type == 'inspect' and info.visible +])) +@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, action, timeout, destination, json, **kwargs): + """Inspect the worker at runtime. + + Availability: RabbitMQ (AMQP) and Redis transports. + """ + callback = None if json else partial(_say_remote_command_reply, ctx, + show_reply=True) + arguments = _compile_arguments(action, ctx.args) + inspect = ctx.obj.app.control.inspect(timeout=timeout, + destination=destination, + callback=callback) + replies = inspect._request(action, + **arguments) + + 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 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("action", type=click.Choice([ + name for name, info in Panel.meta.items() + if info.type == 'control' and info.visible +])) +@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, action, timeout, destination, json): + """Workers remote control. + + Availability: RabbitMQ (AMQP), Redis, and MongoDB transports. + """ + callback = None if json else partial(_say_remote_command_reply, ctx, + show_reply=True) + args = ctx.args + arguments = _compile_arguments(action, args) + replies = ctx.obj.app.control.broadcast(action, 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/events.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/events.py new file mode 100644 index 0000000..fa37c83 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/events.py @@ -0,0 +1,95 @@ +"""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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/graph.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/graph.py new file mode 100644 index 0000000..d4d6f16 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/graph.py @@ -0,0 +1,197 @@ +"""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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/list.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/list.py new file mode 100644 index 0000000..f170e62 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/list.py @@ -0,0 +1,38 @@ +"""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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/logtool.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/logtool.py new file mode 100644 index 0000000..ae64c3e --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/logtool.py @@ -0,0 +1,157 @@ +"""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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/migrate.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/migrate.py new file mode 100644 index 0000000..febaaaa --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/migrate.py @@ -0,0 +1,64 @@ +"""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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/multi.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/multi.py new file mode 100644 index 0000000..3a9e026 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/multi.py @@ -0,0 +1,480 @@ +"""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): + """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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/purge.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/purge.py new file mode 100644 index 0000000..2629ac7 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/purge.py @@ -0,0 +1,69 @@ +"""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) +@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): + """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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/result.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/result.py new file mode 100644 index 0000000..c126fb5 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/result.py @@ -0,0 +1,31 @@ +"""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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/shell.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/shell.py new file mode 100644 index 0000000..378448a --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/shell.py @@ -0,0 +1,172 @@ +"""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) +@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): + """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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/upgrade.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/upgrade.py new file mode 100644 index 0000000..cd9a695 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/upgrade.py @@ -0,0 +1,92 @@ +"""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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/worker.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/worker.py new file mode 100644 index 0000000..eecd874 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bin/worker.py @@ -0,0 +1,350 @@ +"""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.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. + 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('optimization', + '-O', + 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, + 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. + + Examples + -------- + $ 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') + + 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() + return worker.exitcode + except SecurityError as e: + ctx.obj.error(e.args[0]) + ctx.exit(1) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bootsteps.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bootsteps.py new file mode 100644 index 0000000..315426a --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/bootsteps.py @@ -0,0 +1,415 @@ +"""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: # pragma: no cover + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/canvas.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/canvas.py new file mode 100644 index 0000000..34bcd6a --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/canvas.py @@ -0,0 +1,1612 @@ +"""Composing task work-flows. + +.. seealso: + + You should import these from :mod:`celery` and not this module. +""" + +import itertools +import operator +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.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, lookahead, 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.""" + # 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) + + +@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 chaning `.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"} + + @classmethod + def register_type(cls, name=None): + def _inner(subclass): + cls.TYPES[name or subclass.__name__] = subclass + return subclass + + return _inner + + @classmethod + def from_dict(cls, d, app=None): + 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 + # Borks on this, as it's a property + return _apply(args, kwargs, **options) + + def _merge(self, args=None, kwargs=None, options=None, force=False): + 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 + new_options = dict(self.options, **{ + k: v for k, v in options.items() + if k not in self._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. + + Returns: + ~@AsyncResult: promise of future evaluation. + """ + # pylint: disable=redefined-outer-name + # XXX chord is also a class in outer scope. + opts = self.options + try: + tid = opts['task_id'] + except KeyError: + 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: + 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 + # Borks 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 _with_list_option(self, key): + 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): + items = self._with_list_option(key) + if value not in items: + items.append(value) + return value + + def extend_list_option(self, key, value): + 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): + # These could be implemented in each individual class, + # I'm sure, but for now we have this. + if isinstance(self, group): + # group() | task -> chord + return chord(self, body=other, app=self._app) + elif isinstance(other, group): + # unroll group with one member + other = maybe_unroll_group(other) + if isinstance(self, _chain): + # chain | group() -> chain + tasks = self.unchain_tasks() + if not tasks: + # If the chain is empty, return the group + return other + return _chain(seq_concat_item( + tasks, other), app=self._app) + # task | group() -> chain + return _chain(self, other, app=self.app) + + if not isinstance(self, _chain) and isinstance(other, _chain): + # task | chain -> chain + return _chain(seq_concat_seq( + (self,), other.unchain_tasks()), app=self._app) + elif isinstance(other, _chain): + # chain | chain -> chain + return _chain(seq_concat_seq( + self.unchain_tasks(), other.unchain_tasks()), app=self._app) + elif isinstance(self, chord): + # chord | task -> attach to body + sig = self.clone() + sig.body = sig.body | other + return sig + elif isinstance(other, Signature): + if isinstance(self, _chain): + 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) + 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 + return _chain(seq_concat_item( + self.unchain_tasks(), other), app=self._app) + # 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): + 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) + + 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 dict.items(self): + 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 _chain(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) + Signature.__init__( + self, '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 clone(self, *args, **kwargs): + to_signature = maybe_signature + signature = Signature.clone(self, *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): + # Clone chain's tasks assigning signatures from link_error + # to each task + tasks = [t.clone() for t in self.tasks] + for sig in self.options.get('link_error', []): + 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): + # 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) + + 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, + ) + + 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] + + 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 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): + 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) + + 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() + 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): + 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 the chain + steps_extend(task.tasks) + continue + + 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 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 + 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) + return reduce(operator.or_, tasks, chain()) + 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): + Signature.__init__( + self, 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 chunks(*cls._unpack_args(d['kwargs']), app=app, **d['options']) + + def __init__(self, task, it, n, **options): + Signature.__init__( + self, '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): + # 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 group(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): + tasks = regen(tasks) + Signature.__init__( + self, 'celery.group', (), {'tasks': tasks}, **options + ) + self.subtask_type = 'group' + + def __call__(self, *partial_args, **options): + return self.apply_async(partial_args, **options) + + def skew(self, start=1.0, stop=None, step=1.0): + 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 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! + return tuple(child_task.link_error(sig) 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): + for task in 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_id + + def _apply_tasks(self, tasks, producer=None, app=None, p=None, + add_to_parent=None, chord=None, + args=None, kwargs=None, **options): + # 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 + for task_index, (current_task, next_task) in enumerate( + lookahead(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) + yield res # <-- r.parent, etc set in the frozen result. + + def _freeze_gid(self, options): + # 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 = dict(self.options, **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): + # 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): + # We are draining from a geneator here. + tasks1, tasks2 = itertools.tee(self._unroll_tasks(self.tasks)) + results = regen(self._freeze_tasks(tasks1, group_id, chord, root_id, parent_id)) + self.tasks = regen(x[0] for x in zip(tasks2, results)) + 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): + 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): + 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): + # 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 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): + 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 {} + Signature.__init__( + self, task, args, + {'kwargs': 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 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) + header_result = self.tasks.freeze( + parent_id=parent_id, root_id=root_id, chord=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 + self.id = self.tasks.id + return body_result + + 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)) + 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, **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): + # 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 + else: + # 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): + 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, **options): + 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(*partial_args, 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 = Signature.clone(self, *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): + self.body.link(callback) + return callback + + def link_error(self, errback): + self.body.link_error(errback) + return errback + + def set_immutable(self, immutable): + # changes mutability of header only, not callback. + 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 # noqa: E305 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 # noqa: E305 XXX compat diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/concurrency/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/concurrency/__init__.py new file mode 100644 index 0000000..a326c79 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/concurrency/__init__.py @@ -0,0 +1,33 @@ +"""Pool implementation abstract factory, and alias definitions.""" + +# 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: F401 +except ImportError: + pass +else: + ALIASES['threads'] = 'celery.concurrency.thread:TaskPool' + + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/concurrency/asynpool.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/concurrency/asynpool.py new file mode 100644 index 0000000..f4d1c47 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/concurrency/asynpool.py @@ -0,0 +1,1341 @@ +"""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 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 buf_t, 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.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: # pragma: no cover + + def __read__(fd, buf, size, read=os.read): # noqa + chunk = read(fd, size) + n = len(chunk) + if n != 0: + buf.write(chunk) + return n + readcanbuf = False # noqa + + 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.""" + # gi_frame is None when generator stopped. + return gen.gi_frame and gen.gi_frame.f_lasti == -1 + + +def _get_job_writer(job): + try: + writer = job._writer + except AttributeError: + pass + else: + return writer() # is a weakref + + +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 + + if readers: + [register(fd, POLLIN) for fd in readers] + if writers: + [register(fd, POLLOUT) for fd in writers] + if err: + [register(fd, POLLERR) for fd in err] + + 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 not isinstance(fd, Integral): + fd = fd.fileno() + 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 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 + + 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): + 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) + + hub.on_tick.add(self.on_poll_start) + + 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) + 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(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(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 = buf_t(header), buf_t(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(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. + 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) + owned_by = {} + for job in self._cache.values(): + writer = _get_job_writer(job) + if writer is not None: + owned_by[writer] = job + + 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) + # 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`` proceses.""" + 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 frmo 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/concurrency/base.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/concurrency/base.py new file mode 100644 index 0000000..0b4db3f --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/concurrency/base.py @@ -0,0 +1,172 @@ +"""Base Execution Pool.""" +import logging +import os +import sys +import time + +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): + return { + '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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/concurrency/eventlet.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/concurrency/eventlet.py new file mode 100644 index 0000000..bf794d4 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/concurrency/eventlet.py @@ -0,0 +1,146 @@ +"""Eventlet execution pool.""" +import sys +from time import monotonic + +from kombu.asynchronous import timer as _timer # noqa + +from celery import signals # noqa + +from . import base # noqa + +__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 + _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) + signals.eventlet_pool_started.send(sender=self) + self._quick_put = self._pool.spawn_n + 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, **_): + self._quick_apply_sig( + sender=self, target=target, args=args, kwargs=kwargs, + ) + self._quick_put(apply_target, target, args, kwargs, + callback, accept_callback, + self.getpid) + + 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 _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 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/concurrency/gevent.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/concurrency/gevent.py new file mode 100644 index 0000000..0bb3e49 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/concurrency/gevent.py @@ -0,0 +1,122 @@ +"""Gevent execution pool.""" +from time import monotonic + +from kombu.asynchronous import timer as _timer + +from . import base + +try: + from gevent import Timeout +except ImportError: # pragma: no cover + Timeout = None # noqa + +__all__ = ('TaskPool',) + +# pylint: disable=redefined-outer-name +# We cache globals and attribute lookups, so disable this warning. + + +def apply_timeout(target, args=(), kwargs=None, callback=None, + accept_callback=None, pid=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, pid, + 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 + _quick_put = None + + def __init__(self, *args, **kwargs): + from gevent import spawn_raw + from gevent.pool import Pool + self.Pool = Pool + 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._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=base.apply_target, **_): + timeout = self.timeout if timeout is None else timeout + return self._quick_put(apply_timeout if timeout else apply_target, + target, args, kwargs, callback, accept_callback, + timeout=timeout, + timeout_callback=timeout_callback) + + 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 + + @property + def num_processes(self): + return len(self._pool) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/concurrency/prefork.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/concurrency/prefork.py new file mode 100644 index 0000000..a764611 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/concurrency/prefork.py @@ -0,0 +1,168 @@ +"""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. + """ + _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) + return { + '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', + } + + @property + def num_processes(self): + return self._pool._processes diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/concurrency/solo.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/concurrency/solo.py new file mode 100644 index 0000000..ea6e274 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/concurrency/solo.py @@ -0,0 +1,29 @@ +"""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): + return { + 'max-concurrency': 1, + 'processes': [os.getpid()], + 'max-tasks-per-child': None, + 'put-guarded-by-semaphore': True, + 'timeouts': (), + } diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/concurrency/thread.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/concurrency/thread.py new file mode 100644 index 0000000..ffd2e50 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/concurrency/thread.py @@ -0,0 +1,45 @@ +"""Thread execution pool.""" + +from concurrent.futures import ThreadPoolExecutor, wait + +from .base import BasePool, apply_target + +__all__ = ('TaskPool',) + + +class ApplyResult: + def __init__(self, future): + self.f = future + self.get = self.f.result + + def wait(self, timeout=None): + wait([self.f], timeout) + + +class TaskPool(BasePool): + """Thread Task Pool.""" + + body_can_be_buffer = True + signal_safe = False + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.executor = ThreadPoolExecutor(max_workers=self.limit) + + def on_stop(self): + self.executor.shutdown() + super().on_stop() + + def on_apply(self, target, args=None, kwargs=None, callback=None, + accept_callback=None, **_): + f = self.executor.submit(apply_target, target, args, kwargs, + callback, accept_callback) + return ApplyResult(f) + + def _get_info(self): + return { + 'max-concurrency': self.limit, + 'threads': len(self.executor._threads) + # TODO use a public api to retrieve the current number of threads + # in the executor when available. (Currently not available). + } diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/contrib/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/contrib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/contrib/abortable.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/contrib/abortable.py new file mode 100644 index 0000000..75b4d25 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/contrib/abortable.py @@ -0,0 +1,169 @@ +"""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 __future__ import absolute_import + + 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 + + from __future__ import absolute_import + + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/contrib/migrate.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/contrib/migrate.py new file mode 100644 index 0000000..ec3751e --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/contrib/migrate.py @@ -0,0 +1,411 @@ +"""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) + + 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, **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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/contrib/pytest.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/contrib/pytest.py new file mode 100644 index 0000000..c54ea5c --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/contrib/pytest.py @@ -0,0 +1,203 @@ +"""Fixtures and testing utilities for :pypi:`pytest `.""" +import os +from contextlib import contextmanager + +import pytest + +from .testing import worker +from .testing.app import TestApp, setup_default_app + +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 issueing 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.""" + 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.""" + 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.tasks.register(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.""" + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/contrib/rdb.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/contrib/rdb.py new file mode 100644 index 0000000..6d346a0 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/contrib/rdb.py @@ -0,0 +1,188 @@ +"""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') + Pdb.__init__(self, 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 + else: + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/contrib/sphinx.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/contrib/sphinx.py new file mode 100644 index 0000000..e9d7119 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/contrib/sphinx.py @@ -0,0 +1,106 @@ +"""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 formatargspec, getfullargspec + +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: + argspec = getfullargspec(wrapped) + if argspec[0] and argspec[0][0] in ('cls', 'self'): + del argspec[0][0] + fmt = formatargspec(*argspec) + fmt = fmt.replace('\\', '\\\\') + return fmt + 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 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/contrib/testing/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/contrib/testing/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/contrib/testing/app.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/contrib/testing/app.py new file mode 100644 index 0000000..274e5d1 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/contrib/testing/app.py @@ -0,0 +1,109 @@ +"""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() + + yield + _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) + + if use_trap: + with set_trap(app): + yield + else: + yield + + _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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/contrib/testing/manager.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/contrib/testing/manager.py new file mode 100644 index 0000000..d053a03 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/contrib/testing/manager.py @@ -0,0 +1,215 @@ +"""Integration testing utilities.""" +import socket +import sys +from collections import defaultdict +from functools import partial +from itertools import count + +from kombu.utils.functional import retry_over_time + +from celery import states +from celery.exceptions import TimeoutError +from celery.result import ResultSet +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_accepted, 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 + + +class Manager(ManagerMixin): + """Test helpers for task integration tests.""" + + def __init__(self, app, **kwargs): + self.app = app + self._init_manager(**kwargs) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/contrib/testing/mocks.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/contrib/testing/mocks.py new file mode 100644 index 0000000..6294e69 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/contrib/testing/mocks.py @@ -0,0 +1,111 @@ +"""Useful mocks for unit testing.""" +import numbers +from datetime import datetime, timedelta + +try: + from case import Mock +except ImportError: + from unittest.mock import Mock + + +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: Squence[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 + ) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/contrib/testing/tasks.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/contrib/testing/tasks.py new file mode 100644 index 0000000..a372a20 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/contrib/testing/tasks.py @@ -0,0 +1,9 @@ +"""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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/contrib/testing/worker.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/contrib/testing/worker.py new file mode 100644 index 0000000..09fecc0 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/contrib/testing/worker.py @@ -0,0 +1,175 @@ +"""Embedded workers for integration tests.""" +import os +import threading +from contextlib import contextmanager + +from celery import 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.""" + + def __init__(self, *args, **kwargs): + # type: (*Any, **Any) -> None + self._on_started = threading.Event() + super().__init__(*args, **kwargs) + + 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) + + 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 + test_worker_stopped.send(sender=app, worker=worker) + + +@contextmanager +def _start_worker_thread(app, + concurrency=1, + pool='solo', + loglevel=WORKER_LOGLEVEL, + logfile=None, + WorkController=TestWorkController, + perform_ping_check=True, + shutdown_timeout=10.0, + **kwargs): + # type: (Celery, int, str, Union[str, int], str, Any, **Any) -> Iterable + """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=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) + + yield worker + + 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() + yield + cluster.stopwait() + + +def setup_app_for_worker(app, loglevel, logfile): + # type: (Celery, Union[str, int], 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/events/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/events/__init__.py new file mode 100644 index 0000000..8e509fb --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/events/__init__.py @@ -0,0 +1,15 @@ +"""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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/events/cursesmon.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/events/cursesmon.py new file mode 100644 index 0000000..e9534a7 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/events/cursesmon.py @@ -0,0 +1,536 @@ +"""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 + '[...]' + elif nexty >= my: + break + 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 + threading.Thread.__init__(self) + + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/events/dispatcher.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/events/dispatcher.py new file mode 100644 index 0000000..1969fc2 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/events/dispatcher.py @@ -0,0 +1,229 @@ +"""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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/events/dumper.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/events/dumper.py new file mode 100644 index 0000000..24c7b3e --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/events/dumper.py @@ -0,0 +1,103 @@ +"""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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/events/event.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/events/event.py new file mode 100644 index 0000000..a05ed70 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/events/event.py @@ -0,0 +1,63 @@ +"""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 == 'redis': + # quick hack for Issue #436 + ex.type = 'fanout' + if name != ex.name: + ex.name = name + return ex diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/events/receiver.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/events/receiver.py new file mode 100644 index 0000000..1487107 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/events/receiver.py @@ -0,0 +1,135 @@ +"""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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/events/snapshot.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/events/snapshot.py new file mode 100644 index 0000000..d4dd65b --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/events/snapshot.py @@ -0,0 +1,111 @@ +"""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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/events/state.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/events/state.py new file mode 100644 index 0000000..4fef2bf --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/events/state.py @@ -0,0 +1,736 @@ +"""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 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) # noqa: E305 + + +@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 __ne__(this, other): + res = this.__eq__(other) + return True if res is NotImplemented else not res + cls.__ne__ = __ne__ + + 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() + + # type: Mapping[TaskName, WeakSet[Task]] + self.tasks_by_type = CallableDefaultdict( + self._tasks_by_type, WeakSet) + self.tasks_by_type.update( + _deserialize_Task_WeakSet_Mapping(tasks_by_type, self.tasks)) + + # type: Mapping[Hostname, WeakSet[Task]] + self.tasks_by_worker = CallableDefaultdict( + self._tasks_by_worker, WeakSet) + 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=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=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): + # noqa: C901 + # 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=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=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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/exceptions.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/exceptions.py new file mode 100644 index 0000000..775418d --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/exceptions.py @@ -0,0 +1,311 @@ +"""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', +) + +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 = 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 # noqa: E305 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 # noqa: E305 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/fixups/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/fixups/__init__.py new file mode 100644 index 0000000..c565ca3 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/fixups/__init__.py @@ -0,0 +1 @@ +"""Fixups.""" diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/fixups/django.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/fixups/django.py new file mode 100644 index 0000000..3064601 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/fixups/django.py @@ -0,0 +1,204 @@ +"""Django-specific customization.""" +import os +import sys +import warnings +from datetime import datetime +from importlib import import_module + +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 + +__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): + try: + os.close(fh.fileno()) + except (AttributeError, OSError, TypeError): + # TypeError added for celery#962 + pass + + +def _verify_django_version(django): + if django.VERSION < (1, 11): + raise ImproperlyConfigured('Celery 5.x requires Django 1.11 or later.') + + +def fixup(app, env='DJANGO_SETTINGS_MODULE'): + """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 # noqa + except ImportError: + warnings.warn(FixupWarning(ERR_NOT_INSTALLED)) + else: + _verify_django_version(django) + return DjangoFixup(app).install() + + +class DjangoFixup: + """Fixup installed when using Django.""" + + def __init__(self, app): + self.app = app + if _state.default_app is None: + self.app.set_default() + self._worker_fixup = None + + def install(self): + # 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 + + signals.import_modules.connect(self.on_import_modules) + signals.worker_init.connect(self.on_worker_init) + return self + + @property + def worker_fixup(self): + if self._worker_fixup is None: + self._worker_fixup = DjangoWorkerFixup(self.app) + return self._worker_fixup + + @worker_fixup.setter + def worker_fixup(self, value): + self._worker_fixup = value + + def on_import_modules(self, **kwargs): + # call django.setup() before task modules are imported + self.worker_fixup.validate_models() + + def on_worker_init(self, **kwargs): + self.worker_fixup.install() + + def now(self, utc=False): + return datetime.utcnow() if utc else self._now() + + def autodiscover_tasks(self): + from django.apps import apps + return [config.name for config in apps.get_app_configs()] + + @cached_property + def _now(self): + return symbol_by_name('django.utils.timezone:now') + + +class DjangoWorkerFixup: + _db_recycles = 0 + + def __init__(self, app): + self.app = app + self.db_reuse_max = self.app.conf.get('CELERY_DB_REUSE_MAX', None) + self._db = 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): + import django + django.setup() + + def validate_models(self): + from django.core.checks import run_checks + self.django_setup() + run_checks() + + def install(self): + signals.beat_embedded_init.connect(self.close_database) + signals.worker_ready.connect(self.on_worker_ready) + 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): + # 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.connection) + + # 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, fd): + try: + _maybe_close_fd(fd) + except self.interface_errors: + pass + + def on_task_prerun(self, sender, **kwargs): + """Called before every task.""" + if not getattr(sender.request, 'is_eager', False): + self.close_database() + + def on_task_postrun(self, sender, **kwargs): + # 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): + 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=False): + 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): + try: + self._cache.close_caches() + except (TypeError, AttributeError): + pass + + def on_worker_ready(self, **kwargs): + if self._settings.DEBUG: + warnings.warn('''Using settings.DEBUG leads to a memory + leak, never use this setting in production environments!''') diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/loaders/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/loaders/__init__.py new file mode 100644 index 0000000..730a1fa --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/loaders/__init__.py @@ -0,0 +1,18 @@ +"""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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/loaders/app.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/loaders/app.py new file mode 100644 index 0000000..c9784c5 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/loaders/app.py @@ -0,0 +1,8 @@ +"""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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/loaders/base.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/loaders/base.py new file mode 100644 index 0000000..ad45bad --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/loaders/base.py @@ -0,0 +1,271 @@ +"""Loader base class.""" +import importlib +import os +import re +import sys +from datetime import datetime + +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.utcnow() + 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) + 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 speciying a class name in INSTALLED_APPS. + # (Issue #2248). + try: + module = importlib.import_module(package) + if not related_name and module: + return module + except ImportError: + package, _, _ = package.rpartition('.') + if not package: + raise + + module_name = f'{package}.{related_name}' + + try: + return importlib.import_module(module_name) + except ImportError as e: + import_exc_name = getattr(e, 'name', module_name) + if import_exc_name is not None and import_exc_name != module_name: + raise e + return diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/loaders/default.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/loaders/default.py new file mode 100644 index 0000000..b49634c --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/loaders/default.py @@ -0,0 +1,42 @@ +"""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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/local.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/local.py new file mode 100644 index 0000000..f3803f4 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/local.py @@ -0,0 +1,574 @@ +"""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 __setslice__(self, i, j, seq): + self._get_current_object()[i:j] = seq + + def __delslice__(self, i, j): + del self._get_current_object()[i:j] + + 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 __getslice__(self, i, j): + return self._get_current_object()[i:j] + + 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) + + +def _compat_periodic_task_decorator(*args, **kwargs): + from celery.task import periodic_task + return periodic_task(*args, **kwargs) + + +COMPAT_MODULES = { + 'celery': { + 'execute': { + 'send_task': 'send_task', + }, + 'decorators': { + 'task': 'task', + 'periodic_task': _compat_periodic_task_decorator, + }, + 'log': { + 'get_default_logger': 'log.get_default_logger', + 'setup_logger': 'log.setup_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', + }, + }, + 'celery.task': { + 'control': { + 'broadcast': 'control.broadcast', + 'rate_limit': 'control.rate_limit', + 'time_limit': 'control.time_limit', + 'ping': 'control.ping', + 'revoke': 'control.revoke', + 'discard_all': 'control.purge', + 'inspect': 'control.inspect', + }, + 'schedules': 'celery.schedules', + 'chords': 'celery.canvas', + } +} + +#: 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 () + by_module = by_module or {} + direct = direct or {} + old_module = sys.modules[name] + origins = get_origins(by_module) + compat_modules = COMPAT_MODULES.get(name, ()) + + _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 + }) + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/platforms.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/platforms.py new file mode 100644 index 0000000..16cfa8d --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/platforms.py @@ -0,0 +1,836 @@ +"""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 collections import namedtuple +from contextlib import contextmanager + +from billiard.compat import close_open_fds, get_fdmax +# 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: # pragma: no cover + 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})""" + +_range = namedtuple('_range', ('start', 'stop')) + +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 respons 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 + + try: + os.kill(pid, 0) + except os.error 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 # noqa: E305 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.') + + +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 + + if hasattr(_signal, 'setitimer'): + + def arm_alarm(self, seconds): + _signal.setitimer(_signal.ITIMER_REAL, seconds) + else: # pragma: no cover + try: + from itimer import alarm as _itimer_alarm # noqa + except ImportError: + + def arm_alarm(self, seconds): # noqa + _signal.alarm(math.ceil(seconds)) + else: # pragma: no cover + + def arm_alarm(self, seconds): # noqa + return _itimer_alarm(seconds) # noqa + + 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_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): # noqa + """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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/result.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/result.py new file mode 100644 index 0000000..0c10d58 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/result.py @@ -0,0 +1,1067 @@ +"""Task results/state and results for groups of tasks.""" + +import datetime +import time +from collections import deque +from contextlib import contextmanager + +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 +from .utils.iso8601 import parse_iso8601 + +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 http://docs.celeryq.org/en/latest/userguide/tasks.html\ +#task-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 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. + 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)]) + + while stack: + parent, node = stack.popleft() + yield parent, node + if node.ready(): + stack.extend((node, child) for child in node.children or []) + else: + if not intermediate: + 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 __ne__(self, other): + res = self.__eq__(other) + return True if res is NotImplemented else not res + + 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 # noqa + 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 parse_iso8601(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=(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. + + Returns: + int: the number of tasks completed. + """ + 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 __ne__(self, other): + res = self.__eq__(other) + return True if res is NotImplemented else not res + + 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): # noqa + 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 + ResultSet.__init__(self, results, **kwargs) + + def _on_ready(self): + self.backend.remove_pending_result(self) + ResultSet._on_ready(self) + + 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 __ne__(self, other): + res = self.__eq__(other) + return True if res is NotImplemented else not res + + 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): + # 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.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, + } + + @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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/schedules.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/schedules.py new file mode 100644 index 0000000..3db64e4 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/schedules.py @@ -0,0 +1,835 @@ +"""Schedules define the intervals at which periodic tasks run.""" + +import numbers +import re +from bisect import bisect, bisect_left +from collections import namedtuple +from collections.abc import Iterable +from datetime import datetime, timedelta + +from kombu.utils.objects import cached_property + +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) + +__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}.\ +""" + + +def cronfield(s): + 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=None, app=None): + self.nowfun = nowfun + self._app = app + + def now(self): + return (self.nowfun or self.app.now)() + + def remaining_estimate(self, last_run_at): + raise NotImplementedError() + + def is_due(self, last_run_at): + raise NotImplementedError() + + def maybe_make_aware(self, dt): + return maybe_make_aware(dt, self.tz) + + @property + def app(self): + return self._app or current_app._get_current_object() + + @app.setter # noqa + def app(self, app): + self._app = app + + @cached_property + def tz(self): + return self.app.timezone + + @cached_property + def utc_enabled(self): + return self.app.conf.enable_utc + + def to_local(self, dt): + if not self.utc_enabled: + return timezone.to_local_fallback(dt) + return dt + + def __eq__(self, other): + 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 = False + + def __init__(self, run_every=None, relative=False, nowfun=None, app=None): + self.run_every = maybe_timedelta(run_every) + self.relative = relative + super().__init__(nowfun=nowfun, app=app) + + def remaining_estimate(self, last_run_at): + 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): + """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): + return f'' + + def __eq__(self, other): + if isinstance(other, schedule): + return self.run_every == other.run_every + return self.run_every == other + + def __ne__(self, other): + return not self.__eq__(other) + + def __reduce__(self): + return self.__class__, (self.run_every, self.relative, self.nowfun) + + @property + def seconds(self): + return max(self.run_every.total_seconds(), 0) + + @property + def human_seconds(self): + 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_=60, min_=0): + self.max_ = max_ + self.min_ = min_ + self.pats = ( + (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): + 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): + 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): + 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): + 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): + if not toks or not toks[0]: + raise self.ParseException('empty filter') + return self._expand_star()[::int(toks[0])] + + def _expand_star(self, *args): + return list(range(self.min_, self.max_ + self.min_)) + + def _expand_number(self, s): + if isinstance(s, str) and s[0] == '-': + raise self.ParseException('negative numbers not supported') + try: + i = int(s) + except ValueError: + 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='*', hour='*', day_of_week='*', + day_of_month='*', month_of_year='*', **kwargs): + 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) + + @staticmethod + def _expand_cronspec(cronspec, max_, min_=0): + """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, numbers.Integral): + 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) + else: + raise TypeError(CRON_INVALID_TYPE.format(type=type(cronspec))) + + # assure the result does not preceed 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, next_hour, next_minute): + """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, month, day): + try: + datetime(year=year, month=month, day=day) + except ValueError: + return True + return False + + def is_before_last_run(year, month, day): + return self.maybe_make_aware(datetime(year, + month, + day)) < last_run_at + + def roll_over(): + 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): + return CRON_REPR.format(self) + + def __reduce__(self): + 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): + # 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, tz=None, ffwd=ffwd): + # pylint: disable=redefined-outer-name + # caching global ffwd + tz = tz or self.tz + 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, ffwd=ffwd): + """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): + """Return tuple of ``(is_due, next_time_to_run)``. + + 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 = 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): + 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 __ne__(self, other): + res = self.__eq__(other) + if res is NotImplemented: + return True + return not res + + +def maybe_schedule(s, relative=False, app=None): + """Return schedule from number, timedelta, or actual schedule.""" + if s is not None: + if isinstance(s, numbers.Number): + 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 valus 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 (int): The latitude of the observer. + lon (int): 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, lat, lon, **kwargs): + 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): + return self.__class__, (self.event, self.lat, self.lon) + + def __repr__(self): + return ''.format( + self.event, self.lat, self.lon, + ) + + def remaining_estimate(self, last_run_at): + """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): + """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): + if isinstance(other, solar): + return ( + other.event == self.event and + other.lat == self.lat and + other.lon == self.lon + ) + return NotImplemented + + def __ne__(self, other): + res = self.__eq__(other) + if res is NotImplemented: + return True + return not res diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/security/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/security/__init__.py new file mode 100644 index 0000000..316ec1d --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/security/__init__.py @@ -0,0 +1,74 @@ +"""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 # noqa: 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, 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 + 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(), cf.read(), store, digest, serializer) + registry._set_default_serializer('auth') + + +def disable_untrusted_serializers(whitelist=None): + _disable_insecure_serializers(allowed=whitelist) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/security/certificate.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/security/certificate.py new file mode 100644 index 0000000..0f3fd86 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/security/certificate.py @@ -0,0 +1,97 @@ +"""X.509 certificates.""" +import datetime +import glob +import os + +from cryptography.hazmat.backends import default_backend +from cryptography.hazmat.primitives.asymmetric import padding +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 + +__all__ = ('Certificate', 'CertStore', 'FSCertStore') + + +class Certificate: + """X.509 certificate.""" + + def __init__(self, cert): + with reraise_errors( + 'Invalid certificate: {0!r}', errors=(ValueError,) + ): + self._cert = load_pem_x509_certificate( + ensure_bytes(cert), backend=default_backend()) + + def has_expired(self): + """Check if the certificate has expired.""" + return datetime.datetime.utcnow() >= self._cert.not_valid_after + + def get_pubkey(self): + """Get public key from certificate.""" + return self._cert.public_key() + + def get_serial_number(self): + """Return the serial number in the certificate.""" + return self._cert.serial_number + + def get_issuer(self): + """Return issuer (CA) as a string.""" + return ' '.join(x.value for x in self._cert.issuer) + + def get_id(self): + """Serial number/issuer pair uniquely identifies a certificate.""" + return f'{self.get_issuer()} {self.get_serial_number()}' + + def verify(self, data, signature, digest): + """Verify signature for string containing data.""" + with reraise_errors('Bad signature: {0!r}'): + + padd = padding.PSS( + mgf=padding.MGF1(digest), + salt_length=padding.PSS.MAX_LENGTH) + + self.get_pubkey().verify(signature, + ensure_bytes(data), padd, digest) + + +class CertStore: + """Base class for certificate stores.""" + + def __init__(self): + self._certs = {} + + def itercerts(self): + """Return certificate iterator.""" + yield from self._certs.values() + + def __getitem__(self, id): + """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): + 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): + CertStore.__init__(self) + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/security/key.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/security/key.py new file mode 100644 index 0000000..939d501 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/security/key.py @@ -0,0 +1,32 @@ +"""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 +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=password, + backend=default_backend()) + + def sign(self, data, digest): + """Sign string containing data.""" + with reraise_errors('Unable to sign data: {0!r}'): + + padd = padding.PSS( + mgf=padding.MGF1(digest), + salt_length=padding.PSS.MAX_LENGTH) + + return self._key.sign(ensure_bytes(data), padd, digest) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/security/serialization.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/security/serialization.py new file mode 100644 index 0000000..7284feb --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/security/serialization.py @@ -0,0 +1,101 @@ +"""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') + + +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( + bytes_to_str(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(bytes_to_str(body), payload['content_type'], + payload['content_encoding'], force=True) + + def _pack(self, body, content_type, content_encoding, signer, signature, + sep=str_to_bytes('\x00\x01')): + fields = sep.join( + ensure_bytes(s) for s in [signer, signature, content_type, + content_encoding, body] + ) + return b64encode(fields) + + def _unpack(self, payload, sep=str_to_bytes('\x00\x01')): + raw_payload = b64decode(ensure_bytes(payload)) + first_sep = raw_payload.find(sep) + + signer = raw_payload[:first_sep] + signer_cert = self._cert_store[signer] + + # shift 3 bits right to get signature length + # 2048bit rsa key has a signature length of 256 + # 4096bit rsa key has a signature length of 512 + sig_len = signer_cert.get_pubkey().key_size >> 3 + sep_len = len(sep) + signature_start_position = first_sep + sep_len + signature_end_position = signature_start_position + sig_len + signature = raw_payload[ + signature_start_position:signature_end_position + ] + + v = raw_payload[signature_end_position + sep_len:].split(sep) + + return { + 'signer': signer, + 'signature': signature, + 'content_type': bytes_to_str(v[0]), + 'content_encoding': bytes_to_str(v[1]), + 'body': bytes_to_str(v[2]), + } + + +def register_auth(key=None, cert=None, store=None, + digest=DEFAULT_SECURITY_DIGEST, + serializer='json'): + """Register security serializer.""" + s = SecureSerializer(key and PrivateKey(key), + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/security/utils.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/security/utils.py new file mode 100644 index 0000000..4714a94 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/security/utils.py @@ -0,0 +1,28 @@ +"""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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/signals.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/signals.py new file mode 100644 index 0000000..9be4f55 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/signals.py @@ -0,0 +1,152 @@ +"""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_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_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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/states.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/states.py new file mode 100644 index 0000000..e807ed4 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/states.py @@ -0,0 +1,151 @@ +"""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): + """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): + return precedence(self) < precedence(other) + + def __ge__(self, other): + return precedence(self) <= precedence(other) + + def __lt__(self, other): + return precedence(self) > precedence(other) + + def __le__(self, other): + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/__init__.py new file mode 100644 index 0000000..e905c24 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/__init__.py @@ -0,0 +1,37 @@ +"""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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/abstract.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/abstract.py new file mode 100644 index 0000000..81a0408 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/abstract.py @@ -0,0 +1,146 @@ +"""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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/collections.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/collections.py new file mode 100644 index 0000000..dc4bd23 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/collections.py @@ -0,0 +1,872 @@ +"""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 .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: # noqa + pass + LazySettings = LazyObject # noqa + +__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, value): + # type: (str, Any) -> 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) # noqa: E305 + + +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:], + ) + + 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=None): + # type: (Any) -> 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 __ne__(self, other): + # type: (Any) -> bool + return not self.__eq__(other) + + 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) # noqa: E305 + + +class Evictable: + """Mixin for classes supporting the ``evict`` method.""" + + Empty = Empty + + def evict(self): + # type: () -> None + """Force evict until maxsize is enforced.""" + self._evict(range=count) + + def _evict(self, limit=100, range=range): + # type: (int) -> None + try: + [self._evict1() for _ in range(limit)] + except IndexError: + pass + + def _evict1(self): + # type: () -> 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): + # type: () -> 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) # noqa: E305 + + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/debug.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/debug.py new file mode 100644 index 0000000..0641f1d --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/debug.py @@ -0,0 +1,193 @@ +"""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 # noqa + +__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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/deprecated.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/deprecated.py new file mode 100644 index 0000000..a08b08b --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/deprecated.py @@ -0,0 +1,113 @@ +"""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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/dispatch/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/dispatch/__init__.py new file mode 100644 index 0000000..b9329a7 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/dispatch/__init__.py @@ -0,0 +1,4 @@ +"""Observer pattern.""" +from .signal import Signal + +__all__ = ('Signal',) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/dispatch/signal.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/dispatch/signal.py new file mode 100644 index 0000000..b12759c --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/dispatch/signal.py @@ -0,0 +1,354 @@ +"""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)) + 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) + + 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 error propagates back through + send, terminating the dispatch loop, so it is quite possible to not + have all receivers called if a raises an error. + + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/functional.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/functional.py new file mode 100644 index 0000000..2878bc1 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/functional.py @@ -0,0 +1,392 @@ +"""Functional-style utilties.""" +import inspect +import sys +from collections import UserList +from functools import partial +from itertools import islice, tee, zip_longest + +from kombu.utils.functional import (LRUCache, dictfilter, is_list, lazy, + maybe_evaluate, maybe_list, memoize) +from vine import promise + +__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 __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, bound=False, debug=False): + """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 = hasattr(fun, '__call__') + 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, + ) + if debug: # pragma: no cover + print(definition, file=sys.stderr) + 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 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/graph.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/graph.py new file mode 100644 index 0000000..c1b0b55 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/graph.py @@ -0,0 +1,309 @@ +"""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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/imports.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/imports.py new file mode 100644 index 0000000..0303bd3 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/imports.py @@ -0,0 +1,157 @@ +"""Utilities related to importing modules and symbols by name.""" +import importlib +import os +import sys +import warnings +from contextlib import contextmanager +from importlib import reload + +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.""" + cwd = os.getcwd() + if 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 = importlib.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 = importlib.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): + try: + from pkg_resources import iter_entry_points + except ImportError: # pragma: no cover + return + + for ep in iter_entry_points(namespace): + yield ep.name, ':'.join([ep.module_name, ep.attrs[0]]) + + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/iso8601.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/iso8601.py new file mode 100644 index 0000000..4f9d183 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/iso8601.py @@ -0,0 +1,76 @@ +"""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 + - uses :class:`pytz.FixedOffset` + +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 + +from pytz import FixedOffset + +__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): + """Parse and convert ISO-8601 string to datetime.""" + 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 = FixedOffset(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 = FixedOffset(minutes + hours * 60) + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/log.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/log.py new file mode 100644 index 0000000..58f1947 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/log.py @@ -0,0 +1,293 @@ +"""Logging utilities.""" +import logging +import numbers +import os +import sys +import threading +import traceback +from contextlib import contextmanager + +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 signifiying 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): + logging.Formatter.__init__(self, fmt) + self.use_color = use_color + + def formatException(self, ei): + if ei and not isinstance(ei, tuple): + ei = sys.exc_info() + r = logging.Formatter.formatException(self, ei) + return r + + def format(self, record): + msg = logging.Formatter.format(self, 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 logging.Formatter.format(self, 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) + 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: # pragma: no cover + pass + else: + return util.get_logger() + + +def reset_multiprocessing_logger(): + """Reset multiprocessing logging setup.""" + try: + from billiard import util + except ImportError: # pragma: no cover + pass + else: + if hasattr(util, '_logger'): # pragma: no cover + util._logger = None + + +def current_process(): + try: + from billiard import process + except ImportError: # pragma: no cover + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/nodenames.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/nodenames.py new file mode 100644 index 0000000..b3d1a52 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/nodenames.py @@ -0,0 +1,102 @@ +"""Worker name utilities.""" +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): + """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, hostname): + """Create node name from name/hostname pair.""" + return NODENAME_SEP.join((name, hostname)) + + +def anon_nodename(hostname=None, prefix='gen'): + """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): + """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): + """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, name, **extra): + """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='', default='0'): + 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, host=None, name=None, **extra): + """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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/objects.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/objects.py new file mode 100644 index 0000000..56e96ff --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/objects.py @@ -0,0 +1,142 @@ +"""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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/saferepr.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/saferepr.py new file mode 100644 index 0000000..ec73e20 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/saferepr.py @@ -0,0 +1,272 @@ +"""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 .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 repsented 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. + try: + ashex = val.hex + except AttributeError: # pragma: no cover + # Python 3.4 + return val.decode('utf-8', errors='replace') + else: + # Python 3.5+ + return ashex() + + +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: # noqa + 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, seen=None, maxlevels=3, level=0, isinstance=isinstance): + """Streaming repr, yielding tokens.""" + # type: (deque, Set, int, int, Callable) -> Iterator[Any] + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/serialization.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/serialization.py new file mode 100644 index 0000000..af7804a --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/serialization.py @@ -0,0 +1,266 @@ +"""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 # noqa + +__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): # noqa + """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, pickle.dumps) + self.exc_module = exc_module + self.exc_cls_name = exc_cls_name + self.exc_args = safe_exc_args + self.text = text + Exception.__init__(self, 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): + return cls(exc.__class__.__module__, + exc.__class__.__name__, + getattr(exc, 'args', []), + safe_repr(exc)) + + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/static/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/static/__init__.py new file mode 100644 index 0000000..5051e5a --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/static/__init__.py @@ -0,0 +1,14 @@ +"""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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/static/celery_128.png b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/static/celery_128.png new file mode 100644 index 0000000..c3ff2d1 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/static/celery_128.png differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/sysinfo.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/sysinfo.py new file mode 100644 index 0000000..7032d4d --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/sysinfo.py @@ -0,0 +1,48 @@ +"""System information utilities.""" +import os +from math import ceil + +from kombu.utils.objects import cached_property + +__all__ = ('load_average', 'df') + + +if hasattr(os, 'getloadavg'): + + def _load_average(): + return tuple(ceil(l * 1e2) / 1e2 for l in os.getloadavg()) + +else: # pragma: no cover + # Windows doesn't have getloadavg + def _load_average(): # noqa + return (0.0, 0.0, 0.0) + + +def load_average(): + """Return system load average as a triple.""" + return _load_average() + + +class df: + """Disk information.""" + + def __init__(self, path): + self.path = path + + @property + def total_blocks(self): + return self.stat.f_blocks * self.stat.f_frsize / 1024 + + @property + def available(self): + return self.stat.f_bavail * self.stat.f_frsize / 1024 + + @property + def capacity(self): + 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): + return os.statvfs(os.path.abspath(self.path)) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/term.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/term.py new file mode 100644 index 0000000..01c60ad --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/term.py @@ -0,0 +1,179 @@ +"""Terminals and colors.""" +import base64 +import codecs +import os +import platform +import sys +from functools import reduce + +from celery.platforms import isatty + +__all__ = ('colored',) + +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): + 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, **kwargs): + self.s = s + self.enabled = not IS_WINDOWS and kwargs.get('enabled', True) + self.op = kwargs.get('op', '') + self.names = { + '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, b): + return str(a) + str(b) + + def _fold_no_color(self, a, b): + try: + A = a.no_color() + except AttributeError: + A = str(a) + try: + B = b.no_color() + except AttributeError: + B = str(b) + + return ''.join((str(A), str(B))) + + def no_color(self): + if self.s: + return str(reduce(self._fold_no_color, self.s)) + return '' + + def embed(self): + prefix = '' + if self.enabled: + prefix = self.op + return ''.join((str(prefix), str(reduce(self._add, self.s)))) + + def __str__(self): + suffix = '' + if self.enabled: + suffix = RESET_SEQ + return str(''.join((self.embed(), str(suffix)))) + + def node(self, s, op): + return self.__class__(enabled=self.enabled, op=op, *s) + + def black(self, *s): + return self.node(s, fg(30 + BLACK)) + + def red(self, *s): + return self.node(s, fg(30 + RED)) + + def green(self, *s): + return self.node(s, fg(30 + GREEN)) + + def yellow(self, *s): + return self.node(s, fg(30 + YELLOW)) + + def blue(self, *s): + return self.node(s, fg(30 + BLUE)) + + def magenta(self, *s): + return self.node(s, fg(30 + MAGENTA)) + + def cyan(self, *s): + return self.node(s, fg(30 + CYAN)) + + def white(self, *s): + return self.node(s, fg(30 + WHITE)) + + def __repr__(self): + return repr(self.no_color()) + + def bold(self, *s): + return self.node(s, OP_SEQ % 1) + + def underline(self, *s): + return self.node(s, OP_SEQ % 4) + + def blink(self, *s): + return self.node(s, OP_SEQ % 5) + + def reverse(self, *s): + return self.node(s, OP_SEQ % 7) + + def bright(self, *s): + return self.node(s, OP_SEQ % 8) + + def ired(self, *s): + return self.node(s, fg(40 + RED)) + + def igreen(self, *s): + return self.node(s, fg(40 + GREEN)) + + def iyellow(self, *s): + return self.node(s, fg(40 + YELLOW)) + + def iblue(self, *s): + return self.node(s, fg(40 + BLUE)) + + def imagenta(self, *s): + return self.node(s, fg(40 + MAGENTA)) + + def icyan(self, *s): + return self.node(s, fg(40 + CYAN)) + + def iwhite(self, *s): + return self.node(s, fg(40 + WHITE)) + + def reset(self, *s): + return self.node(s or [''], RESET_SEQ) + + def __add__(self, other): + return str(self) + str(other) + + +def supports_images(): + return isatty(sys.stdin) and ITERM_PROFILE + + +def _read_as_base64(path): + with codecs.open(path, mode='rb') as fh: + encoded = base64.b64encode(fh.read()) + return encoded if type(encoded) == 'str' else encoded.decode('ascii') + + +def imgcat(path, inline=1, preserve_aspect_ratio=0, **kwargs): + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/text.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/text.py new file mode 100644 index 0000000..d685f7b --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/text.py @@ -0,0 +1,205 @@ +"""Text formatting utilities.""" +import io +import re +from collections.abc import Callable +from functools import partial +from pprint import pformat +from textwrap import fill + +__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): + # type: (str) -> List[str] + """Convert string to list.""" + if isinstance(s, str): + return s.split(',') + return s + + +def dedent_initial(s, n=4): + # type: (str, int) -> str + """Remove identation from first line of text.""" + return s[n:] if s[:n] == ' ' * n else s + + +def dedent(s, n=4, sep='\n'): + # type: (str, int, str) -> str + """Remove identation.""" + return sep.join(dedent_initial(l) for l in s.splitlines()) + + +def fill_paragraphs(s, width, sep='\n'): + # type: (str, int, str) -> str + """Fill paragraphs with newlines (or custom separator).""" + return sep.join(fill(p, width) for p in s.split(sep)) + + +def join(l, sep='\n'): + # type: (str, str) -> str + """Concatenate list of strings.""" + return sep.join(v for v in l if v) + + +def ensure_sep(sep, s, n=2): + # type: (str, str, int) -> str + """Ensure text s ends in separator sep'.""" + return s + sep * (n - s.count(sep)) + + +ensure_newlines = partial(ensure_sep, '\n') + + +def abbr(S, max, ellipsis='...'): + # type: (str, int, str) -> str + """Abbreviate word.""" + if S is None: + return '???' + if len(S) > max: + return ellipsis and (S[:max - len(ellipsis)] + ellipsis) or S[:max] + return S + + +def abbrtask(S, max): + # type: (str, 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, indent=0, sep='\n'): + # type: (str, int, str) -> str + """Indent text.""" + return sep.join(' ' * indent + p for p in t.split(sep)) + + +def truncate(s, maxlen=128, suffix='...'): + # type: (str, int, 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, text, suffix='s'): + # type: (int, str, str) -> str + """Pluralize term when n is greater than one.""" + if n != 1: + return text + suffix + return text + + +def pretty(value, width=80, nl_width=80, sep='\n', **kw): + # type: (str, int, int, str, **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, other): + # type: (str, str) -> str + return s.upper() if other.isupper() else s.lower() + + +def simple_format(s, keys, pattern=RE_FORMAT, expand=r'\1'): + # type: (str, Mapping[str, str], Pattern, str) -> str + """Format string, expanding abbreviations in keys'.""" + if s: + keys.setdefault('%', '%') + + def resolve(match): + key = match.expand(expand) + try: + resolver = keys[key] + except KeyError: + raise ValueError(UNKNOWN_SIMPLE_FORMAT_KEY.format(key, s)) + if isinstance(resolver, Callable): + return resolver() + return resolver + + return pattern.sub(resolve, s) + return s + + +def remove_repeating_from_task(task_name, s): + # type: (str, 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, s): + # type: (str, 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=None, *a, **kw): + _SIO_init(self, v.decode() if isinstance(v, bytes) else v, *a, **kw) + + def write(self, data): + _SIO_write(self, data.decode() if isinstance(data, bytes) else data) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/threads.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/threads.py new file mode 100644 index 0000000..b080ca4 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/threads.py @@ -0,0 +1,331 @@ +"""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: # pragma: no cover + try: + from _thread import get_ident # noqa + except ImportError: + try: + from thread import get_ident # noqa + except ImportError: # pragma: no cover + try: + from _dummy_thread import get_ident # noqa + except ImportError: + from dummy_thread import get_ident # noqa + + +__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 indentifer 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 # noqa diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/time.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/time.py new file mode 100644 index 0000000..55f7fce --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/time.py @@ -0,0 +1,388 @@ +"""Utilities related to dates, times, intervals, and timezones.""" +import numbers +import os +import random +import time as _time +from calendar import monthrange +from datetime import date, datetime, timedelta, tzinfo + +from kombu.utils.functional import reprcall +from kombu.utils.objects import cached_property +from pytz import AmbiguousTimeError, FixedOffset +from pytz import timezone as _timezone +from pytz import utc + +from .functional import dictfilter +from .iso8601 import parse_iso8601 +from .text import pluralize + +__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))) + +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. + + Note: + Used only when the :setting:`enable_utc` setting is disabled. + """ + + _offset_cache = {} + + def __init__(self): + # 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 + tzinfo.__init__(self) + + def __repr__(self): + return f'' + + def utcoffset(self, dt): + return self.DSTOFFSET if self._isdst(dt) else self.STDOFFSET + + def dst(self, dt): + return self.DSTDIFF if self._isdst(dt) else ZERO + + def tzname(self, dt): + return _time.tzname[self._isdst(dt)] + + def fromutc(self, dt): + # The base tzinfo class no longer implements a DST + # offset aware .fromutc() in Python 3 (Issue #2306). + + # I'd rather rely on pytz to do this, than port + # the C code from cpython's fromutc [asksol] + offset = int(self.utcoffset(dt).seconds / 60.0) + try: + tz = self._offset_cache[offset] + except KeyError: + tz = self._offset_cache[offset] = FixedOffset(offset) + return tz.fromutc(dt.replace(tzinfo=tz)) + + def _isdst(self, dt): + 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: + + def tz_or_local(self, tzinfo=None): + # pylint: disable=redefined-outer-name + if tzinfo is None: + return self.local + return self.get_timezone(tzinfo) + + def to_local(self, dt, local=None, orig=None): + 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): + # 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): + if is_naive(dt): + return make_aware(dt, self.local) + return localize(dt, self.local) + + def get_timezone(self, zone): + if isinstance(zone, str): + return _timezone(zone) + return zone + + @cached_property + def local(self): + return LocalTimezone() + + @cached_property + def utc(self): + return self.get_timezone('UTC') + + +timezone = _Zone() + + +def maybe_timedelta(delta): + """Convert integer to timedelta, if argument is an integer.""" + if isinstance(delta, numbers.Real): + return timedelta(seconds=delta) + return delta + + +def delta_resolution(dt, delta): + """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, ends_in, now=None, relative=False): + """Calculate the 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.utcnow`. + + Returns: + ~datetime.timedelta: Remaining time. + """ + now = now or datetime.utcnow() + if str(start.tzinfo) == str(now.tzinfo) and now.utcoffset() != start.utcoffset(): + # DST started/ended + start = start.replace(tzinfo=now.tzinfo) + end_date = start + ends_in + if relative: + end_date = delta_resolution(end_date, ends_in).replace(microsecond=0) + ret = end_date - now + if C_REMDEBUG: # pragma: no cover + print('rem: NOW:{!r} START:{!r} ENDS_IN:{!r} END_DATE:{} REM:{}'.format( + now, start, ends_in, end_date, ret)) + return ret + + +def rate(r): + """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): + """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 humanize_seconds(secs, prefix='', sep='', now='now', microseconds=False): + """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): + """Either ``datetime | str -> datetime`` or ``None -> None``.""" + if not dt: + return + if isinstance(dt, datetime): + return dt + return parse_iso8601(dt) + + +def is_naive(dt): + """Return :const:`True` if :class:`~datetime.datetime` is naive.""" + return dt.tzinfo is None or dt.tzinfo.utcoffset(dt) is None + + +def make_aware(dt, tz): + """Set timezone for a :class:`~datetime.datetime` object.""" + try: + _localize = tz.localize + except AttributeError: + return dt.replace(tzinfo=tz) + else: + # works on pytz timezones + try: + return _localize(dt, is_dst=None) + except AmbiguousTimeError: + return min(_localize(dt, is_dst=True), + _localize(dt, is_dst=False)) + + +def localize(dt, tz): + """Convert aware :class:`~datetime.datetime` to another timezone.""" + if is_naive(dt): # Ensure timezone aware datetime + dt = make_aware(dt, tz) + if dt.tzinfo == utc: + dt = dt.astimezone(tz) # Always safe to call astimezone on utc zones + try: + _normalize = tz.normalize + except AttributeError: # non-pytz tz + return dt + else: + try: + return _normalize(dt, is_dst=None) + except TypeError: + return _normalize(dt) + except AmbiguousTimeError: + return min(_normalize(dt, is_dst=True), + _normalize(dt, is_dst=False)) + + +def to_utc(dt): + """Convert naive :class:`~datetime.datetime` to UTC.""" + return make_aware(dt, timezone.utc) + + +def maybe_make_aware(dt, tz=None): + """Convert dt to aware datetime, do nothing if dt is already aware.""" + if is_naive(dt): + 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): + # 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): + return reprcall('ffwd', (), self._fields(weeks=self.weeks, + weekday=self.weekday)) + + def __radd__(self, other): + 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): + 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=_time, localtime=_time.localtime): + """Return the current offset to UTC in hours.""" + if localtime().tm_isdst: + return time.altzone // 3600 + return time.timezone // 3600 + + +def adjust_timestamp(ts, offset, here=utcoffset): + """Adjust timestamp based on provided utcoffset.""" + return ts - (offset - here()) * 3600 + + +def get_exponential_backoff_interval( + factor, + retries, + maximum, + full_jitter=False +): + """Calculate the exponential backoff wait time.""" + # Will be zero if factor equals 0 + countdown = min(maximum, factor * (2 ** retries)) + # Full jitter according to + # https://www.awsarchitectureblog.com/2015/03/backoff.html + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/timer2.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/timer2.py new file mode 100644 index 0000000..8233725 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/utils/timer2.py @@ -0,0 +1,154 @@ +"""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 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 = False + on_tick = None + + _timer_count = count(1) + + if TIMER_DEBUG: # pragma: no cover + def start(self, *args, **kwargs): + import traceback + print('- Timer starting') + traceback.print_stack() + super().start(*args, **kwargs) + + def __init__(self, schedule=None, on_error=None, on_tick=None, + on_start=None, max_interval=None, **kwargs): + 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 + threading.Thread.__init__(self) + # `_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): + with self.not_empty: + 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): + try: + self.running = True + self.scheduler = 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): + self.__is_shutdown.set() + if self.running: + self.__is_stopped.wait() + self.join(THREAD_TIMEOUT_MAX) + self.running = False + + def ensure_started(self): + if not self.running and not self.is_alive(): + if self.on_start: + self.on_start(self) + self.start() + + def _do_enter(self, meth, *args, **kwargs): + self.ensure_started() + with self.mutex: + entry = getattr(self.schedule, meth)(*args, **kwargs) + self.not_empty.notify() + return entry + + def enter(self, entry, eta, priority=None): + return self._do_enter('enter_at', entry, eta, priority=priority) + + def call_at(self, *args, **kwargs): + return self._do_enter('call_at', *args, **kwargs) + + def enter_after(self, *args, **kwargs): + return self._do_enter('enter_after', *args, **kwargs) + + def call_after(self, *args, **kwargs): + return self._do_enter('call_after', *args, **kwargs) + + def call_repeatedly(self, *args, **kwargs): + return self._do_enter('call_repeatedly', *args, **kwargs) + + def exit_after(self, secs, priority=10): + self.call_after(secs, sys.exit, priority) + + def cancel(self, tref): + tref.cancel() + + def clear(self): + self.schedule.clear() + + def empty(self): + return not len(self) + + def __len__(self): + return len(self.schedule) + + def __bool__(self): + """``bool(timer)``.""" + return True + __nonzero__ = __bool__ + + @property + def queue(self): + return self.schedule.queue diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/__init__.py new file mode 100644 index 0000000..5110680 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/__init__.py @@ -0,0 +1,4 @@ +"""Worker implementation.""" +from .worker import WorkController + +__all__ = ('WorkController',) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/autoscale.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/autoscale.py new file mode 100644 index 0000000..e5b9024 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/autoscale.py @@ -0,0 +1,154 @@ +"""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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/components.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/components.py new file mode 100644 index 0000000..d033872 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/components.py @@ -0,0 +1,240 @@ +"""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: # pragma: no cover + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/consumer/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/consumer/__init__.py new file mode 100644 index 0000000..129801f --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/consumer/__init__.py @@ -0,0 +1,15 @@ +"""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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/consumer/agent.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/consumer/agent.py new file mode 100644 index 0000000..ca6d120 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/consumer/agent.py @@ -0,0 +1,21 @@ +"""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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/consumer/connection.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/consumer/connection.py new file mode 100644 index 0000000..2992dc8 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/consumer/connection.py @@ -0,0 +1,36 @@ +"""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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/consumer/consumer.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/consumer/consumer.py new file mode 100644 index 0000000..c72493f --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/consumer/consumer.py @@ -0,0 +1,621 @@ +"""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) +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, + 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 +http://docs.celeryq.org/en/latest/internals/protocol.html +for more information. + +The full contents of the message body was: +%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: +http://docs.celeryq.org/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. +""" # noqa: E501 + + +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 + + 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.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 + + # 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 + try: + blueprint.start(self) + except self.connection_errors as exc: + # If we're not retrying connections, no need to catch + # connection errors + if not self.app.conf.broker_connection_retry: + raise + if isinstance(exc, OSError) and exc.errno == errno.EMFILE: + raise # Too many open files + 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 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) + + 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.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() + 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, heartbeat=None): + return self.ensure_connected( + self.app.connection_for_write(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. + if not self.app.conf.broker_connection_retry: + # retry disabled, just call connect directly. + conn.connect() + return conn + + conn = conn.ensure_connection( + _error_handler, self.app.conf.broker_connection_max_retries, + callback=maybe_shutdown, + ) + 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), + 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: + strategy( + message, payload, + promise(call_soon, (message.ack_log_error,)), + promise(call_soon, (message.reject_log_error,)), + 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 __repr__(self): + """``repr(self)``.""" + return ''.format( + self=self, state=self.blueprint.human_state(), + ) + + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/consumer/control.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/consumer/control.py new file mode 100644 index 0000000..b0ca3ef --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/consumer/control.py @@ -0,0 +1,33 @@ +"""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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/consumer/events.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/consumer/events.py new file mode 100644 index 0000000..7ff4735 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/consumer/events.py @@ -0,0 +1,68 @@ +"""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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/consumer/gossip.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/consumer/gossip.py new file mode 100644 index 0000000..16e1c2e --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/consumer/gossip.py @@ -0,0 +1,205 @@ +"""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), + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/consumer/heart.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/consumer/heart.py new file mode 100644 index 0000000..076f5f9 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/consumer/heart.py @@ -0,0 +1,36 @@ +"""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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/consumer/mingle.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/consumer/mingle.py new file mode 100644 index 0000000..532ab75 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/consumer/mingle.py @@ -0,0 +1,76 @@ +"""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'} + + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/consumer/tasks.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/consumer/tasks.py new file mode 100644 index 0000000..a912714 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/consumer/tasks.py @@ -0,0 +1,65 @@ +"""Worker Task Consumer Bootstep.""" +from kombu.common import QoS, ignore_errors + +from celery import bootsteps +from celery.utils.log import get_logger + +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() + + # - RabbitMQ 3.3 completely redefines how basic_qos works.. + # This will detect if the new qos smenatics 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 + + # 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'} diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/control.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/control.py new file mode 100644 index 0000000..9d8a679 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/control.py @@ -0,0 +1,557 @@ +"""Worker remote control command implementations.""" +import io +import tempfile +from collections import UserDict, namedtuple + +from billiard.common import TERM_SIGNAME +from kombu.utils.encoding import safe_repr + +from celery.exceptions import WorkerShutdown +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 + 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 ok(f'tasks {idstr} flagged as revoked') + + +@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.task.base.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) + 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, **kwargs): + """List of tasks currently being executed.""" + return [request.info() + 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(msg) + + +# -- 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/heartbeat.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/heartbeat.py new file mode 100644 index 0000000..efdcc3b --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/heartbeat.py @@ -0,0 +1,61 @@ +"""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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/loops.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/loops.py new file mode 100644 index 0000000..b60d95c --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/loops.py @@ -0,0 +1,116 @@ +"""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): + if connection: + tick = connection.heartbeat_check + heartbeat = connection.get_heartbeat_interval() # negotiated + if heartbeat and connection.supports_heartbeats: + timer.call_repeatedly(heartbeat / rate, tick, (rate,)) + + +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() + + _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() + + # 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 + if getattr(obj.pool, 'is_green', False): + _enable_amqheartbeats(obj.timer, connection, rate=hbrate) + consumer.on_message = on_task_received + consumer.consume() + + obj.on_ready() + + while blueprint.state == RUN and obj.connection: + state.maybe_shutdown() + 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 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/pidbox.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/pidbox.py new file mode 100644 index 0000000..a18b433 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/pidbox.py @@ -0,0 +1,122 @@ +"""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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/request.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/request.py new file mode 100644 index 0000000..1760fa4 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/request.py @@ -0,0 +1,729 @@ +"""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 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.exceptions import (Ignore, InvalidTaskError, Reject, Retry, + TaskRevokedError, Terminated, + TimeLimitExceeded, WorkerLostError) +from celery.platforms import signals as _signals +from celery.utils.functional import maybe, 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__() # noqa: E305 + +# 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 + + +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 if headers is None else headers + 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'), + } + self._request_dict.update({ + '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 # noqa + def task_id(self, value): + self.id = value + + @property + def task_name(self): + # XXX compat + return self.name + + @task_name.setter # noqa + 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 correlation_id(self): + # used similarly to reply_to + return self._request_dict['correlation_id'] + + def execute_using_pool(self, pool, **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() + if self.id in revoked_tasks: + info('Discarding revoked task: %s[%s]', 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: + if isinstance(retval.exception, (SystemExit, KeyboardInterrupt)): + raise retval.exception + 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 + + 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 + ) + 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, + ) + + 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, + 'kwargs': self._kwargs, + '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.expires or task_id in revoked_tasks) and 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: + if isinstance(retval.exception, ( + SystemExit, KeyboardInterrupt)): + raise retval.exception + return self.on_failure(retval, return_ok=True) + task_ready(self) + + if acks_late: + self.acknowledge() + + if events: + self.send_event( + 'task-succeeded', result=retval, runtime=runtime, + ) + + return Request diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/state.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/state.py new file mode 100644 index 0000000..5b2ed68 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/state.py @@ -0,0 +1,282 @@ +"""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 = 50000 + +#: maximum number of successful tasks to keep in memory. +SUCCESSFUL_MAX = 1000 + +#: how many seconds a revoke will be active before +#: being expired when the max limit has been exceeded. +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 = 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) + +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() + + +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_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_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): # noqa + """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): # noqa + """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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/strategy.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/strategy.py new file mode 100644 index 0000000..09bdea7 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/strategy.py @@ -0,0 +1,202 @@ +"""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} + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/worker.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/worker.py new file mode 100644 index 0000000..382802a --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery/worker/worker.py @@ -0,0 +1,410 @@ +"""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 + +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: # pragma: no cover + resource = None # noqa + + +__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.utcnow() + 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.""" + 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.""" + 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.utcnow() - 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) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress-0.1.1.dist-info/INSTALLER b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress-0.1.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress-0.1.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress-0.1.1.dist-info/LICENSE b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress-0.1.1.dist-info/LICENSE new file mode 100644 index 0000000..326b2dc --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress-0.1.1.dist-info/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 Cory Zue + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress-0.1.1.dist-info/METADATA b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress-0.1.1.dist-info/METADATA new file mode 100644 index 0000000..7dc7418 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress-0.1.1.dist-info/METADATA @@ -0,0 +1,226 @@ +Metadata-Version: 2.1 +Name: celery-progress +Version: 0.1.1 +Summary: Drop in, configurable, dependency-free progress bars for your Django/Celery applications. +Home-page: https://github.com/czue/celery-progress +Author: Cory Zue +Author-email: cory@coryzue.com +License: MIT License +Platform: UNKNOWN +Classifier: Environment :: Web Environment +Classifier: Framework :: Django +Classifier: Framework :: Django :: 1.11 +Classifier: Framework :: Django :: 2.0 +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3.5 +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: Topic :: Internet :: WWW/HTTP +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Description-Content-Type: text/markdown +License-File: LICENSE +Provides-Extra: rabbitmq +Requires-Dist: channels-rabbitmq ; extra == 'rabbitmq' +Provides-Extra: redis +Requires-Dist: channels-redis ; extra == 'redis' +Provides-Extra: websockets +Requires-Dist: channels ; extra == 'websockets' + +# Celery Progress Bars for Django + +Drop in, dependency-free progress bars for your Django/Celery applications. + +Super simple setup. Lots of customization available. + +## Demo + +[Celery Progress Bar demo on Build With Django](https://buildwithdjango.com/projects/celery-progress/) + +### Github demo application: build a download progress bar for Django +Starting with Celery can be challenging, [eeintech](https://github.com/eeintech) built a complete [Django demo application](https://github.com/eeintech/django-celery-progress-demo) along with a [step-by-step guide](https://eeinte.ch/stream/progress-bar-django-using-celery/) to get you started on building your own progress bar! + +## Installation + +If you haven't already, make sure you have properly [set up celery in your project](https://docs.celeryproject.org/en/stable/getting-started/first-steps-with-celery.html#first-steps). + +Then install this library: + +```bash +pip install celery-progress +``` + +## Usage + +### Prerequisites + +First add `celery_progress` to your `INSTALLED_APPS` in `settings.py`. + +Then add the following url config to your main `urls.py`: + +```python +from django.urls import re_path, include +re_path(r'^celery-progress/', include('celery_progress.urls')), # the endpoint is configurable +``` + +### Recording Progress + +In your task you should add something like this: + +```python +from celery import shared_task +from celery_progress.backend import ProgressRecorder +import time + +@shared_task(bind=True) +def my_task(self, seconds): + progress_recorder = ProgressRecorder(self) + result = 0 + for i in range(seconds): + time.sleep(1) + result += i + progress_recorder.set_progress(i + 1, seconds) + return result +``` + +You can add an optional progress description like this: + +```python + progress_recorder.set_progress(i + 1, seconds, description='my progress description') +``` + +### Displaying progress + +In the view where you call the task you need to get the task ID like so: + +**views.py** +```python +def progress_view(request): + result = my_task.delay(10) + return render(request, 'display_progress.html', context={'task_id': result.task_id}) +``` + +Then in the page you want to show the progress bar you just do the following. + +#### Add the following HTML wherever you want your progress bar to appear: + +**display_progress.html** +```html +
+
 
+
+
Waiting for progress to start...
+``` + +#### Import the javascript file. + +**display_progress.html** +```html + +``` + +#### Initialize the progress bar: + +```javascript +// vanilla JS version +document.addEventListener("DOMContentLoaded", function () { + var progressUrl = "{% url 'celery_progress:task_status' task_id %}"; + CeleryProgressBar.initProgressBar(progressUrl); +}); +``` + +or + +```javascript +// JQuery +$(function () { + var progressUrl = "{% url 'celery_progress:task_status' task_id %}"; + CeleryProgressBar.initProgressBar(progressUrl) +}); +``` + +### Displaying the result of a task + +If you'd like you can also display the result of your task on the front end. + +To do that follow the steps below. Result handling can also be customized. + +#### Initialize the result block: + +This is all that's needed to render the result on the page. + +**display_progress.html** +```html +
+``` + +But more likely you will want to customize how the result looks, which can be done as below: + +```javascript +// JQuery +var progressUrl = "{% url 'celery_progress:task_status' task_id %}"; + +function customResult(resultElement, result) { + $( resultElement ).append( + $('

').text('Sum of all seconds is ' + result) + ); +} + +$(function () { + CeleryProgressBar.initProgressBar(progressUrl, { + onResult: customResult, + }) +}); +``` + +## Customization + +The `initProgressBar` function takes an optional object of options. The following options are supported: + +| Option | What it does | Default Value | +|--------|--------------|---------------| +| pollInterval | How frequently to poll for progress (in milliseconds) | 500 | +| progressBarId | Override the ID used for the progress bar | 'progress-bar' | +| progressBarMessageId | Override the ID used for the progress bar message | 'progress-bar-message' | +| progressBarElement | Override the *element* used for the progress bar. If specified, progressBarId will be ignored. | document.getElementById(progressBarId) | +| progressBarMessageElement | Override the *element* used for the progress bar message. If specified, progressBarMessageId will be ignored. | document.getElementById(progressBarMessageId) | +| resultElementId | Override the ID used for the result | 'celery-result' | +| resultElement | Override the *element* used for the result. If specified, resultElementId will be ignored. | document.getElementById(resultElementId) | +| onProgress | function to call when progress is updated | onProgressDefault | +| onSuccess | function to call when progress successfully completes | onSuccessDefault | +| onError | function to call on a known error with no specified handler | onErrorDefault | +| onRetry | function to call when a task attempts to retry | onRetryDefault | +| onIgnored | function to call when a task result is ignored | onIgnoredDefault | +| onTaskError | function to call when progress completes with an error | onError | +| onNetworkError | function to call on a network error (ignored by WebSocket) | onError | +| onHttpError | function to call on a non-200 response (ignored by WebSocket) | onError | +| onDataError | function to call on a response that's not JSON or has invalid schema due to a programming error | onError | +| onResult | function to call when returned non empty result | CeleryProgressBar.onResultDefault | +| barColors | dictionary containing color values for various progress bar states. Colors that are not specified will defer to defaults | barColorsDefault | + +The `barColors` option allows you to customize the color of each progress bar state by passing a dictionary of key-value pairs of `state: #hexcode`. The defaults are shown below. + +| State | Hex Code | Image Color | +|-------|----------|:-------------:| +| success | #76ce60 | ![#76ce60](https://placehold.it/15/76ce60/000000?text=+) | +| error | #dc4f63 | ![#dc4f63](https://placehold.it/15/dc4f63/000000?text=+) | +| progress | #68a9ef | ![#68a9ef](https://placehold.it/15/68a9ef/000000?text=+) | +| ignored | #7a7a7a | ![#7a7a7a](https://placehold.it/15/7a7a7a/000000?text=+) | + +# WebSocket Support + +Additionally, this library offers WebSocket support using [Django Channels](https://channels.readthedocs.io/en/latest/) +courtesy of [EJH2](https://github.com/EJH2/). + +A working example project leveraging WebSockets is [available here](https://github.com/EJH2/cp_ws-example). + +To use WebSockets, install with `pip install celery-progress[websockets,redis]` or +`pip install celery-progress[websockets,rabbitmq]` (depending on broker dependencies). + +See `WebSocketProgressRecorder` and `websockets.js` for details. + + diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress-0.1.1.dist-info/RECORD b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress-0.1.1.dist-info/RECORD new file mode 100644 index 0000000..9830196 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress-0.1.1.dist-info/RECORD @@ -0,0 +1,31 @@ +../../../static/celery_progress/celery_progress.js,sha256=JJu0hLszuE5bstTctqcVxzP63BVv4rQhsuCYkYdxICk,7097 +../../../static/celery_progress/websockets.js,sha256=eK0jN78R48OOvp_XqRK6y-SxLJkpGb2FGDuJLfAQELw,1014 +celery_progress-0.1.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +celery_progress-0.1.1.dist-info/LICENSE,sha256=wpecdUT65cplKo35MRqfXciAzfuKM6GDSAq7T18yQTE,1065 +celery_progress-0.1.1.dist-info/METADATA,sha256=nA730-ETxhemPxcIbjjH9daxbEeVtldtt8qd0AdzGwA,8421 +celery_progress-0.1.1.dist-info/RECORD,, +celery_progress-0.1.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +celery_progress-0.1.1.dist-info/WHEEL,sha256=OqRkF0eY5GHssMorFjlbTIq072vpHpF60fIQA6lS9xA,92 +celery_progress-0.1.1.dist-info/top_level.txt,sha256=MH5Zn5_Hq1MtfSYgctTD6_qf-DXdloSuiumiO1KQMIw,16 +celery_progress/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +celery_progress/__pycache__/__init__.cpython-38.pyc,, +celery_progress/__pycache__/backend.cpython-38.pyc,, +celery_progress/__pycache__/tasks.cpython-38.pyc,, +celery_progress/__pycache__/urls.cpython-38.pyc,, +celery_progress/__pycache__/views.cpython-38.pyc,, +celery_progress/backend.py,sha256=n99-IyFSD2MZXWFemc_qCub6bFOzdeRuPWqhryquL5Y,4704 +celery_progress/static/celery_progress/celery_progress.js,sha256=JJu0hLszuE5bstTctqcVxzP63BVv4rQhsuCYkYdxICk,7097 +celery_progress/static/celery_progress/websockets.js,sha256=eK0jN78R48OOvp_XqRK6y-SxLJkpGb2FGDuJLfAQELw,1014 +celery_progress/tasks.py,sha256=geQwdgzsUr1P7zs5AS9yarfJTZaPNI5nFVAbERi8VHc,441 +celery_progress/urls.py,sha256=sVNeKrGcKHSi7H8AcgUxCzPIpvI6-LF84Vj4MzGcTuk,179 +celery_progress/views.py,sha256=OfGJ7une5-V3F5OANgf87ekxgSAvJ1O32vDJD1auHNo,372 +celery_progress/websockets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +celery_progress/websockets/__pycache__/__init__.cpython-38.pyc,, +celery_progress/websockets/__pycache__/backend.cpython-38.pyc,, +celery_progress/websockets/__pycache__/consumers.cpython-38.pyc,, +celery_progress/websockets/__pycache__/routing.cpython-38.pyc,, +celery_progress/websockets/__pycache__/tasks.cpython-38.pyc,, +celery_progress/websockets/backend.py,sha256=IrpH_KMu6XaWbU9uknkHH8CHqvPwsdWz8x9TgVYKZ18,1664 +celery_progress/websockets/consumers.py,sha256=vFvJiu9q6po73UOvlP2NVK0NAQgOJ1RMoPNU3OABrQc,1173 +celery_progress/websockets/routing.py,sha256=s5YcgP9rHUAzXfr_7o4jRema_fhj7voDg7IdrtI9GZ4,429 +celery_progress/websockets/tasks.py,sha256=ZlUybSE50eLZiRzH_bNB5xKXAa0ODCXOYqmy9dCgLaA,1222 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress-0.1.1.dist-info/REQUESTED b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress-0.1.1.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress-0.1.1.dist-info/WHEEL b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress-0.1.1.dist-info/WHEEL new file mode 100644 index 0000000..385faab --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress-0.1.1.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.36.2) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress-0.1.1.dist-info/top_level.txt b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress-0.1.1.dist-info/top_level.txt new file mode 100644 index 0000000..ce6004d --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress-0.1.1.dist-info/top_level.txt @@ -0,0 +1 @@ +celery_progress diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress/backend.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress/backend.py new file mode 100644 index 0000000..bf3cbd1 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress/backend.py @@ -0,0 +1,151 @@ +import datetime +import logging +from abc import ABCMeta, abstractmethod +from decimal import Decimal + +from celery.result import EagerResult, allow_join_result +from celery.backends.base import DisabledBackend + +logger = logging.getLogger(__name__) + +PROGRESS_STATE = 'PROGRESS' + + +class AbstractProgressRecorder(object): + __metaclass__ = ABCMeta + + @abstractmethod + def set_progress(self, current, total, description=""): + pass + + +class ConsoleProgressRecorder(AbstractProgressRecorder): + + def set_progress(self, current, total, description=""): + print('processed {} items of {}. {}'.format(current, total, description)) + + +class ProgressRecorder(AbstractProgressRecorder): + + def __init__(self, task): + self.task = task + + def set_progress(self, current, total, description=""): + percent = 0 + if total > 0: + percent = (Decimal(current) / Decimal(total)) * Decimal(100) + percent = float(round(percent, 2)) + state = PROGRESS_STATE + meta = { + 'pending': False, + 'current': current, + 'total': total, + 'percent': percent, + 'description': description + } + self.task.update_state( + state=state, + meta=meta + ) + return state, meta + + +class Progress(object): + + def __init__(self, result): + """ + result: + an AsyncResult or an object that mimics it to a degree + """ + self.result = result + + def get_info(self): + response = {'state': self.result.state} + if self.result.state in ['SUCCESS', 'FAILURE']: + success = self.result.successful() + with allow_join_result(): + response.update({ + 'complete': True, + 'success': success, + 'progress': _get_completed_progress(), + 'result': self.result.get(self.result.id) if success else str(self.result.info), + }) + elif self.result.state in ['RETRY', 'REVOKED']: + if self.result.state == 'RETRY': + retry = self.result.info + when = str(retry.when) if isinstance(retry.when, datetime.datetime) else str( + datetime.datetime.now() + datetime.timedelta(seconds=retry.when)) + result = {'when': when, 'message': retry.message or str(retry.exc)} + else: + result = 'Task ' + str(self.result.info) + response.update({ + 'complete': True, + 'success': False, + 'progress': _get_completed_progress(), + 'result': result, + }) + elif self.result.state == 'IGNORED': + response.update({ + 'complete': True, + 'success': None, + 'progress': _get_completed_progress(), + 'result': str(self.result.info) + }) + elif self.result.state == PROGRESS_STATE: + response.update({ + 'complete': False, + 'success': None, + 'progress': self.result.info, + }) + elif self.result.state in ['PENDING', 'STARTED']: + response.update({ + 'complete': False, + 'success': None, + 'progress': _get_unknown_progress(self.result.state), + }) + else: + logger.error('Task %s has unknown state %s with metadata %s', self.result.id, self.result.state, self.result.info) + response.update({ + 'complete': True, + 'success': False, + 'progress': _get_unknown_progress(self.result.state), + 'result': 'Unknown state {}'.format(self.result.state), + }) + return response + + +class KnownResult(EagerResult): + """Like EagerResult but supports non-ready states.""" + def __init__(self, id, ret_value, state, traceback=None): + """ + ret_value: + result, exception, or progress metadata + """ + # set backend to get state groups (like READY_STATES in ready()) + self.backend = DisabledBackend + super().__init__(id, ret_value, state, traceback) + + def ready(self): + return super(EagerResult, self).ready() + + def __del__(self): + # throws an exception if not overridden + pass + + +def _get_completed_progress(): + return { + 'pending': False, + 'current': 100, + 'total': 100, + 'percent': 100, + } + + +def _get_unknown_progress(state): + return { + 'pending': state == 'PENDING', + 'current': 0, + 'total': 100, + 'percent': 0, + } diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress/static/celery_progress/celery_progress.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress/static/celery_progress/celery_progress.js new file mode 100644 index 0000000..4fa178c --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress/static/celery_progress/celery_progress.js @@ -0,0 +1,167 @@ +class CeleryProgressBar { + + constructor(progressUrl, options) { + this.progressUrl = progressUrl; + options = options || {}; + let progressBarId = options.progressBarId || 'progress-bar'; + let progressBarMessage = options.progressBarMessageId || 'progress-bar-message'; + this.progressBarElement = options.progressBarElement || document.getElementById(progressBarId); + this.progressBarMessageElement = options.progressBarMessageElement || document.getElementById(progressBarMessage); + this.onProgress = options.onProgress || this.onProgressDefault; + this.onSuccess = options.onSuccess || this.onSuccessDefault; + this.onError = options.onError || this.onErrorDefault; + this.onTaskError = options.onTaskError || this.onTaskErrorDefault; + this.onDataError = options.onDataError || this.onError; + this.onRetry = options.onRetry || this.onRetryDefault; + this.onIgnored = options.onIgnored || this.onIgnoredDefault; + let resultElementId = options.resultElementId || 'celery-result'; + this.resultElement = options.resultElement || document.getElementById(resultElementId); + this.onResult = options.onResult || this.onResultDefault; + // HTTP options + this.onNetworkError = options.onNetworkError || this.onError; + this.onHttpError = options.onHttpError || this.onError; + this.pollInterval = options.pollInterval || 500; + // Other options + let barColorsDefault = { + success: '#76ce60', + error: '#dc4f63', + progress: '#68a9ef', + ignored: '#7a7a7a' + } + this.barColors = Object.assign({}, barColorsDefault, options.barColors); + } + + onSuccessDefault(progressBarElement, progressBarMessageElement, result) { + result = this.getMessageDetails(result); + progressBarElement.style.backgroundColor = this.barColors.success; + progressBarMessageElement.textContent = "Success! " + result; + } + + onResultDefault(resultElement, result) { + if (resultElement) { + resultElement.textContent = result; + } + } + + /** + * Default handler for all errors. + * @param data - A Response object for HTTP errors, undefined for other errors + */ + onErrorDefault(progressBarElement, progressBarMessageElement, excMessage, data) { + progressBarElement.style.backgroundColor = this.barColors.error; + excMessage = excMessage || ''; + progressBarMessageElement.textContent = "Uh-Oh, something went wrong! " + excMessage; + } + + onTaskErrorDefault(progressBarElement, progressBarMessageElement, excMessage) { + let message = this.getMessageDetails(excMessage); + this.onError(progressBarElement, progressBarMessageElement, message); + } + + onRetryDefault(progressBarElement, progressBarMessageElement, excMessage, retryWhen) { + retryWhen = new Date(retryWhen); + let message = 'Retrying in ' + Math.round((retryWhen.getTime() - Date.now())/1000) + 's: ' + excMessage; + this.onError(progressBarElement, progressBarMessageElement, message); + } + + onIgnoredDefault(progressBarElement, progressBarMessageElement, result) { + progressBarElement.style.backgroundColor = this.barColors.ignored; + progressBarMessageElement.textContent = result || 'Task result ignored!' + } + + onProgressDefault(progressBarElement, progressBarMessageElement, progress) { + progressBarElement.style.backgroundColor = this.barColors.progress; + progressBarElement.style.width = progress.percent + "%"; + var description = progress.description || ""; + if (progress.current == 0) { + if (progress.pending === true) { + progressBarMessageElement.textContent = 'Waiting for task to start...'; + } else { + progressBarMessageElement.textContent = 'Task started...'; + } + } else { + progressBarMessageElement.textContent = progress.current + ' of ' + progress.total + ' processed. ' + description; + } + } + + getMessageDetails(result) { + if (this.resultElement) { + return '' + } else { + return result || ''; + } + } + + /** + * Process update message data. + * @return true if the task is complete, false if it's not, undefined if `data` is invalid + */ + onData(data) { + let done = false; + if (data.progress) { + this.onProgress(this.progressBarElement, this.progressBarMessageElement, data.progress); + } + if (data.complete === true) { + done = true; + if (data.success === true) { + this.onSuccess(this.progressBarElement, this.progressBarMessageElement, data.result); + } else if (data.success === false) { + if (data.state === 'RETRY') { + this.onRetry(this.progressBarElement, this.progressBarMessageElement, data.result.message, data.result.when); + done = false; + delete data.result; + } else { + this.onTaskError(this.progressBarElement, this.progressBarMessageElement, data.result); + } + } else { + if (data.state === 'IGNORED') { + this.onIgnored(this.progressBarElement, this.progressBarMessageElement, data.result); + delete data.result; + } else { + done = undefined; + this.onDataError(this.progressBarElement, this.progressBarMessageElement, "Data Error"); + } + } + if (data.hasOwnProperty('result')) { + this.onResult(this.resultElement, data.result); + } + } else if (data.complete === undefined) { + done = undefined; + this.onDataError(this.progressBarElement, this.progressBarMessageElement, "Data Error"); + } + return done; + } + + async connect() { + let response; + try { + response = await fetch(this.progressUrl); + } catch (networkError) { + this.onNetworkError(this.progressBarElement, this.progressBarMessageElement, "Network Error"); + throw networkError; + } + + if (response.status === 200) { + let data; + try { + data = await response.json(); + } catch (parsingError) { + this.onDataError(this.progressBarElement, this.progressBarMessageElement, "Parsing Error") + throw parsingError; + } + + const complete = this.onData(data); + + if (complete === false) { + setTimeout(this.connect.bind(this), this.pollInterval); + } + } else { + this.onHttpError(this.progressBarElement, this.progressBarMessageElement, "HTTP Code " + response.status, response); + } + } + + static initProgressBar(progressUrl, options) { + const bar = new this(progressUrl, options); + bar.connect(); + } +} diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress/static/celery_progress/websockets.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress/static/celery_progress/websockets.js new file mode 100644 index 0000000..4b7f848 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress/static/celery_progress/websockets.js @@ -0,0 +1,32 @@ +class CeleryWebSocketProgressBar extends CeleryProgressBar { + + constructor(progressUrl, options) { + super(progressUrl, options); + } + + async connect() { + var ProgressSocket = new WebSocket((location.protocol === 'https:' ? 'wss' : 'ws') + '://' + + window.location.host + this.progressUrl); + + ProgressSocket.onopen = function (event) { + ProgressSocket.send(JSON.stringify({'type': 'check_task_completion'})); + }; + + const bar = this; + ProgressSocket.onmessage = function (event) { + let data; + try { + data = JSON.parse(event.data); + } catch (parsingError) { + bar.onDataError(bar.progressBarElement, bar.progressBarMessageElement, "Parsing Error") + throw parsingError; + } + + const complete = bar.onData(data); + + if (complete === true || complete === undefined) { + ProgressSocket.close(); + } + }; + } +} diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress/tasks.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress/tasks.py new file mode 100644 index 0000000..20f1b8b --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress/tasks.py @@ -0,0 +1,11 @@ +from celery.signals import task_postrun + + +@task_postrun.connect(retry=True) +def task_postrun_handler(**kwargs): + """Runs after a task has finished. This will update the result backend to include the IGNORED result state. + + Necessary for HTTP to properly receive ignored task event.""" + if kwargs.pop('state') == 'IGNORED': + task = kwargs.pop('task') + task.update_state(state='IGNORED', meta=str(kwargs.pop('retval'))) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress/urls.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress/urls.py new file mode 100644 index 0000000..fc3fcc6 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress/urls.py @@ -0,0 +1,7 @@ +from django.urls import re_path +from . import views + +app_name = 'celery_progress' +urlpatterns = [ + re_path(r'^(?P[\w-]+)/$', views.get_progress, name='task_status') +] diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress/views.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress/views.py new file mode 100644 index 0000000..7222c15 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress/views.py @@ -0,0 +1,10 @@ +import json +from django.http import HttpResponse +from celery.result import AsyncResult +from celery_progress.backend import Progress +from django.views.decorators.cache import never_cache + +@never_cache +def get_progress(request, task_id): + progress = Progress(AsyncResult(task_id)) + return HttpResponse(json.dumps(progress.get_info()), content_type='application/json') diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress/websockets/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress/websockets/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress/websockets/backend.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress/websockets/backend.py new file mode 100644 index 0000000..670660b --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress/websockets/backend.py @@ -0,0 +1,45 @@ +import logging + +from celery_progress.backend import ProgressRecorder, Progress, KnownResult + +try: + from asgiref.sync import async_to_sync + from channels.layers import get_channel_layer +except ImportError: + channel_layer = None +else: + channel_layer = get_channel_layer() + +logger = logging.getLogger(__name__) + + +class WebSocketProgressRecorder(ProgressRecorder): + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + if not channel_layer: + logger.warning( + 'Tried to use websocket progress bar, but dependencies were not installed / configured. ' + 'Use pip install celery-progress[websockets] and set up channels to enable this feature. ' + 'See: https://channels.readthedocs.io/en/latest/ for more details.' + ) + + @staticmethod + def push_update(task_id, data, final=False): + try: + async_to_sync(channel_layer.group_send)( + task_id, + {'type': 'update_task_progress', 'data': data} + ) + except AttributeError: # No channel layer to send to, so ignore it + pass + except RuntimeError as e: # We're sending messages too fast for asgiref to handle, drop it + if final and channel_layer: # Send error back to post-run handler for a retry + raise e + + def set_progress(self, current, total, description=""): + state, meta = super().set_progress(current, total, description) + result = KnownResult(self.task.request.id, meta, state) + data = Progress(result).get_info() + self.push_update(self.task.request.id, data) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress/websockets/consumers.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress/websockets/consumers.py new file mode 100644 index 0000000..5b3dcd3 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress/websockets/consumers.py @@ -0,0 +1,41 @@ +from channels.generic.websocket import AsyncWebsocketConsumer +import json + +from celery.result import AsyncResult +from celery_progress.backend import Progress + + +class ProgressConsumer(AsyncWebsocketConsumer): + async def connect(self): + self.task_id = self.scope['url_route']['kwargs']['task_id'] + + await self.channel_layer.group_add( + self.task_id, + self.channel_name + ) + + await self.accept() + + async def disconnect(self, close_code): + await self.channel_layer.group_discard( + self.task_id, + self.channel_name + ) + + async def receive(self, text_data): + text_data_json = json.loads(text_data) + task_type = text_data_json['type'] + + if task_type == 'check_task_completion': + await self.channel_layer.group_send( + self.task_id, + { + 'type': 'update_task_progress', + 'data': Progress(AsyncResult(self.task_id)).get_info() + } + ) + + async def update_task_progress(self, event): + data = event['data'] + + await self.send(text_data=json.dumps(data)) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress/websockets/routing.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress/websockets/routing.py new file mode 100644 index 0000000..871155f --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress/websockets/routing.py @@ -0,0 +1,12 @@ +from django.conf.urls import url + +from celery_progress.websockets import consumers + +try: + progress_consumer = consumers.ProgressConsumer.as_asgi() # New in Channels 3, works similar to Django's .as_view() +except AttributeError: + progress_consumer = consumers.ProgressConsumer # Channels 3 not installed, revert to Channels 2 behavior + +urlpatterns = [ + url(r'^ws/progress/(?P[\w-]+)/?$', progress_consumer), +] diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress/websockets/tasks.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress/websockets/tasks.py new file mode 100644 index 0000000..4cadf4d --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/celery_progress/websockets/tasks.py @@ -0,0 +1,26 @@ +from celery.signals import task_postrun, task_revoked + +from .backend import WebSocketProgressRecorder +from celery_progress.backend import KnownResult, Progress + + +@task_postrun.connect(retry=True) +def task_postrun_handler(task_id, **kwargs): + """Runs after a task has finished. This will be used to push a websocket update for completed events. + + If the websockets version of this package is not installed, this will fail silently.""" + result = KnownResult(task_id, kwargs.pop('retval'), kwargs.pop('state')) + data = Progress(result).get_info() + WebSocketProgressRecorder.push_update(task_id, data=data, final=True) + + +@task_revoked.connect(retry=True) +def task_revoked_handler(request, **kwargs): + """Runs if a task has been revoked. This will be used to push a websocket update for revoked events. + + If the websockets version of this package is not installed, this will fail silently.""" + _result = ('terminated' if kwargs.pop('terminated') else None) or ('expired' if kwargs.pop('expired') else None) \ + or 'revoked' + result = KnownResult(request.id, _result, 'REVOKED') + data = Progress(result).get_info() + WebSocketProgressRecorder.push_update(request.id, data=data, final=True) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi-1.14.6.dist-info/INSTALLER b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi-1.14.6.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi-1.14.6.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi-1.14.6.dist-info/LICENSE b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi-1.14.6.dist-info/LICENSE new file mode 100644 index 0000000..29225ee --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi-1.14.6.dist-info/LICENSE @@ -0,0 +1,26 @@ + +Except when otherwise stated (look for LICENSE files in directories or +information at the beginning of each file) all software and +documentation is licensed as follows: + + The MIT License + + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi-1.14.6.dist-info/METADATA b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi-1.14.6.dist-info/METADATA new file mode 100644 index 0000000..eb89ffb --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi-1.14.6.dist-info/METADATA @@ -0,0 +1,37 @@ +Metadata-Version: 2.1 +Name: cffi +Version: 1.14.6 +Summary: Foreign Function Interface for Python calling C code. +Home-page: http://cffi.readthedocs.org +Author: Armin Rigo, Maciej Fijalkowski +Author-email: python-cffi@googlegroups.com +License: MIT +Platform: UNKNOWN +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.2 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: License :: OSI Approved :: MIT License +Requires-Dist: pycparser + + +CFFI +==== + +Foreign Function Interface for Python calling C code. +Please see the `Documentation `_. + +Contact +------- + +`Mailing list `_ + + diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi-1.14.6.dist-info/RECORD b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi-1.14.6.dist-info/RECORD new file mode 100644 index 0000000..a916ba2 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi-1.14.6.dist-info/RECORD @@ -0,0 +1,46 @@ +_cffi_backend.cpython-38-x86_64-linux-gnu.so,sha256=RrrLMNpHQcord1k7OWsnpl7xabF-Y4-wX1Jt6VfX_0M,897360 +cffi-1.14.6.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +cffi-1.14.6.dist-info/LICENSE,sha256=BLgPWwd7vtaICM_rreteNSPyqMmpZJXFh72W3x6sKjM,1294 +cffi-1.14.6.dist-info/METADATA,sha256=iARP_3-zijWu2wMTGLxBjOvhLauXbXbudMbvCUaPKrI,1191 +cffi-1.14.6.dist-info/RECORD,, +cffi-1.14.6.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +cffi-1.14.6.dist-info/WHEEL,sha256=Dh4w5P6PPWbqyqoE6MHlzbFQwZXlM-voWJDf2WUsS2g,108 +cffi-1.14.6.dist-info/entry_points.txt,sha256=Q9f5C9IpjYxo0d2PK9eUcnkgxHc9pHWwjEMaANPKNCI,76 +cffi-1.14.6.dist-info/top_level.txt,sha256=rE7WR3rZfNKxWI9-jn6hsHCAl7MDkB-FmuQbxWjFehQ,19 +cffi.libs/libffi-c643fa1a.so.6.0.4,sha256=SY2G7oIZS0SDTuuVA-uAVvT6c0Y2XSLnigJXs0qQe9E,46632 +cffi/__init__.py,sha256=NA0pHhgaFjmy_BTKXzjyGpWDII0VXd3WeSknY8pl7R4,513 +cffi/__pycache__/__init__.cpython-38.pyc,, +cffi/__pycache__/api.cpython-38.pyc,, +cffi/__pycache__/backend_ctypes.cpython-38.pyc,, +cffi/__pycache__/cffi_opcode.cpython-38.pyc,, +cffi/__pycache__/commontypes.cpython-38.pyc,, +cffi/__pycache__/cparser.cpython-38.pyc,, +cffi/__pycache__/error.cpython-38.pyc,, +cffi/__pycache__/ffiplatform.cpython-38.pyc,, +cffi/__pycache__/lock.cpython-38.pyc,, +cffi/__pycache__/model.cpython-38.pyc,, +cffi/__pycache__/pkgconfig.cpython-38.pyc,, +cffi/__pycache__/recompiler.cpython-38.pyc,, +cffi/__pycache__/setuptools_ext.cpython-38.pyc,, +cffi/__pycache__/vengine_cpy.cpython-38.pyc,, +cffi/__pycache__/vengine_gen.cpython-38.pyc,, +cffi/__pycache__/verifier.cpython-38.pyc,, +cffi/_cffi_errors.h,sha256=zQXt7uR_m8gUW-fI2hJg0KoSkJFwXv8RGUkEDZ177dQ,3908 +cffi/_cffi_include.h,sha256=tKnA1rdSoPHp23FnDL1mDGwFo-Uj6fXfA6vA6kcoEUc,14800 +cffi/_embedding.h,sha256=Gwy1z1tLIvf9dI4VidLzS8yw8L9PNngKJr1BjXCTQvE,17581 +cffi/api.py,sha256=yxJalIePbr1mz_WxAHokSwyP5CVYde44m-nolHnbJNo,42064 +cffi/backend_ctypes.py,sha256=h5ZIzLc6BFVXnGyc9xPqZWUS7qGy7yFSDqXe68Sa8z4,42454 +cffi/cffi_opcode.py,sha256=v9RdD_ovA8rCtqsC95Ivki5V667rAOhGgs3fb2q9xpM,5724 +cffi/commontypes.py,sha256=QS4uxCDI7JhtTyjh1hlnCA-gynmaszWxJaRRLGkJa1A,2689 +cffi/cparser.py,sha256=rO_1pELRw1gI1DE1m4gi2ik5JMfpxouAACLXpRPlVEA,44231 +cffi/error.py,sha256=v6xTiS4U0kvDcy4h_BDRo5v39ZQuj-IMRYLv5ETddZs,877 +cffi/ffiplatform.py,sha256=HMXqR8ks2wtdsNxGaWpQ_PyqIvtiuos_vf1qKCy-cwg,4046 +cffi/lock.py,sha256=l9TTdwMIMpi6jDkJGnQgE9cvTIR7CAntIJr8EGHt3pY,747 +cffi/model.py,sha256=_GH_UF1Rn9vC4AvmgJm6qj7RUXXG3eqKPc8bPxxyBKE,21768 +cffi/parse_c_type.h,sha256=OdwQfwM9ktq6vlCB43exFQmxDBtj2MBNdK8LYl15tjw,5976 +cffi/pkgconfig.py,sha256=LP1w7vmWvmKwyqLaU1Z243FOWGNQMrgMUZrvgFuOlco,4374 +cffi/recompiler.py,sha256=7OBdKr0dAzRnEbgQvjCAikoFAygjTvitaJHdRGc1k24,64568 +cffi/setuptools_ext.py,sha256=RUR17N5f8gpiQBBlXL34P9FtOu1mhHIaAf3WJlg5S4I,8931 +cffi/vengine_cpy.py,sha256=YglN8YS-UaHEv2k2cxgotNWE87dHX20-68EyKoiKUYA,43320 +cffi/vengine_gen.py,sha256=5dX7s1DU6pTBOMI6oTVn_8Bnmru_lj932B6b4v29Hlg,26684 +cffi/verifier.py,sha256=ESwuXWXtXrKEagCKveLRDjFzLNCyaKdqAgAlKREcyhY,11253 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi-1.14.6.dist-info/REQUESTED b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi-1.14.6.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi-1.14.6.dist-info/WHEEL b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi-1.14.6.dist-info/WHEEL new file mode 100644 index 0000000..69d594f --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi-1.14.6.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.36.2) +Root-Is-Purelib: false +Tag: cp38-cp38-manylinux1_x86_64 + diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi-1.14.6.dist-info/entry_points.txt b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi-1.14.6.dist-info/entry_points.txt new file mode 100644 index 0000000..eee7e0f --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi-1.14.6.dist-info/entry_points.txt @@ -0,0 +1,3 @@ +[distutils.setup_keywords] +cffi_modules = cffi.setuptools_ext:cffi_modules + diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi-1.14.6.dist-info/top_level.txt b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi-1.14.6.dist-info/top_level.txt new file mode 100644 index 0000000..f645779 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi-1.14.6.dist-info/top_level.txt @@ -0,0 +1,2 @@ +_cffi_backend +cffi diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi.libs/libffi-c643fa1a.so.6.0.4 b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi.libs/libffi-c643fa1a.so.6.0.4 new file mode 100755 index 0000000..80892d4 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi.libs/libffi-c643fa1a.so.6.0.4 differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/__init__.py new file mode 100644 index 0000000..cdc26f0 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/__init__.py @@ -0,0 +1,14 @@ +__all__ = ['FFI', 'VerificationError', 'VerificationMissing', 'CDefError', + 'FFIError'] + +from .api import FFI +from .error import CDefError, FFIError, VerificationError, VerificationMissing +from .error import PkgConfigError + +__version__ = "1.14.6" +__version_info__ = (1, 14, 6) + +# The verifier module file names are based on the CRC32 of a string that +# contains the following version number. It may be older than __version__ +# if nothing is clearly incompatible. +__version_verifier_modules__ = "0.8.6" diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/_cffi_errors.h b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/_cffi_errors.h new file mode 100644 index 0000000..158e059 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/_cffi_errors.h @@ -0,0 +1,149 @@ +#ifndef CFFI_MESSAGEBOX +# ifdef _MSC_VER +# define CFFI_MESSAGEBOX 1 +# else +# define CFFI_MESSAGEBOX 0 +# endif +#endif + + +#if CFFI_MESSAGEBOX +/* Windows only: logic to take the Python-CFFI embedding logic + initialization errors and display them in a background thread + with MessageBox. The idea is that if the whole program closes + as a result of this problem, then likely it is already a console + program and you can read the stderr output in the console too. + If it is not a console program, then it will likely show its own + dialog to complain, or generally not abruptly close, and for this + case the background thread should stay alive. +*/ +static void *volatile _cffi_bootstrap_text; + +static PyObject *_cffi_start_error_capture(void) +{ + PyObject *result = NULL; + PyObject *x, *m, *bi; + + if (InterlockedCompareExchangePointer(&_cffi_bootstrap_text, + (void *)1, NULL) != NULL) + return (PyObject *)1; + + m = PyImport_AddModule("_cffi_error_capture"); + if (m == NULL) + goto error; + + result = PyModule_GetDict(m); + if (result == NULL) + goto error; + +#if PY_MAJOR_VERSION >= 3 + bi = PyImport_ImportModule("builtins"); +#else + bi = PyImport_ImportModule("__builtin__"); +#endif + if (bi == NULL) + goto error; + PyDict_SetItemString(result, "__builtins__", bi); + Py_DECREF(bi); + + x = PyRun_String( + "import sys\n" + "class FileLike:\n" + " def write(self, x):\n" + " try:\n" + " of.write(x)\n" + " except: pass\n" + " self.buf += x\n" + " def flush(self):\n" + " pass\n" + "fl = FileLike()\n" + "fl.buf = ''\n" + "of = sys.stderr\n" + "sys.stderr = fl\n" + "def done():\n" + " sys.stderr = of\n" + " return fl.buf\n", /* make sure the returned value stays alive */ + Py_file_input, + result, result); + Py_XDECREF(x); + + error: + if (PyErr_Occurred()) + { + PyErr_WriteUnraisable(Py_None); + PyErr_Clear(); + } + return result; +} + +#pragma comment(lib, "user32.lib") + +static DWORD WINAPI _cffi_bootstrap_dialog(LPVOID ignored) +{ + Sleep(666); /* may be interrupted if the whole process is closing */ +#if PY_MAJOR_VERSION >= 3 + MessageBoxW(NULL, (wchar_t *)_cffi_bootstrap_text, + L"Python-CFFI error", + MB_OK | MB_ICONERROR); +#else + MessageBoxA(NULL, (char *)_cffi_bootstrap_text, + "Python-CFFI error", + MB_OK | MB_ICONERROR); +#endif + _cffi_bootstrap_text = NULL; + return 0; +} + +static void _cffi_stop_error_capture(PyObject *ecap) +{ + PyObject *s; + void *text; + + if (ecap == (PyObject *)1) + return; + + if (ecap == NULL) + goto error; + + s = PyRun_String("done()", Py_eval_input, ecap, ecap); + if (s == NULL) + goto error; + + /* Show a dialog box, but in a background thread, and + never show multiple dialog boxes at once. */ +#if PY_MAJOR_VERSION >= 3 + text = PyUnicode_AsWideCharString(s, NULL); +#else + text = PyString_AsString(s); +#endif + + _cffi_bootstrap_text = text; + + if (text != NULL) + { + HANDLE h; + h = CreateThread(NULL, 0, _cffi_bootstrap_dialog, + NULL, 0, NULL); + if (h != NULL) + CloseHandle(h); + } + /* decref the string, but it should stay alive as 'fl.buf' + in the small module above. It will really be freed only if + we later get another similar error. So it's a leak of at + most one copy of the small module. That's fine for this + situation which is usually a "fatal error" anyway. */ + Py_DECREF(s); + PyErr_Clear(); + return; + + error: + _cffi_bootstrap_text = NULL; + PyErr_Clear(); +} + +#else + +static PyObject *_cffi_start_error_capture(void) { return NULL; } +static void _cffi_stop_error_capture(PyObject *ecap) { } + +#endif diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/_cffi_include.h b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/_cffi_include.h new file mode 100644 index 0000000..e4c0a67 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/_cffi_include.h @@ -0,0 +1,385 @@ +#define _CFFI_ + +/* We try to define Py_LIMITED_API before including Python.h. + + Mess: we can only define it if Py_DEBUG, Py_TRACE_REFS and + Py_REF_DEBUG are not defined. This is a best-effort approximation: + we can learn about Py_DEBUG from pyconfig.h, but it is unclear if + the same works for the other two macros. Py_DEBUG implies them, + but not the other way around. + + The implementation is messy (issue #350): on Windows, with _MSC_VER, + we have to define Py_LIMITED_API even before including pyconfig.h. + In that case, we guess what pyconfig.h will do to the macros above, + and check our guess after the #include. + + Note that on Windows, with CPython 3.x, you need >= 3.5 and virtualenv + version >= 16.0.0. With older versions of either, you don't get a + copy of PYTHON3.DLL in the virtualenv. We can't check the version of + CPython *before* we even include pyconfig.h. ffi.set_source() puts + a ``#define _CFFI_NO_LIMITED_API'' at the start of this file if it is + running on Windows < 3.5, as an attempt at fixing it, but that's + arguably wrong because it may not be the target version of Python. + Still better than nothing I guess. As another workaround, you can + remove the definition of Py_LIMITED_API here. + + See also 'py_limited_api' in cffi/setuptools_ext.py. +*/ +#if !defined(_CFFI_USE_EMBEDDING) && !defined(Py_LIMITED_API) +# ifdef _MSC_VER +# if !defined(_DEBUG) && !defined(Py_DEBUG) && !defined(Py_TRACE_REFS) && !defined(Py_REF_DEBUG) && !defined(_CFFI_NO_LIMITED_API) +# define Py_LIMITED_API +# endif +# include + /* sanity-check: Py_LIMITED_API will cause crashes if any of these + are also defined. Normally, the Python file PC/pyconfig.h does not + cause any of these to be defined, with the exception that _DEBUG + causes Py_DEBUG. Double-check that. */ +# ifdef Py_LIMITED_API +# if defined(Py_DEBUG) +# error "pyconfig.h unexpectedly defines Py_DEBUG, but Py_LIMITED_API is set" +# endif +# if defined(Py_TRACE_REFS) +# error "pyconfig.h unexpectedly defines Py_TRACE_REFS, but Py_LIMITED_API is set" +# endif +# if defined(Py_REF_DEBUG) +# error "pyconfig.h unexpectedly defines Py_REF_DEBUG, but Py_LIMITED_API is set" +# endif +# endif +# else +# include +# if !defined(Py_DEBUG) && !defined(Py_TRACE_REFS) && !defined(Py_REF_DEBUG) && !defined(_CFFI_NO_LIMITED_API) +# define Py_LIMITED_API +# endif +# endif +#endif + +#include +#ifdef __cplusplus +extern "C" { +#endif +#include +#include "parse_c_type.h" + +/* this block of #ifs should be kept exactly identical between + c/_cffi_backend.c, cffi/vengine_cpy.py, cffi/vengine_gen.py + and cffi/_cffi_include.h */ +#if defined(_MSC_VER) +# include /* for alloca() */ +# if _MSC_VER < 1600 /* MSVC < 2010 */ + typedef __int8 int8_t; + typedef __int16 int16_t; + typedef __int32 int32_t; + typedef __int64 int64_t; + typedef unsigned __int8 uint8_t; + typedef unsigned __int16 uint16_t; + typedef unsigned __int32 uint32_t; + typedef unsigned __int64 uint64_t; + typedef __int8 int_least8_t; + typedef __int16 int_least16_t; + typedef __int32 int_least32_t; + typedef __int64 int_least64_t; + typedef unsigned __int8 uint_least8_t; + typedef unsigned __int16 uint_least16_t; + typedef unsigned __int32 uint_least32_t; + typedef unsigned __int64 uint_least64_t; + typedef __int8 int_fast8_t; + typedef __int16 int_fast16_t; + typedef __int32 int_fast32_t; + typedef __int64 int_fast64_t; + typedef unsigned __int8 uint_fast8_t; + typedef unsigned __int16 uint_fast16_t; + typedef unsigned __int32 uint_fast32_t; + typedef unsigned __int64 uint_fast64_t; + typedef __int64 intmax_t; + typedef unsigned __int64 uintmax_t; +# else +# include +# endif +# if _MSC_VER < 1800 /* MSVC < 2013 */ +# ifndef __cplusplus + typedef unsigned char _Bool; +# endif +# endif +#else +# include +# if (defined (__SVR4) && defined (__sun)) || defined(_AIX) || defined(__hpux) +# include +# endif +#endif + +#ifdef __GNUC__ +# define _CFFI_UNUSED_FN __attribute__((unused)) +#else +# define _CFFI_UNUSED_FN /* nothing */ +#endif + +#ifdef __cplusplus +# ifndef _Bool + typedef bool _Bool; /* semi-hackish: C++ has no _Bool; bool is builtin */ +# endif +#endif + +/********** CPython-specific section **********/ +#ifndef PYPY_VERSION + + +#if PY_MAJOR_VERSION >= 3 +# define PyInt_FromLong PyLong_FromLong +#endif + +#define _cffi_from_c_double PyFloat_FromDouble +#define _cffi_from_c_float PyFloat_FromDouble +#define _cffi_from_c_long PyInt_FromLong +#define _cffi_from_c_ulong PyLong_FromUnsignedLong +#define _cffi_from_c_longlong PyLong_FromLongLong +#define _cffi_from_c_ulonglong PyLong_FromUnsignedLongLong +#define _cffi_from_c__Bool PyBool_FromLong + +#define _cffi_to_c_double PyFloat_AsDouble +#define _cffi_to_c_float PyFloat_AsDouble + +#define _cffi_from_c_int(x, type) \ + (((type)-1) > 0 ? /* unsigned */ \ + (sizeof(type) < sizeof(long) ? \ + PyInt_FromLong((long)x) : \ + sizeof(type) == sizeof(long) ? \ + PyLong_FromUnsignedLong((unsigned long)x) : \ + PyLong_FromUnsignedLongLong((unsigned long long)x)) : \ + (sizeof(type) <= sizeof(long) ? \ + PyInt_FromLong((long)x) : \ + PyLong_FromLongLong((long long)x))) + +#define _cffi_to_c_int(o, type) \ + ((type)( \ + sizeof(type) == 1 ? (((type)-1) > 0 ? (type)_cffi_to_c_u8(o) \ + : (type)_cffi_to_c_i8(o)) : \ + sizeof(type) == 2 ? (((type)-1) > 0 ? (type)_cffi_to_c_u16(o) \ + : (type)_cffi_to_c_i16(o)) : \ + sizeof(type) == 4 ? (((type)-1) > 0 ? (type)_cffi_to_c_u32(o) \ + : (type)_cffi_to_c_i32(o)) : \ + sizeof(type) == 8 ? (((type)-1) > 0 ? (type)_cffi_to_c_u64(o) \ + : (type)_cffi_to_c_i64(o)) : \ + (Py_FatalError("unsupported size for type " #type), (type)0))) + +#define _cffi_to_c_i8 \ + ((int(*)(PyObject *))_cffi_exports[1]) +#define _cffi_to_c_u8 \ + ((int(*)(PyObject *))_cffi_exports[2]) +#define _cffi_to_c_i16 \ + ((int(*)(PyObject *))_cffi_exports[3]) +#define _cffi_to_c_u16 \ + ((int(*)(PyObject *))_cffi_exports[4]) +#define _cffi_to_c_i32 \ + ((int(*)(PyObject *))_cffi_exports[5]) +#define _cffi_to_c_u32 \ + ((unsigned int(*)(PyObject *))_cffi_exports[6]) +#define _cffi_to_c_i64 \ + ((long long(*)(PyObject *))_cffi_exports[7]) +#define _cffi_to_c_u64 \ + ((unsigned long long(*)(PyObject *))_cffi_exports[8]) +#define _cffi_to_c_char \ + ((int(*)(PyObject *))_cffi_exports[9]) +#define _cffi_from_c_pointer \ + ((PyObject *(*)(char *, struct _cffi_ctypedescr *))_cffi_exports[10]) +#define _cffi_to_c_pointer \ + ((char *(*)(PyObject *, struct _cffi_ctypedescr *))_cffi_exports[11]) +#define _cffi_get_struct_layout \ + not used any more +#define _cffi_restore_errno \ + ((void(*)(void))_cffi_exports[13]) +#define _cffi_save_errno \ + ((void(*)(void))_cffi_exports[14]) +#define _cffi_from_c_char \ + ((PyObject *(*)(char))_cffi_exports[15]) +#define _cffi_from_c_deref \ + ((PyObject *(*)(char *, struct _cffi_ctypedescr *))_cffi_exports[16]) +#define _cffi_to_c \ + ((int(*)(char *, struct _cffi_ctypedescr *, PyObject *))_cffi_exports[17]) +#define _cffi_from_c_struct \ + ((PyObject *(*)(char *, struct _cffi_ctypedescr *))_cffi_exports[18]) +#define _cffi_to_c_wchar_t \ + ((_cffi_wchar_t(*)(PyObject *))_cffi_exports[19]) +#define _cffi_from_c_wchar_t \ + ((PyObject *(*)(_cffi_wchar_t))_cffi_exports[20]) +#define _cffi_to_c_long_double \ + ((long double(*)(PyObject *))_cffi_exports[21]) +#define _cffi_to_c__Bool \ + ((_Bool(*)(PyObject *))_cffi_exports[22]) +#define _cffi_prepare_pointer_call_argument \ + ((Py_ssize_t(*)(struct _cffi_ctypedescr *, \ + PyObject *, char **))_cffi_exports[23]) +#define _cffi_convert_array_from_object \ + ((int(*)(char *, struct _cffi_ctypedescr *, PyObject *))_cffi_exports[24]) +#define _CFFI_CPIDX 25 +#define _cffi_call_python \ + ((void(*)(struct _cffi_externpy_s *, char *))_cffi_exports[_CFFI_CPIDX]) +#define _cffi_to_c_wchar3216_t \ + ((int(*)(PyObject *))_cffi_exports[26]) +#define _cffi_from_c_wchar3216_t \ + ((PyObject *(*)(int))_cffi_exports[27]) +#define _CFFI_NUM_EXPORTS 28 + +struct _cffi_ctypedescr; + +static void *_cffi_exports[_CFFI_NUM_EXPORTS]; + +#define _cffi_type(index) ( \ + assert((((uintptr_t)_cffi_types[index]) & 1) == 0), \ + (struct _cffi_ctypedescr *)_cffi_types[index]) + +static PyObject *_cffi_init(const char *module_name, Py_ssize_t version, + const struct _cffi_type_context_s *ctx) +{ + PyObject *module, *o_arg, *new_module; + void *raw[] = { + (void *)module_name, + (void *)version, + (void *)_cffi_exports, + (void *)ctx, + }; + + module = PyImport_ImportModule("_cffi_backend"); + if (module == NULL) + goto failure; + + o_arg = PyLong_FromVoidPtr((void *)raw); + if (o_arg == NULL) + goto failure; + + new_module = PyObject_CallMethod( + module, (char *)"_init_cffi_1_0_external_module", (char *)"O", o_arg); + + Py_DECREF(o_arg); + Py_DECREF(module); + return new_module; + + failure: + Py_XDECREF(module); + return NULL; +} + + +#ifdef HAVE_WCHAR_H +typedef wchar_t _cffi_wchar_t; +#else +typedef uint16_t _cffi_wchar_t; /* same random pick as _cffi_backend.c */ +#endif + +_CFFI_UNUSED_FN static uint16_t _cffi_to_c_char16_t(PyObject *o) +{ + if (sizeof(_cffi_wchar_t) == 2) + return (uint16_t)_cffi_to_c_wchar_t(o); + else + return (uint16_t)_cffi_to_c_wchar3216_t(o); +} + +_CFFI_UNUSED_FN static PyObject *_cffi_from_c_char16_t(uint16_t x) +{ + if (sizeof(_cffi_wchar_t) == 2) + return _cffi_from_c_wchar_t((_cffi_wchar_t)x); + else + return _cffi_from_c_wchar3216_t((int)x); +} + +_CFFI_UNUSED_FN static int _cffi_to_c_char32_t(PyObject *o) +{ + if (sizeof(_cffi_wchar_t) == 4) + return (int)_cffi_to_c_wchar_t(o); + else + return (int)_cffi_to_c_wchar3216_t(o); +} + +_CFFI_UNUSED_FN static PyObject *_cffi_from_c_char32_t(unsigned int x) +{ + if (sizeof(_cffi_wchar_t) == 4) + return _cffi_from_c_wchar_t((_cffi_wchar_t)x); + else + return _cffi_from_c_wchar3216_t((int)x); +} + +union _cffi_union_alignment_u { + unsigned char m_char; + unsigned short m_short; + unsigned int m_int; + unsigned long m_long; + unsigned long long m_longlong; + float m_float; + double m_double; + long double m_longdouble; +}; + +struct _cffi_freeme_s { + struct _cffi_freeme_s *next; + union _cffi_union_alignment_u alignment; +}; + +_CFFI_UNUSED_FN static int +_cffi_convert_array_argument(struct _cffi_ctypedescr *ctptr, PyObject *arg, + char **output_data, Py_ssize_t datasize, + struct _cffi_freeme_s **freeme) +{ + char *p; + if (datasize < 0) + return -1; + + p = *output_data; + if (p == NULL) { + struct _cffi_freeme_s *fp = (struct _cffi_freeme_s *)PyObject_Malloc( + offsetof(struct _cffi_freeme_s, alignment) + (size_t)datasize); + if (fp == NULL) + return -1; + fp->next = *freeme; + *freeme = fp; + p = *output_data = (char *)&fp->alignment; + } + memset((void *)p, 0, (size_t)datasize); + return _cffi_convert_array_from_object(p, ctptr, arg); +} + +_CFFI_UNUSED_FN static void +_cffi_free_array_arguments(struct _cffi_freeme_s *freeme) +{ + do { + void *p = (void *)freeme; + freeme = freeme->next; + PyObject_Free(p); + } while (freeme != NULL); +} + +/********** end CPython-specific section **********/ +#else +_CFFI_UNUSED_FN +static void (*_cffi_call_python_org)(struct _cffi_externpy_s *, char *); +# define _cffi_call_python _cffi_call_python_org +#endif + + +#define _cffi_array_len(array) (sizeof(array) / sizeof((array)[0])) + +#define _cffi_prim_int(size, sign) \ + ((size) == 1 ? ((sign) ? _CFFI_PRIM_INT8 : _CFFI_PRIM_UINT8) : \ + (size) == 2 ? ((sign) ? _CFFI_PRIM_INT16 : _CFFI_PRIM_UINT16) : \ + (size) == 4 ? ((sign) ? _CFFI_PRIM_INT32 : _CFFI_PRIM_UINT32) : \ + (size) == 8 ? ((sign) ? _CFFI_PRIM_INT64 : _CFFI_PRIM_UINT64) : \ + _CFFI__UNKNOWN_PRIM) + +#define _cffi_prim_float(size) \ + ((size) == sizeof(float) ? _CFFI_PRIM_FLOAT : \ + (size) == sizeof(double) ? _CFFI_PRIM_DOUBLE : \ + (size) == sizeof(long double) ? _CFFI__UNKNOWN_LONG_DOUBLE : \ + _CFFI__UNKNOWN_FLOAT_PRIM) + +#define _cffi_check_int(got, got_nonpos, expected) \ + ((got_nonpos) == (expected <= 0) && \ + (got) == (unsigned long long)expected) + +#ifdef MS_WIN32 +# define _cffi_stdcall __stdcall +#else +# define _cffi_stdcall /* nothing */ +#endif + +#ifdef __cplusplus +} +#endif diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/_embedding.h b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/_embedding.h new file mode 100644 index 0000000..7410231 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/_embedding.h @@ -0,0 +1,527 @@ + +/***** Support code for embedding *****/ + +#ifdef __cplusplus +extern "C" { +#endif + + +#if defined(_WIN32) +# define CFFI_DLLEXPORT __declspec(dllexport) +#elif defined(__GNUC__) +# define CFFI_DLLEXPORT __attribute__((visibility("default"))) +#else +# define CFFI_DLLEXPORT /* nothing */ +#endif + + +/* There are two global variables of type _cffi_call_python_fnptr: + + * _cffi_call_python, which we declare just below, is the one called + by ``extern "Python"`` implementations. + + * _cffi_call_python_org, which on CPython is actually part of the + _cffi_exports[] array, is the function pointer copied from + _cffi_backend. + + After initialization is complete, both are equal. However, the + first one remains equal to &_cffi_start_and_call_python until the + very end of initialization, when we are (or should be) sure that + concurrent threads also see a completely initialized world, and + only then is it changed. +*/ +#undef _cffi_call_python +typedef void (*_cffi_call_python_fnptr)(struct _cffi_externpy_s *, char *); +static void _cffi_start_and_call_python(struct _cffi_externpy_s *, char *); +static _cffi_call_python_fnptr _cffi_call_python = &_cffi_start_and_call_python; + + +#ifndef _MSC_VER + /* --- Assuming a GCC not infinitely old --- */ +# define cffi_compare_and_swap(l,o,n) __sync_bool_compare_and_swap(l,o,n) +# define cffi_write_barrier() __sync_synchronize() +# if !defined(__amd64__) && !defined(__x86_64__) && \ + !defined(__i386__) && !defined(__i386) +# define cffi_read_barrier() __sync_synchronize() +# else +# define cffi_read_barrier() (void)0 +# endif +#else + /* --- Windows threads version --- */ +# include +# define cffi_compare_and_swap(l,o,n) \ + (InterlockedCompareExchangePointer(l,n,o) == (o)) +# define cffi_write_barrier() InterlockedCompareExchange(&_cffi_dummy,0,0) +# define cffi_read_barrier() (void)0 +static volatile LONG _cffi_dummy; +#endif + +#ifdef WITH_THREAD +# ifndef _MSC_VER +# include + static pthread_mutex_t _cffi_embed_startup_lock; +# else + static CRITICAL_SECTION _cffi_embed_startup_lock; +# endif + static char _cffi_embed_startup_lock_ready = 0; +#endif + +static void _cffi_acquire_reentrant_mutex(void) +{ + static void *volatile lock = NULL; + + while (!cffi_compare_and_swap(&lock, NULL, (void *)1)) { + /* should ideally do a spin loop instruction here, but + hard to do it portably and doesn't really matter I + think: pthread_mutex_init() should be very fast, and + this is only run at start-up anyway. */ + } + +#ifdef WITH_THREAD + if (!_cffi_embed_startup_lock_ready) { +# ifndef _MSC_VER + pthread_mutexattr_t attr; + pthread_mutexattr_init(&attr); + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&_cffi_embed_startup_lock, &attr); +# else + InitializeCriticalSection(&_cffi_embed_startup_lock); +# endif + _cffi_embed_startup_lock_ready = 1; + } +#endif + + while (!cffi_compare_and_swap(&lock, (void *)1, NULL)) + ; + +#ifndef _MSC_VER + pthread_mutex_lock(&_cffi_embed_startup_lock); +#else + EnterCriticalSection(&_cffi_embed_startup_lock); +#endif +} + +static void _cffi_release_reentrant_mutex(void) +{ +#ifndef _MSC_VER + pthread_mutex_unlock(&_cffi_embed_startup_lock); +#else + LeaveCriticalSection(&_cffi_embed_startup_lock); +#endif +} + + +/********** CPython-specific section **********/ +#ifndef PYPY_VERSION + +#include "_cffi_errors.h" + + +#define _cffi_call_python_org _cffi_exports[_CFFI_CPIDX] + +PyMODINIT_FUNC _CFFI_PYTHON_STARTUP_FUNC(void); /* forward */ + +static void _cffi_py_initialize(void) +{ + /* XXX use initsigs=0, which "skips initialization registration of + signal handlers, which might be useful when Python is + embedded" according to the Python docs. But review and think + if it should be a user-controllable setting. + + XXX we should also give a way to write errors to a buffer + instead of to stderr. + + XXX if importing 'site' fails, CPython (any version) calls + exit(). Should we try to work around this behavior here? + */ + Py_InitializeEx(0); +} + +static int _cffi_initialize_python(void) +{ + /* This initializes Python, imports _cffi_backend, and then the + present .dll/.so is set up as a CPython C extension module. + */ + int result; + PyGILState_STATE state; + PyObject *pycode=NULL, *global_dict=NULL, *x; + PyObject *builtins; + + state = PyGILState_Ensure(); + + /* Call the initxxx() function from the present module. It will + create and initialize us as a CPython extension module, instead + of letting the startup Python code do it---it might reimport + the same .dll/.so and get maybe confused on some platforms. + It might also have troubles locating the .dll/.so again for all + I know. + */ + (void)_CFFI_PYTHON_STARTUP_FUNC(); + if (PyErr_Occurred()) + goto error; + + /* Now run the Python code provided to ffi.embedding_init_code(). + */ + pycode = Py_CompileString(_CFFI_PYTHON_STARTUP_CODE, + "", + Py_file_input); + if (pycode == NULL) + goto error; + global_dict = PyDict_New(); + if (global_dict == NULL) + goto error; + builtins = PyEval_GetBuiltins(); + if (builtins == NULL) + goto error; + if (PyDict_SetItemString(global_dict, "__builtins__", builtins) < 0) + goto error; + x = PyEval_EvalCode( +#if PY_MAJOR_VERSION < 3 + (PyCodeObject *) +#endif + pycode, global_dict, global_dict); + if (x == NULL) + goto error; + Py_DECREF(x); + + /* Done! Now if we've been called from + _cffi_start_and_call_python() in an ``extern "Python"``, we can + only hope that the Python code did correctly set up the + corresponding @ffi.def_extern() function. Otherwise, the + general logic of ``extern "Python"`` functions (inside the + _cffi_backend module) will find that the reference is still + missing and print an error. + */ + result = 0; + done: + Py_XDECREF(pycode); + Py_XDECREF(global_dict); + PyGILState_Release(state); + return result; + + error:; + { + /* Print as much information as potentially useful. + Debugging load-time failures with embedding is not fun + */ + PyObject *ecap; + PyObject *exception, *v, *tb, *f, *modules, *mod; + PyErr_Fetch(&exception, &v, &tb); + ecap = _cffi_start_error_capture(); + f = PySys_GetObject((char *)"stderr"); + if (f != NULL && f != Py_None) { + PyFile_WriteString( + "Failed to initialize the Python-CFFI embedding logic:\n\n", f); + } + + if (exception != NULL) { + PyErr_NormalizeException(&exception, &v, &tb); + PyErr_Display(exception, v, tb); + } + Py_XDECREF(exception); + Py_XDECREF(v); + Py_XDECREF(tb); + + if (f != NULL && f != Py_None) { + PyFile_WriteString("\nFrom: " _CFFI_MODULE_NAME + "\ncompiled with cffi version: 1.14.6" + "\n_cffi_backend module: ", f); + modules = PyImport_GetModuleDict(); + mod = PyDict_GetItemString(modules, "_cffi_backend"); + if (mod == NULL) { + PyFile_WriteString("not loaded", f); + } + else { + v = PyObject_GetAttrString(mod, "__file__"); + PyFile_WriteObject(v, f, 0); + Py_XDECREF(v); + } + PyFile_WriteString("\nsys.path: ", f); + PyFile_WriteObject(PySys_GetObject((char *)"path"), f, 0); + PyFile_WriteString("\n\n", f); + } + _cffi_stop_error_capture(ecap); + } + result = -1; + goto done; +} + +#if PY_VERSION_HEX < 0x03080000 +PyAPI_DATA(char *) _PyParser_TokenNames[]; /* from CPython */ +#endif + +static int _cffi_carefully_make_gil(void) +{ + /* This does the basic initialization of Python. It can be called + completely concurrently from unrelated threads. It assumes + that we don't hold the GIL before (if it exists), and we don't + hold it afterwards. + + (What it really does used to be completely different in Python 2 + and Python 3, with the Python 2 solution avoiding the spin-lock + around the Py_InitializeEx() call. However, after recent changes + to CPython 2.7 (issue #358) it no longer works. So we use the + Python 3 solution everywhere.) + + This initializes Python by calling Py_InitializeEx(). + Important: this must not be called concurrently at all. + So we use a global variable as a simple spin lock. This global + variable must be from 'libpythonX.Y.so', not from this + cffi-based extension module, because it must be shared from + different cffi-based extension modules. + + In Python < 3.8, we choose + _PyParser_TokenNames[0] as a completely arbitrary pointer value + that is never written to. The default is to point to the + string "ENDMARKER". We change it temporarily to point to the + next character in that string. (Yes, I know it's REALLY + obscure.) + + In Python >= 3.8, this string array is no longer writable, so + instead we pick PyCapsuleType.tp_version_tag. We can't change + Python < 3.8 because someone might use a mixture of cffi + embedded modules, some of which were compiled before this file + changed. + */ + +#ifdef WITH_THREAD +# if PY_VERSION_HEX < 0x03080000 + char *volatile *lock = (char *volatile *)_PyParser_TokenNames; + char *old_value, *locked_value; + + while (1) { /* spin loop */ + old_value = *lock; + locked_value = old_value + 1; + if (old_value[0] == 'E') { + assert(old_value[1] == 'N'); + if (cffi_compare_and_swap(lock, old_value, locked_value)) + break; + } + else { + assert(old_value[0] == 'N'); + /* should ideally do a spin loop instruction here, but + hard to do it portably and doesn't really matter I + think: PyEval_InitThreads() should be very fast, and + this is only run at start-up anyway. */ + } + } +# else + int volatile *lock = (int volatile *)&PyCapsule_Type.tp_version_tag; + int old_value, locked_value; + assert(!(PyCapsule_Type.tp_flags & Py_TPFLAGS_HAVE_VERSION_TAG)); + + while (1) { /* spin loop */ + old_value = *lock; + locked_value = -42; + if (old_value == 0) { + if (cffi_compare_and_swap(lock, old_value, locked_value)) + break; + } + else { + assert(old_value == locked_value); + /* should ideally do a spin loop instruction here, but + hard to do it portably and doesn't really matter I + think: PyEval_InitThreads() should be very fast, and + this is only run at start-up anyway. */ + } + } +# endif +#endif + + /* call Py_InitializeEx() */ + if (!Py_IsInitialized()) { + _cffi_py_initialize(); +#if PY_VERSION_HEX < 0x03070000 + PyEval_InitThreads(); +#endif + PyEval_SaveThread(); /* release the GIL */ + /* the returned tstate must be the one that has been stored into the + autoTLSkey by _PyGILState_Init() called from Py_Initialize(). */ + } + else { +#if PY_VERSION_HEX < 0x03070000 + /* PyEval_InitThreads() is always a no-op from CPython 3.7 */ + PyGILState_STATE state = PyGILState_Ensure(); + PyEval_InitThreads(); + PyGILState_Release(state); +#endif + } + +#ifdef WITH_THREAD + /* release the lock */ + while (!cffi_compare_and_swap(lock, locked_value, old_value)) + ; +#endif + + return 0; +} + +/********** end CPython-specific section **********/ + + +#else + + +/********** PyPy-specific section **********/ + +PyMODINIT_FUNC _CFFI_PYTHON_STARTUP_FUNC(const void *[]); /* forward */ + +static struct _cffi_pypy_init_s { + const char *name; + void *func; /* function pointer */ + const char *code; +} _cffi_pypy_init = { + _CFFI_MODULE_NAME, + _CFFI_PYTHON_STARTUP_FUNC, + _CFFI_PYTHON_STARTUP_CODE, +}; + +extern int pypy_carefully_make_gil(const char *); +extern int pypy_init_embedded_cffi_module(int, struct _cffi_pypy_init_s *); + +static int _cffi_carefully_make_gil(void) +{ + return pypy_carefully_make_gil(_CFFI_MODULE_NAME); +} + +static int _cffi_initialize_python(void) +{ + return pypy_init_embedded_cffi_module(0xB011, &_cffi_pypy_init); +} + +/********** end PyPy-specific section **********/ + + +#endif + + +#ifdef __GNUC__ +__attribute__((noinline)) +#endif +static _cffi_call_python_fnptr _cffi_start_python(void) +{ + /* Delicate logic to initialize Python. This function can be + called multiple times concurrently, e.g. when the process calls + its first ``extern "Python"`` functions in multiple threads at + once. It can also be called recursively, in which case we must + ignore it. We also have to consider what occurs if several + different cffi-based extensions reach this code in parallel + threads---it is a different copy of the code, then, and we + can't have any shared global variable unless it comes from + 'libpythonX.Y.so'. + + Idea: + + * _cffi_carefully_make_gil(): "carefully" call + PyEval_InitThreads() (possibly with Py_InitializeEx() first). + + * then we use a (local) custom lock to make sure that a call to this + cffi-based extension will wait if another call to the *same* + extension is running the initialization in another thread. + It is reentrant, so that a recursive call will not block, but + only one from a different thread. + + * then we grab the GIL and (Python 2) we call Py_InitializeEx(). + At this point, concurrent calls to Py_InitializeEx() are not + possible: we have the GIL. + + * do the rest of the specific initialization, which may + temporarily release the GIL but not the custom lock. + Only release the custom lock when we are done. + */ + static char called = 0; + + if (_cffi_carefully_make_gil() != 0) + return NULL; + + _cffi_acquire_reentrant_mutex(); + + /* Here the GIL exists, but we don't have it. We're only protected + from concurrency by the reentrant mutex. */ + + /* This file only initializes the embedded module once, the first + time this is called, even if there are subinterpreters. */ + if (!called) { + called = 1; /* invoke _cffi_initialize_python() only once, + but don't set '_cffi_call_python' right now, + otherwise concurrent threads won't call + this function at all (we need them to wait) */ + if (_cffi_initialize_python() == 0) { + /* now initialization is finished. Switch to the fast-path. */ + + /* We would like nobody to see the new value of + '_cffi_call_python' without also seeing the rest of the + data initialized. However, this is not possible. But + the new value of '_cffi_call_python' is the function + 'cffi_call_python()' from _cffi_backend. So: */ + cffi_write_barrier(); + /* ^^^ we put a write barrier here, and a corresponding + read barrier at the start of cffi_call_python(). This + ensures that after that read barrier, we see everything + done here before the write barrier. + */ + + assert(_cffi_call_python_org != NULL); + _cffi_call_python = (_cffi_call_python_fnptr)_cffi_call_python_org; + } + else { + /* initialization failed. Reset this to NULL, even if it was + already set to some other value. Future calls to + _cffi_start_python() are still forced to occur, and will + always return NULL from now on. */ + _cffi_call_python_org = NULL; + } + } + + _cffi_release_reentrant_mutex(); + + return (_cffi_call_python_fnptr)_cffi_call_python_org; +} + +static +void _cffi_start_and_call_python(struct _cffi_externpy_s *externpy, char *args) +{ + _cffi_call_python_fnptr fnptr; + int current_err = errno; +#ifdef _MSC_VER + int current_lasterr = GetLastError(); +#endif + fnptr = _cffi_start_python(); + if (fnptr == NULL) { + fprintf(stderr, "function %s() called, but initialization code " + "failed. Returning 0.\n", externpy->name); + memset(args, 0, externpy->size_of_result); + } +#ifdef _MSC_VER + SetLastError(current_lasterr); +#endif + errno = current_err; + + if (fnptr != NULL) + fnptr(externpy, args); +} + + +/* The cffi_start_python() function makes sure Python is initialized + and our cffi module is set up. It can be called manually from the + user C code. The same effect is obtained automatically from any + dll-exported ``extern "Python"`` function. This function returns + -1 if initialization failed, 0 if all is OK. */ +_CFFI_UNUSED_FN +static int cffi_start_python(void) +{ + if (_cffi_call_python == &_cffi_start_and_call_python) { + if (_cffi_start_python() == NULL) + return -1; + } + cffi_read_barrier(); + return 0; +} + +#undef cffi_compare_and_swap +#undef cffi_write_barrier +#undef cffi_read_barrier + +#ifdef __cplusplus +} +#endif diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/api.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/api.py new file mode 100644 index 0000000..999a8ae --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/api.py @@ -0,0 +1,965 @@ +import sys, types +from .lock import allocate_lock +from .error import CDefError +from . import model + +try: + callable +except NameError: + # Python 3.1 + from collections import Callable + callable = lambda x: isinstance(x, Callable) + +try: + basestring +except NameError: + # Python 3.x + basestring = str + +_unspecified = object() + + + +class FFI(object): + r''' + The main top-level class that you instantiate once, or once per module. + + Example usage: + + ffi = FFI() + ffi.cdef(""" + int printf(const char *, ...); + """) + + C = ffi.dlopen(None) # standard library + -or- + C = ffi.verify() # use a C compiler: verify the decl above is right + + C.printf("hello, %s!\n", ffi.new("char[]", "world")) + ''' + + def __init__(self, backend=None): + """Create an FFI instance. The 'backend' argument is used to + select a non-default backend, mostly for tests. + """ + if backend is None: + # You need PyPy (>= 2.0 beta), or a CPython (>= 2.6) with + # _cffi_backend.so compiled. + import _cffi_backend as backend + from . import __version__ + if backend.__version__ != __version__: + # bad version! Try to be as explicit as possible. + if hasattr(backend, '__file__'): + # CPython + raise Exception("Version mismatch: this is the 'cffi' package version %s, located in %r. When we import the top-level '_cffi_backend' extension module, we get version %s, located in %r. The two versions should be equal; check your installation." % ( + __version__, __file__, + backend.__version__, backend.__file__)) + else: + # PyPy + raise Exception("Version mismatch: this is the 'cffi' package version %s, located in %r. This interpreter comes with a built-in '_cffi_backend' module, which is version %s. The two versions should be equal; check your installation." % ( + __version__, __file__, backend.__version__)) + # (If you insist you can also try to pass the option + # 'backend=backend_ctypes.CTypesBackend()', but don't + # rely on it! It's probably not going to work well.) + + from . import cparser + self._backend = backend + self._lock = allocate_lock() + self._parser = cparser.Parser() + self._cached_btypes = {} + self._parsed_types = types.ModuleType('parsed_types').__dict__ + self._new_types = types.ModuleType('new_types').__dict__ + self._function_caches = [] + self._libraries = [] + self._cdefsources = [] + self._included_ffis = [] + self._windows_unicode = None + self._init_once_cache = {} + self._cdef_version = None + self._embedding = None + self._typecache = model.get_typecache(backend) + if hasattr(backend, 'set_ffi'): + backend.set_ffi(self) + for name in list(backend.__dict__): + if name.startswith('RTLD_'): + setattr(self, name, getattr(backend, name)) + # + with self._lock: + self.BVoidP = self._get_cached_btype(model.voidp_type) + self.BCharA = self._get_cached_btype(model.char_array_type) + if isinstance(backend, types.ModuleType): + # _cffi_backend: attach these constants to the class + if not hasattr(FFI, 'NULL'): + FFI.NULL = self.cast(self.BVoidP, 0) + FFI.CData, FFI.CType = backend._get_types() + else: + # ctypes backend: attach these constants to the instance + self.NULL = self.cast(self.BVoidP, 0) + self.CData, self.CType = backend._get_types() + self.buffer = backend.buffer + + def cdef(self, csource, override=False, packed=False, pack=None): + """Parse the given C source. This registers all declared functions, + types, and global variables. The functions and global variables can + then be accessed via either 'ffi.dlopen()' or 'ffi.verify()'. + The types can be used in 'ffi.new()' and other functions. + If 'packed' is specified as True, all structs declared inside this + cdef are packed, i.e. laid out without any field alignment at all. + Alternatively, 'pack' can be a small integer, and requests for + alignment greater than that are ignored (pack=1 is equivalent to + packed=True). + """ + self._cdef(csource, override=override, packed=packed, pack=pack) + + def embedding_api(self, csource, packed=False, pack=None): + self._cdef(csource, packed=packed, pack=pack, dllexport=True) + if self._embedding is None: + self._embedding = '' + + def _cdef(self, csource, override=False, **options): + if not isinstance(csource, str): # unicode, on Python 2 + if not isinstance(csource, basestring): + raise TypeError("cdef() argument must be a string") + csource = csource.encode('ascii') + with self._lock: + self._cdef_version = object() + self._parser.parse(csource, override=override, **options) + self._cdefsources.append(csource) + if override: + for cache in self._function_caches: + cache.clear() + finishlist = self._parser._recomplete + if finishlist: + self._parser._recomplete = [] + for tp in finishlist: + tp.finish_backend_type(self, finishlist) + + def dlopen(self, name, flags=0): + """Load and return a dynamic library identified by 'name'. + The standard C library can be loaded by passing None. + Note that functions and types declared by 'ffi.cdef()' are not + linked to a particular library, just like C headers; in the + library we only look for the actual (untyped) symbols. + """ + if not (isinstance(name, basestring) or + name is None or + isinstance(name, self.CData)): + raise TypeError("dlopen(name): name must be a file name, None, " + "or an already-opened 'void *' handle") + with self._lock: + lib, function_cache = _make_ffi_library(self, name, flags) + self._function_caches.append(function_cache) + self._libraries.append(lib) + return lib + + def dlclose(self, lib): + """Close a library obtained with ffi.dlopen(). After this call, + access to functions or variables from the library will fail + (possibly with a segmentation fault). + """ + type(lib).__cffi_close__(lib) + + def _typeof_locked(self, cdecl): + # call me with the lock! + key = cdecl + if key in self._parsed_types: + return self._parsed_types[key] + # + if not isinstance(cdecl, str): # unicode, on Python 2 + cdecl = cdecl.encode('ascii') + # + type = self._parser.parse_type(cdecl) + really_a_function_type = type.is_raw_function + if really_a_function_type: + type = type.as_function_pointer() + btype = self._get_cached_btype(type) + result = btype, really_a_function_type + self._parsed_types[key] = result + return result + + def _typeof(self, cdecl, consider_function_as_funcptr=False): + # string -> ctype object + try: + result = self._parsed_types[cdecl] + except KeyError: + with self._lock: + result = self._typeof_locked(cdecl) + # + btype, really_a_function_type = result + if really_a_function_type and not consider_function_as_funcptr: + raise CDefError("the type %r is a function type, not a " + "pointer-to-function type" % (cdecl,)) + return btype + + def typeof(self, cdecl): + """Parse the C type given as a string and return the + corresponding object. + It can also be used on 'cdata' instance to get its C type. + """ + if isinstance(cdecl, basestring): + return self._typeof(cdecl) + if isinstance(cdecl, self.CData): + return self._backend.typeof(cdecl) + if isinstance(cdecl, types.BuiltinFunctionType): + res = _builtin_function_type(cdecl) + if res is not None: + return res + if (isinstance(cdecl, types.FunctionType) + and hasattr(cdecl, '_cffi_base_type')): + with self._lock: + return self._get_cached_btype(cdecl._cffi_base_type) + raise TypeError(type(cdecl)) + + def sizeof(self, cdecl): + """Return the size in bytes of the argument. It can be a + string naming a C type, or a 'cdata' instance. + """ + if isinstance(cdecl, basestring): + BType = self._typeof(cdecl) + return self._backend.sizeof(BType) + else: + return self._backend.sizeof(cdecl) + + def alignof(self, cdecl): + """Return the natural alignment size in bytes of the C type + given as a string. + """ + if isinstance(cdecl, basestring): + cdecl = self._typeof(cdecl) + return self._backend.alignof(cdecl) + + def offsetof(self, cdecl, *fields_or_indexes): + """Return the offset of the named field inside the given + structure or array, which must be given as a C type name. + You can give several field names in case of nested structures. + You can also give numeric values which correspond to array + items, in case of an array type. + """ + if isinstance(cdecl, basestring): + cdecl = self._typeof(cdecl) + return self._typeoffsetof(cdecl, *fields_or_indexes)[1] + + def new(self, cdecl, init=None): + """Allocate an instance according to the specified C type and + return a pointer to it. The specified C type must be either a + pointer or an array: ``new('X *')`` allocates an X and returns + a pointer to it, whereas ``new('X[n]')`` allocates an array of + n X'es and returns an array referencing it (which works + mostly like a pointer, like in C). You can also use + ``new('X[]', n)`` to allocate an array of a non-constant + length n. + + The memory is initialized following the rules of declaring a + global variable in C: by default it is zero-initialized, but + an explicit initializer can be given which can be used to + fill all or part of the memory. + + When the returned object goes out of scope, the memory + is freed. In other words the returned object has + ownership of the value of type 'cdecl' that it points to. This + means that the raw data can be used as long as this object is + kept alive, but must not be used for a longer time. Be careful + about that when copying the pointer to the memory somewhere + else, e.g. into another structure. + """ + if isinstance(cdecl, basestring): + cdecl = self._typeof(cdecl) + return self._backend.newp(cdecl, init) + + def new_allocator(self, alloc=None, free=None, + should_clear_after_alloc=True): + """Return a new allocator, i.e. a function that behaves like ffi.new() + but uses the provided low-level 'alloc' and 'free' functions. + + 'alloc' is called with the size as argument. If it returns NULL, a + MemoryError is raised. 'free' is called with the result of 'alloc' + as argument. Both can be either Python function or directly C + functions. If 'free' is None, then no free function is called. + If both 'alloc' and 'free' are None, the default is used. + + If 'should_clear_after_alloc' is set to False, then the memory + returned by 'alloc' is assumed to be already cleared (or you are + fine with garbage); otherwise CFFI will clear it. + """ + compiled_ffi = self._backend.FFI() + allocator = compiled_ffi.new_allocator(alloc, free, + should_clear_after_alloc) + def allocate(cdecl, init=None): + if isinstance(cdecl, basestring): + cdecl = self._typeof(cdecl) + return allocator(cdecl, init) + return allocate + + def cast(self, cdecl, source): + """Similar to a C cast: returns an instance of the named C + type initialized with the given 'source'. The source is + casted between integers or pointers of any type. + """ + if isinstance(cdecl, basestring): + cdecl = self._typeof(cdecl) + return self._backend.cast(cdecl, source) + + def string(self, cdata, maxlen=-1): + """Return a Python string (or unicode string) from the 'cdata'. + If 'cdata' is a pointer or array of characters or bytes, returns + the null-terminated string. The returned string extends until + the first null character, or at most 'maxlen' characters. If + 'cdata' is an array then 'maxlen' defaults to its length. + + If 'cdata' is a pointer or array of wchar_t, returns a unicode + string following the same rules. + + If 'cdata' is a single character or byte or a wchar_t, returns + it as a string or unicode string. + + If 'cdata' is an enum, returns the value of the enumerator as a + string, or 'NUMBER' if the value is out of range. + """ + return self._backend.string(cdata, maxlen) + + def unpack(self, cdata, length): + """Unpack an array of C data of the given length, + returning a Python string/unicode/list. + + If 'cdata' is a pointer to 'char', returns a byte string. + It does not stop at the first null. This is equivalent to: + ffi.buffer(cdata, length)[:] + + If 'cdata' is a pointer to 'wchar_t', returns a unicode string. + 'length' is measured in wchar_t's; it is not the size in bytes. + + If 'cdata' is a pointer to anything else, returns a list of + 'length' items. This is a faster equivalent to: + [cdata[i] for i in range(length)] + """ + return self._backend.unpack(cdata, length) + + #def buffer(self, cdata, size=-1): + # """Return a read-write buffer object that references the raw C data + # pointed to by the given 'cdata'. The 'cdata' must be a pointer or + # an array. Can be passed to functions expecting a buffer, or directly + # manipulated with: + # + # buf[:] get a copy of it in a regular string, or + # buf[idx] as a single character + # buf[:] = ... + # buf[idx] = ... change the content + # """ + # note that 'buffer' is a type, set on this instance by __init__ + + def from_buffer(self, cdecl, python_buffer=_unspecified, + require_writable=False): + """Return a cdata of the given type pointing to the data of the + given Python object, which must support the buffer interface. + Note that this is not meant to be used on the built-in types + str or unicode (you can build 'char[]' arrays explicitly) + but only on objects containing large quantities of raw data + in some other format, like 'array.array' or numpy arrays. + + The first argument is optional and default to 'char[]'. + """ + if python_buffer is _unspecified: + cdecl, python_buffer = self.BCharA, cdecl + elif isinstance(cdecl, basestring): + cdecl = self._typeof(cdecl) + return self._backend.from_buffer(cdecl, python_buffer, + require_writable) + + def memmove(self, dest, src, n): + """ffi.memmove(dest, src, n) copies n bytes of memory from src to dest. + + Like the C function memmove(), the memory areas may overlap; + apart from that it behaves like the C function memcpy(). + + 'src' can be any cdata ptr or array, or any Python buffer object. + 'dest' can be any cdata ptr or array, or a writable Python buffer + object. The size to copy, 'n', is always measured in bytes. + + Unlike other methods, this one supports all Python buffer including + byte strings and bytearrays---but it still does not support + non-contiguous buffers. + """ + return self._backend.memmove(dest, src, n) + + def callback(self, cdecl, python_callable=None, error=None, onerror=None): + """Return a callback object or a decorator making such a + callback object. 'cdecl' must name a C function pointer type. + The callback invokes the specified 'python_callable' (which may + be provided either directly or via a decorator). Important: the + callback object must be manually kept alive for as long as the + callback may be invoked from the C level. + """ + def callback_decorator_wrap(python_callable): + if not callable(python_callable): + raise TypeError("the 'python_callable' argument " + "is not callable") + return self._backend.callback(cdecl, python_callable, + error, onerror) + if isinstance(cdecl, basestring): + cdecl = self._typeof(cdecl, consider_function_as_funcptr=True) + if python_callable is None: + return callback_decorator_wrap # decorator mode + else: + return callback_decorator_wrap(python_callable) # direct mode + + def getctype(self, cdecl, replace_with=''): + """Return a string giving the C type 'cdecl', which may be itself + a string or a object. If 'replace_with' is given, it gives + extra text to append (or insert for more complicated C types), like + a variable name, or '*' to get actually the C type 'pointer-to-cdecl'. + """ + if isinstance(cdecl, basestring): + cdecl = self._typeof(cdecl) + replace_with = replace_with.strip() + if (replace_with.startswith('*') + and '&[' in self._backend.getcname(cdecl, '&')): + replace_with = '(%s)' % replace_with + elif replace_with and not replace_with[0] in '[(': + replace_with = ' ' + replace_with + return self._backend.getcname(cdecl, replace_with) + + def gc(self, cdata, destructor, size=0): + """Return a new cdata object that points to the same + data. Later, when this new cdata object is garbage-collected, + 'destructor(old_cdata_object)' will be called. + + The optional 'size' gives an estimate of the size, used to + trigger the garbage collection more eagerly. So far only used + on PyPy. It tells the GC that the returned object keeps alive + roughly 'size' bytes of external memory. + """ + return self._backend.gcp(cdata, destructor, size) + + def _get_cached_btype(self, type): + assert self._lock.acquire(False) is False + # call me with the lock! + try: + BType = self._cached_btypes[type] + except KeyError: + finishlist = [] + BType = type.get_cached_btype(self, finishlist) + for type in finishlist: + type.finish_backend_type(self, finishlist) + return BType + + def verify(self, source='', tmpdir=None, **kwargs): + """Verify that the current ffi signatures compile on this + machine, and return a dynamic library object. The dynamic + library can be used to call functions and access global + variables declared in this 'ffi'. The library is compiled + by the C compiler: it gives you C-level API compatibility + (including calling macros). This is unlike 'ffi.dlopen()', + which requires binary compatibility in the signatures. + """ + from .verifier import Verifier, _caller_dir_pycache + # + # If set_unicode(True) was called, insert the UNICODE and + # _UNICODE macro declarations + if self._windows_unicode: + self._apply_windows_unicode(kwargs) + # + # Set the tmpdir here, and not in Verifier.__init__: it picks + # up the caller's directory, which we want to be the caller of + # ffi.verify(), as opposed to the caller of Veritier(). + tmpdir = tmpdir or _caller_dir_pycache() + # + # Make a Verifier() and use it to load the library. + self.verifier = Verifier(self, source, tmpdir, **kwargs) + lib = self.verifier.load_library() + # + # Save the loaded library for keep-alive purposes, even + # if the caller doesn't keep it alive itself (it should). + self._libraries.append(lib) + return lib + + def _get_errno(self): + return self._backend.get_errno() + def _set_errno(self, errno): + self._backend.set_errno(errno) + errno = property(_get_errno, _set_errno, None, + "the value of 'errno' from/to the C calls") + + def getwinerror(self, code=-1): + return self._backend.getwinerror(code) + + def _pointer_to(self, ctype): + with self._lock: + return model.pointer_cache(self, ctype) + + def addressof(self, cdata, *fields_or_indexes): + """Return the address of a . + If 'fields_or_indexes' are given, returns the address of that + field or array item in the structure or array, recursively in + case of nested structures. + """ + try: + ctype = self._backend.typeof(cdata) + except TypeError: + if '__addressof__' in type(cdata).__dict__: + return type(cdata).__addressof__(cdata, *fields_or_indexes) + raise + if fields_or_indexes: + ctype, offset = self._typeoffsetof(ctype, *fields_or_indexes) + else: + if ctype.kind == "pointer": + raise TypeError("addressof(pointer)") + offset = 0 + ctypeptr = self._pointer_to(ctype) + return self._backend.rawaddressof(ctypeptr, cdata, offset) + + def _typeoffsetof(self, ctype, field_or_index, *fields_or_indexes): + ctype, offset = self._backend.typeoffsetof(ctype, field_or_index) + for field1 in fields_or_indexes: + ctype, offset1 = self._backend.typeoffsetof(ctype, field1, 1) + offset += offset1 + return ctype, offset + + def include(self, ffi_to_include): + """Includes the typedefs, structs, unions and enums defined + in another FFI instance. Usage is similar to a #include in C, + where a part of the program might include types defined in + another part for its own usage. Note that the include() + method has no effect on functions, constants and global + variables, which must anyway be accessed directly from the + lib object returned by the original FFI instance. + """ + if not isinstance(ffi_to_include, FFI): + raise TypeError("ffi.include() expects an argument that is also of" + " type cffi.FFI, not %r" % ( + type(ffi_to_include).__name__,)) + if ffi_to_include is self: + raise ValueError("self.include(self)") + with ffi_to_include._lock: + with self._lock: + self._parser.include(ffi_to_include._parser) + self._cdefsources.append('[') + self._cdefsources.extend(ffi_to_include._cdefsources) + self._cdefsources.append(']') + self._included_ffis.append(ffi_to_include) + + def new_handle(self, x): + return self._backend.newp_handle(self.BVoidP, x) + + def from_handle(self, x): + return self._backend.from_handle(x) + + def release(self, x): + self._backend.release(x) + + def set_unicode(self, enabled_flag): + """Windows: if 'enabled_flag' is True, enable the UNICODE and + _UNICODE defines in C, and declare the types like TCHAR and LPTCSTR + to be (pointers to) wchar_t. If 'enabled_flag' is False, + declare these types to be (pointers to) plain 8-bit characters. + This is mostly for backward compatibility; you usually want True. + """ + if self._windows_unicode is not None: + raise ValueError("set_unicode() can only be called once") + enabled_flag = bool(enabled_flag) + if enabled_flag: + self.cdef("typedef wchar_t TBYTE;" + "typedef wchar_t TCHAR;" + "typedef const wchar_t *LPCTSTR;" + "typedef const wchar_t *PCTSTR;" + "typedef wchar_t *LPTSTR;" + "typedef wchar_t *PTSTR;" + "typedef TBYTE *PTBYTE;" + "typedef TCHAR *PTCHAR;") + else: + self.cdef("typedef char TBYTE;" + "typedef char TCHAR;" + "typedef const char *LPCTSTR;" + "typedef const char *PCTSTR;" + "typedef char *LPTSTR;" + "typedef char *PTSTR;" + "typedef TBYTE *PTBYTE;" + "typedef TCHAR *PTCHAR;") + self._windows_unicode = enabled_flag + + def _apply_windows_unicode(self, kwds): + defmacros = kwds.get('define_macros', ()) + if not isinstance(defmacros, (list, tuple)): + raise TypeError("'define_macros' must be a list or tuple") + defmacros = list(defmacros) + [('UNICODE', '1'), + ('_UNICODE', '1')] + kwds['define_macros'] = defmacros + + def _apply_embedding_fix(self, kwds): + # must include an argument like "-lpython2.7" for the compiler + def ensure(key, value): + lst = kwds.setdefault(key, []) + if value not in lst: + lst.append(value) + # + if '__pypy__' in sys.builtin_module_names: + import os + if sys.platform == "win32": + # we need 'libpypy-c.lib'. Current distributions of + # pypy (>= 4.1) contain it as 'libs/python27.lib'. + pythonlib = "python{0[0]}{0[1]}".format(sys.version_info) + if hasattr(sys, 'prefix'): + ensure('library_dirs', os.path.join(sys.prefix, 'libs')) + else: + # we need 'libpypy-c.{so,dylib}', which should be by + # default located in 'sys.prefix/bin' for installed + # systems. + if sys.version_info < (3,): + pythonlib = "pypy-c" + else: + pythonlib = "pypy3-c" + if hasattr(sys, 'prefix'): + ensure('library_dirs', os.path.join(sys.prefix, 'bin')) + # On uninstalled pypy's, the libpypy-c is typically found in + # .../pypy/goal/. + if hasattr(sys, 'prefix'): + ensure('library_dirs', os.path.join(sys.prefix, 'pypy', 'goal')) + else: + if sys.platform == "win32": + template = "python%d%d" + if hasattr(sys, 'gettotalrefcount'): + template += '_d' + else: + try: + import sysconfig + except ImportError: # 2.6 + from distutils import sysconfig + template = "python%d.%d" + if sysconfig.get_config_var('DEBUG_EXT'): + template += sysconfig.get_config_var('DEBUG_EXT') + pythonlib = (template % + (sys.hexversion >> 24, (sys.hexversion >> 16) & 0xff)) + if hasattr(sys, 'abiflags'): + pythonlib += sys.abiflags + ensure('libraries', pythonlib) + if sys.platform == "win32": + ensure('extra_link_args', '/MANIFEST') + + def set_source(self, module_name, source, source_extension='.c', **kwds): + import os + if hasattr(self, '_assigned_source'): + raise ValueError("set_source() cannot be called several times " + "per ffi object") + if not isinstance(module_name, basestring): + raise TypeError("'module_name' must be a string") + if os.sep in module_name or (os.altsep and os.altsep in module_name): + raise ValueError("'module_name' must not contain '/': use a dotted " + "name to make a 'package.module' location") + self._assigned_source = (str(module_name), source, + source_extension, kwds) + + def set_source_pkgconfig(self, module_name, pkgconfig_libs, source, + source_extension='.c', **kwds): + from . import pkgconfig + if not isinstance(pkgconfig_libs, list): + raise TypeError("the pkgconfig_libs argument must be a list " + "of package names") + kwds2 = pkgconfig.flags_from_pkgconfig(pkgconfig_libs) + pkgconfig.merge_flags(kwds, kwds2) + self.set_source(module_name, source, source_extension, **kwds) + + def distutils_extension(self, tmpdir='build', verbose=True): + from distutils.dir_util import mkpath + from .recompiler import recompile + # + if not hasattr(self, '_assigned_source'): + if hasattr(self, 'verifier'): # fallback, 'tmpdir' ignored + return self.verifier.get_extension() + raise ValueError("set_source() must be called before" + " distutils_extension()") + module_name, source, source_extension, kwds = self._assigned_source + if source is None: + raise TypeError("distutils_extension() is only for C extension " + "modules, not for dlopen()-style pure Python " + "modules") + mkpath(tmpdir) + ext, updated = recompile(self, module_name, + source, tmpdir=tmpdir, extradir=tmpdir, + source_extension=source_extension, + call_c_compiler=False, **kwds) + if verbose: + if updated: + sys.stderr.write("regenerated: %r\n" % (ext.sources[0],)) + else: + sys.stderr.write("not modified: %r\n" % (ext.sources[0],)) + return ext + + def emit_c_code(self, filename): + from .recompiler import recompile + # + if not hasattr(self, '_assigned_source'): + raise ValueError("set_source() must be called before emit_c_code()") + module_name, source, source_extension, kwds = self._assigned_source + if source is None: + raise TypeError("emit_c_code() is only for C extension modules, " + "not for dlopen()-style pure Python modules") + recompile(self, module_name, source, + c_file=filename, call_c_compiler=False, **kwds) + + def emit_python_code(self, filename): + from .recompiler import recompile + # + if not hasattr(self, '_assigned_source'): + raise ValueError("set_source() must be called before emit_c_code()") + module_name, source, source_extension, kwds = self._assigned_source + if source is not None: + raise TypeError("emit_python_code() is only for dlopen()-style " + "pure Python modules, not for C extension modules") + recompile(self, module_name, source, + c_file=filename, call_c_compiler=False, **kwds) + + def compile(self, tmpdir='.', verbose=0, target=None, debug=None): + """The 'target' argument gives the final file name of the + compiled DLL. Use '*' to force distutils' choice, suitable for + regular CPython C API modules. Use a file name ending in '.*' + to ask for the system's default extension for dynamic libraries + (.so/.dll/.dylib). + + The default is '*' when building a non-embedded C API extension, + and (module_name + '.*') when building an embedded library. + """ + from .recompiler import recompile + # + if not hasattr(self, '_assigned_source'): + raise ValueError("set_source() must be called before compile()") + module_name, source, source_extension, kwds = self._assigned_source + return recompile(self, module_name, source, tmpdir=tmpdir, + target=target, source_extension=source_extension, + compiler_verbose=verbose, debug=debug, **kwds) + + def init_once(self, func, tag): + # Read _init_once_cache[tag], which is either (False, lock) if + # we're calling the function now in some thread, or (True, result). + # Don't call setdefault() in most cases, to avoid allocating and + # immediately freeing a lock; but still use setdefaut() to avoid + # races. + try: + x = self._init_once_cache[tag] + except KeyError: + x = self._init_once_cache.setdefault(tag, (False, allocate_lock())) + # Common case: we got (True, result), so we return the result. + if x[0]: + return x[1] + # Else, it's a lock. Acquire it to serialize the following tests. + with x[1]: + # Read again from _init_once_cache the current status. + x = self._init_once_cache[tag] + if x[0]: + return x[1] + # Call the function and store the result back. + result = func() + self._init_once_cache[tag] = (True, result) + return result + + def embedding_init_code(self, pysource): + if self._embedding: + raise ValueError("embedding_init_code() can only be called once") + # fix 'pysource' before it gets dumped into the C file: + # - remove empty lines at the beginning, so it starts at "line 1" + # - dedent, if all non-empty lines are indented + # - check for SyntaxErrors + import re + match = re.match(r'\s*\n', pysource) + if match: + pysource = pysource[match.end():] + lines = pysource.splitlines() or [''] + prefix = re.match(r'\s*', lines[0]).group() + for i in range(1, len(lines)): + line = lines[i] + if line.rstrip(): + while not line.startswith(prefix): + prefix = prefix[:-1] + i = len(prefix) + lines = [line[i:]+'\n' for line in lines] + pysource = ''.join(lines) + # + compile(pysource, "cffi_init", "exec") + # + self._embedding = pysource + + def def_extern(self, *args, **kwds): + raise ValueError("ffi.def_extern() is only available on API-mode FFI " + "objects") + + def list_types(self): + """Returns the user type names known to this FFI instance. + This returns a tuple containing three lists of names: + (typedef_names, names_of_structs, names_of_unions) + """ + typedefs = [] + structs = [] + unions = [] + for key in self._parser._declarations: + if key.startswith('typedef '): + typedefs.append(key[8:]) + elif key.startswith('struct '): + structs.append(key[7:]) + elif key.startswith('union '): + unions.append(key[6:]) + typedefs.sort() + structs.sort() + unions.sort() + return (typedefs, structs, unions) + + +def _load_backend_lib(backend, name, flags): + import os + if not isinstance(name, basestring): + if sys.platform != "win32" or name is not None: + return backend.load_library(name, flags) + name = "c" # Windows: load_library(None) fails, but this works + # on Python 2 (backward compatibility hack only) + first_error = None + if '.' in name or '/' in name or os.sep in name: + try: + return backend.load_library(name, flags) + except OSError as e: + first_error = e + import ctypes.util + path = ctypes.util.find_library(name) + if path is None: + if name == "c" and sys.platform == "win32" and sys.version_info >= (3,): + raise OSError("dlopen(None) cannot work on Windows for Python 3 " + "(see http://bugs.python.org/issue23606)") + msg = ("ctypes.util.find_library() did not manage " + "to locate a library called %r" % (name,)) + if first_error is not None: + msg = "%s. Additionally, %s" % (first_error, msg) + raise OSError(msg) + return backend.load_library(path, flags) + +def _make_ffi_library(ffi, libname, flags): + backend = ffi._backend + backendlib = _load_backend_lib(backend, libname, flags) + # + def accessor_function(name): + key = 'function ' + name + tp, _ = ffi._parser._declarations[key] + BType = ffi._get_cached_btype(tp) + value = backendlib.load_function(BType, name) + library.__dict__[name] = value + # + def accessor_variable(name): + key = 'variable ' + name + tp, _ = ffi._parser._declarations[key] + BType = ffi._get_cached_btype(tp) + read_variable = backendlib.read_variable + write_variable = backendlib.write_variable + setattr(FFILibrary, name, property( + lambda self: read_variable(BType, name), + lambda self, value: write_variable(BType, name, value))) + # + def addressof_var(name): + try: + return addr_variables[name] + except KeyError: + with ffi._lock: + if name not in addr_variables: + key = 'variable ' + name + tp, _ = ffi._parser._declarations[key] + BType = ffi._get_cached_btype(tp) + if BType.kind != 'array': + BType = model.pointer_cache(ffi, BType) + p = backendlib.load_function(BType, name) + addr_variables[name] = p + return addr_variables[name] + # + def accessor_constant(name): + raise NotImplementedError("non-integer constant '%s' cannot be " + "accessed from a dlopen() library" % (name,)) + # + def accessor_int_constant(name): + library.__dict__[name] = ffi._parser._int_constants[name] + # + accessors = {} + accessors_version = [False] + addr_variables = {} + # + def update_accessors(): + if accessors_version[0] is ffi._cdef_version: + return + # + for key, (tp, _) in ffi._parser._declarations.items(): + if not isinstance(tp, model.EnumType): + tag, name = key.split(' ', 1) + if tag == 'function': + accessors[name] = accessor_function + elif tag == 'variable': + accessors[name] = accessor_variable + elif tag == 'constant': + accessors[name] = accessor_constant + else: + for i, enumname in enumerate(tp.enumerators): + def accessor_enum(name, tp=tp, i=i): + tp.check_not_partial() + library.__dict__[name] = tp.enumvalues[i] + accessors[enumname] = accessor_enum + for name in ffi._parser._int_constants: + accessors.setdefault(name, accessor_int_constant) + accessors_version[0] = ffi._cdef_version + # + def make_accessor(name): + with ffi._lock: + if name in library.__dict__ or name in FFILibrary.__dict__: + return # added by another thread while waiting for the lock + if name not in accessors: + update_accessors() + if name not in accessors: + raise AttributeError(name) + accessors[name](name) + # + class FFILibrary(object): + def __getattr__(self, name): + make_accessor(name) + return getattr(self, name) + def __setattr__(self, name, value): + try: + property = getattr(self.__class__, name) + except AttributeError: + make_accessor(name) + setattr(self, name, value) + else: + property.__set__(self, value) + def __dir__(self): + with ffi._lock: + update_accessors() + return accessors.keys() + def __addressof__(self, name): + if name in library.__dict__: + return library.__dict__[name] + if name in FFILibrary.__dict__: + return addressof_var(name) + make_accessor(name) + if name in library.__dict__: + return library.__dict__[name] + if name in FFILibrary.__dict__: + return addressof_var(name) + raise AttributeError("cffi library has no function or " + "global variable named '%s'" % (name,)) + def __cffi_close__(self): + backendlib.close_lib() + self.__dict__.clear() + # + if isinstance(libname, basestring): + try: + if not isinstance(libname, str): # unicode, on Python 2 + libname = libname.encode('utf-8') + FFILibrary.__name__ = 'FFILibrary_%s' % libname + except UnicodeError: + pass + library = FFILibrary() + return library, library.__dict__ + +def _builtin_function_type(func): + # a hack to make at least ffi.typeof(builtin_function) work, + # if the builtin function was obtained by 'vengine_cpy'. + import sys + try: + module = sys.modules[func.__module__] + ffi = module._cffi_original_ffi + types_of_builtin_funcs = module._cffi_types_of_builtin_funcs + tp = types_of_builtin_funcs[func] + except (KeyError, AttributeError, TypeError): + return None + else: + with ffi._lock: + return ffi._get_cached_btype(tp) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/backend_ctypes.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/backend_ctypes.py new file mode 100644 index 0000000..e7956a7 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/backend_ctypes.py @@ -0,0 +1,1121 @@ +import ctypes, ctypes.util, operator, sys +from . import model + +if sys.version_info < (3,): + bytechr = chr +else: + unicode = str + long = int + xrange = range + bytechr = lambda num: bytes([num]) + +class CTypesType(type): + pass + +class CTypesData(object): + __metaclass__ = CTypesType + __slots__ = ['__weakref__'] + __name__ = '' + + def __init__(self, *args): + raise TypeError("cannot instantiate %r" % (self.__class__,)) + + @classmethod + def _newp(cls, init): + raise TypeError("expected a pointer or array ctype, got '%s'" + % (cls._get_c_name(),)) + + @staticmethod + def _to_ctypes(value): + raise TypeError + + @classmethod + def _arg_to_ctypes(cls, *value): + try: + ctype = cls._ctype + except AttributeError: + raise TypeError("cannot create an instance of %r" % (cls,)) + if value: + res = cls._to_ctypes(*value) + if not isinstance(res, ctype): + res = cls._ctype(res) + else: + res = cls._ctype() + return res + + @classmethod + def _create_ctype_obj(cls, init): + if init is None: + return cls._arg_to_ctypes() + else: + return cls._arg_to_ctypes(init) + + @staticmethod + def _from_ctypes(ctypes_value): + raise TypeError + + @classmethod + def _get_c_name(cls, replace_with=''): + return cls._reftypename.replace(' &', replace_with) + + @classmethod + def _fix_class(cls): + cls.__name__ = 'CData<%s>' % (cls._get_c_name(),) + cls.__qualname__ = 'CData<%s>' % (cls._get_c_name(),) + cls.__module__ = 'ffi' + + def _get_own_repr(self): + raise NotImplementedError + + def _addr_repr(self, address): + if address == 0: + return 'NULL' + else: + if address < 0: + address += 1 << (8*ctypes.sizeof(ctypes.c_void_p)) + return '0x%x' % address + + def __repr__(self, c_name=None): + own = self._get_own_repr() + return '' % (c_name or self._get_c_name(), own) + + def _convert_to_address(self, BClass): + if BClass is None: + raise TypeError("cannot convert %r to an address" % ( + self._get_c_name(),)) + else: + raise TypeError("cannot convert %r to %r" % ( + self._get_c_name(), BClass._get_c_name())) + + @classmethod + def _get_size(cls): + return ctypes.sizeof(cls._ctype) + + def _get_size_of_instance(self): + return ctypes.sizeof(self._ctype) + + @classmethod + def _cast_from(cls, source): + raise TypeError("cannot cast to %r" % (cls._get_c_name(),)) + + def _cast_to_integer(self): + return self._convert_to_address(None) + + @classmethod + def _alignment(cls): + return ctypes.alignment(cls._ctype) + + def __iter__(self): + raise TypeError("cdata %r does not support iteration" % ( + self._get_c_name()),) + + def _make_cmp(name): + cmpfunc = getattr(operator, name) + def cmp(self, other): + v_is_ptr = not isinstance(self, CTypesGenericPrimitive) + w_is_ptr = (isinstance(other, CTypesData) and + not isinstance(other, CTypesGenericPrimitive)) + if v_is_ptr and w_is_ptr: + return cmpfunc(self._convert_to_address(None), + other._convert_to_address(None)) + elif v_is_ptr or w_is_ptr: + return NotImplemented + else: + if isinstance(self, CTypesGenericPrimitive): + self = self._value + if isinstance(other, CTypesGenericPrimitive): + other = other._value + return cmpfunc(self, other) + cmp.func_name = name + return cmp + + __eq__ = _make_cmp('__eq__') + __ne__ = _make_cmp('__ne__') + __lt__ = _make_cmp('__lt__') + __le__ = _make_cmp('__le__') + __gt__ = _make_cmp('__gt__') + __ge__ = _make_cmp('__ge__') + + def __hash__(self): + return hash(self._convert_to_address(None)) + + def _to_string(self, maxlen): + raise TypeError("string(): %r" % (self,)) + + +class CTypesGenericPrimitive(CTypesData): + __slots__ = [] + + def __hash__(self): + return hash(self._value) + + def _get_own_repr(self): + return repr(self._from_ctypes(self._value)) + + +class CTypesGenericArray(CTypesData): + __slots__ = [] + + @classmethod + def _newp(cls, init): + return cls(init) + + def __iter__(self): + for i in xrange(len(self)): + yield self[i] + + def _get_own_repr(self): + return self._addr_repr(ctypes.addressof(self._blob)) + + +class CTypesGenericPtr(CTypesData): + __slots__ = ['_address', '_as_ctype_ptr'] + _automatic_casts = False + kind = "pointer" + + @classmethod + def _newp(cls, init): + return cls(init) + + @classmethod + def _cast_from(cls, source): + if source is None: + address = 0 + elif isinstance(source, CTypesData): + address = source._cast_to_integer() + elif isinstance(source, (int, long)): + address = source + else: + raise TypeError("bad type for cast to %r: %r" % + (cls, type(source).__name__)) + return cls._new_pointer_at(address) + + @classmethod + def _new_pointer_at(cls, address): + self = cls.__new__(cls) + self._address = address + self._as_ctype_ptr = ctypes.cast(address, cls._ctype) + return self + + def _get_own_repr(self): + try: + return self._addr_repr(self._address) + except AttributeError: + return '???' + + def _cast_to_integer(self): + return self._address + + def __nonzero__(self): + return bool(self._address) + __bool__ = __nonzero__ + + @classmethod + def _to_ctypes(cls, value): + if not isinstance(value, CTypesData): + raise TypeError("unexpected %s object" % type(value).__name__) + address = value._convert_to_address(cls) + return ctypes.cast(address, cls._ctype) + + @classmethod + def _from_ctypes(cls, ctypes_ptr): + address = ctypes.cast(ctypes_ptr, ctypes.c_void_p).value or 0 + return cls._new_pointer_at(address) + + @classmethod + def _initialize(cls, ctypes_ptr, value): + if value: + ctypes_ptr.contents = cls._to_ctypes(value).contents + + def _convert_to_address(self, BClass): + if (BClass in (self.__class__, None) or BClass._automatic_casts + or self._automatic_casts): + return self._address + else: + return CTypesData._convert_to_address(self, BClass) + + +class CTypesBaseStructOrUnion(CTypesData): + __slots__ = ['_blob'] + + @classmethod + def _create_ctype_obj(cls, init): + # may be overridden + raise TypeError("cannot instantiate opaque type %s" % (cls,)) + + def _get_own_repr(self): + return self._addr_repr(ctypes.addressof(self._blob)) + + @classmethod + def _offsetof(cls, fieldname): + return getattr(cls._ctype, fieldname).offset + + def _convert_to_address(self, BClass): + if getattr(BClass, '_BItem', None) is self.__class__: + return ctypes.addressof(self._blob) + else: + return CTypesData._convert_to_address(self, BClass) + + @classmethod + def _from_ctypes(cls, ctypes_struct_or_union): + self = cls.__new__(cls) + self._blob = ctypes_struct_or_union + return self + + @classmethod + def _to_ctypes(cls, value): + return value._blob + + def __repr__(self, c_name=None): + return CTypesData.__repr__(self, c_name or self._get_c_name(' &')) + + +class CTypesBackend(object): + + PRIMITIVE_TYPES = { + 'char': ctypes.c_char, + 'short': ctypes.c_short, + 'int': ctypes.c_int, + 'long': ctypes.c_long, + 'long long': ctypes.c_longlong, + 'signed char': ctypes.c_byte, + 'unsigned char': ctypes.c_ubyte, + 'unsigned short': ctypes.c_ushort, + 'unsigned int': ctypes.c_uint, + 'unsigned long': ctypes.c_ulong, + 'unsigned long long': ctypes.c_ulonglong, + 'float': ctypes.c_float, + 'double': ctypes.c_double, + '_Bool': ctypes.c_bool, + } + + for _name in ['unsigned long long', 'unsigned long', + 'unsigned int', 'unsigned short', 'unsigned char']: + _size = ctypes.sizeof(PRIMITIVE_TYPES[_name]) + PRIMITIVE_TYPES['uint%d_t' % (8*_size)] = PRIMITIVE_TYPES[_name] + if _size == ctypes.sizeof(ctypes.c_void_p): + PRIMITIVE_TYPES['uintptr_t'] = PRIMITIVE_TYPES[_name] + if _size == ctypes.sizeof(ctypes.c_size_t): + PRIMITIVE_TYPES['size_t'] = PRIMITIVE_TYPES[_name] + + for _name in ['long long', 'long', 'int', 'short', 'signed char']: + _size = ctypes.sizeof(PRIMITIVE_TYPES[_name]) + PRIMITIVE_TYPES['int%d_t' % (8*_size)] = PRIMITIVE_TYPES[_name] + if _size == ctypes.sizeof(ctypes.c_void_p): + PRIMITIVE_TYPES['intptr_t'] = PRIMITIVE_TYPES[_name] + PRIMITIVE_TYPES['ptrdiff_t'] = PRIMITIVE_TYPES[_name] + if _size == ctypes.sizeof(ctypes.c_size_t): + PRIMITIVE_TYPES['ssize_t'] = PRIMITIVE_TYPES[_name] + + + def __init__(self): + self.RTLD_LAZY = 0 # not supported anyway by ctypes + self.RTLD_NOW = 0 + self.RTLD_GLOBAL = ctypes.RTLD_GLOBAL + self.RTLD_LOCAL = ctypes.RTLD_LOCAL + + def set_ffi(self, ffi): + self.ffi = ffi + + def _get_types(self): + return CTypesData, CTypesType + + def load_library(self, path, flags=0): + cdll = ctypes.CDLL(path, flags) + return CTypesLibrary(self, cdll) + + def new_void_type(self): + class CTypesVoid(CTypesData): + __slots__ = [] + _reftypename = 'void &' + @staticmethod + def _from_ctypes(novalue): + return None + @staticmethod + def _to_ctypes(novalue): + if novalue is not None: + raise TypeError("None expected, got %s object" % + (type(novalue).__name__,)) + return None + CTypesVoid._fix_class() + return CTypesVoid + + def new_primitive_type(self, name): + if name == 'wchar_t': + raise NotImplementedError(name) + ctype = self.PRIMITIVE_TYPES[name] + if name == 'char': + kind = 'char' + elif name in ('float', 'double'): + kind = 'float' + else: + if name in ('signed char', 'unsigned char'): + kind = 'byte' + elif name == '_Bool': + kind = 'bool' + else: + kind = 'int' + is_signed = (ctype(-1).value == -1) + # + def _cast_source_to_int(source): + if isinstance(source, (int, long, float)): + source = int(source) + elif isinstance(source, CTypesData): + source = source._cast_to_integer() + elif isinstance(source, bytes): + source = ord(source) + elif source is None: + source = 0 + else: + raise TypeError("bad type for cast to %r: %r" % + (CTypesPrimitive, type(source).__name__)) + return source + # + kind1 = kind + class CTypesPrimitive(CTypesGenericPrimitive): + __slots__ = ['_value'] + _ctype = ctype + _reftypename = '%s &' % name + kind = kind1 + + def __init__(self, value): + self._value = value + + @staticmethod + def _create_ctype_obj(init): + if init is None: + return ctype() + return ctype(CTypesPrimitive._to_ctypes(init)) + + if kind == 'int' or kind == 'byte': + @classmethod + def _cast_from(cls, source): + source = _cast_source_to_int(source) + source = ctype(source).value # cast within range + return cls(source) + def __int__(self): + return self._value + + if kind == 'bool': + @classmethod + def _cast_from(cls, source): + if not isinstance(source, (int, long, float)): + source = _cast_source_to_int(source) + return cls(bool(source)) + def __int__(self): + return int(self._value) + + if kind == 'char': + @classmethod + def _cast_from(cls, source): + source = _cast_source_to_int(source) + source = bytechr(source & 0xFF) + return cls(source) + def __int__(self): + return ord(self._value) + + if kind == 'float': + @classmethod + def _cast_from(cls, source): + if isinstance(source, float): + pass + elif isinstance(source, CTypesGenericPrimitive): + if hasattr(source, '__float__'): + source = float(source) + else: + source = int(source) + else: + source = _cast_source_to_int(source) + source = ctype(source).value # fix precision + return cls(source) + def __int__(self): + return int(self._value) + def __float__(self): + return self._value + + _cast_to_integer = __int__ + + if kind == 'int' or kind == 'byte' or kind == 'bool': + @staticmethod + def _to_ctypes(x): + if not isinstance(x, (int, long)): + if isinstance(x, CTypesData): + x = int(x) + else: + raise TypeError("integer expected, got %s" % + type(x).__name__) + if ctype(x).value != x: + if not is_signed and x < 0: + raise OverflowError("%s: negative integer" % name) + else: + raise OverflowError("%s: integer out of bounds" + % name) + return x + + if kind == 'char': + @staticmethod + def _to_ctypes(x): + if isinstance(x, bytes) and len(x) == 1: + return x + if isinstance(x, CTypesPrimitive): # > + return x._value + raise TypeError("character expected, got %s" % + type(x).__name__) + def __nonzero__(self): + return ord(self._value) != 0 + else: + def __nonzero__(self): + return self._value != 0 + __bool__ = __nonzero__ + + if kind == 'float': + @staticmethod + def _to_ctypes(x): + if not isinstance(x, (int, long, float, CTypesData)): + raise TypeError("float expected, got %s" % + type(x).__name__) + return ctype(x).value + + @staticmethod + def _from_ctypes(value): + return getattr(value, 'value', value) + + @staticmethod + def _initialize(blob, init): + blob.value = CTypesPrimitive._to_ctypes(init) + + if kind == 'char': + def _to_string(self, maxlen): + return self._value + if kind == 'byte': + def _to_string(self, maxlen): + return chr(self._value & 0xff) + # + CTypesPrimitive._fix_class() + return CTypesPrimitive + + def new_pointer_type(self, BItem): + getbtype = self.ffi._get_cached_btype + if BItem is getbtype(model.PrimitiveType('char')): + kind = 'charp' + elif BItem in (getbtype(model.PrimitiveType('signed char')), + getbtype(model.PrimitiveType('unsigned char'))): + kind = 'bytep' + elif BItem is getbtype(model.void_type): + kind = 'voidp' + else: + kind = 'generic' + # + class CTypesPtr(CTypesGenericPtr): + __slots__ = ['_own'] + if kind == 'charp': + __slots__ += ['__as_strbuf'] + _BItem = BItem + if hasattr(BItem, '_ctype'): + _ctype = ctypes.POINTER(BItem._ctype) + _bitem_size = ctypes.sizeof(BItem._ctype) + else: + _ctype = ctypes.c_void_p + if issubclass(BItem, CTypesGenericArray): + _reftypename = BItem._get_c_name('(* &)') + else: + _reftypename = BItem._get_c_name(' * &') + + def __init__(self, init): + ctypeobj = BItem._create_ctype_obj(init) + if kind == 'charp': + self.__as_strbuf = ctypes.create_string_buffer( + ctypeobj.value + b'\x00') + self._as_ctype_ptr = ctypes.cast( + self.__as_strbuf, self._ctype) + else: + self._as_ctype_ptr = ctypes.pointer(ctypeobj) + self._address = ctypes.cast(self._as_ctype_ptr, + ctypes.c_void_p).value + self._own = True + + def __add__(self, other): + if isinstance(other, (int, long)): + return self._new_pointer_at(self._address + + other * self._bitem_size) + else: + return NotImplemented + + def __sub__(self, other): + if isinstance(other, (int, long)): + return self._new_pointer_at(self._address - + other * self._bitem_size) + elif type(self) is type(other): + return (self._address - other._address) // self._bitem_size + else: + return NotImplemented + + def __getitem__(self, index): + if getattr(self, '_own', False) and index != 0: + raise IndexError + return BItem._from_ctypes(self._as_ctype_ptr[index]) + + def __setitem__(self, index, value): + self._as_ctype_ptr[index] = BItem._to_ctypes(value) + + if kind == 'charp' or kind == 'voidp': + @classmethod + def _arg_to_ctypes(cls, *value): + if value and isinstance(value[0], bytes): + return ctypes.c_char_p(value[0]) + else: + return super(CTypesPtr, cls)._arg_to_ctypes(*value) + + if kind == 'charp' or kind == 'bytep': + def _to_string(self, maxlen): + if maxlen < 0: + maxlen = sys.maxsize + p = ctypes.cast(self._as_ctype_ptr, + ctypes.POINTER(ctypes.c_char)) + n = 0 + while n < maxlen and p[n] != b'\x00': + n += 1 + return b''.join([p[i] for i in range(n)]) + + def _get_own_repr(self): + if getattr(self, '_own', False): + return 'owning %d bytes' % ( + ctypes.sizeof(self._as_ctype_ptr.contents),) + return super(CTypesPtr, self)._get_own_repr() + # + if (BItem is self.ffi._get_cached_btype(model.void_type) or + BItem is self.ffi._get_cached_btype(model.PrimitiveType('char'))): + CTypesPtr._automatic_casts = True + # + CTypesPtr._fix_class() + return CTypesPtr + + def new_array_type(self, CTypesPtr, length): + if length is None: + brackets = ' &[]' + else: + brackets = ' &[%d]' % length + BItem = CTypesPtr._BItem + getbtype = self.ffi._get_cached_btype + if BItem is getbtype(model.PrimitiveType('char')): + kind = 'char' + elif BItem in (getbtype(model.PrimitiveType('signed char')), + getbtype(model.PrimitiveType('unsigned char'))): + kind = 'byte' + else: + kind = 'generic' + # + class CTypesArray(CTypesGenericArray): + __slots__ = ['_blob', '_own'] + if length is not None: + _ctype = BItem._ctype * length + else: + __slots__.append('_ctype') + _reftypename = BItem._get_c_name(brackets) + _declared_length = length + _CTPtr = CTypesPtr + + def __init__(self, init): + if length is None: + if isinstance(init, (int, long)): + len1 = init + init = None + elif kind == 'char' and isinstance(init, bytes): + len1 = len(init) + 1 # extra null + else: + init = tuple(init) + len1 = len(init) + self._ctype = BItem._ctype * len1 + self._blob = self._ctype() + self._own = True + if init is not None: + self._initialize(self._blob, init) + + @staticmethod + def _initialize(blob, init): + if isinstance(init, bytes): + init = [init[i:i+1] for i in range(len(init))] + else: + if isinstance(init, CTypesGenericArray): + if (len(init) != len(blob) or + not isinstance(init, CTypesArray)): + raise TypeError("length/type mismatch: %s" % (init,)) + init = tuple(init) + if len(init) > len(blob): + raise IndexError("too many initializers") + addr = ctypes.cast(blob, ctypes.c_void_p).value + PTR = ctypes.POINTER(BItem._ctype) + itemsize = ctypes.sizeof(BItem._ctype) + for i, value in enumerate(init): + p = ctypes.cast(addr + i * itemsize, PTR) + BItem._initialize(p.contents, value) + + def __len__(self): + return len(self._blob) + + def __getitem__(self, index): + if not (0 <= index < len(self._blob)): + raise IndexError + return BItem._from_ctypes(self._blob[index]) + + def __setitem__(self, index, value): + if not (0 <= index < len(self._blob)): + raise IndexError + self._blob[index] = BItem._to_ctypes(value) + + if kind == 'char' or kind == 'byte': + def _to_string(self, maxlen): + if maxlen < 0: + maxlen = len(self._blob) + p = ctypes.cast(self._blob, + ctypes.POINTER(ctypes.c_char)) + n = 0 + while n < maxlen and p[n] != b'\x00': + n += 1 + return b''.join([p[i] for i in range(n)]) + + def _get_own_repr(self): + if getattr(self, '_own', False): + return 'owning %d bytes' % (ctypes.sizeof(self._blob),) + return super(CTypesArray, self)._get_own_repr() + + def _convert_to_address(self, BClass): + if BClass in (CTypesPtr, None) or BClass._automatic_casts: + return ctypes.addressof(self._blob) + else: + return CTypesData._convert_to_address(self, BClass) + + @staticmethod + def _from_ctypes(ctypes_array): + self = CTypesArray.__new__(CTypesArray) + self._blob = ctypes_array + return self + + @staticmethod + def _arg_to_ctypes(value): + return CTypesPtr._arg_to_ctypes(value) + + def __add__(self, other): + if isinstance(other, (int, long)): + return CTypesPtr._new_pointer_at( + ctypes.addressof(self._blob) + + other * ctypes.sizeof(BItem._ctype)) + else: + return NotImplemented + + @classmethod + def _cast_from(cls, source): + raise NotImplementedError("casting to %r" % ( + cls._get_c_name(),)) + # + CTypesArray._fix_class() + return CTypesArray + + def _new_struct_or_union(self, kind, name, base_ctypes_class): + # + class struct_or_union(base_ctypes_class): + pass + struct_or_union.__name__ = '%s_%s' % (kind, name) + kind1 = kind + # + class CTypesStructOrUnion(CTypesBaseStructOrUnion): + __slots__ = ['_blob'] + _ctype = struct_or_union + _reftypename = '%s &' % (name,) + _kind = kind = kind1 + # + CTypesStructOrUnion._fix_class() + return CTypesStructOrUnion + + def new_struct_type(self, name): + return self._new_struct_or_union('struct', name, ctypes.Structure) + + def new_union_type(self, name): + return self._new_struct_or_union('union', name, ctypes.Union) + + def complete_struct_or_union(self, CTypesStructOrUnion, fields, tp, + totalsize=-1, totalalignment=-1, sflags=0, + pack=0): + if totalsize >= 0 or totalalignment >= 0: + raise NotImplementedError("the ctypes backend of CFFI does not support " + "structures completed by verify(); please " + "compile and install the _cffi_backend module.") + struct_or_union = CTypesStructOrUnion._ctype + fnames = [fname for (fname, BField, bitsize) in fields] + btypes = [BField for (fname, BField, bitsize) in fields] + bitfields = [bitsize for (fname, BField, bitsize) in fields] + # + bfield_types = {} + cfields = [] + for (fname, BField, bitsize) in fields: + if bitsize < 0: + cfields.append((fname, BField._ctype)) + bfield_types[fname] = BField + else: + cfields.append((fname, BField._ctype, bitsize)) + bfield_types[fname] = Ellipsis + if sflags & 8: + struct_or_union._pack_ = 1 + elif pack: + struct_or_union._pack_ = pack + struct_or_union._fields_ = cfields + CTypesStructOrUnion._bfield_types = bfield_types + # + @staticmethod + def _create_ctype_obj(init): + result = struct_or_union() + if init is not None: + initialize(result, init) + return result + CTypesStructOrUnion._create_ctype_obj = _create_ctype_obj + # + def initialize(blob, init): + if is_union: + if len(init) > 1: + raise ValueError("union initializer: %d items given, but " + "only one supported (use a dict if needed)" + % (len(init),)) + if not isinstance(init, dict): + if isinstance(init, (bytes, unicode)): + raise TypeError("union initializer: got a str") + init = tuple(init) + if len(init) > len(fnames): + raise ValueError("too many values for %s initializer" % + CTypesStructOrUnion._get_c_name()) + init = dict(zip(fnames, init)) + addr = ctypes.addressof(blob) + for fname, value in init.items(): + BField, bitsize = name2fieldtype[fname] + assert bitsize < 0, \ + "not implemented: initializer with bit fields" + offset = CTypesStructOrUnion._offsetof(fname) + PTR = ctypes.POINTER(BField._ctype) + p = ctypes.cast(addr + offset, PTR) + BField._initialize(p.contents, value) + is_union = CTypesStructOrUnion._kind == 'union' + name2fieldtype = dict(zip(fnames, zip(btypes, bitfields))) + # + for fname, BField, bitsize in fields: + if fname == '': + raise NotImplementedError("nested anonymous structs/unions") + if hasattr(CTypesStructOrUnion, fname): + raise ValueError("the field name %r conflicts in " + "the ctypes backend" % fname) + if bitsize < 0: + def getter(self, fname=fname, BField=BField, + offset=CTypesStructOrUnion._offsetof(fname), + PTR=ctypes.POINTER(BField._ctype)): + addr = ctypes.addressof(self._blob) + p = ctypes.cast(addr + offset, PTR) + return BField._from_ctypes(p.contents) + def setter(self, value, fname=fname, BField=BField): + setattr(self._blob, fname, BField._to_ctypes(value)) + # + if issubclass(BField, CTypesGenericArray): + setter = None + if BField._declared_length == 0: + def getter(self, fname=fname, BFieldPtr=BField._CTPtr, + offset=CTypesStructOrUnion._offsetof(fname), + PTR=ctypes.POINTER(BField._ctype)): + addr = ctypes.addressof(self._blob) + p = ctypes.cast(addr + offset, PTR) + return BFieldPtr._from_ctypes(p) + # + else: + def getter(self, fname=fname, BField=BField): + return BField._from_ctypes(getattr(self._blob, fname)) + def setter(self, value, fname=fname, BField=BField): + # xxx obscure workaround + value = BField._to_ctypes(value) + oldvalue = getattr(self._blob, fname) + setattr(self._blob, fname, value) + if value != getattr(self._blob, fname): + setattr(self._blob, fname, oldvalue) + raise OverflowError("value too large for bitfield") + setattr(CTypesStructOrUnion, fname, property(getter, setter)) + # + CTypesPtr = self.ffi._get_cached_btype(model.PointerType(tp)) + for fname in fnames: + if hasattr(CTypesPtr, fname): + raise ValueError("the field name %r conflicts in " + "the ctypes backend" % fname) + def getter(self, fname=fname): + return getattr(self[0], fname) + def setter(self, value, fname=fname): + setattr(self[0], fname, value) + setattr(CTypesPtr, fname, property(getter, setter)) + + def new_function_type(self, BArgs, BResult, has_varargs): + nameargs = [BArg._get_c_name() for BArg in BArgs] + if has_varargs: + nameargs.append('...') + nameargs = ', '.join(nameargs) + # + class CTypesFunctionPtr(CTypesGenericPtr): + __slots__ = ['_own_callback', '_name'] + _ctype = ctypes.CFUNCTYPE(getattr(BResult, '_ctype', None), + *[BArg._ctype for BArg in BArgs], + use_errno=True) + _reftypename = BResult._get_c_name('(* &)(%s)' % (nameargs,)) + + def __init__(self, init, error=None): + # create a callback to the Python callable init() + import traceback + assert not has_varargs, "varargs not supported for callbacks" + if getattr(BResult, '_ctype', None) is not None: + error = BResult._from_ctypes( + BResult._create_ctype_obj(error)) + else: + error = None + def callback(*args): + args2 = [] + for arg, BArg in zip(args, BArgs): + args2.append(BArg._from_ctypes(arg)) + try: + res2 = init(*args2) + res2 = BResult._to_ctypes(res2) + except: + traceback.print_exc() + res2 = error + if issubclass(BResult, CTypesGenericPtr): + if res2: + res2 = ctypes.cast(res2, ctypes.c_void_p).value + # .value: http://bugs.python.org/issue1574593 + else: + res2 = None + #print repr(res2) + return res2 + if issubclass(BResult, CTypesGenericPtr): + # The only pointers callbacks can return are void*s: + # http://bugs.python.org/issue5710 + callback_ctype = ctypes.CFUNCTYPE( + ctypes.c_void_p, + *[BArg._ctype for BArg in BArgs], + use_errno=True) + else: + callback_ctype = CTypesFunctionPtr._ctype + self._as_ctype_ptr = callback_ctype(callback) + self._address = ctypes.cast(self._as_ctype_ptr, + ctypes.c_void_p).value + self._own_callback = init + + @staticmethod + def _initialize(ctypes_ptr, value): + if value: + raise NotImplementedError("ctypes backend: not supported: " + "initializers for function pointers") + + def __repr__(self): + c_name = getattr(self, '_name', None) + if c_name: + i = self._reftypename.index('(* &)') + if self._reftypename[i-1] not in ' )*': + c_name = ' ' + c_name + c_name = self._reftypename.replace('(* &)', c_name) + return CTypesData.__repr__(self, c_name) + + def _get_own_repr(self): + if getattr(self, '_own_callback', None) is not None: + return 'calling %r' % (self._own_callback,) + return super(CTypesFunctionPtr, self)._get_own_repr() + + def __call__(self, *args): + if has_varargs: + assert len(args) >= len(BArgs) + extraargs = args[len(BArgs):] + args = args[:len(BArgs)] + else: + assert len(args) == len(BArgs) + ctypes_args = [] + for arg, BArg in zip(args, BArgs): + ctypes_args.append(BArg._arg_to_ctypes(arg)) + if has_varargs: + for i, arg in enumerate(extraargs): + if arg is None: + ctypes_args.append(ctypes.c_void_p(0)) # NULL + continue + if not isinstance(arg, CTypesData): + raise TypeError( + "argument %d passed in the variadic part " + "needs to be a cdata object (got %s)" % + (1 + len(BArgs) + i, type(arg).__name__)) + ctypes_args.append(arg._arg_to_ctypes(arg)) + result = self._as_ctype_ptr(*ctypes_args) + return BResult._from_ctypes(result) + # + CTypesFunctionPtr._fix_class() + return CTypesFunctionPtr + + def new_enum_type(self, name, enumerators, enumvalues, CTypesInt): + assert isinstance(name, str) + reverse_mapping = dict(zip(reversed(enumvalues), + reversed(enumerators))) + # + class CTypesEnum(CTypesInt): + __slots__ = [] + _reftypename = '%s &' % name + + def _get_own_repr(self): + value = self._value + try: + return '%d: %s' % (value, reverse_mapping[value]) + except KeyError: + return str(value) + + def _to_string(self, maxlen): + value = self._value + try: + return reverse_mapping[value] + except KeyError: + return str(value) + # + CTypesEnum._fix_class() + return CTypesEnum + + def get_errno(self): + return ctypes.get_errno() + + def set_errno(self, value): + ctypes.set_errno(value) + + def string(self, b, maxlen=-1): + return b._to_string(maxlen) + + def buffer(self, bptr, size=-1): + raise NotImplementedError("buffer() with ctypes backend") + + def sizeof(self, cdata_or_BType): + if isinstance(cdata_or_BType, CTypesData): + return cdata_or_BType._get_size_of_instance() + else: + assert issubclass(cdata_or_BType, CTypesData) + return cdata_or_BType._get_size() + + def alignof(self, BType): + assert issubclass(BType, CTypesData) + return BType._alignment() + + def newp(self, BType, source): + if not issubclass(BType, CTypesData): + raise TypeError + return BType._newp(source) + + def cast(self, BType, source): + return BType._cast_from(source) + + def callback(self, BType, source, error, onerror): + assert onerror is None # XXX not implemented + return BType(source, error) + + _weakref_cache_ref = None + + def gcp(self, cdata, destructor, size=0): + if self._weakref_cache_ref is None: + import weakref + class MyRef(weakref.ref): + def __eq__(self, other): + myref = self() + return self is other or ( + myref is not None and myref is other()) + def __ne__(self, other): + return not (self == other) + def __hash__(self): + try: + return self._hash + except AttributeError: + self._hash = hash(self()) + return self._hash + self._weakref_cache_ref = {}, MyRef + weak_cache, MyRef = self._weakref_cache_ref + + if destructor is None: + try: + del weak_cache[MyRef(cdata)] + except KeyError: + raise TypeError("Can remove destructor only on a object " + "previously returned by ffi.gc()") + return None + + def remove(k): + cdata, destructor = weak_cache.pop(k, (None, None)) + if destructor is not None: + destructor(cdata) + + new_cdata = self.cast(self.typeof(cdata), cdata) + assert new_cdata is not cdata + weak_cache[MyRef(new_cdata, remove)] = (cdata, destructor) + return new_cdata + + typeof = type + + def getcname(self, BType, replace_with): + return BType._get_c_name(replace_with) + + def typeoffsetof(self, BType, fieldname, num=0): + if isinstance(fieldname, str): + if num == 0 and issubclass(BType, CTypesGenericPtr): + BType = BType._BItem + if not issubclass(BType, CTypesBaseStructOrUnion): + raise TypeError("expected a struct or union ctype") + BField = BType._bfield_types[fieldname] + if BField is Ellipsis: + raise TypeError("not supported for bitfields") + return (BField, BType._offsetof(fieldname)) + elif isinstance(fieldname, (int, long)): + if issubclass(BType, CTypesGenericArray): + BType = BType._CTPtr + if not issubclass(BType, CTypesGenericPtr): + raise TypeError("expected an array or ptr ctype") + BItem = BType._BItem + offset = BItem._get_size() * fieldname + if offset > sys.maxsize: + raise OverflowError + return (BItem, offset) + else: + raise TypeError(type(fieldname)) + + def rawaddressof(self, BTypePtr, cdata, offset=None): + if isinstance(cdata, CTypesBaseStructOrUnion): + ptr = ctypes.pointer(type(cdata)._to_ctypes(cdata)) + elif isinstance(cdata, CTypesGenericPtr): + if offset is None or not issubclass(type(cdata)._BItem, + CTypesBaseStructOrUnion): + raise TypeError("unexpected cdata type") + ptr = type(cdata)._to_ctypes(cdata) + elif isinstance(cdata, CTypesGenericArray): + ptr = type(cdata)._to_ctypes(cdata) + else: + raise TypeError("expected a ") + if offset: + ptr = ctypes.cast( + ctypes.c_void_p( + ctypes.cast(ptr, ctypes.c_void_p).value + offset), + type(ptr)) + return BTypePtr._from_ctypes(ptr) + + +class CTypesLibrary(object): + + def __init__(self, backend, cdll): + self.backend = backend + self.cdll = cdll + + def load_function(self, BType, name): + c_func = getattr(self.cdll, name) + funcobj = BType._from_ctypes(c_func) + funcobj._name = name + return funcobj + + def read_variable(self, BType, name): + try: + ctypes_obj = BType._ctype.in_dll(self.cdll, name) + except AttributeError as e: + raise NotImplementedError(e) + return BType._from_ctypes(ctypes_obj) + + def write_variable(self, BType, name, value): + new_ctypes_obj = BType._to_ctypes(value) + ctypes_obj = BType._ctype.in_dll(self.cdll, name) + ctypes.memmove(ctypes.addressof(ctypes_obj), + ctypes.addressof(new_ctypes_obj), + ctypes.sizeof(BType._ctype)) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/cffi_opcode.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/cffi_opcode.py new file mode 100644 index 0000000..a0df98d --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/cffi_opcode.py @@ -0,0 +1,187 @@ +from .error import VerificationError + +class CffiOp(object): + def __init__(self, op, arg): + self.op = op + self.arg = arg + + def as_c_expr(self): + if self.op is None: + assert isinstance(self.arg, str) + return '(_cffi_opcode_t)(%s)' % (self.arg,) + classname = CLASS_NAME[self.op] + return '_CFFI_OP(_CFFI_OP_%s, %s)' % (classname, self.arg) + + def as_python_bytes(self): + if self.op is None and self.arg.isdigit(): + value = int(self.arg) # non-negative: '-' not in self.arg + if value >= 2**31: + raise OverflowError("cannot emit %r: limited to 2**31-1" + % (self.arg,)) + return format_four_bytes(value) + if isinstance(self.arg, str): + raise VerificationError("cannot emit to Python: %r" % (self.arg,)) + return format_four_bytes((self.arg << 8) | self.op) + + def __str__(self): + classname = CLASS_NAME.get(self.op, self.op) + return '(%s %s)' % (classname, self.arg) + +def format_four_bytes(num): + return '\\x%02X\\x%02X\\x%02X\\x%02X' % ( + (num >> 24) & 0xFF, + (num >> 16) & 0xFF, + (num >> 8) & 0xFF, + (num ) & 0xFF) + +OP_PRIMITIVE = 1 +OP_POINTER = 3 +OP_ARRAY = 5 +OP_OPEN_ARRAY = 7 +OP_STRUCT_UNION = 9 +OP_ENUM = 11 +OP_FUNCTION = 13 +OP_FUNCTION_END = 15 +OP_NOOP = 17 +OP_BITFIELD = 19 +OP_TYPENAME = 21 +OP_CPYTHON_BLTN_V = 23 # varargs +OP_CPYTHON_BLTN_N = 25 # noargs +OP_CPYTHON_BLTN_O = 27 # O (i.e. a single arg) +OP_CONSTANT = 29 +OP_CONSTANT_INT = 31 +OP_GLOBAL_VAR = 33 +OP_DLOPEN_FUNC = 35 +OP_DLOPEN_CONST = 37 +OP_GLOBAL_VAR_F = 39 +OP_EXTERN_PYTHON = 41 + +PRIM_VOID = 0 +PRIM_BOOL = 1 +PRIM_CHAR = 2 +PRIM_SCHAR = 3 +PRIM_UCHAR = 4 +PRIM_SHORT = 5 +PRIM_USHORT = 6 +PRIM_INT = 7 +PRIM_UINT = 8 +PRIM_LONG = 9 +PRIM_ULONG = 10 +PRIM_LONGLONG = 11 +PRIM_ULONGLONG = 12 +PRIM_FLOAT = 13 +PRIM_DOUBLE = 14 +PRIM_LONGDOUBLE = 15 + +PRIM_WCHAR = 16 +PRIM_INT8 = 17 +PRIM_UINT8 = 18 +PRIM_INT16 = 19 +PRIM_UINT16 = 20 +PRIM_INT32 = 21 +PRIM_UINT32 = 22 +PRIM_INT64 = 23 +PRIM_UINT64 = 24 +PRIM_INTPTR = 25 +PRIM_UINTPTR = 26 +PRIM_PTRDIFF = 27 +PRIM_SIZE = 28 +PRIM_SSIZE = 29 +PRIM_INT_LEAST8 = 30 +PRIM_UINT_LEAST8 = 31 +PRIM_INT_LEAST16 = 32 +PRIM_UINT_LEAST16 = 33 +PRIM_INT_LEAST32 = 34 +PRIM_UINT_LEAST32 = 35 +PRIM_INT_LEAST64 = 36 +PRIM_UINT_LEAST64 = 37 +PRIM_INT_FAST8 = 38 +PRIM_UINT_FAST8 = 39 +PRIM_INT_FAST16 = 40 +PRIM_UINT_FAST16 = 41 +PRIM_INT_FAST32 = 42 +PRIM_UINT_FAST32 = 43 +PRIM_INT_FAST64 = 44 +PRIM_UINT_FAST64 = 45 +PRIM_INTMAX = 46 +PRIM_UINTMAX = 47 +PRIM_FLOATCOMPLEX = 48 +PRIM_DOUBLECOMPLEX = 49 +PRIM_CHAR16 = 50 +PRIM_CHAR32 = 51 + +_NUM_PRIM = 52 +_UNKNOWN_PRIM = -1 +_UNKNOWN_FLOAT_PRIM = -2 +_UNKNOWN_LONG_DOUBLE = -3 + +_IO_FILE_STRUCT = -1 + +PRIMITIVE_TO_INDEX = { + 'char': PRIM_CHAR, + 'short': PRIM_SHORT, + 'int': PRIM_INT, + 'long': PRIM_LONG, + 'long long': PRIM_LONGLONG, + 'signed char': PRIM_SCHAR, + 'unsigned char': PRIM_UCHAR, + 'unsigned short': PRIM_USHORT, + 'unsigned int': PRIM_UINT, + 'unsigned long': PRIM_ULONG, + 'unsigned long long': PRIM_ULONGLONG, + 'float': PRIM_FLOAT, + 'double': PRIM_DOUBLE, + 'long double': PRIM_LONGDOUBLE, + 'float _Complex': PRIM_FLOATCOMPLEX, + 'double _Complex': PRIM_DOUBLECOMPLEX, + '_Bool': PRIM_BOOL, + 'wchar_t': PRIM_WCHAR, + 'char16_t': PRIM_CHAR16, + 'char32_t': PRIM_CHAR32, + 'int8_t': PRIM_INT8, + 'uint8_t': PRIM_UINT8, + 'int16_t': PRIM_INT16, + 'uint16_t': PRIM_UINT16, + 'int32_t': PRIM_INT32, + 'uint32_t': PRIM_UINT32, + 'int64_t': PRIM_INT64, + 'uint64_t': PRIM_UINT64, + 'intptr_t': PRIM_INTPTR, + 'uintptr_t': PRIM_UINTPTR, + 'ptrdiff_t': PRIM_PTRDIFF, + 'size_t': PRIM_SIZE, + 'ssize_t': PRIM_SSIZE, + 'int_least8_t': PRIM_INT_LEAST8, + 'uint_least8_t': PRIM_UINT_LEAST8, + 'int_least16_t': PRIM_INT_LEAST16, + 'uint_least16_t': PRIM_UINT_LEAST16, + 'int_least32_t': PRIM_INT_LEAST32, + 'uint_least32_t': PRIM_UINT_LEAST32, + 'int_least64_t': PRIM_INT_LEAST64, + 'uint_least64_t': PRIM_UINT_LEAST64, + 'int_fast8_t': PRIM_INT_FAST8, + 'uint_fast8_t': PRIM_UINT_FAST8, + 'int_fast16_t': PRIM_INT_FAST16, + 'uint_fast16_t': PRIM_UINT_FAST16, + 'int_fast32_t': PRIM_INT_FAST32, + 'uint_fast32_t': PRIM_UINT_FAST32, + 'int_fast64_t': PRIM_INT_FAST64, + 'uint_fast64_t': PRIM_UINT_FAST64, + 'intmax_t': PRIM_INTMAX, + 'uintmax_t': PRIM_UINTMAX, + } + +F_UNION = 0x01 +F_CHECK_FIELDS = 0x02 +F_PACKED = 0x04 +F_EXTERNAL = 0x08 +F_OPAQUE = 0x10 + +G_FLAGS = dict([('_CFFI_' + _key, globals()[_key]) + for _key in ['F_UNION', 'F_CHECK_FIELDS', 'F_PACKED', + 'F_EXTERNAL', 'F_OPAQUE']]) + +CLASS_NAME = {} +for _name, _value in list(globals().items()): + if _name.startswith('OP_') and isinstance(_value, int): + CLASS_NAME[_value] = _name[3:] diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/commontypes.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/commontypes.py new file mode 100644 index 0000000..8ec97c7 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/commontypes.py @@ -0,0 +1,80 @@ +import sys +from . import model +from .error import FFIError + + +COMMON_TYPES = {} + +try: + # fetch "bool" and all simple Windows types + from _cffi_backend import _get_common_types + _get_common_types(COMMON_TYPES) +except ImportError: + pass + +COMMON_TYPES['FILE'] = model.unknown_type('FILE', '_IO_FILE') +COMMON_TYPES['bool'] = '_Bool' # in case we got ImportError above + +for _type in model.PrimitiveType.ALL_PRIMITIVE_TYPES: + if _type.endswith('_t'): + COMMON_TYPES[_type] = _type +del _type + +_CACHE = {} + +def resolve_common_type(parser, commontype): + try: + return _CACHE[commontype] + except KeyError: + cdecl = COMMON_TYPES.get(commontype, commontype) + if not isinstance(cdecl, str): + result, quals = cdecl, 0 # cdecl is already a BaseType + elif cdecl in model.PrimitiveType.ALL_PRIMITIVE_TYPES: + result, quals = model.PrimitiveType(cdecl), 0 + elif cdecl == 'set-unicode-needed': + raise FFIError("The Windows type %r is only available after " + "you call ffi.set_unicode()" % (commontype,)) + else: + if commontype == cdecl: + raise FFIError( + "Unsupported type: %r. Please look at " + "http://cffi.readthedocs.io/en/latest/cdef.html#ffi-cdef-limitations " + "and file an issue if you think this type should really " + "be supported." % (commontype,)) + result, quals = parser.parse_type_and_quals(cdecl) # recursive + + assert isinstance(result, model.BaseTypeByIdentity) + _CACHE[commontype] = result, quals + return result, quals + + +# ____________________________________________________________ +# extra types for Windows (most of them are in commontypes.c) + + +def win_common_types(): + return { + "UNICODE_STRING": model.StructType( + "_UNICODE_STRING", + ["Length", + "MaximumLength", + "Buffer"], + [model.PrimitiveType("unsigned short"), + model.PrimitiveType("unsigned short"), + model.PointerType(model.PrimitiveType("wchar_t"))], + [-1, -1, -1]), + "PUNICODE_STRING": "UNICODE_STRING *", + "PCUNICODE_STRING": "const UNICODE_STRING *", + + "TBYTE": "set-unicode-needed", + "TCHAR": "set-unicode-needed", + "LPCTSTR": "set-unicode-needed", + "PCTSTR": "set-unicode-needed", + "LPTSTR": "set-unicode-needed", + "PTSTR": "set-unicode-needed", + "PTBYTE": "set-unicode-needed", + "PTCHAR": "set-unicode-needed", + } + +if sys.platform == 'win32': + COMMON_TYPES.update(win_common_types()) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/cparser.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/cparser.py new file mode 100644 index 0000000..74830e9 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/cparser.py @@ -0,0 +1,1006 @@ +from . import model +from .commontypes import COMMON_TYPES, resolve_common_type +from .error import FFIError, CDefError +try: + from . import _pycparser as pycparser +except ImportError: + import pycparser +import weakref, re, sys + +try: + if sys.version_info < (3,): + import thread as _thread + else: + import _thread + lock = _thread.allocate_lock() +except ImportError: + lock = None + +def _workaround_for_static_import_finders(): + # Issue #392: packaging tools like cx_Freeze can not find these + # because pycparser uses exec dynamic import. This is an obscure + # workaround. This function is never called. + import pycparser.yacctab + import pycparser.lextab + +CDEF_SOURCE_STRING = "" +_r_comment = re.compile(r"/\*.*?\*/|//([^\n\\]|\\.)*?$", + re.DOTALL | re.MULTILINE) +_r_define = re.compile(r"^\s*#\s*define\s+([A-Za-z_][A-Za-z_0-9]*)" + r"\b((?:[^\n\\]|\\.)*?)$", + re.DOTALL | re.MULTILINE) +_r_line_directive = re.compile(r"^[ \t]*#[ \t]*(?:line|\d+)\b.*$", re.MULTILINE) +_r_partial_enum = re.compile(r"=\s*\.\.\.\s*[,}]|\.\.\.\s*\}") +_r_enum_dotdotdot = re.compile(r"__dotdotdot\d+__$") +_r_partial_array = re.compile(r"\[\s*\.\.\.\s*\]") +_r_words = re.compile(r"\w+|\S") +_parser_cache = None +_r_int_literal = re.compile(r"-?0?x?[0-9a-f]+[lu]*$", re.IGNORECASE) +_r_stdcall1 = re.compile(r"\b(__stdcall|WINAPI)\b") +_r_stdcall2 = re.compile(r"[(]\s*(__stdcall|WINAPI)\b") +_r_cdecl = re.compile(r"\b__cdecl\b") +_r_extern_python = re.compile(r'\bextern\s*"' + r'(Python|Python\s*\+\s*C|C\s*\+\s*Python)"\s*.') +_r_star_const_space = re.compile( # matches "* const " + r"[*]\s*((const|volatile|restrict)\b\s*)+") +_r_int_dotdotdot = re.compile(r"(\b(int|long|short|signed|unsigned|char)\s*)+" + r"\.\.\.") +_r_float_dotdotdot = re.compile(r"\b(double|float)\s*\.\.\.") + +def _get_parser(): + global _parser_cache + if _parser_cache is None: + _parser_cache = pycparser.CParser() + return _parser_cache + +def _workaround_for_old_pycparser(csource): + # Workaround for a pycparser issue (fixed between pycparser 2.10 and + # 2.14): "char*const***" gives us a wrong syntax tree, the same as + # for "char***(*const)". This means we can't tell the difference + # afterwards. But "char(*const(***))" gives us the right syntax + # tree. The issue only occurs if there are several stars in + # sequence with no parenthesis inbetween, just possibly qualifiers. + # Attempt to fix it by adding some parentheses in the source: each + # time we see "* const" or "* const *", we add an opening + # parenthesis before each star---the hard part is figuring out where + # to close them. + parts = [] + while True: + match = _r_star_const_space.search(csource) + if not match: + break + #print repr(''.join(parts)+csource), '=>', + parts.append(csource[:match.start()]) + parts.append('('); closing = ')' + parts.append(match.group()) # e.g. "* const " + endpos = match.end() + if csource.startswith('*', endpos): + parts.append('('); closing += ')' + level = 0 + i = endpos + while i < len(csource): + c = csource[i] + if c == '(': + level += 1 + elif c == ')': + if level == 0: + break + level -= 1 + elif c in ',;=': + if level == 0: + break + i += 1 + csource = csource[endpos:i] + closing + csource[i:] + #print repr(''.join(parts)+csource) + parts.append(csource) + return ''.join(parts) + +def _preprocess_extern_python(csource): + # input: `extern "Python" int foo(int);` or + # `extern "Python" { int foo(int); }` + # output: + # void __cffi_extern_python_start; + # int foo(int); + # void __cffi_extern_python_stop; + # + # input: `extern "Python+C" int foo(int);` + # output: + # void __cffi_extern_python_plus_c_start; + # int foo(int); + # void __cffi_extern_python_stop; + parts = [] + while True: + match = _r_extern_python.search(csource) + if not match: + break + endpos = match.end() - 1 + #print + #print ''.join(parts)+csource + #print '=>' + parts.append(csource[:match.start()]) + if 'C' in match.group(1): + parts.append('void __cffi_extern_python_plus_c_start; ') + else: + parts.append('void __cffi_extern_python_start; ') + if csource[endpos] == '{': + # grouping variant + closing = csource.find('}', endpos) + if closing < 0: + raise CDefError("'extern \"Python\" {': no '}' found") + if csource.find('{', endpos + 1, closing) >= 0: + raise NotImplementedError("cannot use { } inside a block " + "'extern \"Python\" { ... }'") + parts.append(csource[endpos+1:closing]) + csource = csource[closing+1:] + else: + # non-grouping variant + semicolon = csource.find(';', endpos) + if semicolon < 0: + raise CDefError("'extern \"Python\": no ';' found") + parts.append(csource[endpos:semicolon+1]) + csource = csource[semicolon+1:] + parts.append(' void __cffi_extern_python_stop;') + #print ''.join(parts)+csource + #print + parts.append(csource) + return ''.join(parts) + +def _warn_for_string_literal(csource): + if '"' not in csource: + return + for line in csource.splitlines(): + if '"' in line and not line.lstrip().startswith('#'): + import warnings + warnings.warn("String literal found in cdef() or type source. " + "String literals are ignored here, but you should " + "remove them anyway because some character sequences " + "confuse pre-parsing.") + break + +def _warn_for_non_extern_non_static_global_variable(decl): + if not decl.storage: + import warnings + warnings.warn("Global variable '%s' in cdef(): for consistency " + "with C it should have a storage class specifier " + "(usually 'extern')" % (decl.name,)) + +def _remove_line_directives(csource): + # _r_line_directive matches whole lines, without the final \n, if they + # start with '#line' with some spacing allowed, or '#NUMBER'. This + # function stores them away and replaces them with exactly the string + # '#line@N', where N is the index in the list 'line_directives'. + line_directives = [] + def replace(m): + i = len(line_directives) + line_directives.append(m.group()) + return '#line@%d' % i + csource = _r_line_directive.sub(replace, csource) + return csource, line_directives + +def _put_back_line_directives(csource, line_directives): + def replace(m): + s = m.group() + if not s.startswith('#line@'): + raise AssertionError("unexpected #line directive " + "(should have been processed and removed") + return line_directives[int(s[6:])] + return _r_line_directive.sub(replace, csource) + +def _preprocess(csource): + # First, remove the lines of the form '#line N "filename"' because + # the "filename" part could confuse the rest + csource, line_directives = _remove_line_directives(csource) + # Remove comments. NOTE: this only work because the cdef() section + # should not contain any string literals (except in line directives)! + def replace_keeping_newlines(m): + return ' ' + m.group().count('\n') * '\n' + csource = _r_comment.sub(replace_keeping_newlines, csource) + # Remove the "#define FOO x" lines + macros = {} + for match in _r_define.finditer(csource): + macroname, macrovalue = match.groups() + macrovalue = macrovalue.replace('\\\n', '').strip() + macros[macroname] = macrovalue + csource = _r_define.sub('', csource) + # + if pycparser.__version__ < '2.14': + csource = _workaround_for_old_pycparser(csource) + # + # BIG HACK: replace WINAPI or __stdcall with "volatile const". + # It doesn't make sense for the return type of a function to be + # "volatile volatile const", so we abuse it to detect __stdcall... + # Hack number 2 is that "int(volatile *fptr)();" is not valid C + # syntax, so we place the "volatile" before the opening parenthesis. + csource = _r_stdcall2.sub(' volatile volatile const(', csource) + csource = _r_stdcall1.sub(' volatile volatile const ', csource) + csource = _r_cdecl.sub(' ', csource) + # + # Replace `extern "Python"` with start/end markers + csource = _preprocess_extern_python(csource) + # + # Now there should not be any string literal left; warn if we get one + _warn_for_string_literal(csource) + # + # Replace "[...]" with "[__dotdotdotarray__]" + csource = _r_partial_array.sub('[__dotdotdotarray__]', csource) + # + # Replace "...}" with "__dotdotdotNUM__}". This construction should + # occur only at the end of enums; at the end of structs we have "...;}" + # and at the end of vararg functions "...);". Also replace "=...[,}]" + # with ",__dotdotdotNUM__[,}]": this occurs in the enums too, when + # giving an unknown value. + matches = list(_r_partial_enum.finditer(csource)) + for number, match in enumerate(reversed(matches)): + p = match.start() + if csource[p] == '=': + p2 = csource.find('...', p, match.end()) + assert p2 > p + csource = '%s,__dotdotdot%d__ %s' % (csource[:p], number, + csource[p2+3:]) + else: + assert csource[p:p+3] == '...' + csource = '%s __dotdotdot%d__ %s' % (csource[:p], number, + csource[p+3:]) + # Replace "int ..." or "unsigned long int..." with "__dotdotdotint__" + csource = _r_int_dotdotdot.sub(' __dotdotdotint__ ', csource) + # Replace "float ..." or "double..." with "__dotdotdotfloat__" + csource = _r_float_dotdotdot.sub(' __dotdotdotfloat__ ', csource) + # Replace all remaining "..." with the same name, "__dotdotdot__", + # which is declared with a typedef for the purpose of C parsing. + csource = csource.replace('...', ' __dotdotdot__ ') + # Finally, put back the line directives + csource = _put_back_line_directives(csource, line_directives) + return csource, macros + +def _common_type_names(csource): + # Look in the source for what looks like usages of types from the + # list of common types. A "usage" is approximated here as the + # appearance of the word, minus a "definition" of the type, which + # is the last word in a "typedef" statement. Approximative only + # but should be fine for all the common types. + look_for_words = set(COMMON_TYPES) + look_for_words.add(';') + look_for_words.add(',') + look_for_words.add('(') + look_for_words.add(')') + look_for_words.add('typedef') + words_used = set() + is_typedef = False + paren = 0 + previous_word = '' + for word in _r_words.findall(csource): + if word in look_for_words: + if word == ';': + if is_typedef: + words_used.discard(previous_word) + look_for_words.discard(previous_word) + is_typedef = False + elif word == 'typedef': + is_typedef = True + paren = 0 + elif word == '(': + paren += 1 + elif word == ')': + paren -= 1 + elif word == ',': + if is_typedef and paren == 0: + words_used.discard(previous_word) + look_for_words.discard(previous_word) + else: # word in COMMON_TYPES + words_used.add(word) + previous_word = word + return words_used + + +class Parser(object): + + def __init__(self): + self._declarations = {} + self._included_declarations = set() + self._anonymous_counter = 0 + self._structnode2type = weakref.WeakKeyDictionary() + self._options = {} + self._int_constants = {} + self._recomplete = [] + self._uses_new_feature = None + + def _parse(self, csource): + csource, macros = _preprocess(csource) + # XXX: for more efficiency we would need to poke into the + # internals of CParser... the following registers the + # typedefs, because their presence or absence influences the + # parsing itself (but what they are typedef'ed to plays no role) + ctn = _common_type_names(csource) + typenames = [] + for name in sorted(self._declarations): + if name.startswith('typedef '): + name = name[8:] + typenames.append(name) + ctn.discard(name) + typenames += sorted(ctn) + # + csourcelines = [] + csourcelines.append('# 1 ""') + for typename in typenames: + csourcelines.append('typedef int %s;' % typename) + csourcelines.append('typedef int __dotdotdotint__, __dotdotdotfloat__,' + ' __dotdotdot__;') + # this forces pycparser to consider the following in the file + # called from line 1 + csourcelines.append('# 1 "%s"' % (CDEF_SOURCE_STRING,)) + csourcelines.append(csource) + fullcsource = '\n'.join(csourcelines) + if lock is not None: + lock.acquire() # pycparser is not thread-safe... + try: + ast = _get_parser().parse(fullcsource) + except pycparser.c_parser.ParseError as e: + self.convert_pycparser_error(e, csource) + finally: + if lock is not None: + lock.release() + # csource will be used to find buggy source text + return ast, macros, csource + + def _convert_pycparser_error(self, e, csource): + # xxx look for ":NUM:" at the start of str(e) + # and interpret that as a line number. This will not work if + # the user gives explicit ``# NUM "FILE"`` directives. + line = None + msg = str(e) + match = re.match(r"%s:(\d+):" % (CDEF_SOURCE_STRING,), msg) + if match: + linenum = int(match.group(1), 10) + csourcelines = csource.splitlines() + if 1 <= linenum <= len(csourcelines): + line = csourcelines[linenum-1] + return line + + def convert_pycparser_error(self, e, csource): + line = self._convert_pycparser_error(e, csource) + + msg = str(e) + if line: + msg = 'cannot parse "%s"\n%s' % (line.strip(), msg) + else: + msg = 'parse error\n%s' % (msg,) + raise CDefError(msg) + + def parse(self, csource, override=False, packed=False, pack=None, + dllexport=False): + if packed: + if packed != True: + raise ValueError("'packed' should be False or True; use " + "'pack' to give another value") + if pack: + raise ValueError("cannot give both 'pack' and 'packed'") + pack = 1 + elif pack: + if pack & (pack - 1): + raise ValueError("'pack' must be a power of two, not %r" % + (pack,)) + else: + pack = 0 + prev_options = self._options + try: + self._options = {'override': override, + 'packed': pack, + 'dllexport': dllexport} + self._internal_parse(csource) + finally: + self._options = prev_options + + def _internal_parse(self, csource): + ast, macros, csource = self._parse(csource) + # add the macros + self._process_macros(macros) + # find the first "__dotdotdot__" and use that as a separator + # between the repeated typedefs and the real csource + iterator = iter(ast.ext) + for decl in iterator: + if decl.name == '__dotdotdot__': + break + else: + assert 0 + current_decl = None + # + try: + self._inside_extern_python = '__cffi_extern_python_stop' + for decl in iterator: + current_decl = decl + if isinstance(decl, pycparser.c_ast.Decl): + self._parse_decl(decl) + elif isinstance(decl, pycparser.c_ast.Typedef): + if not decl.name: + raise CDefError("typedef does not declare any name", + decl) + quals = 0 + if (isinstance(decl.type.type, pycparser.c_ast.IdentifierType) and + decl.type.type.names[-1].startswith('__dotdotdot')): + realtype = self._get_unknown_type(decl) + elif (isinstance(decl.type, pycparser.c_ast.PtrDecl) and + isinstance(decl.type.type, pycparser.c_ast.TypeDecl) and + isinstance(decl.type.type.type, + pycparser.c_ast.IdentifierType) and + decl.type.type.type.names[-1].startswith('__dotdotdot')): + realtype = self._get_unknown_ptr_type(decl) + else: + realtype, quals = self._get_type_and_quals( + decl.type, name=decl.name, partial_length_ok=True, + typedef_example="*(%s *)0" % (decl.name,)) + self._declare('typedef ' + decl.name, realtype, quals=quals) + elif decl.__class__.__name__ == 'Pragma': + pass # skip pragma, only in pycparser 2.15 + else: + raise CDefError("unexpected <%s>: this construct is valid " + "C but not valid in cdef()" % + decl.__class__.__name__, decl) + except CDefError as e: + if len(e.args) == 1: + e.args = e.args + (current_decl,) + raise + except FFIError as e: + msg = self._convert_pycparser_error(e, csource) + if msg: + e.args = (e.args[0] + "\n *** Err: %s" % msg,) + raise + + def _add_constants(self, key, val): + if key in self._int_constants: + if self._int_constants[key] == val: + return # ignore identical double declarations + raise FFIError( + "multiple declarations of constant: %s" % (key,)) + self._int_constants[key] = val + + def _add_integer_constant(self, name, int_str): + int_str = int_str.lower().rstrip("ul") + neg = int_str.startswith('-') + if neg: + int_str = int_str[1:] + # "010" is not valid oct in py3 + if (int_str.startswith("0") and int_str != '0' + and not int_str.startswith("0x")): + int_str = "0o" + int_str[1:] + pyvalue = int(int_str, 0) + if neg: + pyvalue = -pyvalue + self._add_constants(name, pyvalue) + self._declare('macro ' + name, pyvalue) + + def _process_macros(self, macros): + for key, value in macros.items(): + value = value.strip() + if _r_int_literal.match(value): + self._add_integer_constant(key, value) + elif value == '...': + self._declare('macro ' + key, value) + else: + raise CDefError( + 'only supports one of the following syntax:\n' + ' #define %s ... (literally dot-dot-dot)\n' + ' #define %s NUMBER (with NUMBER an integer' + ' constant, decimal/hex/octal)\n' + 'got:\n' + ' #define %s %s' + % (key, key, key, value)) + + def _declare_function(self, tp, quals, decl): + tp = self._get_type_pointer(tp, quals) + if self._options.get('dllexport'): + tag = 'dllexport_python ' + elif self._inside_extern_python == '__cffi_extern_python_start': + tag = 'extern_python ' + elif self._inside_extern_python == '__cffi_extern_python_plus_c_start': + tag = 'extern_python_plus_c ' + else: + tag = 'function ' + self._declare(tag + decl.name, tp) + + def _parse_decl(self, decl): + node = decl.type + if isinstance(node, pycparser.c_ast.FuncDecl): + tp, quals = self._get_type_and_quals(node, name=decl.name) + assert isinstance(tp, model.RawFunctionType) + self._declare_function(tp, quals, decl) + else: + if isinstance(node, pycparser.c_ast.Struct): + self._get_struct_union_enum_type('struct', node) + elif isinstance(node, pycparser.c_ast.Union): + self._get_struct_union_enum_type('union', node) + elif isinstance(node, pycparser.c_ast.Enum): + self._get_struct_union_enum_type('enum', node) + elif not decl.name: + raise CDefError("construct does not declare any variable", + decl) + # + if decl.name: + tp, quals = self._get_type_and_quals(node, + partial_length_ok=True) + if tp.is_raw_function: + self._declare_function(tp, quals, decl) + elif (tp.is_integer_type() and + hasattr(decl, 'init') and + hasattr(decl.init, 'value') and + _r_int_literal.match(decl.init.value)): + self._add_integer_constant(decl.name, decl.init.value) + elif (tp.is_integer_type() and + isinstance(decl.init, pycparser.c_ast.UnaryOp) and + decl.init.op == '-' and + hasattr(decl.init.expr, 'value') and + _r_int_literal.match(decl.init.expr.value)): + self._add_integer_constant(decl.name, + '-' + decl.init.expr.value) + elif (tp is model.void_type and + decl.name.startswith('__cffi_extern_python_')): + # hack: `extern "Python"` in the C source is replaced + # with "void __cffi_extern_python_start;" and + # "void __cffi_extern_python_stop;" + self._inside_extern_python = decl.name + else: + if self._inside_extern_python !='__cffi_extern_python_stop': + raise CDefError( + "cannot declare constants or " + "variables with 'extern \"Python\"'") + if (quals & model.Q_CONST) and not tp.is_array_type: + self._declare('constant ' + decl.name, tp, quals=quals) + else: + _warn_for_non_extern_non_static_global_variable(decl) + self._declare('variable ' + decl.name, tp, quals=quals) + + def parse_type(self, cdecl): + return self.parse_type_and_quals(cdecl)[0] + + def parse_type_and_quals(self, cdecl): + ast, macros = self._parse('void __dummy(\n%s\n);' % cdecl)[:2] + assert not macros + exprnode = ast.ext[-1].type.args.params[0] + if isinstance(exprnode, pycparser.c_ast.ID): + raise CDefError("unknown identifier '%s'" % (exprnode.name,)) + return self._get_type_and_quals(exprnode.type) + + def _declare(self, name, obj, included=False, quals=0): + if name in self._declarations: + prevobj, prevquals = self._declarations[name] + if prevobj is obj and prevquals == quals: + return + if not self._options.get('override'): + raise FFIError( + "multiple declarations of %s (for interactive usage, " + "try cdef(xx, override=True))" % (name,)) + assert '__dotdotdot__' not in name.split() + self._declarations[name] = (obj, quals) + if included: + self._included_declarations.add(obj) + + def _extract_quals(self, type): + quals = 0 + if isinstance(type, (pycparser.c_ast.TypeDecl, + pycparser.c_ast.PtrDecl)): + if 'const' in type.quals: + quals |= model.Q_CONST + if 'volatile' in type.quals: + quals |= model.Q_VOLATILE + if 'restrict' in type.quals: + quals |= model.Q_RESTRICT + return quals + + def _get_type_pointer(self, type, quals, declname=None): + if isinstance(type, model.RawFunctionType): + return type.as_function_pointer() + if (isinstance(type, model.StructOrUnionOrEnum) and + type.name.startswith('$') and type.name[1:].isdigit() and + type.forcename is None and declname is not None): + return model.NamedPointerType(type, declname, quals) + return model.PointerType(type, quals) + + def _get_type_and_quals(self, typenode, name=None, partial_length_ok=False, + typedef_example=None): + # first, dereference typedefs, if we have it already parsed, we're good + if (isinstance(typenode, pycparser.c_ast.TypeDecl) and + isinstance(typenode.type, pycparser.c_ast.IdentifierType) and + len(typenode.type.names) == 1 and + ('typedef ' + typenode.type.names[0]) in self._declarations): + tp, quals = self._declarations['typedef ' + typenode.type.names[0]] + quals |= self._extract_quals(typenode) + return tp, quals + # + if isinstance(typenode, pycparser.c_ast.ArrayDecl): + # array type + if typenode.dim is None: + length = None + else: + length = self._parse_constant( + typenode.dim, partial_length_ok=partial_length_ok) + # a hack: in 'typedef int foo_t[...][...];', don't use '...' as + # the length but use directly the C expression that would be + # generated by recompiler.py. This lets the typedef be used in + # many more places within recompiler.py + if typedef_example is not None: + if length == '...': + length = '_cffi_array_len(%s)' % (typedef_example,) + typedef_example = "*" + typedef_example + # + tp, quals = self._get_type_and_quals(typenode.type, + partial_length_ok=partial_length_ok, + typedef_example=typedef_example) + return model.ArrayType(tp, length), quals + # + if isinstance(typenode, pycparser.c_ast.PtrDecl): + # pointer type + itemtype, itemquals = self._get_type_and_quals(typenode.type) + tp = self._get_type_pointer(itemtype, itemquals, declname=name) + quals = self._extract_quals(typenode) + return tp, quals + # + if isinstance(typenode, pycparser.c_ast.TypeDecl): + quals = self._extract_quals(typenode) + type = typenode.type + if isinstance(type, pycparser.c_ast.IdentifierType): + # assume a primitive type. get it from .names, but reduce + # synonyms to a single chosen combination + names = list(type.names) + if names != ['signed', 'char']: # keep this unmodified + prefixes = {} + while names: + name = names[0] + if name in ('short', 'long', 'signed', 'unsigned'): + prefixes[name] = prefixes.get(name, 0) + 1 + del names[0] + else: + break + # ignore the 'signed' prefix below, and reorder the others + newnames = [] + for prefix in ('unsigned', 'short', 'long'): + for i in range(prefixes.get(prefix, 0)): + newnames.append(prefix) + if not names: + names = ['int'] # implicitly + if names == ['int']: # but kill it if 'short' or 'long' + if 'short' in prefixes or 'long' in prefixes: + names = [] + names = newnames + names + ident = ' '.join(names) + if ident == 'void': + return model.void_type, quals + if ident == '__dotdotdot__': + raise FFIError(':%d: bad usage of "..."' % + typenode.coord.line) + tp0, quals0 = resolve_common_type(self, ident) + return tp0, (quals | quals0) + # + if isinstance(type, pycparser.c_ast.Struct): + # 'struct foobar' + tp = self._get_struct_union_enum_type('struct', type, name) + return tp, quals + # + if isinstance(type, pycparser.c_ast.Union): + # 'union foobar' + tp = self._get_struct_union_enum_type('union', type, name) + return tp, quals + # + if isinstance(type, pycparser.c_ast.Enum): + # 'enum foobar' + tp = self._get_struct_union_enum_type('enum', type, name) + return tp, quals + # + if isinstance(typenode, pycparser.c_ast.FuncDecl): + # a function type + return self._parse_function_type(typenode, name), 0 + # + # nested anonymous structs or unions end up here + if isinstance(typenode, pycparser.c_ast.Struct): + return self._get_struct_union_enum_type('struct', typenode, name, + nested=True), 0 + if isinstance(typenode, pycparser.c_ast.Union): + return self._get_struct_union_enum_type('union', typenode, name, + nested=True), 0 + # + raise FFIError(":%d: bad or unsupported type declaration" % + typenode.coord.line) + + def _parse_function_type(self, typenode, funcname=None): + params = list(getattr(typenode.args, 'params', [])) + for i, arg in enumerate(params): + if not hasattr(arg, 'type'): + raise CDefError("%s arg %d: unknown type '%s'" + " (if you meant to use the old C syntax of giving" + " untyped arguments, it is not supported)" + % (funcname or 'in expression', i + 1, + getattr(arg, 'name', '?'))) + ellipsis = ( + len(params) > 0 and + isinstance(params[-1].type, pycparser.c_ast.TypeDecl) and + isinstance(params[-1].type.type, + pycparser.c_ast.IdentifierType) and + params[-1].type.type.names == ['__dotdotdot__']) + if ellipsis: + params.pop() + if not params: + raise CDefError( + "%s: a function with only '(...)' as argument" + " is not correct C" % (funcname or 'in expression')) + args = [self._as_func_arg(*self._get_type_and_quals(argdeclnode.type)) + for argdeclnode in params] + if not ellipsis and args == [model.void_type]: + args = [] + result, quals = self._get_type_and_quals(typenode.type) + # the 'quals' on the result type are ignored. HACK: we absure them + # to detect __stdcall functions: we textually replace "__stdcall" + # with "volatile volatile const" above. + abi = None + if hasattr(typenode.type, 'quals'): # else, probable syntax error anyway + if typenode.type.quals[-3:] == ['volatile', 'volatile', 'const']: + abi = '__stdcall' + return model.RawFunctionType(tuple(args), result, ellipsis, abi) + + def _as_func_arg(self, type, quals): + if isinstance(type, model.ArrayType): + return model.PointerType(type.item, quals) + elif isinstance(type, model.RawFunctionType): + return type.as_function_pointer() + else: + return type + + def _get_struct_union_enum_type(self, kind, type, name=None, nested=False): + # First, a level of caching on the exact 'type' node of the AST. + # This is obscure, but needed because pycparser "unrolls" declarations + # such as "typedef struct { } foo_t, *foo_p" and we end up with + # an AST that is not a tree, but a DAG, with the "type" node of the + # two branches foo_t and foo_p of the trees being the same node. + # It's a bit silly but detecting "DAG-ness" in the AST tree seems + # to be the only way to distinguish this case from two independent + # structs. See test_struct_with_two_usages. + try: + return self._structnode2type[type] + except KeyError: + pass + # + # Note that this must handle parsing "struct foo" any number of + # times and always return the same StructType object. Additionally, + # one of these times (not necessarily the first), the fields of + # the struct can be specified with "struct foo { ...fields... }". + # If no name is given, then we have to create a new anonymous struct + # with no caching; in this case, the fields are either specified + # right now or never. + # + force_name = name + name = type.name + # + # get the type or create it if needed + if name is None: + # 'force_name' is used to guess a more readable name for + # anonymous structs, for the common case "typedef struct { } foo". + if force_name is not None: + explicit_name = '$%s' % force_name + else: + self._anonymous_counter += 1 + explicit_name = '$%d' % self._anonymous_counter + tp = None + else: + explicit_name = name + key = '%s %s' % (kind, name) + tp, _ = self._declarations.get(key, (None, None)) + # + if tp is None: + if kind == 'struct': + tp = model.StructType(explicit_name, None, None, None) + elif kind == 'union': + tp = model.UnionType(explicit_name, None, None, None) + elif kind == 'enum': + if explicit_name == '__dotdotdot__': + raise CDefError("Enums cannot be declared with ...") + tp = self._build_enum_type(explicit_name, type.values) + else: + raise AssertionError("kind = %r" % (kind,)) + if name is not None: + self._declare(key, tp) + else: + if kind == 'enum' and type.values is not None: + raise NotImplementedError( + "enum %s: the '{}' declaration should appear on the first " + "time the enum is mentioned, not later" % explicit_name) + if not tp.forcename: + tp.force_the_name(force_name) + if tp.forcename and '$' in tp.name: + self._declare('anonymous %s' % tp.forcename, tp) + # + self._structnode2type[type] = tp + # + # enums: done here + if kind == 'enum': + return tp + # + # is there a 'type.decls'? If yes, then this is the place in the + # C sources that declare the fields. If no, then just return the + # existing type, possibly still incomplete. + if type.decls is None: + return tp + # + if tp.fldnames is not None: + raise CDefError("duplicate declaration of struct %s" % name) + fldnames = [] + fldtypes = [] + fldbitsize = [] + fldquals = [] + for decl in type.decls: + if (isinstance(decl.type, pycparser.c_ast.IdentifierType) and + ''.join(decl.type.names) == '__dotdotdot__'): + # XXX pycparser is inconsistent: 'names' should be a list + # of strings, but is sometimes just one string. Use + # str.join() as a way to cope with both. + self._make_partial(tp, nested) + continue + if decl.bitsize is None: + bitsize = -1 + else: + bitsize = self._parse_constant(decl.bitsize) + self._partial_length = False + type, fqual = self._get_type_and_quals(decl.type, + partial_length_ok=True) + if self._partial_length: + self._make_partial(tp, nested) + if isinstance(type, model.StructType) and type.partial: + self._make_partial(tp, nested) + fldnames.append(decl.name or '') + fldtypes.append(type) + fldbitsize.append(bitsize) + fldquals.append(fqual) + tp.fldnames = tuple(fldnames) + tp.fldtypes = tuple(fldtypes) + tp.fldbitsize = tuple(fldbitsize) + tp.fldquals = tuple(fldquals) + if fldbitsize != [-1] * len(fldbitsize): + if isinstance(tp, model.StructType) and tp.partial: + raise NotImplementedError("%s: using both bitfields and '...;'" + % (tp,)) + tp.packed = self._options.get('packed') + if tp.completed: # must be re-completed: it is not opaque any more + tp.completed = 0 + self._recomplete.append(tp) + return tp + + def _make_partial(self, tp, nested): + if not isinstance(tp, model.StructOrUnion): + raise CDefError("%s cannot be partial" % (tp,)) + if not tp.has_c_name() and not nested: + raise NotImplementedError("%s is partial but has no C name" %(tp,)) + tp.partial = True + + def _parse_constant(self, exprnode, partial_length_ok=False): + # for now, limited to expressions that are an immediate number + # or positive/negative number + if isinstance(exprnode, pycparser.c_ast.Constant): + s = exprnode.value + if '0' <= s[0] <= '9': + s = s.rstrip('uUlL') + try: + if s.startswith('0'): + return int(s, 8) + else: + return int(s, 10) + except ValueError: + if len(s) > 1: + if s.lower()[0:2] == '0x': + return int(s, 16) + elif s.lower()[0:2] == '0b': + return int(s, 2) + raise CDefError("invalid constant %r" % (s,)) + elif s[0] == "'" and s[-1] == "'" and ( + len(s) == 3 or (len(s) == 4 and s[1] == "\\")): + return ord(s[-2]) + else: + raise CDefError("invalid constant %r" % (s,)) + # + if (isinstance(exprnode, pycparser.c_ast.UnaryOp) and + exprnode.op == '+'): + return self._parse_constant(exprnode.expr) + # + if (isinstance(exprnode, pycparser.c_ast.UnaryOp) and + exprnode.op == '-'): + return -self._parse_constant(exprnode.expr) + # load previously defined int constant + if (isinstance(exprnode, pycparser.c_ast.ID) and + exprnode.name in self._int_constants): + return self._int_constants[exprnode.name] + # + if (isinstance(exprnode, pycparser.c_ast.ID) and + exprnode.name == '__dotdotdotarray__'): + if partial_length_ok: + self._partial_length = True + return '...' + raise FFIError(":%d: unsupported '[...]' here, cannot derive " + "the actual array length in this context" + % exprnode.coord.line) + # + if isinstance(exprnode, pycparser.c_ast.BinaryOp): + left = self._parse_constant(exprnode.left) + right = self._parse_constant(exprnode.right) + if exprnode.op == '+': + return left + right + elif exprnode.op == '-': + return left - right + elif exprnode.op == '*': + return left * right + elif exprnode.op == '/': + return self._c_div(left, right) + elif exprnode.op == '%': + return left - self._c_div(left, right) * right + elif exprnode.op == '<<': + return left << right + elif exprnode.op == '>>': + return left >> right + elif exprnode.op == '&': + return left & right + elif exprnode.op == '|': + return left | right + elif exprnode.op == '^': + return left ^ right + # + raise FFIError(":%d: unsupported expression: expected a " + "simple numeric constant" % exprnode.coord.line) + + def _c_div(self, a, b): + result = a // b + if ((a < 0) ^ (b < 0)) and (a % b) != 0: + result += 1 + return result + + def _build_enum_type(self, explicit_name, decls): + if decls is not None: + partial = False + enumerators = [] + enumvalues = [] + nextenumvalue = 0 + for enum in decls.enumerators: + if _r_enum_dotdotdot.match(enum.name): + partial = True + continue + if enum.value is not None: + nextenumvalue = self._parse_constant(enum.value) + enumerators.append(enum.name) + enumvalues.append(nextenumvalue) + self._add_constants(enum.name, nextenumvalue) + nextenumvalue += 1 + enumerators = tuple(enumerators) + enumvalues = tuple(enumvalues) + tp = model.EnumType(explicit_name, enumerators, enumvalues) + tp.partial = partial + else: # opaque enum + tp = model.EnumType(explicit_name, (), ()) + return tp + + def include(self, other): + for name, (tp, quals) in other._declarations.items(): + if name.startswith('anonymous $enum_$'): + continue # fix for test_anonymous_enum_include + kind = name.split(' ', 1)[0] + if kind in ('struct', 'union', 'enum', 'anonymous', 'typedef'): + self._declare(name, tp, included=True, quals=quals) + for k, v in other._int_constants.items(): + self._add_constants(k, v) + + def _get_unknown_type(self, decl): + typenames = decl.type.type.names + if typenames == ['__dotdotdot__']: + return model.unknown_type(decl.name) + + if typenames == ['__dotdotdotint__']: + if self._uses_new_feature is None: + self._uses_new_feature = "'typedef int... %s'" % decl.name + return model.UnknownIntegerType(decl.name) + + if typenames == ['__dotdotdotfloat__']: + # note: not for 'long double' so far + if self._uses_new_feature is None: + self._uses_new_feature = "'typedef float... %s'" % decl.name + return model.UnknownFloatType(decl.name) + + raise FFIError(':%d: unsupported usage of "..." in typedef' + % decl.coord.line) + + def _get_unknown_ptr_type(self, decl): + if decl.type.type.type.names == ['__dotdotdot__']: + return model.unknown_ptr_type(decl.name) + raise FFIError(':%d: unsupported usage of "..." in typedef' + % decl.coord.line) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/error.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/error.py new file mode 100644 index 0000000..0a27247 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/error.py @@ -0,0 +1,31 @@ + +class FFIError(Exception): + __module__ = 'cffi' + +class CDefError(Exception): + __module__ = 'cffi' + def __str__(self): + try: + current_decl = self.args[1] + filename = current_decl.coord.file + linenum = current_decl.coord.line + prefix = '%s:%d: ' % (filename, linenum) + except (AttributeError, TypeError, IndexError): + prefix = '' + return '%s%s' % (prefix, self.args[0]) + +class VerificationError(Exception): + """ An error raised when verification fails + """ + __module__ = 'cffi' + +class VerificationMissing(Exception): + """ An error raised when incomplete structures are passed into + cdef, but no verification has been done + """ + __module__ = 'cffi' + +class PkgConfigError(Exception): + """ An error raised for missing modules in pkg-config + """ + __module__ = 'cffi' diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/ffiplatform.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/ffiplatform.py new file mode 100644 index 0000000..8531346 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/ffiplatform.py @@ -0,0 +1,127 @@ +import sys, os +from .error import VerificationError + + +LIST_OF_FILE_NAMES = ['sources', 'include_dirs', 'library_dirs', + 'extra_objects', 'depends'] + +def get_extension(srcfilename, modname, sources=(), **kwds): + _hack_at_distutils() + from distutils.core import Extension + allsources = [srcfilename] + for src in sources: + allsources.append(os.path.normpath(src)) + return Extension(name=modname, sources=allsources, **kwds) + +def compile(tmpdir, ext, compiler_verbose=0, debug=None): + """Compile a C extension module using distutils.""" + + _hack_at_distutils() + saved_environ = os.environ.copy() + try: + outputfilename = _build(tmpdir, ext, compiler_verbose, debug) + outputfilename = os.path.abspath(outputfilename) + finally: + # workaround for a distutils bugs where some env vars can + # become longer and longer every time it is used + for key, value in saved_environ.items(): + if os.environ.get(key) != value: + os.environ[key] = value + return outputfilename + +def _build(tmpdir, ext, compiler_verbose=0, debug=None): + # XXX compact but horrible :-( + from distutils.core import Distribution + import distutils.errors, distutils.log + # + dist = Distribution({'ext_modules': [ext]}) + dist.parse_config_files() + options = dist.get_option_dict('build_ext') + if debug is None: + debug = sys.flags.debug + options['debug'] = ('ffiplatform', debug) + options['force'] = ('ffiplatform', True) + options['build_lib'] = ('ffiplatform', tmpdir) + options['build_temp'] = ('ffiplatform', tmpdir) + # + try: + old_level = distutils.log.set_threshold(0) or 0 + try: + distutils.log.set_verbosity(compiler_verbose) + dist.run_command('build_ext') + cmd_obj = dist.get_command_obj('build_ext') + [soname] = cmd_obj.get_outputs() + finally: + distutils.log.set_threshold(old_level) + except (distutils.errors.CompileError, + distutils.errors.LinkError) as e: + raise VerificationError('%s: %s' % (e.__class__.__name__, e)) + # + return soname + +try: + from os.path import samefile +except ImportError: + def samefile(f1, f2): + return os.path.abspath(f1) == os.path.abspath(f2) + +def maybe_relative_path(path): + if not os.path.isabs(path): + return path # already relative + dir = path + names = [] + while True: + prevdir = dir + dir, name = os.path.split(prevdir) + if dir == prevdir or not dir: + return path # failed to make it relative + names.append(name) + try: + if samefile(dir, os.curdir): + names.reverse() + return os.path.join(*names) + except OSError: + pass + +# ____________________________________________________________ + +try: + int_or_long = (int, long) + import cStringIO +except NameError: + int_or_long = int # Python 3 + import io as cStringIO + +def _flatten(x, f): + if isinstance(x, str): + f.write('%ds%s' % (len(x), x)) + elif isinstance(x, dict): + keys = sorted(x.keys()) + f.write('%dd' % len(keys)) + for key in keys: + _flatten(key, f) + _flatten(x[key], f) + elif isinstance(x, (list, tuple)): + f.write('%dl' % len(x)) + for value in x: + _flatten(value, f) + elif isinstance(x, int_or_long): + f.write('%di' % (x,)) + else: + raise TypeError( + "the keywords to verify() contains unsupported object %r" % (x,)) + +def flatten(x): + f = cStringIO.StringIO() + _flatten(x, f) + return f.getvalue() + +def _hack_at_distutils(): + # Windows-only workaround for some configurations: see + # https://bugs.python.org/issue23246 (Python 2.7 with + # a specific MS compiler suite download) + if sys.platform == "win32": + try: + import setuptools # for side-effects, patches distutils + except ImportError: + pass diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/lock.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/lock.py new file mode 100644 index 0000000..db91b71 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/lock.py @@ -0,0 +1,30 @@ +import sys + +if sys.version_info < (3,): + try: + from thread import allocate_lock + except ImportError: + from dummy_thread import allocate_lock +else: + try: + from _thread import allocate_lock + except ImportError: + from _dummy_thread import allocate_lock + + +##import sys +##l1 = allocate_lock + +##class allocate_lock(object): +## def __init__(self): +## self._real = l1() +## def __enter__(self): +## for i in range(4, 0, -1): +## print sys._getframe(i).f_code +## print +## return self._real.__enter__() +## def __exit__(self, *args): +## return self._real.__exit__(*args) +## def acquire(self, f): +## assert f is False +## return self._real.acquire(f) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/model.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/model.py new file mode 100644 index 0000000..ad1c176 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/model.py @@ -0,0 +1,617 @@ +import types +import weakref + +from .lock import allocate_lock +from .error import CDefError, VerificationError, VerificationMissing + +# type qualifiers +Q_CONST = 0x01 +Q_RESTRICT = 0x02 +Q_VOLATILE = 0x04 + +def qualify(quals, replace_with): + if quals & Q_CONST: + replace_with = ' const ' + replace_with.lstrip() + if quals & Q_VOLATILE: + replace_with = ' volatile ' + replace_with.lstrip() + if quals & Q_RESTRICT: + # It seems that __restrict is supported by gcc and msvc. + # If you hit some different compiler, add a #define in + # _cffi_include.h for it (and in its copies, documented there) + replace_with = ' __restrict ' + replace_with.lstrip() + return replace_with + + +class BaseTypeByIdentity(object): + is_array_type = False + is_raw_function = False + + def get_c_name(self, replace_with='', context='a C file', quals=0): + result = self.c_name_with_marker + assert result.count('&') == 1 + # some logic duplication with ffi.getctype()... :-( + replace_with = replace_with.strip() + if replace_with: + if replace_with.startswith('*') and '&[' in result: + replace_with = '(%s)' % replace_with + elif not replace_with[0] in '[(': + replace_with = ' ' + replace_with + replace_with = qualify(quals, replace_with) + result = result.replace('&', replace_with) + if '$' in result: + raise VerificationError( + "cannot generate '%s' in %s: unknown type name" + % (self._get_c_name(), context)) + return result + + def _get_c_name(self): + return self.c_name_with_marker.replace('&', '') + + def has_c_name(self): + return '$' not in self._get_c_name() + + def is_integer_type(self): + return False + + def get_cached_btype(self, ffi, finishlist, can_delay=False): + try: + BType = ffi._cached_btypes[self] + except KeyError: + BType = self.build_backend_type(ffi, finishlist) + BType2 = ffi._cached_btypes.setdefault(self, BType) + assert BType2 is BType + return BType + + def __repr__(self): + return '<%s>' % (self._get_c_name(),) + + def _get_items(self): + return [(name, getattr(self, name)) for name in self._attrs_] + + +class BaseType(BaseTypeByIdentity): + + def __eq__(self, other): + return (self.__class__ == other.__class__ and + self._get_items() == other._get_items()) + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash((self.__class__, tuple(self._get_items()))) + + +class VoidType(BaseType): + _attrs_ = () + + def __init__(self): + self.c_name_with_marker = 'void&' + + def build_backend_type(self, ffi, finishlist): + return global_cache(self, ffi, 'new_void_type') + +void_type = VoidType() + + +class BasePrimitiveType(BaseType): + def is_complex_type(self): + return False + + +class PrimitiveType(BasePrimitiveType): + _attrs_ = ('name',) + + ALL_PRIMITIVE_TYPES = { + 'char': 'c', + 'short': 'i', + 'int': 'i', + 'long': 'i', + 'long long': 'i', + 'signed char': 'i', + 'unsigned char': 'i', + 'unsigned short': 'i', + 'unsigned int': 'i', + 'unsigned long': 'i', + 'unsigned long long': 'i', + 'float': 'f', + 'double': 'f', + 'long double': 'f', + 'float _Complex': 'j', + 'double _Complex': 'j', + '_Bool': 'i', + # the following types are not primitive in the C sense + 'wchar_t': 'c', + 'char16_t': 'c', + 'char32_t': 'c', + 'int8_t': 'i', + 'uint8_t': 'i', + 'int16_t': 'i', + 'uint16_t': 'i', + 'int32_t': 'i', + 'uint32_t': 'i', + 'int64_t': 'i', + 'uint64_t': 'i', + 'int_least8_t': 'i', + 'uint_least8_t': 'i', + 'int_least16_t': 'i', + 'uint_least16_t': 'i', + 'int_least32_t': 'i', + 'uint_least32_t': 'i', + 'int_least64_t': 'i', + 'uint_least64_t': 'i', + 'int_fast8_t': 'i', + 'uint_fast8_t': 'i', + 'int_fast16_t': 'i', + 'uint_fast16_t': 'i', + 'int_fast32_t': 'i', + 'uint_fast32_t': 'i', + 'int_fast64_t': 'i', + 'uint_fast64_t': 'i', + 'intptr_t': 'i', + 'uintptr_t': 'i', + 'intmax_t': 'i', + 'uintmax_t': 'i', + 'ptrdiff_t': 'i', + 'size_t': 'i', + 'ssize_t': 'i', + } + + def __init__(self, name): + assert name in self.ALL_PRIMITIVE_TYPES + self.name = name + self.c_name_with_marker = name + '&' + + def is_char_type(self): + return self.ALL_PRIMITIVE_TYPES[self.name] == 'c' + def is_integer_type(self): + return self.ALL_PRIMITIVE_TYPES[self.name] == 'i' + def is_float_type(self): + return self.ALL_PRIMITIVE_TYPES[self.name] == 'f' + def is_complex_type(self): + return self.ALL_PRIMITIVE_TYPES[self.name] == 'j' + + def build_backend_type(self, ffi, finishlist): + return global_cache(self, ffi, 'new_primitive_type', self.name) + + +class UnknownIntegerType(BasePrimitiveType): + _attrs_ = ('name',) + + def __init__(self, name): + self.name = name + self.c_name_with_marker = name + '&' + + def is_integer_type(self): + return True + + def build_backend_type(self, ffi, finishlist): + raise NotImplementedError("integer type '%s' can only be used after " + "compilation" % self.name) + +class UnknownFloatType(BasePrimitiveType): + _attrs_ = ('name', ) + + def __init__(self, name): + self.name = name + self.c_name_with_marker = name + '&' + + def build_backend_type(self, ffi, finishlist): + raise NotImplementedError("float type '%s' can only be used after " + "compilation" % self.name) + + +class BaseFunctionType(BaseType): + _attrs_ = ('args', 'result', 'ellipsis', 'abi') + + def __init__(self, args, result, ellipsis, abi=None): + self.args = args + self.result = result + self.ellipsis = ellipsis + self.abi = abi + # + reprargs = [arg._get_c_name() for arg in self.args] + if self.ellipsis: + reprargs.append('...') + reprargs = reprargs or ['void'] + replace_with = self._base_pattern % (', '.join(reprargs),) + if abi is not None: + replace_with = replace_with[:1] + abi + ' ' + replace_with[1:] + self.c_name_with_marker = ( + self.result.c_name_with_marker.replace('&', replace_with)) + + +class RawFunctionType(BaseFunctionType): + # Corresponds to a C type like 'int(int)', which is the C type of + # a function, but not a pointer-to-function. The backend has no + # notion of such a type; it's used temporarily by parsing. + _base_pattern = '(&)(%s)' + is_raw_function = True + + def build_backend_type(self, ffi, finishlist): + raise CDefError("cannot render the type %r: it is a function " + "type, not a pointer-to-function type" % (self,)) + + def as_function_pointer(self): + return FunctionPtrType(self.args, self.result, self.ellipsis, self.abi) + + +class FunctionPtrType(BaseFunctionType): + _base_pattern = '(*&)(%s)' + + def build_backend_type(self, ffi, finishlist): + result = self.result.get_cached_btype(ffi, finishlist) + args = [] + for tp in self.args: + args.append(tp.get_cached_btype(ffi, finishlist)) + abi_args = () + if self.abi == "__stdcall": + if not self.ellipsis: # __stdcall ignored for variadic funcs + try: + abi_args = (ffi._backend.FFI_STDCALL,) + except AttributeError: + pass + return global_cache(self, ffi, 'new_function_type', + tuple(args), result, self.ellipsis, *abi_args) + + def as_raw_function(self): + return RawFunctionType(self.args, self.result, self.ellipsis, self.abi) + + +class PointerType(BaseType): + _attrs_ = ('totype', 'quals') + + def __init__(self, totype, quals=0): + self.totype = totype + self.quals = quals + extra = qualify(quals, " *&") + if totype.is_array_type: + extra = "(%s)" % (extra.lstrip(),) + self.c_name_with_marker = totype.c_name_with_marker.replace('&', extra) + + def build_backend_type(self, ffi, finishlist): + BItem = self.totype.get_cached_btype(ffi, finishlist, can_delay=True) + return global_cache(self, ffi, 'new_pointer_type', BItem) + +voidp_type = PointerType(void_type) + +def ConstPointerType(totype): + return PointerType(totype, Q_CONST) + +const_voidp_type = ConstPointerType(void_type) + + +class NamedPointerType(PointerType): + _attrs_ = ('totype', 'name') + + def __init__(self, totype, name, quals=0): + PointerType.__init__(self, totype, quals) + self.name = name + self.c_name_with_marker = name + '&' + + +class ArrayType(BaseType): + _attrs_ = ('item', 'length') + is_array_type = True + + def __init__(self, item, length): + self.item = item + self.length = length + # + if length is None: + brackets = '&[]' + elif length == '...': + brackets = '&[/*...*/]' + else: + brackets = '&[%s]' % length + self.c_name_with_marker = ( + self.item.c_name_with_marker.replace('&', brackets)) + + def length_is_unknown(self): + return isinstance(self.length, str) + + def resolve_length(self, newlength): + return ArrayType(self.item, newlength) + + def build_backend_type(self, ffi, finishlist): + if self.length_is_unknown(): + raise CDefError("cannot render the type %r: unknown length" % + (self,)) + self.item.get_cached_btype(ffi, finishlist) # force the item BType + BPtrItem = PointerType(self.item).get_cached_btype(ffi, finishlist) + return global_cache(self, ffi, 'new_array_type', BPtrItem, self.length) + +char_array_type = ArrayType(PrimitiveType('char'), None) + + +class StructOrUnionOrEnum(BaseTypeByIdentity): + _attrs_ = ('name',) + forcename = None + + def build_c_name_with_marker(self): + name = self.forcename or '%s %s' % (self.kind, self.name) + self.c_name_with_marker = name + '&' + + def force_the_name(self, forcename): + self.forcename = forcename + self.build_c_name_with_marker() + + def get_official_name(self): + assert self.c_name_with_marker.endswith('&') + return self.c_name_with_marker[:-1] + + +class StructOrUnion(StructOrUnionOrEnum): + fixedlayout = None + completed = 0 + partial = False + packed = 0 + + def __init__(self, name, fldnames, fldtypes, fldbitsize, fldquals=None): + self.name = name + self.fldnames = fldnames + self.fldtypes = fldtypes + self.fldbitsize = fldbitsize + self.fldquals = fldquals + self.build_c_name_with_marker() + + def anonymous_struct_fields(self): + if self.fldtypes is not None: + for name, type in zip(self.fldnames, self.fldtypes): + if name == '' and isinstance(type, StructOrUnion): + yield type + + def enumfields(self, expand_anonymous_struct_union=True): + fldquals = self.fldquals + if fldquals is None: + fldquals = (0,) * len(self.fldnames) + for name, type, bitsize, quals in zip(self.fldnames, self.fldtypes, + self.fldbitsize, fldquals): + if (name == '' and isinstance(type, StructOrUnion) + and expand_anonymous_struct_union): + # nested anonymous struct/union + for result in type.enumfields(): + yield result + else: + yield (name, type, bitsize, quals) + + def force_flatten(self): + # force the struct or union to have a declaration that lists + # directly all fields returned by enumfields(), flattening + # nested anonymous structs/unions. + names = [] + types = [] + bitsizes = [] + fldquals = [] + for name, type, bitsize, quals in self.enumfields(): + names.append(name) + types.append(type) + bitsizes.append(bitsize) + fldquals.append(quals) + self.fldnames = tuple(names) + self.fldtypes = tuple(types) + self.fldbitsize = tuple(bitsizes) + self.fldquals = tuple(fldquals) + + def get_cached_btype(self, ffi, finishlist, can_delay=False): + BType = StructOrUnionOrEnum.get_cached_btype(self, ffi, finishlist, + can_delay) + if not can_delay: + self.finish_backend_type(ffi, finishlist) + return BType + + def finish_backend_type(self, ffi, finishlist): + if self.completed: + if self.completed != 2: + raise NotImplementedError("recursive structure declaration " + "for '%s'" % (self.name,)) + return + BType = ffi._cached_btypes[self] + # + self.completed = 1 + # + if self.fldtypes is None: + pass # not completing it: it's an opaque struct + # + elif self.fixedlayout is None: + fldtypes = [tp.get_cached_btype(ffi, finishlist) + for tp in self.fldtypes] + lst = list(zip(self.fldnames, fldtypes, self.fldbitsize)) + extra_flags = () + if self.packed: + if self.packed == 1: + extra_flags = (8,) # SF_PACKED + else: + extra_flags = (0, self.packed) + ffi._backend.complete_struct_or_union(BType, lst, self, + -1, -1, *extra_flags) + # + else: + fldtypes = [] + fieldofs, fieldsize, totalsize, totalalignment = self.fixedlayout + for i in range(len(self.fldnames)): + fsize = fieldsize[i] + ftype = self.fldtypes[i] + # + if isinstance(ftype, ArrayType) and ftype.length_is_unknown(): + # fix the length to match the total size + BItemType = ftype.item.get_cached_btype(ffi, finishlist) + nlen, nrest = divmod(fsize, ffi.sizeof(BItemType)) + if nrest != 0: + self._verification_error( + "field '%s.%s' has a bogus size?" % ( + self.name, self.fldnames[i] or '{}')) + ftype = ftype.resolve_length(nlen) + self.fldtypes = (self.fldtypes[:i] + (ftype,) + + self.fldtypes[i+1:]) + # + BFieldType = ftype.get_cached_btype(ffi, finishlist) + if isinstance(ftype, ArrayType) and ftype.length is None: + assert fsize == 0 + else: + bitemsize = ffi.sizeof(BFieldType) + if bitemsize != fsize: + self._verification_error( + "field '%s.%s' is declared as %d bytes, but is " + "really %d bytes" % (self.name, + self.fldnames[i] or '{}', + bitemsize, fsize)) + fldtypes.append(BFieldType) + # + lst = list(zip(self.fldnames, fldtypes, self.fldbitsize, fieldofs)) + ffi._backend.complete_struct_or_union(BType, lst, self, + totalsize, totalalignment) + self.completed = 2 + + def _verification_error(self, msg): + raise VerificationError(msg) + + def check_not_partial(self): + if self.partial and self.fixedlayout is None: + raise VerificationMissing(self._get_c_name()) + + def build_backend_type(self, ffi, finishlist): + self.check_not_partial() + finishlist.append(self) + # + return global_cache(self, ffi, 'new_%s_type' % self.kind, + self.get_official_name(), key=self) + + +class StructType(StructOrUnion): + kind = 'struct' + + +class UnionType(StructOrUnion): + kind = 'union' + + +class EnumType(StructOrUnionOrEnum): + kind = 'enum' + partial = False + partial_resolved = False + + def __init__(self, name, enumerators, enumvalues, baseinttype=None): + self.name = name + self.enumerators = enumerators + self.enumvalues = enumvalues + self.baseinttype = baseinttype + self.build_c_name_with_marker() + + def force_the_name(self, forcename): + StructOrUnionOrEnum.force_the_name(self, forcename) + if self.forcename is None: + name = self.get_official_name() + self.forcename = '$' + name.replace(' ', '_') + + def check_not_partial(self): + if self.partial and not self.partial_resolved: + raise VerificationMissing(self._get_c_name()) + + def build_backend_type(self, ffi, finishlist): + self.check_not_partial() + base_btype = self.build_baseinttype(ffi, finishlist) + return global_cache(self, ffi, 'new_enum_type', + self.get_official_name(), + self.enumerators, self.enumvalues, + base_btype, key=self) + + def build_baseinttype(self, ffi, finishlist): + if self.baseinttype is not None: + return self.baseinttype.get_cached_btype(ffi, finishlist) + # + if self.enumvalues: + smallest_value = min(self.enumvalues) + largest_value = max(self.enumvalues) + else: + import warnings + try: + # XXX! The goal is to ensure that the warnings.warn() + # will not suppress the warning. We want to get it + # several times if we reach this point several times. + __warningregistry__.clear() + except NameError: + pass + warnings.warn("%r has no values explicitly defined; " + "guessing that it is equivalent to 'unsigned int'" + % self._get_c_name()) + smallest_value = largest_value = 0 + if smallest_value < 0: # needs a signed type + sign = 1 + candidate1 = PrimitiveType("int") + candidate2 = PrimitiveType("long") + else: + sign = 0 + candidate1 = PrimitiveType("unsigned int") + candidate2 = PrimitiveType("unsigned long") + btype1 = candidate1.get_cached_btype(ffi, finishlist) + btype2 = candidate2.get_cached_btype(ffi, finishlist) + size1 = ffi.sizeof(btype1) + size2 = ffi.sizeof(btype2) + if (smallest_value >= ((-1) << (8*size1-1)) and + largest_value < (1 << (8*size1-sign))): + return btype1 + if (smallest_value >= ((-1) << (8*size2-1)) and + largest_value < (1 << (8*size2-sign))): + return btype2 + raise CDefError("%s values don't all fit into either 'long' " + "or 'unsigned long'" % self._get_c_name()) + +def unknown_type(name, structname=None): + if structname is None: + structname = '$%s' % name + tp = StructType(structname, None, None, None) + tp.force_the_name(name) + tp.origin = "unknown_type" + return tp + +def unknown_ptr_type(name, structname=None): + if structname is None: + structname = '$$%s' % name + tp = StructType(structname, None, None, None) + return NamedPointerType(tp, name) + + +global_lock = allocate_lock() +_typecache_cffi_backend = weakref.WeakValueDictionary() + +def get_typecache(backend): + # returns _typecache_cffi_backend if backend is the _cffi_backend + # module, or type(backend).__typecache if backend is an instance of + # CTypesBackend (or some FakeBackend class during tests) + if isinstance(backend, types.ModuleType): + return _typecache_cffi_backend + with global_lock: + if not hasattr(type(backend), '__typecache'): + type(backend).__typecache = weakref.WeakValueDictionary() + return type(backend).__typecache + +def global_cache(srctype, ffi, funcname, *args, **kwds): + key = kwds.pop('key', (funcname, args)) + assert not kwds + try: + return ffi._typecache[key] + except KeyError: + pass + try: + res = getattr(ffi._backend, funcname)(*args) + except NotImplementedError as e: + raise NotImplementedError("%s: %r: %s" % (funcname, srctype, e)) + # note that setdefault() on WeakValueDictionary is not atomic + # and contains a rare bug (http://bugs.python.org/issue19542); + # we have to use a lock and do it ourselves + cache = ffi._typecache + with global_lock: + res1 = cache.get(key) + if res1 is None: + cache[key] = res + return res + else: + return res1 + +def pointer_cache(ffi, BType): + return global_cache('?', ffi, 'new_pointer_type', BType) + +def attach_exception_info(e, name): + if e.args and type(e.args[0]) is str: + e.args = ('%s: %s' % (name, e.args[0]),) + e.args[1:] diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/parse_c_type.h b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/parse_c_type.h new file mode 100644 index 0000000..84e4ef8 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/parse_c_type.h @@ -0,0 +1,181 @@ + +/* This part is from file 'cffi/parse_c_type.h'. It is copied at the + beginning of C sources generated by CFFI's ffi.set_source(). */ + +typedef void *_cffi_opcode_t; + +#define _CFFI_OP(opcode, arg) (_cffi_opcode_t)(opcode | (((uintptr_t)(arg)) << 8)) +#define _CFFI_GETOP(cffi_opcode) ((unsigned char)(uintptr_t)cffi_opcode) +#define _CFFI_GETARG(cffi_opcode) (((intptr_t)cffi_opcode) >> 8) + +#define _CFFI_OP_PRIMITIVE 1 +#define _CFFI_OP_POINTER 3 +#define _CFFI_OP_ARRAY 5 +#define _CFFI_OP_OPEN_ARRAY 7 +#define _CFFI_OP_STRUCT_UNION 9 +#define _CFFI_OP_ENUM 11 +#define _CFFI_OP_FUNCTION 13 +#define _CFFI_OP_FUNCTION_END 15 +#define _CFFI_OP_NOOP 17 +#define _CFFI_OP_BITFIELD 19 +#define _CFFI_OP_TYPENAME 21 +#define _CFFI_OP_CPYTHON_BLTN_V 23 // varargs +#define _CFFI_OP_CPYTHON_BLTN_N 25 // noargs +#define _CFFI_OP_CPYTHON_BLTN_O 27 // O (i.e. a single arg) +#define _CFFI_OP_CONSTANT 29 +#define _CFFI_OP_CONSTANT_INT 31 +#define _CFFI_OP_GLOBAL_VAR 33 +#define _CFFI_OP_DLOPEN_FUNC 35 +#define _CFFI_OP_DLOPEN_CONST 37 +#define _CFFI_OP_GLOBAL_VAR_F 39 +#define _CFFI_OP_EXTERN_PYTHON 41 + +#define _CFFI_PRIM_VOID 0 +#define _CFFI_PRIM_BOOL 1 +#define _CFFI_PRIM_CHAR 2 +#define _CFFI_PRIM_SCHAR 3 +#define _CFFI_PRIM_UCHAR 4 +#define _CFFI_PRIM_SHORT 5 +#define _CFFI_PRIM_USHORT 6 +#define _CFFI_PRIM_INT 7 +#define _CFFI_PRIM_UINT 8 +#define _CFFI_PRIM_LONG 9 +#define _CFFI_PRIM_ULONG 10 +#define _CFFI_PRIM_LONGLONG 11 +#define _CFFI_PRIM_ULONGLONG 12 +#define _CFFI_PRIM_FLOAT 13 +#define _CFFI_PRIM_DOUBLE 14 +#define _CFFI_PRIM_LONGDOUBLE 15 + +#define _CFFI_PRIM_WCHAR 16 +#define _CFFI_PRIM_INT8 17 +#define _CFFI_PRIM_UINT8 18 +#define _CFFI_PRIM_INT16 19 +#define _CFFI_PRIM_UINT16 20 +#define _CFFI_PRIM_INT32 21 +#define _CFFI_PRIM_UINT32 22 +#define _CFFI_PRIM_INT64 23 +#define _CFFI_PRIM_UINT64 24 +#define _CFFI_PRIM_INTPTR 25 +#define _CFFI_PRIM_UINTPTR 26 +#define _CFFI_PRIM_PTRDIFF 27 +#define _CFFI_PRIM_SIZE 28 +#define _CFFI_PRIM_SSIZE 29 +#define _CFFI_PRIM_INT_LEAST8 30 +#define _CFFI_PRIM_UINT_LEAST8 31 +#define _CFFI_PRIM_INT_LEAST16 32 +#define _CFFI_PRIM_UINT_LEAST16 33 +#define _CFFI_PRIM_INT_LEAST32 34 +#define _CFFI_PRIM_UINT_LEAST32 35 +#define _CFFI_PRIM_INT_LEAST64 36 +#define _CFFI_PRIM_UINT_LEAST64 37 +#define _CFFI_PRIM_INT_FAST8 38 +#define _CFFI_PRIM_UINT_FAST8 39 +#define _CFFI_PRIM_INT_FAST16 40 +#define _CFFI_PRIM_UINT_FAST16 41 +#define _CFFI_PRIM_INT_FAST32 42 +#define _CFFI_PRIM_UINT_FAST32 43 +#define _CFFI_PRIM_INT_FAST64 44 +#define _CFFI_PRIM_UINT_FAST64 45 +#define _CFFI_PRIM_INTMAX 46 +#define _CFFI_PRIM_UINTMAX 47 +#define _CFFI_PRIM_FLOATCOMPLEX 48 +#define _CFFI_PRIM_DOUBLECOMPLEX 49 +#define _CFFI_PRIM_CHAR16 50 +#define _CFFI_PRIM_CHAR32 51 + +#define _CFFI__NUM_PRIM 52 +#define _CFFI__UNKNOWN_PRIM (-1) +#define _CFFI__UNKNOWN_FLOAT_PRIM (-2) +#define _CFFI__UNKNOWN_LONG_DOUBLE (-3) + +#define _CFFI__IO_FILE_STRUCT (-1) + + +struct _cffi_global_s { + const char *name; + void *address; + _cffi_opcode_t type_op; + void *size_or_direct_fn; // OP_GLOBAL_VAR: size, or 0 if unknown + // OP_CPYTHON_BLTN_*: addr of direct function +}; + +struct _cffi_getconst_s { + unsigned long long value; + const struct _cffi_type_context_s *ctx; + int gindex; +}; + +struct _cffi_struct_union_s { + const char *name; + int type_index; // -> _cffi_types, on a OP_STRUCT_UNION + int flags; // _CFFI_F_* flags below + size_t size; + int alignment; + int first_field_index; // -> _cffi_fields array + int num_fields; +}; +#define _CFFI_F_UNION 0x01 // is a union, not a struct +#define _CFFI_F_CHECK_FIELDS 0x02 // complain if fields are not in the + // "standard layout" or if some are missing +#define _CFFI_F_PACKED 0x04 // for CHECK_FIELDS, assume a packed struct +#define _CFFI_F_EXTERNAL 0x08 // in some other ffi.include() +#define _CFFI_F_OPAQUE 0x10 // opaque + +struct _cffi_field_s { + const char *name; + size_t field_offset; + size_t field_size; + _cffi_opcode_t field_type_op; +}; + +struct _cffi_enum_s { + const char *name; + int type_index; // -> _cffi_types, on a OP_ENUM + int type_prim; // _CFFI_PRIM_xxx + const char *enumerators; // comma-delimited string +}; + +struct _cffi_typename_s { + const char *name; + int type_index; /* if opaque, points to a possibly artificial + OP_STRUCT which is itself opaque */ +}; + +struct _cffi_type_context_s { + _cffi_opcode_t *types; + const struct _cffi_global_s *globals; + const struct _cffi_field_s *fields; + const struct _cffi_struct_union_s *struct_unions; + const struct _cffi_enum_s *enums; + const struct _cffi_typename_s *typenames; + int num_globals; + int num_struct_unions; + int num_enums; + int num_typenames; + const char *const *includes; + int num_types; + int flags; /* future extension */ +}; + +struct _cffi_parse_info_s { + const struct _cffi_type_context_s *ctx; + _cffi_opcode_t *output; + unsigned int output_size; + size_t error_location; + const char *error_message; +}; + +struct _cffi_externpy_s { + const char *name; + size_t size_of_result; + void *reserved1, *reserved2; +}; + +#ifdef _CFFI_INTERNAL +static int parse_c_type(struct _cffi_parse_info_s *info, const char *input); +static int search_in_globals(const struct _cffi_type_context_s *ctx, + const char *search, size_t search_len); +static int search_in_struct_unions(const struct _cffi_type_context_s *ctx, + const char *search, size_t search_len); +#endif diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/pkgconfig.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/pkgconfig.py new file mode 100644 index 0000000..5c93f15 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/pkgconfig.py @@ -0,0 +1,121 @@ +# pkg-config, https://www.freedesktop.org/wiki/Software/pkg-config/ integration for cffi +import sys, os, subprocess + +from .error import PkgConfigError + + +def merge_flags(cfg1, cfg2): + """Merge values from cffi config flags cfg2 to cf1 + + Example: + merge_flags({"libraries": ["one"]}, {"libraries": ["two"]}) + {"libraries": ["one", "two"]} + """ + for key, value in cfg2.items(): + if key not in cfg1: + cfg1[key] = value + else: + if not isinstance(cfg1[key], list): + raise TypeError("cfg1[%r] should be a list of strings" % (key,)) + if not isinstance(value, list): + raise TypeError("cfg2[%r] should be a list of strings" % (key,)) + cfg1[key].extend(value) + return cfg1 + + +def call(libname, flag, encoding=sys.getfilesystemencoding()): + """Calls pkg-config and returns the output if found + """ + a = ["pkg-config", "--print-errors"] + a.append(flag) + a.append(libname) + try: + pc = subprocess.Popen(a, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + except EnvironmentError as e: + raise PkgConfigError("cannot run pkg-config: %s" % (str(e).strip(),)) + + bout, berr = pc.communicate() + if pc.returncode != 0: + try: + berr = berr.decode(encoding) + except Exception: + pass + raise PkgConfigError(berr.strip()) + + if sys.version_info >= (3,) and not isinstance(bout, str): # Python 3.x + try: + bout = bout.decode(encoding) + except UnicodeDecodeError: + raise PkgConfigError("pkg-config %s %s returned bytes that cannot " + "be decoded with encoding %r:\n%r" % + (flag, libname, encoding, bout)) + + if os.altsep != '\\' and '\\' in bout: + raise PkgConfigError("pkg-config %s %s returned an unsupported " + "backslash-escaped output:\n%r" % + (flag, libname, bout)) + return bout + + +def flags_from_pkgconfig(libs): + r"""Return compiler line flags for FFI.set_source based on pkg-config output + + Usage + ... + ffibuilder.set_source("_foo", pkgconfig = ["libfoo", "libbar >= 1.8.3"]) + + If pkg-config is installed on build machine, then arguments include_dirs, + library_dirs, libraries, define_macros, extra_compile_args and + extra_link_args are extended with an output of pkg-config for libfoo and + libbar. + + Raises PkgConfigError in case the pkg-config call fails. + """ + + def get_include_dirs(string): + return [x[2:] for x in string.split() if x.startswith("-I")] + + def get_library_dirs(string): + return [x[2:] for x in string.split() if x.startswith("-L")] + + def get_libraries(string): + return [x[2:] for x in string.split() if x.startswith("-l")] + + # convert -Dfoo=bar to list of tuples [("foo", "bar")] expected by distutils + def get_macros(string): + def _macro(x): + x = x[2:] # drop "-D" + if '=' in x: + return tuple(x.split("=", 1)) # "-Dfoo=bar" => ("foo", "bar") + else: + return (x, None) # "-Dfoo" => ("foo", None) + return [_macro(x) for x in string.split() if x.startswith("-D")] + + def get_other_cflags(string): + return [x for x in string.split() if not x.startswith("-I") and + not x.startswith("-D")] + + def get_other_libs(string): + return [x for x in string.split() if not x.startswith("-L") and + not x.startswith("-l")] + + # return kwargs for given libname + def kwargs(libname): + fse = sys.getfilesystemencoding() + all_cflags = call(libname, "--cflags") + all_libs = call(libname, "--libs") + return { + "include_dirs": get_include_dirs(all_cflags), + "library_dirs": get_library_dirs(all_libs), + "libraries": get_libraries(all_libs), + "define_macros": get_macros(all_cflags), + "extra_compile_args": get_other_cflags(all_cflags), + "extra_link_args": get_other_libs(all_libs), + } + + # merge all arguments together + ret = {} + for libname in libs: + lib_flags = kwargs(libname) + merge_flags(ret, lib_flags) + return ret diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/recompiler.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/recompiler.py new file mode 100644 index 0000000..86b37d7 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/recompiler.py @@ -0,0 +1,1581 @@ +import os, sys, io +from . import ffiplatform, model +from .error import VerificationError +from .cffi_opcode import * + +VERSION_BASE = 0x2601 +VERSION_EMBEDDED = 0x2701 +VERSION_CHAR16CHAR32 = 0x2801 + +USE_LIMITED_API = (sys.platform != 'win32' or sys.version_info < (3, 0) or + sys.version_info >= (3, 5)) + + +class GlobalExpr: + def __init__(self, name, address, type_op, size=0, check_value=0): + self.name = name + self.address = address + self.type_op = type_op + self.size = size + self.check_value = check_value + + def as_c_expr(self): + return ' { "%s", (void *)%s, %s, (void *)%s },' % ( + self.name, self.address, self.type_op.as_c_expr(), self.size) + + def as_python_expr(self): + return "b'%s%s',%d" % (self.type_op.as_python_bytes(), self.name, + self.check_value) + +class FieldExpr: + def __init__(self, name, field_offset, field_size, fbitsize, field_type_op): + self.name = name + self.field_offset = field_offset + self.field_size = field_size + self.fbitsize = fbitsize + self.field_type_op = field_type_op + + def as_c_expr(self): + spaces = " " * len(self.name) + return (' { "%s", %s,\n' % (self.name, self.field_offset) + + ' %s %s,\n' % (spaces, self.field_size) + + ' %s %s },' % (spaces, self.field_type_op.as_c_expr())) + + def as_python_expr(self): + raise NotImplementedError + + def as_field_python_expr(self): + if self.field_type_op.op == OP_NOOP: + size_expr = '' + elif self.field_type_op.op == OP_BITFIELD: + size_expr = format_four_bytes(self.fbitsize) + else: + raise NotImplementedError + return "b'%s%s%s'" % (self.field_type_op.as_python_bytes(), + size_expr, + self.name) + +class StructUnionExpr: + def __init__(self, name, type_index, flags, size, alignment, comment, + first_field_index, c_fields): + self.name = name + self.type_index = type_index + self.flags = flags + self.size = size + self.alignment = alignment + self.comment = comment + self.first_field_index = first_field_index + self.c_fields = c_fields + + def as_c_expr(self): + return (' { "%s", %d, %s,' % (self.name, self.type_index, self.flags) + + '\n %s, %s, ' % (self.size, self.alignment) + + '%d, %d ' % (self.first_field_index, len(self.c_fields)) + + ('/* %s */ ' % self.comment if self.comment else '') + + '},') + + def as_python_expr(self): + flags = eval(self.flags, G_FLAGS) + fields_expr = [c_field.as_field_python_expr() + for c_field in self.c_fields] + return "(b'%s%s%s',%s)" % ( + format_four_bytes(self.type_index), + format_four_bytes(flags), + self.name, + ','.join(fields_expr)) + +class EnumExpr: + def __init__(self, name, type_index, size, signed, allenums): + self.name = name + self.type_index = type_index + self.size = size + self.signed = signed + self.allenums = allenums + + def as_c_expr(self): + return (' { "%s", %d, _cffi_prim_int(%s, %s),\n' + ' "%s" },' % (self.name, self.type_index, + self.size, self.signed, self.allenums)) + + def as_python_expr(self): + prim_index = { + (1, 0): PRIM_UINT8, (1, 1): PRIM_INT8, + (2, 0): PRIM_UINT16, (2, 1): PRIM_INT16, + (4, 0): PRIM_UINT32, (4, 1): PRIM_INT32, + (8, 0): PRIM_UINT64, (8, 1): PRIM_INT64, + }[self.size, self.signed] + return "b'%s%s%s\\x00%s'" % (format_four_bytes(self.type_index), + format_four_bytes(prim_index), + self.name, self.allenums) + +class TypenameExpr: + def __init__(self, name, type_index): + self.name = name + self.type_index = type_index + + def as_c_expr(self): + return ' { "%s", %d },' % (self.name, self.type_index) + + def as_python_expr(self): + return "b'%s%s'" % (format_four_bytes(self.type_index), self.name) + + +# ____________________________________________________________ + + +class Recompiler: + _num_externpy = 0 + + def __init__(self, ffi, module_name, target_is_python=False): + self.ffi = ffi + self.module_name = module_name + self.target_is_python = target_is_python + self._version = VERSION_BASE + + def needs_version(self, ver): + self._version = max(self._version, ver) + + def collect_type_table(self): + self._typesdict = {} + self._generate("collecttype") + # + all_decls = sorted(self._typesdict, key=str) + # + # prepare all FUNCTION bytecode sequences first + self.cffi_types = [] + for tp in all_decls: + if tp.is_raw_function: + assert self._typesdict[tp] is None + self._typesdict[tp] = len(self.cffi_types) + self.cffi_types.append(tp) # placeholder + for tp1 in tp.args: + assert isinstance(tp1, (model.VoidType, + model.BasePrimitiveType, + model.PointerType, + model.StructOrUnionOrEnum, + model.FunctionPtrType)) + if self._typesdict[tp1] is None: + self._typesdict[tp1] = len(self.cffi_types) + self.cffi_types.append(tp1) # placeholder + self.cffi_types.append('END') # placeholder + # + # prepare all OTHER bytecode sequences + for tp in all_decls: + if not tp.is_raw_function and self._typesdict[tp] is None: + self._typesdict[tp] = len(self.cffi_types) + self.cffi_types.append(tp) # placeholder + if tp.is_array_type and tp.length is not None: + self.cffi_types.append('LEN') # placeholder + assert None not in self._typesdict.values() + # + # collect all structs and unions and enums + self._struct_unions = {} + self._enums = {} + for tp in all_decls: + if isinstance(tp, model.StructOrUnion): + self._struct_unions[tp] = None + elif isinstance(tp, model.EnumType): + self._enums[tp] = None + for i, tp in enumerate(sorted(self._struct_unions, + key=lambda tp: tp.name)): + self._struct_unions[tp] = i + for i, tp in enumerate(sorted(self._enums, + key=lambda tp: tp.name)): + self._enums[tp] = i + # + # emit all bytecode sequences now + for tp in all_decls: + method = getattr(self, '_emit_bytecode_' + tp.__class__.__name__) + method(tp, self._typesdict[tp]) + # + # consistency check + for op in self.cffi_types: + assert isinstance(op, CffiOp) + self.cffi_types = tuple(self.cffi_types) # don't change any more + + def _enum_fields(self, tp): + # When producing C, expand all anonymous struct/union fields. + # That's necessary to have C code checking the offsets of the + # individual fields contained in them. When producing Python, + # don't do it and instead write it like it is, with the + # corresponding fields having an empty name. Empty names are + # recognized at runtime when we import the generated Python + # file. + expand_anonymous_struct_union = not self.target_is_python + return tp.enumfields(expand_anonymous_struct_union) + + def _do_collect_type(self, tp): + if not isinstance(tp, model.BaseTypeByIdentity): + if isinstance(tp, tuple): + for x in tp: + self._do_collect_type(x) + return + if tp not in self._typesdict: + self._typesdict[tp] = None + if isinstance(tp, model.FunctionPtrType): + self._do_collect_type(tp.as_raw_function()) + elif isinstance(tp, model.StructOrUnion): + if tp.fldtypes is not None and ( + tp not in self.ffi._parser._included_declarations): + for name1, tp1, _, _ in self._enum_fields(tp): + self._do_collect_type(self._field_type(tp, name1, tp1)) + else: + for _, x in tp._get_items(): + self._do_collect_type(x) + + def _generate(self, step_name): + lst = self.ffi._parser._declarations.items() + for name, (tp, quals) in sorted(lst): + kind, realname = name.split(' ', 1) + try: + method = getattr(self, '_generate_cpy_%s_%s' % (kind, + step_name)) + except AttributeError: + raise VerificationError( + "not implemented in recompile(): %r" % name) + try: + self._current_quals = quals + method(tp, realname) + except Exception as e: + model.attach_exception_info(e, name) + raise + + # ---------- + + ALL_STEPS = ["global", "field", "struct_union", "enum", "typename"] + + def collect_step_tables(self): + # collect the declarations for '_cffi_globals', '_cffi_typenames', etc. + self._lsts = {} + for step_name in self.ALL_STEPS: + self._lsts[step_name] = [] + self._seen_struct_unions = set() + self._generate("ctx") + self._add_missing_struct_unions() + # + for step_name in self.ALL_STEPS: + lst = self._lsts[step_name] + if step_name != "field": + lst.sort(key=lambda entry: entry.name) + self._lsts[step_name] = tuple(lst) # don't change any more + # + # check for a possible internal inconsistency: _cffi_struct_unions + # should have been generated with exactly self._struct_unions + lst = self._lsts["struct_union"] + for tp, i in self._struct_unions.items(): + assert i < len(lst) + assert lst[i].name == tp.name + assert len(lst) == len(self._struct_unions) + # same with enums + lst = self._lsts["enum"] + for tp, i in self._enums.items(): + assert i < len(lst) + assert lst[i].name == tp.name + assert len(lst) == len(self._enums) + + # ---------- + + def _prnt(self, what=''): + self._f.write(what + '\n') + + def write_source_to_f(self, f, preamble): + if self.target_is_python: + assert preamble is None + self.write_py_source_to_f(f) + else: + assert preamble is not None + self.write_c_source_to_f(f, preamble) + + def _rel_readlines(self, filename): + g = open(os.path.join(os.path.dirname(__file__), filename), 'r') + lines = g.readlines() + g.close() + return lines + + def write_c_source_to_f(self, f, preamble): + self._f = f + prnt = self._prnt + if self.ffi._embedding is not None: + prnt('#define _CFFI_USE_EMBEDDING') + if not USE_LIMITED_API: + prnt('#define _CFFI_NO_LIMITED_API') + # + # first the '#include' (actually done by inlining the file's content) + lines = self._rel_readlines('_cffi_include.h') + i = lines.index('#include "parse_c_type.h"\n') + lines[i:i+1] = self._rel_readlines('parse_c_type.h') + prnt(''.join(lines)) + # + # if we have ffi._embedding != None, we give it here as a macro + # and include an extra file + base_module_name = self.module_name.split('.')[-1] + if self.ffi._embedding is not None: + prnt('#define _CFFI_MODULE_NAME "%s"' % (self.module_name,)) + prnt('static const char _CFFI_PYTHON_STARTUP_CODE[] = {') + self._print_string_literal_in_array(self.ffi._embedding) + prnt('0 };') + prnt('#ifdef PYPY_VERSION') + prnt('# define _CFFI_PYTHON_STARTUP_FUNC _cffi_pypyinit_%s' % ( + base_module_name,)) + prnt('#elif PY_MAJOR_VERSION >= 3') + prnt('# define _CFFI_PYTHON_STARTUP_FUNC PyInit_%s' % ( + base_module_name,)) + prnt('#else') + prnt('# define _CFFI_PYTHON_STARTUP_FUNC init%s' % ( + base_module_name,)) + prnt('#endif') + lines = self._rel_readlines('_embedding.h') + i = lines.index('#include "_cffi_errors.h"\n') + lines[i:i+1] = self._rel_readlines('_cffi_errors.h') + prnt(''.join(lines)) + self.needs_version(VERSION_EMBEDDED) + # + # then paste the C source given by the user, verbatim. + prnt('/************************************************************/') + prnt() + prnt(preamble) + prnt() + prnt('/************************************************************/') + prnt() + # + # the declaration of '_cffi_types' + prnt('static void *_cffi_types[] = {') + typeindex2type = dict([(i, tp) for (tp, i) in self._typesdict.items()]) + for i, op in enumerate(self.cffi_types): + comment = '' + if i in typeindex2type: + comment = ' // ' + typeindex2type[i]._get_c_name() + prnt('/* %2d */ %s,%s' % (i, op.as_c_expr(), comment)) + if not self.cffi_types: + prnt(' 0') + prnt('};') + prnt() + # + # call generate_cpy_xxx_decl(), for every xxx found from + # ffi._parser._declarations. This generates all the functions. + self._seen_constants = set() + self._generate("decl") + # + # the declaration of '_cffi_globals' and '_cffi_typenames' + nums = {} + for step_name in self.ALL_STEPS: + lst = self._lsts[step_name] + nums[step_name] = len(lst) + if nums[step_name] > 0: + prnt('static const struct _cffi_%s_s _cffi_%ss[] = {' % ( + step_name, step_name)) + for entry in lst: + prnt(entry.as_c_expr()) + prnt('};') + prnt() + # + # the declaration of '_cffi_includes' + if self.ffi._included_ffis: + prnt('static const char * const _cffi_includes[] = {') + for ffi_to_include in self.ffi._included_ffis: + try: + included_module_name, included_source = ( + ffi_to_include._assigned_source[:2]) + except AttributeError: + raise VerificationError( + "ffi object %r includes %r, but the latter has not " + "been prepared with set_source()" % ( + self.ffi, ffi_to_include,)) + if included_source is None: + raise VerificationError( + "not implemented yet: ffi.include() of a Python-based " + "ffi inside a C-based ffi") + prnt(' "%s",' % (included_module_name,)) + prnt(' NULL') + prnt('};') + prnt() + # + # the declaration of '_cffi_type_context' + prnt('static const struct _cffi_type_context_s _cffi_type_context = {') + prnt(' _cffi_types,') + for step_name in self.ALL_STEPS: + if nums[step_name] > 0: + prnt(' _cffi_%ss,' % step_name) + else: + prnt(' NULL, /* no %ss */' % step_name) + for step_name in self.ALL_STEPS: + if step_name != "field": + prnt(' %d, /* num_%ss */' % (nums[step_name], step_name)) + if self.ffi._included_ffis: + prnt(' _cffi_includes,') + else: + prnt(' NULL, /* no includes */') + prnt(' %d, /* num_types */' % (len(self.cffi_types),)) + flags = 0 + if self._num_externpy: + flags |= 1 # set to mean that we use extern "Python" + prnt(' %d, /* flags */' % flags) + prnt('};') + prnt() + # + # the init function + prnt('#ifdef __GNUC__') + prnt('# pragma GCC visibility push(default) /* for -fvisibility= */') + prnt('#endif') + prnt() + prnt('#ifdef PYPY_VERSION') + prnt('PyMODINIT_FUNC') + prnt('_cffi_pypyinit_%s(const void *p[])' % (base_module_name,)) + prnt('{') + if self._num_externpy: + prnt(' if (((intptr_t)p[0]) >= 0x0A03) {') + prnt(' _cffi_call_python_org = ' + '(void(*)(struct _cffi_externpy_s *, char *))p[1];') + prnt(' }') + prnt(' p[0] = (const void *)0x%x;' % self._version) + prnt(' p[1] = &_cffi_type_context;') + prnt('#if PY_MAJOR_VERSION >= 3') + prnt(' return NULL;') + prnt('#endif') + prnt('}') + # on Windows, distutils insists on putting init_cffi_xyz in + # 'export_symbols', so instead of fighting it, just give up and + # give it one + prnt('# ifdef _MSC_VER') + prnt(' PyMODINIT_FUNC') + prnt('# if PY_MAJOR_VERSION >= 3') + prnt(' PyInit_%s(void) { return NULL; }' % (base_module_name,)) + prnt('# else') + prnt(' init%s(void) { }' % (base_module_name,)) + prnt('# endif') + prnt('# endif') + prnt('#elif PY_MAJOR_VERSION >= 3') + prnt('PyMODINIT_FUNC') + prnt('PyInit_%s(void)' % (base_module_name,)) + prnt('{') + prnt(' return _cffi_init("%s", 0x%x, &_cffi_type_context);' % ( + self.module_name, self._version)) + prnt('}') + prnt('#else') + prnt('PyMODINIT_FUNC') + prnt('init%s(void)' % (base_module_name,)) + prnt('{') + prnt(' _cffi_init("%s", 0x%x, &_cffi_type_context);' % ( + self.module_name, self._version)) + prnt('}') + prnt('#endif') + prnt() + prnt('#ifdef __GNUC__') + prnt('# pragma GCC visibility pop') + prnt('#endif') + self._version = None + + def _to_py(self, x): + if isinstance(x, str): + return "b'%s'" % (x,) + if isinstance(x, (list, tuple)): + rep = [self._to_py(item) for item in x] + if len(rep) == 1: + rep.append('') + return "(%s)" % (','.join(rep),) + return x.as_python_expr() # Py2: unicode unexpected; Py3: bytes unexp. + + def write_py_source_to_f(self, f): + self._f = f + prnt = self._prnt + # + # header + prnt("# auto-generated file") + prnt("import _cffi_backend") + # + # the 'import' of the included ffis + num_includes = len(self.ffi._included_ffis or ()) + for i in range(num_includes): + ffi_to_include = self.ffi._included_ffis[i] + try: + included_module_name, included_source = ( + ffi_to_include._assigned_source[:2]) + except AttributeError: + raise VerificationError( + "ffi object %r includes %r, but the latter has not " + "been prepared with set_source()" % ( + self.ffi, ffi_to_include,)) + if included_source is not None: + raise VerificationError( + "not implemented yet: ffi.include() of a C-based " + "ffi inside a Python-based ffi") + prnt('from %s import ffi as _ffi%d' % (included_module_name, i)) + prnt() + prnt("ffi = _cffi_backend.FFI('%s'," % (self.module_name,)) + prnt(" _version = 0x%x," % (self._version,)) + self._version = None + # + # the '_types' keyword argument + self.cffi_types = tuple(self.cffi_types) # don't change any more + types_lst = [op.as_python_bytes() for op in self.cffi_types] + prnt(' _types = %s,' % (self._to_py(''.join(types_lst)),)) + typeindex2type = dict([(i, tp) for (tp, i) in self._typesdict.items()]) + # + # the keyword arguments from ALL_STEPS + for step_name in self.ALL_STEPS: + lst = self._lsts[step_name] + if len(lst) > 0 and step_name != "field": + prnt(' _%ss = %s,' % (step_name, self._to_py(lst))) + # + # the '_includes' keyword argument + if num_includes > 0: + prnt(' _includes = (%s,),' % ( + ', '.join(['_ffi%d' % i for i in range(num_includes)]),)) + # + # the footer + prnt(')') + + # ---------- + + def _gettypenum(self, type): + # a KeyError here is a bug. please report it! :-) + return self._typesdict[type] + + def _convert_funcarg_to_c(self, tp, fromvar, tovar, errcode): + extraarg = '' + if isinstance(tp, model.BasePrimitiveType) and not tp.is_complex_type(): + if tp.is_integer_type() and tp.name != '_Bool': + converter = '_cffi_to_c_int' + extraarg = ', %s' % tp.name + elif isinstance(tp, model.UnknownFloatType): + # don't check with is_float_type(): it may be a 'long + # double' here, and _cffi_to_c_double would loose precision + converter = '(%s)_cffi_to_c_double' % (tp.get_c_name(''),) + else: + cname = tp.get_c_name('') + converter = '(%s)_cffi_to_c_%s' % (cname, + tp.name.replace(' ', '_')) + if cname in ('char16_t', 'char32_t'): + self.needs_version(VERSION_CHAR16CHAR32) + errvalue = '-1' + # + elif isinstance(tp, model.PointerType): + self._convert_funcarg_to_c_ptr_or_array(tp, fromvar, + tovar, errcode) + return + # + elif (isinstance(tp, model.StructOrUnionOrEnum) or + isinstance(tp, model.BasePrimitiveType)): + # a struct (not a struct pointer) as a function argument; + # or, a complex (the same code works) + self._prnt(' if (_cffi_to_c((char *)&%s, _cffi_type(%d), %s) < 0)' + % (tovar, self._gettypenum(tp), fromvar)) + self._prnt(' %s;' % errcode) + return + # + elif isinstance(tp, model.FunctionPtrType): + converter = '(%s)_cffi_to_c_pointer' % tp.get_c_name('') + extraarg = ', _cffi_type(%d)' % self._gettypenum(tp) + errvalue = 'NULL' + # + else: + raise NotImplementedError(tp) + # + self._prnt(' %s = %s(%s%s);' % (tovar, converter, fromvar, extraarg)) + self._prnt(' if (%s == (%s)%s && PyErr_Occurred())' % ( + tovar, tp.get_c_name(''), errvalue)) + self._prnt(' %s;' % errcode) + + def _extra_local_variables(self, tp, localvars, freelines): + if isinstance(tp, model.PointerType): + localvars.add('Py_ssize_t datasize') + localvars.add('struct _cffi_freeme_s *large_args_free = NULL') + freelines.add('if (large_args_free != NULL)' + ' _cffi_free_array_arguments(large_args_free);') + + def _convert_funcarg_to_c_ptr_or_array(self, tp, fromvar, tovar, errcode): + self._prnt(' datasize = _cffi_prepare_pointer_call_argument(') + self._prnt(' _cffi_type(%d), %s, (char **)&%s);' % ( + self._gettypenum(tp), fromvar, tovar)) + self._prnt(' if (datasize != 0) {') + self._prnt(' %s = ((size_t)datasize) <= 640 ? ' + '(%s)alloca((size_t)datasize) : NULL;' % ( + tovar, tp.get_c_name(''))) + self._prnt(' if (_cffi_convert_array_argument(_cffi_type(%d), %s, ' + '(char **)&%s,' % (self._gettypenum(tp), fromvar, tovar)) + self._prnt(' datasize, &large_args_free) < 0)') + self._prnt(' %s;' % errcode) + self._prnt(' }') + + def _convert_expr_from_c(self, tp, var, context): + if isinstance(tp, model.BasePrimitiveType): + if tp.is_integer_type() and tp.name != '_Bool': + return '_cffi_from_c_int(%s, %s)' % (var, tp.name) + elif isinstance(tp, model.UnknownFloatType): + return '_cffi_from_c_double(%s)' % (var,) + elif tp.name != 'long double' and not tp.is_complex_type(): + cname = tp.name.replace(' ', '_') + if cname in ('char16_t', 'char32_t'): + self.needs_version(VERSION_CHAR16CHAR32) + return '_cffi_from_c_%s(%s)' % (cname, var) + else: + return '_cffi_from_c_deref((char *)&%s, _cffi_type(%d))' % ( + var, self._gettypenum(tp)) + elif isinstance(tp, (model.PointerType, model.FunctionPtrType)): + return '_cffi_from_c_pointer((char *)%s, _cffi_type(%d))' % ( + var, self._gettypenum(tp)) + elif isinstance(tp, model.ArrayType): + return '_cffi_from_c_pointer((char *)%s, _cffi_type(%d))' % ( + var, self._gettypenum(model.PointerType(tp.item))) + elif isinstance(tp, model.StructOrUnion): + if tp.fldnames is None: + raise TypeError("'%s' is used as %s, but is opaque" % ( + tp._get_c_name(), context)) + return '_cffi_from_c_struct((char *)&%s, _cffi_type(%d))' % ( + var, self._gettypenum(tp)) + elif isinstance(tp, model.EnumType): + return '_cffi_from_c_deref((char *)&%s, _cffi_type(%d))' % ( + var, self._gettypenum(tp)) + else: + raise NotImplementedError(tp) + + # ---------- + # typedefs + + def _typedef_type(self, tp, name): + return self._global_type(tp, "(*(%s *)0)" % (name,)) + + def _generate_cpy_typedef_collecttype(self, tp, name): + self._do_collect_type(self._typedef_type(tp, name)) + + def _generate_cpy_typedef_decl(self, tp, name): + pass + + def _typedef_ctx(self, tp, name): + type_index = self._typesdict[tp] + self._lsts["typename"].append(TypenameExpr(name, type_index)) + + def _generate_cpy_typedef_ctx(self, tp, name): + tp = self._typedef_type(tp, name) + self._typedef_ctx(tp, name) + if getattr(tp, "origin", None) == "unknown_type": + self._struct_ctx(tp, tp.name, approxname=None) + elif isinstance(tp, model.NamedPointerType): + self._struct_ctx(tp.totype, tp.totype.name, approxname=tp.name, + named_ptr=tp) + + # ---------- + # function declarations + + def _generate_cpy_function_collecttype(self, tp, name): + self._do_collect_type(tp.as_raw_function()) + if tp.ellipsis and not self.target_is_python: + self._do_collect_type(tp) + + def _generate_cpy_function_decl(self, tp, name): + assert not self.target_is_python + assert isinstance(tp, model.FunctionPtrType) + if tp.ellipsis: + # cannot support vararg functions better than this: check for its + # exact type (including the fixed arguments), and build it as a + # constant function pointer (no CPython wrapper) + self._generate_cpy_constant_decl(tp, name) + return + prnt = self._prnt + numargs = len(tp.args) + if numargs == 0: + argname = 'noarg' + elif numargs == 1: + argname = 'arg0' + else: + argname = 'args' + # + # ------------------------------ + # the 'd' version of the function, only for addressof(lib, 'func') + arguments = [] + call_arguments = [] + context = 'argument of %s' % name + for i, type in enumerate(tp.args): + arguments.append(type.get_c_name(' x%d' % i, context)) + call_arguments.append('x%d' % i) + repr_arguments = ', '.join(arguments) + repr_arguments = repr_arguments or 'void' + if tp.abi: + abi = tp.abi + ' ' + else: + abi = '' + name_and_arguments = '%s_cffi_d_%s(%s)' % (abi, name, repr_arguments) + prnt('static %s' % (tp.result.get_c_name(name_and_arguments),)) + prnt('{') + call_arguments = ', '.join(call_arguments) + result_code = 'return ' + if isinstance(tp.result, model.VoidType): + result_code = '' + prnt(' %s%s(%s);' % (result_code, name, call_arguments)) + prnt('}') + # + prnt('#ifndef PYPY_VERSION') # ------------------------------ + # + prnt('static PyObject *') + prnt('_cffi_f_%s(PyObject *self, PyObject *%s)' % (name, argname)) + prnt('{') + # + context = 'argument of %s' % name + for i, type in enumerate(tp.args): + arg = type.get_c_name(' x%d' % i, context) + prnt(' %s;' % arg) + # + localvars = set() + freelines = set() + for type in tp.args: + self._extra_local_variables(type, localvars, freelines) + for decl in sorted(localvars): + prnt(' %s;' % (decl,)) + # + if not isinstance(tp.result, model.VoidType): + result_code = 'result = ' + context = 'result of %s' % name + result_decl = ' %s;' % tp.result.get_c_name(' result', context) + prnt(result_decl) + prnt(' PyObject *pyresult;') + else: + result_decl = None + result_code = '' + # + if len(tp.args) > 1: + rng = range(len(tp.args)) + for i in rng: + prnt(' PyObject *arg%d;' % i) + prnt() + prnt(' if (!PyArg_UnpackTuple(args, "%s", %d, %d, %s))' % ( + name, len(rng), len(rng), + ', '.join(['&arg%d' % i for i in rng]))) + prnt(' return NULL;') + prnt() + # + for i, type in enumerate(tp.args): + self._convert_funcarg_to_c(type, 'arg%d' % i, 'x%d' % i, + 'return NULL') + prnt() + # + prnt(' Py_BEGIN_ALLOW_THREADS') + prnt(' _cffi_restore_errno();') + call_arguments = ['x%d' % i for i in range(len(tp.args))] + call_arguments = ', '.join(call_arguments) + prnt(' { %s%s(%s); }' % (result_code, name, call_arguments)) + prnt(' _cffi_save_errno();') + prnt(' Py_END_ALLOW_THREADS') + prnt() + # + prnt(' (void)self; /* unused */') + if numargs == 0: + prnt(' (void)noarg; /* unused */') + if result_code: + prnt(' pyresult = %s;' % + self._convert_expr_from_c(tp.result, 'result', 'result type')) + for freeline in freelines: + prnt(' ' + freeline) + prnt(' return pyresult;') + else: + for freeline in freelines: + prnt(' ' + freeline) + prnt(' Py_INCREF(Py_None);') + prnt(' return Py_None;') + prnt('}') + # + prnt('#else') # ------------------------------ + # + # the PyPy version: need to replace struct/union arguments with + # pointers, and if the result is a struct/union, insert a first + # arg that is a pointer to the result. We also do that for + # complex args and return type. + def need_indirection(type): + return (isinstance(type, model.StructOrUnion) or + (isinstance(type, model.PrimitiveType) and + type.is_complex_type())) + difference = False + arguments = [] + call_arguments = [] + context = 'argument of %s' % name + for i, type in enumerate(tp.args): + indirection = '' + if need_indirection(type): + indirection = '*' + difference = True + arg = type.get_c_name(' %sx%d' % (indirection, i), context) + arguments.append(arg) + call_arguments.append('%sx%d' % (indirection, i)) + tp_result = tp.result + if need_indirection(tp_result): + context = 'result of %s' % name + arg = tp_result.get_c_name(' *result', context) + arguments.insert(0, arg) + tp_result = model.void_type + result_decl = None + result_code = '*result = ' + difference = True + if difference: + repr_arguments = ', '.join(arguments) + repr_arguments = repr_arguments or 'void' + name_and_arguments = '%s_cffi_f_%s(%s)' % (abi, name, + repr_arguments) + prnt('static %s' % (tp_result.get_c_name(name_and_arguments),)) + prnt('{') + if result_decl: + prnt(result_decl) + call_arguments = ', '.join(call_arguments) + prnt(' { %s%s(%s); }' % (result_code, name, call_arguments)) + if result_decl: + prnt(' return result;') + prnt('}') + else: + prnt('# define _cffi_f_%s _cffi_d_%s' % (name, name)) + # + prnt('#endif') # ------------------------------ + prnt() + + def _generate_cpy_function_ctx(self, tp, name): + if tp.ellipsis and not self.target_is_python: + self._generate_cpy_constant_ctx(tp, name) + return + type_index = self._typesdict[tp.as_raw_function()] + numargs = len(tp.args) + if self.target_is_python: + meth_kind = OP_DLOPEN_FUNC + elif numargs == 0: + meth_kind = OP_CPYTHON_BLTN_N # 'METH_NOARGS' + elif numargs == 1: + meth_kind = OP_CPYTHON_BLTN_O # 'METH_O' + else: + meth_kind = OP_CPYTHON_BLTN_V # 'METH_VARARGS' + self._lsts["global"].append( + GlobalExpr(name, '_cffi_f_%s' % name, + CffiOp(meth_kind, type_index), + size='_cffi_d_%s' % name)) + + # ---------- + # named structs or unions + + def _field_type(self, tp_struct, field_name, tp_field): + if isinstance(tp_field, model.ArrayType): + actual_length = tp_field.length + if actual_length == '...': + ptr_struct_name = tp_struct.get_c_name('*') + actual_length = '_cffi_array_len(((%s)0)->%s)' % ( + ptr_struct_name, field_name) + tp_item = self._field_type(tp_struct, '%s[0]' % field_name, + tp_field.item) + tp_field = model.ArrayType(tp_item, actual_length) + return tp_field + + def _struct_collecttype(self, tp): + self._do_collect_type(tp) + if self.target_is_python: + # also requires nested anon struct/unions in ABI mode, recursively + for fldtype in tp.anonymous_struct_fields(): + self._struct_collecttype(fldtype) + + def _struct_decl(self, tp, cname, approxname): + if tp.fldtypes is None: + return + prnt = self._prnt + checkfuncname = '_cffi_checkfld_%s' % (approxname,) + prnt('_CFFI_UNUSED_FN') + prnt('static void %s(%s *p)' % (checkfuncname, cname)) + prnt('{') + prnt(' /* only to generate compile-time warnings or errors */') + prnt(' (void)p;') + for fname, ftype, fbitsize, fqual in self._enum_fields(tp): + try: + if ftype.is_integer_type() or fbitsize >= 0: + # accept all integers, but complain on float or double + if fname != '': + prnt(" (void)((p->%s) | 0); /* check that '%s.%s' is " + "an integer */" % (fname, cname, fname)) + continue + # only accept exactly the type declared, except that '[]' + # is interpreted as a '*' and so will match any array length. + # (It would also match '*', but that's harder to detect...) + while (isinstance(ftype, model.ArrayType) + and (ftype.length is None or ftype.length == '...')): + ftype = ftype.item + fname = fname + '[0]' + prnt(' { %s = &p->%s; (void)tmp; }' % ( + ftype.get_c_name('*tmp', 'field %r'%fname, quals=fqual), + fname)) + except VerificationError as e: + prnt(' /* %s */' % str(e)) # cannot verify it, ignore + prnt('}') + prnt('struct _cffi_align_%s { char x; %s y; };' % (approxname, cname)) + prnt() + + def _struct_ctx(self, tp, cname, approxname, named_ptr=None): + type_index = self._typesdict[tp] + reason_for_not_expanding = None + flags = [] + if isinstance(tp, model.UnionType): + flags.append("_CFFI_F_UNION") + if tp.fldtypes is None: + flags.append("_CFFI_F_OPAQUE") + reason_for_not_expanding = "opaque" + if (tp not in self.ffi._parser._included_declarations and + (named_ptr is None or + named_ptr not in self.ffi._parser._included_declarations)): + if tp.fldtypes is None: + pass # opaque + elif tp.partial or any(tp.anonymous_struct_fields()): + pass # field layout obtained silently from the C compiler + else: + flags.append("_CFFI_F_CHECK_FIELDS") + if tp.packed: + if tp.packed > 1: + raise NotImplementedError( + "%r is declared with 'pack=%r'; only 0 or 1 are " + "supported in API mode (try to use \"...;\", which " + "does not require a 'pack' declaration)" % + (tp, tp.packed)) + flags.append("_CFFI_F_PACKED") + else: + flags.append("_CFFI_F_EXTERNAL") + reason_for_not_expanding = "external" + flags = '|'.join(flags) or '0' + c_fields = [] + if reason_for_not_expanding is None: + enumfields = list(self._enum_fields(tp)) + for fldname, fldtype, fbitsize, fqual in enumfields: + fldtype = self._field_type(tp, fldname, fldtype) + self._check_not_opaque(fldtype, + "field '%s.%s'" % (tp.name, fldname)) + # cname is None for _add_missing_struct_unions() only + op = OP_NOOP + if fbitsize >= 0: + op = OP_BITFIELD + size = '%d /* bits */' % fbitsize + elif cname is None or ( + isinstance(fldtype, model.ArrayType) and + fldtype.length is None): + size = '(size_t)-1' + else: + size = 'sizeof(((%s)0)->%s)' % ( + tp.get_c_name('*') if named_ptr is None + else named_ptr.name, + fldname) + if cname is None or fbitsize >= 0: + offset = '(size_t)-1' + elif named_ptr is not None: + offset = '((char *)&((%s)0)->%s) - (char *)0' % ( + named_ptr.name, fldname) + else: + offset = 'offsetof(%s, %s)' % (tp.get_c_name(''), fldname) + c_fields.append( + FieldExpr(fldname, offset, size, fbitsize, + CffiOp(op, self._typesdict[fldtype]))) + first_field_index = len(self._lsts["field"]) + self._lsts["field"].extend(c_fields) + # + if cname is None: # unknown name, for _add_missing_struct_unions + size = '(size_t)-2' + align = -2 + comment = "unnamed" + else: + if named_ptr is not None: + size = 'sizeof(*(%s)0)' % (named_ptr.name,) + align = '-1 /* unknown alignment */' + else: + size = 'sizeof(%s)' % (cname,) + align = 'offsetof(struct _cffi_align_%s, y)' % (approxname,) + comment = None + else: + size = '(size_t)-1' + align = -1 + first_field_index = -1 + comment = reason_for_not_expanding + self._lsts["struct_union"].append( + StructUnionExpr(tp.name, type_index, flags, size, align, comment, + first_field_index, c_fields)) + self._seen_struct_unions.add(tp) + + def _check_not_opaque(self, tp, location): + while isinstance(tp, model.ArrayType): + tp = tp.item + if isinstance(tp, model.StructOrUnion) and tp.fldtypes is None: + raise TypeError( + "%s is of an opaque type (not declared in cdef())" % location) + + def _add_missing_struct_unions(self): + # not very nice, but some struct declarations might be missing + # because they don't have any known C name. Check that they are + # not partial (we can't complete or verify them!) and emit them + # anonymously. + lst = list(self._struct_unions.items()) + lst.sort(key=lambda tp_order: tp_order[1]) + for tp, order in lst: + if tp not in self._seen_struct_unions: + if tp.partial: + raise NotImplementedError("internal inconsistency: %r is " + "partial but was not seen at " + "this point" % (tp,)) + if tp.name.startswith('$') and tp.name[1:].isdigit(): + approxname = tp.name[1:] + elif tp.name == '_IO_FILE' and tp.forcename == 'FILE': + approxname = 'FILE' + self._typedef_ctx(tp, 'FILE') + else: + raise NotImplementedError("internal inconsistency: %r" % + (tp,)) + self._struct_ctx(tp, None, approxname) + + def _generate_cpy_struct_collecttype(self, tp, name): + self._struct_collecttype(tp) + _generate_cpy_union_collecttype = _generate_cpy_struct_collecttype + + def _struct_names(self, tp): + cname = tp.get_c_name('') + if ' ' in cname: + return cname, cname.replace(' ', '_') + else: + return cname, '_' + cname + + def _generate_cpy_struct_decl(self, tp, name): + self._struct_decl(tp, *self._struct_names(tp)) + _generate_cpy_union_decl = _generate_cpy_struct_decl + + def _generate_cpy_struct_ctx(self, tp, name): + self._struct_ctx(tp, *self._struct_names(tp)) + _generate_cpy_union_ctx = _generate_cpy_struct_ctx + + # ---------- + # 'anonymous' declarations. These are produced for anonymous structs + # or unions; the 'name' is obtained by a typedef. + + def _generate_cpy_anonymous_collecttype(self, tp, name): + if isinstance(tp, model.EnumType): + self._generate_cpy_enum_collecttype(tp, name) + else: + self._struct_collecttype(tp) + + def _generate_cpy_anonymous_decl(self, tp, name): + if isinstance(tp, model.EnumType): + self._generate_cpy_enum_decl(tp) + else: + self._struct_decl(tp, name, 'typedef_' + name) + + def _generate_cpy_anonymous_ctx(self, tp, name): + if isinstance(tp, model.EnumType): + self._enum_ctx(tp, name) + else: + self._struct_ctx(tp, name, 'typedef_' + name) + + # ---------- + # constants, declared with "static const ..." + + def _generate_cpy_const(self, is_int, name, tp=None, category='const', + check_value=None): + if (category, name) in self._seen_constants: + raise VerificationError( + "duplicate declaration of %s '%s'" % (category, name)) + self._seen_constants.add((category, name)) + # + prnt = self._prnt + funcname = '_cffi_%s_%s' % (category, name) + if is_int: + prnt('static int %s(unsigned long long *o)' % funcname) + prnt('{') + prnt(' int n = (%s) <= 0;' % (name,)) + prnt(' *o = (unsigned long long)((%s) | 0);' + ' /* check that %s is an integer */' % (name, name)) + if check_value is not None: + if check_value > 0: + check_value = '%dU' % (check_value,) + prnt(' if (!_cffi_check_int(*o, n, %s))' % (check_value,)) + prnt(' n |= 2;') + prnt(' return n;') + prnt('}') + else: + assert check_value is None + prnt('static void %s(char *o)' % funcname) + prnt('{') + prnt(' *(%s)o = %s;' % (tp.get_c_name('*'), name)) + prnt('}') + prnt() + + def _generate_cpy_constant_collecttype(self, tp, name): + is_int = tp.is_integer_type() + if not is_int or self.target_is_python: + self._do_collect_type(tp) + + def _generate_cpy_constant_decl(self, tp, name): + is_int = tp.is_integer_type() + self._generate_cpy_const(is_int, name, tp) + + def _generate_cpy_constant_ctx(self, tp, name): + if not self.target_is_python and tp.is_integer_type(): + type_op = CffiOp(OP_CONSTANT_INT, -1) + else: + if self.target_is_python: + const_kind = OP_DLOPEN_CONST + else: + const_kind = OP_CONSTANT + type_index = self._typesdict[tp] + type_op = CffiOp(const_kind, type_index) + self._lsts["global"].append( + GlobalExpr(name, '_cffi_const_%s' % name, type_op)) + + # ---------- + # enums + + def _generate_cpy_enum_collecttype(self, tp, name): + self._do_collect_type(tp) + + def _generate_cpy_enum_decl(self, tp, name=None): + for enumerator in tp.enumerators: + self._generate_cpy_const(True, enumerator) + + def _enum_ctx(self, tp, cname): + type_index = self._typesdict[tp] + type_op = CffiOp(OP_ENUM, -1) + if self.target_is_python: + tp.check_not_partial() + for enumerator, enumvalue in zip(tp.enumerators, tp.enumvalues): + self._lsts["global"].append( + GlobalExpr(enumerator, '_cffi_const_%s' % enumerator, type_op, + check_value=enumvalue)) + # + if cname is not None and '$' not in cname and not self.target_is_python: + size = "sizeof(%s)" % cname + signed = "((%s)-1) <= 0" % cname + else: + basetp = tp.build_baseinttype(self.ffi, []) + size = self.ffi.sizeof(basetp) + signed = int(int(self.ffi.cast(basetp, -1)) < 0) + allenums = ",".join(tp.enumerators) + self._lsts["enum"].append( + EnumExpr(tp.name, type_index, size, signed, allenums)) + + def _generate_cpy_enum_ctx(self, tp, name): + self._enum_ctx(tp, tp._get_c_name()) + + # ---------- + # macros: for now only for integers + + def _generate_cpy_macro_collecttype(self, tp, name): + pass + + def _generate_cpy_macro_decl(self, tp, name): + if tp == '...': + check_value = None + else: + check_value = tp # an integer + self._generate_cpy_const(True, name, check_value=check_value) + + def _generate_cpy_macro_ctx(self, tp, name): + if tp == '...': + if self.target_is_python: + raise VerificationError( + "cannot use the syntax '...' in '#define %s ...' when " + "using the ABI mode" % (name,)) + check_value = None + else: + check_value = tp # an integer + type_op = CffiOp(OP_CONSTANT_INT, -1) + self._lsts["global"].append( + GlobalExpr(name, '_cffi_const_%s' % name, type_op, + check_value=check_value)) + + # ---------- + # global variables + + def _global_type(self, tp, global_name): + if isinstance(tp, model.ArrayType): + actual_length = tp.length + if actual_length == '...': + actual_length = '_cffi_array_len(%s)' % (global_name,) + tp_item = self._global_type(tp.item, '%s[0]' % global_name) + tp = model.ArrayType(tp_item, actual_length) + return tp + + def _generate_cpy_variable_collecttype(self, tp, name): + self._do_collect_type(self._global_type(tp, name)) + + def _generate_cpy_variable_decl(self, tp, name): + prnt = self._prnt + tp = self._global_type(tp, name) + if isinstance(tp, model.ArrayType) and tp.length is None: + tp = tp.item + ampersand = '' + else: + ampersand = '&' + # This code assumes that casts from "tp *" to "void *" is a + # no-op, i.e. a function that returns a "tp *" can be called + # as if it returned a "void *". This should be generally true + # on any modern machine. The only exception to that rule (on + # uncommon architectures, and as far as I can tell) might be + # if 'tp' were a function type, but that is not possible here. + # (If 'tp' is a function _pointer_ type, then casts from "fn_t + # **" to "void *" are again no-ops, as far as I can tell.) + decl = '*_cffi_var_%s(void)' % (name,) + prnt('static ' + tp.get_c_name(decl, quals=self._current_quals)) + prnt('{') + prnt(' return %s(%s);' % (ampersand, name)) + prnt('}') + prnt() + + def _generate_cpy_variable_ctx(self, tp, name): + tp = self._global_type(tp, name) + type_index = self._typesdict[tp] + if self.target_is_python: + op = OP_GLOBAL_VAR + else: + op = OP_GLOBAL_VAR_F + self._lsts["global"].append( + GlobalExpr(name, '_cffi_var_%s' % name, CffiOp(op, type_index))) + + # ---------- + # extern "Python" + + def _generate_cpy_extern_python_collecttype(self, tp, name): + assert isinstance(tp, model.FunctionPtrType) + self._do_collect_type(tp) + _generate_cpy_dllexport_python_collecttype = \ + _generate_cpy_extern_python_plus_c_collecttype = \ + _generate_cpy_extern_python_collecttype + + def _extern_python_decl(self, tp, name, tag_and_space): + prnt = self._prnt + if isinstance(tp.result, model.VoidType): + size_of_result = '0' + else: + context = 'result of %s' % name + size_of_result = '(int)sizeof(%s)' % ( + tp.result.get_c_name('', context),) + prnt('static struct _cffi_externpy_s _cffi_externpy__%s =' % name) + prnt(' { "%s.%s", %s, 0, 0 };' % ( + self.module_name, name, size_of_result)) + prnt() + # + arguments = [] + context = 'argument of %s' % name + for i, type in enumerate(tp.args): + arg = type.get_c_name(' a%d' % i, context) + arguments.append(arg) + # + repr_arguments = ', '.join(arguments) + repr_arguments = repr_arguments or 'void' + name_and_arguments = '%s(%s)' % (name, repr_arguments) + if tp.abi == "__stdcall": + name_and_arguments = '_cffi_stdcall ' + name_and_arguments + # + def may_need_128_bits(tp): + return (isinstance(tp, model.PrimitiveType) and + tp.name == 'long double') + # + size_of_a = max(len(tp.args)*8, 8) + if may_need_128_bits(tp.result): + size_of_a = max(size_of_a, 16) + if isinstance(tp.result, model.StructOrUnion): + size_of_a = 'sizeof(%s) > %d ? sizeof(%s) : %d' % ( + tp.result.get_c_name(''), size_of_a, + tp.result.get_c_name(''), size_of_a) + prnt('%s%s' % (tag_and_space, tp.result.get_c_name(name_and_arguments))) + prnt('{') + prnt(' char a[%s];' % size_of_a) + prnt(' char *p = a;') + for i, type in enumerate(tp.args): + arg = 'a%d' % i + if (isinstance(type, model.StructOrUnion) or + may_need_128_bits(type)): + arg = '&' + arg + type = model.PointerType(type) + prnt(' *(%s)(p + %d) = %s;' % (type.get_c_name('*'), i*8, arg)) + prnt(' _cffi_call_python(&_cffi_externpy__%s, p);' % name) + if not isinstance(tp.result, model.VoidType): + prnt(' return *(%s)p;' % (tp.result.get_c_name('*'),)) + prnt('}') + prnt() + self._num_externpy += 1 + + def _generate_cpy_extern_python_decl(self, tp, name): + self._extern_python_decl(tp, name, 'static ') + + def _generate_cpy_dllexport_python_decl(self, tp, name): + self._extern_python_decl(tp, name, 'CFFI_DLLEXPORT ') + + def _generate_cpy_extern_python_plus_c_decl(self, tp, name): + self._extern_python_decl(tp, name, '') + + def _generate_cpy_extern_python_ctx(self, tp, name): + if self.target_is_python: + raise VerificationError( + "cannot use 'extern \"Python\"' in the ABI mode") + if tp.ellipsis: + raise NotImplementedError("a vararg function is extern \"Python\"") + type_index = self._typesdict[tp] + type_op = CffiOp(OP_EXTERN_PYTHON, type_index) + self._lsts["global"].append( + GlobalExpr(name, '&_cffi_externpy__%s' % name, type_op, name)) + + _generate_cpy_dllexport_python_ctx = \ + _generate_cpy_extern_python_plus_c_ctx = \ + _generate_cpy_extern_python_ctx + + def _print_string_literal_in_array(self, s): + prnt = self._prnt + prnt('// # NB. this is not a string because of a size limit in MSVC') + if not isinstance(s, bytes): # unicode + s = s.encode('utf-8') # -> bytes + else: + s.decode('utf-8') # got bytes, check for valid utf-8 + try: + s.decode('ascii') + except UnicodeDecodeError: + s = b'# -*- encoding: utf8 -*-\n' + s + for line in s.splitlines(True): + comment = line + if type('//') is bytes: # python2 + line = map(ord, line) # make a list of integers + else: # python3 + # type(line) is bytes, which enumerates like a list of integers + comment = ascii(comment)[1:-1] + prnt(('// ' + comment).rstrip()) + printed_line = '' + for c in line: + if len(printed_line) >= 76: + prnt(printed_line) + printed_line = '' + printed_line += '%d,' % (c,) + prnt(printed_line) + + # ---------- + # emitting the opcodes for individual types + + def _emit_bytecode_VoidType(self, tp, index): + self.cffi_types[index] = CffiOp(OP_PRIMITIVE, PRIM_VOID) + + def _emit_bytecode_PrimitiveType(self, tp, index): + prim_index = PRIMITIVE_TO_INDEX[tp.name] + self.cffi_types[index] = CffiOp(OP_PRIMITIVE, prim_index) + + def _emit_bytecode_UnknownIntegerType(self, tp, index): + s = ('_cffi_prim_int(sizeof(%s), (\n' + ' ((%s)-1) | 0 /* check that %s is an integer type */\n' + ' ) <= 0)' % (tp.name, tp.name, tp.name)) + self.cffi_types[index] = CffiOp(OP_PRIMITIVE, s) + + def _emit_bytecode_UnknownFloatType(self, tp, index): + s = ('_cffi_prim_float(sizeof(%s) *\n' + ' (((%s)1) / 2) * 2 /* integer => 0, float => 1 */\n' + ' )' % (tp.name, tp.name)) + self.cffi_types[index] = CffiOp(OP_PRIMITIVE, s) + + def _emit_bytecode_RawFunctionType(self, tp, index): + self.cffi_types[index] = CffiOp(OP_FUNCTION, self._typesdict[tp.result]) + index += 1 + for tp1 in tp.args: + realindex = self._typesdict[tp1] + if index != realindex: + if isinstance(tp1, model.PrimitiveType): + self._emit_bytecode_PrimitiveType(tp1, index) + else: + self.cffi_types[index] = CffiOp(OP_NOOP, realindex) + index += 1 + flags = int(tp.ellipsis) + if tp.abi is not None: + if tp.abi == '__stdcall': + flags |= 2 + else: + raise NotImplementedError("abi=%r" % (tp.abi,)) + self.cffi_types[index] = CffiOp(OP_FUNCTION_END, flags) + + def _emit_bytecode_PointerType(self, tp, index): + self.cffi_types[index] = CffiOp(OP_POINTER, self._typesdict[tp.totype]) + + _emit_bytecode_ConstPointerType = _emit_bytecode_PointerType + _emit_bytecode_NamedPointerType = _emit_bytecode_PointerType + + def _emit_bytecode_FunctionPtrType(self, tp, index): + raw = tp.as_raw_function() + self.cffi_types[index] = CffiOp(OP_POINTER, self._typesdict[raw]) + + def _emit_bytecode_ArrayType(self, tp, index): + item_index = self._typesdict[tp.item] + if tp.length is None: + self.cffi_types[index] = CffiOp(OP_OPEN_ARRAY, item_index) + elif tp.length == '...': + raise VerificationError( + "type %s badly placed: the '...' array length can only be " + "used on global arrays or on fields of structures" % ( + str(tp).replace('/*...*/', '...'),)) + else: + assert self.cffi_types[index + 1] == 'LEN' + self.cffi_types[index] = CffiOp(OP_ARRAY, item_index) + self.cffi_types[index + 1] = CffiOp(None, str(tp.length)) + + def _emit_bytecode_StructType(self, tp, index): + struct_index = self._struct_unions[tp] + self.cffi_types[index] = CffiOp(OP_STRUCT_UNION, struct_index) + _emit_bytecode_UnionType = _emit_bytecode_StructType + + def _emit_bytecode_EnumType(self, tp, index): + enum_index = self._enums[tp] + self.cffi_types[index] = CffiOp(OP_ENUM, enum_index) + + +if sys.version_info >= (3,): + NativeIO = io.StringIO +else: + class NativeIO(io.BytesIO): + def write(self, s): + if isinstance(s, unicode): + s = s.encode('ascii') + super(NativeIO, self).write(s) + +def _make_c_or_py_source(ffi, module_name, preamble, target_file, verbose): + if verbose: + print("generating %s" % (target_file,)) + recompiler = Recompiler(ffi, module_name, + target_is_python=(preamble is None)) + recompiler.collect_type_table() + recompiler.collect_step_tables() + f = NativeIO() + recompiler.write_source_to_f(f, preamble) + output = f.getvalue() + try: + with open(target_file, 'r') as f1: + if f1.read(len(output) + 1) != output: + raise IOError + if verbose: + print("(already up-to-date)") + return False # already up-to-date + except IOError: + tmp_file = '%s.~%d' % (target_file, os.getpid()) + with open(tmp_file, 'w') as f1: + f1.write(output) + try: + os.rename(tmp_file, target_file) + except OSError: + os.unlink(target_file) + os.rename(tmp_file, target_file) + return True + +def make_c_source(ffi, module_name, preamble, target_c_file, verbose=False): + assert preamble is not None + return _make_c_or_py_source(ffi, module_name, preamble, target_c_file, + verbose) + +def make_py_source(ffi, module_name, target_py_file, verbose=False): + return _make_c_or_py_source(ffi, module_name, None, target_py_file, + verbose) + +def _modname_to_file(outputdir, modname, extension): + parts = modname.split('.') + try: + os.makedirs(os.path.join(outputdir, *parts[:-1])) + except OSError: + pass + parts[-1] += extension + return os.path.join(outputdir, *parts), parts + + +# Aaargh. Distutils is not tested at all for the purpose of compiling +# DLLs that are not extension modules. Here are some hacks to work +# around that, in the _patch_for_*() functions... + +def _patch_meth(patchlist, cls, name, new_meth): + old = getattr(cls, name) + patchlist.append((cls, name, old)) + setattr(cls, name, new_meth) + return old + +def _unpatch_meths(patchlist): + for cls, name, old_meth in reversed(patchlist): + setattr(cls, name, old_meth) + +def _patch_for_embedding(patchlist): + if sys.platform == 'win32': + # we must not remove the manifest when building for embedding! + from distutils.msvc9compiler import MSVCCompiler + _patch_meth(patchlist, MSVCCompiler, '_remove_visual_c_ref', + lambda self, manifest_file: manifest_file) + + if sys.platform == 'darwin': + # we must not make a '-bundle', but a '-dynamiclib' instead + from distutils.ccompiler import CCompiler + def my_link_shared_object(self, *args, **kwds): + if '-bundle' in self.linker_so: + self.linker_so = list(self.linker_so) + i = self.linker_so.index('-bundle') + self.linker_so[i] = '-dynamiclib' + return old_link_shared_object(self, *args, **kwds) + old_link_shared_object = _patch_meth(patchlist, CCompiler, + 'link_shared_object', + my_link_shared_object) + +def _patch_for_target(patchlist, target): + from distutils.command.build_ext import build_ext + # if 'target' is different from '*', we need to patch some internal + # method to just return this 'target' value, instead of having it + # built from module_name + if target.endswith('.*'): + target = target[:-2] + if sys.platform == 'win32': + target += '.dll' + elif sys.platform == 'darwin': + target += '.dylib' + else: + target += '.so' + _patch_meth(patchlist, build_ext, 'get_ext_filename', + lambda self, ext_name: target) + + +def recompile(ffi, module_name, preamble, tmpdir='.', call_c_compiler=True, + c_file=None, source_extension='.c', extradir=None, + compiler_verbose=1, target=None, debug=None, **kwds): + if not isinstance(module_name, str): + module_name = module_name.encode('ascii') + if ffi._windows_unicode: + ffi._apply_windows_unicode(kwds) + if preamble is not None: + embedding = (ffi._embedding is not None) + if embedding: + ffi._apply_embedding_fix(kwds) + if c_file is None: + c_file, parts = _modname_to_file(tmpdir, module_name, + source_extension) + if extradir: + parts = [extradir] + parts + ext_c_file = os.path.join(*parts) + else: + ext_c_file = c_file + # + if target is None: + if embedding: + target = '%s.*' % module_name + else: + target = '*' + # + ext = ffiplatform.get_extension(ext_c_file, module_name, **kwds) + updated = make_c_source(ffi, module_name, preamble, c_file, + verbose=compiler_verbose) + if call_c_compiler: + patchlist = [] + cwd = os.getcwd() + try: + if embedding: + _patch_for_embedding(patchlist) + if target != '*': + _patch_for_target(patchlist, target) + if compiler_verbose: + if tmpdir == '.': + msg = 'the current directory is' + else: + msg = 'setting the current directory to' + print('%s %r' % (msg, os.path.abspath(tmpdir))) + os.chdir(tmpdir) + outputfilename = ffiplatform.compile('.', ext, + compiler_verbose, debug) + finally: + os.chdir(cwd) + _unpatch_meths(patchlist) + return outputfilename + else: + return ext, updated + else: + if c_file is None: + c_file, _ = _modname_to_file(tmpdir, module_name, '.py') + updated = make_py_source(ffi, module_name, c_file, + verbose=compiler_verbose) + if call_c_compiler: + return c_file + else: + return None, updated + diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/setuptools_ext.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/setuptools_ext.py new file mode 100644 index 0000000..8fe3614 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/setuptools_ext.py @@ -0,0 +1,219 @@ +import os +import sys + +try: + basestring +except NameError: + # Python 3.x + basestring = str + +def error(msg): + from distutils.errors import DistutilsSetupError + raise DistutilsSetupError(msg) + + +def execfile(filename, glob): + # We use execfile() (here rewritten for Python 3) instead of + # __import__() to load the build script. The problem with + # a normal import is that in some packages, the intermediate + # __init__.py files may already try to import the file that + # we are generating. + with open(filename) as f: + src = f.read() + src += '\n' # Python 2.6 compatibility + code = compile(src, filename, 'exec') + exec(code, glob, glob) + + +def add_cffi_module(dist, mod_spec): + from cffi.api import FFI + + if not isinstance(mod_spec, basestring): + error("argument to 'cffi_modules=...' must be a str or a list of str," + " not %r" % (type(mod_spec).__name__,)) + mod_spec = str(mod_spec) + try: + build_file_name, ffi_var_name = mod_spec.split(':') + except ValueError: + error("%r must be of the form 'path/build.py:ffi_variable'" % + (mod_spec,)) + if not os.path.exists(build_file_name): + ext = '' + rewritten = build_file_name.replace('.', '/') + '.py' + if os.path.exists(rewritten): + ext = ' (rewrite cffi_modules to [%r])' % ( + rewritten + ':' + ffi_var_name,) + error("%r does not name an existing file%s" % (build_file_name, ext)) + + mod_vars = {'__name__': '__cffi__', '__file__': build_file_name} + execfile(build_file_name, mod_vars) + + try: + ffi = mod_vars[ffi_var_name] + except KeyError: + error("%r: object %r not found in module" % (mod_spec, + ffi_var_name)) + if not isinstance(ffi, FFI): + ffi = ffi() # maybe it's a function instead of directly an ffi + if not isinstance(ffi, FFI): + error("%r is not an FFI instance (got %r)" % (mod_spec, + type(ffi).__name__)) + if not hasattr(ffi, '_assigned_source'): + error("%r: the set_source() method was not called" % (mod_spec,)) + module_name, source, source_extension, kwds = ffi._assigned_source + if ffi._windows_unicode: + kwds = kwds.copy() + ffi._apply_windows_unicode(kwds) + + if source is None: + _add_py_module(dist, ffi, module_name) + else: + _add_c_module(dist, ffi, module_name, source, source_extension, kwds) + +def _set_py_limited_api(Extension, kwds): + """ + Add py_limited_api to kwds if setuptools >= 26 is in use. + Do not alter the setting if it already exists. + Setuptools takes care of ignoring the flag on Python 2 and PyPy. + + CPython itself should ignore the flag in a debugging version + (by not listing .abi3.so in the extensions it supports), but + it doesn't so far, creating troubles. That's why we check + for "not hasattr(sys, 'gettotalrefcount')" (the 2.7 compatible equivalent + of 'd' not in sys.abiflags). (http://bugs.python.org/issue28401) + + On Windows, with CPython <= 3.4, it's better not to use py_limited_api + because virtualenv *still* doesn't copy PYTHON3.DLL on these versions. + Recently (2020) we started shipping only >= 3.5 wheels, though. So + we'll give it another try and set py_limited_api on Windows >= 3.5. + """ + from cffi import recompiler + + if ('py_limited_api' not in kwds and not hasattr(sys, 'gettotalrefcount') + and recompiler.USE_LIMITED_API): + import setuptools + try: + setuptools_major_version = int(setuptools.__version__.partition('.')[0]) + if setuptools_major_version >= 26: + kwds['py_limited_api'] = True + except ValueError: # certain development versions of setuptools + # If we don't know the version number of setuptools, we + # try to set 'py_limited_api' anyway. At worst, we get a + # warning. + kwds['py_limited_api'] = True + return kwds + +def _add_c_module(dist, ffi, module_name, source, source_extension, kwds): + from distutils.core import Extension + # We are a setuptools extension. Need this build_ext for py_limited_api. + from setuptools.command.build_ext import build_ext + from distutils.dir_util import mkpath + from distutils import log + from cffi import recompiler + + allsources = ['$PLACEHOLDER'] + allsources.extend(kwds.pop('sources', [])) + kwds = _set_py_limited_api(Extension, kwds) + ext = Extension(name=module_name, sources=allsources, **kwds) + + def make_mod(tmpdir, pre_run=None): + c_file = os.path.join(tmpdir, module_name + source_extension) + log.info("generating cffi module %r" % c_file) + mkpath(tmpdir) + # a setuptools-only, API-only hook: called with the "ext" and "ffi" + # arguments just before we turn the ffi into C code. To use it, + # subclass the 'distutils.command.build_ext.build_ext' class and + # add a method 'def pre_run(self, ext, ffi)'. + if pre_run is not None: + pre_run(ext, ffi) + updated = recompiler.make_c_source(ffi, module_name, source, c_file) + if not updated: + log.info("already up-to-date") + return c_file + + if dist.ext_modules is None: + dist.ext_modules = [] + dist.ext_modules.append(ext) + + base_class = dist.cmdclass.get('build_ext', build_ext) + class build_ext_make_mod(base_class): + def run(self): + if ext.sources[0] == '$PLACEHOLDER': + pre_run = getattr(self, 'pre_run', None) + ext.sources[0] = make_mod(self.build_temp, pre_run) + base_class.run(self) + dist.cmdclass['build_ext'] = build_ext_make_mod + # NB. multiple runs here will create multiple 'build_ext_make_mod' + # classes. Even in this case the 'build_ext' command should be + # run once; but just in case, the logic above does nothing if + # called again. + + +def _add_py_module(dist, ffi, module_name): + from distutils.dir_util import mkpath + from setuptools.command.build_py import build_py + from setuptools.command.build_ext import build_ext + from distutils import log + from cffi import recompiler + + def generate_mod(py_file): + log.info("generating cffi module %r" % py_file) + mkpath(os.path.dirname(py_file)) + updated = recompiler.make_py_source(ffi, module_name, py_file) + if not updated: + log.info("already up-to-date") + + base_class = dist.cmdclass.get('build_py', build_py) + class build_py_make_mod(base_class): + def run(self): + base_class.run(self) + module_path = module_name.split('.') + module_path[-1] += '.py' + generate_mod(os.path.join(self.build_lib, *module_path)) + def get_source_files(self): + # This is called from 'setup.py sdist' only. Exclude + # the generate .py module in this case. + saved_py_modules = self.py_modules + try: + if saved_py_modules: + self.py_modules = [m for m in saved_py_modules + if m != module_name] + return base_class.get_source_files(self) + finally: + self.py_modules = saved_py_modules + dist.cmdclass['build_py'] = build_py_make_mod + + # distutils and setuptools have no notion I could find of a + # generated python module. If we don't add module_name to + # dist.py_modules, then things mostly work but there are some + # combination of options (--root and --record) that will miss + # the module. So we add it here, which gives a few apparently + # harmless warnings about not finding the file outside the + # build directory. + # Then we need to hack more in get_source_files(); see above. + if dist.py_modules is None: + dist.py_modules = [] + dist.py_modules.append(module_name) + + # the following is only for "build_ext -i" + base_class_2 = dist.cmdclass.get('build_ext', build_ext) + class build_ext_make_mod(base_class_2): + def run(self): + base_class_2.run(self) + if self.inplace: + # from get_ext_fullpath() in distutils/command/build_ext.py + module_path = module_name.split('.') + package = '.'.join(module_path[:-1]) + build_py = self.get_finalized_command('build_py') + package_dir = build_py.get_package_dir(package) + file_name = module_path[-1] + '.py' + generate_mod(os.path.join(package_dir, file_name)) + dist.cmdclass['build_ext'] = build_ext_make_mod + +def cffi_modules(dist, attr, value): + assert attr == 'cffi_modules' + if isinstance(value, basestring): + value = [value] + + for cffi_module in value: + add_cffi_module(dist, cffi_module) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/vengine_cpy.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/vengine_cpy.py new file mode 100644 index 0000000..6de0df0 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/vengine_cpy.py @@ -0,0 +1,1076 @@ +# +# DEPRECATED: implementation for ffi.verify() +# +import sys, imp +from . import model +from .error import VerificationError + + +class VCPythonEngine(object): + _class_key = 'x' + _gen_python_module = True + + def __init__(self, verifier): + self.verifier = verifier + self.ffi = verifier.ffi + self._struct_pending_verification = {} + self._types_of_builtin_functions = {} + + def patch_extension_kwds(self, kwds): + pass + + def find_module(self, module_name, path, so_suffixes): + try: + f, filename, descr = imp.find_module(module_name, path) + except ImportError: + return None + if f is not None: + f.close() + # Note that after a setuptools installation, there are both .py + # and .so files with the same basename. The code here relies on + # imp.find_module() locating the .so in priority. + if descr[0] not in so_suffixes: + return None + return filename + + def collect_types(self): + self._typesdict = {} + self._generate("collecttype") + + def _prnt(self, what=''): + self._f.write(what + '\n') + + def _gettypenum(self, type): + # a KeyError here is a bug. please report it! :-) + return self._typesdict[type] + + def _do_collect_type(self, tp): + if ((not isinstance(tp, model.PrimitiveType) + or tp.name == 'long double') + and tp not in self._typesdict): + num = len(self._typesdict) + self._typesdict[tp] = num + + def write_source_to_f(self): + self.collect_types() + # + # The new module will have a _cffi_setup() function that receives + # objects from the ffi world, and that calls some setup code in + # the module. This setup code is split in several independent + # functions, e.g. one per constant. The functions are "chained" + # by ending in a tail call to each other. + # + # This is further split in two chained lists, depending on if we + # can do it at import-time or if we must wait for _cffi_setup() to + # provide us with the objects. This is needed because we + # need the values of the enum constants in order to build the + # that we may have to pass to _cffi_setup(). + # + # The following two 'chained_list_constants' items contains + # the head of these two chained lists, as a string that gives the + # call to do, if any. + self._chained_list_constants = ['((void)lib,0)', '((void)lib,0)'] + # + prnt = self._prnt + # first paste some standard set of lines that are mostly '#define' + prnt(cffimod_header) + prnt() + # then paste the C source given by the user, verbatim. + prnt(self.verifier.preamble) + prnt() + # + # call generate_cpy_xxx_decl(), for every xxx found from + # ffi._parser._declarations. This generates all the functions. + self._generate("decl") + # + # implement the function _cffi_setup_custom() as calling the + # head of the chained list. + self._generate_setup_custom() + prnt() + # + # produce the method table, including the entries for the + # generated Python->C function wrappers, which are done + # by generate_cpy_function_method(). + prnt('static PyMethodDef _cffi_methods[] = {') + self._generate("method") + prnt(' {"_cffi_setup", _cffi_setup, METH_VARARGS, NULL},') + prnt(' {NULL, NULL, 0, NULL} /* Sentinel */') + prnt('};') + prnt() + # + # standard init. + modname = self.verifier.get_module_name() + constants = self._chained_list_constants[False] + prnt('#if PY_MAJOR_VERSION >= 3') + prnt() + prnt('static struct PyModuleDef _cffi_module_def = {') + prnt(' PyModuleDef_HEAD_INIT,') + prnt(' "%s",' % modname) + prnt(' NULL,') + prnt(' -1,') + prnt(' _cffi_methods,') + prnt(' NULL, NULL, NULL, NULL') + prnt('};') + prnt() + prnt('PyMODINIT_FUNC') + prnt('PyInit_%s(void)' % modname) + prnt('{') + prnt(' PyObject *lib;') + prnt(' lib = PyModule_Create(&_cffi_module_def);') + prnt(' if (lib == NULL)') + prnt(' return NULL;') + prnt(' if (%s < 0 || _cffi_init() < 0) {' % (constants,)) + prnt(' Py_DECREF(lib);') + prnt(' return NULL;') + prnt(' }') + prnt(' return lib;') + prnt('}') + prnt() + prnt('#else') + prnt() + prnt('PyMODINIT_FUNC') + prnt('init%s(void)' % modname) + prnt('{') + prnt(' PyObject *lib;') + prnt(' lib = Py_InitModule("%s", _cffi_methods);' % modname) + prnt(' if (lib == NULL)') + prnt(' return;') + prnt(' if (%s < 0 || _cffi_init() < 0)' % (constants,)) + prnt(' return;') + prnt(' return;') + prnt('}') + prnt() + prnt('#endif') + + def load_library(self, flags=None): + # XXX review all usages of 'self' here! + # import it as a new extension module + imp.acquire_lock() + try: + if hasattr(sys, "getdlopenflags"): + previous_flags = sys.getdlopenflags() + try: + if hasattr(sys, "setdlopenflags") and flags is not None: + sys.setdlopenflags(flags) + module = imp.load_dynamic(self.verifier.get_module_name(), + self.verifier.modulefilename) + except ImportError as e: + error = "importing %r: %s" % (self.verifier.modulefilename, e) + raise VerificationError(error) + finally: + if hasattr(sys, "setdlopenflags"): + sys.setdlopenflags(previous_flags) + finally: + imp.release_lock() + # + # call loading_cpy_struct() to get the struct layout inferred by + # the C compiler + self._load(module, 'loading') + # + # the C code will need the objects. Collect them in + # order in a list. + revmapping = dict([(value, key) + for (key, value) in self._typesdict.items()]) + lst = [revmapping[i] for i in range(len(revmapping))] + lst = list(map(self.ffi._get_cached_btype, lst)) + # + # build the FFILibrary class and instance and call _cffi_setup(). + # this will set up some fields like '_cffi_types', and only then + # it will invoke the chained list of functions that will really + # build (notably) the constant objects, as if they are + # pointers, and store them as attributes on the 'library' object. + class FFILibrary(object): + _cffi_python_module = module + _cffi_ffi = self.ffi + _cffi_dir = [] + def __dir__(self): + return FFILibrary._cffi_dir + list(self.__dict__) + library = FFILibrary() + if module._cffi_setup(lst, VerificationError, library): + import warnings + warnings.warn("reimporting %r might overwrite older definitions" + % (self.verifier.get_module_name())) + # + # finally, call the loaded_cpy_xxx() functions. This will perform + # the final adjustments, like copying the Python->C wrapper + # functions from the module to the 'library' object, and setting + # up the FFILibrary class with properties for the global C variables. + self._load(module, 'loaded', library=library) + module._cffi_original_ffi = self.ffi + module._cffi_types_of_builtin_funcs = self._types_of_builtin_functions + return library + + def _get_declarations(self): + lst = [(key, tp) for (key, (tp, qual)) in + self.ffi._parser._declarations.items()] + lst.sort() + return lst + + def _generate(self, step_name): + for name, tp in self._get_declarations(): + kind, realname = name.split(' ', 1) + try: + method = getattr(self, '_generate_cpy_%s_%s' % (kind, + step_name)) + except AttributeError: + raise VerificationError( + "not implemented in verify(): %r" % name) + try: + method(tp, realname) + except Exception as e: + model.attach_exception_info(e, name) + raise + + def _load(self, module, step_name, **kwds): + for name, tp in self._get_declarations(): + kind, realname = name.split(' ', 1) + method = getattr(self, '_%s_cpy_%s' % (step_name, kind)) + try: + method(tp, realname, module, **kwds) + except Exception as e: + model.attach_exception_info(e, name) + raise + + def _generate_nothing(self, tp, name): + pass + + def _loaded_noop(self, tp, name, module, **kwds): + pass + + # ---------- + + def _convert_funcarg_to_c(self, tp, fromvar, tovar, errcode): + extraarg = '' + if isinstance(tp, model.PrimitiveType): + if tp.is_integer_type() and tp.name != '_Bool': + converter = '_cffi_to_c_int' + extraarg = ', %s' % tp.name + else: + converter = '(%s)_cffi_to_c_%s' % (tp.get_c_name(''), + tp.name.replace(' ', '_')) + errvalue = '-1' + # + elif isinstance(tp, model.PointerType): + self._convert_funcarg_to_c_ptr_or_array(tp, fromvar, + tovar, errcode) + return + # + elif isinstance(tp, (model.StructOrUnion, model.EnumType)): + # a struct (not a struct pointer) as a function argument + self._prnt(' if (_cffi_to_c((char *)&%s, _cffi_type(%d), %s) < 0)' + % (tovar, self._gettypenum(tp), fromvar)) + self._prnt(' %s;' % errcode) + return + # + elif isinstance(tp, model.FunctionPtrType): + converter = '(%s)_cffi_to_c_pointer' % tp.get_c_name('') + extraarg = ', _cffi_type(%d)' % self._gettypenum(tp) + errvalue = 'NULL' + # + else: + raise NotImplementedError(tp) + # + self._prnt(' %s = %s(%s%s);' % (tovar, converter, fromvar, extraarg)) + self._prnt(' if (%s == (%s)%s && PyErr_Occurred())' % ( + tovar, tp.get_c_name(''), errvalue)) + self._prnt(' %s;' % errcode) + + def _extra_local_variables(self, tp, localvars, freelines): + if isinstance(tp, model.PointerType): + localvars.add('Py_ssize_t datasize') + localvars.add('struct _cffi_freeme_s *large_args_free = NULL') + freelines.add('if (large_args_free != NULL)' + ' _cffi_free_array_arguments(large_args_free);') + + def _convert_funcarg_to_c_ptr_or_array(self, tp, fromvar, tovar, errcode): + self._prnt(' datasize = _cffi_prepare_pointer_call_argument(') + self._prnt(' _cffi_type(%d), %s, (char **)&%s);' % ( + self._gettypenum(tp), fromvar, tovar)) + self._prnt(' if (datasize != 0) {') + self._prnt(' %s = ((size_t)datasize) <= 640 ? ' + 'alloca((size_t)datasize) : NULL;' % (tovar,)) + self._prnt(' if (_cffi_convert_array_argument(_cffi_type(%d), %s, ' + '(char **)&%s,' % (self._gettypenum(tp), fromvar, tovar)) + self._prnt(' datasize, &large_args_free) < 0)') + self._prnt(' %s;' % errcode) + self._prnt(' }') + + def _convert_expr_from_c(self, tp, var, context): + if isinstance(tp, model.PrimitiveType): + if tp.is_integer_type() and tp.name != '_Bool': + return '_cffi_from_c_int(%s, %s)' % (var, tp.name) + elif tp.name != 'long double': + return '_cffi_from_c_%s(%s)' % (tp.name.replace(' ', '_'), var) + else: + return '_cffi_from_c_deref((char *)&%s, _cffi_type(%d))' % ( + var, self._gettypenum(tp)) + elif isinstance(tp, (model.PointerType, model.FunctionPtrType)): + return '_cffi_from_c_pointer((char *)%s, _cffi_type(%d))' % ( + var, self._gettypenum(tp)) + elif isinstance(tp, model.ArrayType): + return '_cffi_from_c_pointer((char *)%s, _cffi_type(%d))' % ( + var, self._gettypenum(model.PointerType(tp.item))) + elif isinstance(tp, model.StructOrUnion): + if tp.fldnames is None: + raise TypeError("'%s' is used as %s, but is opaque" % ( + tp._get_c_name(), context)) + return '_cffi_from_c_struct((char *)&%s, _cffi_type(%d))' % ( + var, self._gettypenum(tp)) + elif isinstance(tp, model.EnumType): + return '_cffi_from_c_deref((char *)&%s, _cffi_type(%d))' % ( + var, self._gettypenum(tp)) + else: + raise NotImplementedError(tp) + + # ---------- + # typedefs: generates no code so far + + _generate_cpy_typedef_collecttype = _generate_nothing + _generate_cpy_typedef_decl = _generate_nothing + _generate_cpy_typedef_method = _generate_nothing + _loading_cpy_typedef = _loaded_noop + _loaded_cpy_typedef = _loaded_noop + + # ---------- + # function declarations + + def _generate_cpy_function_collecttype(self, tp, name): + assert isinstance(tp, model.FunctionPtrType) + if tp.ellipsis: + self._do_collect_type(tp) + else: + # don't call _do_collect_type(tp) in this common case, + # otherwise test_autofilled_struct_as_argument fails + for type in tp.args: + self._do_collect_type(type) + self._do_collect_type(tp.result) + + def _generate_cpy_function_decl(self, tp, name): + assert isinstance(tp, model.FunctionPtrType) + if tp.ellipsis: + # cannot support vararg functions better than this: check for its + # exact type (including the fixed arguments), and build it as a + # constant function pointer (no CPython wrapper) + self._generate_cpy_const(False, name, tp) + return + prnt = self._prnt + numargs = len(tp.args) + if numargs == 0: + argname = 'noarg' + elif numargs == 1: + argname = 'arg0' + else: + argname = 'args' + prnt('static PyObject *') + prnt('_cffi_f_%s(PyObject *self, PyObject *%s)' % (name, argname)) + prnt('{') + # + context = 'argument of %s' % name + for i, type in enumerate(tp.args): + prnt(' %s;' % type.get_c_name(' x%d' % i, context)) + # + localvars = set() + freelines = set() + for type in tp.args: + self._extra_local_variables(type, localvars, freelines) + for decl in sorted(localvars): + prnt(' %s;' % (decl,)) + # + if not isinstance(tp.result, model.VoidType): + result_code = 'result = ' + context = 'result of %s' % name + prnt(' %s;' % tp.result.get_c_name(' result', context)) + prnt(' PyObject *pyresult;') + else: + result_code = '' + # + if len(tp.args) > 1: + rng = range(len(tp.args)) + for i in rng: + prnt(' PyObject *arg%d;' % i) + prnt() + prnt(' if (!PyArg_ParseTuple(args, "%s:%s", %s))' % ( + 'O' * numargs, name, ', '.join(['&arg%d' % i for i in rng]))) + prnt(' return NULL;') + prnt() + # + for i, type in enumerate(tp.args): + self._convert_funcarg_to_c(type, 'arg%d' % i, 'x%d' % i, + 'return NULL') + prnt() + # + prnt(' Py_BEGIN_ALLOW_THREADS') + prnt(' _cffi_restore_errno();') + prnt(' { %s%s(%s); }' % ( + result_code, name, + ', '.join(['x%d' % i for i in range(len(tp.args))]))) + prnt(' _cffi_save_errno();') + prnt(' Py_END_ALLOW_THREADS') + prnt() + # + prnt(' (void)self; /* unused */') + if numargs == 0: + prnt(' (void)noarg; /* unused */') + if result_code: + prnt(' pyresult = %s;' % + self._convert_expr_from_c(tp.result, 'result', 'result type')) + for freeline in freelines: + prnt(' ' + freeline) + prnt(' return pyresult;') + else: + for freeline in freelines: + prnt(' ' + freeline) + prnt(' Py_INCREF(Py_None);') + prnt(' return Py_None;') + prnt('}') + prnt() + + def _generate_cpy_function_method(self, tp, name): + if tp.ellipsis: + return + numargs = len(tp.args) + if numargs == 0: + meth = 'METH_NOARGS' + elif numargs == 1: + meth = 'METH_O' + else: + meth = 'METH_VARARGS' + self._prnt(' {"%s", _cffi_f_%s, %s, NULL},' % (name, name, meth)) + + _loading_cpy_function = _loaded_noop + + def _loaded_cpy_function(self, tp, name, module, library): + if tp.ellipsis: + return + func = getattr(module, name) + setattr(library, name, func) + self._types_of_builtin_functions[func] = tp + + # ---------- + # named structs + + _generate_cpy_struct_collecttype = _generate_nothing + def _generate_cpy_struct_decl(self, tp, name): + assert name == tp.name + self._generate_struct_or_union_decl(tp, 'struct', name) + def _generate_cpy_struct_method(self, tp, name): + self._generate_struct_or_union_method(tp, 'struct', name) + def _loading_cpy_struct(self, tp, name, module): + self._loading_struct_or_union(tp, 'struct', name, module) + def _loaded_cpy_struct(self, tp, name, module, **kwds): + self._loaded_struct_or_union(tp) + + _generate_cpy_union_collecttype = _generate_nothing + def _generate_cpy_union_decl(self, tp, name): + assert name == tp.name + self._generate_struct_or_union_decl(tp, 'union', name) + def _generate_cpy_union_method(self, tp, name): + self._generate_struct_or_union_method(tp, 'union', name) + def _loading_cpy_union(self, tp, name, module): + self._loading_struct_or_union(tp, 'union', name, module) + def _loaded_cpy_union(self, tp, name, module, **kwds): + self._loaded_struct_or_union(tp) + + def _generate_struct_or_union_decl(self, tp, prefix, name): + if tp.fldnames is None: + return # nothing to do with opaque structs + checkfuncname = '_cffi_check_%s_%s' % (prefix, name) + layoutfuncname = '_cffi_layout_%s_%s' % (prefix, name) + cname = ('%s %s' % (prefix, name)).strip() + # + prnt = self._prnt + prnt('static void %s(%s *p)' % (checkfuncname, cname)) + prnt('{') + prnt(' /* only to generate compile-time warnings or errors */') + prnt(' (void)p;') + for fname, ftype, fbitsize, fqual in tp.enumfields(): + if (isinstance(ftype, model.PrimitiveType) + and ftype.is_integer_type()) or fbitsize >= 0: + # accept all integers, but complain on float or double + prnt(' (void)((p->%s) << 1);' % fname) + else: + # only accept exactly the type declared. + try: + prnt(' { %s = &p->%s; (void)tmp; }' % ( + ftype.get_c_name('*tmp', 'field %r'%fname, quals=fqual), + fname)) + except VerificationError as e: + prnt(' /* %s */' % str(e)) # cannot verify it, ignore + prnt('}') + prnt('static PyObject *') + prnt('%s(PyObject *self, PyObject *noarg)' % (layoutfuncname,)) + prnt('{') + prnt(' struct _cffi_aligncheck { char x; %s y; };' % cname) + prnt(' static Py_ssize_t nums[] = {') + prnt(' sizeof(%s),' % cname) + prnt(' offsetof(struct _cffi_aligncheck, y),') + for fname, ftype, fbitsize, fqual in tp.enumfields(): + if fbitsize >= 0: + continue # xxx ignore fbitsize for now + prnt(' offsetof(%s, %s),' % (cname, fname)) + if isinstance(ftype, model.ArrayType) and ftype.length is None: + prnt(' 0, /* %s */' % ftype._get_c_name()) + else: + prnt(' sizeof(((%s *)0)->%s),' % (cname, fname)) + prnt(' -1') + prnt(' };') + prnt(' (void)self; /* unused */') + prnt(' (void)noarg; /* unused */') + prnt(' return _cffi_get_struct_layout(nums);') + prnt(' /* the next line is not executed, but compiled */') + prnt(' %s(0);' % (checkfuncname,)) + prnt('}') + prnt() + + def _generate_struct_or_union_method(self, tp, prefix, name): + if tp.fldnames is None: + return # nothing to do with opaque structs + layoutfuncname = '_cffi_layout_%s_%s' % (prefix, name) + self._prnt(' {"%s", %s, METH_NOARGS, NULL},' % (layoutfuncname, + layoutfuncname)) + + def _loading_struct_or_union(self, tp, prefix, name, module): + if tp.fldnames is None: + return # nothing to do with opaque structs + layoutfuncname = '_cffi_layout_%s_%s' % (prefix, name) + # + function = getattr(module, layoutfuncname) + layout = function() + if isinstance(tp, model.StructOrUnion) and tp.partial: + # use the function()'s sizes and offsets to guide the + # layout of the struct + totalsize = layout[0] + totalalignment = layout[1] + fieldofs = layout[2::2] + fieldsize = layout[3::2] + tp.force_flatten() + assert len(fieldofs) == len(fieldsize) == len(tp.fldnames) + tp.fixedlayout = fieldofs, fieldsize, totalsize, totalalignment + else: + cname = ('%s %s' % (prefix, name)).strip() + self._struct_pending_verification[tp] = layout, cname + + def _loaded_struct_or_union(self, tp): + if tp.fldnames is None: + return # nothing to do with opaque structs + self.ffi._get_cached_btype(tp) # force 'fixedlayout' to be considered + + if tp in self._struct_pending_verification: + # check that the layout sizes and offsets match the real ones + def check(realvalue, expectedvalue, msg): + if realvalue != expectedvalue: + raise VerificationError( + "%s (we have %d, but C compiler says %d)" + % (msg, expectedvalue, realvalue)) + ffi = self.ffi + BStruct = ffi._get_cached_btype(tp) + layout, cname = self._struct_pending_verification.pop(tp) + check(layout[0], ffi.sizeof(BStruct), "wrong total size") + check(layout[1], ffi.alignof(BStruct), "wrong total alignment") + i = 2 + for fname, ftype, fbitsize, fqual in tp.enumfields(): + if fbitsize >= 0: + continue # xxx ignore fbitsize for now + check(layout[i], ffi.offsetof(BStruct, fname), + "wrong offset for field %r" % (fname,)) + if layout[i+1] != 0: + BField = ffi._get_cached_btype(ftype) + check(layout[i+1], ffi.sizeof(BField), + "wrong size for field %r" % (fname,)) + i += 2 + assert i == len(layout) + + # ---------- + # 'anonymous' declarations. These are produced for anonymous structs + # or unions; the 'name' is obtained by a typedef. + + _generate_cpy_anonymous_collecttype = _generate_nothing + + def _generate_cpy_anonymous_decl(self, tp, name): + if isinstance(tp, model.EnumType): + self._generate_cpy_enum_decl(tp, name, '') + else: + self._generate_struct_or_union_decl(tp, '', name) + + def _generate_cpy_anonymous_method(self, tp, name): + if not isinstance(tp, model.EnumType): + self._generate_struct_or_union_method(tp, '', name) + + def _loading_cpy_anonymous(self, tp, name, module): + if isinstance(tp, model.EnumType): + self._loading_cpy_enum(tp, name, module) + else: + self._loading_struct_or_union(tp, '', name, module) + + def _loaded_cpy_anonymous(self, tp, name, module, **kwds): + if isinstance(tp, model.EnumType): + self._loaded_cpy_enum(tp, name, module, **kwds) + else: + self._loaded_struct_or_union(tp) + + # ---------- + # constants, likely declared with '#define' + + def _generate_cpy_const(self, is_int, name, tp=None, category='const', + vartp=None, delayed=True, size_too=False, + check_value=None): + prnt = self._prnt + funcname = '_cffi_%s_%s' % (category, name) + prnt('static int %s(PyObject *lib)' % funcname) + prnt('{') + prnt(' PyObject *o;') + prnt(' int res;') + if not is_int: + prnt(' %s;' % (vartp or tp).get_c_name(' i', name)) + else: + assert category == 'const' + # + if check_value is not None: + self._check_int_constant_value(name, check_value) + # + if not is_int: + if category == 'var': + realexpr = '&' + name + else: + realexpr = name + prnt(' i = (%s);' % (realexpr,)) + prnt(' o = %s;' % (self._convert_expr_from_c(tp, 'i', + 'variable type'),)) + assert delayed + else: + prnt(' o = _cffi_from_c_int_const(%s);' % name) + prnt(' if (o == NULL)') + prnt(' return -1;') + if size_too: + prnt(' {') + prnt(' PyObject *o1 = o;') + prnt(' o = Py_BuildValue("On", o1, (Py_ssize_t)sizeof(%s));' + % (name,)) + prnt(' Py_DECREF(o1);') + prnt(' if (o == NULL)') + prnt(' return -1;') + prnt(' }') + prnt(' res = PyObject_SetAttrString(lib, "%s", o);' % name) + prnt(' Py_DECREF(o);') + prnt(' if (res < 0)') + prnt(' return -1;') + prnt(' return %s;' % self._chained_list_constants[delayed]) + self._chained_list_constants[delayed] = funcname + '(lib)' + prnt('}') + prnt() + + def _generate_cpy_constant_collecttype(self, tp, name): + is_int = isinstance(tp, model.PrimitiveType) and tp.is_integer_type() + if not is_int: + self._do_collect_type(tp) + + def _generate_cpy_constant_decl(self, tp, name): + is_int = isinstance(tp, model.PrimitiveType) and tp.is_integer_type() + self._generate_cpy_const(is_int, name, tp) + + _generate_cpy_constant_method = _generate_nothing + _loading_cpy_constant = _loaded_noop + _loaded_cpy_constant = _loaded_noop + + # ---------- + # enums + + def _check_int_constant_value(self, name, value, err_prefix=''): + prnt = self._prnt + if value <= 0: + prnt(' if ((%s) > 0 || (long)(%s) != %dL) {' % ( + name, name, value)) + else: + prnt(' if ((%s) <= 0 || (unsigned long)(%s) != %dUL) {' % ( + name, name, value)) + prnt(' char buf[64];') + prnt(' if ((%s) <= 0)' % name) + prnt(' snprintf(buf, 63, "%%ld", (long)(%s));' % name) + prnt(' else') + prnt(' snprintf(buf, 63, "%%lu", (unsigned long)(%s));' % + name) + prnt(' PyErr_Format(_cffi_VerificationError,') + prnt(' "%s%s has the real value %s, not %s",') + prnt(' "%s", "%s", buf, "%d");' % ( + err_prefix, name, value)) + prnt(' return -1;') + prnt(' }') + + def _enum_funcname(self, prefix, name): + # "$enum_$1" => "___D_enum____D_1" + name = name.replace('$', '___D_') + return '_cffi_e_%s_%s' % (prefix, name) + + def _generate_cpy_enum_decl(self, tp, name, prefix='enum'): + if tp.partial: + for enumerator in tp.enumerators: + self._generate_cpy_const(True, enumerator, delayed=False) + return + # + funcname = self._enum_funcname(prefix, name) + prnt = self._prnt + prnt('static int %s(PyObject *lib)' % funcname) + prnt('{') + for enumerator, enumvalue in zip(tp.enumerators, tp.enumvalues): + self._check_int_constant_value(enumerator, enumvalue, + "enum %s: " % name) + prnt(' return %s;' % self._chained_list_constants[True]) + self._chained_list_constants[True] = funcname + '(lib)' + prnt('}') + prnt() + + _generate_cpy_enum_collecttype = _generate_nothing + _generate_cpy_enum_method = _generate_nothing + + def _loading_cpy_enum(self, tp, name, module): + if tp.partial: + enumvalues = [getattr(module, enumerator) + for enumerator in tp.enumerators] + tp.enumvalues = tuple(enumvalues) + tp.partial_resolved = True + + def _loaded_cpy_enum(self, tp, name, module, library): + for enumerator, enumvalue in zip(tp.enumerators, tp.enumvalues): + setattr(library, enumerator, enumvalue) + + # ---------- + # macros: for now only for integers + + def _generate_cpy_macro_decl(self, tp, name): + if tp == '...': + check_value = None + else: + check_value = tp # an integer + self._generate_cpy_const(True, name, check_value=check_value) + + _generate_cpy_macro_collecttype = _generate_nothing + _generate_cpy_macro_method = _generate_nothing + _loading_cpy_macro = _loaded_noop + _loaded_cpy_macro = _loaded_noop + + # ---------- + # global variables + + def _generate_cpy_variable_collecttype(self, tp, name): + if isinstance(tp, model.ArrayType): + tp_ptr = model.PointerType(tp.item) + else: + tp_ptr = model.PointerType(tp) + self._do_collect_type(tp_ptr) + + def _generate_cpy_variable_decl(self, tp, name): + if isinstance(tp, model.ArrayType): + tp_ptr = model.PointerType(tp.item) + self._generate_cpy_const(False, name, tp, vartp=tp_ptr, + size_too = tp.length_is_unknown()) + else: + tp_ptr = model.PointerType(tp) + self._generate_cpy_const(False, name, tp_ptr, category='var') + + _generate_cpy_variable_method = _generate_nothing + _loading_cpy_variable = _loaded_noop + + def _loaded_cpy_variable(self, tp, name, module, library): + value = getattr(library, name) + if isinstance(tp, model.ArrayType): # int a[5] is "constant" in the + # sense that "a=..." is forbidden + if tp.length_is_unknown(): + assert isinstance(value, tuple) + (value, size) = value + BItemType = self.ffi._get_cached_btype(tp.item) + length, rest = divmod(size, self.ffi.sizeof(BItemType)) + if rest != 0: + raise VerificationError( + "bad size: %r does not seem to be an array of %s" % + (name, tp.item)) + tp = tp.resolve_length(length) + # 'value' is a which we have to replace with + # a if the N is actually known + if tp.length is not None: + BArray = self.ffi._get_cached_btype(tp) + value = self.ffi.cast(BArray, value) + setattr(library, name, value) + return + # remove ptr= from the library instance, and replace + # it by a property on the class, which reads/writes into ptr[0]. + ptr = value + delattr(library, name) + def getter(library): + return ptr[0] + def setter(library, value): + ptr[0] = value + setattr(type(library), name, property(getter, setter)) + type(library)._cffi_dir.append(name) + + # ---------- + + def _generate_setup_custom(self): + prnt = self._prnt + prnt('static int _cffi_setup_custom(PyObject *lib)') + prnt('{') + prnt(' return %s;' % self._chained_list_constants[True]) + prnt('}') + +cffimod_header = r''' +#include +#include + +/* this block of #ifs should be kept exactly identical between + c/_cffi_backend.c, cffi/vengine_cpy.py, cffi/vengine_gen.py + and cffi/_cffi_include.h */ +#if defined(_MSC_VER) +# include /* for alloca() */ +# if _MSC_VER < 1600 /* MSVC < 2010 */ + typedef __int8 int8_t; + typedef __int16 int16_t; + typedef __int32 int32_t; + typedef __int64 int64_t; + typedef unsigned __int8 uint8_t; + typedef unsigned __int16 uint16_t; + typedef unsigned __int32 uint32_t; + typedef unsigned __int64 uint64_t; + typedef __int8 int_least8_t; + typedef __int16 int_least16_t; + typedef __int32 int_least32_t; + typedef __int64 int_least64_t; + typedef unsigned __int8 uint_least8_t; + typedef unsigned __int16 uint_least16_t; + typedef unsigned __int32 uint_least32_t; + typedef unsigned __int64 uint_least64_t; + typedef __int8 int_fast8_t; + typedef __int16 int_fast16_t; + typedef __int32 int_fast32_t; + typedef __int64 int_fast64_t; + typedef unsigned __int8 uint_fast8_t; + typedef unsigned __int16 uint_fast16_t; + typedef unsigned __int32 uint_fast32_t; + typedef unsigned __int64 uint_fast64_t; + typedef __int64 intmax_t; + typedef unsigned __int64 uintmax_t; +# else +# include +# endif +# if _MSC_VER < 1800 /* MSVC < 2013 */ +# ifndef __cplusplus + typedef unsigned char _Bool; +# endif +# endif +#else +# include +# if (defined (__SVR4) && defined (__sun)) || defined(_AIX) || defined(__hpux) +# include +# endif +#endif + +#if PY_MAJOR_VERSION < 3 +# undef PyCapsule_CheckExact +# undef PyCapsule_GetPointer +# define PyCapsule_CheckExact(capsule) (PyCObject_Check(capsule)) +# define PyCapsule_GetPointer(capsule, name) \ + (PyCObject_AsVoidPtr(capsule)) +#endif + +#if PY_MAJOR_VERSION >= 3 +# define PyInt_FromLong PyLong_FromLong +#endif + +#define _cffi_from_c_double PyFloat_FromDouble +#define _cffi_from_c_float PyFloat_FromDouble +#define _cffi_from_c_long PyInt_FromLong +#define _cffi_from_c_ulong PyLong_FromUnsignedLong +#define _cffi_from_c_longlong PyLong_FromLongLong +#define _cffi_from_c_ulonglong PyLong_FromUnsignedLongLong +#define _cffi_from_c__Bool PyBool_FromLong + +#define _cffi_to_c_double PyFloat_AsDouble +#define _cffi_to_c_float PyFloat_AsDouble + +#define _cffi_from_c_int_const(x) \ + (((x) > 0) ? \ + ((unsigned long long)(x) <= (unsigned long long)LONG_MAX) ? \ + PyInt_FromLong((long)(x)) : \ + PyLong_FromUnsignedLongLong((unsigned long long)(x)) : \ + ((long long)(x) >= (long long)LONG_MIN) ? \ + PyInt_FromLong((long)(x)) : \ + PyLong_FromLongLong((long long)(x))) + +#define _cffi_from_c_int(x, type) \ + (((type)-1) > 0 ? /* unsigned */ \ + (sizeof(type) < sizeof(long) ? \ + PyInt_FromLong((long)x) : \ + sizeof(type) == sizeof(long) ? \ + PyLong_FromUnsignedLong((unsigned long)x) : \ + PyLong_FromUnsignedLongLong((unsigned long long)x)) : \ + (sizeof(type) <= sizeof(long) ? \ + PyInt_FromLong((long)x) : \ + PyLong_FromLongLong((long long)x))) + +#define _cffi_to_c_int(o, type) \ + ((type)( \ + sizeof(type) == 1 ? (((type)-1) > 0 ? (type)_cffi_to_c_u8(o) \ + : (type)_cffi_to_c_i8(o)) : \ + sizeof(type) == 2 ? (((type)-1) > 0 ? (type)_cffi_to_c_u16(o) \ + : (type)_cffi_to_c_i16(o)) : \ + sizeof(type) == 4 ? (((type)-1) > 0 ? (type)_cffi_to_c_u32(o) \ + : (type)_cffi_to_c_i32(o)) : \ + sizeof(type) == 8 ? (((type)-1) > 0 ? (type)_cffi_to_c_u64(o) \ + : (type)_cffi_to_c_i64(o)) : \ + (Py_FatalError("unsupported size for type " #type), (type)0))) + +#define _cffi_to_c_i8 \ + ((int(*)(PyObject *))_cffi_exports[1]) +#define _cffi_to_c_u8 \ + ((int(*)(PyObject *))_cffi_exports[2]) +#define _cffi_to_c_i16 \ + ((int(*)(PyObject *))_cffi_exports[3]) +#define _cffi_to_c_u16 \ + ((int(*)(PyObject *))_cffi_exports[4]) +#define _cffi_to_c_i32 \ + ((int(*)(PyObject *))_cffi_exports[5]) +#define _cffi_to_c_u32 \ + ((unsigned int(*)(PyObject *))_cffi_exports[6]) +#define _cffi_to_c_i64 \ + ((long long(*)(PyObject *))_cffi_exports[7]) +#define _cffi_to_c_u64 \ + ((unsigned long long(*)(PyObject *))_cffi_exports[8]) +#define _cffi_to_c_char \ + ((int(*)(PyObject *))_cffi_exports[9]) +#define _cffi_from_c_pointer \ + ((PyObject *(*)(char *, CTypeDescrObject *))_cffi_exports[10]) +#define _cffi_to_c_pointer \ + ((char *(*)(PyObject *, CTypeDescrObject *))_cffi_exports[11]) +#define _cffi_get_struct_layout \ + ((PyObject *(*)(Py_ssize_t[]))_cffi_exports[12]) +#define _cffi_restore_errno \ + ((void(*)(void))_cffi_exports[13]) +#define _cffi_save_errno \ + ((void(*)(void))_cffi_exports[14]) +#define _cffi_from_c_char \ + ((PyObject *(*)(char))_cffi_exports[15]) +#define _cffi_from_c_deref \ + ((PyObject *(*)(char *, CTypeDescrObject *))_cffi_exports[16]) +#define _cffi_to_c \ + ((int(*)(char *, CTypeDescrObject *, PyObject *))_cffi_exports[17]) +#define _cffi_from_c_struct \ + ((PyObject *(*)(char *, CTypeDescrObject *))_cffi_exports[18]) +#define _cffi_to_c_wchar_t \ + ((wchar_t(*)(PyObject *))_cffi_exports[19]) +#define _cffi_from_c_wchar_t \ + ((PyObject *(*)(wchar_t))_cffi_exports[20]) +#define _cffi_to_c_long_double \ + ((long double(*)(PyObject *))_cffi_exports[21]) +#define _cffi_to_c__Bool \ + ((_Bool(*)(PyObject *))_cffi_exports[22]) +#define _cffi_prepare_pointer_call_argument \ + ((Py_ssize_t(*)(CTypeDescrObject *, PyObject *, char **))_cffi_exports[23]) +#define _cffi_convert_array_from_object \ + ((int(*)(char *, CTypeDescrObject *, PyObject *))_cffi_exports[24]) +#define _CFFI_NUM_EXPORTS 25 + +typedef struct _ctypedescr CTypeDescrObject; + +static void *_cffi_exports[_CFFI_NUM_EXPORTS]; +static PyObject *_cffi_types, *_cffi_VerificationError; + +static int _cffi_setup_custom(PyObject *lib); /* forward */ + +static PyObject *_cffi_setup(PyObject *self, PyObject *args) +{ + PyObject *library; + int was_alive = (_cffi_types != NULL); + (void)self; /* unused */ + if (!PyArg_ParseTuple(args, "OOO", &_cffi_types, &_cffi_VerificationError, + &library)) + return NULL; + Py_INCREF(_cffi_types); + Py_INCREF(_cffi_VerificationError); + if (_cffi_setup_custom(library) < 0) + return NULL; + return PyBool_FromLong(was_alive); +} + +union _cffi_union_alignment_u { + unsigned char m_char; + unsigned short m_short; + unsigned int m_int; + unsigned long m_long; + unsigned long long m_longlong; + float m_float; + double m_double; + long double m_longdouble; +}; + +struct _cffi_freeme_s { + struct _cffi_freeme_s *next; + union _cffi_union_alignment_u alignment; +}; + +#ifdef __GNUC__ + __attribute__((unused)) +#endif +static int _cffi_convert_array_argument(CTypeDescrObject *ctptr, PyObject *arg, + char **output_data, Py_ssize_t datasize, + struct _cffi_freeme_s **freeme) +{ + char *p; + if (datasize < 0) + return -1; + + p = *output_data; + if (p == NULL) { + struct _cffi_freeme_s *fp = (struct _cffi_freeme_s *)PyObject_Malloc( + offsetof(struct _cffi_freeme_s, alignment) + (size_t)datasize); + if (fp == NULL) + return -1; + fp->next = *freeme; + *freeme = fp; + p = *output_data = (char *)&fp->alignment; + } + memset((void *)p, 0, (size_t)datasize); + return _cffi_convert_array_from_object(p, ctptr, arg); +} + +#ifdef __GNUC__ + __attribute__((unused)) +#endif +static void _cffi_free_array_arguments(struct _cffi_freeme_s *freeme) +{ + do { + void *p = (void *)freeme; + freeme = freeme->next; + PyObject_Free(p); + } while (freeme != NULL); +} + +static int _cffi_init(void) +{ + PyObject *module, *c_api_object = NULL; + + module = PyImport_ImportModule("_cffi_backend"); + if (module == NULL) + goto failure; + + c_api_object = PyObject_GetAttrString(module, "_C_API"); + if (c_api_object == NULL) + goto failure; + if (!PyCapsule_CheckExact(c_api_object)) { + PyErr_SetNone(PyExc_ImportError); + goto failure; + } + memcpy(_cffi_exports, PyCapsule_GetPointer(c_api_object, "cffi"), + _CFFI_NUM_EXPORTS * sizeof(void *)); + + Py_DECREF(module); + Py_DECREF(c_api_object); + return 0; + + failure: + Py_XDECREF(module); + Py_XDECREF(c_api_object); + return -1; +} + +#define _cffi_type(num) ((CTypeDescrObject *)PyList_GET_ITEM(_cffi_types, num)) + +/**********/ +''' diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/vengine_gen.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/vengine_gen.py new file mode 100644 index 0000000..2642152 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/vengine_gen.py @@ -0,0 +1,675 @@ +# +# DEPRECATED: implementation for ffi.verify() +# +import sys, os +import types + +from . import model +from .error import VerificationError + + +class VGenericEngine(object): + _class_key = 'g' + _gen_python_module = False + + def __init__(self, verifier): + self.verifier = verifier + self.ffi = verifier.ffi + self.export_symbols = [] + self._struct_pending_verification = {} + + def patch_extension_kwds(self, kwds): + # add 'export_symbols' to the dictionary. Note that we add the + # list before filling it. When we fill it, it will thus also show + # up in kwds['export_symbols']. + kwds.setdefault('export_symbols', self.export_symbols) + + def find_module(self, module_name, path, so_suffixes): + for so_suffix in so_suffixes: + basename = module_name + so_suffix + if path is None: + path = sys.path + for dirname in path: + filename = os.path.join(dirname, basename) + if os.path.isfile(filename): + return filename + + def collect_types(self): + pass # not needed in the generic engine + + def _prnt(self, what=''): + self._f.write(what + '\n') + + def write_source_to_f(self): + prnt = self._prnt + # first paste some standard set of lines that are mostly '#include' + prnt(cffimod_header) + # then paste the C source given by the user, verbatim. + prnt(self.verifier.preamble) + # + # call generate_gen_xxx_decl(), for every xxx found from + # ffi._parser._declarations. This generates all the functions. + self._generate('decl') + # + # on Windows, distutils insists on putting init_cffi_xyz in + # 'export_symbols', so instead of fighting it, just give up and + # give it one + if sys.platform == 'win32': + if sys.version_info >= (3,): + prefix = 'PyInit_' + else: + prefix = 'init' + modname = self.verifier.get_module_name() + prnt("void %s%s(void) { }\n" % (prefix, modname)) + + def load_library(self, flags=0): + # import it with the CFFI backend + backend = self.ffi._backend + # needs to make a path that contains '/', on Posix + filename = os.path.join(os.curdir, self.verifier.modulefilename) + module = backend.load_library(filename, flags) + # + # call loading_gen_struct() to get the struct layout inferred by + # the C compiler + self._load(module, 'loading') + + # build the FFILibrary class and instance, this is a module subclass + # because modules are expected to have usually-constant-attributes and + # in PyPy this means the JIT is able to treat attributes as constant, + # which we want. + class FFILibrary(types.ModuleType): + _cffi_generic_module = module + _cffi_ffi = self.ffi + _cffi_dir = [] + def __dir__(self): + return FFILibrary._cffi_dir + library = FFILibrary("") + # + # finally, call the loaded_gen_xxx() functions. This will set + # up the 'library' object. + self._load(module, 'loaded', library=library) + return library + + def _get_declarations(self): + lst = [(key, tp) for (key, (tp, qual)) in + self.ffi._parser._declarations.items()] + lst.sort() + return lst + + def _generate(self, step_name): + for name, tp in self._get_declarations(): + kind, realname = name.split(' ', 1) + try: + method = getattr(self, '_generate_gen_%s_%s' % (kind, + step_name)) + except AttributeError: + raise VerificationError( + "not implemented in verify(): %r" % name) + try: + method(tp, realname) + except Exception as e: + model.attach_exception_info(e, name) + raise + + def _load(self, module, step_name, **kwds): + for name, tp in self._get_declarations(): + kind, realname = name.split(' ', 1) + method = getattr(self, '_%s_gen_%s' % (step_name, kind)) + try: + method(tp, realname, module, **kwds) + except Exception as e: + model.attach_exception_info(e, name) + raise + + def _generate_nothing(self, tp, name): + pass + + def _loaded_noop(self, tp, name, module, **kwds): + pass + + # ---------- + # typedefs: generates no code so far + + _generate_gen_typedef_decl = _generate_nothing + _loading_gen_typedef = _loaded_noop + _loaded_gen_typedef = _loaded_noop + + # ---------- + # function declarations + + def _generate_gen_function_decl(self, tp, name): + assert isinstance(tp, model.FunctionPtrType) + if tp.ellipsis: + # cannot support vararg functions better than this: check for its + # exact type (including the fixed arguments), and build it as a + # constant function pointer (no _cffi_f_%s wrapper) + self._generate_gen_const(False, name, tp) + return + prnt = self._prnt + numargs = len(tp.args) + argnames = [] + for i, type in enumerate(tp.args): + indirection = '' + if isinstance(type, model.StructOrUnion): + indirection = '*' + argnames.append('%sx%d' % (indirection, i)) + context = 'argument of %s' % name + arglist = [type.get_c_name(' %s' % arg, context) + for type, arg in zip(tp.args, argnames)] + tpresult = tp.result + if isinstance(tpresult, model.StructOrUnion): + arglist.insert(0, tpresult.get_c_name(' *r', context)) + tpresult = model.void_type + arglist = ', '.join(arglist) or 'void' + wrappername = '_cffi_f_%s' % name + self.export_symbols.append(wrappername) + if tp.abi: + abi = tp.abi + ' ' + else: + abi = '' + funcdecl = ' %s%s(%s)' % (abi, wrappername, arglist) + context = 'result of %s' % name + prnt(tpresult.get_c_name(funcdecl, context)) + prnt('{') + # + if isinstance(tp.result, model.StructOrUnion): + result_code = '*r = ' + elif not isinstance(tp.result, model.VoidType): + result_code = 'return ' + else: + result_code = '' + prnt(' %s%s(%s);' % (result_code, name, ', '.join(argnames))) + prnt('}') + prnt() + + _loading_gen_function = _loaded_noop + + def _loaded_gen_function(self, tp, name, module, library): + assert isinstance(tp, model.FunctionPtrType) + if tp.ellipsis: + newfunction = self._load_constant(False, tp, name, module) + else: + indirections = [] + base_tp = tp + if (any(isinstance(typ, model.StructOrUnion) for typ in tp.args) + or isinstance(tp.result, model.StructOrUnion)): + indirect_args = [] + for i, typ in enumerate(tp.args): + if isinstance(typ, model.StructOrUnion): + typ = model.PointerType(typ) + indirections.append((i, typ)) + indirect_args.append(typ) + indirect_result = tp.result + if isinstance(indirect_result, model.StructOrUnion): + if indirect_result.fldtypes is None: + raise TypeError("'%s' is used as result type, " + "but is opaque" % ( + indirect_result._get_c_name(),)) + indirect_result = model.PointerType(indirect_result) + indirect_args.insert(0, indirect_result) + indirections.insert(0, ("result", indirect_result)) + indirect_result = model.void_type + tp = model.FunctionPtrType(tuple(indirect_args), + indirect_result, tp.ellipsis) + BFunc = self.ffi._get_cached_btype(tp) + wrappername = '_cffi_f_%s' % name + newfunction = module.load_function(BFunc, wrappername) + for i, typ in indirections: + newfunction = self._make_struct_wrapper(newfunction, i, typ, + base_tp) + setattr(library, name, newfunction) + type(library)._cffi_dir.append(name) + + def _make_struct_wrapper(self, oldfunc, i, tp, base_tp): + backend = self.ffi._backend + BType = self.ffi._get_cached_btype(tp) + if i == "result": + ffi = self.ffi + def newfunc(*args): + res = ffi.new(BType) + oldfunc(res, *args) + return res[0] + else: + def newfunc(*args): + args = args[:i] + (backend.newp(BType, args[i]),) + args[i+1:] + return oldfunc(*args) + newfunc._cffi_base_type = base_tp + return newfunc + + # ---------- + # named structs + + def _generate_gen_struct_decl(self, tp, name): + assert name == tp.name + self._generate_struct_or_union_decl(tp, 'struct', name) + + def _loading_gen_struct(self, tp, name, module): + self._loading_struct_or_union(tp, 'struct', name, module) + + def _loaded_gen_struct(self, tp, name, module, **kwds): + self._loaded_struct_or_union(tp) + + def _generate_gen_union_decl(self, tp, name): + assert name == tp.name + self._generate_struct_or_union_decl(tp, 'union', name) + + def _loading_gen_union(self, tp, name, module): + self._loading_struct_or_union(tp, 'union', name, module) + + def _loaded_gen_union(self, tp, name, module, **kwds): + self._loaded_struct_or_union(tp) + + def _generate_struct_or_union_decl(self, tp, prefix, name): + if tp.fldnames is None: + return # nothing to do with opaque structs + checkfuncname = '_cffi_check_%s_%s' % (prefix, name) + layoutfuncname = '_cffi_layout_%s_%s' % (prefix, name) + cname = ('%s %s' % (prefix, name)).strip() + # + prnt = self._prnt + prnt('static void %s(%s *p)' % (checkfuncname, cname)) + prnt('{') + prnt(' /* only to generate compile-time warnings or errors */') + prnt(' (void)p;') + for fname, ftype, fbitsize, fqual in tp.enumfields(): + if (isinstance(ftype, model.PrimitiveType) + and ftype.is_integer_type()) or fbitsize >= 0: + # accept all integers, but complain on float or double + prnt(' (void)((p->%s) << 1);' % fname) + else: + # only accept exactly the type declared. + try: + prnt(' { %s = &p->%s; (void)tmp; }' % ( + ftype.get_c_name('*tmp', 'field %r'%fname, quals=fqual), + fname)) + except VerificationError as e: + prnt(' /* %s */' % str(e)) # cannot verify it, ignore + prnt('}') + self.export_symbols.append(layoutfuncname) + prnt('intptr_t %s(intptr_t i)' % (layoutfuncname,)) + prnt('{') + prnt(' struct _cffi_aligncheck { char x; %s y; };' % cname) + prnt(' static intptr_t nums[] = {') + prnt(' sizeof(%s),' % cname) + prnt(' offsetof(struct _cffi_aligncheck, y),') + for fname, ftype, fbitsize, fqual in tp.enumfields(): + if fbitsize >= 0: + continue # xxx ignore fbitsize for now + prnt(' offsetof(%s, %s),' % (cname, fname)) + if isinstance(ftype, model.ArrayType) and ftype.length is None: + prnt(' 0, /* %s */' % ftype._get_c_name()) + else: + prnt(' sizeof(((%s *)0)->%s),' % (cname, fname)) + prnt(' -1') + prnt(' };') + prnt(' return nums[i];') + prnt(' /* the next line is not executed, but compiled */') + prnt(' %s(0);' % (checkfuncname,)) + prnt('}') + prnt() + + def _loading_struct_or_union(self, tp, prefix, name, module): + if tp.fldnames is None: + return # nothing to do with opaque structs + layoutfuncname = '_cffi_layout_%s_%s' % (prefix, name) + # + BFunc = self.ffi._typeof_locked("intptr_t(*)(intptr_t)")[0] + function = module.load_function(BFunc, layoutfuncname) + layout = [] + num = 0 + while True: + x = function(num) + if x < 0: break + layout.append(x) + num += 1 + if isinstance(tp, model.StructOrUnion) and tp.partial: + # use the function()'s sizes and offsets to guide the + # layout of the struct + totalsize = layout[0] + totalalignment = layout[1] + fieldofs = layout[2::2] + fieldsize = layout[3::2] + tp.force_flatten() + assert len(fieldofs) == len(fieldsize) == len(tp.fldnames) + tp.fixedlayout = fieldofs, fieldsize, totalsize, totalalignment + else: + cname = ('%s %s' % (prefix, name)).strip() + self._struct_pending_verification[tp] = layout, cname + + def _loaded_struct_or_union(self, tp): + if tp.fldnames is None: + return # nothing to do with opaque structs + self.ffi._get_cached_btype(tp) # force 'fixedlayout' to be considered + + if tp in self._struct_pending_verification: + # check that the layout sizes and offsets match the real ones + def check(realvalue, expectedvalue, msg): + if realvalue != expectedvalue: + raise VerificationError( + "%s (we have %d, but C compiler says %d)" + % (msg, expectedvalue, realvalue)) + ffi = self.ffi + BStruct = ffi._get_cached_btype(tp) + layout, cname = self._struct_pending_verification.pop(tp) + check(layout[0], ffi.sizeof(BStruct), "wrong total size") + check(layout[1], ffi.alignof(BStruct), "wrong total alignment") + i = 2 + for fname, ftype, fbitsize, fqual in tp.enumfields(): + if fbitsize >= 0: + continue # xxx ignore fbitsize for now + check(layout[i], ffi.offsetof(BStruct, fname), + "wrong offset for field %r" % (fname,)) + if layout[i+1] != 0: + BField = ffi._get_cached_btype(ftype) + check(layout[i+1], ffi.sizeof(BField), + "wrong size for field %r" % (fname,)) + i += 2 + assert i == len(layout) + + # ---------- + # 'anonymous' declarations. These are produced for anonymous structs + # or unions; the 'name' is obtained by a typedef. + + def _generate_gen_anonymous_decl(self, tp, name): + if isinstance(tp, model.EnumType): + self._generate_gen_enum_decl(tp, name, '') + else: + self._generate_struct_or_union_decl(tp, '', name) + + def _loading_gen_anonymous(self, tp, name, module): + if isinstance(tp, model.EnumType): + self._loading_gen_enum(tp, name, module, '') + else: + self._loading_struct_or_union(tp, '', name, module) + + def _loaded_gen_anonymous(self, tp, name, module, **kwds): + if isinstance(tp, model.EnumType): + self._loaded_gen_enum(tp, name, module, **kwds) + else: + self._loaded_struct_or_union(tp) + + # ---------- + # constants, likely declared with '#define' + + def _generate_gen_const(self, is_int, name, tp=None, category='const', + check_value=None): + prnt = self._prnt + funcname = '_cffi_%s_%s' % (category, name) + self.export_symbols.append(funcname) + if check_value is not None: + assert is_int + assert category == 'const' + prnt('int %s(char *out_error)' % funcname) + prnt('{') + self._check_int_constant_value(name, check_value) + prnt(' return 0;') + prnt('}') + elif is_int: + assert category == 'const' + prnt('int %s(long long *out_value)' % funcname) + prnt('{') + prnt(' *out_value = (long long)(%s);' % (name,)) + prnt(' return (%s) <= 0;' % (name,)) + prnt('}') + else: + assert tp is not None + assert check_value is None + if category == 'var': + ampersand = '&' + else: + ampersand = '' + extra = '' + if category == 'const' and isinstance(tp, model.StructOrUnion): + extra = 'const *' + ampersand = '&' + prnt(tp.get_c_name(' %s%s(void)' % (extra, funcname), name)) + prnt('{') + prnt(' return (%s%s);' % (ampersand, name)) + prnt('}') + prnt() + + def _generate_gen_constant_decl(self, tp, name): + is_int = isinstance(tp, model.PrimitiveType) and tp.is_integer_type() + self._generate_gen_const(is_int, name, tp) + + _loading_gen_constant = _loaded_noop + + def _load_constant(self, is_int, tp, name, module, check_value=None): + funcname = '_cffi_const_%s' % name + if check_value is not None: + assert is_int + self._load_known_int_constant(module, funcname) + value = check_value + elif is_int: + BType = self.ffi._typeof_locked("long long*")[0] + BFunc = self.ffi._typeof_locked("int(*)(long long*)")[0] + function = module.load_function(BFunc, funcname) + p = self.ffi.new(BType) + negative = function(p) + value = int(p[0]) + if value < 0 and not negative: + BLongLong = self.ffi._typeof_locked("long long")[0] + value += (1 << (8*self.ffi.sizeof(BLongLong))) + else: + assert check_value is None + fntypeextra = '(*)(void)' + if isinstance(tp, model.StructOrUnion): + fntypeextra = '*' + fntypeextra + BFunc = self.ffi._typeof_locked(tp.get_c_name(fntypeextra, name))[0] + function = module.load_function(BFunc, funcname) + value = function() + if isinstance(tp, model.StructOrUnion): + value = value[0] + return value + + def _loaded_gen_constant(self, tp, name, module, library): + is_int = isinstance(tp, model.PrimitiveType) and tp.is_integer_type() + value = self._load_constant(is_int, tp, name, module) + setattr(library, name, value) + type(library)._cffi_dir.append(name) + + # ---------- + # enums + + def _check_int_constant_value(self, name, value): + prnt = self._prnt + if value <= 0: + prnt(' if ((%s) > 0 || (long)(%s) != %dL) {' % ( + name, name, value)) + else: + prnt(' if ((%s) <= 0 || (unsigned long)(%s) != %dUL) {' % ( + name, name, value)) + prnt(' char buf[64];') + prnt(' if ((%s) <= 0)' % name) + prnt(' sprintf(buf, "%%ld", (long)(%s));' % name) + prnt(' else') + prnt(' sprintf(buf, "%%lu", (unsigned long)(%s));' % + name) + prnt(' sprintf(out_error, "%s has the real value %s, not %s",') + prnt(' "%s", buf, "%d");' % (name[:100], value)) + prnt(' return -1;') + prnt(' }') + + def _load_known_int_constant(self, module, funcname): + BType = self.ffi._typeof_locked("char[]")[0] + BFunc = self.ffi._typeof_locked("int(*)(char*)")[0] + function = module.load_function(BFunc, funcname) + p = self.ffi.new(BType, 256) + if function(p) < 0: + error = self.ffi.string(p) + if sys.version_info >= (3,): + error = str(error, 'utf-8') + raise VerificationError(error) + + def _enum_funcname(self, prefix, name): + # "$enum_$1" => "___D_enum____D_1" + name = name.replace('$', '___D_') + return '_cffi_e_%s_%s' % (prefix, name) + + def _generate_gen_enum_decl(self, tp, name, prefix='enum'): + if tp.partial: + for enumerator in tp.enumerators: + self._generate_gen_const(True, enumerator) + return + # + funcname = self._enum_funcname(prefix, name) + self.export_symbols.append(funcname) + prnt = self._prnt + prnt('int %s(char *out_error)' % funcname) + prnt('{') + for enumerator, enumvalue in zip(tp.enumerators, tp.enumvalues): + self._check_int_constant_value(enumerator, enumvalue) + prnt(' return 0;') + prnt('}') + prnt() + + def _loading_gen_enum(self, tp, name, module, prefix='enum'): + if tp.partial: + enumvalues = [self._load_constant(True, tp, enumerator, module) + for enumerator in tp.enumerators] + tp.enumvalues = tuple(enumvalues) + tp.partial_resolved = True + else: + funcname = self._enum_funcname(prefix, name) + self._load_known_int_constant(module, funcname) + + def _loaded_gen_enum(self, tp, name, module, library): + for enumerator, enumvalue in zip(tp.enumerators, tp.enumvalues): + setattr(library, enumerator, enumvalue) + type(library)._cffi_dir.append(enumerator) + + # ---------- + # macros: for now only for integers + + def _generate_gen_macro_decl(self, tp, name): + if tp == '...': + check_value = None + else: + check_value = tp # an integer + self._generate_gen_const(True, name, check_value=check_value) + + _loading_gen_macro = _loaded_noop + + def _loaded_gen_macro(self, tp, name, module, library): + if tp == '...': + check_value = None + else: + check_value = tp # an integer + value = self._load_constant(True, tp, name, module, + check_value=check_value) + setattr(library, name, value) + type(library)._cffi_dir.append(name) + + # ---------- + # global variables + + def _generate_gen_variable_decl(self, tp, name): + if isinstance(tp, model.ArrayType): + if tp.length_is_unknown(): + prnt = self._prnt + funcname = '_cffi_sizeof_%s' % (name,) + self.export_symbols.append(funcname) + prnt("size_t %s(void)" % funcname) + prnt("{") + prnt(" return sizeof(%s);" % (name,)) + prnt("}") + tp_ptr = model.PointerType(tp.item) + self._generate_gen_const(False, name, tp_ptr) + else: + tp_ptr = model.PointerType(tp) + self._generate_gen_const(False, name, tp_ptr, category='var') + + _loading_gen_variable = _loaded_noop + + def _loaded_gen_variable(self, tp, name, module, library): + if isinstance(tp, model.ArrayType): # int a[5] is "constant" in the + # sense that "a=..." is forbidden + if tp.length_is_unknown(): + funcname = '_cffi_sizeof_%s' % (name,) + BFunc = self.ffi._typeof_locked('size_t(*)(void)')[0] + function = module.load_function(BFunc, funcname) + size = function() + BItemType = self.ffi._get_cached_btype(tp.item) + length, rest = divmod(size, self.ffi.sizeof(BItemType)) + if rest != 0: + raise VerificationError( + "bad size: %r does not seem to be an array of %s" % + (name, tp.item)) + tp = tp.resolve_length(length) + tp_ptr = model.PointerType(tp.item) + value = self._load_constant(False, tp_ptr, name, module) + # 'value' is a which we have to replace with + # a if the N is actually known + if tp.length is not None: + BArray = self.ffi._get_cached_btype(tp) + value = self.ffi.cast(BArray, value) + setattr(library, name, value) + type(library)._cffi_dir.append(name) + return + # remove ptr= from the library instance, and replace + # it by a property on the class, which reads/writes into ptr[0]. + funcname = '_cffi_var_%s' % name + BFunc = self.ffi._typeof_locked(tp.get_c_name('*(*)(void)', name))[0] + function = module.load_function(BFunc, funcname) + ptr = function() + def getter(library): + return ptr[0] + def setter(library, value): + ptr[0] = value + setattr(type(library), name, property(getter, setter)) + type(library)._cffi_dir.append(name) + +cffimod_header = r''' +#include +#include +#include +#include +#include /* XXX for ssize_t on some platforms */ + +/* this block of #ifs should be kept exactly identical between + c/_cffi_backend.c, cffi/vengine_cpy.py, cffi/vengine_gen.py + and cffi/_cffi_include.h */ +#if defined(_MSC_VER) +# include /* for alloca() */ +# if _MSC_VER < 1600 /* MSVC < 2010 */ + typedef __int8 int8_t; + typedef __int16 int16_t; + typedef __int32 int32_t; + typedef __int64 int64_t; + typedef unsigned __int8 uint8_t; + typedef unsigned __int16 uint16_t; + typedef unsigned __int32 uint32_t; + typedef unsigned __int64 uint64_t; + typedef __int8 int_least8_t; + typedef __int16 int_least16_t; + typedef __int32 int_least32_t; + typedef __int64 int_least64_t; + typedef unsigned __int8 uint_least8_t; + typedef unsigned __int16 uint_least16_t; + typedef unsigned __int32 uint_least32_t; + typedef unsigned __int64 uint_least64_t; + typedef __int8 int_fast8_t; + typedef __int16 int_fast16_t; + typedef __int32 int_fast32_t; + typedef __int64 int_fast64_t; + typedef unsigned __int8 uint_fast8_t; + typedef unsigned __int16 uint_fast16_t; + typedef unsigned __int32 uint_fast32_t; + typedef unsigned __int64 uint_fast64_t; + typedef __int64 intmax_t; + typedef unsigned __int64 uintmax_t; +# else +# include +# endif +# if _MSC_VER < 1800 /* MSVC < 2013 */ +# ifndef __cplusplus + typedef unsigned char _Bool; +# endif +# endif +#else +# include +# if (defined (__SVR4) && defined (__sun)) || defined(_AIX) || defined(__hpux) +# include +# endif +#endif +''' diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/verifier.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/verifier.py new file mode 100644 index 0000000..a500c78 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/cffi/verifier.py @@ -0,0 +1,307 @@ +# +# DEPRECATED: implementation for ffi.verify() +# +import sys, os, binascii, shutil, io +from . import __version_verifier_modules__ +from . import ffiplatform +from .error import VerificationError + +if sys.version_info >= (3, 3): + import importlib.machinery + def _extension_suffixes(): + return importlib.machinery.EXTENSION_SUFFIXES[:] +else: + import imp + def _extension_suffixes(): + return [suffix for suffix, _, type in imp.get_suffixes() + if type == imp.C_EXTENSION] + + +if sys.version_info >= (3,): + NativeIO = io.StringIO +else: + class NativeIO(io.BytesIO): + def write(self, s): + if isinstance(s, unicode): + s = s.encode('ascii') + super(NativeIO, self).write(s) + + +class Verifier(object): + + def __init__(self, ffi, preamble, tmpdir=None, modulename=None, + ext_package=None, tag='', force_generic_engine=False, + source_extension='.c', flags=None, relative_to=None, **kwds): + if ffi._parser._uses_new_feature: + raise VerificationError( + "feature not supported with ffi.verify(), but only " + "with ffi.set_source(): %s" % (ffi._parser._uses_new_feature,)) + self.ffi = ffi + self.preamble = preamble + if not modulename: + flattened_kwds = ffiplatform.flatten(kwds) + vengine_class = _locate_engine_class(ffi, force_generic_engine) + self._vengine = vengine_class(self) + self._vengine.patch_extension_kwds(kwds) + self.flags = flags + self.kwds = self.make_relative_to(kwds, relative_to) + # + if modulename: + if tag: + raise TypeError("can't specify both 'modulename' and 'tag'") + else: + key = '\x00'.join(['%d.%d' % sys.version_info[:2], + __version_verifier_modules__, + preamble, flattened_kwds] + + ffi._cdefsources) + if sys.version_info >= (3,): + key = key.encode('utf-8') + k1 = hex(binascii.crc32(key[0::2]) & 0xffffffff) + k1 = k1.lstrip('0x').rstrip('L') + k2 = hex(binascii.crc32(key[1::2]) & 0xffffffff) + k2 = k2.lstrip('0').rstrip('L') + modulename = '_cffi_%s_%s%s%s' % (tag, self._vengine._class_key, + k1, k2) + suffix = _get_so_suffixes()[0] + self.tmpdir = tmpdir or _caller_dir_pycache() + self.sourcefilename = os.path.join(self.tmpdir, modulename + source_extension) + self.modulefilename = os.path.join(self.tmpdir, modulename + suffix) + self.ext_package = ext_package + self._has_source = False + self._has_module = False + + def write_source(self, file=None): + """Write the C source code. It is produced in 'self.sourcefilename', + which can be tweaked beforehand.""" + with self.ffi._lock: + if self._has_source and file is None: + raise VerificationError( + "source code already written") + self._write_source(file) + + def compile_module(self): + """Write the C source code (if not done already) and compile it. + This produces a dynamic link library in 'self.modulefilename'.""" + with self.ffi._lock: + if self._has_module: + raise VerificationError("module already compiled") + if not self._has_source: + self._write_source() + self._compile_module() + + def load_library(self): + """Get a C module from this Verifier instance. + Returns an instance of a FFILibrary class that behaves like the + objects returned by ffi.dlopen(), but that delegates all + operations to the C module. If necessary, the C code is written + and compiled first. + """ + with self.ffi._lock: + if not self._has_module: + self._locate_module() + if not self._has_module: + if not self._has_source: + self._write_source() + self._compile_module() + return self._load_library() + + def get_module_name(self): + basename = os.path.basename(self.modulefilename) + # kill both the .so extension and the other .'s, as introduced + # by Python 3: 'basename.cpython-33m.so' + basename = basename.split('.', 1)[0] + # and the _d added in Python 2 debug builds --- but try to be + # conservative and not kill a legitimate _d + if basename.endswith('_d') and hasattr(sys, 'gettotalrefcount'): + basename = basename[:-2] + return basename + + def get_extension(self): + ffiplatform._hack_at_distutils() # backward compatibility hack + if not self._has_source: + with self.ffi._lock: + if not self._has_source: + self._write_source() + sourcename = ffiplatform.maybe_relative_path(self.sourcefilename) + modname = self.get_module_name() + return ffiplatform.get_extension(sourcename, modname, **self.kwds) + + def generates_python_module(self): + return self._vengine._gen_python_module + + def make_relative_to(self, kwds, relative_to): + if relative_to and os.path.dirname(relative_to): + dirname = os.path.dirname(relative_to) + kwds = kwds.copy() + for key in ffiplatform.LIST_OF_FILE_NAMES: + if key in kwds: + lst = kwds[key] + if not isinstance(lst, (list, tuple)): + raise TypeError("keyword '%s' should be a list or tuple" + % (key,)) + lst = [os.path.join(dirname, fn) for fn in lst] + kwds[key] = lst + return kwds + + # ---------- + + def _locate_module(self): + if not os.path.isfile(self.modulefilename): + if self.ext_package: + try: + pkg = __import__(self.ext_package, None, None, ['__doc__']) + except ImportError: + return # cannot import the package itself, give up + # (e.g. it might be called differently before installation) + path = pkg.__path__ + else: + path = None + filename = self._vengine.find_module(self.get_module_name(), path, + _get_so_suffixes()) + if filename is None: + return + self.modulefilename = filename + self._vengine.collect_types() + self._has_module = True + + def _write_source_to(self, file): + self._vengine._f = file + try: + self._vengine.write_source_to_f() + finally: + del self._vengine._f + + def _write_source(self, file=None): + if file is not None: + self._write_source_to(file) + else: + # Write our source file to an in memory file. + f = NativeIO() + self._write_source_to(f) + source_data = f.getvalue() + + # Determine if this matches the current file + if os.path.exists(self.sourcefilename): + with open(self.sourcefilename, "r") as fp: + needs_written = not (fp.read() == source_data) + else: + needs_written = True + + # Actually write the file out if it doesn't match + if needs_written: + _ensure_dir(self.sourcefilename) + with open(self.sourcefilename, "w") as fp: + fp.write(source_data) + + # Set this flag + self._has_source = True + + def _compile_module(self): + # compile this C source + tmpdir = os.path.dirname(self.sourcefilename) + outputfilename = ffiplatform.compile(tmpdir, self.get_extension()) + try: + same = ffiplatform.samefile(outputfilename, self.modulefilename) + except OSError: + same = False + if not same: + _ensure_dir(self.modulefilename) + shutil.move(outputfilename, self.modulefilename) + self._has_module = True + + def _load_library(self): + assert self._has_module + if self.flags is not None: + return self._vengine.load_library(self.flags) + else: + return self._vengine.load_library() + +# ____________________________________________________________ + +_FORCE_GENERIC_ENGINE = False # for tests + +def _locate_engine_class(ffi, force_generic_engine): + if _FORCE_GENERIC_ENGINE: + force_generic_engine = True + if not force_generic_engine: + if '__pypy__' in sys.builtin_module_names: + force_generic_engine = True + else: + try: + import _cffi_backend + except ImportError: + _cffi_backend = '?' + if ffi._backend is not _cffi_backend: + force_generic_engine = True + if force_generic_engine: + from . import vengine_gen + return vengine_gen.VGenericEngine + else: + from . import vengine_cpy + return vengine_cpy.VCPythonEngine + +# ____________________________________________________________ + +_TMPDIR = None + +def _caller_dir_pycache(): + if _TMPDIR: + return _TMPDIR + result = os.environ.get('CFFI_TMPDIR') + if result: + return result + filename = sys._getframe(2).f_code.co_filename + return os.path.abspath(os.path.join(os.path.dirname(filename), + '__pycache__')) + +def set_tmpdir(dirname): + """Set the temporary directory to use instead of __pycache__.""" + global _TMPDIR + _TMPDIR = dirname + +def cleanup_tmpdir(tmpdir=None, keep_so=False): + """Clean up the temporary directory by removing all files in it + called `_cffi_*.{c,so}` as well as the `build` subdirectory.""" + tmpdir = tmpdir or _caller_dir_pycache() + try: + filelist = os.listdir(tmpdir) + except OSError: + return + if keep_so: + suffix = '.c' # only remove .c files + else: + suffix = _get_so_suffixes()[0].lower() + for fn in filelist: + if fn.lower().startswith('_cffi_') and ( + fn.lower().endswith(suffix) or fn.lower().endswith('.c')): + try: + os.unlink(os.path.join(tmpdir, fn)) + except OSError: + pass + clean_dir = [os.path.join(tmpdir, 'build')] + for dir in clean_dir: + try: + for fn in os.listdir(dir): + fn = os.path.join(dir, fn) + if os.path.isdir(fn): + clean_dir.append(fn) + else: + os.unlink(fn) + except OSError: + pass + +def _get_so_suffixes(): + suffixes = _extension_suffixes() + if not suffixes: + # bah, no C_EXTENSION available. Occurs on pypy without cpyext + if sys.platform == 'win32': + suffixes = [".pyd"] + else: + suffixes = [".so"] + + return suffixes + +def _ensure_dir(filename): + dirname = os.path.dirname(filename) + if dirname and not os.path.isdir(dirname): + os.makedirs(dirname) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click-7.1.2.dist-info/INSTALLER b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click-7.1.2.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click-7.1.2.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click-7.1.2.dist-info/LICENSE.rst b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click-7.1.2.dist-info/LICENSE.rst new file mode 100644 index 0000000..d12a849 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click-7.1.2.dist-info/LICENSE.rst @@ -0,0 +1,28 @@ +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click-7.1.2.dist-info/METADATA b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click-7.1.2.dist-info/METADATA new file mode 100644 index 0000000..00d6974 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click-7.1.2.dist-info/METADATA @@ -0,0 +1,102 @@ +Metadata-Version: 2.1 +Name: click +Version: 7.1.2 +Summary: Composable command line interface toolkit +Home-page: https://palletsprojects.com/p/click/ +Maintainer: Pallets +Maintainer-email: contact@palletsprojects.com +License: BSD-3-Clause +Project-URL: Documentation, https://click.palletsprojects.com/ +Project-URL: Code, https://github.com/pallets/click +Project-URL: Issue tracker, https://github.com/pallets/click/issues +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +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 :: 3 +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.* + +\$ 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 + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + $ pip install -U click + +.. _pip: https://pip.pypa.io/en/stable/quickstart/ + + +A Simple Example +---------------- + +.. code-block:: 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() + +.. code-block:: text + + $ 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 + + +Links +----- + +- Website: https://palletsprojects.com/p/click/ +- Documentation: https://click.palletsprojects.com/ +- Releases: https://pypi.org/project/click/ +- Code: https://github.com/pallets/click +- Issue tracker: https://github.com/pallets/click/issues +- Test status: https://dev.azure.com/pallets/click/_build +- Official chat: https://discord.gg/t6rrQZH + + diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click-7.1.2.dist-info/RECORD b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click-7.1.2.dist-info/RECORD new file mode 100644 index 0000000..d56b86c --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click-7.1.2.dist-info/RECORD @@ -0,0 +1,41 @@ +click-7.1.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +click-7.1.2.dist-info/LICENSE.rst,sha256=morRBqOU6FO_4h9C9OctWSgZoigF2ZG18ydQKSkrZY0,1475 +click-7.1.2.dist-info/METADATA,sha256=LrRgakZKV7Yg3qJqX_plu2WhFW81MzP3EqQmZhHIO8M,2868 +click-7.1.2.dist-info/RECORD,, +click-7.1.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +click-7.1.2.dist-info/WHEEL,sha256=kGT74LWyRUZrL4VgLh6_g12IeVl_9u9ZVhadrgXZUEY,110 +click-7.1.2.dist-info/top_level.txt,sha256=J1ZQogalYS4pphY_lPECoNMfw0HzTSrZglC4Yfwo4xA,6 +click/__init__.py,sha256=FkyGDQ-cbiQxP_lxgUspyFYS48f2S_pTcfKPz-d_RMo,2463 +click/__pycache__/__init__.cpython-38.pyc,, +click/__pycache__/_bashcomplete.cpython-38.pyc,, +click/__pycache__/_compat.cpython-38.pyc,, +click/__pycache__/_termui_impl.cpython-38.pyc,, +click/__pycache__/_textwrap.cpython-38.pyc,, +click/__pycache__/_unicodefun.cpython-38.pyc,, +click/__pycache__/_winconsole.cpython-38.pyc,, +click/__pycache__/core.cpython-38.pyc,, +click/__pycache__/decorators.cpython-38.pyc,, +click/__pycache__/exceptions.cpython-38.pyc,, +click/__pycache__/formatting.cpython-38.pyc,, +click/__pycache__/globals.cpython-38.pyc,, +click/__pycache__/parser.cpython-38.pyc,, +click/__pycache__/termui.cpython-38.pyc,, +click/__pycache__/testing.cpython-38.pyc,, +click/__pycache__/types.cpython-38.pyc,, +click/__pycache__/utils.cpython-38.pyc,, +click/_bashcomplete.py,sha256=9J98IHQYmCAr2Jup6TDshUr5FJEen-AoQCZR0K5nKxQ,12309 +click/_compat.py,sha256=AoMaYnZ-3pwtNXuHtlb6_UXsayoG0QZiHKIRy2VFezc,24169 +click/_termui_impl.py,sha256=yNktUMAdjYOU1HMkq915jR3zgAzUNtGSQqSTSSMn3eQ,20702 +click/_textwrap.py,sha256=ajCzkzFly5tjm9foQ5N9_MOeaYJMBjAltuFa69n4iXY,1197 +click/_unicodefun.py,sha256=apLSNEBZgUsQNPMUv072zJ1swqnm0dYVT5TqcIWTt6w,4201 +click/_winconsole.py,sha256=6YDu6Rq1Wxx4w9uinBMK2LHvP83aerZM9GQurlk3QDo,10010 +click/core.py,sha256=V6DJzastGhrC6WTDwV9MSLwcJUdX2Uf1ypmgkjBdn_Y,77650 +click/decorators.py,sha256=3TvEO_BkaHl7k6Eh1G5eC7JK4LKPdpFqH9JP0QDyTlM,11215 +click/exceptions.py,sha256=3pQAyyMFzx5A3eV0Y27WtDTyGogZRbrC6_o5DjjKBbw,8118 +click/formatting.py,sha256=Wb4gqFEpWaKPgAbOvnkCl8p-bEZx5KpM5ZSByhlnJNk,9281 +click/globals.py,sha256=ht7u2kUGI08pAarB4e4yC8Lkkxy6gJfRZyzxEj8EbWQ,1501 +click/parser.py,sha256=mFK-k58JtPpqO0AC36WAr0t5UfzEw1mvgVSyn7WCe9M,15691 +click/termui.py,sha256=G7QBEKIepRIGLvNdGwBTYiEtSImRxvTO_AglVpyHH2s,23998 +click/testing.py,sha256=EUEsDUqNXFgCLhZ0ZFOROpaVDA5I_rijwnNPE6qICgA,12854 +click/types.py,sha256=wuubik4VqgqAw5dvbYFkDt-zSAx97y9TQXuXcVaRyQA,25045 +click/utils.py,sha256=4VEcJ7iEHwjnFuzEuRtkT99o5VG3zqSD7Q2CVzv13WU,15940 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click-7.1.2.dist-info/REQUESTED b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click-7.1.2.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click-7.1.2.dist-info/WHEEL b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click-7.1.2.dist-info/WHEEL new file mode 100644 index 0000000..ef99c6c --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click-7.1.2.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.34.2) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click-7.1.2.dist-info/top_level.txt b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click-7.1.2.dist-info/top_level.txt new file mode 100644 index 0000000..dca9a90 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click-7.1.2.dist-info/top_level.txt @@ -0,0 +1 @@ +click diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click/__init__.py new file mode 100644 index 0000000..2b6008f --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click/__init__.py @@ -0,0 +1,79 @@ +""" +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 .core import Argument +from .core import BaseCommand +from .core import Command +from .core import CommandCollection +from .core import Context +from .core import Group +from .core import MultiCommand +from .core import Option +from .core import Parameter +from .decorators import argument +from .decorators import command +from .decorators import confirmation_option +from .decorators import group +from .decorators import help_option +from .decorators import make_pass_decorator +from .decorators import option +from .decorators import pass_context +from .decorators import pass_obj +from .decorators import password_option +from .decorators import version_option +from .exceptions import Abort +from .exceptions import BadArgumentUsage +from .exceptions import BadOptionUsage +from .exceptions import BadParameter +from .exceptions import ClickException +from .exceptions import FileError +from .exceptions import MissingParameter +from .exceptions import NoSuchOption +from .exceptions import UsageError +from .formatting import HelpFormatter +from .formatting import wrap_text +from .globals import get_current_context +from .parser import OptionParser +from .termui import clear +from .termui import confirm +from .termui import echo_via_pager +from .termui import edit +from .termui import get_terminal_size +from .termui import getchar +from .termui import launch +from .termui import pause +from .termui import progressbar +from .termui import prompt +from .termui import secho +from .termui import style +from .termui import unstyle +from .types import BOOL +from .types import Choice +from .types import DateTime +from .types import File +from .types import FLOAT +from .types import FloatRange +from .types import INT +from .types import IntRange +from .types import ParamType +from .types import Path +from .types import STRING +from .types import Tuple +from .types import UNPROCESSED +from .types import UUID +from .utils import echo +from .utils import format_filename +from .utils import get_app_dir +from .utils import get_binary_stream +from .utils import get_os_args +from .utils import get_text_stream +from .utils import open_file + +# Controls if click should emit the warning about the use of unicode +# literals. +disable_unicode_literals_warning = False + +__version__ = "7.1.2" diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click/_bashcomplete.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click/_bashcomplete.py new file mode 100644 index 0000000..8bca244 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click/_bashcomplete.py @@ -0,0 +1,375 @@ +import copy +import os +import re + +from .core import Argument +from .core import MultiCommand +from .core import Option +from .parser import split_arg_string +from .types import Choice +from .utils import echo + +try: + from collections import abc +except ImportError: + import collections as abc + +WORDBREAK = "=" + +# Note, only BASH version 4.4 and later have the nosort option. +COMPLETION_SCRIPT_BASH = """ +%(complete_func)s() { + local IFS=$'\n' + COMPREPLY=( $( env COMP_WORDS="${COMP_WORDS[*]}" \\ + COMP_CWORD=$COMP_CWORD \\ + %(autocomplete_var)s=complete $1 ) ) + return 0 +} + +%(complete_func)setup() { + local COMPLETION_OPTIONS="" + local BASH_VERSION_ARR=(${BASH_VERSION//./ }) + # Only BASH version 4.4 and later have the nosort option. + if [ ${BASH_VERSION_ARR[0]} -gt 4 ] || ([ ${BASH_VERSION_ARR[0]} -eq 4 ] \ +&& [ ${BASH_VERSION_ARR[1]} -ge 4 ]); then + COMPLETION_OPTIONS="-o nosort" + fi + + complete $COMPLETION_OPTIONS -F %(complete_func)s %(script_names)s +} + +%(complete_func)setup +""" + +COMPLETION_SCRIPT_ZSH = """ +#compdef %(script_names)s + +%(complete_func)s() { + local -a completions + local -a completions_with_descriptions + local -a response + (( ! $+commands[%(script_names)s] )) && return 1 + + response=("${(@f)$( env COMP_WORDS=\"${words[*]}\" \\ + COMP_CWORD=$((CURRENT-1)) \\ + %(autocomplete_var)s=\"complete_zsh\" \\ + %(script_names)s )}") + + for key descr in ${(kv)response}; do + if [[ "$descr" == "_" ]]; then + completions+=("$key") + else + completions_with_descriptions+=("$key":"$descr") + 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 + compstate[insert]="automenu" +} + +compdef %(complete_func)s %(script_names)s +""" + +COMPLETION_SCRIPT_FISH = ( + "complete --no-files --command %(script_names)s --arguments" + ' "(env %(autocomplete_var)s=complete_fish' + " COMP_WORDS=(commandline -cp) COMP_CWORD=(commandline -t)" + ' %(script_names)s)"' +) + +_completion_scripts = { + "bash": COMPLETION_SCRIPT_BASH, + "zsh": COMPLETION_SCRIPT_ZSH, + "fish": COMPLETION_SCRIPT_FISH, +} + +_invalid_ident_char_re = re.compile(r"[^a-zA-Z0-9_]") + + +def get_completion_script(prog_name, complete_var, shell): + cf_name = _invalid_ident_char_re.sub("", prog_name.replace("-", "_")) + script = _completion_scripts.get(shell, COMPLETION_SCRIPT_BASH) + return ( + script + % { + "complete_func": "_{}_completion".format(cf_name), + "script_names": prog_name, + "autocomplete_var": complete_var, + } + ).strip() + ";" + + +def resolve_ctx(cli, prog_name, args): + """Parse into a hierarchy of contexts. Contexts are connected + through the parent variable. + + :param cli: command definition + :param prog_name: the program that is running + :param args: full list of args + :return: the final context/command parsed + """ + ctx = cli.make_context(prog_name, args, resilient_parsing=True) + args = ctx.protected_args + ctx.args + while args: + if isinstance(ctx.command, MultiCommand): + if not ctx.command.chain: + cmd_name, cmd, args = ctx.command.resolve_command(ctx, args) + if cmd is None: + return ctx + ctx = cmd.make_context( + cmd_name, args, parent=ctx, resilient_parsing=True + ) + args = ctx.protected_args + ctx.args + else: + # Walk chained subcommand contexts saving the last one. + while args: + cmd_name, cmd, args = ctx.command.resolve_command(ctx, args) + if cmd is None: + return ctx + sub_ctx = cmd.make_context( + cmd_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 + + +def start_of_option(param_str): + """ + :param param_str: param_str to check + :return: whether or not this is the start of an option declaration + (i.e. starts "-" or "--") + """ + return param_str and param_str[:1] == "-" + + +def is_incomplete_option(all_args, cmd_param): + """ + :param all_args: the full original list of args supplied + :param cmd_param: the current command paramter + :return: whether or not the last option declaration (i.e. starts + "-" or "--") is incomplete and corresponds to this cmd_param. In + other words whether this cmd_param option can still accept + values + """ + if not isinstance(cmd_param, Option): + return False + if cmd_param.is_flag: + return False + last_option = None + for index, arg_str in enumerate( + reversed([arg for arg in all_args if arg != WORDBREAK]) + ): + if index + 1 > cmd_param.nargs: + break + if start_of_option(arg_str): + last_option = arg_str + + return True if last_option and last_option in cmd_param.opts else False + + +def is_incomplete_argument(current_params, cmd_param): + """ + :param current_params: the current params and values for this + argument as already entered + :param cmd_param: the current command parameter + :return: whether or not the last argument is incomplete and + corresponds to this cmd_param. In other words whether or not the + this cmd_param argument can still accept values + """ + if not isinstance(cmd_param, Argument): + return False + current_param_values = current_params[cmd_param.name] + if current_param_values is None: + return True + if cmd_param.nargs == -1: + return True + if ( + isinstance(current_param_values, abc.Iterable) + and cmd_param.nargs > 1 + and len(current_param_values) < cmd_param.nargs + ): + return True + return False + + +def get_user_autocompletions(ctx, args, incomplete, cmd_param): + """ + :param ctx: context associated with the parsed command + :param args: full list of args + :param incomplete: the incomplete text to autocomplete + :param cmd_param: command definition + :return: all the possible user-specified completions for the param + """ + results = [] + if isinstance(cmd_param.type, Choice): + # Choices don't support descriptions. + results = [ + (c, None) for c in cmd_param.type.choices if str(c).startswith(incomplete) + ] + elif cmd_param.autocompletion is not None: + dynamic_completions = cmd_param.autocompletion( + ctx=ctx, args=args, incomplete=incomplete + ) + results = [ + c if isinstance(c, tuple) else (c, None) for c in dynamic_completions + ] + return results + + +def get_visible_commands_starting_with(ctx, starts_with): + """ + :param ctx: context associated with the parsed command + :starts_with: string that visible commands must start with. + :return: all visible (not hidden) commands that start with starts_with. + """ + for c in ctx.command.list_commands(ctx): + if c.startswith(starts_with): + command = ctx.command.get_command(ctx, c) + if not command.hidden: + yield command + + +def add_subcommand_completions(ctx, incomplete, completions_out): + # Add subcommand completions. + if isinstance(ctx.command, MultiCommand): + completions_out.extend( + [ + (c.name, c.get_short_help_str()) + for c in get_visible_commands_starting_with(ctx, incomplete) + ] + ) + + # Walk up the context list and add any other completion + # possibilities from chained commands + while ctx.parent is not None: + ctx = ctx.parent + if isinstance(ctx.command, MultiCommand) and ctx.command.chain: + remaining_commands = [ + c + for c in get_visible_commands_starting_with(ctx, incomplete) + if c.name not in ctx.protected_args + ] + completions_out.extend( + [(c.name, c.get_short_help_str()) for c in remaining_commands] + ) + + +def get_choices(cli, prog_name, args, incomplete): + """ + :param cli: command definition + :param prog_name: the program that is running + :param args: full list of args + :param incomplete: the incomplete text to autocomplete + :return: all the possible completions for the incomplete + """ + all_args = copy.deepcopy(args) + + ctx = resolve_ctx(cli, prog_name, args) + if ctx is None: + return [] + + has_double_dash = "--" in all_args + + # In newer versions of bash long opts with '='s are partitioned, but + # it's easier to parse without the '=' + if start_of_option(incomplete) and WORDBREAK in incomplete: + partition_incomplete = incomplete.partition(WORDBREAK) + all_args.append(partition_incomplete[0]) + incomplete = partition_incomplete[2] + elif incomplete == WORDBREAK: + incomplete = "" + + completions = [] + if not has_double_dash and start_of_option(incomplete): + # completions for partial options + for param in ctx.command.params: + if isinstance(param, Option) and not param.hidden: + param_opts = [ + param_opt + for param_opt in param.opts + param.secondary_opts + if param_opt not in all_args or param.multiple + ] + completions.extend( + [(o, param.help) for o in param_opts if o.startswith(incomplete)] + ) + return completions + # completion for option values from user supplied values + for param in ctx.command.params: + if is_incomplete_option(all_args, param): + return get_user_autocompletions(ctx, all_args, incomplete, param) + # completion for argument values from user supplied values + for param in ctx.command.params: + if is_incomplete_argument(ctx.params, param): + return get_user_autocompletions(ctx, all_args, incomplete, param) + + add_subcommand_completions(ctx, incomplete, completions) + # Sort before returning so that proper ordering can be enforced in custom types. + return sorted(completions) + + +def do_complete(cli, prog_name, include_descriptions): + 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 = "" + + for item in get_choices(cli, prog_name, args, incomplete): + echo(item[0]) + if include_descriptions: + # ZSH has trouble dealing with empty array parameters when + # returned from commands, use '_' to indicate no description + # is present. + echo(item[1] if item[1] else "_") + + return True + + +def do_complete_fish(cli, prog_name): + cwords = split_arg_string(os.environ["COMP_WORDS"]) + incomplete = os.environ["COMP_CWORD"] + args = cwords[1:] + + for item in get_choices(cli, prog_name, args, incomplete): + if item[1]: + echo("{arg}\t{desc}".format(arg=item[0], desc=item[1])) + else: + echo(item[0]) + + return True + + +def bashcomplete(cli, prog_name, complete_var, complete_instr): + if "_" in complete_instr: + command, shell = complete_instr.split("_", 1) + else: + command = complete_instr + shell = "bash" + + if command == "source": + echo(get_completion_script(prog_name, complete_var, shell)) + return True + elif command == "complete": + if shell == "fish": + return do_complete_fish(cli, prog_name) + elif shell in {"bash", "zsh"}: + return do_complete(cli, prog_name, shell == "zsh") + + return False diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click/_compat.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click/_compat.py new file mode 100644 index 0000000..60cb115 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click/_compat.py @@ -0,0 +1,786 @@ +# flake8: noqa +import codecs +import io +import os +import re +import sys +from weakref import WeakKeyDictionary + +PY2 = sys.version_info[0] == 2 +CYGWIN = sys.platform.startswith("cygwin") +MSYS2 = sys.platform.startswith("win") and ("GCC" in sys.version) +# Determine local App Engine environment, per Google's own suggestion +APP_ENGINE = "APPENGINE_RUNTIME" in os.environ and "Development/" in os.environ.get( + "SERVER_SOFTWARE", "" +) +WIN = sys.platform.startswith("win") and not APP_ENGINE and not MSYS2 +DEFAULT_COLUMNS = 80 + + +_ansi_re = re.compile(r"\033\[[;?0-9]*[a-zA-Z]") + + +def get_filesystem_encoding(): + return sys.getfilesystemencoding() or sys.getdefaultencoding() + + +def _make_text_stream( + stream, encoding, errors, force_readable=False, force_writable=False +): + 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): + """Checks if a given encoding is ascii.""" + try: + return codecs.lookup(encoding).name == "ascii" + except LookupError: + return False + + +def get_best_encoding(stream): + """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, + encoding, + errors, + force_readable=False, + force_writable=False, + **extra + ): + self._stream = stream = _FixupStream(stream, force_readable, force_writable) + io.TextIOWrapper.__init__(self, stream, encoding, errors, **extra) + + # The io module is a place where the Python 3 text behavior + # was forced upon Python 2, so we need to unbreak + # it to look like Python 2. + if PY2: + + def write(self, x): + if isinstance(x, str) or is_bytes(x): + try: + self.flush() + except Exception: + pass + return self.buffer.write(str(x)) + return io.TextIOWrapper.write(self, x) + + def writelines(self, lines): + for line in lines: + self.write(line) + + def __del__(self): + try: + self.detach() + except Exception: + pass + + def isatty(self): + # https://bitbucket.org/pypy/pypy/issue/1803 + return self._stream.isatty() + + +class _FixupStream(object): + """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, force_readable=False, force_writable=False): + self._stream = stream + self._force_readable = force_readable + self._force_writable = force_writable + + def __getattr__(self, name): + return getattr(self._stream, name) + + def read1(self, size): + f = getattr(self._stream, "read1", None) + if f is not None: + return f(size) + # We only dispatch to readline instead of read in Python 2 as we + # do not want cause problems with the different implementation + # of line buffering. + if PY2: + return self._stream.readline(size) + return self._stream.read(size) + + def readable(self): + if self._force_readable: + return True + x = getattr(self._stream, "readable", None) + if x is not None: + return x() + try: + self._stream.read(0) + except Exception: + return False + return True + + def writable(self): + if self._force_writable: + return True + x = getattr(self._stream, "writable", None) + if x is not None: + return x() + try: + self._stream.write("") + except Exception: + try: + self._stream.write(b"") + except Exception: + return False + return True + + def seekable(self): + x = getattr(self._stream, "seekable", None) + if x is not None: + return x() + try: + self._stream.seek(self._stream.tell()) + except Exception: + return False + return True + + +if PY2: + text_type = unicode + raw_input = raw_input + string_types = (str, unicode) + int_types = (int, long) + iteritems = lambda x: x.iteritems() + range_type = xrange + + def is_bytes(x): + return isinstance(x, (buffer, bytearray)) + + _identifier_re = re.compile(r"^[a-zA-Z_][a-zA-Z0-9_]*$") + + # For Windows, we need to force stdout/stdin/stderr to binary if it's + # fetched for that. This obviously is not the most correct way to do + # it as it changes global state. Unfortunately, there does not seem to + # be a clear better way to do it as just reopening the file in binary + # mode does not change anything. + # + # An option would be to do what Python 3 does and to open the file as + # binary only, patch it back to the system, and then use a wrapper + # stream that converts newlines. It's not quite clear what's the + # correct option here. + # + # This code also lives in _winconsole for the fallback to the console + # emulation stream. + # + # There are also Windows environments where the `msvcrt` module is not + # available (which is why we use try-catch instead of the WIN variable + # here), such as the Google App Engine development server on Windows. In + # those cases there is just nothing we can do. + def set_binary_mode(f): + return f + + try: + import msvcrt + except ImportError: + pass + else: + + def set_binary_mode(f): + try: + fileno = f.fileno() + except Exception: + pass + else: + msvcrt.setmode(fileno, os.O_BINARY) + return f + + try: + import fcntl + except ImportError: + pass + else: + + def set_binary_mode(f): + try: + fileno = f.fileno() + except Exception: + pass + else: + flags = fcntl.fcntl(fileno, fcntl.F_GETFL) + fcntl.fcntl(fileno, fcntl.F_SETFL, flags & ~os.O_NONBLOCK) + return f + + def isidentifier(x): + return _identifier_re.search(x) is not None + + def get_binary_stdin(): + return set_binary_mode(sys.stdin) + + def get_binary_stdout(): + _wrap_std_stream("stdout") + return set_binary_mode(sys.stdout) + + def get_binary_stderr(): + _wrap_std_stream("stderr") + return set_binary_mode(sys.stderr) + + def get_text_stdin(encoding=None, errors=None): + rv = _get_windows_console_stream(sys.stdin, encoding, errors) + if rv is not None: + return rv + return _make_text_stream(sys.stdin, encoding, errors, force_readable=True) + + def get_text_stdout(encoding=None, errors=None): + _wrap_std_stream("stdout") + rv = _get_windows_console_stream(sys.stdout, encoding, errors) + if rv is not None: + return rv + return _make_text_stream(sys.stdout, encoding, errors, force_writable=True) + + def get_text_stderr(encoding=None, errors=None): + _wrap_std_stream("stderr") + rv = _get_windows_console_stream(sys.stderr, encoding, errors) + if rv is not None: + return rv + return _make_text_stream(sys.stderr, encoding, errors, force_writable=True) + + def filename_to_ui(value): + if isinstance(value, bytes): + value = value.decode(get_filesystem_encoding(), "replace") + return value + + +else: + import io + + text_type = str + raw_input = input + string_types = (str,) + int_types = (int,) + range_type = range + isidentifier = lambda x: x.isidentifier() + iteritems = lambda x: iter(x.items()) + + def is_bytes(x): + return isinstance(x, (bytes, memoryview, bytearray)) + + def _is_binary_reader(stream, default=False): + 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, default=False): + try: + stream.write(b"") + except Exception: + try: + stream.write("") + return False + except Exception: + pass + return default + return True + + def _find_binary_reader(stream): + # 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 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 buf + + def _find_binary_writer(stream): + # We need to figure out if the given stream is already binary. + # This can happen because the official docs recommend detatching + # 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 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 buf + + def _stream_is_misconfigured(stream): + """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, attr, value): + """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, encoding, errors): + """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, + encoding, + errors, + is_binary, + find_binary, + force_readable=False, + force_writable=False, + ): + if is_binary(text_stream, False): + binary_reader = text_stream + else: + # 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. + binary_reader = find_binary(text_stream) + + # If that's not possible, silently use the original reader + # and get mojibake instead of exceptions. + if binary_reader is None: + return text_stream + + # 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, encoding, errors, force_readable=False): + 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, encoding, errors, force_writable=False): + return _force_correct_text_stream( + text_writer, + encoding, + errors, + _is_binary_writer, + _find_binary_writer, + force_writable=force_writable, + ) + + def get_binary_stdin(): + 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(): + 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(): + 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=None, errors=None): + 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=None, errors=None): + 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=None, errors=None): + 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 filename_to_ui(value): + if isinstance(value, bytes): + value = value.decode(get_filesystem_encoding(), "replace") + else: + value = value.encode("utf-8", "surrogateescape").decode("utf-8", "replace") + return value + + +def get_streerror(e, default=None): + if hasattr(e, "strerror"): + msg = e.strerror + else: + if default is not None: + msg = default + else: + msg = str(e) + if isinstance(msg, bytes): + msg = msg.decode("utf-8", "replace") + return msg + + +def _wrap_io_open(file, mode, encoding, errors): + """On Python 2, :func:`io.open` returns a text file wrapper that + requires passing ``unicode`` to ``write``. Need to open the file in + binary mode then wrap it in a subclass that can write ``str`` and + ``unicode``. + + Also handles not passing ``encoding`` and ``errors`` in binary mode. + """ + binary = "b" in mode + + if binary: + kwargs = {} + else: + kwargs = {"encoding": encoding, "errors": errors} + + if not PY2 or binary: + return io.open(file, mode, **kwargs) + + f = io.open(file, "{}b".format(mode.replace("t", ""))) + return _make_text_stream(f, **kwargs) + + +def open_stream(filename, mode="r", encoding=None, errors="strict", atomic=False): + binary = "b" in mode + + # Standard streams first. These are simple because they don't need + # special handling for the atomic flag. It's entirely ignored. + if 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 = 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), + ".__atomic-write{:08x}".format(random.randrange(1 << 32)), + ) + 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) + return _AtomicFile(f, tmp_filename, os.path.realpath(filename)), True + + +# Used in a destructor call, needs extra protection from interpreter cleanup. +if hasattr(os, "replace"): + _replace = os.replace + _can_replace = True +else: + _replace = os.rename + _can_replace = not WIN + + +class _AtomicFile(object): + def __init__(self, f, tmp_filename, real_filename): + self._f = f + self._tmp_filename = tmp_filename + self._real_filename = real_filename + self.closed = False + + @property + def name(self): + return self._real_filename + + def close(self, delete=False): + if self.closed: + return + self._f.close() + if not _can_replace: + try: + os.remove(self._real_filename) + except OSError: + pass + _replace(self._tmp_filename, self._real_filename) + self.closed = True + + def __getattr__(self, name): + return getattr(self._f, name) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, tb): + self.close(delete=exc_type is not None) + + def __repr__(self): + return repr(self._f) + + +auto_wrap_for_ansi = None +colorama = None +get_winterm_size = None + + +def strip_ansi(value): + return _ansi_re.sub("", value) + + +def _is_jupyter_kernel_output(stream): + if WIN: + # TODO: Couldn't test on Windows, should't try to support until + # someone tests the details wrt colorama. + return + + while isinstance(stream, (_FixupStream, _NonClosingTextIOWrapper)): + stream = stream._stream + + return stream.__class__.__module__.startswith("ipykernel.") + + +def should_strip_ansi(stream=None, color=None): + 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 + + +# If we're on Windows, we provide transparent integration through +# colorama. This will make ANSI colors through the echo function +# work automatically. +if WIN: + # Windows has a smaller terminal + DEFAULT_COLUMNS = 79 + + from ._winconsole import _get_windows_console_stream, _wrap_std_stream + + def _get_argv_encoding(): + import locale + + return locale.getpreferredencoding() + + if PY2: + + def raw_input(prompt=""): + sys.stderr.flush() + if prompt: + stdout = _default_text_stdout() + stdout.write(prompt) + stdin = _default_text_stdin() + return stdin.readline().rstrip("\r\n") + + try: + import colorama + except ImportError: + pass + else: + _ansi_stream_wrappers = WeakKeyDictionary() + + def auto_wrap_for_ansi(stream, color=None): + """This function wraps a stream so that calls through colorama + are issued to the win32 console API to recolor on demand. It + also ensures to reset the colors if a write call is interrupted + to not destroy the console afterwards. + """ + try: + cached = _ansi_stream_wrappers.get(stream) + except Exception: + cached = None + if cached is not None: + return cached + strip = should_strip_ansi(stream, color) + ansi_wrapper = colorama.AnsiToWin32(stream, strip=strip) + rv = ansi_wrapper.stream + _write = rv.write + + def _safe_write(s): + try: + return _write(s) + except: + ansi_wrapper.reset_all() + raise + + rv.write = _safe_write + try: + _ansi_stream_wrappers[stream] = rv + except Exception: + pass + return rv + + def get_winterm_size(): + win = colorama.win32.GetConsoleScreenBufferInfo( + colorama.win32.STDOUT + ).srWindow + return win.Right - win.Left, win.Bottom - win.Top + + +else: + + def _get_argv_encoding(): + return getattr(sys.stdin, "encoding", None) or get_filesystem_encoding() + + _get_windows_console_stream = lambda *x: None + _wrap_std_stream = lambda *x: None + + +def term_len(x): + return len(strip_ansi(x)) + + +def isatty(stream): + try: + return stream.isatty() + except Exception: + return False + + +def _make_cached_stream_func(src_func, wrapper_func): + cache = WeakKeyDictionary() + + def func(): + stream = src_func() + try: + rv = cache.get(stream) + except Exception: + rv = None + if rv is not None: + return rv + rv = wrapper_func() + try: + stream = src_func() # In case wrapper_func() modified the stream + 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 = { + "stdin": get_binary_stdin, + "stdout": get_binary_stdout, + "stderr": get_binary_stderr, +} + +text_streams = { + "stdin": get_text_stdin, + "stdout": get_text_stdout, + "stderr": get_text_stderr, +} diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click/_termui_impl.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click/_termui_impl.py new file mode 100644 index 0000000..88bec37 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click/_termui_impl.py @@ -0,0 +1,657 @@ +# -*- coding: utf-8 -*- +""" +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. +""" +import contextlib +import math +import os +import sys +import time + +from ._compat import _default_text_stdout +from ._compat import CYGWIN +from ._compat import get_best_encoding +from ._compat import int_types +from ._compat import isatty +from ._compat import open_stream +from ._compat import range_type +from ._compat import strip_ansi +from ._compat import term_len +from ._compat import WIN +from .exceptions import ClickException +from .utils import echo + +if os.name == "nt": + BEFORE_BAR = "\r" + AFTER_BAR = "\n" +else: + BEFORE_BAR = "\r\033[?25l" + AFTER_BAR = "\033[?25h\n" + + +def _length_hint(obj): + """Returns the length hint of an object.""" + try: + return len(obj) + except (AttributeError, TypeError): + try: + get_hint = type(obj).__length_hint__ + except AttributeError: + return None + try: + hint = get_hint(obj) + except TypeError: + return None + if hint is NotImplemented or not isinstance(hint, int_types) or hint < 0: + return None + return hint + + +class ProgressBar(object): + def __init__( + self, + iterable, + length=None, + fill_char="#", + empty_char=" ", + bar_template="%(bar)s", + info_sep=" ", + show_eta=True, + show_percent=None, + show_pos=False, + item_show_func=None, + label=None, + file=None, + color=None, + width=30, + ): + self.fill_char = fill_char + self.empty_char = empty_char + self.bar_template = bar_template + self.info_sep = info_sep + self.show_eta = show_eta + self.show_percent = show_percent + self.show_pos = show_pos + self.item_show_func = item_show_func + self.label = label or "" + if file is None: + file = _default_text_stdout() + self.file = file + self.color = color + self.width = width + self.autowidth = width == 0 + + if length is None: + length = _length_hint(iterable) + if iterable is None: + if length is None: + raise TypeError("iterable or length is required") + iterable = range_type(length) + self.iter = iter(iterable) + self.length = length + self.length_known = length is not None + self.pos = 0 + self.avg = [] + self.start = self.last_eta = time.time() + self.eta_known = False + self.finished = False + self.max_width = None + self.entered = False + self.current_item = None + self.is_hidden = not isatty(self.file) + self._last_line = None + self.short_limit = 0.5 + + def __enter__(self): + self.entered = True + self.render_progress() + return self + + def __exit__(self, exc_type, exc_value, tb): + self.render_finish() + + def __iter__(self): + 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): + # 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)) + + # Python 2 compat + next = __next__ + + def is_fast(self): + return time.time() - self.start <= self.short_limit + + def render_finish(self): + if self.is_hidden or self.is_fast(): + return + self.file.write(AFTER_BAR) + self.file.flush() + + @property + def pct(self): + if self.finished: + return 1.0 + return min(self.pos / (float(self.length) or 1), 1.0) + + @property + def time_per_iteration(self): + if not self.avg: + return 0.0 + return sum(self.avg) / float(len(self.avg)) + + @property + def eta(self): + if self.length_known and not self.finished: + return self.time_per_iteration * (self.length - self.pos) + return 0.0 + + def format_eta(self): + 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 "{}d {:02}:{:02}:{:02}".format(t, hours, minutes, seconds) + else: + return "{:02}:{:02}:{:02}".format(hours, minutes, seconds) + return "" + + def format_pos(self): + pos = str(self.pos) + if self.length_known: + pos += "/{}".format(self.length) + return pos + + def format_pct(self): + return "{: 4}%".format(int(self.pct * 100))[1:] + + def format_bar(self): + if self.length_known: + 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: + bar = list(self.empty_char * (self.width or 1)) + if self.time_per_iteration != 0: + bar[ + int( + (math.cos(self.pos * self.time_per_iteration) / 2.0 + 0.5) + * self.width + ) + ] = self.fill_char + bar = "".join(bar) + return bar + + def format_progress_line(self): + show_percent = self.show_percent + + info_bits = [] + if self.length_known 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): + from .termui import get_terminal_size + + if self.is_hidden: + 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, get_terminal_size()[0] - clutter_length) + if new_width < old_width: + 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 and not self.is_fast(): + self._last_line = line + echo(line, file=self.file, color=self.color, nl=False) + self.file.flush() + + def make_step(self, n_steps): + self.pos += n_steps + if self.length_known 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_known + + def update(self, n_steps): + self.make_step(n_steps) + self.render_progress() + + def finish(self): + self.eta_known = 0 + self.current_item = None + self.finished = True + + def generator(self): + """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 self.is_hidden: + for rv in self.iter: + yield rv + else: + for rv in self.iter: + self.current_item = rv + yield rv + self.update(1) + self.finish() + self.render_progress() + + +def pager(generator, color=None): + """Decide what method to use for paging through text.""" + stdout = _default_text_stdout() + if not isatty(sys.stdin) or not isatty(stdout): + return _nullpager(stdout, generator, color) + pager_cmd = (os.environ.get("PAGER", None) or "").strip() + if pager_cmd: + if WIN: + return _tempfilepager(generator, pager_cmd, color) + return _pipepager(generator, pager_cmd, color) + if os.environ.get("TERM") in ("dumb", "emacs"): + return _nullpager(stdout, generator, color) + if WIN or sys.platform.startswith("os2"): + return _tempfilepager(generator, "more <", color) + if hasattr(os, "system") and os.system("(less) 2>/dev/null") == 0: + return _pipepager(generator, "less", color) + + import tempfile + + fd, filename = tempfile.mkstemp() + os.close(fd) + try: + if hasattr(os, "system") and os.system('more "{}"'.format(filename)) == 0: + return _pipepager(generator, "more", color) + return _nullpager(stdout, generator, color) + finally: + os.unlink(filename) + + +def _pipepager(generator, cmd, color): + """Page through text by feeding it to another program. Invoking a + pager through this might support colors. + """ + import subprocess + + env = dict(os.environ) + + # If we're piping to less we might support colors under the + # condition that + cmd_detail = cmd.rsplit("/", 1)[-1].split() + if color is None and cmd_detail[0] == "less": + less_flags = "{}{}".format(os.environ.get("LESS", ""), " ".join(cmd_detail[1:])) + if not less_flags: + env["LESS"] = "-R" + color = True + elif "r" in less_flags or "R" in less_flags: + color = True + + c = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, env=env) + encoding = get_best_encoding(c.stdin) + try: + for text in generator: + if not color: + text = strip_ansi(text) + + c.stdin.write(text.encode(encoding, "replace")) + except (IOError, KeyboardInterrupt): + pass + else: + c.stdin.close() + + # 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 + + +def _tempfilepager(generator, cmd, color): + """Page through text by invoking a program on a temporary file.""" + import tempfile + + filename = tempfile.mktemp() + # 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: + os.system('{} "{}"'.format(cmd, filename)) + finally: + os.unlink(filename) + + +def _nullpager(stream, generator, color): + """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(object): + def __init__(self, editor=None, env=None, require_save=True, extension=".txt"): + self.editor = editor + self.env = env + self.require_save = require_save + self.extension = extension + + def get_editor(self): + 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 os.system("which {} >/dev/null 2>&1".format(editor)) == 0: + return editor + return "vi" + + def edit_file(self, filename): + import subprocess + + editor = self.get_editor() + if self.env: + environ = os.environ.copy() + environ.update(self.env) + else: + environ = None + try: + c = subprocess.Popen( + '{} "{}"'.format(editor, filename), env=environ, shell=True, + ) + exit_code = c.wait() + if exit_code != 0: + raise ClickException("{}: Editing failed!".format(editor)) + except OSError as e: + raise ClickException("{}: Editing failed: {}".format(editor, e)) + + def edit(self, text): + import tempfile + + text = text or "" + if text and not text.endswith("\n"): + text += "\n" + + fd, name = tempfile.mkstemp(prefix="editor-", suffix=self.extension) + try: + if WIN: + encoding = "utf-8-sig" + text = text.replace("\n", "\r\n") + else: + encoding = "utf-8" + text = text.encode(encoding) + + f = os.fdopen(fd, "wb") + f.write(text) + f.close() + timestamp = os.path.getmtime(name) + + self.edit_file(name) + + if self.require_save and os.path.getmtime(name) == timestamp: + return None + + f = open(name, "rb") + try: + rv = f.read() + finally: + f.close() + return rv.decode("utf-8-sig").replace("\r\n", "\n") + finally: + os.unlink(name) + + +def open_url(url, wait=False, locate=False): + import subprocess + + def _unquote_file(url): + try: + import urllib + except ImportError: + import urllib + if url.startswith("file://"): + url = urllib.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 /select,"{}"'.format(_unquote_file(url.replace('"', ""))) + else: + args = 'start {} "" "{}"'.format( + "/WAIT" if wait else "", url.replace('"', "") + ) + return os.system(args) + elif CYGWIN: + if locate: + url = _unquote_file(url) + args = 'cygstart "{}"'.format(os.path.dirname(url).replace('"', "")) + else: + args = 'cygstart {} "{}"'.format("-w" if wait else "", url.replace('"', "")) + return os.system(args) + + 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): + if ch == u"\x03": + raise KeyboardInterrupt() + if ch == u"\x04" and not WIN: # Unix-like, Ctrl+D + raise EOFError() + if ch == u"\x1a" and WIN: # Windows, Ctrl+Z + raise EOFError() + + +if WIN: + import msvcrt + + @contextlib.contextmanager + def raw_terminal(): + yield + + def getchar(echo): + # 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 = msvcrt.getwche + else: + func = msvcrt.getwch + + rv = func() + if rv in (u"\x00", u"\xe0"): + # \x00 and \xe0 are control characters that indicate special key, + # see above. + rv += func() + _translate_ch_to_exc(rv) + return rv + + +else: + import tty + import termios + + @contextlib.contextmanager + def raw_terminal(): + 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): + with raw_terminal() as fd: + ch = os.read(fd, 32) + ch = ch.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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click/_textwrap.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click/_textwrap.py new file mode 100644 index 0000000..6959087 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click/_textwrap.py @@ -0,0 +1,37 @@ +import textwrap +from contextlib import contextmanager + + +class TextWrapper(textwrap.TextWrapper): + def _handle_long_word(self, reversed_chunks, cur_line, cur_len, width): + 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): + 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): + rv = [] + for idx, line in enumerate(text.splitlines()): + indent = self.initial_indent + if idx > 0: + indent = self.subsequent_indent + rv.append(indent + line) + return "\n".join(rv) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click/_unicodefun.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click/_unicodefun.py new file mode 100644 index 0000000..781c365 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click/_unicodefun.py @@ -0,0 +1,131 @@ +import codecs +import os +import sys + +from ._compat import PY2 + + +def _find_unicode_literals_frame(): + import __future__ + + if not hasattr(sys, "_getframe"): # not all Python implementations have it + return 0 + frm = sys._getframe(1) + idx = 1 + while frm is not None: + if frm.f_globals.get("__name__", "").startswith("click."): + frm = frm.f_back + idx += 1 + elif frm.f_code.co_flags & __future__.unicode_literals.compiler_flag: + return idx + else: + break + return 0 + + +def _check_for_unicode_literals(): + if not __debug__: + return + + from . import disable_unicode_literals_warning + + if not PY2 or disable_unicode_literals_warning: + return + bad_frame = _find_unicode_literals_frame() + if bad_frame <= 0: + return + from warnings import warn + + warn( + Warning( + "Click detected the use of the unicode_literals __future__" + " import. This is heavily discouraged because it can" + " introduce subtle bugs in your code. You should instead" + ' use explicit u"" literals for your unicode strings. For' + " more information see" + " https://click.palletsprojects.com/python3/" + ), + stacklevel=bad_frame, + ) + + +def _verify_python3_env(): + """Ensures that the environment is good for unicode on Python 3.""" + if PY2: + return + try: + import locale + + fs_enc = codecs.lookup(locale.getpreferredencoding()).name + except Exception: + fs_enc = "ascii" + if fs_enc != "ascii": + return + + extra = "" + if os.name == "posix": + import subprocess + + try: + rv = subprocess.Popen( + ["locale", "-a"], stdout=subprocess.PIPE, stderr=subprocess.PIPE + ).communicate()[0] + except OSError: + rv = b"" + good_locales = set() + has_c_utf8 = False + + # Make sure we're operating on text here. + if isinstance(rv, bytes): + rv = rv.decode("ascii", "replace") + + for line in rv.splitlines(): + locale = line.strip() + if locale.lower().endswith((".utf-8", ".utf8")): + good_locales.add(locale) + if locale.lower() in ("c.utf8", "c.utf-8"): + has_c_utf8 = True + + extra += "\n\n" + if not good_locales: + extra += ( + "Additional information: on this system no suitable" + " UTF-8 locales were discovered. This most likely" + " requires resolving by reconfiguring the locale" + " system." + ) + elif has_c_utf8: + extra += ( + "This system supports the C.UTF-8 locale which is" + " recommended. You might be able to resolve your issue" + " by exporting the following environment variables:\n\n" + " export LC_ALL=C.UTF-8\n" + " export LANG=C.UTF-8" + ) + else: + extra += ( + "This system lists a couple of UTF-8 supporting locales" + " that you can pick from. The following suitable" + " locales were discovered: {}".format(", ".join(sorted(good_locales))) + ) + + bad_locale = None + for locale in os.environ.get("LC_ALL"), os.environ.get("LANG"): + if locale and locale.lower().endswith((".utf-8", ".utf8")): + bad_locale = locale + if locale is not None: + break + if bad_locale is not None: + extra += ( + "\n\nClick discovered that you exported a UTF-8 locale" + " but the locale system could not pick up from it" + " because it does not exist. The exported locale is" + " '{}' but it is not supported".format(bad_locale) + ) + + raise RuntimeError( + "Click will abort further execution because Python 3 was" + " configured to use ASCII as encoding for the environment." + " Consult https://click.palletsprojects.com/python3/ for" + " mitigation steps.{}".format(extra) + ) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click/_winconsole.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click/_winconsole.py new file mode 100644 index 0000000..b6c4274 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click/_winconsole.py @@ -0,0 +1,370 @@ +# -*- coding: utf-8 -*- +# 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 prmopt. +import ctypes +import io +import os +import sys +import time +import zlib +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 windll +from ctypes import WinError +from ctypes import WINFUNCTYPE +from ctypes.wintypes import DWORD +from ctypes.wintypes import HANDLE +from ctypes.wintypes import LPCWSTR +from ctypes.wintypes import LPWSTR + +import msvcrt + +from ._compat import _NonClosingTextIOWrapper +from ._compat import PY2 +from ._compat import text_type + +try: + from ctypes import pythonapi + + PyObject_GetBuffer = pythonapi.PyObject_GetBuffer + PyBuffer_Release = pythonapi.PyBuffer_Release +except ImportError: + pythonapi = None + + +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(ctypes.c_void_p, ctypes.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 + + +class Py_buffer(ctypes.Structure): + _fields_ = [ + ("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), + ] + + if PY2: + _fields_.insert(-1, ("smalltable", c_ssize_t * 2)) + + +# On PyPy we cannot get buffers so our ability to operate here is +# serverly limited. +if pythonapi is None: + get_buffer = None +else: + + def get_buffer(obj, writable=False): + buf = Py_buffer() + flags = PyBUF_WRITABLE if writable else PyBUF_SIMPLE + PyObject_GetBuffer(py_object(obj), byref(buf), flags) + try: + buffer_type = c_char * buf.len + return buffer_type.from_address(buf.buf) + finally: + PyBuffer_Release(byref(buf)) + + +class _WindowsConsoleRawIOBase(io.RawIOBase): + def __init__(self, handle): + self.handle = handle + + def isatty(self): + io.RawIOBase.isatty(self) + return True + + +class _WindowsConsoleReader(_WindowsConsoleRawIOBase): + def readable(self): + return True + + def readinto(self, b): + 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("Windows error: {}".format(GetLastError())) + + if buffer[0] == EOF: + return 0 + return 2 * code_units_read.value + + +class _WindowsConsoleWriter(_WindowsConsoleRawIOBase): + def writable(self): + return True + + @staticmethod + def _get_error_message(errno): + if errno == ERROR_SUCCESS: + return "ERROR_SUCCESS" + elif errno == ERROR_NOT_ENOUGH_MEMORY: + return "ERROR_NOT_ENOUGH_MEMORY" + return "Windows error {}".format(errno) + + def write(self, b): + 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(object): + def __init__(self, text_stream, byte_stream): + self._text_stream = text_stream + self.buffer = byte_stream + + @property + def name(self): + return self.buffer.name + + def write(self, x): + if isinstance(x, text_type): + return self._text_stream.write(x) + try: + self.flush() + except Exception: + pass + return self.buffer.write(x) + + def writelines(self, lines): + for line in lines: + self.write(line) + + def __getattr__(self, name): + return getattr(self._text_stream, name) + + def isatty(self): + return self.buffer.isatty() + + def __repr__(self): + return "".format( + self.name, self.encoding + ) + + +class WindowsChunkedWriter(object): + """ + Wraps a stream (such as stdout), acting as a transparent proxy for all + attribute access apart from method 'write()' which we wrap to write in + limited chunks due to a Windows limitation on binary console streams. + """ + + def __init__(self, wrapped): + # double-underscore everything to prevent clashes with names of + # attributes on the wrapped stream object. + self.__wrapped = wrapped + + def __getattr__(self, name): + return getattr(self.__wrapped, name) + + def write(self, text): + total_to_write = len(text) + written = 0 + + while written < total_to_write: + to_write = min(total_to_write - written, MAX_BYTES_WRITTEN) + self.__wrapped.write(text[written : written + to_write]) + written += to_write + + +_wrapped_std_streams = set() + + +def _wrap_std_stream(name): + # Python 2 & Windows 7 and below + if ( + PY2 + and sys.getwindowsversion()[:2] <= (6, 1) + and name not in _wrapped_std_streams + ): + setattr(sys, name, WindowsChunkedWriter(getattr(sys, name))) + _wrapped_std_streams.add(name) + + +def _get_text_stdin(buffer_stream): + text_stream = _NonClosingTextIOWrapper( + io.BufferedReader(_WindowsConsoleReader(STDIN_HANDLE)), + "utf-16-le", + "strict", + line_buffering=True, + ) + return ConsoleStream(text_stream, buffer_stream) + + +def _get_text_stdout(buffer_stream): + text_stream = _NonClosingTextIOWrapper( + io.BufferedWriter(_WindowsConsoleWriter(STDOUT_HANDLE)), + "utf-16-le", + "strict", + line_buffering=True, + ) + return ConsoleStream(text_stream, buffer_stream) + + +def _get_text_stderr(buffer_stream): + text_stream = _NonClosingTextIOWrapper( + io.BufferedWriter(_WindowsConsoleWriter(STDERR_HANDLE)), + "utf-16-le", + "strict", + line_buffering=True, + ) + return ConsoleStream(text_stream, buffer_stream) + + +if PY2: + + def _hash_py_argv(): + return zlib.crc32("\x00".join(sys.argv[1:])) + + _initial_argv_hash = _hash_py_argv() + + def _get_windows_argv(): + argc = c_int(0) + argv_unicode = CommandLineToArgvW(GetCommandLineW(), byref(argc)) + if not argv_unicode: + raise WinError() + try: + argv = [argv_unicode[i] for i in range(0, argc.value)] + finally: + LocalFree(argv_unicode) + del argv_unicode + + if not hasattr(sys, "frozen"): + argv = argv[1:] + while len(argv) > 0: + arg = argv[0] + if not arg.startswith("-") or arg == "-": + break + argv = argv[1:] + if arg.startswith(("-c", "-m")): + break + + return argv[1:] + + +_stream_factories = { + 0: _get_text_stdin, + 1: _get_text_stdout, + 2: _get_text_stderr, +} + + +def _is_console(f): + if not hasattr(f, "fileno"): + return False + + try: + fileno = f.fileno() + except OSError: + return False + + handle = msvcrt.get_osfhandle(fileno) + return bool(GetConsoleMode(handle, byref(DWORD()))) + + +def _get_windows_console_stream(f, encoding, errors): + if ( + get_buffer is not None + and encoding in ("utf-16-le", None) + and errors in ("strict", None) + and _is_console(f) + ): + func = _stream_factories.get(f.fileno()) + if func is not None: + if not PY2: + f = getattr(f, "buffer", None) + if f is None: + return None + else: + # If we are on Python 2 we need to set the stream that we + # deal with to binary mode as otherwise the exercise if a + # bit moot. The same problems apply as for + # get_binary_stdin and friends from _compat. + msvcrt.setmode(f.fileno(), os.O_BINARY) + return func(f) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click/core.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click/core.py new file mode 100644 index 0000000..f58bf26 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click/core.py @@ -0,0 +1,2030 @@ +import errno +import inspect +import os +import sys +from contextlib import contextmanager +from functools import update_wrapper +from itertools import repeat + +from ._compat import isidentifier +from ._compat import iteritems +from ._compat import PY2 +from ._compat import string_types +from ._unicodefun import _check_for_unicode_literals +from ._unicodefun import _verify_python3_env +from .exceptions import Abort +from .exceptions import BadParameter +from .exceptions import ClickException +from .exceptions import Exit +from .exceptions import MissingParameter +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 OptionParser +from .parser import split_opt +from .termui import confirm +from .termui import prompt +from .termui import style +from .types import BOOL +from .types import convert_type +from .types import IntRange +from .utils import echo +from .utils import get_os_args +from .utils import make_default_short_help +from .utils import make_str +from .utils import PacifyFlushWrapper + +_missing = object() + +SUBCOMMAND_METAVAR = "COMMAND [ARGS]..." +SUBCOMMANDS_METAVAR = "COMMAND1 [ARGS]... [COMMAND2 [ARGS]...]..." + +DEPRECATED_HELP_NOTICE = " (DEPRECATED)" +DEPRECATED_INVOKE_NOTICE = "DeprecationWarning: The command %(name)s is deprecated." + + +def _maybe_show_deprecated_notice(cmd): + if cmd.deprecated: + echo(style(DEPRECATED_INVOKE_NOTICE % {"name": cmd.name}, fg="red"), err=True) + + +def fast_exit(code): + """Exit without garbage collection, this speeds up exit by about 10ms for + things like bash completion. + """ + sys.stdout.flush() + sys.stderr.flush() + os._exit(code) + + +def _bashcomplete(cmd, prog_name, complete_var=None): + """Internal handler for the bash completion support.""" + if complete_var is None: + complete_var = "_{}_COMPLETE".format(prog_name.replace("-", "_").upper()) + complete_instr = os.environ.get(complete_var) + if not complete_instr: + return + + from ._bashcomplete import bashcomplete + + if bashcomplete(cmd, prog_name, complete_var, complete_instr): + fast_exit(1) + + +def _check_multicommand(base_command, cmd_name, cmd, register=False): + if not base_command.chain or not isinstance(cmd, MultiCommand): + return + if register: + hint = ( + "It is not possible to add multi commands as children to" + " another multi command that is in chain mode." + ) + else: + hint = ( + "Found a multi command as subcommand to a multi command" + " that is in chain mode. This is not supported." + ) + raise RuntimeError( + "{}. Command '{}' is set to chain and '{}' was added as" + " subcommand but it in itself is a multi command. ('{}' is a {}" + " within a chained {} named '{}').".format( + hint, + base_command.name, + cmd_name, + cmd_name, + cmd.__class__.__name__, + base_command.__class__.__name__, + base_command.name, + ) + ) + + +def batch(iterable, batch_size): + return list(zip(*repeat(iter(iterable), batch_size))) + + +def invoke_param_callback(callback, ctx, param, value): + code = getattr(callback, "__code__", None) + args = getattr(code, "co_argcount", 3) + + if args < 3: + from warnings import warn + + warn( + "Parameter callbacks take 3 args, (ctx, param, value). The" + " 2-arg style is deprecated and will be removed in 8.0.".format(callback), + DeprecationWarning, + stacklevel=3, + ) + return callback(ctx, value) + + return callback(ctx, param, value) + + +@contextmanager +def augment_usage_errors(ctx, param=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, declaration_order): + """Given a sequence of parameters in the order as should be considered + for processing and an iterable of parameters that exist, this returns + a list in the correct order as they should be processed. + """ + + def sort_key(item): + try: + idx = invocation_order.index(item) + except ValueError: + idx = float("inf") + return (not item.is_eager, idx) + + return sorted(declaration_order, key=sort_key) + + +class Context(object): + """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. + + .. versionadded:: 2.0 + Added the `resilient_parsing`, `help_option_names`, + `token_normalize_func` parameters. + + .. versionadded:: 3.0 + Added the `allow_extra_args` and `allow_interspersed_args` + parameters. + + .. versionadded:: 4.0 + Added the `color`, `ignore_unknown_options`, and + `max_content_width` parameters. + + .. versionadded:: 7.1 + Added the `show_default` parameter. + + :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: if True, shows defaults for all options. + Even if an option is later created with show_default=False, + this command-level setting overrides it. + """ + + def __init__( + self, + command, + parent=None, + info_name=None, + obj=None, + auto_envvar_prefix=None, + default_map=None, + terminal_width=None, + max_content_width=None, + resilient_parsing=False, + allow_extra_args=None, + allow_interspersed_args=None, + ignore_unknown_options=None, + help_option_names=None, + token_normalize_func=None, + color=None, + show_default=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 + #: the parsed parameters except if the value is hidden in which + #: case it's not remembered. + self.params = {} + #: the leftover arguments. + self.args = [] + #: 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 = [] + if obj is None and parent is not None: + obj = parent.obj + #: the user object stored. + self.obj = obj + self._meta = getattr(parent, "meta", {}) + + #: A dictionary (-like object) with defaults for parameters. + if ( + default_map is None + and parent is not None + and parent.default_map is not None + ): + default_map = parent.default_map.get(info_name) + self.default_map = 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:`resultcallback`. + self.invoked_subcommand = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = "{}_{}".format( + 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 = 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 = color + + self.show_default = show_default + + self._close_callbacks = [] + self._depth = 0 + + def __enter__(self): + self._depth += 1 + push_context(self) + return self + + def __exit__(self, exc_type, exc_value, tb): + self._depth -= 1 + if self._depth == 0: + self.close() + pop_context() + + @contextmanager + def scope(self, cleanup=True): + """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): + """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): + """Creates the formatter for the help and usage output.""" + return HelpFormatter( + width=self.terminal_width, max_width=self.max_content_width + ) + + def call_on_close(self, f): + """This decorator remembers a function as callback that should be + executed when the context tears down. This is most useful to bind + resource handling to the script execution. For instance, file objects + opened by the :class:`File` type will register their close callbacks + here. + + :param f: the function to execute on teardown. + """ + self._close_callbacks.append(f) + return f + + def close(self): + """Invokes all close callbacks.""" + for cb in self._close_callbacks: + cb() + self._close_callbacks = [] + + @property + def command_path(self): + """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: + rv = "{} {}".format(self.parent.command_path, rv) + return rv.lstrip() + + def find_root(self): + """Finds the outermost context.""" + node = self + while node.parent is not None: + node = node.parent + return node + + def find_object(self, object_type): + """Finds the closest object of a given type.""" + node = self + while node is not None: + if isinstance(node.obj, object_type): + return node.obj + node = node.parent + + def ensure_object(self, object_type): + """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 + + def lookup_default(self, name): + """Looks up the default for a parameter name. This by default + looks into the :attr:`default_map` if available. + """ + if self.default_map is not None: + rv = self.default_map.get(name) + if callable(rv): + rv = rv() + return rv + + def fail(self, message): + """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): + """Aborts the script.""" + raise Abort() + + def exit(self, code=0): + """Exits the application with a given exit code.""" + raise Exit(code) + + def get_usage(self): + """Helper method to get formatted usage string for the current + context and command. + """ + return self.command.get_usage(self) + + def get_help(self): + """Helper method to get formatted help page for the current + context and command. + """ + return self.command.get_help(self) + + def invoke(*args, **kwargs): # noqa: B902 + """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. + + Note that before Click 3.2 keyword arguments were not properly filled + in against the intention of this code and no context was created. For + more information about this change and why it was done in a bugfix + release see :ref:`upgrade-to-3.2`. + """ + self, callback = args[:2] + ctx = self + + # It's also possible to invoke another command which might or + # might not have a callback. In that case we also fill + # in defaults and make a new context for this command. + if isinstance(callback, Command): + other_cmd = callback + callback = other_cmd.callback + ctx = Context(other_cmd, info_name=other_cmd.name, parent=self) + if callback is None: + raise TypeError( + "The given command does not have a callback that can be invoked." + ) + + for param in other_cmd.params: + if param.name not in kwargs and param.expose_value: + kwargs[param.name] = param.get_default(ctx) + + args = args[2:] + with augment_usage_errors(self): + with ctx: + return callback(*args, **kwargs) + + def forward(*args, **kwargs): # noqa: B902 + """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. + """ + self, cmd = args[:2] + + # It's also possible to invoke another command which might or + # might not have a callback. + 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, **kwargs) + + +class BaseCommand(object): + """The base command implements the minimal API contract of commands. + Most code will never use this as it does not implement a lot of useful + functionality but it can act as the direct subclass of alternative + parsing methods that do not depend on the Click parser. + + For instance, this can be used to bridge Click and other systems like + argparse or docopt. + + Because base commands do not implement a lot of the API that other + parts of Click take for granted, they are not supported for all + operations. For instance, they cannot be used with the decorators + usually and they have no built-in callback system. + + .. versionchanged:: 2.0 + Added the `context_settings` parameter. + + :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. + """ + + #: 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, context_settings=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 = context_settings + + def __repr__(self): + return "<{} {}>".format(self.__class__.__name__, self.name) + + def get_usage(self, ctx): + raise NotImplementedError("Base commands cannot get usage") + + def get_help(self, ctx): + raise NotImplementedError("Base commands cannot get help") + + def make_context(self, info_name, args, parent=None, **extra): + """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. + + :param info_name: the info name for this invokation. 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 it's + the name of the script. + :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. + """ + for key, value in iteritems(self.context_settings): + if key not in extra: + extra[key] = value + ctx = Context(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, args): + """Given a context and a list of arguments this creates the parser + and parses the arguments, then modifies the context as necessary. + This is automatically invoked by :meth:`make_context`. + """ + raise NotImplementedError("Base commands do not know how to parse arguments.") + + def invoke(self, ctx): + """Given a context, this invokes the command. The default + implementation is raising a not implemented error. + """ + raise NotImplementedError("Base commands are not invokable by default") + + def main( + self, + args=None, + prog_name=None, + complete_var=None, + standalone_mode=True, + **extra + ): + """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`. + + .. versionadded:: 3.0 + Added the `standalone_mode` flag to control the standalone mode. + + :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 extra: extra keyword arguments are forwarded to the context + constructor. See :class:`Context` for more information. + """ + # If we are in Python 3, we will verify that the environment is + # sane at this point or reject further execution to avoid a + # broken script. + if not PY2: + _verify_python3_env() + else: + _check_for_unicode_literals() + + if args is None: + args = get_os_args() + else: + args = list(args) + + if prog_name is None: + prog_name = make_str( + os.path.basename(sys.argv[0] if sys.argv else __file__) + ) + + # Hook for the Bash completion. This only activates if the Bash + # completion is actually enabled, otherwise this is quite a fast + # noop. + _bashcomplete(self, 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): + echo(file=sys.stderr) + raise Abort() + except ClickException as e: + if not standalone_mode: + raise + e.show() + sys.exit(e.exit_code) + except IOError as e: + if e.errno == errno.EPIPE: + sys.stdout = PacifyFlushWrapper(sys.stdout) + sys.stderr = 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 __call__(self, *args, **kwargs): + """Alias for :meth:`main`.""" + return self.main(*args, **kwargs) + + +class Command(BaseCommand): + """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. + + .. versionchanged:: 2.0 + Added the `context_settings` parameter. + .. versionchanged:: 7.1 + Added the `no_args_is_help` parameter. + + :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: issues a message indicating that + the command is deprecated. + """ + + def __init__( + self, + name, + context_settings=None, + callback=None, + params=None, + help=None, + epilog=None, + short_help=None, + options_metavar="[OPTIONS]", + add_help_option=True, + no_args_is_help=False, + hidden=False, + deprecated=False, + ): + BaseCommand.__init__(self, name, 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 = params or [] + # if a form feed (page break) is found in the help text, truncate help + # text to the content preceding the first form feed + if help and "\f" in help: + help = help.split("\f", 1)[0] + self.help = help + self.epilog = epilog + self.options_metavar = options_metavar + self.short_help = short_help + self.add_help_option = add_help_option + self.no_args_is_help = no_args_is_help + self.hidden = hidden + self.deprecated = deprecated + + def get_usage(self, ctx): + """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): + rv = self.params + help_option = self.get_help_option(ctx) + if help_option is not None: + rv = rv + [help_option] + return rv + + def format_usage(self, ctx, formatter): + """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): + """Returns all the pieces that go into the usage line and returns + it as a list of strings. + """ + rv = [self.options_metavar] + for param in self.get_params(ctx): + rv.extend(param.get_usage_pieces(ctx)) + return rv + + def get_help_option_names(self, ctx): + """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 all_names + + def get_help_option(self, ctx): + """Returns the help option object.""" + help_options = self.get_help_option_names(ctx) + if not help_options or not self.add_help_option: + return + + def show_help(ctx, param, value): + if value and not ctx.resilient_parsing: + echo(ctx.get_help(), color=ctx.color) + ctx.exit() + + return Option( + help_options, + is_flag=True, + is_eager=True, + expose_value=False, + callback=show_help, + help="Show this message and exit.", + ) + + def make_parser(self, ctx): + """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): + """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=45): + """Gets short help for the command or makes it by shortening the + long help string. + """ + return ( + self.short_help + or self.help + and make_default_short_help(self.help, limit) + or "" + ) + + def format_help(self, ctx, formatter): + """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, formatter): + """Writes the help text to the formatter if it exists.""" + if self.help: + formatter.write_paragraph() + with formatter.indentation(): + help_text = self.help + if self.deprecated: + help_text += DEPRECATED_HELP_NOTICE + formatter.write_text(help_text) + elif self.deprecated: + formatter.write_paragraph() + with formatter.indentation(): + formatter.write_text(DEPRECATED_HELP_NOTICE) + + def format_options(self, ctx, formatter): + """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, formatter): + """Writes the epilog into the formatter if it exists.""" + if self.epilog: + formatter.write_paragraph() + with formatter.indentation(): + formatter.write_text(self.epilog) + + def parse_args(self, ctx, args): + if not args and self.no_args_is_help and not ctx.resilient_parsing: + echo(ctx.get_help(), color=ctx.color) + ctx.exit() + + 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( + "Got unexpected extra argument{} ({})".format( + "s" if len(args) != 1 else "", " ".join(map(make_str, args)) + ) + ) + + ctx.args = args + return args + + def invoke(self, ctx): + """Given a context, this invokes the attached callback (if it exists) + in the right way. + """ + _maybe_show_deprecated_notice(self) + if self.callback is not None: + return ctx.invoke(self.callback, **ctx.params) + + +class MultiCommand(Command): + """A multi command is the basic implementation of a command that + dispatches to subcommands. The most common version is the + :class:`Group`. + + :param invoke_without_command: this controls how the multi command itself + is invoked. By default it's only invoked + if a subcommand is provided. + :param no_args_is_help: this controls what happens if no arguments are + provided. This option is enabled by default if + `invoke_without_command` is disabled or disabled + if it's enabled. If enabled this will add + ``--help`` as argument if no arguments are + passed. + :param subcommand_metavar: the string that is used in the documentation + to indicate the subcommand place. + :param chain: if this is set to `True` chaining of multiple subcommands + is enabled. This restricts the form of commands in that + they cannot have optional arguments but it allows + multiple commands to be chained together. + :param result_callback: the result callback to attach to this multi + command. + """ + + allow_extra_args = True + allow_interspersed_args = False + + def __init__( + self, + name=None, + invoke_without_command=False, + no_args_is_help=None, + subcommand_metavar=None, + chain=False, + result_callback=None, + **attrs + ): + Command.__init__(self, name, **attrs) + 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 = SUBCOMMANDS_METAVAR + else: + subcommand_metavar = SUBCOMMAND_METAVAR + self.subcommand_metavar = subcommand_metavar + self.chain = chain + #: The result callback that is stored. This can be set or + #: overridden with the :func:`resultcallback` decorator. + self.result_callback = result_callback + + if self.chain: + for param in self.params: + if isinstance(param, Argument) and not param.required: + raise RuntimeError( + "Multi commands in chain mode cannot have" + " optional arguments." + ) + + def collect_usage_pieces(self, ctx): + rv = Command.collect_usage_pieces(self, ctx) + rv.append(self.subcommand_metavar) + return rv + + def format_options(self, ctx, formatter): + Command.format_options(self, ctx, formatter) + self.format_commands(ctx, formatter) + + def resultcallback(self, replace=False): + """Adds a result callback to the chain 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.resultcallback() + def process_result(result, input): + return result + input + + .. versionadded:: 3.0 + + :param replace: if set to `True` an already existing result + callback will be removed. + """ + + def decorator(f): + old_callback = self.result_callback + if old_callback is None or replace: + self.result_callback = f + return f + + def function(__value, *args, **kwargs): + return f(old_callback(__value, *args, **kwargs), *args, **kwargs) + + self.result_callback = rv = update_wrapper(function, f) + return rv + + return decorator + + def format_commands(self, ctx, formatter): + """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, args): + if not args and self.no_args_is_help and not ctx.resilient_parsing: + echo(ctx.get_help(), color=ctx.color) + ctx.exit() + + rest = Command.parse_args(self, 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): + def _process_result(value): + if self.result_callback is not None: + value = ctx.invoke(self.result_callback, value, **ctx.params) + return value + + if not ctx.protected_args: + # If we are invoked without command the chain flag controls + # how this happens. If we are not in chain mode, the return + # value here is the return value of the command. + # If however we are in chain mode, the return value is the + # return value of the result processor invoked with an empty + # list (which means that no subcommand actually was executed). + if self.invoke_without_command: + if not self.chain: + return Command.invoke(self, ctx) + with ctx: + Command.invoke(self, ctx) + return _process_result([]) + 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) + ctx.invoked_subcommand = cmd_name + Command.invoke(self, 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 + Command.invoke(self, 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) + 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, args): + 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, ctx.args) + ctx.fail("No such command '{}'.".format(original_cmd_name)) + + return cmd_name, cmd, args[1:] + + def get_command(self, ctx, cmd_name): + """Given a context and a command name, this returns a + :class:`Command` object if it exists or returns `None`. + """ + raise NotImplementedError() + + def list_commands(self, ctx): + """Returns a list of subcommand names in the order they should + appear. + """ + return [] + + +class Group(MultiCommand): + """A group allows a command to have subcommands attached. This is the + most common way to implement nesting in Click. + + :param commands: a dictionary of commands. + """ + + def __init__(self, name=None, commands=None, **attrs): + MultiCommand.__init__(self, name, **attrs) + #: the registered subcommands by their exported names. + self.commands = commands or {} + + def add_command(self, cmd, name=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_multicommand(self, name, cmd, register=True) + self.commands[name] = cmd + + def command(self, *args, **kwargs): + """A shortcut decorator for declaring and attaching a command to + the group. This takes the same arguments as :func:`command` but + immediately registers the created command with this instance by + calling into :meth:`add_command`. + """ + from .decorators import command + + def decorator(f): + cmd = command(*args, **kwargs)(f) + self.add_command(cmd) + return cmd + + return decorator + + def group(self, *args, **kwargs): + """A shortcut decorator for declaring and attaching a group to + the group. This takes the same arguments as :func:`group` but + immediately registers the created command with this instance by + calling into :meth:`add_command`. + """ + from .decorators import group + + def decorator(f): + cmd = group(*args, **kwargs)(f) + self.add_command(cmd) + return cmd + + return decorator + + def get_command(self, ctx, cmd_name): + return self.commands.get(cmd_name) + + def list_commands(self, ctx): + return sorted(self.commands) + + +class CommandCollection(MultiCommand): + """A command collection is a multi command that merges multiple multi + commands together into one. This is a straightforward implementation + that accepts a list of different multi commands as sources and + provides all the commands for each of them. + """ + + def __init__(self, name=None, sources=None, **attrs): + MultiCommand.__init__(self, name, **attrs) + #: The list of registered multi commands. + self.sources = sources or [] + + def add_source(self, multi_cmd): + """Adds a new multi command to the chain dispatcher.""" + self.sources.append(multi_cmd) + + def get_command(self, ctx, cmd_name): + for source in self.sources: + rv = source.get_command(ctx, cmd_name) + if rv is not None: + if self.chain: + _check_multicommand(self, cmd_name, rv) + return rv + + def list_commands(self, ctx): + rv = set() + for source in self.sources: + rv.update(source.list_commands(ctx)) + return sorted(rv) + + +class Parameter(object): + 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 later 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 callback that should be executed after the parameter + was matched. This is called as ``fn(ctx, param, + value)`` and needs to return the value. + :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). + :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. + + .. 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=None, + type=None, + required=False, + default=None, + callback=None, + nargs=None, + metavar=None, + expose_value=True, + is_eager=False, + envvar=None, + autocompletion=None, + ): + self.name, self.opts, self.secondary_opts = self._parse_decls( + param_decls or (), expose_value + ) + + self.type = 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 = False + self.expose_value = expose_value + self.default = default + self.is_eager = is_eager + self.metavar = metavar + self.envvar = envvar + self.autocompletion = autocompletion + + def __repr__(self): + return "<{} {}>".format(self.__class__.__name__, self.name) + + @property + def human_readable_name(self): + """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 + + def make_metavar(self): + if self.metavar is not None: + return self.metavar + metavar = self.type.get_metavar(self) + if metavar is None: + metavar = self.type.name.upper() + if self.nargs != 1: + metavar += "..." + return metavar + + def get_default(self, ctx): + """Given a context variable this calculates the default value.""" + # Otherwise go with the regular default. + if callable(self.default): + rv = self.default() + else: + rv = self.default + return self.type_cast_value(ctx, rv) + + def add_to_parser(self, parser, ctx): + pass + + def consume_value(self, ctx, opts): + value = opts.get(self.name) + if value is None: + value = self.value_from_envvar(ctx) + if value is None: + value = ctx.lookup_default(self.name) + return value + + def type_cast_value(self, ctx, value): + """Given a value this runs it properly through the type system. + This automatically handles things like `nargs` and `multiple` as + well as composite types. + """ + if self.type.is_composite: + if self.nargs <= 1: + raise TypeError( + "Attempted to invoke composite type but nargs has" + " been set to {}. This is not supported; nargs" + " needs to be set to a fixed value > 1.".format(self.nargs) + ) + if self.multiple: + return tuple(self.type(x or (), self, ctx) for x in value or ()) + return self.type(value or (), self, ctx) + + def _convert(value, level): + if level == 0: + return self.type(value, self, ctx) + return tuple(_convert(x, level - 1) for x in value or ()) + + return _convert(value, (self.nargs != 1) + bool(self.multiple)) + + def process_value(self, ctx, value): + """Given a value and context this runs the logic to convert the + value as necessary. + """ + # If the value we were given is None we do nothing. This way + # code that calls this can easily figure out if something was + # not provided. Otherwise it would be converted into an empty + # tuple for multiple invocations which is inconvenient. + if value is not None: + return self.type_cast_value(ctx, value) + + def value_is_missing(self, value): + if value is None: + return True + if (self.nargs != 1 or self.multiple) and value == (): + return True + return False + + def full_process_value(self, ctx, value): + value = self.process_value(ctx, value) + + if value is None and not ctx.resilient_parsing: + value = self.get_default(ctx) + + if self.required and self.value_is_missing(value): + raise MissingParameter(ctx=ctx, param=self) + + return value + + def resolve_envvar_value(self, ctx): + if self.envvar is None: + return + if isinstance(self.envvar, (tuple, list)): + for envvar in self.envvar: + rv = os.environ.get(envvar) + if rv is not None: + return rv + else: + rv = os.environ.get(self.envvar) + + if rv != "": + return rv + + def value_from_envvar(self, ctx): + rv = 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, opts, args): + with augment_usage_errors(ctx, param=self): + value = self.consume_value(ctx, opts) + try: + value = self.full_process_value(ctx, value) + except Exception: + if not ctx.resilient_parsing: + raise + value = None + if self.callback is not None: + try: + value = invoke_param_callback(self.callback, ctx, self, value) + except Exception: + if not ctx.resilient_parsing: + raise + + if self.expose_value: + ctx.params[self.name] = value + return value, args + + def get_help_record(self, ctx): + pass + + def get_usage_pieces(self, ctx): + return [] + + def get_error_hint(self, ctx): + """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(repr(x) for x in hint_list) + + +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: controls if the default value should be shown on the + help page. Normally, defaults are not shown. If this + value is a string, it shows the string instead of the + value. This is particularly useful for dynamic options. + :param show_envvar: controls if an environment variable should be shown on + the help page. 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. + :param confirmation_prompt: if set then the value will need to be confirmed + if it was prompted for. + :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_type_name = "option" + + def __init__( + self, + param_decls=None, + show_default=False, + prompt=False, + confirmation_prompt=False, + hide_input=False, + is_flag=None, + flag_value=None, + multiple=False, + count=False, + allow_from_autoenv=True, + type=None, + help=None, + hidden=False, + show_choices=True, + show_envvar=False, + **attrs + ): + default_is_missing = attrs.get("default", _missing) is _missing + Parameter.__init__(self, param_decls, type=type, **attrs) + + if prompt is True: + prompt_text = self.name.replace("_", " ").capitalize() + elif prompt is False: + prompt_text = None + else: + prompt_text = prompt + self.prompt = prompt_text + self.confirmation_prompt = confirmation_prompt + self.hide_input = hide_input + self.hidden = hidden + + # Flags + if is_flag is None: + if flag_value is not None: + is_flag = True + else: + is_flag = bool(self.secondary_opts) + if is_flag and default_is_missing: + self.default = False + if flag_value is None: + flag_value = not self.default + self.is_flag = is_flag + self.flag_value = flag_value + if self.is_flag and isinstance(self.flag_value, bool) and type in [None, bool]: + self.type = BOOL + self.is_bool_flag = True + else: + self.is_bool_flag = False + + # Counting + self.count = count + if count: + if type is None: + self.type = IntRange(min=0) + if default_is_missing: + self.default = 0 + + self.multiple = multiple + 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 + + # Sanity check for stuff we don't support + if __debug__: + if self.nargs < 0: + raise TypeError("Options cannot have nargs < 0") + if self.prompt and self.is_flag and not self.is_bool_flag: + raise TypeError("Cannot prompt for flags that are not bools.") + if not self.is_bool_flag and self.secondary_opts: + raise TypeError("Got secondary option for non boolean flag.") + if self.is_bool_flag and self.hide_input and self.prompt is not None: + raise TypeError("Hidden input does not work with boolean flag prompts.") + if self.count: + if self.multiple: + raise TypeError( + "Options cannot be multiple and count at the same time." + ) + elif self.is_flag: + raise TypeError( + "Options cannot be count and flags at the same time." + ) + + def _parse_decls(self, decls, expose_value): + opts = [] + secondary_opts = [] + name = None + possible_names = [] + + for decl in decls: + if isidentifier(decl): + if name is not None: + raise TypeError("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()) + 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 isidentifier(name): + name = None + + if name is None: + if not expose_value: + return None, opts, secondary_opts + raise TypeError("Could not determine name for option") + + if not opts and not secondary_opts: + raise TypeError( + "No options defined but a name was passed ({}). Did you" + " mean to declare an argument instead of an option?".format(name) + ) + + return name, opts, secondary_opts + + def add_to_parser(self, parser, ctx): + kwargs = { + "dest": self.name, + "nargs": self.nargs, + "obj": self, + } + + if self.multiple: + action = "append" + elif self.count: + action = "count" + else: + action = "store" + + if self.is_flag: + kwargs.pop("nargs", None) + action_const = "{}_const".format(action) + if self.is_bool_flag and self.secondary_opts: + parser.add_option(self.opts, action=action_const, const=True, **kwargs) + parser.add_option( + self.secondary_opts, action=action_const, const=False, **kwargs + ) + else: + parser.add_option( + self.opts, action=action_const, const=self.flag_value, **kwargs + ) + else: + kwargs["action"] = action + parser.add_option(self.opts, **kwargs) + + def get_help_record(self, ctx): + if self.hidden: + return + any_prefix_is_slash = [] + + def _write_opts(opts): + rv, any_slashes = join_options(opts) + if any_slashes: + any_prefix_is_slash[:] = [True] + if not self.is_flag and not self.count: + rv += " {}".format(self.make_metavar()) + return rv + + rv = [_write_opts(self.opts)] + if self.secondary_opts: + rv.append(_write_opts(self.secondary_opts)) + + help = self.help or "" + extra = [] + if self.show_envvar: + envvar = self.envvar + if envvar is None: + if self.allow_from_autoenv and ctx.auto_envvar_prefix is not None: + envvar = "{}_{}".format(ctx.auto_envvar_prefix, self.name.upper()) + if envvar is not None: + extra.append( + "env var: {}".format( + ", ".join(str(d) for d in envvar) + if isinstance(envvar, (list, tuple)) + else envvar + ) + ) + if self.default is not None and (self.show_default or ctx.show_default): + if isinstance(self.show_default, string_types): + default_string = "({})".format(self.show_default) + elif isinstance(self.default, (list, tuple)): + default_string = ", ".join(str(d) for d in self.default) + elif inspect.isfunction(self.default): + default_string = "(dynamic)" + else: + default_string = self.default + extra.append("default: {}".format(default_string)) + + if self.required: + extra.append("required") + if extra: + help = "{}[{}]".format( + "{} ".format(help) if help else "", "; ".join(extra) + ) + + return ("; " if any_prefix_is_slash else " / ").join(rv), help + + def get_default(self, ctx): + # 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 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 param.flag_value + return None + return Parameter.get_default(self, ctx) + + def prompt_for_value(self, ctx): + """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. + """ + # 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) + + 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), + ) + + def resolve_envvar_value(self, ctx): + rv = Parameter.resolve_envvar_value(self, ctx) + if rv is not None: + return rv + if self.allow_from_autoenv and ctx.auto_envvar_prefix is not None: + envvar = "{}_{}".format(ctx.auto_envvar_prefix, self.name.upper()) + return os.environ.get(envvar) + + def value_from_envvar(self, ctx): + rv = self.resolve_envvar_value(ctx) + if rv is None: + return None + value_depth = (self.nargs != 1) + bool(self.multiple) + if value_depth > 0 and rv is not None: + rv = self.type.split_envvar_value(rv) + if self.multiple and self.nargs != 1: + rv = batch(rv, self.nargs) + return rv + + def full_process_value(self, ctx, value): + if value is None and self.prompt is not None and not ctx.resilient_parsing: + return self.prompt_for_value(ctx) + return Parameter.full_process_value(self, ctx, value) + + +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 parameter constructor. + """ + + param_type_name = "argument" + + def __init__(self, param_decls, required=None, **attrs): + if required is None: + if attrs.get("default") is not None: + required = False + else: + required = attrs.get("nargs", 1) > 0 + Parameter.__init__(self, param_decls, required=required, **attrs) + if self.default is not None and self.nargs < 0: + raise TypeError( + "nargs=-1 in combination with a default value is not supported." + ) + + @property + def human_readable_name(self): + if self.metavar is not None: + return self.metavar + return self.name.upper() + + def make_metavar(self): + if self.metavar is not None: + return self.metavar + var = self.type.get_metavar(self) + if not var: + var = self.name.upper() + if not self.required: + var = "[{}]".format(var) + if self.nargs != 1: + var += "..." + return var + + def _parse_decls(self, decls, expose_value): + if not decls: + if not expose_value: + return None, [], [] + raise TypeError("Could not determine name for argument") + if len(decls) == 1: + name = arg = decls[0] + name = name.replace("-", "_").lower() + else: + raise TypeError( + "Arguments take exactly one parameter declaration, got" + " {}".format(len(decls)) + ) + return name, [arg], [] + + def get_usage_pieces(self, ctx): + return [self.make_metavar()] + + def get_error_hint(self, ctx): + return repr(self.make_metavar()) + + def add_to_parser(self, parser, ctx): + parser.add_argument(dest=self.name, nargs=self.nargs, obj=self) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click/decorators.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click/decorators.py new file mode 100644 index 0000000..c7b5af6 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click/decorators.py @@ -0,0 +1,333 @@ +import inspect +import sys +from functools import update_wrapper + +from ._compat import iteritems +from ._unicodefun import _check_for_unicode_literals +from .core import Argument +from .core import Command +from .core import Group +from .core import Option +from .globals import get_current_context +from .utils import echo + + +def pass_context(f): + """Marks a callback as wanting to receive the current context + object as first argument. + """ + + def new_func(*args, **kwargs): + return f(get_current_context(), *args, **kwargs) + + return update_wrapper(new_func, f) + + +def pass_obj(f): + """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, **kwargs): + return f(get_current_context().obj, *args, **kwargs) + + return update_wrapper(new_func, f) + + +def make_pass_decorator(object_type, ensure=False): + """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): + def new_func(*args, **kwargs): + ctx = get_current_context() + 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" + " object of type '{}' existing".format(object_type.__name__) + ) + return ctx.invoke(f, obj, *args, **kwargs) + + return update_wrapper(new_func, f) + + return decorator + + +def _make_command(f, name, attrs, cls): + if isinstance(f, Command): + raise TypeError("Attempted to convert a callback into a command twice.") + try: + params = f.__click_params__ + params.reverse() + del f.__click_params__ + except AttributeError: + params = [] + help = attrs.get("help") + if help is None: + help = inspect.getdoc(f) + if isinstance(help, bytes): + help = help.decode("utf-8") + else: + help = inspect.cleandoc(help) + attrs["help"] = help + _check_for_unicode_literals() + return cls( + name=name or f.__name__.lower().replace("_", "-"), + callback=f, + params=params, + **attrs + ) + + +def command(name=None, cls=None, **attrs): + 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 with + underscores replaced by dashes. If you want to change that, you can + pass the intended name as the first argument. + + All keyword arguments are forwarded to the underlying command class. + + 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. This defaults to the function + name with underscores replaced by dashes. + :param cls: the command class to instantiate. This defaults to + :class:`Command`. + """ + if cls is None: + cls = Command + + def decorator(f): + cmd = _make_command(f, name, attrs, cls) + cmd.__doc__ = f.__doc__ + return cmd + + return decorator + + +def group(name=None, **attrs): + """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`. + """ + attrs.setdefault("cls", Group) + return command(name, **attrs) + + +def _param_memo(f, param): + if isinstance(f, Command): + f.params.append(param) + else: + if not hasattr(f, "__click_params__"): + f.__click_params__ = [] + f.__click_params__.append(param) + + +def argument(*param_decls, **attrs): + """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. + + :param cls: the argument class to instantiate. This defaults to + :class:`Argument`. + """ + + def decorator(f): + ArgumentClass = attrs.pop("cls", Argument) + _param_memo(f, ArgumentClass(param_decls, **attrs)) + return f + + return decorator + + +def option(*param_decls, **attrs): + """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. + + :param cls: the option class to instantiate. This defaults to + :class:`Option`. + """ + + def decorator(f): + # Issue 926, copy attrs, so pre-defined options can re-use the same cls= + option_attrs = attrs.copy() + + if "help" in option_attrs: + option_attrs["help"] = inspect.cleandoc(option_attrs["help"]) + OptionClass = option_attrs.pop("cls", Option) + _param_memo(f, OptionClass(param_decls, **option_attrs)) + return f + + return decorator + + +def confirmation_option(*param_decls, **attrs): + """Shortcut for confirmation prompts that can be ignored by passing + ``--yes`` as parameter. + + This is equivalent to decorating a function with :func:`option` with + the following parameters:: + + def callback(ctx, param, value): + if not value: + ctx.abort() + + @click.command() + @click.option('--yes', is_flag=True, callback=callback, + expose_value=False, prompt='Do you want to continue?') + def dropdb(): + pass + """ + + def decorator(f): + def callback(ctx, param, value): + if not value: + ctx.abort() + + attrs.setdefault("is_flag", True) + attrs.setdefault("callback", callback) + attrs.setdefault("expose_value", False) + attrs.setdefault("prompt", "Do you want to continue?") + attrs.setdefault("help", "Confirm the action without prompting.") + return option(*(param_decls or ("--yes",)), **attrs)(f) + + return decorator + + +def password_option(*param_decls, **attrs): + """Shortcut for password prompts. + + This is equivalent to decorating a function with :func:`option` with + the following parameters:: + + @click.command() + @click.option('--password', prompt=True, confirmation_prompt=True, + hide_input=True) + def changeadmin(password): + pass + """ + + def decorator(f): + attrs.setdefault("prompt", True) + attrs.setdefault("confirmation_prompt", True) + attrs.setdefault("hide_input", True) + return option(*(param_decls or ("--password",)), **attrs)(f) + + return decorator + + +def version_option(version=None, *param_decls, **attrs): + """Adds a ``--version`` option which immediately ends the program + printing out the version number. This is implemented as an eager + option that prints the version and exits the program in the callback. + + :param version: the version number to show. If not provided Click + attempts an auto discovery via setuptools. + :param prog_name: the name of the program (defaults to autodetection) + :param message: custom message to show instead of the default + (``'%(prog)s, version %(version)s'``) + :param others: everything else is forwarded to :func:`option`. + """ + if version is None: + if hasattr(sys, "_getframe"): + module = sys._getframe(1).f_globals.get("__name__") + else: + module = "" + + def decorator(f): + prog_name = attrs.pop("prog_name", None) + message = attrs.pop("message", "%(prog)s, version %(version)s") + + def callback(ctx, param, value): + if not value or ctx.resilient_parsing: + return + prog = prog_name + if prog is None: + prog = ctx.find_root().info_name + ver = version + if ver is None: + try: + import pkg_resources + except ImportError: + pass + else: + for dist in pkg_resources.working_set: + scripts = dist.get_entry_map().get("console_scripts") or {} + for _, entry_point in iteritems(scripts): + if entry_point.module_name == module: + ver = dist.version + break + if ver is None: + raise RuntimeError("Could not determine version") + echo(message % {"prog": prog, "version": ver}, color=ctx.color) + ctx.exit() + + attrs.setdefault("is_flag", True) + attrs.setdefault("expose_value", False) + attrs.setdefault("is_eager", True) + attrs.setdefault("help", "Show the version and exit.") + attrs["callback"] = callback + return option(*(param_decls or ("--version",)), **attrs)(f) + + return decorator + + +def help_option(*param_decls, **attrs): + """Adds a ``--help`` option which immediately ends the program + printing out the help page. This is usually unnecessary to add as + this is added by default to all commands unless suppressed. + + Like :func:`version_option`, this is implemented as eager option that + prints in the callback and exits. + + All arguments are forwarded to :func:`option`. + """ + + def decorator(f): + def callback(ctx, param, value): + if value and not ctx.resilient_parsing: + echo(ctx.get_help(), color=ctx.color) + ctx.exit() + + attrs.setdefault("is_flag", True) + attrs.setdefault("expose_value", False) + attrs.setdefault("help", "Show this message and exit.") + attrs.setdefault("is_eager", True) + attrs["callback"] = callback + return option(*(param_decls or ("--help",)), **attrs)(f) + + return decorator diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click/exceptions.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click/exceptions.py new file mode 100644 index 0000000..592ee38 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click/exceptions.py @@ -0,0 +1,253 @@ +from ._compat import filename_to_ui +from ._compat import get_text_stderr +from ._compat import PY2 +from .utils import echo + + +def _join_param_hints(param_hint): + if isinstance(param_hint, (tuple, list)): + 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): + ctor_msg = message + if PY2: + if ctor_msg is not None: + ctor_msg = ctor_msg.encode("utf-8") + Exception.__init__(self, ctor_msg) + self.message = message + + def format_message(self): + return self.message + + def __str__(self): + return self.message + + if PY2: + __unicode__ = __str__ + + def __str__(self): + return self.message.encode("utf-8") + + def show(self, file=None): + if file is None: + file = get_text_stderr() + echo("Error: {}".format(self.format_message()), file=file) + + +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, ctx=None): + ClickException.__init__(self, message) + self.ctx = ctx + self.cmd = self.ctx.command if self.ctx else None + + def show(self, file=None): + if file is None: + file = get_text_stderr() + color = None + hint = "" + if self.cmd is not None and self.cmd.get_help_option(self.ctx) is not None: + hint = "Try '{} {}' for help.\n".format( + self.ctx.command_path, self.ctx.help_option_names[0] + ) + if self.ctx is not None: + color = self.ctx.color + echo("{}\n{}".format(self.ctx.get_usage(), hint), file=file, color=color) + echo("Error: {}".format(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, ctx=None, param=None, param_hint=None): + UsageError.__init__(self, message, ctx) + self.param = param + self.param_hint = param_hint + + def format_message(self): + 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) + else: + return "Invalid value: {}".format(self.message) + param_hint = _join_param_hints(param_hint) + + return "Invalid value for {}: {}".format(param_hint, 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=None, ctx=None, param=None, param_hint=None, param_type=None + ): + BadParameter.__init__(self, message, ctx, param, param_hint) + self.param_type = param_type + + def format_message(self): + 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) + else: + param_hint = None + param_hint = _join_param_hints(param_hint) + + 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(self.param) + if msg_extra: + if msg: + msg += ". {}".format(msg_extra) + else: + msg = msg_extra + + return "Missing {}{}{}{}".format( + param_type, + " {}".format(param_hint) if param_hint else "", + ". " if msg else ".", + msg or "", + ) + + def __str__(self): + if self.message is None: + param_name = self.param.name if self.param else None + return "missing parameter: {}".format(param_name) + else: + return self.message + + if PY2: + __unicode__ = __str__ + + def __str__(self): + return self.__unicode__().encode("utf-8") + + +class NoSuchOption(UsageError): + """Raised if click attempted to handle an option that does not + exist. + + .. versionadded:: 4.0 + """ + + def __init__(self, option_name, message=None, possibilities=None, ctx=None): + if message is None: + message = "no such option: {}".format(option_name) + UsageError.__init__(self, message, ctx) + self.option_name = option_name + self.possibilities = possibilities + + def format_message(self): + bits = [self.message] + if self.possibilities: + if len(self.possibilities) == 1: + bits.append("Did you mean {}?".format(self.possibilities[0])) + else: + possibilities = sorted(self.possibilities) + bits.append("(Possible options: {})".format(", ".join(possibilities))) + return " ".join(bits) + + +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, message, ctx=None): + UsageError.__init__(self, 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 + """ + + def __init__(self, message, ctx=None): + UsageError.__init__(self, message, ctx) + + +class FileError(ClickException): + """Raised if a file cannot be opened.""" + + def __init__(self, filename, hint=None): + ui_filename = filename_to_ui(filename) + if hint is None: + hint = "unknown error" + ClickException.__init__(self, hint) + self.ui_filename = ui_filename + self.filename = filename + + def format_message(self): + return "Could not open file {}: {}".format(self.ui_filename, 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=0): + self.exit_code = code diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click/formatting.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click/formatting.py new file mode 100644 index 0000000..319c7f6 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click/formatting.py @@ -0,0 +1,283 @@ +from contextlib import contextmanager + +from ._compat import term_len +from .parser import split_opt +from .termui import get_terminal_size + +# Can force a width. This is used by the test system +FORCED_WIDTH = None + + +def measure_table(rows): + widths = {} + 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, col_count): + for row in rows: + row = tuple(row) + yield row + ("",) * (col_count - len(row)) + + +def wrap_text( + text, width=78, initial_indent="", subsequent_indent="", preserve_paragraphs=False +): + """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 = [] + buf = [] + indent = None + + def _flush_par(): + 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(object): + """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=2, width=None, max_width=None): + 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(get_terminal_size()[0], max_width) - 2, 50) + self.width = width + self.current_indent = 0 + self.buffer = [] + + def write(self, string): + """Writes a unicode string into the internal buffer.""" + self.buffer.append(string) + + def indent(self): + """Increases the indentation.""" + self.current_indent += self.indent_increment + + def dedent(self): + """Decreases the indentation.""" + self.current_indent -= self.indent_increment + + def write_usage(self, prog, args="", prefix="Usage: "): + """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. + """ + usage_prefix = "{:>{w}}{} ".format(prefix, prog, w=self.current_indent) + 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): + """Writes a heading into the buffer.""" + self.write("{:>{w}}{}:\n".format("", heading, w=self.current_indent)) + + def write_paragraph(self): + """Writes a paragraph into the buffer.""" + if self.buffer: + self.write("\n") + + def write_text(self, text): + """Writes re-indented text into the buffer. This rewraps and + preserves paragraphs. + """ + text_width = max(self.width - self.current_indent, 11) + indent = " " * self.current_indent + self.write( + wrap_text( + text, + text_width, + initial_indent=indent, + subsequent_indent=indent, + preserve_paragraphs=True, + ) + ) + self.write("\n") + + def write_dl(self, rows, col_max=30, col_spacing=2): + """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("{:>{w}}{}".format("", first, w=self.current_indent)) + 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("{}\n".format(lines[0])) + + for line in lines[1:]: + self.write( + "{:>{w}}{}\n".format( + "", line, w=first_col + self.current_indent + ) + ) + + if len(lines) > 1: + # separate long help from next option + self.write("\n") + else: + self.write("\n") + + @contextmanager + def section(self, name): + """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): + """A context manager that increases the indentation.""" + self.indent() + try: + yield + finally: + self.dedent() + + def getvalue(self): + """Returns the buffer contents.""" + return "".join(self.buffer) + + +def join_options(options): + """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]) + + rv = ", ".join(x[1] for x in rv) + return rv, any_prefix_is_slash diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click/globals.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click/globals.py new file mode 100644 index 0000000..1649f9a --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click/globals.py @@ -0,0 +1,47 @@ +from threading import local + +_local = local() + + +def get_current_context(silent=False): + """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 _local.stack[-1] + except (AttributeError, IndexError): + if not silent: + raise RuntimeError("There is no active click context.") + + +def push_context(ctx): + """Pushes a new context to the current stack.""" + _local.__dict__.setdefault("stack", []).append(ctx) + + +def pop_context(): + """Removes the top level from the stack.""" + _local.stack.pop() + + +def resolve_color_default(color=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 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click/parser.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click/parser.py new file mode 100644 index 0000000..f43ebfe --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click/parser.py @@ -0,0 +1,428 @@ +# -*- coding: utf-8 -*- +""" +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. +""" +import re +from collections import deque + +from .exceptions import BadArgumentUsage +from .exceptions import BadOptionUsage +from .exceptions import NoSuchOption +from .exceptions import UsageError + + +def _unpack_args(args, nargs_spec): + """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 = [] + spos = None + + def _fetch(c): + 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 == 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 _error_opt_args(nargs, opt): + if nargs == 1: + raise BadOptionUsage(opt, "{} option requires an argument".format(opt)) + raise BadOptionUsage(opt, "{} option requires {} arguments".format(opt, nargs)) + + +def split_opt(opt): + 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, ctx): + if ctx is None or ctx.token_normalize_func is None: + return opt + prefix, opt = split_opt(opt) + return prefix + ctx.token_normalize_func(opt) + + +def split_arg_string(string): + """Given an argument string this attempts to split it into small parts.""" + rv = [] + for match in re.finditer( + r"('([^'\\]*(?:\\.[^'\\]*)*)'|\"([^\"\\]*(?:\\.[^\"\\]*)*)\"|\S+)\s*", + string, + re.S, + ): + arg = match.group().strip() + if arg[:1] == arg[-1:] and arg[:1] in "\"'": + arg = arg[1:-1].encode("ascii", "backslashreplace").decode("unicode-escape") + try: + arg = type(string)(arg) + except UnicodeError: + pass + rv.append(arg) + return rv + + +class Option(object): + def __init__(self, opts, dest, action=None, nargs=1, const=None, obj=None): + self._short_opts = [] + self._long_opts = [] + self.prefixes = set() + + for opt in opts: + prefix, value = split_opt(opt) + if not prefix: + raise ValueError("Invalid start character for option ({})".format(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): + return self.action in ("store", "append") + + def process(self, value, state): + if self.action == "store": + state.opts[self.dest] = value + elif self.action == "store_const": + state.opts[self.dest] = self.const + elif self.action == "append": + state.opts.setdefault(self.dest, []).append(value) + elif self.action == "append_const": + state.opts.setdefault(self.dest, []).append(self.const) + elif self.action == "count": + state.opts[self.dest] = state.opts.get(self.dest, 0) + 1 + else: + raise ValueError("unknown action '{}'".format(self.action)) + state.order.append(self.obj) + + +class Argument(object): + def __init__(self, dest, nargs=1, obj=None): + self.dest = dest + self.nargs = nargs + self.obj = obj + + def process(self, value, state): + if self.nargs > 1: + holes = sum(1 for x in value if x is None) + if holes == len(value): + value = None + elif holes != 0: + raise BadArgumentUsage( + "argument {} takes {} values".format(self.dest, self.nargs) + ) + state.opts[self.dest] = value + state.order.append(self.obj) + + +class ParsingState(object): + def __init__(self, rargs): + self.opts = {} + self.largs = [] + self.rargs = rargs + self.order = [] + + +class OptionParser(object): + """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. + """ + + def __init__(self, ctx=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 = 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 = 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 = {} + self._long_opt = {} + self._opt_prefixes = {"-", "--"} + self._args = [] + + def add_option(self, opts, dest, action=None, nargs=1, const=None, obj=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``, ``appnd_const`` or ``count``. + + The `obj` can be used to identify the option in the order list + that is returned from the parser. + """ + if obj is None: + obj = dest + opts = [normalize_opt(opt, self.ctx) for opt in opts] + option = Option(opts, dest, action=action, nargs=nargs, const=const, obj=obj) + 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, dest, nargs=1, obj=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. + """ + if obj is None: + obj = dest + self._args.append(Argument(dest=dest, nargs=nargs, obj=obj)) + + def parse_args(self, args): + """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): + 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): + 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, explicit_value, state): + if opt not in self._long_opt: + possibilities = [word for word in self._long_opt if word.startswith(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) + + nargs = option.nargs + if len(state.rargs) < nargs: + _error_opt_args(nargs, opt) + elif nargs == 1: + value = state.rargs.pop(0) + else: + value = tuple(state.rargs[:nargs]) + del state.rargs[:nargs] + + elif explicit_value is not None: + raise BadOptionUsage(opt, "{} option does not take a value".format(opt)) + + else: + value = None + + option.process(value, state) + + def _match_short_opt(self, arg, state): + stop = False + i = 1 + prefix = arg[0] + unknown_options = [] + + for ch in arg[1:]: + opt = normalize_opt(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 + + nargs = option.nargs + if len(state.rargs) < nargs: + _error_opt_args(nargs, opt) + elif nargs == 1: + value = state.rargs.pop(0) + else: + value = tuple(state.rargs[:nargs]) + del state.rargs[:nargs] + + else: + value = None + + option.process(value, state) + + if stop: + break + + # If we got any unknown options we re-combinate 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("{}{}".format(prefix, "".join(unknown_options))) + + def _process_opts(self, arg, state): + 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: + return self._match_short_opt(arg, state) + if not self.ignore_unknown_options: + raise + state.largs.append(arg) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click/termui.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click/termui.py new file mode 100644 index 0000000..02ef9e9 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click/termui.py @@ -0,0 +1,681 @@ +import inspect +import io +import itertools +import os +import struct +import sys + +from ._compat import DEFAULT_COLUMNS +from ._compat import get_winterm_size +from ._compat import isatty +from ._compat import raw_input +from ._compat import string_types +from ._compat import strip_ansi +from ._compat import text_type +from ._compat import WIN +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 Path +from .utils import echo +from .utils import LazyFile + +# The prompt functions to use. The doc tools currently override these +# functions to customize how they work. +visible_prompt_func = raw_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): + import getpass + + return getpass.getpass(prompt) + + +def _build_prompt( + text, suffix, show_default=False, default=None, show_choices=True, type=None +): + prompt = text + if type is not None and show_choices and isinstance(type, Choice): + prompt += " ({})".format(", ".join(map(str, type.choices))) + if default is not None and show_default: + prompt = "{} [{}]".format(prompt, _format_default(default)) + return prompt + suffix + + +def _format_default(default): + if isinstance(default, (io.IOBase, LazyFile)) and hasattr(default, "name"): + return default.name + + return default + + +def prompt( + text, + default=None, + hide_input=False, + confirmation_prompt=False, + type=None, + value_proc=None, + prompt_suffix=": ", + show_default=True, + err=False, + show_choices=True, +): + """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 a interrupt signal, this + function will catch it and raise a :exc:`Abort` exception. + + .. 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. + + :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: asks for confirmation for the value. + :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): ". + """ + result = None + + def prompt_func(text): + 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, nl=False, err=err) + 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() + + if value_proc is None: + value_proc = convert_type(type, default) + + prompt = _build_prompt( + text, prompt_suffix, show_default, default, show_choices, type + ) + + while 1: + while 1: + value = prompt_func(prompt) + if value: + break + elif default is not None: + if isinstance(value_proc, Path): + # validate Path default value(exists, dir_okay etc.) + value = default + break + return default + try: + result = value_proc(value) + except UsageError as e: + echo("Error: {}".format(e.message), err=err) # noqa: B306 + continue + if not confirmation_prompt: + return result + while 1: + value2 = prompt_func("Repeat for confirmation: ") + if value2: + break + if value == value2: + return result + echo("Error: the two entered values do not match", err=err) + + +def confirm( + text, default=False, abort=False, prompt_suffix=": ", show_default=True, err=False +): + """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. + + .. versionadded:: 4.0 + Added the `err` parameter. + + :param text: the question to ask. + :param default: the default for the prompt. + :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. + """ + prompt = _build_prompt( + text, prompt_suffix, show_default, "Y/n" if default else "y/N" + ) + while 1: + try: + # Write the prompt separately so that we get nice + # coloring through colorama on Windows + echo(prompt, nl=False, err=err) + value = visible_prompt_func("").lower().strip() + except (KeyboardInterrupt, EOFError): + raise Abort() + if value in ("y", "yes"): + rv = True + elif value in ("n", "no"): + rv = False + elif value == "": + rv = default + else: + echo("Error: invalid input", err=err) + continue + break + if abort and not rv: + raise Abort() + return rv + + +def get_terminal_size(): + """Returns the current size of the terminal as tuple in the form + ``(width, height)`` in columns and rows. + """ + # If shutil has get_terminal_size() (Python 3.3 and later) use that + if sys.version_info >= (3, 3): + import shutil + + shutil_get_terminal_size = getattr(shutil, "get_terminal_size", None) + if shutil_get_terminal_size: + sz = shutil_get_terminal_size() + return sz.columns, sz.lines + + # We provide a sensible default for get_winterm_size() when being invoked + # inside a subprocess. Without this, it would not provide a useful input. + if get_winterm_size is not None: + size = get_winterm_size() + if size == (0, 0): + return (79, 24) + else: + return size + + def ioctl_gwinsz(fd): + try: + import fcntl + import termios + + cr = struct.unpack("hh", fcntl.ioctl(fd, termios.TIOCGWINSZ, "1234")) + except Exception: + return + return cr + + cr = ioctl_gwinsz(0) or ioctl_gwinsz(1) or ioctl_gwinsz(2) + if not cr: + try: + fd = os.open(os.ctermid(), os.O_RDONLY) + try: + cr = ioctl_gwinsz(fd) + finally: + os.close(fd) + except Exception: + pass + if not cr or not cr[0] or not cr[1]: + cr = (os.environ.get("LINES", 25), os.environ.get("COLUMNS", DEFAULT_COLUMNS)) + return int(cr[1]), int(cr[0]) + + +def echo_via_pager(text_or_generator, color=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 = text_or_generator() + elif isinstance(text_or_generator, string_types): + i = [text_or_generator] + else: + i = iter(text_or_generator) + + # convert every element of i to a text type if necessary + text_generator = (el if isinstance(el, string_types) else text_type(el) for el in i) + + from ._termui_impl import pager + + return pager(itertools.chain(text_generator, "\n"), color) + + +def progressbar( + iterable=None, + length=None, + label=None, + show_eta=True, + show_percent=None, + show_pos=False, + item_show_func=None, + fill_char="#", + empty_char="-", + bar_template="%(label)s [%(bar)s] %(info)s", + info_sep=" ", + width=36, + file=None, + color=None, +): + """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) + + .. versionadded:: 2.0 + + .. versionadded:: 4.0 + Added the `color` parameter. Added a `update` method to the + progressbar object. + + :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 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 the current item + next to the progress bar. Note that the current + item can be `None`! + :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. + """ + from ._termui_impl import ProgressBar + + color = resolve_color_default(color) + return ProgressBar( + iterable=iterable, + length=length, + 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, + ) + + +def clear(): + """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 + # If we're on Windows and we don't have colorama available, then we + # clear the screen by shelling out. Otherwise we can use an escape + # sequence. + if WIN: + os.system("cls") + else: + sys.stdout.write("\033[2J\033[1;1H") + + +def style( + text, + fg=None, + bg=None, + bold=None, + dim=None, + underline=None, + blink=None, + reverse=None, + reset=True, +): + """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')) + + 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) + + .. versionadded:: 2.0 + + .. versionadded:: 7.0 + Added support for bright colors. + + :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 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 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. + """ + bits = [] + if fg: + try: + bits.append("\033[{}m".format(_ansi_colors[fg])) + except KeyError: + raise TypeError("Unknown color '{}'".format(fg)) + if bg: + try: + bits.append("\033[{}m".format(_ansi_colors[bg] + 10)) + except KeyError: + raise TypeError("Unknown color '{}'".format(bg)) + if bold is not None: + bits.append("\033[{}m".format(1 if bold else 22)) + if dim is not None: + bits.append("\033[{}m".format(2 if dim else 22)) + if underline is not None: + bits.append("\033[{}m".format(4 if underline else 24)) + if blink is not None: + bits.append("\033[{}m".format(5 if blink else 25)) + if reverse is not None: + bits.append("\033[{}m".format(7 if reverse else 27)) + bits.append(text) + if reset: + bits.append(_ansi_reset_all) + return "".join(bits) + + +def unstyle(text): + """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=None, file=None, nl=True, err=False, color=None, **styles): + """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. + + .. versionadded:: 2.0 + """ + if message is not None: + message = style(message, **styles) + return echo(message, file=file, nl=nl, err=err, color=color) + + +def edit( + text=None, editor=None, env=None, require_save=True, extension=".txt", filename=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. + """ + from ._termui_impl import Editor + + editor = Editor( + editor=editor, env=env, require_save=require_save, extension=extension + ) + if filename is None: + return editor.edit(text) + editor.edit_file(filename) + + +def launch(url, wait=False, locate=False): + """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: waits for the program to stop. + :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 = None + + +def getchar(echo=False): + """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. + """ + f = _getchar + if f is None: + from ._termui_impl import getchar as f + return f(echo) + + +def raw_terminal(): + from ._termui_impl import raw_terminal as f + + return f() + + +def pause(info="Press any key to continue ...", err=False): + """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 info string to print before pausing. + :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 + try: + if info: + echo(info, nl=False, err=err) + try: + getchar() + except (KeyboardInterrupt, EOFError): + pass + finally: + if info: + echo(err=err) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click/testing.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click/testing.py new file mode 100644 index 0000000..a3dba3b --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click/testing.py @@ -0,0 +1,382 @@ +import contextlib +import os +import shlex +import shutil +import sys +import tempfile + +from . import formatting +from . import termui +from . import utils +from ._compat import iteritems +from ._compat import PY2 +from ._compat import string_types + + +if PY2: + from cStringIO import StringIO +else: + import io + from ._compat import _find_binary_reader + + +class EchoingStdin(object): + def __init__(self, input, output): + self._input = input + self._output = output + + def __getattr__(self, x): + return getattr(self._input, x) + + def _echo(self, rv): + self._output.write(rv) + return rv + + def read(self, n=-1): + return self._echo(self._input.read(n)) + + def readline(self, n=-1): + return self._echo(self._input.readline(n)) + + def readlines(self): + return [self._echo(x) for x in self._input.readlines()] + + def __iter__(self): + return iter(self._echo(x) for x in self._input) + + def __repr__(self): + return repr(self._input) + + +def make_input_stream(input, charset): + # Is already an input stream. + if hasattr(input, "read"): + if PY2: + return input + rv = _find_binary_reader(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 not isinstance(input, bytes): + input = input.encode(charset) + if PY2: + return StringIO(input) + return io.BytesIO(input) + + +class Result(object): + """Holds the captured result of an invoked CLI script.""" + + def __init__( + self, runner, stdout_bytes, stderr_bytes, exit_code, exception, exc_info=None + ): + #: The runner that created the result + self.runner = runner + #: The standard output as bytes. + self.stdout_bytes = stdout_bytes + #: The standard error as bytes, or None if not available + self.stderr_bytes = stderr_bytes + #: The exit code as integer. + self.exit_code = exit_code + #: The exception that happened if one did. + self.exception = exception + #: The traceback + self.exc_info = exc_info + + @property + def output(self): + """The (standard) output as unicode string.""" + return self.stdout + + @property + def stdout(self): + """The standard output as unicode string.""" + return self.stdout_bytes.decode(self.runner.charset, "replace").replace( + "\r\n", "\n" + ) + + @property + def stderr(self): + """The standard error as unicode string.""" + if self.stderr_bytes is None: + raise ValueError("stderr not separately captured") + return self.stderr_bytes.decode(self.runner.charset, "replace").replace( + "\r\n", "\n" + ) + + def __repr__(self): + return "<{} {}>".format( + type(self).__name__, repr(self.exception) if self.exception else "okay" + ) + + +class CliRunner(object): + """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. This is + UTF-8 by default and should not be changed currently as + the reporting to Click only works in Python 2 properly. + :param env: a dictionary with environment variables for overriding. + :param echo_stdin: if this is set to `True`, then reading from stdin writes + to stdout. This is useful for showing examples in + some circumstances. Note that regular prompts + will automatically echo the input. + :param mix_stderr: if this is set to `False`, then stdout and stderr are + preserved as independent streams. This is useful for + Unix-philosophy apps that have predictable stdout and + noisy stderr, such that each may be measured + independently + """ + + def __init__(self, charset=None, env=None, echo_stdin=False, mix_stderr=True): + if charset is None: + charset = "utf-8" + self.charset = charset + self.env = env or {} + self.echo_stdin = echo_stdin + self.mix_stderr = mix_stderr + + def get_default_prog_name(self, cli): + """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=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=None, env=None, color=False): + """A context manager that sets up the isolation for invoking of a + command line tool. This sets up stdin 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. + + .. versionadded:: 4.0 + The ``color`` parameter was added. + + :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. + """ + input = make_input_stream(input, self.charset) + + 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) + + if PY2: + bytes_output = StringIO() + if self.echo_stdin: + input = EchoingStdin(input, bytes_output) + sys.stdout = bytes_output + if not self.mix_stderr: + bytes_error = StringIO() + sys.stderr = bytes_error + else: + bytes_output = io.BytesIO() + if self.echo_stdin: + input = EchoingStdin(input, bytes_output) + input = io.TextIOWrapper(input, encoding=self.charset) + sys.stdout = io.TextIOWrapper(bytes_output, encoding=self.charset) + if not self.mix_stderr: + bytes_error = io.BytesIO() + sys.stderr = io.TextIOWrapper(bytes_error, encoding=self.charset) + + if self.mix_stderr: + sys.stderr = sys.stdout + + sys.stdin = input + + def visible_input(prompt=None): + sys.stdout.write(prompt or "") + val = input.readline().rstrip("\r\n") + sys.stdout.write("{}\n".format(val)) + sys.stdout.flush() + return val + + def hidden_input(prompt=None): + sys.stdout.write("{}\n".format(prompt or "")) + sys.stdout.flush() + return input.readline().rstrip("\r\n") + + def _getchar(echo): + char = sys.stdin.read(1) + if echo: + sys.stdout.write(char) + sys.stdout.flush() + return char + + default_color = color + + def should_strip_ansi(stream=None, color=None): + 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 + termui.visible_prompt_func = visible_input + termui.hidden_prompt_func = hidden_input + termui._getchar = _getchar + utils.should_strip_ansi = should_strip_ansi + + old_env = {} + try: + for key, value in iteritems(env): + 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 (bytes_output, not self.mix_stderr and bytes_error) + finally: + for key, value in iteritems(old_env): + 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 + formatting.FORCED_WIDTH = old_forced_width + + def invoke( + self, + cli, + args=None, + input=None, + env=None, + catch_exceptions=True, + color=False, + **extra + ): + """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. + + .. versionadded:: 3.0 + The ``catch_exceptions`` parameter was added. + + .. versionchanged:: 3.0 + The result object now has an `exc_info` attribute with the + traceback if available. + + .. versionadded:: 4.0 + The ``color`` parameter was added. + + :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``. + :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. + """ + exc_info = None + with self.isolation(input=input, env=env, color=color) as outstreams: + exception = None + exit_code = 0 + + if isinstance(args, string_types): + args = shlex.split(args) + + try: + prog_name = extra.pop("prog_name") + except KeyError: + prog_name = self.get_default_prog_name(cli) + + try: + cli.main(args=args or (), prog_name=prog_name, **extra) + except SystemExit as e: + exc_info = sys.exc_info() + exit_code = e.code + if exit_code is None: + exit_code = 0 + + if exit_code != 0: + exception = e + + if not isinstance(exit_code, int): + sys.stdout.write(str(exit_code)) + sys.stdout.write("\n") + exit_code = 1 + + except Exception as e: + if not catch_exceptions: + raise + exception = e + exit_code = 1 + exc_info = sys.exc_info() + finally: + sys.stdout.flush() + stdout = outstreams[0].getvalue() + if self.mix_stderr: + stderr = None + else: + stderr = outstreams[1].getvalue() + + return Result( + runner=self, + stdout_bytes=stdout, + stderr_bytes=stderr, + exit_code=exit_code, + exception=exception, + exc_info=exc_info, + ) + + @contextlib.contextmanager + def isolated_filesystem(self): + """A context manager that creates a temporary folder and changes + the current working directory to it for isolated filesystem tests. + """ + cwd = os.getcwd() + t = tempfile.mkdtemp() + os.chdir(t) + try: + yield t + finally: + os.chdir(cwd) + try: + shutil.rmtree(t) + except (OSError, IOError): # noqa: B014 + pass diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click/types.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click/types.py new file mode 100644 index 0000000..505c39f --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click/types.py @@ -0,0 +1,762 @@ +import os +import stat +from datetime import datetime + +from ._compat import _get_argv_encoding +from ._compat import filename_to_ui +from ._compat import get_filesystem_encoding +from ._compat import get_streerror +from ._compat import open_stream +from ._compat import PY2 +from ._compat import text_type +from .exceptions import BadParameter +from .utils import LazyFile +from .utils import safecall + + +class ParamType(object): + """Helper for converting values through types. The following is + necessary for a valid type: + + * it needs a name + * it needs to pass through None unchanged + * it needs to convert from a string + * it needs to convert its result type through unchanged + (eg: needs to be idempotent) + * it needs to be able to deal with param and context being `None`. + This can be the case when the object is used with prompt + inputs. + """ + + is_composite = False + + #: the descriptive name of this type + name = None + + #: 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 = None + + def __call__(self, value, param=None, ctx=None): + if value is not None: + return self.convert(value, param, ctx) + + def get_metavar(self, param): + """Returns the metavar default for this param if it provides one.""" + + def get_missing_message(self, param): + """Optionally might return extra information about a missing + parameter. + + .. versionadded:: 2.0 + """ + + def convert(self, value, param, ctx): + """Converts the value. This is not invoked for values that are + `None` (the missing value). + """ + return value + + def split_envvar_value(self, rv): + """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, param=None, ctx=None): + """Helper method to fail with an invalid value message.""" + raise BadParameter(message, ctx=ctx, param=param) + + +class CompositeParamType(ParamType): + is_composite = True + + @property + def arity(self): + raise NotImplementedError() + + +class FuncParamType(ParamType): + def __init__(self, func): + self.name = func.__name__ + self.func = func + + def convert(self, value, param, ctx): + try: + return self.func(value) + except ValueError: + try: + value = text_type(value) + except UnicodeError: + value = str(value).decode("utf-8", "replace") + self.fail(value, param, ctx) + + +class UnprocessedParamType(ParamType): + name = "text" + + def convert(self, value, param, ctx): + return value + + def __repr__(self): + return "UNPROCESSED" + + +class StringParamType(ParamType): + name = "text" + + def convert(self, value, param, ctx): + if isinstance(value, bytes): + enc = _get_argv_encoding() + try: + value = value.decode(enc) + except UnicodeError: + fs_enc = get_filesystem_encoding() + 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 value + + def __repr__(self): + return "STRING" + + +class Choice(ParamType): + """The choice type allows a value to be checked against a fixed set + of supported values. All of these values have to be strings. + + You should only pass a list or tuple of choices. Other iterables + (like generators) may lead to surprising results. + + The resulting value will always be one of the originally passed choices + regardless of ``case_sensitive`` or any ``ctx.token_normalize_func`` + being specified. + + See :ref:`choice-opts` for an example. + + :param case_sensitive: Set to false to make choices case + insensitive. Defaults to true. + """ + + name = "choice" + + def __init__(self, choices, case_sensitive=True): + self.choices = choices + self.case_sensitive = case_sensitive + + def get_metavar(self, param): + return "[{}]".format("|".join(self.choices)) + + def get_missing_message(self, param): + return "Choose from:\n\t{}.".format(",\n\t".join(self.choices)) + + def convert(self, value, param, ctx): + # Match through normalization and case sensitivity + # first do token_normalize_func, then lowercase + # preserve original `value` to produce an accurate message in + # `self.fail` + normed_value = value + normed_choices = {choice: choice for choice in self.choices} + + if ctx is not None and ctx.token_normalize_func is not None: + normed_value = ctx.token_normalize_func(value) + normed_choices = { + ctx.token_normalize_func(normed_choice): original + for normed_choice, original in normed_choices.items() + } + + if not self.case_sensitive: + if PY2: + lower = str.lower + else: + lower = str.casefold + + normed_value = lower(normed_value) + normed_choices = { + lower(normed_choice): original + for normed_choice, original in normed_choices.items() + } + + if normed_value in normed_choices: + return normed_choices[normed_value] + + self.fail( + "invalid choice: {}. (choose from {})".format( + value, ", ".join(self.choices) + ), + param, + ctx, + ) + + def __repr__(self): + return "Choice('{}')".format(list(self.choices)) + + +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=None): + self.formats = formats or ["%Y-%m-%d", "%Y-%m-%dT%H:%M:%S", "%Y-%m-%d %H:%M:%S"] + + def get_metavar(self, param): + return "[{}]".format("|".join(self.formats)) + + def _try_to_convert_date(self, value, format): + try: + return datetime.strptime(value, format) + except ValueError: + return None + + def convert(self, value, param, ctx): + # Exact match + for format in self.formats: + dtime = self._try_to_convert_date(value, format) + if dtime: + return dtime + + self.fail( + "invalid datetime format: {}. (choose from {})".format( + value, ", ".join(self.formats) + ) + ) + + def __repr__(self): + return "DateTime" + + +class IntParamType(ParamType): + name = "integer" + + def convert(self, value, param, ctx): + try: + return int(value) + except ValueError: + self.fail("{} is not a valid integer".format(value), param, ctx) + + def __repr__(self): + return "INT" + + +class IntRange(IntParamType): + """A parameter that works similar to :data:`click.INT` but restricts + the value to fit into a range. The default behavior is to fail if the + value falls outside the range, but it can also be silently clamped + between the two edges. + + See :ref:`ranges` for an example. + """ + + name = "integer range" + + def __init__(self, min=None, max=None, clamp=False): + self.min = min + self.max = max + self.clamp = clamp + + def convert(self, value, param, ctx): + rv = IntParamType.convert(self, value, param, ctx) + if self.clamp: + if self.min is not None and rv < self.min: + return self.min + if self.max is not None and rv > self.max: + return self.max + if ( + self.min is not None + and rv < self.min + or self.max is not None + and rv > self.max + ): + if self.min is None: + self.fail( + "{} is bigger than the maximum valid value {}.".format( + rv, self.max + ), + param, + ctx, + ) + elif self.max is None: + self.fail( + "{} is smaller than the minimum valid value {}.".format( + rv, self.min + ), + param, + ctx, + ) + else: + self.fail( + "{} is not in the valid range of {} to {}.".format( + rv, self.min, self.max + ), + param, + ctx, + ) + return rv + + def __repr__(self): + return "IntRange({}, {})".format(self.min, self.max) + + +class FloatParamType(ParamType): + name = "float" + + def convert(self, value, param, ctx): + try: + return float(value) + except ValueError: + self.fail( + "{} is not a valid floating point value".format(value), param, ctx + ) + + def __repr__(self): + return "FLOAT" + + +class FloatRange(FloatParamType): + """A parameter that works similar to :data:`click.FLOAT` but restricts + the value to fit into a range. The default behavior is to fail if the + value falls outside the range, but it can also be silently clamped + between the two edges. + + See :ref:`ranges` for an example. + """ + + name = "float range" + + def __init__(self, min=None, max=None, clamp=False): + self.min = min + self.max = max + self.clamp = clamp + + def convert(self, value, param, ctx): + rv = FloatParamType.convert(self, value, param, ctx) + if self.clamp: + if self.min is not None and rv < self.min: + return self.min + if self.max is not None and rv > self.max: + return self.max + if ( + self.min is not None + and rv < self.min + or self.max is not None + and rv > self.max + ): + if self.min is None: + self.fail( + "{} is bigger than the maximum valid value {}.".format( + rv, self.max + ), + param, + ctx, + ) + elif self.max is None: + self.fail( + "{} is smaller than the minimum valid value {}.".format( + rv, self.min + ), + param, + ctx, + ) + else: + self.fail( + "{} is not in the valid range of {} to {}.".format( + rv, self.min, self.max + ), + param, + ctx, + ) + return rv + + def __repr__(self): + return "FloatRange({}, {})".format(self.min, self.max) + + +class BoolParamType(ParamType): + name = "boolean" + + def convert(self, value, param, ctx): + if isinstance(value, bool): + return bool(value) + value = value.lower() + if value in ("true", "t", "1", "yes", "y"): + return True + elif value in ("false", "f", "0", "no", "n"): + return False + self.fail("{} is not a valid boolean".format(value), param, ctx) + + def __repr__(self): + return "BOOL" + + +class UUIDParameterType(ParamType): + name = "uuid" + + def convert(self, value, param, ctx): + import uuid + + try: + if PY2 and isinstance(value, text_type): + value = value.encode("ascii") + return uuid.UUID(value) + except ValueError: + self.fail("{} is not a valid UUID value".format(value), param, ctx) + + def __repr__(self): + 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. + + Starting with Click 2.0, 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. + """ + + name = "filename" + envvar_list_splitter = os.path.pathsep + + def __init__( + self, mode="r", encoding=None, errors="strict", lazy=None, atomic=False + ): + self.mode = mode + self.encoding = encoding + self.errors = errors + self.lazy = lazy + self.atomic = atomic + + def resolve_lazy_flag(self, value): + if self.lazy is not None: + return self.lazy + if value == "-": + return False + elif "w" in self.mode: + return True + return False + + def convert(self, value, param, ctx): + try: + if hasattr(value, "read") or hasattr(value, "write"): + return value + + lazy = self.resolve_lazy_flag(value) + + if lazy: + f = LazyFile( + value, self.mode, self.encoding, self.errors, atomic=self.atomic + ) + if ctx is not None: + ctx.call_on_close(f.close_intelligently) + return f + + 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 (IOError, OSError) as e: # noqa: B014 + self.fail( + "Could not open file: {}: {}".format( + filename_to_ui(value), get_streerror(e) + ), + param, + ctx, + ) + + +class Path(ParamType): + """The path type is similar to the :class:`File` type but it performs + different checks. First of all, instead of returning an open file + handle it returns just the filename. Secondly, it can perform various + basic checks about what the file or directory should be. + + .. versionchanged:: 6.0 + `allow_dash` was added. + + :param exists: if set to true, the file or directory needs to exist for + this value to be valid. If this is not required and a + file does indeed not exist, then all further checks are + silently skipped. + :param file_okay: controls if a file is a possible value. + :param dir_okay: controls if a directory is a possible value. + :param writable: if true, a writable check is performed. + :param readable: if true, a readable check is performed. + :param resolve_path: if this is true, then the path is fully resolved + before the value is passed onwards. This means + that it's absolute and symlinks are resolved. It + will not expand a tilde-prefix, as this is + supposed to be done by the shell only. + :param allow_dash: If this is set to `True`, a single dash to indicate + standard streams is permitted. + :param path_type: optionally a string type that should be used to + represent the path. The default is `None` which + means the return value will be either bytes or + unicode depending on what makes most sense given the + input data Click deals with. + """ + + envvar_list_splitter = os.path.pathsep + + def __init__( + self, + exists=False, + file_okay=True, + dir_okay=True, + writable=False, + readable=True, + resolve_path=False, + allow_dash=False, + path_type=None, + ): + self.exists = exists + self.file_okay = file_okay + self.dir_okay = dir_okay + self.writable = writable + self.readable = readable + 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 = "file" + self.path_type = "File" + elif self.dir_okay and not self.file_okay: + self.name = "directory" + self.path_type = "Directory" + else: + self.name = "path" + self.path_type = "Path" + + def coerce_path_result(self, rv): + if self.type is not None and not isinstance(rv, self.type): + if self.type is text_type: + rv = rv.decode(get_filesystem_encoding()) + else: + rv = rv.encode(get_filesystem_encoding()) + return rv + + def convert(self, value, param, ctx): + 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( + "{} '{}' does not exist.".format( + self.path_type, filename_to_ui(value) + ), + param, + ctx, + ) + + if not self.file_okay and stat.S_ISREG(st.st_mode): + self.fail( + "{} '{}' is a file.".format(self.path_type, filename_to_ui(value)), + param, + ctx, + ) + if not self.dir_okay and stat.S_ISDIR(st.st_mode): + self.fail( + "{} '{}' is a directory.".format( + self.path_type, filename_to_ui(value) + ), + param, + ctx, + ) + if self.writable and not os.access(value, os.W_OK): + self.fail( + "{} '{}' is not writable.".format( + self.path_type, filename_to_ui(value) + ), + param, + ctx, + ) + if self.readable and not os.access(value, os.R_OK): + self.fail( + "{} '{}' is not readable.".format( + self.path_type, filename_to_ui(value) + ), + param, + ctx, + ) + + return self.coerce_path_result(rv) + + +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): + self.types = [convert_type(ty) for ty in types] + + @property + def name(self): + return "<{}>".format(" ".join(ty.name for ty in self.types)) + + @property + def arity(self): + return len(self.types) + + def convert(self, value, param, ctx): + if len(value) != len(self.types): + raise TypeError( + "It would appear that nargs is set to conflict with the" + " composite type arity." + ) + return tuple(ty(x, param, ctx) for ty, x in zip(self.types, value)) + + +def convert_type(ty, default=None): + """Converts a callable or python type into the most appropriate + param type. + """ + guessed_type = False + if ty is None and default is not None: + if isinstance(default, tuple): + ty = tuple(map(type, default)) + else: + ty = type(default) + guessed_type = True + + if isinstance(ty, tuple): + return Tuple(ty) + if isinstance(ty, ParamType): + return ty + if ty is text_type or ty is str or ty is None: + return STRING + if ty is int: + return INT + # Booleans are only okay if not guessed. This is done because for + # flags the default value is actually a bit of a lie in that it + # indicates which of the flags is the one we want. See get_default() + # for more information. + if ty is bool and not guessed_type: + return BOOL + if ty is float: + return FLOAT + if guessed_type: + return STRING + + # Catch a common mistake + if __debug__: + try: + if issubclass(ty, ParamType): + raise AssertionError( + "Attempted to use an uninstantiated parameter type ({}).".format(ty) + ) + except TypeError: + 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. This is necessary to achieve the +#: same bytes/unicode behavior on Python 2/3 in situations where you want +#: to not convert argument types. 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() diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click/utils.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click/utils.py new file mode 100644 index 0000000..79265e7 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click/utils.py @@ -0,0 +1,455 @@ +import os +import sys + +from ._compat import _default_text_stderr +from ._compat import _default_text_stdout +from ._compat import auto_wrap_for_ansi +from ._compat import binary_streams +from ._compat import filename_to_ui +from ._compat import get_filesystem_encoding +from ._compat import get_streerror +from ._compat import is_bytes +from ._compat import open_stream +from ._compat import PY2 +from ._compat import should_strip_ansi +from ._compat import string_types +from ._compat import strip_ansi +from ._compat import text_streams +from ._compat import text_type +from ._compat import WIN +from .globals import resolve_color_default + +if not PY2: + from ._compat import _find_binary_writer +elif WIN: + from ._winconsole import _get_windows_argv + from ._winconsole import _hash_py_argv + from ._winconsole import _initial_argv_hash + +echo_native_types = string_types + (bytes, bytearray) + + +def _posixify(name): + return "-".join(name.split()).lower() + + +def safecall(func): + """Wraps a function so that it swallows exceptions.""" + + def wrapper(*args, **kwargs): + try: + return func(*args, **kwargs) + except Exception: + pass + + return wrapper + + +def make_str(value): + """Converts a value into a valid string.""" + if isinstance(value, bytes): + try: + return value.decode(get_filesystem_encoding()) + except UnicodeError: + return value.decode("utf-8", "replace") + return text_type(value) + + +def make_default_short_help(help, max_length=45): + """Return a condensed version of help string.""" + words = help.split() + total_length = 0 + result = [] + done = False + + for word in words: + if word[-1:] == ".": + done = True + new_length = 1 + len(word) if result else len(word) + if total_length + new_length > max_length: + result.append("...") + done = True + else: + if result: + result.append(" ") + result.append(word) + if done: + break + total_length += new_length + + return "".join(result) + + +class LazyFile(object): + """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, mode="r", encoding=None, errors="strict", atomic=False + ): + self.name = filename + self.mode = mode + self.encoding = encoding + self.errors = errors + self.atomic = atomic + + if filename == "-": + 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): + return getattr(self.open(), name) + + def __repr__(self): + if self._f is not None: + return repr(self._f) + return "".format(self.name, self.mode) + + def open(self): + """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 (IOError, OSError) as e: # noqa: E402 + from .exceptions import FileError + + raise FileError(self.name, hint=get_streerror(e)) + self._f = rv + return rv + + def close(self): + """Closes the underlying file, no matter what.""" + if self._f is not None: + self._f.close() + + def close_intelligently(self): + """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): + return self + + def __exit__(self, exc_type, exc_value, tb): + self.close_intelligently() + + def __iter__(self): + self.open() + return iter(self._f) + + +class KeepOpenFile(object): + def __init__(self, file): + self._file = file + + def __getattr__(self, name): + return getattr(self._file, name) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, tb): + pass + + def __repr__(self): + return repr(self._file) + + def __iter__(self): + return iter(self._file) + + +def echo(message=None, file=None, nl=True, err=False, color=None): + """Prints a message plus a newline to the given file or stdout. On + first sight, this looks like the print function, but it has improved + support for handling Unicode and binary data that does not fail no + matter how badly configured the system is. + + Primarily it means that you can print binary data as well as Unicode + data on both 2.x and 3.x to the given file in the most appropriate way + possible. This is a very carefree function in that it will try its + best to not fail. As of Click 6.0 this includes support for unicode + output on the Windows console. + + In addition to that, if `colorama`_ is installed, the echo function will + also support clever handling of ANSI codes. Essentially it will then + do the following: + + - add transparent handling of ANSI color codes on Windows. + - hide ANSI codes automatically if the destination file is not a + terminal. + + .. _colorama: https://pypi.org/project/colorama/ + + .. versionchanged:: 6.0 + As of Click 6.0 the echo function will properly support unicode + output on the windows console. Not that click does not modify + the interpreter in any way which means that `sys.stdout` or the + print statement or function will still not provide unicode support. + + .. versionchanged:: 2.0 + Starting with version 2.0 of Click, the echo function will work + with colorama if it's installed. + + .. versionadded:: 3.0 + The `err` parameter was added. + + .. versionchanged:: 4.0 + Added the `color` flag. + + :param message: the message to print + :param file: the file to write to (defaults to ``stdout``) + :param err: if set to true the file defaults to ``stderr`` instead of + ``stdout``. This is faster and easier than calling + :func:`get_text_stderr` yourself. + :param nl: if set to `True` (the default) a newline is printed afterwards. + :param color: controls if the terminal supports ANSI colors or not. The + default is autodetection. + """ + if file is None: + if err: + file = _default_text_stderr() + else: + file = _default_text_stdout() + + # Convert non bytes/text into the native string type. + if message is not None and not isinstance(message, echo_native_types): + message = text_type(message) + + if nl: + message = message or u"" + if isinstance(message, text_type): + message += u"\n" + else: + message += b"\n" + + # If there is a message, and we're in Python 3, 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 message and not PY2 and is_bytes(message): + binary_file = _find_binary_writer(file) + if binary_file is not None: + file.flush() + binary_file.write(message) + binary_file.flush() + return + + # ANSI-style support. If there is no message or we are dealing with + # bytes nothing is happening. If we are connected to a file we want + # to strip colors. If we are on windows we either wrap the stream + # to strip the color or we use the colorama support to translate the + # ansi codes to API calls. + if message and not is_bytes(message): + color = resolve_color_default(color) + if should_strip_ansi(file, color): + message = strip_ansi(message) + elif WIN: + if auto_wrap_for_ansi is not None: + file = auto_wrap_for_ansi(file) + elif not color: + message = strip_ansi(message) + + if message: + file.write(message) + file.flush() + + +def get_binary_stream(name): + """Returns a system stream for byte processing. This essentially + returns the stream from the sys module with the given name but it + solves some compatibility issues between different Python versions. + Primarily this function is necessary for getting binary streams on + Python 3. + + :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("Unknown standard stream '{}'".format(name)) + return opener() + + +def get_text_stream(name, encoding=None, errors="strict"): + """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 on Python 3 + 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("Unknown standard stream '{}'".format(name)) + return opener(encoding, errors) + + +def open_file( + filename, mode="r", encoding=None, errors="strict", lazy=False, atomic=False +): + """This is similar to how the :class:`File` works but for manual + usage. Files are opened non lazy by default. This can open regular + files as well as stdin/stdout if ``'-'`` is passed. + + If stdin/stdout is returned the stream is wrapped so that the context + manager will not close the stream accidentally. This makes it possible + to always use the function like this without having to worry to + accidentally close a standard stream:: + + with open_file(filename) as f: + ... + + .. versionadded:: 3.0 + + :param filename: the name of the file to open (or ``'-'`` for stdin/stdout). + :param mode: the mode in which to open the file. + :param encoding: the encoding to use. + :param errors: the error handling for this file. + :param lazy: can be flipped to true to open the file lazily. + :param atomic: in atomic mode writes go into a temporary file and it's + moved on close. + """ + if lazy: + return LazyFile(filename, mode, encoding, errors, atomic=atomic) + f, should_close = open_stream(filename, mode, encoding, errors, atomic=atomic) + if not should_close: + f = KeepOpenFile(f) + return f + + +def get_os_args(): + """This returns the argument part of sys.argv in the most appropriate + form for processing. What this means is that this return value is in + a format that works for Click to process but does not necessarily + correspond well to what's actually standard for the interpreter. + + On most environments the return value is ``sys.argv[:1]`` unchanged. + However if you are on Windows and running Python 2 the return value + will actually be a list of unicode strings instead because the + default behavior on that platform otherwise will not be able to + carry all possible values that sys.argv can have. + + .. versionadded:: 6.0 + """ + # We can only extract the unicode argv if sys.argv has not been + # changed since the startup of the application. + if PY2 and WIN and _initial_argv_hash == _hash_py_argv(): + return _get_windows_argv() + return sys.argv[1:] + + +def format_filename(filename, shorten=False): + """Formats a filename for user display. The main purpose of this + function is to ensure that the filename can be displayed at all. This + will decode the filename to unicode if necessary in a way that it will + not fail. Optionally, it can shorten the filename to not include the + full path to the filename. + + :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) + return filename_to_ui(filename) + + +def get_app_dir(app_name, roaming=True, force_posix=False): + 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`` + Win XP (roaming): + ``C:\Documents and Settings\\Local Settings\Application Data\Foo Bar`` + Win XP (not roaming): + ``C:\Documents and Settings\\Application Data\Foo Bar`` + Win 7 (roaming): + ``C:\Users\\AppData\Roaming\Foo Bar`` + Win 7 (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 affect 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("~/.{}".format(_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(object): + """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): + self.wrapped = wrapped + + def flush(self): + try: + self.wrapped.flush() + except IOError as e: + import errno + + if e.errno != errno.EPIPE: + raise + + def __getattr__(self, attr): + return getattr(self.wrapped, attr) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_didyoumean-0.0.3-py3.8.egg-info/PKG-INFO b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_didyoumean-0.0.3-py3.8.egg-info/PKG-INFO new file mode 100644 index 0000000..6cc01d6 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_didyoumean-0.0.3-py3.8.egg-info/PKG-INFO @@ -0,0 +1,13 @@ +Metadata-Version: 1.1 +Name: click-didyoumean +Version: 0.0.3 +Summary: Enable git-like did-you-mean feature in click. +Home-page: https://github.com/timofurrer/click-didyoumean +Author: Timo Furrer +Author-email: tuxtimo@gmail.com +License: UNKNOWN +Description: UNKNOWN +Platform: UNKNOWN +Classifier: License :: OSI Approved :: BSD License +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_didyoumean-0.0.3-py3.8.egg-info/SOURCES.txt b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_didyoumean-0.0.3-py3.8.egg-info/SOURCES.txt new file mode 100644 index 0000000..749c853 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_didyoumean-0.0.3-py3.8.egg-info/SOURCES.txt @@ -0,0 +1,9 @@ +README.rst +setup.cfg +setup.py +click_didyoumean/__init__.py +click_didyoumean.egg-info/PKG-INFO +click_didyoumean.egg-info/SOURCES.txt +click_didyoumean.egg-info/dependency_links.txt +click_didyoumean.egg-info/requires.txt +click_didyoumean.egg-info/top_level.txt \ No newline at end of file diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_didyoumean-0.0.3-py3.8.egg-info/dependency_links.txt b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_didyoumean-0.0.3-py3.8.egg-info/dependency_links.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_didyoumean-0.0.3-py3.8.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_didyoumean-0.0.3-py3.8.egg-info/installed-files.txt b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_didyoumean-0.0.3-py3.8.egg-info/installed-files.txt new file mode 100644 index 0000000..ea579c8 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_didyoumean-0.0.3-py3.8.egg-info/installed-files.txt @@ -0,0 +1,7 @@ +../click_didyoumean/__init__.py +../click_didyoumean/__pycache__/__init__.cpython-38.pyc +PKG-INFO +SOURCES.txt +dependency_links.txt +requires.txt +top_level.txt diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_didyoumean-0.0.3-py3.8.egg-info/requires.txt b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_didyoumean-0.0.3-py3.8.egg-info/requires.txt new file mode 100644 index 0000000..dca9a90 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_didyoumean-0.0.3-py3.8.egg-info/requires.txt @@ -0,0 +1 @@ +click diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_didyoumean-0.0.3-py3.8.egg-info/top_level.txt b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_didyoumean-0.0.3-py3.8.egg-info/top_level.txt new file mode 100644 index 0000000..8954e5e --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_didyoumean-0.0.3-py3.8.egg-info/top_level.txt @@ -0,0 +1 @@ +click_didyoumean diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_didyoumean/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_didyoumean/__init__.py new file mode 100644 index 0000000..edc5bb3 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_didyoumean/__init__.py @@ -0,0 +1,58 @@ +# -*- coding: utf-8 -*- + +""" + Extension for the python ``click`` module to provide + a group with a git-like *did-you-mean* feature. +""" + +import click +import difflib + +__version__ = "0.0.3" + + +class DYMMixin(object): # pylint: disable=too-few-public-methods + """ + 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, **kwargs): + self.max_suggestions = kwargs.pop("max_suggestions", 3) + self.cutoff = kwargs.pop("cutoff", 0.5) + super(DYMMixin, self).__init__(*args, **kwargs) + + def resolve_command(self, ctx, args): + """ + Overrides clicks ``resolve_command`` method + and appends *Did you mean ...* suggestions + to the raised exception message. + """ + original_cmd_name = click.utils.make_str(args[0]) + + try: + return super(DYMMixin, self).resolve_command(ctx, args) + except click.exceptions.UsageError as error: + error_msg = str(error) + matches = difflib.get_close_matches(original_cmd_name, + self.list_commands(ctx), self.max_suggestions, self.cutoff) + if matches: + error_msg += '\n\nDid you mean one of these?\n %s' % '\n '.join(matches) # pylint: disable=line-too-long + + raise click.exceptions.UsageError(error_msg, error.ctx) + + +class DYMGroup(DYMMixin, click.Group): # pylint: disable=too-many-public-methods + """ + 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): # pylint: disable=too-many-public-methods + """ + click CommandCollection to provide git-like + *did-you-mean* functionality when a certain + command is not found in the group. + """ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_plugins-1.1.1.dist-info/AUTHORS.txt b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_plugins-1.1.1.dist-info/AUTHORS.txt new file mode 100644 index 0000000..17b68ca --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_plugins-1.1.1.dist-info/AUTHORS.txt @@ -0,0 +1,5 @@ +Authors +======= + +Kevin Wurster +Sean Gillies diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_plugins-1.1.1.dist-info/INSTALLER b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_plugins-1.1.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_plugins-1.1.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_plugins-1.1.1.dist-info/LICENSE.txt b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_plugins-1.1.1.dist-info/LICENSE.txt new file mode 100644 index 0000000..8fbd353 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_plugins-1.1.1.dist-info/LICENSE.txt @@ -0,0 +1,29 @@ +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_plugins-1.1.1.dist-info/METADATA b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_plugins-1.1.1.dist-info/METADATA new file mode 100644 index 0000000..11df8ed --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_plugins-1.1.1.dist-info/METADATA @@ -0,0 +1,210 @@ +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_plugins-1.1.1.dist-info/RECORD b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_plugins-1.1.1.dist-info/RECORD new file mode 100644 index 0000000..917d5a7 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_plugins-1.1.1.dist-info/RECORD @@ -0,0 +1,13 @@ +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/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +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-38.pyc,, +click_plugins/__pycache__/core.cpython-38.pyc,, +click_plugins/core.py,sha256=4hhmUpFi6MSYsvxogksNu5dlKEWNscbiE9ynUy5dPdE,2475 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_plugins-1.1.1.dist-info/REQUESTED b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_plugins-1.1.1.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_plugins-1.1.1.dist-info/WHEEL b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_plugins-1.1.1.dist-info/WHEEL new file mode 100644 index 0000000..c8240f0 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_plugins-1.1.1.dist-info/WHEEL @@ -0,0 +1,6 @@ +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_plugins-1.1.1.dist-info/top_level.txt b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_plugins-1.1.1.dist-info/top_level.txt new file mode 100644 index 0000000..22e5b9b --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_plugins-1.1.1.dist-info/top_level.txt @@ -0,0 +1 @@ +click_plugins diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_plugins-1.1.1.dist-info/zip-safe b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_plugins-1.1.1.dist-info/zip-safe new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_plugins-1.1.1.dist-info/zip-safe @@ -0,0 +1 @@ + diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_plugins/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_plugins/__init__.py new file mode 100644 index 0000000..6bdfe38 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_plugins/__init__.py @@ -0,0 +1,61 @@ +""" +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_plugins/core.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_plugins/core.py new file mode 100644 index 0000000..0d7f5e9 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_plugins/core.py @@ -0,0 +1,92 @@ +""" +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_repl-0.2.0.dist-info/INSTALLER b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_repl-0.2.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_repl-0.2.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_repl-0.2.0.dist-info/LICENSE b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_repl-0.2.0.dist-info/LICENSE new file mode 100644 index 0000000..ab35c0e --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_repl-0.2.0.dist-info/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2014-2015 Markus Unterwaditzer & 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_repl-0.2.0.dist-info/METADATA b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_repl-0.2.0.dist-info/METADATA new file mode 100644 index 0000000..e51ae95 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_repl-0.2.0.dist-info/METADATA @@ -0,0 +1,16 @@ +Metadata-Version: 2.1 +Name: click-repl +Version: 0.2.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 +Requires-Dist: click +Requires-Dist: prompt-toolkit +Requires-Dist: six + +UNKNOWN + + diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_repl-0.2.0.dist-info/RECORD b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_repl-0.2.0.dist-info/RECORD new file mode 100644 index 0000000..74f8f12 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_repl-0.2.0.dist-info/RECORD @@ -0,0 +1,11 @@ +click_repl-0.2.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +click_repl-0.2.0.dist-info/LICENSE,sha256=zVXsz-TJDlfzckRrUCkq1VCkv8w1NK-JQvuMpcGdQj4,1084 +click_repl-0.2.0.dist-info/METADATA,sha256=7AU-rLLQGcd6A-67u5kbj081187JwdEv99Zy0KUoc-Q,316 +click_repl-0.2.0.dist-info/RECORD,, +click_repl-0.2.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +click_repl-0.2.0.dist-info/WHEEL,sha256=OqRkF0eY5GHssMorFjlbTIq072vpHpF60fIQA6lS9xA,92 +click_repl-0.2.0.dist-info/top_level.txt,sha256=F6rJUNCBcNeCP3tglg54K9NGWoA0azS09pH1B3V5LbQ,11 +click_repl/__init__.py,sha256=MMSweQpN_fwvr4DXeK9wKk6AuETIxoiVHAANGT3OkhA,8906 +click_repl/__pycache__/__init__.cpython-38.pyc,, +click_repl/__pycache__/exceptions.cpython-38.pyc,, +click_repl/exceptions.py,sha256=syJEYjD1bEIxG2bh43cMFNDYUGdJsTHwkhtnhEOHWY8,114 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_repl-0.2.0.dist-info/REQUESTED b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_repl-0.2.0.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_repl-0.2.0.dist-info/WHEEL b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_repl-0.2.0.dist-info/WHEEL new file mode 100644 index 0000000..385faab --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_repl-0.2.0.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.36.2) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_repl-0.2.0.dist-info/top_level.txt b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_repl-0.2.0.dist-info/top_level.txt new file mode 100644 index 0000000..4cf6be7 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_repl-0.2.0.dist-info/top_level.txt @@ -0,0 +1 @@ +click_repl diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_repl/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_repl/__init__.py new file mode 100644 index 0000000..c1b950e --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_repl/__init__.py @@ -0,0 +1,303 @@ +from collections import defaultdict +from prompt_toolkit.completion import Completer, Completion +from prompt_toolkit.history import InMemoryHistory +from prompt_toolkit.shortcuts import prompt +import click +import click.parser +import os +import shlex +import sys +import six +from .exceptions import InternalCommandException, ExitReplException # noqa + +# Handle backwards compatibility between Click 7.0 and 8.0 +try: + import click.shell_completion + HAS_C8 = True +except ImportError: + import click._bashcomplete + HAS_C8 = False + +# Handle click.exceptions.Exit introduced in Click 7.0 +try: + from click.exceptions import Exit as ClickExit +except ImportError: + class ClickExit(RuntimeError): + pass + +PY2 = sys.version_info[0] == 2 + +if PY2: + text_type = unicode # noqa +else: + text_type = str # noqa + + +__version__ = "0.2.0" + +_internal_commands = dict() + + +def _register_internal_command(names, target, description=None): + if not hasattr(target, "__call__"): + raise ValueError("Internal command must be a callable") + + if isinstance(names, six.string_types): + names = [names] + elif not isinstance(names, (list, tuple)): + raise ValueError('"names" must be a string or a list / tuple') + + 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 six.iteritems(_internal_commands): + info_table[target_info[1]].append(mnemonic) + formatter.write_dl( + ( + ", ".join((":{0}".format(mnemonic) for mnemonic in sorted(mnemonics))), + description, + ) + for description, mnemonics in six.iteritems(info_table) + ) + return formatter.getvalue() + + +_register_internal_command(["q", "quit", "exit"], _exit_internal, "exits the repl") +_register_internal_command( + ["?", "h", "help"], _help_internal, "displays general help information" +) + + +class ClickCompleter(Completer): + def __init__(self, cli): + self.cli = cli + + def get_completions(self, document, complete_event=None): + # Code analogous to click._bashcomplete.do_complete + + try: + args = shlex.split(document.text_before_cursor) + except ValueError: + # Invalid command, perhaps caused by missing closing quotation. + return + + cursor_within_command = ( + document.text_before_cursor.rstrip() == document.text_before_cursor + ) + + 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 = "" + # Resolve context based on click version + if HAS_C8: + ctx = click.shell_completion._resolve_context(self.cli, {}, "", args) + else: + ctx = click._bashcomplete.resolve_ctx(self.cli, "", args) + + if ctx is None: + return + + choices = [] + for param in ctx.command.params: + if isinstance(param, click.Option): + for options in (param.opts, param.secondary_opts): + for o in options: + choices.append( + Completion( + text_type(o), -len(incomplete), display_meta=param.help + ) + ) + elif isinstance(param, click.Argument): + if isinstance(param.type, click.Choice): + for choice in param.type.choices: + choices.append(Completion(text_type(choice), -len(incomplete))) + + if isinstance(ctx.command, click.MultiCommand): + for name in ctx.command.list_commands(ctx): + command = ctx.command.get_command(ctx, name) + choices.append( + Completion( + text_type(name), + -len(incomplete), + display_meta=getattr(command, "short_help"), + ) + ) + + for item in choices: + if item.text.startswith(incomplete): + yield item + + +def bootstrap_prompt(prompt_kwargs, group): + """ + Bootstrap prompt_toolkit kwargs or use user defined values. + + :param prompt_kwargs: The user specified prompt kwargs. + """ + prompt_kwargs = prompt_kwargs or {} + + defaults = { + "history": InMemoryHistory(), + "completer": ClickCompleter(group), + "message": u"> ", + } + + for key in defaults: + default_value = defaults[key] + if key not in prompt_kwargs: + prompt_kwargs[key] = default_value + + return prompt_kwargs + + +def repl( # noqa: C901 + old_ctx, + prompt_kwargs=None, + 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.shortcuts.prompt`. + + If stdin is not a TTY, no prompt will be printed, but only commands read + from stdin. + + """ + # parent should be available, but we're not going to bother if not + group_ctx = old_ctx.parent or old_ctx + group = group_ctx.command + 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 + available_commands.pop(repl_command_name, None) + + prompt_kwargs = bootstrap_prompt(prompt_kwargs, group) + + if isatty: + + def get_command(): + return prompt(**prompt_kwargs) + + 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 + + if allow_system_commands and dispatch_repl_commands(command): + continue + + if allow_internal_commands: + try: + result = handle_internal_commands(command) + if isinstance(result, six.string_types): + click.echo(result) + continue + except ExitReplException: + break + + try: + args = shlex.split(command) + except ValueError as e: + click.echo("{}: {}".format(type(e).__name__, e)) + continue + + try: + with group.make_context(None, args, parent=group_ctx) as ctx: + group.invoke(ctx) + ctx.exit() + except click.ClickException as e: + e.show() + except ClickExit: + pass + except SystemExit: + pass + except ExitReplException: + break + + +def register_repl(group, name="repl"): + """Register :func:`repl()` as sub-command *name* of *group*.""" + group.command(name=name)(click.pass_context(repl)) + + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_repl/exceptions.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_repl/exceptions.py new file mode 100644 index 0000000..b63330e --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/click_repl/exceptions.py @@ -0,0 +1,6 @@ +class InternalCommandException(Exception): + pass + + +class ExitReplException(InternalCommandException): + pass diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/confusable_homoglyphs-3.2.0.dist-info/INSTALLER b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/confusable_homoglyphs-3.2.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/confusable_homoglyphs-3.2.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/confusable_homoglyphs-3.2.0.dist-info/METADATA b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/confusable_homoglyphs-3.2.0.dist-info/METADATA new file mode 100644 index 0000000..4532043 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/confusable_homoglyphs-3.2.0.dist-info/METADATA @@ -0,0 +1,125 @@ +Metadata-Version: 2.1 +Name: confusable-homoglyphs +Version: 3.2.0 +Summary: Detect confusable usage of unicode homoglyphs, prevent homograph attacks. +Home-page: https://github.com/vhf/confusable_homoglyphs +Author: Victor Felder +Author-email: victorfelder@gmail.com +License: MIT +Keywords: confusable,homoglyph,attack,homograph,unicode,spoofing +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Natural Language :: English +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Topic :: Text Processing :: Filters +Classifier: Topic :: Text Processing +Classifier: Topic :: Utilities +Provides-Extra: cli +Provides-Extra: cli +Requires-Dist: click; extra == 'cli' + +confusable_homoglyphs `[doc] `__ +======================================================================================== + +.. image:: https://img.shields.io/travis/vhf/confusable_homoglyphs.svg + :target: https://travis-ci.org/vhf/confusable_homoglyphs + +.. image:: https://img.shields.io/pypi/v/confusable_homoglyphs.svg + :target: https://pypi.python.org/pypi/confusable_homoglyphs + +.. image:: https://readthedocs.org/projects/confusable_homoglyphs/badge/?version=latest + :target: http://confusable-homoglyphs.readthedocs.io/en/latest/ + :alt: Documentation Status + +*a homoglyph is one of two or more graphemes, characters, or glyphs with +shapes that appear identical or very similar* +`wikipedia:Homoglyph `__ + +Unicode homoglyphs can be a nuisance on the web. Your most popular +client, AlaskaJazz, might be upset to be impersonated by a trickster who +deliberately chose the username ΑlaskaJazz. + +- ``AlaskaJazz`` is single script: only Latin characters. +- ``ΑlaskaJazz`` is mixed-script: the first character is a greek + letter. + +You might also want to avoid people being tricked into entering their +password on ``www.microsоft.com`` or ``www.faϲebook.com`` instead of +``www.microsoft.com`` or ``www.facebook.com``. `Here is a +utility `__ to play +with these **confusable homoglyphs**. + +Not all mixed-script strings have to be ruled out though, you could only +exclude mixed-script strings containing characters that might be +confused with a character from some unicode blocks of your choosing. + +- ``Allo`` and ``ρττ`` are fine: single script. +- ``AlloΓ`` is fine when our preferred script alias is 'latin': mixed script, but ``Γ`` is not confusable. +- ``Alloρ`` is dangerous: mixed script and ``ρ`` could be confused with + ``p``. + +This library is compatible Python 2 and Python 3. + +`API documentation `__ +--------------------------------------------------------------------------------------------------- + +Is the data up to date? +----------------------- + +Yep. + +The unicode blocks aliases and names for each character are extracted +from `this file `__ +provided by the unicode consortium. + +The matrix of which character can be confused with which other +characters is built using `this +file `__ +provided by the unicode consortium. + +This data is stored in two JSON files: ``categories.json`` and +``confusables.json``. If you delete them, they will both be recreated by +downloading and parsing the two abovementioned files and stored as JSON +files again. + + + + +History +------- + +1.0.0 +===== + +Initial release. + +2.0.0 +===== + +- `allowed_categories` renamed to `allowed_aliases` + +2.0.1 +===== + +- Fix a TypeError: https://github.com/vhf/confusable_homoglyphs/pull/2 + +3.0.0 +===== + +Courtesy of Ryan P Kilby, via https://github.com/vhf/confusable_homoglyphs/pull/6 : + +- Changed file paths to be relative to the `confusable_homoglyphs` package directory instead of the user's current working directory. +- Data files are now distributed with the packaging. +- Fixes tests so that they use the installed distribution instead of the local files. (Originally, the data files were erroneously showing up during testing, despite not being included in the distribution). +- Moves the data file generation into a simple CLI. This way, users have a method for controlling when the data files are updated. +- Since the data files are now included in the distribution, the CLI is made optional. Its dependencies can be installed with the `cli` bundle, eg. `pip install confusable_homoglyphs[cli]`. + + + diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/confusable_homoglyphs-3.2.0.dist-info/RECORD b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/confusable_homoglyphs-3.2.0.dist-info/RECORD new file mode 100644 index 0000000..ed6bd01 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/confusable_homoglyphs-3.2.0.dist-info/RECORD @@ -0,0 +1,22 @@ +../../../bin/confusable_homoglyphs,sha256=GLheLPjNnkzTep-QVrpveScj4CcAT7MpWt2OzqDjnNk,277 +confusable_homoglyphs-3.2.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +confusable_homoglyphs-3.2.0.dist-info/METADATA,sha256=_xZM0Z4PXNi1_RpSV-YPTUkNUT8wGy6-ofp_xGiDRfw,4893 +confusable_homoglyphs-3.2.0.dist-info/RECORD,, +confusable_homoglyphs-3.2.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +confusable_homoglyphs-3.2.0.dist-info/WHEEL,sha256=gduuPyBvFJQSQ0zdyxF7k0zynDXbIbvg5ZBHoXum5uk,110 +confusable_homoglyphs-3.2.0.dist-info/entry_points.txt,sha256=pdf8be86aII3ebzr0H2ZS8bdEdftVeWUkNIsqcuNszg,73 +confusable_homoglyphs-3.2.0.dist-info/top_level.txt,sha256=ozrGYViJigAq-RKQPR-PGpUT5ktbD6a6ux984ue7sYE,22 +confusable_homoglyphs/__init__.py,sha256=DgNjqXRYuoQFQ7QLdwD8K4bwPuT-CdZPtUM_i1VDraU,221 +confusable_homoglyphs/__pycache__/__init__.cpython-38.pyc,, +confusable_homoglyphs/__pycache__/_version.cpython-38.pyc,, +confusable_homoglyphs/__pycache__/categories.cpython-38.pyc,, +confusable_homoglyphs/__pycache__/cli.cpython-38.pyc,, +confusable_homoglyphs/__pycache__/confusables.cpython-38.pyc,, +confusable_homoglyphs/__pycache__/utils.cpython-38.pyc,, +confusable_homoglyphs/_version.py,sha256=Zzh71BP9HiPByNghSXeAzRL1QKfxgqGrcnSvGwfdxpI,471 +confusable_homoglyphs/categories.json,sha256=eG2mb1VBt6q-yUjTj8T3tPi_LzF8ssYtb456UWajKvA,47595 +confusable_homoglyphs/categories.py,sha256=WrdKjQtp4G1VbYVd97S9NFpd-xhYoeO8dk80B8plXyM,2372 +confusable_homoglyphs/cli.py,sha256=KWQlkeHQbBqdprIIeM94kbAGw7dS_7R0DyyIFupY9BY,2745 +confusable_homoglyphs/confusables.json,sha256=IeiP-6wi8O7D-2QBriCJkNgVJeiN9h6DjqUryLQMHIM,901494 +confusable_homoglyphs/confusables.py,sha256=G0eg59_APQAqgD8o0KOpu0-Y1NQ3KTPvUVMFmnjqDtE,6223 +confusable_homoglyphs/utils.py,sha256=ORFZM0-fVCadIHK7m0iIEbVa1QZx7O2VJ_v9vyAvBw4,1157 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/confusable_homoglyphs-3.2.0.dist-info/REQUESTED b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/confusable_homoglyphs-3.2.0.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/confusable_homoglyphs-3.2.0.dist-info/WHEEL b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/confusable_homoglyphs-3.2.0.dist-info/WHEEL new file mode 100644 index 0000000..1316c41 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/confusable_homoglyphs-3.2.0.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.31.1) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/confusable_homoglyphs-3.2.0.dist-info/entry_points.txt b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/confusable_homoglyphs-3.2.0.dist-info/entry_points.txt new file mode 100644 index 0000000..725865e --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/confusable_homoglyphs-3.2.0.dist-info/entry_points.txt @@ -0,0 +1,3 @@ +[console_scripts] +confusable_homoglyphs = confusable_homoglyphs.cli:cli + diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/confusable_homoglyphs-3.2.0.dist-info/top_level.txt b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/confusable_homoglyphs-3.2.0.dist-info/top_level.txt new file mode 100644 index 0000000..c76093f --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/confusable_homoglyphs-3.2.0.dist-info/top_level.txt @@ -0,0 +1 @@ +confusable_homoglyphs diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/confusable_homoglyphs/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/confusable_homoglyphs/__init__.py new file mode 100644 index 0000000..2eb8b98 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/confusable_homoglyphs/__init__.py @@ -0,0 +1,8 @@ +# -*- coding: utf-8 -*- +from __future__ import print_function +from ._version import get_versions + +__author__ = 'Victor Felder' +__email__ = 'victorfelder@gmail.com' +__version__ = get_versions()['version'] +del get_versions diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/confusable_homoglyphs/_version.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/confusable_homoglyphs/_version.py new file mode 100644 index 0000000..6c66dfb --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/confusable_homoglyphs/_version.py @@ -0,0 +1,21 @@ + +# This file was generated by 'versioneer.py' (0.15) from +# revision-control system data, or from the parent directory name of an +# unpacked source archive. Distribution tarballs contain a pre-generated copy +# of this file. + +import json +import sys + +version_json = ''' +{ + "dirty": false, + "error": null, + "full-revisionid": "14f43ddd74099520ddcda29fac557c27a28190e6", + "version": "3.2.0" +} +''' # END VERSION_JSON + + +def get_versions(): + return json.loads(version_json) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/confusable_homoglyphs/categories.json b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/confusable_homoglyphs/categories.json new file mode 100644 index 0000000..ea6dc07 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/confusable_homoglyphs/categories.json @@ -0,0 +1 @@ +{"iso_15924_aliases": ["COMMON", "LATIN", "GREEK", "CYRILLIC", "ARMENIAN", "HEBREW", "ARABIC", "SYRIAC", "THAANA", "DEVANAGARI", "BENGALI", "GURMUKHI", "GUJARATI", "ORIYA", "TAMIL", "TELUGU", "KANNADA", "MALAYALAM", "SINHALA", "THAI", "LAO", "TIBETAN", "MYANMAR", "GEORGIAN", "HANGUL", "ETHIOPIC", "CHEROKEE", "CANADIAN_ABORIGINAL", "OGHAM", "RUNIC", "KHMER", "MONGOLIAN", "HIRAGANA", "KATAKANA", "BOPOMOFO", "HAN", "YI", "OLD_ITALIC", "GOTHIC", "DESERET", "INHERITED", "TAGALOG", "HANUNOO", "BUHID", "TAGBANWA", "LIMBU", "TAI_LE", "LINEAR_B", "UGARITIC", "SHAVIAN", "OSMANYA", "CYPRIOT", "BRAILLE", "BUGINESE", "COPTIC", "NEW_TAI_LUE", "GLAGOLITIC", "TIFINAGH", "SYLOTI_NAGRI", "OLD_PERSIAN", "KHAROSHTHI", "BALINESE", "CUNEIFORM", "PHOENICIAN", "PHAGS_PA", "NKO", "SUNDANESE", "LEPCHA", "OL_CHIKI", "VAI", "SAURASHTRA", "KAYAH_LI", "REJANG", "LYCIAN", "CARIAN", "LYDIAN", "CHAM", "TAI_THAM", "TAI_VIET", "AVESTAN", "EGYPTIAN_HIEROGLYPHS", "SAMARITAN", "LISU", "BAMUM", "JAVANESE", "MEETEI_MAYEK", "IMPERIAL_ARAMAIC", "OLD_SOUTH_ARABIAN", "INSCRIPTIONAL_PARTHIAN", "INSCRIPTIONAL_PAHLAVI", "OLD_TURKIC", "KAITHI", "BATAK", "BRAHMI", "MANDAIC", "CHAKMA", "MEROITIC_CURSIVE", "MEROITIC_HIEROGLYPHS", "MIAO", "SHARADA", "SORA_SOMPENG", "TAKRI", "CAUCASIAN_ALBANIAN", "BASSA_VAH", "DUPLOYAN", "ELBASAN", "GRANTHA", "PAHAWH_HMONG", "KHOJKI", "LINEAR_A", "MAHAJANI", "MANICHAEAN", "MENDE_KIKAKUI", "MODI", "MRO", "OLD_NORTH_ARABIAN", "NABATAEAN", "PALMYRENE", "PAU_CIN_HAU", "OLD_PERMIC", "PSALTER_PAHLAVI", "SIDDHAM", "KHUDAWADI", "TIRHUTA", "WARANG_CITI", "AHOM", "ANATOLIAN_HIEROGLYPHS", "HATRAN", "MULTANI", "OLD_HUNGARIAN", "SIGNWRITING", "ADLAM", "BHAIKSUKI", "MARCHEN", "NEWA", "OSAGE", "TANGUT", "MASARAM_GONDI", "NUSHU", "SOYOMBO", "ZANABAZAR_SQUARE", "DOGRA", "GUNJALA_GONDI", "MAKASAR", "MEDEFAIDRIN", "HANIFI_ROHINGYA", "SOGDIAN", "OLD_SOGDIAN"], "categories": ["Cc", "Zs", "Po", "Sc", "Ps", "Pe", "Sm", "Pd", "Nd", "Sk", "Pc", "So", "Pi", "Cf", "No", "L", "Pf", "Lm", "Mc", "Lo", "Zl", "Zp", "Nl", "Mn", "Me"], "code_points_ranges": [[0, 31, 0, 0], [32, 32, 0, 1], [33, 35, 0, 2], [36, 36, 0, 3], [37, 39, 0, 2], [40, 40, 0, 4], [41, 41, 0, 5], [42, 42, 0, 2], [43, 43, 0, 6], [44, 44, 0, 2], [45, 45, 0, 7], [46, 47, 0, 2], [48, 57, 0, 8], [58, 59, 0, 2], [60, 62, 0, 6], [63, 64, 0, 2], [65, 90, 1, 15], [91, 91, 0, 4], [92, 92, 0, 2], [93, 93, 0, 5], [94, 94, 0, 9], [95, 95, 0, 10], [96, 96, 0, 9], [97, 122, 1, 15], [123, 123, 0, 4], [124, 124, 0, 6], [125, 125, 0, 5], [126, 126, 0, 6], [127, 159, 0, 0], [160, 160, 0, 1], [161, 161, 0, 2], [162, 165, 0, 3], [166, 166, 0, 11], [167, 167, 0, 2], [168, 168, 0, 9], [169, 169, 0, 11], [170, 170, 1, 19], [171, 171, 0, 12], [172, 172, 0, 6], [173, 173, 0, 13], [174, 174, 0, 11], [175, 175, 0, 9], [176, 176, 0, 11], [177, 177, 0, 6], [178, 179, 0, 14], [180, 180, 0, 9], [181, 181, 0, 15], [182, 183, 0, 2], [184, 184, 0, 9], [185, 185, 0, 14], [186, 186, 1, 19], [187, 187, 0, 16], [188, 190, 0, 14], [191, 191, 0, 2], [192, 214, 1, 15], [215, 215, 0, 6], [216, 246, 1, 15], [247, 247, 0, 6], [248, 442, 1, 15], [443, 443, 1, 19], [444, 447, 1, 15], [448, 451, 1, 19], [452, 659, 1, 15], [660, 660, 1, 19], [661, 687, 1, 15], [688, 696, 1, 17], [697, 705, 0, 17], [706, 709, 0, 9], [710, 721, 0, 17], [722, 735, 0, 9], [736, 740, 1, 17], [741, 745, 0, 9], [746, 747, 34, 9], [748, 748, 0, 17], [749, 749, 0, 9], [750, 750, 0, 17], [751, 767, 0, 9], [768, 879, 40, 23], [880, 883, 2, 15], [884, 884, 0, 17], [885, 885, 2, 9], [886, 887, 2, 15], [890, 890, 2, 17], [891, 893, 2, 15], [894, 894, 0, 2], [895, 895, 2, 15], [900, 900, 2, 9], [901, 901, 0, 9], [902, 902, 2, 15], [903, 903, 0, 2], [904, 906, 2, 15], [908, 908, 2, 15], [910, 929, 2, 15], [931, 993, 2, 15], [994, 1007, 54, 15], [1008, 1013, 2, 15], [1014, 1014, 2, 6], [1015, 1023, 2, 15], [1024, 1153, 3, 15], [1154, 1154, 3, 11], [1155, 1156, 3, 23], [1157, 1158, 40, 23], [1159, 1159, 3, 23], [1160, 1161, 3, 24], [1162, 1327, 3, 15], [1329, 1366, 4, 15], [1369, 1369, 4, 17], [1370, 1375, 4, 2], [1376, 1416, 4, 15], [1417, 1417, 0, 2], [1418, 1418, 4, 7], [1421, 1422, 4, 11], [1423, 1423, 4, 3], [1425, 1469, 5, 23], [1470, 1470, 5, 7], [1471, 1471, 5, 23], [1472, 1472, 5, 2], [1473, 1474, 5, 23], [1475, 1475, 5, 2], [1476, 1477, 5, 23], [1478, 1478, 5, 2], [1479, 1479, 5, 23], [1488, 1514, 5, 19], [1519, 1522, 5, 19], [1523, 1524, 5, 2], [1536, 1540, 6, 13], [1541, 1541, 0, 13], [1542, 1544, 6, 6], [1545, 1546, 6, 2], [1547, 1547, 6, 3], [1548, 1548, 0, 2], [1549, 1549, 6, 2], [1550, 1551, 6, 11], [1552, 1562, 6, 23], [1563, 1563, 0, 2], [1564, 1564, 6, 13], [1566, 1566, 6, 2], [1567, 1567, 0, 2], [1568, 1599, 6, 19], [1600, 1600, 0, 17], [1601, 1610, 6, 19], [1611, 1621, 40, 23], [1622, 1631, 6, 23], [1632, 1641, 6, 8], [1642, 1645, 6, 2], [1646, 1647, 6, 19], [1648, 1648, 40, 23], [1649, 1747, 6, 19], [1748, 1748, 6, 2], [1749, 1749, 6, 19], [1750, 1756, 6, 23], [1757, 1757, 0, 13], [1758, 1758, 6, 11], [1759, 1764, 6, 23], [1765, 1766, 6, 17], [1767, 1768, 6, 23], [1769, 1769, 6, 11], [1770, 1773, 6, 23], [1774, 1775, 6, 19], [1776, 1785, 6, 8], [1786, 1788, 6, 19], [1789, 1790, 6, 11], [1791, 1791, 6, 19], [1792, 1805, 7, 2], [1807, 1807, 7, 13], [1808, 1808, 7, 19], [1809, 1809, 7, 23], [1810, 1839, 7, 19], [1840, 1866, 7, 23], [1869, 1871, 7, 19], [1872, 1919, 6, 19], [1920, 1957, 8, 19], [1958, 1968, 8, 23], [1969, 1969, 8, 19], [1984, 1993, 65, 8], [1994, 2026, 65, 19], [2027, 2035, 65, 23], [2036, 2037, 65, 17], [2038, 2038, 65, 11], [2039, 2041, 65, 2], [2042, 2042, 65, 17], [2045, 2045, 65, 23], [2046, 2047, 65, 3], [2048, 2069, 81, 19], [2070, 2073, 81, 23], [2074, 2074, 81, 17], [2075, 2083, 81, 23], [2084, 2084, 81, 17], [2085, 2087, 81, 23], [2088, 2088, 81, 17], [2089, 2093, 81, 23], [2096, 2110, 81, 2], [2112, 2136, 94, 19], [2137, 2139, 94, 23], [2142, 2142, 94, 2], [2144, 2154, 7, 19], [2208, 2228, 6, 19], [2230, 2237, 6, 19], [2259, 2273, 6, 23], [2274, 2274, 0, 13], [2275, 2303, 6, 23], [2304, 2306, 9, 23], [2307, 2307, 9, 18], [2308, 2361, 9, 19], [2362, 2362, 9, 23], [2363, 2363, 9, 18], [2364, 2364, 9, 23], [2365, 2365, 9, 19], [2366, 2368, 9, 18], [2369, 2376, 9, 23], [2377, 2380, 9, 18], [2381, 2381, 9, 23], [2382, 2383, 9, 18], [2384, 2384, 9, 19], [2385, 2386, 40, 23], [2387, 2391, 9, 23], [2392, 2401, 9, 19], [2402, 2403, 9, 23], [2404, 2405, 0, 2], [2406, 2415, 9, 8], [2416, 2416, 9, 2], [2417, 2417, 9, 17], [2418, 2431, 9, 19], [2432, 2432, 10, 19], [2433, 2433, 10, 23], [2434, 2435, 10, 18], [2437, 2444, 10, 19], [2447, 2448, 10, 19], [2451, 2472, 10, 19], [2474, 2480, 10, 19], [2482, 2482, 10, 19], [2486, 2489, 10, 19], [2492, 2492, 10, 23], [2493, 2493, 10, 19], [2494, 2496, 10, 18], [2497, 2500, 10, 23], [2503, 2504, 10, 18], [2507, 2508, 10, 18], [2509, 2509, 10, 23], [2510, 2510, 10, 19], [2519, 2519, 10, 18], [2524, 2525, 10, 19], [2527, 2529, 10, 19], [2530, 2531, 10, 23], [2534, 2543, 10, 8], [2544, 2545, 10, 19], [2546, 2547, 10, 3], [2548, 2553, 10, 14], [2554, 2554, 10, 11], [2555, 2555, 10, 3], [2556, 2556, 10, 19], [2557, 2557, 10, 2], [2558, 2558, 10, 23], [2561, 2562, 11, 23], [2563, 2563, 11, 18], [2565, 2570, 11, 19], [2575, 2576, 11, 19], [2579, 2600, 11, 19], [2602, 2608, 11, 19], [2610, 2611, 11, 19], [2613, 2614, 11, 19], [2616, 2617, 11, 19], [2620, 2620, 11, 23], [2622, 2624, 11, 18], [2625, 2626, 11, 23], [2631, 2632, 11, 23], [2635, 2637, 11, 23], [2641, 2641, 11, 23], [2649, 2652, 11, 19], [2654, 2654, 11, 19], [2662, 2671, 11, 8], [2672, 2673, 11, 23], [2674, 2676, 11, 19], [2677, 2677, 11, 23], [2678, 2678, 11, 2], [2689, 2690, 12, 23], [2691, 2691, 12, 18], [2693, 2701, 12, 19], [2703, 2705, 12, 19], [2707, 2728, 12, 19], [2730, 2736, 12, 19], [2738, 2739, 12, 19], [2741, 2745, 12, 19], [2748, 2748, 12, 23], [2749, 2749, 12, 19], [2750, 2752, 12, 18], [2753, 2757, 12, 23], [2759, 2760, 12, 23], [2761, 2761, 12, 18], [2763, 2764, 12, 18], [2765, 2765, 12, 23], [2768, 2768, 12, 19], [2784, 2785, 12, 19], [2786, 2787, 12, 23], [2790, 2799, 12, 8], [2800, 2800, 12, 2], [2801, 2801, 12, 3], [2809, 2809, 12, 19], [2810, 2815, 12, 23], [2817, 2817, 13, 23], [2818, 2819, 13, 18], [2821, 2828, 13, 19], [2831, 2832, 13, 19], [2835, 2856, 13, 19], [2858, 2864, 13, 19], [2866, 2867, 13, 19], [2869, 2873, 13, 19], [2876, 2876, 13, 23], [2877, 2877, 13, 19], [2878, 2878, 13, 18], [2879, 2879, 13, 23], [2880, 2880, 13, 18], [2881, 2884, 13, 23], [2887, 2888, 13, 18], [2891, 2892, 13, 18], [2893, 2893, 13, 23], [2902, 2902, 13, 23], [2903, 2903, 13, 18], [2908, 2909, 13, 19], [2911, 2913, 13, 19], [2914, 2915, 13, 23], [2918, 2927, 13, 8], [2928, 2928, 13, 11], [2929, 2929, 13, 19], [2930, 2935, 13, 14], [2946, 2946, 14, 23], [2947, 2947, 14, 19], [2949, 2954, 14, 19], [2958, 2960, 14, 19], [2962, 2965, 14, 19], [2969, 2970, 14, 19], [2972, 2972, 14, 19], [2974, 2975, 14, 19], [2979, 2980, 14, 19], [2984, 2986, 14, 19], [2990, 3001, 14, 19], [3006, 3007, 14, 18], [3008, 3008, 14, 23], [3009, 3010, 14, 18], [3014, 3016, 14, 18], [3018, 3020, 14, 18], [3021, 3021, 14, 23], [3024, 3024, 14, 19], [3031, 3031, 14, 18], [3046, 3055, 14, 8], [3056, 3058, 14, 14], [3059, 3064, 14, 11], [3065, 3065, 14, 3], [3066, 3066, 14, 11], [3072, 3072, 15, 23], [3073, 3075, 15, 18], [3076, 3076, 15, 23], [3077, 3084, 15, 19], [3086, 3088, 15, 19], [3090, 3112, 15, 19], [3114, 3129, 15, 19], [3133, 3133, 15, 19], [3134, 3136, 15, 23], [3137, 3140, 15, 18], [3142, 3144, 15, 23], [3146, 3149, 15, 23], [3157, 3158, 15, 23], [3160, 3162, 15, 19], [3168, 3169, 15, 19], [3170, 3171, 15, 23], [3174, 3183, 15, 8], [3192, 3198, 15, 14], [3199, 3199, 15, 11], [3200, 3200, 16, 19], [3201, 3201, 16, 23], [3202, 3203, 16, 18], [3204, 3204, 16, 2], [3205, 3212, 16, 19], [3214, 3216, 16, 19], [3218, 3240, 16, 19], [3242, 3251, 16, 19], [3253, 3257, 16, 19], [3260, 3260, 16, 23], [3261, 3261, 16, 19], [3262, 3262, 16, 18], [3263, 3263, 16, 23], [3264, 3268, 16, 18], [3270, 3270, 16, 23], [3271, 3272, 16, 18], [3274, 3275, 16, 18], [3276, 3277, 16, 23], [3285, 3286, 16, 18], [3294, 3294, 16, 19], [3296, 3297, 16, 19], [3298, 3299, 16, 23], [3302, 3311, 16, 8], [3313, 3314, 16, 19], [3328, 3329, 17, 23], [3330, 3331, 17, 18], [3333, 3340, 17, 19], [3342, 3344, 17, 19], [3346, 3386, 17, 19], [3387, 3388, 17, 23], [3389, 3389, 17, 19], [3390, 3392, 17, 18], [3393, 3396, 17, 23], [3398, 3400, 17, 18], [3402, 3404, 17, 18], [3405, 3405, 17, 23], [3406, 3406, 17, 19], [3407, 3407, 17, 11], [3412, 3414, 17, 19], [3415, 3415, 17, 18], [3416, 3422, 17, 14], [3423, 3425, 17, 19], [3426, 3427, 17, 23], [3430, 3439, 17, 8], [3440, 3448, 17, 14], [3449, 3449, 17, 11], [3450, 3455, 17, 19], [3458, 3459, 18, 18], [3461, 3478, 18, 19], [3482, 3505, 18, 19], [3507, 3515, 18, 19], [3517, 3517, 18, 19], [3520, 3526, 18, 19], [3530, 3530, 18, 23], [3535, 3537, 18, 18], [3538, 3540, 18, 23], [3542, 3542, 18, 23], [3544, 3551, 18, 18], [3558, 3567, 18, 8], [3570, 3571, 18, 18], [3572, 3572, 18, 2], [3585, 3632, 19, 19], [3633, 3633, 19, 23], [3634, 3635, 19, 19], [3636, 3642, 19, 23], [3647, 3647, 0, 3], [3648, 3653, 19, 19], [3654, 3654, 19, 17], [3655, 3662, 19, 23], [3663, 3663, 19, 2], [3664, 3673, 19, 8], [3674, 3675, 19, 2], [3713, 3714, 20, 19], [3716, 3716, 20, 19], [3719, 3720, 20, 19], [3722, 3722, 20, 19], [3725, 3725, 20, 19], [3732, 3735, 20, 19], [3737, 3743, 20, 19], [3745, 3747, 20, 19], [3749, 3749, 20, 19], [3751, 3751, 20, 19], [3754, 3755, 20, 19], [3757, 3760, 20, 19], [3761, 3761, 20, 23], [3762, 3763, 20, 19], [3764, 3769, 20, 23], [3771, 3772, 20, 23], [3773, 3773, 20, 19], [3776, 3780, 20, 19], [3782, 3782, 20, 17], [3784, 3789, 20, 23], [3792, 3801, 20, 8], [3804, 3807, 20, 19], [3840, 3840, 21, 19], [3841, 3843, 21, 11], [3844, 3858, 21, 2], [3859, 3859, 21, 11], [3860, 3860, 21, 2], [3861, 3863, 21, 11], [3864, 3865, 21, 23], [3866, 3871, 21, 11], [3872, 3881, 21, 8], [3882, 3891, 21, 14], [3892, 3892, 21, 11], [3893, 3893, 21, 23], [3894, 3894, 21, 11], [3895, 3895, 21, 23], [3896, 3896, 21, 11], [3897, 3897, 21, 23], [3898, 3898, 21, 4], [3899, 3899, 21, 5], [3900, 3900, 21, 4], [3901, 3901, 21, 5], [3902, 3903, 21, 18], [3904, 3911, 21, 19], [3913, 3948, 21, 19], [3953, 3966, 21, 23], [3967, 3967, 21, 18], [3968, 3972, 21, 23], [3973, 3973, 21, 2], [3974, 3975, 21, 23], [3976, 3980, 21, 19], [3981, 3991, 21, 23], [3993, 4028, 21, 23], [4030, 4037, 21, 11], [4038, 4038, 21, 23], [4039, 4044, 21, 11], [4046, 4047, 21, 11], [4048, 4052, 21, 2], [4053, 4056, 0, 11], [4057, 4058, 21, 2], [4096, 4138, 22, 19], [4139, 4140, 22, 18], [4141, 4144, 22, 23], [4145, 4145, 22, 18], [4146, 4151, 22, 23], [4152, 4152, 22, 18], [4153, 4154, 22, 23], [4155, 4156, 22, 18], [4157, 4158, 22, 23], [4159, 4159, 22, 19], [4160, 4169, 22, 8], [4170, 4175, 22, 2], [4176, 4181, 22, 19], [4182, 4183, 22, 18], [4184, 4185, 22, 23], [4186, 4189, 22, 19], [4190, 4192, 22, 23], [4193, 4193, 22, 19], [4194, 4196, 22, 18], [4197, 4198, 22, 19], [4199, 4205, 22, 18], [4206, 4208, 22, 19], [4209, 4212, 22, 23], [4213, 4225, 22, 19], [4226, 4226, 22, 23], [4227, 4228, 22, 18], [4229, 4230, 22, 23], [4231, 4236, 22, 18], [4237, 4237, 22, 23], [4238, 4238, 22, 19], [4239, 4239, 22, 18], [4240, 4249, 22, 8], [4250, 4252, 22, 18], [4253, 4253, 22, 23], [4254, 4255, 22, 11], [4256, 4293, 23, 15], [4295, 4295, 23, 15], [4301, 4301, 23, 15], [4304, 4346, 23, 15], [4347, 4347, 0, 2], [4348, 4348, 23, 17], [4349, 4351, 23, 15], [4352, 4607, 24, 19], [4608, 4680, 25, 19], [4682, 4685, 25, 19], [4688, 4694, 25, 19], [4696, 4696, 25, 19], [4698, 4701, 25, 19], [4704, 4744, 25, 19], [4746, 4749, 25, 19], [4752, 4784, 25, 19], [4786, 4789, 25, 19], [4792, 4798, 25, 19], [4800, 4800, 25, 19], [4802, 4805, 25, 19], [4808, 4822, 25, 19], [4824, 4880, 25, 19], [4882, 4885, 25, 19], [4888, 4954, 25, 19], [4957, 4959, 25, 23], [4960, 4968, 25, 2], [4969, 4988, 25, 14], [4992, 5007, 25, 19], [5008, 5017, 25, 11], [5024, 5109, 26, 15], [5112, 5117, 26, 15], [5120, 5120, 27, 7], [5121, 5740, 27, 19], [5741, 5742, 27, 2], [5743, 5759, 27, 19], [5760, 5760, 28, 1], [5761, 5786, 28, 19], [5787, 5787, 28, 4], [5788, 5788, 28, 5], [5792, 5866, 29, 19], [5867, 5869, 0, 2], [5870, 5872, 29, 22], [5873, 5880, 29, 19], [5888, 5900, 41, 19], [5902, 5905, 41, 19], [5906, 5908, 41, 23], [5920, 5937, 42, 19], [5938, 5940, 42, 23], [5941, 5942, 0, 2], [5952, 5969, 43, 19], [5970, 5971, 43, 23], [5984, 5996, 44, 19], [5998, 6000, 44, 19], [6002, 6003, 44, 23], [6016, 6067, 30, 19], [6068, 6069, 30, 23], [6070, 6070, 30, 18], [6071, 6077, 30, 23], [6078, 6085, 30, 18], [6086, 6086, 30, 23], [6087, 6088, 30, 18], [6089, 6099, 30, 23], [6100, 6102, 30, 2], [6103, 6103, 30, 17], [6104, 6106, 30, 2], [6107, 6107, 30, 3], [6108, 6108, 30, 19], [6109, 6109, 30, 23], [6112, 6121, 30, 8], [6128, 6137, 30, 14], [6144, 6145, 31, 2], [6146, 6147, 0, 2], [6148, 6148, 31, 2], [6149, 6149, 0, 2], [6150, 6150, 31, 7], [6151, 6154, 31, 2], [6155, 6157, 31, 23], [6158, 6158, 31, 13], [6160, 6169, 31, 8], [6176, 6210, 31, 19], [6211, 6211, 31, 17], [6212, 6264, 31, 19], [6272, 6276, 31, 19], [6277, 6278, 31, 23], [6279, 6312, 31, 19], [6313, 6313, 31, 23], [6314, 6314, 31, 19], [6320, 6389, 27, 19], [6400, 6430, 45, 19], [6432, 6434, 45, 23], [6435, 6438, 45, 18], [6439, 6440, 45, 23], [6441, 6443, 45, 18], [6448, 6449, 45, 18], [6450, 6450, 45, 23], [6451, 6456, 45, 18], [6457, 6459, 45, 23], [6464, 6464, 45, 11], [6468, 6469, 45, 2], [6470, 6479, 45, 8], [6480, 6509, 46, 19], [6512, 6516, 46, 19], [6528, 6571, 55, 19], [6576, 6601, 55, 19], [6608, 6617, 55, 8], [6618, 6618, 55, 14], [6622, 6623, 55, 11], [6624, 6655, 30, 11], [6656, 6678, 53, 19], [6679, 6680, 53, 23], [6681, 6682, 53, 18], [6683, 6683, 53, 23], [6686, 6687, 53, 2], [6688, 6740, 77, 19], [6741, 6741, 77, 18], [6742, 6742, 77, 23], [6743, 6743, 77, 18], [6744, 6750, 77, 23], [6752, 6752, 77, 23], [6753, 6753, 77, 18], [6754, 6754, 77, 23], [6755, 6756, 77, 18], [6757, 6764, 77, 23], [6765, 6770, 77, 18], [6771, 6780, 77, 23], [6783, 6783, 77, 23], [6784, 6793, 77, 8], [6800, 6809, 77, 8], [6816, 6822, 77, 2], [6823, 6823, 77, 17], [6824, 6829, 77, 2], [6832, 6845, 40, 23], [6846, 6846, 40, 24], [6912, 6915, 61, 23], [6916, 6916, 61, 18], [6917, 6963, 61, 19], [6964, 6964, 61, 23], [6965, 6965, 61, 18], [6966, 6970, 61, 23], [6971, 6971, 61, 18], [6972, 6972, 61, 23], [6973, 6977, 61, 18], [6978, 6978, 61, 23], [6979, 6980, 61, 18], [6981, 6987, 61, 19], [6992, 7001, 61, 8], [7002, 7008, 61, 2], [7009, 7018, 61, 11], [7019, 7027, 61, 23], [7028, 7036, 61, 11], [7040, 7041, 66, 23], [7042, 7042, 66, 18], [7043, 7072, 66, 19], [7073, 7073, 66, 18], [7074, 7077, 66, 23], [7078, 7079, 66, 18], [7080, 7081, 66, 23], [7082, 7082, 66, 18], [7083, 7085, 66, 23], [7086, 7087, 66, 19], [7088, 7097, 66, 8], [7098, 7103, 66, 19], [7104, 7141, 92, 19], [7142, 7142, 92, 23], [7143, 7143, 92, 18], [7144, 7145, 92, 23], [7146, 7148, 92, 18], [7149, 7149, 92, 23], [7150, 7150, 92, 18], [7151, 7153, 92, 23], [7154, 7155, 92, 18], [7164, 7167, 92, 2], [7168, 7203, 67, 19], [7204, 7211, 67, 18], [7212, 7219, 67, 23], [7220, 7221, 67, 18], [7222, 7223, 67, 23], [7227, 7231, 67, 2], [7232, 7241, 67, 8], [7245, 7247, 67, 19], [7248, 7257, 68, 8], [7258, 7287, 68, 19], [7288, 7293, 68, 17], [7294, 7295, 68, 2], [7296, 7304, 3, 15], [7312, 7354, 23, 15], [7357, 7359, 23, 15], [7360, 7367, 66, 2], [7376, 7378, 40, 23], [7379, 7379, 0, 2], [7380, 7392, 40, 23], [7393, 7393, 0, 18], [7394, 7400, 40, 23], [7401, 7404, 0, 19], [7405, 7405, 40, 23], [7406, 7409, 0, 19], [7410, 7411, 0, 18], [7412, 7412, 40, 23], [7413, 7414, 0, 19], [7415, 7415, 0, 18], [7416, 7417, 40, 23], [7424, 7461, 1, 15], [7462, 7466, 2, 15], [7467, 7467, 3, 15], [7468, 7516, 1, 17], [7517, 7521, 2, 17], [7522, 7525, 1, 17], [7526, 7530, 2, 17], [7531, 7543, 1, 15], [7544, 7544, 3, 17], [7545, 7578, 1, 15], [7579, 7614, 1, 17], [7615, 7615, 2, 17], [7616, 7673, 40, 23], [7675, 7679, 40, 23], [7680, 7935, 1, 15], [7936, 7957, 2, 15], [7960, 7965, 2, 15], [7968, 8005, 2, 15], [8008, 8013, 2, 15], [8016, 8023, 2, 15], [8025, 8025, 2, 15], [8027, 8027, 2, 15], [8029, 8029, 2, 15], [8031, 8061, 2, 15], [8064, 8116, 2, 15], [8118, 8124, 2, 15], [8125, 8125, 2, 9], [8126, 8126, 2, 15], [8127, 8129, 2, 9], [8130, 8132, 2, 15], [8134, 8140, 2, 15], [8141, 8143, 2, 9], [8144, 8147, 2, 15], [8150, 8155, 2, 15], [8157, 8159, 2, 9], [8160, 8172, 2, 15], [8173, 8175, 2, 9], [8178, 8180, 2, 15], [8182, 8188, 2, 15], [8189, 8190, 2, 9], [8192, 8202, 0, 1], [8203, 8203, 0, 13], [8204, 8205, 40, 13], [8206, 8207, 0, 13], [8208, 8213, 0, 7], [8214, 8215, 0, 2], [8216, 8216, 0, 12], [8217, 8217, 0, 16], [8218, 8218, 0, 4], [8219, 8220, 0, 12], [8221, 8221, 0, 16], [8222, 8222, 0, 4], [8223, 8223, 0, 12], [8224, 8231, 0, 2], [8232, 8232, 0, 20], [8233, 8233, 0, 21], [8234, 8238, 0, 13], [8239, 8239, 0, 1], [8240, 8248, 0, 2], [8249, 8249, 0, 12], [8250, 8250, 0, 16], [8251, 8254, 0, 2], [8255, 8256, 0, 10], [8257, 8259, 0, 2], [8260, 8260, 0, 6], [8261, 8261, 0, 4], [8262, 8262, 0, 5], [8263, 8273, 0, 2], [8274, 8274, 0, 6], [8275, 8275, 0, 2], [8276, 8276, 0, 10], [8277, 8286, 0, 2], [8287, 8287, 0, 1], [8288, 8292, 0, 13], [8294, 8303, 0, 13], [8304, 8304, 0, 14], [8305, 8305, 1, 17], [8308, 8313, 0, 14], [8314, 8316, 0, 6], [8317, 8317, 0, 4], [8318, 8318, 0, 5], [8319, 8319, 1, 17], [8320, 8329, 0, 14], [8330, 8332, 0, 6], [8333, 8333, 0, 4], [8334, 8334, 0, 5], [8336, 8348, 1, 17], [8352, 8383, 0, 3], [8400, 8412, 40, 23], [8413, 8416, 40, 24], [8417, 8417, 40, 23], [8418, 8420, 40, 24], [8421, 8432, 40, 23], [8448, 8449, 0, 11], [8450, 8450, 0, 15], [8451, 8454, 0, 11], [8455, 8455, 0, 15], [8456, 8457, 0, 11], [8458, 8467, 0, 15], [8468, 8468, 0, 11], [8469, 8469, 0, 15], [8470, 8471, 0, 11], [8472, 8472, 0, 6], [8473, 8477, 0, 15], [8478, 8483, 0, 11], [8484, 8484, 0, 15], [8485, 8485, 0, 11], [8486, 8486, 2, 15], [8487, 8487, 0, 11], [8488, 8488, 0, 15], [8489, 8489, 0, 11], [8490, 8491, 1, 15], [8492, 8493, 0, 15], [8494, 8494, 0, 11], [8495, 8497, 0, 15], [8498, 8498, 1, 15], [8499, 8500, 0, 15], [8501, 8504, 0, 19], [8505, 8505, 0, 15], [8506, 8507, 0, 11], [8508, 8511, 0, 15], [8512, 8516, 0, 6], [8517, 8521, 0, 15], [8522, 8522, 0, 11], [8523, 8523, 0, 6], [8524, 8525, 0, 11], [8526, 8526, 1, 15], [8527, 8527, 0, 11], [8528, 8543, 0, 14], [8544, 8578, 1, 22], [8579, 8580, 1, 15], [8581, 8584, 1, 22], [8585, 8585, 0, 14], [8586, 8587, 0, 11], [8592, 8596, 0, 6], [8597, 8601, 0, 11], [8602, 8603, 0, 6], [8604, 8607, 0, 11], [8608, 8608, 0, 6], [8609, 8610, 0, 11], [8611, 8611, 0, 6], [8612, 8613, 0, 11], [8614, 8614, 0, 6], [8615, 8621, 0, 11], [8622, 8622, 0, 6], [8623, 8653, 0, 11], [8654, 8655, 0, 6], [8656, 8657, 0, 11], [8658, 8658, 0, 6], [8659, 8659, 0, 11], [8660, 8660, 0, 6], [8661, 8691, 0, 11], [8692, 8959, 0, 6], [8960, 8967, 0, 11], [8968, 8968, 0, 4], [8969, 8969, 0, 5], [8970, 8970, 0, 4], [8971, 8971, 0, 5], [8972, 8991, 0, 11], [8992, 8993, 0, 6], [8994, 9000, 0, 11], [9001, 9001, 0, 4], [9002, 9002, 0, 5], [9003, 9083, 0, 11], [9084, 9084, 0, 6], [9085, 9114, 0, 11], [9115, 9139, 0, 6], [9140, 9179, 0, 11], [9180, 9185, 0, 6], [9186, 9254, 0, 11], [9280, 9290, 0, 11], [9312, 9371, 0, 14], [9372, 9449, 0, 11], [9450, 9471, 0, 14], [9472, 9654, 0, 11], [9655, 9655, 0, 6], [9656, 9664, 0, 11], [9665, 9665, 0, 6], [9666, 9719, 0, 11], [9720, 9727, 0, 6], [9728, 9838, 0, 11], [9839, 9839, 0, 6], [9840, 10087, 0, 11], [10088, 10088, 0, 4], [10089, 10089, 0, 5], [10090, 10090, 0, 4], [10091, 10091, 0, 5], [10092, 10092, 0, 4], [10093, 10093, 0, 5], [10094, 10094, 0, 4], [10095, 10095, 0, 5], [10096, 10096, 0, 4], [10097, 10097, 0, 5], [10098, 10098, 0, 4], [10099, 10099, 0, 5], [10100, 10100, 0, 4], [10101, 10101, 0, 5], [10102, 10131, 0, 14], [10132, 10175, 0, 11], [10176, 10180, 0, 6], [10181, 10181, 0, 4], [10182, 10182, 0, 5], [10183, 10213, 0, 6], [10214, 10214, 0, 4], [10215, 10215, 0, 5], [10216, 10216, 0, 4], [10217, 10217, 0, 5], [10218, 10218, 0, 4], [10219, 10219, 0, 5], [10220, 10220, 0, 4], [10221, 10221, 0, 5], [10222, 10222, 0, 4], [10223, 10223, 0, 5], [10224, 10239, 0, 6], [10240, 10495, 52, 11], [10496, 10626, 0, 6], [10627, 10627, 0, 4], [10628, 10628, 0, 5], [10629, 10629, 0, 4], [10630, 10630, 0, 5], [10631, 10631, 0, 4], [10632, 10632, 0, 5], [10633, 10633, 0, 4], [10634, 10634, 0, 5], [10635, 10635, 0, 4], [10636, 10636, 0, 5], [10637, 10637, 0, 4], [10638, 10638, 0, 5], [10639, 10639, 0, 4], [10640, 10640, 0, 5], [10641, 10641, 0, 4], [10642, 10642, 0, 5], [10643, 10643, 0, 4], [10644, 10644, 0, 5], [10645, 10645, 0, 4], [10646, 10646, 0, 5], [10647, 10647, 0, 4], [10648, 10648, 0, 5], [10649, 10711, 0, 6], [10712, 10712, 0, 4], [10713, 10713, 0, 5], [10714, 10714, 0, 4], [10715, 10715, 0, 5], [10716, 10747, 0, 6], [10748, 10748, 0, 4], [10749, 10749, 0, 5], [10750, 11007, 0, 6], [11008, 11055, 0, 11], [11056, 11076, 0, 6], [11077, 11078, 0, 11], [11079, 11084, 0, 6], [11085, 11123, 0, 11], [11126, 11157, 0, 11], [11160, 11208, 0, 11], [11210, 11262, 0, 11], [11264, 11310, 56, 15], [11312, 11358, 56, 15], [11360, 11387, 1, 15], [11388, 11389, 1, 17], [11390, 11391, 1, 15], [11392, 11492, 54, 15], [11493, 11498, 54, 11], [11499, 11502, 54, 15], [11503, 11505, 54, 23], [11506, 11507, 54, 15], [11513, 11516, 54, 2], [11517, 11517, 54, 14], [11518, 11519, 54, 2], [11520, 11557, 23, 15], [11559, 11559, 23, 15], [11565, 11565, 23, 15], [11568, 11623, 57, 19], [11631, 11631, 57, 17], [11632, 11632, 57, 2], [11647, 11647, 57, 23], [11648, 11670, 25, 19], [11680, 11686, 25, 19], [11688, 11694, 25, 19], [11696, 11702, 25, 19], [11704, 11710, 25, 19], [11712, 11718, 25, 19], [11720, 11726, 25, 19], [11728, 11734, 25, 19], [11736, 11742, 25, 19], [11744, 11775, 3, 23], [11776, 11777, 0, 2], [11778, 11778, 0, 12], [11779, 11779, 0, 16], [11780, 11780, 0, 12], [11781, 11781, 0, 16], [11782, 11784, 0, 2], [11785, 11785, 0, 12], [11786, 11786, 0, 16], [11787, 11787, 0, 2], [11788, 11788, 0, 12], [11789, 11789, 0, 16], [11790, 11798, 0, 2], [11799, 11799, 0, 7], [11800, 11801, 0, 2], [11802, 11802, 0, 7], [11803, 11803, 0, 2], [11804, 11804, 0, 12], [11805, 11805, 0, 16], [11806, 11807, 0, 2], [11808, 11808, 0, 12], [11809, 11809, 0, 16], [11810, 11810, 0, 4], [11811, 11811, 0, 5], [11812, 11812, 0, 4], [11813, 11813, 0, 5], [11814, 11814, 0, 4], [11815, 11815, 0, 5], [11816, 11816, 0, 4], [11817, 11817, 0, 5], [11818, 11822, 0, 2], [11823, 11823, 0, 17], [11824, 11833, 0, 2], [11834, 11835, 0, 7], [11836, 11839, 0, 2], [11840, 11840, 0, 7], [11841, 11841, 0, 2], [11842, 11842, 0, 4], [11843, 11854, 0, 2], [11904, 11929, 35, 11], [11931, 12019, 35, 11], [12032, 12245, 35, 11], [12272, 12283, 0, 11], [12288, 12288, 0, 1], [12289, 12291, 0, 2], [12292, 12292, 0, 11], [12293, 12293, 35, 17], [12294, 12294, 0, 19], [12295, 12295, 35, 22], [12296, 12296, 0, 4], [12297, 12297, 0, 5], [12298, 12298, 0, 4], [12299, 12299, 0, 5], [12300, 12300, 0, 4], [12301, 12301, 0, 5], [12302, 12302, 0, 4], [12303, 12303, 0, 5], [12304, 12304, 0, 4], [12305, 12305, 0, 5], [12306, 12307, 0, 11], [12308, 12308, 0, 4], [12309, 12309, 0, 5], [12310, 12310, 0, 4], [12311, 12311, 0, 5], [12312, 12312, 0, 4], [12313, 12313, 0, 5], [12314, 12314, 0, 4], [12315, 12315, 0, 5], [12316, 12316, 0, 7], [12317, 12317, 0, 4], [12318, 12319, 0, 5], [12320, 12320, 0, 11], [12321, 12329, 35, 22], [12330, 12333, 40, 23], [12334, 12335, 24, 18], [12336, 12336, 0, 7], [12337, 12341, 0, 17], [12342, 12343, 0, 11], [12344, 12346, 35, 22], [12347, 12347, 35, 17], [12348, 12348, 0, 19], [12349, 12349, 0, 2], [12350, 12351, 0, 11], [12353, 12438, 32, 19], [12441, 12442, 40, 23], [12443, 12444, 0, 9], [12445, 12446, 32, 17], [12447, 12447, 32, 19], [12448, 12448, 0, 7], [12449, 12538, 33, 19], [12539, 12539, 0, 2], [12540, 12540, 0, 17], [12541, 12542, 33, 17], [12543, 12543, 33, 19], [12549, 12591, 34, 19], [12593, 12686, 24, 19], [12688, 12689, 0, 11], [12690, 12693, 0, 14], [12694, 12703, 0, 11], [12704, 12730, 34, 19], [12736, 12771, 0, 11], [12784, 12799, 33, 19], [12800, 12830, 24, 11], [12832, 12841, 0, 14], [12842, 12871, 0, 11], [12872, 12879, 0, 14], [12880, 12880, 0, 11], [12881, 12895, 0, 14], [12896, 12926, 24, 11], [12927, 12927, 0, 11], [12928, 12937, 0, 14], [12938, 12976, 0, 11], [12977, 12991, 0, 14], [12992, 13007, 0, 11], [13008, 13054, 33, 11], [13056, 13143, 33, 11], [13144, 13311, 0, 11], [13312, 19893, 35, 19], [19904, 19967, 0, 11], [19968, 40943, 35, 19], [40960, 40980, 36, 19], [40981, 40981, 36, 17], [40982, 42124, 36, 19], [42128, 42182, 36, 11], [42192, 42231, 82, 19], [42232, 42237, 82, 17], [42238, 42239, 82, 2], [42240, 42507, 69, 19], [42508, 42508, 69, 17], [42509, 42511, 69, 2], [42512, 42527, 69, 19], [42528, 42537, 69, 8], [42538, 42539, 69, 19], [42560, 42605, 3, 15], [42606, 42606, 3, 19], [42607, 42607, 3, 23], [42608, 42610, 3, 24], [42611, 42611, 3, 2], [42612, 42621, 3, 23], [42622, 42622, 3, 2], [42623, 42623, 3, 17], [42624, 42651, 3, 15], [42652, 42653, 3, 17], [42654, 42655, 3, 23], [42656, 42725, 83, 19], [42726, 42735, 83, 22], [42736, 42737, 83, 23], [42738, 42743, 83, 2], [42752, 42774, 0, 9], [42775, 42783, 0, 17], [42784, 42785, 0, 9], [42786, 42863, 1, 15], [42864, 42864, 1, 17], [42865, 42887, 1, 15], [42888, 42888, 0, 17], [42889, 42890, 0, 9], [42891, 42894, 1, 15], [42895, 42895, 1, 19], [42896, 42937, 1, 15], [42999, 42999, 1, 19], [43000, 43001, 1, 17], [43002, 43002, 1, 15], [43003, 43007, 1, 19], [43008, 43009, 58, 19], [43010, 43010, 58, 23], [43011, 43013, 58, 19], [43014, 43014, 58, 23], [43015, 43018, 58, 19], [43019, 43019, 58, 23], [43020, 43042, 58, 19], [43043, 43044, 58, 18], [43045, 43046, 58, 23], [43047, 43047, 58, 18], [43048, 43051, 58, 11], [43056, 43061, 0, 14], [43062, 43063, 0, 11], [43064, 43064, 0, 3], [43065, 43065, 0, 11], [43072, 43123, 64, 19], [43124, 43127, 64, 2], [43136, 43137, 70, 18], [43138, 43187, 70, 19], [43188, 43203, 70, 18], [43204, 43205, 70, 23], [43214, 43215, 70, 2], [43216, 43225, 70, 8], [43232, 43249, 9, 23], [43250, 43255, 9, 19], [43256, 43258, 9, 2], [43259, 43259, 9, 19], [43260, 43260, 9, 2], [43261, 43262, 9, 19], [43263, 43263, 9, 23], [43264, 43273, 71, 8], [43274, 43301, 71, 19], [43302, 43309, 71, 23], [43310, 43310, 0, 2], [43311, 43311, 71, 2], [43312, 43334, 72, 19], [43335, 43345, 72, 23], [43346, 43347, 72, 18], [43359, 43359, 72, 2], [43360, 43388, 24, 19], [43392, 43394, 84, 23], [43395, 43395, 84, 18], [43396, 43442, 84, 19], [43443, 43443, 84, 23], [43444, 43445, 84, 18], [43446, 43449, 84, 23], [43450, 43451, 84, 18], [43452, 43452, 84, 23], [43453, 43456, 84, 18], [43457, 43469, 84, 2], [43471, 43471, 0, 17], [43472, 43481, 84, 8], [43486, 43487, 84, 2], [43488, 43492, 22, 19], [43493, 43493, 22, 23], [43494, 43494, 22, 17], [43495, 43503, 22, 19], [43504, 43513, 22, 8], [43514, 43518, 22, 19], [43520, 43560, 76, 19], [43561, 43566, 76, 23], [43567, 43568, 76, 18], [43569, 43570, 76, 23], [43571, 43572, 76, 18], [43573, 43574, 76, 23], [43584, 43586, 76, 19], [43587, 43587, 76, 23], [43588, 43595, 76, 19], [43596, 43596, 76, 23], [43597, 43597, 76, 18], [43600, 43609, 76, 8], [43612, 43615, 76, 2], [43616, 43631, 22, 19], [43632, 43632, 22, 17], [43633, 43638, 22, 19], [43639, 43641, 22, 11], [43642, 43642, 22, 19], [43643, 43643, 22, 18], [43644, 43644, 22, 23], [43645, 43645, 22, 18], [43646, 43647, 22, 19], [43648, 43695, 78, 19], [43696, 43696, 78, 23], [43697, 43697, 78, 19], [43698, 43700, 78, 23], [43701, 43702, 78, 19], [43703, 43704, 78, 23], [43705, 43709, 78, 19], [43710, 43711, 78, 23], [43712, 43712, 78, 19], [43713, 43713, 78, 23], [43714, 43714, 78, 19], [43739, 43740, 78, 19], [43741, 43741, 78, 17], [43742, 43743, 78, 2], [43744, 43754, 85, 19], [43755, 43755, 85, 18], [43756, 43757, 85, 23], [43758, 43759, 85, 18], [43760, 43761, 85, 2], [43762, 43762, 85, 19], [43763, 43764, 85, 17], [43765, 43765, 85, 18], [43766, 43766, 85, 23], [43777, 43782, 25, 19], [43785, 43790, 25, 19], [43793, 43798, 25, 19], [43808, 43814, 25, 19], [43816, 43822, 25, 19], [43824, 43866, 1, 15], [43867, 43867, 0, 9], [43868, 43871, 1, 17], [43872, 43876, 1, 15], [43877, 43877, 2, 15], [43888, 43967, 26, 15], [43968, 44002, 85, 19], [44003, 44004, 85, 18], [44005, 44005, 85, 23], [44006, 44007, 85, 18], [44008, 44008, 85, 23], [44009, 44010, 85, 18], [44011, 44011, 85, 2], [44012, 44012, 85, 18], [44013, 44013, 85, 23], [44016, 44025, 85, 8], [44032, 55203, 24, 19], [55216, 55238, 24, 19], [55243, 55291, 24, 19], [63744, 64109, 35, 19], [64112, 64217, 35, 19], [64256, 64262, 1, 15], [64275, 64279, 4, 15], [64285, 64285, 5, 19], [64286, 64286, 5, 23], [64287, 64296, 5, 19], [64297, 64297, 5, 6], [64298, 64310, 5, 19], [64312, 64316, 5, 19], [64318, 64318, 5, 19], [64320, 64321, 5, 19], [64323, 64324, 5, 19], [64326, 64335, 5, 19], [64336, 64433, 6, 19], [64434, 64449, 6, 9], [64467, 64829, 6, 19], [64830, 64830, 0, 5], [64831, 64831, 0, 4], [64848, 64911, 6, 19], [64914, 64967, 6, 19], [65008, 65019, 6, 19], [65020, 65020, 6, 3], [65021, 65021, 6, 11], [65024, 65039, 40, 23], [65040, 65046, 0, 2], [65047, 65047, 0, 4], [65048, 65048, 0, 5], [65049, 65049, 0, 2], [65056, 65069, 40, 23], [65070, 65071, 3, 23], [65072, 65072, 0, 2], [65073, 65074, 0, 7], [65075, 65076, 0, 10], [65077, 65077, 0, 4], [65078, 65078, 0, 5], [65079, 65079, 0, 4], [65080, 65080, 0, 5], [65081, 65081, 0, 4], [65082, 65082, 0, 5], [65083, 65083, 0, 4], [65084, 65084, 0, 5], [65085, 65085, 0, 4], [65086, 65086, 0, 5], [65087, 65087, 0, 4], [65088, 65088, 0, 5], [65089, 65089, 0, 4], [65090, 65090, 0, 5], [65091, 65091, 0, 4], [65092, 65092, 0, 5], [65093, 65094, 0, 2], [65095, 65095, 0, 4], [65096, 65096, 0, 5], [65097, 65100, 0, 2], [65101, 65103, 0, 10], [65104, 65106, 0, 2], [65108, 65111, 0, 2], [65112, 65112, 0, 7], [65113, 65113, 0, 4], [65114, 65114, 0, 5], [65115, 65115, 0, 4], [65116, 65116, 0, 5], [65117, 65117, 0, 4], [65118, 65118, 0, 5], [65119, 65121, 0, 2], [65122, 65122, 0, 6], [65123, 65123, 0, 7], [65124, 65126, 0, 6], [65128, 65128, 0, 2], [65129, 65129, 0, 3], [65130, 65131, 0, 2], [65136, 65140, 6, 19], [65142, 65276, 6, 19], [65279, 65279, 0, 13], [65281, 65283, 0, 2], [65284, 65284, 0, 3], [65285, 65287, 0, 2], [65288, 65288, 0, 4], [65289, 65289, 0, 5], [65290, 65290, 0, 2], [65291, 65291, 0, 6], [65292, 65292, 0, 2], [65293, 65293, 0, 7], [65294, 65295, 0, 2], [65296, 65305, 0, 8], [65306, 65307, 0, 2], [65308, 65310, 0, 6], [65311, 65312, 0, 2], [65313, 65338, 1, 15], [65339, 65339, 0, 4], [65340, 65340, 0, 2], [65341, 65341, 0, 5], [65342, 65342, 0, 9], [65343, 65343, 0, 10], [65344, 65344, 0, 9], [65345, 65370, 1, 15], [65371, 65371, 0, 4], [65372, 65372, 0, 6], [65373, 65373, 0, 5], [65374, 65374, 0, 6], [65375, 65375, 0, 4], [65376, 65376, 0, 5], [65377, 65377, 0, 2], [65378, 65378, 0, 4], [65379, 65379, 0, 5], [65380, 65381, 0, 2], [65382, 65391, 33, 19], [65392, 65392, 0, 17], [65393, 65437, 33, 19], [65438, 65439, 0, 17], [65440, 65470, 24, 19], [65474, 65479, 24, 19], [65482, 65487, 24, 19], [65490, 65495, 24, 19], [65498, 65500, 24, 19], [65504, 65505, 0, 3], [65506, 65506, 0, 6], [65507, 65507, 0, 9], [65508, 65508, 0, 11], [65509, 65510, 0, 3], [65512, 65512, 0, 11], [65513, 65516, 0, 6], [65517, 65518, 0, 11], [65529, 65531, 0, 13], [65532, 65533, 0, 11], [65536, 65547, 47, 19], [65549, 65574, 47, 19], [65576, 65594, 47, 19], [65596, 65597, 47, 19], [65599, 65613, 47, 19], [65616, 65629, 47, 19], [65664, 65786, 47, 19], [65792, 65794, 0, 2], [65799, 65843, 0, 14], [65847, 65855, 0, 11], [65856, 65908, 2, 22], [65909, 65912, 2, 14], [65913, 65929, 2, 11], [65930, 65931, 2, 14], [65932, 65934, 2, 11], [65936, 65947, 0, 11], [65952, 65952, 2, 11], [66000, 66044, 0, 11], [66045, 66045, 40, 23], [66176, 66204, 73, 19], [66208, 66256, 74, 19], [66272, 66272, 40, 23], [66273, 66299, 0, 14], [66304, 66335, 37, 19], [66336, 66339, 37, 14], [66349, 66351, 37, 19], [66352, 66368, 38, 19], [66369, 66369, 38, 22], [66370, 66377, 38, 19], [66378, 66378, 38, 22], [66384, 66421, 119, 19], [66422, 66426, 119, 23], [66432, 66461, 48, 19], [66463, 66463, 48, 2], [66464, 66499, 59, 19], [66504, 66511, 59, 19], [66512, 66512, 59, 2], [66513, 66517, 59, 22], [66560, 66639, 39, 15], [66640, 66687, 49, 19], [66688, 66717, 50, 19], [66720, 66729, 50, 8], [66736, 66771, 135, 15], [66776, 66811, 135, 15], [66816, 66855, 105, 19], [66864, 66915, 102, 19], [66927, 66927, 102, 2], [67072, 67382, 109, 19], [67392, 67413, 109, 19], [67424, 67431, 109, 19], [67584, 67589, 51, 19], [67592, 67592, 51, 19], [67594, 67637, 51, 19], [67639, 67640, 51, 19], [67644, 67644, 51, 19], [67647, 67647, 51, 19], [67648, 67669, 86, 19], [67671, 67671, 86, 2], [67672, 67679, 86, 14], [67680, 67702, 117, 19], [67703, 67704, 117, 11], [67705, 67711, 117, 14], [67712, 67742, 116, 19], [67751, 67759, 116, 14], [67808, 67826, 127, 19], [67828, 67829, 127, 19], [67835, 67839, 127, 14], [67840, 67861, 63, 19], [67862, 67867, 63, 14], [67871, 67871, 63, 2], [67872, 67897, 75, 19], [67903, 67903, 75, 2], [67968, 67999, 97, 19], [68000, 68023, 96, 19], [68028, 68029, 96, 14], [68030, 68031, 96, 19], [68032, 68047, 96, 14], [68050, 68095, 96, 14], [68096, 68096, 60, 19], [68097, 68099, 60, 23], [68101, 68102, 60, 23], [68108, 68111, 60, 23], [68112, 68115, 60, 19], [68117, 68119, 60, 19], [68121, 68149, 60, 19], [68152, 68154, 60, 23], [68159, 68159, 60, 23], [68160, 68168, 60, 14], [68176, 68184, 60, 2], [68192, 68220, 87, 19], [68221, 68222, 87, 14], [68223, 68223, 87, 2], [68224, 68252, 115, 19], [68253, 68255, 115, 14], [68288, 68295, 111, 19], [68296, 68296, 111, 11], [68297, 68324, 111, 19], [68325, 68326, 111, 23], [68331, 68335, 111, 14], [68336, 68342, 111, 2], [68352, 68405, 79, 19], [68409, 68415, 79, 2], [68416, 68437, 88, 19], [68440, 68447, 88, 14], [68448, 68466, 89, 19], [68472, 68479, 89, 14], [68480, 68497, 120, 19], [68505, 68508, 120, 2], [68521, 68527, 120, 14], [68608, 68680, 90, 19], [68736, 68786, 129, 15], [68800, 68850, 129, 15], [68858, 68863, 129, 14], [68864, 68899, 145, 19], [68900, 68903, 145, 23], [68912, 68921, 145, 8], [69216, 69246, 6, 14], [69376, 69404, 147, 19], [69405, 69414, 147, 14], [69415, 69415, 147, 19], [69424, 69445, 146, 19], [69446, 69456, 146, 23], [69457, 69460, 146, 14], [69461, 69465, 146, 2], [69632, 69632, 93, 18], [69633, 69633, 93, 23], [69634, 69634, 93, 18], [69635, 69687, 93, 19], [69688, 69702, 93, 23], [69703, 69709, 93, 2], [69714, 69733, 93, 14], [69734, 69743, 93, 8], [69759, 69759, 93, 23], [69760, 69761, 91, 23], [69762, 69762, 91, 18], [69763, 69807, 91, 19], [69808, 69810, 91, 18], [69811, 69814, 91, 23], [69815, 69816, 91, 18], [69817, 69818, 91, 23], [69819, 69820, 91, 2], [69821, 69821, 91, 13], [69822, 69825, 91, 2], [69837, 69837, 91, 13], [69840, 69864, 100, 19], [69872, 69881, 100, 8], [69888, 69890, 95, 23], [69891, 69926, 95, 19], [69927, 69931, 95, 23], [69932, 69932, 95, 18], [69933, 69940, 95, 23], [69942, 69951, 95, 8], [69952, 69955, 95, 2], [69956, 69956, 95, 19], [69957, 69958, 95, 18], [69968, 70002, 110, 19], [70003, 70003, 110, 23], [70004, 70005, 110, 2], [70006, 70006, 110, 19], [70016, 70017, 99, 23], [70018, 70018, 99, 18], [70019, 70066, 99, 19], [70067, 70069, 99, 18], [70070, 70078, 99, 23], [70079, 70080, 99, 18], [70081, 70084, 99, 19], [70085, 70088, 99, 2], [70089, 70092, 99, 23], [70093, 70093, 99, 2], [70096, 70105, 99, 8], [70106, 70106, 99, 19], [70107, 70107, 99, 2], [70108, 70108, 99, 19], [70109, 70111, 99, 2], [70113, 70132, 18, 14], [70144, 70161, 108, 19], [70163, 70187, 108, 19], [70188, 70190, 108, 18], [70191, 70193, 108, 23], [70194, 70195, 108, 18], [70196, 70196, 108, 23], [70197, 70197, 108, 18], [70198, 70199, 108, 23], [70200, 70205, 108, 2], [70206, 70206, 108, 23], [70272, 70278, 128, 19], [70280, 70280, 128, 19], [70282, 70285, 128, 19], [70287, 70301, 128, 19], [70303, 70312, 128, 19], [70313, 70313, 128, 2], [70320, 70366, 122, 19], [70367, 70367, 122, 23], [70368, 70370, 122, 18], [70371, 70378, 122, 23], [70384, 70393, 122, 8], [70400, 70401, 106, 23], [70402, 70403, 106, 18], [70405, 70412, 106, 19], [70415, 70416, 106, 19], [70419, 70440, 106, 19], [70442, 70448, 106, 19], [70450, 70451, 106, 19], [70453, 70457, 106, 19], [70459, 70459, 40, 23], [70460, 70460, 106, 23], [70461, 70461, 106, 19], [70462, 70463, 106, 18], [70464, 70464, 106, 23], [70465, 70468, 106, 18], [70471, 70472, 106, 18], [70475, 70477, 106, 18], [70480, 70480, 106, 19], [70487, 70487, 106, 18], [70493, 70497, 106, 19], [70498, 70499, 106, 18], [70502, 70508, 106, 23], [70512, 70516, 106, 23], [70656, 70708, 134, 19], [70709, 70711, 134, 18], [70712, 70719, 134, 23], [70720, 70721, 134, 18], [70722, 70724, 134, 23], [70725, 70725, 134, 18], [70726, 70726, 134, 23], [70727, 70730, 134, 19], [70731, 70735, 134, 2], [70736, 70745, 134, 8], [70747, 70747, 134, 2], [70749, 70749, 134, 2], [70750, 70750, 134, 23], [70784, 70831, 123, 19], [70832, 70834, 123, 18], [70835, 70840, 123, 23], [70841, 70841, 123, 18], [70842, 70842, 123, 23], [70843, 70846, 123, 18], [70847, 70848, 123, 23], [70849, 70849, 123, 18], [70850, 70851, 123, 23], [70852, 70853, 123, 19], [70854, 70854, 123, 2], [70855, 70855, 123, 19], [70864, 70873, 123, 8], [71040, 71086, 121, 19], [71087, 71089, 121, 18], [71090, 71093, 121, 23], [71096, 71099, 121, 18], [71100, 71101, 121, 23], [71102, 71102, 121, 18], [71103, 71104, 121, 23], [71105, 71127, 121, 2], [71128, 71131, 121, 19], [71132, 71133, 121, 23], [71168, 71215, 113, 19], [71216, 71218, 113, 18], [71219, 71226, 113, 23], [71227, 71228, 113, 18], [71229, 71229, 113, 23], [71230, 71230, 113, 18], [71231, 71232, 113, 23], [71233, 71235, 113, 2], [71236, 71236, 113, 19], [71248, 71257, 113, 8], [71264, 71276, 31, 2], [71296, 71338, 101, 19], [71339, 71339, 101, 23], [71340, 71340, 101, 18], [71341, 71341, 101, 23], [71342, 71343, 101, 18], [71344, 71349, 101, 23], [71350, 71350, 101, 18], [71351, 71351, 101, 23], [71360, 71369, 101, 8], [71424, 71450, 125, 19], [71453, 71455, 125, 23], [71456, 71457, 125, 18], [71458, 71461, 125, 23], [71462, 71462, 125, 18], [71463, 71467, 125, 23], [71472, 71481, 125, 8], [71482, 71483, 125, 14], [71484, 71486, 125, 2], [71487, 71487, 125, 11], [71680, 71723, 141, 19], [71724, 71726, 141, 18], [71727, 71735, 141, 23], [71736, 71736, 141, 18], [71737, 71738, 141, 23], [71739, 71739, 141, 2], [71840, 71903, 124, 15], [71904, 71913, 124, 8], [71914, 71922, 124, 14], [71935, 71935, 124, 19], [72192, 72192, 140, 19], [72193, 72202, 140, 23], [72203, 72242, 140, 19], [72243, 72248, 140, 23], [72249, 72249, 140, 18], [72250, 72250, 140, 19], [72251, 72254, 140, 23], [72255, 72262, 140, 2], [72263, 72263, 140, 23], [72272, 72272, 139, 19], [72273, 72278, 139, 23], [72279, 72280, 139, 18], [72281, 72283, 139, 23], [72284, 72323, 139, 19], [72326, 72329, 139, 19], [72330, 72342, 139, 23], [72343, 72343, 139, 18], [72344, 72345, 139, 23], [72346, 72348, 139, 2], [72349, 72349, 139, 19], [72350, 72354, 139, 2], [72384, 72440, 118, 19], [72704, 72712, 132, 19], [72714, 72750, 132, 19], [72751, 72751, 132, 18], [72752, 72758, 132, 23], [72760, 72765, 132, 23], [72766, 72766, 132, 18], [72767, 72767, 132, 23], [72768, 72768, 132, 19], [72769, 72773, 132, 2], [72784, 72793, 132, 8], [72794, 72812, 132, 14], [72816, 72817, 133, 2], [72818, 72847, 133, 19], [72850, 72871, 133, 23], [72873, 72873, 133, 18], [72874, 72880, 133, 23], [72881, 72881, 133, 18], [72882, 72883, 133, 23], [72884, 72884, 133, 18], [72885, 72886, 133, 23], [72960, 72966, 137, 19], [72968, 72969, 137, 19], [72971, 73008, 137, 19], [73009, 73014, 137, 23], [73018, 73018, 137, 23], [73020, 73021, 137, 23], [73023, 73029, 137, 23], [73030, 73030, 137, 19], [73031, 73031, 137, 23], [73040, 73049, 137, 8], [73056, 73061, 142, 19], [73063, 73064, 142, 19], [73066, 73097, 142, 19], [73098, 73102, 142, 18], [73104, 73105, 142, 23], [73107, 73108, 142, 18], [73109, 73109, 142, 23], [73110, 73110, 142, 18], [73111, 73111, 142, 23], [73112, 73112, 142, 19], [73120, 73129, 142, 8], [73440, 73458, 143, 19], [73459, 73460, 143, 23], [73461, 73462, 143, 18], [73463, 73464, 143, 2], [73728, 74649, 62, 19], [74752, 74862, 62, 22], [74864, 74868, 62, 2], [74880, 75075, 62, 19], [77824, 78894, 80, 19], [82944, 83526, 126, 19], [92160, 92728, 83, 19], [92736, 92766, 114, 19], [92768, 92777, 114, 8], [92782, 92783, 114, 2], [92880, 92909, 103, 19], [92912, 92916, 103, 23], [92917, 92917, 103, 2], [92928, 92975, 107, 19], [92976, 92982, 107, 23], [92983, 92987, 107, 2], [92988, 92991, 107, 11], [92992, 92995, 107, 17], [92996, 92996, 107, 2], [92997, 92997, 107, 11], [93008, 93017, 107, 8], [93019, 93025, 107, 14], [93027, 93047, 107, 19], [93053, 93071, 107, 19], [93760, 93823, 144, 15], [93824, 93846, 144, 14], [93847, 93850, 144, 2], [93952, 94020, 98, 19], [94032, 94032, 98, 19], [94033, 94078, 98, 18], [94095, 94098, 98, 23], [94099, 94111, 98, 17], [94176, 94176, 136, 17], [94177, 94177, 138, 17], [94208, 100337, 136, 19], [100352, 101106, 136, 19], [110592, 110592, 33, 19], [110593, 110878, 32, 19], [110960, 111355, 138, 19], [113664, 113770, 104, 19], [113776, 113788, 104, 19], [113792, 113800, 104, 19], [113808, 113817, 104, 19], [113820, 113820, 104, 11], [113821, 113822, 104, 23], [113823, 113823, 104, 2], [113824, 113827, 0, 13], [118784, 119029, 0, 11], [119040, 119078, 0, 11], [119081, 119140, 0, 11], [119141, 119142, 0, 18], [119143, 119145, 40, 23], [119146, 119148, 0, 11], [119149, 119154, 0, 18], [119155, 119162, 0, 13], [119163, 119170, 40, 23], [119171, 119172, 0, 11], [119173, 119179, 40, 23], [119180, 119209, 0, 11], [119210, 119213, 40, 23], [119214, 119272, 0, 11], [119296, 119361, 2, 11], [119362, 119364, 2, 23], [119365, 119365, 2, 11], [119520, 119539, 0, 14], [119552, 119638, 0, 11], [119648, 119672, 0, 14], [119808, 119892, 0, 15], [119894, 119964, 0, 15], [119966, 119967, 0, 15], [119970, 119970, 0, 15], [119973, 119974, 0, 15], [119977, 119980, 0, 15], [119982, 119993, 0, 15], [119995, 119995, 0, 15], [119997, 120003, 0, 15], [120005, 120069, 0, 15], [120071, 120074, 0, 15], [120077, 120084, 0, 15], [120086, 120092, 0, 15], [120094, 120121, 0, 15], [120123, 120126, 0, 15], [120128, 120132, 0, 15], [120134, 120134, 0, 15], [120138, 120144, 0, 15], [120146, 120485, 0, 15], [120488, 120512, 0, 15], [120513, 120513, 0, 6], [120514, 120538, 0, 15], [120539, 120539, 0, 6], [120540, 120570, 0, 15], [120571, 120571, 0, 6], [120572, 120596, 0, 15], [120597, 120597, 0, 6], [120598, 120628, 0, 15], [120629, 120629, 0, 6], [120630, 120654, 0, 15], [120655, 120655, 0, 6], [120656, 120686, 0, 15], [120687, 120687, 0, 6], [120688, 120712, 0, 15], [120713, 120713, 0, 6], [120714, 120744, 0, 15], [120745, 120745, 0, 6], [120746, 120770, 0, 15], [120771, 120771, 0, 6], [120772, 120779, 0, 15], [120782, 120831, 0, 8], [120832, 121343, 130, 11], [121344, 121398, 130, 23], [121399, 121402, 130, 11], [121403, 121452, 130, 23], [121453, 121460, 130, 11], [121461, 121461, 130, 23], [121462, 121475, 130, 11], [121476, 121476, 130, 23], [121477, 121478, 130, 11], [121479, 121483, 130, 2], [121499, 121503, 130, 23], [121505, 121519, 130, 23], [122880, 122886, 56, 23], [122888, 122904, 56, 23], [122907, 122913, 56, 23], [122915, 122916, 56, 23], [122918, 122922, 56, 23], [124928, 125124, 112, 19], [125127, 125135, 112, 14], [125136, 125142, 112, 23], [125184, 125251, 131, 15], [125252, 125258, 131, 23], [125264, 125273, 131, 8], [125278, 125279, 131, 2], [126065, 126123, 0, 14], [126124, 126124, 0, 11], [126125, 126127, 0, 14], [126128, 126128, 0, 3], [126129, 126132, 0, 14], [126464, 126467, 6, 19], [126469, 126495, 6, 19], [126497, 126498, 6, 19], [126500, 126500, 6, 19], [126503, 126503, 6, 19], [126505, 126514, 6, 19], [126516, 126519, 6, 19], [126521, 126521, 6, 19], [126523, 126523, 6, 19], [126530, 126530, 6, 19], [126535, 126535, 6, 19], [126537, 126537, 6, 19], [126539, 126539, 6, 19], [126541, 126543, 6, 19], [126545, 126546, 6, 19], [126548, 126548, 6, 19], [126551, 126551, 6, 19], [126553, 126553, 6, 19], [126555, 126555, 6, 19], [126557, 126557, 6, 19], [126559, 126559, 6, 19], [126561, 126562, 6, 19], [126564, 126564, 6, 19], [126567, 126570, 6, 19], [126572, 126578, 6, 19], [126580, 126583, 6, 19], [126585, 126588, 6, 19], [126590, 126590, 6, 19], [126592, 126601, 6, 19], [126603, 126619, 6, 19], [126625, 126627, 6, 19], [126629, 126633, 6, 19], [126635, 126651, 6, 19], [126704, 126705, 6, 6], [126976, 127019, 0, 11], [127024, 127123, 0, 11], [127136, 127150, 0, 11], [127153, 127167, 0, 11], [127169, 127183, 0, 11], [127185, 127221, 0, 11], [127232, 127244, 0, 14], [127248, 127339, 0, 11], [127344, 127404, 0, 11], [127462, 127487, 0, 11], [127488, 127488, 32, 11], [127489, 127490, 0, 11], [127504, 127547, 0, 11], [127552, 127560, 0, 11], [127568, 127569, 0, 11], [127584, 127589, 0, 11], [127744, 127994, 0, 11], [127995, 127999, 0, 9], [128000, 128724, 0, 11], [128736, 128748, 0, 11], [128752, 128761, 0, 11], [128768, 128883, 0, 11], [128896, 128984, 0, 11], [129024, 129035, 0, 11], [129040, 129095, 0, 11], [129104, 129113, 0, 11], [129120, 129159, 0, 11], [129168, 129197, 0, 11], [129280, 129291, 0, 11], [129296, 129342, 0, 11], [129344, 129392, 0, 11], [129395, 129398, 0, 11], [129402, 129402, 0, 11], [129404, 129442, 0, 11], [129456, 129465, 0, 11], [129472, 129474, 0, 11], [129488, 129535, 0, 11], [129632, 129645, 0, 11], [131072, 173782, 35, 19], [173824, 177972, 35, 19], [177984, 178205, 35, 19], [178208, 183969, 35, 19], [183984, 191456, 35, 19], [194560, 195101, 35, 19], [917505, 917505, 0, 13], [917536, 917631, 0, 13], [917760, 917999, 40, 23]]} \ No newline at end of file diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/confusable_homoglyphs/categories.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/confusable_homoglyphs/categories.py new file mode 100644 index 0000000..c106e91 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/confusable_homoglyphs/categories.py @@ -0,0 +1,93 @@ +# -*- coding: utf-8 -*- +from .utils import load + + +categories_data = load('categories.json') + + +def aliases_categories(chr): + """Retrieves the script block alias and unicode category for a unicode character. + + >>> categories.aliases_categories('A') + ('LATIN', 'L') + >>> categories.aliases_categories('τ') + ('GREEK', 'L') + >>> categories.aliases_categories('-') + ('COMMON', 'Pd') + + :param chr: A unicode character + :type chr: str + :return: The script block alias and unicode category for a unicode character. + :rtype: (str, str) + """ + l = 0 + r = len(categories_data['code_points_ranges']) - 1 + c = ord(chr) + + # binary search + while r >= l: + m = (l + r) // 2 + if c < categories_data['code_points_ranges'][m][0]: + r = m - 1 + elif c > categories_data['code_points_ranges'][m][1]: + l = m + 1 + else: + return ( + categories_data['iso_15924_aliases'][categories_data['code_points_ranges'][m][2]], + categories_data['categories'][categories_data['code_points_ranges'][m][3]]) + return 'Unknown', 'Zzzz' + + +def alias(chr): + """Retrieves the script block alias for a unicode character. + + >>> categories.alias('A') + 'LATIN' + >>> categories.alias('τ') + 'GREEK' + >>> categories.alias('-') + 'COMMON' + + :param chr: A unicode character + :type chr: str + :return: The script block alias. + :rtype: str + """ + a, _ = aliases_categories(chr) + return a + + +def category(chr): + """Retrieves the unicode category for a unicode character. + + >>> categories.category('A') + 'L' + >>> categories.category('τ') + 'L' + >>> categories.category('-') + 'Pd' + + :param chr: A unicode character + :type chr: str + :return: The unicode category for a unicode character. + :rtype: str + """ + _, a = aliases_categories(chr) + return a + + +def unique_aliases(string): + """Retrieves all unique script block aliases used in a unicode string. + + >>> categories.unique_aliases('ABC') + {'LATIN'} + >>> categories.unique_aliases('ρAτ-') + {'GREEK', 'LATIN', 'COMMON'} + + :param string: A unicode character + :type string: str + :return: A set of the script block aliases used in a unicode string. + :rtype: (str, str) + """ + cats = [alias(c) for c in string] + return set(cats) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/confusable_homoglyphs/cli.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/confusable_homoglyphs/cli.py new file mode 100644 index 0000000..2e41df9 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/confusable_homoglyphs/cli.py @@ -0,0 +1,95 @@ +# -*- coding: utf-8 -*- +import re +from collections import defaultdict + +from .utils import u, get, dump + +try: + import click +except ImportError: + print('Install this package with the [cli] extras to enable the CLI.') + raise + + +@click.group() +def cli(): + pass + + +@cli.command() +def update(): + """ + Update the homoglyph data files from https://www.unicode.org + """ + generate_categories() + generate_confusables() + + +def generate_categories(): + """Generates the categories JSON data file from the unicode specification. + + :return: True for success, raises otherwise. + :rtype: bool + """ + # inspired by https://gist.github.com/anonymous/2204527 + code_points_ranges = [] + iso_15924_aliases = [] + categories = [] + + match = re.compile(r'([0-9A-F]+)(?:\.\.([0-9A-F]+))?\W+(\w+)\s*#\s*(\w+)', + re.UNICODE) + + url = 'ftp://ftp.unicode.org/Public/UNIDATA/Scripts.txt' + file = get(url) + for line in file: + p = re.findall(match, line) + if p: + code_point_range_from, code_point_range_to, alias, category = p[0] + alias = u(alias.upper()) + category = u(category) + if alias not in iso_15924_aliases: + iso_15924_aliases.append(alias) + if category not in categories: + categories.append(category) + code_points_ranges.append(( + int(code_point_range_from, 16), + int(code_point_range_to or code_point_range_from, 16), + iso_15924_aliases.index(alias), categories.index(category)) + ) + code_points_ranges.sort() + + categories_data = { + 'iso_15924_aliases': iso_15924_aliases, + 'categories': categories, + 'code_points_ranges': code_points_ranges, + } + + dump('categories.json', categories_data) + + +def generate_confusables(): + """Generates the confusables JSON data file from the unicode specification. + + :return: True for success, raises otherwise. + :rtype: bool + """ + url = 'ftp://ftp.unicode.org/Public/security/latest/confusables.txt' + file = get(url) + confusables_matrix = defaultdict(list) + match = re.compile(r'[0-9A-F ]+\s+;\s*[0-9A-F ]+\s+;\s*\w+\s*#' + r'\*?\s*\( (.+) → (.+) \) (.+) → (.+)\t#', + re.UNICODE) + for line in file: + p = re.findall(match, line) + if p: + char1, char2, name1, name2 = p[0] + confusables_matrix[char1].append({ + 'c': char2, + 'n': name2, + }) + confusables_matrix[char2].append({ + 'c': char1, + 'n': name1, + }) + + dump('confusables.json', dict(confusables_matrix)) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/confusable_homoglyphs/confusables.json b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/confusable_homoglyphs/confusables.json new file mode 100644 index 0000000..0b5e66b --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/confusable_homoglyphs/confusables.json @@ -0,0 +1 @@ +{"\u05ad": [{"c": "\u0596", "n": "HEBREW ACCENT TIPEHA"}], "\u0596": [{"c": "\u05ad", "n": "HEBREW ACCENT DEHI"}], "\u05ae": [{"c": "\u0598", "n": "HEBREW ACCENT ZARQA"}], "\u0598": [{"c": "\u05ae", "n": "HEBREW ACCENT ZINOR"}], "\u05a8": [{"c": "\u0599", "n": "HEBREW ACCENT PASHTA"}], "\u0599": [{"c": "\u05a8", "n": "HEBREW ACCENT QADMA"}], "\u05a4": [{"c": "\u059a", "n": "HEBREW ACCENT YETIV"}], "\u059a": [{"c": "\u05a4", "n": "HEBREW ACCENT MAHAPAKH"}], "\u1ab4": [{"c": "\u06db", "n": "ARABIC SMALL HIGH THREE DOTS"}], "\u06db": [{"c": "\u1ab4", "n": "COMBINING TRIPLE DOT"}, {"c": "\u20db", "n": "COMBINING THREE DOTS ABOVE"}], "\u20db": [{"c": "\u06db", "n": "ARABIC SMALL HIGH THREE DOTS"}], "\u0619": [{"c": "\u0313", "n": "COMBINING COMMA ABOVE"}], "\u0313": [{"c": "\u0619", "n": "ARABIC SMALL DAMMA"}, {"c": "\u08f3", "n": "ARABIC SMALL HIGH WAW"}, {"c": "\u0343", "n": "COMBINING GREEK KORONIS"}, {"c": "\u0315", "n": "COMBINING COMMA ABOVE RIGHT"}, {"c": "\u064f", "n": "ARABIC DAMMA"}], "\u08f3": [{"c": "\u0313", "n": "COMBINING COMMA ABOVE"}], "\u0343": [{"c": "\u0313", "n": "COMBINING COMMA ABOVE"}], "\u0315": [{"c": "\u0313", "n": "COMBINING COMMA ABOVE"}], "\u064f": [{"c": "\u0313", "n": "COMBINING COMMA ABOVE"}], "\u065d": [{"c": "\u0314", "n": "COMBINING REVERSED COMMA ABOVE"}], "\u0314": [{"c": "\u065d", "n": "ARABIC REVERSED DAMMA"}], "\u059c": [{"c": "\u0301", "n": "COMBINING ACUTE ACCENT"}], "\u0301": [{"c": "\u059c", "n": "HEBREW ACCENT GERESH"}, {"c": "\u059d", "n": "HEBREW ACCENT GERESH MUQDAM"}, {"c": "\u0618", "n": "ARABIC SMALL FATHA"}, {"c": "\u0747", "n": "SYRIAC OBLIQUE LINE ABOVE"}, {"c": "\u0341", "n": "COMBINING ACUTE TONE MARK"}, {"c": "\u0954", "n": "DEVANAGARI ACUTE ACCENT"}, {"c": "\u064e", "n": "ARABIC FATHA"}], "\u059d": [{"c": "\u0301", "n": "COMBINING ACUTE ACCENT"}], "\u0618": [{"c": "\u0301", "n": "COMBINING ACUTE ACCENT"}], "\u0747": [{"c": "\u0301", "n": "COMBINING ACUTE ACCENT"}], "\u0341": [{"c": "\u0301", "n": "COMBINING ACUTE ACCENT"}], "\u0954": [{"c": "\u0301", "n": "COMBINING ACUTE ACCENT"}], "\u064e": [{"c": "\u0301", "n": "COMBINING ACUTE ACCENT"}], "\u0340": [{"c": "\u0300", "n": "COMBINING GRAVE ACCENT"}], "\u0300": [{"c": "\u0340", "n": "COMBINING GRAVE TONE MARK"}, {"c": "\u0953", "n": "DEVANAGARI GRAVE ACCENT"}], "\u0953": [{"c": "\u0300", "n": "COMBINING GRAVE ACCENT"}], "\u030c": [{"c": "\u0306", "n": "COMBINING BREVE"}], "\u0306": [{"c": "\u030c", "n": "COMBINING CARON"}, {"c": "\ua67c", "n": "COMBINING CYRILLIC KAVYKA"}, {"c": "\u0658", "n": "ARABIC MARK NOON GHUNNA"}, {"c": "\u065a", "n": "ARABIC VOWEL SIGN SMALL V ABOVE"}, {"c": "\u036e", "n": "COMBINING LATIN SMALL LETTER V"}], "\ua67c": [{"c": "\u0306", "n": "COMBINING BREVE"}], "\u0658": [{"c": "\u0306", "n": "COMBINING BREVE"}], "\u065a": [{"c": "\u0306", "n": "COMBINING BREVE"}], "\u036e": [{"c": "\u0306", "n": "COMBINING BREVE"}], "\u06e8": [{"c": "\u0306\u0307", "n": "COMBINING BREVE, COMBINING DOT ABOVE"}], "\u0306\u0307": [{"c": "\u06e8", "n": "ARABIC SMALL HIGH NOON"}, {"c": "\u0310", "n": "COMBINING CANDRABINDU"}, {"c": "\u0901", "n": "DEVANAGARI SIGN CANDRABINDU"}, {"c": "\u0981", "n": "BENGALI SIGN CANDRABINDU"}, {"c": "\u0a81", "n": "GUJARATI SIGN CANDRABINDU"}, {"c": "\u0b01", "n": "ORIYA SIGN CANDRABINDU"}, {"c": "\u0c00", "n": "TELUGU SIGN COMBINING CANDRABINDU ABOVE"}, {"c": "\u0c81", "n": "KANNADA SIGN CANDRABINDU"}, {"c": "\u0d01", "n": "MALAYALAM SIGN CANDRABINDU"}, {"c": "\ud805\udcbf", "n": "TIRHUTA SIGN CANDRABINDU"}], "\u0310": [{"c": "\u0306\u0307", "n": "COMBINING BREVE, COMBINING DOT ABOVE"}], "\u0901": [{"c": "\u0306\u0307", "n": "COMBINING BREVE, COMBINING DOT ABOVE"}], "\u0981": [{"c": "\u0306\u0307", "n": "COMBINING BREVE, COMBINING DOT ABOVE"}], "\u0a81": [{"c": "\u0306\u0307", "n": "COMBINING BREVE, COMBINING DOT ABOVE"}], "\u0b01": [{"c": "\u0306\u0307", "n": "COMBINING BREVE, COMBINING DOT ABOVE"}], "\u0c00": [{"c": "\u0306\u0307", "n": "COMBINING BREVE, COMBINING DOT ABOVE"}], "\u0c81": [{"c": "\u0306\u0307", "n": "COMBINING BREVE, COMBINING DOT ABOVE"}], "\u0d01": [{"c": "\u0306\u0307", "n": "COMBINING BREVE, COMBINING DOT ABOVE"}], "\ud805\udcbf": [{"c": "\u0306\u0307", "n": "COMBINING BREVE, COMBINING DOT ABOVE"}], "\u1cd0": [{"c": "\u0302", "n": "COMBINING CIRCUMFLEX ACCENT"}], "\u0302": [{"c": "\u1cd0", "n": "VEDIC TONE KARSHANA"}, {"c": "\u0311", "n": "COMBINING INVERTED BREVE"}, {"c": "\u065b", "n": "ARABIC VOWEL SIGN INVERTED SMALL V ABOVE"}, {"c": "\u07ee", "n": "NKO COMBINING LONG DESCENDING TONE"}, {"c": "\ua6f0", "n": "BAMUM COMBINING MARK KOQNDON"}], "\u0311": [{"c": "\u0302", "n": "COMBINING CIRCUMFLEX ACCENT"}], "\u065b": [{"c": "\u0302", "n": "COMBINING CIRCUMFLEX ACCENT"}], "\u07ee": [{"c": "\u0302", "n": "COMBINING CIRCUMFLEX ACCENT"}], "\ua6f0": [{"c": "\u0302", "n": "COMBINING CIRCUMFLEX ACCENT"}], "\u05af": [{"c": "\u030a", "n": "COMBINING RING ABOVE"}], "\u030a": [{"c": "\u05af", "n": "HEBREW MARK MASORA CIRCLE"}, {"c": "\u06df", "n": "ARABIC SMALL HIGH ROUNDED ZERO"}, {"c": "\u17d3", "n": "KHMER SIGN BATHAMASAT"}, {"c": "\u309a", "n": "COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK"}, {"c": "\u0652", "n": "ARABIC SUKUN"}, {"c": "\u0b82", "n": "TAMIL SIGN ANUSVARA"}, {"c": "\u1036", "n": "MYANMAR SIGN ANUSVARA"}, {"c": "\u17c6", "n": "KHMER SIGN NIKAHIT"}, {"c": "\ud804\udf00", "n": "GRANTHA SIGN COMBINING ANUSVARA ABOVE"}, {"c": "\u0e4d", "n": "THAI CHARACTER NIKHAHIT"}, {"c": "\u0ecd", "n": "LAO NIGGAHITA"}, {"c": "\u0366", "n": "COMBINING LATIN SMALL LETTER O"}, {"c": "\u2dea", "n": "COMBINING CYRILLIC LETTER O"}], "\u06df": [{"c": "\u030a", "n": "COMBINING RING ABOVE"}], "\u17d3": [{"c": "\u030a", "n": "COMBINING RING ABOVE"}], "\u309a": [{"c": "\u030a", "n": "COMBINING RING ABOVE"}], "\u0652": [{"c": "\u030a", "n": "COMBINING RING ABOVE"}], "\u0b82": [{"c": "\u030a", "n": "COMBINING RING ABOVE"}], "\u1036": [{"c": "\u030a", "n": "COMBINING RING ABOVE"}], "\u17c6": [{"c": "\u030a", "n": "COMBINING RING ABOVE"}], "\ud804\udf00": [{"c": "\u030a", "n": "COMBINING RING ABOVE"}], "\u0e4d": [{"c": "\u030a", "n": "COMBINING RING ABOVE"}], "\u0ecd": [{"c": "\u030a", "n": "COMBINING RING ABOVE"}], "\u0366": [{"c": "\u030a", "n": "COMBINING RING ABOVE"}], "\u2dea": [{"c": "\u030a", "n": "COMBINING RING ABOVE"}], "\u08eb": [{"c": "\u0308", "n": "COMBINING DIAERESIS"}], "\u0308": [{"c": "\u08eb", "n": "ARABIC TONE TWO DOTS ABOVE"}, {"c": "\u07f3", "n": "NKO COMBINING DOUBLE DOT ABOVE"}], "\u07f3": [{"c": "\u0308", "n": "COMBINING DIAERESIS"}], "\u064b": [{"c": "\u030b", "n": "COMBINING DOUBLE ACUTE ACCENT"}], "\u030b": [{"c": "\u064b", "n": "ARABIC FATHATAN"}, {"c": "\u08f0", "n": "ARABIC OPEN FATHATAN"}], "\u08f0": [{"c": "\u030b", "n": "COMBINING DOUBLE ACUTE ACCENT"}], "\u0342": [{"c": "\u0303", "n": "COMBINING TILDE"}], "\u0303": [{"c": "\u0342", "n": "COMBINING GREEK PERISPOMENI"}, {"c": "\u0653", "n": "ARABIC MADDAH ABOVE"}], "\u0653": [{"c": "\u0303", "n": "COMBINING TILDE"}], "\u05c4": [{"c": "\u0307", "n": "COMBINING DOT ABOVE"}], "\u0307": [{"c": "\u05c4", "n": "HEBREW MARK UPPER DOT"}, {"c": "\u06ec", "n": "ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE"}, {"c": "\u0740", "n": "SYRIAC FEMININE DOT"}, {"c": "\u08ea", "n": "ARABIC TONE ONE DOT ABOVE"}, {"c": "\u0741", "n": "SYRIAC QUSHSHAYA"}, {"c": "\u0358", "n": "COMBINING DOT ABOVE RIGHT"}, {"c": "\u05b9", "n": "HEBREW POINT HOLAM"}, {"c": "\u05ba", "n": "HEBREW POINT HOLAM HASER FOR VAV"}, {"c": "\u05c2", "n": "HEBREW POINT SIN DOT"}, {"c": "\u05c1", "n": "HEBREW POINT SHIN DOT"}, {"c": "\u07ed", "n": "NKO COMBINING SHORT RISING TONE"}, {"c": "\u0902", "n": "DEVANAGARI SIGN ANUSVARA"}, {"c": "\u0a02", "n": "GURMUKHI SIGN BINDI"}, {"c": "\u0a82", "n": "GUJARATI SIGN ANUSVARA"}, {"c": "\u0bcd", "n": "TAMIL SIGN VIRAMA"}], "\u06ec": [{"c": "\u0307", "n": "COMBINING DOT ABOVE"}], "\u0740": [{"c": "\u0307", "n": "COMBINING DOT ABOVE"}], "\u08ea": [{"c": "\u0307", "n": "COMBINING DOT ABOVE"}], "\u0741": [{"c": "\u0307", "n": "COMBINING DOT ABOVE"}], "\u0358": [{"c": "\u0307", "n": "COMBINING DOT ABOVE"}], "\u05b9": [{"c": "\u0307", "n": "COMBINING DOT ABOVE"}], "\u05ba": [{"c": "\u0307", "n": "COMBINING DOT ABOVE"}], "\u05c2": [{"c": "\u0307", "n": "COMBINING DOT ABOVE"}], "\u05c1": [{"c": "\u0307", "n": "COMBINING DOT ABOVE"}], "\u07ed": [{"c": "\u0307", "n": "COMBINING DOT ABOVE"}], "\u0902": [{"c": "\u0307", "n": "COMBINING DOT ABOVE"}], "\u0a02": [{"c": "\u0307", "n": "COMBINING DOT ABOVE"}], "\u0a82": [{"c": "\u0307", "n": "COMBINING DOT ABOVE"}], "\u0bcd": [{"c": "\u0307", "n": "COMBINING DOT ABOVE"}], "\u0337": [{"c": "\u0338", "n": "COMBINING LONG SOLIDUS OVERLAY"}], "\u0338": [{"c": "\u0337", "n": "COMBINING SHORT SOLIDUS OVERLAY"}], "\u1ab7": [{"c": "\u0328", "n": "COMBINING OGONEK"}], "\u0328": [{"c": "\u1ab7", "n": "COMBINING OPEN MARK BELOW"}, {"c": "\u0322", "n": "COMBINING RETROFLEX HOOK BELOW"}, {"c": "\u0345", "n": "COMBINING GREEK YPOGEGRAMMENI"}], "\u0322": [{"c": "\u0328", "n": "COMBINING OGONEK"}], "\u0345": [{"c": "\u0328", "n": "COMBINING OGONEK"}], "\u1cd2": [{"c": "\u0304", "n": "COMBINING MACRON"}], "\u0304": [{"c": "\u1cd2", "n": "VEDIC TONE PRENKHA"}, {"c": "\u0305", "n": "COMBINING OVERLINE"}, {"c": "\u0659", "n": "ARABIC ZWARAKAY"}, {"c": "\u07eb", "n": "NKO COMBINING SHORT HIGH TONE"}, {"c": "\ua6f1", "n": "BAMUM COMBINING MARK TUKWENTIS"}], "\u0305": [{"c": "\u0304", "n": "COMBINING MACRON"}], "\u0659": [{"c": "\u0304", "n": "COMBINING MACRON"}], "\u07eb": [{"c": "\u0304", "n": "COMBINING MACRON"}], "\ua6f1": [{"c": "\u0304", "n": "COMBINING MACRON"}], "\u1cda": [{"c": "\u030e", "n": "COMBINING DOUBLE VERTICAL LINE ABOVE"}], "\u030e": [{"c": "\u1cda", "n": "VEDIC TONE DOUBLE SVARITA"}], "\u0657": [{"c": "\u0312", "n": "COMBINING TURNED COMMA ABOVE"}], "\u0312": [{"c": "\u0657", "n": "ARABIC INVERTED DAMMA"}], "\u0357": [{"c": "\u0350", "n": "COMBINING RIGHT ARROWHEAD ABOVE"}], "\u0350": [{"c": "\u0357", "n": "COMBINING RIGHT HALF RING ABOVE"}, {"c": "\u08ff", "n": "ARABIC MARK SIDEWAYS NOON GHUNNA"}, {"c": "\u08f8", "n": "ARABIC RIGHT ARROWHEAD ABOVE"}], "\u08ff": [{"c": "\u0350", "n": "COMBINING RIGHT ARROWHEAD ABOVE"}], "\u08f8": [{"c": "\u0350", "n": "COMBINING RIGHT ARROWHEAD ABOVE"}], "\u0900": [{"c": "\u0352", "n": "COMBINING FERMATA"}], "\u0352": [{"c": "\u0900", "n": "DEVANAGARI SIGN INVERTED CANDRABINDU"}], "\u1ced": [{"c": "\u0316", "n": "COMBINING GRAVE ACCENT BELOW"}], "\u0316": [{"c": "\u1ced", "n": "VEDIC SIGN TIRYAK"}], "\u1cdc": [{"c": "\u0329", "n": "COMBINING VERTICAL LINE BELOW"}], "\u0329": [{"c": "\u1cdc", "n": "VEDIC TONE KATHAKA ANUDATTA"}, {"c": "\u0656", "n": "ARABIC SUBSCRIPT ALEF"}], "\u0656": [{"c": "\u0329", "n": "COMBINING VERTICAL LINE BELOW"}], "\u1cd5": [{"c": "\u032b", "n": "COMBINING INVERTED DOUBLE ARCH BELOW"}], "\u032b": [{"c": "\u1cd5", "n": "VEDIC TONE YAJURVEDIC AGGRAVATED INDEPENDENT SVARITA"}], "\u0347": [{"c": "\u0333", "n": "COMBINING DOUBLE LOW LINE"}], "\u0333": [{"c": "\u0347", "n": "COMBINING EQUALS SIGN BELOW"}], "\u08f9": [{"c": "\u0354", "n": "COMBINING LEFT ARROWHEAD BELOW"}], "\u0354": [{"c": "\u08f9", "n": "ARABIC LEFT ARROWHEAD BELOW"}], "\u08fa": [{"c": "\u0355", "n": "COMBINING RIGHT ARROWHEAD BELOW"}], "\u0355": [{"c": "\u08fa", "n": "ARABIC RIGHT ARROWHEAD BELOW"}], "\u309b": [{"c": "\uff9e", "n": "HALFWIDTH KATAKANA VOICED SOUND MARK"}], "\uff9e": [{"c": "\u309b", "n": "KATAKANA-HIRAGANA VOICED SOUND MARK"}], "\u309c": [{"c": "\uff9f", "n": "HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK"}], "\uff9f": [{"c": "\u309c", "n": "KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK"}], "\u0336": [{"c": "\u0335", "n": "COMBINING SHORT STROKE OVERLAY"}], "\u0335": [{"c": "\u0336", "n": "COMBINING LONG STROKE OVERLAY"}], "\u302c": [{"c": "\u0309", "n": "COMBINING HOOK ABOVE"}], "\u0309": [{"c": "\u302c", "n": "IDEOGRAPHIC DEPARTING TONE MARK"}], "\u05c5": [{"c": "\u0323", "n": "COMBINING DOT BELOW"}], "\u0323": [{"c": "\u05c5", "n": "HEBREW MARK LOWER DOT"}, {"c": "\u08ed", "n": "ARABIC TONE ONE DOT BELOW"}, {"c": "\u1cdd", "n": "VEDIC TONE DOT BELOW"}, {"c": "\u05b4", "n": "HEBREW POINT HIRIQ"}, {"c": "\u065c", "n": "ARABIC VOWEL SIGN DOT BELOW"}, {"c": "\u093c", "n": "DEVANAGARI SIGN NUKTA"}, {"c": "\u09bc", "n": "BENGALI SIGN NUKTA"}, {"c": "\u0a3c", "n": "GURMUKHI SIGN NUKTA"}, {"c": "\u0abc", "n": "GUJARATI SIGN NUKTA"}, {"c": "\u0b3c", "n": "ORIYA SIGN NUKTA"}, {"c": "\ud804\uddca", "n": "SHARADA SIGN NUKTA"}, {"c": "\ud805\udcc3", "n": "TIRHUTA SIGN NUKTA"}, {"c": "\ud802\ude3a", "n": "KHAROSHTHI SIGN DOT BELOW"}], "\u08ed": [{"c": "\u0323", "n": "COMBINING DOT BELOW"}], "\u1cdd": [{"c": "\u0323", "n": "COMBINING DOT BELOW"}], "\u05b4": [{"c": "\u0323", "n": "COMBINING DOT BELOW"}], "\u065c": [{"c": "\u0323", "n": "COMBINING DOT BELOW"}], "\u093c": [{"c": "\u0323", "n": "COMBINING DOT BELOW"}], "\u09bc": [{"c": "\u0323", "n": "COMBINING DOT BELOW"}], "\u0a3c": [{"c": "\u0323", "n": "COMBINING DOT BELOW"}], "\u0abc": [{"c": "\u0323", "n": "COMBINING DOT BELOW"}], "\u0b3c": [{"c": "\u0323", "n": "COMBINING DOT BELOW"}], "\ud804\uddca": [{"c": "\u0323", "n": "COMBINING DOT BELOW"}], "\ud805\udcc3": [{"c": "\u0323", "n": "COMBINING DOT BELOW"}], "\ud802\ude3a": [{"c": "\u0323", "n": "COMBINING DOT BELOW"}], "\u08ee": [{"c": "\u0324", "n": "COMBINING DIAERESIS BELOW"}], "\u0324": [{"c": "\u08ee", "n": "ARABIC TONE TWO DOTS BELOW"}, {"c": "\u1cde", "n": "VEDIC TONE TWO DOTS BELOW"}], "\u1cde": [{"c": "\u0324", "n": "COMBINING DIAERESIS BELOW"}], "\u0f37": [{"c": "\u0325", "n": "COMBINING RING BELOW"}], "\u0325": [{"c": "\u0f37", "n": "TIBETAN MARK NGAS BZUNG SGOR RTAGS"}, {"c": "\u302d", "n": "IDEOGRAPHIC ENTERING TONE MARK"}], "\u302d": [{"c": "\u0325", "n": "COMBINING RING BELOW"}], "\u0327": [{"c": "\u0326", "n": "COMBINING COMMA BELOW"}], "\u0326": [{"c": "\u0327", "n": "COMBINING CEDILLA"}, {"c": "\u0321", "n": "COMBINING PALATALIZED HOOK BELOW"}, {"c": "\u0339", "n": "COMBINING RIGHT HALF RING BELOW"}], "\u0321": [{"c": "\u0326", "n": "COMBINING COMMA BELOW"}], "\u0339": [{"c": "\u0326", "n": "COMBINING COMMA BELOW"}], "\u1cd9": [{"c": "\u032d", "n": "COMBINING CIRCUMFLEX ACCENT BELOW"}], "\u032d": [{"c": "\u1cd9", "n": "VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA SCHROEDER"}], "\u1cd8": [{"c": "\u032e", "n": "COMBINING BREVE BELOW"}], "\u032e": [{"c": "\u1cd8", "n": "VEDIC TONE CANDRA BELOW"}], "\u0952": [{"c": "\u0331", "n": "COMBINING MACRON BELOW"}], "\u0331": [{"c": "\u0952", "n": "DEVANAGARI STRESS SIGN ANUDATTA"}, {"c": "\u0320", "n": "COMBINING MINUS SIGN BELOW"}], "\u0320": [{"c": "\u0331", "n": "COMBINING MACRON BELOW"}], "\u08f1": [{"c": "\u064c", "n": "ARABIC DAMMATAN"}], "\u064c": [{"c": "\u08f1", "n": "ARABIC OPEN DAMMATAN"}, {"c": "\u08e8", "n": "ARABIC CURLY DAMMATAN"}, {"c": "\u08e5", "n": "ARABIC CURLY DAMMA"}], "\u08e8": [{"c": "\u064c", "n": "ARABIC DAMMATAN"}], "\u08e5": [{"c": "\u064c", "n": "ARABIC DAMMATAN"}], "\u200e\ufc5e\u200e": [{"c": "\u200e\ufe72\u0651\u200e", "n": "ARABIC DAMMATAN ISOLATED FORM, ARABIC SHADDA"}], "\u200e\ufe72\u0651\u200e": [{"c": "\u200e\ufc5e\u200e", "n": "ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM"}], "\u08f2": [{"c": "\u064d", "n": "ARABIC KASRATAN"}], "\u064d": [{"c": "\u08f2", "n": "ARABIC OPEN KASRATAN"}], "\u200e\ufc5f\u200e": [{"c": "\u200e\ufe74\u0651\u200e", "n": "ARABIC KASRATAN ISOLATED FORM, ARABIC SHADDA"}], "\u200e\ufe74\u0651\u200e": [{"c": "\u200e\ufc5f\u200e", "n": "ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM"}], "\u200e\ufcf2\u200e": [{"c": "\u200e\ufe77\u0651\u200e", "n": "ARABIC FATHA MEDIAL FORM, ARABIC SHADDA"}], "\u200e\ufe77\u0651\u200e": [{"c": "\u200e\ufcf2\u200e", "n": "ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM"}], "\u200e\ufc60\u200e": [{"c": "\u200e\ufe76\u0651\u200e", "n": "ARABIC FATHA ISOLATED FORM, ARABIC SHADDA"}], "\u200e\ufe76\u0651\u200e": [{"c": "\u200e\ufc60\u200e", "n": "ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM"}], "\u200e\ufcf3\u200e": [{"c": "\u200e\ufe79\u0651\u200e", "n": "ARABIC DAMMA MEDIAL FORM, ARABIC SHADDA"}], "\u200e\ufe79\u0651\u200e": [{"c": "\u200e\ufcf3\u200e", "n": "ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM"}], "\u200e\ufc61\u200e": [{"c": "\u200e\ufe78\u0651\u200e", "n": "ARABIC DAMMA ISOLATED FORM, ARABIC SHADDA"}], "\u200e\ufe78\u0651\u200e": [{"c": "\u200e\ufc61\u200e", "n": "ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM"}], "\u061a": [{"c": "\u0650", "n": "ARABIC KASRA"}], "\u0650": [{"c": "\u061a", "n": "ARABIC SMALL KASRA"}, {"c": "\u0317", "n": "COMBINING ACUTE ACCENT BELOW"}], "\u0317": [{"c": "\u0650", "n": "ARABIC KASRA"}], "\u200e\ufcf4\u200e": [{"c": "\u200e\ufe7b\u0651\u200e", "n": "ARABIC KASRA MEDIAL FORM, ARABIC SHADDA"}], "\u200e\ufe7b\u0651\u200e": [{"c": "\u200e\ufcf4\u200e", "n": "ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM"}], "\u200e\ufc62\u200e": [{"c": "\u200e\ufe7a\u0651\u200e", "n": "ARABIC KASRA ISOLATED FORM, ARABIC SHADDA"}], "\u200e\ufe7a\u0651\u200e": [{"c": "\u200e\ufc62\u200e", "n": "ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM"}], "\u200e\ufc63\u200e": [{"c": "\u200e\ufe7c\u0670\u200e", "n": "ARABIC SHADDA ISOLATED FORM, ARABIC LETTER SUPERSCRIPT ALEF"}], "\u200e\ufe7c\u0670\u200e": [{"c": "\u200e\ufc63\u200e", "n": "ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM"}], "\u065f": [{"c": "\u0655", "n": "ARABIC HAMZA BELOW"}], "\u0655": [{"c": "\u065f", "n": "ARABIC WAVY HAMZA BELOW"}], "\u030d": [{"c": "\u0670", "n": "ARABIC LETTER SUPERSCRIPT ALEF"}], "\u0670": [{"c": "\u030d", "n": "COMBINING VERTICAL LINE ABOVE"}], "\u0742": [{"c": "\u073c", "n": "SYRIAC HBASA-ESASA DOTTED"}], "\u073c": [{"c": "\u0742", "n": "SYRIAC RUKKAKHA"}], "\u0a03": [{"c": "\u0983", "n": "BENGALI SIGN VISARGA"}], "\u0983": [{"c": "\u0a03", "n": "GURMUKHI SIGN VISARGA"}, {"c": "\u0c03", "n": "TELUGU SIGN VISARGA"}, {"c": "\u0c83", "n": "KANNADA SIGN VISARGA"}, {"c": "\u0d03", "n": "MALAYALAM SIGN VISARGA"}, {"c": "\u0d83", "n": "SINHALA SIGN VISARGAYA"}, {"c": "\u1038", "n": "MYANMAR SIGN VISARGA"}, {"c": "\ud805\udcc1", "n": "TIRHUTA SIGN VISARGA"}], "\u0c03": [{"c": "\u0983", "n": "BENGALI SIGN VISARGA"}], "\u0c83": [{"c": "\u0983", "n": "BENGALI SIGN VISARGA"}], "\u0d03": [{"c": "\u0983", "n": "BENGALI SIGN VISARGA"}], "\u0d83": [{"c": "\u0983", "n": "BENGALI SIGN VISARGA"}], "\u1038": [{"c": "\u0983", "n": "BENGALI SIGN VISARGA"}], "\ud805\udcc1": [{"c": "\u0983", "n": "BENGALI SIGN VISARGA"}], "\u17cb": [{"c": "\u0e48", "n": "THAI CHARACTER MAI EK"}], "\u0e48": [{"c": "\u17cb", "n": "KHMER SIGN BANTOC"}, {"c": "\u0ec8", "n": "LAO TONE MAI EK"}], "\u0ec8": [{"c": "\u0e48", "n": "THAI CHARACTER MAI EK"}], "\u0ec9": [{"c": "\u0e49", "n": "THAI CHARACTER MAI THO"}], "\u0e49": [{"c": "\u0ec9", "n": "LAO TONE MAI THO"}], "\u0eca": [{"c": "\u0e4a", "n": "THAI CHARACTER MAI TRI"}], "\u0e4a": [{"c": "\u0eca", "n": "LAO TONE MAI TI"}], "\u0ecb": [{"c": "\u0e4b", "n": "THAI CHARACTER MAI CHATTAWA"}], "\u0e4b": [{"c": "\u0ecb", "n": "LAO TONE MAI CATAWA"}], "\ua66f": [{"c": "\u20e9", "n": "COMBINING WIDE BRIDGE ABOVE"}], "\u20e9": [{"c": "\ua66f", "n": "COMBINING CYRILLIC VZMET"}], "\u1680": [{"c": " ", "n": "SPACE"}], " ": [{"c": "\u1680", "n": "OGHAM SPACE MARK"}, {"c": "\u2000", "n": "EN QUAD"}, {"c": "\u2001", "n": "EM QUAD"}, {"c": "\u2002", "n": "EN SPACE"}, {"c": "\u2003", "n": "EM SPACE"}, {"c": "\u2004", "n": "THREE-PER-EM SPACE"}, {"c": "\u2005", "n": "FOUR-PER-EM SPACE"}, {"c": "\u2006", "n": "SIX-PER-EM SPACE"}, {"c": "\u2008", "n": "PUNCTUATION SPACE"}, {"c": "\u2009", "n": "THIN SPACE"}, {"c": "\u200a", "n": "HAIR SPACE"}, {"c": "\u205f", "n": "MEDIUM MATHEMATICAL SPACE"}, {"c": "\u00a0", "n": "NO-BREAK SPACE"}, {"c": "\u2007", "n": "FIGURE SPACE"}, {"c": "\u202f", "n": "NARROW NO-BREAK SPACE"}], "\u2000": [{"c": " ", "n": "SPACE"}], "\u2001": [{"c": " ", "n": "SPACE"}], "\u2002": [{"c": " ", "n": "SPACE"}], "\u2003": [{"c": " ", "n": "SPACE"}], "\u2004": [{"c": " ", "n": "SPACE"}], "\u2005": [{"c": " ", "n": "SPACE"}], "\u2006": [{"c": " ", "n": "SPACE"}], "\u2008": [{"c": " ", "n": "SPACE"}], "\u2009": [{"c": " ", "n": "SPACE"}], "\u200a": [{"c": " ", "n": "SPACE"}], "\u205f": [{"c": " ", "n": "SPACE"}], "\u00a0": [{"c": " ", "n": "SPACE"}], "\u2007": [{"c": " ", "n": "SPACE"}], "\u202f": [{"c": " ", "n": "SPACE"}], "\u200e\u07fa\u200e": [{"c": "_", "n": "LOW LINE"}], "_": [{"c": "\u200e\u07fa\u200e", "n": "NKO LAJANYALAN"}, {"c": "\ufe4d", "n": "DASHED LOW LINE"}, {"c": "\ufe4e", "n": "CENTRELINE LOW LINE"}, {"c": "\ufe4f", "n": "WAVY LOW LINE"}], "\ufe4d": [{"c": "_", "n": "LOW LINE"}], "\ufe4e": [{"c": "_", "n": "LOW LINE"}], "\ufe4f": [{"c": "_", "n": "LOW LINE"}], "\u2010": [{"c": "-", "n": "HYPHEN-MINUS"}], "-": [{"c": "\u2010", "n": "HYPHEN"}, {"c": "\u2011", "n": "NON-BREAKING HYPHEN"}, {"c": "\u2012", "n": "FIGURE DASH"}, {"c": "\u2013", "n": "EN DASH"}, {"c": "\ufe58", "n": "SMALL EM DASH"}, {"c": "\u200e\u06d4\u200e", "n": "ARABIC FULL STOP"}, {"c": "\u2043", "n": "HYPHEN BULLET"}, {"c": "\u02d7", "n": "MODIFIER LETTER MINUS SIGN"}, {"c": "\u2212", "n": "MINUS SIGN"}, {"c": "\u2796", "n": "HEAVY MINUS SIGN"}, {"c": "\u2cba", "n": "COPTIC CAPITAL LETTER DIALECT-P NI"}], "\u2011": [{"c": "-", "n": "HYPHEN-MINUS"}], "\u2012": [{"c": "-", "n": "HYPHEN-MINUS"}], "\u2013": [{"c": "-", "n": "HYPHEN-MINUS"}], "\ufe58": [{"c": "-", "n": "HYPHEN-MINUS"}], "\u200e\u06d4\u200e": [{"c": "-", "n": "HYPHEN-MINUS"}], "\u2043": [{"c": "-", "n": "HYPHEN-MINUS"}], "\u02d7": [{"c": "-", "n": "HYPHEN-MINUS"}], "\u2212": [{"c": "-", "n": "HYPHEN-MINUS"}], "\u2796": [{"c": "-", "n": "HYPHEN-MINUS"}], "\u2cba": [{"c": "-", "n": "HYPHEN-MINUS"}], "\u2a29": [{"c": "-\u0313", "n": "HYPHEN-MINUS, COMBINING COMMA ABOVE"}], "-\u0313": [{"c": "\u2a29", "n": "MINUS SIGN WITH COMMA ABOVE"}], "\u2e1a": [{"c": "-\u0308", "n": "HYPHEN-MINUS, COMBINING DIAERESIS"}], "-\u0308": [{"c": "\u2e1a", "n": "HYPHEN WITH DIAERESIS"}], "\ufb29": [{"c": "-\u0307", "n": "HYPHEN-MINUS, COMBINING DOT ABOVE"}], "-\u0307": [{"c": "\ufb29", "n": "HEBREW LETTER ALTERNATIVE PLUS SIGN"}, {"c": "\u2238", "n": "DOT MINUS"}], "\u2238": [{"c": "-\u0307", "n": "HYPHEN-MINUS, COMBINING DOT ABOVE"}], "\u2a2a": [{"c": "-\u0323", "n": "HYPHEN-MINUS, COMBINING DOT BELOW"}], "-\u0323": [{"c": "\u2a2a", "n": "MINUS SIGN WITH DOT BELOW"}], "\ua4fe": [{"c": "-.", "n": "HYPHEN-MINUS, FULL STOP"}], "-.": [{"c": "\ua4fe", "n": "LISU PUNCTUATION COMMA"}], "\uff5e": [{"c": "\u301c", "n": "WAVE DASH"}], "\u301c": [{"c": "\uff5e", "n": "FULLWIDTH TILDE"}], "\u200e\u060d\u200e": [{"c": ",", "n": "COMMA"}], ",": [{"c": "\u200e\u060d\u200e", "n": "ARABIC DATE SEPARATOR"}, {"c": "\u200e\u066b\u200e", "n": "ARABIC DECIMAL SEPARATOR"}, {"c": "\u201a", "n": "SINGLE LOW-9 QUOTATION MARK"}, {"c": "\u00b8", "n": "CEDILLA"}, {"c": "\ua4f9", "n": "LISU LETTER TONE NA PO"}], "\u200e\u066b\u200e": [{"c": ",", "n": "COMMA"}], "\u201a": [{"c": ",", "n": "COMMA"}], "\u00b8": [{"c": ",", "n": "COMMA"}], "\ua4f9": [{"c": ",", "n": "COMMA"}], "\u2e32": [{"c": "\u060c", "n": "ARABIC COMMA"}], "\u060c": [{"c": "\u2e32", "n": "TURNED COMMA"}, {"c": "\u200e\u066c\u200e", "n": "ARABIC THOUSANDS SEPARATOR"}], "\u200e\u066c\u200e": [{"c": "\u060c", "n": "ARABIC COMMA"}], "\u037e": [{"c": ";", "n": "SEMICOLON"}], ";": [{"c": "\u037e", "n": "GREEK QUESTION MARK"}], "\u2e35": [{"c": "\u200e\u061b\u200e", "n": "ARABIC SEMICOLON"}], "\u200e\u061b\u200e": [{"c": "\u2e35", "n": "TURNED SEMICOLON"}], "\u0903": [{"c": ":", "n": "COLON"}], ":": [{"c": "\u0903", "n": "DEVANAGARI SIGN VISARGA"}, {"c": "\u0a83", "n": "GUJARATI SIGN VISARGA"}, {"c": "\uff1a", "n": "FULLWIDTH COLON"}, {"c": "\u0589", "n": "ARMENIAN FULL STOP"}, {"c": "\u200e\u0703\u200e", "n": "SYRIAC SUPRALINEAR COLON"}, {"c": "\u200e\u0704\u200e", "n": "SYRIAC SUBLINEAR COLON"}, {"c": "\u16ec", "n": "RUNIC MULTIPLE PUNCTUATION"}, {"c": "\ufe30", "n": "PRESENTATION FORM FOR VERTICAL TWO DOT LEADER"}, {"c": "\u1803", "n": "MONGOLIAN FULL STOP"}, {"c": "\u1809", "n": "MONGOLIAN MANCHU FULL STOP"}, {"c": "\u205a", "n": "TWO DOT PUNCTUATION"}, {"c": "\u200e\u05c3\u200e", "n": "HEBREW PUNCTUATION SOF PASUQ"}, {"c": "\u02f8", "n": "MODIFIER LETTER RAISED COLON"}, {"c": "\ua789", "n": "MODIFIER LETTER COLON"}, {"c": "\u2236", "n": "RATIO"}, {"c": "\u02d0", "n": "MODIFIER LETTER TRIANGULAR COLON"}, {"c": "\ua4fd", "n": "LISU LETTER TONE MYA JEU"}], "\u0a83": [{"c": ":", "n": "COLON"}], "\uff1a": [{"c": ":", "n": "COLON"}], "\u0589": [{"c": ":", "n": "COLON"}], "\u200e\u0703\u200e": [{"c": ":", "n": "COLON"}], "\u200e\u0704\u200e": [{"c": ":", "n": "COLON"}], "\u16ec": [{"c": ":", "n": "COLON"}], "\ufe30": [{"c": ":", "n": "COLON"}], "\u1803": [{"c": ":", "n": "COLON"}], "\u1809": [{"c": ":", "n": "COLON"}], "\u205a": [{"c": ":", "n": "COLON"}], "\u200e\u05c3\u200e": [{"c": ":", "n": "COLON"}], "\u02f8": [{"c": ":", "n": "COLON"}], "\ua789": [{"c": ":", "n": "COLON"}], "\u2236": [{"c": ":", "n": "COLON"}], "\u02d0": [{"c": ":", "n": "COLON"}], "\ua4fd": [{"c": ":", "n": "COLON"}], "\u2a74": [{"c": "::=", "n": "COLON, COLON, EQUALS SIGN"}], "::=": [{"c": "\u2a74", "n": "DOUBLE COLON EQUAL"}], "\u29f4": [{"c": ":\u2192", "n": "COLON, RIGHTWARDS ARROW"}], ":\u2192": [{"c": "\u29f4", "n": "RULE-DELAYED"}], "\uff01": [{"c": "!", "n": "EXCLAMATION MARK"}], "!": [{"c": "\uff01", "n": "FULLWIDTH EXCLAMATION MARK"}, {"c": "\u01c3", "n": "LATIN LETTER RETROFLEX CLICK"}, {"c": "\u2d51", "n": "TIFINAGH LETTER TUAREG YANG"}], "\u01c3": [{"c": "!", "n": "EXCLAMATION MARK"}], "\u2d51": [{"c": "!", "n": "EXCLAMATION MARK"}], "\u203c": [{"c": "!!", "n": "EXCLAMATION MARK, EXCLAMATION MARK"}], "!!": [{"c": "\u203c", "n": "DOUBLE EXCLAMATION MARK"}], "\u2049": [{"c": "!?", "n": "EXCLAMATION MARK, QUESTION MARK"}], "!?": [{"c": "\u2049", "n": "EXCLAMATION QUESTION MARK"}], "\u0294": [{"c": "?", "n": "QUESTION MARK"}], "?": [{"c": "\u0294", "n": "LATIN LETTER GLOTTAL STOP"}, {"c": "\u0241", "n": "LATIN CAPITAL LETTER GLOTTAL STOP"}, {"c": "\u097d", "n": "DEVANAGARI LETTER GLOTTAL STOP"}, {"c": "\u13ae", "n": "CHEROKEE LETTER HE"}, {"c": "\ua6eb", "n": "BAMUM LETTER NTUU"}], "\u0241": [{"c": "?", "n": "QUESTION MARK"}], "\u097d": [{"c": "?", "n": "QUESTION MARK"}], "\u13ae": [{"c": "?", "n": "QUESTION MARK"}], "\ua6eb": [{"c": "?", "n": "QUESTION MARK"}], "\u2048": [{"c": "?!", "n": "QUESTION MARK, EXCLAMATION MARK"}], "?!": [{"c": "\u2048", "n": "QUESTION EXCLAMATION MARK"}], "\u2047": [{"c": "??", "n": "QUESTION MARK, QUESTION MARK"}], "??": [{"c": "\u2047", "n": "DOUBLE QUESTION MARK"}], "\u2e2e": [{"c": "\u200e\u061f\u200e", "n": "ARABIC QUESTION MARK"}], "\u200e\u061f\u200e": [{"c": "\u2e2e", "n": "REVERSED QUESTION MARK"}], "\ud834\udd6d": [{"c": ".", "n": "FULL STOP"}], ".": [{"c": "\ud834\udd6d", "n": "MUSICAL SYMBOL COMBINING AUGMENTATION DOT"}, {"c": "\u2024", "n": "ONE DOT LEADER"}, {"c": "\u200e\u0701\u200e", "n": "SYRIAC SUPRALINEAR FULL STOP"}, {"c": "\u200e\u0702\u200e", "n": "SYRIAC SUBLINEAR FULL STOP"}, {"c": "\ua60e", "n": "VAI FULL STOP"}, {"c": "\u200e\ud802\ude50\u200e", "n": "KHAROSHTHI PUNCTUATION DOT"}, {"c": "\u200e\u0660\u200e", "n": "ARABIC-INDIC DIGIT ZERO"}, {"c": "\u06f0", "n": "EXTENDED ARABIC-INDIC DIGIT ZERO"}, {"c": "\ua4f8", "n": "LISU LETTER TONE MYA TI"}], "\u2024": [{"c": ".", "n": "FULL STOP"}], "\u200e\u0701\u200e": [{"c": ".", "n": "FULL STOP"}], "\u200e\u0702\u200e": [{"c": ".", "n": "FULL STOP"}], "\ua60e": [{"c": ".", "n": "FULL STOP"}], "\u200e\ud802\ude50\u200e": [{"c": ".", "n": "FULL STOP"}], "\u200e\u0660\u200e": [{"c": ".", "n": "FULL STOP"}], "\u06f0": [{"c": ".", "n": "FULL STOP"}], "\ua4f8": [{"c": ".", "n": "FULL STOP"}], "\ua4fb": [{"c": ".,", "n": "FULL STOP, COMMA"}], ".,": [{"c": "\ua4fb", "n": "LISU LETTER TONE MYA BO"}], "\u2025": [{"c": "..", "n": "FULL STOP, FULL STOP"}], "..": [{"c": "\u2025", "n": "TWO DOT LEADER"}, {"c": "\ua4fa", "n": "LISU LETTER TONE MYA CYA"}], "\ua4fa": [{"c": "..", "n": "FULL STOP, FULL STOP"}], "\u2026": [{"c": "...", "n": "FULL STOP, FULL STOP, FULL STOP"}], "...": [{"c": "\u2026", "n": "HORIZONTAL ELLIPSIS"}], "\ua6f4": [{"c": "\ua6f3\ua6f3", "n": "BAMUM FULL STOP, BAMUM FULL STOP"}], "\ua6f3\ua6f3": [{"c": "\ua6f4", "n": "BAMUM COLON"}], "\u30fb": [{"c": "\u00b7", "n": "MIDDLE DOT"}], "\u00b7": [{"c": "\u30fb", "n": "KATAKANA MIDDLE DOT"}, {"c": "\uff65", "n": "HALFWIDTH KATAKANA MIDDLE DOT"}, {"c": "\u16eb", "n": "RUNIC SINGLE PUNCTUATION"}, {"c": "\u0387", "n": "GREEK ANO TELEIA"}, {"c": "\u2e31", "n": "WORD SEPARATOR MIDDLE DOT"}, {"c": "\ud800\udd01", "n": "AEGEAN WORD SEPARATOR DOT"}, {"c": "\u2022", "n": "BULLET"}, {"c": "\u2027", "n": "HYPHENATION POINT"}, {"c": "\u2219", "n": "BULLET OPERATOR"}, {"c": "\u22c5", "n": "DOT OPERATOR"}, {"c": "\ua78f", "n": "LATIN LETTER SINOLOGICAL DOT"}, {"c": "\u1427", "n": "CANADIAN SYLLABICS FINAL MIDDLE DOT"}], "\uff65": [{"c": "\u00b7", "n": "MIDDLE DOT"}], "\u16eb": [{"c": "\u00b7", "n": "MIDDLE DOT"}], "\u0387": [{"c": "\u00b7", "n": "MIDDLE DOT"}], "\u2e31": [{"c": "\u00b7", "n": "MIDDLE DOT"}], "\ud800\udd01": [{"c": "\u00b7", "n": "MIDDLE DOT"}], "\u2022": [{"c": "\u00b7", "n": "MIDDLE DOT"}], "\u2027": [{"c": "\u00b7", "n": "MIDDLE DOT"}], "\u2219": [{"c": "\u00b7", "n": "MIDDLE DOT"}], "\u22c5": [{"c": "\u00b7", "n": "MIDDLE DOT"}], "\ua78f": [{"c": "\u00b7", "n": "MIDDLE DOT"}], "\u1427": [{"c": "\u00b7", "n": "MIDDLE DOT"}], "\u22ef": [{"c": "\u00b7\u00b7\u00b7", "n": "MIDDLE DOT, MIDDLE DOT, MIDDLE DOT"}], "\u00b7\u00b7\u00b7": [{"c": "\u22ef", "n": "MIDLINE HORIZONTAL ELLIPSIS"}, {"c": "\u2d48", "n": "TIFINAGH LETTER TUAREG YAQ"}], "\u2d48": [{"c": "\u00b7\u00b7\u00b7", "n": "MIDDLE DOT, MIDDLE DOT, MIDDLE DOT"}], "\u1444": [{"c": "\u00b7<", "n": "MIDDLE DOT, LESS-THAN SIGN"}], "\u00b7<": [{"c": "\u1444", "n": "CANADIAN SYLLABICS PWA"}], "\u22d7": [{"c": "\u00b7>", "n": "MIDDLE DOT, GREATER-THAN SIGN"}], "\u00b7>": [{"c": "\u22d7", "n": "GREATER-THAN WITH DOT"}, {"c": "\u1437", "n": "CANADIAN SYLLABICS CARRIER HI"}, {"c": "\u1440", "n": "CANADIAN SYLLABICS PWO"}], "\u1437": [{"c": "\u00b7>", "n": "MIDDLE DOT, GREATER-THAN SIGN"}], "\u1440": [{"c": "\u00b7>", "n": "MIDDLE DOT, GREATER-THAN SIGN"}], "\u152f": [{"c": "\u00b74", "n": "MIDDLE DOT, DIGIT FOUR"}], "\u00b74": [{"c": "\u152f", "n": "CANADIAN SYLLABICS YWE"}], "\u147e": [{"c": "\u00b7b", "n": "MIDDLE DOT, LATIN SMALL LETTER B"}], "\u00b7b": [{"c": "\u147e", "n": "CANADIAN SYLLABICS KWA"}], "\u1480": [{"c": "\u00b7b\u0307", "n": "MIDDLE DOT, LATIN SMALL LETTER B, COMBINING DOT ABOVE"}], "\u00b7b\u0307": [{"c": "\u1480", "n": "CANADIAN SYLLABICS KWAA"}], "\u147a": [{"c": "\u00b7d", "n": "MIDDLE DOT, LATIN SMALL LETTER D"}], "\u00b7d": [{"c": "\u147a", "n": "CANADIAN SYLLABICS KWO"}], "\u1498": [{"c": "\u00b7J", "n": "MIDDLE DOT, LATIN CAPITAL LETTER J"}], "\u00b7J": [{"c": "\u1498", "n": "CANADIAN SYLLABICS CWO"}], "\u14b6": [{"c": "\u00b7L", "n": "MIDDLE DOT, LATIN CAPITAL LETTER L"}], "\u00b7L": [{"c": "\u14b6", "n": "CANADIAN SYLLABICS MWA"}], "\u1476": [{"c": "\u00b7P", "n": "MIDDLE DOT, LATIN CAPITAL LETTER P"}], "\u00b7P": [{"c": "\u1476", "n": "CANADIAN SYLLABICS KWI"}], "\u1457": [{"c": "\u00b7U", "n": "MIDDLE DOT, LATIN CAPITAL LETTER U"}], "\u00b7U": [{"c": "\u1457", "n": "CANADIAN SYLLABICS TWE"}], "\u143a": [{"c": "\u00b7V", "n": "MIDDLE DOT, LATIN CAPITAL LETTER V"}], "\u00b7V": [{"c": "\u143a", "n": "CANADIAN SYLLABICS PWE"}], "\u143c": [{"c": "\u00b7\u0245", "n": "MIDDLE DOT, LATIN CAPITAL LETTER TURNED V"}], "\u00b7\u0245": [{"c": "\u143c", "n": "CANADIAN SYLLABICS PWI"}], "\u14ae": [{"c": "\u00b7\u0393", "n": "MIDDLE DOT, GREEK CAPITAL LETTER GAMMA"}], "\u00b7\u0393": [{"c": "\u14ae", "n": "CANADIAN SYLLABICS MWI"}], "\u140e": [{"c": "\u00b7\u0394", "n": "MIDDLE DOT, GREEK CAPITAL LETTER DELTA"}], "\u00b7\u0394": [{"c": "\u140e", "n": "CANADIAN SYLLABICS WI"}], "\u1459": [{"c": "\u00b7\u0548", "n": "MIDDLE DOT, ARMENIAN CAPITAL LETTER VO"}], "\u00b7\u0548": [{"c": "\u1459", "n": "CANADIAN SYLLABICS TWI"}], "\u140c": [{"c": "\u00b7\u1401", "n": "MIDDLE DOT, CANADIAN SYLLABICS E"}], "\u00b7\u1401": [{"c": "\u140c", "n": "CANADIAN SYLLABICS WE"}], "\u1410": [{"c": "\u00b7\u1404", "n": "MIDDLE DOT, CANADIAN SYLLABICS II"}], "\u00b7\u1404": [{"c": "\u1410", "n": "CANADIAN SYLLABICS WII"}], "\u1412": [{"c": "\u00b7\u1405", "n": "MIDDLE DOT, CANADIAN SYLLABICS O"}], "\u00b7\u1405": [{"c": "\u1412", "n": "CANADIAN SYLLABICS WO"}], "\u1414": [{"c": "\u00b7\u1406", "n": "MIDDLE DOT, CANADIAN SYLLABICS OO"}], "\u00b7\u1406": [{"c": "\u1414", "n": "CANADIAN SYLLABICS WOO"}], "\u1417": [{"c": "\u00b7\u140a", "n": "MIDDLE DOT, CANADIAN SYLLABICS A"}], "\u00b7\u140a": [{"c": "\u1417", "n": "CANADIAN SYLLABICS WA"}], "\u1419": [{"c": "\u00b7\u140b", "n": "MIDDLE DOT, CANADIAN SYLLABICS AA"}], "\u00b7\u140b": [{"c": "\u1419", "n": "CANADIAN SYLLABICS WAA"}], "\u143e": [{"c": "\u00b7\u1432", "n": "MIDDLE DOT, CANADIAN SYLLABICS PII"}], "\u00b7\u1432": [{"c": "\u143e", "n": "CANADIAN SYLLABICS PWII"}], "\u1442": [{"c": "\u00b7\u1434", "n": "MIDDLE DOT, CANADIAN SYLLABICS POO"}], "\u00b7\u1434": [{"c": "\u1442", "n": "CANADIAN SYLLABICS PWOO"}], "\u1446": [{"c": "\u00b7\u1439", "n": "MIDDLE DOT, CANADIAN SYLLABICS PAA"}], "\u00b7\u1439": [{"c": "\u1446", "n": "CANADIAN SYLLABICS PWAA"}], "\u145b": [{"c": "\u00b7\u144f", "n": "MIDDLE DOT, CANADIAN SYLLABICS TII"}], "\u00b7\u144f": [{"c": "\u145b", "n": "CANADIAN SYLLABICS TWII"}], "\u1454": [{"c": "\u00b7\u1450", "n": "MIDDLE DOT, CANADIAN SYLLABICS TO"}], "\u00b7\u1450": [{"c": "\u1454", "n": "CANADIAN SYLLABICS CARRIER DI"}, {"c": "\u145d", "n": "CANADIAN SYLLABICS TWO"}], "\u145d": [{"c": "\u00b7\u1450", "n": "MIDDLE DOT, CANADIAN SYLLABICS TO"}], "\u145f": [{"c": "\u00b7\u1451", "n": "MIDDLE DOT, CANADIAN SYLLABICS TOO"}], "\u00b7\u1451": [{"c": "\u145f", "n": "CANADIAN SYLLABICS TWOO"}], "\u1461": [{"c": "\u00b7\u1455", "n": "MIDDLE DOT, CANADIAN SYLLABICS TA"}], "\u00b7\u1455": [{"c": "\u1461", "n": "CANADIAN SYLLABICS TWA"}], "\u1463": [{"c": "\u00b7\u1456", "n": "MIDDLE DOT, CANADIAN SYLLABICS TAA"}], "\u00b7\u1456": [{"c": "\u1463", "n": "CANADIAN SYLLABICS TWAA"}], "\u1474": [{"c": "\u00b7\u146b", "n": "MIDDLE DOT, CANADIAN SYLLABICS KE"}], "\u00b7\u146b": [{"c": "\u1474", "n": "CANADIAN SYLLABICS KWE"}], "\u1478": [{"c": "\u00b7\u146e", "n": "MIDDLE DOT, CANADIAN SYLLABICS KII"}], "\u00b7\u146e": [{"c": "\u1478", "n": "CANADIAN SYLLABICS KWII"}], "\u147c": [{"c": "\u00b7\u1470", "n": "MIDDLE DOT, CANADIAN SYLLABICS KOO"}], "\u00b7\u1470": [{"c": "\u147c", "n": "CANADIAN SYLLABICS KWOO"}], "\u1492": [{"c": "\u00b7\u1489", "n": "MIDDLE DOT, CANADIAN SYLLABICS CE"}], "\u00b7\u1489": [{"c": "\u1492", "n": "CANADIAN SYLLABICS CWE"}], "\u1494": [{"c": "\u00b7\u148b", "n": "MIDDLE DOT, CANADIAN SYLLABICS CI"}], "\u00b7\u148b": [{"c": "\u1494", "n": "CANADIAN SYLLABICS CWI"}], "\u1496": [{"c": "\u00b7\u148c", "n": "MIDDLE DOT, CANADIAN SYLLABICS CII"}], "\u00b7\u148c": [{"c": "\u1496", "n": "CANADIAN SYLLABICS CWII"}], "\u149a": [{"c": "\u00b7\u148e", "n": "MIDDLE DOT, CANADIAN SYLLABICS COO"}], "\u00b7\u148e": [{"c": "\u149a", "n": "CANADIAN SYLLABICS CWOO"}], "\u149c": [{"c": "\u00b7\u1490", "n": "MIDDLE DOT, CANADIAN SYLLABICS CA"}], "\u00b7\u1490": [{"c": "\u149c", "n": "CANADIAN SYLLABICS CWA"}], "\u149e": [{"c": "\u00b7\u1491", "n": "MIDDLE DOT, CANADIAN SYLLABICS CAA"}], "\u00b7\u1491": [{"c": "\u149e", "n": "CANADIAN SYLLABICS CWAA"}], "\u14ac": [{"c": "\u00b7\u14a3", "n": "MIDDLE DOT, CANADIAN SYLLABICS ME"}], "\u00b7\u14a3": [{"c": "\u14ac", "n": "CANADIAN SYLLABICS MWE"}], "\u14b0": [{"c": "\u00b7\u14a6", "n": "MIDDLE DOT, CANADIAN SYLLABICS MII"}], "\u00b7\u14a6": [{"c": "\u14b0", "n": "CANADIAN SYLLABICS MWII"}], "\u14b2": [{"c": "\u00b7\u14a7", "n": "MIDDLE DOT, CANADIAN SYLLABICS MO"}], "\u00b7\u14a7": [{"c": "\u14b2", "n": "CANADIAN SYLLABICS MWO"}], "\u14b4": [{"c": "\u00b7\u14a8", "n": "MIDDLE DOT, CANADIAN SYLLABICS MOO"}], "\u00b7\u14a8": [{"c": "\u14b4", "n": "CANADIAN SYLLABICS MWOO"}], "\u14b8": [{"c": "\u00b7\u14ab", "n": "MIDDLE DOT, CANADIAN SYLLABICS MAA"}], "\u00b7\u14ab": [{"c": "\u14b8", "n": "CANADIAN SYLLABICS MWAA"}], "\u14c9": [{"c": "\u00b7\u14c0", "n": "MIDDLE DOT, CANADIAN SYLLABICS NE"}], "\u00b7\u14c0": [{"c": "\u14c9", "n": "CANADIAN SYLLABICS NWE"}], "\u18c6": [{"c": "\u00b7\u14c2", "n": "MIDDLE DOT, CANADIAN SYLLABICS NI"}], "\u00b7\u14c2": [{"c": "\u18c6", "n": "CANADIAN SYLLABICS NWI"}], "\u18c8": [{"c": "\u00b7\u14c3", "n": "MIDDLE DOT, CANADIAN SYLLABICS NII"}], "\u00b7\u14c3": [{"c": "\u18c8", "n": "CANADIAN SYLLABICS NWII"}], "\u18ca": [{"c": "\u00b7\u14c4", "n": "MIDDLE DOT, CANADIAN SYLLABICS NO"}], "\u00b7\u14c4": [{"c": "\u18ca", "n": "CANADIAN SYLLABICS NWO"}], "\u18cc": [{"c": "\u00b7\u14c5", "n": "MIDDLE DOT, CANADIAN SYLLABICS NOO"}], "\u00b7\u14c5": [{"c": "\u18cc", "n": "CANADIAN SYLLABICS NWOO"}], "\u14cb": [{"c": "\u00b7\u14c7", "n": "MIDDLE DOT, CANADIAN SYLLABICS NA"}], "\u00b7\u14c7": [{"c": "\u14cb", "n": "CANADIAN SYLLABICS NWA"}], "\u14cd": [{"c": "\u00b7\u14c8", "n": "MIDDLE DOT, CANADIAN SYLLABICS NAA"}], "\u00b7\u14c8": [{"c": "\u14cd", "n": "CANADIAN SYLLABICS NWAA"}], "\u14dc": [{"c": "\u00b7\u14d3", "n": "MIDDLE DOT, CANADIAN SYLLABICS LE"}], "\u00b7\u14d3": [{"c": "\u14dc", "n": "CANADIAN SYLLABICS LWE"}], "\u14de": [{"c": "\u00b7\u14d5", "n": "MIDDLE DOT, CANADIAN SYLLABICS LI"}], "\u00b7\u14d5": [{"c": "\u14de", "n": "CANADIAN SYLLABICS LWI"}], "\u14e0": [{"c": "\u00b7\u14d6", "n": "MIDDLE DOT, CANADIAN SYLLABICS LII"}], "\u00b7\u14d6": [{"c": "\u14e0", "n": "CANADIAN SYLLABICS LWII"}], "\u14e2": [{"c": "\u00b7\u14d7", "n": "MIDDLE DOT, CANADIAN SYLLABICS LO"}], "\u00b7\u14d7": [{"c": "\u14e2", "n": "CANADIAN SYLLABICS LWO"}], "\u14e4": [{"c": "\u00b7\u14d8", "n": "MIDDLE DOT, CANADIAN SYLLABICS LOO"}], "\u00b7\u14d8": [{"c": "\u14e4", "n": "CANADIAN SYLLABICS LWOO"}], "\u14e6": [{"c": "\u00b7\u14da", "n": "MIDDLE DOT, CANADIAN SYLLABICS LA"}], "\u00b7\u14da": [{"c": "\u14e6", "n": "CANADIAN SYLLABICS LWA"}], "\u14e8": [{"c": "\u00b7\u14db", "n": "MIDDLE DOT, CANADIAN SYLLABICS LAA"}], "\u00b7\u14db": [{"c": "\u14e8", "n": "CANADIAN SYLLABICS LWAA"}], "\u14f6": [{"c": "\u00b7\u14ed", "n": "MIDDLE DOT, CANADIAN SYLLABICS SE"}], "\u00b7\u14ed": [{"c": "\u14f6", "n": "CANADIAN SYLLABICS SWE"}], "\u14f8": [{"c": "\u00b7\u14ef", "n": "MIDDLE DOT, CANADIAN SYLLABICS SI"}], "\u00b7\u14ef": [{"c": "\u14f8", "n": "CANADIAN SYLLABICS SWI"}], "\u14fa": [{"c": "\u00b7\u14f0", "n": "MIDDLE DOT, CANADIAN SYLLABICS SII"}], "\u00b7\u14f0": [{"c": "\u14fa", "n": "CANADIAN SYLLABICS SWII"}], "\u14fc": [{"c": "\u00b7\u14f1", "n": "MIDDLE DOT, CANADIAN SYLLABICS SO"}], "\u00b7\u14f1": [{"c": "\u14fc", "n": "CANADIAN SYLLABICS SWO"}], "\u14fe": [{"c": "\u00b7\u14f2", "n": "MIDDLE DOT, CANADIAN SYLLABICS SOO"}], "\u00b7\u14f2": [{"c": "\u14fe", "n": "CANADIAN SYLLABICS SWOO"}], "\u1500": [{"c": "\u00b7\u14f4", "n": "MIDDLE DOT, CANADIAN SYLLABICS SA"}], "\u00b7\u14f4": [{"c": "\u1500", "n": "CANADIAN SYLLABICS SWA"}], "\u1502": [{"c": "\u00b7\u14f5", "n": "MIDDLE DOT, CANADIAN SYLLABICS SAA"}], "\u00b7\u14f5": [{"c": "\u1502", "n": "CANADIAN SYLLABICS SWAA"}], "\u1517": [{"c": "\u00b7\u1510", "n": "MIDDLE DOT, CANADIAN SYLLABICS SHE"}], "\u00b7\u1510": [{"c": "\u1517", "n": "CANADIAN SYLLABICS SHWE"}], "\u1519": [{"c": "\u00b7\u1511", "n": "MIDDLE DOT, CANADIAN SYLLABICS SHI"}], "\u00b7\u1511": [{"c": "\u1519", "n": "CANADIAN SYLLABICS SHWI"}], "\u151b": [{"c": "\u00b7\u1512", "n": "MIDDLE DOT, CANADIAN SYLLABICS SHII"}], "\u00b7\u1512": [{"c": "\u151b", "n": "CANADIAN SYLLABICS SHWII"}], "\u151d": [{"c": "\u00b7\u1513", "n": "MIDDLE DOT, CANADIAN SYLLABICS SHO"}], "\u00b7\u1513": [{"c": "\u151d", "n": "CANADIAN SYLLABICS SHWO"}], "\u151f": [{"c": "\u00b7\u1514", "n": "MIDDLE DOT, CANADIAN SYLLABICS SHOO"}], "\u00b7\u1514": [{"c": "\u151f", "n": "CANADIAN SYLLABICS SHWOO"}], "\u1521": [{"c": "\u00b7\u1515", "n": "MIDDLE DOT, CANADIAN SYLLABICS SHA"}], "\u00b7\u1515": [{"c": "\u1521", "n": "CANADIAN SYLLABICS SHWA"}], "\u1523": [{"c": "\u00b7\u1516", "n": "MIDDLE DOT, CANADIAN SYLLABICS SHAA"}], "\u00b7\u1516": [{"c": "\u1523", "n": "CANADIAN SYLLABICS SHWAA"}], "\u1531": [{"c": "\u00b7\u1528", "n": "MIDDLE DOT, CANADIAN SYLLABICS YI"}], "\u00b7\u1528": [{"c": "\u1531", "n": "CANADIAN SYLLABICS YWI"}], "\u1533": [{"c": "\u00b7\u1529", "n": "MIDDLE DOT, CANADIAN SYLLABICS YII"}], "\u00b7\u1529": [{"c": "\u1533", "n": "CANADIAN SYLLABICS YWII"}], "\u1535": [{"c": "\u00b7\u152a", "n": "MIDDLE DOT, CANADIAN SYLLABICS YO"}], "\u00b7\u152a": [{"c": "\u1535", "n": "CANADIAN SYLLABICS YWO"}], "\u1537": [{"c": "\u00b7\u152b", "n": "MIDDLE DOT, CANADIAN SYLLABICS YOO"}], "\u00b7\u152b": [{"c": "\u1537", "n": "CANADIAN SYLLABICS YWOO"}], "\u1539": [{"c": "\u00b7\u152d", "n": "MIDDLE DOT, CANADIAN SYLLABICS YA"}], "\u00b7\u152d": [{"c": "\u1539", "n": "CANADIAN SYLLABICS YWA"}], "\u153b": [{"c": "\u00b7\u152e", "n": "MIDDLE DOT, CANADIAN SYLLABICS YAA"}], "\u00b7\u152e": [{"c": "\u153b", "n": "CANADIAN SYLLABICS YWAA"}], "\u18ce": [{"c": "\u00b7\u1543", "n": "MIDDLE DOT, CANADIAN SYLLABICS R-CREE RE"}], "\u00b7\u1543": [{"c": "\u18ce", "n": "CANADIAN SYLLABICS RWEE"}], "\u18cf": [{"c": "\u00b7\u1546", "n": "MIDDLE DOT, CANADIAN SYLLABICS RI"}], "\u00b7\u1546": [{"c": "\u18cf", "n": "CANADIAN SYLLABICS RWI"}], "\u18d0": [{"c": "\u00b7\u1547", "n": "MIDDLE DOT, CANADIAN SYLLABICS RII"}], "\u00b7\u1547": [{"c": "\u18d0", "n": "CANADIAN SYLLABICS RWII"}], "\u18d1": [{"c": "\u00b7\u1548", "n": "MIDDLE DOT, CANADIAN SYLLABICS RO"}], "\u00b7\u1548": [{"c": "\u18d1", "n": "CANADIAN SYLLABICS RWO"}], "\u18d2": [{"c": "\u00b7\u1549", "n": "MIDDLE DOT, CANADIAN SYLLABICS ROO"}], "\u00b7\u1549": [{"c": "\u18d2", "n": "CANADIAN SYLLABICS RWOO"}], "\u18d3": [{"c": "\u00b7\u154b", "n": "MIDDLE DOT, CANADIAN SYLLABICS RA"}], "\u00b7\u154b": [{"c": "\u18d3", "n": "CANADIAN SYLLABICS RWA"}], "\u154e": [{"c": "\u00b7\u154c", "n": "MIDDLE DOT, CANADIAN SYLLABICS RAA"}], "\u00b7\u154c": [{"c": "\u154e", "n": "CANADIAN SYLLABICS RWAA"}], "\u155b": [{"c": "\u00b7\u155a", "n": "MIDDLE DOT, CANADIAN SYLLABICS FAA"}], "\u00b7\u155a": [{"c": "\u155b", "n": "CANADIAN SYLLABICS FWAA"}], "\u1568": [{"c": "\u00b7\u1567", "n": "MIDDLE DOT, CANADIAN SYLLABICS THAA"}], "\u00b7\u1567": [{"c": "\u1568", "n": "CANADIAN SYLLABICS THWAA"}], "\u18b3": [{"c": "\u00b7\u18b1", "n": "MIDDLE DOT, CANADIAN SYLLABICS AY"}], "\u00b7\u18b1": [{"c": "\u18b3", "n": "CANADIAN SYLLABICS WAY"}], "\u18b6": [{"c": "\u00b7\u18b4", "n": "MIDDLE DOT, CANADIAN SYLLABICS POY"}], "\u00b7\u18b4": [{"c": "\u18b6", "n": "CANADIAN SYLLABICS PWOY"}], "\u18b9": [{"c": "\u00b7\u18b8", "n": "MIDDLE DOT, CANADIAN SYLLABICS KAY"}], "\u00b7\u18b8": [{"c": "\u18b9", "n": "CANADIAN SYLLABICS KWAY"}], "\u18c2": [{"c": "\u00b7\u18c0", "n": "MIDDLE DOT, CANADIAN SYLLABICS SHOY"}], "\u00b7\u18c0": [{"c": "\u18c2", "n": "CANADIAN SYLLABICS SHWOY"}], "\ua830": [{"c": "\u0964", "n": "DEVANAGARI DANDA"}], "\u0964": [{"c": "\ua830", "n": "NORTH INDIC FRACTION ONE QUARTER"}], "\u0965": [{"c": "\u0964\u0964", "n": "DEVANAGARI DANDA, DEVANAGARI DANDA"}], "\u0964\u0964": [{"c": "\u0965", "n": "DEVANAGARI DOUBLE DANDA"}], "\u1c3c": [{"c": "\u1c3b\u1c3b", "n": "LEPCHA PUNCTUATION TA-ROL, LEPCHA PUNCTUATION TA-ROL"}], "\u1c3b\u1c3b": [{"c": "\u1c3c", "n": "LEPCHA PUNCTUATION NYET THYOOM TA-ROL"}], "\u104b": [{"c": "\u104a\u104a", "n": "MYANMAR SIGN LITTLE SECTION, MYANMAR SIGN LITTLE SECTION"}], "\u104a\u104a": [{"c": "\u104b", "n": "MYANMAR SIGN SECTION"}], "\u1aa9": [{"c": "\u1aa8\u1aa8", "n": "TAI THAM SIGN KAAN, TAI THAM SIGN KAAN"}], "\u1aa8\u1aa8": [{"c": "\u1aa9", "n": "TAI THAM SIGN KAANKUU"}], "\u1aab": [{"c": "\u1aaa\u1aa8", "n": "TAI THAM SIGN SATKAAN, TAI THAM SIGN KAAN"}], "\u1aaa\u1aa8": [{"c": "\u1aab", "n": "TAI THAM SIGN SATKAANKUU"}], "\u1b5f": [{"c": "\u1b5e\u1b5e", "n": "BALINESE CARIK SIKI, BALINESE CARIK SIKI"}], "\u1b5e\u1b5e": [{"c": "\u1b5f", "n": "BALINESE CARIK PAREREN"}], "\u200e\ud802\ude57\u200e": [{"c": "\u200e\ud802\ude56\ud802\ude56\u200e", "n": "KHAROSHTHI PUNCTUATION DANDA, KHAROSHTHI PUNCTUATION DANDA"}], "\u200e\ud802\ude56\ud802\ude56\u200e": [{"c": "\u200e\ud802\ude57\u200e", "n": "KHAROSHTHI PUNCTUATION DOUBLE DANDA"}], "\ud805\udc4c": [{"c": "\ud805\udc4b\ud805\udc4b", "n": "NEWA DANDA, NEWA DANDA"}], "\ud805\udc4b\ud805\udc4b": [{"c": "\ud805\udc4c", "n": "NEWA DOUBLE DANDA"}], "\ud805\ude42": [{"c": "\ud805\ude41\ud805\ude41", "n": "MODI DANDA, MODI DANDA"}], "\ud805\ude41\ud805\ude41": [{"c": "\ud805\ude42", "n": "MODI DOUBLE DANDA"}], "\ud807\udc42": [{"c": "\ud807\udc41\ud807\udc41", "n": "BHAIKSUKI DANDA, BHAIKSUKI DANDA"}], "\ud807\udc41\ud807\udc41": [{"c": "\ud807\udc42", "n": "BHAIKSUKI DOUBLE DANDA"}], "\u1c7f": [{"c": "\u1c7e\u1c7e", "n": "OL CHIKI PUNCTUATION MUCAAD, OL CHIKI PUNCTUATION MUCAAD"}], "\u1c7e\u1c7e": [{"c": "\u1c7f", "n": "OL CHIKI PUNCTUATION DOUBLE MUCAAD"}], "\u055d": [{"c": "'", "n": "APOSTROPHE"}], "'": [{"c": "\u055d", "n": "ARMENIAN COMMA"}, {"c": "\uff07", "n": "FULLWIDTH APOSTROPHE"}, {"c": "\u2018", "n": "LEFT SINGLE QUOTATION MARK"}, {"c": "\u2019", "n": "RIGHT SINGLE QUOTATION MARK"}, {"c": "\u201b", "n": "SINGLE HIGH-REVERSED-9 QUOTATION MARK"}, {"c": "\u2032", "n": "PRIME"}, {"c": "\u2035", "n": "REVERSED PRIME"}, {"c": "\u055a", "n": "ARMENIAN APOSTROPHE"}, {"c": "\u200e\u05f3\u200e", "n": "HEBREW PUNCTUATION GERESH"}, {"c": "`", "n": "GRAVE ACCENT"}, {"c": "\u1fef", "n": "GREEK VARIA"}, {"c": "\uff40", "n": "FULLWIDTH GRAVE ACCENT"}, {"c": "\u00b4", "n": "ACUTE ACCENT"}, {"c": "\u0384", "n": "GREEK TONOS"}, {"c": "\u1ffd", "n": "GREEK OXIA"}, {"c": "\u1fbd", "n": "GREEK KORONIS"}, {"c": "\u1fbf", "n": "GREEK PSILI"}, {"c": "\u1ffe", "n": "GREEK DASIA"}, {"c": "\u02b9", "n": "MODIFIER LETTER PRIME"}, {"c": "\u0374", "n": "GREEK NUMERAL SIGN"}, {"c": "\u02c8", "n": "MODIFIER LETTER VERTICAL LINE"}, {"c": "\u02ca", "n": "MODIFIER LETTER ACUTE ACCENT"}, {"c": "\u02cb", "n": "MODIFIER LETTER GRAVE ACCENT"}, {"c": "\u02f4", "n": "MODIFIER LETTER MIDDLE GRAVE ACCENT"}, {"c": "\u02bb", "n": "MODIFIER LETTER TURNED COMMA"}, {"c": "\u02bd", "n": "MODIFIER LETTER REVERSED COMMA"}, {"c": "\u02bc", "n": "MODIFIER LETTER APOSTROPHE"}, {"c": "\u02be", "n": "MODIFIER LETTER RIGHT HALF RING"}, {"c": "\ua78c", "n": "LATIN SMALL LETTER SALTILLO"}, {"c": "\u200e\u05d9\u200e", "n": "HEBREW LETTER YOD"}, {"c": "\u200e\u07f4\u200e", "n": "NKO HIGH TONE APOSTROPHE"}, {"c": "\u200e\u07f5\u200e", "n": "NKO LOW TONE APOSTROPHE"}, {"c": "\u144a", "n": "CANADIAN SYLLABICS WEST-CREE P"}, {"c": "\u16cc", "n": "RUNIC LETTER SHORT-TWIG-SOL S"}, {"c": "\ud81b\udf51", "n": "MIAO SIGN ASPIRATION"}, {"c": "\ud81b\udf52", "n": "MIAO SIGN REFORMED VOICING"}], "\uff07": [{"c": "'", "n": "APOSTROPHE"}], "\u2018": [{"c": "'", "n": "APOSTROPHE"}], "\u2019": [{"c": "'", "n": "APOSTROPHE"}], "\u201b": [{"c": "'", "n": "APOSTROPHE"}], "\u2032": [{"c": "'", "n": "APOSTROPHE"}], "\u2035": [{"c": "'", "n": "APOSTROPHE"}], "\u055a": [{"c": "'", "n": "APOSTROPHE"}], "\u200e\u05f3\u200e": [{"c": "'", "n": "APOSTROPHE"}], "`": [{"c": "'", "n": "APOSTROPHE"}], "\u1fef": [{"c": "'", "n": "APOSTROPHE"}], "\uff40": [{"c": "'", "n": "APOSTROPHE"}], "\u00b4": [{"c": "'", "n": "APOSTROPHE"}], "\u0384": [{"c": "'", "n": "APOSTROPHE"}], "\u1ffd": [{"c": "'", "n": "APOSTROPHE"}], "\u1fbd": [{"c": "'", "n": "APOSTROPHE"}], "\u1fbf": [{"c": "'", "n": "APOSTROPHE"}], "\u1ffe": [{"c": "'", "n": "APOSTROPHE"}], "\u02b9": [{"c": "'", "n": "APOSTROPHE"}], "\u0374": [{"c": "'", "n": "APOSTROPHE"}], "\u02c8": [{"c": "'", "n": "APOSTROPHE"}], "\u02ca": [{"c": "'", "n": "APOSTROPHE"}], "\u02cb": [{"c": "'", "n": "APOSTROPHE"}], "\u02f4": [{"c": "'", "n": "APOSTROPHE"}], "\u02bb": [{"c": "'", "n": "APOSTROPHE"}], "\u02bd": [{"c": "'", "n": "APOSTROPHE"}], "\u02bc": [{"c": "'", "n": "APOSTROPHE"}], "\u02be": [{"c": "'", "n": "APOSTROPHE"}], "\ua78c": [{"c": "'", "n": "APOSTROPHE"}], "\u200e\u05d9\u200e": [{"c": "'", "n": "APOSTROPHE"}], "\u200e\u07f4\u200e": [{"c": "'", "n": "APOSTROPHE"}], "\u200e\u07f5\u200e": [{"c": "'", "n": "APOSTROPHE"}], "\u144a": [{"c": "'", "n": "APOSTROPHE"}], "\u16cc": [{"c": "'", "n": "APOSTROPHE"}], "\ud81b\udf51": [{"c": "'", "n": "APOSTROPHE"}], "\ud81b\udf52": [{"c": "'", "n": "APOSTROPHE"}], "\u1cd3": [{"c": "''", "n": "APOSTROPHE, APOSTROPHE"}], "''": [{"c": "\u1cd3", "n": "VEDIC SIGN NIHSHVASA"}, {"c": "\"", "n": "QUOTATION MARK"}, {"c": "\uff02", "n": "FULLWIDTH QUOTATION MARK"}, {"c": "\u201c", "n": "LEFT DOUBLE QUOTATION MARK"}, {"c": "\u201d", "n": "RIGHT DOUBLE QUOTATION MARK"}, {"c": "\u201f", "n": "DOUBLE HIGH-REVERSED-9 QUOTATION MARK"}, {"c": "\u2033", "n": "DOUBLE PRIME"}, {"c": "\u2036", "n": "REVERSED DOUBLE PRIME"}, {"c": "\u3003", "n": "DITTO MARK"}, {"c": "\u200e\u05f4\u200e", "n": "HEBREW PUNCTUATION GERSHAYIM"}, {"c": "\u02dd", "n": "DOUBLE ACUTE ACCENT"}, {"c": "\u02ba", "n": "MODIFIER LETTER DOUBLE PRIME"}, {"c": "\u02f6", "n": "MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT"}, {"c": "\u02ee", "n": "MODIFIER LETTER DOUBLE APOSTROPHE"}, {"c": "\u200e\u05f2\u200e", "n": "HEBREW LIGATURE YIDDISH DOUBLE YOD"}], "\"": [{"c": "''", "n": "APOSTROPHE, APOSTROPHE"}], "\uff02": [{"c": "''", "n": "APOSTROPHE, APOSTROPHE"}], "\u201c": [{"c": "''", "n": "APOSTROPHE, APOSTROPHE"}], "\u201d": [{"c": "''", "n": "APOSTROPHE, APOSTROPHE"}], "\u201f": [{"c": "''", "n": "APOSTROPHE, APOSTROPHE"}], "\u2033": [{"c": "''", "n": "APOSTROPHE, APOSTROPHE"}], "\u2036": [{"c": "''", "n": "APOSTROPHE, APOSTROPHE"}], "\u3003": [{"c": "''", "n": "APOSTROPHE, APOSTROPHE"}], "\u200e\u05f4\u200e": [{"c": "''", "n": "APOSTROPHE, APOSTROPHE"}], "\u02dd": [{"c": "''", "n": "APOSTROPHE, APOSTROPHE"}], "\u02ba": [{"c": "''", "n": "APOSTROPHE, APOSTROPHE"}], "\u02f6": [{"c": "''", "n": "APOSTROPHE, APOSTROPHE"}], "\u02ee": [{"c": "''", "n": "APOSTROPHE, APOSTROPHE"}], "\u200e\u05f2\u200e": [{"c": "''", "n": "APOSTROPHE, APOSTROPHE"}], "\u2034": [{"c": "'''", "n": "APOSTROPHE, APOSTROPHE, APOSTROPHE"}], "'''": [{"c": "\u2034", "n": "TRIPLE PRIME"}, {"c": "\u2037", "n": "REVERSED TRIPLE PRIME"}], "\u2037": [{"c": "'''", "n": "APOSTROPHE, APOSTROPHE, APOSTROPHE"}], "\u2057": [{"c": "''''", "n": "APOSTROPHE, APOSTROPHE, APOSTROPHE, APOSTROPHE"}], "''''": [{"c": "\u2057", "n": "QUADRUPLE PRIME"}], "\u0181": [{"c": "'B", "n": "APOSTROPHE, LATIN CAPITAL LETTER B"}], "'B": [{"c": "\u0181", "n": "LATIN CAPITAL LETTER B WITH HOOK"}], "\u018a": [{"c": "'D", "n": "APOSTROPHE, LATIN CAPITAL LETTER D"}], "'D": [{"c": "\u018a", "n": "LATIN CAPITAL LETTER D WITH HOOK"}], "\u0149": [{"c": "'n", "n": "APOSTROPHE, LATIN SMALL LETTER N"}], "'n": [{"c": "\u0149", "n": "LATIN SMALL LETTER N PRECEDED BY APOSTROPHE"}], "\u01a4": [{"c": "'P", "n": "APOSTROPHE, LATIN CAPITAL LETTER P"}], "'P": [{"c": "\u01a4", "n": "LATIN CAPITAL LETTER P WITH HOOK"}], "\u01ac": [{"c": "'T", "n": "APOSTROPHE, LATIN CAPITAL LETTER T"}], "'T": [{"c": "\u01ac", "n": "LATIN CAPITAL LETTER T WITH HOOK"}], "\u01b3": [{"c": "'Y", "n": "APOSTROPHE, LATIN CAPITAL LETTER Y"}], "'Y": [{"c": "\u01b3", "n": "LATIN CAPITAL LETTER Y WITH HOOK"}], "\uff3b": [{"c": "(", "n": "LEFT PARENTHESIS"}], "(": [{"c": "\uff3b", "n": "FULLWIDTH LEFT SQUARE BRACKET"}, {"c": "\u2768", "n": "MEDIUM LEFT PARENTHESIS ORNAMENT"}, {"c": "\u2772", "n": "LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT"}, {"c": "\u3014", "n": "LEFT TORTOISE SHELL BRACKET"}, {"c": "\ufd3e", "n": "ORNATE LEFT PARENTHESIS"}], "\u2768": [{"c": "(", "n": "LEFT PARENTHESIS"}], "\u2772": [{"c": "(", "n": "LEFT PARENTHESIS"}], "\u3014": [{"c": "(", "n": "LEFT PARENTHESIS"}], "\ufd3e": [{"c": "(", "n": "LEFT PARENTHESIS"}], "\u2e28": [{"c": "((", "n": "LEFT PARENTHESIS, LEFT PARENTHESIS"}], "((": [{"c": "\u2e28", "n": "LEFT DOUBLE PARENTHESIS"}], "\u3220": [{"c": "(\u30fc)", "n": "LEFT PARENTHESIS, KATAKANA-HIRAGANA PROLONGED SOUND MARK, RIGHT PARENTHESIS"}], "(\u30fc)": [{"c": "\u3220", "n": "PARENTHESIZED IDEOGRAPH ONE"}], "\u2475": [{"c": "(2)", "n": "LEFT PARENTHESIS, DIGIT TWO, RIGHT PARENTHESIS"}], "(2)": [{"c": "\u2475", "n": "PARENTHESIZED DIGIT TWO"}], "\u2487": [{"c": "(2O)", "n": "LEFT PARENTHESIS, DIGIT TWO, LATIN CAPITAL LETTER O, RIGHT PARENTHESIS"}], "(2O)": [{"c": "\u2487", "n": "PARENTHESIZED NUMBER TWENTY"}], "\u2476": [{"c": "(3)", "n": "LEFT PARENTHESIS, DIGIT THREE, RIGHT PARENTHESIS"}], "(3)": [{"c": "\u2476", "n": "PARENTHESIZED DIGIT THREE"}], "\u2477": [{"c": "(4)", "n": "LEFT PARENTHESIS, DIGIT FOUR, RIGHT PARENTHESIS"}], "(4)": [{"c": "\u2477", "n": "PARENTHESIZED DIGIT FOUR"}], "\u2478": [{"c": "(5)", "n": "LEFT PARENTHESIS, DIGIT FIVE, RIGHT PARENTHESIS"}], "(5)": [{"c": "\u2478", "n": "PARENTHESIZED DIGIT FIVE"}], "\u2479": [{"c": "(6)", "n": "LEFT PARENTHESIS, DIGIT SIX, RIGHT PARENTHESIS"}], "(6)": [{"c": "\u2479", "n": "PARENTHESIZED DIGIT SIX"}], "\u247a": [{"c": "(7)", "n": "LEFT PARENTHESIS, DIGIT SEVEN, RIGHT PARENTHESIS"}], "(7)": [{"c": "\u247a", "n": "PARENTHESIZED DIGIT SEVEN"}], "\u247b": [{"c": "(8)", "n": "LEFT PARENTHESIS, DIGIT EIGHT, RIGHT PARENTHESIS"}], "(8)": [{"c": "\u247b", "n": "PARENTHESIZED DIGIT EIGHT"}], "\u247c": [{"c": "(9)", "n": "LEFT PARENTHESIS, DIGIT NINE, RIGHT PARENTHESIS"}], "(9)": [{"c": "\u247c", "n": "PARENTHESIZED DIGIT NINE"}], "\u249c": [{"c": "(a)", "n": "LEFT PARENTHESIS, LATIN SMALL LETTER A, RIGHT PARENTHESIS"}], "(a)": [{"c": "\u249c", "n": "PARENTHESIZED LATIN SMALL LETTER A"}], "\ud83c\udd10": [{"c": "(A)", "n": "LEFT PARENTHESIS, LATIN CAPITAL LETTER A, RIGHT PARENTHESIS"}], "(A)": [{"c": "\ud83c\udd10", "n": "PARENTHESIZED LATIN CAPITAL LETTER A"}], "\u249d": [{"c": "(b)", "n": "LEFT PARENTHESIS, LATIN SMALL LETTER B, RIGHT PARENTHESIS"}], "(b)": [{"c": "\u249d", "n": "PARENTHESIZED LATIN SMALL LETTER B"}], "\ud83c\udd11": [{"c": "(B)", "n": "LEFT PARENTHESIS, LATIN CAPITAL LETTER B, RIGHT PARENTHESIS"}], "(B)": [{"c": "\ud83c\udd11", "n": "PARENTHESIZED LATIN CAPITAL LETTER B"}], "\u249e": [{"c": "(c)", "n": "LEFT PARENTHESIS, LATIN SMALL LETTER C, RIGHT PARENTHESIS"}], "(c)": [{"c": "\u249e", "n": "PARENTHESIZED LATIN SMALL LETTER C"}], "\ud83c\udd12": [{"c": "(C)", "n": "LEFT PARENTHESIS, LATIN CAPITAL LETTER C, RIGHT PARENTHESIS"}], "(C)": [{"c": "\ud83c\udd12", "n": "PARENTHESIZED LATIN CAPITAL LETTER C"}], "\u249f": [{"c": "(d)", "n": "LEFT PARENTHESIS, LATIN SMALL LETTER D, RIGHT PARENTHESIS"}], "(d)": [{"c": "\u249f", "n": "PARENTHESIZED LATIN SMALL LETTER D"}], "\ud83c\udd13": [{"c": "(D)", "n": "LEFT PARENTHESIS, LATIN CAPITAL LETTER D, RIGHT PARENTHESIS"}], "(D)": [{"c": "\ud83c\udd13", "n": "PARENTHESIZED LATIN CAPITAL LETTER D"}], "\u24a0": [{"c": "(e)", "n": "LEFT PARENTHESIS, LATIN SMALL LETTER E, RIGHT PARENTHESIS"}], "(e)": [{"c": "\u24a0", "n": "PARENTHESIZED LATIN SMALL LETTER E"}], "\ud83c\udd14": [{"c": "(E)", "n": "LEFT PARENTHESIS, LATIN CAPITAL LETTER E, RIGHT PARENTHESIS"}], "(E)": [{"c": "\ud83c\udd14", "n": "PARENTHESIZED LATIN CAPITAL LETTER E"}], "\u24a1": [{"c": "(f)", "n": "LEFT PARENTHESIS, LATIN SMALL LETTER F, RIGHT PARENTHESIS"}], "(f)": [{"c": "\u24a1", "n": "PARENTHESIZED LATIN SMALL LETTER F"}], "\ud83c\udd15": [{"c": "(F)", "n": "LEFT PARENTHESIS, LATIN CAPITAL LETTER F, RIGHT PARENTHESIS"}], "(F)": [{"c": "\ud83c\udd15", "n": "PARENTHESIZED LATIN CAPITAL LETTER F"}], "\u24a2": [{"c": "(g)", "n": "LEFT PARENTHESIS, LATIN SMALL LETTER G, RIGHT PARENTHESIS"}], "(g)": [{"c": "\u24a2", "n": "PARENTHESIZED LATIN SMALL LETTER G"}], "\ud83c\udd16": [{"c": "(G)", "n": "LEFT PARENTHESIS, LATIN CAPITAL LETTER G, RIGHT PARENTHESIS"}], "(G)": [{"c": "\ud83c\udd16", "n": "PARENTHESIZED LATIN CAPITAL LETTER G"}], "\u24a3": [{"c": "(h)", "n": "LEFT PARENTHESIS, LATIN SMALL LETTER H, RIGHT PARENTHESIS"}], "(h)": [{"c": "\u24a3", "n": "PARENTHESIZED LATIN SMALL LETTER H"}], "\ud83c\udd17": [{"c": "(H)", "n": "LEFT PARENTHESIS, LATIN CAPITAL LETTER H, RIGHT PARENTHESIS"}], "(H)": [{"c": "\ud83c\udd17", "n": "PARENTHESIZED LATIN CAPITAL LETTER H"}], "\u24a4": [{"c": "(i)", "n": "LEFT PARENTHESIS, LATIN SMALL LETTER I, RIGHT PARENTHESIS"}], "(i)": [{"c": "\u24a4", "n": "PARENTHESIZED LATIN SMALL LETTER I"}], "\u24a5": [{"c": "(j)", "n": "LEFT PARENTHESIS, LATIN SMALL LETTER J, RIGHT PARENTHESIS"}], "(j)": [{"c": "\u24a5", "n": "PARENTHESIZED LATIN SMALL LETTER J"}], "\ud83c\udd19": [{"c": "(J)", "n": "LEFT PARENTHESIS, LATIN CAPITAL LETTER J, RIGHT PARENTHESIS"}], "(J)": [{"c": "\ud83c\udd19", "n": "PARENTHESIZED LATIN CAPITAL LETTER J"}], "\u24a6": [{"c": "(k)", "n": "LEFT PARENTHESIS, LATIN SMALL LETTER K, RIGHT PARENTHESIS"}], "(k)": [{"c": "\u24a6", "n": "PARENTHESIZED LATIN SMALL LETTER K"}], "\ud83c\udd1a": [{"c": "(K)", "n": "LEFT PARENTHESIS, LATIN CAPITAL LETTER K, RIGHT PARENTHESIS"}], "(K)": [{"c": "\ud83c\udd1a", "n": "PARENTHESIZED LATIN CAPITAL LETTER K"}], "\u2474": [{"c": "(l)", "n": "LEFT PARENTHESIS, LATIN SMALL LETTER L, RIGHT PARENTHESIS"}], "(l)": [{"c": "\u2474", "n": "PARENTHESIZED DIGIT ONE"}, {"c": "\ud83c\udd18", "n": "PARENTHESIZED LATIN CAPITAL LETTER I"}, {"c": "\u24a7", "n": "PARENTHESIZED LATIN SMALL LETTER L"}], "\ud83c\udd18": [{"c": "(l)", "n": "LEFT PARENTHESIS, LATIN SMALL LETTER L, RIGHT PARENTHESIS"}], "\u24a7": [{"c": "(l)", "n": "LEFT PARENTHESIS, LATIN SMALL LETTER L, RIGHT PARENTHESIS"}], "\ud83c\udd1b": [{"c": "(L)", "n": "LEFT PARENTHESIS, LATIN CAPITAL LETTER L, RIGHT PARENTHESIS"}], "(L)": [{"c": "\ud83c\udd1b", "n": "PARENTHESIZED LATIN CAPITAL LETTER L"}], "\u247f": [{"c": "(l2)", "n": "LEFT PARENTHESIS, LATIN SMALL LETTER L, DIGIT TWO, RIGHT PARENTHESIS"}], "(l2)": [{"c": "\u247f", "n": "PARENTHESIZED NUMBER TWELVE"}], "\u2480": [{"c": "(l3)", "n": "LEFT PARENTHESIS, LATIN SMALL LETTER L, DIGIT THREE, RIGHT PARENTHESIS"}], "(l3)": [{"c": "\u2480", "n": "PARENTHESIZED NUMBER THIRTEEN"}], "\u2481": [{"c": "(l4)", "n": "LEFT PARENTHESIS, LATIN SMALL LETTER L, DIGIT FOUR, RIGHT PARENTHESIS"}], "(l4)": [{"c": "\u2481", "n": "PARENTHESIZED NUMBER FOURTEEN"}], "\u2482": [{"c": "(l5)", "n": "LEFT PARENTHESIS, LATIN SMALL LETTER L, DIGIT FIVE, RIGHT PARENTHESIS"}], "(l5)": [{"c": "\u2482", "n": "PARENTHESIZED NUMBER FIFTEEN"}], "\u2483": [{"c": "(l6)", "n": "LEFT PARENTHESIS, LATIN SMALL LETTER L, DIGIT SIX, RIGHT PARENTHESIS"}], "(l6)": [{"c": "\u2483", "n": "PARENTHESIZED NUMBER SIXTEEN"}], "\u2484": [{"c": "(l7)", "n": "LEFT PARENTHESIS, LATIN SMALL LETTER L, DIGIT SEVEN, RIGHT PARENTHESIS"}], "(l7)": [{"c": "\u2484", "n": "PARENTHESIZED NUMBER SEVENTEEN"}], "\u2485": [{"c": "(l8)", "n": "LEFT PARENTHESIS, LATIN SMALL LETTER L, DIGIT EIGHT, RIGHT PARENTHESIS"}], "(l8)": [{"c": "\u2485", "n": "PARENTHESIZED NUMBER EIGHTEEN"}], "\u2486": [{"c": "(l9)", "n": "LEFT PARENTHESIS, LATIN SMALL LETTER L, DIGIT NINE, RIGHT PARENTHESIS"}], "(l9)": [{"c": "\u2486", "n": "PARENTHESIZED NUMBER NINETEEN"}], "\u247e": [{"c": "(ll)", "n": "LEFT PARENTHESIS, LATIN SMALL LETTER L, LATIN SMALL LETTER L, RIGHT PARENTHESIS"}], "(ll)": [{"c": "\u247e", "n": "PARENTHESIZED NUMBER ELEVEN"}], "\u247d": [{"c": "(lO)", "n": "LEFT PARENTHESIS, LATIN SMALL LETTER L, LATIN CAPITAL LETTER O, RIGHT PARENTHESIS"}], "(lO)": [{"c": "\u247d", "n": "PARENTHESIZED NUMBER TEN"}], "\ud83c\udd1c": [{"c": "(M)", "n": "LEFT PARENTHESIS, LATIN CAPITAL LETTER M, RIGHT PARENTHESIS"}], "(M)": [{"c": "\ud83c\udd1c", "n": "PARENTHESIZED LATIN CAPITAL LETTER M"}], "\u24a9": [{"c": "(n)", "n": "LEFT PARENTHESIS, LATIN SMALL LETTER N, RIGHT PARENTHESIS"}], "(n)": [{"c": "\u24a9", "n": "PARENTHESIZED LATIN SMALL LETTER N"}], "\ud83c\udd1d": [{"c": "(N)", "n": "LEFT PARENTHESIS, LATIN CAPITAL LETTER N, RIGHT PARENTHESIS"}], "(N)": [{"c": "\ud83c\udd1d", "n": "PARENTHESIZED LATIN CAPITAL LETTER N"}], "\u24aa": [{"c": "(o)", "n": "LEFT PARENTHESIS, LATIN SMALL LETTER O, RIGHT PARENTHESIS"}], "(o)": [{"c": "\u24aa", "n": "PARENTHESIZED LATIN SMALL LETTER O"}], "\ud83c\udd1e": [{"c": "(O)", "n": "LEFT PARENTHESIS, LATIN CAPITAL LETTER O, RIGHT PARENTHESIS"}], "(O)": [{"c": "\ud83c\udd1e", "n": "PARENTHESIZED LATIN CAPITAL LETTER O"}], "\u24ab": [{"c": "(p)", "n": "LEFT PARENTHESIS, LATIN SMALL LETTER P, RIGHT PARENTHESIS"}], "(p)": [{"c": "\u24ab", "n": "PARENTHESIZED LATIN SMALL LETTER P"}], "\ud83c\udd1f": [{"c": "(P)", "n": "LEFT PARENTHESIS, LATIN CAPITAL LETTER P, RIGHT PARENTHESIS"}], "(P)": [{"c": "\ud83c\udd1f", "n": "PARENTHESIZED LATIN CAPITAL LETTER P"}], "\u24ac": [{"c": "(q)", "n": "LEFT PARENTHESIS, LATIN SMALL LETTER Q, RIGHT PARENTHESIS"}], "(q)": [{"c": "\u24ac", "n": "PARENTHESIZED LATIN SMALL LETTER Q"}], "\ud83c\udd20": [{"c": "(Q)", "n": "LEFT PARENTHESIS, LATIN CAPITAL LETTER Q, RIGHT PARENTHESIS"}], "(Q)": [{"c": "\ud83c\udd20", "n": "PARENTHESIZED LATIN CAPITAL LETTER Q"}], "\u24ad": [{"c": "(r)", "n": "LEFT PARENTHESIS, LATIN SMALL LETTER R, RIGHT PARENTHESIS"}], "(r)": [{"c": "\u24ad", "n": "PARENTHESIZED LATIN SMALL LETTER R"}], "\ud83c\udd21": [{"c": "(R)", "n": "LEFT PARENTHESIS, LATIN CAPITAL LETTER R, RIGHT PARENTHESIS"}], "(R)": [{"c": "\ud83c\udd21", "n": "PARENTHESIZED LATIN CAPITAL LETTER R"}], "\u24a8": [{"c": "(rn)", "n": "LEFT PARENTHESIS, LATIN SMALL LETTER R, LATIN SMALL LETTER N, RIGHT PARENTHESIS"}], "(rn)": [{"c": "\u24a8", "n": "PARENTHESIZED LATIN SMALL LETTER M"}], "\u24ae": [{"c": "(s)", "n": "LEFT PARENTHESIS, LATIN SMALL LETTER S, RIGHT PARENTHESIS"}], "(s)": [{"c": "\u24ae", "n": "PARENTHESIZED LATIN SMALL LETTER S"}], "\ud83c\udd22": [{"c": "(S)", "n": "LEFT PARENTHESIS, LATIN CAPITAL LETTER S, RIGHT PARENTHESIS"}], "(S)": [{"c": "\ud83c\udd22", "n": "PARENTHESIZED LATIN CAPITAL LETTER S"}, {"c": "\ud83c\udd2a", "n": "TORTOISE SHELL BRACKETED LATIN CAPITAL LETTER S"}], "\ud83c\udd2a": [{"c": "(S)", "n": "LEFT PARENTHESIS, LATIN CAPITAL LETTER S, RIGHT PARENTHESIS"}], "\u24af": [{"c": "(t)", "n": "LEFT PARENTHESIS, LATIN SMALL LETTER T, RIGHT PARENTHESIS"}], "(t)": [{"c": "\u24af", "n": "PARENTHESIZED LATIN SMALL LETTER T"}], "\ud83c\udd23": [{"c": "(T)", "n": "LEFT PARENTHESIS, LATIN CAPITAL LETTER T, RIGHT PARENTHESIS"}], "(T)": [{"c": "\ud83c\udd23", "n": "PARENTHESIZED LATIN CAPITAL LETTER T"}], "\u24b0": [{"c": "(u)", "n": "LEFT PARENTHESIS, LATIN SMALL LETTER U, RIGHT PARENTHESIS"}], "(u)": [{"c": "\u24b0", "n": "PARENTHESIZED LATIN SMALL LETTER U"}], "\ud83c\udd24": [{"c": "(U)", "n": "LEFT PARENTHESIS, LATIN CAPITAL LETTER U, RIGHT PARENTHESIS"}], "(U)": [{"c": "\ud83c\udd24", "n": "PARENTHESIZED LATIN CAPITAL LETTER U"}], "\u24b1": [{"c": "(v)", "n": "LEFT PARENTHESIS, LATIN SMALL LETTER V, RIGHT PARENTHESIS"}], "(v)": [{"c": "\u24b1", "n": "PARENTHESIZED LATIN SMALL LETTER V"}], "\ud83c\udd25": [{"c": "(V)", "n": "LEFT PARENTHESIS, LATIN CAPITAL LETTER V, RIGHT PARENTHESIS"}], "(V)": [{"c": "\ud83c\udd25", "n": "PARENTHESIZED LATIN CAPITAL LETTER V"}], "\u24b2": [{"c": "(w)", "n": "LEFT PARENTHESIS, LATIN SMALL LETTER W, RIGHT PARENTHESIS"}], "(w)": [{"c": "\u24b2", "n": "PARENTHESIZED LATIN SMALL LETTER W"}], "\ud83c\udd26": [{"c": "(W)", "n": "LEFT PARENTHESIS, LATIN CAPITAL LETTER W, RIGHT PARENTHESIS"}], "(W)": [{"c": "\ud83c\udd26", "n": "PARENTHESIZED LATIN CAPITAL LETTER W"}], "\u24b3": [{"c": "(x)", "n": "LEFT PARENTHESIS, LATIN SMALL LETTER X, RIGHT PARENTHESIS"}], "(x)": [{"c": "\u24b3", "n": "PARENTHESIZED LATIN SMALL LETTER X"}], "\ud83c\udd27": [{"c": "(X)", "n": "LEFT PARENTHESIS, LATIN CAPITAL LETTER X, RIGHT PARENTHESIS"}], "(X)": [{"c": "\ud83c\udd27", "n": "PARENTHESIZED LATIN CAPITAL LETTER X"}], "\u24b4": [{"c": "(y)", "n": "LEFT PARENTHESIS, LATIN SMALL LETTER Y, RIGHT PARENTHESIS"}], "(y)": [{"c": "\u24b4", "n": "PARENTHESIZED LATIN SMALL LETTER Y"}], "\ud83c\udd28": [{"c": "(Y)", "n": "LEFT PARENTHESIS, LATIN CAPITAL LETTER Y, RIGHT PARENTHESIS"}], "(Y)": [{"c": "\ud83c\udd28", "n": "PARENTHESIZED LATIN CAPITAL LETTER Y"}], "\u24b5": [{"c": "(z)", "n": "LEFT PARENTHESIS, LATIN SMALL LETTER Z, RIGHT PARENTHESIS"}], "(z)": [{"c": "\u24b5", "n": "PARENTHESIZED LATIN SMALL LETTER Z"}], "\ud83c\udd29": [{"c": "(Z)", "n": "LEFT PARENTHESIS, LATIN CAPITAL LETTER Z, RIGHT PARENTHESIS"}], "(Z)": [{"c": "\ud83c\udd29", "n": "PARENTHESIZED LATIN CAPITAL LETTER Z"}], "\u3200": [{"c": "(\u1100)", "n": "LEFT PARENTHESIS, HANGUL CHOSEONG KIYEOK, RIGHT PARENTHESIS"}], "(\u1100)": [{"c": "\u3200", "n": "PARENTHESIZED HANGUL KIYEOK"}], "\u320e": [{"c": "(\uac00)", "n": "LEFT PARENTHESIS, HANGUL SYLLABLE GA, RIGHT PARENTHESIS"}], "(\uac00)": [{"c": "\u320e", "n": "PARENTHESIZED HANGUL KIYEOK A"}], "\u3201": [{"c": "(\u1102)", "n": "LEFT PARENTHESIS, HANGUL CHOSEONG NIEUN, RIGHT PARENTHESIS"}], "(\u1102)": [{"c": "\u3201", "n": "PARENTHESIZED HANGUL NIEUN"}], "\u320f": [{"c": "(\ub098)", "n": "LEFT PARENTHESIS, HANGUL SYLLABLE NA, RIGHT PARENTHESIS"}], "(\ub098)": [{"c": "\u320f", "n": "PARENTHESIZED HANGUL NIEUN A"}], "\u3202": [{"c": "(\u1103)", "n": "LEFT PARENTHESIS, HANGUL CHOSEONG TIKEUT, RIGHT PARENTHESIS"}], "(\u1103)": [{"c": "\u3202", "n": "PARENTHESIZED HANGUL TIKEUT"}], "\u3210": [{"c": "(\ub2e4)", "n": "LEFT PARENTHESIS, HANGUL SYLLABLE DA, RIGHT PARENTHESIS"}], "(\ub2e4)": [{"c": "\u3210", "n": "PARENTHESIZED HANGUL TIKEUT A"}], "\u3203": [{"c": "(\u1105)", "n": "LEFT PARENTHESIS, HANGUL CHOSEONG RIEUL, RIGHT PARENTHESIS"}], "(\u1105)": [{"c": "\u3203", "n": "PARENTHESIZED HANGUL RIEUL"}], "\u3211": [{"c": "(\ub77c)", "n": "LEFT PARENTHESIS, HANGUL SYLLABLE RA, RIGHT PARENTHESIS"}], "(\ub77c)": [{"c": "\u3211", "n": "PARENTHESIZED HANGUL RIEUL A"}], "\u3204": [{"c": "(\u1106)", "n": "LEFT PARENTHESIS, HANGUL CHOSEONG MIEUM, RIGHT PARENTHESIS"}], "(\u1106)": [{"c": "\u3204", "n": "PARENTHESIZED HANGUL MIEUM"}], "\u3212": [{"c": "(\ub9c8)", "n": "LEFT PARENTHESIS, HANGUL SYLLABLE MA, RIGHT PARENTHESIS"}], "(\ub9c8)": [{"c": "\u3212", "n": "PARENTHESIZED HANGUL MIEUM A"}], "\u3205": [{"c": "(\u1107)", "n": "LEFT PARENTHESIS, HANGUL CHOSEONG PIEUP, RIGHT PARENTHESIS"}], "(\u1107)": [{"c": "\u3205", "n": "PARENTHESIZED HANGUL PIEUP"}], "\u3213": [{"c": "(\ubc14)", "n": "LEFT PARENTHESIS, HANGUL SYLLABLE BA, RIGHT PARENTHESIS"}], "(\ubc14)": [{"c": "\u3213", "n": "PARENTHESIZED HANGUL PIEUP A"}], "\u3206": [{"c": "(\u1109)", "n": "LEFT PARENTHESIS, HANGUL CHOSEONG SIOS, RIGHT PARENTHESIS"}], "(\u1109)": [{"c": "\u3206", "n": "PARENTHESIZED HANGUL SIOS"}], "\u3214": [{"c": "(\uc0ac)", "n": "LEFT PARENTHESIS, HANGUL SYLLABLE SA, RIGHT PARENTHESIS"}], "(\uc0ac)": [{"c": "\u3214", "n": "PARENTHESIZED HANGUL SIOS A"}], "\u3207": [{"c": "(\u110b)", "n": "LEFT PARENTHESIS, HANGUL CHOSEONG IEUNG, RIGHT PARENTHESIS"}], "(\u110b)": [{"c": "\u3207", "n": "PARENTHESIZED HANGUL IEUNG"}], "\u3215": [{"c": "(\uc544)", "n": "LEFT PARENTHESIS, HANGUL SYLLABLE A, RIGHT PARENTHESIS"}], "(\uc544)": [{"c": "\u3215", "n": "PARENTHESIZED HANGUL IEUNG A"}], "\u321d": [{"c": "(\uc624\uc804)", "n": "LEFT PARENTHESIS, HANGUL SYLLABLE O, HANGUL SYLLABLE JEON, RIGHT PARENTHESIS"}], "(\uc624\uc804)": [{"c": "\u321d", "n": "PARENTHESIZED KOREAN CHARACTER OJEON"}], "\u321e": [{"c": "(\uc624\ud6c4)", "n": "LEFT PARENTHESIS, HANGUL SYLLABLE O, HANGUL SYLLABLE HU, RIGHT PARENTHESIS"}], "(\uc624\ud6c4)": [{"c": "\u321e", "n": "PARENTHESIZED KOREAN CHARACTER O HU"}], "\u3208": [{"c": "(\u110c)", "n": "LEFT PARENTHESIS, HANGUL CHOSEONG CIEUC, RIGHT PARENTHESIS"}], "(\u110c)": [{"c": "\u3208", "n": "PARENTHESIZED HANGUL CIEUC"}], "\u3216": [{"c": "(\uc790)", "n": "LEFT PARENTHESIS, HANGUL SYLLABLE JA, RIGHT PARENTHESIS"}], "(\uc790)": [{"c": "\u3216", "n": "PARENTHESIZED HANGUL CIEUC A"}], "\u321c": [{"c": "(\uc8fc)", "n": "LEFT PARENTHESIS, HANGUL SYLLABLE JU, RIGHT PARENTHESIS"}], "(\uc8fc)": [{"c": "\u321c", "n": "PARENTHESIZED HANGUL CIEUC U"}], "\u3209": [{"c": "(\u110e)", "n": "LEFT PARENTHESIS, HANGUL CHOSEONG CHIEUCH, RIGHT PARENTHESIS"}], "(\u110e)": [{"c": "\u3209", "n": "PARENTHESIZED HANGUL CHIEUCH"}], "\u3217": [{"c": "(\ucc28)", "n": "LEFT PARENTHESIS, HANGUL SYLLABLE CA, RIGHT PARENTHESIS"}], "(\ucc28)": [{"c": "\u3217", "n": "PARENTHESIZED HANGUL CHIEUCH A"}], "\u320a": [{"c": "(\u110f)", "n": "LEFT PARENTHESIS, HANGUL CHOSEONG KHIEUKH, RIGHT PARENTHESIS"}], "(\u110f)": [{"c": "\u320a", "n": "PARENTHESIZED HANGUL KHIEUKH"}], "\u3218": [{"c": "(\uce74)", "n": "LEFT PARENTHESIS, HANGUL SYLLABLE KA, RIGHT PARENTHESIS"}], "(\uce74)": [{"c": "\u3218", "n": "PARENTHESIZED HANGUL KHIEUKH A"}], "\u320b": [{"c": "(\u1110)", "n": "LEFT PARENTHESIS, HANGUL CHOSEONG THIEUTH, RIGHT PARENTHESIS"}], "(\u1110)": [{"c": "\u320b", "n": "PARENTHESIZED HANGUL THIEUTH"}], "\u3219": [{"c": "(\ud0c0)", "n": "LEFT PARENTHESIS, HANGUL SYLLABLE TA, RIGHT PARENTHESIS"}], "(\ud0c0)": [{"c": "\u3219", "n": "PARENTHESIZED HANGUL THIEUTH A"}], "\u320c": [{"c": "(\u1111)", "n": "LEFT PARENTHESIS, HANGUL CHOSEONG PHIEUPH, RIGHT PARENTHESIS"}], "(\u1111)": [{"c": "\u320c", "n": "PARENTHESIZED HANGUL PHIEUPH"}], "\u321a": [{"c": "(\ud30c)", "n": "LEFT PARENTHESIS, HANGUL SYLLABLE PA, RIGHT PARENTHESIS"}], "(\ud30c)": [{"c": "\u321a", "n": "PARENTHESIZED HANGUL PHIEUPH A"}], "\u320d": [{"c": "(\u1112)", "n": "LEFT PARENTHESIS, HANGUL CHOSEONG HIEUH, RIGHT PARENTHESIS"}], "(\u1112)": [{"c": "\u320d", "n": "PARENTHESIZED HANGUL HIEUH"}], "\u321b": [{"c": "(\ud558)", "n": "LEFT PARENTHESIS, HANGUL SYLLABLE HA, RIGHT PARENTHESIS"}], "(\ud558)": [{"c": "\u321b", "n": "PARENTHESIZED HANGUL HIEUH A"}], "\u3226": [{"c": "(\u4e03)", "n": "LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4E03, RIGHT PARENTHESIS"}], "(\u4e03)": [{"c": "\u3226", "n": "PARENTHESIZED IDEOGRAPH SEVEN"}], "\u3222": [{"c": "(\u4e09)", "n": "LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4E09, RIGHT PARENTHESIS"}], "(\u4e09)": [{"c": "\u3222", "n": "PARENTHESIZED IDEOGRAPH THREE"}, {"c": "\ud83c\ude41", "n": "TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E09"}], "\ud83c\ude41": [{"c": "(\u4e09)", "n": "LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4E09, RIGHT PARENTHESIS"}], "\u3228": [{"c": "(\u4e5d)", "n": "LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4E5D, RIGHT PARENTHESIS"}], "(\u4e5d)": [{"c": "\u3228", "n": "PARENTHESIZED IDEOGRAPH NINE"}], "\u3221": [{"c": "(\u4e8c)", "n": "LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4E8C, RIGHT PARENTHESIS"}], "(\u4e8c)": [{"c": "\u3221", "n": "PARENTHESIZED IDEOGRAPH TWO"}, {"c": "\ud83c\ude42", "n": "TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E8C"}], "\ud83c\ude42": [{"c": "(\u4e8c)", "n": "LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4E8C, RIGHT PARENTHESIS"}], "\u3224": [{"c": "(\u4e94)", "n": "LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4E94, RIGHT PARENTHESIS"}], "(\u4e94)": [{"c": "\u3224", "n": "PARENTHESIZED IDEOGRAPH FIVE"}], "\u3239": [{"c": "(\u4ee3)", "n": "LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4EE3, RIGHT PARENTHESIS"}], "(\u4ee3)": [{"c": "\u3239", "n": "PARENTHESIZED IDEOGRAPH REPRESENT"}], "\u323d": [{"c": "(\u4f01)", "n": "LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4F01, RIGHT PARENTHESIS"}], "(\u4f01)": [{"c": "\u323d", "n": "PARENTHESIZED IDEOGRAPH ENTERPRISE"}], "\u3241": [{"c": "(\u4f11)", "n": "LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4F11, RIGHT PARENTHESIS"}], "(\u4f11)": [{"c": "\u3241", "n": "PARENTHESIZED IDEOGRAPH REST"}], "\u3227": [{"c": "(\u516b)", "n": "LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-516B, RIGHT PARENTHESIS"}], "(\u516b)": [{"c": "\u3227", "n": "PARENTHESIZED IDEOGRAPH EIGHT"}], "\u3225": [{"c": "(\u516d)", "n": "LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-516D, RIGHT PARENTHESIS"}], "(\u516d)": [{"c": "\u3225", "n": "PARENTHESIZED IDEOGRAPH SIX"}], "\u3238": [{"c": "(\u52b4)", "n": "LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-52B4, RIGHT PARENTHESIS"}], "(\u52b4)": [{"c": "\u3238", "n": "PARENTHESIZED IDEOGRAPH LABOR"}], "\ud83c\ude47": [{"c": "(\u52dd)", "n": "LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-52DD, RIGHT PARENTHESIS"}], "(\u52dd)": [{"c": "\ud83c\ude47", "n": "TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-52DD"}], "\u3229": [{"c": "(\u5341)", "n": "LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-5341, RIGHT PARENTHESIS"}], "(\u5341)": [{"c": "\u3229", "n": "PARENTHESIZED IDEOGRAPH TEN"}], "\u323f": [{"c": "(\u5354)", "n": "LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-5354, RIGHT PARENTHESIS"}], "(\u5354)": [{"c": "\u323f", "n": "PARENTHESIZED IDEOGRAPH ALLIANCE"}], "\u3234": [{"c": "(\u540d)", "n": "LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-540D, RIGHT PARENTHESIS"}], "(\u540d)": [{"c": "\u3234", "n": "PARENTHESIZED IDEOGRAPH NAME"}], "\u323a": [{"c": "(\u547c)", "n": "LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-547C, RIGHT PARENTHESIS"}], "(\u547c)": [{"c": "\u323a", "n": "PARENTHESIZED IDEOGRAPH CALL"}], "\u3223": [{"c": "(\u56db)", "n": "LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-56DB, RIGHT PARENTHESIS"}], "(\u56db)": [{"c": "\u3223", "n": "PARENTHESIZED IDEOGRAPH FOUR"}], "\u322f": [{"c": "(\u571f)", "n": "LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-571F, RIGHT PARENTHESIS"}], "(\u571f)": [{"c": "\u322f", "n": "PARENTHESIZED IDEOGRAPH EARTH"}], "\u323b": [{"c": "(\u5b66)", "n": "LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-5B66, RIGHT PARENTHESIS"}], "(\u5b66)": [{"c": "\u323b", "n": "PARENTHESIZED IDEOGRAPH STUDY"}], "\ud83c\ude43": [{"c": "(\u5b89)", "n": "LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-5B89, RIGHT PARENTHESIS"}], "(\u5b89)": [{"c": "\ud83c\ude43", "n": "TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-5B89"}], "\ud83c\ude45": [{"c": "(\u6253)", "n": "LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-6253, RIGHT PARENTHESIS"}], "(\u6253)": [{"c": "\ud83c\ude45", "n": "TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6253"}], "\ud83c\ude48": [{"c": "(\u6557)", "n": "LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-6557, RIGHT PARENTHESIS"}], "(\u6557)": [{"c": "\ud83c\ude48", "n": "TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557"}], "\u3230": [{"c": "(\u65e5)", "n": "LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-65E5, RIGHT PARENTHESIS"}], "(\u65e5)": [{"c": "\u3230", "n": "PARENTHESIZED IDEOGRAPH SUN"}], "\u322a": [{"c": "(\u6708)", "n": "LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-6708, RIGHT PARENTHESIS"}], "(\u6708)": [{"c": "\u322a", "n": "PARENTHESIZED IDEOGRAPH MOON"}], "\u3232": [{"c": "(\u6709)", "n": "LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-6709, RIGHT PARENTHESIS"}], "(\u6709)": [{"c": "\u3232", "n": "PARENTHESIZED IDEOGRAPH HAVE"}], "\u322d": [{"c": "(\u6728)", "n": "LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-6728, RIGHT PARENTHESIS"}], "(\u6728)": [{"c": "\u322d", "n": "PARENTHESIZED IDEOGRAPH WOOD"}], "\ud83c\ude40": [{"c": "(\u672c)", "n": "LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-672C, RIGHT PARENTHESIS"}], "(\u672c)": [{"c": "\ud83c\ude40", "n": "TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C"}], "\u3231": [{"c": "(\u682a)", "n": "LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-682A, RIGHT PARENTHESIS"}], "(\u682a)": [{"c": "\u3231", "n": "PARENTHESIZED IDEOGRAPH STOCK"}], "\u322c": [{"c": "(\u6c34)", "n": "LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-6C34, RIGHT PARENTHESIS"}], "(\u6c34)": [{"c": "\u322c", "n": "PARENTHESIZED IDEOGRAPH WATER"}], "\u322b": [{"c": "(\u706b)", "n": "LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-706B, RIGHT PARENTHESIS"}], "(\u706b)": [{"c": "\u322b", "n": "PARENTHESIZED IDEOGRAPH FIRE"}], "\ud83c\ude44": [{"c": "(\u70b9)", "n": "LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-70B9, RIGHT PARENTHESIS"}], "(\u70b9)": [{"c": "\ud83c\ude44", "n": "TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-70B9"}], "\u3235": [{"c": "(\u7279)", "n": "LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-7279, RIGHT PARENTHESIS"}], "(\u7279)": [{"c": "\u3235", "n": "PARENTHESIZED IDEOGRAPH SPECIAL"}], "\ud83c\ude46": [{"c": "(\u76d7)", "n": "LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-76D7, RIGHT PARENTHESIS"}], "(\u76d7)": [{"c": "\ud83c\ude46", "n": "TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-76D7"}], "\u323c": [{"c": "(\u76e3)", "n": "LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-76E3, RIGHT PARENTHESIS"}], "(\u76e3)": [{"c": "\u323c", "n": "PARENTHESIZED IDEOGRAPH SUPERVISE"}], "\u3233": [{"c": "(\u793e)", "n": "LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-793E, RIGHT PARENTHESIS"}], "(\u793e)": [{"c": "\u3233", "n": "PARENTHESIZED IDEOGRAPH SOCIETY"}], "\u3237": [{"c": "(\u795d)", "n": "LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-795D, RIGHT PARENTHESIS"}], "(\u795d)": [{"c": "\u3237", "n": "PARENTHESIZED IDEOGRAPH CONGRATULATION"}], "\u3240": [{"c": "(\u796d)", "n": "LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-796D, RIGHT PARENTHESIS"}], "(\u796d)": [{"c": "\u3240", "n": "PARENTHESIZED IDEOGRAPH FESTIVAL"}], "\u3242": [{"c": "(\u81ea)", "n": "LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-81EA, RIGHT PARENTHESIS"}], "(\u81ea)": [{"c": "\u3242", "n": "PARENTHESIZED IDEOGRAPH SELF"}], "\u3243": [{"c": "(\u81f3)", "n": "LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-81F3, RIGHT PARENTHESIS"}], "(\u81f3)": [{"c": "\u3243", "n": "PARENTHESIZED IDEOGRAPH REACH"}], "\u3236": [{"c": "(\u8ca1)", "n": "LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-8CA1, RIGHT PARENTHESIS"}], "(\u8ca1)": [{"c": "\u3236", "n": "PARENTHESIZED IDEOGRAPH FINANCIAL"}], "\u323e": [{"c": "(\u8cc7)", "n": "LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-8CC7, RIGHT PARENTHESIS"}], "(\u8cc7)": [{"c": "\u323e", "n": "PARENTHESIZED IDEOGRAPH RESOURCE"}], "\u322e": [{"c": "(\u91d1)", "n": "LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-91D1, RIGHT PARENTHESIS"}], "(\u91d1)": [{"c": "\u322e", "n": "PARENTHESIZED IDEOGRAPH METAL"}], "\uff3d": [{"c": ")", "n": "RIGHT PARENTHESIS"}], ")": [{"c": "\uff3d", "n": "FULLWIDTH RIGHT SQUARE BRACKET"}, {"c": "\u2769", "n": "MEDIUM RIGHT PARENTHESIS ORNAMENT"}, {"c": "\u2773", "n": "LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT"}, {"c": "\u3015", "n": "RIGHT TORTOISE SHELL BRACKET"}, {"c": "\ufd3f", "n": "ORNATE RIGHT PARENTHESIS"}], "\u2769": [{"c": ")", "n": "RIGHT PARENTHESIS"}], "\u2773": [{"c": ")", "n": "RIGHT PARENTHESIS"}], "\u3015": [{"c": ")", "n": "RIGHT PARENTHESIS"}], "\ufd3f": [{"c": ")", "n": "RIGHT PARENTHESIS"}], "\u2e29": [{"c": "))", "n": "RIGHT PARENTHESIS, RIGHT PARENTHESIS"}], "))": [{"c": "\u2e29", "n": "RIGHT DOUBLE PARENTHESIS"}], "\u2774": [{"c": "{", "n": "LEFT CURLY BRACKET"}], "{": [{"c": "\u2774", "n": "MEDIUM LEFT CURLY BRACKET ORNAMENT"}, {"c": "\ud834\udd14", "n": "MUSICAL SYMBOL BRACE"}], "\ud834\udd14": [{"c": "{", "n": "LEFT CURLY BRACKET"}], "\u2775": [{"c": "}", "n": "RIGHT CURLY BRACKET"}], "}": [{"c": "\u2775", "n": "MEDIUM RIGHT CURLY BRACKET ORNAMENT"}], "\u301a": [{"c": "\u27e6", "n": "MATHEMATICAL LEFT WHITE SQUARE BRACKET"}], "\u27e6": [{"c": "\u301a", "n": "LEFT WHITE SQUARE BRACKET"}], "\u301b": [{"c": "\u27e7", "n": "MATHEMATICAL RIGHT WHITE SQUARE BRACKET"}], "\u27e7": [{"c": "\u301b", "n": "RIGHT WHITE SQUARE BRACKET"}], "\u27e8": [{"c": "\u276c", "n": "MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT"}], "\u276c": [{"c": "\u27e8", "n": "MATHEMATICAL LEFT ANGLE BRACKET"}, {"c": "\u2329", "n": "LEFT-POINTING ANGLE BRACKET"}, {"c": "\u3008", "n": "LEFT ANGLE BRACKET"}, {"c": "\u31db", "n": "CJK STROKE PD"}, {"c": "\u304f", "n": "HIRAGANA LETTER KU"}, {"c": "\ud847\udfe8", "n": "CJK UNIFIED IDEOGRAPH-21FE8"}], "\u2329": [{"c": "\u276c", "n": "MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT"}], "\u3008": [{"c": "\u276c", "n": "MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT"}], "\u31db": [{"c": "\u276c", "n": "MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT"}], "\u304f": [{"c": "\u276c", "n": "MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT"}], "\ud847\udfe8": [{"c": "\u276c", "n": "MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT"}], "\u27e9": [{"c": "\u276d", "n": "MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT"}], "\u276d": [{"c": "\u27e9", "n": "MATHEMATICAL RIGHT ANGLE BRACKET"}, {"c": "\u232a", "n": "RIGHT-POINTING ANGLE BRACKET"}, {"c": "\u3009", "n": "RIGHT ANGLE BRACKET"}], "\u232a": [{"c": "\u276d", "n": "MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT"}], "\u3009": [{"c": "\u276d", "n": "MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT"}], "\uff3e": [{"c": "\ufe3f", "n": "PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET"}], "\ufe3f": [{"c": "\uff3e", "n": "FULLWIDTH CIRCUMFLEX ACCENT"}], "\u2e3f": [{"c": "\u00b6", "n": "PILCROW SIGN"}], "\u00b6": [{"c": "\u2e3f", "n": "CAPITULUM"}], "\u204e": [{"c": "*", "n": "ASTERISK"}], "*": [{"c": "\u204e", "n": "LOW ASTERISK"}, {"c": "\u200e\u066d\u200e", "n": "ARABIC FIVE POINTED STAR"}, {"c": "\u2217", "n": "ASTERISK OPERATOR"}, {"c": "\ud800\udf1f", "n": "OLD ITALIC LETTER ESS"}], "\u200e\u066d\u200e": [{"c": "*", "n": "ASTERISK"}], "\u2217": [{"c": "*", "n": "ASTERISK"}], "\ud800\udf1f": [{"c": "*", "n": "ASTERISK"}], "\u1735": [{"c": "/", "n": "SOLIDUS"}], "/": [{"c": "\u1735", "n": "PHILIPPINE SINGLE PUNCTUATION"}, {"c": "\u2041", "n": "CARET INSERTION POINT"}, {"c": "\u2215", "n": "DIVISION SLASH"}, {"c": "\u2044", "n": "FRACTION SLASH"}, {"c": "\u2571", "n": "BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT"}, {"c": "\u27cb", "n": "MATHEMATICAL RISING DIAGONAL"}, {"c": "\u29f8", "n": "BIG SOLIDUS"}, {"c": "\ud834\ude3a", "n": "GREEK INSTRUMENTAL NOTATION SYMBOL-47"}, {"c": "\u31d3", "n": "CJK STROKE SP"}, {"c": "\u3033", "n": "VERTICAL KANA REPEAT MARK UPPER HALF"}, {"c": "\u2cc6", "n": "COPTIC CAPITAL LETTER OLD COPTIC ESH"}, {"c": "\u30ce", "n": "KATAKANA LETTER NO"}, {"c": "\u4e3f", "n": "CJK UNIFIED IDEOGRAPH-4E3F"}, {"c": "\u2f03", "n": "KANGXI RADICAL SLASH"}], "\u2041": [{"c": "/", "n": "SOLIDUS"}], "\u2215": [{"c": "/", "n": "SOLIDUS"}], "\u2044": [{"c": "/", "n": "SOLIDUS"}], "\u2571": [{"c": "/", "n": "SOLIDUS"}], "\u27cb": [{"c": "/", "n": "SOLIDUS"}], "\u29f8": [{"c": "/", "n": "SOLIDUS"}], "\ud834\ude3a": [{"c": "/", "n": "SOLIDUS"}], "\u31d3": [{"c": "/", "n": "SOLIDUS"}], "\u3033": [{"c": "/", "n": "SOLIDUS"}], "\u2cc6": [{"c": "/", "n": "SOLIDUS"}], "\u30ce": [{"c": "/", "n": "SOLIDUS"}], "\u4e3f": [{"c": "/", "n": "SOLIDUS"}], "\u2f03": [{"c": "/", "n": "SOLIDUS"}], "\u29f6": [{"c": "/\u0304", "n": "SOLIDUS, COMBINING MACRON"}], "/\u0304": [{"c": "\u29f6", "n": "SOLIDUS WITH OVERBAR"}], "\u2afd": [{"c": "//", "n": "SOLIDUS, SOLIDUS"}], "//": [{"c": "\u2afd", "n": "DOUBLE SOLIDUS OPERATOR"}], "\u2afb": [{"c": "///", "n": "SOLIDUS, SOLIDUS, SOLIDUS"}], "///": [{"c": "\u2afb", "n": "TRIPLE SOLIDUS BINARY RELATION"}], "\uff3c": [{"c": "\\", "n": "REVERSE SOLIDUS"}], "\\": [{"c": "\uff3c", "n": "FULLWIDTH REVERSE SOLIDUS"}, {"c": "\ufe68", "n": "SMALL REVERSE SOLIDUS"}, {"c": "\u2216", "n": "SET MINUS"}, {"c": "\u27cd", "n": "MATHEMATICAL FALLING DIAGONAL"}, {"c": "\u29f5", "n": "REVERSE SOLIDUS OPERATOR"}, {"c": "\u29f9", "n": "BIG REVERSE SOLIDUS"}, {"c": "\ud834\ude0f", "n": "GREEK VOCAL NOTATION SYMBOL-16"}, {"c": "\ud834\ude3b", "n": "GREEK INSTRUMENTAL NOTATION SYMBOL-48"}, {"c": "\u31d4", "n": "CJK STROKE D"}, {"c": "\u4e36", "n": "CJK UNIFIED IDEOGRAPH-4E36"}, {"c": "\u2f02", "n": "KANGXI RADICAL DOT"}], "\ufe68": [{"c": "\\", "n": "REVERSE SOLIDUS"}], "\u2216": [{"c": "\\", "n": "REVERSE SOLIDUS"}], "\u27cd": [{"c": "\\", "n": "REVERSE SOLIDUS"}], "\u29f5": [{"c": "\\", "n": "REVERSE SOLIDUS"}], "\u29f9": [{"c": "\\", "n": "REVERSE SOLIDUS"}], "\ud834\ude0f": [{"c": "\\", "n": "REVERSE SOLIDUS"}], "\ud834\ude3b": [{"c": "\\", "n": "REVERSE SOLIDUS"}], "\u31d4": [{"c": "\\", "n": "REVERSE SOLIDUS"}], "\u4e36": [{"c": "\\", "n": "REVERSE SOLIDUS"}], "\u2f02": [{"c": "\\", "n": "REVERSE SOLIDUS"}], "\u2cf9": [{"c": "\\\\", "n": "REVERSE SOLIDUS, REVERSE SOLIDUS"}], "\\\\": [{"c": "\u2cf9", "n": "COPTIC OLD NUBIAN FULL STOP"}, {"c": "\u244a", "n": "OCR DOUBLE BACKSLASH"}], "\u244a": [{"c": "\\\\", "n": "REVERSE SOLIDUS, REVERSE SOLIDUS"}], "\u27c8": [{"c": "\\\u1455", "n": "REVERSE SOLIDUS, CANADIAN SYLLABICS TA"}], "\\\u1455": [{"c": "\u27c8", "n": "REVERSE SOLIDUS PRECEDING SUBSET"}], "\ua778": [{"c": "&", "n": "AMPERSAND"}], "&": [{"c": "\ua778", "n": "LATIN SMALL LETTER UM"}], "\u0af0": [{"c": "\u0970", "n": "DEVANAGARI ABBREVIATION SIGN"}], "\u0970": [{"c": "\u0af0", "n": "GUJARATI ABBREVIATION SIGN"}, {"c": "\ud804\udcbb", "n": "KAITHI ABBREVIATION SIGN"}, {"c": "\ud804\uddc7", "n": "SHARADA ABBREVIATION SIGN"}, {"c": "\u26ac", "n": "MEDIUM SMALL WHITE CIRCLE"}], "\ud804\udcbb": [{"c": "\u0970", "n": "DEVANAGARI ABBREVIATION SIGN"}], "\ud804\uddc7": [{"c": "\u0970", "n": "DEVANAGARI ABBREVIATION SIGN"}], "\u26ac": [{"c": "\u0970", "n": "DEVANAGARI ABBREVIATION SIGN"}], "\ud804\udddb": [{"c": "\ua8fc", "n": "DEVANAGARI SIGN SIDDHAM"}], "\ua8fc": [{"c": "\ud804\udddb", "n": "SHARADA SIGN SIDDHAM"}], "\u17d9": [{"c": "\u0e4f", "n": "THAI CHARACTER FONGMAN"}], "\u0e4f": [{"c": "\u17d9", "n": "KHMER SIGN PHNAEK MUAN"}], "\u17d5": [{"c": "\u0e5a", "n": "THAI CHARACTER ANGKHANKHU"}], "\u0e5a": [{"c": "\u17d5", "n": "KHMER SIGN BARIYOOSAN"}], "\u17da": [{"c": "\u0e5b", "n": "THAI CHARACTER KHOMUT"}], "\u0e5b": [{"c": "\u17da", "n": "KHMER SIGN KOOMUUT"}], "\u0f0c": [{"c": "\u0f0b", "n": "TIBETAN MARK INTERSYLLABIC TSHEG"}], "\u0f0b": [{"c": "\u0f0c", "n": "TIBETAN MARK DELIMITER TSHEG BSTAR"}], "\u0f0e": [{"c": "\u0f0d\u0f0d", "n": "TIBETAN MARK SHAD, TIBETAN MARK SHAD"}], "\u0f0d\u0f0d": [{"c": "\u0f0e", "n": "TIBETAN MARK NYIS SHAD"}], "\u02c4": [{"c": "^", "n": "CIRCUMFLEX ACCENT"}], "^": [{"c": "\u02c4", "n": "MODIFIER LETTER UP ARROWHEAD"}, {"c": "\u02c6", "n": "MODIFIER LETTER CIRCUMFLEX ACCENT"}], "\u02c6": [{"c": "^", "n": "CIRCUMFLEX ACCENT"}], "\ua67e": [{"c": "\u02c7", "n": "CARON"}], "\u02c7": [{"c": "\ua67e", "n": "CYRILLIC KAVYKA"}, {"c": "\u02d8", "n": "BREVE"}], "\u02d8": [{"c": "\u02c7", "n": "CARON"}], "\u203e": [{"c": "\u02c9", "n": "MODIFIER LETTER MACRON"}], "\u02c9": [{"c": "\u203e", "n": "OVERLINE"}, {"c": "\ufe49", "n": "DASHED OVERLINE"}, {"c": "\ufe4a", "n": "CENTRELINE OVERLINE"}, {"c": "\ufe4b", "n": "WAVY OVERLINE"}, {"c": "\ufe4c", "n": "DOUBLE WAVY OVERLINE"}, {"c": "\u00af", "n": "MACRON"}, {"c": "\uffe3", "n": "FULLWIDTH MACRON"}, {"c": "\u2594", "n": "UPPER ONE EIGHTH BLOCK"}], "\ufe49": [{"c": "\u02c9", "n": "MODIFIER LETTER MACRON"}], "\ufe4a": [{"c": "\u02c9", "n": "MODIFIER LETTER MACRON"}], "\ufe4b": [{"c": "\u02c9", "n": "MODIFIER LETTER MACRON"}], "\ufe4c": [{"c": "\u02c9", "n": "MODIFIER LETTER MACRON"}], "\u00af": [{"c": "\u02c9", "n": "MODIFIER LETTER MACRON"}], "\uffe3": [{"c": "\u02c9", "n": "MODIFIER LETTER MACRON"}], "\u2594": [{"c": "\u02c9", "n": "MODIFIER LETTER MACRON"}], "\u044a": [{"c": "\u02c9b", "n": "MODIFIER LETTER MACRON, LATIN SMALL LETTER B"}], "\u02c9b": [{"c": "\u044a", "n": "CYRILLIC SMALL LETTER HARD SIGN"}], "\ua651": [{"c": "\u02c9bi", "n": "MODIFIER LETTER MACRON, LATIN SMALL LETTER B, LATIN SMALL LETTER I"}], "\u02c9bi": [{"c": "\ua651", "n": "CYRILLIC SMALL LETTER YERU WITH BACK YER"}], "\u0375": [{"c": "\u02cf", "n": "MODIFIER LETTER LOW ACUTE ACCENT"}], "\u02cf": [{"c": "\u0375", "n": "GREEK LOWER NUMERAL SIGN"}], "\u02fb": [{"c": "\u02ea", "n": "MODIFIER LETTER YIN DEPARTING TONE MARK"}], "\u02ea": [{"c": "\u02fb", "n": "MODIFIER LETTER BEGIN LOW TONE"}, {"c": "\ua716", "n": "MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR"}], "\ua716": [{"c": "\u02ea", "n": "MODIFIER LETTER YIN DEPARTING TONE MARK"}], "\ua714": [{"c": "\u02eb", "n": "MODIFIER LETTER YANG DEPARTING TONE MARK"}], "\u02eb": [{"c": "\ua714", "n": "MODIFIER LETTER MID LEFT-STEM TONE BAR"}], "\u3002": [{"c": "\u02f3", "n": "MODIFIER LETTER LOW RING"}], "\u02f3": [{"c": "\u3002", "n": "IDEOGRAPHIC FULL STOP"}], "\u2e30": [{"c": "\u00b0", "n": "DEGREE SIGN"}], "\u00b0": [{"c": "\u2e30", "n": "RING POINT"}, {"c": "\u02da", "n": "RING ABOVE"}, {"c": "\u2218", "n": "RING OPERATOR"}, {"c": "\u25cb", "n": "WHITE CIRCLE"}, {"c": "\u25e6", "n": "WHITE BULLET"}], "\u02da": [{"c": "\u00b0", "n": "DEGREE SIGN"}], "\u2218": [{"c": "\u00b0", "n": "DEGREE SIGN"}], "\u25cb": [{"c": "\u00b0", "n": "DEGREE SIGN"}], "\u25e6": [{"c": "\u00b0", "n": "DEGREE SIGN"}], "\u235c": [{"c": "\u00b0\u0332", "n": "DEGREE SIGN, COMBINING LOW LINE"}], "\u00b0\u0332": [{"c": "\u235c", "n": "APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR"}], "\u2364": [{"c": "\u00b0\u0308", "n": "DEGREE SIGN, COMBINING DIAERESIS"}], "\u00b0\u0308": [{"c": "\u2364", "n": "APL FUNCTIONAL SYMBOL JOT DIAERESIS"}], "\u2103": [{"c": "\u00b0C", "n": "DEGREE SIGN, LATIN CAPITAL LETTER C"}], "\u00b0C": [{"c": "\u2103", "n": "DEGREE CELSIUS"}], "\u2109": [{"c": "\u00b0F", "n": "DEGREE SIGN, LATIN CAPITAL LETTER F"}], "\u00b0F": [{"c": "\u2109", "n": "DEGREE FAHRENHEIT"}], "\u0bf5": [{"c": "\u0bf3", "n": "TAMIL DAY SIGN"}], "\u0bf3": [{"c": "\u0bf5", "n": "TAMIL YEAR SIGN"}], "\u0f1b": [{"c": "\u0f1a\u0f1a", "n": "TIBETAN SIGN RDEL DKAR GCIG, TIBETAN SIGN RDEL DKAR GCIG"}], "\u0f1a\u0f1a": [{"c": "\u0f1b", "n": "TIBETAN SIGN RDEL DKAR GNYIS"}], "\u0f1f": [{"c": "\u0f1a\u0f1d", "n": "TIBETAN SIGN RDEL DKAR GCIG, TIBETAN SIGN RDEL NAG GCIG"}], "\u0f1a\u0f1d": [{"c": "\u0f1f", "n": "TIBETAN SIGN RDEL DKAR RDEL NAG"}], "\u0fce": [{"c": "\u0f1d\u0f1a", "n": "TIBETAN SIGN RDEL NAG GCIG, TIBETAN SIGN RDEL DKAR GCIG"}], "\u0f1d\u0f1a": [{"c": "\u0fce", "n": "TIBETAN SIGN RDEL NAG RDEL DKAR"}], "\u0f1e": [{"c": "\u0f1d\u0f1d", "n": "TIBETAN SIGN RDEL NAG GCIG, TIBETAN SIGN RDEL NAG GCIG"}], "\u0f1d\u0f1d": [{"c": "\u0f1e", "n": "TIBETAN SIGN RDEL NAG GNYIS"}], "\u24b8": [{"c": "\u00a9", "n": "COPYRIGHT SIGN"}], "\u00a9": [{"c": "\u24b8", "n": "CIRCLED LATIN CAPITAL LETTER C"}], "\u24c7": [{"c": "\u00ae", "n": "REGISTERED SIGN"}], "\u00ae": [{"c": "\u24c7", "n": "CIRCLED LATIN CAPITAL LETTER R"}], "\u24c5": [{"c": "\u2117", "n": "SOUND RECORDING COPYRIGHT"}], "\u2117": [{"c": "\u24c5", "n": "CIRCLED LATIN CAPITAL LETTER P"}], "\ud834\ude1b": [{"c": "\u2144", "n": "TURNED SANS-SERIF CAPITAL Y"}], "\u2144": [{"c": "\ud834\ude1b", "n": "GREEK VOCAL NOTATION SYMBOL-53"}], "\u2bec": [{"c": "\u219e", "n": "LEFTWARDS TWO HEADED ARROW"}], "\u219e": [{"c": "\u2bec", "n": "LEFTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS"}], "\u2bed": [{"c": "\u219f", "n": "UPWARDS TWO HEADED ARROW"}], "\u219f": [{"c": "\u2bed", "n": "UPWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS"}], "\u2bee": [{"c": "\u21a0", "n": "RIGHTWARDS TWO HEADED ARROW"}], "\u21a0": [{"c": "\u2bee", "n": "RIGHTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS"}], "\u2bef": [{"c": "\u21a1", "n": "DOWNWARDS TWO HEADED ARROW"}], "\u21a1": [{"c": "\u2bef", "n": "DOWNWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS"}], "\u21b5": [{"c": "\u21b2", "n": "DOWNWARDS ARROW WITH TIP LEFTWARDS"}], "\u21b2": [{"c": "\u21b5", "n": "DOWNWARDS ARROW WITH CORNER LEFTWARDS"}], "\u2965": [{"c": "\u21c3\u21c2", "n": "DOWNWARDS HARPOON WITH BARB LEFTWARDS, DOWNWARDS HARPOON WITH BARB RIGHTWARDS"}], "\u21c3\u21c2": [{"c": "\u2965", "n": "DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT"}], "\u296f": [{"c": "\u21c3\u16da", "n": "DOWNWARDS HARPOON WITH BARB LEFTWARDS, RUNIC LETTER LAUKAZ LAGU LOGR L"}], "\u21c3\u16da": [{"c": "\u296f", "n": "DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT"}], "\ud835\udedb": [{"c": "\u2202", "n": "PARTIAL DIFFERENTIAL"}], "\u2202": [{"c": "\ud835\udedb", "n": "MATHEMATICAL BOLD PARTIAL DIFFERENTIAL"}, {"c": "\ud835\udf15", "n": "MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL"}, {"c": "\ud835\udf4f", "n": "MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL"}, {"c": "\ud835\udf89", "n": "MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL"}, {"c": "\ud835\udfc3", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL"}, {"c": "\u200e\ud83a\udccc\u200e", "n": "MENDE KIKAKUI DIGIT SIX"}], "\ud835\udf15": [{"c": "\u2202", "n": "PARTIAL DIFFERENTIAL"}], "\ud835\udf4f": [{"c": "\u2202", "n": "PARTIAL DIFFERENTIAL"}], "\ud835\udf89": [{"c": "\u2202", "n": "PARTIAL DIFFERENTIAL"}], "\ud835\udfc3": [{"c": "\u2202", "n": "PARTIAL DIFFERENTIAL"}], "\u200e\ud83a\udccc\u200e": [{"c": "\u2202", "n": "PARTIAL DIFFERENTIAL"}], "\u200e\ud83a\udccd\u200e": [{"c": "\u2202\u0335", "n": "PARTIAL DIFFERENTIAL, COMBINING SHORT STROKE OVERLAY"}], "\u2202\u0335": [{"c": "\u200e\ud83a\udccd\u200e", "n": "MENDE KIKAKUI DIGIT SEVEN"}, {"c": "\u00f0", "n": "LATIN SMALL LETTER ETH"}], "\u00f0": [{"c": "\u2202\u0335", "n": "PARTIAL DIFFERENTIAL, COMBINING SHORT STROKE OVERLAY"}], "\u2300": [{"c": "\u2205", "n": "EMPTY SET"}], "\u2205": [{"c": "\u2300", "n": "DIAMETER SIGN"}], "\ud835\udec1": [{"c": "\u2207", "n": "NABLA"}], "\u2207": [{"c": "\ud835\udec1", "n": "MATHEMATICAL BOLD NABLA"}, {"c": "\ud835\udefb", "n": "MATHEMATICAL ITALIC NABLA"}, {"c": "\ud835\udf35", "n": "MATHEMATICAL BOLD ITALIC NABLA"}, {"c": "\ud835\udf6f", "n": "MATHEMATICAL SANS-SERIF BOLD NABLA"}, {"c": "\ud835\udfa9", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA"}, {"c": "\ud806\udca8", "n": "WARANG CITI CAPITAL LETTER E"}], "\ud835\udefb": [{"c": "\u2207", "n": "NABLA"}], "\ud835\udf35": [{"c": "\u2207", "n": "NABLA"}], "\ud835\udf6f": [{"c": "\u2207", "n": "NABLA"}], "\ud835\udfa9": [{"c": "\u2207", "n": "NABLA"}], "\ud806\udca8": [{"c": "\u2207", "n": "NABLA"}], "\u2362": [{"c": "\u2207\u0308", "n": "NABLA, COMBINING DIAERESIS"}], "\u2207\u0308": [{"c": "\u2362", "n": "APL FUNCTIONAL SYMBOL DEL DIAERESIS"}], "\u236b": [{"c": "\u2207\u0334", "n": "NABLA, COMBINING TILDE OVERLAY"}], "\u2207\u0334": [{"c": "\u236b", "n": "APL FUNCTIONAL SYMBOL DEL TILDE"}], "\u2588": [{"c": "\u220e", "n": "END OF PROOF"}], "\u220e": [{"c": "\u2588", "n": "FULL BLOCK"}, {"c": "\u25a0", "n": "BLACK SQUARE"}], "\u25a0": [{"c": "\u220e", "n": "END OF PROOF"}], "\u2a3f": [{"c": "\u2210", "n": "N-ARY COPRODUCT"}], "\u2210": [{"c": "\u2a3f", "n": "AMALGAMATION OR COPRODUCT"}], "\u16ed": [{"c": "+", "n": "PLUS SIGN"}], "+": [{"c": "\u16ed", "n": "RUNIC CROSS PUNCTUATION"}, {"c": "\u2795", "n": "HEAVY PLUS SIGN"}, {"c": "\ud800\ude9b", "n": "LYCIAN LETTER H"}], "\u2795": [{"c": "+", "n": "PLUS SIGN"}], "\ud800\ude9b": [{"c": "+", "n": "PLUS SIGN"}], "\u2a23": [{"c": "+\u0302", "n": "PLUS SIGN, COMBINING CIRCUMFLEX ACCENT"}], "+\u0302": [{"c": "\u2a23", "n": "PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE"}], "\u2a22": [{"c": "+\u030a", "n": "PLUS SIGN, COMBINING RING ABOVE"}], "+\u030a": [{"c": "\u2a22", "n": "PLUS SIGN WITH SMALL CIRCLE ABOVE"}], "\u2a24": [{"c": "+\u0303", "n": "PLUS SIGN, COMBINING TILDE"}], "+\u0303": [{"c": "\u2a24", "n": "PLUS SIGN WITH TILDE ABOVE"}], "\u2214": [{"c": "+\u0307", "n": "PLUS SIGN, COMBINING DOT ABOVE"}], "+\u0307": [{"c": "\u2214", "n": "DOT PLUS"}], "\u2a25": [{"c": "+\u0323", "n": "PLUS SIGN, COMBINING DOT BELOW"}], "+\u0323": [{"c": "\u2a25", "n": "PLUS SIGN WITH DOT BELOW"}], "\u2a26": [{"c": "+\u0330", "n": "PLUS SIGN, COMBINING TILDE BELOW"}], "+\u0330": [{"c": "\u2a26", "n": "PLUS SIGN WITH TILDE BELOW"}], "\u2a27": [{"c": "+\u2082", "n": "PLUS SIGN, SUBSCRIPT TWO"}], "+\u2082": [{"c": "\u2a27", "n": "PLUS SIGN WITH SUBSCRIPT TWO"}], "\u2797": [{"c": "\u00f7", "n": "DIVISION SIGN"}], "\u00f7": [{"c": "\u2797", "n": "HEAVY DIVISION SIGN"}], "\u2039": [{"c": "<", "n": "LESS-THAN SIGN"}], "<": [{"c": "\u2039", "n": "SINGLE LEFT-POINTING ANGLE QUOTATION MARK"}, {"c": "\u276e", "n": "HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT"}, {"c": "\u02c2", "n": "MODIFIER LETTER LEFT ARROWHEAD"}, {"c": "\ud834\ude36", "n": "GREEK INSTRUMENTAL NOTATION SYMBOL-40"}, {"c": "\u1438", "n": "CANADIAN SYLLABICS PA"}, {"c": "\u16b2", "n": "RUNIC LETTER KAUNA"}], "\u276e": [{"c": "<", "n": "LESS-THAN SIGN"}], "\u02c2": [{"c": "<", "n": "LESS-THAN SIGN"}], "\ud834\ude36": [{"c": "<", "n": "LESS-THAN SIGN"}], "\u1438": [{"c": "<", "n": "LESS-THAN SIGN"}], "\u16b2": [{"c": "<", "n": "LESS-THAN SIGN"}], "\u22d6": [{"c": "<\u00b7", "n": "LESS-THAN SIGN, MIDDLE DOT"}], "<\u00b7": [{"c": "\u22d6", "n": "LESS-THAN WITH DOT"}, {"c": "\u2cb4", "n": "COPTIC CAPITAL LETTER OLD COPTIC AIN"}, {"c": "\u1445", "n": "CANADIAN SYLLABICS WEST-CREE PWA"}], "\u2cb4": [{"c": "<\u00b7", "n": "LESS-THAN SIGN, MIDDLE DOT"}], "\u1445": [{"c": "<\u00b7", "n": "LESS-THAN SIGN, MIDDLE DOT"}], "\u226a": [{"c": "<<", "n": "LESS-THAN SIGN, LESS-THAN SIGN"}], "<<": [{"c": "\u226a", "n": "MUCH LESS-THAN"}], "\u22d8": [{"c": "<<<", "n": "LESS-THAN SIGN, LESS-THAN SIGN, LESS-THAN SIGN"}], "<<<": [{"c": "\u22d8", "n": "VERY MUCH LESS-THAN"}], "\u1400": [{"c": "=", "n": "EQUALS SIGN"}], "=": [{"c": "\u1400", "n": "CANADIAN SYLLABICS HYPHEN"}, {"c": "\u2e40", "n": "DOUBLE HYPHEN"}, {"c": "\u30a0", "n": "KATAKANA-HIRAGANA DOUBLE HYPHEN"}, {"c": "\ua4ff", "n": "LISU PUNCTUATION FULL STOP"}], "\u2e40": [{"c": "=", "n": "EQUALS SIGN"}], "\u30a0": [{"c": "=", "n": "EQUALS SIGN"}], "\ua4ff": [{"c": "=", "n": "EQUALS SIGN"}], "\u225a": [{"c": "=\u0306", "n": "EQUALS SIGN, COMBINING BREVE"}], "=\u0306": [{"c": "\u225a", "n": "EQUIANGULAR TO"}], "\u2259": [{"c": "=\u0302", "n": "EQUALS SIGN, COMBINING CIRCUMFLEX ACCENT"}], "=\u0302": [{"c": "\u2259", "n": "ESTIMATES"}], "\u2257": [{"c": "=\u030a", "n": "EQUALS SIGN, COMBINING RING ABOVE"}], "=\u030a": [{"c": "\u2257", "n": "RING EQUAL TO"}], "\u2250": [{"c": "=\u0307", "n": "EQUALS SIGN, COMBINING DOT ABOVE"}], "=\u0307": [{"c": "\u2250", "n": "APPROACHES THE LIMIT"}], "\u2251": [{"c": "=\u0307\u0323", "n": "EQUALS SIGN, COMBINING DOT ABOVE, COMBINING DOT BELOW"}], "=\u0307\u0323": [{"c": "\u2251", "n": "GEOMETRICALLY EQUAL TO"}], "\u2a6e": [{"c": "=\u20f0", "n": "EQUALS SIGN, COMBINING ASTERISK ABOVE"}], "=\u20f0": [{"c": "\u2a6e", "n": "EQUALS WITH ASTERISK"}], "\u2a75": [{"c": "==", "n": "EQUALS SIGN, EQUALS SIGN"}], "==": [{"c": "\u2a75", "n": "TWO CONSECUTIVE EQUALS SIGNS"}], "\u2a76": [{"c": "===", "n": "EQUALS SIGN, EQUALS SIGN, EQUALS SIGN"}], "===": [{"c": "\u2a76", "n": "THREE CONSECUTIVE EQUALS SIGNS"}], "\u225e": [{"c": "=\u036b", "n": "EQUALS SIGN, COMBINING LATIN SMALL LETTER M"}], "=\u036b": [{"c": "\u225e", "n": "MEASURED BY"}], "\u203a": [{"c": ">", "n": "GREATER-THAN SIGN"}], ">": [{"c": "\u203a", "n": "SINGLE RIGHT-POINTING ANGLE QUOTATION MARK"}, {"c": "\u276f", "n": "HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT"}, {"c": "\u02c3", "n": "MODIFIER LETTER RIGHT ARROWHEAD"}, {"c": "\ud834\ude37", "n": "GREEK INSTRUMENTAL NOTATION SYMBOL-42"}, {"c": "\u1433", "n": "CANADIAN SYLLABICS PO"}, {"c": "\ud81b\udf3f", "n": "MIAO LETTER ARCHAIC ZZA"}], "\u276f": [{"c": ">", "n": "GREATER-THAN SIGN"}], "\u02c3": [{"c": ">", "n": "GREATER-THAN SIGN"}], "\ud834\ude37": [{"c": ">", "n": "GREATER-THAN SIGN"}], "\u1433": [{"c": ">", "n": "GREATER-THAN SIGN"}], "\ud81b\udf3f": [{"c": ">", "n": "GREATER-THAN SIGN"}], "\u1441": [{"c": ">\u00b7", "n": "GREATER-THAN SIGN, MIDDLE DOT"}], ">\u00b7": [{"c": "\u1441", "n": "CANADIAN SYLLABICS WEST-CREE PWO"}], "\u2aa5": [{"c": "><", "n": "GREATER-THAN SIGN, LESS-THAN SIGN"}], "><": [{"c": "\u2aa5", "n": "GREATER-THAN BESIDE LESS-THAN"}], "\u226b": [{"c": ">>", "n": "GREATER-THAN SIGN, GREATER-THAN SIGN"}], ">>": [{"c": "\u226b", "n": "MUCH GREATER-THAN"}, {"c": "\u2a20", "n": "Z NOTATION SCHEMA PIPING"}], "\u2a20": [{"c": ">>", "n": "GREATER-THAN SIGN, GREATER-THAN SIGN"}], "\u22d9": [{"c": ">>>", "n": "GREATER-THAN SIGN, GREATER-THAN SIGN, GREATER-THAN SIGN"}], ">>>": [{"c": "\u22d9", "n": "VERY MUCH GREATER-THAN"}], "\u2053": [{"c": "~", "n": "TILDE"}], "~": [{"c": "\u2053", "n": "SWUNG DASH"}, {"c": "\u02dc", "n": "SMALL TILDE"}, {"c": "\u1fc0", "n": "GREEK PERISPOMENI"}, {"c": "\u223c", "n": "TILDE OPERATOR"}], "\u02dc": [{"c": "~", "n": "TILDE"}], "\u1fc0": [{"c": "~", "n": "TILDE"}], "\u223c": [{"c": "~", "n": "TILDE"}], "\u2368": [{"c": "~\u0308", "n": "TILDE, COMBINING DIAERESIS"}], "~\u0308": [{"c": "\u2368", "n": "APL FUNCTIONAL SYMBOL TILDE DIAERESIS"}], "\u2e1e": [{"c": "~\u0307", "n": "TILDE, COMBINING DOT ABOVE"}], "~\u0307": [{"c": "\u2e1e", "n": "TILDE WITH DOT ABOVE"}, {"c": "\u2a6a", "n": "TILDE OPERATOR WITH DOT ABOVE"}], "\u2a6a": [{"c": "~\u0307", "n": "TILDE, COMBINING DOT ABOVE"}], "\u2e1f": [{"c": "~\u0323", "n": "TILDE, COMBINING DOT BELOW"}], "~\u0323": [{"c": "\u2e1f", "n": "TILDE WITH DOT BELOW"}], "\u200e\ud83a\udcc8\u200e": [{"c": "\u2220", "n": "ANGLE"}], "\u2220": [{"c": "\u200e\ud83a\udcc8\u200e", "n": "MENDE KIKAKUI DIGIT TWO"}], "\u22c0": [{"c": "\u2227", "n": "LOGICAL AND"}], "\u2227": [{"c": "\u22c0", "n": "N-ARY LOGICAL AND"}], "\u222f": [{"c": "\u222e\u222e", "n": "CONTOUR INTEGRAL, CONTOUR INTEGRAL"}], "\u222e\u222e": [{"c": "\u222f", "n": "SURFACE INTEGRAL"}], "\u2230": [{"c": "\u222e\u222e\u222e", "n": "CONTOUR INTEGRAL, CONTOUR INTEGRAL, CONTOUR INTEGRAL"}], "\u222e\u222e\u222e": [{"c": "\u2230", "n": "VOLUME INTEGRAL"}], "\u2e2b": [{"c": "\u2234", "n": "THEREFORE"}], "\u2234": [{"c": "\u2e2b", "n": "ONE DOT OVER TWO DOTS PUNCTUATION"}], "\u2e2a": [{"c": "\u2235", "n": "BECAUSE"}], "\u2235": [{"c": "\u2e2a", "n": "TWO DOTS OVER ONE DOT PUNCTUATION"}], "\u2e2c": [{"c": "\u2237", "n": "PROPORTION"}], "\u2237": [{"c": "\u2e2c", "n": "SQUARED FOUR DOT PUNCTUATION"}], "\ud804\uddde": [{"c": "\u2248", "n": "ALMOST EQUAL TO"}], "\u2248": [{"c": "\ud804\uddde", "n": "SHARADA SECTION MARK-1"}], "\u264e": [{"c": "\u224f", "n": "DIFFERENCE BETWEEN"}], "\u224f": [{"c": "\u264e", "n": "LIBRA"}, {"c": "\ud83d\udf5e", "n": "ALCHEMICAL SYMBOL FOR SUBLIMATION"}], "\ud83d\udf5e": [{"c": "\u224f", "n": "DIFFERENCE BETWEEN"}], "\u2263": [{"c": "\u2261", "n": "IDENTICAL TO"}], "\u2261": [{"c": "\u2263", "n": "STRICTLY EQUIVALENT TO"}], "\u2a03": [{"c": "\u228d", "n": "MULTISET MULTIPLICATION"}], "\u228d": [{"c": "\u2a03", "n": "N-ARY UNION OPERATOR WITH DOT"}], "\u2a04": [{"c": "\u228e", "n": "MULTISET UNION"}], "\u228e": [{"c": "\u2a04", "n": "N-ARY UNION OPERATOR WITH PLUS"}], "\ud834\ude38": [{"c": "\u228f", "n": "SQUARE IMAGE OF"}], "\u228f": [{"c": "\ud834\ude38", "n": "GREEK INSTRUMENTAL NOTATION SYMBOL-43"}], "\ud834\ude39": [{"c": "\u2290", "n": "SQUARE ORIGINAL OF"}], "\u2290": [{"c": "\ud834\ude39", "n": "GREEK INSTRUMENTAL NOTATION SYMBOL-45"}], "\u2a05": [{"c": "\u2293", "n": "SQUARE CAP"}], "\u2293": [{"c": "\u2a05", "n": "N-ARY SQUARE INTERSECTION OPERATOR"}], "\u2a06": [{"c": "\u2294", "n": "SQUARE CUP"}], "\u2294": [{"c": "\u2a06", "n": "N-ARY SQUARE UNION OPERATOR"}], "\u2a02": [{"c": "\u2297", "n": "CIRCLED TIMES"}], "\u2297": [{"c": "\u2a02", "n": "N-ARY CIRCLED TIMES OPERATOR"}], "\u235f": [{"c": "\u229b", "n": "CIRCLED ASTERISK OPERATOR"}], "\u229b": [{"c": "\u235f", "n": "APL FUNCTIONAL SYMBOL CIRCLE STAR"}], "\ud83d\udf71": [{"c": "\u22a0", "n": "SQUARED TIMES"}], "\u22a0": [{"c": "\ud83d\udf71", "n": "ALCHEMICAL SYMBOL FOR MONTH"}], "\ud83d\udf55": [{"c": "\u22a1", "n": "SQUARED DOT OPERATOR"}], "\u22a1": [{"c": "\ud83d\udf55", "n": "ALCHEMICAL SYMBOL FOR URINE"}], "\u25c1": [{"c": "\u22b2", "n": "NORMAL SUBGROUP OF"}], "\u22b2": [{"c": "\u25c1", "n": "WHITE LEFT-POINTING TRIANGLE"}], "\u25b7": [{"c": "\u22b3", "n": "CONTAINS AS NORMAL SUBGROUP"}], "\u22b3": [{"c": "\u25b7", "n": "WHITE RIGHT-POINTING TRIANGLE"}], "\u2363": [{"c": "\u22c6\u0308", "n": "STAR OPERATOR, COMBINING DIAERESIS"}], "\u22c6\u0308": [{"c": "\u2363", "n": "APL FUNCTIONAL SYMBOL STAR DIAERESIS"}], "\ufe34": [{"c": "\u2307", "n": "WAVY LINE"}], "\u2307": [{"c": "\ufe34", "n": "PRESENTATION FORM FOR VERTICAL WAVY LOW LINE"}], "\u25e0": [{"c": "\u2312", "n": "ARC"}], "\u2312": [{"c": "\u25e0", "n": "UPPER HALF CIRCLE"}], "\u2a3d": [{"c": "\u2319", "n": "TURNED NOT SIGN"}], "\u2319": [{"c": "\u2a3d", "n": "RIGHTHAND INTERIOR PRODUCT"}], "\u2325": [{"c": "\u2324", "n": "UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS"}], "\u2324": [{"c": "\u2325", "n": "OPTION KEY"}], "\u29c7": [{"c": "\u233b", "n": "APL FUNCTIONAL SYMBOL QUAD JOT"}], "\u233b": [{"c": "\u29c7", "n": "SQUARED SMALL CIRCLE"}], "\u25ce": [{"c": "\u233e", "n": "APL FUNCTIONAL SYMBOL CIRCLE JOT"}], "\u233e": [{"c": "\u25ce", "n": "BULLSEYE"}, {"c": "\u29be", "n": "CIRCLED WHITE BULLET"}], "\u29be": [{"c": "\u233e", "n": "APL FUNCTIONAL SYMBOL CIRCLE JOT"}], "\u29c5": [{"c": "\u2342", "n": "APL FUNCTIONAL SYMBOL QUAD BACKSLASH"}], "\u2342": [{"c": "\u29c5", "n": "SQUARED FALLING DIAGONAL SLASH"}], "\u29b0": [{"c": "\u2349", "n": "APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH"}], "\u2349": [{"c": "\u29b0", "n": "REVERSED EMPTY SET"}], "\u23c3": [{"c": "\u234b", "n": "APL FUNCTIONAL SYMBOL DELTA STILE"}], "\u234b": [{"c": "\u23c3", "n": "DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE"}], "\u23c2": [{"c": "\u234e", "n": "APL FUNCTIONAL SYMBOL DOWN TACK JOT"}], "\u234e": [{"c": "\u23c2", "n": "DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE"}], "\u23c1": [{"c": "\u2355", "n": "APL FUNCTIONAL SYMBOL UP TACK JOT"}], "\u2355": [{"c": "\u23c1", "n": "DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE"}], "\u23c6": [{"c": "\u236d", "n": "APL FUNCTIONAL SYMBOL STILE TILDE"}], "\u236d": [{"c": "\u23c6", "n": "DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE"}], "\u2638": [{"c": "\u2388", "n": "HELM SYMBOL"}], "\u2388": [{"c": "\u2638", "n": "WHEEL OF DHARMA"}], "\ufe35": [{"c": "\u23dc", "n": "TOP PARENTHESIS"}], "\u23dc": [{"c": "\ufe35", "n": "PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS"}], "\ufe36": [{"c": "\u23dd", "n": "BOTTOM PARENTHESIS"}], "\u23dd": [{"c": "\ufe36", "n": "PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS"}], "\ufe37": [{"c": "\u23de", "n": "TOP CURLY BRACKET"}], "\u23de": [{"c": "\ufe37", "n": "PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET"}], "\ufe38": [{"c": "\u23df", "n": "BOTTOM CURLY BRACKET"}], "\u23df": [{"c": "\ufe38", "n": "PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET"}], "\ufe39": [{"c": "\u23e0", "n": "TOP TORTOISE SHELL BRACKET"}], "\u23e0": [{"c": "\ufe39", "n": "PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET"}], "\ufe3a": [{"c": "\u23e1", "n": "BOTTOM TORTOISE SHELL BRACKET"}], "\u23e1": [{"c": "\ufe3a", "n": "PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET"}], "\u25b1": [{"c": "\u23e5", "n": "FLATNESS"}], "\u23e5": [{"c": "\u25b1", "n": "WHITE PARALLELOGRAM"}], "\u23fc": [{"c": "\u23fb", "n": "POWER SYMBOL"}], "\u23fb": [{"c": "\u23fc", "n": "POWER ON-OFF SYMBOL"}], "\ufe31": [{"c": "\u2502", "n": "BOX DRAWINGS LIGHT VERTICAL"}], "\u2502": [{"c": "\ufe31", "n": "PRESENTATION FORM FOR VERTICAL EM DASH"}, {"c": "\uff5c", "n": "FULLWIDTH VERTICAL LINE"}, {"c": "\u2503", "n": "BOX DRAWINGS HEAVY VERTICAL"}], "\uff5c": [{"c": "\u2502", "n": "BOX DRAWINGS LIGHT VERTICAL"}], "\u2503": [{"c": "\u2502", "n": "BOX DRAWINGS LIGHT VERTICAL"}], "\u250f": [{"c": "\u250c", "n": "BOX DRAWINGS LIGHT DOWN AND RIGHT"}], "\u250c": [{"c": "\u250f", "n": "BOX DRAWINGS HEAVY DOWN AND RIGHT"}], "\u2523": [{"c": "\u251c", "n": "BOX DRAWINGS LIGHT VERTICAL AND RIGHT"}], "\u251c": [{"c": "\u2523", "n": "BOX DRAWINGS HEAVY VERTICAL AND RIGHT"}], "\u2590": [{"c": "\u258c", "n": "LEFT HALF BLOCK"}], "\u258c": [{"c": "\u2590", "n": "RIGHT HALF BLOCK"}], "\u2597": [{"c": "\u2596", "n": "QUADRANT LOWER LEFT"}], "\u2596": [{"c": "\u2597", "n": "QUADRANT LOWER RIGHT"}], "\u259d": [{"c": "\u2598", "n": "QUADRANT UPPER LEFT"}], "\u2598": [{"c": "\u259d", "n": "QUADRANT UPPER RIGHT"}], "\u2610": [{"c": "\u25a1", "n": "WHITE SQUARE"}], "\u25a1": [{"c": "\u2610", "n": "BALLOT BOX"}], "\uffed": [{"c": "\u25aa", "n": "BLACK SMALL SQUARE"}], "\u25aa": [{"c": "\uffed", "n": "HALFWIDTH BLACK SQUARE"}], "\u25b8": [{"c": "\u25b6", "n": "BLACK RIGHT-POINTING TRIANGLE"}], "\u25b6": [{"c": "\u25b8", "n": "BLACK RIGHT-POINTING SMALL TRIANGLE"}, {"c": "\u25ba", "n": "BLACK RIGHT-POINTING POINTER"}], "\u25ba": [{"c": "\u25b6", "n": "BLACK RIGHT-POINTING TRIANGLE"}], "\u2ce9": [{"c": "\u2627", "n": "CHI RHO"}], "\u2627": [{"c": "\u2ce9", "n": "COPTIC SYMBOL KHI RO"}], "\ud83d\udf0a": [{"c": "\u2629", "n": "CROSS OF JERUSALEM"}], "\u2629": [{"c": "\ud83d\udf0a", "n": "ALCHEMICAL SYMBOL FOR VINEGAR"}], "\ud83c\udf12": [{"c": "\u263d", "n": "FIRST QUARTER MOON"}], "\u263d": [{"c": "\ud83c\udf12", "n": "WAXING CRESCENT MOON SYMBOL"}, {"c": "\ud83c\udf19", "n": "CRESCENT MOON"}], "\ud83c\udf19": [{"c": "\u263d", "n": "FIRST QUARTER MOON"}], "\u23fe": [{"c": "\u263e", "n": "LAST QUARTER MOON"}], "\u263e": [{"c": "\u23fe", "n": "POWER SLEEP SYMBOL"}, {"c": "\ud83c\udf18", "n": "WANING CRESCENT MOON SYMBOL"}], "\ud83c\udf18": [{"c": "\u263e", "n": "LAST QUARTER MOON"}], "\u29d9": [{"c": "\u299a", "n": "VERTICAL ZIGZAG LINE"}], "\u299a": [{"c": "\u29d9", "n": "RIGHT WIGGLY FENCE"}], "\ud83d\udf3a": [{"c": "\u29df", "n": "DOUBLE-ENDED MULTIMAP"}], "\u29df": [{"c": "\ud83d\udf3a", "n": "ALCHEMICAL SYMBOL FOR ARSENIC"}], "\u2a3e": [{"c": "\u2a1f", "n": "Z NOTATION SCHEMA COMPOSITION"}], "\u2a1f": [{"c": "\u2a3e", "n": "Z NOTATION RELATIONAL COMPOSITION"}], "\ud800\udda0": [{"c": "\u2ce8", "n": "COPTIC SYMBOL TAU RO"}], "\u2ce8": [{"c": "\ud800\udda0", "n": "GREEK SYMBOL TAU RHO"}], "\u2669": [{"c": "\ud834\udd58\ud834\udd65", "n": "MUSICAL SYMBOL NOTEHEAD BLACK, MUSICAL SYMBOL COMBINING STEM"}], "\ud834\udd58\ud834\udd65": [{"c": "\u2669", "n": "QUARTER NOTE"}], "\u266a": [{"c": "\ud834\udd58\ud834\udd65\ud834\udd6e", "n": "MUSICAL SYMBOL NOTEHEAD BLACK, MUSICAL SYMBOL COMBINING STEM, MUSICAL SYMBOL COMBINING FLAG-1"}], "\ud834\udd58\ud834\udd65\ud834\udd6e": [{"c": "\u266a", "n": "EIGHTH NOTE"}], "\u02d9": [{"c": "\u0971", "n": "DEVANAGARI SIGN HIGH SPACING DOT"}], "\u0971": [{"c": "\u02d9", "n": "DOT ABOVE"}, {"c": "\u0d4e", "n": "MALAYALAM LETTER DOT REPH"}], "\u0d4e": [{"c": "\u0971", "n": "DEVANAGARI SIGN HIGH SPACING DOT"}], "\uff0d": [{"c": "\u30fc", "n": "KATAKANA-HIRAGANA PROLONGED SOUND MARK"}], "\u30fc": [{"c": "\uff0d", "n": "FULLWIDTH HYPHEN-MINUS"}, {"c": "\u2014", "n": "EM DASH"}, {"c": "\u2015", "n": "HORIZONTAL BAR"}, {"c": "\u2500", "n": "BOX DRAWINGS LIGHT HORIZONTAL"}, {"c": "\u2501", "n": "BOX DRAWINGS HEAVY HORIZONTAL"}, {"c": "\u31d0", "n": "CJK STROKE H"}, {"c": "\ua7f7", "n": "LATIN EPIGRAPHIC LETTER SIDEWAYS I"}, {"c": "\u1173", "n": "HANGUL JUNGSEONG EU"}, {"c": "\u3161", "n": "HANGUL LETTER EU"}, {"c": "\u4e00", "n": "CJK UNIFIED IDEOGRAPH-4E00"}, {"c": "\u2f00", "n": "KANGXI RADICAL ONE"}], "\u2014": [{"c": "\u30fc", "n": "KATAKANA-HIRAGANA PROLONGED SOUND MARK"}], "\u2015": [{"c": "\u30fc", "n": "KATAKANA-HIRAGANA PROLONGED SOUND MARK"}], "\u2500": [{"c": "\u30fc", "n": "KATAKANA-HIRAGANA PROLONGED SOUND MARK"}], "\u2501": [{"c": "\u30fc", "n": "KATAKANA-HIRAGANA PROLONGED SOUND MARK"}], "\u31d0": [{"c": "\u30fc", "n": "KATAKANA-HIRAGANA PROLONGED SOUND MARK"}], "\ua7f7": [{"c": "\u30fc", "n": "KATAKANA-HIRAGANA PROLONGED SOUND MARK"}], "\u1173": [{"c": "\u30fc", "n": "KATAKANA-HIRAGANA PROLONGED SOUND MARK"}], "\u3161": [{"c": "\u30fc", "n": "KATAKANA-HIRAGANA PROLONGED SOUND MARK"}], "\u4e00": [{"c": "\u30fc", "n": "KATAKANA-HIRAGANA PROLONGED SOUND MARK"}], "\u2f00": [{"c": "\u30fc", "n": "KATAKANA-HIRAGANA PROLONGED SOUND MARK"}], "\u1196": [{"c": "\u30fc\u30fc", "n": "KATAKANA-HIRAGANA PROLONGED SOUND MARK, KATAKANA-HIRAGANA PROLONGED SOUND MARK"}], "\u30fc\u30fc": [{"c": "\u1196", "n": "HANGUL JUNGSEONG EU-EU"}], "\ud7b9": [{"c": "\u30fc\u1161", "n": "KATAKANA-HIRAGANA PROLONGED SOUND MARK, HANGUL JUNGSEONG A"}], "\u30fc\u1161": [{"c": "\ud7b9", "n": "HANGUL JUNGSEONG EU-A"}], "\ud7ba": [{"c": "\u30fc\u1165", "n": "KATAKANA-HIRAGANA PROLONGED SOUND MARK, HANGUL JUNGSEONG EO"}], "\u30fc\u1165": [{"c": "\ud7ba", "n": "HANGUL JUNGSEONG EU-EO"}], "\ud7bb": [{"c": "\u30fc\u1165\u4e28", "n": "KATAKANA-HIRAGANA PROLONGED SOUND MARK, HANGUL JUNGSEONG EO, CJK UNIFIED IDEOGRAPH-4E28"}], "\u30fc\u1165\u4e28": [{"c": "\ud7bb", "n": "HANGUL JUNGSEONG EU-E"}], "\ud7bc": [{"c": "\u30fc\u1169", "n": "KATAKANA-HIRAGANA PROLONGED SOUND MARK, HANGUL JUNGSEONG O"}], "\u30fc\u1169": [{"c": "\ud7bc", "n": "HANGUL JUNGSEONG EU-O"}], "\u1195": [{"c": "\u30fc\u116e", "n": "KATAKANA-HIRAGANA PROLONGED SOUND MARK, HANGUL JUNGSEONG U"}], "\u30fc\u116e": [{"c": "\u1195", "n": "HANGUL JUNGSEONG EU-U"}], "\u1174": [{"c": "\u30fc\u4e28", "n": "KATAKANA-HIRAGANA PROLONGED SOUND MARK, CJK UNIFIED IDEOGRAPH-4E28"}], "\u30fc\u4e28": [{"c": "\u1174", "n": "HANGUL JUNGSEONG YI"}, {"c": "\u3162", "n": "HANGUL LETTER YI"}], "\u3162": [{"c": "\u30fc\u4e28", "n": "KATAKANA-HIRAGANA PROLONGED SOUND MARK, CJK UNIFIED IDEOGRAPH-4E28"}], "\u1197": [{"c": "\u30fc\u4e28\u116e", "n": "KATAKANA-HIRAGANA PROLONGED SOUND MARK, CJK UNIFIED IDEOGRAPH-4E28, HANGUL JUNGSEONG U"}], "\u30fc\u4e28\u116e": [{"c": "\u1197", "n": "HANGUL JUNGSEONG YI-U"}], "\u20a4": [{"c": "\u00a3", "n": "POUND SIGN"}], "\u00a3": [{"c": "\u20a4", "n": "LIRA SIGN"}], "\u3012": [{"c": "\u20b8", "n": "TENGE SIGN"}], "\u20b8": [{"c": "\u3012", "n": "POSTAL MARK"}, {"c": "\u3036", "n": "CIRCLED POSTAL MARK"}], "\u3036": [{"c": "\u20b8", "n": "TENGE SIGN"}], "\u1b5c": [{"c": "\u1b50", "n": "BALINESE DIGIT ZERO"}], "\u1b50": [{"c": "\u1b5c", "n": "BALINESE WINDU"}], "\ua9c6": [{"c": "\ua9d0", "n": "JAVANESE DIGIT ZERO"}], "\ua9d0": [{"c": "\ua9c6", "n": "JAVANESE PADA WINDU"}], "\ud805\udcd1": [{"c": "\u09e7", "n": "BENGALI DIGIT ONE"}], "\u09e7": [{"c": "\ud805\udcd1", "n": "TIRHUTA DIGIT ONE"}], "\u0ce7": [{"c": "\u0c67", "n": "TELUGU DIGIT ONE"}], "\u0c67": [{"c": "\u0ce7", "n": "KANNADA DIGIT ONE"}], "\u1065": [{"c": "\u1041", "n": "MYANMAR DIGIT ONE"}], "\u1041": [{"c": "\u1065", "n": "MYANMAR LETTER WESTERN PWO KAREN THA"}], "\u2460": [{"c": "\u2780", "n": "DINGBAT CIRCLED SANS-SERIF DIGIT ONE"}], "\u2780": [{"c": "\u2460", "n": "CIRCLED DIGIT ONE"}], "\u2469": [{"c": "\u2789", "n": "DINGBAT CIRCLED SANS-SERIF NUMBER TEN"}], "\u2789": [{"c": "\u2469", "n": "CIRCLED NUMBER TEN"}], "\u23e8": [{"c": "\u2081\u2080", "n": "SUBSCRIPT ONE, SUBSCRIPT ZERO"}], "\u2081\u2080": [{"c": "\u23e8", "n": "DECIMAL EXPONENT SYMBOL"}], "\ud835\udfd0": [{"c": "2", "n": "DIGIT TWO"}], "2": [{"c": "\ud835\udfd0", "n": "MATHEMATICAL BOLD DIGIT TWO"}, {"c": "\ud835\udfda", "n": "MATHEMATICAL DOUBLE-STRUCK DIGIT TWO"}, {"c": "\ud835\udfe4", "n": "MATHEMATICAL SANS-SERIF DIGIT TWO"}, {"c": "\ud835\udfee", "n": "MATHEMATICAL SANS-SERIF BOLD DIGIT TWO"}, {"c": "\ud835\udff8", "n": "MATHEMATICAL MONOSPACE DIGIT TWO"}, {"c": "\ua75a", "n": "LATIN CAPITAL LETTER R ROTUNDA"}, {"c": "\u01a7", "n": "LATIN CAPITAL LETTER TONE TWO"}, {"c": "\u03e8", "n": "COPTIC CAPITAL LETTER HORI"}, {"c": "\ua644", "n": "CYRILLIC CAPITAL LETTER REVERSED DZE"}, {"c": "\u14bf", "n": "CANADIAN SYLLABICS SAYISI M"}, {"c": "\ua6ef", "n": "BAMUM LETTER KOGHOM"}], "\ud835\udfda": [{"c": "2", "n": "DIGIT TWO"}], "\ud835\udfe4": [{"c": "2", "n": "DIGIT TWO"}], "\ud835\udfee": [{"c": "2", "n": "DIGIT TWO"}], "\ud835\udff8": [{"c": "2", "n": "DIGIT TWO"}], "\ua75a": [{"c": "2", "n": "DIGIT TWO"}], "\u01a7": [{"c": "2", "n": "DIGIT TWO"}], "\u03e8": [{"c": "2", "n": "DIGIT TWO"}], "\ua644": [{"c": "2", "n": "DIGIT TWO"}], "\u14bf": [{"c": "2", "n": "DIGIT TWO"}], "\ua6ef": [{"c": "2", "n": "DIGIT TWO"}], "\ua9cf": [{"c": "\u200e\u0662\u200e", "n": "ARABIC-INDIC DIGIT TWO"}], "\u200e\u0662\u200e": [{"c": "\ua9cf", "n": "JAVANESE PANGRANGKEP"}, {"c": "\u06f2", "n": "EXTENDED ARABIC-INDIC DIGIT TWO"}], "\u06f2": [{"c": "\u200e\u0662\u200e", "n": "ARABIC-INDIC DIGIT TWO"}], "\u0ae8": [{"c": "\u0968", "n": "DEVANAGARI DIGIT TWO"}], "\u0968": [{"c": "\u0ae8", "n": "GUJARATI DIGIT TWO"}], "\ud805\udcd2": [{"c": "\u09e8", "n": "BENGALI DIGIT TWO"}], "\u09e8": [{"c": "\ud805\udcd2", "n": "TIRHUTA DIGIT TWO"}], "\u0ce8": [{"c": "\u0c68", "n": "TELUGU DIGIT TWO"}], "\u0c68": [{"c": "\u0ce8", "n": "KANNADA DIGIT TWO"}], "\u2461": [{"c": "\u2781", "n": "DINGBAT CIRCLED SANS-SERIF DIGIT TWO"}], "\u2781": [{"c": "\u2461", "n": "CIRCLED DIGIT TWO"}], "\u01bb": [{"c": "2\u0335", "n": "DIGIT TWO, COMBINING SHORT STROKE OVERLAY"}], "2\u0335": [{"c": "\u01bb", "n": "LATIN LETTER TWO WITH STROKE"}], "\ud83c\udd03": [{"c": "2,", "n": "DIGIT TWO, COMMA"}], "2,": [{"c": "\ud83c\udd03", "n": "DIGIT TWO COMMA"}], "\u2489": [{"c": "2.", "n": "DIGIT TWO, FULL STOP"}], "2.": [{"c": "\u2489", "n": "DIGIT TWO FULL STOP"}], "\u33f5": [{"c": "22\u65e5", "n": "DIGIT TWO, DIGIT TWO, CJK UNIFIED IDEOGRAPH-65E5"}], "22\u65e5": [{"c": "\u33f5", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO"}], "\u336e": [{"c": "22\u70b9", "n": "DIGIT TWO, DIGIT TWO, CJK UNIFIED IDEOGRAPH-70B9"}], "22\u70b9": [{"c": "\u336e", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO"}], "\u33f6": [{"c": "23\u65e5", "n": "DIGIT TWO, DIGIT THREE, CJK UNIFIED IDEOGRAPH-65E5"}], "23\u65e5": [{"c": "\u33f6", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE"}], "\u336f": [{"c": "23\u70b9", "n": "DIGIT TWO, DIGIT THREE, CJK UNIFIED IDEOGRAPH-70B9"}], "23\u70b9": [{"c": "\u336f", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE"}], "\u33f7": [{"c": "24\u65e5", "n": "DIGIT TWO, DIGIT FOUR, CJK UNIFIED IDEOGRAPH-65E5"}], "24\u65e5": [{"c": "\u33f7", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR"}], "\u3370": [{"c": "24\u70b9", "n": "DIGIT TWO, DIGIT FOUR, CJK UNIFIED IDEOGRAPH-70B9"}], "24\u70b9": [{"c": "\u3370", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR"}], "\u33f8": [{"c": "25\u65e5", "n": "DIGIT TWO, DIGIT FIVE, CJK UNIFIED IDEOGRAPH-65E5"}], "25\u65e5": [{"c": "\u33f8", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE"}], "\u33f9": [{"c": "26\u65e5", "n": "DIGIT TWO, DIGIT SIX, CJK UNIFIED IDEOGRAPH-65E5"}], "26\u65e5": [{"c": "\u33f9", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX"}], "\u33fa": [{"c": "27\u65e5", "n": "DIGIT TWO, DIGIT SEVEN, CJK UNIFIED IDEOGRAPH-65E5"}], "27\u65e5": [{"c": "\u33fa", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN"}], "\u33fb": [{"c": "28\u65e5", "n": "DIGIT TWO, DIGIT EIGHT, CJK UNIFIED IDEOGRAPH-65E5"}], "28\u65e5": [{"c": "\u33fb", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT"}], "\u33fc": [{"c": "29\u65e5", "n": "DIGIT TWO, DIGIT NINE, CJK UNIFIED IDEOGRAPH-65E5"}], "29\u65e5": [{"c": "\u33fc", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE"}], "\u33f4": [{"c": "2l\u65e5", "n": "DIGIT TWO, LATIN SMALL LETTER L, CJK UNIFIED IDEOGRAPH-65E5"}], "2l\u65e5": [{"c": "\u33f4", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE"}], "\u336d": [{"c": "2l\u70b9", "n": "DIGIT TWO, LATIN SMALL LETTER L, CJK UNIFIED IDEOGRAPH-70B9"}], "2l\u70b9": [{"c": "\u336d", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE"}], "\u249b": [{"c": "2O.", "n": "DIGIT TWO, LATIN CAPITAL LETTER O, FULL STOP"}], "2O.": [{"c": "\u249b", "n": "NUMBER TWENTY FULL STOP"}], "\u33f3": [{"c": "2O\u65e5", "n": "DIGIT TWO, LATIN CAPITAL LETTER O, CJK UNIFIED IDEOGRAPH-65E5"}], "2O\u65e5": [{"c": "\u33f3", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY"}], "\u336c": [{"c": "2O\u70b9", "n": "DIGIT TWO, LATIN CAPITAL LETTER O, CJK UNIFIED IDEOGRAPH-70B9"}], "2O\u70b9": [{"c": "\u336c", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY"}], "\u0de9": [{"c": "\u0de8\u0dcf", "n": "SINHALA LITH DIGIT TWO, SINHALA VOWEL SIGN AELA-PILLA"}], "\u0de8\u0dcf": [{"c": "\u0de9", "n": "SINHALA LITH DIGIT THREE"}], "\u0def": [{"c": "\u0de8\u0dd3", "n": "SINHALA LITH DIGIT TWO, SINHALA VOWEL SIGN DIGA IS-PILLA"}], "\u0de8\u0dd3": [{"c": "\u0def", "n": "SINHALA LITH DIGIT NINE"}], "\u33e1": [{"c": "2\u65e5", "n": "DIGIT TWO, CJK UNIFIED IDEOGRAPH-65E5"}], "2\u65e5": [{"c": "\u33e1", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO"}], "\u32c1": [{"c": "2\u6708", "n": "DIGIT TWO, CJK UNIFIED IDEOGRAPH-6708"}], "2\u6708": [{"c": "\u32c1", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY"}], "\u335a": [{"c": "2\u70b9", "n": "DIGIT TWO, CJK UNIFIED IDEOGRAPH-70B9"}], "2\u70b9": [{"c": "\u335a", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO"}], "\ud834\ude06": [{"c": "3", "n": "DIGIT THREE"}], "3": [{"c": "\ud834\ude06", "n": "GREEK VOCAL NOTATION SYMBOL-7"}, {"c": "\ud835\udfd1", "n": "MATHEMATICAL BOLD DIGIT THREE"}, {"c": "\ud835\udfdb", "n": "MATHEMATICAL DOUBLE-STRUCK DIGIT THREE"}, {"c": "\ud835\udfe5", "n": "MATHEMATICAL SANS-SERIF DIGIT THREE"}, {"c": "\ud835\udfef", "n": "MATHEMATICAL SANS-SERIF BOLD DIGIT THREE"}, {"c": "\ud835\udff9", "n": "MATHEMATICAL MONOSPACE DIGIT THREE"}, {"c": "\ua7ab", "n": "LATIN CAPITAL LETTER REVERSED OPEN E"}, {"c": "\u021c", "n": "LATIN CAPITAL LETTER YOGH"}, {"c": "\u01b7", "n": "LATIN CAPITAL LETTER EZH"}, {"c": "\ua76a", "n": "LATIN CAPITAL LETTER ET"}, {"c": "\u2ccc", "n": "COPTIC CAPITAL LETTER OLD COPTIC HORI"}, {"c": "\u0417", "n": "CYRILLIC CAPITAL LETTER ZE"}, {"c": "\u04e0", "n": "CYRILLIC CAPITAL LETTER ABKHASIAN DZE"}, {"c": "\ud81b\udf3b", "n": "MIAO LETTER ZA"}, {"c": "\ud806\udcca", "n": "WARANG CITI SMALL LETTER ANG"}], "\ud835\udfd1": [{"c": "3", "n": "DIGIT THREE"}], "\ud835\udfdb": [{"c": "3", "n": "DIGIT THREE"}], "\ud835\udfe5": [{"c": "3", "n": "DIGIT THREE"}], "\ud835\udfef": [{"c": "3", "n": "DIGIT THREE"}], "\ud835\udff9": [{"c": "3", "n": "DIGIT THREE"}], "\ua7ab": [{"c": "3", "n": "DIGIT THREE"}], "\u021c": [{"c": "3", "n": "DIGIT THREE"}], "\u01b7": [{"c": "3", "n": "DIGIT THREE"}], "\ua76a": [{"c": "3", "n": "DIGIT THREE"}], "\u2ccc": [{"c": "3", "n": "DIGIT THREE"}], "\u0417": [{"c": "3", "n": "DIGIT THREE"}], "\u04e0": [{"c": "3", "n": "DIGIT THREE"}], "\ud81b\udf3b": [{"c": "3", "n": "DIGIT THREE"}], "\ud806\udcca": [{"c": "3", "n": "DIGIT THREE"}], "\u06f3": [{"c": "\u200e\u0663\u200e", "n": "ARABIC-INDIC DIGIT THREE"}], "\u200e\u0663\u200e": [{"c": "\u06f3", "n": "EXTENDED ARABIC-INDIC DIGIT THREE"}, {"c": "\u200e\ud83a\udcc9\u200e", "n": "MENDE KIKAKUI DIGIT THREE"}], "\u200e\ud83a\udcc9\u200e": [{"c": "\u200e\u0663\u200e", "n": "ARABIC-INDIC DIGIT THREE"}], "\u0ae9": [{"c": "\u0969", "n": "DEVANAGARI DIGIT THREE"}], "\u0969": [{"c": "\u0ae9", "n": "GUJARATI DIGIT THREE"}], "\u2462": [{"c": "\u2782", "n": "DINGBAT CIRCLED SANS-SERIF DIGIT THREE"}], "\u2782": [{"c": "\u2462", "n": "CIRCLED DIGIT THREE"}], "\u0498": [{"c": "3\u0326", "n": "DIGIT THREE, COMBINING COMMA BELOW"}], "3\u0326": [{"c": "\u0498", "n": "CYRILLIC CAPITAL LETTER ZE WITH DESCENDER"}], "\ud83c\udd04": [{"c": "3,", "n": "DIGIT THREE, COMMA"}], "3,": [{"c": "\ud83c\udd04", "n": "DIGIT THREE COMMA"}], "\u248a": [{"c": "3.", "n": "DIGIT THREE, FULL STOP"}], "3.": [{"c": "\u248a", "n": "DIGIT THREE FULL STOP"}], "\u33fe": [{"c": "3l\u65e5", "n": "DIGIT THREE, LATIN SMALL LETTER L, CJK UNIFIED IDEOGRAPH-65E5"}], "3l\u65e5": [{"c": "\u33fe", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE"}], "\u33fd": [{"c": "3O\u65e5", "n": "DIGIT THREE, LATIN CAPITAL LETTER O, CJK UNIFIED IDEOGRAPH-65E5"}], "3O\u65e5": [{"c": "\u33fd", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY"}], "\u33e2": [{"c": "3\u65e5", "n": "DIGIT THREE, CJK UNIFIED IDEOGRAPH-65E5"}], "3\u65e5": [{"c": "\u33e2", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE"}], "\u32c2": [{"c": "3\u6708", "n": "DIGIT THREE, CJK UNIFIED IDEOGRAPH-6708"}], "3\u6708": [{"c": "\u32c2", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH"}], "\u335b": [{"c": "3\u70b9", "n": "DIGIT THREE, CJK UNIFIED IDEOGRAPH-70B9"}], "3\u70b9": [{"c": "\u335b", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE"}], "\ud835\udfd2": [{"c": "4", "n": "DIGIT FOUR"}], "4": [{"c": "\ud835\udfd2", "n": "MATHEMATICAL BOLD DIGIT FOUR"}, {"c": "\ud835\udfdc", "n": "MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR"}, {"c": "\ud835\udfe6", "n": "MATHEMATICAL SANS-SERIF DIGIT FOUR"}, {"c": "\ud835\udff0", "n": "MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR"}, {"c": "\ud835\udffa", "n": "MATHEMATICAL MONOSPACE DIGIT FOUR"}, {"c": "\u13ce", "n": "CHEROKEE LETTER SE"}, {"c": "\ud806\udcaf", "n": "WARANG CITI CAPITAL LETTER UC"}], "\ud835\udfdc": [{"c": "4", "n": "DIGIT FOUR"}], "\ud835\udfe6": [{"c": "4", "n": "DIGIT FOUR"}], "\ud835\udff0": [{"c": "4", "n": "DIGIT FOUR"}], "\ud835\udffa": [{"c": "4", "n": "DIGIT FOUR"}], "\u13ce": [{"c": "4", "n": "DIGIT FOUR"}], "\ud806\udcaf": [{"c": "4", "n": "DIGIT FOUR"}], "\u06f4": [{"c": "\u200e\u0664\u200e", "n": "ARABIC-INDIC DIGIT FOUR"}], "\u200e\u0664\u200e": [{"c": "\u06f4", "n": "EXTENDED ARABIC-INDIC DIGIT FOUR"}], "\u0aea": [{"c": "\u096a", "n": "DEVANAGARI DIGIT FOUR"}], "\u096a": [{"c": "\u0aea", "n": "GUJARATI DIGIT FOUR"}], "\u2463": [{"c": "\u2783", "n": "DINGBAT CIRCLED SANS-SERIF DIGIT FOUR"}], "\u2783": [{"c": "\u2463", "n": "CIRCLED DIGIT FOUR"}], "\ud83c\udd05": [{"c": "4,", "n": "DIGIT FOUR, COMMA"}], "4,": [{"c": "\ud83c\udd05", "n": "DIGIT FOUR COMMA"}], "\u248b": [{"c": "4.", "n": "DIGIT FOUR, FULL STOP"}], "4.": [{"c": "\u248b", "n": "DIGIT FOUR FULL STOP"}], "\u1530": [{"c": "4\u00b7", "n": "DIGIT FOUR, MIDDLE DOT"}], "4\u00b7": [{"c": "\u1530", "n": "CANADIAN SYLLABICS WEST-CREE YWE"}], "\u33e3": [{"c": "4\u65e5", "n": "DIGIT FOUR, CJK UNIFIED IDEOGRAPH-65E5"}], "4\u65e5": [{"c": "\u33e3", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR"}], "\u32c3": [{"c": "4\u6708", "n": "DIGIT FOUR, CJK UNIFIED IDEOGRAPH-6708"}], "4\u6708": [{"c": "\u32c3", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL"}], "\u335c": [{"c": "4\u70b9", "n": "DIGIT FOUR, CJK UNIFIED IDEOGRAPH-70B9"}], "4\u70b9": [{"c": "\u335c", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR"}], "\ud835\udfd3": [{"c": "5", "n": "DIGIT FIVE"}], "5": [{"c": "\ud835\udfd3", "n": "MATHEMATICAL BOLD DIGIT FIVE"}, {"c": "\ud835\udfdd", "n": "MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE"}, {"c": "\ud835\udfe7", "n": "MATHEMATICAL SANS-SERIF DIGIT FIVE"}, {"c": "\ud835\udff1", "n": "MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE"}, {"c": "\ud835\udffb", "n": "MATHEMATICAL MONOSPACE DIGIT FIVE"}, {"c": "\u01bc", "n": "LATIN CAPITAL LETTER TONE FIVE"}, {"c": "\ud806\udcbb", "n": "WARANG CITI CAPITAL LETTER HORR"}], "\ud835\udfdd": [{"c": "5", "n": "DIGIT FIVE"}], "\ud835\udfe7": [{"c": "5", "n": "DIGIT FIVE"}], "\ud835\udff1": [{"c": "5", "n": "DIGIT FIVE"}], "\ud835\udffb": [{"c": "5", "n": "DIGIT FIVE"}], "\u01bc": [{"c": "5", "n": "DIGIT FIVE"}], "\ud806\udcbb": [{"c": "5", "n": "DIGIT FIVE"}], "\u2464": [{"c": "\u2784", "n": "DINGBAT CIRCLED SANS-SERIF DIGIT FIVE"}], "\u2784": [{"c": "\u2464", "n": "CIRCLED DIGIT FIVE"}], "\ud83c\udd06": [{"c": "5,", "n": "DIGIT FIVE, COMMA"}], "5,": [{"c": "\ud83c\udd06", "n": "DIGIT FIVE COMMA"}], "\u248c": [{"c": "5.", "n": "DIGIT FIVE, FULL STOP"}], "5.": [{"c": "\u248c", "n": "DIGIT FIVE FULL STOP"}], "\u33e4": [{"c": "5\u65e5", "n": "DIGIT FIVE, CJK UNIFIED IDEOGRAPH-65E5"}], "5\u65e5": [{"c": "\u33e4", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE"}], "\u32c4": [{"c": "5\u6708", "n": "DIGIT FIVE, CJK UNIFIED IDEOGRAPH-6708"}], "5\u6708": [{"c": "\u32c4", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY"}], "\u335d": [{"c": "5\u70b9", "n": "DIGIT FIVE, CJK UNIFIED IDEOGRAPH-70B9"}], "5\u70b9": [{"c": "\u335d", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE"}], "\ud835\udfd4": [{"c": "6", "n": "DIGIT SIX"}], "6": [{"c": "\ud835\udfd4", "n": "MATHEMATICAL BOLD DIGIT SIX"}, {"c": "\ud835\udfde", "n": "MATHEMATICAL DOUBLE-STRUCK DIGIT SIX"}, {"c": "\ud835\udfe8", "n": "MATHEMATICAL SANS-SERIF DIGIT SIX"}, {"c": "\ud835\udff2", "n": "MATHEMATICAL SANS-SERIF BOLD DIGIT SIX"}, {"c": "\ud835\udffc", "n": "MATHEMATICAL MONOSPACE DIGIT SIX"}, {"c": "\u2cd2", "n": "COPTIC CAPITAL LETTER OLD COPTIC HEI"}, {"c": "\u0431", "n": "CYRILLIC SMALL LETTER BE"}, {"c": "\u13ee", "n": "CHEROKEE LETTER WV"}, {"c": "\ud806\udcd5", "n": "WARANG CITI SMALL LETTER AT"}], "\ud835\udfde": [{"c": "6", "n": "DIGIT SIX"}], "\ud835\udfe8": [{"c": "6", "n": "DIGIT SIX"}], "\ud835\udff2": [{"c": "6", "n": "DIGIT SIX"}], "\ud835\udffc": [{"c": "6", "n": "DIGIT SIX"}], "\u2cd2": [{"c": "6", "n": "DIGIT SIX"}], "\u0431": [{"c": "6", "n": "DIGIT SIX"}], "\u13ee": [{"c": "6", "n": "DIGIT SIX"}], "\ud806\udcd5": [{"c": "6", "n": "DIGIT SIX"}], "\u06f6": [{"c": "\u200e\u0666\u200e", "n": "ARABIC-INDIC DIGIT SIX"}], "\u200e\u0666\u200e": [{"c": "\u06f6", "n": "EXTENDED ARABIC-INDIC DIGIT SIX"}], "\ud805\udcd6": [{"c": "\u09ec", "n": "BENGALI DIGIT SIX"}], "\u09ec": [{"c": "\ud805\udcd6", "n": "TIRHUTA DIGIT SIX"}], "\u2465": [{"c": "\u2785", "n": "DINGBAT CIRCLED SANS-SERIF DIGIT SIX"}], "\u2785": [{"c": "\u2465", "n": "CIRCLED DIGIT SIX"}], "\ud83c\udd07": [{"c": "6,", "n": "DIGIT SIX, COMMA"}], "6,": [{"c": "\ud83c\udd07", "n": "DIGIT SIX COMMA"}], "\u248d": [{"c": "6.", "n": "DIGIT SIX, FULL STOP"}], "6.": [{"c": "\u248d", "n": "DIGIT SIX FULL STOP"}], "\u33e5": [{"c": "6\u65e5", "n": "DIGIT SIX, CJK UNIFIED IDEOGRAPH-65E5"}], "6\u65e5": [{"c": "\u33e5", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX"}], "\u32c5": [{"c": "6\u6708", "n": "DIGIT SIX, CJK UNIFIED IDEOGRAPH-6708"}], "6\u6708": [{"c": "\u32c5", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE"}], "\u335e": [{"c": "6\u70b9", "n": "DIGIT SIX, CJK UNIFIED IDEOGRAPH-70B9"}], "6\u70b9": [{"c": "\u335e", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX"}], "\ud834\ude12": [{"c": "7", "n": "DIGIT SEVEN"}], "7": [{"c": "\ud834\ude12", "n": "GREEK VOCAL NOTATION SYMBOL-19"}, {"c": "\ud835\udfd5", "n": "MATHEMATICAL BOLD DIGIT SEVEN"}, {"c": "\ud835\udfdf", "n": "MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN"}, {"c": "\ud835\udfe9", "n": "MATHEMATICAL SANS-SERIF DIGIT SEVEN"}, {"c": "\ud835\udff3", "n": "MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN"}, {"c": "\ud835\udffd", "n": "MATHEMATICAL MONOSPACE DIGIT SEVEN"}, {"c": "\ud801\udcd2", "n": "OSAGE CAPITAL LETTER ZA"}, {"c": "\ud806\udcc6", "n": "WARANG CITI SMALL LETTER II"}], "\ud835\udfd5": [{"c": "7", "n": "DIGIT SEVEN"}], "\ud835\udfdf": [{"c": "7", "n": "DIGIT SEVEN"}], "\ud835\udfe9": [{"c": "7", "n": "DIGIT SEVEN"}], "\ud835\udff3": [{"c": "7", "n": "DIGIT SEVEN"}], "\ud835\udffd": [{"c": "7", "n": "DIGIT SEVEN"}], "\ud801\udcd2": [{"c": "7", "n": "DIGIT SEVEN"}], "\ud806\udcc6": [{"c": "7", "n": "DIGIT SEVEN"}], "\u2466": [{"c": "\u2786", "n": "DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN"}], "\u2786": [{"c": "\u2466", "n": "CIRCLED DIGIT SEVEN"}], "\ud83c\udd08": [{"c": "7,", "n": "DIGIT SEVEN, COMMA"}], "7,": [{"c": "\ud83c\udd08", "n": "DIGIT SEVEN COMMA"}], "\u248e": [{"c": "7.", "n": "DIGIT SEVEN, FULL STOP"}], "7.": [{"c": "\u248e", "n": "DIGIT SEVEN FULL STOP"}], "\u33e6": [{"c": "7\u65e5", "n": "DIGIT SEVEN, CJK UNIFIED IDEOGRAPH-65E5"}], "7\u65e5": [{"c": "\u33e6", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN"}], "\u32c6": [{"c": "7\u6708", "n": "DIGIT SEVEN, CJK UNIFIED IDEOGRAPH-6708"}], "7\u6708": [{"c": "\u32c6", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY"}], "\u335f": [{"c": "7\u70b9", "n": "DIGIT SEVEN, CJK UNIFIED IDEOGRAPH-70B9"}], "7\u70b9": [{"c": "\u335f", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN"}], "\u0b03": [{"c": "8", "n": "DIGIT EIGHT"}], "8": [{"c": "\u0b03", "n": "ORIYA SIGN VISARGA"}, {"c": "\u09ea", "n": "BENGALI DIGIT FOUR"}, {"c": "\u0a6a", "n": "GURMUKHI DIGIT FOUR"}, {"c": "\u200e\ud83a\udccb\u200e", "n": "MENDE KIKAKUI DIGIT FIVE"}, {"c": "\ud835\udfd6", "n": "MATHEMATICAL BOLD DIGIT EIGHT"}, {"c": "\ud835\udfe0", "n": "MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT"}, {"c": "\ud835\udfea", "n": "MATHEMATICAL SANS-SERIF DIGIT EIGHT"}, {"c": "\ud835\udff4", "n": "MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT"}, {"c": "\ud835\udffe", "n": "MATHEMATICAL MONOSPACE DIGIT EIGHT"}, {"c": "\u0223", "n": "LATIN SMALL LETTER OU"}, {"c": "\u0222", "n": "LATIN CAPITAL LETTER OU"}, {"c": "\ud800\udf1a", "n": "OLD ITALIC LETTER EF"}], "\u09ea": [{"c": "8", "n": "DIGIT EIGHT"}], "\u0a6a": [{"c": "8", "n": "DIGIT EIGHT"}], "\u200e\ud83a\udccb\u200e": [{"c": "8", "n": "DIGIT EIGHT"}], "\ud835\udfd6": [{"c": "8", "n": "DIGIT EIGHT"}], "\ud835\udfe0": [{"c": "8", "n": "DIGIT EIGHT"}], "\ud835\udfea": [{"c": "8", "n": "DIGIT EIGHT"}], "\ud835\udff4": [{"c": "8", "n": "DIGIT EIGHT"}], "\ud835\udffe": [{"c": "8", "n": "DIGIT EIGHT"}], "\u0223": [{"c": "8", "n": "DIGIT EIGHT"}], "\u0222": [{"c": "8", "n": "DIGIT EIGHT"}], "\ud800\udf1a": [{"c": "8", "n": "DIGIT EIGHT"}], "\u0aee": [{"c": "\u096e", "n": "DEVANAGARI DIGIT EIGHT"}], "\u096e": [{"c": "\u0aee", "n": "GUJARATI DIGIT EIGHT"}], "\u2467": [{"c": "\u2787", "n": "DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT"}], "\u2787": [{"c": "\u2467", "n": "CIRCLED DIGIT EIGHT"}], "\ud83c\udd09": [{"c": "8,", "n": "DIGIT EIGHT, COMMA"}], "8,": [{"c": "\ud83c\udd09", "n": "DIGIT EIGHT COMMA"}], "\u248f": [{"c": "8.", "n": "DIGIT EIGHT, FULL STOP"}], "8.": [{"c": "\u248f", "n": "DIGIT EIGHT FULL STOP"}], "\u33e7": [{"c": "8\u65e5", "n": "DIGIT EIGHT, CJK UNIFIED IDEOGRAPH-65E5"}], "8\u65e5": [{"c": "\u33e7", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT"}], "\u32c7": [{"c": "8\u6708", "n": "DIGIT EIGHT, CJK UNIFIED IDEOGRAPH-6708"}], "8\u6708": [{"c": "\u32c7", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST"}], "\u3360": [{"c": "8\u70b9", "n": "DIGIT EIGHT, CJK UNIFIED IDEOGRAPH-70B9"}], "8\u70b9": [{"c": "\u3360", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT"}], "\u0a67": [{"c": "9", "n": "DIGIT NINE"}], "9": [{"c": "\u0a67", "n": "GURMUKHI DIGIT ONE"}, {"c": "\u0b68", "n": "ORIYA DIGIT TWO"}, {"c": "\u09ed", "n": "BENGALI DIGIT SEVEN"}, {"c": "\u0d6d", "n": "MALAYALAM DIGIT SEVEN"}, {"c": "\ud835\udfd7", "n": "MATHEMATICAL BOLD DIGIT NINE"}, {"c": "\ud835\udfe1", "n": "MATHEMATICAL DOUBLE-STRUCK DIGIT NINE"}, {"c": "\ud835\udfeb", "n": "MATHEMATICAL SANS-SERIF DIGIT NINE"}, {"c": "\ud835\udff5", "n": "MATHEMATICAL SANS-SERIF BOLD DIGIT NINE"}, {"c": "\ud835\udfff", "n": "MATHEMATICAL MONOSPACE DIGIT NINE"}, {"c": "\ua76e", "n": "LATIN CAPITAL LETTER CON"}, {"c": "\u2cca", "n": "COPTIC CAPITAL LETTER DIALECT-P HORI"}, {"c": "\ud806\udccc", "n": "WARANG CITI SMALL LETTER KO"}, {"c": "\ud806\udcac", "n": "WARANG CITI CAPITAL LETTER KO"}, {"c": "\ud806\udcd6", "n": "WARANG CITI SMALL LETTER AM"}], "\u0b68": [{"c": "9", "n": "DIGIT NINE"}], "\u09ed": [{"c": "9", "n": "DIGIT NINE"}], "\u0d6d": [{"c": "9", "n": "DIGIT NINE"}], "\ud835\udfd7": [{"c": "9", "n": "DIGIT NINE"}], "\ud835\udfe1": [{"c": "9", "n": "DIGIT NINE"}], "\ud835\udfeb": [{"c": "9", "n": "DIGIT NINE"}], "\ud835\udff5": [{"c": "9", "n": "DIGIT NINE"}], "\ud835\udfff": [{"c": "9", "n": "DIGIT NINE"}], "\ua76e": [{"c": "9", "n": "DIGIT NINE"}], "\u2cca": [{"c": "9", "n": "DIGIT NINE"}], "\ud806\udccc": [{"c": "9", "n": "DIGIT NINE"}], "\ud806\udcac": [{"c": "9", "n": "DIGIT NINE"}], "\ud806\udcd6": [{"c": "9", "n": "DIGIT NINE"}], "\u0967": [{"c": "\u200e\u0669\u200e", "n": "ARABIC-INDIC DIGIT NINE"}], "\u200e\u0669\u200e": [{"c": "\u0967", "n": "DEVANAGARI DIGIT ONE"}, {"c": "\ud806\udce4", "n": "WARANG CITI DIGIT FOUR"}, {"c": "\u06f9", "n": "EXTENDED ARABIC-INDIC DIGIT NINE"}], "\ud806\udce4": [{"c": "\u200e\u0669\u200e", "n": "ARABIC-INDIC DIGIT NINE"}], "\u06f9": [{"c": "\u200e\u0669\u200e", "n": "ARABIC-INDIC DIGIT NINE"}], "\u0cef": [{"c": "\u0c6f", "n": "TELUGU DIGIT NINE"}], "\u0c6f": [{"c": "\u0cef", "n": "KANNADA DIGIT NINE"}], "\u2468": [{"c": "\u2788", "n": "DINGBAT CIRCLED SANS-SERIF DIGIT NINE"}], "\u2788": [{"c": "\u2468", "n": "CIRCLED DIGIT NINE"}], "\ud83c\udd0a": [{"c": "9,", "n": "DIGIT NINE, COMMA"}], "9,": [{"c": "\ud83c\udd0a", "n": "DIGIT NINE COMMA"}], "\u2490": [{"c": "9.", "n": "DIGIT NINE, FULL STOP"}], "9.": [{"c": "\u2490", "n": "DIGIT NINE FULL STOP"}], "\u33e8": [{"c": "9\u65e5", "n": "DIGIT NINE, CJK UNIFIED IDEOGRAPH-65E5"}], "9\u65e5": [{"c": "\u33e8", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE"}], "\u32c8": [{"c": "9\u6708", "n": "DIGIT NINE, CJK UNIFIED IDEOGRAPH-6708"}], "9\u6708": [{"c": "\u32c8", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER"}], "\u3361": [{"c": "9\u70b9", "n": "DIGIT NINE, CJK UNIFIED IDEOGRAPH-70B9"}], "9\u70b9": [{"c": "\u3361", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE"}], "\u237a": [{"c": "a", "n": "LATIN SMALL LETTER A"}], "a": [{"c": "\u237a", "n": "APL FUNCTIONAL SYMBOL ALPHA"}, {"c": "\uff41", "n": "FULLWIDTH LATIN SMALL LETTER A"}, {"c": "\ud835\udc1a", "n": "MATHEMATICAL BOLD SMALL A"}, {"c": "\ud835\udc4e", "n": "MATHEMATICAL ITALIC SMALL A"}, {"c": "\ud835\udc82", "n": "MATHEMATICAL BOLD ITALIC SMALL A"}, {"c": "\ud835\udcb6", "n": "MATHEMATICAL SCRIPT SMALL A"}, {"c": "\ud835\udcea", "n": "MATHEMATICAL BOLD SCRIPT SMALL A"}, {"c": "\ud835\udd1e", "n": "MATHEMATICAL FRAKTUR SMALL A"}, {"c": "\ud835\udd52", "n": "MATHEMATICAL DOUBLE-STRUCK SMALL A"}, {"c": "\ud835\udd86", "n": "MATHEMATICAL BOLD FRAKTUR SMALL A"}, {"c": "\ud835\uddba", "n": "MATHEMATICAL SANS-SERIF SMALL A"}, {"c": "\ud835\uddee", "n": "MATHEMATICAL SANS-SERIF BOLD SMALL A"}, {"c": "\ud835\ude22", "n": "MATHEMATICAL SANS-SERIF ITALIC SMALL A"}, {"c": "\ud835\ude56", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A"}, {"c": "\ud835\ude8a", "n": "MATHEMATICAL MONOSPACE SMALL A"}, {"c": "\u0251", "n": "LATIN SMALL LETTER ALPHA"}, {"c": "\u03b1", "n": "GREEK SMALL LETTER ALPHA"}, {"c": "\ud835\udec2", "n": "MATHEMATICAL BOLD SMALL ALPHA"}, {"c": "\ud835\udefc", "n": "MATHEMATICAL ITALIC SMALL ALPHA"}, {"c": "\ud835\udf36", "n": "MATHEMATICAL BOLD ITALIC SMALL ALPHA"}, {"c": "\ud835\udf70", "n": "MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA"}, {"c": "\ud835\udfaa", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA"}, {"c": "\u0430", "n": "CYRILLIC SMALL LETTER A"}], "\uff41": [{"c": "a", "n": "LATIN SMALL LETTER A"}], "\ud835\udc1a": [{"c": "a", "n": "LATIN SMALL LETTER A"}], "\ud835\udc4e": [{"c": "a", "n": "LATIN SMALL LETTER A"}], "\ud835\udc82": [{"c": "a", "n": "LATIN SMALL LETTER A"}], "\ud835\udcb6": [{"c": "a", "n": "LATIN SMALL LETTER A"}], "\ud835\udcea": [{"c": "a", "n": "LATIN SMALL LETTER A"}], "\ud835\udd1e": [{"c": "a", "n": "LATIN SMALL LETTER A"}], "\ud835\udd52": [{"c": "a", "n": "LATIN SMALL LETTER A"}], "\ud835\udd86": [{"c": "a", "n": "LATIN SMALL LETTER A"}], "\ud835\uddba": [{"c": "a", "n": "LATIN SMALL LETTER A"}], "\ud835\uddee": [{"c": "a", "n": "LATIN SMALL LETTER A"}], "\ud835\ude22": [{"c": "a", "n": "LATIN SMALL LETTER A"}], "\ud835\ude56": [{"c": "a", "n": "LATIN SMALL LETTER A"}], "\ud835\ude8a": [{"c": "a", "n": "LATIN SMALL LETTER A"}], "\u0251": [{"c": "a", "n": "LATIN SMALL LETTER A"}], "\u03b1": [{"c": "a", "n": "LATIN SMALL LETTER A"}], "\ud835\udec2": [{"c": "a", "n": "LATIN SMALL LETTER A"}], "\ud835\udefc": [{"c": "a", "n": "LATIN SMALL LETTER A"}], "\ud835\udf36": [{"c": "a", "n": "LATIN SMALL LETTER A"}], "\ud835\udf70": [{"c": "a", "n": "LATIN SMALL LETTER A"}], "\ud835\udfaa": [{"c": "a", "n": "LATIN SMALL LETTER A"}], "\u0430": [{"c": "a", "n": "LATIN SMALL LETTER A"}], "\u2df6": [{"c": "\u0363", "n": "COMBINING LATIN SMALL LETTER A"}], "\u0363": [{"c": "\u2df6", "n": "COMBINING CYRILLIC LETTER A"}], "\uff21": [{"c": "A", "n": "LATIN CAPITAL LETTER A"}], "A": [{"c": "\uff21", "n": "FULLWIDTH LATIN CAPITAL LETTER A"}, {"c": "\ud835\udc00", "n": "MATHEMATICAL BOLD CAPITAL A"}, {"c": "\ud835\udc34", "n": "MATHEMATICAL ITALIC CAPITAL A"}, {"c": "\ud835\udc68", "n": "MATHEMATICAL BOLD ITALIC CAPITAL A"}, {"c": "\ud835\udc9c", "n": "MATHEMATICAL SCRIPT CAPITAL A"}, {"c": "\ud835\udcd0", "n": "MATHEMATICAL BOLD SCRIPT CAPITAL A"}, {"c": "\ud835\udd04", "n": "MATHEMATICAL FRAKTUR CAPITAL A"}, {"c": "\ud835\udd38", "n": "MATHEMATICAL DOUBLE-STRUCK CAPITAL A"}, {"c": "\ud835\udd6c", "n": "MATHEMATICAL BOLD FRAKTUR CAPITAL A"}, {"c": "\ud835\udda0", "n": "MATHEMATICAL SANS-SERIF CAPITAL A"}, {"c": "\ud835\uddd4", "n": "MATHEMATICAL SANS-SERIF BOLD CAPITAL A"}, {"c": "\ud835\ude08", "n": "MATHEMATICAL SANS-SERIF ITALIC CAPITAL A"}, {"c": "\ud835\ude3c", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A"}, {"c": "\ud835\ude70", "n": "MATHEMATICAL MONOSPACE CAPITAL A"}, {"c": "\u0391", "n": "GREEK CAPITAL LETTER ALPHA"}, {"c": "\ud835\udea8", "n": "MATHEMATICAL BOLD CAPITAL ALPHA"}, {"c": "\ud835\udee2", "n": "MATHEMATICAL ITALIC CAPITAL ALPHA"}, {"c": "\ud835\udf1c", "n": "MATHEMATICAL BOLD ITALIC CAPITAL ALPHA"}, {"c": "\ud835\udf56", "n": "MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA"}, {"c": "\ud835\udf90", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA"}, {"c": "\u0410", "n": "CYRILLIC CAPITAL LETTER A"}, {"c": "\u13aa", "n": "CHEROKEE LETTER GO"}, {"c": "\u15c5", "n": "CANADIAN SYLLABICS CARRIER GHO"}, {"c": "\ua4ee", "n": "LISU LETTER A"}, {"c": "\ud81b\udf40", "n": "MIAO LETTER ZZYA"}, {"c": "\ud800\udea0", "n": "CARIAN LETTER A"}], "\ud835\udc00": [{"c": "A", "n": "LATIN CAPITAL LETTER A"}], "\ud835\udc34": [{"c": "A", "n": "LATIN CAPITAL LETTER A"}], "\ud835\udc68": [{"c": "A", "n": "LATIN CAPITAL LETTER A"}], "\ud835\udc9c": [{"c": "A", "n": "LATIN CAPITAL LETTER A"}], "\ud835\udcd0": [{"c": "A", "n": "LATIN CAPITAL LETTER A"}], "\ud835\udd04": [{"c": "A", "n": "LATIN CAPITAL LETTER A"}], "\ud835\udd38": [{"c": "A", "n": "LATIN CAPITAL LETTER A"}], "\ud835\udd6c": [{"c": "A", "n": "LATIN CAPITAL LETTER A"}], "\ud835\udda0": [{"c": "A", "n": "LATIN CAPITAL LETTER A"}], "\ud835\uddd4": [{"c": "A", "n": "LATIN CAPITAL LETTER A"}], "\ud835\ude08": [{"c": "A", "n": "LATIN CAPITAL LETTER A"}], "\ud835\ude3c": [{"c": "A", "n": "LATIN CAPITAL LETTER A"}], "\ud835\ude70": [{"c": "A", "n": "LATIN CAPITAL LETTER A"}], "\u0391": [{"c": "A", "n": "LATIN CAPITAL LETTER A"}], "\ud835\udea8": [{"c": "A", "n": "LATIN CAPITAL LETTER A"}], "\ud835\udee2": [{"c": "A", "n": "LATIN CAPITAL LETTER A"}], "\ud835\udf1c": [{"c": "A", "n": "LATIN CAPITAL LETTER A"}], "\ud835\udf56": [{"c": "A", "n": "LATIN CAPITAL LETTER A"}], "\ud835\udf90": [{"c": "A", "n": "LATIN CAPITAL LETTER A"}], "\u0410": [{"c": "A", "n": "LATIN CAPITAL LETTER A"}], "\u13aa": [{"c": "A", "n": "LATIN CAPITAL LETTER A"}], "\u15c5": [{"c": "A", "n": "LATIN CAPITAL LETTER A"}], "\ua4ee": [{"c": "A", "n": "LATIN CAPITAL LETTER A"}], "\ud81b\udf40": [{"c": "A", "n": "LATIN CAPITAL LETTER A"}], "\ud800\udea0": [{"c": "A", "n": "LATIN CAPITAL LETTER A"}], "\u2376": [{"c": "a\u0332", "n": "LATIN SMALL LETTER A, COMBINING LOW LINE"}], "a\u0332": [{"c": "\u2376", "n": "APL FUNCTIONAL SYMBOL ALPHA UNDERBAR"}], "\u01ce": [{"c": "\u0103", "n": "LATIN SMALL LETTER A WITH BREVE"}], "\u0103": [{"c": "\u01ce", "n": "LATIN SMALL LETTER A WITH CARON"}], "\u01cd": [{"c": "\u0102", "n": "LATIN CAPITAL LETTER A WITH BREVE"}], "\u0102": [{"c": "\u01cd", "n": "LATIN CAPITAL LETTER A WITH CARON"}], "\u0227": [{"c": "\u00e5", "n": "LATIN SMALL LETTER A WITH RING ABOVE"}], "\u00e5": [{"c": "\u0227", "n": "LATIN SMALL LETTER A WITH DOT ABOVE"}], "\u0226": [{"c": "\u00c5", "n": "LATIN CAPITAL LETTER A WITH RING ABOVE"}], "\u00c5": [{"c": "\u0226", "n": "LATIN CAPITAL LETTER A WITH DOT ABOVE"}], "\u1e9a": [{"c": "\u1ea3", "n": "LATIN SMALL LETTER A WITH HOOK ABOVE"}], "\u1ea3": [{"c": "\u1e9a", "n": "LATIN SMALL LETTER A WITH RIGHT HALF RING"}], "\u2100": [{"c": "a/c", "n": "LATIN SMALL LETTER A, SOLIDUS, LATIN SMALL LETTER C"}], "a/c": [{"c": "\u2100", "n": "ACCOUNT OF"}], "\u2101": [{"c": "a/s", "n": "LATIN SMALL LETTER A, SOLIDUS, LATIN SMALL LETTER S"}], "a/s": [{"c": "\u2101", "n": "ADDRESSED TO THE SUBJECT"}], "\ua733": [{"c": "aa", "n": "LATIN SMALL LETTER A, LATIN SMALL LETTER A"}], "aa": [{"c": "\ua733", "n": "LATIN SMALL LETTER AA"}], "\ua732": [{"c": "AA", "n": "LATIN CAPITAL LETTER A, LATIN CAPITAL LETTER A"}], "AA": [{"c": "\ua732", "n": "LATIN CAPITAL LETTER AA"}], "\u00e6": [{"c": "ae", "n": "LATIN SMALL LETTER A, LATIN SMALL LETTER E"}], "ae": [{"c": "\u00e6", "n": "LATIN SMALL LETTER AE"}, {"c": "\u04d5", "n": "CYRILLIC SMALL LIGATURE A IE"}], "\u04d5": [{"c": "ae", "n": "LATIN SMALL LETTER A, LATIN SMALL LETTER E"}], "\u00c6": [{"c": "AE", "n": "LATIN CAPITAL LETTER A, LATIN CAPITAL LETTER E"}], "AE": [{"c": "\u00c6", "n": "LATIN CAPITAL LETTER AE"}, {"c": "\u04d4", "n": "CYRILLIC CAPITAL LIGATURE A IE"}], "\u04d4": [{"c": "AE", "n": "LATIN CAPITAL LETTER A, LATIN CAPITAL LETTER E"}], "\ua735": [{"c": "ao", "n": "LATIN SMALL LETTER A, LATIN SMALL LETTER O"}], "ao": [{"c": "\ua735", "n": "LATIN SMALL LETTER AO"}], "\ua734": [{"c": "AO", "n": "LATIN CAPITAL LETTER A, LATIN CAPITAL LETTER O"}], "AO": [{"c": "\ua734", "n": "LATIN CAPITAL LETTER AO"}], "\ud83d\udf07": [{"c": "AR", "n": "LATIN CAPITAL LETTER A, LATIN CAPITAL LETTER R"}], "AR": [{"c": "\ud83d\udf07", "n": "ALCHEMICAL SYMBOL FOR AQUA REGIA-2"}], "\ua737": [{"c": "au", "n": "LATIN SMALL LETTER A, LATIN SMALL LETTER U"}], "au": [{"c": "\ua737", "n": "LATIN SMALL LETTER AU"}], "\ua736": [{"c": "AU", "n": "LATIN CAPITAL LETTER A, LATIN CAPITAL LETTER U"}], "AU": [{"c": "\ua736", "n": "LATIN CAPITAL LETTER AU"}], "\ua739": [{"c": "av", "n": "LATIN SMALL LETTER A, LATIN SMALL LETTER V"}], "av": [{"c": "\ua739", "n": "LATIN SMALL LETTER AV"}, {"c": "\ua73b", "n": "LATIN SMALL LETTER AV WITH HORIZONTAL BAR"}], "\ua73b": [{"c": "av", "n": "LATIN SMALL LETTER A, LATIN SMALL LETTER V"}], "\ua738": [{"c": "AV", "n": "LATIN CAPITAL LETTER A, LATIN CAPITAL LETTER V"}], "AV": [{"c": "\ua738", "n": "LATIN CAPITAL LETTER AV"}, {"c": "\ua73a", "n": "LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR"}], "\ua73a": [{"c": "AV", "n": "LATIN CAPITAL LETTER A, LATIN CAPITAL LETTER V"}], "\ua73d": [{"c": "ay", "n": "LATIN SMALL LETTER A, LATIN SMALL LETTER Y"}], "ay": [{"c": "\ua73d", "n": "LATIN SMALL LETTER AY"}], "\ua73c": [{"c": "AY", "n": "LATIN CAPITAL LETTER A, LATIN CAPITAL LETTER Y"}], "AY": [{"c": "\ua73c", "n": "LATIN CAPITAL LETTER AY"}], "\uab7a": [{"c": "\u1d00", "n": "LATIN LETTER SMALL CAPITAL A"}], "\u1d00": [{"c": "\uab7a", "n": "CHEROKEE SMALL LETTER GO"}], "\u2200": [{"c": "\u2c6f", "n": "LATIN CAPITAL LETTER TURNED A"}], "\u2c6f": [{"c": "\u2200", "n": "FOR ALL"}, {"c": "\ud834\ude17", "n": "GREEK VOCAL NOTATION SYMBOL-24"}, {"c": "\u15c4", "n": "CANADIAN SYLLABICS CARRIER GHU"}, {"c": "\ua4ef", "n": "LISU LETTER AE"}], "\ud834\ude17": [{"c": "\u2c6f", "n": "LATIN CAPITAL LETTER TURNED A"}], "\u15c4": [{"c": "\u2c6f", "n": "LATIN CAPITAL LETTER TURNED A"}], "\ua4ef": [{"c": "\u2c6f", "n": "LATIN CAPITAL LETTER TURNED A"}], "\ud801\udc1f": [{"c": "\u2c70", "n": "LATIN CAPITAL LETTER TURNED ALPHA"}], "\u2c70": [{"c": "\ud801\udc1f", "n": "DESERET CAPITAL LETTER ESH"}], "\ud835\udc1b": [{"c": "b", "n": "LATIN SMALL LETTER B"}], "b": [{"c": "\ud835\udc1b", "n": "MATHEMATICAL BOLD SMALL B"}, {"c": "\ud835\udc4f", "n": "MATHEMATICAL ITALIC SMALL B"}, {"c": "\ud835\udc83", "n": "MATHEMATICAL BOLD ITALIC SMALL B"}, {"c": "\ud835\udcb7", "n": "MATHEMATICAL SCRIPT SMALL B"}, {"c": "\ud835\udceb", "n": "MATHEMATICAL BOLD SCRIPT SMALL B"}, {"c": "\ud835\udd1f", "n": "MATHEMATICAL FRAKTUR SMALL B"}, {"c": "\ud835\udd53", "n": "MATHEMATICAL DOUBLE-STRUCK SMALL B"}, {"c": "\ud835\udd87", "n": "MATHEMATICAL BOLD FRAKTUR SMALL B"}, {"c": "\ud835\uddbb", "n": "MATHEMATICAL SANS-SERIF SMALL B"}, {"c": "\ud835\uddef", "n": "MATHEMATICAL SANS-SERIF BOLD SMALL B"}, {"c": "\ud835\ude23", "n": "MATHEMATICAL SANS-SERIF ITALIC SMALL B"}, {"c": "\ud835\ude57", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B"}, {"c": "\ud835\ude8b", "n": "MATHEMATICAL MONOSPACE SMALL B"}, {"c": "\u0184", "n": "LATIN CAPITAL LETTER TONE SIX"}, {"c": "\u042c", "n": "CYRILLIC CAPITAL LETTER SOFT SIGN"}, {"c": "\u13cf", "n": "CHEROKEE LETTER SI"}, {"c": "\u1472", "n": "CANADIAN SYLLABICS KA"}, {"c": "\u15af", "n": "CANADIAN SYLLABICS AIVILIK B"}], "\ud835\udc4f": [{"c": "b", "n": "LATIN SMALL LETTER B"}], "\ud835\udc83": [{"c": "b", "n": "LATIN SMALL LETTER B"}], "\ud835\udcb7": [{"c": "b", "n": "LATIN SMALL LETTER B"}], "\ud835\udceb": [{"c": "b", "n": "LATIN SMALL LETTER B"}], "\ud835\udd1f": [{"c": "b", "n": "LATIN SMALL LETTER B"}], "\ud835\udd53": [{"c": "b", "n": "LATIN SMALL LETTER B"}], "\ud835\udd87": [{"c": "b", "n": "LATIN SMALL LETTER B"}], "\ud835\uddbb": [{"c": "b", "n": "LATIN SMALL LETTER B"}], "\ud835\uddef": [{"c": "b", "n": "LATIN SMALL LETTER B"}], "\ud835\ude23": [{"c": "b", "n": "LATIN SMALL LETTER B"}], "\ud835\ude57": [{"c": "b", "n": "LATIN SMALL LETTER B"}], "\ud835\ude8b": [{"c": "b", "n": "LATIN SMALL LETTER B"}], "\u0184": [{"c": "b", "n": "LATIN SMALL LETTER B"}], "\u042c": [{"c": "b", "n": "LATIN SMALL LETTER B"}], "\u13cf": [{"c": "b", "n": "LATIN SMALL LETTER B"}], "\u1472": [{"c": "b", "n": "LATIN SMALL LETTER B"}], "\u15af": [{"c": "b", "n": "LATIN SMALL LETTER B"}], "\uff22": [{"c": "B", "n": "LATIN CAPITAL LETTER B"}], "B": [{"c": "\uff22", "n": "FULLWIDTH LATIN CAPITAL LETTER B"}, {"c": "\u212c", "n": "SCRIPT CAPITAL B"}, {"c": "\ud835\udc01", "n": "MATHEMATICAL BOLD CAPITAL B"}, {"c": "\ud835\udc35", "n": "MATHEMATICAL ITALIC CAPITAL B"}, {"c": "\ud835\udc69", "n": "MATHEMATICAL BOLD ITALIC CAPITAL B"}, {"c": "\ud835\udcd1", "n": "MATHEMATICAL BOLD SCRIPT CAPITAL B"}, {"c": "\ud835\udd05", "n": "MATHEMATICAL FRAKTUR CAPITAL B"}, {"c": "\ud835\udd39", "n": "MATHEMATICAL DOUBLE-STRUCK CAPITAL B"}, {"c": "\ud835\udd6d", "n": "MATHEMATICAL BOLD FRAKTUR CAPITAL B"}, {"c": "\ud835\udda1", "n": "MATHEMATICAL SANS-SERIF CAPITAL B"}, {"c": "\ud835\uddd5", "n": "MATHEMATICAL SANS-SERIF BOLD CAPITAL B"}, {"c": "\ud835\ude09", "n": "MATHEMATICAL SANS-SERIF ITALIC CAPITAL B"}, {"c": "\ud835\ude3d", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B"}, {"c": "\ud835\ude71", "n": "MATHEMATICAL MONOSPACE CAPITAL B"}, {"c": "\ua7b4", "n": "LATIN CAPITAL LETTER BETA"}, {"c": "\u0392", "n": "GREEK CAPITAL LETTER BETA"}, {"c": "\ud835\udea9", "n": "MATHEMATICAL BOLD CAPITAL BETA"}, {"c": "\ud835\udee3", "n": "MATHEMATICAL ITALIC CAPITAL BETA"}, {"c": "\ud835\udf1d", "n": "MATHEMATICAL BOLD ITALIC CAPITAL BETA"}, {"c": "\ud835\udf57", "n": "MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA"}, {"c": "\ud835\udf91", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA"}, {"c": "\u0412", "n": "CYRILLIC CAPITAL LETTER VE"}, {"c": "\u13f4", "n": "CHEROKEE LETTER YV"}, {"c": "\u15f7", "n": "CANADIAN SYLLABICS CARRIER KHE"}, {"c": "\ua4d0", "n": "LISU LETTER BA"}, {"c": "\ud800\ude82", "n": "LYCIAN LETTER B"}, {"c": "\ud800\udea1", "n": "CARIAN LETTER P2"}, {"c": "\ud800\udf01", "n": "OLD ITALIC LETTER BE"}], "\u212c": [{"c": "B", "n": "LATIN CAPITAL LETTER B"}], "\ud835\udc01": [{"c": "B", "n": "LATIN CAPITAL LETTER B"}], "\ud835\udc35": [{"c": "B", "n": "LATIN CAPITAL LETTER B"}], "\ud835\udc69": [{"c": "B", "n": "LATIN CAPITAL LETTER B"}], "\ud835\udcd1": [{"c": "B", "n": "LATIN CAPITAL LETTER B"}], "\ud835\udd05": [{"c": "B", "n": "LATIN CAPITAL LETTER B"}], "\ud835\udd39": [{"c": "B", "n": "LATIN CAPITAL LETTER B"}], "\ud835\udd6d": [{"c": "B", "n": "LATIN CAPITAL LETTER B"}], "\ud835\udda1": [{"c": "B", "n": "LATIN CAPITAL LETTER B"}], "\ud835\uddd5": [{"c": "B", "n": "LATIN CAPITAL LETTER B"}], "\ud835\ude09": [{"c": "B", "n": "LATIN CAPITAL LETTER B"}], "\ud835\ude3d": [{"c": "B", "n": "LATIN CAPITAL LETTER B"}], "\ud835\ude71": [{"c": "B", "n": "LATIN CAPITAL LETTER B"}], "\ua7b4": [{"c": "B", "n": "LATIN CAPITAL LETTER B"}], "\u0392": [{"c": "B", "n": "LATIN CAPITAL LETTER B"}], "\ud835\udea9": [{"c": "B", "n": "LATIN CAPITAL LETTER B"}], "\ud835\udee3": [{"c": "B", "n": "LATIN CAPITAL LETTER B"}], "\ud835\udf1d": [{"c": "B", "n": "LATIN CAPITAL LETTER B"}], "\ud835\udf57": [{"c": "B", "n": "LATIN CAPITAL LETTER B"}], "\ud835\udf91": [{"c": "B", "n": "LATIN CAPITAL LETTER B"}], "\u0412": [{"c": "B", "n": "LATIN CAPITAL LETTER B"}], "\u13f4": [{"c": "B", "n": "LATIN CAPITAL LETTER B"}], "\u15f7": [{"c": "B", "n": "LATIN CAPITAL LETTER B"}], "\ua4d0": [{"c": "B", "n": "LATIN CAPITAL LETTER B"}], "\ud800\ude82": [{"c": "B", "n": "LATIN CAPITAL LETTER B"}], "\ud800\udea1": [{"c": "B", "n": "LATIN CAPITAL LETTER B"}], "\ud800\udf01": [{"c": "B", "n": "LATIN CAPITAL LETTER B"}], "\u0253": [{"c": "b\u0314", "n": "LATIN SMALL LETTER B, COMBINING REVERSED COMMA ABOVE"}], "b\u0314": [{"c": "\u0253", "n": "LATIN SMALL LETTER B WITH HOOK"}], "\u1473": [{"c": "b\u0307", "n": "LATIN SMALL LETTER B, COMBINING DOT ABOVE"}], "b\u0307": [{"c": "\u1473", "n": "CANADIAN SYLLABICS KAA"}], "\u0183": [{"c": "b\u0304", "n": "LATIN SMALL LETTER B, COMBINING MACRON"}], "b\u0304": [{"c": "\u0183", "n": "LATIN SMALL LETTER B WITH TOPBAR"}, {"c": "\u0182", "n": "LATIN CAPITAL LETTER B WITH TOPBAR"}, {"c": "\u0411", "n": "CYRILLIC CAPITAL LETTER BE"}], "\u0182": [{"c": "b\u0304", "n": "LATIN SMALL LETTER B, COMBINING MACRON"}], "\u0411": [{"c": "b\u0304", "n": "LATIN SMALL LETTER B, COMBINING MACRON"}], "\u0180": [{"c": "b\u0335", "n": "LATIN SMALL LETTER B, COMBINING SHORT STROKE OVERLAY"}], "b\u0335": [{"c": "\u0180", "n": "LATIN SMALL LETTER B WITH STROKE"}, {"c": "\u048d", "n": "CYRILLIC SMALL LETTER SEMISOFT SIGN"}, {"c": "\u048c", "n": "CYRILLIC CAPITAL LETTER SEMISOFT SIGN"}, {"c": "\u0463", "n": "CYRILLIC SMALL LETTER YAT"}, {"c": "\u0462", "n": "CYRILLIC CAPITAL LETTER YAT"}], "\u048d": [{"c": "b\u0335", "n": "LATIN SMALL LETTER B, COMBINING SHORT STROKE OVERLAY"}], "\u048c": [{"c": "b\u0335", "n": "LATIN SMALL LETTER B, COMBINING SHORT STROKE OVERLAY"}], "\u0463": [{"c": "b\u0335", "n": "LATIN SMALL LETTER B, COMBINING SHORT STROKE OVERLAY"}], "\u0462": [{"c": "b\u0335", "n": "LATIN SMALL LETTER B, COMBINING SHORT STROKE OVERLAY"}], "\u147f": [{"c": "b\u00b7", "n": "LATIN SMALL LETTER B, MIDDLE DOT"}], "b\u00b7": [{"c": "\u147f", "n": "CANADIAN SYLLABICS WEST-CREE KWA"}], "\u1481": [{"c": "b\u0307\u00b7", "n": "LATIN SMALL LETTER B, COMBINING DOT ABOVE, MIDDLE DOT"}], "b\u0307\u00b7": [{"c": "\u1481", "n": "CANADIAN SYLLABICS WEST-CREE KWAA"}], "\u1488": [{"c": "b'", "n": "LATIN SMALL LETTER B, APOSTROPHE"}], "b'": [{"c": "\u1488", "n": "CANADIAN SYLLABICS SOUTH-SLAVEY KAH"}], "\u042b": [{"c": "bl", "n": "LATIN SMALL LETTER B, LATIN SMALL LETTER L"}], "bl": [{"c": "\u042b", "n": "CYRILLIC CAPITAL LETTER YERU"}], "\u0432": [{"c": "\u0299", "n": "LATIN LETTER SMALL CAPITAL B"}], "\u0299": [{"c": "\u0432", "n": "CYRILLIC SMALL LETTER VE"}, {"c": "\u13fc", "n": "CHEROKEE SMALL LETTER YV"}], "\u13fc": [{"c": "\u0299", "n": "LATIN LETTER SMALL CAPITAL B"}], "\uff43": [{"c": "c", "n": "LATIN SMALL LETTER C"}], "c": [{"c": "\uff43", "n": "FULLWIDTH LATIN SMALL LETTER C"}, {"c": "\u217d", "n": "SMALL ROMAN NUMERAL ONE HUNDRED"}, {"c": "\ud835\udc1c", "n": "MATHEMATICAL BOLD SMALL C"}, {"c": "\ud835\udc50", "n": "MATHEMATICAL ITALIC SMALL C"}, {"c": "\ud835\udc84", "n": "MATHEMATICAL BOLD ITALIC SMALL C"}, {"c": "\ud835\udcb8", "n": "MATHEMATICAL SCRIPT SMALL C"}, {"c": "\ud835\udcec", "n": "MATHEMATICAL BOLD SCRIPT SMALL C"}, {"c": "\ud835\udd20", "n": "MATHEMATICAL FRAKTUR SMALL C"}, {"c": "\ud835\udd54", "n": "MATHEMATICAL DOUBLE-STRUCK SMALL C"}, {"c": "\ud835\udd88", "n": "MATHEMATICAL BOLD FRAKTUR SMALL C"}, {"c": "\ud835\uddbc", "n": "MATHEMATICAL SANS-SERIF SMALL C"}, {"c": "\ud835\uddf0", "n": "MATHEMATICAL SANS-SERIF BOLD SMALL C"}, {"c": "\ud835\ude24", "n": "MATHEMATICAL SANS-SERIF ITALIC SMALL C"}, {"c": "\ud835\ude58", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C"}, {"c": "\ud835\ude8c", "n": "MATHEMATICAL MONOSPACE SMALL C"}, {"c": "\u1d04", "n": "LATIN LETTER SMALL CAPITAL C"}, {"c": "\u03f2", "n": "GREEK LUNATE SIGMA SYMBOL"}, {"c": "\u2ca5", "n": "COPTIC SMALL LETTER SIMA"}, {"c": "\u0441", "n": "CYRILLIC SMALL LETTER ES"}, {"c": "\uabaf", "n": "CHEROKEE SMALL LETTER TLI"}, {"c": "\ud801\udc3d", "n": "DESERET SMALL LETTER CHEE"}], "\u217d": [{"c": "c", "n": "LATIN SMALL LETTER C"}], "\ud835\udc1c": [{"c": "c", "n": "LATIN SMALL LETTER C"}], "\ud835\udc50": [{"c": "c", "n": "LATIN SMALL LETTER C"}], "\ud835\udc84": [{"c": "c", "n": "LATIN SMALL LETTER C"}], "\ud835\udcb8": [{"c": "c", "n": "LATIN SMALL LETTER C"}], "\ud835\udcec": [{"c": "c", "n": "LATIN SMALL LETTER C"}], "\ud835\udd20": [{"c": "c", "n": "LATIN SMALL LETTER C"}], "\ud835\udd54": [{"c": "c", "n": "LATIN SMALL LETTER C"}], "\ud835\udd88": [{"c": "c", "n": "LATIN SMALL LETTER C"}], "\ud835\uddbc": [{"c": "c", "n": "LATIN SMALL LETTER C"}], "\ud835\uddf0": [{"c": "c", "n": "LATIN SMALL LETTER C"}], "\ud835\ude24": [{"c": "c", "n": "LATIN SMALL LETTER C"}], "\ud835\ude58": [{"c": "c", "n": "LATIN SMALL LETTER C"}], "\ud835\ude8c": [{"c": "c", "n": "LATIN SMALL LETTER C"}], "\u1d04": [{"c": "c", "n": "LATIN SMALL LETTER C"}], "\u03f2": [{"c": "c", "n": "LATIN SMALL LETTER C"}], "\u2ca5": [{"c": "c", "n": "LATIN SMALL LETTER C"}], "\u0441": [{"c": "c", "n": "LATIN SMALL LETTER C"}], "\uabaf": [{"c": "c", "n": "LATIN SMALL LETTER C"}], "\ud801\udc3d": [{"c": "c", "n": "LATIN SMALL LETTER C"}], "\u2ded": [{"c": "\u0368", "n": "COMBINING LATIN SMALL LETTER C"}], "\u0368": [{"c": "\u2ded", "n": "COMBINING CYRILLIC LETTER ES"}], "\ud83d\udf4c": [{"c": "C", "n": "LATIN CAPITAL LETTER C"}], "C": [{"c": "\ud83d\udf4c", "n": "ALCHEMICAL SYMBOL FOR CALX"}, {"c": "\ud806\udcf2", "n": "WARANG CITI NUMBER NINETY"}, {"c": "\ud806\udce9", "n": "WARANG CITI DIGIT NINE"}, {"c": "\uff23", "n": "FULLWIDTH LATIN CAPITAL LETTER C"}, {"c": "\u216d", "n": "ROMAN NUMERAL ONE HUNDRED"}, {"c": "\u2102", "n": "DOUBLE-STRUCK CAPITAL C"}, {"c": "\u212d", "n": "BLACK-LETTER CAPITAL C"}, {"c": "\ud835\udc02", "n": "MATHEMATICAL BOLD CAPITAL C"}, {"c": "\ud835\udc36", "n": "MATHEMATICAL ITALIC CAPITAL C"}, {"c": "\ud835\udc6a", "n": "MATHEMATICAL BOLD ITALIC CAPITAL C"}, {"c": "\ud835\udc9e", "n": "MATHEMATICAL SCRIPT CAPITAL C"}, {"c": "\ud835\udcd2", "n": "MATHEMATICAL BOLD SCRIPT CAPITAL C"}, {"c": "\ud835\udd6e", "n": "MATHEMATICAL BOLD FRAKTUR CAPITAL C"}, {"c": "\ud835\udda2", "n": "MATHEMATICAL SANS-SERIF CAPITAL C"}, {"c": "\ud835\uddd6", "n": "MATHEMATICAL SANS-SERIF BOLD CAPITAL C"}, {"c": "\ud835\ude0a", "n": "MATHEMATICAL SANS-SERIF ITALIC CAPITAL C"}, {"c": "\ud835\ude3e", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C"}, {"c": "\ud835\ude72", "n": "MATHEMATICAL MONOSPACE CAPITAL C"}, {"c": "\u03f9", "n": "GREEK CAPITAL LUNATE SIGMA SYMBOL"}, {"c": "\u2ca4", "n": "COPTIC CAPITAL LETTER SIMA"}, {"c": "\u0421", "n": "CYRILLIC CAPITAL LETTER ES"}, {"c": "\u13df", "n": "CHEROKEE LETTER TLI"}, {"c": "\ua4da", "n": "LISU LETTER CA"}, {"c": "\ud800\udea2", "n": "CARIAN LETTER D"}, {"c": "\ud800\udf02", "n": "OLD ITALIC LETTER KE"}, {"c": "\ud801\udc15", "n": "DESERET CAPITAL LETTER CHEE"}, {"c": "\ud801\udd1c", "n": "ELBASAN LETTER SHE"}], "\ud806\udcf2": [{"c": "C", "n": "LATIN CAPITAL LETTER C"}], "\ud806\udce9": [{"c": "C", "n": "LATIN CAPITAL LETTER C"}], "\uff23": [{"c": "C", "n": "LATIN CAPITAL LETTER C"}], "\u216d": [{"c": "C", "n": "LATIN CAPITAL LETTER C"}], "\u2102": [{"c": "C", "n": "LATIN CAPITAL LETTER C"}], "\u212d": [{"c": "C", "n": "LATIN CAPITAL LETTER C"}], "\ud835\udc02": [{"c": "C", "n": "LATIN CAPITAL LETTER C"}], "\ud835\udc36": [{"c": "C", "n": "LATIN CAPITAL LETTER C"}], "\ud835\udc6a": [{"c": "C", "n": "LATIN CAPITAL LETTER C"}], "\ud835\udc9e": [{"c": "C", "n": "LATIN CAPITAL LETTER C"}], "\ud835\udcd2": [{"c": "C", "n": "LATIN CAPITAL LETTER C"}], "\ud835\udd6e": [{"c": "C", "n": "LATIN CAPITAL LETTER C"}], "\ud835\udda2": [{"c": "C", "n": "LATIN CAPITAL LETTER C"}], "\ud835\uddd6": [{"c": "C", "n": "LATIN CAPITAL LETTER C"}], "\ud835\ude0a": [{"c": "C", "n": "LATIN CAPITAL LETTER C"}], "\ud835\ude3e": [{"c": "C", "n": "LATIN CAPITAL LETTER C"}], "\ud835\ude72": [{"c": "C", "n": "LATIN CAPITAL LETTER C"}], "\u03f9": [{"c": "C", "n": "LATIN CAPITAL LETTER C"}], "\u2ca4": [{"c": "C", "n": "LATIN CAPITAL LETTER C"}], "\u0421": [{"c": "C", "n": "LATIN CAPITAL LETTER C"}], "\u13df": [{"c": "C", "n": "LATIN CAPITAL LETTER C"}], "\ua4da": [{"c": "C", "n": "LATIN CAPITAL LETTER C"}], "\ud800\udea2": [{"c": "C", "n": "LATIN CAPITAL LETTER C"}], "\ud800\udf02": [{"c": "C", "n": "LATIN CAPITAL LETTER C"}], "\ud801\udc15": [{"c": "C", "n": "LATIN CAPITAL LETTER C"}], "\ud801\udd1c": [{"c": "C", "n": "LATIN CAPITAL LETTER C"}], "\u00a2": [{"c": "c\u0338", "n": "LATIN SMALL LETTER C, COMBINING LONG SOLIDUS OVERLAY"}], "c\u0338": [{"c": "\u00a2", "n": "CENT SIGN"}, {"c": "\u023c", "n": "LATIN SMALL LETTER C WITH STROKE"}], "\u023c": [{"c": "c\u0338", "n": "LATIN SMALL LETTER C, COMBINING LONG SOLIDUS OVERLAY"}], "\u20a1": [{"c": "C\u20eb", "n": "LATIN CAPITAL LETTER C, COMBINING LONG DOUBLE SOLIDUS OVERLAY"}], "C\u20eb": [{"c": "\u20a1", "n": "COLON SIGN"}], "\u00e7": [{"c": "c\u0326", "n": "LATIN SMALL LETTER C, COMBINING COMMA BELOW"}], "c\u0326": [{"c": "\u00e7", "n": "LATIN SMALL LETTER C WITH CEDILLA"}, {"c": "\u04ab", "n": "CYRILLIC SMALL LETTER ES WITH DESCENDER"}], "\u04ab": [{"c": "c\u0326", "n": "LATIN SMALL LETTER C, COMBINING COMMA BELOW"}], "\u00c7": [{"c": "C\u0326", "n": "LATIN CAPITAL LETTER C, COMBINING COMMA BELOW"}], "C\u0326": [{"c": "\u00c7", "n": "LATIN CAPITAL LETTER C WITH CEDILLA"}, {"c": "\u04aa", "n": "CYRILLIC CAPITAL LETTER ES WITH DESCENDER"}], "\u04aa": [{"c": "C\u0326", "n": "LATIN CAPITAL LETTER C, COMBINING COMMA BELOW"}], "\u0187": [{"c": "C'", "n": "LATIN CAPITAL LETTER C, APOSTROPHE"}], "C'": [{"c": "\u0187", "n": "LATIN CAPITAL LETTER C WITH HOOK"}], "\u2105": [{"c": "c/o", "n": "LATIN SMALL LETTER C, SOLIDUS, LATIN SMALL LETTER O"}], "c/o": [{"c": "\u2105", "n": "CARE OF"}], "\u2106": [{"c": "c/u", "n": "LATIN SMALL LETTER C, SOLIDUS, LATIN SMALL LETTER U"}], "c/u": [{"c": "\u2106", "n": "CADA UNA"}], "\u22f4": [{"c": "\ua793", "n": "LATIN SMALL LETTER C WITH BAR"}], "\ua793": [{"c": "\u22f4", "n": "SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE"}, {"c": "\u025b", "n": "LATIN SMALL LETTER OPEN E"}, {"c": "\u03b5", "n": "GREEK SMALL LETTER EPSILON"}, {"c": "\u03f5", "n": "GREEK LUNATE EPSILON SYMBOL"}, {"c": "\ud835\udec6", "n": "MATHEMATICAL BOLD SMALL EPSILON"}, {"c": "\ud835\udedc", "n": "MATHEMATICAL BOLD EPSILON SYMBOL"}, {"c": "\ud835\udf00", "n": "MATHEMATICAL ITALIC SMALL EPSILON"}, {"c": "\ud835\udf16", "n": "MATHEMATICAL ITALIC EPSILON SYMBOL"}, {"c": "\ud835\udf3a", "n": "MATHEMATICAL BOLD ITALIC SMALL EPSILON"}, {"c": "\ud835\udf50", "n": "MATHEMATICAL BOLD ITALIC EPSILON SYMBOL"}, {"c": "\ud835\udf74", "n": "MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON"}, {"c": "\ud835\udf8a", "n": "MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL"}, {"c": "\ud835\udfae", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON"}, {"c": "\ud835\udfc4", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL"}, {"c": "\u2c89", "n": "COPTIC SMALL LETTER EIE"}, {"c": "\u0454", "n": "CYRILLIC SMALL LETTER UKRAINIAN IE"}, {"c": "\u0511", "n": "CYRILLIC SMALL LETTER REVERSED ZE"}, {"c": "\uab9b", "n": "CHEROKEE SMALL LETTER QUV"}, {"c": "\ud806\udcce", "n": "WARANG CITI SMALL LETTER YUJ"}, {"c": "\ud801\udc29", "n": "DESERET SMALL LETTER LONG E"}], "\u025b": [{"c": "\ua793", "n": "LATIN SMALL LETTER C WITH BAR"}], "\u03b5": [{"c": "\ua793", "n": "LATIN SMALL LETTER C WITH BAR"}], "\u03f5": [{"c": "\ua793", "n": "LATIN SMALL LETTER C WITH BAR"}], "\ud835\udec6": [{"c": "\ua793", "n": "LATIN SMALL LETTER C WITH BAR"}], "\ud835\udedc": [{"c": "\ua793", "n": "LATIN SMALL LETTER C WITH BAR"}], "\ud835\udf00": [{"c": "\ua793", "n": "LATIN SMALL LETTER C WITH BAR"}], "\ud835\udf16": [{"c": "\ua793", "n": "LATIN SMALL LETTER C WITH BAR"}], "\ud835\udf3a": [{"c": "\ua793", "n": "LATIN SMALL LETTER C WITH BAR"}], "\ud835\udf50": [{"c": "\ua793", "n": "LATIN SMALL LETTER C WITH BAR"}], "\ud835\udf74": [{"c": "\ua793", "n": "LATIN SMALL LETTER C WITH BAR"}], "\ud835\udf8a": [{"c": "\ua793", "n": "LATIN SMALL LETTER C WITH BAR"}], "\ud835\udfae": [{"c": "\ua793", "n": "LATIN SMALL LETTER C WITH BAR"}], "\ud835\udfc4": [{"c": "\ua793", "n": "LATIN SMALL LETTER C WITH BAR"}], "\u2c89": [{"c": "\ua793", "n": "LATIN SMALL LETTER C WITH BAR"}], "\u0454": [{"c": "\ua793", "n": "LATIN SMALL LETTER C WITH BAR"}], "\u0511": [{"c": "\ua793", "n": "LATIN SMALL LETTER C WITH BAR"}], "\uab9b": [{"c": "\ua793", "n": "LATIN SMALL LETTER C WITH BAR"}], "\ud806\udcce": [{"c": "\ua793", "n": "LATIN SMALL LETTER C WITH BAR"}], "\ud801\udc29": [{"c": "\ua793", "n": "LATIN SMALL LETTER C WITH BAR"}], "\u20ac": [{"c": "\ua792", "n": "LATIN CAPITAL LETTER C WITH BAR"}], "\ua792": [{"c": "\u20ac", "n": "EURO SIGN"}, {"c": "\u2c88", "n": "COPTIC CAPITAL LETTER EIE"}, {"c": "\u0404", "n": "CYRILLIC CAPITAL LETTER UKRAINIAN IE"}], "\u2c88": [{"c": "\ua792", "n": "LATIN CAPITAL LETTER C WITH BAR"}], "\u0404": [{"c": "\ua792", "n": "LATIN CAPITAL LETTER C WITH BAR"}], "\u2377": [{"c": "\ua793\u0332", "n": "LATIN SMALL LETTER C WITH BAR, COMBINING LOW LINE"}], "\ua793\u0332": [{"c": "\u2377", "n": "APL FUNCTIONAL SYMBOL EPSILON UNDERBAR"}], "\u037d": [{"c": "\ua73f", "n": "LATIN SMALL LETTER REVERSED C WITH DOT"}], "\ua73f": [{"c": "\u037d", "n": "GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL"}], "\u03ff": [{"c": "\ua73e", "n": "LATIN CAPITAL LETTER REVERSED C WITH DOT"}], "\ua73e": [{"c": "\u03ff", "n": "GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL"}], "\u217e": [{"c": "d", "n": "LATIN SMALL LETTER D"}], "d": [{"c": "\u217e", "n": "SMALL ROMAN NUMERAL FIVE HUNDRED"}, {"c": "\u2146", "n": "DOUBLE-STRUCK ITALIC SMALL D"}, {"c": "\ud835\udc1d", "n": "MATHEMATICAL BOLD SMALL D"}, {"c": "\ud835\udc51", "n": "MATHEMATICAL ITALIC SMALL D"}, {"c": "\ud835\udc85", "n": "MATHEMATICAL BOLD ITALIC SMALL D"}, {"c": "\ud835\udcb9", "n": "MATHEMATICAL SCRIPT SMALL D"}, {"c": "\ud835\udced", "n": "MATHEMATICAL BOLD SCRIPT SMALL D"}, {"c": "\ud835\udd21", "n": "MATHEMATICAL FRAKTUR SMALL D"}, {"c": "\ud835\udd55", "n": "MATHEMATICAL DOUBLE-STRUCK SMALL D"}, {"c": "\ud835\udd89", "n": "MATHEMATICAL BOLD FRAKTUR SMALL D"}, {"c": "\ud835\uddbd", "n": "MATHEMATICAL SANS-SERIF SMALL D"}, {"c": "\ud835\uddf1", "n": "MATHEMATICAL SANS-SERIF BOLD SMALL D"}, {"c": "\ud835\ude25", "n": "MATHEMATICAL SANS-SERIF ITALIC SMALL D"}, {"c": "\ud835\ude59", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D"}, {"c": "\ud835\ude8d", "n": "MATHEMATICAL MONOSPACE SMALL D"}, {"c": "\u0501", "n": "CYRILLIC SMALL LETTER KOMI DE"}, {"c": "\u13e7", "n": "CHEROKEE LETTER TSU"}, {"c": "\u146f", "n": "CANADIAN SYLLABICS KO"}, {"c": "\ua4d2", "n": "LISU LETTER PHA"}], "\u2146": [{"c": "d", "n": "LATIN SMALL LETTER D"}], "\ud835\udc1d": [{"c": "d", "n": "LATIN SMALL LETTER D"}], "\ud835\udc51": [{"c": "d", "n": "LATIN SMALL LETTER D"}], "\ud835\udc85": [{"c": "d", "n": "LATIN SMALL LETTER D"}], "\ud835\udcb9": [{"c": "d", "n": "LATIN SMALL LETTER D"}], "\ud835\udced": [{"c": "d", "n": "LATIN SMALL LETTER D"}], "\ud835\udd21": [{"c": "d", "n": "LATIN SMALL LETTER D"}], "\ud835\udd55": [{"c": "d", "n": "LATIN SMALL LETTER D"}], "\ud835\udd89": [{"c": "d", "n": "LATIN SMALL LETTER D"}], "\ud835\uddbd": [{"c": "d", "n": "LATIN SMALL LETTER D"}], "\ud835\uddf1": [{"c": "d", "n": "LATIN SMALL LETTER D"}], "\ud835\ude25": [{"c": "d", "n": "LATIN SMALL LETTER D"}], "\ud835\ude59": [{"c": "d", "n": "LATIN SMALL LETTER D"}], "\ud835\ude8d": [{"c": "d", "n": "LATIN SMALL LETTER D"}], "\u0501": [{"c": "d", "n": "LATIN SMALL LETTER D"}], "\u13e7": [{"c": "d", "n": "LATIN SMALL LETTER D"}], "\u146f": [{"c": "d", "n": "LATIN SMALL LETTER D"}], "\ua4d2": [{"c": "d", "n": "LATIN SMALL LETTER D"}], "\u216e": [{"c": "D", "n": "LATIN CAPITAL LETTER D"}], "D": [{"c": "\u216e", "n": "ROMAN NUMERAL FIVE HUNDRED"}, {"c": "\u2145", "n": "DOUBLE-STRUCK ITALIC CAPITAL D"}, {"c": "\ud835\udc03", "n": "MATHEMATICAL BOLD CAPITAL D"}, {"c": "\ud835\udc37", "n": "MATHEMATICAL ITALIC CAPITAL D"}, {"c": "\ud835\udc6b", "n": "MATHEMATICAL BOLD ITALIC CAPITAL D"}, {"c": "\ud835\udc9f", "n": "MATHEMATICAL SCRIPT CAPITAL D"}, {"c": "\ud835\udcd3", "n": "MATHEMATICAL BOLD SCRIPT CAPITAL D"}, {"c": "\ud835\udd07", "n": "MATHEMATICAL FRAKTUR CAPITAL D"}, {"c": "\ud835\udd3b", "n": "MATHEMATICAL DOUBLE-STRUCK CAPITAL D"}, {"c": "\ud835\udd6f", "n": "MATHEMATICAL BOLD FRAKTUR CAPITAL D"}, {"c": "\ud835\udda3", "n": "MATHEMATICAL SANS-SERIF CAPITAL D"}, {"c": "\ud835\uddd7", "n": "MATHEMATICAL SANS-SERIF BOLD CAPITAL D"}, {"c": "\ud835\ude0b", "n": "MATHEMATICAL SANS-SERIF ITALIC CAPITAL D"}, {"c": "\ud835\ude3f", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D"}, {"c": "\ud835\ude73", "n": "MATHEMATICAL MONOSPACE CAPITAL D"}, {"c": "\u13a0", "n": "CHEROKEE LETTER A"}, {"c": "\u15de", "n": "CANADIAN SYLLABICS CARRIER THE"}, {"c": "\u15ea", "n": "CANADIAN SYLLABICS CARRIER PE"}, {"c": "\ua4d3", "n": "LISU LETTER DA"}], "\u2145": [{"c": "D", "n": "LATIN CAPITAL LETTER D"}], "\ud835\udc03": [{"c": "D", "n": "LATIN CAPITAL LETTER D"}], "\ud835\udc37": [{"c": "D", "n": "LATIN CAPITAL LETTER D"}], "\ud835\udc6b": [{"c": "D", "n": "LATIN CAPITAL LETTER D"}], "\ud835\udc9f": [{"c": "D", "n": "LATIN CAPITAL LETTER D"}], "\ud835\udcd3": [{"c": "D", "n": "LATIN CAPITAL LETTER D"}], "\ud835\udd07": [{"c": "D", "n": "LATIN CAPITAL LETTER D"}], "\ud835\udd3b": [{"c": "D", "n": "LATIN CAPITAL LETTER D"}], "\ud835\udd6f": [{"c": "D", "n": "LATIN CAPITAL LETTER D"}], "\ud835\udda3": [{"c": "D", "n": "LATIN CAPITAL LETTER D"}], "\ud835\uddd7": [{"c": "D", "n": "LATIN CAPITAL LETTER D"}], "\ud835\ude0b": [{"c": "D", "n": "LATIN CAPITAL LETTER D"}], "\ud835\ude3f": [{"c": "D", "n": "LATIN CAPITAL LETTER D"}], "\ud835\ude73": [{"c": "D", "n": "LATIN CAPITAL LETTER D"}], "\u13a0": [{"c": "D", "n": "LATIN CAPITAL LETTER D"}], "\u15de": [{"c": "D", "n": "LATIN CAPITAL LETTER D"}], "\u15ea": [{"c": "D", "n": "LATIN CAPITAL LETTER D"}], "\ua4d3": [{"c": "D", "n": "LATIN CAPITAL LETTER D"}], "\u0257": [{"c": "d\u0314", "n": "LATIN SMALL LETTER D, COMBINING REVERSED COMMA ABOVE"}], "d\u0314": [{"c": "\u0257", "n": "LATIN SMALL LETTER D WITH HOOK"}], "\u0256": [{"c": "d\u0328", "n": "LATIN SMALL LETTER D, COMBINING OGONEK"}], "d\u0328": [{"c": "\u0256", "n": "LATIN SMALL LETTER D WITH TAIL"}], "\u018c": [{"c": "d\u0304", "n": "LATIN SMALL LETTER D, COMBINING MACRON"}], "d\u0304": [{"c": "\u018c", "n": "LATIN SMALL LETTER D WITH TOPBAR"}], "\u0111": [{"c": "d\u0335", "n": "LATIN SMALL LETTER D, COMBINING SHORT STROKE OVERLAY"}], "d\u0335": [{"c": "\u0111", "n": "LATIN SMALL LETTER D WITH STROKE"}], "\u0110": [{"c": "D\u0335", "n": "LATIN CAPITAL LETTER D, COMBINING SHORT STROKE OVERLAY"}], "D\u0335": [{"c": "\u0110", "n": "LATIN CAPITAL LETTER D WITH STROKE"}, {"c": "\u00d0", "n": "LATIN CAPITAL LETTER ETH"}, {"c": "\u0189", "n": "LATIN CAPITAL LETTER AFRICAN D"}], "\u00d0": [{"c": "D\u0335", "n": "LATIN CAPITAL LETTER D, COMBINING SHORT STROKE OVERLAY"}], "\u0189": [{"c": "D\u0335", "n": "LATIN CAPITAL LETTER D, COMBINING SHORT STROKE OVERLAY"}], "\u20ab": [{"c": "d\u0335\u0331", "n": "LATIN SMALL LETTER D, COMBINING SHORT STROKE OVERLAY, COMBINING MACRON BELOW"}], "d\u0335\u0331": [{"c": "\u20ab", "n": "DONG SIGN"}], "\ua77a": [{"c": "\ua779", "n": "LATIN CAPITAL LETTER INSULAR D"}], "\ua779": [{"c": "\ua77a", "n": "LATIN SMALL LETTER INSULAR D"}], "\u147b": [{"c": "d\u00b7", "n": "LATIN SMALL LETTER D, MIDDLE DOT"}], "d\u00b7": [{"c": "\u147b", "n": "CANADIAN SYLLABICS WEST-CREE KWO"}], "\u1487": [{"c": "d'", "n": "LATIN SMALL LETTER D, APOSTROPHE"}], "d'": [{"c": "\u1487", "n": "CANADIAN SYLLABICS SOUTH-SLAVEY KOH"}], "\u02a4": [{"c": "d\u021d", "n": "LATIN SMALL LETTER D, LATIN SMALL LETTER YOGH"}], "d\u021d": [{"c": "\u02a4", "n": "LATIN SMALL LETTER DEZH DIGRAPH"}], "\u01f3": [{"c": "dz", "n": "LATIN SMALL LETTER D, LATIN SMALL LETTER Z"}], "dz": [{"c": "\u01f3", "n": "LATIN SMALL LETTER DZ"}, {"c": "\u02a3", "n": "LATIN SMALL LETTER DZ DIGRAPH"}], "\u02a3": [{"c": "dz", "n": "LATIN SMALL LETTER D, LATIN SMALL LETTER Z"}], "\u01f2": [{"c": "Dz", "n": "LATIN CAPITAL LETTER D, LATIN SMALL LETTER Z"}], "Dz": [{"c": "\u01f2", "n": "LATIN CAPITAL LETTER D WITH SMALL LETTER Z"}], "\u01f1": [{"c": "DZ", "n": "LATIN CAPITAL LETTER D, LATIN CAPITAL LETTER Z"}], "DZ": [{"c": "\u01f1", "n": "LATIN CAPITAL LETTER DZ"}], "\u01c6": [{"c": "d\u017e", "n": "LATIN SMALL LETTER D, LATIN SMALL LETTER Z WITH CARON"}], "d\u017e": [{"c": "\u01c6", "n": "LATIN SMALL LETTER DZ WITH CARON"}], "\u01c5": [{"c": "D\u017e", "n": "LATIN CAPITAL LETTER D, LATIN SMALL LETTER Z WITH CARON"}], "D\u017e": [{"c": "\u01c5", "n": "LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON"}], "\u01c4": [{"c": "D\u017d", "n": "LATIN CAPITAL LETTER D, LATIN CAPITAL LETTER Z WITH CARON"}], "D\u017d": [{"c": "\u01c4", "n": "LATIN CAPITAL LETTER DZ WITH CARON"}], "\u02a5": [{"c": "d\u0291", "n": "LATIN SMALL LETTER D, LATIN SMALL LETTER Z WITH CURL"}], "d\u0291": [{"c": "\u02a5", "n": "LATIN SMALL LETTER DZ DIGRAPH WITH CURL"}], "\uab70": [{"c": "\u1d05", "n": "LATIN LETTER SMALL CAPITAL D"}], "\u1d05": [{"c": "\uab70", "n": "CHEROKEE SMALL LETTER A"}], "\u2e39": [{"c": "\u1e9f", "n": "LATIN SMALL LETTER DELTA"}], "\u1e9f": [{"c": "\u2e39", "n": "TOP HALF SECTION SIGN"}, {"c": "\u03b4", "n": "GREEK SMALL LETTER DELTA"}, {"c": "\ud835\udec5", "n": "MATHEMATICAL BOLD SMALL DELTA"}, {"c": "\ud835\udeff", "n": "MATHEMATICAL ITALIC SMALL DELTA"}, {"c": "\ud835\udf39", "n": "MATHEMATICAL BOLD ITALIC SMALL DELTA"}, {"c": "\ud835\udf73", "n": "MATHEMATICAL SANS-SERIF BOLD SMALL DELTA"}, {"c": "\ud835\udfad", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA"}, {"c": "\u056e", "n": "ARMENIAN SMALL LETTER CA"}, {"c": "\u1577", "n": "CANADIAN SYLLABICS NUNAVIK HO"}], "\u03b4": [{"c": "\u1e9f", "n": "LATIN SMALL LETTER DELTA"}], "\ud835\udec5": [{"c": "\u1e9f", "n": "LATIN SMALL LETTER DELTA"}], "\ud835\udeff": [{"c": "\u1e9f", "n": "LATIN SMALL LETTER DELTA"}], "\ud835\udf39": [{"c": "\u1e9f", "n": "LATIN SMALL LETTER DELTA"}], "\ud835\udf73": [{"c": "\u1e9f", "n": "LATIN SMALL LETTER DELTA"}], "\ud835\udfad": [{"c": "\u1e9f", "n": "LATIN SMALL LETTER DELTA"}], "\u056e": [{"c": "\u1e9f", "n": "LATIN SMALL LETTER DELTA"}], "\u1577": [{"c": "\u1e9f", "n": "LATIN SMALL LETTER DELTA"}], "\u212e": [{"c": "e", "n": "LATIN SMALL LETTER E"}], "e": [{"c": "\u212e", "n": "ESTIMATED SYMBOL"}, {"c": "\uff45", "n": "FULLWIDTH LATIN SMALL LETTER E"}, {"c": "\u212f", "n": "SCRIPT SMALL E"}, {"c": "\u2147", "n": "DOUBLE-STRUCK ITALIC SMALL E"}, {"c": "\ud835\udc1e", "n": "MATHEMATICAL BOLD SMALL E"}, {"c": "\ud835\udc52", "n": "MATHEMATICAL ITALIC SMALL E"}, {"c": "\ud835\udc86", "n": "MATHEMATICAL BOLD ITALIC SMALL E"}, {"c": "\ud835\udcee", "n": "MATHEMATICAL BOLD SCRIPT SMALL E"}, {"c": "\ud835\udd22", "n": "MATHEMATICAL FRAKTUR SMALL E"}, {"c": "\ud835\udd56", "n": "MATHEMATICAL DOUBLE-STRUCK SMALL E"}, {"c": "\ud835\udd8a", "n": "MATHEMATICAL BOLD FRAKTUR SMALL E"}, {"c": "\ud835\uddbe", "n": "MATHEMATICAL SANS-SERIF SMALL E"}, {"c": "\ud835\uddf2", "n": "MATHEMATICAL SANS-SERIF BOLD SMALL E"}, {"c": "\ud835\ude26", "n": "MATHEMATICAL SANS-SERIF ITALIC SMALL E"}, {"c": "\ud835\ude5a", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E"}, {"c": "\ud835\ude8e", "n": "MATHEMATICAL MONOSPACE SMALL E"}, {"c": "\uab32", "n": "LATIN SMALL LETTER BLACKLETTER E"}, {"c": "\u0435", "n": "CYRILLIC SMALL LETTER IE"}, {"c": "\u04bd", "n": "CYRILLIC SMALL LETTER ABKHASIAN CHE"}], "\uff45": [{"c": "e", "n": "LATIN SMALL LETTER E"}], "\u212f": [{"c": "e", "n": "LATIN SMALL LETTER E"}], "\u2147": [{"c": "e", "n": "LATIN SMALL LETTER E"}], "\ud835\udc1e": [{"c": "e", "n": "LATIN SMALL LETTER E"}], "\ud835\udc52": [{"c": "e", "n": "LATIN SMALL LETTER E"}], "\ud835\udc86": [{"c": "e", "n": "LATIN SMALL LETTER E"}], "\ud835\udcee": [{"c": "e", "n": "LATIN SMALL LETTER E"}], "\ud835\udd22": [{"c": "e", "n": "LATIN SMALL LETTER E"}], "\ud835\udd56": [{"c": "e", "n": "LATIN SMALL LETTER E"}], "\ud835\udd8a": [{"c": "e", "n": "LATIN SMALL LETTER E"}], "\ud835\uddbe": [{"c": "e", "n": "LATIN SMALL LETTER E"}], "\ud835\uddf2": [{"c": "e", "n": "LATIN SMALL LETTER E"}], "\ud835\ude26": [{"c": "e", "n": "LATIN SMALL LETTER E"}], "\ud835\ude5a": [{"c": "e", "n": "LATIN SMALL LETTER E"}], "\ud835\ude8e": [{"c": "e", "n": "LATIN SMALL LETTER E"}], "\uab32": [{"c": "e", "n": "LATIN SMALL LETTER E"}], "\u0435": [{"c": "e", "n": "LATIN SMALL LETTER E"}], "\u04bd": [{"c": "e", "n": "LATIN SMALL LETTER E"}], "\u2df7": [{"c": "\u0364", "n": "COMBINING LATIN SMALL LETTER E"}], "\u0364": [{"c": "\u2df7", "n": "COMBINING CYRILLIC LETTER IE"}], "\u22ff": [{"c": "E", "n": "LATIN CAPITAL LETTER E"}], "E": [{"c": "\u22ff", "n": "Z NOTATION BAG MEMBERSHIP"}, {"c": "\uff25", "n": "FULLWIDTH LATIN CAPITAL LETTER E"}, {"c": "\u2130", "n": "SCRIPT CAPITAL E"}, {"c": "\ud835\udc04", "n": "MATHEMATICAL BOLD CAPITAL E"}, {"c": "\ud835\udc38", "n": "MATHEMATICAL ITALIC CAPITAL E"}, {"c": "\ud835\udc6c", "n": "MATHEMATICAL BOLD ITALIC CAPITAL E"}, {"c": "\ud835\udcd4", "n": "MATHEMATICAL BOLD SCRIPT CAPITAL E"}, {"c": "\ud835\udd08", "n": "MATHEMATICAL FRAKTUR CAPITAL E"}, {"c": "\ud835\udd3c", "n": "MATHEMATICAL DOUBLE-STRUCK CAPITAL E"}, {"c": "\ud835\udd70", "n": "MATHEMATICAL BOLD FRAKTUR CAPITAL E"}, {"c": "\ud835\udda4", "n": "MATHEMATICAL SANS-SERIF CAPITAL E"}, {"c": "\ud835\uddd8", "n": "MATHEMATICAL SANS-SERIF BOLD CAPITAL E"}, {"c": "\ud835\ude0c", "n": "MATHEMATICAL SANS-SERIF ITALIC CAPITAL E"}, {"c": "\ud835\ude40", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E"}, {"c": "\ud835\ude74", "n": "MATHEMATICAL MONOSPACE CAPITAL E"}, {"c": "\u0395", "n": "GREEK CAPITAL LETTER EPSILON"}, {"c": "\ud835\udeac", "n": "MATHEMATICAL BOLD CAPITAL EPSILON"}, {"c": "\ud835\udee6", "n": "MATHEMATICAL ITALIC CAPITAL EPSILON"}, {"c": "\ud835\udf20", "n": "MATHEMATICAL BOLD ITALIC CAPITAL EPSILON"}, {"c": "\ud835\udf5a", "n": "MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON"}, {"c": "\ud835\udf94", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON"}, {"c": "\u0415", "n": "CYRILLIC CAPITAL LETTER IE"}, {"c": "\u2d39", "n": "TIFINAGH LETTER YADD"}, {"c": "\u13ac", "n": "CHEROKEE LETTER GV"}, {"c": "\ua4f0", "n": "LISU LETTER E"}, {"c": "\ud806\udca6", "n": "WARANG CITI CAPITAL LETTER II"}, {"c": "\ud806\udcae", "n": "WARANG CITI CAPITAL LETTER YUJ"}, {"c": "\ud800\ude86", "n": "LYCIAN LETTER I"}], "\uff25": [{"c": "E", "n": "LATIN CAPITAL LETTER E"}], "\u2130": [{"c": "E", "n": "LATIN CAPITAL LETTER E"}], "\ud835\udc04": [{"c": "E", "n": "LATIN CAPITAL LETTER E"}], "\ud835\udc38": [{"c": "E", "n": "LATIN CAPITAL LETTER E"}], "\ud835\udc6c": [{"c": "E", "n": "LATIN CAPITAL LETTER E"}], "\ud835\udcd4": [{"c": "E", "n": "LATIN CAPITAL LETTER E"}], "\ud835\udd08": [{"c": "E", "n": "LATIN CAPITAL LETTER E"}], "\ud835\udd3c": [{"c": "E", "n": "LATIN CAPITAL LETTER E"}], "\ud835\udd70": [{"c": "E", "n": "LATIN CAPITAL LETTER E"}], "\ud835\udda4": [{"c": "E", "n": "LATIN CAPITAL LETTER E"}], "\ud835\uddd8": [{"c": "E", "n": "LATIN CAPITAL LETTER E"}], "\ud835\ude0c": [{"c": "E", "n": "LATIN CAPITAL LETTER E"}], "\ud835\ude40": [{"c": "E", "n": "LATIN CAPITAL LETTER E"}], "\ud835\ude74": [{"c": "E", "n": "LATIN CAPITAL LETTER E"}], "\u0395": [{"c": "E", "n": "LATIN CAPITAL LETTER E"}], "\ud835\udeac": [{"c": "E", "n": "LATIN CAPITAL LETTER E"}], "\ud835\udee6": [{"c": "E", "n": "LATIN CAPITAL LETTER E"}], "\ud835\udf20": [{"c": "E", "n": "LATIN CAPITAL LETTER E"}], "\ud835\udf5a": [{"c": "E", "n": "LATIN CAPITAL LETTER E"}], "\ud835\udf94": [{"c": "E", "n": "LATIN CAPITAL LETTER E"}], "\u0415": [{"c": "E", "n": "LATIN CAPITAL LETTER E"}], "\u2d39": [{"c": "E", "n": "LATIN CAPITAL LETTER E"}], "\u13ac": [{"c": "E", "n": "LATIN CAPITAL LETTER E"}], "\ua4f0": [{"c": "E", "n": "LATIN CAPITAL LETTER E"}], "\ud806\udca6": [{"c": "E", "n": "LATIN CAPITAL LETTER E"}], "\ud806\udcae": [{"c": "E", "n": "LATIN CAPITAL LETTER E"}], "\ud800\ude86": [{"c": "E", "n": "LATIN CAPITAL LETTER E"}], "\u011b": [{"c": "\u0115", "n": "LATIN SMALL LETTER E WITH BREVE"}], "\u0115": [{"c": "\u011b", "n": "LATIN SMALL LETTER E WITH CARON"}], "\u011a": [{"c": "\u0114", "n": "LATIN CAPITAL LETTER E WITH BREVE"}], "\u0114": [{"c": "\u011a", "n": "LATIN CAPITAL LETTER E WITH CARON"}], "\u0247": [{"c": "e\u0338", "n": "LATIN SMALL LETTER E, COMBINING LONG SOLIDUS OVERLAY"}], "e\u0338": [{"c": "\u0247", "n": "LATIN SMALL LETTER E WITH STROKE"}], "\u0246": [{"c": "E\u0338", "n": "LATIN CAPITAL LETTER E, COMBINING LONG SOLIDUS OVERLAY"}], "E\u0338": [{"c": "\u0246", "n": "LATIN CAPITAL LETTER E WITH STROKE"}], "\u04bf": [{"c": "e\u0328", "n": "LATIN SMALL LETTER E, COMBINING OGONEK"}], "e\u0328": [{"c": "\u04bf", "n": "CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER"}], "\uab7c": [{"c": "\u1d07", "n": "LATIN LETTER SMALL CAPITAL E"}], "\u1d07": [{"c": "\uab7c", "n": "CHEROKEE SMALL LETTER GV"}], "\u0259": [{"c": "\u01dd", "n": "LATIN SMALL LETTER TURNED E"}], "\u01dd": [{"c": "\u0259", "n": "LATIN SMALL LETTER SCHWA"}, {"c": "\u04d9", "n": "CYRILLIC SMALL LETTER SCHWA"}], "\u04d9": [{"c": "\u01dd", "n": "LATIN SMALL LETTER TURNED E"}], "\u2203": [{"c": "\u018e", "n": "LATIN CAPITAL LETTER REVERSED E"}], "\u018e": [{"c": "\u2203", "n": "THERE EXISTS"}, {"c": "\u2d3a", "n": "TIFINAGH LETTER YADDH"}, {"c": "\ua4f1", "n": "LISU LETTER EU"}], "\u2d3a": [{"c": "\u018e", "n": "LATIN CAPITAL LETTER REVERSED E"}], "\ua4f1": [{"c": "\u018e", "n": "LATIN CAPITAL LETTER REVERSED E"}], "\u025a": [{"c": "\u01dd\u02de", "n": "LATIN SMALL LETTER TURNED E, MODIFIER LETTER RHOTIC HOOK"}], "\u01dd\u02de": [{"c": "\u025a", "n": "LATIN SMALL LETTER SCHWA WITH HOOK"}], "\u1d14": [{"c": "\u01ddo", "n": "LATIN SMALL LETTER TURNED E, LATIN SMALL LETTER O"}], "\u01ddo": [{"c": "\u1d14", "n": "LATIN SMALL LETTER TURNED OE"}], "\uab41": [{"c": "\u01ddo\u0338", "n": "LATIN SMALL LETTER TURNED E, LATIN SMALL LETTER O, COMBINING LONG SOLIDUS OVERLAY"}], "\u01ddo\u0338": [{"c": "\uab41", "n": "LATIN SMALL LETTER TURNED OE WITH STROKE"}], "\uab42": [{"c": "\u01ddo\u0335", "n": "LATIN SMALL LETTER TURNED E, LATIN SMALL LETTER O, COMBINING SHORT STROKE OVERLAY"}], "\u01ddo\u0335": [{"c": "\uab42", "n": "LATIN SMALL LETTER TURNED OE WITH HORIZONTAL STROKE"}], "\u04d8": [{"c": "\u018f", "n": "LATIN CAPITAL LETTER SCHWA"}], "\u018f": [{"c": "\u04d8", "n": "CYRILLIC CAPITAL LETTER SCHWA"}], "\ud834\ude21": [{"c": "\u0190", "n": "LATIN CAPITAL LETTER OPEN E"}], "\u0190": [{"c": "\ud834\ude21", "n": "GREEK INSTRUMENTAL NOTATION SYMBOL-7"}, {"c": "\u2107", "n": "EULER CONSTANT"}, {"c": "\u0510", "n": "CYRILLIC CAPITAL LETTER REVERSED ZE"}, {"c": "\u13cb", "n": "CHEROKEE LETTER QUV"}, {"c": "\ud81b\udf2d", "n": "MIAO LETTER NYHA"}, {"c": "\ud801\udc01", "n": "DESERET CAPITAL LETTER LONG E"}], "\u2107": [{"c": "\u0190", "n": "LATIN CAPITAL LETTER OPEN E"}], "\u0510": [{"c": "\u0190", "n": "LATIN CAPITAL LETTER OPEN E"}], "\u13cb": [{"c": "\u0190", "n": "LATIN CAPITAL LETTER OPEN E"}], "\ud81b\udf2d": [{"c": "\u0190", "n": "LATIN CAPITAL LETTER OPEN E"}], "\ud801\udc01": [{"c": "\u0190", "n": "LATIN CAPITAL LETTER OPEN E"}], "\u1d9f": [{"c": "\u1d4b", "n": "MODIFIER LETTER SMALL OPEN E"}], "\u1d4b": [{"c": "\u1d9f", "n": "MODIFIER LETTER SMALL REVERSED OPEN E"}], "\u1d08": [{"c": "\u025c", "n": "LATIN SMALL LETTER REVERSED OPEN E"}], "\u025c": [{"c": "\u1d08", "n": "LATIN SMALL LETTER TURNED OPEN E"}, {"c": "\u0437", "n": "CYRILLIC SMALL LETTER ZE"}], "\u0437": [{"c": "\u025c", "n": "LATIN SMALL LETTER REVERSED OPEN E"}], "\u0499": [{"c": "\u025c\u0326", "n": "LATIN SMALL LETTER REVERSED OPEN E, COMBINING COMMA BELOW"}], "\u025c\u0326": [{"c": "\u0499", "n": "CYRILLIC SMALL LETTER ZE WITH DESCENDER"}], "\ud801\udc42": [{"c": "\u025e", "n": "LATIN SMALL LETTER CLOSED REVERSED OPEN E"}], "\u025e": [{"c": "\ud801\udc42", "n": "DESERET SMALL LETTER VEE"}], "\ua79d": [{"c": "\u029a", "n": "LATIN SMALL LETTER CLOSED OPEN E"}], "\u029a": [{"c": "\ua79d", "n": "LATIN SMALL LETTER VOLAPUK OE"}, {"c": "\ud801\udc2a", "n": "DESERET SMALL LETTER LONG A"}], "\ud801\udc2a": [{"c": "\u029a", "n": "LATIN SMALL LETTER CLOSED OPEN E"}], "\ud835\udc1f": [{"c": "f", "n": "LATIN SMALL LETTER F"}], "f": [{"c": "\ud835\udc1f", "n": "MATHEMATICAL BOLD SMALL F"}, {"c": "\ud835\udc53", "n": "MATHEMATICAL ITALIC SMALL F"}, {"c": "\ud835\udc87", "n": "MATHEMATICAL BOLD ITALIC SMALL F"}, {"c": "\ud835\udcbb", "n": "MATHEMATICAL SCRIPT SMALL F"}, {"c": "\ud835\udcef", "n": "MATHEMATICAL BOLD SCRIPT SMALL F"}, {"c": "\ud835\udd23", "n": "MATHEMATICAL FRAKTUR SMALL F"}, {"c": "\ud835\udd57", "n": "MATHEMATICAL DOUBLE-STRUCK SMALL F"}, {"c": "\ud835\udd8b", "n": "MATHEMATICAL BOLD FRAKTUR SMALL F"}, {"c": "\ud835\uddbf", "n": "MATHEMATICAL SANS-SERIF SMALL F"}, {"c": "\ud835\uddf3", "n": "MATHEMATICAL SANS-SERIF BOLD SMALL F"}, {"c": "\ud835\ude27", "n": "MATHEMATICAL SANS-SERIF ITALIC SMALL F"}, {"c": "\ud835\ude5b", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F"}, {"c": "\ud835\ude8f", "n": "MATHEMATICAL MONOSPACE SMALL F"}, {"c": "\uab35", "n": "LATIN SMALL LETTER LENIS F"}, {"c": "\ua799", "n": "LATIN SMALL LETTER F WITH STROKE"}, {"c": "\u017f", "n": "LATIN SMALL LETTER LONG S"}, {"c": "\u1e9d", "n": "LATIN SMALL LETTER LONG S WITH HIGH STROKE"}, {"c": "\u0584", "n": "ARMENIAN SMALL LETTER KEH"}], "\ud835\udc53": [{"c": "f", "n": "LATIN SMALL LETTER F"}], "\ud835\udc87": [{"c": "f", "n": "LATIN SMALL LETTER F"}], "\ud835\udcbb": [{"c": "f", "n": "LATIN SMALL LETTER F"}], "\ud835\udcef": [{"c": "f", "n": "LATIN SMALL LETTER F"}], "\ud835\udd23": [{"c": "f", "n": "LATIN SMALL LETTER F"}], "\ud835\udd57": [{"c": "f", "n": "LATIN SMALL LETTER F"}], "\ud835\udd8b": [{"c": "f", "n": "LATIN SMALL LETTER F"}], "\ud835\uddbf": [{"c": "f", "n": "LATIN SMALL LETTER F"}], "\ud835\uddf3": [{"c": "f", "n": "LATIN SMALL LETTER F"}], "\ud835\ude27": [{"c": "f", "n": "LATIN SMALL LETTER F"}], "\ud835\ude5b": [{"c": "f", "n": "LATIN SMALL LETTER F"}], "\ud835\ude8f": [{"c": "f", "n": "LATIN SMALL LETTER F"}], "\uab35": [{"c": "f", "n": "LATIN SMALL LETTER F"}], "\ua799": [{"c": "f", "n": "LATIN SMALL LETTER F"}], "\u017f": [{"c": "f", "n": "LATIN SMALL LETTER F"}], "\u1e9d": [{"c": "f", "n": "LATIN SMALL LETTER F"}], "\u0584": [{"c": "f", "n": "LATIN SMALL LETTER F"}], "\ud834\ude13": [{"c": "F", "n": "LATIN CAPITAL LETTER F"}], "F": [{"c": "\ud834\ude13", "n": "GREEK VOCAL NOTATION SYMBOL-20"}, {"c": "\u2131", "n": "SCRIPT CAPITAL F"}, {"c": "\ud835\udc05", "n": "MATHEMATICAL BOLD CAPITAL F"}, {"c": "\ud835\udc39", "n": "MATHEMATICAL ITALIC CAPITAL F"}, {"c": "\ud835\udc6d", "n": "MATHEMATICAL BOLD ITALIC CAPITAL F"}, {"c": "\ud835\udcd5", "n": "MATHEMATICAL BOLD SCRIPT CAPITAL F"}, {"c": "\ud835\udd09", "n": "MATHEMATICAL FRAKTUR CAPITAL F"}, {"c": "\ud835\udd3d", "n": "MATHEMATICAL DOUBLE-STRUCK CAPITAL F"}, {"c": "\ud835\udd71", "n": "MATHEMATICAL BOLD FRAKTUR CAPITAL F"}, {"c": "\ud835\udda5", "n": "MATHEMATICAL SANS-SERIF CAPITAL F"}, {"c": "\ud835\uddd9", "n": "MATHEMATICAL SANS-SERIF BOLD CAPITAL F"}, {"c": "\ud835\ude0d", "n": "MATHEMATICAL SANS-SERIF ITALIC CAPITAL F"}, {"c": "\ud835\ude41", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F"}, {"c": "\ud835\ude75", "n": "MATHEMATICAL MONOSPACE CAPITAL F"}, {"c": "\ua798", "n": "LATIN CAPITAL LETTER F WITH STROKE"}, {"c": "\u03dc", "n": "GREEK LETTER DIGAMMA"}, {"c": "\ud835\udfca", "n": "MATHEMATICAL BOLD CAPITAL DIGAMMA"}, {"c": "\u15b4", "n": "CANADIAN SYLLABICS BLACKFOOT WE"}, {"c": "\ua4dd", "n": "LISU LETTER TSA"}, {"c": "\ud806\udcc2", "n": "WARANG CITI SMALL LETTER WI"}, {"c": "\ud806\udca2", "n": "WARANG CITI CAPITAL LETTER WI"}, {"c": "\ud800\ude87", "n": "LYCIAN LETTER W"}, {"c": "\ud800\udea5", "n": "CARIAN LETTER R"}, {"c": "\ud801\udd25", "n": "ELBASAN LETTER GHE"}], "\u2131": [{"c": "F", "n": "LATIN CAPITAL LETTER F"}], "\ud835\udc05": [{"c": "F", "n": "LATIN CAPITAL LETTER F"}], "\ud835\udc39": [{"c": "F", "n": "LATIN CAPITAL LETTER F"}], "\ud835\udc6d": [{"c": "F", "n": "LATIN CAPITAL LETTER F"}], "\ud835\udcd5": [{"c": "F", "n": "LATIN CAPITAL LETTER F"}], "\ud835\udd09": [{"c": "F", "n": "LATIN CAPITAL LETTER F"}], "\ud835\udd3d": [{"c": "F", "n": "LATIN CAPITAL LETTER F"}], "\ud835\udd71": [{"c": "F", "n": "LATIN CAPITAL LETTER F"}], "\ud835\udda5": [{"c": "F", "n": "LATIN CAPITAL LETTER F"}], "\ud835\uddd9": [{"c": "F", "n": "LATIN CAPITAL LETTER F"}], "\ud835\ude0d": [{"c": "F", "n": "LATIN CAPITAL LETTER F"}], "\ud835\ude41": [{"c": "F", "n": "LATIN CAPITAL LETTER F"}], "\ud835\ude75": [{"c": "F", "n": "LATIN CAPITAL LETTER F"}], "\ua798": [{"c": "F", "n": "LATIN CAPITAL LETTER F"}], "\u03dc": [{"c": "F", "n": "LATIN CAPITAL LETTER F"}], "\ud835\udfca": [{"c": "F", "n": "LATIN CAPITAL LETTER F"}], "\u15b4": [{"c": "F", "n": "LATIN CAPITAL LETTER F"}], "\ua4dd": [{"c": "F", "n": "LATIN CAPITAL LETTER F"}], "\ud806\udcc2": [{"c": "F", "n": "LATIN CAPITAL LETTER F"}], "\ud806\udca2": [{"c": "F", "n": "LATIN CAPITAL LETTER F"}], "\ud800\ude87": [{"c": "F", "n": "LATIN CAPITAL LETTER F"}], "\ud800\udea5": [{"c": "F", "n": "LATIN CAPITAL LETTER F"}], "\ud801\udd25": [{"c": "F", "n": "LATIN CAPITAL LETTER F"}], "\u0192": [{"c": "f\u0326", "n": "LATIN SMALL LETTER F, COMBINING COMMA BELOW"}], "f\u0326": [{"c": "\u0192", "n": "LATIN SMALL LETTER F WITH HOOK"}], "\u0191": [{"c": "F\u0326", "n": "LATIN CAPITAL LETTER F, COMBINING COMMA BELOW"}], "F\u0326": [{"c": "\u0191", "n": "LATIN CAPITAL LETTER F WITH HOOK"}], "\u1d6e": [{"c": "f\u0334", "n": "LATIN SMALL LETTER F, COMBINING TILDE OVERLAY"}], "f\u0334": [{"c": "\u1d6e", "n": "LATIN SMALL LETTER F WITH MIDDLE TILDE"}], "\u213b": [{"c": "FAX", "n": "LATIN CAPITAL LETTER F, LATIN CAPITAL LETTER A, LATIN CAPITAL LETTER X"}], "FAX": [{"c": "\u213b", "n": "FACSIMILE SIGN"}], "\ufb00": [{"c": "ff", "n": "LATIN SMALL LETTER F, LATIN SMALL LETTER F"}], "ff": [{"c": "\ufb00", "n": "LATIN SMALL LIGATURE FF"}], "\ufb03": [{"c": "ffi", "n": "LATIN SMALL LETTER F, LATIN SMALL LETTER F, LATIN SMALL LETTER I"}], "ffi": [{"c": "\ufb03", "n": "LATIN SMALL LIGATURE FFI"}], "\ufb04": [{"c": "ffl", "n": "LATIN SMALL LETTER F, LATIN SMALL LETTER F, LATIN SMALL LETTER L"}], "ffl": [{"c": "\ufb04", "n": "LATIN SMALL LIGATURE FFL"}], "\ufb01": [{"c": "fi", "n": "LATIN SMALL LETTER F, LATIN SMALL LETTER I"}], "fi": [{"c": "\ufb01", "n": "LATIN SMALL LIGATURE FI"}], "\ufb02": [{"c": "fl", "n": "LATIN SMALL LETTER F, LATIN SMALL LETTER L"}], "fl": [{"c": "\ufb02", "n": "LATIN SMALL LIGATURE FL"}], "\u02a9": [{"c": "f\u014b", "n": "LATIN SMALL LETTER F, LATIN SMALL LETTER ENG"}], "f\u014b": [{"c": "\u02a9", "n": "LATIN SMALL LETTER FENG DIGRAPH"}], "\u15b5": [{"c": "\u2132", "n": "TURNED CAPITAL F"}], "\u2132": [{"c": "\u15b5", "n": "CANADIAN SYLLABICS BLACKFOOT WI"}, {"c": "\ua4de", "n": "LISU LETTER TSHA"}], "\ua4de": [{"c": "\u2132", "n": "TURNED CAPITAL F"}], "\ud834\ude30": [{"c": "\ua7fb", "n": "LATIN EPIGRAPHIC LETTER REVERSED F"}], "\ua7fb": [{"c": "\ud834\ude30", "n": "GREEK INSTRUMENTAL NOTATION SYMBOL-30"}, {"c": "\u15b7", "n": "CANADIAN SYLLABICS BLACKFOOT WA"}], "\u15b7": [{"c": "\ua7fb", "n": "LATIN EPIGRAPHIC LETTER REVERSED F"}], "\uff47": [{"c": "g", "n": "LATIN SMALL LETTER G"}], "g": [{"c": "\uff47", "n": "FULLWIDTH LATIN SMALL LETTER G"}, {"c": "\u210a", "n": "SCRIPT SMALL G"}, {"c": "\ud835\udc20", "n": "MATHEMATICAL BOLD SMALL G"}, {"c": "\ud835\udc54", "n": "MATHEMATICAL ITALIC SMALL G"}, {"c": "\ud835\udc88", "n": "MATHEMATICAL BOLD ITALIC SMALL G"}, {"c": "\ud835\udcf0", "n": "MATHEMATICAL BOLD SCRIPT SMALL G"}, {"c": "\ud835\udd24", "n": "MATHEMATICAL FRAKTUR SMALL G"}, {"c": "\ud835\udd58", "n": "MATHEMATICAL DOUBLE-STRUCK SMALL G"}, {"c": "\ud835\udd8c", "n": "MATHEMATICAL BOLD FRAKTUR SMALL G"}, {"c": "\ud835\uddc0", "n": "MATHEMATICAL SANS-SERIF SMALL G"}, {"c": "\ud835\uddf4", "n": "MATHEMATICAL SANS-SERIF BOLD SMALL G"}, {"c": "\ud835\ude28", "n": "MATHEMATICAL SANS-SERIF ITALIC SMALL G"}, {"c": "\ud835\ude5c", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G"}, {"c": "\ud835\ude90", "n": "MATHEMATICAL MONOSPACE SMALL G"}, {"c": "\u0261", "n": "LATIN SMALL LETTER SCRIPT G"}, {"c": "\u1d83", "n": "LATIN SMALL LETTER G WITH PALATAL HOOK"}, {"c": "\u018d", "n": "LATIN SMALL LETTER TURNED DELTA"}, {"c": "\u0581", "n": "ARMENIAN SMALL LETTER CO"}], "\u210a": [{"c": "g", "n": "LATIN SMALL LETTER G"}], "\ud835\udc20": [{"c": "g", "n": "LATIN SMALL LETTER G"}], "\ud835\udc54": [{"c": "g", "n": "LATIN SMALL LETTER G"}], "\ud835\udc88": [{"c": "g", "n": "LATIN SMALL LETTER G"}], "\ud835\udcf0": [{"c": "g", "n": "LATIN SMALL LETTER G"}], "\ud835\udd24": [{"c": "g", "n": "LATIN SMALL LETTER G"}], "\ud835\udd58": [{"c": "g", "n": "LATIN SMALL LETTER G"}], "\ud835\udd8c": [{"c": "g", "n": "LATIN SMALL LETTER G"}], "\ud835\uddc0": [{"c": "g", "n": "LATIN SMALL LETTER G"}], "\ud835\uddf4": [{"c": "g", "n": "LATIN SMALL LETTER G"}], "\ud835\ude28": [{"c": "g", "n": "LATIN SMALL LETTER G"}], "\ud835\ude5c": [{"c": "g", "n": "LATIN SMALL LETTER G"}], "\ud835\ude90": [{"c": "g", "n": "LATIN SMALL LETTER G"}], "\u0261": [{"c": "g", "n": "LATIN SMALL LETTER G"}], "\u1d83": [{"c": "g", "n": "LATIN SMALL LETTER G"}], "\u018d": [{"c": "g", "n": "LATIN SMALL LETTER G"}], "\u0581": [{"c": "g", "n": "LATIN SMALL LETTER G"}], "\ud835\udc06": [{"c": "G", "n": "LATIN CAPITAL LETTER G"}], "G": [{"c": "\ud835\udc06", "n": "MATHEMATICAL BOLD CAPITAL G"}, {"c": "\ud835\udc3a", "n": "MATHEMATICAL ITALIC CAPITAL G"}, {"c": "\ud835\udc6e", "n": "MATHEMATICAL BOLD ITALIC CAPITAL G"}, {"c": "\ud835\udca2", "n": "MATHEMATICAL SCRIPT CAPITAL G"}, {"c": "\ud835\udcd6", "n": "MATHEMATICAL BOLD SCRIPT CAPITAL G"}, {"c": "\ud835\udd0a", "n": "MATHEMATICAL FRAKTUR CAPITAL G"}, {"c": "\ud835\udd3e", "n": "MATHEMATICAL DOUBLE-STRUCK CAPITAL G"}, {"c": "\ud835\udd72", "n": "MATHEMATICAL BOLD FRAKTUR CAPITAL G"}, {"c": "\ud835\udda6", "n": "MATHEMATICAL SANS-SERIF CAPITAL G"}, {"c": "\ud835\uddda", "n": "MATHEMATICAL SANS-SERIF BOLD CAPITAL G"}, {"c": "\ud835\ude0e", "n": "MATHEMATICAL SANS-SERIF ITALIC CAPITAL G"}, {"c": "\ud835\ude42", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G"}, {"c": "\ud835\ude76", "n": "MATHEMATICAL MONOSPACE CAPITAL G"}, {"c": "\u050c", "n": "CYRILLIC CAPITAL LETTER KOMI SJE"}, {"c": "\u13c0", "n": "CHEROKEE LETTER NAH"}, {"c": "\u13f3", "n": "CHEROKEE LETTER YU"}, {"c": "\ua4d6", "n": "LISU LETTER GA"}], "\ud835\udc3a": [{"c": "G", "n": "LATIN CAPITAL LETTER G"}], "\ud835\udc6e": [{"c": "G", "n": "LATIN CAPITAL LETTER G"}], "\ud835\udca2": [{"c": "G", "n": "LATIN CAPITAL LETTER G"}], "\ud835\udcd6": [{"c": "G", "n": "LATIN CAPITAL LETTER G"}], "\ud835\udd0a": [{"c": "G", "n": "LATIN CAPITAL LETTER G"}], "\ud835\udd3e": [{"c": "G", "n": "LATIN CAPITAL LETTER G"}], "\ud835\udd72": [{"c": "G", "n": "LATIN CAPITAL LETTER G"}], "\ud835\udda6": [{"c": "G", "n": "LATIN CAPITAL LETTER G"}], "\ud835\uddda": [{"c": "G", "n": "LATIN CAPITAL LETTER G"}], "\ud835\ude0e": [{"c": "G", "n": "LATIN CAPITAL LETTER G"}], "\ud835\ude42": [{"c": "G", "n": "LATIN CAPITAL LETTER G"}], "\ud835\ude76": [{"c": "G", "n": "LATIN CAPITAL LETTER G"}], "\u050c": [{"c": "G", "n": "LATIN CAPITAL LETTER G"}], "\u13c0": [{"c": "G", "n": "LATIN CAPITAL LETTER G"}], "\u13f3": [{"c": "G", "n": "LATIN CAPITAL LETTER G"}], "\ua4d6": [{"c": "G", "n": "LATIN CAPITAL LETTER G"}], "\u1da2": [{"c": "\u1d4d", "n": "MODIFIER LETTER SMALL G"}], "\u1d4d": [{"c": "\u1da2", "n": "MODIFIER LETTER SMALL SCRIPT G"}], "\u0260": [{"c": "g\u0314", "n": "LATIN SMALL LETTER G, COMBINING REVERSED COMMA ABOVE"}], "g\u0314": [{"c": "\u0260", "n": "LATIN SMALL LETTER G WITH HOOK"}], "\u01e7": [{"c": "\u011f", "n": "LATIN SMALL LETTER G WITH BREVE"}], "\u011f": [{"c": "\u01e7", "n": "LATIN SMALL LETTER G WITH CARON"}], "\u01e6": [{"c": "\u011e", "n": "LATIN CAPITAL LETTER G WITH BREVE"}], "\u011e": [{"c": "\u01e6", "n": "LATIN CAPITAL LETTER G WITH CARON"}], "\u01f5": [{"c": "\u0123", "n": "LATIN SMALL LETTER G WITH CEDILLA"}], "\u0123": [{"c": "\u01f5", "n": "LATIN SMALL LETTER G WITH ACUTE"}], "\u01e5": [{"c": "g\u0335", "n": "LATIN SMALL LETTER G, COMBINING SHORT STROKE OVERLAY"}], "g\u0335": [{"c": "\u01e5", "n": "LATIN SMALL LETTER G WITH STROKE"}], "\u01e4": [{"c": "G\u0335", "n": "LATIN CAPITAL LETTER G, COMBINING SHORT STROKE OVERLAY"}], "G\u0335": [{"c": "\u01e4", "n": "LATIN CAPITAL LETTER G WITH STROKE"}], "\u0193": [{"c": "G'", "n": "LATIN CAPITAL LETTER G, APOSTROPHE"}], "G'": [{"c": "\u0193", "n": "LATIN CAPITAL LETTER G WITH HOOK"}], "\u050d": [{"c": "\u0262", "n": "LATIN LETTER SMALL CAPITAL G"}], "\u0262": [{"c": "\u050d", "n": "CYRILLIC SMALL LETTER KOMI SJE"}, {"c": "\uab90", "n": "CHEROKEE SMALL LETTER NAH"}, {"c": "\u13fb", "n": "CHEROKEE SMALL LETTER YU"}], "\uab90": [{"c": "\u0262", "n": "LATIN LETTER SMALL CAPITAL G"}], "\u13fb": [{"c": "\u0262", "n": "LATIN LETTER SMALL CAPITAL G"}], "\uff48": [{"c": "h", "n": "LATIN SMALL LETTER H"}], "h": [{"c": "\uff48", "n": "FULLWIDTH LATIN SMALL LETTER H"}, {"c": "\u210e", "n": "PLANCK CONSTANT"}, {"c": "\ud835\udc21", "n": "MATHEMATICAL BOLD SMALL H"}, {"c": "\ud835\udc89", "n": "MATHEMATICAL BOLD ITALIC SMALL H"}, {"c": "\ud835\udcbd", "n": "MATHEMATICAL SCRIPT SMALL H"}, {"c": "\ud835\udcf1", "n": "MATHEMATICAL BOLD SCRIPT SMALL H"}, {"c": "\ud835\udd25", "n": "MATHEMATICAL FRAKTUR SMALL H"}, {"c": "\ud835\udd59", "n": "MATHEMATICAL DOUBLE-STRUCK SMALL H"}, {"c": "\ud835\udd8d", "n": "MATHEMATICAL BOLD FRAKTUR SMALL H"}, {"c": "\ud835\uddc1", "n": "MATHEMATICAL SANS-SERIF SMALL H"}, {"c": "\ud835\uddf5", "n": "MATHEMATICAL SANS-SERIF BOLD SMALL H"}, {"c": "\ud835\ude29", "n": "MATHEMATICAL SANS-SERIF ITALIC SMALL H"}, {"c": "\ud835\ude5d", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H"}, {"c": "\ud835\ude91", "n": "MATHEMATICAL MONOSPACE SMALL H"}, {"c": "\u04bb", "n": "CYRILLIC SMALL LETTER SHHA"}, {"c": "\u0570", "n": "ARMENIAN SMALL LETTER HO"}, {"c": "\u13c2", "n": "CHEROKEE LETTER NI"}], "\u210e": [{"c": "h", "n": "LATIN SMALL LETTER H"}], "\ud835\udc21": [{"c": "h", "n": "LATIN SMALL LETTER H"}], "\ud835\udc89": [{"c": "h", "n": "LATIN SMALL LETTER H"}], "\ud835\udcbd": [{"c": "h", "n": "LATIN SMALL LETTER H"}], "\ud835\udcf1": [{"c": "h", "n": "LATIN SMALL LETTER H"}], "\ud835\udd25": [{"c": "h", "n": "LATIN SMALL LETTER H"}], "\ud835\udd59": [{"c": "h", "n": "LATIN SMALL LETTER H"}], "\ud835\udd8d": [{"c": "h", "n": "LATIN SMALL LETTER H"}], "\ud835\uddc1": [{"c": "h", "n": "LATIN SMALL LETTER H"}], "\ud835\uddf5": [{"c": "h", "n": "LATIN SMALL LETTER H"}], "\ud835\ude29": [{"c": "h", "n": "LATIN SMALL LETTER H"}], "\ud835\ude5d": [{"c": "h", "n": "LATIN SMALL LETTER H"}], "\ud835\ude91": [{"c": "h", "n": "LATIN SMALL LETTER H"}], "\u04bb": [{"c": "h", "n": "LATIN SMALL LETTER H"}], "\u0570": [{"c": "h", "n": "LATIN SMALL LETTER H"}], "\u13c2": [{"c": "h", "n": "LATIN SMALL LETTER H"}], "\uff28": [{"c": "H", "n": "LATIN CAPITAL LETTER H"}], "H": [{"c": "\uff28", "n": "FULLWIDTH LATIN CAPITAL LETTER H"}, {"c": "\u210b", "n": "SCRIPT CAPITAL H"}, {"c": "\u210c", "n": "BLACK-LETTER CAPITAL H"}, {"c": "\u210d", "n": "DOUBLE-STRUCK CAPITAL H"}, {"c": "\ud835\udc07", "n": "MATHEMATICAL BOLD CAPITAL H"}, {"c": "\ud835\udc3b", "n": "MATHEMATICAL ITALIC CAPITAL H"}, {"c": "\ud835\udc6f", "n": "MATHEMATICAL BOLD ITALIC CAPITAL H"}, {"c": "\ud835\udcd7", "n": "MATHEMATICAL BOLD SCRIPT CAPITAL H"}, {"c": "\ud835\udd73", "n": "MATHEMATICAL BOLD FRAKTUR CAPITAL H"}, {"c": "\ud835\udda7", "n": "MATHEMATICAL SANS-SERIF CAPITAL H"}, {"c": "\ud835\udddb", "n": "MATHEMATICAL SANS-SERIF BOLD CAPITAL H"}, {"c": "\ud835\ude0f", "n": "MATHEMATICAL SANS-SERIF ITALIC CAPITAL H"}, {"c": "\ud835\ude43", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H"}, {"c": "\ud835\ude77", "n": "MATHEMATICAL MONOSPACE CAPITAL H"}, {"c": "\u0397", "n": "GREEK CAPITAL LETTER ETA"}, {"c": "\ud835\udeae", "n": "MATHEMATICAL BOLD CAPITAL ETA"}, {"c": "\ud835\udee8", "n": "MATHEMATICAL ITALIC CAPITAL ETA"}, {"c": "\ud835\udf22", "n": "MATHEMATICAL BOLD ITALIC CAPITAL ETA"}, {"c": "\ud835\udf5c", "n": "MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA"}, {"c": "\ud835\udf96", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA"}, {"c": "\u2c8e", "n": "COPTIC CAPITAL LETTER HATE"}, {"c": "\u041d", "n": "CYRILLIC CAPITAL LETTER EN"}, {"c": "\u13bb", "n": "CHEROKEE LETTER MI"}, {"c": "\u157c", "n": "CANADIAN SYLLABICS NUNAVUT H"}, {"c": "\ua4e7", "n": "LISU LETTER XA"}, {"c": "\ud800\udecf", "n": "CARIAN LETTER E2"}], "\u210b": [{"c": "H", "n": "LATIN CAPITAL LETTER H"}], "\u210c": [{"c": "H", "n": "LATIN CAPITAL LETTER H"}], "\u210d": [{"c": "H", "n": "LATIN CAPITAL LETTER H"}], "\ud835\udc07": [{"c": "H", "n": "LATIN CAPITAL LETTER H"}], "\ud835\udc3b": [{"c": "H", "n": "LATIN CAPITAL LETTER H"}], "\ud835\udc6f": [{"c": "H", "n": "LATIN CAPITAL LETTER H"}], "\ud835\udcd7": [{"c": "H", "n": "LATIN CAPITAL LETTER H"}], "\ud835\udd73": [{"c": "H", "n": "LATIN CAPITAL LETTER H"}], "\ud835\udda7": [{"c": "H", "n": "LATIN CAPITAL LETTER H"}], "\ud835\udddb": [{"c": "H", "n": "LATIN CAPITAL LETTER H"}], "\ud835\ude0f": [{"c": "H", "n": "LATIN CAPITAL LETTER H"}], "\ud835\ude43": [{"c": "H", "n": "LATIN CAPITAL LETTER H"}], "\ud835\ude77": [{"c": "H", "n": "LATIN CAPITAL LETTER H"}], "\u0397": [{"c": "H", "n": "LATIN CAPITAL LETTER H"}], "\ud835\udeae": [{"c": "H", "n": "LATIN CAPITAL LETTER H"}], "\ud835\udee8": [{"c": "H", "n": "LATIN CAPITAL LETTER H"}], "\ud835\udf22": [{"c": "H", "n": "LATIN CAPITAL LETTER H"}], "\ud835\udf5c": [{"c": "H", "n": "LATIN CAPITAL LETTER H"}], "\ud835\udf96": [{"c": "H", "n": "LATIN CAPITAL LETTER H"}], "\u2c8e": [{"c": "H", "n": "LATIN CAPITAL LETTER H"}], "\u041d": [{"c": "H", "n": "LATIN CAPITAL LETTER H"}], "\u13bb": [{"c": "H", "n": "LATIN CAPITAL LETTER H"}], "\u157c": [{"c": "H", "n": "LATIN CAPITAL LETTER H"}], "\ua4e7": [{"c": "H", "n": "LATIN CAPITAL LETTER H"}], "\ud800\udecf": [{"c": "H", "n": "LATIN CAPITAL LETTER H"}], "\u1d78": [{"c": "\u1d34", "n": "MODIFIER LETTER CAPITAL H"}], "\u1d34": [{"c": "\u1d78", "n": "MODIFIER LETTER CYRILLIC EN"}], "\u0266": [{"c": "h\u0314", "n": "LATIN SMALL LETTER H, COMBINING REVERSED COMMA ABOVE"}], "h\u0314": [{"c": "\u0266", "n": "LATIN SMALL LETTER H WITH HOOK"}, {"c": "\ua695", "n": "CYRILLIC SMALL LETTER HWE"}, {"c": "\u13f2", "n": "CHEROKEE LETTER YO"}], "\ua695": [{"c": "h\u0314", "n": "LATIN SMALL LETTER H, COMBINING REVERSED COMMA ABOVE"}], "\u13f2": [{"c": "h\u0314", "n": "LATIN SMALL LETTER H, COMBINING REVERSED COMMA ABOVE"}], "\u2c67": [{"c": "H\u0329", "n": "LATIN CAPITAL LETTER H, COMBINING VERTICAL LINE BELOW"}], "H\u0329": [{"c": "\u2c67", "n": "LATIN CAPITAL LETTER H WITH DESCENDER"}, {"c": "\u04a2", "n": "CYRILLIC CAPITAL LETTER EN WITH DESCENDER"}], "\u04a2": [{"c": "H\u0329", "n": "LATIN CAPITAL LETTER H, COMBINING VERTICAL LINE BELOW"}], "\u0127": [{"c": "h\u0335", "n": "LATIN SMALL LETTER H, COMBINING SHORT STROKE OVERLAY"}], "h\u0335": [{"c": "\u0127", "n": "LATIN SMALL LETTER H WITH STROKE"}, {"c": "\u210f", "n": "PLANCK CONSTANT OVER TWO PI"}, {"c": "\u045b", "n": "CYRILLIC SMALL LETTER TSHE"}], "\u210f": [{"c": "h\u0335", "n": "LATIN SMALL LETTER H, COMBINING SHORT STROKE OVERLAY"}], "\u045b": [{"c": "h\u0335", "n": "LATIN SMALL LETTER H, COMBINING SHORT STROKE OVERLAY"}], "\u0126": [{"c": "H\u0335", "n": "LATIN CAPITAL LETTER H, COMBINING SHORT STROKE OVERLAY"}], "H\u0335": [{"c": "\u0126", "n": "LATIN CAPITAL LETTER H WITH STROKE"}], "\u04c9": [{"c": "H\u0326", "n": "LATIN CAPITAL LETTER H, COMBINING COMMA BELOW"}], "H\u0326": [{"c": "\u04c9", "n": "CYRILLIC CAPITAL LETTER EN WITH TAIL"}, {"c": "\u04c7", "n": "CYRILLIC CAPITAL LETTER EN WITH HOOK"}], "\u04c7": [{"c": "H\u0326", "n": "LATIN CAPITAL LETTER H, COMBINING COMMA BELOW"}], "\u043d": [{"c": "\u029c", "n": "LATIN LETTER SMALL CAPITAL H"}], "\u029c": [{"c": "\u043d", "n": "CYRILLIC SMALL LETTER EN"}, {"c": "\uab8b", "n": "CHEROKEE SMALL LETTER MI"}], "\uab8b": [{"c": "\u029c", "n": "LATIN LETTER SMALL CAPITAL H"}], "\u04a3": [{"c": "\u029c\u0329", "n": "LATIN LETTER SMALL CAPITAL H, COMBINING VERTICAL LINE BELOW"}], "\u029c\u0329": [{"c": "\u04a3", "n": "CYRILLIC SMALL LETTER EN WITH DESCENDER"}], "\u04ca": [{"c": "\u029c\u0326", "n": "LATIN LETTER SMALL CAPITAL H, COMBINING COMMA BELOW"}], "\u029c\u0326": [{"c": "\u04ca", "n": "CYRILLIC SMALL LETTER EN WITH TAIL"}, {"c": "\u04c8", "n": "CYRILLIC SMALL LETTER EN WITH HOOK"}], "\u04c8": [{"c": "\u029c\u0326", "n": "LATIN LETTER SMALL CAPITAL H, COMBINING COMMA BELOW"}], "\u050a": [{"c": "\u01f6", "n": "LATIN CAPITAL LETTER HWAIR"}], "\u01f6": [{"c": "\u050a", "n": "CYRILLIC CAPITAL LETTER KOMI NJE"}], "\uab80": [{"c": "\u2c76", "n": "LATIN SMALL LETTER HALF H"}], "\u2c76": [{"c": "\uab80", "n": "CHEROKEE SMALL LETTER HO"}], "\u0370": [{"c": "\u2c75", "n": "LATIN CAPITAL LETTER HALF H"}], "\u2c75": [{"c": "\u0370", "n": "GREEK CAPITAL LETTER HETA"}, {"c": "\u13a8", "n": "CHEROKEE LETTER GE"}, {"c": "\u13b0", "n": "CHEROKEE LETTER HO"}, {"c": "\ua6b1", "n": "BAMUM LETTER NDAA"}], "\u13a8": [{"c": "\u2c75", "n": "LATIN CAPITAL LETTER HALF H"}], "\u13b0": [{"c": "\u2c75", "n": "LATIN CAPITAL LETTER HALF H"}], "\ua6b1": [{"c": "\u2c75", "n": "LATIN CAPITAL LETTER HALF H"}], "\ua795": [{"c": "\ua727", "n": "LATIN SMALL LETTER HENG"}], "\ua727": [{"c": "\ua795", "n": "LATIN SMALL LETTER H WITH PALATAL HOOK"}], "\u02db": [{"c": "i", "n": "LATIN SMALL LETTER I"}], "i": [{"c": "\u02db", "n": "OGONEK"}, {"c": "\u2373", "n": "APL FUNCTIONAL SYMBOL IOTA"}, {"c": "\uff49", "n": "FULLWIDTH LATIN SMALL LETTER I"}, {"c": "\u2170", "n": "SMALL ROMAN NUMERAL ONE"}, {"c": "\u2139", "n": "INFORMATION SOURCE"}, {"c": "\u2148", "n": "DOUBLE-STRUCK ITALIC SMALL I"}, {"c": "\ud835\udc22", "n": "MATHEMATICAL BOLD SMALL I"}, {"c": "\ud835\udc56", "n": "MATHEMATICAL ITALIC SMALL I"}, {"c": "\ud835\udc8a", "n": "MATHEMATICAL BOLD ITALIC SMALL I"}, {"c": "\ud835\udcbe", "n": "MATHEMATICAL SCRIPT SMALL I"}, {"c": "\ud835\udcf2", "n": "MATHEMATICAL BOLD SCRIPT SMALL I"}, {"c": "\ud835\udd26", "n": "MATHEMATICAL FRAKTUR SMALL I"}, {"c": "\ud835\udd5a", "n": "MATHEMATICAL DOUBLE-STRUCK SMALL I"}, {"c": "\ud835\udd8e", "n": "MATHEMATICAL BOLD FRAKTUR SMALL I"}, {"c": "\ud835\uddc2", "n": "MATHEMATICAL SANS-SERIF SMALL I"}, {"c": "\ud835\uddf6", "n": "MATHEMATICAL SANS-SERIF BOLD SMALL I"}, {"c": "\ud835\ude2a", "n": "MATHEMATICAL SANS-SERIF ITALIC SMALL I"}, {"c": "\ud835\ude5e", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I"}, {"c": "\ud835\ude92", "n": "MATHEMATICAL MONOSPACE SMALL I"}, {"c": "\u0131", "n": "LATIN SMALL LETTER DOTLESS I"}, {"c": "\ud835\udea4", "n": "MATHEMATICAL ITALIC SMALL DOTLESS I"}, {"c": "\u026a", "n": "LATIN LETTER SMALL CAPITAL I"}, {"c": "\u0269", "n": "LATIN SMALL LETTER IOTA"}, {"c": "\u03b9", "n": "GREEK SMALL LETTER IOTA"}, {"c": "\u1fbe", "n": "GREEK PROSGEGRAMMENI"}, {"c": "\u037a", "n": "GREEK YPOGEGRAMMENI"}, {"c": "\ud835\udeca", "n": "MATHEMATICAL BOLD SMALL IOTA"}, {"c": "\ud835\udf04", "n": "MATHEMATICAL ITALIC SMALL IOTA"}, {"c": "\ud835\udf3e", "n": "MATHEMATICAL BOLD ITALIC SMALL IOTA"}, {"c": "\ud835\udf78", "n": "MATHEMATICAL SANS-SERIF BOLD SMALL IOTA"}, {"c": "\ud835\udfb2", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA"}, {"c": "\u0456", "n": "CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I"}, {"c": "\ua647", "n": "CYRILLIC SMALL LETTER IOTA"}, {"c": "\u04cf", "n": "CYRILLIC SMALL LETTER PALOCHKA"}, {"c": "\uab75", "n": "CHEROKEE SMALL LETTER V"}, {"c": "\u13a5", "n": "CHEROKEE LETTER V"}, {"c": "\ud806\udcc3", "n": "WARANG CITI SMALL LETTER YU"}], "\u2373": [{"c": "i", "n": "LATIN SMALL LETTER I"}], "\uff49": [{"c": "i", "n": "LATIN SMALL LETTER I"}], "\u2170": [{"c": "i", "n": "LATIN SMALL LETTER I"}], "\u2139": [{"c": "i", "n": "LATIN SMALL LETTER I"}], "\u2148": [{"c": "i", "n": "LATIN SMALL LETTER I"}], "\ud835\udc22": [{"c": "i", "n": "LATIN SMALL LETTER I"}], "\ud835\udc56": [{"c": "i", "n": "LATIN SMALL LETTER I"}], "\ud835\udc8a": [{"c": "i", "n": "LATIN SMALL LETTER I"}], "\ud835\udcbe": [{"c": "i", "n": "LATIN SMALL LETTER I"}], "\ud835\udcf2": [{"c": "i", "n": "LATIN SMALL LETTER I"}], "\ud835\udd26": [{"c": "i", "n": "LATIN SMALL LETTER I"}], "\ud835\udd5a": [{"c": "i", "n": "LATIN SMALL LETTER I"}], "\ud835\udd8e": [{"c": "i", "n": "LATIN SMALL LETTER I"}], "\ud835\uddc2": [{"c": "i", "n": "LATIN SMALL LETTER I"}], "\ud835\uddf6": [{"c": "i", "n": "LATIN SMALL LETTER I"}], "\ud835\ude2a": [{"c": "i", "n": "LATIN SMALL LETTER I"}], "\ud835\ude5e": [{"c": "i", "n": "LATIN SMALL LETTER I"}], "\ud835\ude92": [{"c": "i", "n": "LATIN SMALL LETTER I"}], "\u0131": [{"c": "i", "n": "LATIN SMALL LETTER I"}], "\ud835\udea4": [{"c": "i", "n": "LATIN SMALL LETTER I"}], "\u026a": [{"c": "i", "n": "LATIN SMALL LETTER I"}], "\u0269": [{"c": "i", "n": "LATIN SMALL LETTER I"}], "\u03b9": [{"c": "i", "n": "LATIN SMALL LETTER I"}], "\u1fbe": [{"c": "i", "n": "LATIN SMALL LETTER I"}], "\u037a": [{"c": "i", "n": "LATIN SMALL LETTER I"}], "\ud835\udeca": [{"c": "i", "n": "LATIN SMALL LETTER I"}], "\ud835\udf04": [{"c": "i", "n": "LATIN SMALL LETTER I"}], "\ud835\udf3e": [{"c": "i", "n": "LATIN SMALL LETTER I"}], "\ud835\udf78": [{"c": "i", "n": "LATIN SMALL LETTER I"}], "\ud835\udfb2": [{"c": "i", "n": "LATIN SMALL LETTER I"}], "\u0456": [{"c": "i", "n": "LATIN SMALL LETTER I"}], "\ua647": [{"c": "i", "n": "LATIN SMALL LETTER I"}], "\u04cf": [{"c": "i", "n": "LATIN SMALL LETTER I"}], "\uab75": [{"c": "i", "n": "LATIN SMALL LETTER I"}], "\u13a5": [{"c": "i", "n": "LATIN SMALL LETTER I"}], "\ud806\udcc3": [{"c": "i", "n": "LATIN SMALL LETTER I"}], "\u24db": [{"c": "\u24be", "n": "CIRCLED LATIN CAPITAL LETTER I"}], "\u24be": [{"c": "\u24db", "n": "CIRCLED LATIN SMALL LETTER L"}], "\u2378": [{"c": "i\u0332", "n": "LATIN SMALL LETTER I, COMBINING LOW LINE"}], "i\u0332": [{"c": "\u2378", "n": "APL FUNCTIONAL SYMBOL IOTA UNDERBAR"}], "\u01d0": [{"c": "\u012d", "n": "LATIN SMALL LETTER I WITH BREVE"}], "\u012d": [{"c": "\u01d0", "n": "LATIN SMALL LETTER I WITH CARON"}], "\u01cf": [{"c": "\u012c", "n": "LATIN CAPITAL LETTER I WITH BREVE"}], "\u012c": [{"c": "\u01cf", "n": "LATIN CAPITAL LETTER I WITH CARON"}], "\u0268": [{"c": "i\u0335", "n": "LATIN SMALL LETTER I, COMBINING SHORT STROKE OVERLAY"}], "i\u0335": [{"c": "\u0268", "n": "LATIN SMALL LETTER I WITH STROKE"}, {"c": "\u1d7b", "n": "LATIN SMALL CAPITAL LETTER I WITH STROKE"}, {"c": "\u1d7c", "n": "LATIN SMALL LETTER IOTA WITH STROKE"}], "\u1d7b": [{"c": "i\u0335", "n": "LATIN SMALL LETTER I, COMBINING SHORT STROKE OVERLAY"}], "\u1d7c": [{"c": "i\u0335", "n": "LATIN SMALL LETTER I, COMBINING SHORT STROKE OVERLAY"}], "\u2171": [{"c": "ii", "n": "LATIN SMALL LETTER I, LATIN SMALL LETTER I"}], "ii": [{"c": "\u2171", "n": "SMALL ROMAN NUMERAL TWO"}], "\u2172": [{"c": "iii", "n": "LATIN SMALL LETTER I, LATIN SMALL LETTER I, LATIN SMALL LETTER I"}], "iii": [{"c": "\u2172", "n": "SMALL ROMAN NUMERAL THREE"}], "\u0133": [{"c": "ij", "n": "LATIN SMALL LETTER I, LATIN SMALL LETTER J"}], "ij": [{"c": "\u0133", "n": "LATIN SMALL LIGATURE IJ"}], "\u2173": [{"c": "iv", "n": "LATIN SMALL LETTER I, LATIN SMALL LETTER V"}], "iv": [{"c": "\u2173", "n": "SMALL ROMAN NUMERAL FOUR"}], "\u2178": [{"c": "ix", "n": "LATIN SMALL LETTER I, LATIN SMALL LETTER X"}], "ix": [{"c": "\u2178", "n": "SMALL ROMAN NUMERAL NINE"}], "\uff4a": [{"c": "j", "n": "LATIN SMALL LETTER J"}], "j": [{"c": "\uff4a", "n": "FULLWIDTH LATIN SMALL LETTER J"}, {"c": "\u2149", "n": "DOUBLE-STRUCK ITALIC SMALL J"}, {"c": "\ud835\udc23", "n": "MATHEMATICAL BOLD SMALL J"}, {"c": "\ud835\udc57", "n": "MATHEMATICAL ITALIC SMALL J"}, {"c": "\ud835\udc8b", "n": "MATHEMATICAL BOLD ITALIC SMALL J"}, {"c": "\ud835\udcbf", "n": "MATHEMATICAL SCRIPT SMALL J"}, {"c": "\ud835\udcf3", "n": "MATHEMATICAL BOLD SCRIPT SMALL J"}, {"c": "\ud835\udd27", "n": "MATHEMATICAL FRAKTUR SMALL J"}, {"c": "\ud835\udd5b", "n": "MATHEMATICAL DOUBLE-STRUCK SMALL J"}, {"c": "\ud835\udd8f", "n": "MATHEMATICAL BOLD FRAKTUR SMALL J"}, {"c": "\ud835\uddc3", "n": "MATHEMATICAL SANS-SERIF SMALL J"}, {"c": "\ud835\uddf7", "n": "MATHEMATICAL SANS-SERIF BOLD SMALL J"}, {"c": "\ud835\ude2b", "n": "MATHEMATICAL SANS-SERIF ITALIC SMALL J"}, {"c": "\ud835\ude5f", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J"}, {"c": "\ud835\ude93", "n": "MATHEMATICAL MONOSPACE SMALL J"}, {"c": "\u03f3", "n": "GREEK LETTER YOT"}, {"c": "\u0458", "n": "CYRILLIC SMALL LETTER JE"}], "\u2149": [{"c": "j", "n": "LATIN SMALL LETTER J"}], "\ud835\udc23": [{"c": "j", "n": "LATIN SMALL LETTER J"}], "\ud835\udc57": [{"c": "j", "n": "LATIN SMALL LETTER J"}], "\ud835\udc8b": [{"c": "j", "n": "LATIN SMALL LETTER J"}], "\ud835\udcbf": [{"c": "j", "n": "LATIN SMALL LETTER J"}], "\ud835\udcf3": [{"c": "j", "n": "LATIN SMALL LETTER J"}], "\ud835\udd27": [{"c": "j", "n": "LATIN SMALL LETTER J"}], "\ud835\udd5b": [{"c": "j", "n": "LATIN SMALL LETTER J"}], "\ud835\udd8f": [{"c": "j", "n": "LATIN SMALL LETTER J"}], "\ud835\uddc3": [{"c": "j", "n": "LATIN SMALL LETTER J"}], "\ud835\uddf7": [{"c": "j", "n": "LATIN SMALL LETTER J"}], "\ud835\ude2b": [{"c": "j", "n": "LATIN SMALL LETTER J"}], "\ud835\ude5f": [{"c": "j", "n": "LATIN SMALL LETTER J"}], "\ud835\ude93": [{"c": "j", "n": "LATIN SMALL LETTER J"}], "\u03f3": [{"c": "j", "n": "LATIN SMALL LETTER J"}], "\u0458": [{"c": "j", "n": "LATIN SMALL LETTER J"}], "\uff2a": [{"c": "J", "n": "LATIN CAPITAL LETTER J"}], "J": [{"c": "\uff2a", "n": "FULLWIDTH LATIN CAPITAL LETTER J"}, {"c": "\ud835\udc09", "n": "MATHEMATICAL BOLD CAPITAL J"}, {"c": "\ud835\udc3d", "n": "MATHEMATICAL ITALIC CAPITAL J"}, {"c": "\ud835\udc71", "n": "MATHEMATICAL BOLD ITALIC CAPITAL J"}, {"c": "\ud835\udca5", "n": "MATHEMATICAL SCRIPT CAPITAL J"}, {"c": "\ud835\udcd9", "n": "MATHEMATICAL BOLD SCRIPT CAPITAL J"}, {"c": "\ud835\udd0d", "n": "MATHEMATICAL FRAKTUR CAPITAL J"}, {"c": "\ud835\udd41", "n": "MATHEMATICAL DOUBLE-STRUCK CAPITAL J"}, {"c": "\ud835\udd75", "n": "MATHEMATICAL BOLD FRAKTUR CAPITAL J"}, {"c": "\ud835\udda9", "n": "MATHEMATICAL SANS-SERIF CAPITAL J"}, {"c": "\ud835\udddd", "n": "MATHEMATICAL SANS-SERIF BOLD CAPITAL J"}, {"c": "\ud835\ude11", "n": "MATHEMATICAL SANS-SERIF ITALIC CAPITAL J"}, {"c": "\ud835\ude45", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J"}, {"c": "\ud835\ude79", "n": "MATHEMATICAL MONOSPACE CAPITAL J"}, {"c": "\ua7b2", "n": "LATIN CAPITAL LETTER J WITH CROSSED-TAIL"}, {"c": "\u037f", "n": "GREEK CAPITAL LETTER YOT"}, {"c": "\u0408", "n": "CYRILLIC CAPITAL LETTER JE"}, {"c": "\u13ab", "n": "CHEROKEE LETTER GU"}, {"c": "\u148d", "n": "CANADIAN SYLLABICS CO"}, {"c": "\ua4d9", "n": "LISU LETTER JA"}], "\ud835\udc09": [{"c": "J", "n": "LATIN CAPITAL LETTER J"}], "\ud835\udc3d": [{"c": "J", "n": "LATIN CAPITAL LETTER J"}], "\ud835\udc71": [{"c": "J", "n": "LATIN CAPITAL LETTER J"}], "\ud835\udca5": [{"c": "J", "n": "LATIN CAPITAL LETTER J"}], "\ud835\udcd9": [{"c": "J", "n": "LATIN CAPITAL LETTER J"}], "\ud835\udd0d": [{"c": "J", "n": "LATIN CAPITAL LETTER J"}], "\ud835\udd41": [{"c": "J", "n": "LATIN CAPITAL LETTER J"}], "\ud835\udd75": [{"c": "J", "n": "LATIN CAPITAL LETTER J"}], "\ud835\udda9": [{"c": "J", "n": "LATIN CAPITAL LETTER J"}], "\ud835\udddd": [{"c": "J", "n": "LATIN CAPITAL LETTER J"}], "\ud835\ude11": [{"c": "J", "n": "LATIN CAPITAL LETTER J"}], "\ud835\ude45": [{"c": "J", "n": "LATIN CAPITAL LETTER J"}], "\ud835\ude79": [{"c": "J", "n": "LATIN CAPITAL LETTER J"}], "\ua7b2": [{"c": "J", "n": "LATIN CAPITAL LETTER J"}], "\u037f": [{"c": "J", "n": "LATIN CAPITAL LETTER J"}], "\u0408": [{"c": "J", "n": "LATIN CAPITAL LETTER J"}], "\u13ab": [{"c": "J", "n": "LATIN CAPITAL LETTER J"}], "\u148d": [{"c": "J", "n": "LATIN CAPITAL LETTER J"}], "\ua4d9": [{"c": "J", "n": "LATIN CAPITAL LETTER J"}], "\u0249": [{"c": "j\u0335", "n": "LATIN SMALL LETTER J, COMBINING SHORT STROKE OVERLAY"}], "j\u0335": [{"c": "\u0249", "n": "LATIN SMALL LETTER J WITH STROKE"}], "\u0248": [{"c": "J\u0335", "n": "LATIN CAPITAL LETTER J, COMBINING SHORT STROKE OVERLAY"}], "J\u0335": [{"c": "\u0248", "n": "LATIN CAPITAL LETTER J WITH STROKE"}], "\u1499": [{"c": "J\u00b7", "n": "LATIN CAPITAL LETTER J, MIDDLE DOT"}], "J\u00b7": [{"c": "\u1499", "n": "CANADIAN SYLLABICS WEST-CREE CWO"}], "\ud835\udea5": [{"c": "\u0237", "n": "LATIN SMALL LETTER DOTLESS J"}], "\u0237": [{"c": "\ud835\udea5", "n": "MATHEMATICAL ITALIC SMALL DOTLESS J"}, {"c": "\u0575", "n": "ARMENIAN SMALL LETTER YI"}], "\u0575": [{"c": "\u0237", "n": "LATIN SMALL LETTER DOTLESS J"}], "\uab7b": [{"c": "\u1d0a", "n": "LATIN LETTER SMALL CAPITAL J"}], "\u1d0a": [{"c": "\uab7b", "n": "CHEROKEE SMALL LETTER GU"}], "\ud835\udc24": [{"c": "k", "n": "LATIN SMALL LETTER K"}], "k": [{"c": "\ud835\udc24", "n": "MATHEMATICAL BOLD SMALL K"}, {"c": "\ud835\udc58", "n": "MATHEMATICAL ITALIC SMALL K"}, {"c": "\ud835\udc8c", "n": "MATHEMATICAL BOLD ITALIC SMALL K"}, {"c": "\ud835\udcc0", "n": "MATHEMATICAL SCRIPT SMALL K"}, {"c": "\ud835\udcf4", "n": "MATHEMATICAL BOLD SCRIPT SMALL K"}, {"c": "\ud835\udd28", "n": "MATHEMATICAL FRAKTUR SMALL K"}, {"c": "\ud835\udd5c", "n": "MATHEMATICAL DOUBLE-STRUCK SMALL K"}, {"c": "\ud835\udd90", "n": "MATHEMATICAL BOLD FRAKTUR SMALL K"}, {"c": "\ud835\uddc4", "n": "MATHEMATICAL SANS-SERIF SMALL K"}, {"c": "\ud835\uddf8", "n": "MATHEMATICAL SANS-SERIF BOLD SMALL K"}, {"c": "\ud835\ude2c", "n": "MATHEMATICAL SANS-SERIF ITALIC SMALL K"}, {"c": "\ud835\ude60", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K"}, {"c": "\ud835\ude94", "n": "MATHEMATICAL MONOSPACE SMALL K"}], "\ud835\udc58": [{"c": "k", "n": "LATIN SMALL LETTER K"}], "\ud835\udc8c": [{"c": "k", "n": "LATIN SMALL LETTER K"}], "\ud835\udcc0": [{"c": "k", "n": "LATIN SMALL LETTER K"}], "\ud835\udcf4": [{"c": "k", "n": "LATIN SMALL LETTER K"}], "\ud835\udd28": [{"c": "k", "n": "LATIN SMALL LETTER K"}], "\ud835\udd5c": [{"c": "k", "n": "LATIN SMALL LETTER K"}], "\ud835\udd90": [{"c": "k", "n": "LATIN SMALL LETTER K"}], "\ud835\uddc4": [{"c": "k", "n": "LATIN SMALL LETTER K"}], "\ud835\uddf8": [{"c": "k", "n": "LATIN SMALL LETTER K"}], "\ud835\ude2c": [{"c": "k", "n": "LATIN SMALL LETTER K"}], "\ud835\ude60": [{"c": "k", "n": "LATIN SMALL LETTER K"}], "\ud835\ude94": [{"c": "k", "n": "LATIN SMALL LETTER K"}], "\u212a": [{"c": "K", "n": "LATIN CAPITAL LETTER K"}], "K": [{"c": "\u212a", "n": "KELVIN SIGN"}, {"c": "\uff2b", "n": "FULLWIDTH LATIN CAPITAL LETTER K"}, {"c": "\ud835\udc0a", "n": "MATHEMATICAL BOLD CAPITAL K"}, {"c": "\ud835\udc3e", "n": "MATHEMATICAL ITALIC CAPITAL K"}, {"c": "\ud835\udc72", "n": "MATHEMATICAL BOLD ITALIC CAPITAL K"}, {"c": "\ud835\udca6", "n": "MATHEMATICAL SCRIPT CAPITAL K"}, {"c": "\ud835\udcda", "n": "MATHEMATICAL BOLD SCRIPT CAPITAL K"}, {"c": "\ud835\udd0e", "n": "MATHEMATICAL FRAKTUR CAPITAL K"}, {"c": "\ud835\udd42", "n": "MATHEMATICAL DOUBLE-STRUCK CAPITAL K"}, {"c": "\ud835\udd76", "n": "MATHEMATICAL BOLD FRAKTUR CAPITAL K"}, {"c": "\ud835\uddaa", "n": "MATHEMATICAL SANS-SERIF CAPITAL K"}, {"c": "\ud835\uddde", "n": "MATHEMATICAL SANS-SERIF BOLD CAPITAL K"}, {"c": "\ud835\ude12", "n": "MATHEMATICAL SANS-SERIF ITALIC CAPITAL K"}, {"c": "\ud835\ude46", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K"}, {"c": "\ud835\ude7a", "n": "MATHEMATICAL MONOSPACE CAPITAL K"}, {"c": "\u039a", "n": "GREEK CAPITAL LETTER KAPPA"}, {"c": "\ud835\udeb1", "n": "MATHEMATICAL BOLD CAPITAL KAPPA"}, {"c": "\ud835\udeeb", "n": "MATHEMATICAL ITALIC CAPITAL KAPPA"}, {"c": "\ud835\udf25", "n": "MATHEMATICAL BOLD ITALIC CAPITAL KAPPA"}, {"c": "\ud835\udf5f", "n": "MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA"}, {"c": "\ud835\udf99", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA"}, {"c": "\u2c94", "n": "COPTIC CAPITAL LETTER KAPA"}, {"c": "\u041a", "n": "CYRILLIC CAPITAL LETTER KA"}, {"c": "\u13e6", "n": "CHEROKEE LETTER TSO"}, {"c": "\u16d5", "n": "RUNIC LETTER OPEN-P"}, {"c": "\ua4d7", "n": "LISU LETTER KA"}, {"c": "\ud801\udd18", "n": "ELBASAN LETTER QE"}], "\uff2b": [{"c": "K", "n": "LATIN CAPITAL LETTER K"}], "\ud835\udc0a": [{"c": "K", "n": "LATIN CAPITAL LETTER K"}], "\ud835\udc3e": [{"c": "K", "n": "LATIN CAPITAL LETTER K"}], "\ud835\udc72": [{"c": "K", "n": "LATIN CAPITAL LETTER K"}], "\ud835\udca6": [{"c": "K", "n": "LATIN CAPITAL LETTER K"}], "\ud835\udcda": [{"c": "K", "n": "LATIN CAPITAL LETTER K"}], "\ud835\udd0e": [{"c": "K", "n": "LATIN CAPITAL LETTER K"}], "\ud835\udd42": [{"c": "K", "n": "LATIN CAPITAL LETTER K"}], "\ud835\udd76": [{"c": "K", "n": "LATIN CAPITAL LETTER K"}], "\ud835\uddaa": [{"c": "K", "n": "LATIN CAPITAL LETTER K"}], "\ud835\uddde": [{"c": "K", "n": "LATIN CAPITAL LETTER K"}], "\ud835\ude12": [{"c": "K", "n": "LATIN CAPITAL LETTER K"}], "\ud835\ude46": [{"c": "K", "n": "LATIN CAPITAL LETTER K"}], "\ud835\ude7a": [{"c": "K", "n": "LATIN CAPITAL LETTER K"}], "\u039a": [{"c": "K", "n": "LATIN CAPITAL LETTER K"}], "\ud835\udeb1": [{"c": "K", "n": "LATIN CAPITAL LETTER K"}], "\ud835\udeeb": [{"c": "K", "n": "LATIN CAPITAL LETTER K"}], "\ud835\udf25": [{"c": "K", "n": "LATIN CAPITAL LETTER K"}], "\ud835\udf5f": [{"c": "K", "n": "LATIN CAPITAL LETTER K"}], "\ud835\udf99": [{"c": "K", "n": "LATIN CAPITAL LETTER K"}], "\u2c94": [{"c": "K", "n": "LATIN CAPITAL LETTER K"}], "\u041a": [{"c": "K", "n": "LATIN CAPITAL LETTER K"}], "\u13e6": [{"c": "K", "n": "LATIN CAPITAL LETTER K"}], "\u16d5": [{"c": "K", "n": "LATIN CAPITAL LETTER K"}], "\ua4d7": [{"c": "K", "n": "LATIN CAPITAL LETTER K"}], "\ud801\udd18": [{"c": "K", "n": "LATIN CAPITAL LETTER K"}], "\u0199": [{"c": "k\u0314", "n": "LATIN SMALL LETTER K, COMBINING REVERSED COMMA ABOVE"}], "k\u0314": [{"c": "\u0199", "n": "LATIN SMALL LETTER K WITH HOOK"}], "\u2c69": [{"c": "K\u0329", "n": "LATIN CAPITAL LETTER K, COMBINING VERTICAL LINE BELOW"}], "K\u0329": [{"c": "\u2c69", "n": "LATIN CAPITAL LETTER K WITH DESCENDER"}, {"c": "\u049a", "n": "CYRILLIC CAPITAL LETTER KA WITH DESCENDER"}], "\u049a": [{"c": "K\u0329", "n": "LATIN CAPITAL LETTER K, COMBINING VERTICAL LINE BELOW"}], "\u20ad": [{"c": "K\u0335", "n": "LATIN CAPITAL LETTER K, COMBINING SHORT STROKE OVERLAY"}], "K\u0335": [{"c": "\u20ad", "n": "KIP SIGN"}, {"c": "\ua740", "n": "LATIN CAPITAL LETTER K WITH STROKE"}, {"c": "\u049e", "n": "CYRILLIC CAPITAL LETTER KA WITH STROKE"}], "\ua740": [{"c": "K\u0335", "n": "LATIN CAPITAL LETTER K, COMBINING SHORT STROKE OVERLAY"}], "\u049e": [{"c": "K\u0335", "n": "LATIN CAPITAL LETTER K, COMBINING SHORT STROKE OVERLAY"}], "\u0198": [{"c": "K'", "n": "LATIN CAPITAL LETTER K, APOSTROPHE"}], "K'": [{"c": "\u0198", "n": "LATIN CAPITAL LETTER K WITH HOOK"}], "\u200e\u05c0\u200e": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "l": [{"c": "\u200e\u05c0\u200e", "n": "HEBREW PUNCTUATION PASEQ"}, {"c": "|", "n": "VERTICAL LINE"}, {"c": "\u2223", "n": "DIVIDES"}, {"c": "\u23fd", "n": "POWER ON SYMBOL"}, {"c": "\uffe8", "n": "HALFWIDTH FORMS LIGHT VERTICAL"}, {"c": "1", "n": "DIGIT ONE"}, {"c": "\u200e\u0661\u200e", "n": "ARABIC-INDIC DIGIT ONE"}, {"c": "\u06f1", "n": "EXTENDED ARABIC-INDIC DIGIT ONE"}, {"c": "\ud800\udf20", "n": "OLD ITALIC NUMERAL ONE"}, {"c": "\u200e\ud83a\udcc7\u200e", "n": "MENDE KIKAKUI DIGIT ONE"}, {"c": "\ud835\udfcf", "n": "MATHEMATICAL BOLD DIGIT ONE"}, {"c": "\ud835\udfd9", "n": "MATHEMATICAL DOUBLE-STRUCK DIGIT ONE"}, {"c": "\ud835\udfe3", "n": "MATHEMATICAL SANS-SERIF DIGIT ONE"}, {"c": "\ud835\udfed", "n": "MATHEMATICAL SANS-SERIF BOLD DIGIT ONE"}, {"c": "\ud835\udff7", "n": "MATHEMATICAL MONOSPACE DIGIT ONE"}, {"c": "I", "n": "LATIN CAPITAL LETTER I"}, {"c": "\uff29", "n": "FULLWIDTH LATIN CAPITAL LETTER I"}, {"c": "\u2160", "n": "ROMAN NUMERAL ONE"}, {"c": "\u2110", "n": "SCRIPT CAPITAL I"}, {"c": "\u2111", "n": "BLACK-LETTER CAPITAL I"}, {"c": "\ud835\udc08", "n": "MATHEMATICAL BOLD CAPITAL I"}, {"c": "\ud835\udc3c", "n": "MATHEMATICAL ITALIC CAPITAL I"}, {"c": "\ud835\udc70", "n": "MATHEMATICAL BOLD ITALIC CAPITAL I"}, {"c": "\ud835\udcd8", "n": "MATHEMATICAL BOLD SCRIPT CAPITAL I"}, {"c": "\ud835\udd40", "n": "MATHEMATICAL DOUBLE-STRUCK CAPITAL I"}, {"c": "\ud835\udd74", "n": "MATHEMATICAL BOLD FRAKTUR CAPITAL I"}, {"c": "\ud835\udda8", "n": "MATHEMATICAL SANS-SERIF CAPITAL I"}, {"c": "\ud835\udddc", "n": "MATHEMATICAL SANS-SERIF BOLD CAPITAL I"}, {"c": "\ud835\ude10", "n": "MATHEMATICAL SANS-SERIF ITALIC CAPITAL I"}, {"c": "\ud835\ude44", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I"}, {"c": "\ud835\ude78", "n": "MATHEMATICAL MONOSPACE CAPITAL I"}, {"c": "\u0196", "n": "LATIN CAPITAL LETTER IOTA"}, {"c": "\uff4c", "n": "FULLWIDTH LATIN SMALL LETTER L"}, {"c": "\u217c", "n": "SMALL ROMAN NUMERAL FIFTY"}, {"c": "\u2113", "n": "SCRIPT SMALL L"}, {"c": "\ud835\udc25", "n": "MATHEMATICAL BOLD SMALL L"}, {"c": "\ud835\udc59", "n": "MATHEMATICAL ITALIC SMALL L"}, {"c": "\ud835\udc8d", "n": "MATHEMATICAL BOLD ITALIC SMALL L"}, {"c": "\ud835\udcc1", "n": "MATHEMATICAL SCRIPT SMALL L"}, {"c": "\ud835\udcf5", "n": "MATHEMATICAL BOLD SCRIPT SMALL L"}, {"c": "\ud835\udd29", "n": "MATHEMATICAL FRAKTUR SMALL L"}, {"c": "\ud835\udd5d", "n": "MATHEMATICAL DOUBLE-STRUCK SMALL L"}, {"c": "\ud835\udd91", "n": "MATHEMATICAL BOLD FRAKTUR SMALL L"}, {"c": "\ud835\uddc5", "n": "MATHEMATICAL SANS-SERIF SMALL L"}, {"c": "\ud835\uddf9", "n": "MATHEMATICAL SANS-SERIF BOLD SMALL L"}, {"c": "\ud835\ude2d", "n": "MATHEMATICAL SANS-SERIF ITALIC SMALL L"}, {"c": "\ud835\ude61", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L"}, {"c": "\ud835\ude95", "n": "MATHEMATICAL MONOSPACE SMALL L"}, {"c": "\u01c0", "n": "LATIN LETTER DENTAL CLICK"}, {"c": "\u0399", "n": "GREEK CAPITAL LETTER IOTA"}, {"c": "\ud835\udeb0", "n": "MATHEMATICAL BOLD CAPITAL IOTA"}, {"c": "\ud835\udeea", "n": "MATHEMATICAL ITALIC CAPITAL IOTA"}, {"c": "\ud835\udf24", "n": "MATHEMATICAL BOLD ITALIC CAPITAL IOTA"}, {"c": "\ud835\udf5e", "n": "MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA"}, {"c": "\ud835\udf98", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA"}, {"c": "\u2c92", "n": "COPTIC CAPITAL LETTER IAUDA"}, {"c": "\u0406", "n": "CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I"}, {"c": "\u04c0", "n": "CYRILLIC LETTER PALOCHKA"}, {"c": "\u200e\u05d5\u200e", "n": "HEBREW LETTER VAV"}, {"c": "\u200e\u05df\u200e", "n": "HEBREW LETTER FINAL NUN"}, {"c": "\u200e\u0627\u200e", "n": "ARABIC LETTER ALEF"}, {"c": "\u200e\ud83b\ude00\u200e", "n": "ARABIC MATHEMATICAL ALEF"}, {"c": "\u200e\ud83b\ude80\u200e", "n": "ARABIC MATHEMATICAL LOOPED ALEF"}, {"c": "\u200e\ufe8e\u200e", "n": "ARABIC LETTER ALEF FINAL FORM"}, {"c": "\u200e\ufe8d\u200e", "n": "ARABIC LETTER ALEF ISOLATED FORM"}, {"c": "\u200e\u07ca\u200e", "n": "NKO LETTER A"}, {"c": "\u2d4f", "n": "TIFINAGH LETTER YAN"}, {"c": "\u16c1", "n": "RUNIC LETTER ISAZ IS ISS I"}, {"c": "\ua4f2", "n": "LISU LETTER I"}, {"c": "\ud81b\udf28", "n": "MIAO LETTER GHA"}, {"c": "\ud800\ude8a", "n": "LYCIAN LETTER J"}, {"c": "\ud800\udf09", "n": "OLD ITALIC LETTER I"}], "|": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\u2223": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\u23fd": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\uffe8": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "1": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\u200e\u0661\u200e": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\u06f1": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\ud800\udf20": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\u200e\ud83a\udcc7\u200e": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\ud835\udfcf": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\ud835\udfd9": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\ud835\udfe3": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\ud835\udfed": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\ud835\udff7": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "I": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\uff29": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\u2160": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\u2110": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\u2111": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\ud835\udc08": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\ud835\udc3c": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\ud835\udc70": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\ud835\udcd8": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\ud835\udd40": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\ud835\udd74": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\ud835\udda8": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\ud835\udddc": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\ud835\ude10": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\ud835\ude44": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\ud835\ude78": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\u0196": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\uff4c": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\u217c": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\u2113": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\ud835\udc25": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\ud835\udc59": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\ud835\udc8d": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\ud835\udcc1": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\ud835\udcf5": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\ud835\udd29": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\ud835\udd5d": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\ud835\udd91": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\ud835\uddc5": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\ud835\uddf9": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\ud835\ude2d": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\ud835\ude61": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\ud835\ude95": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\u01c0": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\u0399": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\ud835\udeb0": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\ud835\udeea": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\ud835\udf24": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\ud835\udf5e": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\ud835\udf98": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\u2c92": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\u0406": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\u04c0": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\u200e\u05d5\u200e": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\u200e\u05df\u200e": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\u200e\u0627\u200e": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\u200e\ud83b\ude00\u200e": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\u200e\ud83b\ude80\u200e": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\u200e\ufe8e\u200e": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\u200e\ufe8d\u200e": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\u200e\u07ca\u200e": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\u2d4f": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\u16c1": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\ua4f2": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\ud81b\udf28": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\ud800\ude8a": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\ud800\udf09": [{"c": "l", "n": "LATIN SMALL LETTER L"}], "\ud834\ude2a": [{"c": "L", "n": "LATIN CAPITAL LETTER L"}], "L": [{"c": "\ud834\ude2a", "n": "GREEK INSTRUMENTAL NOTATION SYMBOL-23"}, {"c": "\u216c", "n": "ROMAN NUMERAL FIFTY"}, {"c": "\u2112", "n": "SCRIPT CAPITAL L"}, {"c": "\ud835\udc0b", "n": "MATHEMATICAL BOLD CAPITAL L"}, {"c": "\ud835\udc3f", "n": "MATHEMATICAL ITALIC CAPITAL L"}, {"c": "\ud835\udc73", "n": "MATHEMATICAL BOLD ITALIC CAPITAL L"}, {"c": "\ud835\udcdb", "n": "MATHEMATICAL BOLD SCRIPT CAPITAL L"}, {"c": "\ud835\udd0f", "n": "MATHEMATICAL FRAKTUR CAPITAL L"}, {"c": "\ud835\udd43", "n": "MATHEMATICAL DOUBLE-STRUCK CAPITAL L"}, {"c": "\ud835\udd77", "n": "MATHEMATICAL BOLD FRAKTUR CAPITAL L"}, {"c": "\ud835\uddab", "n": "MATHEMATICAL SANS-SERIF CAPITAL L"}, {"c": "\ud835\udddf", "n": "MATHEMATICAL SANS-SERIF BOLD CAPITAL L"}, {"c": "\ud835\ude13", "n": "MATHEMATICAL SANS-SERIF ITALIC CAPITAL L"}, {"c": "\ud835\ude47", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L"}, {"c": "\ud835\ude7b", "n": "MATHEMATICAL MONOSPACE CAPITAL L"}, {"c": "\u2cd0", "n": "COPTIC CAPITAL LETTER L-SHAPED HA"}, {"c": "\u13de", "n": "CHEROKEE LETTER TLE"}, {"c": "\u14aa", "n": "CANADIAN SYLLABICS MA"}, {"c": "\ua4e1", "n": "LISU LETTER LA"}, {"c": "\ud81b\udf16", "n": "MIAO LETTER LA"}, {"c": "\ud806\udca3", "n": "WARANG CITI CAPITAL LETTER YU"}, {"c": "\ud806\udcb2", "n": "WARANG CITI CAPITAL LETTER TTE"}, {"c": "\ud801\udc1b", "n": "DESERET CAPITAL LETTER ETH"}, {"c": "\ud801\udd26", "n": "ELBASAN LETTER GHAMMA"}], "\u216c": [{"c": "L", "n": "LATIN CAPITAL LETTER L"}], "\u2112": [{"c": "L", "n": "LATIN CAPITAL LETTER L"}], "\ud835\udc0b": [{"c": "L", "n": "LATIN CAPITAL LETTER L"}], "\ud835\udc3f": [{"c": "L", "n": "LATIN CAPITAL LETTER L"}], "\ud835\udc73": [{"c": "L", "n": "LATIN CAPITAL LETTER L"}], "\ud835\udcdb": [{"c": "L", "n": "LATIN CAPITAL LETTER L"}], "\ud835\udd0f": [{"c": "L", "n": "LATIN CAPITAL LETTER L"}], "\ud835\udd43": [{"c": "L", "n": "LATIN CAPITAL LETTER L"}], "\ud835\udd77": [{"c": "L", "n": "LATIN CAPITAL LETTER L"}], "\ud835\uddab": [{"c": "L", "n": "LATIN CAPITAL LETTER L"}], "\ud835\udddf": [{"c": "L", "n": "LATIN CAPITAL LETTER L"}], "\ud835\ude13": [{"c": "L", "n": "LATIN CAPITAL LETTER L"}], "\ud835\ude47": [{"c": "L", "n": "LATIN CAPITAL LETTER L"}], "\ud835\ude7b": [{"c": "L", "n": "LATIN CAPITAL LETTER L"}], "\u2cd0": [{"c": "L", "n": "LATIN CAPITAL LETTER L"}], "\u13de": [{"c": "L", "n": "LATIN CAPITAL LETTER L"}], "\u14aa": [{"c": "L", "n": "LATIN CAPITAL LETTER L"}], "\ua4e1": [{"c": "L", "n": "LATIN CAPITAL LETTER L"}], "\ud81b\udf16": [{"c": "L", "n": "LATIN CAPITAL LETTER L"}], "\ud806\udca3": [{"c": "L", "n": "LATIN CAPITAL LETTER L"}], "\ud806\udcb2": [{"c": "L", "n": "LATIN CAPITAL LETTER L"}], "\ud801\udc1b": [{"c": "L", "n": "LATIN CAPITAL LETTER L"}], "\ud801\udd26": [{"c": "L", "n": "LATIN CAPITAL LETTER L"}], "\u200e\ufd3c\u200e": [{"c": "l\u030b", "n": "LATIN SMALL LETTER L, COMBINING DOUBLE ACUTE ACCENT"}], "l\u030b": [{"c": "\u200e\ufd3c\u200e", "n": "ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM"}, {"c": "\u200e\ufd3d\u200e", "n": "ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM"}], "\u200e\ufd3d\u200e": [{"c": "l\u030b", "n": "LATIN SMALL LETTER L, COMBINING DOUBLE ACUTE ACCENT"}], "\u0142": [{"c": "l\u0338", "n": "LATIN SMALL LETTER L, COMBINING LONG SOLIDUS OVERLAY"}], "l\u0338": [{"c": "\u0142", "n": "LATIN SMALL LETTER L WITH STROKE"}], "\u0141": [{"c": "L\u0338", "n": "LATIN CAPITAL LETTER L, COMBINING LONG SOLIDUS OVERLAY"}], "L\u0338": [{"c": "\u0141", "n": "LATIN CAPITAL LETTER L WITH STROKE"}], "\u026d": [{"c": "l\u0328", "n": "LATIN SMALL LETTER L, COMBINING OGONEK"}], "l\u0328": [{"c": "\u026d", "n": "LATIN SMALL LETTER L WITH RETROFLEX HOOK"}], "\u0197": [{"c": "l\u0335", "n": "LATIN SMALL LETTER L, COMBINING SHORT STROKE OVERLAY"}], "l\u0335": [{"c": "\u0197", "n": "LATIN CAPITAL LETTER I WITH STROKE"}, {"c": "\u019a", "n": "LATIN SMALL LETTER L WITH BAR"}], "\u019a": [{"c": "l\u0335", "n": "LATIN SMALL LETTER L, COMBINING SHORT STROKE OVERLAY"}], "\u026b": [{"c": "l\u0334", "n": "LATIN SMALL LETTER L, COMBINING TILDE OVERLAY"}], "l\u0334": [{"c": "\u026b", "n": "LATIN SMALL LETTER L WITH MIDDLE TILDE"}], "\u200e\u0625\u200e": [{"c": "l\u0655", "n": "LATIN SMALL LETTER L, ARABIC HAMZA BELOW"}], "l\u0655": [{"c": "\u200e\u0625\u200e", "n": "ARABIC LETTER ALEF WITH HAMZA BELOW"}, {"c": "\u200e\ufe88\u200e", "n": "ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM"}, {"c": "\u200e\ufe87\u200e", "n": "ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM"}, {"c": "\u200e\u0673\u200e", "n": "ARABIC LETTER ALEF WITH WAVY HAMZA BELOW"}], "\u200e\ufe88\u200e": [{"c": "l\u0655", "n": "LATIN SMALL LETTER L, ARABIC HAMZA BELOW"}], "\u200e\ufe87\u200e": [{"c": "l\u0655", "n": "LATIN SMALL LETTER L, ARABIC HAMZA BELOW"}], "\u200e\u0673\u200e": [{"c": "l\u0655", "n": "LATIN SMALL LETTER L, ARABIC HAMZA BELOW"}], "\u0140": [{"c": "l\u00b7", "n": "LATIN SMALL LETTER L, MIDDLE DOT"}], "l\u00b7": [{"c": "\u0140", "n": "LATIN SMALL LETTER L WITH MIDDLE DOT"}, {"c": "\u013f", "n": "LATIN CAPITAL LETTER L WITH MIDDLE DOT"}, {"c": "\u14b7", "n": "CANADIAN SYLLABICS WEST-CREE MWA"}], "\u013f": [{"c": "l\u00b7", "n": "LATIN SMALL LETTER L, MIDDLE DOT"}], "\u14b7": [{"c": "l\u00b7", "n": "LATIN SMALL LETTER L, MIDDLE DOT"}], "\ud83c\udd02": [{"c": "l,", "n": "LATIN SMALL LETTER L, COMMA"}], "l,": [{"c": "\ud83c\udd02", "n": "DIGIT ONE COMMA"}], "\u2488": [{"c": "l.", "n": "LATIN SMALL LETTER L, FULL STOP"}], "l.": [{"c": "\u2488", "n": "DIGIT ONE FULL STOP"}], "\u200e\u05f1\u200e": [{"c": "l'", "n": "LATIN SMALL LETTER L, APOSTROPHE"}], "l'": [{"c": "\u200e\u05f1\u200e", "n": "HEBREW LIGATURE YIDDISH VAV YOD"}], "\u2493": [{"c": "l2.", "n": "LATIN SMALL LETTER L, DIGIT TWO, FULL STOP"}], "l2.": [{"c": "\u2493", "n": "NUMBER TWELVE FULL STOP"}], "\u33eb": [{"c": "l2\u65e5", "n": "LATIN SMALL LETTER L, DIGIT TWO, CJK UNIFIED IDEOGRAPH-65E5"}], "l2\u65e5": [{"c": "\u33eb", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE"}], "\u32cb": [{"c": "l2\u6708", "n": "LATIN SMALL LETTER L, DIGIT TWO, CJK UNIFIED IDEOGRAPH-6708"}], "l2\u6708": [{"c": "\u32cb", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER"}], "\u3364": [{"c": "l2\u70b9", "n": "LATIN SMALL LETTER L, DIGIT TWO, CJK UNIFIED IDEOGRAPH-70B9"}], "l2\u70b9": [{"c": "\u3364", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE"}], "\u2494": [{"c": "l3.", "n": "LATIN SMALL LETTER L, DIGIT THREE, FULL STOP"}], "l3.": [{"c": "\u2494", "n": "NUMBER THIRTEEN FULL STOP"}], "\u33ec": [{"c": "l3\u65e5", "n": "LATIN SMALL LETTER L, DIGIT THREE, CJK UNIFIED IDEOGRAPH-65E5"}], "l3\u65e5": [{"c": "\u33ec", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN"}], "\u3365": [{"c": "l3\u70b9", "n": "LATIN SMALL LETTER L, DIGIT THREE, CJK UNIFIED IDEOGRAPH-70B9"}], "l3\u70b9": [{"c": "\u3365", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN"}], "\u2495": [{"c": "l4.", "n": "LATIN SMALL LETTER L, DIGIT FOUR, FULL STOP"}], "l4.": [{"c": "\u2495", "n": "NUMBER FOURTEEN FULL STOP"}], "\u33ed": [{"c": "l4\u65e5", "n": "LATIN SMALL LETTER L, DIGIT FOUR, CJK UNIFIED IDEOGRAPH-65E5"}], "l4\u65e5": [{"c": "\u33ed", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN"}], "\u3366": [{"c": "l4\u70b9", "n": "LATIN SMALL LETTER L, DIGIT FOUR, CJK UNIFIED IDEOGRAPH-70B9"}], "l4\u70b9": [{"c": "\u3366", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN"}], "\u2496": [{"c": "l5.", "n": "LATIN SMALL LETTER L, DIGIT FIVE, FULL STOP"}], "l5.": [{"c": "\u2496", "n": "NUMBER FIFTEEN FULL STOP"}], "\u33ee": [{"c": "l5\u65e5", "n": "LATIN SMALL LETTER L, DIGIT FIVE, CJK UNIFIED IDEOGRAPH-65E5"}], "l5\u65e5": [{"c": "\u33ee", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN"}], "\u3367": [{"c": "l5\u70b9", "n": "LATIN SMALL LETTER L, DIGIT FIVE, CJK UNIFIED IDEOGRAPH-70B9"}], "l5\u70b9": [{"c": "\u3367", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN"}], "\u2497": [{"c": "l6.", "n": "LATIN SMALL LETTER L, DIGIT SIX, FULL STOP"}], "l6.": [{"c": "\u2497", "n": "NUMBER SIXTEEN FULL STOP"}], "\u33ef": [{"c": "l6\u65e5", "n": "LATIN SMALL LETTER L, DIGIT SIX, CJK UNIFIED IDEOGRAPH-65E5"}], "l6\u65e5": [{"c": "\u33ef", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN"}], "\u3368": [{"c": "l6\u70b9", "n": "LATIN SMALL LETTER L, DIGIT SIX, CJK UNIFIED IDEOGRAPH-70B9"}], "l6\u70b9": [{"c": "\u3368", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN"}], "\u2498": [{"c": "l7.", "n": "LATIN SMALL LETTER L, DIGIT SEVEN, FULL STOP"}], "l7.": [{"c": "\u2498", "n": "NUMBER SEVENTEEN FULL STOP"}], "\u33f0": [{"c": "l7\u65e5", "n": "LATIN SMALL LETTER L, DIGIT SEVEN, CJK UNIFIED IDEOGRAPH-65E5"}], "l7\u65e5": [{"c": "\u33f0", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN"}], "\u3369": [{"c": "l7\u70b9", "n": "LATIN SMALL LETTER L, DIGIT SEVEN, CJK UNIFIED IDEOGRAPH-70B9"}], "l7\u70b9": [{"c": "\u3369", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN"}], "\u2499": [{"c": "l8.", "n": "LATIN SMALL LETTER L, DIGIT EIGHT, FULL STOP"}], "l8.": [{"c": "\u2499", "n": "NUMBER EIGHTEEN FULL STOP"}], "\u33f1": [{"c": "l8\u65e5", "n": "LATIN SMALL LETTER L, DIGIT EIGHT, CJK UNIFIED IDEOGRAPH-65E5"}], "l8\u65e5": [{"c": "\u33f1", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN"}], "\u336a": [{"c": "l8\u70b9", "n": "LATIN SMALL LETTER L, DIGIT EIGHT, CJK UNIFIED IDEOGRAPH-70B9"}], "l8\u70b9": [{"c": "\u336a", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN"}], "\u249a": [{"c": "l9.", "n": "LATIN SMALL LETTER L, DIGIT NINE, FULL STOP"}], "l9.": [{"c": "\u249a", "n": "NUMBER NINETEEN FULL STOP"}], "\u33f2": [{"c": "l9\u65e5", "n": "LATIN SMALL LETTER L, DIGIT NINE, CJK UNIFIED IDEOGRAPH-65E5"}], "l9\u65e5": [{"c": "\u33f2", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN"}], "\u336b": [{"c": "l9\u70b9", "n": "LATIN SMALL LETTER L, DIGIT NINE, CJK UNIFIED IDEOGRAPH-70B9"}], "l9\u70b9": [{"c": "\u336b", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN"}], "\u01c9": [{"c": "lj", "n": "LATIN SMALL LETTER L, LATIN SMALL LETTER J"}], "lj": [{"c": "\u01c9", "n": "LATIN SMALL LETTER LJ"}], "\u0132": [{"c": "lJ", "n": "LATIN SMALL LETTER L, LATIN CAPITAL LETTER J"}], "lJ": [{"c": "\u0132", "n": "LATIN CAPITAL LIGATURE IJ"}], "\u01c8": [{"c": "Lj", "n": "LATIN CAPITAL LETTER L, LATIN SMALL LETTER J"}], "Lj": [{"c": "\u01c8", "n": "LATIN CAPITAL LETTER L WITH SMALL LETTER J"}], "\u01c7": [{"c": "LJ", "n": "LATIN CAPITAL LETTER L, LATIN CAPITAL LETTER J"}], "LJ": [{"c": "\u01c7", "n": "LATIN CAPITAL LETTER LJ"}], "\u2016": [{"c": "ll", "n": "LATIN SMALL LETTER L, LATIN SMALL LETTER L"}], "ll": [{"c": "\u2016", "n": "DOUBLE VERTICAL LINE"}, {"c": "\u2225", "n": "PARALLEL TO"}, {"c": "\u2161", "n": "ROMAN NUMERAL TWO"}, {"c": "\u01c1", "n": "LATIN LETTER LATERAL CLICK"}, {"c": "\u200e\u05f0\u200e", "n": "HEBREW LIGATURE YIDDISH DOUBLE VAV"}], "\u2225": [{"c": "ll", "n": "LATIN SMALL LETTER L, LATIN SMALL LETTER L"}], "\u2161": [{"c": "ll", "n": "LATIN SMALL LETTER L, LATIN SMALL LETTER L"}], "\u01c1": [{"c": "ll", "n": "LATIN SMALL LETTER L, LATIN SMALL LETTER L"}], "\u200e\u05f0\u200e": [{"c": "ll", "n": "LATIN SMALL LETTER L, LATIN SMALL LETTER L"}], "\ud800\udd99": [{"c": "l\u0335l\u0335", "n": "LATIN SMALL LETTER L, COMBINING SHORT STROKE OVERLAY, LATIN SMALL LETTER L, COMBINING SHORT STROKE OVERLAY"}], "l\u0335l\u0335": [{"c": "\ud800\udd99", "n": "ROMAN DUPONDIUS SIGN"}], "\u2492": [{"c": "ll.", "n": "LATIN SMALL LETTER L, LATIN SMALL LETTER L, FULL STOP"}], "ll.": [{"c": "\u2492", "n": "NUMBER ELEVEN FULL STOP"}], "\u2162": [{"c": "lll", "n": "LATIN SMALL LETTER L, LATIN SMALL LETTER L, LATIN SMALL LETTER L"}], "lll": [{"c": "\u2162", "n": "ROMAN NUMERAL THREE"}], "\ud800\udd98": [{"c": "l\u0335l\u0335S\u0335", "n": "LATIN SMALL LETTER L, COMBINING SHORT STROKE OVERLAY, LATIN SMALL LETTER L, COMBINING SHORT STROKE OVERLAY, LATIN CAPITAL LETTER S, COMBINING SHORT STROKE OVERLAY"}], "l\u0335l\u0335S\u0335": [{"c": "\ud800\udd98", "n": "ROMAN SESTERTIUS SIGN"}], "\u33ea": [{"c": "ll\u65e5", "n": "LATIN SMALL LETTER L, LATIN SMALL LETTER L, CJK UNIFIED IDEOGRAPH-65E5"}], "ll\u65e5": [{"c": "\u33ea", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN"}], "\u32ca": [{"c": "ll\u6708", "n": "LATIN SMALL LETTER L, LATIN SMALL LETTER L, CJK UNIFIED IDEOGRAPH-6708"}], "ll\u6708": [{"c": "\u32ca", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER"}], "\u3363": [{"c": "ll\u70b9", "n": "LATIN SMALL LETTER L, LATIN SMALL LETTER L, CJK UNIFIED IDEOGRAPH-70B9"}], "ll\u70b9": [{"c": "\u3363", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN"}], "\u042e": [{"c": "lO", "n": "LATIN SMALL LETTER L, LATIN CAPITAL LETTER O"}], "lO": [{"c": "\u042e", "n": "CYRILLIC CAPITAL LETTER YU"}], "\u2491": [{"c": "lO.", "n": "LATIN SMALL LETTER L, LATIN CAPITAL LETTER O, FULL STOP"}], "lO.": [{"c": "\u2491", "n": "NUMBER TEN FULL STOP"}], "\u33e9": [{"c": "lO\u65e5", "n": "LATIN SMALL LETTER L, LATIN CAPITAL LETTER O, CJK UNIFIED IDEOGRAPH-65E5"}], "lO\u65e5": [{"c": "\u33e9", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN"}], "\u32c9": [{"c": "lO\u6708", "n": "LATIN SMALL LETTER L, LATIN CAPITAL LETTER O, CJK UNIFIED IDEOGRAPH-6708"}], "lO\u6708": [{"c": "\u32c9", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER"}], "\u3362": [{"c": "lO\u70b9", "n": "LATIN SMALL LETTER L, LATIN CAPITAL LETTER O, CJK UNIFIED IDEOGRAPH-70B9"}], "lO\u70b9": [{"c": "\u3362", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN"}], "\u02aa": [{"c": "ls", "n": "LATIN SMALL LETTER L, LATIN SMALL LETTER S"}], "ls": [{"c": "\u02aa", "n": "LATIN SMALL LETTER LS DIGRAPH"}], "\u20b6": [{"c": "lt", "n": "LATIN SMALL LETTER L, LATIN SMALL LETTER T"}], "lt": [{"c": "\u20b6", "n": "LIVRE TOURNOIS SIGN"}], "\u2163": [{"c": "lV", "n": "LATIN SMALL LETTER L, LATIN CAPITAL LETTER V"}], "lV": [{"c": "\u2163", "n": "ROMAN NUMERAL FOUR"}], "\u2168": [{"c": "lX", "n": "LATIN SMALL LETTER L, LATIN CAPITAL LETTER X"}], "lX": [{"c": "\u2168", "n": "ROMAN NUMERAL NINE"}], "\u026e": [{"c": "l\u021d", "n": "LATIN SMALL LETTER L, LATIN SMALL LETTER YOGH"}], "l\u021d": [{"c": "\u026e", "n": "LATIN SMALL LETTER LEZH"}], "\u02ab": [{"c": "lz", "n": "LATIN SMALL LETTER L, LATIN SMALL LETTER Z"}], "lz": [{"c": "\u02ab", "n": "LATIN SMALL LETTER LZ DIGRAPH"}], "\u200e\u0623\u200e": [{"c": "\u200el\u0674\u200e", "n": "LATIN SMALL LETTER L, ARABIC LETTER HIGH HAMZA"}], "\u200el\u0674\u200e": [{"c": "\u200e\u0623\u200e", "n": "ARABIC LETTER ALEF WITH HAMZA ABOVE"}, {"c": "\u200e\ufe84\u200e", "n": "ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM"}, {"c": "\u200e\ufe83\u200e", "n": "ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM"}, {"c": "\u200e\u0672\u200e", "n": "ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE"}, {"c": "\u200e\u0675\u200e", "n": "ARABIC LETTER HIGH HAMZA ALEF"}], "\u200e\ufe84\u200e": [{"c": "\u200el\u0674\u200e", "n": "LATIN SMALL LETTER L, ARABIC LETTER HIGH HAMZA"}], "\u200e\ufe83\u200e": [{"c": "\u200el\u0674\u200e", "n": "LATIN SMALL LETTER L, ARABIC LETTER HIGH HAMZA"}], "\u200e\u0672\u200e": [{"c": "\u200el\u0674\u200e", "n": "LATIN SMALL LETTER L, ARABIC LETTER HIGH HAMZA"}], "\u200e\u0675\u200e": [{"c": "\u200el\u0674\u200e", "n": "LATIN SMALL LETTER L, ARABIC LETTER HIGH HAMZA"}], "\u200e\ufdf3\u200e": [{"c": "\u200el\u0643\u0628\u0631\u200e", "n": "LATIN SMALL LETTER L, ARABIC LETTER KAF, ARABIC LETTER BEH, ARABIC LETTER REH"}], "\u200el\u0643\u0628\u0631\u200e": [{"c": "\u200e\ufdf3\u200e", "n": "ARABIC LIGATURE AKBAR ISOLATED FORM"}], "\u200e\ufdf2\u200e": [{"c": "\u200el\u0644\u0644\u0651\u0670o\u200e", "n": "LATIN SMALL LETTER L, ARABIC LETTER LAM, ARABIC LETTER LAM, ARABIC SHADDA, ARABIC LETTER SUPERSCRIPT ALEF, LATIN SMALL LETTER O"}], "\u200el\u0644\u0644\u0651\u0670o\u200e": [{"c": "\u200e\ufdf2\u200e", "n": "ARABIC LIGATURE ALLAH ISOLATED FORM"}], "\u33e0": [{"c": "l\u65e5", "n": "LATIN SMALL LETTER L, CJK UNIFIED IDEOGRAPH-65E5"}], "l\u65e5": [{"c": "\u33e0", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE"}], "\u32c0": [{"c": "l\u6708", "n": "LATIN SMALL LETTER L, CJK UNIFIED IDEOGRAPH-6708"}], "l\u6708": [{"c": "\u32c0", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY"}], "\u3359": [{"c": "l\u70b9", "n": "LATIN SMALL LETTER L, CJK UNIFIED IDEOGRAPH-70B9"}], "l\u70b9": [{"c": "\u3359", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE"}], "\u2cd1": [{"c": "\u029f", "n": "LATIN LETTER SMALL CAPITAL L"}], "\u029f": [{"c": "\u2cd1", "n": "COPTIC SMALL LETTER L-SHAPED HA"}, {"c": "\uabae", "n": "CHEROKEE SMALL LETTER TLE"}, {"c": "\ud801\udc43", "n": "DESERET SMALL LETTER ETH"}], "\uabae": [{"c": "\u029f", "n": "LATIN LETTER SMALL CAPITAL L"}], "\ud801\udc43": [{"c": "\u029f", "n": "LATIN LETTER SMALL CAPITAL L"}], "\uff2d": [{"c": "M", "n": "LATIN CAPITAL LETTER M"}], "M": [{"c": "\uff2d", "n": "FULLWIDTH LATIN CAPITAL LETTER M"}, {"c": "\u216f", "n": "ROMAN NUMERAL ONE THOUSAND"}, {"c": "\u2133", "n": "SCRIPT CAPITAL M"}, {"c": "\ud835\udc0c", "n": "MATHEMATICAL BOLD CAPITAL M"}, {"c": "\ud835\udc40", "n": "MATHEMATICAL ITALIC CAPITAL M"}, {"c": "\ud835\udc74", "n": "MATHEMATICAL BOLD ITALIC CAPITAL M"}, {"c": "\ud835\udcdc", "n": "MATHEMATICAL BOLD SCRIPT CAPITAL M"}, {"c": "\ud835\udd10", "n": "MATHEMATICAL FRAKTUR CAPITAL M"}, {"c": "\ud835\udd44", "n": "MATHEMATICAL DOUBLE-STRUCK CAPITAL M"}, {"c": "\ud835\udd78", "n": "MATHEMATICAL BOLD FRAKTUR CAPITAL M"}, {"c": "\ud835\uddac", "n": "MATHEMATICAL SANS-SERIF CAPITAL M"}, {"c": "\ud835\udde0", "n": "MATHEMATICAL SANS-SERIF BOLD CAPITAL M"}, {"c": "\ud835\ude14", "n": "MATHEMATICAL SANS-SERIF ITALIC CAPITAL M"}, {"c": "\ud835\ude48", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M"}, {"c": "\ud835\ude7c", "n": "MATHEMATICAL MONOSPACE CAPITAL M"}, {"c": "\u039c", "n": "GREEK CAPITAL LETTER MU"}, {"c": "\ud835\udeb3", "n": "MATHEMATICAL BOLD CAPITAL MU"}, {"c": "\ud835\udeed", "n": "MATHEMATICAL ITALIC CAPITAL MU"}, {"c": "\ud835\udf27", "n": "MATHEMATICAL BOLD ITALIC CAPITAL MU"}, {"c": "\ud835\udf61", "n": "MATHEMATICAL SANS-SERIF BOLD CAPITAL MU"}, {"c": "\ud835\udf9b", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU"}, {"c": "\u03fa", "n": "GREEK CAPITAL LETTER SAN"}, {"c": "\u2c98", "n": "COPTIC CAPITAL LETTER MI"}, {"c": "\u041c", "n": "CYRILLIC CAPITAL LETTER EM"}, {"c": "\u13b7", "n": "CHEROKEE LETTER LU"}, {"c": "\u15f0", "n": "CANADIAN SYLLABICS CARRIER GO"}, {"c": "\u16d6", "n": "RUNIC LETTER EHWAZ EH E"}, {"c": "\ua4df", "n": "LISU LETTER MA"}, {"c": "\ud800\udeb0", "n": "CARIAN LETTER S"}, {"c": "\ud800\udf11", "n": "OLD ITALIC LETTER SHE"}], "\u216f": [{"c": "M", "n": "LATIN CAPITAL LETTER M"}], "\u2133": [{"c": "M", "n": "LATIN CAPITAL LETTER M"}], "\ud835\udc0c": [{"c": "M", "n": "LATIN CAPITAL LETTER M"}], "\ud835\udc40": [{"c": "M", "n": "LATIN CAPITAL LETTER M"}], "\ud835\udc74": [{"c": "M", "n": "LATIN CAPITAL LETTER M"}], "\ud835\udcdc": [{"c": "M", "n": "LATIN CAPITAL LETTER M"}], "\ud835\udd10": [{"c": "M", "n": "LATIN CAPITAL LETTER M"}], "\ud835\udd44": [{"c": "M", "n": "LATIN CAPITAL LETTER M"}], "\ud835\udd78": [{"c": "M", "n": "LATIN CAPITAL LETTER M"}], "\ud835\uddac": [{"c": "M", "n": "LATIN CAPITAL LETTER M"}], "\ud835\udde0": [{"c": "M", "n": "LATIN CAPITAL LETTER M"}], "\ud835\ude14": [{"c": "M", "n": "LATIN CAPITAL LETTER M"}], "\ud835\ude48": [{"c": "M", "n": "LATIN CAPITAL LETTER M"}], "\ud835\ude7c": [{"c": "M", "n": "LATIN CAPITAL LETTER M"}], "\u039c": [{"c": "M", "n": "LATIN CAPITAL LETTER M"}], "\ud835\udeb3": [{"c": "M", "n": "LATIN CAPITAL LETTER M"}], "\ud835\udeed": [{"c": "M", "n": "LATIN CAPITAL LETTER M"}], "\ud835\udf27": [{"c": "M", "n": "LATIN CAPITAL LETTER M"}], "\ud835\udf61": [{"c": "M", "n": "LATIN CAPITAL LETTER M"}], "\ud835\udf9b": [{"c": "M", "n": "LATIN CAPITAL LETTER M"}], "\u03fa": [{"c": "M", "n": "LATIN CAPITAL LETTER M"}], "\u2c98": [{"c": "M", "n": "LATIN CAPITAL LETTER M"}], "\u041c": [{"c": "M", "n": "LATIN CAPITAL LETTER M"}], "\u13b7": [{"c": "M", "n": "LATIN CAPITAL LETTER M"}], "\u15f0": [{"c": "M", "n": "LATIN CAPITAL LETTER M"}], "\u16d6": [{"c": "M", "n": "LATIN CAPITAL LETTER M"}], "\ua4df": [{"c": "M", "n": "LATIN CAPITAL LETTER M"}], "\ud800\udeb0": [{"c": "M", "n": "LATIN CAPITAL LETTER M"}], "\ud800\udf11": [{"c": "M", "n": "LATIN CAPITAL LETTER M"}], "\u04cd": [{"c": "M\u0326", "n": "LATIN CAPITAL LETTER M, COMBINING COMMA BELOW"}], "M\u0326": [{"c": "\u04cd", "n": "CYRILLIC CAPITAL LETTER EM WITH TAIL"}], "\ud83d\udf6b": [{"c": "MB", "n": "LATIN CAPITAL LETTER M, LATIN CAPITAL LETTER B"}], "MB": [{"c": "\ud83d\udf6b", "n": "ALCHEMICAL SYMBOL FOR BATH OF MARY"}], "\u2de8": [{"c": "\u1ddf", "n": "COMBINING LATIN LETTER SMALL CAPITAL M"}], "\u1ddf": [{"c": "\u2de8", "n": "COMBINING CYRILLIC LETTER EM"}], "\ud835\udc27": [{"c": "n", "n": "LATIN SMALL LETTER N"}], "n": [{"c": "\ud835\udc27", "n": "MATHEMATICAL BOLD SMALL N"}, {"c": "\ud835\udc5b", "n": "MATHEMATICAL ITALIC SMALL N"}, {"c": "\ud835\udc8f", "n": "MATHEMATICAL BOLD ITALIC SMALL N"}, {"c": "\ud835\udcc3", "n": "MATHEMATICAL SCRIPT SMALL N"}, {"c": "\ud835\udcf7", "n": "MATHEMATICAL BOLD SCRIPT SMALL N"}, {"c": "\ud835\udd2b", "n": "MATHEMATICAL FRAKTUR SMALL N"}, {"c": "\ud835\udd5f", "n": "MATHEMATICAL DOUBLE-STRUCK SMALL N"}, {"c": "\ud835\udd93", "n": "MATHEMATICAL BOLD FRAKTUR SMALL N"}, {"c": "\ud835\uddc7", "n": "MATHEMATICAL SANS-SERIF SMALL N"}, {"c": "\ud835\uddfb", "n": "MATHEMATICAL SANS-SERIF BOLD SMALL N"}, {"c": "\ud835\ude2f", "n": "MATHEMATICAL SANS-SERIF ITALIC SMALL N"}, {"c": "\ud835\ude63", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N"}, {"c": "\ud835\ude97", "n": "MATHEMATICAL MONOSPACE SMALL N"}, {"c": "\u0578", "n": "ARMENIAN SMALL LETTER VO"}, {"c": "\u057c", "n": "ARMENIAN SMALL LETTER RA"}], "\ud835\udc5b": [{"c": "n", "n": "LATIN SMALL LETTER N"}], "\ud835\udc8f": [{"c": "n", "n": "LATIN SMALL LETTER N"}], "\ud835\udcc3": [{"c": "n", "n": "LATIN SMALL LETTER N"}], "\ud835\udcf7": [{"c": "n", "n": "LATIN SMALL LETTER N"}], "\ud835\udd2b": [{"c": "n", "n": "LATIN SMALL LETTER N"}], "\ud835\udd5f": [{"c": "n", "n": "LATIN SMALL LETTER N"}], "\ud835\udd93": [{"c": "n", "n": "LATIN SMALL LETTER N"}], "\ud835\uddc7": [{"c": "n", "n": "LATIN SMALL LETTER N"}], "\ud835\uddfb": [{"c": "n", "n": "LATIN SMALL LETTER N"}], "\ud835\ude2f": [{"c": "n", "n": "LATIN SMALL LETTER N"}], "\ud835\ude63": [{"c": "n", "n": "LATIN SMALL LETTER N"}], "\ud835\ude97": [{"c": "n", "n": "LATIN SMALL LETTER N"}], "\u0578": [{"c": "n", "n": "LATIN SMALL LETTER N"}], "\u057c": [{"c": "n", "n": "LATIN SMALL LETTER N"}], "\uff2e": [{"c": "N", "n": "LATIN CAPITAL LETTER N"}], "N": [{"c": "\uff2e", "n": "FULLWIDTH LATIN CAPITAL LETTER N"}, {"c": "\u2115", "n": "DOUBLE-STRUCK CAPITAL N"}, {"c": "\ud835\udc0d", "n": "MATHEMATICAL BOLD CAPITAL N"}, {"c": "\ud835\udc41", "n": "MATHEMATICAL ITALIC CAPITAL N"}, {"c": "\ud835\udc75", "n": "MATHEMATICAL BOLD ITALIC CAPITAL N"}, {"c": "\ud835\udca9", "n": "MATHEMATICAL SCRIPT CAPITAL N"}, {"c": "\ud835\udcdd", "n": "MATHEMATICAL BOLD SCRIPT CAPITAL N"}, {"c": "\ud835\udd11", "n": "MATHEMATICAL FRAKTUR CAPITAL N"}, {"c": "\ud835\udd79", "n": "MATHEMATICAL BOLD FRAKTUR CAPITAL N"}, {"c": "\ud835\uddad", "n": "MATHEMATICAL SANS-SERIF CAPITAL N"}, {"c": "\ud835\udde1", "n": "MATHEMATICAL SANS-SERIF BOLD CAPITAL N"}, {"c": "\ud835\ude15", "n": "MATHEMATICAL SANS-SERIF ITALIC CAPITAL N"}, {"c": "\ud835\ude49", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N"}, {"c": "\ud835\ude7d", "n": "MATHEMATICAL MONOSPACE CAPITAL N"}, {"c": "\u039d", "n": "GREEK CAPITAL LETTER NU"}, {"c": "\ud835\udeb4", "n": "MATHEMATICAL BOLD CAPITAL NU"}, {"c": "\ud835\udeee", "n": "MATHEMATICAL ITALIC CAPITAL NU"}, {"c": "\ud835\udf28", "n": "MATHEMATICAL BOLD ITALIC CAPITAL NU"}, {"c": "\ud835\udf62", "n": "MATHEMATICAL SANS-SERIF BOLD CAPITAL NU"}, {"c": "\ud835\udf9c", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU"}, {"c": "\u2c9a", "n": "COPTIC CAPITAL LETTER NI"}, {"c": "\ua4e0", "n": "LISU LETTER NA"}, {"c": "\ud801\udd13", "n": "ELBASAN LETTER NE"}], "\u2115": [{"c": "N", "n": "LATIN CAPITAL LETTER N"}], "\ud835\udc0d": [{"c": "N", "n": "LATIN CAPITAL LETTER N"}], "\ud835\udc41": [{"c": "N", "n": "LATIN CAPITAL LETTER N"}], "\ud835\udc75": [{"c": "N", "n": "LATIN CAPITAL LETTER N"}], "\ud835\udca9": [{"c": "N", "n": "LATIN CAPITAL LETTER N"}], "\ud835\udcdd": [{"c": "N", "n": "LATIN CAPITAL LETTER N"}], "\ud835\udd11": [{"c": "N", "n": "LATIN CAPITAL LETTER N"}], "\ud835\udd79": [{"c": "N", "n": "LATIN CAPITAL LETTER N"}], "\ud835\uddad": [{"c": "N", "n": "LATIN CAPITAL LETTER N"}], "\ud835\udde1": [{"c": "N", "n": "LATIN CAPITAL LETTER N"}], "\ud835\ude15": [{"c": "N", "n": "LATIN CAPITAL LETTER N"}], "\ud835\ude49": [{"c": "N", "n": "LATIN CAPITAL LETTER N"}], "\ud835\ude7d": [{"c": "N", "n": "LATIN CAPITAL LETTER N"}], "\u039d": [{"c": "N", "n": "LATIN CAPITAL LETTER N"}], "\ud835\udeb4": [{"c": "N", "n": "LATIN CAPITAL LETTER N"}], "\ud835\udeee": [{"c": "N", "n": "LATIN CAPITAL LETTER N"}], "\ud835\udf28": [{"c": "N", "n": "LATIN CAPITAL LETTER N"}], "\ud835\udf62": [{"c": "N", "n": "LATIN CAPITAL LETTER N"}], "\ud835\udf9c": [{"c": "N", "n": "LATIN CAPITAL LETTER N"}], "\u2c9a": [{"c": "N", "n": "LATIN CAPITAL LETTER N"}], "\ua4e0": [{"c": "N", "n": "LATIN CAPITAL LETTER N"}], "\ud801\udd13": [{"c": "N", "n": "LATIN CAPITAL LETTER N"}], "\ud800\udd8e": [{"c": "N\u030a", "n": "LATIN CAPITAL LETTER N, COMBINING RING ABOVE"}], "N\u030a": [{"c": "\ud800\udd8e", "n": "NOMISMA SIGN"}], "\u0273": [{"c": "n\u0328", "n": "LATIN SMALL LETTER N, COMBINING OGONEK"}], "n\u0328": [{"c": "\u0273", "n": "LATIN SMALL LETTER N WITH RETROFLEX HOOK"}], "\u019e": [{"c": "n\u0329", "n": "LATIN SMALL LETTER N, COMBINING VERTICAL LINE BELOW"}], "n\u0329": [{"c": "\u019e", "n": "LATIN SMALL LETTER N WITH LONG RIGHT LEG"}, {"c": "\u03b7", "n": "GREEK SMALL LETTER ETA"}, {"c": "\ud835\udec8", "n": "MATHEMATICAL BOLD SMALL ETA"}, {"c": "\ud835\udf02", "n": "MATHEMATICAL ITALIC SMALL ETA"}, {"c": "\ud835\udf3c", "n": "MATHEMATICAL BOLD ITALIC SMALL ETA"}, {"c": "\ud835\udf76", "n": "MATHEMATICAL SANS-SERIF BOLD SMALL ETA"}, {"c": "\ud835\udfb0", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA"}], "\u03b7": [{"c": "n\u0329", "n": "LATIN SMALL LETTER N, COMBINING VERTICAL LINE BELOW"}], "\ud835\udec8": [{"c": "n\u0329", "n": "LATIN SMALL LETTER N, COMBINING VERTICAL LINE BELOW"}], "\ud835\udf02": [{"c": "n\u0329", "n": "LATIN SMALL LETTER N, COMBINING VERTICAL LINE BELOW"}], "\ud835\udf3c": [{"c": "n\u0329", "n": "LATIN SMALL LETTER N, COMBINING VERTICAL LINE BELOW"}], "\ud835\udf76": [{"c": "n\u0329", "n": "LATIN SMALL LETTER N, COMBINING VERTICAL LINE BELOW"}], "\ud835\udfb0": [{"c": "n\u0329", "n": "LATIN SMALL LETTER N, COMBINING VERTICAL LINE BELOW"}], "\u019d": [{"c": "N\u0326", "n": "LATIN CAPITAL LETTER N, COMBINING COMMA BELOW"}], "N\u0326": [{"c": "\u019d", "n": "LATIN CAPITAL LETTER N WITH LEFT HOOK"}], "\u1d70": [{"c": "n\u0334", "n": "LATIN SMALL LETTER N, COMBINING TILDE OVERLAY"}], "n\u0334": [{"c": "\u1d70", "n": "LATIN SMALL LETTER N WITH MIDDLE TILDE"}], "\u01cc": [{"c": "nj", "n": "LATIN SMALL LETTER N, LATIN SMALL LETTER J"}], "nj": [{"c": "\u01cc", "n": "LATIN SMALL LETTER NJ"}], "\u01cb": [{"c": "Nj", "n": "LATIN CAPITAL LETTER N, LATIN SMALL LETTER J"}], "Nj": [{"c": "\u01cb", "n": "LATIN CAPITAL LETTER N WITH SMALL LETTER J"}], "\u01ca": [{"c": "NJ", "n": "LATIN CAPITAL LETTER N, LATIN CAPITAL LETTER J"}], "NJ": [{"c": "\u01ca", "n": "LATIN CAPITAL LETTER NJ"}], "\u2116": [{"c": "No", "n": "LATIN CAPITAL LETTER N, LATIN SMALL LETTER O"}], "No": [{"c": "\u2116", "n": "NUMERO SIGN"}], "\u0377": [{"c": "\u1d0e", "n": "LATIN LETTER SMALL CAPITAL REVERSED N"}], "\u1d0e": [{"c": "\u0377", "n": "GREEK SMALL LETTER PAMPHYLIAN DIGAMMA"}, {"c": "\u0438", "n": "CYRILLIC SMALL LETTER I"}, {"c": "\ud801\udc4d", "n": "DESERET SMALL LETTER ENG"}], "\u0438": [{"c": "\u1d0e", "n": "LATIN LETTER SMALL CAPITAL REVERSED N"}], "\ud801\udc4d": [{"c": "\u1d0e", "n": "LATIN LETTER SMALL CAPITAL REVERSED N"}], "\u0146": [{"c": "\u0272", "n": "LATIN SMALL LETTER N WITH LEFT HOOK"}], "\u0272": [{"c": "\u0146", "n": "LATIN SMALL LETTER N WITH CEDILLA"}], "\u0c02": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "o": [{"c": "\u0c02", "n": "TELUGU SIGN ANUSVARA"}, {"c": "\u0c82", "n": "KANNADA SIGN ANUSVARA"}, {"c": "\u0d02", "n": "MALAYALAM SIGN ANUSVARA"}, {"c": "\u0d82", "n": "SINHALA SIGN ANUSVARAYA"}, {"c": "\u0966", "n": "DEVANAGARI DIGIT ZERO"}, {"c": "\u0a66", "n": "GURMUKHI DIGIT ZERO"}, {"c": "\u0ae6", "n": "GUJARATI DIGIT ZERO"}, {"c": "\u0be6", "n": "TAMIL DIGIT ZERO"}, {"c": "\u0c66", "n": "TELUGU DIGIT ZERO"}, {"c": "\u0ce6", "n": "KANNADA DIGIT ZERO"}, {"c": "\u0d66", "n": "MALAYALAM DIGIT ZERO"}, {"c": "\u0e50", "n": "THAI DIGIT ZERO"}, {"c": "\u0ed0", "n": "LAO DIGIT ZERO"}, {"c": "\u1040", "n": "MYANMAR DIGIT ZERO"}, {"c": "\u200e\u0665\u200e", "n": "ARABIC-INDIC DIGIT FIVE"}, {"c": "\u06f5", "n": "EXTENDED ARABIC-INDIC DIGIT FIVE"}, {"c": "\uff4f", "n": "FULLWIDTH LATIN SMALL LETTER O"}, {"c": "\u2134", "n": "SCRIPT SMALL O"}, {"c": "\ud835\udc28", "n": "MATHEMATICAL BOLD SMALL O"}, {"c": "\ud835\udc5c", "n": "MATHEMATICAL ITALIC SMALL O"}, {"c": "\ud835\udc90", "n": "MATHEMATICAL BOLD ITALIC SMALL O"}, {"c": "\ud835\udcf8", "n": "MATHEMATICAL BOLD SCRIPT SMALL O"}, {"c": "\ud835\udd2c", "n": "MATHEMATICAL FRAKTUR SMALL O"}, {"c": "\ud835\udd60", "n": "MATHEMATICAL DOUBLE-STRUCK SMALL O"}, {"c": "\ud835\udd94", "n": "MATHEMATICAL BOLD FRAKTUR SMALL O"}, {"c": "\ud835\uddc8", "n": "MATHEMATICAL SANS-SERIF SMALL O"}, {"c": "\ud835\uddfc", "n": "MATHEMATICAL SANS-SERIF BOLD SMALL O"}, {"c": "\ud835\ude30", "n": "MATHEMATICAL SANS-SERIF ITALIC SMALL O"}, {"c": "\ud835\ude64", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O"}, {"c": "\ud835\ude98", "n": "MATHEMATICAL MONOSPACE SMALL O"}, {"c": "\u1d0f", "n": "LATIN LETTER SMALL CAPITAL O"}, {"c": "\u1d11", "n": "LATIN SMALL LETTER SIDEWAYS O"}, {"c": "\uab3d", "n": "LATIN SMALL LETTER BLACKLETTER O"}, {"c": "\u03bf", "n": "GREEK SMALL LETTER OMICRON"}, {"c": "\ud835\uded0", "n": "MATHEMATICAL BOLD SMALL OMICRON"}, {"c": "\ud835\udf0a", "n": "MATHEMATICAL ITALIC SMALL OMICRON"}, {"c": "\ud835\udf44", "n": "MATHEMATICAL BOLD ITALIC SMALL OMICRON"}, {"c": "\ud835\udf7e", "n": "MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON"}, {"c": "\ud835\udfb8", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON"}, {"c": "\u03c3", "n": "GREEK SMALL LETTER SIGMA"}, {"c": "\ud835\uded4", "n": "MATHEMATICAL BOLD SMALL SIGMA"}, {"c": "\ud835\udf0e", "n": "MATHEMATICAL ITALIC SMALL SIGMA"}, {"c": "\ud835\udf48", "n": "MATHEMATICAL BOLD ITALIC SMALL SIGMA"}, {"c": "\ud835\udf82", "n": "MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA"}, {"c": "\ud835\udfbc", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA"}, {"c": "\u2c9f", "n": "COPTIC SMALL LETTER O"}, {"c": "\u043e", "n": "CYRILLIC SMALL LETTER O"}, {"c": "\u10ff", "n": "GEORGIAN LETTER LABIAL SIGN"}, {"c": "\u0585", "n": "ARMENIAN SMALL LETTER OH"}, {"c": "\u200e\u05e1\u200e", "n": "HEBREW LETTER SAMEKH"}, {"c": "\u200e\u0647\u200e", "n": "ARABIC LETTER HEH"}, {"c": "\u200e\ud83b\ude24\u200e", "n": "ARABIC MATHEMATICAL INITIAL HEH"}, {"c": "\u200e\ud83b\ude64\u200e", "n": "ARABIC MATHEMATICAL STRETCHED HEH"}, {"c": "\u200e\ud83b\ude84\u200e", "n": "ARABIC MATHEMATICAL LOOPED HEH"}, {"c": "\u200e\ufeeb\u200e", "n": "ARABIC LETTER HEH INITIAL FORM"}, {"c": "\u200e\ufeec\u200e", "n": "ARABIC LETTER HEH MEDIAL FORM"}, {"c": "\u200e\ufeea\u200e", "n": "ARABIC LETTER HEH FINAL FORM"}, {"c": "\u200e\ufee9\u200e", "n": "ARABIC LETTER HEH ISOLATED FORM"}, {"c": "\u200e\u06be\u200e", "n": "ARABIC LETTER HEH DOACHASHMEE"}, {"c": "\u200e\ufbac\u200e", "n": "ARABIC LETTER HEH DOACHASHMEE INITIAL FORM"}, {"c": "\u200e\ufbad\u200e", "n": "ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM"}, {"c": "\u200e\ufbab\u200e", "n": "ARABIC LETTER HEH DOACHASHMEE FINAL FORM"}, {"c": "\u200e\ufbaa\u200e", "n": "ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM"}, {"c": "\u200e\u06c1\u200e", "n": "ARABIC LETTER HEH GOAL"}, {"c": "\u200e\ufba8\u200e", "n": "ARABIC LETTER HEH GOAL INITIAL FORM"}, {"c": "\u200e\ufba9\u200e", "n": "ARABIC LETTER HEH GOAL MEDIAL FORM"}, {"c": "\u200e\ufba7\u200e", "n": "ARABIC LETTER HEH GOAL FINAL FORM"}, {"c": "\u200e\ufba6\u200e", "n": "ARABIC LETTER HEH GOAL ISOLATED FORM"}, {"c": "\u200e\u06d5\u200e", "n": "ARABIC LETTER AE"}, {"c": "\u0d20", "n": "MALAYALAM LETTER TTHA"}, {"c": "\u101d", "n": "MYANMAR LETTER WA"}, {"c": "\ud801\udcea", "n": "OSAGE SMALL LETTER O"}, {"c": "\ud806\udcc8", "n": "WARANG CITI SMALL LETTER E"}, {"c": "\ud806\udcd7", "n": "WARANG CITI SMALL LETTER BU"}, {"c": "\ud801\udc2c", "n": "DESERET SMALL LETTER LONG O"}], "\u0c82": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\u0d02": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\u0d82": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\u0966": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\u0a66": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\u0ae6": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\u0be6": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\u0c66": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\u0ce6": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\u0d66": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\u0e50": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\u0ed0": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\u1040": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\u200e\u0665\u200e": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\u06f5": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\uff4f": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\u2134": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\ud835\udc28": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\ud835\udc5c": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\ud835\udc90": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\ud835\udcf8": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\ud835\udd2c": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\ud835\udd60": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\ud835\udd94": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\ud835\uddc8": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\ud835\uddfc": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\ud835\ude30": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\ud835\ude64": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\ud835\ude98": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\u1d0f": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\u1d11": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\uab3d": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\u03bf": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\ud835\uded0": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\ud835\udf0a": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\ud835\udf44": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\ud835\udf7e": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\ud835\udfb8": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\u03c3": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\ud835\uded4": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\ud835\udf0e": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\ud835\udf48": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\ud835\udf82": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\ud835\udfbc": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\u2c9f": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\u043e": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\u10ff": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\u0585": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\u200e\u05e1\u200e": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\u200e\u0647\u200e": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\u200e\ud83b\ude24\u200e": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\u200e\ud83b\ude64\u200e": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\u200e\ud83b\ude84\u200e": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\u200e\ufeeb\u200e": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\u200e\ufeec\u200e": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\u200e\ufeea\u200e": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\u200e\ufee9\u200e": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\u200e\u06be\u200e": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\u200e\ufbac\u200e": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\u200e\ufbad\u200e": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\u200e\ufbab\u200e": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\u200e\ufbaa\u200e": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\u200e\u06c1\u200e": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\u200e\ufba8\u200e": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\u200e\ufba9\u200e": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\u200e\ufba7\u200e": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\u200e\ufba6\u200e": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\u200e\u06d5\u200e": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\u0d20": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\u101d": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\ud801\udcea": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\ud806\udcc8": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\ud806\udcd7": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "\ud801\udc2c": [{"c": "o", "n": "LATIN SMALL LETTER O"}], "0": [{"c": "O", "n": "LATIN CAPITAL LETTER O"}], "O": [{"c": "0", "n": "DIGIT ZERO"}, {"c": "\u200e\u07c0\u200e", "n": "NKO DIGIT ZERO"}, {"c": "\u09e6", "n": "BENGALI DIGIT ZERO"}, {"c": "\u0b66", "n": "ORIYA DIGIT ZERO"}, {"c": "\u3007", "n": "IDEOGRAPHIC NUMBER ZERO"}, {"c": "\ud805\udcd0", "n": "TIRHUTA DIGIT ZERO"}, {"c": "\ud806\udce0", "n": "WARANG CITI DIGIT ZERO"}, {"c": "\ud835\udfce", "n": "MATHEMATICAL BOLD DIGIT ZERO"}, {"c": "\ud835\udfd8", "n": "MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO"}, {"c": "\ud835\udfe2", "n": "MATHEMATICAL SANS-SERIF DIGIT ZERO"}, {"c": "\ud835\udfec", "n": "MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO"}, {"c": "\ud835\udff6", "n": "MATHEMATICAL MONOSPACE DIGIT ZERO"}, {"c": "\uff2f", "n": "FULLWIDTH LATIN CAPITAL LETTER O"}, {"c": "\ud835\udc0e", "n": "MATHEMATICAL BOLD CAPITAL O"}, {"c": "\ud835\udc42", "n": "MATHEMATICAL ITALIC CAPITAL O"}, {"c": "\ud835\udc76", "n": "MATHEMATICAL BOLD ITALIC CAPITAL O"}, {"c": "\ud835\udcaa", "n": "MATHEMATICAL SCRIPT CAPITAL O"}, {"c": "\ud835\udcde", "n": "MATHEMATICAL BOLD SCRIPT CAPITAL O"}, {"c": "\ud835\udd12", "n": "MATHEMATICAL FRAKTUR CAPITAL O"}, {"c": "\ud835\udd46", "n": "MATHEMATICAL DOUBLE-STRUCK CAPITAL O"}, {"c": "\ud835\udd7a", "n": "MATHEMATICAL BOLD FRAKTUR CAPITAL O"}, {"c": "\ud835\uddae", "n": "MATHEMATICAL SANS-SERIF CAPITAL O"}, {"c": "\ud835\udde2", "n": "MATHEMATICAL SANS-SERIF BOLD CAPITAL O"}, {"c": "\ud835\ude16", "n": "MATHEMATICAL SANS-SERIF ITALIC CAPITAL O"}, {"c": "\ud835\ude4a", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O"}, {"c": "\ud835\ude7e", "n": "MATHEMATICAL MONOSPACE CAPITAL O"}, {"c": "\u039f", "n": "GREEK CAPITAL LETTER OMICRON"}, {"c": "\ud835\udeb6", "n": "MATHEMATICAL BOLD CAPITAL OMICRON"}, {"c": "\ud835\udef0", "n": "MATHEMATICAL ITALIC CAPITAL OMICRON"}, {"c": "\ud835\udf2a", "n": "MATHEMATICAL BOLD ITALIC CAPITAL OMICRON"}, {"c": "\ud835\udf64", "n": "MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON"}, {"c": "\ud835\udf9e", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON"}, {"c": "\u2c9e", "n": "COPTIC CAPITAL LETTER O"}, {"c": "\u041e", "n": "CYRILLIC CAPITAL LETTER O"}, {"c": "\u0555", "n": "ARMENIAN CAPITAL LETTER OH"}, {"c": "\u2d54", "n": "TIFINAGH LETTER YAR"}, {"c": "\u12d0", "n": "ETHIOPIC SYLLABLE PHARYNGEAL A"}, {"c": "\u0b20", "n": "ORIYA LETTER TTHA"}, {"c": "\ud801\udcc2", "n": "OSAGE CAPITAL LETTER O"}, {"c": "\ua4f3", "n": "LISU LETTER O"}, {"c": "\ud806\udcb5", "n": "WARANG CITI CAPITAL LETTER AT"}, {"c": "\ud800\ude92", "n": "LYCIAN LETTER U"}, {"c": "\ud800\udeab", "n": "CARIAN LETTER O"}, {"c": "\ud801\udc04", "n": "DESERET CAPITAL LETTER LONG O"}, {"c": "\ud801\udd16", "n": "ELBASAN LETTER O"}], "\u200e\u07c0\u200e": [{"c": "O", "n": "LATIN CAPITAL LETTER O"}], "\u09e6": [{"c": "O", "n": "LATIN CAPITAL LETTER O"}], "\u0b66": [{"c": "O", "n": "LATIN CAPITAL LETTER O"}], "\u3007": [{"c": "O", "n": "LATIN CAPITAL LETTER O"}], "\ud805\udcd0": [{"c": "O", "n": "LATIN CAPITAL LETTER O"}], "\ud806\udce0": [{"c": "O", "n": "LATIN CAPITAL LETTER O"}], "\ud835\udfce": [{"c": "O", "n": "LATIN CAPITAL LETTER O"}], "\ud835\udfd8": [{"c": "O", "n": "LATIN CAPITAL LETTER O"}], "\ud835\udfe2": [{"c": "O", "n": "LATIN CAPITAL LETTER O"}], "\ud835\udfec": [{"c": "O", "n": "LATIN CAPITAL LETTER O"}], "\ud835\udff6": [{"c": "O", "n": "LATIN CAPITAL LETTER O"}], "\uff2f": [{"c": "O", "n": "LATIN CAPITAL LETTER O"}], "\ud835\udc0e": [{"c": "O", "n": "LATIN CAPITAL LETTER O"}], "\ud835\udc42": [{"c": "O", "n": "LATIN CAPITAL LETTER O"}], "\ud835\udc76": [{"c": "O", "n": "LATIN CAPITAL LETTER O"}], "\ud835\udcaa": [{"c": "O", "n": "LATIN CAPITAL LETTER O"}], "\ud835\udcde": [{"c": "O", "n": "LATIN CAPITAL LETTER O"}], "\ud835\udd12": [{"c": "O", "n": "LATIN CAPITAL LETTER O"}], "\ud835\udd46": [{"c": "O", "n": "LATIN CAPITAL LETTER O"}], "\ud835\udd7a": [{"c": "O", "n": "LATIN CAPITAL LETTER O"}], "\ud835\uddae": [{"c": "O", "n": "LATIN CAPITAL LETTER O"}], "\ud835\udde2": [{"c": "O", "n": "LATIN CAPITAL LETTER O"}], "\ud835\ude16": [{"c": "O", "n": "LATIN CAPITAL LETTER O"}], "\ud835\ude4a": [{"c": "O", "n": "LATIN CAPITAL LETTER O"}], "\ud835\ude7e": [{"c": "O", "n": "LATIN CAPITAL LETTER O"}], "\u039f": [{"c": "O", "n": "LATIN CAPITAL LETTER O"}], "\ud835\udeb6": [{"c": "O", "n": "LATIN CAPITAL LETTER O"}], "\ud835\udef0": [{"c": "O", "n": "LATIN CAPITAL LETTER O"}], "\ud835\udf2a": [{"c": "O", "n": "LATIN CAPITAL LETTER O"}], "\ud835\udf64": [{"c": "O", "n": "LATIN CAPITAL LETTER O"}], "\ud835\udf9e": [{"c": "O", "n": "LATIN CAPITAL LETTER O"}], "\u2c9e": [{"c": "O", "n": "LATIN CAPITAL LETTER O"}], "\u041e": [{"c": "O", "n": "LATIN CAPITAL LETTER O"}], "\u0555": [{"c": "O", "n": "LATIN CAPITAL LETTER O"}], "\u2d54": [{"c": "O", "n": "LATIN CAPITAL LETTER O"}], "\u12d0": [{"c": "O", "n": "LATIN CAPITAL LETTER O"}], "\u0b20": [{"c": "O", "n": "LATIN CAPITAL LETTER O"}], "\ud801\udcc2": [{"c": "O", "n": "LATIN CAPITAL LETTER O"}], "\ua4f3": [{"c": "O", "n": "LATIN CAPITAL LETTER O"}], "\ud806\udcb5": [{"c": "O", "n": "LATIN CAPITAL LETTER O"}], "\ud800\ude92": [{"c": "O", "n": "LATIN CAPITAL LETTER O"}], "\ud800\udeab": [{"c": "O", "n": "LATIN CAPITAL LETTER O"}], "\ud801\udc04": [{"c": "O", "n": "LATIN CAPITAL LETTER O"}], "\ud801\udd16": [{"c": "O", "n": "LATIN CAPITAL LETTER O"}], "\u2070": [{"c": "\u00ba", "n": "MASCULINE ORDINAL INDICATOR"}], "\u00ba": [{"c": "\u2070", "n": "SUPERSCRIPT ZERO"}, {"c": "\u1d52", "n": "MODIFIER LETTER SMALL O"}], "\u1d52": [{"c": "\u00ba", "n": "MASCULINE ORDINAL INDICATOR"}], "\u01d2": [{"c": "\u014f", "n": "LATIN SMALL LETTER O WITH BREVE"}], "\u014f": [{"c": "\u01d2", "n": "LATIN SMALL LETTER O WITH CARON"}], "\u01d1": [{"c": "\u014e", "n": "LATIN CAPITAL LETTER O WITH BREVE"}], "\u014e": [{"c": "\u01d1", "n": "LATIN CAPITAL LETTER O WITH CARON"}], "\u200e\u06ff\u200e": [{"c": "o\u0302", "n": "LATIN SMALL LETTER O, COMBINING CIRCUMFLEX ACCENT"}], "o\u0302": [{"c": "\u200e\u06ff\u200e", "n": "ARABIC LETTER HEH WITH INVERTED V"}], "\u0150": [{"c": "\u00d6", "n": "LATIN CAPITAL LETTER O WITH DIAERESIS"}], "\u00d6": [{"c": "\u0150", "n": "LATIN CAPITAL LETTER O WITH DOUBLE ACUTE"}], "\u00f8": [{"c": "o\u0338", "n": "LATIN SMALL LETTER O, COMBINING LONG SOLIDUS OVERLAY"}], "o\u0338": [{"c": "\u00f8", "n": "LATIN SMALL LETTER O WITH STROKE"}, {"c": "\uab3e", "n": "LATIN SMALL LETTER BLACKLETTER O WITH STROKE"}], "\uab3e": [{"c": "o\u0338", "n": "LATIN SMALL LETTER O, COMBINING LONG SOLIDUS OVERLAY"}], "\u00d8": [{"c": "O\u0338", "n": "LATIN CAPITAL LETTER O, COMBINING LONG SOLIDUS OVERLAY"}], "O\u0338": [{"c": "\u00d8", "n": "LATIN CAPITAL LETTER O WITH STROKE"}, {"c": "\u2d41", "n": "TIFINAGH LETTER BERBER ACADEMY YAH"}], "\u2d41": [{"c": "O\u0338", "n": "LATIN CAPITAL LETTER O, COMBINING LONG SOLIDUS OVERLAY"}], "\u01fe": [{"c": "O\u0338\u0301", "n": "LATIN CAPITAL LETTER O, COMBINING LONG SOLIDUS OVERLAY, COMBINING ACUTE ACCENT"}], "O\u0338\u0301": [{"c": "\u01fe", "n": "LATIN CAPITAL LETTER O WITH STROKE AND ACUTE"}], "\u0275": [{"c": "o\u0335", "n": "LATIN SMALL LETTER O, COMBINING SHORT STROKE OVERLAY"}], "o\u0335": [{"c": "\u0275", "n": "LATIN SMALL LETTER BARRED O"}, {"c": "\ua74b", "n": "LATIN SMALL LETTER O WITH LONG STROKE OVERLAY"}, {"c": "\u04e9", "n": "CYRILLIC SMALL LETTER BARRED O"}, {"c": "\u0473", "n": "CYRILLIC SMALL LETTER FITA"}, {"c": "\uab8e", "n": "CHEROKEE SMALL LETTER NA"}, {"c": "\uabbb", "n": "CHEROKEE SMALL LETTER WI"}], "\ua74b": [{"c": "o\u0335", "n": "LATIN SMALL LETTER O, COMBINING SHORT STROKE OVERLAY"}], "\u04e9": [{"c": "o\u0335", "n": "LATIN SMALL LETTER O, COMBINING SHORT STROKE OVERLAY"}], "\u0473": [{"c": "o\u0335", "n": "LATIN SMALL LETTER O, COMBINING SHORT STROKE OVERLAY"}], "\uab8e": [{"c": "o\u0335", "n": "LATIN SMALL LETTER O, COMBINING SHORT STROKE OVERLAY"}], "\uabbb": [{"c": "o\u0335", "n": "LATIN SMALL LETTER O, COMBINING SHORT STROKE OVERLAY"}], "\u2296": [{"c": "O\u0335", "n": "LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY"}], "O\u0335": [{"c": "\u2296", "n": "CIRCLED MINUS"}, {"c": "\u229d", "n": "CIRCLED DASH"}, {"c": "\u236c", "n": "APL FUNCTIONAL SYMBOL ZILDE"}, {"c": "\ud834\ude1a", "n": "GREEK VOCAL NOTATION SYMBOL-52"}, {"c": "\ud83d\udf14", "n": "ALCHEMICAL SYMBOL FOR SALT"}, {"c": "\u019f", "n": "LATIN CAPITAL LETTER O WITH MIDDLE TILDE"}, {"c": "\ua74a", "n": "LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY"}, {"c": "\u03b8", "n": "GREEK SMALL LETTER THETA"}, {"c": "\u03d1", "n": "GREEK THETA SYMBOL"}, {"c": "\ud835\udec9", "n": "MATHEMATICAL BOLD SMALL THETA"}, {"c": "\ud835\udedd", "n": "MATHEMATICAL BOLD THETA SYMBOL"}, {"c": "\ud835\udf03", "n": "MATHEMATICAL ITALIC SMALL THETA"}, {"c": "\ud835\udf17", "n": "MATHEMATICAL ITALIC THETA SYMBOL"}, {"c": "\ud835\udf3d", "n": "MATHEMATICAL BOLD ITALIC SMALL THETA"}, {"c": "\ud835\udf51", "n": "MATHEMATICAL BOLD ITALIC THETA SYMBOL"}, {"c": "\ud835\udf77", "n": "MATHEMATICAL SANS-SERIF BOLD SMALL THETA"}, {"c": "\ud835\udf8b", "n": "MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL"}, {"c": "\ud835\udfb1", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA"}, {"c": "\ud835\udfc5", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL"}, {"c": "\u0398", "n": "GREEK CAPITAL LETTER THETA"}, {"c": "\u03f4", "n": "GREEK CAPITAL THETA SYMBOL"}, {"c": "\ud835\udeaf", "n": "MATHEMATICAL BOLD CAPITAL THETA"}, {"c": "\ud835\udeb9", "n": "MATHEMATICAL BOLD CAPITAL THETA SYMBOL"}, {"c": "\ud835\udee9", "n": "MATHEMATICAL ITALIC CAPITAL THETA"}, {"c": "\ud835\udef3", "n": "MATHEMATICAL ITALIC CAPITAL THETA SYMBOL"}, {"c": "\ud835\udf23", "n": "MATHEMATICAL BOLD ITALIC CAPITAL THETA"}, {"c": "\ud835\udf2d", "n": "MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL"}, {"c": "\ud835\udf5d", "n": "MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA"}, {"c": "\ud835\udf67", "n": "MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL"}, {"c": "\ud835\udf97", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA"}, {"c": "\ud835\udfa1", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL"}, {"c": "\u04e8", "n": "CYRILLIC CAPITAL LETTER BARRED O"}, {"c": "\u0472", "n": "CYRILLIC CAPITAL LETTER FITA"}, {"c": "\u2d31", "n": "TIFINAGH LETTER YAB"}, {"c": "\u13be", "n": "CHEROKEE LETTER NA"}, {"c": "\u13eb", "n": "CHEROKEE LETTER WI"}], "\u229d": [{"c": "O\u0335", "n": "LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY"}], "\u236c": [{"c": "O\u0335", "n": "LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY"}], "\ud834\ude1a": [{"c": "O\u0335", "n": "LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY"}], "\ud83d\udf14": [{"c": "O\u0335", "n": "LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY"}], "\u019f": [{"c": "O\u0335", "n": "LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY"}], "\ua74a": [{"c": "O\u0335", "n": "LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY"}], "\u03b8": [{"c": "O\u0335", "n": "LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY"}], "\u03d1": [{"c": "O\u0335", "n": "LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY"}], "\ud835\udec9": [{"c": "O\u0335", "n": "LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY"}], "\ud835\udedd": [{"c": "O\u0335", "n": "LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY"}], "\ud835\udf03": [{"c": "O\u0335", "n": "LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY"}], "\ud835\udf17": [{"c": "O\u0335", "n": "LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY"}], "\ud835\udf3d": [{"c": "O\u0335", "n": "LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY"}], "\ud835\udf51": [{"c": "O\u0335", "n": "LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY"}], "\ud835\udf77": [{"c": "O\u0335", "n": "LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY"}], "\ud835\udf8b": [{"c": "O\u0335", "n": "LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY"}], "\ud835\udfb1": [{"c": "O\u0335", "n": "LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY"}], "\ud835\udfc5": [{"c": "O\u0335", "n": "LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY"}], "\u0398": [{"c": "O\u0335", "n": "LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY"}], "\u03f4": [{"c": "O\u0335", "n": "LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY"}], "\ud835\udeaf": [{"c": "O\u0335", "n": "LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY"}], "\ud835\udeb9": [{"c": "O\u0335", "n": "LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY"}], "\ud835\udee9": [{"c": "O\u0335", "n": "LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY"}], "\ud835\udef3": [{"c": "O\u0335", "n": "LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY"}], "\ud835\udf23": [{"c": "O\u0335", "n": "LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY"}], "\ud835\udf2d": [{"c": "O\u0335", "n": "LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY"}], "\ud835\udf5d": [{"c": "O\u0335", "n": "LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY"}], "\ud835\udf67": [{"c": "O\u0335", "n": "LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY"}], "\ud835\udf97": [{"c": "O\u0335", "n": "LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY"}], "\ud835\udfa1": [{"c": "O\u0335", "n": "LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY"}], "\u04e8": [{"c": "O\u0335", "n": "LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY"}], "\u0472": [{"c": "O\u0335", "n": "LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY"}], "\u2d31": [{"c": "O\u0335", "n": "LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY"}], "\u13be": [{"c": "O\u0335", "n": "LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY"}], "\u13eb": [{"c": "O\u0335", "n": "LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY"}], "\uab74": [{"c": "o\u031b", "n": "LATIN SMALL LETTER O, COMBINING HORN"}], "o\u031b": [{"c": "\uab74", "n": "CHEROKEE SMALL LETTER U"}], "\u200e\ufcd9\u200e": [{"c": "o\u0670", "n": "LATIN SMALL LETTER O, ARABIC LETTER SUPERSCRIPT ALEF"}], "o\u0670": [{"c": "\u200e\ufcd9\u200e", "n": "ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM"}], "\ud83c\udd01": [{"c": "O,", "n": "LATIN CAPITAL LETTER O, COMMA"}], "O,": [{"c": "\ud83c\udd01", "n": "DIGIT ZERO COMMA"}], "\ud83c\udd00": [{"c": "O.", "n": "LATIN CAPITAL LETTER O, FULL STOP"}], "O.": [{"c": "\ud83c\udd00", "n": "DIGIT ZERO FULL STOP"}], "\u01a1": [{"c": "o'", "n": "LATIN SMALL LETTER O, APOSTROPHE"}], "o'": [{"c": "\u01a1", "n": "LATIN SMALL LETTER O WITH HORN"}], "\u01a0": [{"c": "O'", "n": "LATIN CAPITAL LETTER O, APOSTROPHE"}], "O'": [{"c": "\u01a0", "n": "LATIN CAPITAL LETTER O WITH HORN"}, {"c": "\u13a4", "n": "CHEROKEE LETTER U"}], "\u13a4": [{"c": "O'", "n": "LATIN CAPITAL LETTER O, APOSTROPHE"}], "%": [{"c": "\u00ba/\u2080", "n": "MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO"}], "\u00ba/\u2080": [{"c": "%", "n": "PERCENT SIGN"}, {"c": "\u066a", "n": "ARABIC PERCENT SIGN"}, {"c": "\u2052", "n": "COMMERCIAL MINUS SIGN"}], "\u066a": [{"c": "\u00ba/\u2080", "n": "MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO"}], "\u2052": [{"c": "\u00ba/\u2080", "n": "MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO"}], "\u2030": [{"c": "\u00ba/\u2080\u2080", "n": "MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO"}], "\u00ba/\u2080\u2080": [{"c": "\u2030", "n": "PER MILLE SIGN"}, {"c": "\u0609", "n": "ARABIC-INDIC PER MILLE SIGN"}], "\u0609": [{"c": "\u00ba/\u2080\u2080", "n": "MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO"}], "\u2031": [{"c": "\u00ba/\u2080\u2080\u2080", "n": "MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO, SUBSCRIPT ZERO"}], "\u00ba/\u2080\u2080\u2080": [{"c": "\u2031", "n": "PER TEN THOUSAND SIGN"}, {"c": "\u060a", "n": "ARABIC-INDIC PER TEN THOUSAND SIGN"}], "\u060a": [{"c": "\u00ba/\u2080\u2080\u2080", "n": "MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO, SUBSCRIPT ZERO"}], "\u0153": [{"c": "oe", "n": "LATIN SMALL LETTER O, LATIN SMALL LETTER E"}], "oe": [{"c": "\u0153", "n": "LATIN SMALL LIGATURE OE"}], "\u0152": [{"c": "OE", "n": "LATIN CAPITAL LETTER O, LATIN CAPITAL LETTER E"}], "OE": [{"c": "\u0152", "n": "LATIN CAPITAL LIGATURE OE"}], "\u0276": [{"c": "o\u1d07", "n": "LATIN SMALL LETTER O, LATIN LETTER SMALL CAPITAL E"}], "o\u1d07": [{"c": "\u0276", "n": "LATIN LETTER SMALL CAPITAL OE"}], "\u221e": [{"c": "oo", "n": "LATIN SMALL LETTER O, LATIN SMALL LETTER O"}], "oo": [{"c": "\u221e", "n": "INFINITY"}, {"c": "\ua74f", "n": "LATIN SMALL LETTER OO"}, {"c": "\ua699", "n": "CYRILLIC SMALL LETTER DOUBLE O"}], "\ua74f": [{"c": "oo", "n": "LATIN SMALL LETTER O, LATIN SMALL LETTER O"}], "\ua699": [{"c": "oo", "n": "LATIN SMALL LETTER O, LATIN SMALL LETTER O"}], "\ua74e": [{"c": "OO", "n": "LATIN CAPITAL LETTER O, LATIN CAPITAL LETTER O"}], "OO": [{"c": "\ua74e", "n": "LATIN CAPITAL LETTER OO"}, {"c": "\ua698", "n": "CYRILLIC CAPITAL LETTER DOUBLE O"}], "\ua698": [{"c": "OO", "n": "LATIN CAPITAL LETTER O, LATIN CAPITAL LETTER O"}], "\u200e\ufcd7\u200e": [{"c": "\u200eo\u062c\u200e", "n": "LATIN SMALL LETTER O, ARABIC LETTER JEEM"}], "\u200eo\u062c\u200e": [{"c": "\u200e\ufcd7\u200e", "n": "ARABIC LIGATURE HEH WITH JEEM INITIAL FORM"}, {"c": "\u200e\ufc51\u200e", "n": "ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM"}], "\u200e\ufc51\u200e": [{"c": "\u200eo\u062c\u200e", "n": "LATIN SMALL LETTER O, ARABIC LETTER JEEM"}], "\u200e\ufcd8\u200e": [{"c": "\u200eo\u0645\u200e", "n": "LATIN SMALL LETTER O, ARABIC LETTER MEEM"}], "\u200eo\u0645\u200e": [{"c": "\u200e\ufcd8\u200e", "n": "ARABIC LIGATURE HEH WITH MEEM INITIAL FORM"}, {"c": "\u200e\ufc52\u200e", "n": "ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM"}], "\u200e\ufc52\u200e": [{"c": "\u200eo\u0645\u200e", "n": "LATIN SMALL LETTER O, ARABIC LETTER MEEM"}], "\u200e\ufd93\u200e": [{"c": "\u200eo\u0645\u062c\u200e", "n": "LATIN SMALL LETTER O, ARABIC LETTER MEEM, ARABIC LETTER JEEM"}], "\u200eo\u0645\u062c\u200e": [{"c": "\u200e\ufd93\u200e", "n": "ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM"}], "\u200e\ufd94\u200e": [{"c": "\u200eo\u0645\u0645\u200e", "n": "LATIN SMALL LETTER O, ARABIC LETTER MEEM, ARABIC LETTER MEEM"}], "\u200eo\u0645\u0645\u200e": [{"c": "\u200e\ufd94\u200e", "n": "ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM"}], "\u200e\ufc53\u200e": [{"c": "\u200eo\u0649\u200e", "n": "LATIN SMALL LETTER O, ARABIC LETTER ALEF MAKSURA"}], "\u200eo\u0649\u200e": [{"c": "\u200e\ufc53\u200e", "n": "ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM"}, {"c": "\u200e\ufc54\u200e", "n": "ARABIC LIGATURE HEH WITH YEH ISOLATED FORM"}], "\u200e\ufc54\u200e": [{"c": "\u200eo\u0649\u200e", "n": "LATIN SMALL LETTER O, ARABIC LETTER ALEF MAKSURA"}], "\u0d5f": [{"c": "o\u0d30o", "n": "LATIN SMALL LETTER O, MALAYALAM LETTER RA, LATIN SMALL LETTER O"}], "o\u0d30o": [{"c": "\u0d5f", "n": "MALAYALAM LETTER ARCHAIC II"}], "\u1010": [{"c": "o\u102c", "n": "LATIN SMALL LETTER O, MYANMAR VOWEL SIGN AA"}], "o\u102c": [{"c": "\u1010", "n": "MYANMAR LETTER TA"}], "\u3358": [{"c": "O\u70b9", "n": "LATIN CAPITAL LETTER O, CJK UNIFIED IDEOGRAPH-70B9"}], "O\u70b9": [{"c": "\u3358", "n": "IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO"}], "\u2184": [{"c": "\u0254", "n": "LATIN SMALL LETTER OPEN O"}], "\u0254": [{"c": "\u2184", "n": "LATIN SMALL LETTER REVERSED C"}, {"c": "\u1d10", "n": "LATIN LETTER SMALL CAPITAL OPEN O"}, {"c": "\u037b", "n": "GREEK SMALL REVERSED LUNATE SIGMA SYMBOL"}, {"c": "\ud801\udc4b", "n": "DESERET SMALL LETTER EM"}], "\u1d10": [{"c": "\u0254", "n": "LATIN SMALL LETTER OPEN O"}], "\u037b": [{"c": "\u0254", "n": "LATIN SMALL LETTER OPEN O"}], "\ud801\udc4b": [{"c": "\u0254", "n": "LATIN SMALL LETTER OPEN O"}], "\u2183": [{"c": "\u0186", "n": "LATIN CAPITAL LETTER OPEN O"}], "\u0186": [{"c": "\u2183", "n": "ROMAN NUMERAL REVERSED ONE HUNDRED"}, {"c": "\u03fd", "n": "GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL"}, {"c": "\ua4db", "n": "LISU LETTER CHA"}, {"c": "\ud801\udc23", "n": "DESERET CAPITAL LETTER EM"}], "\u03fd": [{"c": "\u0186", "n": "LATIN CAPITAL LETTER OPEN O"}], "\ua4db": [{"c": "\u0186", "n": "LATIN CAPITAL LETTER OPEN O"}], "\ud801\udc23": [{"c": "\u0186", "n": "LATIN CAPITAL LETTER OPEN O"}], "\uab3f": [{"c": "\u0254\u0338", "n": "LATIN SMALL LETTER OPEN O, COMBINING LONG SOLIDUS OVERLAY"}], "\u0254\u0338": [{"c": "\uab3f", "n": "LATIN SMALL LETTER OPEN O WITH STROKE"}], "\uab62": [{"c": "\u0254e", "n": "LATIN SMALL LETTER OPEN O, LATIN SMALL LETTER E"}], "\u0254e": [{"c": "\uab62", "n": "LATIN SMALL LETTER OPEN OE"}], "\ud801\udc3f": [{"c": "\u0277", "n": "LATIN SMALL LETTER CLOSED OMEGA"}], "\u0277": [{"c": "\ud801\udc3f", "n": "DESERET SMALL LETTER KAY"}], "\u2374": [{"c": "p", "n": "LATIN SMALL LETTER P"}], "p": [{"c": "\u2374", "n": "APL FUNCTIONAL SYMBOL RHO"}, {"c": "\uff50", "n": "FULLWIDTH LATIN SMALL LETTER P"}, {"c": "\ud835\udc29", "n": "MATHEMATICAL BOLD SMALL P"}, {"c": "\ud835\udc5d", "n": "MATHEMATICAL ITALIC SMALL P"}, {"c": "\ud835\udc91", "n": "MATHEMATICAL BOLD ITALIC SMALL P"}, {"c": "\ud835\udcc5", "n": "MATHEMATICAL SCRIPT SMALL P"}, {"c": "\ud835\udcf9", "n": "MATHEMATICAL BOLD SCRIPT SMALL P"}, {"c": "\ud835\udd2d", "n": "MATHEMATICAL FRAKTUR SMALL P"}, {"c": "\ud835\udd61", "n": "MATHEMATICAL DOUBLE-STRUCK SMALL P"}, {"c": "\ud835\udd95", "n": "MATHEMATICAL BOLD FRAKTUR SMALL P"}, {"c": "\ud835\uddc9", "n": "MATHEMATICAL SANS-SERIF SMALL P"}, {"c": "\ud835\uddfd", "n": "MATHEMATICAL SANS-SERIF BOLD SMALL P"}, {"c": "\ud835\ude31", "n": "MATHEMATICAL SANS-SERIF ITALIC SMALL P"}, {"c": "\ud835\ude65", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P"}, {"c": "\ud835\ude99", "n": "MATHEMATICAL MONOSPACE SMALL P"}, {"c": "\u03c1", "n": "GREEK SMALL LETTER RHO"}, {"c": "\u03f1", "n": "GREEK RHO SYMBOL"}, {"c": "\ud835\uded2", "n": "MATHEMATICAL BOLD SMALL RHO"}, {"c": "\ud835\udee0", "n": "MATHEMATICAL BOLD RHO SYMBOL"}, {"c": "\ud835\udf0c", "n": "MATHEMATICAL ITALIC SMALL RHO"}, {"c": "\ud835\udf1a", "n": "MATHEMATICAL ITALIC RHO SYMBOL"}, {"c": "\ud835\udf46", "n": "MATHEMATICAL BOLD ITALIC SMALL RHO"}, {"c": "\ud835\udf54", "n": "MATHEMATICAL BOLD ITALIC RHO SYMBOL"}, {"c": "\ud835\udf80", "n": "MATHEMATICAL SANS-SERIF BOLD SMALL RHO"}, {"c": "\ud835\udf8e", "n": "MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL"}, {"c": "\ud835\udfba", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO"}, {"c": "\ud835\udfc8", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL"}, {"c": "\u2ca3", "n": "COPTIC SMALL LETTER RO"}, {"c": "\u0440", "n": "CYRILLIC SMALL LETTER ER"}], "\uff50": [{"c": "p", "n": "LATIN SMALL LETTER P"}], "\ud835\udc29": [{"c": "p", "n": "LATIN SMALL LETTER P"}], "\ud835\udc5d": [{"c": "p", "n": "LATIN SMALL LETTER P"}], "\ud835\udc91": [{"c": "p", "n": "LATIN SMALL LETTER P"}], "\ud835\udcc5": [{"c": "p", "n": "LATIN SMALL LETTER P"}], "\ud835\udcf9": [{"c": "p", "n": "LATIN SMALL LETTER P"}], "\ud835\udd2d": [{"c": "p", "n": "LATIN SMALL LETTER P"}], "\ud835\udd61": [{"c": "p", "n": "LATIN SMALL LETTER P"}], "\ud835\udd95": [{"c": "p", "n": "LATIN SMALL LETTER P"}], "\ud835\uddc9": [{"c": "p", "n": "LATIN SMALL LETTER P"}], "\ud835\uddfd": [{"c": "p", "n": "LATIN SMALL LETTER P"}], "\ud835\ude31": [{"c": "p", "n": "LATIN SMALL LETTER P"}], "\ud835\ude65": [{"c": "p", "n": "LATIN SMALL LETTER P"}], "\ud835\ude99": [{"c": "p", "n": "LATIN SMALL LETTER P"}], "\u03c1": [{"c": "p", "n": "LATIN SMALL LETTER P"}], "\u03f1": [{"c": "p", "n": "LATIN SMALL LETTER P"}], "\ud835\uded2": [{"c": "p", "n": "LATIN SMALL LETTER P"}], "\ud835\udee0": [{"c": "p", "n": "LATIN SMALL LETTER P"}], "\ud835\udf0c": [{"c": "p", "n": "LATIN SMALL LETTER P"}], "\ud835\udf1a": [{"c": "p", "n": "LATIN SMALL LETTER P"}], "\ud835\udf46": [{"c": "p", "n": "LATIN SMALL LETTER P"}], "\ud835\udf54": [{"c": "p", "n": "LATIN SMALL LETTER P"}], "\ud835\udf80": [{"c": "p", "n": "LATIN SMALL LETTER P"}], "\ud835\udf8e": [{"c": "p", "n": "LATIN SMALL LETTER P"}], "\ud835\udfba": [{"c": "p", "n": "LATIN SMALL LETTER P"}], "\ud835\udfc8": [{"c": "p", "n": "LATIN SMALL LETTER P"}], "\u2ca3": [{"c": "p", "n": "LATIN SMALL LETTER P"}], "\u0440": [{"c": "p", "n": "LATIN SMALL LETTER P"}], "\uff30": [{"c": "P", "n": "LATIN CAPITAL LETTER P"}], "P": [{"c": "\uff30", "n": "FULLWIDTH LATIN CAPITAL LETTER P"}, {"c": "\u2119", "n": "DOUBLE-STRUCK CAPITAL P"}, {"c": "\ud835\udc0f", "n": "MATHEMATICAL BOLD CAPITAL P"}, {"c": "\ud835\udc43", "n": "MATHEMATICAL ITALIC CAPITAL P"}, {"c": "\ud835\udc77", "n": "MATHEMATICAL BOLD ITALIC CAPITAL P"}, {"c": "\ud835\udcab", "n": "MATHEMATICAL SCRIPT CAPITAL P"}, {"c": "\ud835\udcdf", "n": "MATHEMATICAL BOLD SCRIPT CAPITAL P"}, {"c": "\ud835\udd13", "n": "MATHEMATICAL FRAKTUR CAPITAL P"}, {"c": "\ud835\udd7b", "n": "MATHEMATICAL BOLD FRAKTUR CAPITAL P"}, {"c": "\ud835\uddaf", "n": "MATHEMATICAL SANS-SERIF CAPITAL P"}, {"c": "\ud835\udde3", "n": "MATHEMATICAL SANS-SERIF BOLD CAPITAL P"}, {"c": "\ud835\ude17", "n": "MATHEMATICAL SANS-SERIF ITALIC CAPITAL P"}, {"c": "\ud835\ude4b", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P"}, {"c": "\ud835\ude7f", "n": "MATHEMATICAL MONOSPACE CAPITAL P"}, {"c": "\u03a1", "n": "GREEK CAPITAL LETTER RHO"}, {"c": "\ud835\udeb8", "n": "MATHEMATICAL BOLD CAPITAL RHO"}, {"c": "\ud835\udef2", "n": "MATHEMATICAL ITALIC CAPITAL RHO"}, {"c": "\ud835\udf2c", "n": "MATHEMATICAL BOLD ITALIC CAPITAL RHO"}, {"c": "\ud835\udf66", "n": "MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO"}, {"c": "\ud835\udfa0", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO"}, {"c": "\u2ca2", "n": "COPTIC CAPITAL LETTER RO"}, {"c": "\u0420", "n": "CYRILLIC CAPITAL LETTER ER"}, {"c": "\u13e2", "n": "CHEROKEE LETTER TLV"}, {"c": "\u146d", "n": "CANADIAN SYLLABICS KI"}, {"c": "\ua4d1", "n": "LISU LETTER PA"}, {"c": "\ud800\ude95", "n": "LYCIAN LETTER R"}], "\u2119": [{"c": "P", "n": "LATIN CAPITAL LETTER P"}], "\ud835\udc0f": [{"c": "P", "n": "LATIN CAPITAL LETTER P"}], "\ud835\udc43": [{"c": "P", "n": "LATIN CAPITAL LETTER P"}], "\ud835\udc77": [{"c": "P", "n": "LATIN CAPITAL LETTER P"}], "\ud835\udcab": [{"c": "P", "n": "LATIN CAPITAL LETTER P"}], "\ud835\udcdf": [{"c": "P", "n": "LATIN CAPITAL LETTER P"}], "\ud835\udd13": [{"c": "P", "n": "LATIN CAPITAL LETTER P"}], "\ud835\udd7b": [{"c": "P", "n": "LATIN CAPITAL LETTER P"}], "\ud835\uddaf": [{"c": "P", "n": "LATIN CAPITAL LETTER P"}], "\ud835\udde3": [{"c": "P", "n": "LATIN CAPITAL LETTER P"}], "\ud835\ude17": [{"c": "P", "n": "LATIN CAPITAL LETTER P"}], "\ud835\ude4b": [{"c": "P", "n": "LATIN CAPITAL LETTER P"}], "\ud835\ude7f": [{"c": "P", "n": "LATIN CAPITAL LETTER P"}], "\u03a1": [{"c": "P", "n": "LATIN CAPITAL LETTER P"}], "\ud835\udeb8": [{"c": "P", "n": "LATIN CAPITAL LETTER P"}], "\ud835\udef2": [{"c": "P", "n": "LATIN CAPITAL LETTER P"}], "\ud835\udf2c": [{"c": "P", "n": "LATIN CAPITAL LETTER P"}], "\ud835\udf66": [{"c": "P", "n": "LATIN CAPITAL LETTER P"}], "\ud835\udfa0": [{"c": "P", "n": "LATIN CAPITAL LETTER P"}], "\u2ca2": [{"c": "P", "n": "LATIN CAPITAL LETTER P"}], "\u0420": [{"c": "P", "n": "LATIN CAPITAL LETTER P"}], "\u13e2": [{"c": "P", "n": "LATIN CAPITAL LETTER P"}], "\u146d": [{"c": "P", "n": "LATIN CAPITAL LETTER P"}], "\ua4d1": [{"c": "P", "n": "LATIN CAPITAL LETTER P"}], "\ud800\ude95": [{"c": "P", "n": "LATIN CAPITAL LETTER P"}], "\u01a5": [{"c": "p\u0314", "n": "LATIN SMALL LETTER P, COMBINING REVERSED COMMA ABOVE"}], "p\u0314": [{"c": "\u01a5", "n": "LATIN SMALL LETTER P WITH HOOK"}], "\u1d7d": [{"c": "p\u0335", "n": "LATIN SMALL LETTER P, COMBINING SHORT STROKE OVERLAY"}], "p\u0335": [{"c": "\u1d7d", "n": "LATIN SMALL LETTER P WITH STROKE"}], "\u1477": [{"c": "p\u00b7", "n": "LATIN SMALL LETTER P, MIDDLE DOT"}], "p\u00b7": [{"c": "\u1477", "n": "CANADIAN SYLLABICS WEST-CREE KWI"}], "\u1486": [{"c": "P'", "n": "LATIN CAPITAL LETTER P, APOSTROPHE"}], "P'": [{"c": "\u1486", "n": "CANADIAN SYLLABICS SOUTH-SLAVEY KIH"}], "\u1d29": [{"c": "\u1d18", "n": "LATIN LETTER SMALL CAPITAL P"}], "\u1d18": [{"c": "\u1d29", "n": "GREEK LETTER SMALL CAPITAL RHO"}, {"c": "\uabb2", "n": "CHEROKEE SMALL LETTER TLV"}], "\uabb2": [{"c": "\u1d18", "n": "LATIN LETTER SMALL CAPITAL P"}], "\u03c6": [{"c": "\u0278", "n": "LATIN SMALL LETTER PHI"}], "\u0278": [{"c": "\u03c6", "n": "GREEK SMALL LETTER PHI"}, {"c": "\u03d5", "n": "GREEK PHI SYMBOL"}, {"c": "\ud835\uded7", "n": "MATHEMATICAL BOLD SMALL PHI"}, {"c": "\ud835\udedf", "n": "MATHEMATICAL BOLD PHI SYMBOL"}, {"c": "\ud835\udf11", "n": "MATHEMATICAL ITALIC SMALL PHI"}, {"c": "\ud835\udf19", "n": "MATHEMATICAL ITALIC PHI SYMBOL"}, {"c": "\ud835\udf4b", "n": "MATHEMATICAL BOLD ITALIC SMALL PHI"}, {"c": "\ud835\udf53", "n": "MATHEMATICAL BOLD ITALIC PHI SYMBOL"}, {"c": "\ud835\udf85", "n": "MATHEMATICAL SANS-SERIF BOLD SMALL PHI"}, {"c": "\ud835\udf8d", "n": "MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL"}, {"c": "\ud835\udfbf", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI"}, {"c": "\ud835\udfc7", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL"}, {"c": "\u2cab", "n": "COPTIC SMALL LETTER FI"}, {"c": "\u0444", "n": "CYRILLIC SMALL LETTER EF"}], "\u03d5": [{"c": "\u0278", "n": "LATIN SMALL LETTER PHI"}], "\ud835\uded7": [{"c": "\u0278", "n": "LATIN SMALL LETTER PHI"}], "\ud835\udedf": [{"c": "\u0278", "n": "LATIN SMALL LETTER PHI"}], "\ud835\udf11": [{"c": "\u0278", "n": "LATIN SMALL LETTER PHI"}], "\ud835\udf19": [{"c": "\u0278", "n": "LATIN SMALL LETTER PHI"}], "\ud835\udf4b": [{"c": "\u0278", "n": "LATIN SMALL LETTER PHI"}], "\ud835\udf53": [{"c": "\u0278", "n": "LATIN SMALL LETTER PHI"}], "\ud835\udf85": [{"c": "\u0278", "n": "LATIN SMALL LETTER PHI"}], "\ud835\udf8d": [{"c": "\u0278", "n": "LATIN SMALL LETTER PHI"}], "\ud835\udfbf": [{"c": "\u0278", "n": "LATIN SMALL LETTER PHI"}], "\ud835\udfc7": [{"c": "\u0278", "n": "LATIN SMALL LETTER PHI"}], "\u2cab": [{"c": "\u0278", "n": "LATIN SMALL LETTER PHI"}], "\u0444": [{"c": "\u0278", "n": "LATIN SMALL LETTER PHI"}], "\ud835\udc2a": [{"c": "q", "n": "LATIN SMALL LETTER Q"}], "q": [{"c": "\ud835\udc2a", "n": "MATHEMATICAL BOLD SMALL Q"}, {"c": "\ud835\udc5e", "n": "MATHEMATICAL ITALIC SMALL Q"}, {"c": "\ud835\udc92", "n": "MATHEMATICAL BOLD ITALIC SMALL Q"}, {"c": "\ud835\udcc6", "n": "MATHEMATICAL SCRIPT SMALL Q"}, {"c": "\ud835\udcfa", "n": "MATHEMATICAL BOLD SCRIPT SMALL Q"}, {"c": "\ud835\udd2e", "n": "MATHEMATICAL FRAKTUR SMALL Q"}, {"c": "\ud835\udd62", "n": "MATHEMATICAL DOUBLE-STRUCK SMALL Q"}, {"c": "\ud835\udd96", "n": "MATHEMATICAL BOLD FRAKTUR SMALL Q"}, {"c": "\ud835\uddca", "n": "MATHEMATICAL SANS-SERIF SMALL Q"}, {"c": "\ud835\uddfe", "n": "MATHEMATICAL SANS-SERIF BOLD SMALL Q"}, {"c": "\ud835\ude32", "n": "MATHEMATICAL SANS-SERIF ITALIC SMALL Q"}, {"c": "\ud835\ude66", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q"}, {"c": "\ud835\ude9a", "n": "MATHEMATICAL MONOSPACE SMALL Q"}, {"c": "\u051b", "n": "CYRILLIC SMALL LETTER QA"}, {"c": "\u0563", "n": "ARMENIAN SMALL LETTER GIM"}, {"c": "\u0566", "n": "ARMENIAN SMALL LETTER ZA"}], "\ud835\udc5e": [{"c": "q", "n": "LATIN SMALL LETTER Q"}], "\ud835\udc92": [{"c": "q", "n": "LATIN SMALL LETTER Q"}], "\ud835\udcc6": [{"c": "q", "n": "LATIN SMALL LETTER Q"}], "\ud835\udcfa": [{"c": "q", "n": "LATIN SMALL LETTER Q"}], "\ud835\udd2e": [{"c": "q", "n": "LATIN SMALL LETTER Q"}], "\ud835\udd62": [{"c": "q", "n": "LATIN SMALL LETTER Q"}], "\ud835\udd96": [{"c": "q", "n": "LATIN SMALL LETTER Q"}], "\ud835\uddca": [{"c": "q", "n": "LATIN SMALL LETTER Q"}], "\ud835\uddfe": [{"c": "q", "n": "LATIN SMALL LETTER Q"}], "\ud835\ude32": [{"c": "q", "n": "LATIN SMALL LETTER Q"}], "\ud835\ude66": [{"c": "q", "n": "LATIN SMALL LETTER Q"}], "\ud835\ude9a": [{"c": "q", "n": "LATIN SMALL LETTER Q"}], "\u051b": [{"c": "q", "n": "LATIN SMALL LETTER Q"}], "\u0563": [{"c": "q", "n": "LATIN SMALL LETTER Q"}], "\u0566": [{"c": "q", "n": "LATIN SMALL LETTER Q"}], "\u211a": [{"c": "Q", "n": "LATIN CAPITAL LETTER Q"}], "Q": [{"c": "\u211a", "n": "DOUBLE-STRUCK CAPITAL Q"}, {"c": "\ud835\udc10", "n": "MATHEMATICAL BOLD CAPITAL Q"}, {"c": "\ud835\udc44", "n": "MATHEMATICAL ITALIC CAPITAL Q"}, {"c": "\ud835\udc78", "n": "MATHEMATICAL BOLD ITALIC CAPITAL Q"}, {"c": "\ud835\udcac", "n": "MATHEMATICAL SCRIPT CAPITAL Q"}, {"c": "\ud835\udce0", "n": "MATHEMATICAL BOLD SCRIPT CAPITAL Q"}, {"c": "\ud835\udd14", "n": "MATHEMATICAL FRAKTUR CAPITAL Q"}, {"c": "\ud835\udd7c", "n": "MATHEMATICAL BOLD FRAKTUR CAPITAL Q"}, {"c": "\ud835\uddb0", "n": "MATHEMATICAL SANS-SERIF CAPITAL Q"}, {"c": "\ud835\udde4", "n": "MATHEMATICAL SANS-SERIF BOLD CAPITAL Q"}, {"c": "\ud835\ude18", "n": "MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q"}, {"c": "\ud835\ude4c", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q"}, {"c": "\ud835\ude80", "n": "MATHEMATICAL MONOSPACE CAPITAL Q"}, {"c": "\u2d55", "n": "TIFINAGH LETTER YARR"}], "\ud835\udc10": [{"c": "Q", "n": "LATIN CAPITAL LETTER Q"}], "\ud835\udc44": [{"c": "Q", "n": "LATIN CAPITAL LETTER Q"}], "\ud835\udc78": [{"c": "Q", "n": "LATIN CAPITAL LETTER Q"}], "\ud835\udcac": [{"c": "Q", "n": "LATIN CAPITAL LETTER Q"}], "\ud835\udce0": [{"c": "Q", "n": "LATIN CAPITAL LETTER Q"}], "\ud835\udd14": [{"c": "Q", "n": "LATIN CAPITAL LETTER Q"}], "\ud835\udd7c": [{"c": "Q", "n": "LATIN CAPITAL LETTER Q"}], "\ud835\uddb0": [{"c": "Q", "n": "LATIN CAPITAL LETTER Q"}], "\ud835\udde4": [{"c": "Q", "n": "LATIN CAPITAL LETTER Q"}], "\ud835\ude18": [{"c": "Q", "n": "LATIN CAPITAL LETTER Q"}], "\ud835\ude4c": [{"c": "Q", "n": "LATIN CAPITAL LETTER Q"}], "\ud835\ude80": [{"c": "Q", "n": "LATIN CAPITAL LETTER Q"}], "\u2d55": [{"c": "Q", "n": "LATIN CAPITAL LETTER Q"}], "\u02a0": [{"c": "q\u0314", "n": "LATIN SMALL LETTER Q, COMBINING REVERSED COMMA ABOVE"}], "q\u0314": [{"c": "\u02a0", "n": "LATIN SMALL LETTER Q WITH HOOK"}], "\ud83d\udf00": [{"c": "QE", "n": "LATIN CAPITAL LETTER Q, LATIN CAPITAL LETTER E"}], "QE": [{"c": "\ud83d\udf00", "n": "ALCHEMICAL SYMBOL FOR QUINTESSENCE"}], "\u1d90": [{"c": "\u024b", "n": "LATIN SMALL LETTER Q WITH HOOK TAIL"}], "\u024b": [{"c": "\u1d90", "n": "LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK"}], "\u1d0b": [{"c": "\u0138", "n": "LATIN SMALL LETTER KRA"}], "\u0138": [{"c": "\u1d0b", "n": "LATIN LETTER SMALL CAPITAL K"}, {"c": "\u03ba", "n": "GREEK SMALL LETTER KAPPA"}, {"c": "\u03f0", "n": "GREEK KAPPA SYMBOL"}, {"c": "\ud835\udecb", "n": "MATHEMATICAL BOLD SMALL KAPPA"}, {"c": "\ud835\udede", "n": "MATHEMATICAL BOLD KAPPA SYMBOL"}, {"c": "\ud835\udf05", "n": "MATHEMATICAL ITALIC SMALL KAPPA"}, {"c": "\ud835\udf18", "n": "MATHEMATICAL ITALIC KAPPA SYMBOL"}, {"c": "\ud835\udf3f", "n": "MATHEMATICAL BOLD ITALIC SMALL KAPPA"}, {"c": "\ud835\udf52", "n": "MATHEMATICAL BOLD ITALIC KAPPA SYMBOL"}, {"c": "\ud835\udf79", "n": "MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA"}, {"c": "\ud835\udf8c", "n": "MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL"}, {"c": "\ud835\udfb3", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA"}, {"c": "\ud835\udfc6", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL"}, {"c": "\u2c95", "n": "COPTIC SMALL LETTER KAPA"}, {"c": "\u043a", "n": "CYRILLIC SMALL LETTER KA"}, {"c": "\uabb6", "n": "CHEROKEE SMALL LETTER TSO"}], "\u03ba": [{"c": "\u0138", "n": "LATIN SMALL LETTER KRA"}], "\u03f0": [{"c": "\u0138", "n": "LATIN SMALL LETTER KRA"}], "\ud835\udecb": [{"c": "\u0138", "n": "LATIN SMALL LETTER KRA"}], "\ud835\udede": [{"c": "\u0138", "n": "LATIN SMALL LETTER KRA"}], "\ud835\udf05": [{"c": "\u0138", "n": "LATIN SMALL LETTER KRA"}], "\ud835\udf18": [{"c": "\u0138", "n": "LATIN SMALL LETTER KRA"}], "\ud835\udf3f": [{"c": "\u0138", "n": "LATIN SMALL LETTER KRA"}], "\ud835\udf52": [{"c": "\u0138", "n": "LATIN SMALL LETTER KRA"}], "\ud835\udf79": [{"c": "\u0138", "n": "LATIN SMALL LETTER KRA"}], "\ud835\udf8c": [{"c": "\u0138", "n": "LATIN SMALL LETTER KRA"}], "\ud835\udfb3": [{"c": "\u0138", "n": "LATIN SMALL LETTER KRA"}], "\ud835\udfc6": [{"c": "\u0138", "n": "LATIN SMALL LETTER KRA"}], "\u2c95": [{"c": "\u0138", "n": "LATIN SMALL LETTER KRA"}], "\u043a": [{"c": "\u0138", "n": "LATIN SMALL LETTER KRA"}], "\uabb6": [{"c": "\u0138", "n": "LATIN SMALL LETTER KRA"}], "\u049b": [{"c": "\u0138\u0329", "n": "LATIN SMALL LETTER KRA, COMBINING VERTICAL LINE BELOW"}], "\u0138\u0329": [{"c": "\u049b", "n": "CYRILLIC SMALL LETTER KA WITH DESCENDER"}], "\u049f": [{"c": "\u0138\u0335", "n": "LATIN SMALL LETTER KRA, COMBINING SHORT STROKE OVERLAY"}], "\u0138\u0335": [{"c": "\u049f", "n": "CYRILLIC SMALL LETTER KA WITH STROKE"}], "\ud835\udc2b": [{"c": "r", "n": "LATIN SMALL LETTER R"}], "r": [{"c": "\ud835\udc2b", "n": "MATHEMATICAL BOLD SMALL R"}, {"c": "\ud835\udc5f", "n": "MATHEMATICAL ITALIC SMALL R"}, {"c": "\ud835\udc93", "n": "MATHEMATICAL BOLD ITALIC SMALL R"}, {"c": "\ud835\udcc7", "n": "MATHEMATICAL SCRIPT SMALL R"}, {"c": "\ud835\udcfb", "n": "MATHEMATICAL BOLD SCRIPT SMALL R"}, {"c": "\ud835\udd2f", "n": "MATHEMATICAL FRAKTUR SMALL R"}, {"c": "\ud835\udd63", "n": "MATHEMATICAL DOUBLE-STRUCK SMALL R"}, {"c": "\ud835\udd97", "n": "MATHEMATICAL BOLD FRAKTUR SMALL R"}, {"c": "\ud835\uddcb", "n": "MATHEMATICAL SANS-SERIF SMALL R"}, {"c": "\ud835\uddff", "n": "MATHEMATICAL SANS-SERIF BOLD SMALL R"}, {"c": "\ud835\ude33", "n": "MATHEMATICAL SANS-SERIF ITALIC SMALL R"}, {"c": "\ud835\ude67", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R"}, {"c": "\ud835\ude9b", "n": "MATHEMATICAL MONOSPACE SMALL R"}, {"c": "\uab47", "n": "LATIN SMALL LETTER R WITHOUT HANDLE"}, {"c": "\uab48", "n": "LATIN SMALL LETTER DOUBLE R"}, {"c": "\u1d26", "n": "GREEK LETTER SMALL CAPITAL GAMMA"}, {"c": "\u2c85", "n": "COPTIC SMALL LETTER GAMMA"}, {"c": "\u0433", "n": "CYRILLIC SMALL LETTER GHE"}, {"c": "\uab81", "n": "CHEROKEE SMALL LETTER HU"}], "\ud835\udc5f": [{"c": "r", "n": "LATIN SMALL LETTER R"}], "\ud835\udc93": [{"c": "r", "n": "LATIN SMALL LETTER R"}], "\ud835\udcc7": [{"c": "r", "n": "LATIN SMALL LETTER R"}], "\ud835\udcfb": [{"c": "r", "n": "LATIN SMALL LETTER R"}], "\ud835\udd2f": [{"c": "r", "n": "LATIN SMALL LETTER R"}], "\ud835\udd63": [{"c": "r", "n": "LATIN SMALL LETTER R"}], "\ud835\udd97": [{"c": "r", "n": "LATIN SMALL LETTER R"}], "\ud835\uddcb": [{"c": "r", "n": "LATIN SMALL LETTER R"}], "\ud835\uddff": [{"c": "r", "n": "LATIN SMALL LETTER R"}], "\ud835\ude33": [{"c": "r", "n": "LATIN SMALL LETTER R"}], "\ud835\ude67": [{"c": "r", "n": "LATIN SMALL LETTER R"}], "\ud835\ude9b": [{"c": "r", "n": "LATIN SMALL LETTER R"}], "\uab47": [{"c": "r", "n": "LATIN SMALL LETTER R"}], "\uab48": [{"c": "r", "n": "LATIN SMALL LETTER R"}], "\u1d26": [{"c": "r", "n": "LATIN SMALL LETTER R"}], "\u2c85": [{"c": "r", "n": "LATIN SMALL LETTER R"}], "\u0433": [{"c": "r", "n": "LATIN SMALL LETTER R"}], "\uab81": [{"c": "r", "n": "LATIN SMALL LETTER R"}], "\ud834\ude16": [{"c": "R", "n": "LATIN CAPITAL LETTER R"}], "R": [{"c": "\ud834\ude16", "n": "GREEK VOCAL NOTATION SYMBOL-23"}, {"c": "\u211b", "n": "SCRIPT CAPITAL R"}, {"c": "\u211c", "n": "BLACK-LETTER CAPITAL R"}, {"c": "\u211d", "n": "DOUBLE-STRUCK CAPITAL R"}, {"c": "\ud835\udc11", "n": "MATHEMATICAL BOLD CAPITAL R"}, {"c": "\ud835\udc45", "n": "MATHEMATICAL ITALIC CAPITAL R"}, {"c": "\ud835\udc79", "n": "MATHEMATICAL BOLD ITALIC CAPITAL R"}, {"c": "\ud835\udce1", "n": "MATHEMATICAL BOLD SCRIPT CAPITAL R"}, {"c": "\ud835\udd7d", "n": "MATHEMATICAL BOLD FRAKTUR CAPITAL R"}, {"c": "\ud835\uddb1", "n": "MATHEMATICAL SANS-SERIF CAPITAL R"}, {"c": "\ud835\udde5", "n": "MATHEMATICAL SANS-SERIF BOLD CAPITAL R"}, {"c": "\ud835\ude19", "n": "MATHEMATICAL SANS-SERIF ITALIC CAPITAL R"}, {"c": "\ud835\ude4d", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R"}, {"c": "\ud835\ude81", "n": "MATHEMATICAL MONOSPACE CAPITAL R"}, {"c": "\u01a6", "n": "LATIN LETTER YR"}, {"c": "\u13a1", "n": "CHEROKEE LETTER E"}, {"c": "\u13d2", "n": "CHEROKEE LETTER SV"}, {"c": "\ud801\udcb4", "n": "OSAGE CAPITAL LETTER BRA"}, {"c": "\u1587", "n": "CANADIAN SYLLABICS TLHI"}, {"c": "\ua4e3", "n": "LISU LETTER ZHA"}, {"c": "\ud81b\udf35", "n": "MIAO LETTER ZHA"}], "\u211b": [{"c": "R", "n": "LATIN CAPITAL LETTER R"}], "\u211c": [{"c": "R", "n": "LATIN CAPITAL LETTER R"}], "\u211d": [{"c": "R", "n": "LATIN CAPITAL LETTER R"}], "\ud835\udc11": [{"c": "R", "n": "LATIN CAPITAL LETTER R"}], "\ud835\udc45": [{"c": "R", "n": "LATIN CAPITAL LETTER R"}], "\ud835\udc79": [{"c": "R", "n": "LATIN CAPITAL LETTER R"}], "\ud835\udce1": [{"c": "R", "n": "LATIN CAPITAL LETTER R"}], "\ud835\udd7d": [{"c": "R", "n": "LATIN CAPITAL LETTER R"}], "\ud835\uddb1": [{"c": "R", "n": "LATIN CAPITAL LETTER R"}], "\ud835\udde5": [{"c": "R", "n": "LATIN CAPITAL LETTER R"}], "\ud835\ude19": [{"c": "R", "n": "LATIN CAPITAL LETTER R"}], "\ud835\ude4d": [{"c": "R", "n": "LATIN CAPITAL LETTER R"}], "\ud835\ude81": [{"c": "R", "n": "LATIN CAPITAL LETTER R"}], "\u01a6": [{"c": "R", "n": "LATIN CAPITAL LETTER R"}], "\u13a1": [{"c": "R", "n": "LATIN CAPITAL LETTER R"}], "\u13d2": [{"c": "R", "n": "LATIN CAPITAL LETTER R"}], "\ud801\udcb4": [{"c": "R", "n": "LATIN CAPITAL LETTER R"}], "\u1587": [{"c": "R", "n": "LATIN CAPITAL LETTER R"}], "\ua4e3": [{"c": "R", "n": "LATIN CAPITAL LETTER R"}], "\ud81b\udf35": [{"c": "R", "n": "LATIN CAPITAL LETTER R"}], "\u027d": [{"c": "r\u0328", "n": "LATIN SMALL LETTER R, COMBINING OGONEK"}], "r\u0328": [{"c": "\u027d", "n": "LATIN SMALL LETTER R WITH TAIL"}], "\u027c": [{"c": "r\u0329", "n": "LATIN SMALL LETTER R, COMBINING VERTICAL LINE BELOW"}], "r\u0329": [{"c": "\u027c", "n": "LATIN SMALL LETTER R WITH LONG LEG"}], "\u024d": [{"c": "r\u0335", "n": "LATIN SMALL LETTER R, COMBINING SHORT STROKE OVERLAY"}], "r\u0335": [{"c": "\u024d", "n": "LATIN SMALL LETTER R WITH STROKE"}, {"c": "\u0493", "n": "CYRILLIC SMALL LETTER GHE WITH STROKE"}], "\u0493": [{"c": "r\u0335", "n": "LATIN SMALL LETTER R, COMBINING SHORT STROKE OVERLAY"}], "\u1d72": [{"c": "r\u0334", "n": "LATIN SMALL LETTER R, COMBINING TILDE OVERLAY"}], "r\u0334": [{"c": "\u1d72", "n": "LATIN SMALL LETTER R WITH MIDDLE TILDE"}], "\u0491": [{"c": "r'", "n": "LATIN SMALL LETTER R, APOSTROPHE"}], "r'": [{"c": "\u0491", "n": "CYRILLIC SMALL LETTER GHE WITH UPTURN"}], "\ud806\udce3": [{"c": "rn", "n": "LATIN SMALL LETTER R, LATIN SMALL LETTER N"}], "rn": [{"c": "\ud806\udce3", "n": "WARANG CITI DIGIT THREE"}, {"c": "m", "n": "LATIN SMALL LETTER M"}, {"c": "\u217f", "n": "SMALL ROMAN NUMERAL ONE THOUSAND"}, {"c": "\ud835\udc26", "n": "MATHEMATICAL BOLD SMALL M"}, {"c": "\ud835\udc5a", "n": "MATHEMATICAL ITALIC SMALL M"}, {"c": "\ud835\udc8e", "n": "MATHEMATICAL BOLD ITALIC SMALL M"}, {"c": "\ud835\udcc2", "n": "MATHEMATICAL SCRIPT SMALL M"}, {"c": "\ud835\udcf6", "n": "MATHEMATICAL BOLD SCRIPT SMALL M"}, {"c": "\ud835\udd2a", "n": "MATHEMATICAL FRAKTUR SMALL M"}, {"c": "\ud835\udd5e", "n": "MATHEMATICAL DOUBLE-STRUCK SMALL M"}, {"c": "\ud835\udd92", "n": "MATHEMATICAL BOLD FRAKTUR SMALL M"}, {"c": "\ud835\uddc6", "n": "MATHEMATICAL SANS-SERIF SMALL M"}, {"c": "\ud835\uddfa", "n": "MATHEMATICAL SANS-SERIF BOLD SMALL M"}, {"c": "\ud835\ude2e", "n": "MATHEMATICAL SANS-SERIF ITALIC SMALL M"}, {"c": "\ud835\ude62", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M"}, {"c": "\ud835\ude96", "n": "MATHEMATICAL MONOSPACE SMALL M"}, {"c": "\ud805\udf00", "n": "AHOM LETTER KA"}], "m": [{"c": "rn", "n": "LATIN SMALL LETTER R, LATIN SMALL LETTER N"}], "\u217f": [{"c": "rn", "n": "LATIN SMALL LETTER R, LATIN SMALL LETTER N"}], "\ud835\udc26": [{"c": "rn", "n": "LATIN SMALL LETTER R, LATIN SMALL LETTER N"}], "\ud835\udc5a": [{"c": "rn", "n": "LATIN SMALL LETTER R, LATIN SMALL LETTER N"}], "\ud835\udc8e": [{"c": "rn", "n": "LATIN SMALL LETTER R, LATIN SMALL LETTER N"}], "\ud835\udcc2": [{"c": "rn", "n": "LATIN SMALL LETTER R, LATIN SMALL LETTER N"}], "\ud835\udcf6": [{"c": "rn", "n": "LATIN SMALL LETTER R, LATIN SMALL LETTER N"}], "\ud835\udd2a": [{"c": "rn", "n": "LATIN SMALL LETTER R, LATIN SMALL LETTER N"}], "\ud835\udd5e": [{"c": "rn", "n": "LATIN SMALL LETTER R, LATIN SMALL LETTER N"}], "\ud835\udd92": [{"c": "rn", "n": "LATIN SMALL LETTER R, LATIN SMALL LETTER N"}], "\ud835\uddc6": [{"c": "rn", "n": "LATIN SMALL LETTER R, LATIN SMALL LETTER N"}], "\ud835\uddfa": [{"c": "rn", "n": "LATIN SMALL LETTER R, LATIN SMALL LETTER N"}], "\ud835\ude2e": [{"c": "rn", "n": "LATIN SMALL LETTER R, LATIN SMALL LETTER N"}], "\ud835\ude62": [{"c": "rn", "n": "LATIN SMALL LETTER R, LATIN SMALL LETTER N"}], "\ud835\ude96": [{"c": "rn", "n": "LATIN SMALL LETTER R, LATIN SMALL LETTER N"}], "\ud805\udf00": [{"c": "rn", "n": "LATIN SMALL LETTER R, LATIN SMALL LETTER N"}], "\u20a5": [{"c": "rn\u0338", "n": "LATIN SMALL LETTER R, LATIN SMALL LETTER N, COMBINING LONG SOLIDUS OVERLAY"}], "rn\u0338": [{"c": "\u20a5", "n": "MILL SIGN"}], "\u0271": [{"c": "rn\u0326", "n": "LATIN SMALL LETTER R, LATIN SMALL LETTER N, COMBINING COMMA BELOW"}], "rn\u0326": [{"c": "\u0271", "n": "LATIN SMALL LETTER M WITH HOOK"}], "\u1d6f": [{"c": "rn\u0334", "n": "LATIN SMALL LETTER R, LATIN SMALL LETTER N, COMBINING TILDE OVERLAY"}], "rn\u0334": [{"c": "\u1d6f", "n": "LATIN SMALL LETTER M WITH MIDDLE TILDE"}], "\u20a8": [{"c": "Rs", "n": "LATIN CAPITAL LETTER R, LATIN SMALL LETTER S"}], "Rs": [{"c": "\u20a8", "n": "RUPEE SIGN"}], "\uab71": [{"c": "\u0280", "n": "LATIN LETTER SMALL CAPITAL R"}], "\u0280": [{"c": "\uab71", "n": "CHEROKEE SMALL LETTER E"}, {"c": "\uaba2", "n": "CHEROKEE SMALL LETTER SV"}], "\uaba2": [{"c": "\u0280", "n": "LATIN LETTER SMALL CAPITAL R"}], "\u044f": [{"c": "\u1d19", "n": "LATIN LETTER SMALL CAPITAL REVERSED R"}], "\u1d19": [{"c": "\u044f", "n": "CYRILLIC SMALL LETTER YA"}], "\u1d73": [{"c": "\u027e\u0334", "n": "LATIN SMALL LETTER R WITH FISHHOOK, COMBINING TILDE OVERLAY"}], "\u027e\u0334": [{"c": "\u1d73", "n": "LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE"}], "\u2129": [{"c": "\u027f", "n": "LATIN SMALL LETTER REVERSED R WITH FISHHOOK"}], "\u027f": [{"c": "\u2129", "n": "TURNED GREEK SMALL LETTER IOTA"}], "\uff53": [{"c": "s", "n": "LATIN SMALL LETTER S"}], "s": [{"c": "\uff53", "n": "FULLWIDTH LATIN SMALL LETTER S"}, {"c": "\ud835\udc2c", "n": "MATHEMATICAL BOLD SMALL S"}, {"c": "\ud835\udc60", "n": "MATHEMATICAL ITALIC SMALL S"}, {"c": "\ud835\udc94", "n": "MATHEMATICAL BOLD ITALIC SMALL S"}, {"c": "\ud835\udcc8", "n": "MATHEMATICAL SCRIPT SMALL S"}, {"c": "\ud835\udcfc", "n": "MATHEMATICAL BOLD SCRIPT SMALL S"}, {"c": "\ud835\udd30", "n": "MATHEMATICAL FRAKTUR SMALL S"}, {"c": "\ud835\udd64", "n": "MATHEMATICAL DOUBLE-STRUCK SMALL S"}, {"c": "\ud835\udd98", "n": "MATHEMATICAL BOLD FRAKTUR SMALL S"}, {"c": "\ud835\uddcc", "n": "MATHEMATICAL SANS-SERIF SMALL S"}, {"c": "\ud835\ude00", "n": "MATHEMATICAL SANS-SERIF BOLD SMALL S"}, {"c": "\ud835\ude34", "n": "MATHEMATICAL SANS-SERIF ITALIC SMALL S"}, {"c": "\ud835\ude68", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S"}, {"c": "\ud835\ude9c", "n": "MATHEMATICAL MONOSPACE SMALL S"}, {"c": "\ua731", "n": "LATIN LETTER SMALL CAPITAL S"}, {"c": "\u01bd", "n": "LATIN SMALL LETTER TONE FIVE"}, {"c": "\u0455", "n": "CYRILLIC SMALL LETTER DZE"}, {"c": "\uabaa", "n": "CHEROKEE SMALL LETTER DU"}, {"c": "\ud806\udcc1", "n": "WARANG CITI SMALL LETTER A"}, {"c": "\ud801\udc48", "n": "DESERET SMALL LETTER ZHEE"}], "\ud835\udc2c": [{"c": "s", "n": "LATIN SMALL LETTER S"}], "\ud835\udc60": [{"c": "s", "n": "LATIN SMALL LETTER S"}], "\ud835\udc94": [{"c": "s", "n": "LATIN SMALL LETTER S"}], "\ud835\udcc8": [{"c": "s", "n": "LATIN SMALL LETTER S"}], "\ud835\udcfc": [{"c": "s", "n": "LATIN SMALL LETTER S"}], "\ud835\udd30": [{"c": "s", "n": "LATIN SMALL LETTER S"}], "\ud835\udd64": [{"c": "s", "n": "LATIN SMALL LETTER S"}], "\ud835\udd98": [{"c": "s", "n": "LATIN SMALL LETTER S"}], "\ud835\uddcc": [{"c": "s", "n": "LATIN SMALL LETTER S"}], "\ud835\ude00": [{"c": "s", "n": "LATIN SMALL LETTER S"}], "\ud835\ude34": [{"c": "s", "n": "LATIN SMALL LETTER S"}], "\ud835\ude68": [{"c": "s", "n": "LATIN SMALL LETTER S"}], "\ud835\ude9c": [{"c": "s", "n": "LATIN SMALL LETTER S"}], "\ua731": [{"c": "s", "n": "LATIN SMALL LETTER S"}], "\u01bd": [{"c": "s", "n": "LATIN SMALL LETTER S"}], "\u0455": [{"c": "s", "n": "LATIN SMALL LETTER S"}], "\uabaa": [{"c": "s", "n": "LATIN SMALL LETTER S"}], "\ud806\udcc1": [{"c": "s", "n": "LATIN SMALL LETTER S"}], "\ud801\udc48": [{"c": "s", "n": "LATIN SMALL LETTER S"}], "\uff33": [{"c": "S", "n": "LATIN CAPITAL LETTER S"}], "S": [{"c": "\uff33", "n": "FULLWIDTH LATIN CAPITAL LETTER S"}, {"c": "\ud835\udc12", "n": "MATHEMATICAL BOLD CAPITAL S"}, {"c": "\ud835\udc46", "n": "MATHEMATICAL ITALIC CAPITAL S"}, {"c": "\ud835\udc7a", "n": "MATHEMATICAL BOLD ITALIC CAPITAL S"}, {"c": "\ud835\udcae", "n": "MATHEMATICAL SCRIPT CAPITAL S"}, {"c": "\ud835\udce2", "n": "MATHEMATICAL BOLD SCRIPT CAPITAL S"}, {"c": "\ud835\udd16", "n": "MATHEMATICAL FRAKTUR CAPITAL S"}, {"c": "\ud835\udd4a", "n": "MATHEMATICAL DOUBLE-STRUCK CAPITAL S"}, {"c": "\ud835\udd7e", "n": "MATHEMATICAL BOLD FRAKTUR CAPITAL S"}, {"c": "\ud835\uddb2", "n": "MATHEMATICAL SANS-SERIF CAPITAL S"}, {"c": "\ud835\udde6", "n": "MATHEMATICAL SANS-SERIF BOLD CAPITAL S"}, {"c": "\ud835\ude1a", "n": "MATHEMATICAL SANS-SERIF ITALIC CAPITAL S"}, {"c": "\ud835\ude4e", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S"}, {"c": "\ud835\ude82", "n": "MATHEMATICAL MONOSPACE CAPITAL S"}, {"c": "\u0405", "n": "CYRILLIC CAPITAL LETTER DZE"}, {"c": "\u054f", "n": "ARMENIAN CAPITAL LETTER TIWN"}, {"c": "\u13d5", "n": "CHEROKEE LETTER DE"}, {"c": "\u13da", "n": "CHEROKEE LETTER DU"}, {"c": "\ua4e2", "n": "LISU LETTER SA"}, {"c": "\ud81b\udf3a", "n": "MIAO LETTER SA"}, {"c": "\ud800\ude96", "n": "LYCIAN LETTER S"}, {"c": "\ud801\udc20", "n": "DESERET CAPITAL LETTER ZHEE"}], "\ud835\udc12": [{"c": "S", "n": "LATIN CAPITAL LETTER S"}], "\ud835\udc46": [{"c": "S", "n": "LATIN CAPITAL LETTER S"}], "\ud835\udc7a": [{"c": "S", "n": "LATIN CAPITAL LETTER S"}], "\ud835\udcae": [{"c": "S", "n": "LATIN CAPITAL LETTER S"}], "\ud835\udce2": [{"c": "S", "n": "LATIN CAPITAL LETTER S"}], "\ud835\udd16": [{"c": "S", "n": "LATIN CAPITAL LETTER S"}], "\ud835\udd4a": [{"c": "S", "n": "LATIN CAPITAL LETTER S"}], "\ud835\udd7e": [{"c": "S", "n": "LATIN CAPITAL LETTER S"}], "\ud835\uddb2": [{"c": "S", "n": "LATIN CAPITAL LETTER S"}], "\ud835\udde6": [{"c": "S", "n": "LATIN CAPITAL LETTER S"}], "\ud835\ude1a": [{"c": "S", "n": "LATIN CAPITAL LETTER S"}], "\ud835\ude4e": [{"c": "S", "n": "LATIN CAPITAL LETTER S"}], "\ud835\ude82": [{"c": "S", "n": "LATIN CAPITAL LETTER S"}], "\u0405": [{"c": "S", "n": "LATIN CAPITAL LETTER S"}], "\u054f": [{"c": "S", "n": "LATIN CAPITAL LETTER S"}], "\u13d5": [{"c": "S", "n": "LATIN CAPITAL LETTER S"}], "\u13da": [{"c": "S", "n": "LATIN CAPITAL LETTER S"}], "\ua4e2": [{"c": "S", "n": "LATIN CAPITAL LETTER S"}], "\ud81b\udf3a": [{"c": "S", "n": "LATIN CAPITAL LETTER S"}], "\ud800\ude96": [{"c": "S", "n": "LATIN CAPITAL LETTER S"}], "\ud801\udc20": [{"c": "S", "n": "LATIN CAPITAL LETTER S"}], "\u0282": [{"c": "s\u0328", "n": "LATIN SMALL LETTER S, COMBINING OGONEK"}], "s\u0328": [{"c": "\u0282", "n": "LATIN SMALL LETTER S WITH HOOK"}], "\u1d74": [{"c": "s\u0334", "n": "LATIN SMALL LETTER S, COMBINING TILDE OVERLAY"}], "s\u0334": [{"c": "\u1d74", "n": "LATIN SMALL LETTER S WITH MIDDLE TILDE"}], "\ua7b5": [{"c": "\u00df", "n": "LATIN SMALL LETTER SHARP S"}], "\u00df": [{"c": "\ua7b5", "n": "LATIN SMALL LETTER BETA"}, {"c": "\u03b2", "n": "GREEK SMALL LETTER BETA"}, {"c": "\u03d0", "n": "GREEK BETA SYMBOL"}, {"c": "\ud835\udec3", "n": "MATHEMATICAL BOLD SMALL BETA"}, {"c": "\ud835\udefd", "n": "MATHEMATICAL ITALIC SMALL BETA"}, {"c": "\ud835\udf37", "n": "MATHEMATICAL BOLD ITALIC SMALL BETA"}, {"c": "\ud835\udf71", "n": "MATHEMATICAL SANS-SERIF BOLD SMALL BETA"}, {"c": "\ud835\udfab", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA"}, {"c": "\u13f0", "n": "CHEROKEE LETTER YE"}], "\u03b2": [{"c": "\u00df", "n": "LATIN SMALL LETTER SHARP S"}], "\u03d0": [{"c": "\u00df", "n": "LATIN SMALL LETTER SHARP S"}], "\ud835\udec3": [{"c": "\u00df", "n": "LATIN SMALL LETTER SHARP S"}], "\ud835\udefd": [{"c": "\u00df", "n": "LATIN SMALL LETTER SHARP S"}], "\ud835\udf37": [{"c": "\u00df", "n": "LATIN SMALL LETTER SHARP S"}], "\ud835\udf71": [{"c": "\u00df", "n": "LATIN SMALL LETTER SHARP S"}], "\ud835\udfab": [{"c": "\u00df", "n": "LATIN SMALL LETTER SHARP S"}], "\u13f0": [{"c": "\u00df", "n": "LATIN SMALL LETTER SHARP S"}], "\ud83d\udf5c": [{"c": "sss", "n": "LATIN SMALL LETTER S, LATIN SMALL LETTER S, LATIN SMALL LETTER S"}], "sss": [{"c": "\ud83d\udf5c", "n": "ALCHEMICAL SYMBOL FOR STRATUM SUPER STRATUM"}], "\ufb06": [{"c": "st", "n": "LATIN SMALL LETTER S, LATIN SMALL LETTER T"}], "st": [{"c": "\ufb06", "n": "LATIN SMALL LIGATURE ST"}], "\u222b": [{"c": "\u0283", "n": "LATIN SMALL LETTER ESH"}], "\u0283": [{"c": "\u222b", "n": "INTEGRAL"}, {"c": "\uab4d", "n": "LATIN SMALL LETTER BASELINE ESH"}], "\uab4d": [{"c": "\u0283", "n": "LATIN SMALL LETTER ESH"}], "\u2211": [{"c": "\u01a9", "n": "LATIN CAPITAL LETTER ESH"}], "\u01a9": [{"c": "\u2211", "n": "N-ARY SUMMATION"}, {"c": "\u2140", "n": "DOUBLE-STRUCK N-ARY SUMMATION"}, {"c": "\u03a3", "n": "GREEK CAPITAL LETTER SIGMA"}, {"c": "\ud835\udeba", "n": "MATHEMATICAL BOLD CAPITAL SIGMA"}, {"c": "\ud835\udef4", "n": "MATHEMATICAL ITALIC CAPITAL SIGMA"}, {"c": "\ud835\udf2e", "n": "MATHEMATICAL BOLD ITALIC CAPITAL SIGMA"}, {"c": "\ud835\udf68", "n": "MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA"}, {"c": "\ud835\udfa2", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA"}, {"c": "\u2d49", "n": "TIFINAGH LETTER YI"}], "\u2140": [{"c": "\u01a9", "n": "LATIN CAPITAL LETTER ESH"}], "\u03a3": [{"c": "\u01a9", "n": "LATIN CAPITAL LETTER ESH"}], "\ud835\udeba": [{"c": "\u01a9", "n": "LATIN CAPITAL LETTER ESH"}], "\ud835\udef4": [{"c": "\u01a9", "n": "LATIN CAPITAL LETTER ESH"}], "\ud835\udf2e": [{"c": "\u01a9", "n": "LATIN CAPITAL LETTER ESH"}], "\ud835\udf68": [{"c": "\u01a9", "n": "LATIN CAPITAL LETTER ESH"}], "\ud835\udfa2": [{"c": "\u01a9", "n": "LATIN CAPITAL LETTER ESH"}], "\u2d49": [{"c": "\u01a9", "n": "LATIN CAPITAL LETTER ESH"}], "\u222c": [{"c": "\u0283\u0283", "n": "LATIN SMALL LETTER ESH, LATIN SMALL LETTER ESH"}], "\u0283\u0283": [{"c": "\u222c", "n": "DOUBLE INTEGRAL"}], "\u222d": [{"c": "\u0283\u0283\u0283", "n": "LATIN SMALL LETTER ESH, LATIN SMALL LETTER ESH, LATIN SMALL LETTER ESH"}], "\u0283\u0283\u0283": [{"c": "\u222d", "n": "TRIPLE INTEGRAL"}], "\u2a0c": [{"c": "\u0283\u0283\u0283\u0283", "n": "LATIN SMALL LETTER ESH, LATIN SMALL LETTER ESH, LATIN SMALL LETTER ESH, LATIN SMALL LETTER ESH"}], "\u0283\u0283\u0283\u0283": [{"c": "\u2a0c", "n": "QUADRUPLE INTEGRAL OPERATOR"}], "\ud835\udc2d": [{"c": "t", "n": "LATIN SMALL LETTER T"}], "t": [{"c": "\ud835\udc2d", "n": "MATHEMATICAL BOLD SMALL T"}, {"c": "\ud835\udc61", "n": "MATHEMATICAL ITALIC SMALL T"}, {"c": "\ud835\udc95", "n": "MATHEMATICAL BOLD ITALIC SMALL T"}, {"c": "\ud835\udcc9", "n": "MATHEMATICAL SCRIPT SMALL T"}, {"c": "\ud835\udcfd", "n": "MATHEMATICAL BOLD SCRIPT SMALL T"}, {"c": "\ud835\udd31", "n": "MATHEMATICAL FRAKTUR SMALL T"}, {"c": "\ud835\udd65", "n": "MATHEMATICAL DOUBLE-STRUCK SMALL T"}, {"c": "\ud835\udd99", "n": "MATHEMATICAL BOLD FRAKTUR SMALL T"}, {"c": "\ud835\uddcd", "n": "MATHEMATICAL SANS-SERIF SMALL T"}, {"c": "\ud835\ude01", "n": "MATHEMATICAL SANS-SERIF BOLD SMALL T"}, {"c": "\ud835\ude35", "n": "MATHEMATICAL SANS-SERIF ITALIC SMALL T"}, {"c": "\ud835\ude69", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T"}, {"c": "\ud835\ude9d", "n": "MATHEMATICAL MONOSPACE SMALL T"}], "\ud835\udc61": [{"c": "t", "n": "LATIN SMALL LETTER T"}], "\ud835\udc95": [{"c": "t", "n": "LATIN SMALL LETTER T"}], "\ud835\udcc9": [{"c": "t", "n": "LATIN SMALL LETTER T"}], "\ud835\udcfd": [{"c": "t", "n": "LATIN SMALL LETTER T"}], "\ud835\udd31": [{"c": "t", "n": "LATIN SMALL LETTER T"}], "\ud835\udd65": [{"c": "t", "n": "LATIN SMALL LETTER T"}], "\ud835\udd99": [{"c": "t", "n": "LATIN SMALL LETTER T"}], "\ud835\uddcd": [{"c": "t", "n": "LATIN SMALL LETTER T"}], "\ud835\ude01": [{"c": "t", "n": "LATIN SMALL LETTER T"}], "\ud835\ude35": [{"c": "t", "n": "LATIN SMALL LETTER T"}], "\ud835\ude69": [{"c": "t", "n": "LATIN SMALL LETTER T"}], "\ud835\ude9d": [{"c": "t", "n": "LATIN SMALL LETTER T"}], "\u22a4": [{"c": "T", "n": "LATIN CAPITAL LETTER T"}], "T": [{"c": "\u22a4", "n": "DOWN TACK"}, {"c": "\u27d9", "n": "LARGE DOWN TACK"}, {"c": "\ud83d\udf68", "n": "ALCHEMICAL SYMBOL FOR CRUCIBLE-4"}, {"c": "\uff34", "n": "FULLWIDTH LATIN CAPITAL LETTER T"}, {"c": "\ud835\udc13", "n": "MATHEMATICAL BOLD CAPITAL T"}, {"c": "\ud835\udc47", "n": "MATHEMATICAL ITALIC CAPITAL T"}, {"c": "\ud835\udc7b", "n": "MATHEMATICAL BOLD ITALIC CAPITAL T"}, {"c": "\ud835\udcaf", "n": "MATHEMATICAL SCRIPT CAPITAL T"}, {"c": "\ud835\udce3", "n": "MATHEMATICAL BOLD SCRIPT CAPITAL T"}, {"c": "\ud835\udd17", "n": "MATHEMATICAL FRAKTUR CAPITAL T"}, {"c": "\ud835\udd4b", "n": "MATHEMATICAL DOUBLE-STRUCK CAPITAL T"}, {"c": "\ud835\udd7f", "n": "MATHEMATICAL BOLD FRAKTUR CAPITAL T"}, {"c": "\ud835\uddb3", "n": "MATHEMATICAL SANS-SERIF CAPITAL T"}, {"c": "\ud835\udde7", "n": "MATHEMATICAL SANS-SERIF BOLD CAPITAL T"}, {"c": "\ud835\ude1b", "n": "MATHEMATICAL SANS-SERIF ITALIC CAPITAL T"}, {"c": "\ud835\ude4f", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T"}, {"c": "\ud835\ude83", "n": "MATHEMATICAL MONOSPACE CAPITAL T"}, {"c": "\u03a4", "n": "GREEK CAPITAL LETTER TAU"}, {"c": "\ud835\udebb", "n": "MATHEMATICAL BOLD CAPITAL TAU"}, {"c": "\ud835\udef5", "n": "MATHEMATICAL ITALIC CAPITAL TAU"}, {"c": "\ud835\udf2f", "n": "MATHEMATICAL BOLD ITALIC CAPITAL TAU"}, {"c": "\ud835\udf69", "n": "MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU"}, {"c": "\ud835\udfa3", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU"}, {"c": "\u2ca6", "n": "COPTIC CAPITAL LETTER TAU"}, {"c": "\u0422", "n": "CYRILLIC CAPITAL LETTER TE"}, {"c": "\u13a2", "n": "CHEROKEE LETTER I"}, {"c": "\ua4d4", "n": "LISU LETTER TA"}, {"c": "\ud81b\udf0a", "n": "MIAO LETTER TA"}, {"c": "\ud806\udcbc", "n": "WARANG CITI CAPITAL LETTER HAR"}, {"c": "\ud800\ude97", "n": "LYCIAN LETTER T"}, {"c": "\ud800\udeb1", "n": "CARIAN LETTER C-18"}, {"c": "\ud800\udf15", "n": "OLD ITALIC LETTER TE"}], "\u27d9": [{"c": "T", "n": "LATIN CAPITAL LETTER T"}], "\ud83d\udf68": [{"c": "T", "n": "LATIN CAPITAL LETTER T"}], "\uff34": [{"c": "T", "n": "LATIN CAPITAL LETTER T"}], "\ud835\udc13": [{"c": "T", "n": "LATIN CAPITAL LETTER T"}], "\ud835\udc47": [{"c": "T", "n": "LATIN CAPITAL LETTER T"}], "\ud835\udc7b": [{"c": "T", "n": "LATIN CAPITAL LETTER T"}], "\ud835\udcaf": [{"c": "T", "n": "LATIN CAPITAL LETTER T"}], "\ud835\udce3": [{"c": "T", "n": "LATIN CAPITAL LETTER T"}], "\ud835\udd17": [{"c": "T", "n": "LATIN CAPITAL LETTER T"}], "\ud835\udd4b": [{"c": "T", "n": "LATIN CAPITAL LETTER T"}], "\ud835\udd7f": [{"c": "T", "n": "LATIN CAPITAL LETTER T"}], "\ud835\uddb3": [{"c": "T", "n": "LATIN CAPITAL LETTER T"}], "\ud835\udde7": [{"c": "T", "n": "LATIN CAPITAL LETTER T"}], "\ud835\ude1b": [{"c": "T", "n": "LATIN CAPITAL LETTER T"}], "\ud835\ude4f": [{"c": "T", "n": "LATIN CAPITAL LETTER T"}], "\ud835\ude83": [{"c": "T", "n": "LATIN CAPITAL LETTER T"}], "\u03a4": [{"c": "T", "n": "LATIN CAPITAL LETTER T"}], "\ud835\udebb": [{"c": "T", "n": "LATIN CAPITAL LETTER T"}], "\ud835\udef5": [{"c": "T", "n": "LATIN CAPITAL LETTER T"}], "\ud835\udf2f": [{"c": "T", "n": "LATIN CAPITAL LETTER T"}], "\ud835\udf69": [{"c": "T", "n": "LATIN CAPITAL LETTER T"}], "\ud835\udfa3": [{"c": "T", "n": "LATIN CAPITAL LETTER T"}], "\u2ca6": [{"c": "T", "n": "LATIN CAPITAL LETTER T"}], "\u0422": [{"c": "T", "n": "LATIN CAPITAL LETTER T"}], "\u13a2": [{"c": "T", "n": "LATIN CAPITAL LETTER T"}], "\ua4d4": [{"c": "T", "n": "LATIN CAPITAL LETTER T"}], "\ud81b\udf0a": [{"c": "T", "n": "LATIN CAPITAL LETTER T"}], "\ud806\udcbc": [{"c": "T", "n": "LATIN CAPITAL LETTER T"}], "\ud800\ude97": [{"c": "T", "n": "LATIN CAPITAL LETTER T"}], "\ud800\udeb1": [{"c": "T", "n": "LATIN CAPITAL LETTER T"}], "\ud800\udf15": [{"c": "T", "n": "LATIN CAPITAL LETTER T"}], "\u01ad": [{"c": "t\u0314", "n": "LATIN SMALL LETTER T, COMBINING REVERSED COMMA ABOVE"}], "t\u0314": [{"c": "\u01ad", "n": "LATIN SMALL LETTER T WITH HOOK"}], "\u2361": [{"c": "T\u0308", "n": "LATIN CAPITAL LETTER T, COMBINING DIAERESIS"}], "T\u0308": [{"c": "\u2361", "n": "APL FUNCTIONAL SYMBOL UP TACK DIAERESIS"}], "\u023e": [{"c": "T\u0338", "n": "LATIN CAPITAL LETTER T, COMBINING LONG SOLIDUS OVERLAY"}], "T\u0338": [{"c": "\u023e", "n": "LATIN CAPITAL LETTER T WITH DIAGONAL STROKE"}], "\u021a": [{"c": "\u0162", "n": "LATIN CAPITAL LETTER T WITH CEDILLA"}], "\u0162": [{"c": "\u021a", "n": "LATIN CAPITAL LETTER T WITH COMMA BELOW"}], "\u01ae": [{"c": "T\u0328", "n": "LATIN CAPITAL LETTER T, COMBINING OGONEK"}], "T\u0328": [{"c": "\u01ae", "n": "LATIN CAPITAL LETTER T WITH RETROFLEX HOOK"}], "\u04ac": [{"c": "T\u0329", "n": "LATIN CAPITAL LETTER T, COMBINING VERTICAL LINE BELOW"}], "T\u0329": [{"c": "\u04ac", "n": "CYRILLIC CAPITAL LETTER TE WITH DESCENDER"}], "\u20ae": [{"c": "T\u20eb", "n": "LATIN CAPITAL LETTER T, COMBINING LONG DOUBLE SOLIDUS OVERLAY"}], "T\u20eb": [{"c": "\u20ae", "n": "TUGRIK SIGN"}], "\u0167": [{"c": "t\u0335", "n": "LATIN SMALL LETTER T, COMBINING SHORT STROKE OVERLAY"}], "t\u0335": [{"c": "\u0167", "n": "LATIN SMALL LETTER T WITH STROKE"}], "\u0166": [{"c": "T\u0335", "n": "LATIN CAPITAL LETTER T, COMBINING SHORT STROKE OVERLAY"}], "T\u0335": [{"c": "\u0166", "n": "LATIN CAPITAL LETTER T WITH STROKE"}], "\u1d75": [{"c": "t\u0334", "n": "LATIN SMALL LETTER T, COMBINING TILDE OVERLAY"}], "t\u0334": [{"c": "\u1d75", "n": "LATIN SMALL LETTER T WITH MIDDLE TILDE"}], "\u10a0": [{"c": "\ua786", "n": "LATIN CAPITAL LETTER INSULAR T"}], "\ua786": [{"c": "\u10a0", "n": "GEORGIAN CAPITAL LETTER AN"}], "\ua728": [{"c": "T3", "n": "LATIN CAPITAL LETTER T, DIGIT THREE"}], "T3": [{"c": "\ua728", "n": "LATIN CAPITAL LETTER TZ"}], "\u02a8": [{"c": "t\u0255", "n": "LATIN SMALL LETTER T, LATIN SMALL LETTER C WITH CURL"}], "t\u0255": [{"c": "\u02a8", "n": "LATIN SMALL LETTER TC DIGRAPH WITH CURL"}], "\u2121": [{"c": "TEL", "n": "LATIN CAPITAL LETTER T, LATIN CAPITAL LETTER E, LATIN CAPITAL LETTER L"}], "TEL": [{"c": "\u2121", "n": "TELEPHONE SIGN"}], "\ua777": [{"c": "tf", "n": "LATIN SMALL LETTER T, LATIN SMALL LETTER F"}], "tf": [{"c": "\ua777", "n": "LATIN SMALL LETTER TUM"}], "\u02a6": [{"c": "ts", "n": "LATIN SMALL LETTER T, LATIN SMALL LETTER S"}], "ts": [{"c": "\u02a6", "n": "LATIN SMALL LETTER TS DIGRAPH"}], "\u02a7": [{"c": "t\u0283", "n": "LATIN SMALL LETTER T, LATIN SMALL LETTER ESH"}], "t\u0283": [{"c": "\u02a7", "n": "LATIN SMALL LETTER TESH DIGRAPH"}], "\ua729": [{"c": "t\u021d", "n": "LATIN SMALL LETTER T, LATIN SMALL LETTER YOGH"}], "t\u021d": [{"c": "\ua729", "n": "LATIN SMALL LETTER TZ"}], "\u03c4": [{"c": "\u1d1b", "n": "LATIN LETTER SMALL CAPITAL T"}], "\u1d1b": [{"c": "\u03c4", "n": "GREEK SMALL LETTER TAU"}, {"c": "\ud835\uded5", "n": "MATHEMATICAL BOLD SMALL TAU"}, {"c": "\ud835\udf0f", "n": "MATHEMATICAL ITALIC SMALL TAU"}, {"c": "\ud835\udf49", "n": "MATHEMATICAL BOLD ITALIC SMALL TAU"}, {"c": "\ud835\udf83", "n": "MATHEMATICAL SANS-SERIF BOLD SMALL TAU"}, {"c": "\ud835\udfbd", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU"}, {"c": "\u0442", "n": "CYRILLIC SMALL LETTER TE"}, {"c": "\uab72", "n": "CHEROKEE SMALL LETTER I"}], "\ud835\uded5": [{"c": "\u1d1b", "n": "LATIN LETTER SMALL CAPITAL T"}], "\ud835\udf0f": [{"c": "\u1d1b", "n": "LATIN LETTER SMALL CAPITAL T"}], "\ud835\udf49": [{"c": "\u1d1b", "n": "LATIN LETTER SMALL CAPITAL T"}], "\ud835\udf83": [{"c": "\u1d1b", "n": "LATIN LETTER SMALL CAPITAL T"}], "\ud835\udfbd": [{"c": "\u1d1b", "n": "LATIN LETTER SMALL CAPITAL T"}], "\u0442": [{"c": "\u1d1b", "n": "LATIN LETTER SMALL CAPITAL T"}], "\uab72": [{"c": "\u1d1b", "n": "LATIN LETTER SMALL CAPITAL T"}], "\u04ad": [{"c": "\u1d1b\u0329", "n": "LATIN LETTER SMALL CAPITAL T, COMBINING VERTICAL LINE BELOW"}], "\u1d1b\u0329": [{"c": "\u04ad", "n": "CYRILLIC SMALL LETTER TE WITH DESCENDER"}], "\u0163": [{"c": "\u01ab", "n": "LATIN SMALL LETTER T WITH PALATAL HOOK"}], "\u01ab": [{"c": "\u0163", "n": "LATIN SMALL LETTER T WITH CEDILLA"}, {"c": "\u021b", "n": "LATIN SMALL LETTER T WITH COMMA BELOW"}, {"c": "\u13bf", "n": "CHEROKEE LETTER HNA"}], "\u021b": [{"c": "\u01ab", "n": "LATIN SMALL LETTER T WITH PALATAL HOOK"}], "\u13bf": [{"c": "\u01ab", "n": "LATIN SMALL LETTER T WITH PALATAL HOOK"}], "\ud835\udc2e": [{"c": "u", "n": "LATIN SMALL LETTER U"}], "u": [{"c": "\ud835\udc2e", "n": "MATHEMATICAL BOLD SMALL U"}, {"c": "\ud835\udc62", "n": "MATHEMATICAL ITALIC SMALL U"}, {"c": "\ud835\udc96", "n": "MATHEMATICAL BOLD ITALIC SMALL U"}, {"c": "\ud835\udcca", "n": "MATHEMATICAL SCRIPT SMALL U"}, {"c": "\ud835\udcfe", "n": "MATHEMATICAL BOLD SCRIPT SMALL U"}, {"c": "\ud835\udd32", "n": "MATHEMATICAL FRAKTUR SMALL U"}, {"c": "\ud835\udd66", "n": "MATHEMATICAL DOUBLE-STRUCK SMALL U"}, {"c": "\ud835\udd9a", "n": "MATHEMATICAL BOLD FRAKTUR SMALL U"}, {"c": "\ud835\uddce", "n": "MATHEMATICAL SANS-SERIF SMALL U"}, {"c": "\ud835\ude02", "n": "MATHEMATICAL SANS-SERIF BOLD SMALL U"}, {"c": "\ud835\ude36", "n": "MATHEMATICAL SANS-SERIF ITALIC SMALL U"}, {"c": "\ud835\ude6a", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U"}, {"c": "\ud835\ude9e", "n": "MATHEMATICAL MONOSPACE SMALL U"}, {"c": "\ua79f", "n": "LATIN SMALL LETTER VOLAPUK UE"}, {"c": "\u1d1c", "n": "LATIN LETTER SMALL CAPITAL U"}, {"c": "\uab4e", "n": "LATIN SMALL LETTER U WITH SHORT RIGHT LEG"}, {"c": "\uab52", "n": "LATIN SMALL LETTER U WITH LEFT HOOK"}, {"c": "\u028b", "n": "LATIN SMALL LETTER V WITH HOOK"}, {"c": "\u03c5", "n": "GREEK SMALL LETTER UPSILON"}, {"c": "\ud835\uded6", "n": "MATHEMATICAL BOLD SMALL UPSILON"}, {"c": "\ud835\udf10", "n": "MATHEMATICAL ITALIC SMALL UPSILON"}, {"c": "\ud835\udf4a", "n": "MATHEMATICAL BOLD ITALIC SMALL UPSILON"}, {"c": "\ud835\udf84", "n": "MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON"}, {"c": "\ud835\udfbe", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON"}, {"c": "\u057d", "n": "ARMENIAN SMALL LETTER SEH"}, {"c": "\ud801\udcf6", "n": "OSAGE SMALL LETTER U"}, {"c": "\ud806\udcd8", "n": "WARANG CITI SMALL LETTER PU"}], "\ud835\udc62": [{"c": "u", "n": "LATIN SMALL LETTER U"}], "\ud835\udc96": [{"c": "u", "n": "LATIN SMALL LETTER U"}], "\ud835\udcca": [{"c": "u", "n": "LATIN SMALL LETTER U"}], "\ud835\udcfe": [{"c": "u", "n": "LATIN SMALL LETTER U"}], "\ud835\udd32": [{"c": "u", "n": "LATIN SMALL LETTER U"}], "\ud835\udd66": [{"c": "u", "n": "LATIN SMALL LETTER U"}], "\ud835\udd9a": [{"c": "u", "n": "LATIN SMALL LETTER U"}], "\ud835\uddce": [{"c": "u", "n": "LATIN SMALL LETTER U"}], "\ud835\ude02": [{"c": "u", "n": "LATIN SMALL LETTER U"}], "\ud835\ude36": [{"c": "u", "n": "LATIN SMALL LETTER U"}], "\ud835\ude6a": [{"c": "u", "n": "LATIN SMALL LETTER U"}], "\ud835\ude9e": [{"c": "u", "n": "LATIN SMALL LETTER U"}], "\ua79f": [{"c": "u", "n": "LATIN SMALL LETTER U"}], "\u1d1c": [{"c": "u", "n": "LATIN SMALL LETTER U"}], "\uab4e": [{"c": "u", "n": "LATIN SMALL LETTER U"}], "\uab52": [{"c": "u", "n": "LATIN SMALL LETTER U"}], "\u028b": [{"c": "u", "n": "LATIN SMALL LETTER U"}], "\u03c5": [{"c": "u", "n": "LATIN SMALL LETTER U"}], "\ud835\uded6": [{"c": "u", "n": "LATIN SMALL LETTER U"}], "\ud835\udf10": [{"c": "u", "n": "LATIN SMALL LETTER U"}], "\ud835\udf4a": [{"c": "u", "n": "LATIN SMALL LETTER U"}], "\ud835\udf84": [{"c": "u", "n": "LATIN SMALL LETTER U"}], "\ud835\udfbe": [{"c": "u", "n": "LATIN SMALL LETTER U"}], "\u057d": [{"c": "u", "n": "LATIN SMALL LETTER U"}], "\ud801\udcf6": [{"c": "u", "n": "LATIN SMALL LETTER U"}], "\ud806\udcd8": [{"c": "u", "n": "LATIN SMALL LETTER U"}], "\u222a": [{"c": "U", "n": "LATIN CAPITAL LETTER U"}], "U": [{"c": "\u222a", "n": "UNION"}, {"c": "\u22c3", "n": "N-ARY UNION"}, {"c": "\ud835\udc14", "n": "MATHEMATICAL BOLD CAPITAL U"}, {"c": "\ud835\udc48", "n": "MATHEMATICAL ITALIC CAPITAL U"}, {"c": "\ud835\udc7c", "n": "MATHEMATICAL BOLD ITALIC CAPITAL U"}, {"c": "\ud835\udcb0", "n": "MATHEMATICAL SCRIPT CAPITAL U"}, {"c": "\ud835\udce4", "n": "MATHEMATICAL BOLD SCRIPT CAPITAL U"}, {"c": "\ud835\udd18", "n": "MATHEMATICAL FRAKTUR CAPITAL U"}, {"c": "\ud835\udd4c", "n": "MATHEMATICAL DOUBLE-STRUCK CAPITAL U"}, {"c": "\ud835\udd80", "n": "MATHEMATICAL BOLD FRAKTUR CAPITAL U"}, {"c": "\ud835\uddb4", "n": "MATHEMATICAL SANS-SERIF CAPITAL U"}, {"c": "\ud835\udde8", "n": "MATHEMATICAL SANS-SERIF BOLD CAPITAL U"}, {"c": "\ud835\ude1c", "n": "MATHEMATICAL SANS-SERIF ITALIC CAPITAL U"}, {"c": "\ud835\ude50", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U"}, {"c": "\ud835\ude84", "n": "MATHEMATICAL MONOSPACE CAPITAL U"}, {"c": "\u054d", "n": "ARMENIAN CAPITAL LETTER SEH"}, {"c": "\u1200", "n": "ETHIOPIC SYLLABLE HA"}, {"c": "\ud801\udcce", "n": "OSAGE CAPITAL LETTER U"}, {"c": "\u144c", "n": "CANADIAN SYLLABICS TE"}, {"c": "\ua4f4", "n": "LISU LETTER U"}, {"c": "\ud81b\udf42", "n": "MIAO LETTER WA"}, {"c": "\ud806\udcb8", "n": "WARANG CITI CAPITAL LETTER PU"}], "\u22c3": [{"c": "U", "n": "LATIN CAPITAL LETTER U"}], "\ud835\udc14": [{"c": "U", "n": "LATIN CAPITAL LETTER U"}], "\ud835\udc48": [{"c": "U", "n": "LATIN CAPITAL LETTER U"}], "\ud835\udc7c": [{"c": "U", "n": "LATIN CAPITAL LETTER U"}], "\ud835\udcb0": [{"c": "U", "n": "LATIN CAPITAL LETTER U"}], "\ud835\udce4": [{"c": "U", "n": "LATIN CAPITAL LETTER U"}], "\ud835\udd18": [{"c": "U", "n": "LATIN CAPITAL LETTER U"}], "\ud835\udd4c": [{"c": "U", "n": "LATIN CAPITAL LETTER U"}], "\ud835\udd80": [{"c": "U", "n": "LATIN CAPITAL LETTER U"}], "\ud835\uddb4": [{"c": "U", "n": "LATIN CAPITAL LETTER U"}], "\ud835\udde8": [{"c": "U", "n": "LATIN CAPITAL LETTER U"}], "\ud835\ude1c": [{"c": "U", "n": "LATIN CAPITAL LETTER U"}], "\ud835\ude50": [{"c": "U", "n": "LATIN CAPITAL LETTER U"}], "\ud835\ude84": [{"c": "U", "n": "LATIN CAPITAL LETTER U"}], "\u054d": [{"c": "U", "n": "LATIN CAPITAL LETTER U"}], "\u1200": [{"c": "U", "n": "LATIN CAPITAL LETTER U"}], "\ud801\udcce": [{"c": "U", "n": "LATIN CAPITAL LETTER U"}], "\u144c": [{"c": "U", "n": "LATIN CAPITAL LETTER U"}], "\ua4f4": [{"c": "U", "n": "LATIN CAPITAL LETTER U"}], "\ud81b\udf42": [{"c": "U", "n": "LATIN CAPITAL LETTER U"}], "\ud806\udcb8": [{"c": "U", "n": "LATIN CAPITAL LETTER U"}], "\u01d4": [{"c": "\u016d", "n": "LATIN SMALL LETTER U WITH BREVE"}], "\u016d": [{"c": "\u01d4", "n": "LATIN SMALL LETTER U WITH CARON"}], "\u01d3": [{"c": "\u016c", "n": "LATIN CAPITAL LETTER U WITH BREVE"}], "\u016c": [{"c": "\u01d3", "n": "LATIN CAPITAL LETTER U WITH CARON"}], "\u1d7e": [{"c": "u\u0335", "n": "LATIN SMALL LETTER U, COMBINING SHORT STROKE OVERLAY"}], "u\u0335": [{"c": "\u1d7e", "n": "LATIN SMALL CAPITAL LETTER U WITH STROKE"}, {"c": "\uab9c", "n": "CHEROKEE SMALL LETTER SA"}], "\uab9c": [{"c": "u\u0335", "n": "LATIN SMALL LETTER U, COMBINING SHORT STROKE OVERLAY"}], "\u0244": [{"c": "U\u0335", "n": "LATIN CAPITAL LETTER U, COMBINING SHORT STROKE OVERLAY"}], "U\u0335": [{"c": "\u0244", "n": "LATIN CAPITAL LETTER U BAR"}, {"c": "\u13cc", "n": "CHEROKEE LETTER SA"}], "\u13cc": [{"c": "U\u0335", "n": "LATIN CAPITAL LETTER U, COMBINING SHORT STROKE OVERLAY"}], "\u1458": [{"c": "U\u00b7", "n": "LATIN CAPITAL LETTER U, MIDDLE DOT"}], "U\u00b7": [{"c": "\u1458", "n": "CANADIAN SYLLABICS WEST-CREE TWE"}], "\u1467": [{"c": "U'", "n": "LATIN CAPITAL LETTER U, APOSTROPHE"}], "U'": [{"c": "\u1467", "n": "CANADIAN SYLLABICS TTE"}], "\u1d6b": [{"c": "ue", "n": "LATIN SMALL LETTER U, LATIN SMALL LETTER E"}], "ue": [{"c": "\u1d6b", "n": "LATIN SMALL LETTER UE"}], "\uab63": [{"c": "uo", "n": "LATIN SMALL LETTER U, LATIN SMALL LETTER O"}], "uo": [{"c": "\uab63", "n": "LATIN SMALL LETTER UO"}], "\u1e43": [{"c": "\uab51", "n": "LATIN SMALL LETTER TURNED UI"}], "\uab51": [{"c": "\u1e43", "n": "LATIN SMALL LETTER M WITH DOT BELOW"}], "\u057a": [{"c": "\u0270", "n": "LATIN SMALL LETTER TURNED M WITH LONG LEG"}], "\u0270": [{"c": "\u057a", "n": "ARMENIAN SMALL LETTER PEH"}, {"c": "\u1223", "n": "ETHIOPIC SYLLABLE SZAA"}], "\u1223": [{"c": "\u0270", "n": "LATIN SMALL LETTER TURNED M WITH LONG LEG"}], "\u2127": [{"c": "\u01b1", "n": "LATIN CAPITAL LETTER UPSILON"}], "\u01b1": [{"c": "\u2127", "n": "INVERTED OHM SIGN"}, {"c": "\u162e", "n": "CANADIAN SYLLABICS CARRIER LHU"}, {"c": "\u1634", "n": "CANADIAN SYLLABICS CARRIER TLHU"}], "\u162e": [{"c": "\u01b1", "n": "LATIN CAPITAL LETTER UPSILON"}], "\u1634": [{"c": "\u01b1", "n": "LATIN CAPITAL LETTER UPSILON"}], "\u1d7f": [{"c": "\u028a\u0335", "n": "LATIN SMALL LETTER UPSILON, COMBINING SHORT STROKE OVERLAY"}], "\u028a\u0335": [{"c": "\u1d7f", "n": "LATIN SMALL LETTER UPSILON WITH STROKE"}], "\u2228": [{"c": "v", "n": "LATIN SMALL LETTER V"}], "v": [{"c": "\u2228", "n": "LOGICAL OR"}, {"c": "\u22c1", "n": "N-ARY LOGICAL OR"}, {"c": "\uff56", "n": "FULLWIDTH LATIN SMALL LETTER V"}, {"c": "\u2174", "n": "SMALL ROMAN NUMERAL FIVE"}, {"c": "\ud835\udc2f", "n": "MATHEMATICAL BOLD SMALL V"}, {"c": "\ud835\udc63", "n": "MATHEMATICAL ITALIC SMALL V"}, {"c": "\ud835\udc97", "n": "MATHEMATICAL BOLD ITALIC SMALL V"}, {"c": "\ud835\udccb", "n": "MATHEMATICAL SCRIPT SMALL V"}, {"c": "\ud835\udcff", "n": "MATHEMATICAL BOLD SCRIPT SMALL V"}, {"c": "\ud835\udd33", "n": "MATHEMATICAL FRAKTUR SMALL V"}, {"c": "\ud835\udd67", "n": "MATHEMATICAL DOUBLE-STRUCK SMALL V"}, {"c": "\ud835\udd9b", "n": "MATHEMATICAL BOLD FRAKTUR SMALL V"}, {"c": "\ud835\uddcf", "n": "MATHEMATICAL SANS-SERIF SMALL V"}, {"c": "\ud835\ude03", "n": "MATHEMATICAL SANS-SERIF BOLD SMALL V"}, {"c": "\ud835\ude37", "n": "MATHEMATICAL SANS-SERIF ITALIC SMALL V"}, {"c": "\ud835\ude6b", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V"}, {"c": "\ud835\ude9f", "n": "MATHEMATICAL MONOSPACE SMALL V"}, {"c": "\u1d20", "n": "LATIN LETTER SMALL CAPITAL V"}, {"c": "\u03bd", "n": "GREEK SMALL LETTER NU"}, {"c": "\ud835\udece", "n": "MATHEMATICAL BOLD SMALL NU"}, {"c": "\ud835\udf08", "n": "MATHEMATICAL ITALIC SMALL NU"}, {"c": "\ud835\udf42", "n": "MATHEMATICAL BOLD ITALIC SMALL NU"}, {"c": "\ud835\udf7c", "n": "MATHEMATICAL SANS-SERIF BOLD SMALL NU"}, {"c": "\ud835\udfb6", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU"}, {"c": "\u0475", "n": "CYRILLIC SMALL LETTER IZHITSA"}, {"c": "\u200e\u05d8\u200e", "n": "HEBREW LETTER TET"}, {"c": "\ud805\udf06", "n": "AHOM LETTER PA"}, {"c": "\uaba9", "n": "CHEROKEE SMALL LETTER DO"}, {"c": "\ud806\udcc0", "n": "WARANG CITI SMALL LETTER NGAA"}], "\u22c1": [{"c": "v", "n": "LATIN SMALL LETTER V"}], "\uff56": [{"c": "v", "n": "LATIN SMALL LETTER V"}], "\u2174": [{"c": "v", "n": "LATIN SMALL LETTER V"}], "\ud835\udc2f": [{"c": "v", "n": "LATIN SMALL LETTER V"}], "\ud835\udc63": [{"c": "v", "n": "LATIN SMALL LETTER V"}], "\ud835\udc97": [{"c": "v", "n": "LATIN SMALL LETTER V"}], "\ud835\udccb": [{"c": "v", "n": "LATIN SMALL LETTER V"}], "\ud835\udcff": [{"c": "v", "n": "LATIN SMALL LETTER V"}], "\ud835\udd33": [{"c": "v", "n": "LATIN SMALL LETTER V"}], "\ud835\udd67": [{"c": "v", "n": "LATIN SMALL LETTER V"}], "\ud835\udd9b": [{"c": "v", "n": "LATIN SMALL LETTER V"}], "\ud835\uddcf": [{"c": "v", "n": "LATIN SMALL LETTER V"}], "\ud835\ude03": [{"c": "v", "n": "LATIN SMALL LETTER V"}], "\ud835\ude37": [{"c": "v", "n": "LATIN SMALL LETTER V"}], "\ud835\ude6b": [{"c": "v", "n": "LATIN SMALL LETTER V"}], "\ud835\ude9f": [{"c": "v", "n": "LATIN SMALL LETTER V"}], "\u1d20": [{"c": "v", "n": "LATIN SMALL LETTER V"}], "\u03bd": [{"c": "v", "n": "LATIN SMALL LETTER V"}], "\ud835\udece": [{"c": "v", "n": "LATIN SMALL LETTER V"}], "\ud835\udf08": [{"c": "v", "n": "LATIN SMALL LETTER V"}], "\ud835\udf42": [{"c": "v", "n": "LATIN SMALL LETTER V"}], "\ud835\udf7c": [{"c": "v", "n": "LATIN SMALL LETTER V"}], "\ud835\udfb6": [{"c": "v", "n": "LATIN SMALL LETTER V"}], "\u0475": [{"c": "v", "n": "LATIN SMALL LETTER V"}], "\u200e\u05d8\u200e": [{"c": "v", "n": "LATIN SMALL LETTER V"}], "\ud805\udf06": [{"c": "v", "n": "LATIN SMALL LETTER V"}], "\uaba9": [{"c": "v", "n": "LATIN SMALL LETTER V"}], "\ud806\udcc0": [{"c": "v", "n": "LATIN SMALL LETTER V"}], "\ud834\ude0d": [{"c": "V", "n": "LATIN CAPITAL LETTER V"}], "V": [{"c": "\ud834\ude0d", "n": "GREEK VOCAL NOTATION SYMBOL-14"}, {"c": "\u200e\u0667\u200e", "n": "ARABIC-INDIC DIGIT SEVEN"}, {"c": "\u06f7", "n": "EXTENDED ARABIC-INDIC DIGIT SEVEN"}, {"c": "\u2164", "n": "ROMAN NUMERAL FIVE"}, {"c": "\ud835\udc15", "n": "MATHEMATICAL BOLD CAPITAL V"}, {"c": "\ud835\udc49", "n": "MATHEMATICAL ITALIC CAPITAL V"}, {"c": "\ud835\udc7d", "n": "MATHEMATICAL BOLD ITALIC CAPITAL V"}, {"c": "\ud835\udcb1", "n": "MATHEMATICAL SCRIPT CAPITAL V"}, {"c": "\ud835\udce5", "n": "MATHEMATICAL BOLD SCRIPT CAPITAL V"}, {"c": "\ud835\udd19", "n": "MATHEMATICAL FRAKTUR CAPITAL V"}, {"c": "\ud835\udd4d", "n": "MATHEMATICAL DOUBLE-STRUCK CAPITAL V"}, {"c": "\ud835\udd81", "n": "MATHEMATICAL BOLD FRAKTUR CAPITAL V"}, {"c": "\ud835\uddb5", "n": "MATHEMATICAL SANS-SERIF CAPITAL V"}, {"c": "\ud835\udde9", "n": "MATHEMATICAL SANS-SERIF BOLD CAPITAL V"}, {"c": "\ud835\ude1d", "n": "MATHEMATICAL SANS-SERIF ITALIC CAPITAL V"}, {"c": "\ud835\ude51", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V"}, {"c": "\ud835\ude85", "n": "MATHEMATICAL MONOSPACE CAPITAL V"}, {"c": "\u0474", "n": "CYRILLIC CAPITAL LETTER IZHITSA"}, {"c": "\u2d38", "n": "TIFINAGH LETTER YADH"}, {"c": "\u13d9", "n": "CHEROKEE LETTER DO"}, {"c": "\u142f", "n": "CANADIAN SYLLABICS PE"}, {"c": "\ua6df", "n": "BAMUM LETTER KO"}, {"c": "\ua4e6", "n": "LISU LETTER HA"}, {"c": "\ud81b\udf08", "n": "MIAO LETTER VA"}, {"c": "\ud806\udca0", "n": "WARANG CITI CAPITAL LETTER NGAA"}, {"c": "\ud801\udd1d", "n": "ELBASAN LETTER TE"}], "\u200e\u0667\u200e": [{"c": "V", "n": "LATIN CAPITAL LETTER V"}], "\u06f7": [{"c": "V", "n": "LATIN CAPITAL LETTER V"}], "\u2164": [{"c": "V", "n": "LATIN CAPITAL LETTER V"}], "\ud835\udc15": [{"c": "V", "n": "LATIN CAPITAL LETTER V"}], "\ud835\udc49": [{"c": "V", "n": "LATIN CAPITAL LETTER V"}], "\ud835\udc7d": [{"c": "V", "n": "LATIN CAPITAL LETTER V"}], "\ud835\udcb1": [{"c": "V", "n": "LATIN CAPITAL LETTER V"}], "\ud835\udce5": [{"c": "V", "n": "LATIN CAPITAL LETTER V"}], "\ud835\udd19": [{"c": "V", "n": "LATIN CAPITAL LETTER V"}], "\ud835\udd4d": [{"c": "V", "n": "LATIN CAPITAL LETTER V"}], "\ud835\udd81": [{"c": "V", "n": "LATIN CAPITAL LETTER V"}], "\ud835\uddb5": [{"c": "V", "n": "LATIN CAPITAL LETTER V"}], "\ud835\udde9": [{"c": "V", "n": "LATIN CAPITAL LETTER V"}], "\ud835\ude1d": [{"c": "V", "n": "LATIN CAPITAL LETTER V"}], "\ud835\ude51": [{"c": "V", "n": "LATIN CAPITAL LETTER V"}], "\ud835\ude85": [{"c": "V", "n": "LATIN CAPITAL LETTER V"}], "\u0474": [{"c": "V", "n": "LATIN CAPITAL LETTER V"}], "\u2d38": [{"c": "V", "n": "LATIN CAPITAL LETTER V"}], "\u13d9": [{"c": "V", "n": "LATIN CAPITAL LETTER V"}], "\u142f": [{"c": "V", "n": "LATIN CAPITAL LETTER V"}], "\ua6df": [{"c": "V", "n": "LATIN CAPITAL LETTER V"}], "\ua4e6": [{"c": "V", "n": "LATIN CAPITAL LETTER V"}], "\ud81b\udf08": [{"c": "V", "n": "LATIN CAPITAL LETTER V"}], "\ud806\udca0": [{"c": "V", "n": "LATIN CAPITAL LETTER V"}], "\ud801\udd1d": [{"c": "V", "n": "LATIN CAPITAL LETTER V"}], "\ud800\udd97": [{"c": "V\u0335", "n": "LATIN CAPITAL LETTER V, COMBINING SHORT STROKE OVERLAY"}], "V\u0335": [{"c": "\ud800\udd97", "n": "ROMAN QUINARIUS SIGN"}], "\u143b": [{"c": "V\u00b7", "n": "LATIN CAPITAL LETTER V, MIDDLE DOT"}], "V\u00b7": [{"c": "\u143b", "n": "CANADIAN SYLLABICS WEST-CREE PWE"}], "\ud83d\udf6c": [{"c": "VB", "n": "LATIN CAPITAL LETTER V, LATIN CAPITAL LETTER B"}], "VB": [{"c": "\ud83d\udf6c", "n": "ALCHEMICAL SYMBOL FOR BATH OF VAPOURS"}], "\u2175": [{"c": "vi", "n": "LATIN SMALL LETTER V, LATIN SMALL LETTER I"}], "vi": [{"c": "\u2175", "n": "SMALL ROMAN NUMERAL SIX"}], "\u2176": [{"c": "vii", "n": "LATIN SMALL LETTER V, LATIN SMALL LETTER I, LATIN SMALL LETTER I"}], "vii": [{"c": "\u2176", "n": "SMALL ROMAN NUMERAL SEVEN"}], "\u2177": [{"c": "viii", "n": "LATIN SMALL LETTER V, LATIN SMALL LETTER I, LATIN SMALL LETTER I, LATIN SMALL LETTER I"}], "viii": [{"c": "\u2177", "n": "SMALL ROMAN NUMERAL EIGHT"}], "\u2165": [{"c": "Vl", "n": "LATIN CAPITAL LETTER V, LATIN SMALL LETTER L"}], "Vl": [{"c": "\u2165", "n": "ROMAN NUMERAL SIX"}], "\u2166": [{"c": "Vll", "n": "LATIN CAPITAL LETTER V, LATIN SMALL LETTER L, LATIN SMALL LETTER L"}], "Vll": [{"c": "\u2166", "n": "ROMAN NUMERAL SEVEN"}], "\u2167": [{"c": "Vlll", "n": "LATIN CAPITAL LETTER V, LATIN SMALL LETTER L, LATIN SMALL LETTER L, LATIN SMALL LETTER L"}], "Vlll": [{"c": "\u2167", "n": "ROMAN NUMERAL EIGHT"}], "\ud83d\udf08": [{"c": "V\u1de4", "n": "LATIN CAPITAL LETTER V, COMBINING LATIN SMALL LETTER S"}], "V\u1de4": [{"c": "\ud83d\udf08", "n": "ALCHEMICAL SYMBOL FOR AQUA VITAE"}], "\u1d27": [{"c": "\u028c", "n": "LATIN SMALL LETTER TURNED V"}], "\u028c": [{"c": "\u1d27", "n": "GREEK LETTER SMALL CAPITAL LAMDA"}, {"c": "\ud801\udcd8", "n": "OSAGE SMALL LETTER A"}], "\ud801\udcd8": [{"c": "\u028c", "n": "LATIN SMALL LETTER TURNED V"}], "\u200e\u0668\u200e": [{"c": "\u0245", "n": "LATIN CAPITAL LETTER TURNED V"}], "\u0245": [{"c": "\u200e\u0668\u200e", "n": "ARABIC-INDIC DIGIT EIGHT"}, {"c": "\u06f8", "n": "EXTENDED ARABIC-INDIC DIGIT EIGHT"}, {"c": "\u039b", "n": "GREEK CAPITAL LETTER LAMDA"}, {"c": "\ud835\udeb2", "n": "MATHEMATICAL BOLD CAPITAL LAMDA"}, {"c": "\ud835\udeec", "n": "MATHEMATICAL ITALIC CAPITAL LAMDA"}, {"c": "\ud835\udf26", "n": "MATHEMATICAL BOLD ITALIC CAPITAL LAMDA"}, {"c": "\ud835\udf60", "n": "MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA"}, {"c": "\ud835\udf9a", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA"}, {"c": "\u041b", "n": "CYRILLIC CAPITAL LETTER EL"}, {"c": "\u2d37", "n": "TIFINAGH LETTER YAD"}, {"c": "\ud801\udcb0", "n": "OSAGE CAPITAL LETTER A"}, {"c": "\u1431", "n": "CANADIAN SYLLABICS PI"}, {"c": "\ua6ce", "n": "BAMUM LETTER MI"}, {"c": "\ua4e5", "n": "LISU LETTER NGA"}, {"c": "\ud81b\udf3d", "n": "MIAO LETTER ZZA"}, {"c": "\ud800\ude8d", "n": "LYCIAN LETTER L"}], "\u06f8": [{"c": "\u0245", "n": "LATIN CAPITAL LETTER TURNED V"}], "\u039b": [{"c": "\u0245", "n": "LATIN CAPITAL LETTER TURNED V"}], "\ud835\udeb2": [{"c": "\u0245", "n": "LATIN CAPITAL LETTER TURNED V"}], "\ud835\udeec": [{"c": "\u0245", "n": "LATIN CAPITAL LETTER TURNED V"}], "\ud835\udf26": [{"c": "\u0245", "n": "LATIN CAPITAL LETTER TURNED V"}], "\ud835\udf60": [{"c": "\u0245", "n": "LATIN CAPITAL LETTER TURNED V"}], "\ud835\udf9a": [{"c": "\u0245", "n": "LATIN CAPITAL LETTER TURNED V"}], "\u041b": [{"c": "\u0245", "n": "LATIN CAPITAL LETTER TURNED V"}], "\u2d37": [{"c": "\u0245", "n": "LATIN CAPITAL LETTER TURNED V"}], "\ud801\udcb0": [{"c": "\u0245", "n": "LATIN CAPITAL LETTER TURNED V"}], "\u1431": [{"c": "\u0245", "n": "LATIN CAPITAL LETTER TURNED V"}], "\ua6ce": [{"c": "\u0245", "n": "LATIN CAPITAL LETTER TURNED V"}], "\ua4e5": [{"c": "\u0245", "n": "LATIN CAPITAL LETTER TURNED V"}], "\ud81b\udf3d": [{"c": "\u0245", "n": "LATIN CAPITAL LETTER TURNED V"}], "\ud800\ude8d": [{"c": "\u0245", "n": "LATIN CAPITAL LETTER TURNED V"}], "\u04c5": [{"c": "\u0245\u0326", "n": "LATIN CAPITAL LETTER TURNED V, COMBINING COMMA BELOW"}], "\u0245\u0326": [{"c": "\u04c5", "n": "CYRILLIC CAPITAL LETTER EL WITH TAIL"}], "\u143d": [{"c": "\u0245\u00b7", "n": "LATIN CAPITAL LETTER TURNED V, MIDDLE DOT"}], "\u0245\u00b7": [{"c": "\u143d", "n": "CANADIAN SYLLABICS WEST-CREE PWI"}], "\u026f": [{"c": "w", "n": "LATIN SMALL LETTER W"}], "w": [{"c": "\u026f", "n": "LATIN SMALL LETTER TURNED M"}, {"c": "\ud835\udc30", "n": "MATHEMATICAL BOLD SMALL W"}, {"c": "\ud835\udc64", "n": "MATHEMATICAL ITALIC SMALL W"}, {"c": "\ud835\udc98", "n": "MATHEMATICAL BOLD ITALIC SMALL W"}, {"c": "\ud835\udccc", "n": "MATHEMATICAL SCRIPT SMALL W"}, {"c": "\ud835\udd00", "n": "MATHEMATICAL BOLD SCRIPT SMALL W"}, {"c": "\ud835\udd34", "n": "MATHEMATICAL FRAKTUR SMALL W"}, {"c": "\ud835\udd68", "n": "MATHEMATICAL DOUBLE-STRUCK SMALL W"}, {"c": "\ud835\udd9c", "n": "MATHEMATICAL BOLD FRAKTUR SMALL W"}, {"c": "\ud835\uddd0", "n": "MATHEMATICAL SANS-SERIF SMALL W"}, {"c": "\ud835\ude04", "n": "MATHEMATICAL SANS-SERIF BOLD SMALL W"}, {"c": "\ud835\ude38", "n": "MATHEMATICAL SANS-SERIF ITALIC SMALL W"}, {"c": "\ud835\ude6c", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W"}, {"c": "\ud835\udea0", "n": "MATHEMATICAL MONOSPACE SMALL W"}, {"c": "\u1d21", "n": "LATIN LETTER SMALL CAPITAL W"}, {"c": "\u0461", "n": "CYRILLIC SMALL LETTER OMEGA"}, {"c": "\u051d", "n": "CYRILLIC SMALL LETTER WE"}, {"c": "\u0561", "n": "ARMENIAN SMALL LETTER AYB"}, {"c": "\ud805\udf0a", "n": "AHOM LETTER JA"}, {"c": "\ud805\udf0e", "n": "AHOM LETTER LA"}, {"c": "\ud805\udf0f", "n": "AHOM LETTER SA"}, {"c": "\uab83", "n": "CHEROKEE SMALL LETTER LA"}], "\ud835\udc30": [{"c": "w", "n": "LATIN SMALL LETTER W"}], "\ud835\udc64": [{"c": "w", "n": "LATIN SMALL LETTER W"}], "\ud835\udc98": [{"c": "w", "n": "LATIN SMALL LETTER W"}], "\ud835\udccc": [{"c": "w", "n": "LATIN SMALL LETTER W"}], "\ud835\udd00": [{"c": "w", "n": "LATIN SMALL LETTER W"}], "\ud835\udd34": [{"c": "w", "n": "LATIN SMALL LETTER W"}], "\ud835\udd68": [{"c": "w", "n": "LATIN SMALL LETTER W"}], "\ud835\udd9c": [{"c": "w", "n": "LATIN SMALL LETTER W"}], "\ud835\uddd0": [{"c": "w", "n": "LATIN SMALL LETTER W"}], "\ud835\ude04": [{"c": "w", "n": "LATIN SMALL LETTER W"}], "\ud835\ude38": [{"c": "w", "n": "LATIN SMALL LETTER W"}], "\ud835\ude6c": [{"c": "w", "n": "LATIN SMALL LETTER W"}], "\ud835\udea0": [{"c": "w", "n": "LATIN SMALL LETTER W"}], "\u1d21": [{"c": "w", "n": "LATIN SMALL LETTER W"}], "\u0461": [{"c": "w", "n": "LATIN SMALL LETTER W"}], "\u051d": [{"c": "w", "n": "LATIN SMALL LETTER W"}], "\u0561": [{"c": "w", "n": "LATIN SMALL LETTER W"}], "\ud805\udf0a": [{"c": "w", "n": "LATIN SMALL LETTER W"}], "\ud805\udf0e": [{"c": "w", "n": "LATIN SMALL LETTER W"}], "\ud805\udf0f": [{"c": "w", "n": "LATIN SMALL LETTER W"}], "\uab83": [{"c": "w", "n": "LATIN SMALL LETTER W"}], "\ud806\udcef": [{"c": "W", "n": "LATIN CAPITAL LETTER W"}], "W": [{"c": "\ud806\udcef", "n": "WARANG CITI NUMBER SIXTY"}, {"c": "\ud806\udce6", "n": "WARANG CITI DIGIT SIX"}, {"c": "\ud835\udc16", "n": "MATHEMATICAL BOLD CAPITAL W"}, {"c": "\ud835\udc4a", "n": "MATHEMATICAL ITALIC CAPITAL W"}, {"c": "\ud835\udc7e", "n": "MATHEMATICAL BOLD ITALIC CAPITAL W"}, {"c": "\ud835\udcb2", "n": "MATHEMATICAL SCRIPT CAPITAL W"}, {"c": "\ud835\udce6", "n": "MATHEMATICAL BOLD SCRIPT CAPITAL W"}, {"c": "\ud835\udd1a", "n": "MATHEMATICAL FRAKTUR CAPITAL W"}, {"c": "\ud835\udd4e", "n": "MATHEMATICAL DOUBLE-STRUCK CAPITAL W"}, {"c": "\ud835\udd82", "n": "MATHEMATICAL BOLD FRAKTUR CAPITAL W"}, {"c": "\ud835\uddb6", "n": "MATHEMATICAL SANS-SERIF CAPITAL W"}, {"c": "\ud835\uddea", "n": "MATHEMATICAL SANS-SERIF BOLD CAPITAL W"}, {"c": "\ud835\ude1e", "n": "MATHEMATICAL SANS-SERIF ITALIC CAPITAL W"}, {"c": "\ud835\ude52", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W"}, {"c": "\ud835\ude86", "n": "MATHEMATICAL MONOSPACE CAPITAL W"}, {"c": "\u051c", "n": "CYRILLIC CAPITAL LETTER WE"}, {"c": "\u13b3", "n": "CHEROKEE LETTER LA"}, {"c": "\u13d4", "n": "CHEROKEE LETTER TA"}, {"c": "\ua4ea", "n": "LISU LETTER WA"}], "\ud806\udce6": [{"c": "W", "n": "LATIN CAPITAL LETTER W"}], "\ud835\udc16": [{"c": "W", "n": "LATIN CAPITAL LETTER W"}], "\ud835\udc4a": [{"c": "W", "n": "LATIN CAPITAL LETTER W"}], "\ud835\udc7e": [{"c": "W", "n": "LATIN CAPITAL LETTER W"}], "\ud835\udcb2": [{"c": "W", "n": "LATIN CAPITAL LETTER W"}], "\ud835\udce6": [{"c": "W", "n": "LATIN CAPITAL LETTER W"}], "\ud835\udd1a": [{"c": "W", "n": "LATIN CAPITAL LETTER W"}], "\ud835\udd4e": [{"c": "W", "n": "LATIN CAPITAL LETTER W"}], "\ud835\udd82": [{"c": "W", "n": "LATIN CAPITAL LETTER W"}], "\ud835\uddb6": [{"c": "W", "n": "LATIN CAPITAL LETTER W"}], "\ud835\uddea": [{"c": "W", "n": "LATIN CAPITAL LETTER W"}], "\ud835\ude1e": [{"c": "W", "n": "LATIN CAPITAL LETTER W"}], "\ud835\ude52": [{"c": "W", "n": "LATIN CAPITAL LETTER W"}], "\ud835\ude86": [{"c": "W", "n": "LATIN CAPITAL LETTER W"}], "\u051c": [{"c": "W", "n": "LATIN CAPITAL LETTER W"}], "\u13b3": [{"c": "W", "n": "LATIN CAPITAL LETTER W"}], "\u13d4": [{"c": "W", "n": "LATIN CAPITAL LETTER W"}], "\ua4ea": [{"c": "W", "n": "LATIN CAPITAL LETTER W"}], "\u047d": [{"c": "w\u0486\u0487", "n": "LATIN SMALL LETTER W, COMBINING CYRILLIC PSILI PNEUMATA, COMBINING CYRILLIC POKRYTIE"}], "w\u0486\u0487": [{"c": "\u047d", "n": "CYRILLIC SMALL LETTER OMEGA WITH TITLO"}], "\ud805\udcc5": [{"c": "w\u0307", "n": "LATIN SMALL LETTER W, COMBINING DOT ABOVE"}], "w\u0307": [{"c": "\ud805\udcc5", "n": "TIRHUTA GVANG"}], "\u20a9": [{"c": "W\u0335", "n": "LATIN CAPITAL LETTER W, COMBINING SHORT STROKE OVERLAY"}], "W\u0335": [{"c": "\u20a9", "n": "WON SIGN"}], "\ua761": [{"c": "w\u0326", "n": "LATIN SMALL LETTER W, COMBINING COMMA BELOW"}], "w\u0326": [{"c": "\ua761", "n": "LATIN SMALL LETTER VY"}], "\u1d0d": [{"c": "\u028d", "n": "LATIN SMALL LETTER TURNED W"}], "\u028d": [{"c": "\u1d0d", "n": "LATIN LETTER SMALL CAPITAL M"}, {"c": "\u043c", "n": "CYRILLIC SMALL LETTER EM"}, {"c": "\uab87", "n": "CHEROKEE SMALL LETTER LU"}], "\u043c": [{"c": "\u028d", "n": "LATIN SMALL LETTER TURNED W"}], "\uab87": [{"c": "\u028d", "n": "LATIN SMALL LETTER TURNED W"}], "\u04ce": [{"c": "\u028d\u0326", "n": "LATIN SMALL LETTER TURNED W, COMBINING COMMA BELOW"}], "\u028d\u0326": [{"c": "\u04ce", "n": "CYRILLIC SMALL LETTER EM WITH TAIL"}], "\u166e": [{"c": "x", "n": "LATIN SMALL LETTER X"}], "x": [{"c": "\u166e", "n": "CANADIAN SYLLABICS FULL STOP"}, {"c": "\u00d7", "n": "MULTIPLICATION SIGN"}, {"c": "\u292b", "n": "RISING DIAGONAL CROSSING FALLING DIAGONAL"}, {"c": "\u292c", "n": "FALLING DIAGONAL CROSSING RISING DIAGONAL"}, {"c": "\u2a2f", "n": "VECTOR OR CROSS PRODUCT"}, {"c": "\uff58", "n": "FULLWIDTH LATIN SMALL LETTER X"}, {"c": "\u2179", "n": "SMALL ROMAN NUMERAL TEN"}, {"c": "\ud835\udc31", "n": "MATHEMATICAL BOLD SMALL X"}, {"c": "\ud835\udc65", "n": "MATHEMATICAL ITALIC SMALL X"}, {"c": "\ud835\udc99", "n": "MATHEMATICAL BOLD ITALIC SMALL X"}, {"c": "\ud835\udccd", "n": "MATHEMATICAL SCRIPT SMALL X"}, {"c": "\ud835\udd01", "n": "MATHEMATICAL BOLD SCRIPT SMALL X"}, {"c": "\ud835\udd35", "n": "MATHEMATICAL FRAKTUR SMALL X"}, {"c": "\ud835\udd69", "n": "MATHEMATICAL DOUBLE-STRUCK SMALL X"}, {"c": "\ud835\udd9d", "n": "MATHEMATICAL BOLD FRAKTUR SMALL X"}, {"c": "\ud835\uddd1", "n": "MATHEMATICAL SANS-SERIF SMALL X"}, {"c": "\ud835\ude05", "n": "MATHEMATICAL SANS-SERIF BOLD SMALL X"}, {"c": "\ud835\ude39", "n": "MATHEMATICAL SANS-SERIF ITALIC SMALL X"}, {"c": "\ud835\ude6d", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X"}, {"c": "\ud835\udea1", "n": "MATHEMATICAL MONOSPACE SMALL X"}, {"c": "\u0445", "n": "CYRILLIC SMALL LETTER HA"}, {"c": "\u1541", "n": "CANADIAN SYLLABICS SAYISI YI"}, {"c": "\u157d", "n": "CANADIAN SYLLABICS HK"}], "\u00d7": [{"c": "x", "n": "LATIN SMALL LETTER X"}], "\u292b": [{"c": "x", "n": "LATIN SMALL LETTER X"}], "\u292c": [{"c": "x", "n": "LATIN SMALL LETTER X"}], "\u2a2f": [{"c": "x", "n": "LATIN SMALL LETTER X"}], "\uff58": [{"c": "x", "n": "LATIN SMALL LETTER X"}], "\u2179": [{"c": "x", "n": "LATIN SMALL LETTER X"}], "\ud835\udc31": [{"c": "x", "n": "LATIN SMALL LETTER X"}], "\ud835\udc65": [{"c": "x", "n": "LATIN SMALL LETTER X"}], "\ud835\udc99": [{"c": "x", "n": "LATIN SMALL LETTER X"}], "\ud835\udccd": [{"c": "x", "n": "LATIN SMALL LETTER X"}], "\ud835\udd01": [{"c": "x", "n": "LATIN SMALL LETTER X"}], "\ud835\udd35": [{"c": "x", "n": "LATIN SMALL LETTER X"}], "\ud835\udd69": [{"c": "x", "n": "LATIN SMALL LETTER X"}], "\ud835\udd9d": [{"c": "x", "n": "LATIN SMALL LETTER X"}], "\ud835\uddd1": [{"c": "x", "n": "LATIN SMALL LETTER X"}], "\ud835\ude05": [{"c": "x", "n": "LATIN SMALL LETTER X"}], "\ud835\ude39": [{"c": "x", "n": "LATIN SMALL LETTER X"}], "\ud835\ude6d": [{"c": "x", "n": "LATIN SMALL LETTER X"}], "\ud835\udea1": [{"c": "x", "n": "LATIN SMALL LETTER X"}], "\u0445": [{"c": "x", "n": "LATIN SMALL LETTER X"}], "\u1541": [{"c": "x", "n": "LATIN SMALL LETTER X"}], "\u157d": [{"c": "x", "n": "LATIN SMALL LETTER X"}], "\u2def": [{"c": "\u036f", "n": "COMBINING LATIN SMALL LETTER X"}], "\u036f": [{"c": "\u2def", "n": "COMBINING CYRILLIC LETTER HA"}], "\u166d": [{"c": "X", "n": "LATIN CAPITAL LETTER X"}], "X": [{"c": "\u166d", "n": "CANADIAN SYLLABICS CHI SIGN"}, {"c": "\u2573", "n": "BOX DRAWINGS LIGHT DIAGONAL CROSS"}, {"c": "\ud800\udf22", "n": "OLD ITALIC NUMERAL TEN"}, {"c": "\ud806\udcec", "n": "WARANG CITI NUMBER THIRTY"}, {"c": "\uff38", "n": "FULLWIDTH LATIN CAPITAL LETTER X"}, {"c": "\u2169", "n": "ROMAN NUMERAL TEN"}, {"c": "\ud835\udc17", "n": "MATHEMATICAL BOLD CAPITAL X"}, {"c": "\ud835\udc4b", "n": "MATHEMATICAL ITALIC CAPITAL X"}, {"c": "\ud835\udc7f", "n": "MATHEMATICAL BOLD ITALIC CAPITAL X"}, {"c": "\ud835\udcb3", "n": "MATHEMATICAL SCRIPT CAPITAL X"}, {"c": "\ud835\udce7", "n": "MATHEMATICAL BOLD SCRIPT CAPITAL X"}, {"c": "\ud835\udd1b", "n": "MATHEMATICAL FRAKTUR CAPITAL X"}, {"c": "\ud835\udd4f", "n": "MATHEMATICAL DOUBLE-STRUCK CAPITAL X"}, {"c": "\ud835\udd83", "n": "MATHEMATICAL BOLD FRAKTUR CAPITAL X"}, {"c": "\ud835\uddb7", "n": "MATHEMATICAL SANS-SERIF CAPITAL X"}, {"c": "\ud835\uddeb", "n": "MATHEMATICAL SANS-SERIF BOLD CAPITAL X"}, {"c": "\ud835\ude1f", "n": "MATHEMATICAL SANS-SERIF ITALIC CAPITAL X"}, {"c": "\ud835\ude53", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X"}, {"c": "\ud835\ude87", "n": "MATHEMATICAL MONOSPACE CAPITAL X"}, {"c": "\ua7b3", "n": "LATIN CAPITAL LETTER CHI"}, {"c": "\u03a7", "n": "GREEK CAPITAL LETTER CHI"}, {"c": "\ud835\udebe", "n": "MATHEMATICAL BOLD CAPITAL CHI"}, {"c": "\ud835\udef8", "n": "MATHEMATICAL ITALIC CAPITAL CHI"}, {"c": "\ud835\udf32", "n": "MATHEMATICAL BOLD ITALIC CAPITAL CHI"}, {"c": "\ud835\udf6c", "n": "MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI"}, {"c": "\ud835\udfa6", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI"}, {"c": "\u2cac", "n": "COPTIC CAPITAL LETTER KHI"}, {"c": "\u0425", "n": "CYRILLIC CAPITAL LETTER HA"}, {"c": "\u2d5d", "n": "TIFINAGH LETTER YATH"}, {"c": "\u16b7", "n": "RUNIC LETTER GEBO GYFU G"}, {"c": "\ua4eb", "n": "LISU LETTER SHA"}, {"c": "\ud800\ude90", "n": "LYCIAN LETTER MM"}, {"c": "\ud800\udeb4", "n": "CARIAN LETTER X"}, {"c": "\ud800\udf17", "n": "OLD ITALIC LETTER EKS"}, {"c": "\ud801\udd27", "n": "ELBASAN LETTER KHE"}], "\u2573": [{"c": "X", "n": "LATIN CAPITAL LETTER X"}], "\ud800\udf22": [{"c": "X", "n": "LATIN CAPITAL LETTER X"}], "\ud806\udcec": [{"c": "X", "n": "LATIN CAPITAL LETTER X"}], "\uff38": [{"c": "X", "n": "LATIN CAPITAL LETTER X"}], "\u2169": [{"c": "X", "n": "LATIN CAPITAL LETTER X"}], "\ud835\udc17": [{"c": "X", "n": "LATIN CAPITAL LETTER X"}], "\ud835\udc4b": [{"c": "X", "n": "LATIN CAPITAL LETTER X"}], "\ud835\udc7f": [{"c": "X", "n": "LATIN CAPITAL LETTER X"}], "\ud835\udcb3": [{"c": "X", "n": "LATIN CAPITAL LETTER X"}], "\ud835\udce7": [{"c": "X", "n": "LATIN CAPITAL LETTER X"}], "\ud835\udd1b": [{"c": "X", "n": "LATIN CAPITAL LETTER X"}], "\ud835\udd4f": [{"c": "X", "n": "LATIN CAPITAL LETTER X"}], "\ud835\udd83": [{"c": "X", "n": "LATIN CAPITAL LETTER X"}], "\ud835\uddb7": [{"c": "X", "n": "LATIN CAPITAL LETTER X"}], "\ud835\uddeb": [{"c": "X", "n": "LATIN CAPITAL LETTER X"}], "\ud835\ude1f": [{"c": "X", "n": "LATIN CAPITAL LETTER X"}], "\ud835\ude53": [{"c": "X", "n": "LATIN CAPITAL LETTER X"}], "\ud835\ude87": [{"c": "X", "n": "LATIN CAPITAL LETTER X"}], "\ua7b3": [{"c": "X", "n": "LATIN CAPITAL LETTER X"}], "\u03a7": [{"c": "X", "n": "LATIN CAPITAL LETTER X"}], "\ud835\udebe": [{"c": "X", "n": "LATIN CAPITAL LETTER X"}], "\ud835\udef8": [{"c": "X", "n": "LATIN CAPITAL LETTER X"}], "\ud835\udf32": [{"c": "X", "n": "LATIN CAPITAL LETTER X"}], "\ud835\udf6c": [{"c": "X", "n": "LATIN CAPITAL LETTER X"}], "\ud835\udfa6": [{"c": "X", "n": "LATIN CAPITAL LETTER X"}], "\u2cac": [{"c": "X", "n": "LATIN CAPITAL LETTER X"}], "\u0425": [{"c": "X", "n": "LATIN CAPITAL LETTER X"}], "\u2d5d": [{"c": "X", "n": "LATIN CAPITAL LETTER X"}], "\u16b7": [{"c": "X", "n": "LATIN CAPITAL LETTER X"}], "\ua4eb": [{"c": "X", "n": "LATIN CAPITAL LETTER X"}], "\ud800\ude90": [{"c": "X", "n": "LATIN CAPITAL LETTER X"}], "\ud800\udeb4": [{"c": "X", "n": "LATIN CAPITAL LETTER X"}], "\ud800\udf17": [{"c": "X", "n": "LATIN CAPITAL LETTER X"}], "\ud801\udd27": [{"c": "X", "n": "LATIN CAPITAL LETTER X"}], "\u2a30": [{"c": "x\u0307", "n": "LATIN SMALL LETTER X, COMBINING DOT ABOVE"}], "x\u0307": [{"c": "\u2a30", "n": "MULTIPLICATION SIGN WITH DOT ABOVE"}], "\u04b2": [{"c": "X\u0329", "n": "LATIN CAPITAL LETTER X, COMBINING VERTICAL LINE BELOW"}], "X\u0329": [{"c": "\u04b2", "n": "CYRILLIC CAPITAL LETTER HA WITH DESCENDER"}], "\ud800\udd96": [{"c": "X\u0335", "n": "LATIN CAPITAL LETTER X, COMBINING SHORT STROKE OVERLAY"}], "X\u0335": [{"c": "\ud800\udd96", "n": "ROMAN DENARIUS SIGN"}], "\u217a": [{"c": "xi", "n": "LATIN SMALL LETTER X, LATIN SMALL LETTER I"}], "xi": [{"c": "\u217a", "n": "SMALL ROMAN NUMERAL ELEVEN"}], "\u217b": [{"c": "xii", "n": "LATIN SMALL LETTER X, LATIN SMALL LETTER I, LATIN SMALL LETTER I"}], "xii": [{"c": "\u217b", "n": "SMALL ROMAN NUMERAL TWELVE"}], "\u216a": [{"c": "Xl", "n": "LATIN CAPITAL LETTER X, LATIN SMALL LETTER L"}], "Xl": [{"c": "\u216a", "n": "ROMAN NUMERAL ELEVEN"}], "\u216b": [{"c": "Xll", "n": "LATIN CAPITAL LETTER X, LATIN SMALL LETTER L, LATIN SMALL LETTER L"}], "Xll": [{"c": "\u216b", "n": "ROMAN NUMERAL TWELVE"}], "\u0263": [{"c": "y", "n": "LATIN SMALL LETTER Y"}], "y": [{"c": "\u0263", "n": "LATIN SMALL LETTER GAMMA"}, {"c": "\u1d8c", "n": "LATIN SMALL LETTER V WITH PALATAL HOOK"}, {"c": "\uff59", "n": "FULLWIDTH LATIN SMALL LETTER Y"}, {"c": "\ud835\udc32", "n": "MATHEMATICAL BOLD SMALL Y"}, {"c": "\ud835\udc66", "n": "MATHEMATICAL ITALIC SMALL Y"}, {"c": "\ud835\udc9a", "n": "MATHEMATICAL BOLD ITALIC SMALL Y"}, {"c": "\ud835\udcce", "n": "MATHEMATICAL SCRIPT SMALL Y"}, {"c": "\ud835\udd02", "n": "MATHEMATICAL BOLD SCRIPT SMALL Y"}, {"c": "\ud835\udd36", "n": "MATHEMATICAL FRAKTUR SMALL Y"}, {"c": "\ud835\udd6a", "n": "MATHEMATICAL DOUBLE-STRUCK SMALL Y"}, {"c": "\ud835\udd9e", "n": "MATHEMATICAL BOLD FRAKTUR SMALL Y"}, {"c": "\ud835\uddd2", "n": "MATHEMATICAL SANS-SERIF SMALL Y"}, {"c": "\ud835\ude06", "n": "MATHEMATICAL SANS-SERIF BOLD SMALL Y"}, {"c": "\ud835\ude3a", "n": "MATHEMATICAL SANS-SERIF ITALIC SMALL Y"}, {"c": "\ud835\ude6e", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y"}, {"c": "\ud835\udea2", "n": "MATHEMATICAL MONOSPACE SMALL Y"}, {"c": "\u028f", "n": "LATIN LETTER SMALL CAPITAL Y"}, {"c": "\u1eff", "n": "LATIN SMALL LETTER Y WITH LOOP"}, {"c": "\uab5a", "n": "LATIN SMALL LETTER Y WITH SHORT RIGHT LEG"}, {"c": "\u03b3", "n": "GREEK SMALL LETTER GAMMA"}, {"c": "\u213d", "n": "DOUBLE-STRUCK SMALL GAMMA"}, {"c": "\ud835\udec4", "n": "MATHEMATICAL BOLD SMALL GAMMA"}, {"c": "\ud835\udefe", "n": "MATHEMATICAL ITALIC SMALL GAMMA"}, {"c": "\ud835\udf38", "n": "MATHEMATICAL BOLD ITALIC SMALL GAMMA"}, {"c": "\ud835\udf72", "n": "MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA"}, {"c": "\ud835\udfac", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA"}, {"c": "\u0443", "n": "CYRILLIC SMALL LETTER U"}, {"c": "\u04af", "n": "CYRILLIC SMALL LETTER STRAIGHT U"}, {"c": "\u10e7", "n": "GEORGIAN LETTER QAR"}, {"c": "\ud806\udcdc", "n": "WARANG CITI SMALL LETTER HAR"}], "\u1d8c": [{"c": "y", "n": "LATIN SMALL LETTER Y"}], "\uff59": [{"c": "y", "n": "LATIN SMALL LETTER Y"}], "\ud835\udc32": [{"c": "y", "n": "LATIN SMALL LETTER Y"}], "\ud835\udc66": [{"c": "y", "n": "LATIN SMALL LETTER Y"}], "\ud835\udc9a": [{"c": "y", "n": "LATIN SMALL LETTER Y"}], "\ud835\udcce": [{"c": "y", "n": "LATIN SMALL LETTER Y"}], "\ud835\udd02": [{"c": "y", "n": "LATIN SMALL LETTER Y"}], "\ud835\udd36": [{"c": "y", "n": "LATIN SMALL LETTER Y"}], "\ud835\udd6a": [{"c": "y", "n": "LATIN SMALL LETTER Y"}], "\ud835\udd9e": [{"c": "y", "n": "LATIN SMALL LETTER Y"}], "\ud835\uddd2": [{"c": "y", "n": "LATIN SMALL LETTER Y"}], "\ud835\ude06": [{"c": "y", "n": "LATIN SMALL LETTER Y"}], "\ud835\ude3a": [{"c": "y", "n": "LATIN SMALL LETTER Y"}], "\ud835\ude6e": [{"c": "y", "n": "LATIN SMALL LETTER Y"}], "\ud835\udea2": [{"c": "y", "n": "LATIN SMALL LETTER Y"}], "\u028f": [{"c": "y", "n": "LATIN SMALL LETTER Y"}], "\u1eff": [{"c": "y", "n": "LATIN SMALL LETTER Y"}], "\uab5a": [{"c": "y", "n": "LATIN SMALL LETTER Y"}], "\u03b3": [{"c": "y", "n": "LATIN SMALL LETTER Y"}], "\u213d": [{"c": "y", "n": "LATIN SMALL LETTER Y"}], "\ud835\udec4": [{"c": "y", "n": "LATIN SMALL LETTER Y"}], "\ud835\udefe": [{"c": "y", "n": "LATIN SMALL LETTER Y"}], "\ud835\udf38": [{"c": "y", "n": "LATIN SMALL LETTER Y"}], "\ud835\udf72": [{"c": "y", "n": "LATIN SMALL LETTER Y"}], "\ud835\udfac": [{"c": "y", "n": "LATIN SMALL LETTER Y"}], "\u0443": [{"c": "y", "n": "LATIN SMALL LETTER Y"}], "\u04af": [{"c": "y", "n": "LATIN SMALL LETTER Y"}], "\u10e7": [{"c": "y", "n": "LATIN SMALL LETTER Y"}], "\ud806\udcdc": [{"c": "y", "n": "LATIN SMALL LETTER Y"}], "\uff39": [{"c": "Y", "n": "LATIN CAPITAL LETTER Y"}], "Y": [{"c": "\uff39", "n": "FULLWIDTH LATIN CAPITAL LETTER Y"}, {"c": "\ud835\udc18", "n": "MATHEMATICAL BOLD CAPITAL Y"}, {"c": "\ud835\udc4c", "n": "MATHEMATICAL ITALIC CAPITAL Y"}, {"c": "\ud835\udc80", "n": "MATHEMATICAL BOLD ITALIC CAPITAL Y"}, {"c": "\ud835\udcb4", "n": "MATHEMATICAL SCRIPT CAPITAL Y"}, {"c": "\ud835\udce8", "n": "MATHEMATICAL BOLD SCRIPT CAPITAL Y"}, {"c": "\ud835\udd1c", "n": "MATHEMATICAL FRAKTUR CAPITAL Y"}, {"c": "\ud835\udd50", "n": "MATHEMATICAL DOUBLE-STRUCK CAPITAL Y"}, {"c": "\ud835\udd84", "n": "MATHEMATICAL BOLD FRAKTUR CAPITAL Y"}, {"c": "\ud835\uddb8", "n": "MATHEMATICAL SANS-SERIF CAPITAL Y"}, {"c": "\ud835\uddec", "n": "MATHEMATICAL SANS-SERIF BOLD CAPITAL Y"}, {"c": "\ud835\ude20", "n": "MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y"}, {"c": "\ud835\ude54", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y"}, {"c": "\ud835\ude88", "n": "MATHEMATICAL MONOSPACE CAPITAL Y"}, {"c": "\u03a5", "n": "GREEK CAPITAL LETTER UPSILON"}, {"c": "\u03d2", "n": "GREEK UPSILON WITH HOOK SYMBOL"}, {"c": "\ud835\udebc", "n": "MATHEMATICAL BOLD CAPITAL UPSILON"}, {"c": "\ud835\udef6", "n": "MATHEMATICAL ITALIC CAPITAL UPSILON"}, {"c": "\ud835\udf30", "n": "MATHEMATICAL BOLD ITALIC CAPITAL UPSILON"}, {"c": "\ud835\udf6a", "n": "MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON"}, {"c": "\ud835\udfa4", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON"}, {"c": "\u2ca8", "n": "COPTIC CAPITAL LETTER UA"}, {"c": "\u0423", "n": "CYRILLIC CAPITAL LETTER U"}, {"c": "\u04ae", "n": "CYRILLIC CAPITAL LETTER STRAIGHT U"}, {"c": "\u13a9", "n": "CHEROKEE LETTER GI"}, {"c": "\u13bd", "n": "CHEROKEE LETTER MU"}, {"c": "\ua4ec", "n": "LISU LETTER YA"}, {"c": "\ud81b\udf43", "n": "MIAO LETTER AH"}, {"c": "\ud806\udca4", "n": "WARANG CITI CAPITAL LETTER YA"}, {"c": "\ud800\udeb2", "n": "CARIAN LETTER U"}], "\ud835\udc18": [{"c": "Y", "n": "LATIN CAPITAL LETTER Y"}], "\ud835\udc4c": [{"c": "Y", "n": "LATIN CAPITAL LETTER Y"}], "\ud835\udc80": [{"c": "Y", "n": "LATIN CAPITAL LETTER Y"}], "\ud835\udcb4": [{"c": "Y", "n": "LATIN CAPITAL LETTER Y"}], "\ud835\udce8": [{"c": "Y", "n": "LATIN CAPITAL LETTER Y"}], "\ud835\udd1c": [{"c": "Y", "n": "LATIN CAPITAL LETTER Y"}], "\ud835\udd50": [{"c": "Y", "n": "LATIN CAPITAL LETTER Y"}], "\ud835\udd84": [{"c": "Y", "n": "LATIN CAPITAL LETTER Y"}], "\ud835\uddb8": [{"c": "Y", "n": "LATIN CAPITAL LETTER Y"}], "\ud835\uddec": [{"c": "Y", "n": "LATIN CAPITAL LETTER Y"}], "\ud835\ude20": [{"c": "Y", "n": "LATIN CAPITAL LETTER Y"}], "\ud835\ude54": [{"c": "Y", "n": "LATIN CAPITAL LETTER Y"}], "\ud835\ude88": [{"c": "Y", "n": "LATIN CAPITAL LETTER Y"}], "\u03a5": [{"c": "Y", "n": "LATIN CAPITAL LETTER Y"}], "\u03d2": [{"c": "Y", "n": "LATIN CAPITAL LETTER Y"}], "\ud835\udebc": [{"c": "Y", "n": "LATIN CAPITAL LETTER Y"}], "\ud835\udef6": [{"c": "Y", "n": "LATIN CAPITAL LETTER Y"}], "\ud835\udf30": [{"c": "Y", "n": "LATIN CAPITAL LETTER Y"}], "\ud835\udf6a": [{"c": "Y", "n": "LATIN CAPITAL LETTER Y"}], "\ud835\udfa4": [{"c": "Y", "n": "LATIN CAPITAL LETTER Y"}], "\u2ca8": [{"c": "Y", "n": "LATIN CAPITAL LETTER Y"}], "\u0423": [{"c": "Y", "n": "LATIN CAPITAL LETTER Y"}], "\u04ae": [{"c": "Y", "n": "LATIN CAPITAL LETTER Y"}], "\u13a9": [{"c": "Y", "n": "LATIN CAPITAL LETTER Y"}], "\u13bd": [{"c": "Y", "n": "LATIN CAPITAL LETTER Y"}], "\ua4ec": [{"c": "Y", "n": "LATIN CAPITAL LETTER Y"}], "\ud81b\udf43": [{"c": "Y", "n": "LATIN CAPITAL LETTER Y"}], "\ud806\udca4": [{"c": "Y", "n": "LATIN CAPITAL LETTER Y"}], "\ud800\udeb2": [{"c": "Y", "n": "LATIN CAPITAL LETTER Y"}], "\u01b4": [{"c": "y\u0314", "n": "LATIN SMALL LETTER Y, COMBINING REVERSED COMMA ABOVE"}], "y\u0314": [{"c": "\u01b4", "n": "LATIN SMALL LETTER Y WITH HOOK"}], "\u024f": [{"c": "y\u0335", "n": "LATIN SMALL LETTER Y, COMBINING SHORT STROKE OVERLAY"}], "y\u0335": [{"c": "\u024f", "n": "LATIN SMALL LETTER Y WITH STROKE"}, {"c": "\u04b1", "n": "CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE"}], "\u04b1": [{"c": "y\u0335", "n": "LATIN SMALL LETTER Y, COMBINING SHORT STROKE OVERLAY"}], "\u00a5": [{"c": "Y\u0335", "n": "LATIN CAPITAL LETTER Y, COMBINING SHORT STROKE OVERLAY"}], "Y\u0335": [{"c": "\u00a5", "n": "YEN SIGN"}, {"c": "\u024e", "n": "LATIN CAPITAL LETTER Y WITH STROKE"}, {"c": "\u04b0", "n": "CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE"}], "\u024e": [{"c": "Y\u0335", "n": "LATIN CAPITAL LETTER Y, COMBINING SHORT STROKE OVERLAY"}], "\u04b0": [{"c": "Y\u0335", "n": "LATIN CAPITAL LETTER Y, COMBINING SHORT STROKE OVERLAY"}], "\u0292": [{"c": "\u021d", "n": "LATIN SMALL LETTER YOGH"}], "\u021d": [{"c": "\u0292", "n": "LATIN SMALL LETTER EZH"}, {"c": "\ua76b", "n": "LATIN SMALL LETTER ET"}, {"c": "\u2ccd", "n": "COPTIC SMALL LETTER OLD COPTIC HORI"}, {"c": "\u04e1", "n": "CYRILLIC SMALL LETTER ABKHASIAN DZE"}, {"c": "\u10f3", "n": "GEORGIAN LETTER WE"}], "\ua76b": [{"c": "\u021d", "n": "LATIN SMALL LETTER YOGH"}], "\u2ccd": [{"c": "\u021d", "n": "LATIN SMALL LETTER YOGH"}], "\u04e1": [{"c": "\u021d", "n": "LATIN SMALL LETTER YOGH"}], "\u10f3": [{"c": "\u021d", "n": "LATIN SMALL LETTER YOGH"}], "\ud835\udc33": [{"c": "z", "n": "LATIN SMALL LETTER Z"}], "z": [{"c": "\ud835\udc33", "n": "MATHEMATICAL BOLD SMALL Z"}, {"c": "\ud835\udc67", "n": "MATHEMATICAL ITALIC SMALL Z"}, {"c": "\ud835\udc9b", "n": "MATHEMATICAL BOLD ITALIC SMALL Z"}, {"c": "\ud835\udccf", "n": "MATHEMATICAL SCRIPT SMALL Z"}, {"c": "\ud835\udd03", "n": "MATHEMATICAL BOLD SCRIPT SMALL Z"}, {"c": "\ud835\udd37", "n": "MATHEMATICAL FRAKTUR SMALL Z"}, {"c": "\ud835\udd6b", "n": "MATHEMATICAL DOUBLE-STRUCK SMALL Z"}, {"c": "\ud835\udd9f", "n": "MATHEMATICAL BOLD FRAKTUR SMALL Z"}, {"c": "\ud835\uddd3", "n": "MATHEMATICAL SANS-SERIF SMALL Z"}, {"c": "\ud835\ude07", "n": "MATHEMATICAL SANS-SERIF BOLD SMALL Z"}, {"c": "\ud835\ude3b", "n": "MATHEMATICAL SANS-SERIF ITALIC SMALL Z"}, {"c": "\ud835\ude6f", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z"}, {"c": "\ud835\udea3", "n": "MATHEMATICAL MONOSPACE SMALL Z"}, {"c": "\u1d22", "n": "LATIN LETTER SMALL CAPITAL Z"}, {"c": "\uab93", "n": "CHEROKEE SMALL LETTER NO"}, {"c": "\ud806\udcc4", "n": "WARANG CITI SMALL LETTER YA"}], "\ud835\udc67": [{"c": "z", "n": "LATIN SMALL LETTER Z"}], "\ud835\udc9b": [{"c": "z", "n": "LATIN SMALL LETTER Z"}], "\ud835\udccf": [{"c": "z", "n": "LATIN SMALL LETTER Z"}], "\ud835\udd03": [{"c": "z", "n": "LATIN SMALL LETTER Z"}], "\ud835\udd37": [{"c": "z", "n": "LATIN SMALL LETTER Z"}], "\ud835\udd6b": [{"c": "z", "n": "LATIN SMALL LETTER Z"}], "\ud835\udd9f": [{"c": "z", "n": "LATIN SMALL LETTER Z"}], "\ud835\uddd3": [{"c": "z", "n": "LATIN SMALL LETTER Z"}], "\ud835\ude07": [{"c": "z", "n": "LATIN SMALL LETTER Z"}], "\ud835\ude3b": [{"c": "z", "n": "LATIN SMALL LETTER Z"}], "\ud835\ude6f": [{"c": "z", "n": "LATIN SMALL LETTER Z"}], "\ud835\udea3": [{"c": "z", "n": "LATIN SMALL LETTER Z"}], "\u1d22": [{"c": "z", "n": "LATIN SMALL LETTER Z"}], "\uab93": [{"c": "z", "n": "LATIN SMALL LETTER Z"}], "\ud806\udcc4": [{"c": "z", "n": "LATIN SMALL LETTER Z"}], "\ud800\udef5": [{"c": "Z", "n": "LATIN CAPITAL LETTER Z"}], "Z": [{"c": "\ud800\udef5", "n": "COPTIC EPACT NUMBER THREE HUNDRED"}, {"c": "\ud806\udce5", "n": "WARANG CITI DIGIT FIVE"}, {"c": "\uff3a", "n": "FULLWIDTH LATIN CAPITAL LETTER Z"}, {"c": "\u2124", "n": "DOUBLE-STRUCK CAPITAL Z"}, {"c": "\u2128", "n": "BLACK-LETTER CAPITAL Z"}, {"c": "\ud835\udc19", "n": "MATHEMATICAL BOLD CAPITAL Z"}, {"c": "\ud835\udc4d", "n": "MATHEMATICAL ITALIC CAPITAL Z"}, {"c": "\ud835\udc81", "n": "MATHEMATICAL BOLD ITALIC CAPITAL Z"}, {"c": "\ud835\udcb5", "n": "MATHEMATICAL SCRIPT CAPITAL Z"}, {"c": "\ud835\udce9", "n": "MATHEMATICAL BOLD SCRIPT CAPITAL Z"}, {"c": "\ud835\udd85", "n": "MATHEMATICAL BOLD FRAKTUR CAPITAL Z"}, {"c": "\ud835\uddb9", "n": "MATHEMATICAL SANS-SERIF CAPITAL Z"}, {"c": "\ud835\udded", "n": "MATHEMATICAL SANS-SERIF BOLD CAPITAL Z"}, {"c": "\ud835\ude21", "n": "MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z"}, {"c": "\ud835\ude55", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z"}, {"c": "\ud835\ude89", "n": "MATHEMATICAL MONOSPACE CAPITAL Z"}, {"c": "\u0396", "n": "GREEK CAPITAL LETTER ZETA"}, {"c": "\ud835\udead", "n": "MATHEMATICAL BOLD CAPITAL ZETA"}, {"c": "\ud835\udee7", "n": "MATHEMATICAL ITALIC CAPITAL ZETA"}, {"c": "\ud835\udf21", "n": "MATHEMATICAL BOLD ITALIC CAPITAL ZETA"}, {"c": "\ud835\udf5b", "n": "MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA"}, {"c": "\ud835\udf95", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA"}, {"c": "\u13c3", "n": "CHEROKEE LETTER NO"}, {"c": "\ua4dc", "n": "LISU LETTER DZA"}, {"c": "\ud806\udca9", "n": "WARANG CITI CAPITAL LETTER O"}], "\ud806\udce5": [{"c": "Z", "n": "LATIN CAPITAL LETTER Z"}], "\uff3a": [{"c": "Z", "n": "LATIN CAPITAL LETTER Z"}], "\u2124": [{"c": "Z", "n": "LATIN CAPITAL LETTER Z"}], "\u2128": [{"c": "Z", "n": "LATIN CAPITAL LETTER Z"}], "\ud835\udc19": [{"c": "Z", "n": "LATIN CAPITAL LETTER Z"}], "\ud835\udc4d": [{"c": "Z", "n": "LATIN CAPITAL LETTER Z"}], "\ud835\udc81": [{"c": "Z", "n": "LATIN CAPITAL LETTER Z"}], "\ud835\udcb5": [{"c": "Z", "n": "LATIN CAPITAL LETTER Z"}], "\ud835\udce9": [{"c": "Z", "n": "LATIN CAPITAL LETTER Z"}], "\ud835\udd85": [{"c": "Z", "n": "LATIN CAPITAL LETTER Z"}], "\ud835\uddb9": [{"c": "Z", "n": "LATIN CAPITAL LETTER Z"}], "\ud835\udded": [{"c": "Z", "n": "LATIN CAPITAL LETTER Z"}], "\ud835\ude21": [{"c": "Z", "n": "LATIN CAPITAL LETTER Z"}], "\ud835\ude55": [{"c": "Z", "n": "LATIN CAPITAL LETTER Z"}], "\ud835\ude89": [{"c": "Z", "n": "LATIN CAPITAL LETTER Z"}], "\u0396": [{"c": "Z", "n": "LATIN CAPITAL LETTER Z"}], "\ud835\udead": [{"c": "Z", "n": "LATIN CAPITAL LETTER Z"}], "\ud835\udee7": [{"c": "Z", "n": "LATIN CAPITAL LETTER Z"}], "\ud835\udf21": [{"c": "Z", "n": "LATIN CAPITAL LETTER Z"}], "\ud835\udf5b": [{"c": "Z", "n": "LATIN CAPITAL LETTER Z"}], "\ud835\udf95": [{"c": "Z", "n": "LATIN CAPITAL LETTER Z"}], "\u13c3": [{"c": "Z", "n": "LATIN CAPITAL LETTER Z"}], "\ua4dc": [{"c": "Z", "n": "LATIN CAPITAL LETTER Z"}], "\ud806\udca9": [{"c": "Z", "n": "LATIN CAPITAL LETTER Z"}], "\u0290": [{"c": "z\u0328", "n": "LATIN SMALL LETTER Z, COMBINING OGONEK"}], "z\u0328": [{"c": "\u0290", "n": "LATIN SMALL LETTER Z WITH RETROFLEX HOOK"}], "\u01b6": [{"c": "z\u0335", "n": "LATIN SMALL LETTER Z, COMBINING SHORT STROKE OVERLAY"}], "z\u0335": [{"c": "\u01b6", "n": "LATIN SMALL LETTER Z WITH STROKE"}], "\u01b5": [{"c": "Z\u0335", "n": "LATIN CAPITAL LETTER Z, COMBINING SHORT STROKE OVERLAY"}], "Z\u0335": [{"c": "\u01b5", "n": "LATIN CAPITAL LETTER Z WITH STROKE"}], "\u0225": [{"c": "z\u0326", "n": "LATIN SMALL LETTER Z, COMBINING COMMA BELOW"}], "z\u0326": [{"c": "\u0225", "n": "LATIN SMALL LETTER Z WITH HOOK"}], "\u0224": [{"c": "Z\u0326", "n": "LATIN CAPITAL LETTER Z, COMBINING COMMA BELOW"}], "Z\u0326": [{"c": "\u0224", "n": "LATIN CAPITAL LETTER Z WITH HOOK"}], "\u1d76": [{"c": "z\u0334", "n": "LATIN SMALL LETTER Z, COMBINING TILDE OVERLAY"}], "z\u0334": [{"c": "\u1d76", "n": "LATIN SMALL LETTER Z WITH MIDDLE TILDE"}], "\u01bf": [{"c": "\u00fe", "n": "LATIN SMALL LETTER THORN"}], "\u00fe": [{"c": "\u01bf", "n": "LATIN LETTER WYNN"}, {"c": "\u03f8", "n": "GREEK SMALL LETTER SHO"}], "\u03f8": [{"c": "\u00fe", "n": "LATIN SMALL LETTER THORN"}], "\u03f7": [{"c": "\u00de", "n": "LATIN CAPITAL LETTER THORN"}], "\u00de": [{"c": "\u03f7", "n": "GREEK CAPITAL LETTER SHO"}, {"c": "\ud801\udcc4", "n": "OSAGE CAPITAL LETTER PA"}], "\ud801\udcc4": [{"c": "\u00de", "n": "LATIN CAPITAL LETTER THORN"}], "\u2079": [{"c": "\ua770", "n": "MODIFIER LETTER US"}], "\ua770": [{"c": "\u2079", "n": "SUPERSCRIPT NINE"}], "\u1d24": [{"c": "\u01a8", "n": "LATIN SMALL LETTER TONE TWO"}], "\u01a8": [{"c": "\u1d24", "n": "LATIN LETTER VOICED LARYNGEAL SPIRANT"}, {"c": "\u03e9", "n": "COPTIC SMALL LETTER HORI"}, {"c": "\ua645", "n": "CYRILLIC SMALL LETTER REVERSED DZE"}], "\u03e9": [{"c": "\u01a8", "n": "LATIN SMALL LETTER TONE TWO"}], "\ua645": [{"c": "\u01a8", "n": "LATIN SMALL LETTER TONE TWO"}], "\u044c": [{"c": "\u0185", "n": "LATIN SMALL LETTER TONE SIX"}], "\u0185": [{"c": "\u044c", "n": "CYRILLIC SMALL LETTER SOFT SIGN"}, {"c": "\uab9f", "n": "CHEROKEE SMALL LETTER SI"}], "\uab9f": [{"c": "\u0185", "n": "LATIN SMALL LETTER TONE SIX"}], "\u044b": [{"c": "\u0185i", "n": "LATIN SMALL LETTER TONE SIX, LATIN SMALL LETTER I"}], "\u0185i": [{"c": "\u044b", "n": "CYRILLIC SMALL LETTER YERU"}], "\uab7e": [{"c": "\u0242", "n": "LATIN SMALL LETTER GLOTTAL STOP"}], "\u0242": [{"c": "\uab7e", "n": "CHEROKEE SMALL LETTER HE"}], "\u02e4": [{"c": "\u02c1", "n": "MODIFIER LETTER REVERSED GLOTTAL STOP"}], "\u02c1": [{"c": "\u02e4", "n": "MODIFIER LETTER SMALL REVERSED GLOTTAL STOP"}], "\ua6cd": [{"c": "\u02a1", "n": "LATIN LETTER GLOTTAL STOP WITH STROKE"}], "\u02a1": [{"c": "\ua6cd", "n": "BAMUM LETTER LU"}], "\u2299": [{"c": "\u0298", "n": "LATIN LETTER BILABIAL CLICK"}], "\u0298": [{"c": "\u2299", "n": "CIRCLED DOT OPERATOR"}, {"c": "\u2609", "n": "SUN"}, {"c": "\u2a00", "n": "N-ARY CIRCLED DOT OPERATOR"}, {"c": "\ua668", "n": "CYRILLIC CAPITAL LETTER MONOCULAR O"}, {"c": "\u2d59", "n": "TIFINAGH LETTER YAS"}, {"c": "\ud801\udcc3", "n": "OSAGE CAPITAL LETTER OIN"}], "\u2609": [{"c": "\u0298", "n": "LATIN LETTER BILABIAL CLICK"}], "\u2a00": [{"c": "\u0298", "n": "LATIN LETTER BILABIAL CLICK"}], "\ua668": [{"c": "\u0298", "n": "LATIN LETTER BILABIAL CLICK"}], "\u2d59": [{"c": "\u0298", "n": "LATIN LETTER BILABIAL CLICK"}], "\ud801\udcc3": [{"c": "\u0298", "n": "LATIN LETTER BILABIAL CLICK"}], "\u213e": [{"c": "\u0393", "n": "GREEK CAPITAL LETTER GAMMA"}], "\u0393": [{"c": "\u213e", "n": "DOUBLE-STRUCK CAPITAL GAMMA"}, {"c": "\ud835\udeaa", "n": "MATHEMATICAL BOLD CAPITAL GAMMA"}, {"c": "\ud835\udee4", "n": "MATHEMATICAL ITALIC CAPITAL GAMMA"}, {"c": "\ud835\udf1e", "n": "MATHEMATICAL BOLD ITALIC CAPITAL GAMMA"}, {"c": "\ud835\udf58", "n": "MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA"}, {"c": "\ud835\udf92", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA"}, {"c": "\u2c84", "n": "COPTIC CAPITAL LETTER GAMMA"}, {"c": "\u0413", "n": "CYRILLIC CAPITAL LETTER GHE"}, {"c": "\u13b1", "n": "CHEROKEE LETTER HU"}, {"c": "\u14a5", "n": "CANADIAN SYLLABICS MI"}, {"c": "\ud81b\udf07", "n": "MIAO LETTER FA"}], "\ud835\udeaa": [{"c": "\u0393", "n": "GREEK CAPITAL LETTER GAMMA"}], "\ud835\udee4": [{"c": "\u0393", "n": "GREEK CAPITAL LETTER GAMMA"}], "\ud835\udf1e": [{"c": "\u0393", "n": "GREEK CAPITAL LETTER GAMMA"}], "\ud835\udf58": [{"c": "\u0393", "n": "GREEK CAPITAL LETTER GAMMA"}], "\ud835\udf92": [{"c": "\u0393", "n": "GREEK CAPITAL LETTER GAMMA"}], "\u2c84": [{"c": "\u0393", "n": "GREEK CAPITAL LETTER GAMMA"}], "\u0413": [{"c": "\u0393", "n": "GREEK CAPITAL LETTER GAMMA"}], "\u13b1": [{"c": "\u0393", "n": "GREEK CAPITAL LETTER GAMMA"}], "\u14a5": [{"c": "\u0393", "n": "GREEK CAPITAL LETTER GAMMA"}], "\ud81b\udf07": [{"c": "\u0393", "n": "GREEK CAPITAL LETTER GAMMA"}], "\u0492": [{"c": "\u0393\u0335", "n": "GREEK CAPITAL LETTER GAMMA, COMBINING SHORT STROKE OVERLAY"}], "\u0393\u0335": [{"c": "\u0492", "n": "CYRILLIC CAPITAL LETTER GHE WITH STROKE"}], "\u14af": [{"c": "\u0393\u00b7", "n": "GREEK CAPITAL LETTER GAMMA, MIDDLE DOT"}], "\u0393\u00b7": [{"c": "\u14af", "n": "CANADIAN SYLLABICS WEST-CREE MWI"}], "\u0490": [{"c": "\u0393'", "n": "GREEK CAPITAL LETTER GAMMA, APOSTROPHE"}], "\u0393'": [{"c": "\u0490", "n": "CYRILLIC CAPITAL LETTER GHE WITH UPTURN"}], "\u2206": [{"c": "\u0394", "n": "GREEK CAPITAL LETTER DELTA"}], "\u0394": [{"c": "\u2206", "n": "INCREMENT"}, {"c": "\u25b3", "n": "WHITE UP-POINTING TRIANGLE"}, {"c": "\ud83d\udf02", "n": "ALCHEMICAL SYMBOL FOR FIRE"}, {"c": "\ud835\udeab", "n": "MATHEMATICAL BOLD CAPITAL DELTA"}, {"c": "\ud835\udee5", "n": "MATHEMATICAL ITALIC CAPITAL DELTA"}, {"c": "\ud835\udf1f", "n": "MATHEMATICAL BOLD ITALIC CAPITAL DELTA"}, {"c": "\ud835\udf59", "n": "MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA"}, {"c": "\ud835\udf93", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA"}, {"c": "\u2c86", "n": "COPTIC CAPITAL LETTER DALDA"}, {"c": "\u2d60", "n": "TIFINAGH LETTER YAV"}, {"c": "\u1403", "n": "CANADIAN SYLLABICS I"}, {"c": "\ud81b\udf1a", "n": "MIAO LETTER TLHA"}, {"c": "\ud800\ude85", "n": "LYCIAN LETTER D"}, {"c": "\ud800\udea3", "n": "CARIAN LETTER L"}], "\u25b3": [{"c": "\u0394", "n": "GREEK CAPITAL LETTER DELTA"}], "\ud83d\udf02": [{"c": "\u0394", "n": "GREEK CAPITAL LETTER DELTA"}], "\ud835\udeab": [{"c": "\u0394", "n": "GREEK CAPITAL LETTER DELTA"}], "\ud835\udee5": [{"c": "\u0394", "n": "GREEK CAPITAL LETTER DELTA"}], "\ud835\udf1f": [{"c": "\u0394", "n": "GREEK CAPITAL LETTER DELTA"}], "\ud835\udf59": [{"c": "\u0394", "n": "GREEK CAPITAL LETTER DELTA"}], "\ud835\udf93": [{"c": "\u0394", "n": "GREEK CAPITAL LETTER DELTA"}], "\u2c86": [{"c": "\u0394", "n": "GREEK CAPITAL LETTER DELTA"}], "\u2d60": [{"c": "\u0394", "n": "GREEK CAPITAL LETTER DELTA"}], "\u1403": [{"c": "\u0394", "n": "GREEK CAPITAL LETTER DELTA"}], "\ud81b\udf1a": [{"c": "\u0394", "n": "GREEK CAPITAL LETTER DELTA"}], "\ud800\ude85": [{"c": "\u0394", "n": "GREEK CAPITAL LETTER DELTA"}], "\ud800\udea3": [{"c": "\u0394", "n": "GREEK CAPITAL LETTER DELTA"}], "\u2359": [{"c": "\u0394\u0332", "n": "GREEK CAPITAL LETTER DELTA, COMBINING LOW LINE"}], "\u0394\u0332": [{"c": "\u2359", "n": "APL FUNCTIONAL SYMBOL DELTA UNDERBAR"}], "\u140f": [{"c": "\u0394\u00b7", "n": "GREEK CAPITAL LETTER DELTA, MIDDLE DOT"}], "\u0394\u00b7": [{"c": "\u140f", "n": "CANADIAN SYLLABICS WEST-CREE WI"}], "\u142c": [{"c": "\u0394\u1420", "n": "GREEK CAPITAL LETTER DELTA, CANADIAN SYLLABICS FINAL GRAVE"}], "\u0394\u1420": [{"c": "\u142c", "n": "CANADIAN SYLLABICS IN"}], "\ud835\udfcb": [{"c": "\u03dd", "n": "GREEK SMALL LETTER DIGAMMA"}], "\u03dd": [{"c": "\ud835\udfcb", "n": "MATHEMATICAL BOLD SMALL DIGAMMA"}], "\ud835\udec7": [{"c": "\u03b6", "n": "GREEK SMALL LETTER ZETA"}], "\u03b6": [{"c": "\ud835\udec7", "n": "MATHEMATICAL BOLD SMALL ZETA"}, {"c": "\ud835\udf01", "n": "MATHEMATICAL ITALIC SMALL ZETA"}, {"c": "\ud835\udf3b", "n": "MATHEMATICAL BOLD ITALIC SMALL ZETA"}, {"c": "\ud835\udf75", "n": "MATHEMATICAL SANS-SERIF BOLD SMALL ZETA"}, {"c": "\ud835\udfaf", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA"}], "\ud835\udf01": [{"c": "\u03b6", "n": "GREEK SMALL LETTER ZETA"}], "\ud835\udf3b": [{"c": "\u03b6", "n": "GREEK SMALL LETTER ZETA"}], "\ud835\udf75": [{"c": "\u03b6", "n": "GREEK SMALL LETTER ZETA"}], "\ud835\udfaf": [{"c": "\u03b6", "n": "GREEK SMALL LETTER ZETA"}], "\u2ce4": [{"c": "\u03d7", "n": "GREEK KAI SYMBOL"}], "\u03d7": [{"c": "\u2ce4", "n": "COPTIC SYMBOL KAI"}], "\ud835\udecc": [{"c": "\u03bb", "n": "GREEK SMALL LETTER LAMDA"}], "\u03bb": [{"c": "\ud835\udecc", "n": "MATHEMATICAL BOLD SMALL LAMDA"}, {"c": "\ud835\udf06", "n": "MATHEMATICAL ITALIC SMALL LAMDA"}, {"c": "\ud835\udf40", "n": "MATHEMATICAL BOLD ITALIC SMALL LAMDA"}, {"c": "\ud835\udf7a", "n": "MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA"}, {"c": "\ud835\udfb4", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA"}, {"c": "\u2c96", "n": "COPTIC CAPITAL LETTER LAULA"}, {"c": "\ud801\udcdb", "n": "OSAGE SMALL LETTER AH"}], "\ud835\udf06": [{"c": "\u03bb", "n": "GREEK SMALL LETTER LAMDA"}], "\ud835\udf40": [{"c": "\u03bb", "n": "GREEK SMALL LETTER LAMDA"}], "\ud835\udf7a": [{"c": "\u03bb", "n": "GREEK SMALL LETTER LAMDA"}], "\ud835\udfb4": [{"c": "\u03bb", "n": "GREEK SMALL LETTER LAMDA"}], "\u2c96": [{"c": "\u03bb", "n": "GREEK SMALL LETTER LAMDA"}], "\ud801\udcdb": [{"c": "\u03bb", "n": "GREEK SMALL LETTER LAMDA"}], "\u00b5": [{"c": "\u03bc", "n": "GREEK SMALL LETTER MU"}], "\u03bc": [{"c": "\u00b5", "n": "MICRO SIGN"}, {"c": "\ud835\udecd", "n": "MATHEMATICAL BOLD SMALL MU"}, {"c": "\ud835\udf07", "n": "MATHEMATICAL ITALIC SMALL MU"}, {"c": "\ud835\udf41", "n": "MATHEMATICAL BOLD ITALIC SMALL MU"}, {"c": "\ud835\udf7b", "n": "MATHEMATICAL SANS-SERIF BOLD SMALL MU"}, {"c": "\ud835\udfb5", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU"}], "\ud835\udecd": [{"c": "\u03bc", "n": "GREEK SMALL LETTER MU"}], "\ud835\udf07": [{"c": "\u03bc", "n": "GREEK SMALL LETTER MU"}], "\ud835\udf41": [{"c": "\u03bc", "n": "GREEK SMALL LETTER MU"}], "\ud835\udf7b": [{"c": "\u03bc", "n": "GREEK SMALL LETTER MU"}], "\ud835\udfb5": [{"c": "\u03bc", "n": "GREEK SMALL LETTER MU"}], "\ud835\udecf": [{"c": "\u03be", "n": "GREEK SMALL LETTER XI"}], "\u03be": [{"c": "\ud835\udecf", "n": "MATHEMATICAL BOLD SMALL XI"}, {"c": "\ud835\udf09", "n": "MATHEMATICAL ITALIC SMALL XI"}, {"c": "\ud835\udf43", "n": "MATHEMATICAL BOLD ITALIC SMALL XI"}, {"c": "\ud835\udf7d", "n": "MATHEMATICAL SANS-SERIF BOLD SMALL XI"}, {"c": "\ud835\udfb7", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI"}], "\ud835\udf09": [{"c": "\u03be", "n": "GREEK SMALL LETTER XI"}], "\ud835\udf43": [{"c": "\u03be", "n": "GREEK SMALL LETTER XI"}], "\ud835\udf7d": [{"c": "\u03be", "n": "GREEK SMALL LETTER XI"}], "\ud835\udfb7": [{"c": "\u03be", "n": "GREEK SMALL LETTER XI"}], "\ud835\udeb5": [{"c": "\u039e", "n": "GREEK CAPITAL LETTER XI"}], "\u039e": [{"c": "\ud835\udeb5", "n": "MATHEMATICAL BOLD CAPITAL XI"}, {"c": "\ud835\udeef", "n": "MATHEMATICAL ITALIC CAPITAL XI"}, {"c": "\ud835\udf29", "n": "MATHEMATICAL BOLD ITALIC CAPITAL XI"}, {"c": "\ud835\udf63", "n": "MATHEMATICAL SANS-SERIF BOLD CAPITAL XI"}, {"c": "\ud835\udf9d", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI"}], "\ud835\udeef": [{"c": "\u039e", "n": "GREEK CAPITAL LETTER XI"}], "\ud835\udf29": [{"c": "\u039e", "n": "GREEK CAPITAL LETTER XI"}], "\ud835\udf63": [{"c": "\u039e", "n": "GREEK CAPITAL LETTER XI"}], "\ud835\udf9d": [{"c": "\u039e", "n": "GREEK CAPITAL LETTER XI"}], "\u03d6": [{"c": "\u03c0", "n": "GREEK SMALL LETTER PI"}], "\u03c0": [{"c": "\u03d6", "n": "GREEK PI SYMBOL"}, {"c": "\u213c", "n": "DOUBLE-STRUCK SMALL PI"}, {"c": "\ud835\uded1", "n": "MATHEMATICAL BOLD SMALL PI"}, {"c": "\ud835\udee1", "n": "MATHEMATICAL BOLD PI SYMBOL"}, {"c": "\ud835\udf0b", "n": "MATHEMATICAL ITALIC SMALL PI"}, {"c": "\ud835\udf1b", "n": "MATHEMATICAL ITALIC PI SYMBOL"}, {"c": "\ud835\udf45", "n": "MATHEMATICAL BOLD ITALIC SMALL PI"}, {"c": "\ud835\udf55", "n": "MATHEMATICAL BOLD ITALIC PI SYMBOL"}, {"c": "\ud835\udf7f", "n": "MATHEMATICAL SANS-SERIF BOLD SMALL PI"}, {"c": "\ud835\udf8f", "n": "MATHEMATICAL SANS-SERIF BOLD PI SYMBOL"}, {"c": "\ud835\udfb9", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI"}, {"c": "\ud835\udfc9", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL"}, {"c": "\u1d28", "n": "GREEK LETTER SMALL CAPITAL PI"}, {"c": "\u043f", "n": "CYRILLIC SMALL LETTER PE"}], "\u213c": [{"c": "\u03c0", "n": "GREEK SMALL LETTER PI"}], "\ud835\uded1": [{"c": "\u03c0", "n": "GREEK SMALL LETTER PI"}], "\ud835\udee1": [{"c": "\u03c0", "n": "GREEK SMALL LETTER PI"}], "\ud835\udf0b": [{"c": "\u03c0", "n": "GREEK SMALL LETTER PI"}], "\ud835\udf1b": [{"c": "\u03c0", "n": "GREEK SMALL LETTER PI"}], "\ud835\udf45": [{"c": "\u03c0", "n": "GREEK SMALL LETTER PI"}], "\ud835\udf55": [{"c": "\u03c0", "n": "GREEK SMALL LETTER PI"}], "\ud835\udf7f": [{"c": "\u03c0", "n": "GREEK SMALL LETTER PI"}], "\ud835\udf8f": [{"c": "\u03c0", "n": "GREEK SMALL LETTER PI"}], "\ud835\udfb9": [{"c": "\u03c0", "n": "GREEK SMALL LETTER PI"}], "\ud835\udfc9": [{"c": "\u03c0", "n": "GREEK SMALL LETTER PI"}], "\u1d28": [{"c": "\u03c0", "n": "GREEK SMALL LETTER PI"}], "\u043f": [{"c": "\u03c0", "n": "GREEK SMALL LETTER PI"}], "\u220f": [{"c": "\u03a0", "n": "GREEK CAPITAL LETTER PI"}], "\u03a0": [{"c": "\u220f", "n": "N-ARY PRODUCT"}, {"c": "\u213f", "n": "DOUBLE-STRUCK CAPITAL PI"}, {"c": "\ud835\udeb7", "n": "MATHEMATICAL BOLD CAPITAL PI"}, {"c": "\ud835\udef1", "n": "MATHEMATICAL ITALIC CAPITAL PI"}, {"c": "\ud835\udf2b", "n": "MATHEMATICAL BOLD ITALIC CAPITAL PI"}, {"c": "\ud835\udf65", "n": "MATHEMATICAL SANS-SERIF BOLD CAPITAL PI"}, {"c": "\ud835\udf9f", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI"}, {"c": "\u2ca0", "n": "COPTIC CAPITAL LETTER PI"}, {"c": "\u041f", "n": "CYRILLIC CAPITAL LETTER PE"}, {"c": "\ua6db", "n": "BAMUM LETTER NA"}], "\u213f": [{"c": "\u03a0", "n": "GREEK CAPITAL LETTER PI"}], "\ud835\udeb7": [{"c": "\u03a0", "n": "GREEK CAPITAL LETTER PI"}], "\ud835\udef1": [{"c": "\u03a0", "n": "GREEK CAPITAL LETTER PI"}], "\ud835\udf2b": [{"c": "\u03a0", "n": "GREEK CAPITAL LETTER PI"}], "\ud835\udf65": [{"c": "\u03a0", "n": "GREEK CAPITAL LETTER PI"}], "\ud835\udf9f": [{"c": "\u03a0", "n": "GREEK CAPITAL LETTER PI"}], "\u2ca0": [{"c": "\u03a0", "n": "GREEK CAPITAL LETTER PI"}], "\u041f": [{"c": "\u03a0", "n": "GREEK CAPITAL LETTER PI"}], "\ua6db": [{"c": "\u03a0", "n": "GREEK CAPITAL LETTER PI"}], "\ud800\udead": [{"c": "\u03d8", "n": "GREEK LETTER ARCHAIC KOPPA"}], "\u03d8": [{"c": "\ud800\udead", "n": "CARIAN LETTER T"}, {"c": "\ud800\udf12", "n": "OLD ITALIC LETTER KU"}], "\ud800\udf12": [{"c": "\u03d8", "n": "GREEK LETTER ARCHAIC KOPPA"}], "\u03db": [{"c": "\u03c2", "n": "GREEK SMALL LETTER FINAL SIGMA"}], "\u03c2": [{"c": "\u03db", "n": "GREEK SMALL LETTER STIGMA"}, {"c": "\ud835\uded3", "n": "MATHEMATICAL BOLD SMALL FINAL SIGMA"}, {"c": "\ud835\udf0d", "n": "MATHEMATICAL ITALIC SMALL FINAL SIGMA"}, {"c": "\ud835\udf47", "n": "MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA"}, {"c": "\ud835\udf81", "n": "MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA"}, {"c": "\ud835\udfbb", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA"}], "\ud835\uded3": [{"c": "\u03c2", "n": "GREEK SMALL LETTER FINAL SIGMA"}], "\ud835\udf0d": [{"c": "\u03c2", "n": "GREEK SMALL LETTER FINAL SIGMA"}], "\ud835\udf47": [{"c": "\u03c2", "n": "GREEK SMALL LETTER FINAL SIGMA"}], "\ud835\udf81": [{"c": "\u03c2", "n": "GREEK SMALL LETTER FINAL SIGMA"}], "\ud835\udfbb": [{"c": "\u03c2", "n": "GREEK SMALL LETTER FINAL SIGMA"}], "\ud835\udebd": [{"c": "\u03a6", "n": "GREEK CAPITAL LETTER PHI"}], "\u03a6": [{"c": "\ud835\udebd", "n": "MATHEMATICAL BOLD CAPITAL PHI"}, {"c": "\ud835\udef7", "n": "MATHEMATICAL ITALIC CAPITAL PHI"}, {"c": "\ud835\udf31", "n": "MATHEMATICAL BOLD ITALIC CAPITAL PHI"}, {"c": "\ud835\udf6b", "n": "MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI"}, {"c": "\ud835\udfa5", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI"}, {"c": "\u2caa", "n": "COPTIC CAPITAL LETTER FI"}, {"c": "\u0424", "n": "CYRILLIC CAPITAL LETTER EF"}, {"c": "\u0553", "n": "ARMENIAN CAPITAL LETTER PIWR"}, {"c": "\u1240", "n": "ETHIOPIC SYLLABLE QA"}, {"c": "\u16f0", "n": "RUNIC BELGTHOR SYMBOL"}, {"c": "\ud800\udeb3", "n": "CARIAN LETTER NN"}], "\ud835\udef7": [{"c": "\u03a6", "n": "GREEK CAPITAL LETTER PHI"}], "\ud835\udf31": [{"c": "\u03a6", "n": "GREEK CAPITAL LETTER PHI"}], "\ud835\udf6b": [{"c": "\u03a6", "n": "GREEK CAPITAL LETTER PHI"}], "\ud835\udfa5": [{"c": "\u03a6", "n": "GREEK CAPITAL LETTER PHI"}], "\u2caa": [{"c": "\u03a6", "n": "GREEK CAPITAL LETTER PHI"}], "\u0424": [{"c": "\u03a6", "n": "GREEK CAPITAL LETTER PHI"}], "\u0553": [{"c": "\u03a6", "n": "GREEK CAPITAL LETTER PHI"}], "\u1240": [{"c": "\u03a6", "n": "GREEK CAPITAL LETTER PHI"}], "\u16f0": [{"c": "\u03a6", "n": "GREEK CAPITAL LETTER PHI"}], "\ud800\udeb3": [{"c": "\u03a6", "n": "GREEK CAPITAL LETTER PHI"}], "\uab53": [{"c": "\u03c7", "n": "GREEK SMALL LETTER CHI"}], "\u03c7": [{"c": "\uab53", "n": "LATIN SMALL LETTER CHI"}, {"c": "\uab55", "n": "LATIN SMALL LETTER CHI WITH LOW LEFT SERIF"}, {"c": "\ud835\uded8", "n": "MATHEMATICAL BOLD SMALL CHI"}, {"c": "\ud835\udf12", "n": "MATHEMATICAL ITALIC SMALL CHI"}, {"c": "\ud835\udf4c", "n": "MATHEMATICAL BOLD ITALIC SMALL CHI"}, {"c": "\ud835\udf86", "n": "MATHEMATICAL SANS-SERIF BOLD SMALL CHI"}, {"c": "\ud835\udfc0", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI"}, {"c": "\u2cad", "n": "COPTIC SMALL LETTER KHI"}], "\uab55": [{"c": "\u03c7", "n": "GREEK SMALL LETTER CHI"}], "\ud835\uded8": [{"c": "\u03c7", "n": "GREEK SMALL LETTER CHI"}], "\ud835\udf12": [{"c": "\u03c7", "n": "GREEK SMALL LETTER CHI"}], "\ud835\udf4c": [{"c": "\u03c7", "n": "GREEK SMALL LETTER CHI"}], "\ud835\udf86": [{"c": "\u03c7", "n": "GREEK SMALL LETTER CHI"}], "\ud835\udfc0": [{"c": "\u03c7", "n": "GREEK SMALL LETTER CHI"}], "\u2cad": [{"c": "\u03c7", "n": "GREEK SMALL LETTER CHI"}], "\ud835\uded9": [{"c": "\u03c8", "n": "GREEK SMALL LETTER PSI"}], "\u03c8": [{"c": "\ud835\uded9", "n": "MATHEMATICAL BOLD SMALL PSI"}, {"c": "\ud835\udf13", "n": "MATHEMATICAL ITALIC SMALL PSI"}, {"c": "\ud835\udf4d", "n": "MATHEMATICAL BOLD ITALIC SMALL PSI"}, {"c": "\ud835\udf87", "n": "MATHEMATICAL SANS-SERIF BOLD SMALL PSI"}, {"c": "\ud835\udfc1", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI"}, {"c": "\u0471", "n": "CYRILLIC SMALL LETTER PSI"}, {"c": "\ud801\udcf9", "n": "OSAGE SMALL LETTER GHA"}], "\ud835\udf13": [{"c": "\u03c8", "n": "GREEK SMALL LETTER PSI"}], "\ud835\udf4d": [{"c": "\u03c8", "n": "GREEK SMALL LETTER PSI"}], "\ud835\udf87": [{"c": "\u03c8", "n": "GREEK SMALL LETTER PSI"}], "\ud835\udfc1": [{"c": "\u03c8", "n": "GREEK SMALL LETTER PSI"}], "\u0471": [{"c": "\u03c8", "n": "GREEK SMALL LETTER PSI"}], "\ud801\udcf9": [{"c": "\u03c8", "n": "GREEK SMALL LETTER PSI"}], "\ud835\udebf": [{"c": "\u03a8", "n": "GREEK CAPITAL LETTER PSI"}], "\u03a8": [{"c": "\ud835\udebf", "n": "MATHEMATICAL BOLD CAPITAL PSI"}, {"c": "\ud835\udef9", "n": "MATHEMATICAL ITALIC CAPITAL PSI"}, {"c": "\ud835\udf33", "n": "MATHEMATICAL BOLD ITALIC CAPITAL PSI"}, {"c": "\ud835\udf6d", "n": "MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI"}, {"c": "\ud835\udfa7", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI"}, {"c": "\u2cae", "n": "COPTIC CAPITAL LETTER PSI"}, {"c": "\u0470", "n": "CYRILLIC CAPITAL LETTER PSI"}, {"c": "\ud801\udcd1", "n": "OSAGE CAPITAL LETTER GHA"}, {"c": "\u16d8", "n": "RUNIC LETTER LONG-BRANCH-MADR M"}, {"c": "\ud800\udeb5", "n": "CARIAN LETTER N"}], "\ud835\udef9": [{"c": "\u03a8", "n": "GREEK CAPITAL LETTER PSI"}], "\ud835\udf33": [{"c": "\u03a8", "n": "GREEK CAPITAL LETTER PSI"}], "\ud835\udf6d": [{"c": "\u03a8", "n": "GREEK CAPITAL LETTER PSI"}], "\ud835\udfa7": [{"c": "\u03a8", "n": "GREEK CAPITAL LETTER PSI"}], "\u2cae": [{"c": "\u03a8", "n": "GREEK CAPITAL LETTER PSI"}], "\u0470": [{"c": "\u03a8", "n": "GREEK CAPITAL LETTER PSI"}], "\ud801\udcd1": [{"c": "\u03a8", "n": "GREEK CAPITAL LETTER PSI"}], "\u16d8": [{"c": "\u03a8", "n": "GREEK CAPITAL LETTER PSI"}], "\ud800\udeb5": [{"c": "\u03a8", "n": "GREEK CAPITAL LETTER PSI"}], "\u2375": [{"c": "\u03c9", "n": "GREEK SMALL LETTER OMEGA"}], "\u03c9": [{"c": "\u2375", "n": "APL FUNCTIONAL SYMBOL OMEGA"}, {"c": "\ua7b7", "n": "LATIN SMALL LETTER OMEGA"}, {"c": "\ud835\udeda", "n": "MATHEMATICAL BOLD SMALL OMEGA"}, {"c": "\ud835\udf14", "n": "MATHEMATICAL ITALIC SMALL OMEGA"}, {"c": "\ud835\udf4e", "n": "MATHEMATICAL BOLD ITALIC SMALL OMEGA"}, {"c": "\ud835\udf88", "n": "MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA"}, {"c": "\ud835\udfc2", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA"}, {"c": "\u2cb1", "n": "COPTIC SMALL LETTER OOU"}, {"c": "\ua64d", "n": "CYRILLIC SMALL LETTER BROAD OMEGA"}], "\ua7b7": [{"c": "\u03c9", "n": "GREEK SMALL LETTER OMEGA"}], "\ud835\udeda": [{"c": "\u03c9", "n": "GREEK SMALL LETTER OMEGA"}], "\ud835\udf14": [{"c": "\u03c9", "n": "GREEK SMALL LETTER OMEGA"}], "\ud835\udf4e": [{"c": "\u03c9", "n": "GREEK SMALL LETTER OMEGA"}], "\ud835\udf88": [{"c": "\u03c9", "n": "GREEK SMALL LETTER OMEGA"}], "\ud835\udfc2": [{"c": "\u03c9", "n": "GREEK SMALL LETTER OMEGA"}], "\u2cb1": [{"c": "\u03c9", "n": "GREEK SMALL LETTER OMEGA"}], "\ua64d": [{"c": "\u03c9", "n": "GREEK SMALL LETTER OMEGA"}], "\u2126": [{"c": "\u03a9", "n": "GREEK CAPITAL LETTER OMEGA"}], "\u03a9": [{"c": "\u2126", "n": "OHM SIGN"}, {"c": "\ud835\udec0", "n": "MATHEMATICAL BOLD CAPITAL OMEGA"}, {"c": "\ud835\udefa", "n": "MATHEMATICAL ITALIC CAPITAL OMEGA"}, {"c": "\ud835\udf34", "n": "MATHEMATICAL BOLD ITALIC CAPITAL OMEGA"}, {"c": "\ud835\udf6e", "n": "MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA"}, {"c": "\ud835\udfa8", "n": "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA"}, {"c": "\u162f", "n": "CANADIAN SYLLABICS CARRIER LHO"}, {"c": "\u1635", "n": "CANADIAN SYLLABICS CARRIER TLHO"}, {"c": "\ud800\udeb6", "n": "CARIAN LETTER TT2"}], "\ud835\udec0": [{"c": "\u03a9", "n": "GREEK CAPITAL LETTER OMEGA"}], "\ud835\udefa": [{"c": "\u03a9", "n": "GREEK CAPITAL LETTER OMEGA"}], "\ud835\udf34": [{"c": "\u03a9", "n": "GREEK CAPITAL LETTER OMEGA"}], "\ud835\udf6e": [{"c": "\u03a9", "n": "GREEK CAPITAL LETTER OMEGA"}], "\ud835\udfa8": [{"c": "\u03a9", "n": "GREEK CAPITAL LETTER OMEGA"}], "\u162f": [{"c": "\u03a9", "n": "GREEK CAPITAL LETTER OMEGA"}], "\u1635": [{"c": "\u03a9", "n": "GREEK CAPITAL LETTER OMEGA"}], "\ud800\udeb6": [{"c": "\u03a9", "n": "GREEK CAPITAL LETTER OMEGA"}], "\u2379": [{"c": "\u03c9\u0332", "n": "GREEK SMALL LETTER OMEGA, COMBINING LOW LINE"}], "\u03c9\u0332": [{"c": "\u2379", "n": "APL FUNCTIONAL SYMBOL OMEGA UNDERBAR"}], "\u1f7d": [{"c": "\u1ff4", "n": "GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI"}], "\u1ff4": [{"c": "\u1f7d", "n": "GREEK SMALL LETTER OMEGA WITH OXIA"}], "\u2630": [{"c": "\u2cb6", "n": "COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE"}], "\u2cb6": [{"c": "\u2630", "n": "TRIGRAM FOR HEAVEN"}], "\u2cdc": [{"c": "\u03ec", "n": "COPTIC CAPITAL LETTER SHIMA"}], "\u03ec": [{"c": "\u2cdc", "n": "COPTIC CAPITAL LETTER OLD NUBIAN SHIMA"}], "\u0497": [{"c": "\u0436\u0329", "n": "CYRILLIC SMALL LETTER ZHE, COMBINING VERTICAL LINE BELOW"}], "\u0436\u0329": [{"c": "\u0497", "n": "CYRILLIC SMALL LETTER ZHE WITH DESCENDER"}], "\u0496": [{"c": "\u0416\u0329", "n": "CYRILLIC CAPITAL LETTER ZHE, COMBINING VERTICAL LINE BELOW"}], "\u0416\u0329": [{"c": "\u0496", "n": "CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER"}], "\ud834\ude0b": [{"c": "\u0418", "n": "CYRILLIC CAPITAL LETTER I"}], "\u0418": [{"c": "\ud834\ude0b", "n": "GREEK VOCAL NOTATION SYMBOL-12"}, {"c": "\u0376", "n": "GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA"}, {"c": "\ua6a1", "n": "BAMUM LETTER KA"}, {"c": "\ud801\udc25", "n": "DESERET CAPITAL LETTER ENG"}], "\u0376": [{"c": "\u0418", "n": "CYRILLIC CAPITAL LETTER I"}], "\ua6a1": [{"c": "\u0418", "n": "CYRILLIC CAPITAL LETTER I"}], "\ud801\udc25": [{"c": "\u0418", "n": "CYRILLIC CAPITAL LETTER I"}], "\u0419": [{"c": "\u040d", "n": "CYRILLIC CAPITAL LETTER I WITH GRAVE"}], "\u040d": [{"c": "\u0419", "n": "CYRILLIC CAPITAL LETTER SHORT I"}], "\u048a": [{"c": "\u040d\u0326", "n": "CYRILLIC CAPITAL LETTER I WITH GRAVE, COMBINING COMMA BELOW"}], "\u040d\u0326": [{"c": "\u048a", "n": "CYRILLIC CAPITAL LETTER SHORT I WITH TAIL"}], "\u045d": [{"c": "\u0439", "n": "CYRILLIC SMALL LETTER SHORT I"}], "\u0439": [{"c": "\u045d", "n": "CYRILLIC SMALL LETTER I WITH GRAVE"}], "\u048b": [{"c": "\u0439\u0326", "n": "CYRILLIC SMALL LETTER SHORT I, COMBINING COMMA BELOW"}], "\u0439\u0326": [{"c": "\u048b", "n": "CYRILLIC SMALL LETTER SHORT I WITH TAIL"}], "\ud801\udcbc": [{"c": "\u04c3", "n": "CYRILLIC CAPITAL LETTER KA WITH HOOK"}], "\u04c3": [{"c": "\ud801\udcbc", "n": "OSAGE CAPITAL LETTER KA"}], "\u1d2b": [{"c": "\u043b", "n": "CYRILLIC SMALL LETTER EL"}], "\u043b": [{"c": "\u1d2b", "n": "CYRILLIC LETTER SMALL CAPITAL EL"}], "\u04c6": [{"c": "\u043b\u0326", "n": "CYRILLIC SMALL LETTER EL, COMBINING COMMA BELOW"}], "\u043b\u0326": [{"c": "\u04c6", "n": "CYRILLIC SMALL LETTER EL WITH TAIL"}], "\uab60": [{"c": "\u0459", "n": "CYRILLIC SMALL LETTER LJE"}], "\u0459": [{"c": "\uab60", "n": "LATIN SMALL LETTER SAKHA YAT"}], "\ud801\udceb": [{"c": "\ua669", "n": "CYRILLIC SMALL LETTER MONOCULAR O"}], "\ua669": [{"c": "\ud801\udceb", "n": "OSAGE SMALL LETTER OIN"}], "\u1dee": [{"c": "\u2dec", "n": "COMBINING CYRILLIC LETTER ER"}], "\u2dec": [{"c": "\u1dee", "n": "COMBINING LATIN SMALL LETTER P"}], "\ud801\udccd": [{"c": "\u040b", "n": "CYRILLIC CAPITAL LETTER TSHE"}], "\u040b": [{"c": "\ud801\udccd", "n": "OSAGE CAPITAL LETTER DHA"}], "\ud834\ude02": [{"c": "\u04fe", "n": "CYRILLIC CAPITAL LETTER HA WITH STROKE"}], "\u04fe": [{"c": "\ud834\ude02", "n": "GREEK VOCAL NOTATION SYMBOL-3"}], "\ud834\ude22": [{"c": "\u0460", "n": "CYRILLIC CAPITAL LETTER OMEGA"}], "\u0460": [{"c": "\ud834\ude22", "n": "GREEK INSTRUMENTAL NOTATION SYMBOL-8"}, {"c": "\u13c7", "n": "CHEROKEE LETTER QUE"}, {"c": "\u15ef", "n": "CANADIAN SYLLABICS CARRIER GU"}], "\u13c7": [{"c": "\u0460", "n": "CYRILLIC CAPITAL LETTER OMEGA"}], "\u15ef": [{"c": "\u0460", "n": "CYRILLIC CAPITAL LETTER OMEGA"}], "\u047c": [{"c": "\u0460\u0486\u0487", "n": "CYRILLIC CAPITAL LETTER OMEGA, COMBINING CYRILLIC PSILI PNEUMATA, COMBINING CYRILLIC POKRYTIE"}], "\u0460\u0486\u0487": [{"c": "\u047c", "n": "CYRILLIC CAPITAL LETTER OMEGA WITH TITLO"}], "\u18ed": [{"c": "\u0460\u00b7", "n": "CYRILLIC CAPITAL LETTER OMEGA, MIDDLE DOT"}], "\u0460\u00b7": [{"c": "\u18ed", "n": "CANADIAN SYLLABICS CARRIER GWU"}], "\ua7b6": [{"c": "\ua64c", "n": "CYRILLIC CAPITAL LETTER BROAD OMEGA"}], "\ua64c": [{"c": "\ua7b6", "n": "LATIN CAPITAL LETTER OMEGA"}], "\u04cc": [{"c": "\u04b7", "n": "CYRILLIC SMALL LETTER CHE WITH DESCENDER"}], "\u04b7": [{"c": "\u04cc", "n": "CYRILLIC SMALL LETTER KHAKASSIAN CHE"}], "\u04cb": [{"c": "\u04b6", "n": "CYRILLIC CAPITAL LETTER CHE WITH DESCENDER"}], "\u04b6": [{"c": "\u04cb", "n": "CYRILLIC CAPITAL LETTER KHAKASSIAN CHE"}], "\u04be": [{"c": "\u04bc\u0328", "n": "CYRILLIC CAPITAL LETTER ABKHASIAN CHE, COMBINING OGONEK"}], "\u04bc\u0328": [{"c": "\u04be", "n": "CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER"}], "\u2cbd": [{"c": "\u0448", "n": "CYRILLIC SMALL LETTER SHA"}], "\u0448": [{"c": "\u2cbd", "n": "COPTIC SMALL LETTER CRYPTOGRAMMIC NI"}], "\u2cbc": [{"c": "\u0428", "n": "CYRILLIC CAPITAL LETTER SHA"}], "\u0428": [{"c": "\u2cbc", "n": "COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI"}], "\ua650": [{"c": "\u042al", "n": "CYRILLIC CAPITAL LETTER HARD SIGN, LATIN SMALL LETTER L"}], "\u042al": [{"c": "\ua650", "n": "CYRILLIC CAPITAL LETTER YERU WITH BACK YER"}], "\u2108": [{"c": "\u042d", "n": "CYRILLIC CAPITAL LETTER E"}], "\u042d": [{"c": "\u2108", "n": "SCRUPLE"}], "\ud83d\udf01": [{"c": "\ua658", "n": "CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS"}], "\ua658": [{"c": "\ud83d\udf01", "n": "ALCHEMICAL SYMBOL FOR AIR"}, {"c": "\ud81b\udf1c", "n": "MIAO LETTER TLHYA"}], "\ud81b\udf1c": [{"c": "\ua658", "n": "CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS"}], "\ua992": [{"c": "\u2c3f", "n": "GLAGOLITIC SMALL LETTER MYSLITE"}], "\u2c3f": [{"c": "\ua992", "n": "JAVANESE LETTER GA"}], "\u0587": [{"c": "\u0565\u0582", "n": "ARMENIAN SMALL LETTER ECH, ARMENIAN SMALL LETTER YIWN"}], "\u0565\u0582": [{"c": "\u0587", "n": "ARMENIAN SMALL LIGATURE ECH YIWN"}], "\u1294": [{"c": "\u0571", "n": "ARMENIAN SMALL LETTER JA"}], "\u0571": [{"c": "\u1294", "n": "ETHIOPIC SYLLABLE NEE"}], "\ufb14": [{"c": "\u0574\u0565", "n": "ARMENIAN SMALL LETTER MEN, ARMENIAN SMALL LETTER ECH"}], "\u0574\u0565": [{"c": "\ufb14", "n": "ARMENIAN SMALL LIGATURE MEN ECH"}], "\ufb15": [{"c": "\u0574\u056b", "n": "ARMENIAN SMALL LETTER MEN, ARMENIAN SMALL LETTER INI"}], "\u0574\u056b": [{"c": "\ufb15", "n": "ARMENIAN SMALL LIGATURE MEN INI"}], "\ufb17": [{"c": "\u0574\u056d", "n": "ARMENIAN SMALL LETTER MEN, ARMENIAN SMALL LETTER XEH"}], "\u0574\u056d": [{"c": "\ufb17", "n": "ARMENIAN SMALL LIGATURE MEN XEH"}], "\ufb13": [{"c": "\u0574\u0576", "n": "ARMENIAN SMALL LETTER MEN, ARMENIAN SMALL LETTER NOW"}], "\u0574\u0576": [{"c": "\ufb13", "n": "ARMENIAN SMALL LIGATURE MEN NOW"}], "\u2229": [{"c": "\u0548", "n": "ARMENIAN CAPITAL LETTER VO"}], "\u0548": [{"c": "\u2229", "n": "INTERSECTION"}, {"c": "\u22c2", "n": "N-ARY INTERSECTION"}, {"c": "\ud834\ude45", "n": "GREEK MUSICAL LEIMMA"}, {"c": "\u1260", "n": "ETHIOPIC SYLLABLE BA"}, {"c": "\u144e", "n": "CANADIAN SYLLABICS TI"}, {"c": "\ua4f5", "n": "LISU LETTER UE"}], "\u22c2": [{"c": "\u0548", "n": "ARMENIAN CAPITAL LETTER VO"}], "\ud834\ude45": [{"c": "\u0548", "n": "ARMENIAN CAPITAL LETTER VO"}], "\u1260": [{"c": "\u0548", "n": "ARMENIAN CAPITAL LETTER VO"}], "\u144e": [{"c": "\u0548", "n": "ARMENIAN CAPITAL LETTER VO"}], "\ua4f5": [{"c": "\u0548", "n": "ARMENIAN CAPITAL LETTER VO"}], "\u145a": [{"c": "\u0548\u00b7", "n": "ARMENIAN CAPITAL LETTER VO, MIDDLE DOT"}], "\u0548\u00b7": [{"c": "\u145a", "n": "CANADIAN SYLLABICS WEST-CREE TWI"}], "\u1468": [{"c": "\u0548'", "n": "ARMENIAN CAPITAL LETTER VO, APOSTROPHE"}], "\u0548'": [{"c": "\u1468", "n": "CANADIAN SYLLABICS TTI"}], "\ufb16": [{"c": "\u057e\u0576", "n": "ARMENIAN SMALL LETTER VEW, ARMENIAN SMALL LETTER NOW"}], "\u057e\u0576": [{"c": "\ufb16", "n": "ARMENIAN SMALL LIGATURE VEW NOW"}], "\u20bd": [{"c": "\u0554", "n": "ARMENIAN CAPITAL LETTER KEH"}], "\u0554": [{"c": "\u20bd", "n": "RUBLE SIGN"}], "\u02d3": [{"c": "\u0559", "n": "ARMENIAN MODIFIER LETTER LEFT HALF RING"}], "\u0559": [{"c": "\u02d3", "n": "MODIFIER LETTER CENTRED LEFT HALF RING"}, {"c": "\u02bf", "n": "MODIFIER LETTER LEFT HALF RING"}], "\u02bf": [{"c": "\u0559", "n": "ARMENIAN MODIFIER LETTER LEFT HALF RING"}], "\u2135": [{"c": "\u200e\u05d0\u200e", "n": "HEBREW LETTER ALEF"}], "\u200e\u05d0\u200e": [{"c": "\u2135", "n": "ALEF SYMBOL"}, {"c": "\u200e\ufb21\u200e", "n": "HEBREW LETTER WIDE ALEF"}], "\u200e\ufb21\u200e": [{"c": "\u200e\u05d0\u200e", "n": "HEBREW LETTER ALEF"}], "\u200e\ufb2f\u200e": [{"c": "\u200e\ufb2e\u200e", "n": "HEBREW LETTER ALEF WITH PATAH"}], "\u200e\ufb2e\u200e": [{"c": "\u200e\ufb2f\u200e", "n": "HEBREW LETTER ALEF WITH QAMATS"}, {"c": "\u200e\ufb30\u200e", "n": "HEBREW LETTER ALEF WITH MAPIQ"}], "\u200e\ufb30\u200e": [{"c": "\u200e\ufb2e\u200e", "n": "HEBREW LETTER ALEF WITH PATAH"}], "\u200e\ufb4f\u200e": [{"c": "\u200e\u05d0\u05dc\u200e", "n": "HEBREW LETTER ALEF, HEBREW LETTER LAMED"}], "\u200e\u05d0\u05dc\u200e": [{"c": "\u200e\ufb4f\u200e", "n": "HEBREW LIGATURE ALEF LAMED"}], "\u2136": [{"c": "\u200e\u05d1\u200e", "n": "HEBREW LETTER BET"}], "\u200e\u05d1\u200e": [{"c": "\u2136", "n": "BET SYMBOL"}], "\u2137": [{"c": "\u200e\u05d2\u200e", "n": "HEBREW LETTER GIMEL"}], "\u200e\u05d2\u200e": [{"c": "\u2137", "n": "GIMEL SYMBOL"}], "\u2138": [{"c": "\u200e\u05d3\u200e", "n": "HEBREW LETTER DALET"}], "\u200e\u05d3\u200e": [{"c": "\u2138", "n": "DALET SYMBOL"}, {"c": "\u200e\ufb22\u200e", "n": "HEBREW LETTER WIDE DALET"}], "\u200e\ufb22\u200e": [{"c": "\u200e\u05d3\u200e", "n": "HEBREW LETTER DALET"}], "\u200e\ufb23\u200e": [{"c": "\u200e\u05d4\u200e", "n": "HEBREW LETTER HE"}], "\u200e\u05d4\u200e": [{"c": "\u200e\ufb23\u200e", "n": "HEBREW LETTER WIDE HE"}], "\u200e\ufb39\u200e": [{"c": "\u200e\ufb1d\u200e", "n": "HEBREW LETTER YOD WITH HIRIQ"}], "\u200e\ufb1d\u200e": [{"c": "\u200e\ufb39\u200e", "n": "HEBREW LETTER YOD WITH DAGESH"}], "\u200e\ufb24\u200e": [{"c": "\u200e\u05db\u200e", "n": "HEBREW LETTER KAF"}], "\u200e\u05db\u200e": [{"c": "\u200e\ufb24\u200e", "n": "HEBREW LETTER WIDE KAF"}], "\u200e\ufb25\u200e": [{"c": "\u200e\u05dc\u200e", "n": "HEBREW LETTER LAMED"}], "\u200e\u05dc\u200e": [{"c": "\u200e\ufb25\u200e", "n": "HEBREW LETTER WIDE LAMED"}], "\u200e\ufb26\u200e": [{"c": "\u200e\u05dd\u200e", "n": "HEBREW LETTER FINAL MEM"}], "\u200e\u05dd\u200e": [{"c": "\u200e\ufb26\u200e", "n": "HEBREW LETTER WIDE FINAL MEM"}], "\u200e\ufb20\u200e": [{"c": "\u200e\u05e2\u200e", "n": "HEBREW LETTER AYIN"}], "\u200e\u05e2\u200e": [{"c": "\u200e\ufb20\u200e", "n": "HEBREW LETTER ALTERNATIVE AYIN"}], "\u200e\ufb27\u200e": [{"c": "\u200e\u05e8\u200e", "n": "HEBREW LETTER RESH"}], "\u200e\u05e8\u200e": [{"c": "\u200e\ufb27\u200e", "n": "HEBREW LETTER WIDE RESH"}], "\u200e\ufb2b\u200e": [{"c": "\u200e\ufb2a\u200e", "n": "HEBREW LETTER SHIN WITH SHIN DOT"}], "\u200e\ufb2a\u200e": [{"c": "\u200e\ufb2b\u200e", "n": "HEBREW LETTER SHIN WITH SIN DOT"}, {"c": "\u200e\ufb49\u200e", "n": "HEBREW LETTER SHIN WITH DAGESH"}], "\u200e\ufb49\u200e": [{"c": "\u200e\ufb2a\u200e", "n": "HEBREW LETTER SHIN WITH SHIN DOT"}], "\u200e\ufb2d\u200e": [{"c": "\u200e\ufb2c\u200e", "n": "HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT"}], "\u200e\ufb2c\u200e": [{"c": "\u200e\ufb2d\u200e", "n": "HEBREW LETTER SHIN WITH DAGESH AND SIN DOT"}], "\u200e\ufb28\u200e": [{"c": "\u200e\u05ea\u200e", "n": "HEBREW LETTER TAV"}], "\u200e\u05ea\u200e": [{"c": "\u200e\ufb28\u200e", "n": "HEBREW LETTER WIDE TAV"}], "\u200e\ufe80\u200e": [{"c": "\u200e\u0621\u200e", "n": "ARABIC LETTER HAMZA"}], "\u200e\u0621\u200e": [{"c": "\u200e\ufe80\u200e", "n": "ARABIC LETTER HAMZA ISOLATED FORM"}], "\u200e\u06fd\u200e": [{"c": "\u200e\u0621\u0348\u200e", "n": "ARABIC LETTER HAMZA, COMBINING DOUBLE VERTICAL LINE BELOW"}], "\u200e\u0621\u0348\u200e": [{"c": "\u200e\u06fd\u200e", "n": "ARABIC SIGN SINDHI AMPERSAND"}], "\u200e\ufe82\u200e": [{"c": "\u200e\u0622\u200e", "n": "ARABIC LETTER ALEF WITH MADDA ABOVE"}], "\u200e\u0622\u200e": [{"c": "\u200e\ufe82\u200e", "n": "ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM"}, {"c": "\u200e\ufe81\u200e", "n": "ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM"}], "\u200e\ufe81\u200e": [{"c": "\u200e\u0622\u200e", "n": "ARABIC LETTER ALEF WITH MADDA ABOVE"}], "\u200e\ufb51\u200e": [{"c": "\u200e\u0671\u200e", "n": "ARABIC LETTER ALEF WASLA"}], "\u200e\u0671\u200e": [{"c": "\u200e\ufb51\u200e", "n": "ARABIC LETTER ALEF WASLA FINAL FORM"}, {"c": "\u200e\ufb50\u200e", "n": "ARABIC LETTER ALEF WASLA ISOLATED FORM"}], "\u200e\ufb50\u200e": [{"c": "\u200e\u0671\u200e", "n": "ARABIC LETTER ALEF WASLA"}], "\u200e\ud83b\ude01\u200e": [{"c": "\u200e\u0628\u200e", "n": "ARABIC LETTER BEH"}], "\u200e\u0628\u200e": [{"c": "\u200e\ud83b\ude01\u200e", "n": "ARABIC MATHEMATICAL BEH"}, {"c": "\u200e\ud83b\ude21\u200e", "n": "ARABIC MATHEMATICAL INITIAL BEH"}, {"c": "\u200e\ud83b\ude61\u200e", "n": "ARABIC MATHEMATICAL STRETCHED BEH"}, {"c": "\u200e\ud83b\ude81\u200e", "n": "ARABIC MATHEMATICAL LOOPED BEH"}, {"c": "\u200e\ud83b\udea1\u200e", "n": "ARABIC MATHEMATICAL DOUBLE-STRUCK BEH"}, {"c": "\u200e\ufe91\u200e", "n": "ARABIC LETTER BEH INITIAL FORM"}, {"c": "\u200e\ufe92\u200e", "n": "ARABIC LETTER BEH MEDIAL FORM"}, {"c": "\u200e\ufe90\u200e", "n": "ARABIC LETTER BEH FINAL FORM"}, {"c": "\u200e\ufe8f\u200e", "n": "ARABIC LETTER BEH ISOLATED FORM"}], "\u200e\ud83b\ude21\u200e": [{"c": "\u200e\u0628\u200e", "n": "ARABIC LETTER BEH"}], "\u200e\ud83b\ude61\u200e": [{"c": "\u200e\u0628\u200e", "n": "ARABIC LETTER BEH"}], "\u200e\ud83b\ude81\u200e": [{"c": "\u200e\u0628\u200e", "n": "ARABIC LETTER BEH"}], "\u200e\ud83b\udea1\u200e": [{"c": "\u200e\u0628\u200e", "n": "ARABIC LETTER BEH"}], "\u200e\ufe91\u200e": [{"c": "\u200e\u0628\u200e", "n": "ARABIC LETTER BEH"}], "\u200e\ufe92\u200e": [{"c": "\u200e\u0628\u200e", "n": "ARABIC LETTER BEH"}], "\u200e\ufe90\u200e": [{"c": "\u200e\u0628\u200e", "n": "ARABIC LETTER BEH"}], "\u200e\ufe8f\u200e": [{"c": "\u200e\u0628\u200e", "n": "ARABIC LETTER BEH"}], "\u200e\u0751\u200e": [{"c": "\u200e\u0628\u06db\u200e", "n": "ARABIC LETTER BEH, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\u0628\u06db\u200e": [{"c": "\u200e\u0751\u200e", "n": "ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE"}], "\u200e\u08b6\u200e": [{"c": "\u200e\u0628\u06e2\u200e", "n": "ARABIC LETTER BEH, ARABIC SMALL HIGH MEEM ISOLATED FORM"}], "\u200e\u0628\u06e2\u200e": [{"c": "\u200e\u08b6\u200e", "n": "ARABIC LETTER BEH WITH SMALL MEEM ABOVE"}], "\u200e\u08a1\u200e": [{"c": "\u200e\u0628\u0654\u200e", "n": "ARABIC LETTER BEH, ARABIC HAMZA ABOVE"}], "\u200e\u0628\u0654\u200e": [{"c": "\u200e\u08a1\u200e", "n": "ARABIC LETTER BEH WITH HAMZA ABOVE"}], "\u200e\ufca0\u200e": [{"c": "\u200e\u0628o\u200e", "n": "ARABIC LETTER BEH, LATIN SMALL LETTER O"}], "\u200e\u0628o\u200e": [{"c": "\u200e\ufca0\u200e", "n": "ARABIC LIGATURE BEH WITH HEH INITIAL FORM"}, {"c": "\u200e\ufce2\u200e", "n": "ARABIC LIGATURE BEH WITH HEH MEDIAL FORM"}], "\u200e\ufce2\u200e": [{"c": "\u200e\u0628o\u200e", "n": "ARABIC LETTER BEH, LATIN SMALL LETTER O"}], "\u200e\ufc9c\u200e": [{"c": "\u200e\u0628\u062c\u200e", "n": "ARABIC LETTER BEH, ARABIC LETTER JEEM"}], "\u200e\u0628\u062c\u200e": [{"c": "\u200e\ufc9c\u200e", "n": "ARABIC LIGATURE BEH WITH JEEM INITIAL FORM"}, {"c": "\u200e\ufc05\u200e", "n": "ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM"}], "\u200e\ufc05\u200e": [{"c": "\u200e\u0628\u062c\u200e", "n": "ARABIC LETTER BEH, ARABIC LETTER JEEM"}], "\u200e\ufc9d\u200e": [{"c": "\u200e\u0628\u062d\u200e", "n": "ARABIC LETTER BEH, ARABIC LETTER HAH"}], "\u200e\u0628\u062d\u200e": [{"c": "\u200e\ufc9d\u200e", "n": "ARABIC LIGATURE BEH WITH HAH INITIAL FORM"}, {"c": "\u200e\ufc06\u200e", "n": "ARABIC LIGATURE BEH WITH HAH ISOLATED FORM"}], "\u200e\ufc06\u200e": [{"c": "\u200e\u0628\u062d\u200e", "n": "ARABIC LETTER BEH, ARABIC LETTER HAH"}], "\u200e\ufdc2\u200e": [{"c": "\u200e\u0628\u062d\u0649\u200e", "n": "ARABIC LETTER BEH, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u0628\u062d\u0649\u200e": [{"c": "\u200e\ufdc2\u200e", "n": "ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM"}], "\u200e\ufc9e\u200e": [{"c": "\u200e\u0628\u062e\u200e", "n": "ARABIC LETTER BEH, ARABIC LETTER KHAH"}], "\u200e\u0628\u062e\u200e": [{"c": "\u200e\ufc9e\u200e", "n": "ARABIC LIGATURE BEH WITH KHAH INITIAL FORM"}, {"c": "\u200e\ufc07\u200e", "n": "ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM"}, {"c": "\u200e\ufcd2\u200e", "n": "ARABIC LIGATURE NOON WITH JEEM INITIAL FORM"}, {"c": "\u200e\ufc4b\u200e", "n": "ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM"}], "\u200e\ufc07\u200e": [{"c": "\u200e\u0628\u062e\u200e", "n": "ARABIC LETTER BEH, ARABIC LETTER KHAH"}], "\u200e\ufcd2\u200e": [{"c": "\u200e\u0628\u062e\u200e", "n": "ARABIC LETTER BEH, ARABIC LETTER KHAH"}], "\u200e\ufc4b\u200e": [{"c": "\u200e\u0628\u062e\u200e", "n": "ARABIC LETTER BEH, ARABIC LETTER KHAH"}], "\u200e\ufd9e\u200e": [{"c": "\u200e\u0628\u062e\u0649\u200e", "n": "ARABIC LETTER BEH, ARABIC LETTER KHAH, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u0628\u062e\u0649\u200e": [{"c": "\u200e\ufd9e\u200e", "n": "ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM"}], "\u200e\ufc6a\u200e": [{"c": "\u200e\u0628\u0631\u200e", "n": "ARABIC LETTER BEH, ARABIC LETTER REH"}], "\u200e\u0628\u0631\u200e": [{"c": "\u200e\ufc6a\u200e", "n": "ARABIC LIGATURE BEH WITH REH FINAL FORM"}], "\u200e\ufc6b\u200e": [{"c": "\u200e\u0628\u0632\u200e", "n": "ARABIC LETTER BEH, ARABIC LETTER ZAIN"}], "\u200e\u0628\u0632\u200e": [{"c": "\u200e\ufc6b\u200e", "n": "ARABIC LIGATURE BEH WITH ZAIN FINAL FORM"}], "\u200e\ufc9f\u200e": [{"c": "\u200e\u0628\u0645\u200e", "n": "ARABIC LETTER BEH, ARABIC LETTER MEEM"}], "\u200e\u0628\u0645\u200e": [{"c": "\u200e\ufc9f\u200e", "n": "ARABIC LIGATURE BEH WITH MEEM INITIAL FORM"}, {"c": "\u200e\ufce1\u200e", "n": "ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM"}, {"c": "\u200e\ufc6c\u200e", "n": "ARABIC LIGATURE BEH WITH MEEM FINAL FORM"}, {"c": "\u200e\ufc08\u200e", "n": "ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM"}], "\u200e\ufce1\u200e": [{"c": "\u200e\u0628\u0645\u200e", "n": "ARABIC LETTER BEH, ARABIC LETTER MEEM"}], "\u200e\ufc6c\u200e": [{"c": "\u200e\u0628\u0645\u200e", "n": "ARABIC LETTER BEH, ARABIC LETTER MEEM"}], "\u200e\ufc08\u200e": [{"c": "\u200e\u0628\u0645\u200e", "n": "ARABIC LETTER BEH, ARABIC LETTER MEEM"}], "\u200e\ufc6d\u200e": [{"c": "\u200e\u0628\u0646\u200e", "n": "ARABIC LETTER BEH, ARABIC LETTER NOON"}], "\u200e\u0628\u0646\u200e": [{"c": "\u200e\ufc6d\u200e", "n": "ARABIC LIGATURE BEH WITH NOON FINAL FORM"}], "\u200e\ufc6e\u200e": [{"c": "\u200e\u0628\u0649\u200e", "n": "ARABIC LETTER BEH, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u0628\u0649\u200e": [{"c": "\u200e\ufc6e\u200e", "n": "ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM"}, {"c": "\u200e\ufc09\u200e", "n": "ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM"}, {"c": "\u200e\ufc6f\u200e", "n": "ARABIC LIGATURE BEH WITH YEH FINAL FORM"}, {"c": "\u200e\ufc0a\u200e", "n": "ARABIC LIGATURE BEH WITH YEH ISOLATED FORM"}], "\u200e\ufc09\u200e": [{"c": "\u200e\u0628\u0649\u200e", "n": "ARABIC LETTER BEH, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufc6f\u200e": [{"c": "\u200e\u0628\u0649\u200e", "n": "ARABIC LETTER BEH, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufc0a\u200e": [{"c": "\u200e\u0628\u0649\u200e", "n": "ARABIC LETTER BEH, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufb54\u200e": [{"c": "\u200e\u067b\u200e", "n": "ARABIC LETTER BEEH"}], "\u200e\u067b\u200e": [{"c": "\u200e\ufb54\u200e", "n": "ARABIC LETTER BEEH INITIAL FORM"}, {"c": "\u200e\ufb55\u200e", "n": "ARABIC LETTER BEEH MEDIAL FORM"}, {"c": "\u200e\ufb53\u200e", "n": "ARABIC LETTER BEEH FINAL FORM"}, {"c": "\u200e\ufb52\u200e", "n": "ARABIC LETTER BEEH ISOLATED FORM"}, {"c": "\u200e\u06d0\u200e", "n": "ARABIC LETTER E"}, {"c": "\u200e\ufbe6\u200e", "n": "ARABIC LETTER E INITIAL FORM"}, {"c": "\u200e\ufbe7\u200e", "n": "ARABIC LETTER E MEDIAL FORM"}, {"c": "\u200e\ufbe5\u200e", "n": "ARABIC LETTER E FINAL FORM"}, {"c": "\u200e\ufbe4\u200e", "n": "ARABIC LETTER E ISOLATED FORM"}], "\u200e\ufb55\u200e": [{"c": "\u200e\u067b\u200e", "n": "ARABIC LETTER BEEH"}], "\u200e\ufb53\u200e": [{"c": "\u200e\u067b\u200e", "n": "ARABIC LETTER BEEH"}], "\u200e\ufb52\u200e": [{"c": "\u200e\u067b\u200e", "n": "ARABIC LETTER BEEH"}], "\u200e\u06d0\u200e": [{"c": "\u200e\u067b\u200e", "n": "ARABIC LETTER BEEH"}], "\u200e\ufbe6\u200e": [{"c": "\u200e\u067b\u200e", "n": "ARABIC LETTER BEEH"}], "\u200e\ufbe7\u200e": [{"c": "\u200e\u067b\u200e", "n": "ARABIC LETTER BEEH"}], "\u200e\ufbe5\u200e": [{"c": "\u200e\u067b\u200e", "n": "ARABIC LETTER BEEH"}], "\u200e\ufbe4\u200e": [{"c": "\u200e\u067b\u200e", "n": "ARABIC LETTER BEEH"}], "\u200e\ufb5c\u200e": [{"c": "\u200e\u0680\u200e", "n": "ARABIC LETTER BEHEH"}], "\u200e\u0680\u200e": [{"c": "\u200e\ufb5c\u200e", "n": "ARABIC LETTER BEHEH INITIAL FORM"}, {"c": "\u200e\ufb5d\u200e", "n": "ARABIC LETTER BEHEH MEDIAL FORM"}, {"c": "\u200e\ufb5b\u200e", "n": "ARABIC LETTER BEHEH FINAL FORM"}, {"c": "\u200e\ufb5a\u200e", "n": "ARABIC LETTER BEHEH ISOLATED FORM"}], "\u200e\ufb5d\u200e": [{"c": "\u200e\u0680\u200e", "n": "ARABIC LETTER BEHEH"}], "\u200e\ufb5b\u200e": [{"c": "\u200e\u0680\u200e", "n": "ARABIC LETTER BEHEH"}], "\u200e\ufb5a\u200e": [{"c": "\u200e\u0680\u200e", "n": "ARABIC LETTER BEHEH"}], "\u200e\u08a9\u200e": [{"c": "\u200e\u0754\u200e", "n": "ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE"}], "\u200e\u0754\u200e": [{"c": "\u200e\u08a9\u200e", "n": "ARABIC LETTER YEH WITH TWO DOTS BELOW AND DOT ABOVE"}, {"c": "\u200e\u0767\u200e", "n": "ARABIC LETTER NOON WITH TWO DOTS BELOW"}], "\u200e\u0767\u200e": [{"c": "\u200e\u0754\u200e", "n": "ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE"}], "\u2365": [{"c": "\u200e\u0629\u200e", "n": "ARABIC LETTER TEH MARBUTA"}], "\u200e\u0629\u200e": [{"c": "\u2365", "n": "APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS"}, {"c": "\u00f6", "n": "LATIN SMALL LETTER O WITH DIAERESIS"}, {"c": "\u200e\ufe94\u200e", "n": "ARABIC LETTER TEH MARBUTA FINAL FORM"}, {"c": "\u200e\ufe93\u200e", "n": "ARABIC LETTER TEH MARBUTA ISOLATED FORM"}, {"c": "\u200e\u06c3\u200e", "n": "ARABIC LETTER TEH MARBUTA GOAL"}], "\u00f6": [{"c": "\u200e\u0629\u200e", "n": "ARABIC LETTER TEH MARBUTA"}], "\u200e\ufe94\u200e": [{"c": "\u200e\u0629\u200e", "n": "ARABIC LETTER TEH MARBUTA"}], "\u200e\ufe93\u200e": [{"c": "\u200e\u0629\u200e", "n": "ARABIC LETTER TEH MARBUTA"}], "\u200e\u06c3\u200e": [{"c": "\u200e\u0629\u200e", "n": "ARABIC LETTER TEH MARBUTA"}], "\u200e\ud83b\ude15\u200e": [{"c": "\u200e\u062a\u200e", "n": "ARABIC LETTER TEH"}], "\u200e\u062a\u200e": [{"c": "\u200e\ud83b\ude15\u200e", "n": "ARABIC MATHEMATICAL TEH"}, {"c": "\u200e\ud83b\ude35\u200e", "n": "ARABIC MATHEMATICAL INITIAL TEH"}, {"c": "\u200e\ud83b\ude75\u200e", "n": "ARABIC MATHEMATICAL STRETCHED TEH"}, {"c": "\u200e\ud83b\ude95\u200e", "n": "ARABIC MATHEMATICAL LOOPED TEH"}, {"c": "\u200e\ud83b\udeb5\u200e", "n": "ARABIC MATHEMATICAL DOUBLE-STRUCK TEH"}, {"c": "\u200e\ufe97\u200e", "n": "ARABIC LETTER TEH INITIAL FORM"}, {"c": "\u200e\ufe98\u200e", "n": "ARABIC LETTER TEH MEDIAL FORM"}, {"c": "\u200e\ufe96\u200e", "n": "ARABIC LETTER TEH FINAL FORM"}, {"c": "\u200e\ufe95\u200e", "n": "ARABIC LETTER TEH ISOLATED FORM"}], "\u200e\ud83b\ude35\u200e": [{"c": "\u200e\u062a\u200e", "n": "ARABIC LETTER TEH"}], "\u200e\ud83b\ude75\u200e": [{"c": "\u200e\u062a\u200e", "n": "ARABIC LETTER TEH"}], "\u200e\ud83b\ude95\u200e": [{"c": "\u200e\u062a\u200e", "n": "ARABIC LETTER TEH"}], "\u200e\ud83b\udeb5\u200e": [{"c": "\u200e\u062a\u200e", "n": "ARABIC LETTER TEH"}], "\u200e\ufe97\u200e": [{"c": "\u200e\u062a\u200e", "n": "ARABIC LETTER TEH"}], "\u200e\ufe98\u200e": [{"c": "\u200e\u062a\u200e", "n": "ARABIC LETTER TEH"}], "\u200e\ufe96\u200e": [{"c": "\u200e\u062a\u200e", "n": "ARABIC LETTER TEH"}], "\u200e\ufe95\u200e": [{"c": "\u200e\u062a\u200e", "n": "ARABIC LETTER TEH"}], "\u200e\ufca5\u200e": [{"c": "\u200e\u062ao\u200e", "n": "ARABIC LETTER TEH, LATIN SMALL LETTER O"}], "\u200e\u062ao\u200e": [{"c": "\u200e\ufca5\u200e", "n": "ARABIC LIGATURE TEH WITH HEH INITIAL FORM"}, {"c": "\u200e\ufce4\u200e", "n": "ARABIC LIGATURE TEH WITH HEH MEDIAL FORM"}], "\u200e\ufce4\u200e": [{"c": "\u200e\u062ao\u200e", "n": "ARABIC LETTER TEH, LATIN SMALL LETTER O"}], "\u200e\ufca1\u200e": [{"c": "\u200e\u062a\u062c\u200e", "n": "ARABIC LETTER TEH, ARABIC LETTER JEEM"}], "\u200e\u062a\u062c\u200e": [{"c": "\u200e\ufca1\u200e", "n": "ARABIC LIGATURE TEH WITH JEEM INITIAL FORM"}, {"c": "\u200e\ufc0b\u200e", "n": "ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM"}], "\u200e\ufc0b\u200e": [{"c": "\u200e\u062a\u062c\u200e", "n": "ARABIC LETTER TEH, ARABIC LETTER JEEM"}], "\u200e\ufd50\u200e": [{"c": "\u200e\u062a\u062c\u0645\u200e", "n": "ARABIC LETTER TEH, ARABIC LETTER JEEM, ARABIC LETTER MEEM"}], "\u200e\u062a\u062c\u0645\u200e": [{"c": "\u200e\ufd50\u200e", "n": "ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM"}], "\u200e\ufda0\u200e": [{"c": "\u200e\u062a\u062c\u0649\u200e", "n": "ARABIC LETTER TEH, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u062a\u062c\u0649\u200e": [{"c": "\u200e\ufda0\u200e", "n": "ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM"}, {"c": "\u200e\ufd9f\u200e", "n": "ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM"}], "\u200e\ufd9f\u200e": [{"c": "\u200e\u062a\u062c\u0649\u200e", "n": "ARABIC LETTER TEH, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufca2\u200e": [{"c": "\u200e\u062a\u062d\u200e", "n": "ARABIC LETTER TEH, ARABIC LETTER HAH"}], "\u200e\u062a\u062d\u200e": [{"c": "\u200e\ufca2\u200e", "n": "ARABIC LIGATURE TEH WITH HAH INITIAL FORM"}, {"c": "\u200e\ufc0c\u200e", "n": "ARABIC LIGATURE TEH WITH HAH ISOLATED FORM"}], "\u200e\ufc0c\u200e": [{"c": "\u200e\u062a\u062d\u200e", "n": "ARABIC LETTER TEH, ARABIC LETTER HAH"}], "\u200e\ufd52\u200e": [{"c": "\u200e\u062a\u062d\u062c\u200e", "n": "ARABIC LETTER TEH, ARABIC LETTER HAH, ARABIC LETTER JEEM"}], "\u200e\u062a\u062d\u062c\u200e": [{"c": "\u200e\ufd52\u200e", "n": "ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM"}, {"c": "\u200e\ufd51\u200e", "n": "ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM"}], "\u200e\ufd51\u200e": [{"c": "\u200e\u062a\u062d\u062c\u200e", "n": "ARABIC LETTER TEH, ARABIC LETTER HAH, ARABIC LETTER JEEM"}], "\u200e\ufd53\u200e": [{"c": "\u200e\u062a\u062d\u0645\u200e", "n": "ARABIC LETTER TEH, ARABIC LETTER HAH, ARABIC LETTER MEEM"}], "\u200e\u062a\u062d\u0645\u200e": [{"c": "\u200e\ufd53\u200e", "n": "ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM"}], "\u200e\ufca3\u200e": [{"c": "\u200e\u062a\u062e\u200e", "n": "ARABIC LETTER TEH, ARABIC LETTER KHAH"}], "\u200e\u062a\u062e\u200e": [{"c": "\u200e\ufca3\u200e", "n": "ARABIC LIGATURE TEH WITH KHAH INITIAL FORM"}, {"c": "\u200e\ufc0d\u200e", "n": "ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM"}], "\u200e\ufc0d\u200e": [{"c": "\u200e\u062a\u062e\u200e", "n": "ARABIC LETTER TEH, ARABIC LETTER KHAH"}], "\u200e\ufd54\u200e": [{"c": "\u200e\u062a\u062e\u0645\u200e", "n": "ARABIC LETTER TEH, ARABIC LETTER KHAH, ARABIC LETTER MEEM"}], "\u200e\u062a\u062e\u0645\u200e": [{"c": "\u200e\ufd54\u200e", "n": "ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM"}], "\u200e\ufda2\u200e": [{"c": "\u200e\u062a\u062e\u0649\u200e", "n": "ARABIC LETTER TEH, ARABIC LETTER KHAH, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u062a\u062e\u0649\u200e": [{"c": "\u200e\ufda2\u200e", "n": "ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM"}, {"c": "\u200e\ufda1\u200e", "n": "ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM"}], "\u200e\ufda1\u200e": [{"c": "\u200e\u062a\u062e\u0649\u200e", "n": "ARABIC LETTER TEH, ARABIC LETTER KHAH, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufc70\u200e": [{"c": "\u200e\u062a\u0631\u200e", "n": "ARABIC LETTER TEH, ARABIC LETTER REH"}], "\u200e\u062a\u0631\u200e": [{"c": "\u200e\ufc70\u200e", "n": "ARABIC LIGATURE TEH WITH REH FINAL FORM"}], "\u200e\ufc71\u200e": [{"c": "\u200e\u062a\u0632\u200e", "n": "ARABIC LETTER TEH, ARABIC LETTER ZAIN"}], "\u200e\u062a\u0632\u200e": [{"c": "\u200e\ufc71\u200e", "n": "ARABIC LIGATURE TEH WITH ZAIN FINAL FORM"}], "\u200e\ufca4\u200e": [{"c": "\u200e\u062a\u0645\u200e", "n": "ARABIC LETTER TEH, ARABIC LETTER MEEM"}], "\u200e\u062a\u0645\u200e": [{"c": "\u200e\ufca4\u200e", "n": "ARABIC LIGATURE TEH WITH MEEM INITIAL FORM"}, {"c": "\u200e\ufce3\u200e", "n": "ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM"}, {"c": "\u200e\ufc72\u200e", "n": "ARABIC LIGATURE TEH WITH MEEM FINAL FORM"}, {"c": "\u200e\ufc0e\u200e", "n": "ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM"}], "\u200e\ufce3\u200e": [{"c": "\u200e\u062a\u0645\u200e", "n": "ARABIC LETTER TEH, ARABIC LETTER MEEM"}], "\u200e\ufc72\u200e": [{"c": "\u200e\u062a\u0645\u200e", "n": "ARABIC LETTER TEH, ARABIC LETTER MEEM"}], "\u200e\ufc0e\u200e": [{"c": "\u200e\u062a\u0645\u200e", "n": "ARABIC LETTER TEH, ARABIC LETTER MEEM"}], "\u200e\ufd55\u200e": [{"c": "\u200e\u062a\u0645\u062c\u200e", "n": "ARABIC LETTER TEH, ARABIC LETTER MEEM, ARABIC LETTER JEEM"}], "\u200e\u062a\u0645\u062c\u200e": [{"c": "\u200e\ufd55\u200e", "n": "ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM"}], "\u200e\ufd56\u200e": [{"c": "\u200e\u062a\u0645\u062d\u200e", "n": "ARABIC LETTER TEH, ARABIC LETTER MEEM, ARABIC LETTER HAH"}], "\u200e\u062a\u0645\u062d\u200e": [{"c": "\u200e\ufd56\u200e", "n": "ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM"}], "\u200e\ufd57\u200e": [{"c": "\u200e\u062a\u0645\u062e\u200e", "n": "ARABIC LETTER TEH, ARABIC LETTER MEEM, ARABIC LETTER KHAH"}], "\u200e\u062a\u0645\u062e\u200e": [{"c": "\u200e\ufd57\u200e", "n": "ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM"}], "\u200e\ufda4\u200e": [{"c": "\u200e\u062a\u0645\u0649\u200e", "n": "ARABIC LETTER TEH, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u062a\u0645\u0649\u200e": [{"c": "\u200e\ufda4\u200e", "n": "ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM"}, {"c": "\u200e\ufda3\u200e", "n": "ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM"}], "\u200e\ufda3\u200e": [{"c": "\u200e\u062a\u0645\u0649\u200e", "n": "ARABIC LETTER TEH, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufc73\u200e": [{"c": "\u200e\u062a\u0646\u200e", "n": "ARABIC LETTER TEH, ARABIC LETTER NOON"}], "\u200e\u062a\u0646\u200e": [{"c": "\u200e\ufc73\u200e", "n": "ARABIC LIGATURE TEH WITH NOON FINAL FORM"}], "\u200e\ufc74\u200e": [{"c": "\u200e\u062a\u0649\u200e", "n": "ARABIC LETTER TEH, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u062a\u0649\u200e": [{"c": "\u200e\ufc74\u200e", "n": "ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM"}, {"c": "\u200e\ufc0f\u200e", "n": "ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM"}, {"c": "\u200e\ufc75\u200e", "n": "ARABIC LIGATURE TEH WITH YEH FINAL FORM"}, {"c": "\u200e\ufc10\u200e", "n": "ARABIC LIGATURE TEH WITH YEH ISOLATED FORM"}], "\u200e\ufc0f\u200e": [{"c": "\u200e\u062a\u0649\u200e", "n": "ARABIC LETTER TEH, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufc75\u200e": [{"c": "\u200e\u062a\u0649\u200e", "n": "ARABIC LETTER TEH, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufc10\u200e": [{"c": "\u200e\u062a\u0649\u200e", "n": "ARABIC LETTER TEH, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufb60\u200e": [{"c": "\u200e\u067a\u200e", "n": "ARABIC LETTER TTEHEH"}], "\u200e\u067a\u200e": [{"c": "\u200e\ufb60\u200e", "n": "ARABIC LETTER TTEHEH INITIAL FORM"}, {"c": "\u200e\ufb61\u200e", "n": "ARABIC LETTER TTEHEH MEDIAL FORM"}, {"c": "\u200e\ufb5f\u200e", "n": "ARABIC LETTER TTEHEH FINAL FORM"}, {"c": "\u200e\ufb5e\u200e", "n": "ARABIC LETTER TTEHEH ISOLATED FORM"}], "\u200e\ufb61\u200e": [{"c": "\u200e\u067a\u200e", "n": "ARABIC LETTER TTEHEH"}], "\u200e\ufb5f\u200e": [{"c": "\u200e\u067a\u200e", "n": "ARABIC LETTER TTEHEH"}], "\u200e\ufb5e\u200e": [{"c": "\u200e\u067a\u200e", "n": "ARABIC LETTER TTEHEH"}], "\u200e\ufb64\u200e": [{"c": "\u200e\u067f\u200e", "n": "ARABIC LETTER TEHEH"}], "\u200e\u067f\u200e": [{"c": "\u200e\ufb64\u200e", "n": "ARABIC LETTER TEHEH INITIAL FORM"}, {"c": "\u200e\ufb65\u200e", "n": "ARABIC LETTER TEHEH MEDIAL FORM"}, {"c": "\u200e\ufb63\u200e", "n": "ARABIC LETTER TEHEH FINAL FORM"}, {"c": "\u200e\ufb62\u200e", "n": "ARABIC LETTER TEHEH ISOLATED FORM"}], "\u200e\ufb65\u200e": [{"c": "\u200e\u067f\u200e", "n": "ARABIC LETTER TEHEH"}], "\u200e\ufb63\u200e": [{"c": "\u200e\u067f\u200e", "n": "ARABIC LETTER TEHEH"}], "\u200e\ufb62\u200e": [{"c": "\u200e\u067f\u200e", "n": "ARABIC LETTER TEHEH"}], "\u200e\ud83b\ude02\u200e": [{"c": "\u200e\u062c\u200e", "n": "ARABIC LETTER JEEM"}], "\u200e\u062c\u200e": [{"c": "\u200e\ud83b\ude02\u200e", "n": "ARABIC MATHEMATICAL JEEM"}, {"c": "\u200e\ud83b\ude22\u200e", "n": "ARABIC MATHEMATICAL INITIAL JEEM"}, {"c": "\u200e\ud83b\ude42\u200e", "n": "ARABIC MATHEMATICAL TAILED JEEM"}, {"c": "\u200e\ud83b\ude62\u200e", "n": "ARABIC MATHEMATICAL STRETCHED JEEM"}, {"c": "\u200e\ud83b\ude82\u200e", "n": "ARABIC MATHEMATICAL LOOPED JEEM"}, {"c": "\u200e\ud83b\udea2\u200e", "n": "ARABIC MATHEMATICAL DOUBLE-STRUCK JEEM"}, {"c": "\u200e\ufe9f\u200e", "n": "ARABIC LETTER JEEM INITIAL FORM"}, {"c": "\u200e\ufea0\u200e", "n": "ARABIC LETTER JEEM MEDIAL FORM"}, {"c": "\u200e\ufe9e\u200e", "n": "ARABIC LETTER JEEM FINAL FORM"}, {"c": "\u200e\ufe9d\u200e", "n": "ARABIC LETTER JEEM ISOLATED FORM"}], "\u200e\ud83b\ude22\u200e": [{"c": "\u200e\u062c\u200e", "n": "ARABIC LETTER JEEM"}], "\u200e\ud83b\ude42\u200e": [{"c": "\u200e\u062c\u200e", "n": "ARABIC LETTER JEEM"}], "\u200e\ud83b\ude62\u200e": [{"c": "\u200e\u062c\u200e", "n": "ARABIC LETTER JEEM"}], "\u200e\ud83b\ude82\u200e": [{"c": "\u200e\u062c\u200e", "n": "ARABIC LETTER JEEM"}], "\u200e\ud83b\udea2\u200e": [{"c": "\u200e\u062c\u200e", "n": "ARABIC LETTER JEEM"}], "\u200e\ufe9f\u200e": [{"c": "\u200e\u062c\u200e", "n": "ARABIC LETTER JEEM"}], "\u200e\ufea0\u200e": [{"c": "\u200e\u062c\u200e", "n": "ARABIC LETTER JEEM"}], "\u200e\ufe9e\u200e": [{"c": "\u200e\u062c\u200e", "n": "ARABIC LETTER JEEM"}], "\u200e\ufe9d\u200e": [{"c": "\u200e\u062c\u200e", "n": "ARABIC LETTER JEEM"}], "\u200e\ufca7\u200e": [{"c": "\u200e\u062c\u062d\u200e", "n": "ARABIC LETTER JEEM, ARABIC LETTER HAH"}], "\u200e\u062c\u062d\u200e": [{"c": "\u200e\ufca7\u200e", "n": "ARABIC LIGATURE JEEM WITH HAH INITIAL FORM"}, {"c": "\u200e\ufc15\u200e", "n": "ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM"}], "\u200e\ufc15\u200e": [{"c": "\u200e\u062c\u062d\u200e", "n": "ARABIC LETTER JEEM, ARABIC LETTER HAH"}], "\u200e\ufda6\u200e": [{"c": "\u200e\u062c\u062d\u0649\u200e", "n": "ARABIC LETTER JEEM, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u062c\u062d\u0649\u200e": [{"c": "\u200e\ufda6\u200e", "n": "ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM"}, {"c": "\u200e\ufdbe\u200e", "n": "ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM"}], "\u200e\ufdbe\u200e": [{"c": "\u200e\u062c\u062d\u0649\u200e", "n": "ARABIC LETTER JEEM, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufdfb\u200e": [{"c": "\u200e\u062c\u0644 \u062c\u0644l\u0644o\u200e", "n": "ARABIC LETTER JEEM, ARABIC LETTER LAM, SPACE, ARABIC LETTER JEEM, ARABIC LETTER LAM, LATIN SMALL LETTER L, ARABIC LETTER LAM, LATIN SMALL LETTER O"}], "\u200e\u062c\u0644 \u062c\u0644l\u0644o\u200e": [{"c": "\u200e\ufdfb\u200e", "n": "ARABIC LIGATURE JALLAJALALOUHOU"}], "\u200e\ufca8\u200e": [{"c": "\u200e\u062c\u0645\u200e", "n": "ARABIC LETTER JEEM, ARABIC LETTER MEEM"}], "\u200e\u062c\u0645\u200e": [{"c": "\u200e\ufca8\u200e", "n": "ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM"}, {"c": "\u200e\ufc16\u200e", "n": "ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM"}], "\u200e\ufc16\u200e": [{"c": "\u200e\u062c\u0645\u200e", "n": "ARABIC LETTER JEEM, ARABIC LETTER MEEM"}], "\u200e\ufd59\u200e": [{"c": "\u200e\u062c\u0645\u062d\u200e", "n": "ARABIC LETTER JEEM, ARABIC LETTER MEEM, ARABIC LETTER HAH"}], "\u200e\u062c\u0645\u062d\u200e": [{"c": "\u200e\ufd59\u200e", "n": "ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM"}, {"c": "\u200e\ufd58\u200e", "n": "ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM"}], "\u200e\ufd58\u200e": [{"c": "\u200e\u062c\u0645\u062d\u200e", "n": "ARABIC LETTER JEEM, ARABIC LETTER MEEM, ARABIC LETTER HAH"}], "\u200e\ufda7\u200e": [{"c": "\u200e\u062c\u0645\u0649\u200e", "n": "ARABIC LETTER JEEM, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u062c\u0645\u0649\u200e": [{"c": "\u200e\ufda7\u200e", "n": "ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM"}, {"c": "\u200e\ufda5\u200e", "n": "ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM"}], "\u200e\ufda5\u200e": [{"c": "\u200e\u062c\u0645\u0649\u200e", "n": "ARABIC LETTER JEEM, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufd1d\u200e": [{"c": "\u200e\u062c\u0649\u200e", "n": "ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u062c\u0649\u200e": [{"c": "\u200e\ufd1d\u200e", "n": "ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM"}, {"c": "\u200e\ufd01\u200e", "n": "ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM"}, {"c": "\u200e\ufd1e\u200e", "n": "ARABIC LIGATURE JEEM WITH YEH FINAL FORM"}, {"c": "\u200e\ufd02\u200e", "n": "ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM"}], "\u200e\ufd01\u200e": [{"c": "\u200e\u062c\u0649\u200e", "n": "ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufd1e\u200e": [{"c": "\u200e\u062c\u0649\u200e", "n": "ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufd02\u200e": [{"c": "\u200e\u062c\u0649\u200e", "n": "ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufb78\u200e": [{"c": "\u200e\u0683\u200e", "n": "ARABIC LETTER NYEH"}], "\u200e\u0683\u200e": [{"c": "\u200e\ufb78\u200e", "n": "ARABIC LETTER NYEH INITIAL FORM"}, {"c": "\u200e\ufb79\u200e", "n": "ARABIC LETTER NYEH MEDIAL FORM"}, {"c": "\u200e\ufb77\u200e", "n": "ARABIC LETTER NYEH FINAL FORM"}, {"c": "\u200e\ufb76\u200e", "n": "ARABIC LETTER NYEH ISOLATED FORM"}], "\u200e\ufb79\u200e": [{"c": "\u200e\u0683\u200e", "n": "ARABIC LETTER NYEH"}], "\u200e\ufb77\u200e": [{"c": "\u200e\u0683\u200e", "n": "ARABIC LETTER NYEH"}], "\u200e\ufb76\u200e": [{"c": "\u200e\u0683\u200e", "n": "ARABIC LETTER NYEH"}], "\u200e\ufb74\u200e": [{"c": "\u200e\u0684\u200e", "n": "ARABIC LETTER DYEH"}], "\u200e\u0684\u200e": [{"c": "\u200e\ufb74\u200e", "n": "ARABIC LETTER DYEH INITIAL FORM"}, {"c": "\u200e\ufb75\u200e", "n": "ARABIC LETTER DYEH MEDIAL FORM"}, {"c": "\u200e\ufb73\u200e", "n": "ARABIC LETTER DYEH FINAL FORM"}, {"c": "\u200e\ufb72\u200e", "n": "ARABIC LETTER DYEH ISOLATED FORM"}], "\u200e\ufb75\u200e": [{"c": "\u200e\u0684\u200e", "n": "ARABIC LETTER DYEH"}], "\u200e\ufb73\u200e": [{"c": "\u200e\u0684\u200e", "n": "ARABIC LETTER DYEH"}], "\u200e\ufb72\u200e": [{"c": "\u200e\u0684\u200e", "n": "ARABIC LETTER DYEH"}], "\u200e\ufb7c\u200e": [{"c": "\u200e\u0686\u200e", "n": "ARABIC LETTER TCHEH"}], "\u200e\u0686\u200e": [{"c": "\u200e\ufb7c\u200e", "n": "ARABIC LETTER TCHEH INITIAL FORM"}, {"c": "\u200e\ufb7d\u200e", "n": "ARABIC LETTER TCHEH MEDIAL FORM"}, {"c": "\u200e\ufb7b\u200e", "n": "ARABIC LETTER TCHEH FINAL FORM"}, {"c": "\u200e\ufb7a\u200e", "n": "ARABIC LETTER TCHEH ISOLATED FORM"}], "\u200e\ufb7d\u200e": [{"c": "\u200e\u0686\u200e", "n": "ARABIC LETTER TCHEH"}], "\u200e\ufb7b\u200e": [{"c": "\u200e\u0686\u200e", "n": "ARABIC LETTER TCHEH"}], "\u200e\ufb7a\u200e": [{"c": "\u200e\u0686\u200e", "n": "ARABIC LETTER TCHEH"}], "\u200e\ufb80\u200e": [{"c": "\u200e\u0687\u200e", "n": "ARABIC LETTER TCHEHEH"}], "\u200e\u0687\u200e": [{"c": "\u200e\ufb80\u200e", "n": "ARABIC LETTER TCHEHEH INITIAL FORM"}, {"c": "\u200e\ufb81\u200e", "n": "ARABIC LETTER TCHEHEH MEDIAL FORM"}, {"c": "\u200e\ufb7f\u200e", "n": "ARABIC LETTER TCHEHEH FINAL FORM"}, {"c": "\u200e\ufb7e\u200e", "n": "ARABIC LETTER TCHEHEH ISOLATED FORM"}], "\u200e\ufb81\u200e": [{"c": "\u200e\u0687\u200e", "n": "ARABIC LETTER TCHEHEH"}], "\u200e\ufb7f\u200e": [{"c": "\u200e\u0687\u200e", "n": "ARABIC LETTER TCHEHEH"}], "\u200e\ufb7e\u200e": [{"c": "\u200e\u0687\u200e", "n": "ARABIC LETTER TCHEHEH"}], "\u200e\ud83b\ude07\u200e": [{"c": "\u200e\u062d\u200e", "n": "ARABIC LETTER HAH"}], "\u200e\u062d\u200e": [{"c": "\u200e\ud83b\ude07\u200e", "n": "ARABIC MATHEMATICAL HAH"}, {"c": "\u200e\ud83b\ude27\u200e", "n": "ARABIC MATHEMATICAL INITIAL HAH"}, {"c": "\u200e\ud83b\ude47\u200e", "n": "ARABIC MATHEMATICAL TAILED HAH"}, {"c": "\u200e\ud83b\ude67\u200e", "n": "ARABIC MATHEMATICAL STRETCHED HAH"}, {"c": "\u200e\ud83b\ude87\u200e", "n": "ARABIC MATHEMATICAL LOOPED HAH"}, {"c": "\u200e\ud83b\udea7\u200e", "n": "ARABIC MATHEMATICAL DOUBLE-STRUCK HAH"}, {"c": "\u200e\ufea3\u200e", "n": "ARABIC LETTER HAH INITIAL FORM"}, {"c": "\u200e\ufea4\u200e", "n": "ARABIC LETTER HAH MEDIAL FORM"}, {"c": "\u200e\ufea2\u200e", "n": "ARABIC LETTER HAH FINAL FORM"}, {"c": "\u200e\ufea1\u200e", "n": "ARABIC LETTER HAH ISOLATED FORM"}], "\u200e\ud83b\ude27\u200e": [{"c": "\u200e\u062d\u200e", "n": "ARABIC LETTER HAH"}], "\u200e\ud83b\ude47\u200e": [{"c": "\u200e\u062d\u200e", "n": "ARABIC LETTER HAH"}], "\u200e\ud83b\ude67\u200e": [{"c": "\u200e\u062d\u200e", "n": "ARABIC LETTER HAH"}], "\u200e\ud83b\ude87\u200e": [{"c": "\u200e\u062d\u200e", "n": "ARABIC LETTER HAH"}], "\u200e\ud83b\udea7\u200e": [{"c": "\u200e\u062d\u200e", "n": "ARABIC LETTER HAH"}], "\u200e\ufea3\u200e": [{"c": "\u200e\u062d\u200e", "n": "ARABIC LETTER HAH"}], "\u200e\ufea4\u200e": [{"c": "\u200e\u062d\u200e", "n": "ARABIC LETTER HAH"}], "\u200e\ufea2\u200e": [{"c": "\u200e\u062d\u200e", "n": "ARABIC LETTER HAH"}], "\u200e\ufea1\u200e": [{"c": "\u200e\u062d\u200e", "n": "ARABIC LETTER HAH"}], "\u200e\u0685\u200e": [{"c": "\u200e\u062d\u06db\u200e", "n": "ARABIC LETTER HAH, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\u062d\u06db\u200e": [{"c": "\u200e\u0685\u200e", "n": "ARABIC LETTER HAH WITH THREE DOTS ABOVE"}], "\u200e\u0681\u200e": [{"c": "\u200e\u062d\u0654\u200e", "n": "ARABIC LETTER HAH, ARABIC HAMZA ABOVE"}], "\u200e\u062d\u0654\u200e": [{"c": "\u200e\u0681\u200e", "n": "ARABIC LETTER HAH WITH HAMZA ABOVE"}, {"c": "\u200e\u0772\u200e", "n": "ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH ABOVE"}], "\u200e\u0772\u200e": [{"c": "\u200e\u062d\u0654\u200e", "n": "ARABIC LETTER HAH, ARABIC HAMZA ABOVE"}], "\u200e\ufca9\u200e": [{"c": "\u200e\u062d\u062c\u200e", "n": "ARABIC LETTER HAH, ARABIC LETTER JEEM"}], "\u200e\u062d\u062c\u200e": [{"c": "\u200e\ufca9\u200e", "n": "ARABIC LIGATURE HAH WITH JEEM INITIAL FORM"}, {"c": "\u200e\ufc17\u200e", "n": "ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM"}], "\u200e\ufc17\u200e": [{"c": "\u200e\u062d\u062c\u200e", "n": "ARABIC LETTER HAH, ARABIC LETTER JEEM"}], "\u200e\ufdbf\u200e": [{"c": "\u200e\u062d\u062c\u0649\u200e", "n": "ARABIC LETTER HAH, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u062d\u062c\u0649\u200e": [{"c": "\u200e\ufdbf\u200e", "n": "ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM"}], "\u200e\ufcaa\u200e": [{"c": "\u200e\u062d\u0645\u200e", "n": "ARABIC LETTER HAH, ARABIC LETTER MEEM"}], "\u200e\u062d\u0645\u200e": [{"c": "\u200e\ufcaa\u200e", "n": "ARABIC LIGATURE HAH WITH MEEM INITIAL FORM"}, {"c": "\u200e\ufc18\u200e", "n": "ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM"}], "\u200e\ufc18\u200e": [{"c": "\u200e\u062d\u0645\u200e", "n": "ARABIC LETTER HAH, ARABIC LETTER MEEM"}], "\u200e\ufd5b\u200e": [{"c": "\u200e\u062d\u0645\u0649\u200e", "n": "ARABIC LETTER HAH, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u062d\u0645\u0649\u200e": [{"c": "\u200e\ufd5b\u200e", "n": "ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM"}, {"c": "\u200e\ufd5a\u200e", "n": "ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM"}], "\u200e\ufd5a\u200e": [{"c": "\u200e\u062d\u0645\u0649\u200e", "n": "ARABIC LETTER HAH, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufd1b\u200e": [{"c": "\u200e\u062d\u0649\u200e", "n": "ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u062d\u0649\u200e": [{"c": "\u200e\ufd1b\u200e", "n": "ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM"}, {"c": "\u200e\ufcff\u200e", "n": "ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM"}, {"c": "\u200e\ufd1c\u200e", "n": "ARABIC LIGATURE HAH WITH YEH FINAL FORM"}, {"c": "\u200e\ufd00\u200e", "n": "ARABIC LIGATURE HAH WITH YEH ISOLATED FORM"}], "\u200e\ufcff\u200e": [{"c": "\u200e\u062d\u0649\u200e", "n": "ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufd1c\u200e": [{"c": "\u200e\u062d\u0649\u200e", "n": "ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufd00\u200e": [{"c": "\u200e\u062d\u0649\u200e", "n": "ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ud83b\ude17\u200e": [{"c": "\u200e\u062e\u200e", "n": "ARABIC LETTER KHAH"}], "\u200e\u062e\u200e": [{"c": "\u200e\ud83b\ude17\u200e", "n": "ARABIC MATHEMATICAL KHAH"}, {"c": "\u200e\ud83b\ude37\u200e", "n": "ARABIC MATHEMATICAL INITIAL KHAH"}, {"c": "\u200e\ud83b\ude57\u200e", "n": "ARABIC MATHEMATICAL TAILED KHAH"}, {"c": "\u200e\ud83b\ude77\u200e", "n": "ARABIC MATHEMATICAL STRETCHED KHAH"}, {"c": "\u200e\ud83b\ude97\u200e", "n": "ARABIC MATHEMATICAL LOOPED KHAH"}, {"c": "\u200e\ud83b\udeb7\u200e", "n": "ARABIC MATHEMATICAL DOUBLE-STRUCK KHAH"}, {"c": "\u200e\ufea7\u200e", "n": "ARABIC LETTER KHAH INITIAL FORM"}, {"c": "\u200e\ufea8\u200e", "n": "ARABIC LETTER KHAH MEDIAL FORM"}, {"c": "\u200e\ufea6\u200e", "n": "ARABIC LETTER KHAH FINAL FORM"}, {"c": "\u200e\ufea5\u200e", "n": "ARABIC LETTER KHAH ISOLATED FORM"}], "\u200e\ud83b\ude37\u200e": [{"c": "\u200e\u062e\u200e", "n": "ARABIC LETTER KHAH"}], "\u200e\ud83b\ude57\u200e": [{"c": "\u200e\u062e\u200e", "n": "ARABIC LETTER KHAH"}], "\u200e\ud83b\ude77\u200e": [{"c": "\u200e\u062e\u200e", "n": "ARABIC LETTER KHAH"}], "\u200e\ud83b\ude97\u200e": [{"c": "\u200e\u062e\u200e", "n": "ARABIC LETTER KHAH"}], "\u200e\ud83b\udeb7\u200e": [{"c": "\u200e\u062e\u200e", "n": "ARABIC LETTER KHAH"}], "\u200e\ufea7\u200e": [{"c": "\u200e\u062e\u200e", "n": "ARABIC LETTER KHAH"}], "\u200e\ufea8\u200e": [{"c": "\u200e\u062e\u200e", "n": "ARABIC LETTER KHAH"}], "\u200e\ufea6\u200e": [{"c": "\u200e\u062e\u200e", "n": "ARABIC LETTER KHAH"}], "\u200e\ufea5\u200e": [{"c": "\u200e\u062e\u200e", "n": "ARABIC LETTER KHAH"}], "\u200e\ufcab\u200e": [{"c": "\u200e\u062e\u062c\u200e", "n": "ARABIC LETTER KHAH, ARABIC LETTER JEEM"}], "\u200e\u062e\u062c\u200e": [{"c": "\u200e\ufcab\u200e", "n": "ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM"}, {"c": "\u200e\ufc19\u200e", "n": "ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM"}], "\u200e\ufc19\u200e": [{"c": "\u200e\u062e\u062c\u200e", "n": "ARABIC LETTER KHAH, ARABIC LETTER JEEM"}], "\u200e\ufc1a\u200e": [{"c": "\u200e\u062e\u062d\u200e", "n": "ARABIC LETTER KHAH, ARABIC LETTER HAH"}], "\u200e\u062e\u062d\u200e": [{"c": "\u200e\ufc1a\u200e", "n": "ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM"}], "\u200e\ufcac\u200e": [{"c": "\u200e\u062e\u0645\u200e", "n": "ARABIC LETTER KHAH, ARABIC LETTER MEEM"}], "\u200e\u062e\u0645\u200e": [{"c": "\u200e\ufcac\u200e", "n": "ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM"}, {"c": "\u200e\ufc1b\u200e", "n": "ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM"}], "\u200e\ufc1b\u200e": [{"c": "\u200e\u062e\u0645\u200e", "n": "ARABIC LETTER KHAH, ARABIC LETTER MEEM"}], "\u200e\ufd1f\u200e": [{"c": "\u200e\u062e\u0649\u200e", "n": "ARABIC LETTER KHAH, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u062e\u0649\u200e": [{"c": "\u200e\ufd1f\u200e", "n": "ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM"}, {"c": "\u200e\ufd03\u200e", "n": "ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM"}, {"c": "\u200e\ufd20\u200e", "n": "ARABIC LIGATURE KHAH WITH YEH FINAL FORM"}, {"c": "\u200e\ufd04\u200e", "n": "ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM"}], "\u200e\ufd03\u200e": [{"c": "\u200e\u062e\u0649\u200e", "n": "ARABIC LETTER KHAH, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufd20\u200e": [{"c": "\u200e\u062e\u0649\u200e", "n": "ARABIC LETTER KHAH, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufd04\u200e": [{"c": "\u200e\u062e\u0649\u200e", "n": "ARABIC LETTER KHAH, ARABIC LETTER ALEF MAKSURA"}], "\ud800\udee1": [{"c": "\u200e\u062f\u200e", "n": "ARABIC LETTER DAL"}], "\u200e\u062f\u200e": [{"c": "\ud800\udee1", "n": "COPTIC EPACT DIGIT ONE"}, {"c": "\u200e\ud83b\ude03\u200e", "n": "ARABIC MATHEMATICAL DAL"}, {"c": "\u200e\ud83b\ude83\u200e", "n": "ARABIC MATHEMATICAL LOOPED DAL"}, {"c": "\u200e\ud83b\udea3\u200e", "n": "ARABIC MATHEMATICAL DOUBLE-STRUCK DAL"}, {"c": "\u200e\ufeaa\u200e", "n": "ARABIC LETTER DAL FINAL FORM"}, {"c": "\u200e\ufea9\u200e", "n": "ARABIC LETTER DAL ISOLATED FORM"}], "\u200e\ud83b\ude03\u200e": [{"c": "\u200e\u062f\u200e", "n": "ARABIC LETTER DAL"}], "\u200e\ud83b\ude83\u200e": [{"c": "\u200e\u062f\u200e", "n": "ARABIC LETTER DAL"}], "\u200e\ud83b\udea3\u200e": [{"c": "\u200e\u062f\u200e", "n": "ARABIC LETTER DAL"}], "\u200e\ufeaa\u200e": [{"c": "\u200e\u062f\u200e", "n": "ARABIC LETTER DAL"}], "\u200e\ufea9\u200e": [{"c": "\u200e\u062f\u200e", "n": "ARABIC LETTER DAL"}], "\u200e\u0688\u200e": [{"c": "\u200e\u062f\u0615\u200e", "n": "ARABIC LETTER DAL, ARABIC SMALL HIGH TAH"}], "\u200e\u062f\u0615\u200e": [{"c": "\u200e\u0688\u200e", "n": "ARABIC LETTER DDAL"}, {"c": "\u200e\ufb89\u200e", "n": "ARABIC LETTER DDAL FINAL FORM"}, {"c": "\u200e\ufb88\u200e", "n": "ARABIC LETTER DDAL ISOLATED FORM"}], "\u200e\ufb89\u200e": [{"c": "\u200e\u062f\u0615\u200e", "n": "ARABIC LETTER DAL, ARABIC SMALL HIGH TAH"}], "\u200e\ufb88\u200e": [{"c": "\u200e\u062f\u0615\u200e", "n": "ARABIC LETTER DAL, ARABIC SMALL HIGH TAH"}], "\u200e\u068e\u200e": [{"c": "\u200e\u062f\u06db\u200e", "n": "ARABIC LETTER DAL, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\u062f\u06db\u200e": [{"c": "\u200e\u068e\u200e", "n": "ARABIC LETTER DUL"}, {"c": "\u200e\ufb87\u200e", "n": "ARABIC LETTER DUL FINAL FORM"}, {"c": "\u200e\ufb86\u200e", "n": "ARABIC LETTER DUL ISOLATED FORM"}], "\u200e\ufb87\u200e": [{"c": "\u200e\u062f\u06db\u200e", "n": "ARABIC LETTER DAL, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\ufb86\u200e": [{"c": "\u200e\u062f\u06db\u200e", "n": "ARABIC LETTER DAL, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\u06ee\u200e": [{"c": "\u200e\u062f\u0302\u200e", "n": "ARABIC LETTER DAL, COMBINING CIRCUMFLEX ACCENT"}], "\u200e\u062f\u0302\u200e": [{"c": "\u200e\u06ee\u200e", "n": "ARABIC LETTER DAL WITH INVERTED V"}], "\u200e\u08ae\u200e": [{"c": "\u200e\u062f\u0324\u0323\u200e", "n": "ARABIC LETTER DAL, COMBINING DIAERESIS BELOW, COMBINING DOT BELOW"}], "\u200e\u062f\u0324\u0323\u200e": [{"c": "\u200e\u08ae\u200e", "n": "ARABIC LETTER DAL WITH THREE DOTS BELOW"}], "\u200e\ud83b\ude18\u200e": [{"c": "\u200e\u0630\u200e", "n": "ARABIC LETTER THAL"}], "\u200e\u0630\u200e": [{"c": "\u200e\ud83b\ude18\u200e", "n": "ARABIC MATHEMATICAL THAL"}, {"c": "\u200e\ud83b\ude98\u200e", "n": "ARABIC MATHEMATICAL LOOPED THAL"}, {"c": "\u200e\ud83b\udeb8\u200e", "n": "ARABIC MATHEMATICAL DOUBLE-STRUCK THAL"}, {"c": "\u200e\ufeac\u200e", "n": "ARABIC LETTER THAL FINAL FORM"}, {"c": "\u200e\ufeab\u200e", "n": "ARABIC LETTER THAL ISOLATED FORM"}], "\u200e\ud83b\ude98\u200e": [{"c": "\u200e\u0630\u200e", "n": "ARABIC LETTER THAL"}], "\u200e\ud83b\udeb8\u200e": [{"c": "\u200e\u0630\u200e", "n": "ARABIC LETTER THAL"}], "\u200e\ufeac\u200e": [{"c": "\u200e\u0630\u200e", "n": "ARABIC LETTER THAL"}], "\u200e\ufeab\u200e": [{"c": "\u200e\u0630\u200e", "n": "ARABIC LETTER THAL"}], "\u200e\ufc5b\u200e": [{"c": "\u200e\u0630\u0670\u200e", "n": "ARABIC LETTER THAL, ARABIC LETTER SUPERSCRIPT ALEF"}], "\u200e\u0630\u0670\u200e": [{"c": "\u200e\ufc5b\u200e", "n": "ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM"}], "\u200e\u068b\u200e": [{"c": "\u200e\u068a\u0615\u200e", "n": "ARABIC LETTER DAL WITH DOT BELOW, ARABIC SMALL HIGH TAH"}], "\u200e\u068a\u0615\u200e": [{"c": "\u200e\u068b\u200e", "n": "ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH"}], "\u200e\ufb85\u200e": [{"c": "\u200e\u068c\u200e", "n": "ARABIC LETTER DAHAL"}], "\u200e\u068c\u200e": [{"c": "\u200e\ufb85\u200e", "n": "ARABIC LETTER DAHAL FINAL FORM"}, {"c": "\u200e\ufb84\u200e", "n": "ARABIC LETTER DAHAL ISOLATED FORM"}], "\u200e\ufb84\u200e": [{"c": "\u200e\u068c\u200e", "n": "ARABIC LETTER DAHAL"}], "\u200e\ufb83\u200e": [{"c": "\u200e\u068d\u200e", "n": "ARABIC LETTER DDAHAL"}], "\u200e\u068d\u200e": [{"c": "\u200e\ufb83\u200e", "n": "ARABIC LETTER DDAHAL FINAL FORM"}, {"c": "\u200e\ufb82\u200e", "n": "ARABIC LETTER DDAHAL ISOLATED FORM"}], "\u200e\ufb82\u200e": [{"c": "\u200e\u068d\u200e", "n": "ARABIC LETTER DDAHAL"}], "\u200e\ud83b\ude13\u200e": [{"c": "\u200e\u0631\u200e", "n": "ARABIC LETTER REH"}], "\u200e\u0631\u200e": [{"c": "\u200e\ud83b\ude13\u200e", "n": "ARABIC MATHEMATICAL REH"}, {"c": "\u200e\ud83b\ude93\u200e", "n": "ARABIC MATHEMATICAL LOOPED REH"}, {"c": "\u200e\ud83b\udeb3\u200e", "n": "ARABIC MATHEMATICAL DOUBLE-STRUCK REH"}, {"c": "\u200e\ufeae\u200e", "n": "ARABIC LETTER REH FINAL FORM"}, {"c": "\u200e\ufead\u200e", "n": "ARABIC LETTER REH ISOLATED FORM"}], "\u200e\ud83b\ude93\u200e": [{"c": "\u200e\u0631\u200e", "n": "ARABIC LETTER REH"}], "\u200e\ud83b\udeb3\u200e": [{"c": "\u200e\u0631\u200e", "n": "ARABIC LETTER REH"}], "\u200e\ufeae\u200e": [{"c": "\u200e\u0631\u200e", "n": "ARABIC LETTER REH"}], "\u200e\ufead\u200e": [{"c": "\u200e\u0631\u200e", "n": "ARABIC LETTER REH"}], "\u200e\u0691\u200e": [{"c": "\u200e\u0631\u0615\u200e", "n": "ARABIC LETTER REH, ARABIC SMALL HIGH TAH"}], "\u200e\u0631\u0615\u200e": [{"c": "\u200e\u0691\u200e", "n": "ARABIC LETTER RREH"}, {"c": "\u200e\ufb8d\u200e", "n": "ARABIC LETTER RREH FINAL FORM"}, {"c": "\u200e\ufb8c\u200e", "n": "ARABIC LETTER RREH ISOLATED FORM"}], "\u200e\ufb8d\u200e": [{"c": "\u200e\u0631\u0615\u200e", "n": "ARABIC LETTER REH, ARABIC SMALL HIGH TAH"}], "\u200e\ufb8c\u200e": [{"c": "\u200e\u0631\u0615\u200e", "n": "ARABIC LETTER REH, ARABIC SMALL HIGH TAH"}], "\u200e\u0698\u200e": [{"c": "\u200e\u0631\u06db\u200e", "n": "ARABIC LETTER REH, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\u0631\u06db\u200e": [{"c": "\u200e\u0698\u200e", "n": "ARABIC LETTER JEH"}, {"c": "\u200e\ufb8b\u200e", "n": "ARABIC LETTER JEH FINAL FORM"}, {"c": "\u200e\ufb8a\u200e", "n": "ARABIC LETTER JEH ISOLATED FORM"}], "\u200e\ufb8b\u200e": [{"c": "\u200e\u0631\u06db\u200e", "n": "ARABIC LETTER REH, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\ufb8a\u200e": [{"c": "\u200e\u0631\u06db\u200e", "n": "ARABIC LETTER REH, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\u0692\u200e": [{"c": "\u200e\u0631\u0306\u200e", "n": "ARABIC LETTER REH, COMBINING BREVE"}], "\u200e\u0631\u0306\u200e": [{"c": "\u200e\u0692\u200e", "n": "ARABIC LETTER REH WITH SMALL V"}], "\u200e\u08b9\u200e": [{"c": "\u200e\u0631\u0306\u0307\u200e", "n": "ARABIC LETTER REH, COMBINING BREVE, COMBINING DOT ABOVE"}], "\u200e\u0631\u0306\u0307\u200e": [{"c": "\u200e\u08b9\u200e", "n": "ARABIC LETTER REH WITH SMALL NOON ABOVE"}], "\u200e\u06ef\u200e": [{"c": "\u200e\u0631\u0302\u200e", "n": "ARABIC LETTER REH, COMBINING CIRCUMFLEX ACCENT"}], "\u200e\u0631\u0302\u200e": [{"c": "\u200e\u06ef\u200e", "n": "ARABIC LETTER REH WITH INVERTED V"}], "\u200e\u076c\u200e": [{"c": "\u200e\u0631\u0654\u200e", "n": "ARABIC LETTER REH, ARABIC HAMZA ABOVE"}], "\u200e\u0631\u0654\u200e": [{"c": "\u200e\u076c\u200e", "n": "ARABIC LETTER REH WITH HAMZA ABOVE"}], "\u200e\ufc5c\u200e": [{"c": "\u200e\u0631\u0670\u200e", "n": "ARABIC LETTER REH, ARABIC LETTER SUPERSCRIPT ALEF"}], "\u200e\u0631\u0670\u200e": [{"c": "\u200e\ufc5c\u200e", "n": "ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM"}], "\u200e\ufdf6\u200e": [{"c": "\u200e\u0631\u0633\u0648\u0644\u200e", "n": "ARABIC LETTER REH, ARABIC LETTER SEEN, ARABIC LETTER WAW, ARABIC LETTER LAM"}], "\u200e\u0631\u0633\u0648\u0644\u200e": [{"c": "\u200e\ufdf6\u200e", "n": "ARABIC LIGATURE RASOUL ISOLATED FORM"}], "\u200e\ufdfc\u200e": [{"c": "\u200e\u0631\u0649l\u0644\u200e", "n": "ARABIC LETTER REH, ARABIC LETTER ALEF MAKSURA, LATIN SMALL LETTER L, ARABIC LETTER LAM"}], "\u200e\u0631\u0649l\u0644\u200e": [{"c": "\u200e\ufdfc\u200e", "n": "RIAL SIGN"}], "\u200e\ud83b\ude06\u200e": [{"c": "\u200e\u0632\u200e", "n": "ARABIC LETTER ZAIN"}], "\u200e\u0632\u200e": [{"c": "\u200e\ud83b\ude06\u200e", "n": "ARABIC MATHEMATICAL ZAIN"}, {"c": "\u200e\ud83b\ude86\u200e", "n": "ARABIC MATHEMATICAL LOOPED ZAIN"}, {"c": "\u200e\ud83b\udea6\u200e", "n": "ARABIC MATHEMATICAL DOUBLE-STRUCK ZAIN"}, {"c": "\u200e\ufeb0\u200e", "n": "ARABIC LETTER ZAIN FINAL FORM"}, {"c": "\u200e\ufeaf\u200e", "n": "ARABIC LETTER ZAIN ISOLATED FORM"}], "\u200e\ud83b\ude86\u200e": [{"c": "\u200e\u0632\u200e", "n": "ARABIC LETTER ZAIN"}], "\u200e\ud83b\udea6\u200e": [{"c": "\u200e\u0632\u200e", "n": "ARABIC LETTER ZAIN"}], "\u200e\ufeb0\u200e": [{"c": "\u200e\u0632\u200e", "n": "ARABIC LETTER ZAIN"}], "\u200e\ufeaf\u200e": [{"c": "\u200e\u0632\u200e", "n": "ARABIC LETTER ZAIN"}], "\u200e\u08b2\u200e": [{"c": "\u200e\u0632\u0302\u200e", "n": "ARABIC LETTER ZAIN, COMBINING CIRCUMFLEX ACCENT"}], "\u200e\u0632\u0302\u200e": [{"c": "\u200e\u08b2\u200e", "n": "ARABIC LETTER ZAIN WITH INVERTED V ABOVE"}], "\u200e\u0771\u200e": [{"c": "\u200e\u0697\u0615\u200e", "n": "ARABIC LETTER REH WITH TWO DOTS ABOVE, ARABIC SMALL HIGH TAH"}], "\u200e\u0697\u0615\u200e": [{"c": "\u200e\u0771\u200e", "n": "ARABIC LETTER REH WITH SMALL ARABIC LETTER TAH AND TWO DOTS"}], "\u200e\ud83b\ude0e\u200e": [{"c": "\u200e\u0633\u200e", "n": "ARABIC LETTER SEEN"}], "\u200e\u0633\u200e": [{"c": "\u200e\ud83b\ude0e\u200e", "n": "ARABIC MATHEMATICAL SEEN"}, {"c": "\u200e\ud83b\ude2e\u200e", "n": "ARABIC MATHEMATICAL INITIAL SEEN"}, {"c": "\u200e\ud83b\ude4e\u200e", "n": "ARABIC MATHEMATICAL TAILED SEEN"}, {"c": "\u200e\ud83b\ude6e\u200e", "n": "ARABIC MATHEMATICAL STRETCHED SEEN"}, {"c": "\u200e\ud83b\ude8e\u200e", "n": "ARABIC MATHEMATICAL LOOPED SEEN"}, {"c": "\u200e\ud83b\udeae\u200e", "n": "ARABIC MATHEMATICAL DOUBLE-STRUCK SEEN"}, {"c": "\u200e\ufeb3\u200e", "n": "ARABIC LETTER SEEN INITIAL FORM"}, {"c": "\u200e\ufeb4\u200e", "n": "ARABIC LETTER SEEN MEDIAL FORM"}, {"c": "\u200e\ufeb2\u200e", "n": "ARABIC LETTER SEEN FINAL FORM"}, {"c": "\u200e\ufeb1\u200e", "n": "ARABIC LETTER SEEN ISOLATED FORM"}], "\u200e\ud83b\ude2e\u200e": [{"c": "\u200e\u0633\u200e", "n": "ARABIC LETTER SEEN"}], "\u200e\ud83b\ude4e\u200e": [{"c": "\u200e\u0633\u200e", "n": "ARABIC LETTER SEEN"}], "\u200e\ud83b\ude6e\u200e": [{"c": "\u200e\u0633\u200e", "n": "ARABIC LETTER SEEN"}], "\u200e\ud83b\ude8e\u200e": [{"c": "\u200e\u0633\u200e", "n": "ARABIC LETTER SEEN"}], "\u200e\ud83b\udeae\u200e": [{"c": "\u200e\u0633\u200e", "n": "ARABIC LETTER SEEN"}], "\u200e\ufeb3\u200e": [{"c": "\u200e\u0633\u200e", "n": "ARABIC LETTER SEEN"}], "\u200e\ufeb4\u200e": [{"c": "\u200e\u0633\u200e", "n": "ARABIC LETTER SEEN"}], "\u200e\ufeb2\u200e": [{"c": "\u200e\u0633\u200e", "n": "ARABIC LETTER SEEN"}], "\u200e\ufeb1\u200e": [{"c": "\u200e\u0633\u200e", "n": "ARABIC LETTER SEEN"}], "\u200e\u0634\u200e": [{"c": "\u200e\u0633\u06db\u200e", "n": "ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\u0633\u06db\u200e": [{"c": "\u200e\u0634\u200e", "n": "ARABIC LETTER SHEEN"}, {"c": "\u200e\ud83b\ude14\u200e", "n": "ARABIC MATHEMATICAL SHEEN"}, {"c": "\u200e\ud83b\ude34\u200e", "n": "ARABIC MATHEMATICAL INITIAL SHEEN"}, {"c": "\u200e\ud83b\ude54\u200e", "n": "ARABIC MATHEMATICAL TAILED SHEEN"}, {"c": "\u200e\ud83b\ude74\u200e", "n": "ARABIC MATHEMATICAL STRETCHED SHEEN"}, {"c": "\u200e\ud83b\ude94\u200e", "n": "ARABIC MATHEMATICAL LOOPED SHEEN"}, {"c": "\u200e\ud83b\udeb4\u200e", "n": "ARABIC MATHEMATICAL DOUBLE-STRUCK SHEEN"}, {"c": "\u200e\ufeb7\u200e", "n": "ARABIC LETTER SHEEN INITIAL FORM"}, {"c": "\u200e\ufeb8\u200e", "n": "ARABIC LETTER SHEEN MEDIAL FORM"}, {"c": "\u200e\ufeb6\u200e", "n": "ARABIC LETTER SHEEN FINAL FORM"}, {"c": "\u200e\ufeb5\u200e", "n": "ARABIC LETTER SHEEN ISOLATED FORM"}], "\u200e\ud83b\ude14\u200e": [{"c": "\u200e\u0633\u06db\u200e", "n": "ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\ud83b\ude34\u200e": [{"c": "\u200e\u0633\u06db\u200e", "n": "ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\ud83b\ude54\u200e": [{"c": "\u200e\u0633\u06db\u200e", "n": "ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\ud83b\ude74\u200e": [{"c": "\u200e\u0633\u06db\u200e", "n": "ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\ud83b\ude94\u200e": [{"c": "\u200e\u0633\u06db\u200e", "n": "ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\ud83b\udeb4\u200e": [{"c": "\u200e\u0633\u06db\u200e", "n": "ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\ufeb7\u200e": [{"c": "\u200e\u0633\u06db\u200e", "n": "ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\ufeb8\u200e": [{"c": "\u200e\u0633\u06db\u200e", "n": "ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\ufeb6\u200e": [{"c": "\u200e\u0633\u06db\u200e", "n": "ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\ufeb5\u200e": [{"c": "\u200e\u0633\u06db\u200e", "n": "ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\u077e\u200e": [{"c": "\u200e\u0633\u0302\u200e", "n": "ARABIC LETTER SEEN, COMBINING CIRCUMFLEX ACCENT"}], "\u200e\u0633\u0302\u200e": [{"c": "\u200e\u077e\u200e", "n": "ARABIC LETTER SEEN WITH INVERTED V"}], "\u200e\ufd31\u200e": [{"c": "\u200e\u0633o\u200e", "n": "ARABIC LETTER SEEN, LATIN SMALL LETTER O"}], "\u200e\u0633o\u200e": [{"c": "\u200e\ufd31\u200e", "n": "ARABIC LIGATURE SEEN WITH HEH INITIAL FORM"}, {"c": "\u200e\ufce8\u200e", "n": "ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM"}], "\u200e\ufce8\u200e": [{"c": "\u200e\u0633o\u200e", "n": "ARABIC LETTER SEEN, LATIN SMALL LETTER O"}], "\u200e\ufd32\u200e": [{"c": "\u200e\u0633\u06dbo\u200e", "n": "ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, LATIN SMALL LETTER O"}], "\u200e\u0633\u06dbo\u200e": [{"c": "\u200e\ufd32\u200e", "n": "ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM"}, {"c": "\u200e\ufcea\u200e", "n": "ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM"}], "\u200e\ufcea\u200e": [{"c": "\u200e\u0633\u06dbo\u200e", "n": "ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, LATIN SMALL LETTER O"}], "\u200e\ufcad\u200e": [{"c": "\u200e\u0633\u062c\u200e", "n": "ARABIC LETTER SEEN, ARABIC LETTER JEEM"}], "\u200e\u0633\u062c\u200e": [{"c": "\u200e\ufcad\u200e", "n": "ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM"}, {"c": "\u200e\ufd34\u200e", "n": "ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM"}, {"c": "\u200e\ufc1c\u200e", "n": "ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM"}], "\u200e\ufd34\u200e": [{"c": "\u200e\u0633\u062c\u200e", "n": "ARABIC LETTER SEEN, ARABIC LETTER JEEM"}], "\u200e\ufc1c\u200e": [{"c": "\u200e\u0633\u062c\u200e", "n": "ARABIC LETTER SEEN, ARABIC LETTER JEEM"}], "\u200e\ufd2d\u200e": [{"c": "\u200e\u0633\u06db\u062c\u200e", "n": "ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER JEEM"}], "\u200e\u0633\u06db\u062c\u200e": [{"c": "\u200e\ufd2d\u200e", "n": "ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM"}, {"c": "\u200e\ufd37\u200e", "n": "ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM"}, {"c": "\u200e\ufd25\u200e", "n": "ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM"}, {"c": "\u200e\ufd09\u200e", "n": "ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM"}], "\u200e\ufd37\u200e": [{"c": "\u200e\u0633\u06db\u062c\u200e", "n": "ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER JEEM"}], "\u200e\ufd25\u200e": [{"c": "\u200e\u0633\u06db\u062c\u200e", "n": "ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER JEEM"}], "\u200e\ufd09\u200e": [{"c": "\u200e\u0633\u06db\u062c\u200e", "n": "ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER JEEM"}], "\u200e\ufd5d\u200e": [{"c": "\u200e\u0633\u062c\u062d\u200e", "n": "ARABIC LETTER SEEN, ARABIC LETTER JEEM, ARABIC LETTER HAH"}], "\u200e\u0633\u062c\u062d\u200e": [{"c": "\u200e\ufd5d\u200e", "n": "ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM"}], "\u200e\ufd5e\u200e": [{"c": "\u200e\u0633\u062c\u0649\u200e", "n": "ARABIC LETTER SEEN, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u0633\u062c\u0649\u200e": [{"c": "\u200e\ufd5e\u200e", "n": "ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM"}], "\u200e\ufd69\u200e": [{"c": "\u200e\u0633\u06db\u062c\u0649\u200e", "n": "ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u0633\u06db\u062c\u0649\u200e": [{"c": "\u200e\ufd69\u200e", "n": "ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM"}], "\u200e\ufcae\u200e": [{"c": "\u200e\u0633\u062d\u200e", "n": "ARABIC LETTER SEEN, ARABIC LETTER HAH"}], "\u200e\u0633\u062d\u200e": [{"c": "\u200e\ufcae\u200e", "n": "ARABIC LIGATURE SEEN WITH HAH INITIAL FORM"}, {"c": "\u200e\ufd35\u200e", "n": "ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM"}, {"c": "\u200e\ufc1d\u200e", "n": "ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM"}], "\u200e\ufd35\u200e": [{"c": "\u200e\u0633\u062d\u200e", "n": "ARABIC LETTER SEEN, ARABIC LETTER HAH"}], "\u200e\ufc1d\u200e": [{"c": "\u200e\u0633\u062d\u200e", "n": "ARABIC LETTER SEEN, ARABIC LETTER HAH"}], "\u200e\ufd2e\u200e": [{"c": "\u200e\u0633\u06db\u062d\u200e", "n": "ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER HAH"}], "\u200e\u0633\u06db\u062d\u200e": [{"c": "\u200e\ufd2e\u200e", "n": "ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM"}, {"c": "\u200e\ufd38\u200e", "n": "ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM"}, {"c": "\u200e\ufd26\u200e", "n": "ARABIC LIGATURE SHEEN WITH HAH FINAL FORM"}, {"c": "\u200e\ufd0a\u200e", "n": "ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM"}], "\u200e\ufd38\u200e": [{"c": "\u200e\u0633\u06db\u062d\u200e", "n": "ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER HAH"}], "\u200e\ufd26\u200e": [{"c": "\u200e\u0633\u06db\u062d\u200e", "n": "ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER HAH"}], "\u200e\ufd0a\u200e": [{"c": "\u200e\u0633\u06db\u062d\u200e", "n": "ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER HAH"}], "\u200e\ufd5c\u200e": [{"c": "\u200e\u0633\u062d\u062c\u200e", "n": "ARABIC LETTER SEEN, ARABIC LETTER HAH, ARABIC LETTER JEEM"}], "\u200e\u0633\u062d\u062c\u200e": [{"c": "\u200e\ufd5c\u200e", "n": "ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM"}], "\u200e\ufd68\u200e": [{"c": "\u200e\u0633\u06db\u062d\u0645\u200e", "n": "ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER HAH, ARABIC LETTER MEEM"}], "\u200e\u0633\u06db\u062d\u0645\u200e": [{"c": "\u200e\ufd68\u200e", "n": "ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM"}, {"c": "\u200e\ufd67\u200e", "n": "ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM"}], "\u200e\ufd67\u200e": [{"c": "\u200e\u0633\u06db\u062d\u0645\u200e", "n": "ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER HAH, ARABIC LETTER MEEM"}], "\u200e\ufdaa\u200e": [{"c": "\u200e\u0633\u06db\u062d\u0649\u200e", "n": "ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u0633\u06db\u062d\u0649\u200e": [{"c": "\u200e\ufdaa\u200e", "n": "ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM"}], "\u200e\ufcaf\u200e": [{"c": "\u200e\u0633\u062e\u200e", "n": "ARABIC LETTER SEEN, ARABIC LETTER KHAH"}], "\u200e\u0633\u062e\u200e": [{"c": "\u200e\ufcaf\u200e", "n": "ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM"}, {"c": "\u200e\ufd36\u200e", "n": "ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM"}, {"c": "\u200e\ufc1e\u200e", "n": "ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM"}], "\u200e\ufd36\u200e": [{"c": "\u200e\u0633\u062e\u200e", "n": "ARABIC LETTER SEEN, ARABIC LETTER KHAH"}], "\u200e\ufc1e\u200e": [{"c": "\u200e\u0633\u062e\u200e", "n": "ARABIC LETTER SEEN, ARABIC LETTER KHAH"}], "\u200e\ufd2f\u200e": [{"c": "\u200e\u0633\u06db\u062e\u200e", "n": "ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER KHAH"}], "\u200e\u0633\u06db\u062e\u200e": [{"c": "\u200e\ufd2f\u200e", "n": "ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM"}, {"c": "\u200e\ufd39\u200e", "n": "ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM"}, {"c": "\u200e\ufd27\u200e", "n": "ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM"}, {"c": "\u200e\ufd0b\u200e", "n": "ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM"}], "\u200e\ufd39\u200e": [{"c": "\u200e\u0633\u06db\u062e\u200e", "n": "ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER KHAH"}], "\u200e\ufd27\u200e": [{"c": "\u200e\u0633\u06db\u062e\u200e", "n": "ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER KHAH"}], "\u200e\ufd0b\u200e": [{"c": "\u200e\u0633\u06db\u062e\u200e", "n": "ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER KHAH"}], "\u200e\ufda8\u200e": [{"c": "\u200e\u0633\u062e\u0649\u200e", "n": "ARABIC LETTER SEEN, ARABIC LETTER KHAH, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u0633\u062e\u0649\u200e": [{"c": "\u200e\ufda8\u200e", "n": "ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM"}, {"c": "\u200e\ufdc6\u200e", "n": "ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM"}], "\u200e\ufdc6\u200e": [{"c": "\u200e\u0633\u062e\u0649\u200e", "n": "ARABIC LETTER SEEN, ARABIC LETTER KHAH, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufd2a\u200e": [{"c": "\u200e\u0633\u0631\u200e", "n": "ARABIC LETTER SEEN, ARABIC LETTER REH"}], "\u200e\u0633\u0631\u200e": [{"c": "\u200e\ufd2a\u200e", "n": "ARABIC LIGATURE SEEN WITH REH FINAL FORM"}, {"c": "\u200e\ufd0e\u200e", "n": "ARABIC LIGATURE SEEN WITH REH ISOLATED FORM"}], "\u200e\ufd0e\u200e": [{"c": "\u200e\u0633\u0631\u200e", "n": "ARABIC LETTER SEEN, ARABIC LETTER REH"}], "\u200e\ufd29\u200e": [{"c": "\u200e\u0633\u06db\u0631\u200e", "n": "ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER REH"}], "\u200e\u0633\u06db\u0631\u200e": [{"c": "\u200e\ufd29\u200e", "n": "ARABIC LIGATURE SHEEN WITH REH FINAL FORM"}, {"c": "\u200e\ufd0d\u200e", "n": "ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM"}], "\u200e\ufd0d\u200e": [{"c": "\u200e\u0633\u06db\u0631\u200e", "n": "ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER REH"}], "\u200e\ufcb0\u200e": [{"c": "\u200e\u0633\u0645\u200e", "n": "ARABIC LETTER SEEN, ARABIC LETTER MEEM"}], "\u200e\u0633\u0645\u200e": [{"c": "\u200e\ufcb0\u200e", "n": "ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM"}, {"c": "\u200e\ufce7\u200e", "n": "ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM"}, {"c": "\u200e\ufc1f\u200e", "n": "ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM"}], "\u200e\ufce7\u200e": [{"c": "\u200e\u0633\u0645\u200e", "n": "ARABIC LETTER SEEN, ARABIC LETTER MEEM"}], "\u200e\ufc1f\u200e": [{"c": "\u200e\u0633\u0645\u200e", "n": "ARABIC LETTER SEEN, ARABIC LETTER MEEM"}], "\u200e\ufd30\u200e": [{"c": "\u200e\u0633\u06db\u0645\u200e", "n": "ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER MEEM"}], "\u200e\u0633\u06db\u0645\u200e": [{"c": "\u200e\ufd30\u200e", "n": "ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM"}, {"c": "\u200e\ufce9\u200e", "n": "ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM"}, {"c": "\u200e\ufd28\u200e", "n": "ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM"}, {"c": "\u200e\ufd0c\u200e", "n": "ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM"}], "\u200e\ufce9\u200e": [{"c": "\u200e\u0633\u06db\u0645\u200e", "n": "ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER MEEM"}], "\u200e\ufd28\u200e": [{"c": "\u200e\u0633\u06db\u0645\u200e", "n": "ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER MEEM"}], "\u200e\ufd0c\u200e": [{"c": "\u200e\u0633\u06db\u0645\u200e", "n": "ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER MEEM"}], "\u200e\ufd61\u200e": [{"c": "\u200e\u0633\u0645\u062c\u200e", "n": "ARABIC LETTER SEEN, ARABIC LETTER MEEM, ARABIC LETTER JEEM"}], "\u200e\u0633\u0645\u062c\u200e": [{"c": "\u200e\ufd61\u200e", "n": "ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM"}], "\u200e\ufd60\u200e": [{"c": "\u200e\u0633\u0645\u062d\u200e", "n": "ARABIC LETTER SEEN, ARABIC LETTER MEEM, ARABIC LETTER HAH"}], "\u200e\u0633\u0645\u062d\u200e": [{"c": "\u200e\ufd60\u200e", "n": "ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM"}, {"c": "\u200e\ufd5f\u200e", "n": "ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM"}], "\u200e\ufd5f\u200e": [{"c": "\u200e\u0633\u0645\u062d\u200e", "n": "ARABIC LETTER SEEN, ARABIC LETTER MEEM, ARABIC LETTER HAH"}], "\u200e\ufd6b\u200e": [{"c": "\u200e\u0633\u06db\u0645\u062e\u200e", "n": "ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER MEEM, ARABIC LETTER KHAH"}], "\u200e\u0633\u06db\u0645\u062e\u200e": [{"c": "\u200e\ufd6b\u200e", "n": "ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM"}, {"c": "\u200e\ufd6a\u200e", "n": "ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM"}], "\u200e\ufd6a\u200e": [{"c": "\u200e\u0633\u06db\u0645\u062e\u200e", "n": "ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER MEEM, ARABIC LETTER KHAH"}], "\u200e\ufd63\u200e": [{"c": "\u200e\u0633\u0645\u0645\u200e", "n": "ARABIC LETTER SEEN, ARABIC LETTER MEEM, ARABIC LETTER MEEM"}], "\u200e\u0633\u0645\u0645\u200e": [{"c": "\u200e\ufd63\u200e", "n": "ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM"}, {"c": "\u200e\ufd62\u200e", "n": "ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM"}], "\u200e\ufd62\u200e": [{"c": "\u200e\u0633\u0645\u0645\u200e", "n": "ARABIC LETTER SEEN, ARABIC LETTER MEEM, ARABIC LETTER MEEM"}], "\u200e\ufd6d\u200e": [{"c": "\u200e\u0633\u06db\u0645\u0645\u200e", "n": "ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER MEEM, ARABIC LETTER MEEM"}], "\u200e\u0633\u06db\u0645\u0645\u200e": [{"c": "\u200e\ufd6d\u200e", "n": "ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM"}, {"c": "\u200e\ufd6c\u200e", "n": "ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM"}], "\u200e\ufd6c\u200e": [{"c": "\u200e\u0633\u06db\u0645\u0645\u200e", "n": "ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER MEEM, ARABIC LETTER MEEM"}], "\u200e\ufd17\u200e": [{"c": "\u200e\u0633\u0649\u200e", "n": "ARABIC LETTER SEEN, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u0633\u0649\u200e": [{"c": "\u200e\ufd17\u200e", "n": "ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM"}, {"c": "\u200e\ufcfb\u200e", "n": "ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM"}, {"c": "\u200e\ufd18\u200e", "n": "ARABIC LIGATURE SEEN WITH YEH FINAL FORM"}, {"c": "\u200e\ufcfc\u200e", "n": "ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM"}], "\u200e\ufcfb\u200e": [{"c": "\u200e\u0633\u0649\u200e", "n": "ARABIC LETTER SEEN, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufd18\u200e": [{"c": "\u200e\u0633\u0649\u200e", "n": "ARABIC LETTER SEEN, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufcfc\u200e": [{"c": "\u200e\u0633\u0649\u200e", "n": "ARABIC LETTER SEEN, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufd19\u200e": [{"c": "\u200e\u0633\u06db\u0649\u200e", "n": "ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u0633\u06db\u0649\u200e": [{"c": "\u200e\ufd19\u200e", "n": "ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM"}, {"c": "\u200e\ufcfd\u200e", "n": "ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM"}, {"c": "\u200e\ufd1a\u200e", "n": "ARABIC LIGATURE SHEEN WITH YEH FINAL FORM"}, {"c": "\u200e\ufcfe\u200e", "n": "ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM"}], "\u200e\ufcfd\u200e": [{"c": "\u200e\u0633\u06db\u0649\u200e", "n": "ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufd1a\u200e": [{"c": "\u200e\u0633\u06db\u0649\u200e", "n": "ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufcfe\u200e": [{"c": "\u200e\u0633\u06db\u0649\u200e", "n": "ARABIC LETTER SEEN, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER ALEF MAKSURA"}], "\ud800\udef2": [{"c": "\u200e\u0635\u200e", "n": "ARABIC LETTER SAD"}], "\u200e\u0635\u200e": [{"c": "\ud800\udef2", "n": "COPTIC EPACT NUMBER NINETY"}, {"c": "\u200e\ud83b\ude11\u200e", "n": "ARABIC MATHEMATICAL SAD"}, {"c": "\u200e\ud83b\ude31\u200e", "n": "ARABIC MATHEMATICAL INITIAL SAD"}, {"c": "\u200e\ud83b\ude51\u200e", "n": "ARABIC MATHEMATICAL TAILED SAD"}, {"c": "\u200e\ud83b\ude71\u200e", "n": "ARABIC MATHEMATICAL STRETCHED SAD"}, {"c": "\u200e\ud83b\ude91\u200e", "n": "ARABIC MATHEMATICAL LOOPED SAD"}, {"c": "\u200e\ud83b\udeb1\u200e", "n": "ARABIC MATHEMATICAL DOUBLE-STRUCK SAD"}, {"c": "\u200e\ufebb\u200e", "n": "ARABIC LETTER SAD INITIAL FORM"}, {"c": "\u200e\ufebc\u200e", "n": "ARABIC LETTER SAD MEDIAL FORM"}, {"c": "\u200e\ufeba\u200e", "n": "ARABIC LETTER SAD FINAL FORM"}, {"c": "\u200e\ufeb9\u200e", "n": "ARABIC LETTER SAD ISOLATED FORM"}], "\u200e\ud83b\ude11\u200e": [{"c": "\u200e\u0635\u200e", "n": "ARABIC LETTER SAD"}], "\u200e\ud83b\ude31\u200e": [{"c": "\u200e\u0635\u200e", "n": "ARABIC LETTER SAD"}], "\u200e\ud83b\ude51\u200e": [{"c": "\u200e\u0635\u200e", "n": "ARABIC LETTER SAD"}], "\u200e\ud83b\ude71\u200e": [{"c": "\u200e\u0635\u200e", "n": "ARABIC LETTER SAD"}], "\u200e\ud83b\ude91\u200e": [{"c": "\u200e\u0635\u200e", "n": "ARABIC LETTER SAD"}], "\u200e\ud83b\udeb1\u200e": [{"c": "\u200e\u0635\u200e", "n": "ARABIC LETTER SAD"}], "\u200e\ufebb\u200e": [{"c": "\u200e\u0635\u200e", "n": "ARABIC LETTER SAD"}], "\u200e\ufebc\u200e": [{"c": "\u200e\u0635\u200e", "n": "ARABIC LETTER SAD"}], "\u200e\ufeba\u200e": [{"c": "\u200e\u0635\u200e", "n": "ARABIC LETTER SAD"}], "\u200e\ufeb9\u200e": [{"c": "\u200e\u0635\u200e", "n": "ARABIC LETTER SAD"}], "\u200e\u069e\u200e": [{"c": "\u200e\u0635\u06db\u200e", "n": "ARABIC LETTER SAD, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\u0635\u06db\u200e": [{"c": "\u200e\u069e\u200e", "n": "ARABIC LETTER SAD WITH THREE DOTS ABOVE"}], "\u200e\u08af\u200e": [{"c": "\u200e\u0635\u0324\u0323\u200e", "n": "ARABIC LETTER SAD, COMBINING DIAERESIS BELOW, COMBINING DOT BELOW"}], "\u200e\u0635\u0324\u0323\u200e": [{"c": "\u200e\u08af\u200e", "n": "ARABIC LETTER SAD WITH THREE DOTS BELOW"}], "\u200e\ufcb1\u200e": [{"c": "\u200e\u0635\u062d\u200e", "n": "ARABIC LETTER SAD, ARABIC LETTER HAH"}], "\u200e\u0635\u062d\u200e": [{"c": "\u200e\ufcb1\u200e", "n": "ARABIC LIGATURE SAD WITH HAH INITIAL FORM"}, {"c": "\u200e\ufc20\u200e", "n": "ARABIC LIGATURE SAD WITH HAH ISOLATED FORM"}], "\u200e\ufc20\u200e": [{"c": "\u200e\u0635\u062d\u200e", "n": "ARABIC LETTER SAD, ARABIC LETTER HAH"}], "\u200e\ufd65\u200e": [{"c": "\u200e\u0635\u062d\u062d\u200e", "n": "ARABIC LETTER SAD, ARABIC LETTER HAH, ARABIC LETTER HAH"}], "\u200e\u0635\u062d\u062d\u200e": [{"c": "\u200e\ufd65\u200e", "n": "ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM"}, {"c": "\u200e\ufd64\u200e", "n": "ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM"}], "\u200e\ufd64\u200e": [{"c": "\u200e\u0635\u062d\u062d\u200e", "n": "ARABIC LETTER SAD, ARABIC LETTER HAH, ARABIC LETTER HAH"}], "\u200e\ufda9\u200e": [{"c": "\u200e\u0635\u062d\u0649\u200e", "n": "ARABIC LETTER SAD, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u0635\u062d\u0649\u200e": [{"c": "\u200e\ufda9\u200e", "n": "ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM"}], "\u200e\ufcb2\u200e": [{"c": "\u200e\u0635\u062e\u200e", "n": "ARABIC LETTER SAD, ARABIC LETTER KHAH"}], "\u200e\u0635\u062e\u200e": [{"c": "\u200e\ufcb2\u200e", "n": "ARABIC LIGATURE SAD WITH KHAH INITIAL FORM"}], "\u200e\ufd2b\u200e": [{"c": "\u200e\u0635\u0631\u200e", "n": "ARABIC LETTER SAD, ARABIC LETTER REH"}], "\u200e\u0635\u0631\u200e": [{"c": "\u200e\ufd2b\u200e", "n": "ARABIC LIGATURE SAD WITH REH FINAL FORM"}, {"c": "\u200e\ufd0f\u200e", "n": "ARABIC LIGATURE SAD WITH REH ISOLATED FORM"}], "\u200e\ufd0f\u200e": [{"c": "\u200e\u0635\u0631\u200e", "n": "ARABIC LETTER SAD, ARABIC LETTER REH"}], "\u200e\ufdf5\u200e": [{"c": "\u200e\u0635\u0644\u0639\u0645\u200e", "n": "ARABIC LETTER SAD, ARABIC LETTER LAM, ARABIC LETTER AIN, ARABIC LETTER MEEM"}], "\u200e\u0635\u0644\u0639\u0645\u200e": [{"c": "\u200e\ufdf5\u200e", "n": "ARABIC LIGATURE SALAM ISOLATED FORM"}], "\u200e\ufdf9\u200e": [{"c": "\u200e\u0635\u0644\u0649\u200e", "n": "ARABIC LETTER SAD, ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u0635\u0644\u0649\u200e": [{"c": "\u200e\ufdf9\u200e", "n": "ARABIC LIGATURE SALLA ISOLATED FORM"}, {"c": "\u200e\ufdf0\u200e", "n": "ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM"}], "\u200e\ufdf0\u200e": [{"c": "\u200e\u0635\u0644\u0649\u200e", "n": "ARABIC LETTER SAD, ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufdfa\u200e": [{"c": "\u200e\u0635\u0644\u0649 l\u0644\u0644o \u0639\u0644\u0649o \u0648\u0633\u0644\u0645\u200e", "n": "ARABIC LETTER SAD, ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA, SPACE, LATIN SMALL LETTER L, ARABIC LETTER LAM, ARABIC LETTER LAM, LATIN SMALL LETTER O, SPACE, ARABIC LETTER AIN, ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA, LATIN SMALL LETTER O, SPACE, ARABIC LETTER WAW, ARABIC LETTER SEEN, ARABIC LETTER LAM, ARABIC LETTER MEEM"}], "\u200e\u0635\u0644\u0649 l\u0644\u0644o \u0639\u0644\u0649o \u0648\u0633\u0644\u0645\u200e": [{"c": "\u200e\ufdfa\u200e", "n": "ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM"}], "\u200e\ufcb3\u200e": [{"c": "\u200e\u0635\u0645\u200e", "n": "ARABIC LETTER SAD, ARABIC LETTER MEEM"}], "\u200e\u0635\u0645\u200e": [{"c": "\u200e\ufcb3\u200e", "n": "ARABIC LIGATURE SAD WITH MEEM INITIAL FORM"}, {"c": "\u200e\ufc21\u200e", "n": "ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM"}], "\u200e\ufc21\u200e": [{"c": "\u200e\u0635\u0645\u200e", "n": "ARABIC LETTER SAD, ARABIC LETTER MEEM"}], "\u200e\ufdc5\u200e": [{"c": "\u200e\u0635\u0645\u0645\u200e", "n": "ARABIC LETTER SAD, ARABIC LETTER MEEM, ARABIC LETTER MEEM"}], "\u200e\u0635\u0645\u0645\u200e": [{"c": "\u200e\ufdc5\u200e", "n": "ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM"}, {"c": "\u200e\ufd66\u200e", "n": "ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM"}], "\u200e\ufd66\u200e": [{"c": "\u200e\u0635\u0645\u0645\u200e", "n": "ARABIC LETTER SAD, ARABIC LETTER MEEM, ARABIC LETTER MEEM"}], "\u200e\ufd21\u200e": [{"c": "\u200e\u0635\u0649\u200e", "n": "ARABIC LETTER SAD, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u0635\u0649\u200e": [{"c": "\u200e\ufd21\u200e", "n": "ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM"}, {"c": "\u200e\ufd05\u200e", "n": "ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM"}, {"c": "\u200e\ufd22\u200e", "n": "ARABIC LIGATURE SAD WITH YEH FINAL FORM"}, {"c": "\u200e\ufd06\u200e", "n": "ARABIC LIGATURE SAD WITH YEH ISOLATED FORM"}], "\u200e\ufd05\u200e": [{"c": "\u200e\u0635\u0649\u200e", "n": "ARABIC LETTER SAD, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufd22\u200e": [{"c": "\u200e\u0635\u0649\u200e", "n": "ARABIC LETTER SAD, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufd06\u200e": [{"c": "\u200e\u0635\u0649\u200e", "n": "ARABIC LETTER SAD, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ud83b\ude19\u200e": [{"c": "\u200e\u0636\u200e", "n": "ARABIC LETTER DAD"}], "\u200e\u0636\u200e": [{"c": "\u200e\ud83b\ude19\u200e", "n": "ARABIC MATHEMATICAL DAD"}, {"c": "\u200e\ud83b\ude39\u200e", "n": "ARABIC MATHEMATICAL INITIAL DAD"}, {"c": "\u200e\ud83b\ude59\u200e", "n": "ARABIC MATHEMATICAL TAILED DAD"}, {"c": "\u200e\ud83b\ude79\u200e", "n": "ARABIC MATHEMATICAL STRETCHED DAD"}, {"c": "\u200e\ud83b\ude99\u200e", "n": "ARABIC MATHEMATICAL LOOPED DAD"}, {"c": "\u200e\ud83b\udeb9\u200e", "n": "ARABIC MATHEMATICAL DOUBLE-STRUCK DAD"}, {"c": "\u200e\ufebf\u200e", "n": "ARABIC LETTER DAD INITIAL FORM"}, {"c": "\u200e\ufec0\u200e", "n": "ARABIC LETTER DAD MEDIAL FORM"}, {"c": "\u200e\ufebe\u200e", "n": "ARABIC LETTER DAD FINAL FORM"}, {"c": "\u200e\ufebd\u200e", "n": "ARABIC LETTER DAD ISOLATED FORM"}], "\u200e\ud83b\ude39\u200e": [{"c": "\u200e\u0636\u200e", "n": "ARABIC LETTER DAD"}], "\u200e\ud83b\ude59\u200e": [{"c": "\u200e\u0636\u200e", "n": "ARABIC LETTER DAD"}], "\u200e\ud83b\ude79\u200e": [{"c": "\u200e\u0636\u200e", "n": "ARABIC LETTER DAD"}], "\u200e\ud83b\ude99\u200e": [{"c": "\u200e\u0636\u200e", "n": "ARABIC LETTER DAD"}], "\u200e\ud83b\udeb9\u200e": [{"c": "\u200e\u0636\u200e", "n": "ARABIC LETTER DAD"}], "\u200e\ufebf\u200e": [{"c": "\u200e\u0636\u200e", "n": "ARABIC LETTER DAD"}], "\u200e\ufec0\u200e": [{"c": "\u200e\u0636\u200e", "n": "ARABIC LETTER DAD"}], "\u200e\ufebe\u200e": [{"c": "\u200e\u0636\u200e", "n": "ARABIC LETTER DAD"}], "\u200e\ufebd\u200e": [{"c": "\u200e\u0636\u200e", "n": "ARABIC LETTER DAD"}], "\u200e\ufcb4\u200e": [{"c": "\u200e\u0636\u062c\u200e", "n": "ARABIC LETTER DAD, ARABIC LETTER JEEM"}], "\u200e\u0636\u062c\u200e": [{"c": "\u200e\ufcb4\u200e", "n": "ARABIC LIGATURE DAD WITH JEEM INITIAL FORM"}, {"c": "\u200e\ufc22\u200e", "n": "ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM"}], "\u200e\ufc22\u200e": [{"c": "\u200e\u0636\u062c\u200e", "n": "ARABIC LETTER DAD, ARABIC LETTER JEEM"}], "\u200e\ufcb5\u200e": [{"c": "\u200e\u0636\u062d\u200e", "n": "ARABIC LETTER DAD, ARABIC LETTER HAH"}], "\u200e\u0636\u062d\u200e": [{"c": "\u200e\ufcb5\u200e", "n": "ARABIC LIGATURE DAD WITH HAH INITIAL FORM"}, {"c": "\u200e\ufc23\u200e", "n": "ARABIC LIGATURE DAD WITH HAH ISOLATED FORM"}], "\u200e\ufc23\u200e": [{"c": "\u200e\u0636\u062d\u200e", "n": "ARABIC LETTER DAD, ARABIC LETTER HAH"}], "\u200e\ufd6e\u200e": [{"c": "\u200e\u0636\u062d\u0649\u200e", "n": "ARABIC LETTER DAD, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u0636\u062d\u0649\u200e": [{"c": "\u200e\ufd6e\u200e", "n": "ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM"}, {"c": "\u200e\ufdab\u200e", "n": "ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM"}], "\u200e\ufdab\u200e": [{"c": "\u200e\u0636\u062d\u0649\u200e", "n": "ARABIC LETTER DAD, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufcb6\u200e": [{"c": "\u200e\u0636\u062e\u200e", "n": "ARABIC LETTER DAD, ARABIC LETTER KHAH"}], "\u200e\u0636\u062e\u200e": [{"c": "\u200e\ufcb6\u200e", "n": "ARABIC LIGATURE DAD WITH KHAH INITIAL FORM"}, {"c": "\u200e\ufc24\u200e", "n": "ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM"}], "\u200e\ufc24\u200e": [{"c": "\u200e\u0636\u062e\u200e", "n": "ARABIC LETTER DAD, ARABIC LETTER KHAH"}], "\u200e\ufd70\u200e": [{"c": "\u200e\u0636\u062e\u0645\u200e", "n": "ARABIC LETTER DAD, ARABIC LETTER KHAH, ARABIC LETTER MEEM"}], "\u200e\u0636\u062e\u0645\u200e": [{"c": "\u200e\ufd70\u200e", "n": "ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM"}, {"c": "\u200e\ufd6f\u200e", "n": "ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM"}], "\u200e\ufd6f\u200e": [{"c": "\u200e\u0636\u062e\u0645\u200e", "n": "ARABIC LETTER DAD, ARABIC LETTER KHAH, ARABIC LETTER MEEM"}], "\u200e\ufd2c\u200e": [{"c": "\u200e\u0636\u0631\u200e", "n": "ARABIC LETTER DAD, ARABIC LETTER REH"}], "\u200e\u0636\u0631\u200e": [{"c": "\u200e\ufd2c\u200e", "n": "ARABIC LIGATURE DAD WITH REH FINAL FORM"}, {"c": "\u200e\ufd10\u200e", "n": "ARABIC LIGATURE DAD WITH REH ISOLATED FORM"}], "\u200e\ufd10\u200e": [{"c": "\u200e\u0636\u0631\u200e", "n": "ARABIC LETTER DAD, ARABIC LETTER REH"}], "\u200e\ufcb7\u200e": [{"c": "\u200e\u0636\u0645\u200e", "n": "ARABIC LETTER DAD, ARABIC LETTER MEEM"}], "\u200e\u0636\u0645\u200e": [{"c": "\u200e\ufcb7\u200e", "n": "ARABIC LIGATURE DAD WITH MEEM INITIAL FORM"}, {"c": "\u200e\ufc25\u200e", "n": "ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM"}], "\u200e\ufc25\u200e": [{"c": "\u200e\u0636\u0645\u200e", "n": "ARABIC LETTER DAD, ARABIC LETTER MEEM"}], "\u200e\ufd23\u200e": [{"c": "\u200e\u0636\u0649\u200e", "n": "ARABIC LETTER DAD, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u0636\u0649\u200e": [{"c": "\u200e\ufd23\u200e", "n": "ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM"}, {"c": "\u200e\ufd07\u200e", "n": "ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM"}, {"c": "\u200e\ufd24\u200e", "n": "ARABIC LIGATURE DAD WITH YEH FINAL FORM"}, {"c": "\u200e\ufd08\u200e", "n": "ARABIC LIGATURE DAD WITH YEH ISOLATED FORM"}], "\u200e\ufd07\u200e": [{"c": "\u200e\u0636\u0649\u200e", "n": "ARABIC LETTER DAD, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufd24\u200e": [{"c": "\u200e\u0636\u0649\u200e", "n": "ARABIC LETTER DAD, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufd08\u200e": [{"c": "\u200e\u0636\u0649\u200e", "n": "ARABIC LETTER DAD, ARABIC LETTER ALEF MAKSURA"}], "\ud800\udee8": [{"c": "\u200e\u0637\u200e", "n": "ARABIC LETTER TAH"}], "\u200e\u0637\u200e": [{"c": "\ud800\udee8", "n": "COPTIC EPACT DIGIT EIGHT"}, {"c": "\u200e\ud83b\ude08\u200e", "n": "ARABIC MATHEMATICAL TAH"}, {"c": "\u200e\ud83b\ude68\u200e", "n": "ARABIC MATHEMATICAL STRETCHED TAH"}, {"c": "\u200e\ud83b\ude88\u200e", "n": "ARABIC MATHEMATICAL LOOPED TAH"}, {"c": "\u200e\ud83b\udea8\u200e", "n": "ARABIC MATHEMATICAL DOUBLE-STRUCK TAH"}, {"c": "\u200e\ufec3\u200e", "n": "ARABIC LETTER TAH INITIAL FORM"}, {"c": "\u200e\ufec4\u200e", "n": "ARABIC LETTER TAH MEDIAL FORM"}, {"c": "\u200e\ufec2\u200e", "n": "ARABIC LETTER TAH FINAL FORM"}, {"c": "\u200e\ufec1\u200e", "n": "ARABIC LETTER TAH ISOLATED FORM"}], "\u200e\ud83b\ude08\u200e": [{"c": "\u200e\u0637\u200e", "n": "ARABIC LETTER TAH"}], "\u200e\ud83b\ude68\u200e": [{"c": "\u200e\u0637\u200e", "n": "ARABIC LETTER TAH"}], "\u200e\ud83b\ude88\u200e": [{"c": "\u200e\u0637\u200e", "n": "ARABIC LETTER TAH"}], "\u200e\ud83b\udea8\u200e": [{"c": "\u200e\u0637\u200e", "n": "ARABIC LETTER TAH"}], "\u200e\ufec3\u200e": [{"c": "\u200e\u0637\u200e", "n": "ARABIC LETTER TAH"}], "\u200e\ufec4\u200e": [{"c": "\u200e\u0637\u200e", "n": "ARABIC LETTER TAH"}], "\u200e\ufec2\u200e": [{"c": "\u200e\u0637\u200e", "n": "ARABIC LETTER TAH"}], "\u200e\ufec1\u200e": [{"c": "\u200e\u0637\u200e", "n": "ARABIC LETTER TAH"}], "\u200e\u069f\u200e": [{"c": "\u200e\u0637\u06db\u200e", "n": "ARABIC LETTER TAH, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\u0637\u06db\u200e": [{"c": "\u200e\u069f\u200e", "n": "ARABIC LETTER TAH WITH THREE DOTS ABOVE"}], "\u200e\ufcb8\u200e": [{"c": "\u200e\u0637\u062d\u200e", "n": "ARABIC LETTER TAH, ARABIC LETTER HAH"}], "\u200e\u0637\u062d\u200e": [{"c": "\u200e\ufcb8\u200e", "n": "ARABIC LIGATURE TAH WITH HAH INITIAL FORM"}, {"c": "\u200e\ufc26\u200e", "n": "ARABIC LIGATURE TAH WITH HAH ISOLATED FORM"}], "\u200e\ufc26\u200e": [{"c": "\u200e\u0637\u062d\u200e", "n": "ARABIC LETTER TAH, ARABIC LETTER HAH"}], "\u200e\ufd33\u200e": [{"c": "\u200e\u0637\u0645\u200e", "n": "ARABIC LETTER TAH, ARABIC LETTER MEEM"}], "\u200e\u0637\u0645\u200e": [{"c": "\u200e\ufd33\u200e", "n": "ARABIC LIGATURE TAH WITH MEEM INITIAL FORM"}, {"c": "\u200e\ufd3a\u200e", "n": "ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM"}, {"c": "\u200e\ufc27\u200e", "n": "ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM"}], "\u200e\ufd3a\u200e": [{"c": "\u200e\u0637\u0645\u200e", "n": "ARABIC LETTER TAH, ARABIC LETTER MEEM"}], "\u200e\ufc27\u200e": [{"c": "\u200e\u0637\u0645\u200e", "n": "ARABIC LETTER TAH, ARABIC LETTER MEEM"}], "\u200e\ufd72\u200e": [{"c": "\u200e\u0637\u0645\u062d\u200e", "n": "ARABIC LETTER TAH, ARABIC LETTER MEEM, ARABIC LETTER HAH"}], "\u200e\u0637\u0645\u062d\u200e": [{"c": "\u200e\ufd72\u200e", "n": "ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM"}, {"c": "\u200e\ufd71\u200e", "n": "ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM"}], "\u200e\ufd71\u200e": [{"c": "\u200e\u0637\u0645\u062d\u200e", "n": "ARABIC LETTER TAH, ARABIC LETTER MEEM, ARABIC LETTER HAH"}], "\u200e\ufd73\u200e": [{"c": "\u200e\u0637\u0645\u0645\u200e", "n": "ARABIC LETTER TAH, ARABIC LETTER MEEM, ARABIC LETTER MEEM"}], "\u200e\u0637\u0645\u0645\u200e": [{"c": "\u200e\ufd73\u200e", "n": "ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM"}], "\u200e\ufd74\u200e": [{"c": "\u200e\u0637\u0645\u0649\u200e", "n": "ARABIC LETTER TAH, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u0637\u0645\u0649\u200e": [{"c": "\u200e\ufd74\u200e", "n": "ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM"}], "\u200e\ufd11\u200e": [{"c": "\u200e\u0637\u0649\u200e", "n": "ARABIC LETTER TAH, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u0637\u0649\u200e": [{"c": "\u200e\ufd11\u200e", "n": "ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM"}, {"c": "\u200e\ufcf5\u200e", "n": "ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM"}, {"c": "\u200e\ufd12\u200e", "n": "ARABIC LIGATURE TAH WITH YEH FINAL FORM"}, {"c": "\u200e\ufcf6\u200e", "n": "ARABIC LIGATURE TAH WITH YEH ISOLATED FORM"}], "\u200e\ufcf5\u200e": [{"c": "\u200e\u0637\u0649\u200e", "n": "ARABIC LETTER TAH, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufd12\u200e": [{"c": "\u200e\u0637\u0649\u200e", "n": "ARABIC LETTER TAH, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufcf6\u200e": [{"c": "\u200e\u0637\u0649\u200e", "n": "ARABIC LETTER TAH, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ud83b\ude1a\u200e": [{"c": "\u200e\u0638\u200e", "n": "ARABIC LETTER ZAH"}], "\u200e\u0638\u200e": [{"c": "\u200e\ud83b\ude1a\u200e", "n": "ARABIC MATHEMATICAL ZAH"}, {"c": "\u200e\ud83b\ude7a\u200e", "n": "ARABIC MATHEMATICAL STRETCHED ZAH"}, {"c": "\u200e\ud83b\ude9a\u200e", "n": "ARABIC MATHEMATICAL LOOPED ZAH"}, {"c": "\u200e\ud83b\udeba\u200e", "n": "ARABIC MATHEMATICAL DOUBLE-STRUCK ZAH"}, {"c": "\u200e\ufec7\u200e", "n": "ARABIC LETTER ZAH INITIAL FORM"}, {"c": "\u200e\ufec8\u200e", "n": "ARABIC LETTER ZAH MEDIAL FORM"}, {"c": "\u200e\ufec6\u200e", "n": "ARABIC LETTER ZAH FINAL FORM"}, {"c": "\u200e\ufec5\u200e", "n": "ARABIC LETTER ZAH ISOLATED FORM"}], "\u200e\ud83b\ude7a\u200e": [{"c": "\u200e\u0638\u200e", "n": "ARABIC LETTER ZAH"}], "\u200e\ud83b\ude9a\u200e": [{"c": "\u200e\u0638\u200e", "n": "ARABIC LETTER ZAH"}], "\u200e\ud83b\udeba\u200e": [{"c": "\u200e\u0638\u200e", "n": "ARABIC LETTER ZAH"}], "\u200e\ufec7\u200e": [{"c": "\u200e\u0638\u200e", "n": "ARABIC LETTER ZAH"}], "\u200e\ufec8\u200e": [{"c": "\u200e\u0638\u200e", "n": "ARABIC LETTER ZAH"}], "\u200e\ufec6\u200e": [{"c": "\u200e\u0638\u200e", "n": "ARABIC LETTER ZAH"}], "\u200e\ufec5\u200e": [{"c": "\u200e\u0638\u200e", "n": "ARABIC LETTER ZAH"}], "\u200e\ufcb9\u200e": [{"c": "\u200e\u0638\u0645\u200e", "n": "ARABIC LETTER ZAH, ARABIC LETTER MEEM"}], "\u200e\u0638\u0645\u200e": [{"c": "\u200e\ufcb9\u200e", "n": "ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM"}, {"c": "\u200e\ufd3b\u200e", "n": "ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM"}, {"c": "\u200e\ufc28\u200e", "n": "ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM"}], "\u200e\ufd3b\u200e": [{"c": "\u200e\u0638\u0645\u200e", "n": "ARABIC LETTER ZAH, ARABIC LETTER MEEM"}], "\u200e\ufc28\u200e": [{"c": "\u200e\u0638\u0645\u200e", "n": "ARABIC LETTER ZAH, ARABIC LETTER MEEM"}], "\u060f": [{"c": "\u200e\u0639\u200e", "n": "ARABIC LETTER AIN"}], "\u200e\u0639\u200e": [{"c": "\u060f", "n": "ARABIC SIGN MISRA"}, {"c": "\u200e\ud83b\ude0f\u200e", "n": "ARABIC MATHEMATICAL AIN"}, {"c": "\u200e\ud83b\ude2f\u200e", "n": "ARABIC MATHEMATICAL INITIAL AIN"}, {"c": "\u200e\ud83b\ude4f\u200e", "n": "ARABIC MATHEMATICAL TAILED AIN"}, {"c": "\u200e\ud83b\ude6f\u200e", "n": "ARABIC MATHEMATICAL STRETCHED AIN"}, {"c": "\u200e\ud83b\ude8f\u200e", "n": "ARABIC MATHEMATICAL LOOPED AIN"}, {"c": "\u200e\ud83b\udeaf\u200e", "n": "ARABIC MATHEMATICAL DOUBLE-STRUCK AIN"}, {"c": "\u200e\ufecb\u200e", "n": "ARABIC LETTER AIN INITIAL FORM"}, {"c": "\u200e\ufecc\u200e", "n": "ARABIC LETTER AIN MEDIAL FORM"}, {"c": "\u200e\ufeca\u200e", "n": "ARABIC LETTER AIN FINAL FORM"}, {"c": "\u200e\ufec9\u200e", "n": "ARABIC LETTER AIN ISOLATED FORM"}], "\u200e\ud83b\ude0f\u200e": [{"c": "\u200e\u0639\u200e", "n": "ARABIC LETTER AIN"}], "\u200e\ud83b\ude2f\u200e": [{"c": "\u200e\u0639\u200e", "n": "ARABIC LETTER AIN"}], "\u200e\ud83b\ude4f\u200e": [{"c": "\u200e\u0639\u200e", "n": "ARABIC LETTER AIN"}], "\u200e\ud83b\ude6f\u200e": [{"c": "\u200e\u0639\u200e", "n": "ARABIC LETTER AIN"}], "\u200e\ud83b\ude8f\u200e": [{"c": "\u200e\u0639\u200e", "n": "ARABIC LETTER AIN"}], "\u200e\ud83b\udeaf\u200e": [{"c": "\u200e\u0639\u200e", "n": "ARABIC LETTER AIN"}], "\u200e\ufecb\u200e": [{"c": "\u200e\u0639\u200e", "n": "ARABIC LETTER AIN"}], "\u200e\ufecc\u200e": [{"c": "\u200e\u0639\u200e", "n": "ARABIC LETTER AIN"}], "\u200e\ufeca\u200e": [{"c": "\u200e\u0639\u200e", "n": "ARABIC LETTER AIN"}], "\u200e\ufec9\u200e": [{"c": "\u200e\u0639\u200e", "n": "ARABIC LETTER AIN"}], "\u200e\ufcba\u200e": [{"c": "\u200e\u0639\u062c\u200e", "n": "ARABIC LETTER AIN, ARABIC LETTER JEEM"}], "\u200e\u0639\u062c\u200e": [{"c": "\u200e\ufcba\u200e", "n": "ARABIC LIGATURE AIN WITH JEEM INITIAL FORM"}, {"c": "\u200e\ufc29\u200e", "n": "ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM"}], "\u200e\ufc29\u200e": [{"c": "\u200e\u0639\u062c\u200e", "n": "ARABIC LETTER AIN, ARABIC LETTER JEEM"}], "\u200e\ufdc4\u200e": [{"c": "\u200e\u0639\u062c\u0645\u200e", "n": "ARABIC LETTER AIN, ARABIC LETTER JEEM, ARABIC LETTER MEEM"}], "\u200e\u0639\u062c\u0645\u200e": [{"c": "\u200e\ufdc4\u200e", "n": "ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM"}, {"c": "\u200e\ufd75\u200e", "n": "ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM"}], "\u200e\ufd75\u200e": [{"c": "\u200e\u0639\u062c\u0645\u200e", "n": "ARABIC LETTER AIN, ARABIC LETTER JEEM, ARABIC LETTER MEEM"}], "\u200e\ufdf7\u200e": [{"c": "\u200e\u0639\u0644\u0649o\u200e", "n": "ARABIC LETTER AIN, ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA, LATIN SMALL LETTER O"}], "\u200e\u0639\u0644\u0649o\u200e": [{"c": "\u200e\ufdf7\u200e", "n": "ARABIC LIGATURE ALAYHE ISOLATED FORM"}], "\u200e\ufcbb\u200e": [{"c": "\u200e\u0639\u0645\u200e", "n": "ARABIC LETTER AIN, ARABIC LETTER MEEM"}], "\u200e\u0639\u0645\u200e": [{"c": "\u200e\ufcbb\u200e", "n": "ARABIC LIGATURE AIN WITH MEEM INITIAL FORM"}, {"c": "\u200e\ufc2a\u200e", "n": "ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM"}], "\u200e\ufc2a\u200e": [{"c": "\u200e\u0639\u0645\u200e", "n": "ARABIC LETTER AIN, ARABIC LETTER MEEM"}], "\u200e\ufd77\u200e": [{"c": "\u200e\u0639\u0645\u0645\u200e", "n": "ARABIC LETTER AIN, ARABIC LETTER MEEM, ARABIC LETTER MEEM"}], "\u200e\u0639\u0645\u0645\u200e": [{"c": "\u200e\ufd77\u200e", "n": "ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM"}, {"c": "\u200e\ufd76\u200e", "n": "ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM"}], "\u200e\ufd76\u200e": [{"c": "\u200e\u0639\u0645\u0645\u200e", "n": "ARABIC LETTER AIN, ARABIC LETTER MEEM, ARABIC LETTER MEEM"}], "\u200e\ufd78\u200e": [{"c": "\u200e\u0639\u0645\u0649\u200e", "n": "ARABIC LETTER AIN, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u0639\u0645\u0649\u200e": [{"c": "\u200e\ufd78\u200e", "n": "ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM"}, {"c": "\u200e\ufdb6\u200e", "n": "ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM"}], "\u200e\ufdb6\u200e": [{"c": "\u200e\u0639\u0645\u0649\u200e", "n": "ARABIC LETTER AIN, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufd13\u200e": [{"c": "\u200e\u0639\u0649\u200e", "n": "ARABIC LETTER AIN, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u0639\u0649\u200e": [{"c": "\u200e\ufd13\u200e", "n": "ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM"}, {"c": "\u200e\ufcf7\u200e", "n": "ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM"}, {"c": "\u200e\ufd14\u200e", "n": "ARABIC LIGATURE AIN WITH YEH FINAL FORM"}, {"c": "\u200e\ufcf8\u200e", "n": "ARABIC LIGATURE AIN WITH YEH ISOLATED FORM"}], "\u200e\ufcf7\u200e": [{"c": "\u200e\u0639\u0649\u200e", "n": "ARABIC LETTER AIN, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufd14\u200e": [{"c": "\u200e\u0639\u0649\u200e", "n": "ARABIC LETTER AIN, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufcf8\u200e": [{"c": "\u200e\u0639\u0649\u200e", "n": "ARABIC LETTER AIN, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ud83b\ude1b\u200e": [{"c": "\u200e\u063a\u200e", "n": "ARABIC LETTER GHAIN"}], "\u200e\u063a\u200e": [{"c": "\u200e\ud83b\ude1b\u200e", "n": "ARABIC MATHEMATICAL GHAIN"}, {"c": "\u200e\ud83b\ude3b\u200e", "n": "ARABIC MATHEMATICAL INITIAL GHAIN"}, {"c": "\u200e\ud83b\ude5b\u200e", "n": "ARABIC MATHEMATICAL TAILED GHAIN"}, {"c": "\u200e\ud83b\ude7b\u200e", "n": "ARABIC MATHEMATICAL STRETCHED GHAIN"}, {"c": "\u200e\ud83b\ude9b\u200e", "n": "ARABIC MATHEMATICAL LOOPED GHAIN"}, {"c": "\u200e\ud83b\udebb\u200e", "n": "ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN"}, {"c": "\u200e\ufecf\u200e", "n": "ARABIC LETTER GHAIN INITIAL FORM"}, {"c": "\u200e\ufed0\u200e", "n": "ARABIC LETTER GHAIN MEDIAL FORM"}, {"c": "\u200e\ufece\u200e", "n": "ARABIC LETTER GHAIN FINAL FORM"}, {"c": "\u200e\ufecd\u200e", "n": "ARABIC LETTER GHAIN ISOLATED FORM"}], "\u200e\ud83b\ude3b\u200e": [{"c": "\u200e\u063a\u200e", "n": "ARABIC LETTER GHAIN"}], "\u200e\ud83b\ude5b\u200e": [{"c": "\u200e\u063a\u200e", "n": "ARABIC LETTER GHAIN"}], "\u200e\ud83b\ude7b\u200e": [{"c": "\u200e\u063a\u200e", "n": "ARABIC LETTER GHAIN"}], "\u200e\ud83b\ude9b\u200e": [{"c": "\u200e\u063a\u200e", "n": "ARABIC LETTER GHAIN"}], "\u200e\ud83b\udebb\u200e": [{"c": "\u200e\u063a\u200e", "n": "ARABIC LETTER GHAIN"}], "\u200e\ufecf\u200e": [{"c": "\u200e\u063a\u200e", "n": "ARABIC LETTER GHAIN"}], "\u200e\ufed0\u200e": [{"c": "\u200e\u063a\u200e", "n": "ARABIC LETTER GHAIN"}], "\u200e\ufece\u200e": [{"c": "\u200e\u063a\u200e", "n": "ARABIC LETTER GHAIN"}], "\u200e\ufecd\u200e": [{"c": "\u200e\u063a\u200e", "n": "ARABIC LETTER GHAIN"}], "\u200e\ufcbc\u200e": [{"c": "\u200e\u063a\u062c\u200e", "n": "ARABIC LETTER GHAIN, ARABIC LETTER JEEM"}], "\u200e\u063a\u062c\u200e": [{"c": "\u200e\ufcbc\u200e", "n": "ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM"}, {"c": "\u200e\ufc2b\u200e", "n": "ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM"}], "\u200e\ufc2b\u200e": [{"c": "\u200e\u063a\u062c\u200e", "n": "ARABIC LETTER GHAIN, ARABIC LETTER JEEM"}], "\u200e\ufcbd\u200e": [{"c": "\u200e\u063a\u0645\u200e", "n": "ARABIC LETTER GHAIN, ARABIC LETTER MEEM"}], "\u200e\u063a\u0645\u200e": [{"c": "\u200e\ufcbd\u200e", "n": "ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM"}, {"c": "\u200e\ufc2c\u200e", "n": "ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM"}], "\u200e\ufc2c\u200e": [{"c": "\u200e\u063a\u0645\u200e", "n": "ARABIC LETTER GHAIN, ARABIC LETTER MEEM"}], "\u200e\ufd79\u200e": [{"c": "\u200e\u063a\u0645\u0645\u200e", "n": "ARABIC LETTER GHAIN, ARABIC LETTER MEEM, ARABIC LETTER MEEM"}], "\u200e\u063a\u0645\u0645\u200e": [{"c": "\u200e\ufd79\u200e", "n": "ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM"}], "\u200e\ufd7b\u200e": [{"c": "\u200e\u063a\u0645\u0649\u200e", "n": "ARABIC LETTER GHAIN, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u063a\u0645\u0649\u200e": [{"c": "\u200e\ufd7b\u200e", "n": "ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM"}, {"c": "\u200e\ufd7a\u200e", "n": "ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM"}], "\u200e\ufd7a\u200e": [{"c": "\u200e\u063a\u0645\u0649\u200e", "n": "ARABIC LETTER GHAIN, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufd15\u200e": [{"c": "\u200e\u063a\u0649\u200e", "n": "ARABIC LETTER GHAIN, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u063a\u0649\u200e": [{"c": "\u200e\ufd15\u200e", "n": "ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM"}, {"c": "\u200e\ufcf9\u200e", "n": "ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM"}, {"c": "\u200e\ufd16\u200e", "n": "ARABIC LIGATURE GHAIN WITH YEH FINAL FORM"}, {"c": "\u200e\ufcfa\u200e", "n": "ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM"}], "\u200e\ufcf9\u200e": [{"c": "\u200e\u063a\u0649\u200e", "n": "ARABIC LETTER GHAIN, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufd16\u200e": [{"c": "\u200e\u063a\u0649\u200e", "n": "ARABIC LETTER GHAIN, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufcfa\u200e": [{"c": "\u200e\u063a\u0649\u200e", "n": "ARABIC LETTER GHAIN, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ud83b\ude10\u200e": [{"c": "\u200e\u0641\u200e", "n": "ARABIC LETTER FEH"}], "\u200e\u0641\u200e": [{"c": "\u200e\ud83b\ude10\u200e", "n": "ARABIC MATHEMATICAL FEH"}, {"c": "\u200e\ud83b\ude30\u200e", "n": "ARABIC MATHEMATICAL INITIAL FEH"}, {"c": "\u200e\ud83b\ude70\u200e", "n": "ARABIC MATHEMATICAL STRETCHED FEH"}, {"c": "\u200e\ud83b\ude90\u200e", "n": "ARABIC MATHEMATICAL LOOPED FEH"}, {"c": "\u200e\ud83b\udeb0\u200e", "n": "ARABIC MATHEMATICAL DOUBLE-STRUCK FEH"}, {"c": "\u200e\ufed3\u200e", "n": "ARABIC LETTER FEH INITIAL FORM"}, {"c": "\u200e\ufed4\u200e", "n": "ARABIC LETTER FEH MEDIAL FORM"}, {"c": "\u200e\ufed2\u200e", "n": "ARABIC LETTER FEH FINAL FORM"}, {"c": "\u200e\ufed1\u200e", "n": "ARABIC LETTER FEH ISOLATED FORM"}, {"c": "\u200e\u06a7\u200e", "n": "ARABIC LETTER QAF WITH DOT ABOVE"}], "\u200e\ud83b\ude30\u200e": [{"c": "\u200e\u0641\u200e", "n": "ARABIC LETTER FEH"}], "\u200e\ud83b\ude70\u200e": [{"c": "\u200e\u0641\u200e", "n": "ARABIC LETTER FEH"}], "\u200e\ud83b\ude90\u200e": [{"c": "\u200e\u0641\u200e", "n": "ARABIC LETTER FEH"}], "\u200e\ud83b\udeb0\u200e": [{"c": "\u200e\u0641\u200e", "n": "ARABIC LETTER FEH"}], "\u200e\ufed3\u200e": [{"c": "\u200e\u0641\u200e", "n": "ARABIC LETTER FEH"}], "\u200e\ufed4\u200e": [{"c": "\u200e\u0641\u200e", "n": "ARABIC LETTER FEH"}], "\u200e\ufed2\u200e": [{"c": "\u200e\u0641\u200e", "n": "ARABIC LETTER FEH"}], "\u200e\ufed1\u200e": [{"c": "\u200e\u0641\u200e", "n": "ARABIC LETTER FEH"}], "\u200e\u06a7\u200e": [{"c": "\u200e\u0641\u200e", "n": "ARABIC LETTER FEH"}], "\u200e\ufcbe\u200e": [{"c": "\u200e\u0641\u062c\u200e", "n": "ARABIC LETTER FEH, ARABIC LETTER JEEM"}], "\u200e\u0641\u062c\u200e": [{"c": "\u200e\ufcbe\u200e", "n": "ARABIC LIGATURE FEH WITH JEEM INITIAL FORM"}, {"c": "\u200e\ufc2d\u200e", "n": "ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM"}], "\u200e\ufc2d\u200e": [{"c": "\u200e\u0641\u062c\u200e", "n": "ARABIC LETTER FEH, ARABIC LETTER JEEM"}], "\u200e\ufcbf\u200e": [{"c": "\u200e\u0641\u062d\u200e", "n": "ARABIC LETTER FEH, ARABIC LETTER HAH"}], "\u200e\u0641\u062d\u200e": [{"c": "\u200e\ufcbf\u200e", "n": "ARABIC LIGATURE FEH WITH HAH INITIAL FORM"}, {"c": "\u200e\ufc2e\u200e", "n": "ARABIC LIGATURE FEH WITH HAH ISOLATED FORM"}], "\u200e\ufc2e\u200e": [{"c": "\u200e\u0641\u062d\u200e", "n": "ARABIC LETTER FEH, ARABIC LETTER HAH"}], "\u200e\ufcc0\u200e": [{"c": "\u200e\u0641\u062e\u200e", "n": "ARABIC LETTER FEH, ARABIC LETTER KHAH"}], "\u200e\u0641\u062e\u200e": [{"c": "\u200e\ufcc0\u200e", "n": "ARABIC LIGATURE FEH WITH KHAH INITIAL FORM"}, {"c": "\u200e\ufc2f\u200e", "n": "ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM"}], "\u200e\ufc2f\u200e": [{"c": "\u200e\u0641\u062e\u200e", "n": "ARABIC LETTER FEH, ARABIC LETTER KHAH"}], "\u200e\ufd7d\u200e": [{"c": "\u200e\u0641\u062e\u0645\u200e", "n": "ARABIC LETTER FEH, ARABIC LETTER KHAH, ARABIC LETTER MEEM"}], "\u200e\u0641\u062e\u0645\u200e": [{"c": "\u200e\ufd7d\u200e", "n": "ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM"}, {"c": "\u200e\ufd7c\u200e", "n": "ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM"}], "\u200e\ufd7c\u200e": [{"c": "\u200e\u0641\u062e\u0645\u200e", "n": "ARABIC LETTER FEH, ARABIC LETTER KHAH, ARABIC LETTER MEEM"}], "\u200e\ufcc1\u200e": [{"c": "\u200e\u0641\u0645\u200e", "n": "ARABIC LETTER FEH, ARABIC LETTER MEEM"}], "\u200e\u0641\u0645\u200e": [{"c": "\u200e\ufcc1\u200e", "n": "ARABIC LIGATURE FEH WITH MEEM INITIAL FORM"}, {"c": "\u200e\ufc30\u200e", "n": "ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM"}], "\u200e\ufc30\u200e": [{"c": "\u200e\u0641\u0645\u200e", "n": "ARABIC LETTER FEH, ARABIC LETTER MEEM"}], "\u200e\ufdc1\u200e": [{"c": "\u200e\u0641\u0645\u0649\u200e", "n": "ARABIC LETTER FEH, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u0641\u0645\u0649\u200e": [{"c": "\u200e\ufdc1\u200e", "n": "ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM"}], "\u200e\ufc7c\u200e": [{"c": "\u200e\u0641\u0649\u200e", "n": "ARABIC LETTER FEH, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u0641\u0649\u200e": [{"c": "\u200e\ufc7c\u200e", "n": "ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM"}, {"c": "\u200e\ufc31\u200e", "n": "ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM"}, {"c": "\u200e\ufc7d\u200e", "n": "ARABIC LIGATURE FEH WITH YEH FINAL FORM"}, {"c": "\u200e\ufc32\u200e", "n": "ARABIC LIGATURE FEH WITH YEH ISOLATED FORM"}], "\u200e\ufc31\u200e": [{"c": "\u200e\u0641\u0649\u200e", "n": "ARABIC LETTER FEH, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufc7d\u200e": [{"c": "\u200e\u0641\u0649\u200e", "n": "ARABIC LETTER FEH, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufc32\u200e": [{"c": "\u200e\u0641\u0649\u200e", "n": "ARABIC LETTER FEH, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ud83b\ude1e\u200e": [{"c": "\u200e\u06a1\u200e", "n": "ARABIC LETTER DOTLESS FEH"}], "\u200e\u06a1\u200e": [{"c": "\u200e\ud83b\ude1e\u200e", "n": "ARABIC MATHEMATICAL DOTLESS FEH"}, {"c": "\u200e\ud83b\ude7e\u200e", "n": "ARABIC MATHEMATICAL STRETCHED DOTLESS FEH"}, {"c": "\u200e\u08bb\u200e", "n": "ARABIC LETTER AFRICAN FEH"}, {"c": "\u200e\u066f\u200e", "n": "ARABIC LETTER DOTLESS QAF"}, {"c": "\u200e\ud83b\ude1f\u200e", "n": "ARABIC MATHEMATICAL DOTLESS QAF"}, {"c": "\u200e\ud83b\ude5f\u200e", "n": "ARABIC MATHEMATICAL TAILED DOTLESS QAF"}, {"c": "\u200e\u08bc\u200e", "n": "ARABIC LETTER AFRICAN QAF"}], "\u200e\ud83b\ude7e\u200e": [{"c": "\u200e\u06a1\u200e", "n": "ARABIC LETTER DOTLESS FEH"}], "\u200e\u08bb\u200e": [{"c": "\u200e\u06a1\u200e", "n": "ARABIC LETTER DOTLESS FEH"}], "\u200e\u066f\u200e": [{"c": "\u200e\u06a1\u200e", "n": "ARABIC LETTER DOTLESS FEH"}], "\u200e\ud83b\ude1f\u200e": [{"c": "\u200e\u06a1\u200e", "n": "ARABIC LETTER DOTLESS FEH"}], "\u200e\ud83b\ude5f\u200e": [{"c": "\u200e\u06a1\u200e", "n": "ARABIC LETTER DOTLESS FEH"}], "\u200e\u08bc\u200e": [{"c": "\u200e\u06a1\u200e", "n": "ARABIC LETTER DOTLESS FEH"}], "\u200e\u06a4\u200e": [{"c": "\u200e\u06a1\u06db\u200e", "n": "ARABIC LETTER DOTLESS FEH, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\u06a1\u06db\u200e": [{"c": "\u200e\u06a4\u200e", "n": "ARABIC LETTER VEH"}, {"c": "\u200e\ufb6c\u200e", "n": "ARABIC LETTER VEH INITIAL FORM"}, {"c": "\u200e\ufb6d\u200e", "n": "ARABIC LETTER VEH MEDIAL FORM"}, {"c": "\u200e\ufb6b\u200e", "n": "ARABIC LETTER VEH FINAL FORM"}, {"c": "\u200e\ufb6a\u200e", "n": "ARABIC LETTER VEH ISOLATED FORM"}, {"c": "\u200e\u06a8\u200e", "n": "ARABIC LETTER QAF WITH THREE DOTS ABOVE"}], "\u200e\ufb6c\u200e": [{"c": "\u200e\u06a1\u06db\u200e", "n": "ARABIC LETTER DOTLESS FEH, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\ufb6d\u200e": [{"c": "\u200e\u06a1\u06db\u200e", "n": "ARABIC LETTER DOTLESS FEH, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\ufb6b\u200e": [{"c": "\u200e\u06a1\u06db\u200e", "n": "ARABIC LETTER DOTLESS FEH, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\ufb6a\u200e": [{"c": "\u200e\u06a1\u06db\u200e", "n": "ARABIC LETTER DOTLESS FEH, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\u06a8\u200e": [{"c": "\u200e\u06a1\u06db\u200e", "n": "ARABIC LETTER DOTLESS FEH, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\u08a4\u200e": [{"c": "\u200e\u06a2\u06db\u200e", "n": "ARABIC LETTER FEH WITH DOT MOVED BELOW, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\u06a2\u06db\u200e": [{"c": "\u200e\u08a4\u200e", "n": "ARABIC LETTER FEH WITH DOT BELOW AND THREE DOTS ABOVE"}], "\u200e\ufb70\u200e": [{"c": "\u200e\u06a6\u200e", "n": "ARABIC LETTER PEHEH"}], "\u200e\u06a6\u200e": [{"c": "\u200e\ufb70\u200e", "n": "ARABIC LETTER PEHEH INITIAL FORM"}, {"c": "\u200e\ufb71\u200e", "n": "ARABIC LETTER PEHEH MEDIAL FORM"}, {"c": "\u200e\ufb6f\u200e", "n": "ARABIC LETTER PEHEH FINAL FORM"}, {"c": "\u200e\ufb6e\u200e", "n": "ARABIC LETTER PEHEH ISOLATED FORM"}], "\u200e\ufb71\u200e": [{"c": "\u200e\u06a6\u200e", "n": "ARABIC LETTER PEHEH"}], "\u200e\ufb6f\u200e": [{"c": "\u200e\u06a6\u200e", "n": "ARABIC LETTER PEHEH"}], "\u200e\ufb6e\u200e": [{"c": "\u200e\u06a6\u200e", "n": "ARABIC LETTER PEHEH"}], "\u200e\ud83b\ude12\u200e": [{"c": "\u200e\u0642\u200e", "n": "ARABIC LETTER QAF"}], "\u200e\u0642\u200e": [{"c": "\u200e\ud83b\ude12\u200e", "n": "ARABIC MATHEMATICAL QAF"}, {"c": "\u200e\ud83b\ude32\u200e", "n": "ARABIC MATHEMATICAL INITIAL QAF"}, {"c": "\u200e\ud83b\ude52\u200e", "n": "ARABIC MATHEMATICAL TAILED QAF"}, {"c": "\u200e\ud83b\ude72\u200e", "n": "ARABIC MATHEMATICAL STRETCHED QAF"}, {"c": "\u200e\ud83b\ude92\u200e", "n": "ARABIC MATHEMATICAL LOOPED QAF"}, {"c": "\u200e\ud83b\udeb2\u200e", "n": "ARABIC MATHEMATICAL DOUBLE-STRUCK QAF"}, {"c": "\u200e\ufed7\u200e", "n": "ARABIC LETTER QAF INITIAL FORM"}, {"c": "\u200e\ufed8\u200e", "n": "ARABIC LETTER QAF MEDIAL FORM"}, {"c": "\u200e\ufed6\u200e", "n": "ARABIC LETTER QAF FINAL FORM"}, {"c": "\u200e\ufed5\u200e", "n": "ARABIC LETTER QAF ISOLATED FORM"}], "\u200e\ud83b\ude32\u200e": [{"c": "\u200e\u0642\u200e", "n": "ARABIC LETTER QAF"}], "\u200e\ud83b\ude52\u200e": [{"c": "\u200e\u0642\u200e", "n": "ARABIC LETTER QAF"}], "\u200e\ud83b\ude72\u200e": [{"c": "\u200e\u0642\u200e", "n": "ARABIC LETTER QAF"}], "\u200e\ud83b\ude92\u200e": [{"c": "\u200e\u0642\u200e", "n": "ARABIC LETTER QAF"}], "\u200e\ud83b\udeb2\u200e": [{"c": "\u200e\u0642\u200e", "n": "ARABIC LETTER QAF"}], "\u200e\ufed7\u200e": [{"c": "\u200e\u0642\u200e", "n": "ARABIC LETTER QAF"}], "\u200e\ufed8\u200e": [{"c": "\u200e\u0642\u200e", "n": "ARABIC LETTER QAF"}], "\u200e\ufed6\u200e": [{"c": "\u200e\u0642\u200e", "n": "ARABIC LETTER QAF"}], "\u200e\ufed5\u200e": [{"c": "\u200e\u0642\u200e", "n": "ARABIC LETTER QAF"}], "\u200e\ufcc2\u200e": [{"c": "\u200e\u0642\u062d\u200e", "n": "ARABIC LETTER QAF, ARABIC LETTER HAH"}], "\u200e\u0642\u062d\u200e": [{"c": "\u200e\ufcc2\u200e", "n": "ARABIC LIGATURE QAF WITH HAH INITIAL FORM"}, {"c": "\u200e\ufc33\u200e", "n": "ARABIC LIGATURE QAF WITH HAH ISOLATED FORM"}], "\u200e\ufc33\u200e": [{"c": "\u200e\u0642\u062d\u200e", "n": "ARABIC LETTER QAF, ARABIC LETTER HAH"}], "\u200e\ufdf1\u200e": [{"c": "\u200e\u0642\u0644\u0649\u200e", "n": "ARABIC LETTER QAF, ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u0642\u0644\u0649\u200e": [{"c": "\u200e\ufdf1\u200e", "n": "ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM"}], "\u200e\ufcc3\u200e": [{"c": "\u200e\u0642\u0645\u200e", "n": "ARABIC LETTER QAF, ARABIC LETTER MEEM"}], "\u200e\u0642\u0645\u200e": [{"c": "\u200e\ufcc3\u200e", "n": "ARABIC LIGATURE QAF WITH MEEM INITIAL FORM"}, {"c": "\u200e\ufc34\u200e", "n": "ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM"}], "\u200e\ufc34\u200e": [{"c": "\u200e\u0642\u0645\u200e", "n": "ARABIC LETTER QAF, ARABIC LETTER MEEM"}], "\u200e\ufdb4\u200e": [{"c": "\u200e\u0642\u0645\u062d\u200e", "n": "ARABIC LETTER QAF, ARABIC LETTER MEEM, ARABIC LETTER HAH"}], "\u200e\u0642\u0645\u062d\u200e": [{"c": "\u200e\ufdb4\u200e", "n": "ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM"}, {"c": "\u200e\ufd7e\u200e", "n": "ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM"}], "\u200e\ufd7e\u200e": [{"c": "\u200e\u0642\u0645\u062d\u200e", "n": "ARABIC LETTER QAF, ARABIC LETTER MEEM, ARABIC LETTER HAH"}], "\u200e\ufd7f\u200e": [{"c": "\u200e\u0642\u0645\u0645\u200e", "n": "ARABIC LETTER QAF, ARABIC LETTER MEEM, ARABIC LETTER MEEM"}], "\u200e\u0642\u0645\u0645\u200e": [{"c": "\u200e\ufd7f\u200e", "n": "ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM"}], "\u200e\ufdb2\u200e": [{"c": "\u200e\u0642\u0645\u0649\u200e", "n": "ARABIC LETTER QAF, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u0642\u0645\u0649\u200e": [{"c": "\u200e\ufdb2\u200e", "n": "ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM"}], "\u200e\ufc7e\u200e": [{"c": "\u200e\u0642\u0649\u200e", "n": "ARABIC LETTER QAF, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u0642\u0649\u200e": [{"c": "\u200e\ufc7e\u200e", "n": "ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM"}, {"c": "\u200e\ufc35\u200e", "n": "ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM"}, {"c": "\u200e\ufc7f\u200e", "n": "ARABIC LIGATURE QAF WITH YEH FINAL FORM"}, {"c": "\u200e\ufc36\u200e", "n": "ARABIC LIGATURE QAF WITH YEH ISOLATED FORM"}], "\u200e\ufc35\u200e": [{"c": "\u200e\u0642\u0649\u200e", "n": "ARABIC LETTER QAF, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufc7f\u200e": [{"c": "\u200e\u0642\u0649\u200e", "n": "ARABIC LETTER QAF, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufc36\u200e": [{"c": "\u200e\u0642\u0649\u200e", "n": "ARABIC LETTER QAF, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ud83b\ude0a\u200e": [{"c": "\u200e\u0643\u200e", "n": "ARABIC LETTER KAF"}], "\u200e\u0643\u200e": [{"c": "\u200e\ud83b\ude0a\u200e", "n": "ARABIC MATHEMATICAL KAF"}, {"c": "\u200e\ud83b\ude2a\u200e", "n": "ARABIC MATHEMATICAL INITIAL KAF"}, {"c": "\u200e\ud83b\ude6a\u200e", "n": "ARABIC MATHEMATICAL STRETCHED KAF"}, {"c": "\u200e\ufedb\u200e", "n": "ARABIC LETTER KAF INITIAL FORM"}, {"c": "\u200e\ufedc\u200e", "n": "ARABIC LETTER KAF MEDIAL FORM"}, {"c": "\u200e\ufeda\u200e", "n": "ARABIC LETTER KAF FINAL FORM"}, {"c": "\u200e\ufed9\u200e", "n": "ARABIC LETTER KAF ISOLATED FORM"}, {"c": "\u200e\u06a9\u200e", "n": "ARABIC LETTER KEHEH"}, {"c": "\u200e\ufb90\u200e", "n": "ARABIC LETTER KEHEH INITIAL FORM"}, {"c": "\u200e\ufb91\u200e", "n": "ARABIC LETTER KEHEH MEDIAL FORM"}, {"c": "\u200e\ufb8f\u200e", "n": "ARABIC LETTER KEHEH FINAL FORM"}, {"c": "\u200e\ufb8e\u200e", "n": "ARABIC LETTER KEHEH ISOLATED FORM"}, {"c": "\u200e\u06aa\u200e", "n": "ARABIC LETTER SWASH KAF"}], "\u200e\ud83b\ude2a\u200e": [{"c": "\u200e\u0643\u200e", "n": "ARABIC LETTER KAF"}], "\u200e\ud83b\ude6a\u200e": [{"c": "\u200e\u0643\u200e", "n": "ARABIC LETTER KAF"}], "\u200e\ufedb\u200e": [{"c": "\u200e\u0643\u200e", "n": "ARABIC LETTER KAF"}], "\u200e\ufedc\u200e": [{"c": "\u200e\u0643\u200e", "n": "ARABIC LETTER KAF"}], "\u200e\ufeda\u200e": [{"c": "\u200e\u0643\u200e", "n": "ARABIC LETTER KAF"}], "\u200e\ufed9\u200e": [{"c": "\u200e\u0643\u200e", "n": "ARABIC LETTER KAF"}], "\u200e\u06a9\u200e": [{"c": "\u200e\u0643\u200e", "n": "ARABIC LETTER KAF"}], "\u200e\ufb90\u200e": [{"c": "\u200e\u0643\u200e", "n": "ARABIC LETTER KAF"}], "\u200e\ufb91\u200e": [{"c": "\u200e\u0643\u200e", "n": "ARABIC LETTER KAF"}], "\u200e\ufb8f\u200e": [{"c": "\u200e\u0643\u200e", "n": "ARABIC LETTER KAF"}], "\u200e\ufb8e\u200e": [{"c": "\u200e\u0643\u200e", "n": "ARABIC LETTER KAF"}], "\u200e\u06aa\u200e": [{"c": "\u200e\u0643\u200e", "n": "ARABIC LETTER KAF"}], "\u200e\u06ad\u200e": [{"c": "\u200e\u0643\u06db\u200e", "n": "ARABIC LETTER KAF, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\u0643\u06db\u200e": [{"c": "\u200e\u06ad\u200e", "n": "ARABIC LETTER NG"}, {"c": "\u200e\ufbd5\u200e", "n": "ARABIC LETTER NG INITIAL FORM"}, {"c": "\u200e\ufbd6\u200e", "n": "ARABIC LETTER NG MEDIAL FORM"}, {"c": "\u200e\ufbd4\u200e", "n": "ARABIC LETTER NG FINAL FORM"}, {"c": "\u200e\ufbd3\u200e", "n": "ARABIC LETTER NG ISOLATED FORM"}, {"c": "\u200e\u0763\u200e", "n": "ARABIC LETTER KEHEH WITH THREE DOTS ABOVE"}], "\u200e\ufbd5\u200e": [{"c": "\u200e\u0643\u06db\u200e", "n": "ARABIC LETTER KAF, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\ufbd6\u200e": [{"c": "\u200e\u0643\u06db\u200e", "n": "ARABIC LETTER KAF, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\ufbd4\u200e": [{"c": "\u200e\u0643\u06db\u200e", "n": "ARABIC LETTER KAF, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\ufbd3\u200e": [{"c": "\u200e\u0643\u06db\u200e", "n": "ARABIC LETTER KAF, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\u0763\u200e": [{"c": "\u200e\u0643\u06db\u200e", "n": "ARABIC LETTER KAF, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\ufc80\u200e": [{"c": "\u200e\u0643l\u200e", "n": "ARABIC LETTER KAF, LATIN SMALL LETTER L"}], "\u200e\u0643l\u200e": [{"c": "\u200e\ufc80\u200e", "n": "ARABIC LIGATURE KAF WITH ALEF FINAL FORM"}, {"c": "\u200e\ufc37\u200e", "n": "ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM"}], "\u200e\ufc37\u200e": [{"c": "\u200e\u0643l\u200e", "n": "ARABIC LETTER KAF, LATIN SMALL LETTER L"}], "\u200e\ufcc4\u200e": [{"c": "\u200e\u0643\u062c\u200e", "n": "ARABIC LETTER KAF, ARABIC LETTER JEEM"}], "\u200e\u0643\u062c\u200e": [{"c": "\u200e\ufcc4\u200e", "n": "ARABIC LIGATURE KAF WITH JEEM INITIAL FORM"}, {"c": "\u200e\ufc38\u200e", "n": "ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM"}], "\u200e\ufc38\u200e": [{"c": "\u200e\u0643\u062c\u200e", "n": "ARABIC LETTER KAF, ARABIC LETTER JEEM"}], "\u200e\ufcc5\u200e": [{"c": "\u200e\u0643\u062d\u200e", "n": "ARABIC LETTER KAF, ARABIC LETTER HAH"}], "\u200e\u0643\u062d\u200e": [{"c": "\u200e\ufcc5\u200e", "n": "ARABIC LIGATURE KAF WITH HAH INITIAL FORM"}, {"c": "\u200e\ufc39\u200e", "n": "ARABIC LIGATURE KAF WITH HAH ISOLATED FORM"}], "\u200e\ufc39\u200e": [{"c": "\u200e\u0643\u062d\u200e", "n": "ARABIC LETTER KAF, ARABIC LETTER HAH"}], "\u200e\ufcc6\u200e": [{"c": "\u200e\u0643\u062e\u200e", "n": "ARABIC LETTER KAF, ARABIC LETTER KHAH"}], "\u200e\u0643\u062e\u200e": [{"c": "\u200e\ufcc6\u200e", "n": "ARABIC LIGATURE KAF WITH KHAH INITIAL FORM"}, {"c": "\u200e\ufc3a\u200e", "n": "ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM"}], "\u200e\ufc3a\u200e": [{"c": "\u200e\u0643\u062e\u200e", "n": "ARABIC LETTER KAF, ARABIC LETTER KHAH"}], "\u200e\ufcc7\u200e": [{"c": "\u200e\u0643\u0644\u200e", "n": "ARABIC LETTER KAF, ARABIC LETTER LAM"}], "\u200e\u0643\u0644\u200e": [{"c": "\u200e\ufcc7\u200e", "n": "ARABIC LIGATURE KAF WITH LAM INITIAL FORM"}, {"c": "\u200e\ufceb\u200e", "n": "ARABIC LIGATURE KAF WITH LAM MEDIAL FORM"}, {"c": "\u200e\ufc81\u200e", "n": "ARABIC LIGATURE KAF WITH LAM FINAL FORM"}, {"c": "\u200e\ufc3b\u200e", "n": "ARABIC LIGATURE KAF WITH LAM ISOLATED FORM"}], "\u200e\ufceb\u200e": [{"c": "\u200e\u0643\u0644\u200e", "n": "ARABIC LETTER KAF, ARABIC LETTER LAM"}], "\u200e\ufc81\u200e": [{"c": "\u200e\u0643\u0644\u200e", "n": "ARABIC LETTER KAF, ARABIC LETTER LAM"}], "\u200e\ufc3b\u200e": [{"c": "\u200e\u0643\u0644\u200e", "n": "ARABIC LETTER KAF, ARABIC LETTER LAM"}], "\u200e\ufcc8\u200e": [{"c": "\u200e\u0643\u0645\u200e", "n": "ARABIC LETTER KAF, ARABIC LETTER MEEM"}], "\u200e\u0643\u0645\u200e": [{"c": "\u200e\ufcc8\u200e", "n": "ARABIC LIGATURE KAF WITH MEEM INITIAL FORM"}, {"c": "\u200e\ufcec\u200e", "n": "ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM"}, {"c": "\u200e\ufc82\u200e", "n": "ARABIC LIGATURE KAF WITH MEEM FINAL FORM"}, {"c": "\u200e\ufc3c\u200e", "n": "ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM"}], "\u200e\ufcec\u200e": [{"c": "\u200e\u0643\u0645\u200e", "n": "ARABIC LETTER KAF, ARABIC LETTER MEEM"}], "\u200e\ufc82\u200e": [{"c": "\u200e\u0643\u0645\u200e", "n": "ARABIC LETTER KAF, ARABIC LETTER MEEM"}], "\u200e\ufc3c\u200e": [{"c": "\u200e\u0643\u0645\u200e", "n": "ARABIC LETTER KAF, ARABIC LETTER MEEM"}], "\u200e\ufdc3\u200e": [{"c": "\u200e\u0643\u0645\u0645\u200e", "n": "ARABIC LETTER KAF, ARABIC LETTER MEEM, ARABIC LETTER MEEM"}], "\u200e\u0643\u0645\u0645\u200e": [{"c": "\u200e\ufdc3\u200e", "n": "ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM"}, {"c": "\u200e\ufdbb\u200e", "n": "ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM"}], "\u200e\ufdbb\u200e": [{"c": "\u200e\u0643\u0645\u0645\u200e", "n": "ARABIC LETTER KAF, ARABIC LETTER MEEM, ARABIC LETTER MEEM"}], "\u200e\ufdb7\u200e": [{"c": "\u200e\u0643\u0645\u0649\u200e", "n": "ARABIC LETTER KAF, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u0643\u0645\u0649\u200e": [{"c": "\u200e\ufdb7\u200e", "n": "ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM"}], "\u200e\ufc83\u200e": [{"c": "\u200e\u0643\u0649\u200e", "n": "ARABIC LETTER KAF, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u0643\u0649\u200e": [{"c": "\u200e\ufc83\u200e", "n": "ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM"}, {"c": "\u200e\ufc3d\u200e", "n": "ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM"}, {"c": "\u200e\ufc84\u200e", "n": "ARABIC LIGATURE KAF WITH YEH FINAL FORM"}, {"c": "\u200e\ufc3e\u200e", "n": "ARABIC LIGATURE KAF WITH YEH ISOLATED FORM"}], "\u200e\ufc3d\u200e": [{"c": "\u200e\u0643\u0649\u200e", "n": "ARABIC LETTER KAF, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufc84\u200e": [{"c": "\u200e\u0643\u0649\u200e", "n": "ARABIC LETTER KAF, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufc3e\u200e": [{"c": "\u200e\u0643\u0649\u200e", "n": "ARABIC LETTER KAF, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u0762\u200e": [{"c": "\u200e\u06ac\u200e", "n": "ARABIC LETTER KAF WITH DOT ABOVE"}], "\u200e\u06ac\u200e": [{"c": "\u200e\u0762\u200e", "n": "ARABIC LETTER KEHEH WITH DOT ABOVE"}], "\u200e\ufb94\u200e": [{"c": "\u200e\u06af\u200e", "n": "ARABIC LETTER GAF"}], "\u200e\u06af\u200e": [{"c": "\u200e\ufb94\u200e", "n": "ARABIC LETTER GAF INITIAL FORM"}, {"c": "\u200e\ufb95\u200e", "n": "ARABIC LETTER GAF MEDIAL FORM"}, {"c": "\u200e\ufb93\u200e", "n": "ARABIC LETTER GAF FINAL FORM"}, {"c": "\u200e\ufb92\u200e", "n": "ARABIC LETTER GAF ISOLATED FORM"}, {"c": "\u200e\u08b0\u200e", "n": "ARABIC LETTER GAF WITH INVERTED STROKE"}], "\u200e\ufb95\u200e": [{"c": "\u200e\u06af\u200e", "n": "ARABIC LETTER GAF"}], "\u200e\ufb93\u200e": [{"c": "\u200e\u06af\u200e", "n": "ARABIC LETTER GAF"}], "\u200e\ufb92\u200e": [{"c": "\u200e\u06af\u200e", "n": "ARABIC LETTER GAF"}], "\u200e\u08b0\u200e": [{"c": "\u200e\u06af\u200e", "n": "ARABIC LETTER GAF"}], "\u200e\u06b4\u200e": [{"c": "\u200e\u06af\u06db\u200e", "n": "ARABIC LETTER GAF, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\u06af\u06db\u200e": [{"c": "\u200e\u06b4\u200e", "n": "ARABIC LETTER GAF WITH THREE DOTS ABOVE"}], "\u200e\ufb9c\u200e": [{"c": "\u200e\u06b1\u200e", "n": "ARABIC LETTER NGOEH"}], "\u200e\u06b1\u200e": [{"c": "\u200e\ufb9c\u200e", "n": "ARABIC LETTER NGOEH INITIAL FORM"}, {"c": "\u200e\ufb9d\u200e", "n": "ARABIC LETTER NGOEH MEDIAL FORM"}, {"c": "\u200e\ufb9b\u200e", "n": "ARABIC LETTER NGOEH FINAL FORM"}, {"c": "\u200e\ufb9a\u200e", "n": "ARABIC LETTER NGOEH ISOLATED FORM"}], "\u200e\ufb9d\u200e": [{"c": "\u200e\u06b1\u200e", "n": "ARABIC LETTER NGOEH"}], "\u200e\ufb9b\u200e": [{"c": "\u200e\u06b1\u200e", "n": "ARABIC LETTER NGOEH"}], "\u200e\ufb9a\u200e": [{"c": "\u200e\u06b1\u200e", "n": "ARABIC LETTER NGOEH"}], "\u200e\ufb98\u200e": [{"c": "\u200e\u06b3\u200e", "n": "ARABIC LETTER GUEH"}], "\u200e\u06b3\u200e": [{"c": "\u200e\ufb98\u200e", "n": "ARABIC LETTER GUEH INITIAL FORM"}, {"c": "\u200e\ufb99\u200e", "n": "ARABIC LETTER GUEH MEDIAL FORM"}, {"c": "\u200e\ufb97\u200e", "n": "ARABIC LETTER GUEH FINAL FORM"}, {"c": "\u200e\ufb96\u200e", "n": "ARABIC LETTER GUEH ISOLATED FORM"}], "\u200e\ufb99\u200e": [{"c": "\u200e\u06b3\u200e", "n": "ARABIC LETTER GUEH"}], "\u200e\ufb97\u200e": [{"c": "\u200e\u06b3\u200e", "n": "ARABIC LETTER GUEH"}], "\u200e\ufb96\u200e": [{"c": "\u200e\u06b3\u200e", "n": "ARABIC LETTER GUEH"}], "\u200e\ud83b\ude0b\u200e": [{"c": "\u200e\u0644\u200e", "n": "ARABIC LETTER LAM"}], "\u200e\u0644\u200e": [{"c": "\u200e\ud83b\ude0b\u200e", "n": "ARABIC MATHEMATICAL LAM"}, {"c": "\u200e\ud83b\ude2b\u200e", "n": "ARABIC MATHEMATICAL INITIAL LAM"}, {"c": "\u200e\ud83b\ude4b\u200e", "n": "ARABIC MATHEMATICAL TAILED LAM"}, {"c": "\u200e\ud83b\ude8b\u200e", "n": "ARABIC MATHEMATICAL LOOPED LAM"}, {"c": "\u200e\ud83b\udeab\u200e", "n": "ARABIC MATHEMATICAL DOUBLE-STRUCK LAM"}, {"c": "\u200e\ufedf\u200e", "n": "ARABIC LETTER LAM INITIAL FORM"}, {"c": "\u200e\ufee0\u200e", "n": "ARABIC LETTER LAM MEDIAL FORM"}, {"c": "\u200e\ufede\u200e", "n": "ARABIC LETTER LAM FINAL FORM"}, {"c": "\u200e\ufedd\u200e", "n": "ARABIC LETTER LAM ISOLATED FORM"}], "\u200e\ud83b\ude2b\u200e": [{"c": "\u200e\u0644\u200e", "n": "ARABIC LETTER LAM"}], "\u200e\ud83b\ude4b\u200e": [{"c": "\u200e\u0644\u200e", "n": "ARABIC LETTER LAM"}], "\u200e\ud83b\ude8b\u200e": [{"c": "\u200e\u0644\u200e", "n": "ARABIC LETTER LAM"}], "\u200e\ud83b\udeab\u200e": [{"c": "\u200e\u0644\u200e", "n": "ARABIC LETTER LAM"}], "\u200e\ufedf\u200e": [{"c": "\u200e\u0644\u200e", "n": "ARABIC LETTER LAM"}], "\u200e\ufee0\u200e": [{"c": "\u200e\u0644\u200e", "n": "ARABIC LETTER LAM"}], "\u200e\ufede\u200e": [{"c": "\u200e\u0644\u200e", "n": "ARABIC LETTER LAM"}], "\u200e\ufedd\u200e": [{"c": "\u200e\u0644\u200e", "n": "ARABIC LETTER LAM"}], "\u200e\u06b7\u200e": [{"c": "\u200e\u0644\u06db\u200e", "n": "ARABIC LETTER LAM, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\u0644\u06db\u200e": [{"c": "\u200e\u06b7\u200e", "n": "ARABIC LETTER LAM WITH THREE DOTS ABOVE"}], "\u200e\u06b5\u200e": [{"c": "\u200e\u0644\u0306\u200e", "n": "ARABIC LETTER LAM, COMBINING BREVE"}], "\u200e\u0644\u0306\u200e": [{"c": "\u200e\u06b5\u200e", "n": "ARABIC LETTER LAM WITH SMALL V"}], "\u200e\ufefc\u200e": [{"c": "\u200e\u0644l\u200e", "n": "ARABIC LETTER LAM, LATIN SMALL LETTER L"}], "\u200e\u0644l\u200e": [{"c": "\u200e\ufefc\u200e", "n": "ARABIC LIGATURE LAM WITH ALEF FINAL FORM"}, {"c": "\u200e\ufefb\u200e", "n": "ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM"}], "\u200e\ufefb\u200e": [{"c": "\u200e\u0644l\u200e", "n": "ARABIC LETTER LAM, LATIN SMALL LETTER L"}], "\u200e\ufefa\u200e": [{"c": "\u200e\u0644l\u0655\u200e", "n": "ARABIC LETTER LAM, LATIN SMALL LETTER L, ARABIC HAMZA BELOW"}], "\u200e\u0644l\u0655\u200e": [{"c": "\u200e\ufefa\u200e", "n": "ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM"}, {"c": "\u200e\ufef9\u200e", "n": "ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM"}], "\u200e\ufef9\u200e": [{"c": "\u200e\u0644l\u0655\u200e", "n": "ARABIC LETTER LAM, LATIN SMALL LETTER L, ARABIC HAMZA BELOW"}], "\u200e\ufef8\u200e": [{"c": "\u200e\u0644l\u0674\u200e", "n": "ARABIC LETTER LAM, LATIN SMALL LETTER L, ARABIC LETTER HIGH HAMZA"}], "\u200e\u0644l\u0674\u200e": [{"c": "\u200e\ufef8\u200e", "n": "ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM"}, {"c": "\u200e\ufef7\u200e", "n": "ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM"}], "\u200e\ufef7\u200e": [{"c": "\u200e\u0644l\u0674\u200e", "n": "ARABIC LETTER LAM, LATIN SMALL LETTER L, ARABIC LETTER HIGH HAMZA"}], "\u200e\ufccd\u200e": [{"c": "\u200e\u0644o\u200e", "n": "ARABIC LETTER LAM, LATIN SMALL LETTER O"}], "\u200e\u0644o\u200e": [{"c": "\u200e\ufccd\u200e", "n": "ARABIC LIGATURE LAM WITH HEH INITIAL FORM"}], "\u200e\ufef6\u200e": [{"c": "\u200e\u0644\u0622\u200e", "n": "ARABIC LETTER LAM, ARABIC LETTER ALEF WITH MADDA ABOVE"}], "\u200e\u0644\u0622\u200e": [{"c": "\u200e\ufef6\u200e", "n": "ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM"}, {"c": "\u200e\ufef5\u200e", "n": "ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM"}], "\u200e\ufef5\u200e": [{"c": "\u200e\u0644\u0622\u200e", "n": "ARABIC LETTER LAM, ARABIC LETTER ALEF WITH MADDA ABOVE"}], "\u200e\ufcc9\u200e": [{"c": "\u200e\u0644\u062c\u200e", "n": "ARABIC LETTER LAM, ARABIC LETTER JEEM"}], "\u200e\u0644\u062c\u200e": [{"c": "\u200e\ufcc9\u200e", "n": "ARABIC LIGATURE LAM WITH JEEM INITIAL FORM"}, {"c": "\u200e\ufc3f\u200e", "n": "ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM"}], "\u200e\ufc3f\u200e": [{"c": "\u200e\u0644\u062c\u200e", "n": "ARABIC LETTER LAM, ARABIC LETTER JEEM"}], "\u200e\ufd83\u200e": [{"c": "\u200e\u0644\u062c\u062c\u200e", "n": "ARABIC LETTER LAM, ARABIC LETTER JEEM, ARABIC LETTER JEEM"}], "\u200e\u0644\u062c\u062c\u200e": [{"c": "\u200e\ufd83\u200e", "n": "ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM"}, {"c": "\u200e\ufd84\u200e", "n": "ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM"}], "\u200e\ufd84\u200e": [{"c": "\u200e\u0644\u062c\u062c\u200e", "n": "ARABIC LETTER LAM, ARABIC LETTER JEEM, ARABIC LETTER JEEM"}], "\u200e\ufdba\u200e": [{"c": "\u200e\u0644\u062c\u0645\u200e", "n": "ARABIC LETTER LAM, ARABIC LETTER JEEM, ARABIC LETTER MEEM"}], "\u200e\u0644\u062c\u0645\u200e": [{"c": "\u200e\ufdba\u200e", "n": "ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM"}, {"c": "\u200e\ufdbc\u200e", "n": "ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM"}], "\u200e\ufdbc\u200e": [{"c": "\u200e\u0644\u062c\u0645\u200e", "n": "ARABIC LETTER LAM, ARABIC LETTER JEEM, ARABIC LETTER MEEM"}], "\u200e\ufdac\u200e": [{"c": "\u200e\u0644\u062c\u0649\u200e", "n": "ARABIC LETTER LAM, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u0644\u062c\u0649\u200e": [{"c": "\u200e\ufdac\u200e", "n": "ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM"}], "\u200e\ufcca\u200e": [{"c": "\u200e\u0644\u062d\u200e", "n": "ARABIC LETTER LAM, ARABIC LETTER HAH"}], "\u200e\u0644\u062d\u200e": [{"c": "\u200e\ufcca\u200e", "n": "ARABIC LIGATURE LAM WITH HAH INITIAL FORM"}, {"c": "\u200e\ufc40\u200e", "n": "ARABIC LIGATURE LAM WITH HAH ISOLATED FORM"}], "\u200e\ufc40\u200e": [{"c": "\u200e\u0644\u062d\u200e", "n": "ARABIC LETTER LAM, ARABIC LETTER HAH"}], "\u200e\ufdb5\u200e": [{"c": "\u200e\u0644\u062d\u0645\u200e", "n": "ARABIC LETTER LAM, ARABIC LETTER HAH, ARABIC LETTER MEEM"}], "\u200e\u0644\u062d\u0645\u200e": [{"c": "\u200e\ufdb5\u200e", "n": "ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM"}, {"c": "\u200e\ufd80\u200e", "n": "ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM"}], "\u200e\ufd80\u200e": [{"c": "\u200e\u0644\u062d\u0645\u200e", "n": "ARABIC LETTER LAM, ARABIC LETTER HAH, ARABIC LETTER MEEM"}], "\u200e\ufd82\u200e": [{"c": "\u200e\u0644\u062d\u0649\u200e", "n": "ARABIC LETTER LAM, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u0644\u062d\u0649\u200e": [{"c": "\u200e\ufd82\u200e", "n": "ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM"}, {"c": "\u200e\ufd81\u200e", "n": "ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM"}], "\u200e\ufd81\u200e": [{"c": "\u200e\u0644\u062d\u0649\u200e", "n": "ARABIC LETTER LAM, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufccb\u200e": [{"c": "\u200e\u0644\u062e\u200e", "n": "ARABIC LETTER LAM, ARABIC LETTER KHAH"}], "\u200e\u0644\u062e\u200e": [{"c": "\u200e\ufccb\u200e", "n": "ARABIC LIGATURE LAM WITH KHAH INITIAL FORM"}, {"c": "\u200e\ufc41\u200e", "n": "ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM"}], "\u200e\ufc41\u200e": [{"c": "\u200e\u0644\u062e\u200e", "n": "ARABIC LETTER LAM, ARABIC LETTER KHAH"}], "\u200e\ufd86\u200e": [{"c": "\u200e\u0644\u062e\u0645\u200e", "n": "ARABIC LETTER LAM, ARABIC LETTER KHAH, ARABIC LETTER MEEM"}], "\u200e\u0644\u062e\u0645\u200e": [{"c": "\u200e\ufd86\u200e", "n": "ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM"}, {"c": "\u200e\ufd85\u200e", "n": "ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM"}], "\u200e\ufd85\u200e": [{"c": "\u200e\u0644\u062e\u0645\u200e", "n": "ARABIC LETTER LAM, ARABIC LETTER KHAH, ARABIC LETTER MEEM"}], "\u200e\ufccc\u200e": [{"c": "\u200e\u0644\u0645\u200e", "n": "ARABIC LETTER LAM, ARABIC LETTER MEEM"}], "\u200e\u0644\u0645\u200e": [{"c": "\u200e\ufccc\u200e", "n": "ARABIC LIGATURE LAM WITH MEEM INITIAL FORM"}, {"c": "\u200e\ufced\u200e", "n": "ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM"}, {"c": "\u200e\ufc85\u200e", "n": "ARABIC LIGATURE LAM WITH MEEM FINAL FORM"}, {"c": "\u200e\ufc42\u200e", "n": "ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM"}], "\u200e\ufced\u200e": [{"c": "\u200e\u0644\u0645\u200e", "n": "ARABIC LETTER LAM, ARABIC LETTER MEEM"}], "\u200e\ufc85\u200e": [{"c": "\u200e\u0644\u0645\u200e", "n": "ARABIC LETTER LAM, ARABIC LETTER MEEM"}], "\u200e\ufc42\u200e": [{"c": "\u200e\u0644\u0645\u200e", "n": "ARABIC LETTER LAM, ARABIC LETTER MEEM"}], "\u200e\ufd88\u200e": [{"c": "\u200e\u0644\u0645\u062d\u200e", "n": "ARABIC LETTER LAM, ARABIC LETTER MEEM, ARABIC LETTER HAH"}], "\u200e\u0644\u0645\u062d\u200e": [{"c": "\u200e\ufd88\u200e", "n": "ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM"}, {"c": "\u200e\ufd87\u200e", "n": "ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM"}], "\u200e\ufd87\u200e": [{"c": "\u200e\u0644\u0645\u062d\u200e", "n": "ARABIC LETTER LAM, ARABIC LETTER MEEM, ARABIC LETTER HAH"}], "\u200e\ufdad\u200e": [{"c": "\u200e\u0644\u0645\u0649\u200e", "n": "ARABIC LETTER LAM, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u0644\u0645\u0649\u200e": [{"c": "\u200e\ufdad\u200e", "n": "ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM"}], "\u200e\ufc86\u200e": [{"c": "\u200e\u0644\u0649\u200e", "n": "ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u0644\u0649\u200e": [{"c": "\u200e\ufc86\u200e", "n": "ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM"}, {"c": "\u200e\ufc43\u200e", "n": "ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM"}, {"c": "\u200e\ufc87\u200e", "n": "ARABIC LIGATURE LAM WITH YEH FINAL FORM"}, {"c": "\u200e\ufc44\u200e", "n": "ARABIC LIGATURE LAM WITH YEH ISOLATED FORM"}], "\u200e\ufc43\u200e": [{"c": "\u200e\u0644\u0649\u200e", "n": "ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufc87\u200e": [{"c": "\u200e\u0644\u0649\u200e", "n": "ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufc44\u200e": [{"c": "\u200e\u0644\u0649\u200e", "n": "ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ud83b\ude0c\u200e": [{"c": "\u200e\u0645\u200e", "n": "ARABIC LETTER MEEM"}], "\u200e\u0645\u200e": [{"c": "\u200e\ud83b\ude0c\u200e", "n": "ARABIC MATHEMATICAL MEEM"}, {"c": "\u200e\ud83b\ude2c\u200e", "n": "ARABIC MATHEMATICAL INITIAL MEEM"}, {"c": "\u200e\ud83b\ude6c\u200e", "n": "ARABIC MATHEMATICAL STRETCHED MEEM"}, {"c": "\u200e\ud83b\ude8c\u200e", "n": "ARABIC MATHEMATICAL LOOPED MEEM"}, {"c": "\u200e\ud83b\udeac\u200e", "n": "ARABIC MATHEMATICAL DOUBLE-STRUCK MEEM"}, {"c": "\u200e\ufee3\u200e", "n": "ARABIC LETTER MEEM INITIAL FORM"}, {"c": "\u200e\ufee4\u200e", "n": "ARABIC LETTER MEEM MEDIAL FORM"}, {"c": "\u200e\ufee2\u200e", "n": "ARABIC LETTER MEEM FINAL FORM"}, {"c": "\u200e\ufee1\u200e", "n": "ARABIC LETTER MEEM ISOLATED FORM"}], "\u200e\ud83b\ude2c\u200e": [{"c": "\u200e\u0645\u200e", "n": "ARABIC LETTER MEEM"}], "\u200e\ud83b\ude6c\u200e": [{"c": "\u200e\u0645\u200e", "n": "ARABIC LETTER MEEM"}], "\u200e\ud83b\ude8c\u200e": [{"c": "\u200e\u0645\u200e", "n": "ARABIC LETTER MEEM"}], "\u200e\ud83b\udeac\u200e": [{"c": "\u200e\u0645\u200e", "n": "ARABIC LETTER MEEM"}], "\u200e\ufee3\u200e": [{"c": "\u200e\u0645\u200e", "n": "ARABIC LETTER MEEM"}], "\u200e\ufee4\u200e": [{"c": "\u200e\u0645\u200e", "n": "ARABIC LETTER MEEM"}], "\u200e\ufee2\u200e": [{"c": "\u200e\u0645\u200e", "n": "ARABIC LETTER MEEM"}], "\u200e\ufee1\u200e": [{"c": "\u200e\u0645\u200e", "n": "ARABIC LETTER MEEM"}], "\u200e\u08a7\u200e": [{"c": "\u200e\u0645\u06db\u200e", "n": "ARABIC LETTER MEEM, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\u0645\u06db\u200e": [{"c": "\u200e\u08a7\u200e", "n": "ARABIC LETTER MEEM WITH THREE DOTS ABOVE"}], "\u200e\u06fe\u200e": [{"c": "\u200e\u0645\u0348\u200e", "n": "ARABIC LETTER MEEM, COMBINING DOUBLE VERTICAL LINE BELOW"}], "\u200e\u0645\u0348\u200e": [{"c": "\u200e\u06fe\u200e", "n": "ARABIC SIGN SINDHI POSTPOSITION MEN"}], "\u200e\ufc88\u200e": [{"c": "\u200e\u0645l\u200e", "n": "ARABIC LETTER MEEM, LATIN SMALL LETTER L"}], "\u200e\u0645l\u200e": [{"c": "\u200e\ufc88\u200e", "n": "ARABIC LIGATURE MEEM WITH ALEF FINAL FORM"}], "\u200e\ufcce\u200e": [{"c": "\u200e\u0645\u062c\u200e", "n": "ARABIC LETTER MEEM, ARABIC LETTER JEEM"}], "\u200e\u0645\u062c\u200e": [{"c": "\u200e\ufcce\u200e", "n": "ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM"}, {"c": "\u200e\ufc45\u200e", "n": "ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM"}], "\u200e\ufc45\u200e": [{"c": "\u200e\u0645\u062c\u200e", "n": "ARABIC LETTER MEEM, ARABIC LETTER JEEM"}], "\u200e\ufd8c\u200e": [{"c": "\u200e\u0645\u062c\u062d\u200e", "n": "ARABIC LETTER MEEM, ARABIC LETTER JEEM, ARABIC LETTER HAH"}], "\u200e\u0645\u062c\u062d\u200e": [{"c": "\u200e\ufd8c\u200e", "n": "ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM"}], "\u200e\ufd92\u200e": [{"c": "\u200e\u0645\u062c\u062e\u200e", "n": "ARABIC LETTER MEEM, ARABIC LETTER JEEM, ARABIC LETTER KHAH"}], "\u200e\u0645\u062c\u062e\u200e": [{"c": "\u200e\ufd92\u200e", "n": "ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM"}], "\u200e\ufd8d\u200e": [{"c": "\u200e\u0645\u062c\u0645\u200e", "n": "ARABIC LETTER MEEM, ARABIC LETTER JEEM, ARABIC LETTER MEEM"}], "\u200e\u0645\u062c\u0645\u200e": [{"c": "\u200e\ufd8d\u200e", "n": "ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM"}], "\u200e\ufdc0\u200e": [{"c": "\u200e\u0645\u062c\u0649\u200e", "n": "ARABIC LETTER MEEM, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u0645\u062c\u0649\u200e": [{"c": "\u200e\ufdc0\u200e", "n": "ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM"}], "\u200e\ufccf\u200e": [{"c": "\u200e\u0645\u062d\u200e", "n": "ARABIC LETTER MEEM, ARABIC LETTER HAH"}], "\u200e\u0645\u062d\u200e": [{"c": "\u200e\ufccf\u200e", "n": "ARABIC LIGATURE MEEM WITH HAH INITIAL FORM"}, {"c": "\u200e\ufc46\u200e", "n": "ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM"}], "\u200e\ufc46\u200e": [{"c": "\u200e\u0645\u062d\u200e", "n": "ARABIC LETTER MEEM, ARABIC LETTER HAH"}], "\u200e\ufd89\u200e": [{"c": "\u200e\u0645\u062d\u062c\u200e", "n": "ARABIC LETTER MEEM, ARABIC LETTER HAH, ARABIC LETTER JEEM"}], "\u200e\u0645\u062d\u062c\u200e": [{"c": "\u200e\ufd89\u200e", "n": "ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM"}], "\u200e\ufd8a\u200e": [{"c": "\u200e\u0645\u062d\u0645\u200e", "n": "ARABIC LETTER MEEM, ARABIC LETTER HAH, ARABIC LETTER MEEM"}], "\u200e\u0645\u062d\u0645\u200e": [{"c": "\u200e\ufd8a\u200e", "n": "ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM"}], "\u200e\ufdf4\u200e": [{"c": "\u200e\u0645\u062d\u0645\u062f\u200e", "n": "ARABIC LETTER MEEM, ARABIC LETTER HAH, ARABIC LETTER MEEM, ARABIC LETTER DAL"}], "\u200e\u0645\u062d\u0645\u062f\u200e": [{"c": "\u200e\ufdf4\u200e", "n": "ARABIC LIGATURE MOHAMMAD ISOLATED FORM"}], "\u200e\ufd8b\u200e": [{"c": "\u200e\u0645\u062d\u0649\u200e", "n": "ARABIC LETTER MEEM, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u0645\u062d\u0649\u200e": [{"c": "\u200e\ufd8b\u200e", "n": "ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM"}], "\u200e\ufcd0\u200e": [{"c": "\u200e\u0645\u062e\u200e", "n": "ARABIC LETTER MEEM, ARABIC LETTER KHAH"}], "\u200e\u0645\u062e\u200e": [{"c": "\u200e\ufcd0\u200e", "n": "ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM"}, {"c": "\u200e\ufc47\u200e", "n": "ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM"}], "\u200e\ufc47\u200e": [{"c": "\u200e\u0645\u062e\u200e", "n": "ARABIC LETTER MEEM, ARABIC LETTER KHAH"}], "\u200e\ufd8e\u200e": [{"c": "\u200e\u0645\u062e\u062c\u200e", "n": "ARABIC LETTER MEEM, ARABIC LETTER KHAH, ARABIC LETTER JEEM"}], "\u200e\u0645\u062e\u062c\u200e": [{"c": "\u200e\ufd8e\u200e", "n": "ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM"}], "\u200e\ufd8f\u200e": [{"c": "\u200e\u0645\u062e\u0645\u200e", "n": "ARABIC LETTER MEEM, ARABIC LETTER KHAH, ARABIC LETTER MEEM"}], "\u200e\u0645\u062e\u0645\u200e": [{"c": "\u200e\ufd8f\u200e", "n": "ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM"}], "\u200e\ufdb9\u200e": [{"c": "\u200e\u0645\u062e\u0649\u200e", "n": "ARABIC LETTER MEEM, ARABIC LETTER KHAH, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u0645\u062e\u0649\u200e": [{"c": "\u200e\ufdb9\u200e", "n": "ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM"}], "\u200e\ufcd1\u200e": [{"c": "\u200e\u0645\u0645\u200e", "n": "ARABIC LETTER MEEM, ARABIC LETTER MEEM"}], "\u200e\u0645\u0645\u200e": [{"c": "\u200e\ufcd1\u200e", "n": "ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM"}, {"c": "\u200e\ufc89\u200e", "n": "ARABIC LIGATURE MEEM WITH MEEM FINAL FORM"}, {"c": "\u200e\ufc48\u200e", "n": "ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM"}], "\u200e\ufc89\u200e": [{"c": "\u200e\u0645\u0645\u200e", "n": "ARABIC LETTER MEEM, ARABIC LETTER MEEM"}], "\u200e\ufc48\u200e": [{"c": "\u200e\u0645\u0645\u200e", "n": "ARABIC LETTER MEEM, ARABIC LETTER MEEM"}], "\u200e\ufdb1\u200e": [{"c": "\u200e\u0645\u0645\u0649\u200e", "n": "ARABIC LETTER MEEM, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u0645\u0645\u0649\u200e": [{"c": "\u200e\ufdb1\u200e", "n": "ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM"}], "\u200e\ufc49\u200e": [{"c": "\u200e\u0645\u0649\u200e", "n": "ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u0645\u0649\u200e": [{"c": "\u200e\ufc49\u200e", "n": "ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM"}, {"c": "\u200e\ufc4a\u200e", "n": "ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM"}], "\u200e\ufc4a\u200e": [{"c": "\u200e\u0645\u0649\u200e", "n": "ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ud83b\ude0d\u200e": [{"c": "\u200e\u0646\u200e", "n": "ARABIC LETTER NOON"}], "\u200e\u0646\u200e": [{"c": "\u200e\ud83b\ude0d\u200e", "n": "ARABIC MATHEMATICAL NOON"}, {"c": "\u200e\ud83b\ude2d\u200e", "n": "ARABIC MATHEMATICAL INITIAL NOON"}, {"c": "\u200e\ud83b\ude4d\u200e", "n": "ARABIC MATHEMATICAL TAILED NOON"}, {"c": "\u200e\ud83b\ude6d\u200e", "n": "ARABIC MATHEMATICAL STRETCHED NOON"}, {"c": "\u200e\ud83b\ude8d\u200e", "n": "ARABIC MATHEMATICAL LOOPED NOON"}, {"c": "\u200e\ud83b\udead\u200e", "n": "ARABIC MATHEMATICAL DOUBLE-STRUCK NOON"}, {"c": "\u200e\ufee7\u200e", "n": "ARABIC LETTER NOON INITIAL FORM"}, {"c": "\u200e\ufee8\u200e", "n": "ARABIC LETTER NOON MEDIAL FORM"}, {"c": "\u200e\ufee6\u200e", "n": "ARABIC LETTER NOON FINAL FORM"}, {"c": "\u200e\ufee5\u200e", "n": "ARABIC LETTER NOON ISOLATED FORM"}], "\u200e\ud83b\ude2d\u200e": [{"c": "\u200e\u0646\u200e", "n": "ARABIC LETTER NOON"}], "\u200e\ud83b\ude4d\u200e": [{"c": "\u200e\u0646\u200e", "n": "ARABIC LETTER NOON"}], "\u200e\ud83b\ude6d\u200e": [{"c": "\u200e\u0646\u200e", "n": "ARABIC LETTER NOON"}], "\u200e\ud83b\ude8d\u200e": [{"c": "\u200e\u0646\u200e", "n": "ARABIC LETTER NOON"}], "\u200e\ud83b\udead\u200e": [{"c": "\u200e\u0646\u200e", "n": "ARABIC LETTER NOON"}], "\u200e\ufee7\u200e": [{"c": "\u200e\u0646\u200e", "n": "ARABIC LETTER NOON"}], "\u200e\ufee8\u200e": [{"c": "\u200e\u0646\u200e", "n": "ARABIC LETTER NOON"}], "\u200e\ufee6\u200e": [{"c": "\u200e\u0646\u200e", "n": "ARABIC LETTER NOON"}], "\u200e\ufee5\u200e": [{"c": "\u200e\u0646\u200e", "n": "ARABIC LETTER NOON"}], "\u200e\u0768\u200e": [{"c": "\u200e\u0646\u0615\u200e", "n": "ARABIC LETTER NOON, ARABIC SMALL HIGH TAH"}], "\u200e\u0646\u0615\u200e": [{"c": "\u200e\u0768\u200e", "n": "ARABIC LETTER NOON WITH SMALL TAH"}], "\u200e\u0769\u200e": [{"c": "\u200e\u0646\u0306\u200e", "n": "ARABIC LETTER NOON, COMBINING BREVE"}], "\u200e\u0646\u0306\u200e": [{"c": "\u200e\u0769\u200e", "n": "ARABIC LETTER NOON WITH SMALL V"}], "\u200e\ufcd6\u200e": [{"c": "\u200e\u0646o\u200e", "n": "ARABIC LETTER NOON, LATIN SMALL LETTER O"}], "\u200e\u0646o\u200e": [{"c": "\u200e\ufcd6\u200e", "n": "ARABIC LIGATURE NOON WITH HEH INITIAL FORM"}, {"c": "\u200e\ufcef\u200e", "n": "ARABIC LIGATURE NOON WITH HEH MEDIAL FORM"}], "\u200e\ufcef\u200e": [{"c": "\u200e\u0646o\u200e", "n": "ARABIC LETTER NOON, LATIN SMALL LETTER O"}], "\u200e\ufdb8\u200e": [{"c": "\u200e\u0646\u062c\u062d\u200e", "n": "ARABIC LETTER NOON, ARABIC LETTER JEEM, ARABIC LETTER HAH"}], "\u200e\u0646\u062c\u062d\u200e": [{"c": "\u200e\ufdb8\u200e", "n": "ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM"}, {"c": "\u200e\ufdbd\u200e", "n": "ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM"}], "\u200e\ufdbd\u200e": [{"c": "\u200e\u0646\u062c\u062d\u200e", "n": "ARABIC LETTER NOON, ARABIC LETTER JEEM, ARABIC LETTER HAH"}], "\u200e\ufd98\u200e": [{"c": "\u200e\u0646\u062c\u0645\u200e", "n": "ARABIC LETTER NOON, ARABIC LETTER JEEM, ARABIC LETTER MEEM"}], "\u200e\u0646\u062c\u0645\u200e": [{"c": "\u200e\ufd98\u200e", "n": "ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM"}, {"c": "\u200e\ufd97\u200e", "n": "ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM"}], "\u200e\ufd97\u200e": [{"c": "\u200e\u0646\u062c\u0645\u200e", "n": "ARABIC LETTER NOON, ARABIC LETTER JEEM, ARABIC LETTER MEEM"}], "\u200e\ufd99\u200e": [{"c": "\u200e\u0646\u062c\u0649\u200e", "n": "ARABIC LETTER NOON, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u0646\u062c\u0649\u200e": [{"c": "\u200e\ufd99\u200e", "n": "ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM"}, {"c": "\u200e\ufdc7\u200e", "n": "ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM"}], "\u200e\ufdc7\u200e": [{"c": "\u200e\u0646\u062c\u0649\u200e", "n": "ARABIC LETTER NOON, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufcd3\u200e": [{"c": "\u200e\u0646\u062d\u200e", "n": "ARABIC LETTER NOON, ARABIC LETTER HAH"}], "\u200e\u0646\u062d\u200e": [{"c": "\u200e\ufcd3\u200e", "n": "ARABIC LIGATURE NOON WITH HAH INITIAL FORM"}, {"c": "\u200e\ufc4c\u200e", "n": "ARABIC LIGATURE NOON WITH HAH ISOLATED FORM"}], "\u200e\ufc4c\u200e": [{"c": "\u200e\u0646\u062d\u200e", "n": "ARABIC LETTER NOON, ARABIC LETTER HAH"}], "\u200e\ufd95\u200e": [{"c": "\u200e\u0646\u062d\u0645\u200e", "n": "ARABIC LETTER NOON, ARABIC LETTER HAH, ARABIC LETTER MEEM"}], "\u200e\u0646\u062d\u0645\u200e": [{"c": "\u200e\ufd95\u200e", "n": "ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM"}], "\u200e\ufd96\u200e": [{"c": "\u200e\u0646\u062d\u0649\u200e", "n": "ARABIC LETTER NOON, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u0646\u062d\u0649\u200e": [{"c": "\u200e\ufd96\u200e", "n": "ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM"}, {"c": "\u200e\ufdb3\u200e", "n": "ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM"}], "\u200e\ufdb3\u200e": [{"c": "\u200e\u0646\u062d\u0649\u200e", "n": "ARABIC LETTER NOON, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufcd4\u200e": [{"c": "\u200e\u0646\u062e\u200e", "n": "ARABIC LETTER NOON, ARABIC LETTER KHAH"}], "\u200e\u0646\u062e\u200e": [{"c": "\u200e\ufcd4\u200e", "n": "ARABIC LIGATURE NOON WITH KHAH INITIAL FORM"}, {"c": "\u200e\ufc4d\u200e", "n": "ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM"}], "\u200e\ufc4d\u200e": [{"c": "\u200e\u0646\u062e\u200e", "n": "ARABIC LETTER NOON, ARABIC LETTER KHAH"}], "\u200e\ufc8a\u200e": [{"c": "\u200e\u0646\u0631\u200e", "n": "ARABIC LETTER NOON, ARABIC LETTER REH"}], "\u200e\u0646\u0631\u200e": [{"c": "\u200e\ufc8a\u200e", "n": "ARABIC LIGATURE NOON WITH REH FINAL FORM"}], "\u200e\ufc8b\u200e": [{"c": "\u200e\u0646\u0632\u200e", "n": "ARABIC LETTER NOON, ARABIC LETTER ZAIN"}], "\u200e\u0646\u0632\u200e": [{"c": "\u200e\ufc8b\u200e", "n": "ARABIC LIGATURE NOON WITH ZAIN FINAL FORM"}], "\u200e\ufcd5\u200e": [{"c": "\u200e\u0646\u0645\u200e", "n": "ARABIC LETTER NOON, ARABIC LETTER MEEM"}], "\u200e\u0646\u0645\u200e": [{"c": "\u200e\ufcd5\u200e", "n": "ARABIC LIGATURE NOON WITH MEEM INITIAL FORM"}, {"c": "\u200e\ufcee\u200e", "n": "ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM"}, {"c": "\u200e\ufc8c\u200e", "n": "ARABIC LIGATURE NOON WITH MEEM FINAL FORM"}, {"c": "\u200e\ufc4e\u200e", "n": "ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM"}], "\u200e\ufcee\u200e": [{"c": "\u200e\u0646\u0645\u200e", "n": "ARABIC LETTER NOON, ARABIC LETTER MEEM"}], "\u200e\ufc8c\u200e": [{"c": "\u200e\u0646\u0645\u200e", "n": "ARABIC LETTER NOON, ARABIC LETTER MEEM"}], "\u200e\ufc4e\u200e": [{"c": "\u200e\u0646\u0645\u200e", "n": "ARABIC LETTER NOON, ARABIC LETTER MEEM"}], "\u200e\ufd9b\u200e": [{"c": "\u200e\u0646\u0645\u0649\u200e", "n": "ARABIC LETTER NOON, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u0646\u0645\u0649\u200e": [{"c": "\u200e\ufd9b\u200e", "n": "ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM"}, {"c": "\u200e\ufd9a\u200e", "n": "ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM"}], "\u200e\ufd9a\u200e": [{"c": "\u200e\u0646\u0645\u0649\u200e", "n": "ARABIC LETTER NOON, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufc8d\u200e": [{"c": "\u200e\u0646\u0646\u200e", "n": "ARABIC LETTER NOON, ARABIC LETTER NOON"}], "\u200e\u0646\u0646\u200e": [{"c": "\u200e\ufc8d\u200e", "n": "ARABIC LIGATURE NOON WITH NOON FINAL FORM"}], "\u200e\ufc8e\u200e": [{"c": "\u200e\u0646\u0649\u200e", "n": "ARABIC LETTER NOON, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u0646\u0649\u200e": [{"c": "\u200e\ufc8e\u200e", "n": "ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM"}, {"c": "\u200e\ufc4f\u200e", "n": "ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM"}, {"c": "\u200e\ufc8f\u200e", "n": "ARABIC LIGATURE NOON WITH YEH FINAL FORM"}, {"c": "\u200e\ufc50\u200e", "n": "ARABIC LIGATURE NOON WITH YEH ISOLATED FORM"}], "\u200e\ufc4f\u200e": [{"c": "\u200e\u0646\u0649\u200e", "n": "ARABIC LETTER NOON, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufc8f\u200e": [{"c": "\u200e\u0646\u0649\u200e", "n": "ARABIC LETTER NOON, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufc50\u200e": [{"c": "\u200e\u0646\u0649\u200e", "n": "ARABIC LETTER NOON, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u06c2\u200e": [{"c": "\u200e\u06c0\u200e", "n": "ARABIC LETTER HEH WITH YEH ABOVE"}], "\u200e\u06c0\u200e": [{"c": "\u200e\u06c2\u200e", "n": "ARABIC LETTER HEH GOAL WITH HAMZA ABOVE"}, {"c": "\u200e\ufba5\u200e", "n": "ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM"}, {"c": "\u200e\ufba4\u200e", "n": "ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM"}], "\u200e\ufba5\u200e": [{"c": "\u200e\u06c0\u200e", "n": "ARABIC LETTER HEH WITH YEH ABOVE"}], "\u200e\ufba4\u200e": [{"c": "\u200e\u06c0\u200e", "n": "ARABIC LETTER HEH WITH YEH ABOVE"}], "\ud800\udee4": [{"c": "\u200e\u0648\u200e", "n": "ARABIC LETTER WAW"}], "\u200e\u0648\u200e": [{"c": "\ud800\udee4", "n": "COPTIC EPACT DIGIT FOUR"}, {"c": "\u200e\ud83b\ude05\u200e", "n": "ARABIC MATHEMATICAL WAW"}, {"c": "\u200e\ud83b\ude85\u200e", "n": "ARABIC MATHEMATICAL LOOPED WAW"}, {"c": "\u200e\ud83b\udea5\u200e", "n": "ARABIC MATHEMATICAL DOUBLE-STRUCK WAW"}, {"c": "\u200e\ufeee\u200e", "n": "ARABIC LETTER WAW FINAL FORM"}, {"c": "\u200e\ufeed\u200e", "n": "ARABIC LETTER WAW ISOLATED FORM"}, {"c": "\u200e\u08b1\u200e", "n": "ARABIC LETTER STRAIGHT WAW"}], "\u200e\ud83b\ude05\u200e": [{"c": "\u200e\u0648\u200e", "n": "ARABIC LETTER WAW"}], "\u200e\ud83b\ude85\u200e": [{"c": "\u200e\u0648\u200e", "n": "ARABIC LETTER WAW"}], "\u200e\ud83b\udea5\u200e": [{"c": "\u200e\u0648\u200e", "n": "ARABIC LETTER WAW"}], "\u200e\ufeee\u200e": [{"c": "\u200e\u0648\u200e", "n": "ARABIC LETTER WAW"}], "\u200e\ufeed\u200e": [{"c": "\u200e\u0648\u200e", "n": "ARABIC LETTER WAW"}], "\u200e\u08b1\u200e": [{"c": "\u200e\u0648\u200e", "n": "ARABIC LETTER WAW"}], "\u200e\u06cb\u200e": [{"c": "\u200e\u0648\u06db\u200e", "n": "ARABIC LETTER WAW, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\u0648\u06db\u200e": [{"c": "\u200e\u06cb\u200e", "n": "ARABIC LETTER VE"}, {"c": "\u200e\ufbdf\u200e", "n": "ARABIC LETTER VE FINAL FORM"}, {"c": "\u200e\ufbde\u200e", "n": "ARABIC LETTER VE ISOLATED FORM"}], "\u200e\ufbdf\u200e": [{"c": "\u200e\u0648\u06db\u200e", "n": "ARABIC LETTER WAW, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\ufbde\u200e": [{"c": "\u200e\u0648\u06db\u200e", "n": "ARABIC LETTER WAW, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\u06c7\u200e": [{"c": "\u200e\u0648\u0313\u200e", "n": "ARABIC LETTER WAW, COMBINING COMMA ABOVE"}], "\u200e\u0648\u0313\u200e": [{"c": "\u200e\u06c7\u200e", "n": "ARABIC LETTER U"}, {"c": "\u200e\ufbd8\u200e", "n": "ARABIC LETTER U FINAL FORM"}, {"c": "\u200e\ufbd7\u200e", "n": "ARABIC LETTER U ISOLATED FORM"}], "\u200e\ufbd8\u200e": [{"c": "\u200e\u0648\u0313\u200e", "n": "ARABIC LETTER WAW, COMBINING COMMA ABOVE"}], "\u200e\ufbd7\u200e": [{"c": "\u200e\u0648\u0313\u200e", "n": "ARABIC LETTER WAW, COMBINING COMMA ABOVE"}], "\u200e\u06c6\u200e": [{"c": "\u200e\u0648\u0306\u200e", "n": "ARABIC LETTER WAW, COMBINING BREVE"}], "\u200e\u0648\u0306\u200e": [{"c": "\u200e\u06c6\u200e", "n": "ARABIC LETTER OE"}, {"c": "\u200e\ufbda\u200e", "n": "ARABIC LETTER OE FINAL FORM"}, {"c": "\u200e\ufbd9\u200e", "n": "ARABIC LETTER OE ISOLATED FORM"}], "\u200e\ufbda\u200e": [{"c": "\u200e\u0648\u0306\u200e", "n": "ARABIC LETTER WAW, COMBINING BREVE"}], "\u200e\ufbd9\u200e": [{"c": "\u200e\u0648\u0306\u200e", "n": "ARABIC LETTER WAW, COMBINING BREVE"}], "\u200e\u06c9\u200e": [{"c": "\u200e\u0648\u0302\u200e", "n": "ARABIC LETTER WAW, COMBINING CIRCUMFLEX ACCENT"}], "\u200e\u0648\u0302\u200e": [{"c": "\u200e\u06c9\u200e", "n": "ARABIC LETTER KIRGHIZ YU"}, {"c": "\u200e\ufbe3\u200e", "n": "ARABIC LETTER KIRGHIZ YU FINAL FORM"}, {"c": "\u200e\ufbe2\u200e", "n": "ARABIC LETTER KIRGHIZ YU ISOLATED FORM"}], "\u200e\ufbe3\u200e": [{"c": "\u200e\u0648\u0302\u200e", "n": "ARABIC LETTER WAW, COMBINING CIRCUMFLEX ACCENT"}], "\u200e\ufbe2\u200e": [{"c": "\u200e\u0648\u0302\u200e", "n": "ARABIC LETTER WAW, COMBINING CIRCUMFLEX ACCENT"}], "\u200e\u06c8\u200e": [{"c": "\u200e\u0648\u0670\u200e", "n": "ARABIC LETTER WAW, ARABIC LETTER SUPERSCRIPT ALEF"}], "\u200e\u0648\u0670\u200e": [{"c": "\u200e\u06c8\u200e", "n": "ARABIC LETTER YU"}, {"c": "\u200e\ufbdc\u200e", "n": "ARABIC LETTER YU FINAL FORM"}, {"c": "\u200e\ufbdb\u200e", "n": "ARABIC LETTER YU ISOLATED FORM"}], "\u200e\ufbdc\u200e": [{"c": "\u200e\u0648\u0670\u200e", "n": "ARABIC LETTER WAW, ARABIC LETTER SUPERSCRIPT ALEF"}], "\u200e\ufbdb\u200e": [{"c": "\u200e\u0648\u0670\u200e", "n": "ARABIC LETTER WAW, ARABIC LETTER SUPERSCRIPT ALEF"}], "\u200e\u0624\u200e": [{"c": "\u200e\u0648\u0674\u200e", "n": "ARABIC LETTER WAW, ARABIC LETTER HIGH HAMZA"}], "\u200e\u0648\u0674\u200e": [{"c": "\u200e\u0624\u200e", "n": "ARABIC LETTER WAW WITH HAMZA ABOVE"}, {"c": "\u200e\ufe86\u200e", "n": "ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM"}, {"c": "\u200e\ufe85\u200e", "n": "ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM"}, {"c": "\u200e\u0676\u200e", "n": "ARABIC LETTER HIGH HAMZA WAW"}], "\u200e\ufe86\u200e": [{"c": "\u200e\u0648\u0674\u200e", "n": "ARABIC LETTER WAW, ARABIC LETTER HIGH HAMZA"}], "\u200e\ufe85\u200e": [{"c": "\u200e\u0648\u0674\u200e", "n": "ARABIC LETTER WAW, ARABIC LETTER HIGH HAMZA"}], "\u200e\u0676\u200e": [{"c": "\u200e\u0648\u0674\u200e", "n": "ARABIC LETTER WAW, ARABIC LETTER HIGH HAMZA"}], "\u200e\u0677\u200e": [{"c": "\u200e\u0648\u0313\u0674\u200e", "n": "ARABIC LETTER WAW, COMBINING COMMA ABOVE, ARABIC LETTER HIGH HAMZA"}], "\u200e\u0648\u0313\u0674\u200e": [{"c": "\u200e\u0677\u200e", "n": "ARABIC LETTER U WITH HAMZA ABOVE"}, {"c": "\u200e\ufbdd\u200e", "n": "ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM"}], "\u200e\ufbdd\u200e": [{"c": "\u200e\u0648\u0313\u0674\u200e", "n": "ARABIC LETTER WAW, COMBINING COMMA ABOVE, ARABIC LETTER HIGH HAMZA"}], "\u200e\ufdf8\u200e": [{"c": "\u200e\u0648\u0633\u0644\u0645\u200e", "n": "ARABIC LETTER WAW, ARABIC LETTER SEEN, ARABIC LETTER LAM, ARABIC LETTER MEEM"}], "\u200e\u0648\u0633\u0644\u0645\u200e": [{"c": "\u200e\ufdf8\u200e", "n": "ARABIC LIGATURE WASALLAM ISOLATED FORM"}], "\u200e\ufbe1\u200e": [{"c": "\u200e\u06c5\u200e", "n": "ARABIC LETTER KIRGHIZ OE"}], "\u200e\u06c5\u200e": [{"c": "\u200e\ufbe1\u200e", "n": "ARABIC LETTER KIRGHIZ OE FINAL FORM"}, {"c": "\u200e\ufbe0\u200e", "n": "ARABIC LETTER KIRGHIZ OE ISOLATED FORM"}], "\u200e\ufbe0\u200e": [{"c": "\u200e\u06c5\u200e", "n": "ARABIC LETTER KIRGHIZ OE"}], "\u200e\u066e\u200e": [{"c": "\u200e\u0649\u200e", "n": "ARABIC LETTER ALEF MAKSURA"}], "\u200e\u0649\u200e": [{"c": "\u200e\u066e\u200e", "n": "ARABIC LETTER DOTLESS BEH"}, {"c": "\u200e\ud83b\ude1c\u200e", "n": "ARABIC MATHEMATICAL DOTLESS BEH"}, {"c": "\u200e\ud83b\ude7c\u200e", "n": "ARABIC MATHEMATICAL STRETCHED DOTLESS BEH"}, {"c": "\u200e\u06ba\u200e", "n": "ARABIC LETTER NOON GHUNNA"}, {"c": "\u200e\ud83b\ude1d\u200e", "n": "ARABIC MATHEMATICAL DOTLESS NOON"}, {"c": "\u200e\ud83b\ude5d\u200e", "n": "ARABIC MATHEMATICAL TAILED DOTLESS NOON"}, {"c": "\u200e\ufb9f\u200e", "n": "ARABIC LETTER NOON GHUNNA FINAL FORM"}, {"c": "\u200e\ufb9e\u200e", "n": "ARABIC LETTER NOON GHUNNA ISOLATED FORM"}, {"c": "\u200e\u08bd\u200e", "n": "ARABIC LETTER AFRICAN NOON"}, {"c": "\u200e\ufbe8\u200e", "n": "ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM"}, {"c": "\u200e\ufbe9\u200e", "n": "ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM"}, {"c": "\u200e\ufef0\u200e", "n": "ARABIC LETTER ALEF MAKSURA FINAL FORM"}, {"c": "\u200e\ufeef\u200e", "n": "ARABIC LETTER ALEF MAKSURA ISOLATED FORM"}, {"c": "\u200e\u064a\u200e", "n": "ARABIC LETTER YEH"}, {"c": "\u200e\ud83b\ude09\u200e", "n": "ARABIC MATHEMATICAL YEH"}, {"c": "\u200e\ud83b\ude29\u200e", "n": "ARABIC MATHEMATICAL INITIAL YEH"}, {"c": "\u200e\ud83b\ude49\u200e", "n": "ARABIC MATHEMATICAL TAILED YEH"}, {"c": "\u200e\ud83b\ude69\u200e", "n": "ARABIC MATHEMATICAL STRETCHED YEH"}, {"c": "\u200e\ud83b\ude89\u200e", "n": "ARABIC MATHEMATICAL LOOPED YEH"}, {"c": "\u200e\ud83b\udea9\u200e", "n": "ARABIC MATHEMATICAL DOUBLE-STRUCK YEH"}, {"c": "\u200e\ufef3\u200e", "n": "ARABIC LETTER YEH INITIAL FORM"}, {"c": "\u200e\ufef4\u200e", "n": "ARABIC LETTER YEH MEDIAL FORM"}, {"c": "\u200e\ufef2\u200e", "n": "ARABIC LETTER YEH FINAL FORM"}, {"c": "\u200e\ufef1\u200e", "n": "ARABIC LETTER YEH ISOLATED FORM"}, {"c": "\u200e\u06cc\u200e", "n": "ARABIC LETTER FARSI YEH"}, {"c": "\u200e\ufbfe\u200e", "n": "ARABIC LETTER FARSI YEH INITIAL FORM"}, {"c": "\u200e\ufbff\u200e", "n": "ARABIC LETTER FARSI YEH MEDIAL FORM"}, {"c": "\u200e\ufbfd\u200e", "n": "ARABIC LETTER FARSI YEH FINAL FORM"}, {"c": "\u200e\ufbfc\u200e", "n": "ARABIC LETTER FARSI YEH ISOLATED FORM"}, {"c": "\u200e\u06d2\u200e", "n": "ARABIC LETTER YEH BARREE"}, {"c": "\u200e\ufbaf\u200e", "n": "ARABIC LETTER YEH BARREE FINAL FORM"}, {"c": "\u200e\ufbae\u200e", "n": "ARABIC LETTER YEH BARREE ISOLATED FORM"}], "\u200e\ud83b\ude1c\u200e": [{"c": "\u200e\u0649\u200e", "n": "ARABIC LETTER ALEF MAKSURA"}], "\u200e\ud83b\ude7c\u200e": [{"c": "\u200e\u0649\u200e", "n": "ARABIC LETTER ALEF MAKSURA"}], "\u200e\u06ba\u200e": [{"c": "\u200e\u0649\u200e", "n": "ARABIC LETTER ALEF MAKSURA"}], "\u200e\ud83b\ude1d\u200e": [{"c": "\u200e\u0649\u200e", "n": "ARABIC LETTER ALEF MAKSURA"}], "\u200e\ud83b\ude5d\u200e": [{"c": "\u200e\u0649\u200e", "n": "ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufb9f\u200e": [{"c": "\u200e\u0649\u200e", "n": "ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufb9e\u200e": [{"c": "\u200e\u0649\u200e", "n": "ARABIC LETTER ALEF MAKSURA"}], "\u200e\u08bd\u200e": [{"c": "\u200e\u0649\u200e", "n": "ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufbe8\u200e": [{"c": "\u200e\u0649\u200e", "n": "ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufbe9\u200e": [{"c": "\u200e\u0649\u200e", "n": "ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufef0\u200e": [{"c": "\u200e\u0649\u200e", "n": "ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufeef\u200e": [{"c": "\u200e\u0649\u200e", "n": "ARABIC LETTER ALEF MAKSURA"}], "\u200e\u064a\u200e": [{"c": "\u200e\u0649\u200e", "n": "ARABIC LETTER ALEF MAKSURA"}], "\u200e\ud83b\ude09\u200e": [{"c": "\u200e\u0649\u200e", "n": "ARABIC LETTER ALEF MAKSURA"}], "\u200e\ud83b\ude29\u200e": [{"c": "\u200e\u0649\u200e", "n": "ARABIC LETTER ALEF MAKSURA"}], "\u200e\ud83b\ude49\u200e": [{"c": "\u200e\u0649\u200e", "n": "ARABIC LETTER ALEF MAKSURA"}], "\u200e\ud83b\ude69\u200e": [{"c": "\u200e\u0649\u200e", "n": "ARABIC LETTER ALEF MAKSURA"}], "\u200e\ud83b\ude89\u200e": [{"c": "\u200e\u0649\u200e", "n": "ARABIC LETTER ALEF MAKSURA"}], "\u200e\ud83b\udea9\u200e": [{"c": "\u200e\u0649\u200e", "n": "ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufef3\u200e": [{"c": "\u200e\u0649\u200e", "n": "ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufef4\u200e": [{"c": "\u200e\u0649\u200e", "n": "ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufef2\u200e": [{"c": "\u200e\u0649\u200e", "n": "ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufef1\u200e": [{"c": "\u200e\u0649\u200e", "n": "ARABIC LETTER ALEF MAKSURA"}], "\u200e\u06cc\u200e": [{"c": "\u200e\u0649\u200e", "n": "ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufbfe\u200e": [{"c": "\u200e\u0649\u200e", "n": "ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufbff\u200e": [{"c": "\u200e\u0649\u200e", "n": "ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufbfd\u200e": [{"c": "\u200e\u0649\u200e", "n": "ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufbfc\u200e": [{"c": "\u200e\u0649\u200e", "n": "ARABIC LETTER ALEF MAKSURA"}], "\u200e\u06d2\u200e": [{"c": "\u200e\u0649\u200e", "n": "ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufbaf\u200e": [{"c": "\u200e\u0649\u200e", "n": "ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufbae\u200e": [{"c": "\u200e\u0649\u200e", "n": "ARABIC LETTER ALEF MAKSURA"}], "\u200e\u0679\u200e": [{"c": "\u200e\u0649\u0615\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH TAH"}], "\u200e\u0649\u0615\u200e": [{"c": "\u200e\u0679\u200e", "n": "ARABIC LETTER TTEH"}, {"c": "\u200e\ufb68\u200e", "n": "ARABIC LETTER TTEH INITIAL FORM"}, {"c": "\u200e\ufb69\u200e", "n": "ARABIC LETTER TTEH MEDIAL FORM"}, {"c": "\u200e\ufb67\u200e", "n": "ARABIC LETTER TTEH FINAL FORM"}, {"c": "\u200e\ufb66\u200e", "n": "ARABIC LETTER TTEH ISOLATED FORM"}, {"c": "\u200e\u06bb\u200e", "n": "ARABIC LETTER RNOON"}, {"c": "\u200e\ufba2\u200e", "n": "ARABIC LETTER RNOON INITIAL FORM"}, {"c": "\u200e\ufba3\u200e", "n": "ARABIC LETTER RNOON MEDIAL FORM"}, {"c": "\u200e\ufba1\u200e", "n": "ARABIC LETTER RNOON FINAL FORM"}, {"c": "\u200e\ufba0\u200e", "n": "ARABIC LETTER RNOON ISOLATED FORM"}], "\u200e\ufb68\u200e": [{"c": "\u200e\u0649\u0615\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH TAH"}], "\u200e\ufb69\u200e": [{"c": "\u200e\u0649\u0615\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH TAH"}], "\u200e\ufb67\u200e": [{"c": "\u200e\u0649\u0615\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH TAH"}], "\u200e\ufb66\u200e": [{"c": "\u200e\u0649\u0615\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH TAH"}], "\u200e\u06bb\u200e": [{"c": "\u200e\u0649\u0615\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH TAH"}], "\u200e\ufba2\u200e": [{"c": "\u200e\u0649\u0615\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH TAH"}], "\u200e\ufba3\u200e": [{"c": "\u200e\u0649\u0615\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH TAH"}], "\u200e\ufba1\u200e": [{"c": "\u200e\u0649\u0615\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH TAH"}], "\u200e\ufba0\u200e": [{"c": "\u200e\u0649\u0615\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH TAH"}], "\u200e\u067e\u200e": [{"c": "\u200e\u0649\u06db\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\u0649\u06db\u200e": [{"c": "\u200e\u067e\u200e", "n": "ARABIC LETTER PEH"}, {"c": "\u200e\ufb58\u200e", "n": "ARABIC LETTER PEH INITIAL FORM"}, {"c": "\u200e\ufb59\u200e", "n": "ARABIC LETTER PEH MEDIAL FORM"}, {"c": "\u200e\ufb57\u200e", "n": "ARABIC LETTER PEH FINAL FORM"}, {"c": "\u200e\ufb56\u200e", "n": "ARABIC LETTER PEH ISOLATED FORM"}, {"c": "\u200e\u062b\u200e", "n": "ARABIC LETTER THEH"}, {"c": "\u200e\ud83b\ude16\u200e", "n": "ARABIC MATHEMATICAL THEH"}, {"c": "\u200e\ud83b\ude36\u200e", "n": "ARABIC MATHEMATICAL INITIAL THEH"}, {"c": "\u200e\ud83b\ude76\u200e", "n": "ARABIC MATHEMATICAL STRETCHED THEH"}, {"c": "\u200e\ud83b\ude96\u200e", "n": "ARABIC MATHEMATICAL LOOPED THEH"}, {"c": "\u200e\ud83b\udeb6\u200e", "n": "ARABIC MATHEMATICAL DOUBLE-STRUCK THEH"}, {"c": "\u200e\ufe9b\u200e", "n": "ARABIC LETTER THEH INITIAL FORM"}, {"c": "\u200e\ufe9c\u200e", "n": "ARABIC LETTER THEH MEDIAL FORM"}, {"c": "\u200e\ufe9a\u200e", "n": "ARABIC LETTER THEH FINAL FORM"}, {"c": "\u200e\ufe99\u200e", "n": "ARABIC LETTER THEH ISOLATED FORM"}, {"c": "\u200e\u06bd\u200e", "n": "ARABIC LETTER NOON WITH THREE DOTS ABOVE"}, {"c": "\u200e\u06d1\u200e", "n": "ARABIC LETTER YEH WITH THREE DOTS BELOW"}, {"c": "\u200e\u063f\u200e", "n": "ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE"}], "\u200e\ufb58\u200e": [{"c": "\u200e\u0649\u06db\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\ufb59\u200e": [{"c": "\u200e\u0649\u06db\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\ufb57\u200e": [{"c": "\u200e\u0649\u06db\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\ufb56\u200e": [{"c": "\u200e\u0649\u06db\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\u062b\u200e": [{"c": "\u200e\u0649\u06db\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\ud83b\ude16\u200e": [{"c": "\u200e\u0649\u06db\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\ud83b\ude36\u200e": [{"c": "\u200e\u0649\u06db\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\ud83b\ude76\u200e": [{"c": "\u200e\u0649\u06db\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\ud83b\ude96\u200e": [{"c": "\u200e\u0649\u06db\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\ud83b\udeb6\u200e": [{"c": "\u200e\u0649\u06db\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\ufe9b\u200e": [{"c": "\u200e\u0649\u06db\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\ufe9c\u200e": [{"c": "\u200e\u0649\u06db\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\ufe9a\u200e": [{"c": "\u200e\u0649\u06db\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\ufe99\u200e": [{"c": "\u200e\u0649\u06db\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\u06bd\u200e": [{"c": "\u200e\u0649\u06db\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\u06d1\u200e": [{"c": "\u200e\u0649\u06db\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\u063f\u200e": [{"c": "\u200e\u0649\u06db\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS"}], "\u200e\u08b7\u200e": [{"c": "\u200e\u0649\u06db\u06e2\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS, ARABIC SMALL HIGH MEEM ISOLATED FORM"}], "\u200e\u0649\u06db\u06e2\u200e": [{"c": "\u200e\u08b7\u200e", "n": "ARABIC LETTER PEH WITH SMALL MEEM ABOVE"}], "\u200e\u0756\u200e": [{"c": "\u200e\u0649\u0306\u200e", "n": "ARABIC LETTER ALEF MAKSURA, COMBINING BREVE"}], "\u200e\u0649\u0306\u200e": [{"c": "\u200e\u0756\u200e", "n": "ARABIC LETTER BEH WITH SMALL V"}, {"c": "\u200e\u06ce\u200e", "n": "ARABIC LETTER YEH WITH SMALL V"}], "\u200e\u06ce\u200e": [{"c": "\u200e\u0649\u0306\u200e", "n": "ARABIC LETTER ALEF MAKSURA, COMBINING BREVE"}], "\u200e\u08ba\u200e": [{"c": "\u200e\u0649\u0306\u0307\u200e", "n": "ARABIC LETTER ALEF MAKSURA, COMBINING BREVE, COMBINING DOT ABOVE"}], "\u200e\u0649\u0306\u0307\u200e": [{"c": "\u200e\u08ba\u200e", "n": "ARABIC LETTER YEH WITH TWO DOTS BELOW AND SMALL NOON ABOVE"}], "\u200e\u063d\u200e": [{"c": "\u200e\u0649\u0302\u200e", "n": "ARABIC LETTER ALEF MAKSURA, COMBINING CIRCUMFLEX ACCENT"}], "\u200e\u0649\u0302\u200e": [{"c": "\u200e\u063d\u200e", "n": "ARABIC LETTER FARSI YEH WITH INVERTED V"}], "\u200e\u08a8\u200e": [{"c": "\u200e\u0649\u0654\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC HAMZA ABOVE"}], "\u200e\u0649\u0654\u200e": [{"c": "\u200e\u08a8\u200e", "n": "ARABIC LETTER YEH WITH TWO DOTS BELOW AND HAMZA ABOVE"}], "\u200e\ufc90\u200e": [{"c": "\u200e\u0649\u0670\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER SUPERSCRIPT ALEF"}], "\u200e\u0649\u0670\u200e": [{"c": "\u200e\ufc90\u200e", "n": "ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM"}, {"c": "\u200e\ufc5d\u200e", "n": "ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM"}], "\u200e\ufc5d\u200e": [{"c": "\u200e\u0649\u0670\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER SUPERSCRIPT ALEF"}], "\u200e\ufcde\u200e": [{"c": "\u200e\u0649o\u200e", "n": "ARABIC LETTER ALEF MAKSURA, LATIN SMALL LETTER O"}], "\u200e\u0649o\u200e": [{"c": "\u200e\ufcde\u200e", "n": "ARABIC LIGATURE YEH WITH HEH INITIAL FORM"}, {"c": "\u200e\ufcf1\u200e", "n": "ARABIC LIGATURE YEH WITH HEH MEDIAL FORM"}], "\u200e\ufcf1\u200e": [{"c": "\u200e\u0649o\u200e", "n": "ARABIC LETTER ALEF MAKSURA, LATIN SMALL LETTER O"}], "\u200e\ufce6\u200e": [{"c": "\u200e\u0649\u06dbo\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS, LATIN SMALL LETTER O"}], "\u200e\u0649\u06dbo\u200e": [{"c": "\u200e\ufce6\u200e", "n": "ARABIC LIGATURE THEH WITH HEH MEDIAL FORM"}], "\u200e\u0626\u200e": [{"c": "\u200e\u0649\u0674\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA"}], "\u200e\u0649\u0674\u200e": [{"c": "\u200e\u0626\u200e", "n": "ARABIC LETTER YEH WITH HAMZA ABOVE"}, {"c": "\u200e\ufe8b\u200e", "n": "ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM"}, {"c": "\u200e\ufe8c\u200e", "n": "ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM"}, {"c": "\u200e\ufe8a\u200e", "n": "ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM"}, {"c": "\u200e\ufe89\u200e", "n": "ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM"}, {"c": "\u200e\u0678\u200e", "n": "ARABIC LETTER HIGH HAMZA YEH"}], "\u200e\ufe8b\u200e": [{"c": "\u200e\u0649\u0674\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA"}], "\u200e\ufe8c\u200e": [{"c": "\u200e\u0649\u0674\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA"}], "\u200e\ufe8a\u200e": [{"c": "\u200e\u0649\u0674\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA"}], "\u200e\ufe89\u200e": [{"c": "\u200e\u0649\u0674\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA"}], "\u200e\u0678\u200e": [{"c": "\u200e\u0649\u0674\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA"}], "\u200e\ufbeb\u200e": [{"c": "\u200e\u0649\u0674l\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, LATIN SMALL LETTER L"}], "\u200e\u0649\u0674l\u200e": [{"c": "\u200e\ufbeb\u200e", "n": "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM"}, {"c": "\u200e\ufbea\u200e", "n": "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM"}], "\u200e\ufbea\u200e": [{"c": "\u200e\u0649\u0674l\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, LATIN SMALL LETTER L"}], "\u200e\ufc9b\u200e": [{"c": "\u200e\u0649\u0674o\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, LATIN SMALL LETTER O"}], "\u200e\u0649\u0674o\u200e": [{"c": "\u200e\ufc9b\u200e", "n": "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM"}, {"c": "\u200e\ufce0\u200e", "n": "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM"}, {"c": "\u200e\ufbed\u200e", "n": "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM"}, {"c": "\u200e\ufbec\u200e", "n": "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM"}], "\u200e\ufce0\u200e": [{"c": "\u200e\u0649\u0674o\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, LATIN SMALL LETTER O"}], "\u200e\ufbed\u200e": [{"c": "\u200e\u0649\u0674o\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, LATIN SMALL LETTER O"}], "\u200e\ufbec\u200e": [{"c": "\u200e\u0649\u0674o\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, LATIN SMALL LETTER O"}], "\u200e\ufbf8\u200e": [{"c": "\u200e\u0649\u0674\u067b\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER BEEH"}], "\u200e\u0649\u0674\u067b\u200e": [{"c": "\u200e\ufbf8\u200e", "n": "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM"}, {"c": "\u200e\ufbf7\u200e", "n": "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM"}, {"c": "\u200e\ufbf6\u200e", "n": "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM"}], "\u200e\ufbf7\u200e": [{"c": "\u200e\u0649\u0674\u067b\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER BEEH"}], "\u200e\ufbf6\u200e": [{"c": "\u200e\u0649\u0674\u067b\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER BEEH"}], "\u200e\ufc97\u200e": [{"c": "\u200e\u0649\u0674\u062c\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER JEEM"}], "\u200e\u0649\u0674\u062c\u200e": [{"c": "\u200e\ufc97\u200e", "n": "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM"}, {"c": "\u200e\ufc00\u200e", "n": "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM"}], "\u200e\ufc00\u200e": [{"c": "\u200e\u0649\u0674\u062c\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER JEEM"}], "\u200e\ufc98\u200e": [{"c": "\u200e\u0649\u0674\u062d\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER HAH"}], "\u200e\u0649\u0674\u062d\u200e": [{"c": "\u200e\ufc98\u200e", "n": "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM"}, {"c": "\u200e\ufc01\u200e", "n": "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM"}], "\u200e\ufc01\u200e": [{"c": "\u200e\u0649\u0674\u062d\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER HAH"}], "\u200e\ufc99\u200e": [{"c": "\u200e\u0649\u0674\u062e\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER KHAH"}], "\u200e\u0649\u0674\u062e\u200e": [{"c": "\u200e\ufc99\u200e", "n": "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM"}], "\u200e\ufc64\u200e": [{"c": "\u200e\u0649\u0674\u0631\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER REH"}], "\u200e\u0649\u0674\u0631\u200e": [{"c": "\u200e\ufc64\u200e", "n": "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM"}], "\u200e\ufc65\u200e": [{"c": "\u200e\u0649\u0674\u0632\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ZAIN"}], "\u200e\u0649\u0674\u0632\u200e": [{"c": "\u200e\ufc65\u200e", "n": "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM"}], "\u200e\ufc9a\u200e": [{"c": "\u200e\u0649\u0674\u0645\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER MEEM"}], "\u200e\u0649\u0674\u0645\u200e": [{"c": "\u200e\ufc9a\u200e", "n": "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM"}, {"c": "\u200e\ufcdf\u200e", "n": "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM"}, {"c": "\u200e\ufc66\u200e", "n": "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM"}, {"c": "\u200e\ufc02\u200e", "n": "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM"}], "\u200e\ufcdf\u200e": [{"c": "\u200e\u0649\u0674\u0645\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER MEEM"}], "\u200e\ufc66\u200e": [{"c": "\u200e\u0649\u0674\u0645\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER MEEM"}], "\u200e\ufc02\u200e": [{"c": "\u200e\u0649\u0674\u0645\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER MEEM"}], "\u200e\ufc67\u200e": [{"c": "\u200e\u0649\u0674\u0646\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER NOON"}], "\u200e\u0649\u0674\u0646\u200e": [{"c": "\u200e\ufc67\u200e", "n": "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM"}], "\u200e\ufbef\u200e": [{"c": "\u200e\u0649\u0674\u0648\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER WAW"}], "\u200e\u0649\u0674\u0648\u200e": [{"c": "\u200e\ufbef\u200e", "n": "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM"}, {"c": "\u200e\ufbee\u200e", "n": "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM"}], "\u200e\ufbee\u200e": [{"c": "\u200e\u0649\u0674\u0648\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER WAW"}], "\u200e\ufbf1\u200e": [{"c": "\u200e\u0649\u0674\u0648\u0313\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER WAW, COMBINING COMMA ABOVE"}], "\u200e\u0649\u0674\u0648\u0313\u200e": [{"c": "\u200e\ufbf1\u200e", "n": "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM"}, {"c": "\u200e\ufbf0\u200e", "n": "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM"}], "\u200e\ufbf0\u200e": [{"c": "\u200e\u0649\u0674\u0648\u0313\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER WAW, COMBINING COMMA ABOVE"}], "\u200e\ufbf3\u200e": [{"c": "\u200e\u0649\u0674\u0648\u0306\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER WAW, COMBINING BREVE"}], "\u200e\u0649\u0674\u0648\u0306\u200e": [{"c": "\u200e\ufbf3\u200e", "n": "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM"}, {"c": "\u200e\ufbf2\u200e", "n": "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM"}], "\u200e\ufbf2\u200e": [{"c": "\u200e\u0649\u0674\u0648\u0306\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER WAW, COMBINING BREVE"}], "\u200e\ufbf5\u200e": [{"c": "\u200e\u0649\u0674\u0648\u0670\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER WAW, ARABIC LETTER SUPERSCRIPT ALEF"}], "\u200e\u0649\u0674\u0648\u0670\u200e": [{"c": "\u200e\ufbf5\u200e", "n": "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM"}, {"c": "\u200e\ufbf4\u200e", "n": "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM"}], "\u200e\ufbf4\u200e": [{"c": "\u200e\u0649\u0674\u0648\u0670\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER WAW, ARABIC LETTER SUPERSCRIPT ALEF"}], "\u200e\ufbfb\u200e": [{"c": "\u200e\u0649\u0674\u0649\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u0649\u0674\u0649\u200e": [{"c": "\u200e\ufbfb\u200e", "n": "ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM"}, {"c": "\u200e\ufbfa\u200e", "n": "ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM"}, {"c": "\u200e\ufc68\u200e", "n": "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM"}, {"c": "\u200e\ufbf9\u200e", "n": "ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM"}, {"c": "\u200e\ufc03\u200e", "n": "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM"}, {"c": "\u200e\ufc69\u200e", "n": "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM"}, {"c": "\u200e\ufc04\u200e", "n": "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM"}], "\u200e\ufbfa\u200e": [{"c": "\u200e\u0649\u0674\u0649\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufc68\u200e": [{"c": "\u200e\u0649\u0674\u0649\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufbf9\u200e": [{"c": "\u200e\u0649\u0674\u0649\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufc03\u200e": [{"c": "\u200e\u0649\u0674\u0649\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufc69\u200e": [{"c": "\u200e\u0649\u0674\u0649\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufc04\u200e": [{"c": "\u200e\u0649\u0674\u0649\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufcda\u200e": [{"c": "\u200e\u0649\u062c\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER JEEM"}], "\u200e\u0649\u062c\u200e": [{"c": "\u200e\ufcda\u200e", "n": "ARABIC LIGATURE YEH WITH JEEM INITIAL FORM"}, {"c": "\u200e\ufc55\u200e", "n": "ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM"}], "\u200e\ufc55\u200e": [{"c": "\u200e\u0649\u062c\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER JEEM"}], "\u200e\ufc11\u200e": [{"c": "\u200e\u0649\u06db\u062c\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER JEEM"}], "\u200e\u0649\u06db\u062c\u200e": [{"c": "\u200e\ufc11\u200e", "n": "ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM"}], "\u200e\ufdaf\u200e": [{"c": "\u200e\u0649\u062c\u0649\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u0649\u062c\u0649\u200e": [{"c": "\u200e\ufdaf\u200e", "n": "ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM"}], "\u200e\ufcdb\u200e": [{"c": "\u200e\u0649\u062d\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HAH"}], "\u200e\u0649\u062d\u200e": [{"c": "\u200e\ufcdb\u200e", "n": "ARABIC LIGATURE YEH WITH HAH INITIAL FORM"}, {"c": "\u200e\ufc56\u200e", "n": "ARABIC LIGATURE YEH WITH HAH ISOLATED FORM"}], "\u200e\ufc56\u200e": [{"c": "\u200e\u0649\u062d\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HAH"}], "\u200e\ufdae\u200e": [{"c": "\u200e\u0649\u062d\u0649\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u0649\u062d\u0649\u200e": [{"c": "\u200e\ufdae\u200e", "n": "ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM"}], "\u200e\ufcdc\u200e": [{"c": "\u200e\u0649\u062e\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER KHAH"}], "\u200e\u0649\u062e\u200e": [{"c": "\u200e\ufcdc\u200e", "n": "ARABIC LIGATURE YEH WITH KHAH INITIAL FORM"}, {"c": "\u200e\ufc57\u200e", "n": "ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM"}], "\u200e\ufc57\u200e": [{"c": "\u200e\u0649\u062e\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER KHAH"}], "\u200e\ufc91\u200e": [{"c": "\u200e\u0649\u0631\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER REH"}], "\u200e\u0649\u0631\u200e": [{"c": "\u200e\ufc91\u200e", "n": "ARABIC LIGATURE YEH WITH REH FINAL FORM"}], "\u200e\ufc76\u200e": [{"c": "\u200e\u0649\u06db\u0631\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER REH"}], "\u200e\u0649\u06db\u0631\u200e": [{"c": "\u200e\ufc76\u200e", "n": "ARABIC LIGATURE THEH WITH REH FINAL FORM"}], "\u200e\ufc92\u200e": [{"c": "\u200e\u0649\u0632\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER ZAIN"}], "\u200e\u0649\u0632\u200e": [{"c": "\u200e\ufc92\u200e", "n": "ARABIC LIGATURE YEH WITH ZAIN FINAL FORM"}], "\u200e\ufc77\u200e": [{"c": "\u200e\u0649\u06db\u0632\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER ZAIN"}], "\u200e\u0649\u06db\u0632\u200e": [{"c": "\u200e\ufc77\u200e", "n": "ARABIC LIGATURE THEH WITH ZAIN FINAL FORM"}], "\u200e\ufcdd\u200e": [{"c": "\u200e\u0649\u0645\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER MEEM"}], "\u200e\u0649\u0645\u200e": [{"c": "\u200e\ufcdd\u200e", "n": "ARABIC LIGATURE YEH WITH MEEM INITIAL FORM"}, {"c": "\u200e\ufcf0\u200e", "n": "ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM"}, {"c": "\u200e\ufc93\u200e", "n": "ARABIC LIGATURE YEH WITH MEEM FINAL FORM"}, {"c": "\u200e\ufc58\u200e", "n": "ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM"}], "\u200e\ufcf0\u200e": [{"c": "\u200e\u0649\u0645\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER MEEM"}], "\u200e\ufc93\u200e": [{"c": "\u200e\u0649\u0645\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER MEEM"}], "\u200e\ufc58\u200e": [{"c": "\u200e\u0649\u0645\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER MEEM"}], "\u200e\ufca6\u200e": [{"c": "\u200e\u0649\u06db\u0645\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER MEEM"}], "\u200e\u0649\u06db\u0645\u200e": [{"c": "\u200e\ufca6\u200e", "n": "ARABIC LIGATURE THEH WITH MEEM INITIAL FORM"}, {"c": "\u200e\ufce5\u200e", "n": "ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM"}, {"c": "\u200e\ufc78\u200e", "n": "ARABIC LIGATURE THEH WITH MEEM FINAL FORM"}, {"c": "\u200e\ufc12\u200e", "n": "ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM"}], "\u200e\ufce5\u200e": [{"c": "\u200e\u0649\u06db\u0645\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER MEEM"}], "\u200e\ufc78\u200e": [{"c": "\u200e\u0649\u06db\u0645\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER MEEM"}], "\u200e\ufc12\u200e": [{"c": "\u200e\u0649\u06db\u0645\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER MEEM"}], "\u200e\ufd9d\u200e": [{"c": "\u200e\u0649\u0645\u0645\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER MEEM, ARABIC LETTER MEEM"}], "\u200e\u0649\u0645\u0645\u200e": [{"c": "\u200e\ufd9d\u200e", "n": "ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM"}, {"c": "\u200e\ufd9c\u200e", "n": "ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM"}], "\u200e\ufd9c\u200e": [{"c": "\u200e\u0649\u0645\u0645\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER MEEM, ARABIC LETTER MEEM"}], "\u200e\ufdb0\u200e": [{"c": "\u200e\u0649\u0645\u0649\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u0649\u0645\u0649\u200e": [{"c": "\u200e\ufdb0\u200e", "n": "ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM"}], "\u200e\ufc94\u200e": [{"c": "\u200e\u0649\u0646\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER NOON"}], "\u200e\u0649\u0646\u200e": [{"c": "\u200e\ufc94\u200e", "n": "ARABIC LIGATURE YEH WITH NOON FINAL FORM"}], "\u200e\ufc79\u200e": [{"c": "\u200e\u0649\u06db\u0646\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER NOON"}], "\u200e\u0649\u06db\u0646\u200e": [{"c": "\u200e\ufc79\u200e", "n": "ARABIC LIGATURE THEH WITH NOON FINAL FORM"}], "\u200e\ufc95\u200e": [{"c": "\u200e\u0649\u0649\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u0649\u0649\u200e": [{"c": "\u200e\ufc95\u200e", "n": "ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM"}, {"c": "\u200e\ufc59\u200e", "n": "ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM"}, {"c": "\u200e\ufc96\u200e", "n": "ARABIC LIGATURE YEH WITH YEH FINAL FORM"}, {"c": "\u200e\ufc5a\u200e", "n": "ARABIC LIGATURE YEH WITH YEH ISOLATED FORM"}], "\u200e\ufc59\u200e": [{"c": "\u200e\u0649\u0649\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufc96\u200e": [{"c": "\u200e\u0649\u0649\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufc5a\u200e": [{"c": "\u200e\u0649\u0649\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufc7a\u200e": [{"c": "\u200e\u0649\u06db\u0649\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER ALEF MAKSURA"}], "\u200e\u0649\u06db\u0649\u200e": [{"c": "\u200e\ufc7a\u200e", "n": "ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM"}, {"c": "\u200e\ufc13\u200e", "n": "ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM"}, {"c": "\u200e\ufc7b\u200e", "n": "ARABIC LIGATURE THEH WITH YEH FINAL FORM"}, {"c": "\u200e\ufc14\u200e", "n": "ARABIC LIGATURE THEH WITH YEH ISOLATED FORM"}], "\u200e\ufc13\u200e": [{"c": "\u200e\u0649\u06db\u0649\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufc7b\u200e": [{"c": "\u200e\u0649\u06db\u0649\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufc14\u200e": [{"c": "\u200e\u0649\u06db\u0649\u200e", "n": "ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS, ARABIC LETTER ALEF MAKSURA"}], "\u200e\ufbb1\u200e": [{"c": "\u200e\u06d3\u200e", "n": "ARABIC LETTER YEH BARREE WITH HAMZA ABOVE"}], "\u200e\u06d3\u200e": [{"c": "\u200e\ufbb1\u200e", "n": "ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM"}, {"c": "\u200e\ufbb0\u200e", "n": "ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM"}], "\u200e\ufbb0\u200e": [{"c": "\u200e\u06d3\u200e", "n": "ARABIC LETTER YEH BARREE WITH HAMZA ABOVE"}], "\ud800\udeb8": [{"c": "\u2d40", "n": "TIFINAGH LETTER YAH"}], "\u2d40": [{"c": "\ud800\udeb8", "n": "CARIAN LETTER SS"}], "\u205e": [{"c": "\u2d42", "n": "TIFINAGH LETTER TUAREG YAH"}], "\u2d42": [{"c": "\u205e", "n": "VERTICAL FOUR DOTS"}, {"c": "\u2e3d", "n": "VERTICAL SIX DOTS"}, {"c": "\u2999", "n": "DOTTED FENCE"}], "\u2e3d": [{"c": "\u2d42", "n": "TIFINAGH LETTER TUAREG YAH"}], "\u2999": [{"c": "\u2d42", "n": "TIFINAGH LETTER TUAREG YAH"}], "\ufe19": [{"c": "\u2d57", "n": "TIFINAGH LETTER TUAREG YAGH"}], "\u2d57": [{"c": "\ufe19", "n": "PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS"}, {"c": "\u205d", "n": "TRICOLON"}, {"c": "\u22ee", "n": "VERTICAL ELLIPSIS"}], "\u205d": [{"c": "\u2d57", "n": "TIFINAGH LETTER TUAREG YAGH"}], "\u22ee": [{"c": "\u2d57", "n": "TIFINAGH LETTER TUAREG YAGH"}], "\u0544": [{"c": "\u1206", "n": "ETHIOPIC SYLLABLE HO"}], "\u1206": [{"c": "\u0544", "n": "ARMENIAN CAPITAL LETTER MEN"}], "\u054c": [{"c": "\u1261", "n": "ETHIOPIC SYLLABLE BU"}], "\u1261": [{"c": "\u054c", "n": "ARMENIAN CAPITAL LETTER RA"}], "\u053b": [{"c": "\u12ae", "n": "ETHIOPIC SYLLABLE KO"}], "\u12ae": [{"c": "\u053b", "n": "ARMENIAN CAPITAL LETTER INI"}], "\u054a": [{"c": "\u1323", "n": "ETHIOPIC SYLLABLE THAA"}], "\u1323": [{"c": "\u054a", "n": "ARMENIAN CAPITAL LETTER PEH"}], "\u0906": [{"c": "\u0905\u093e", "n": "DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN AA"}], "\u0905\u093e": [{"c": "\u0906", "n": "DEVANAGARI LETTER AA"}], "\u0912": [{"c": "\u0905\u093e\u0946", "n": "DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN AA, DEVANAGARI VOWEL SIGN SHORT E"}], "\u0905\u093e\u0946": [{"c": "\u0912", "n": "DEVANAGARI LETTER SHORT O"}], "\u0913": [{"c": "\u0905\u093e\u0947", "n": "DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN AA, DEVANAGARI VOWEL SIGN E"}], "\u0905\u093e\u0947": [{"c": "\u0913", "n": "DEVANAGARI LETTER O"}], "\u0914": [{"c": "\u0905\u093e\u0948", "n": "DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN AA, DEVANAGARI VOWEL SIGN AI"}], "\u0905\u093e\u0948": [{"c": "\u0914", "n": "DEVANAGARI LETTER AU"}], "\u0904": [{"c": "\u0905\u0946", "n": "DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN SHORT E"}], "\u0905\u0946": [{"c": "\u0904", "n": "DEVANAGARI LETTER SHORT A"}], "\u0911": [{"c": "\u0905\u0949", "n": "DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN CANDRA O"}], "\u0905\u0949": [{"c": "\u0911", "n": "DEVANAGARI LETTER CANDRA O"}], "\u090d": [{"c": "\u090f\u0945", "n": "DEVANAGARI LETTER E, DEVANAGARI VOWEL SIGN CANDRA E"}], "\u090f\u0945": [{"c": "\u090d", "n": "DEVANAGARI LETTER CANDRA E"}], "\u090e": [{"c": "\u090f\u0946", "n": "DEVANAGARI LETTER E, DEVANAGARI VOWEL SIGN SHORT E"}], "\u090f\u0946": [{"c": "\u090e", "n": "DEVANAGARI LETTER SHORT E"}], "\u0910": [{"c": "\u090f\u0947", "n": "DEVANAGARI LETTER E, DEVANAGARI VOWEL SIGN E"}], "\u090f\u0947": [{"c": "\u0910", "n": "DEVANAGARI LETTER AI"}], "\u0908": [{"c": "\u0930\u094d\u0907", "n": "DEVANAGARI LETTER RA, DEVANAGARI SIGN VIRAMA, DEVANAGARI LETTER I"}], "\u0930\u094d\u0907": [{"c": "\u0908", "n": "DEVANAGARI LETTER II"}], "\u0abd": [{"c": "\u093d", "n": "DEVANAGARI SIGN AVAGRAHA"}], "\u093d": [{"c": "\u0abd", "n": "GUJARATI SIGN AVAGRAHA"}], "\ud804\udddc": [{"c": "\ua8fb", "n": "DEVANAGARI HEADSTROKE"}], "\ua8fb": [{"c": "\ud804\udddc", "n": "SHARADA HEADSTROKE"}], "\ud804\uddcb": [{"c": "\u093a", "n": "DEVANAGARI VOWEL SIGN OE"}], "\u093a": [{"c": "\ud804\uddcb", "n": "SHARADA VOWEL MODIFIER MARK"}], "\u0ac1": [{"c": "\u0941", "n": "DEVANAGARI VOWEL SIGN U"}], "\u0941": [{"c": "\u0ac1", "n": "GUJARATI VOWEL SIGN U"}], "\u0ac2": [{"c": "\u0942", "n": "DEVANAGARI VOWEL SIGN UU"}], "\u0942": [{"c": "\u0ac2", "n": "GUJARATI VOWEL SIGN UU"}], "\u0a4b": [{"c": "\u0946", "n": "DEVANAGARI VOWEL SIGN SHORT E"}], "\u0946": [{"c": "\u0a4b", "n": "GURMUKHI VOWEL SIGN OO"}], "\u0a4d": [{"c": "\u094d", "n": "DEVANAGARI SIGN VIRAMA"}], "\u094d": [{"c": "\u0a4d", "n": "GURMUKHI SIGN VIRAMA"}, {"c": "\u0acd", "n": "GUJARATI SIGN VIRAMA"}], "\u0acd": [{"c": "\u094d", "n": "DEVANAGARI SIGN VIRAMA"}], "\u0986": [{"c": "\u0985\u09be", "n": "BENGALI LETTER A, BENGALI VOWEL SIGN AA"}], "\u0985\u09be": [{"c": "\u0986", "n": "BENGALI LETTER AA"}], "\u09e0": [{"c": "\u098b\u09c3", "n": "BENGALI LETTER VOCALIC R, BENGALI VOWEL SIGN VOCALIC R"}], "\u098b\u09c3": [{"c": "\u09e0", "n": "BENGALI LETTER VOCALIC RR"}, {"c": "\u09e1", "n": "BENGALI LETTER VOCALIC LL"}], "\u09e1": [{"c": "\u098b\u09c3", "n": "BENGALI LETTER VOCALIC R, BENGALI VOWEL SIGN VOCALIC R"}], "\ud805\udc92": [{"c": "\u0998", "n": "BENGALI LETTER GHA"}], "\u0998": [{"c": "\ud805\udc92", "n": "TIRHUTA LETTER GHA"}], "\ud805\udc94": [{"c": "\u099a", "n": "BENGALI LETTER CA"}], "\u099a": [{"c": "\ud805\udc94", "n": "TIRHUTA LETTER CA"}], "\ud805\udc96": [{"c": "\u099c", "n": "BENGALI LETTER JA"}], "\u099c": [{"c": "\ud805\udc96", "n": "TIRHUTA LETTER JA"}], "\ud805\udc98": [{"c": "\u099e", "n": "BENGALI LETTER NYA"}], "\u099e": [{"c": "\ud805\udc98", "n": "TIRHUTA LETTER NYA"}], "\ud805\udc99": [{"c": "\u099f", "n": "BENGALI LETTER TTA"}], "\u099f": [{"c": "\ud805\udc99", "n": "TIRHUTA LETTER TTA"}], "\ud805\udc9b": [{"c": "\u09a1", "n": "BENGALI LETTER DDA"}], "\u09a1": [{"c": "\ud805\udc9b", "n": "TIRHUTA LETTER DDA"}], "\ud805\udcaa": [{"c": "\u09a3", "n": "BENGALI LETTER NNA"}], "\u09a3": [{"c": "\ud805\udcaa", "n": "TIRHUTA LETTER LA"}], "\ud805\udc9e": [{"c": "\u09a4", "n": "BENGALI LETTER TA"}], "\u09a4": [{"c": "\ud805\udc9e", "n": "TIRHUTA LETTER TA"}], "\ud805\udc9f": [{"c": "\u09a5", "n": "BENGALI LETTER THA"}], "\u09a5": [{"c": "\ud805\udc9f", "n": "TIRHUTA LETTER THA"}], "\ud805\udca0": [{"c": "\u09a6", "n": "BENGALI LETTER DA"}], "\u09a6": [{"c": "\ud805\udca0", "n": "TIRHUTA LETTER DA"}], "\ud805\udca1": [{"c": "\u09a7", "n": "BENGALI LETTER DHA"}], "\u09a7": [{"c": "\ud805\udca1", "n": "TIRHUTA LETTER DHA"}], "\ud805\udca2": [{"c": "\u09a8", "n": "BENGALI LETTER NA"}], "\u09a8": [{"c": "\ud805\udca2", "n": "TIRHUTA LETTER NA"}], "\ud805\udca3": [{"c": "\u09aa", "n": "BENGALI LETTER PA"}], "\u09aa": [{"c": "\ud805\udca3", "n": "TIRHUTA LETTER PA"}], "\ud805\udca9": [{"c": "\u09ac", "n": "BENGALI LETTER BA"}], "\u09ac": [{"c": "\ud805\udca9", "n": "TIRHUTA LETTER RA"}], "\ud805\udca7": [{"c": "\u09ae", "n": "BENGALI LETTER MA"}], "\u09ae": [{"c": "\ud805\udca7", "n": "TIRHUTA LETTER MA"}], "\ud805\udca8": [{"c": "\u09af", "n": "BENGALI LETTER YA"}], "\u09af": [{"c": "\ud805\udca8", "n": "TIRHUTA LETTER YA"}], "\ud805\udcab": [{"c": "\u09b0", "n": "BENGALI LETTER RA"}], "\u09b0": [{"c": "\ud805\udcab", "n": "TIRHUTA LETTER VA"}], "\ud805\udc9d": [{"c": "\u09b2", "n": "BENGALI LETTER LA"}], "\u09b2": [{"c": "\ud805\udc9d", "n": "TIRHUTA LETTER NNA"}], "\ud805\udcad": [{"c": "\u09b7", "n": "BENGALI LETTER SSA"}], "\u09b7": [{"c": "\ud805\udcad", "n": "TIRHUTA LETTER SSA"}], "\ud805\udcae": [{"c": "\u09b8", "n": "BENGALI LETTER SA"}], "\u09b8": [{"c": "\ud805\udcae", "n": "TIRHUTA LETTER SA"}], "\ud805\udcc4": [{"c": "\u09bd", "n": "BENGALI SIGN AVAGRAHA"}], "\u09bd": [{"c": "\ud805\udcc4", "n": "TIRHUTA SIGN AVAGRAHA"}], "\ud805\udcb0": [{"c": "\u09be", "n": "BENGALI VOWEL SIGN AA"}], "\u09be": [{"c": "\ud805\udcb0", "n": "TIRHUTA VOWEL SIGN AA"}], "\ud805\udcb1": [{"c": "\u09bf", "n": "BENGALI VOWEL SIGN I"}], "\u09bf": [{"c": "\ud805\udcb1", "n": "TIRHUTA VOWEL SIGN I"}], "\ud805\udcb9": [{"c": "\u09c7", "n": "BENGALI VOWEL SIGN E"}], "\u09c7": [{"c": "\ud805\udcb9", "n": "TIRHUTA VOWEL SIGN E"}], "\ud805\udcbc": [{"c": "\u09cb", "n": "BENGALI VOWEL SIGN O"}], "\u09cb": [{"c": "\ud805\udcbc", "n": "TIRHUTA VOWEL SIGN O"}], "\ud805\udcbe": [{"c": "\u09cc", "n": "BENGALI VOWEL SIGN AU"}], "\u09cc": [{"c": "\ud805\udcbe", "n": "TIRHUTA VOWEL SIGN AU"}], "\ud805\udcc2": [{"c": "\u09cd", "n": "BENGALI SIGN VIRAMA"}], "\u09cd": [{"c": "\ud805\udcc2", "n": "TIRHUTA SIGN VIRAMA"}], "\ud805\udcbd": [{"c": "\u09d7", "n": "BENGALI AU LENGTH MARK"}], "\u09d7": [{"c": "\ud805\udcbd", "n": "TIRHUTA VOWEL SIGN SHORT O"}], "\u0a09": [{"c": "\u0a73\u0a41", "n": "GURMUKHI URA, GURMUKHI VOWEL SIGN U"}], "\u0a73\u0a41": [{"c": "\u0a09", "n": "GURMUKHI LETTER U"}], "\u0a0a": [{"c": "\u0a73\u0a42", "n": "GURMUKHI URA, GURMUKHI VOWEL SIGN UU"}], "\u0a73\u0a42": [{"c": "\u0a0a", "n": "GURMUKHI LETTER UU"}], "\u0a06": [{"c": "\u0a05\u0a3e", "n": "GURMUKHI LETTER A, GURMUKHI VOWEL SIGN AA"}], "\u0a05\u0a3e": [{"c": "\u0a06", "n": "GURMUKHI LETTER AA"}], "\u0a10": [{"c": "\u0a05\u0a48", "n": "GURMUKHI LETTER A, GURMUKHI VOWEL SIGN AI"}], "\u0a05\u0a48": [{"c": "\u0a10", "n": "GURMUKHI LETTER AI"}], "\u0a14": [{"c": "\u0a05\u0a4c", "n": "GURMUKHI LETTER A, GURMUKHI VOWEL SIGN AU"}], "\u0a05\u0a4c": [{"c": "\u0a14", "n": "GURMUKHI LETTER AU"}], "\u0a07": [{"c": "\u0a72\u0a3f", "n": "GURMUKHI IRI, GURMUKHI VOWEL SIGN I"}], "\u0a72\u0a3f": [{"c": "\u0a07", "n": "GURMUKHI LETTER I"}], "\u0a08": [{"c": "\u0a72\u0a40", "n": "GURMUKHI IRI, GURMUKHI VOWEL SIGN II"}], "\u0a72\u0a40": [{"c": "\u0a08", "n": "GURMUKHI LETTER II"}], "\u0a0f": [{"c": "\u0a72\u0a47", "n": "GURMUKHI IRI, GURMUKHI VOWEL SIGN EE"}], "\u0a72\u0a47": [{"c": "\u0a0f", "n": "GURMUKHI LETTER EE"}], "\u0a86": [{"c": "\u0a85\u0abe", "n": "GUJARATI LETTER A, GUJARATI VOWEL SIGN AA"}], "\u0a85\u0abe": [{"c": "\u0a86", "n": "GUJARATI LETTER AA"}], "\u0a91": [{"c": "\u0a85\u0abe\u0ac5", "n": "GUJARATI LETTER A, GUJARATI VOWEL SIGN AA, GUJARATI VOWEL SIGN CANDRA E"}], "\u0a85\u0abe\u0ac5": [{"c": "\u0a91", "n": "GUJARATI VOWEL CANDRA O"}], "\u0a93": [{"c": "\u0a85\u0abe\u0ac7", "n": "GUJARATI LETTER A, GUJARATI VOWEL SIGN AA, GUJARATI VOWEL SIGN E"}], "\u0a85\u0abe\u0ac7": [{"c": "\u0a93", "n": "GUJARATI LETTER O"}], "\u0a94": [{"c": "\u0a85\u0abe\u0ac8", "n": "GUJARATI LETTER A, GUJARATI VOWEL SIGN AA, GUJARATI VOWEL SIGN AI"}], "\u0a85\u0abe\u0ac8": [{"c": "\u0a94", "n": "GUJARATI LETTER AU"}], "\u0a8d": [{"c": "\u0a85\u0ac5", "n": "GUJARATI LETTER A, GUJARATI VOWEL SIGN CANDRA E"}], "\u0a85\u0ac5": [{"c": "\u0a8d", "n": "GUJARATI VOWEL CANDRA E"}], "\u0a8f": [{"c": "\u0a85\u0ac7", "n": "GUJARATI LETTER A, GUJARATI VOWEL SIGN E"}], "\u0a85\u0ac7": [{"c": "\u0a8f", "n": "GUJARATI LETTER E"}], "\u0a90": [{"c": "\u0a85\u0ac8", "n": "GUJARATI LETTER A, GUJARATI VOWEL SIGN AI"}], "\u0a85\u0ac8": [{"c": "\u0a90", "n": "GUJARATI LETTER AI"}], "\u0b06": [{"c": "\u0b05\u0b3e", "n": "ORIYA LETTER A, ORIYA VOWEL SIGN AA"}], "\u0b05\u0b3e": [{"c": "\u0b06", "n": "ORIYA LETTER AA"}], "\u0bee": [{"c": "\u0b85", "n": "TAMIL LETTER A"}], "\u0b85": [{"c": "\u0bee", "n": "TAMIL DIGIT EIGHT"}], "\u0bb0": [{"c": "\u0b88", "n": "TAMIL LETTER II"}], "\u0b88": [{"c": "\u0bb0", "n": "TAMIL LETTER RA"}, {"c": "\u0bbe", "n": "TAMIL VOWEL SIGN AA"}], "\u0bbe": [{"c": "\u0b88", "n": "TAMIL LETTER II"}], "\u0beb": [{"c": "\u0b88\u0bc1", "n": "TAMIL LETTER II, TAMIL VOWEL SIGN U"}], "\u0b88\u0bc1": [{"c": "\u0beb", "n": "TAMIL DIGIT FIVE"}], "\u0be8": [{"c": "\u0b89", "n": "TAMIL LETTER U"}], "\u0b89": [{"c": "\u0be8", "n": "TAMIL DIGIT TWO"}, {"c": "\u0d09", "n": "MALAYALAM LETTER U"}], "\u0d09": [{"c": "\u0b89", "n": "TAMIL LETTER U"}], "\u0b8a": [{"c": "\u0b89\u0bb3", "n": "TAMIL LETTER U, TAMIL LETTER LLA"}], "\u0b89\u0bb3": [{"c": "\u0b8a", "n": "TAMIL LETTER UU"}], "\u0d0a": [{"c": "\u0b89\u0d57", "n": "TAMIL LETTER U, MALAYALAM AU LENGTH MARK"}], "\u0b89\u0d57": [{"c": "\u0d0a", "n": "MALAYALAM LETTER UU"}], "\u0bed": [{"c": "\u0b8e", "n": "TAMIL LETTER E"}], "\u0b8e": [{"c": "\u0bed", "n": "TAMIL DIGIT SEVEN"}], "\u0bf7": [{"c": "\u0b8e\u0bb5", "n": "TAMIL LETTER E, TAMIL LETTER VA"}], "\u0b8e\u0bb5": [{"c": "\u0bf7", "n": "TAMIL CREDIT SIGN"}], "\u0b9c": [{"c": "\u0b90", "n": "TAMIL LETTER AI"}], "\u0b90": [{"c": "\u0b9c", "n": "TAMIL LETTER JA"}, {"c": "\u0d1c", "n": "MALAYALAM LETTER JA"}], "\u0d1c": [{"c": "\u0b90", "n": "TAMIL LETTER AI"}], "\u0be7": [{"c": "\u0b95", "n": "TAMIL LETTER KA"}], "\u0b95": [{"c": "\u0be7", "n": "TAMIL DIGIT ONE"}], "\u0bea": [{"c": "\u0b9a", "n": "TAMIL LETTER CA"}], "\u0b9a": [{"c": "\u0bea", "n": "TAMIL DIGIT FOUR"}], "\u0bec": [{"c": "\u0b9a\u0bc1", "n": "TAMIL LETTER CA, TAMIL VOWEL SIGN U"}], "\u0b9a\u0bc1": [{"c": "\u0bec", "n": "TAMIL DIGIT SIX"}], "\u0bf2": [{"c": "\u0b9a\u0bc2", "n": "TAMIL LETTER CA, TAMIL VOWEL SIGN UU"}], "\u0b9a\u0bc2": [{"c": "\u0bf2", "n": "TAMIL NUMBER ONE THOUSAND"}], "\u0d3a": [{"c": "\u0b9f\u0bbf", "n": "TAMIL LETTER TTA, TAMIL VOWEL SIGN I"}], "\u0b9f\u0bbf": [{"c": "\u0d3a", "n": "MALAYALAM LETTER TTTA"}], "\u0d23": [{"c": "\u0ba3", "n": "TAMIL LETTER NNA"}], "\u0ba3": [{"c": "\u0d23", "n": "MALAYALAM LETTER NNA"}], "\u0bfa": [{"c": "\u0ba8\u0bc0", "n": "TAMIL LETTER NA, TAMIL VOWEL SIGN II"}], "\u0ba8\u0bc0": [{"c": "\u0bfa", "n": "TAMIL NUMBER SIGN"}], "\u0bf4": [{"c": "\u0bae\u0bc0", "n": "TAMIL LETTER MA, TAMIL VOWEL SIGN II"}], "\u0bae\u0bc0": [{"c": "\u0bf4", "n": "TAMIL MONTH SIGN"}], "\u0bf0": [{"c": "\u0baf", "n": "TAMIL LETTER YA"}], "\u0baf": [{"c": "\u0bf0", "n": "TAMIL NUMBER TEN"}], "\u0d34": [{"c": "\u0bb4", "n": "TAMIL LETTER LLLA"}], "\u0bb4": [{"c": "\u0d34", "n": "MALAYALAM LETTER LLLA"}], "\u0bd7": [{"c": "\u0bb3", "n": "TAMIL LETTER LLA"}], "\u0bb3": [{"c": "\u0bd7", "n": "TAMIL AU LENGTH MARK"}], "\u0bc8": [{"c": "\u0ba9", "n": "TAMIL LETTER NNNA"}], "\u0ba9": [{"c": "\u0bc8", "n": "TAMIL VOWEL SIGN AI"}], "\u0d36": [{"c": "\u0bb6", "n": "TAMIL LETTER SHA"}], "\u0bb6": [{"c": "\u0d36", "n": "MALAYALAM LETTER SHA"}], "\u0bf8": [{"c": "\u0bb7", "n": "TAMIL LETTER SSA"}], "\u0bb7": [{"c": "\u0bf8", "n": "TAMIL AS ABOVE SIGN"}], "\u0d3f": [{"c": "\u0bbf", "n": "TAMIL VOWEL SIGN I"}], "\u0bbf": [{"c": "\u0d3f", "n": "MALAYALAM VOWEL SIGN I"}, {"c": "\u0d40", "n": "MALAYALAM VOWEL SIGN II"}], "\u0d40": [{"c": "\u0bbf", "n": "TAMIL VOWEL SIGN I"}], "\u0bca": [{"c": "\u0bc6\u0b88", "n": "TAMIL VOWEL SIGN E, TAMIL LETTER II"}], "\u0bc6\u0b88": [{"c": "\u0bca", "n": "TAMIL VOWEL SIGN O"}], "\u0bcc": [{"c": "\u0bc6\u0bb3", "n": "TAMIL VOWEL SIGN E, TAMIL LETTER LLA"}], "\u0bc6\u0bb3": [{"c": "\u0bcc", "n": "TAMIL VOWEL SIGN AU"}], "\u0bcb": [{"c": "\u0bc7\u0b88", "n": "TAMIL VOWEL SIGN EE, TAMIL LETTER II"}], "\u0bc7\u0b88": [{"c": "\u0bcb", "n": "TAMIL VOWEL SIGN OO"}], "\u0c85": [{"c": "\u0c05", "n": "TELUGU LETTER A"}], "\u0c05": [{"c": "\u0c85", "n": "KANNADA LETTER A"}], "\u0c86": [{"c": "\u0c06", "n": "TELUGU LETTER AA"}], "\u0c06": [{"c": "\u0c86", "n": "KANNADA LETTER AA"}], "\u0c87": [{"c": "\u0c07", "n": "TELUGU LETTER I"}], "\u0c07": [{"c": "\u0c87", "n": "KANNADA LETTER I"}], "\u0c60": [{"c": "\u0c0b\u0c3e", "n": "TELUGU LETTER VOCALIC R, TELUGU VOWEL SIGN AA"}], "\u0c0b\u0c3e": [{"c": "\u0c60", "n": "TELUGU LETTER VOCALIC RR"}], "\u0c61": [{"c": "\u0c0c\u0c3e", "n": "TELUGU LETTER VOCALIC L, TELUGU VOWEL SIGN AA"}], "\u0c0c\u0c3e": [{"c": "\u0c61", "n": "TELUGU LETTER VOCALIC LL"}], "\u0c92": [{"c": "\u0c12", "n": "TELUGU LETTER O"}], "\u0c12": [{"c": "\u0c92", "n": "KANNADA LETTER O"}], "\u0c14": [{"c": "\u0c12\u0c4c", "n": "TELUGU LETTER O, TELUGU VOWEL SIGN AU"}], "\u0c12\u0c4c": [{"c": "\u0c14", "n": "TELUGU LETTER AU"}, {"c": "\u0c94", "n": "KANNADA LETTER AU"}], "\u0c94": [{"c": "\u0c12\u0c4c", "n": "TELUGU LETTER O, TELUGU VOWEL SIGN AU"}], "\u0c13": [{"c": "\u0c12\u0c55", "n": "TELUGU LETTER O, TELUGU LENGTH MARK"}], "\u0c12\u0c55": [{"c": "\u0c13", "n": "TELUGU LETTER OO"}, {"c": "\u0c93", "n": "KANNADA LETTER OO"}], "\u0c93": [{"c": "\u0c12\u0c55", "n": "TELUGU LETTER O, TELUGU LENGTH MARK"}], "\u0c9c": [{"c": "\u0c1c", "n": "TELUGU LETTER JA"}], "\u0c1c": [{"c": "\u0c9c", "n": "KANNADA LETTER JA"}], "\u0c9e": [{"c": "\u0c1e", "n": "TELUGU LETTER NYA"}], "\u0c1e": [{"c": "\u0c9e", "n": "KANNADA LETTER NYA"}], "\u0c22": [{"c": "\u0c21\u0323", "n": "TELUGU LETTER DDA, COMBINING DOT BELOW"}], "\u0c21\u0323": [{"c": "\u0c22", "n": "TELUGU LETTER DDHA"}], "\u0ca3": [{"c": "\u0c23", "n": "TELUGU LETTER NNA"}], "\u0c23": [{"c": "\u0ca3", "n": "KANNADA LETTER NNA"}], "\u0c25": [{"c": "\u0c27\u05bc", "n": "TELUGU LETTER DHA, HEBREW POINT DAGESH OR MAPIQ"}], "\u0c27\u05bc": [{"c": "\u0c25", "n": "TELUGU LETTER THA"}], "\u0c2d": [{"c": "\u0c2c\u0323", "n": "TELUGU LETTER BA, COMBINING DOT BELOW"}], "\u0c2c\u0323": [{"c": "\u0c2d", "n": "TELUGU LETTER BHA"}], "\u0caf": [{"c": "\u0c2f", "n": "TELUGU LETTER YA"}], "\u0c2f": [{"c": "\u0caf", "n": "KANNADA LETTER YA"}], "\u0c20": [{"c": "\u0c30\u05bc", "n": "TELUGU LETTER RA, HEBREW POINT DAGESH OR MAPIQ"}], "\u0c30\u05bc": [{"c": "\u0c20", "n": "TELUGU LETTER TTHA"}], "\u0cb1": [{"c": "\u0c31", "n": "TELUGU LETTER RRA"}], "\u0c31": [{"c": "\u0cb1", "n": "KANNADA LETTER RRA"}], "\u0cb2": [{"c": "\u0c32", "n": "TELUGU LETTER LA"}], "\u0c32": [{"c": "\u0cb2", "n": "KANNADA LETTER LA"}], "\u0c37": [{"c": "\u0c35\u0323", "n": "TELUGU LETTER VA, COMBINING DOT BELOW"}], "\u0c35\u0323": [{"c": "\u0c37", "n": "TELUGU LETTER SSA"}], "\u0c39": [{"c": "\u0c35\u0c3e", "n": "TELUGU LETTER VA, TELUGU VOWEL SIGN AA"}], "\u0c35\u0c3e": [{"c": "\u0c39", "n": "TELUGU LETTER HA"}], "\u0c2e": [{"c": "\u0c35\u0c41", "n": "TELUGU LETTER VA, TELUGU VOWEL SIGN U"}], "\u0c35\u0c41": [{"c": "\u0c2e", "n": "TELUGU LETTER MA"}], "\u0c42": [{"c": "\u0c41\u0c3e", "n": "TELUGU VOWEL SIGN U, TELUGU VOWEL SIGN AA"}], "\u0c41\u0c3e": [{"c": "\u0c42", "n": "TELUGU VOWEL SIGN UU"}], "\u0c44": [{"c": "\u0c43\u0c3e", "n": "TELUGU VOWEL SIGN VOCALIC R, TELUGU VOWEL SIGN AA"}], "\u0c43\u0c3e": [{"c": "\u0c44", "n": "TELUGU VOWEL SIGN VOCALIC RR"}], "\u0ce1": [{"c": "\u0c8c\u0cbe", "n": "KANNADA LETTER VOCALIC L, KANNADA VOWEL SIGN AA"}], "\u0c8c\u0cbe": [{"c": "\u0ce1", "n": "KANNADA LETTER VOCALIC LL"}], "\u0d08": [{"c": "\u0d07\u0d57", "n": "MALAYALAM LETTER I, MALAYALAM AU LENGTH MARK"}], "\u0d07\u0d57": [{"c": "\u0d08", "n": "MALAYALAM LETTER II"}], "\u0d10": [{"c": "\u0d0e\u0d46", "n": "MALAYALAM LETTER E, MALAYALAM VOWEL SIGN E"}], "\u0d0e\u0d46": [{"c": "\u0d10", "n": "MALAYALAM LETTER AI"}], "\u0d13": [{"c": "\u0d12\u0d3e", "n": "MALAYALAM LETTER O, MALAYALAM VOWEL SIGN AA"}], "\u0d12\u0d3e": [{"c": "\u0d13", "n": "MALAYALAM LETTER OO"}], "\u0d14": [{"c": "\u0d12\u0d57", "n": "MALAYALAM LETTER O, MALAYALAM AU LENGTH MARK"}], "\u0d12\u0d57": [{"c": "\u0d14", "n": "MALAYALAM LETTER AU"}], "\u0d61": [{"c": "\u0d1e", "n": "MALAYALAM LETTER NYA"}], "\u0d1e": [{"c": "\u0d61", "n": "MALAYALAM LETTER VOCALIC LL"}], "\u0d6b": [{"c": "\u0d26\u0d4d\u0d30", "n": "MALAYALAM LETTER DA, MALAYALAM SIGN VIRAMA, MALAYALAM LETTER RA"}], "\u0d26\u0d4d\u0d30": [{"c": "\u0d6b", "n": "MALAYALAM DIGIT FIVE"}], "\u0d79": [{"c": "\u0d28\u0d41", "n": "MALAYALAM LETTER NA, MALAYALAM VOWEL SIGN U"}], "\u0d28\u0d41": [{"c": "\u0d79", "n": "MALAYALAM DATE MARK"}, {"c": "\u0d0c", "n": "MALAYALAM LETTER VOCALIC L"}, {"c": "\u0d19", "n": "MALAYALAM LETTER NGA"}], "\u0d0c": [{"c": "\u0d28\u0d41", "n": "MALAYALAM LETTER NA, MALAYALAM VOWEL SIGN U"}], "\u0d19": [{"c": "\u0d28\u0d41", "n": "MALAYALAM LETTER NA, MALAYALAM VOWEL SIGN U"}], "\u0d6f": [{"c": "\u0d28\u0d4d", "n": "MALAYALAM LETTER NA, MALAYALAM SIGN VIRAMA"}], "\u0d28\u0d4d": [{"c": "\u0d6f", "n": "MALAYALAM DIGIT NINE"}, {"c": "\u0d7b", "n": "MALAYALAM LETTER CHILLU N"}], "\u0d7b": [{"c": "\u0d28\u0d4d", "n": "MALAYALAM LETTER NA, MALAYALAM SIGN VIRAMA"}], "\u0d6c": [{"c": "\u0d28\u0d4d\u0d28", "n": "MALAYALAM LETTER NA, MALAYALAM SIGN VIRAMA, MALAYALAM LETTER NA"}], "\u0d28\u0d4d\u0d28": [{"c": "\u0d6c", "n": "MALAYALAM DIGIT SIX"}], "\u0d5a": [{"c": "\u0d28\u0d4d\u0d2e", "n": "MALAYALAM LETTER NA, MALAYALAM SIGN VIRAMA, MALAYALAM LETTER MA"}], "\u0d28\u0d4d\u0d2e": [{"c": "\u0d5a", "n": "MALAYALAM FRACTION THREE EIGHTIETHS"}], "\u0d31": [{"c": "\u0d30", "n": "MALAYALAM LETTER RA"}], "\u0d30": [{"c": "\u0d31", "n": "MALAYALAM LETTER RRA"}], "\u0d6a": [{"c": "\u0d30\u0d4d", "n": "MALAYALAM LETTER RA, MALAYALAM SIGN VIRAMA"}], "\u0d30\u0d4d": [{"c": "\u0d6a", "n": "MALAYALAM DIGIT FOUR"}, {"c": "\u0d7c", "n": "MALAYALAM LETTER CHILLU RR"}], "\u0d7c": [{"c": "\u0d30\u0d4d", "n": "MALAYALAM LETTER RA, MALAYALAM SIGN VIRAMA"}], "\u0d6e": [{"c": "\u0d35\u0d4d\u0d30", "n": "MALAYALAM LETTER VA, MALAYALAM SIGN VIRAMA, MALAYALAM LETTER RA"}], "\u0d35\u0d4d\u0d30": [{"c": "\u0d6e", "n": "MALAYALAM DIGIT EIGHT"}], "\u0d76": [{"c": "\u0d39\u0d4d\u0d2e", "n": "MALAYALAM LETTER HA, MALAYALAM SIGN VIRAMA, MALAYALAM LETTER MA"}], "\u0d39\u0d4d\u0d2e": [{"c": "\u0d76", "n": "MALAYALAM FRACTION ONE SIXTEENTH"}], "\u0d42": [{"c": "\u0d41", "n": "MALAYALAM VOWEL SIGN U"}], "\u0d41": [{"c": "\u0d42", "n": "MALAYALAM VOWEL SIGN UU"}, {"c": "\u0d43", "n": "MALAYALAM VOWEL SIGN VOCALIC R"}], "\u0d43": [{"c": "\u0d41", "n": "MALAYALAM VOWEL SIGN U"}], "\u0d48": [{"c": "\u0d46\u0d46", "n": "MALAYALAM VOWEL SIGN E, MALAYALAM VOWEL SIGN E"}], "\u0d46\u0d46": [{"c": "\u0d48", "n": "MALAYALAM VOWEL SIGN AI"}], "\u0dea": [{"c": "\u0da2", "n": "SINHALA LETTER ALPAPRAANA JAYANNA"}], "\u0da2": [{"c": "\u0dea", "n": "SINHALA LITH DIGIT FOUR"}], "\u0deb": [{"c": "\u0daf", "n": "SINHALA LETTER ALPAPRAANA DAYANNA"}], "\u0daf": [{"c": "\u0deb", "n": "SINHALA LITH DIGIT FIVE"}], "\ud805\udc13": [{"c": "\ud805\udc34\ud805\udc42\ud805\udc12", "n": "NEWA LETTER HA, NEWA SIGN VIRAMA, NEWA LETTER NGA"}], "\ud805\udc34\ud805\udc42\ud805\udc12": [{"c": "\ud805\udc13", "n": "NEWA LETTER NGHA"}], "\ud805\udc19": [{"c": "\ud805\udc34\ud805\udc42\ud805\udc18", "n": "NEWA LETTER HA, NEWA SIGN VIRAMA, NEWA LETTER NYA"}], "\ud805\udc34\ud805\udc42\ud805\udc18": [{"c": "\ud805\udc19", "n": "NEWA LETTER NYHA"}], "\ud805\udc24": [{"c": "\ud805\udc34\ud805\udc42\ud805\udc23", "n": "NEWA LETTER HA, NEWA SIGN VIRAMA, NEWA LETTER NA"}], "\ud805\udc34\ud805\udc42\ud805\udc23": [{"c": "\ud805\udc24", "n": "NEWA LETTER NHA"}], "\ud805\udc2a": [{"c": "\ud805\udc34\ud805\udc42\ud805\udc29", "n": "NEWA LETTER HA, NEWA SIGN VIRAMA, NEWA LETTER MA"}], "\ud805\udc34\ud805\udc42\ud805\udc29": [{"c": "\ud805\udc2a", "n": "NEWA LETTER MHA"}], "\ud805\udc2d": [{"c": "\ud805\udc34\ud805\udc42\ud805\udc2c", "n": "NEWA LETTER HA, NEWA SIGN VIRAMA, NEWA LETTER RA"}], "\ud805\udc34\ud805\udc42\ud805\udc2c": [{"c": "\ud805\udc2d", "n": "NEWA LETTER RHA"}], "\ud805\udc2f": [{"c": "\ud805\udc34\ud805\udc42\ud805\udc2e", "n": "NEWA LETTER HA, NEWA SIGN VIRAMA, NEWA LETTER LA"}], "\ud805\udc34\ud805\udc42\ud805\udc2e": [{"c": "\ud805\udc2f", "n": "NEWA LETTER LHA"}], "\ud805\uddd8": [{"c": "\ud805\udd82", "n": "SIDDHAM LETTER I"}], "\ud805\udd82": [{"c": "\ud805\uddd8", "n": "SIDDHAM LETTER THREE-CIRCLE ALTERNATE I"}, {"c": "\ud805\uddd9", "n": "SIDDHAM LETTER TWO-CIRCLE ALTERNATE I"}], "\ud805\uddd9": [{"c": "\ud805\udd82", "n": "SIDDHAM LETTER I"}], "\ud805\uddda": [{"c": "\ud805\udd83", "n": "SIDDHAM LETTER II"}], "\ud805\udd83": [{"c": "\ud805\uddda", "n": "SIDDHAM LETTER TWO-CIRCLE ALTERNATE II"}], "\ud805\udddb": [{"c": "\ud805\udd84", "n": "SIDDHAM LETTER U"}], "\ud805\udd84": [{"c": "\ud805\udddb", "n": "SIDDHAM LETTER ALTERNATE U"}], "\ud805\udddc": [{"c": "\ud805\uddb2", "n": "SIDDHAM VOWEL SIGN U"}], "\ud805\uddb2": [{"c": "\ud805\udddc", "n": "SIDDHAM VOWEL SIGN ALTERNATE U"}], "\ud805\udddd": [{"c": "\ud805\uddb3", "n": "SIDDHAM VOWEL SIGN UU"}], "\ud805\uddb3": [{"c": "\ud805\udddd", "n": "SIDDHAM VOWEL SIGN ALTERNATE UU"}], "\u0e03": [{"c": "\u0e02", "n": "THAI CHARACTER KHO KHAI"}], "\u0e02": [{"c": "\u0e03", "n": "THAI CHARACTER KHO KHUAT"}], "\u0e14": [{"c": "\u0e04", "n": "THAI CHARACTER KHO KHWAI"}], "\u0e04": [{"c": "\u0e14", "n": "THAI CHARACTER DO DEK"}, {"c": "\u0e15", "n": "THAI CHARACTER TO TAO"}], "\u0e15": [{"c": "\u0e04", "n": "THAI CHARACTER KHO KHWAI"}], "\u0e21": [{"c": "\u0e06", "n": "THAI CHARACTER KHO RAKHANG"}], "\u0e06": [{"c": "\u0e21", "n": "THAI CHARACTER MO MA"}], "\u0e88": [{"c": "\u0e08", "n": "THAI CHARACTER CHO CHAN"}], "\u0e08": [{"c": "\u0e88", "n": "LAO LETTER CO"}], "\u0e0b": [{"c": "\u0e0a", "n": "THAI CHARACTER CHO CHANG"}], "\u0e0a": [{"c": "\u0e0b", "n": "THAI CHARACTER SO SO"}], "\u0e0f": [{"c": "\u0e0e", "n": "THAI CHARACTER DO CHADA"}], "\u0e0e": [{"c": "\u0e0f", "n": "THAI CHARACTER TO PATAK"}], "\u0e17": [{"c": "\u0e11", "n": "THAI CHARACTER THO NANGMONTHO"}], "\u0e11": [{"c": "\u0e17", "n": "THAI CHARACTER THO THAHAN"}], "\u0e9a": [{"c": "\u0e1a", "n": "THAI CHARACTER BO BAIMAI"}], "\u0e1a": [{"c": "\u0e9a", "n": "LAO LETTER BO"}], "\u0e9b": [{"c": "\u0e1b", "n": "THAI CHARACTER PO PLA"}], "\u0e1b": [{"c": "\u0e9b", "n": "LAO LETTER PO"}], "\u0e9d": [{"c": "\u0e1d", "n": "THAI CHARACTER FO FA"}], "\u0e1d": [{"c": "\u0e9d", "n": "LAO LETTER FO TAM"}], "\u0e9e": [{"c": "\u0e1e", "n": "THAI CHARACTER PHO PHAN"}], "\u0e1e": [{"c": "\u0e9e", "n": "LAO LETTER PHO TAM"}], "\u0e9f": [{"c": "\u0e1f", "n": "THAI CHARACTER FO FAN"}], "\u0e1f": [{"c": "\u0e9f", "n": "LAO LETTER FO SUNG"}], "\u0e26": [{"c": "\u0e20", "n": "THAI CHARACTER PHO SAMPHAO"}], "\u0e20": [{"c": "\u0e26", "n": "THAI CHARACTER LU"}], "\u0e8d": [{"c": "\u0e22", "n": "THAI CHARACTER YO YAK"}], "\u0e22": [{"c": "\u0e8d", "n": "LAO LETTER NYO"}], "\u17d4": [{"c": "\u0e2f", "n": "THAI CHARACTER PAIYANNOI"}], "\u0e2f": [{"c": "\u17d4", "n": "KHMER SIGN KHAN"}], "\u0e45": [{"c": "\u0e32", "n": "THAI CHARACTER SARA AA"}], "\u0e32": [{"c": "\u0e45", "n": "THAI CHARACTER LAKKHANGYAO"}], "\u0e33": [{"c": "\u030a\u0e32", "n": "COMBINING RING ABOVE, THAI CHARACTER SARA AA"}], "\u030a\u0e32": [{"c": "\u0e33", "n": "THAI CHARACTER SARA AM"}], "\u17b7": [{"c": "\u0e34", "n": "THAI CHARACTER SARA I"}], "\u0e34": [{"c": "\u17b7", "n": "KHMER VOWEL SIGN I"}], "\u17b8": [{"c": "\u0e35", "n": "THAI CHARACTER SARA II"}], "\u0e35": [{"c": "\u17b8", "n": "KHMER VOWEL SIGN II"}], "\u17b9": [{"c": "\u0e36", "n": "THAI CHARACTER SARA UE"}], "\u0e36": [{"c": "\u17b9", "n": "KHMER VOWEL SIGN Y"}], "\u17ba": [{"c": "\u0e37", "n": "THAI CHARACTER SARA UEE"}], "\u0e37": [{"c": "\u17ba", "n": "KHMER VOWEL SIGN YY"}], "\u0eb8": [{"c": "\u0e38", "n": "THAI CHARACTER SARA U"}], "\u0e38": [{"c": "\u0eb8", "n": "LAO VOWEL SIGN U"}], "\u0eb9": [{"c": "\u0e39", "n": "THAI CHARACTER SARA UU"}], "\u0e39": [{"c": "\u0eb9", "n": "LAO VOWEL SIGN UU"}], "\u0e41": [{"c": "\u0e40\u0e40", "n": "THAI CHARACTER SARA E, THAI CHARACTER SARA E"}], "\u0e40\u0e40": [{"c": "\u0e41", "n": "THAI CHARACTER SARA AE"}], "\u0edc": [{"c": "\u0eab\u0e99", "n": "LAO LETTER HO SUNG, LAO LETTER NO"}], "\u0eab\u0e99": [{"c": "\u0edc", "n": "LAO HO NO"}], "\u0edd": [{"c": "\u0eab\u0ea1", "n": "LAO LETTER HO SUNG, LAO LETTER MO"}], "\u0eab\u0ea1": [{"c": "\u0edd", "n": "LAO HO MO"}], "\u0eb3": [{"c": "\u030a\u0eb2", "n": "COMBINING RING ABOVE, LAO VOWEL SIGN AA"}], "\u030a\u0eb2": [{"c": "\u0eb3", "n": "LAO VOWEL SIGN AM"}], "\u0f02": [{"c": "\u0f60\u0f74\u0f82\u0f7f", "n": "TIBETAN LETTER -A, TIBETAN VOWEL SIGN U, TIBETAN SIGN NYI ZLA NAA DA, TIBETAN SIGN RNAM BCAD"}], "\u0f60\u0f74\u0f82\u0f7f": [{"c": "\u0f02", "n": "TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA"}], "\u0f03": [{"c": "\u0f60\u0f74\u0f82\u0f14", "n": "TIBETAN LETTER -A, TIBETAN VOWEL SIGN U, TIBETAN SIGN NYI ZLA NAA DA, TIBETAN MARK GTER TSHEG"}], "\u0f60\u0f74\u0f82\u0f14": [{"c": "\u0f03", "n": "TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA"}], "\u0f6a": [{"c": "\u0f62", "n": "TIBETAN LETTER RA"}], "\u0f62": [{"c": "\u0f6a", "n": "TIBETAN LETTER FIXED-FORM RA"}], "\u0f00": [{"c": "\u0f68\u0f7c\u0f7e", "n": "TIBETAN LETTER A, TIBETAN VOWEL SIGN O, TIBETAN SIGN RJES SU NGA RO"}], "\u0f68\u0f7c\u0f7e": [{"c": "\u0f00", "n": "TIBETAN SYLLABLE OM"}], "\u0f77": [{"c": "\u0fb2\u0f71\u0f80", "n": "TIBETAN SUBJOINED LETTER RA, TIBETAN VOWEL SIGN AA, TIBETAN VOWEL SIGN REVERSED I"}], "\u0fb2\u0f71\u0f80": [{"c": "\u0f77", "n": "TIBETAN VOWEL SIGN VOCALIC RR"}], "\u0f79": [{"c": "\u0fb3\u0f71\u0f80", "n": "TIBETAN SUBJOINED LETTER LA, TIBETAN VOWEL SIGN AA, TIBETAN VOWEL SIGN REVERSED I"}], "\u0fb3\u0f71\u0f80": [{"c": "\u0f79", "n": "TIBETAN VOWEL SIGN VOCALIC LL"}], "\ud807\udcb2": [{"c": "\ud807\udcaa", "n": "MARCHEN SUBJOINED LETTER RA"}], "\ud807\udcaa": [{"c": "\ud807\udcb2", "n": "MARCHEN VOWEL SIGN U"}], "\u1081": [{"c": "\u1002\u103e", "n": "MYANMAR LETTER GA, MYANMAR CONSONANT SIGN MEDIAL HA"}], "\u1002\u103e": [{"c": "\u1081", "n": "MYANMAR LETTER SHAN HA"}], "\u1000": [{"c": "\u1002\u102c", "n": "MYANMAR LETTER GA, MYANMAR VOWEL SIGN AA"}], "\u1002\u102c": [{"c": "\u1000", "n": "MYANMAR LETTER KA"}], "\u1070": [{"c": "\u1003\u103e", "n": "MYANMAR LETTER GHA, MYANMAR CONSONANT SIGN MEDIAL HA"}], "\u1003\u103e": [{"c": "\u1070", "n": "MYANMAR LETTER EASTERN PWO KAREN GHWA"}], "\u1066": [{"c": "\u1015\u103e", "n": "MYANMAR LETTER PA, MYANMAR CONSONANT SIGN MEDIAL HA"}], "\u1015\u103e": [{"c": "\u1066", "n": "MYANMAR LETTER WESTERN PWO KAREN PWA"}], "\u101f": [{"c": "\u1015\u102c", "n": "MYANMAR LETTER PA, MYANMAR VOWEL SIGN AA"}], "\u1015\u102c": [{"c": "\u101f", "n": "MYANMAR LETTER HA"}], "\u106f": [{"c": "\u1015\u102c\u103e", "n": "MYANMAR LETTER PA, MYANMAR VOWEL SIGN AA, MYANMAR CONSONANT SIGN MEDIAL HA"}], "\u1015\u102c\u103e": [{"c": "\u106f", "n": "MYANMAR LETTER EASTERN PWO KAREN YWA"}], "\u107e": [{"c": "\u107d\u103e", "n": "MYANMAR LETTER SHAN PHA, MYANMAR CONSONANT SIGN MEDIAL HA"}], "\u107d\u103e": [{"c": "\u107e", "n": "MYANMAR LETTER SHAN FA"}], "\u1029": [{"c": "\u101e\u103c", "n": "MYANMAR LETTER SA, MYANMAR CONSONANT SIGN MEDIAL RA"}], "\u101e\u103c": [{"c": "\u1029", "n": "MYANMAR LETTER O"}], "\u102a": [{"c": "\u101e\u103c\u1031\u102c\u103a", "n": "MYANMAR LETTER SA, MYANMAR CONSONANT SIGN MEDIAL RA, MYANMAR VOWEL SIGN E, MYANMAR VOWEL SIGN AA, MYANMAR SIGN ASAT"}], "\u101e\u103c\u1031\u102c\u103a": [{"c": "\u102a", "n": "MYANMAR LETTER AU"}], "\u109e": [{"c": "\u1083\u030a", "n": "MYANMAR VOWEL SIGN SHAN AA, COMBINING RING ABOVE"}], "\u1083\u030a": [{"c": "\u109e", "n": "MYANMAR SYMBOL SHAN ONE"}], "\u17a3": [{"c": "\u17a2", "n": "KHMER LETTER QA"}], "\u17a2": [{"c": "\u17a3", "n": "KHMER INDEPENDENT VOWEL QAQ"}], "\u19d0": [{"c": "\u199e", "n": "NEW TAI LUE LETTER LOW VA"}], "\u199e": [{"c": "\u19d0", "n": "NEW TAI LUE DIGIT ZERO"}], "\u19d1": [{"c": "\u19b1", "n": "NEW TAI LUE VOWEL SIGN AA"}], "\u19b1": [{"c": "\u19d1", "n": "NEW TAI LUE DIGIT ONE"}], "\u1a80": [{"c": "\u1a45", "n": "TAI THAM LETTER WA"}], "\u1a45": [{"c": "\u1a80", "n": "TAI THAM HORA DIGIT ZERO"}, {"c": "\u1a90", "n": "TAI THAM THAM DIGIT ZERO"}], "\u1a90": [{"c": "\u1a45", "n": "TAI THAM LETTER WA"}], "\uaa53": [{"c": "\uaa01", "n": "CHAM LETTER I"}], "\uaa01": [{"c": "\uaa53", "n": "CHAM DIGIT THREE"}], "\uaa56": [{"c": "\uaa23", "n": "CHAM LETTER RA"}], "\uaa23": [{"c": "\uaa56", "n": "CHAM DIGIT SIX"}], "\u1b52": [{"c": "\u1b0d", "n": "BALINESE LETTER LA LENGA"}], "\u1b0d": [{"c": "\u1b52", "n": "BALINESE DIGIT TWO"}], "\u1b53": [{"c": "\u1b11", "n": "BALINESE LETTER OKARA"}], "\u1b11": [{"c": "\u1b53", "n": "BALINESE DIGIT THREE"}], "\u1b58": [{"c": "\u1b28", "n": "BALINESE LETTER PA KAPAL"}], "\u1b28": [{"c": "\u1b58", "n": "BALINESE DIGIT EIGHT"}], "\ua9a3": [{"c": "\ua99d", "n": "JAVANESE LETTER DDA"}], "\ua99d": [{"c": "\ua9a3", "n": "JAVANESE LETTER DA MAHAPRANA"}], "\u1896": [{"c": "\u185c", "n": "MONGOLIAN LETTER TODO DZA"}], "\u185c": [{"c": "\u1896", "n": "MONGOLIAN LETTER ALI GALI ZA"}], "\u1855": [{"c": "\u1835", "n": "MONGOLIAN LETTER JA"}], "\u1835": [{"c": "\u1855", "n": "MONGOLIAN LETTER TODO YA"}], "\u1ff6": [{"c": "\u13ef", "n": "CHEROKEE LETTER YA"}], "\u13ef": [{"c": "\u1ff6", "n": "GREEK SMALL LETTER OMEGA WITH PERISPOMENI"}], "\u140d": [{"c": "\u1401\u00b7", "n": "CANADIAN SYLLABICS E, MIDDLE DOT"}], "\u1401\u00b7": [{"c": "\u140d", "n": "CANADIAN SYLLABICS WEST-CREE WE"}], "\u142b": [{"c": "\u1401\u1420", "n": "CANADIAN SYLLABICS E, CANADIAN SYLLABICS FINAL GRAVE"}], "\u1401\u1420": [{"c": "\u142b", "n": "CANADIAN SYLLABICS EN"}], "\u1411": [{"c": "\u1404\u00b7", "n": "CANADIAN SYLLABICS II, MIDDLE DOT"}], "\u1404\u00b7": [{"c": "\u1411", "n": "CANADIAN SYLLABICS WEST-CREE WII"}], "\u1413": [{"c": "\u1405\u00b7", "n": "CANADIAN SYLLABICS O, MIDDLE DOT"}], "\u1405\u00b7": [{"c": "\u1413", "n": "CANADIAN SYLLABICS WEST-CREE WO"}], "\u142d": [{"c": "\u1405\u1420", "n": "CANADIAN SYLLABICS O, CANADIAN SYLLABICS FINAL GRAVE"}], "\u1405\u1420": [{"c": "\u142d", "n": "CANADIAN SYLLABICS ON"}], "\u1415": [{"c": "\u1406\u00b7", "n": "CANADIAN SYLLABICS OO, MIDDLE DOT"}], "\u1406\u00b7": [{"c": "\u1415", "n": "CANADIAN SYLLABICS WEST-CREE WOO"}], "\u1418": [{"c": "\u140a\u00b7", "n": "CANADIAN SYLLABICS A, MIDDLE DOT"}], "\u140a\u00b7": [{"c": "\u1418", "n": "CANADIAN SYLLABICS WEST-CREE WA"}], "\u142e": [{"c": "\u140a\u1420", "n": "CANADIAN SYLLABICS A, CANADIAN SYLLABICS FINAL GRAVE"}], "\u140a\u1420": [{"c": "\u142e", "n": "CANADIAN SYLLABICS AN"}], "\u141a": [{"c": "\u140b\u00b7", "n": "CANADIAN SYLLABICS AA, MIDDLE DOT"}], "\u140b\u00b7": [{"c": "\u141a", "n": "CANADIAN SYLLABICS WEST-CREE WAA"}], "\u18dd": [{"c": "\u141e\u18df", "n": "CANADIAN SYLLABICS GLOTTAL STOP, CANADIAN SYLLABICS FINAL RAISED DOT"}], "\u141e\u18df": [{"c": "\u18dd", "n": "CANADIAN SYLLABICS WESTERN W"}], "\u14d1": [{"c": "\u1421", "n": "CANADIAN SYLLABICS FINAL BOTTOM HALF RING"}], "\u1421": [{"c": "\u14d1", "n": "CANADIAN SYLLABICS CARRIER NG"}], "\u1540": [{"c": "\u1429", "n": "CANADIAN SYLLABICS FINAL PLUS"}], "\u1429": [{"c": "\u1540", "n": "CANADIAN SYLLABICS WEST-CREE Y"}], "\u143f": [{"c": "\u1432\u00b7", "n": "CANADIAN SYLLABICS PII, MIDDLE DOT"}], "\u1432\u00b7": [{"c": "\u143f", "n": "CANADIAN SYLLABICS WEST-CREE PWII"}], "\u1443": [{"c": "\u1434\u00b7", "n": "CANADIAN SYLLABICS POO, MIDDLE DOT"}], "\u1434\u00b7": [{"c": "\u1443", "n": "CANADIAN SYLLABICS WEST-CREE PWOO"}], "\u2369": [{"c": "\u1435", "n": "CANADIAN SYLLABICS Y-CREE POO"}], "\u1435": [{"c": "\u2369", "n": "APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS"}], "\u1447": [{"c": "\u1439\u00b7", "n": "CANADIAN SYLLABICS PAA, MIDDLE DOT"}], "\u1439\u00b7": [{"c": "\u1447", "n": "CANADIAN SYLLABICS WEST-CREE PWAA"}], "\u145c": [{"c": "\u144f\u00b7", "n": "CANADIAN SYLLABICS TII, MIDDLE DOT"}], "\u144f\u00b7": [{"c": "\u145c", "n": "CANADIAN SYLLABICS WEST-CREE TWII"}], "\u2e27": [{"c": "\u1450", "n": "CANADIAN SYLLABICS TO"}], "\u1450": [{"c": "\u2e27", "n": "RIGHT SIDEWAYS U BRACKET"}, {"c": "\u2283", "n": "SUPERSET OF"}], "\u2283": [{"c": "\u1450", "n": "CANADIAN SYLLABICS TO"}], "\u145e": [{"c": "\u1450\u00b7", "n": "CANADIAN SYLLABICS TO, MIDDLE DOT"}], "\u1450\u00b7": [{"c": "\u145e", "n": "CANADIAN SYLLABICS WEST-CREE TWO"}], "\u1469": [{"c": "\u1450'", "n": "CANADIAN SYLLABICS TO, APOSTROPHE"}], "\u1450'": [{"c": "\u1469", "n": "CANADIAN SYLLABICS TTO"}], "\u27c9": [{"c": "\u1450/", "n": "CANADIAN SYLLABICS TO, SOLIDUS"}], "\u1450/": [{"c": "\u27c9", "n": "SUPERSET PRECEDING SOLIDUS"}], "\u2ad7": [{"c": "\u1450\u1455", "n": "CANADIAN SYLLABICS TO, CANADIAN SYLLABICS TA"}], "\u1450\u1455": [{"c": "\u2ad7", "n": "SUPERSET BESIDE SUBSET"}], "\u1460": [{"c": "\u1451\u00b7", "n": "CANADIAN SYLLABICS TOO, MIDDLE DOT"}], "\u1451\u00b7": [{"c": "\u1460", "n": "CANADIAN SYLLABICS WEST-CREE TWOO"}], "\u2e26": [{"c": "\u1455", "n": "CANADIAN SYLLABICS TA"}], "\u1455": [{"c": "\u2e26", "n": "LEFT SIDEWAYS U BRACKET"}, {"c": "\u2282", "n": "SUBSET OF"}], "\u2282": [{"c": "\u1455", "n": "CANADIAN SYLLABICS TA"}], "\u1462": [{"c": "\u1455\u00b7", "n": "CANADIAN SYLLABICS TA, MIDDLE DOT"}], "\u1455\u00b7": [{"c": "\u1462", "n": "CANADIAN SYLLABICS WEST-CREE TWA"}], "\u146a": [{"c": "\u1455'", "n": "CANADIAN SYLLABICS TA, APOSTROPHE"}], "\u1455'": [{"c": "\u146a", "n": "CANADIAN SYLLABICS TTA"}], "\u1464": [{"c": "\u1456\u00b7", "n": "CANADIAN SYLLABICS TAA, MIDDLE DOT"}], "\u1456\u00b7": [{"c": "\u1464", "n": "CANADIAN SYLLABICS WEST-CREE TWAA"}], "\u1475": [{"c": "\u146b\u00b7", "n": "CANADIAN SYLLABICS KE, MIDDLE DOT"}], "\u146b\u00b7": [{"c": "\u1475", "n": "CANADIAN SYLLABICS WEST-CREE KWE"}], "\u1485": [{"c": "\u146b'", "n": "CANADIAN SYLLABICS KE, APOSTROPHE"}], "\u146b'": [{"c": "\u1485", "n": "CANADIAN SYLLABICS SOUTH-SLAVEY KEH"}], "\u1479": [{"c": "\u146e\u00b7", "n": "CANADIAN SYLLABICS KII, MIDDLE DOT"}], "\u146e\u00b7": [{"c": "\u1479", "n": "CANADIAN SYLLABICS WEST-CREE KWII"}], "\u147d": [{"c": "\u1470\u00b7", "n": "CANADIAN SYLLABICS KOO, MIDDLE DOT"}], "\u1470\u00b7": [{"c": "\u147d", "n": "CANADIAN SYLLABICS WEST-CREE KWOO"}], "\u1603": [{"c": "\u1489", "n": "CANADIAN SYLLABICS CE"}], "\u1489": [{"c": "\u1603", "n": "CANADIAN SYLLABICS CARRIER NO"}], "\u1493": [{"c": "\u1489\u00b7", "n": "CANADIAN SYLLABICS CE, MIDDLE DOT"}], "\u1489\u00b7": [{"c": "\u1493", "n": "CANADIAN SYLLABICS WEST-CREE CWE"}], "\u1495": [{"c": "\u148b\u00b7", "n": "CANADIAN SYLLABICS CI, MIDDLE DOT"}], "\u148b\u00b7": [{"c": "\u1495", "n": "CANADIAN SYLLABICS WEST-CREE CWI"}], "\u1497": [{"c": "\u148c\u00b7", "n": "CANADIAN SYLLABICS CII, MIDDLE DOT"}], "\u148c\u00b7": [{"c": "\u1497", "n": "CANADIAN SYLLABICS WEST-CREE CWII"}], "\u149b": [{"c": "\u148e\u00b7", "n": "CANADIAN SYLLABICS COO, MIDDLE DOT"}], "\u148e\u00b7": [{"c": "\u149b", "n": "CANADIAN SYLLABICS WEST-CREE CWOO"}], "\u1602": [{"c": "\u1490", "n": "CANADIAN SYLLABICS CA"}], "\u1490": [{"c": "\u1602", "n": "CANADIAN SYLLABICS CARRIER NU"}], "\u149d": [{"c": "\u1490\u00b7", "n": "CANADIAN SYLLABICS CA, MIDDLE DOT"}], "\u1490\u00b7": [{"c": "\u149d", "n": "CANADIAN SYLLABICS WEST-CREE CWA"}], "\u149f": [{"c": "\u1491\u00b7", "n": "CANADIAN SYLLABICS CAA, MIDDLE DOT"}], "\u1491\u00b7": [{"c": "\u149f", "n": "CANADIAN SYLLABICS WEST-CREE CWAA"}], "\u14ad": [{"c": "\u14a3\u00b7", "n": "CANADIAN SYLLABICS ME, MIDDLE DOT"}], "\u14a3\u00b7": [{"c": "\u14ad", "n": "CANADIAN SYLLABICS WEST-CREE MWE"}], "\u14b1": [{"c": "\u14a6\u00b7", "n": "CANADIAN SYLLABICS MII, MIDDLE DOT"}], "\u14a6\u00b7": [{"c": "\u14b1", "n": "CANADIAN SYLLABICS WEST-CREE MWII"}], "\u14b3": [{"c": "\u14a7\u00b7", "n": "CANADIAN SYLLABICS MO, MIDDLE DOT"}], "\u14a7\u00b7": [{"c": "\u14b3", "n": "CANADIAN SYLLABICS WEST-CREE MWO"}], "\u14b5": [{"c": "\u14a8\u00b7", "n": "CANADIAN SYLLABICS MOO, MIDDLE DOT"}], "\u14a8\u00b7": [{"c": "\u14b5", "n": "CANADIAN SYLLABICS WEST-CREE MWOO"}], "\u14b9": [{"c": "\u14ab\u00b7", "n": "CANADIAN SYLLABICS MAA, MIDDLE DOT"}], "\u14ab\u00b7": [{"c": "\u14b9", "n": "CANADIAN SYLLABICS WEST-CREE MWAA"}], "\u14ca": [{"c": "\u14c0\u00b7", "n": "CANADIAN SYLLABICS NE, MIDDLE DOT"}], "\u14c0\u00b7": [{"c": "\u14ca", "n": "CANADIAN SYLLABICS WEST-CREE NWE"}], "\u18c7": [{"c": "\u14c2\u00b7", "n": "CANADIAN SYLLABICS NI, MIDDLE DOT"}], "\u14c2\u00b7": [{"c": "\u18c7", "n": "CANADIAN SYLLABICS OJIBWAY NWI"}], "\u18c9": [{"c": "\u14c3\u00b7", "n": "CANADIAN SYLLABICS NII, MIDDLE DOT"}], "\u14c3\u00b7": [{"c": "\u18c9", "n": "CANADIAN SYLLABICS OJIBWAY NWII"}], "\u18cb": [{"c": "\u14c4\u00b7", "n": "CANADIAN SYLLABICS NO, MIDDLE DOT"}], "\u14c4\u00b7": [{"c": "\u18cb", "n": "CANADIAN SYLLABICS OJIBWAY NWO"}], "\u18cd": [{"c": "\u14c5\u00b7", "n": "CANADIAN SYLLABICS NOO, MIDDLE DOT"}], "\u14c5\u00b7": [{"c": "\u18cd", "n": "CANADIAN SYLLABICS OJIBWAY NWOO"}], "\u14cc": [{"c": "\u14c7\u00b7", "n": "CANADIAN SYLLABICS NA, MIDDLE DOT"}], "\u14c7\u00b7": [{"c": "\u14cc", "n": "CANADIAN SYLLABICS WEST-CREE NWA"}], "\u14ce": [{"c": "\u14c8\u00b7", "n": "CANADIAN SYLLABICS NAA, MIDDLE DOT"}], "\u14c8\u00b7": [{"c": "\u14ce", "n": "CANADIAN SYLLABICS WEST-CREE NWAA"}], "\u1604": [{"c": "\u14d3", "n": "CANADIAN SYLLABICS LE"}], "\u14d3": [{"c": "\u1604", "n": "CANADIAN SYLLABICS CARRIER NE"}], "\u14dd": [{"c": "\u14d3\u00b7", "n": "CANADIAN SYLLABICS LE, MIDDLE DOT"}], "\u14d3\u00b7": [{"c": "\u14dd", "n": "CANADIAN SYLLABICS WEST-CREE LWE"}], "\u14df": [{"c": "\u14d5\u00b7", "n": "CANADIAN SYLLABICS LI, MIDDLE DOT"}], "\u14d5\u00b7": [{"c": "\u14df", "n": "CANADIAN SYLLABICS WEST-CREE LWI"}], "\u14e1": [{"c": "\u14d6\u00b7", "n": "CANADIAN SYLLABICS LII, MIDDLE DOT"}], "\u14d6\u00b7": [{"c": "\u14e1", "n": "CANADIAN SYLLABICS WEST-CREE LWII"}], "\u14e3": [{"c": "\u14d7\u00b7", "n": "CANADIAN SYLLABICS LO, MIDDLE DOT"}], "\u14d7\u00b7": [{"c": "\u14e3", "n": "CANADIAN SYLLABICS WEST-CREE LWO"}], "\u14e5": [{"c": "\u14d8\u00b7", "n": "CANADIAN SYLLABICS LOO, MIDDLE DOT"}], "\u14d8\u00b7": [{"c": "\u14e5", "n": "CANADIAN SYLLABICS WEST-CREE LWOO"}], "\u1607": [{"c": "\u14da", "n": "CANADIAN SYLLABICS LA"}], "\u14da": [{"c": "\u1607", "n": "CANADIAN SYLLABICS CARRIER NA"}], "\u14e7": [{"c": "\u14da\u00b7", "n": "CANADIAN SYLLABICS LA, MIDDLE DOT"}], "\u14da\u00b7": [{"c": "\u14e7", "n": "CANADIAN SYLLABICS WEST-CREE LWA"}], "\u14e9": [{"c": "\u14db\u00b7", "n": "CANADIAN SYLLABICS LAA, MIDDLE DOT"}], "\u14db\u00b7": [{"c": "\u14e9", "n": "CANADIAN SYLLABICS WEST-CREE LWAA"}], "\u14f7": [{"c": "\u14ed\u00b7", "n": "CANADIAN SYLLABICS SE, MIDDLE DOT"}], "\u14ed\u00b7": [{"c": "\u14f7", "n": "CANADIAN SYLLABICS WEST-CREE SWE"}], "\u14f9": [{"c": "\u14ef\u00b7", "n": "CANADIAN SYLLABICS SI, MIDDLE DOT"}], "\u14ef\u00b7": [{"c": "\u14f9", "n": "CANADIAN SYLLABICS WEST-CREE SWI"}], "\u14fb": [{"c": "\u14f0\u00b7", "n": "CANADIAN SYLLABICS SII, MIDDLE DOT"}], "\u14f0\u00b7": [{"c": "\u14fb", "n": "CANADIAN SYLLABICS WEST-CREE SWII"}], "\u14fd": [{"c": "\u14f1\u00b7", "n": "CANADIAN SYLLABICS SO, MIDDLE DOT"}], "\u14f1\u00b7": [{"c": "\u14fd", "n": "CANADIAN SYLLABICS WEST-CREE SWO"}], "\u14ff": [{"c": "\u14f2\u00b7", "n": "CANADIAN SYLLABICS SOO, MIDDLE DOT"}], "\u14f2\u00b7": [{"c": "\u14ff", "n": "CANADIAN SYLLABICS WEST-CREE SWOO"}], "\u1501": [{"c": "\u14f4\u00b7", "n": "CANADIAN SYLLABICS SA, MIDDLE DOT"}], "\u14f4\u00b7": [{"c": "\u1501", "n": "CANADIAN SYLLABICS WEST-CREE SWA"}], "\u1503": [{"c": "\u14f5\u00b7", "n": "CANADIAN SYLLABICS SAA, MIDDLE DOT"}], "\u14f5\u00b7": [{"c": "\u1503", "n": "CANADIAN SYLLABICS WEST-CREE SWAA"}], "\u150c": [{"c": "\u150b<", "n": "CANADIAN SYLLABICS NASKAPI S-W, LESS-THAN SIGN"}], "\u150b<": [{"c": "\u150c", "n": "CANADIAN SYLLABICS NASKAPI SPWA"}], "\u150e": [{"c": "\u150bb", "n": "CANADIAN SYLLABICS NASKAPI S-W, LATIN SMALL LETTER B"}], "\u150bb": [{"c": "\u150e", "n": "CANADIAN SYLLABICS NASKAPI SKWA"}], "\u150d": [{"c": "\u150b\u1455", "n": "CANADIAN SYLLABICS NASKAPI S-W, CANADIAN SYLLABICS TA"}], "\u150b\u1455": [{"c": "\u150d", "n": "CANADIAN SYLLABICS NASKAPI STWA"}], "\u150f": [{"c": "\u150b\u1490", "n": "CANADIAN SYLLABICS NASKAPI S-W, CANADIAN SYLLABICS CA"}], "\u150b\u1490": [{"c": "\u150f", "n": "CANADIAN SYLLABICS NASKAPI SCWA"}], "\u1518": [{"c": "\u1510\u00b7", "n": "CANADIAN SYLLABICS SHE, MIDDLE DOT"}], "\u1510\u00b7": [{"c": "\u1518", "n": "CANADIAN SYLLABICS WEST-CREE SHWE"}], "\u151a": [{"c": "\u1511\u00b7", "n": "CANADIAN SYLLABICS SHI, MIDDLE DOT"}], "\u1511\u00b7": [{"c": "\u151a", "n": "CANADIAN SYLLABICS WEST-CREE SHWI"}], "\u151c": [{"c": "\u1512\u00b7", "n": "CANADIAN SYLLABICS SHII, MIDDLE DOT"}], "\u1512\u00b7": [{"c": "\u151c", "n": "CANADIAN SYLLABICS WEST-CREE SHWII"}], "\u151e": [{"c": "\u1513\u00b7", "n": "CANADIAN SYLLABICS SHO, MIDDLE DOT"}], "\u1513\u00b7": [{"c": "\u151e", "n": "CANADIAN SYLLABICS WEST-CREE SHWO"}], "\u1520": [{"c": "\u1514\u00b7", "n": "CANADIAN SYLLABICS SHOO, MIDDLE DOT"}], "\u1514\u00b7": [{"c": "\u1520", "n": "CANADIAN SYLLABICS WEST-CREE SHWOO"}], "\u1522": [{"c": "\u1515\u00b7", "n": "CANADIAN SYLLABICS SHA, MIDDLE DOT"}], "\u1515\u00b7": [{"c": "\u1522", "n": "CANADIAN SYLLABICS WEST-CREE SHWA"}], "\u1524": [{"c": "\u1516\u00b7", "n": "CANADIAN SYLLABICS SHAA, MIDDLE DOT"}], "\u1516\u00b7": [{"c": "\u1524", "n": "CANADIAN SYLLABICS WEST-CREE SHWAA"}], "\u1532": [{"c": "\u1528\u00b7", "n": "CANADIAN SYLLABICS YI, MIDDLE DOT"}], "\u1528\u00b7": [{"c": "\u1532", "n": "CANADIAN SYLLABICS WEST-CREE YWI"}], "\u1534": [{"c": "\u1529\u00b7", "n": "CANADIAN SYLLABICS YII, MIDDLE DOT"}], "\u1529\u00b7": [{"c": "\u1534", "n": "CANADIAN SYLLABICS WEST-CREE YWII"}], "\u1536": [{"c": "\u152a\u00b7", "n": "CANADIAN SYLLABICS YO, MIDDLE DOT"}], "\u152a\u00b7": [{"c": "\u1536", "n": "CANADIAN SYLLABICS WEST-CREE YWO"}], "\u1538": [{"c": "\u152b\u00b7", "n": "CANADIAN SYLLABICS YOO, MIDDLE DOT"}], "\u152b\u00b7": [{"c": "\u1538", "n": "CANADIAN SYLLABICS WEST-CREE YWOO"}], "\u153a": [{"c": "\u152d\u00b7", "n": "CANADIAN SYLLABICS YA, MIDDLE DOT"}], "\u152d\u00b7": [{"c": "\u153a", "n": "CANADIAN SYLLABICS WEST-CREE YWA"}], "\u153c": [{"c": "\u152e\u00b7", "n": "CANADIAN SYLLABICS YAA, MIDDLE DOT"}], "\u152e\u00b7": [{"c": "\u153c", "n": "CANADIAN SYLLABICS WEST-CREE YWAA"}], "\u1622": [{"c": "\u1543", "n": "CANADIAN SYLLABICS R-CREE RE"}], "\u1543": [{"c": "\u1622", "n": "CANADIAN SYLLABICS CARRIER LU"}], "\u18e0": [{"c": "\u1543\u00b7", "n": "CANADIAN SYLLABICS R-CREE RE, MIDDLE DOT"}], "\u1543\u00b7": [{"c": "\u18e0", "n": "CANADIAN SYLLABICS R-CREE RWE"}], "\u1623": [{"c": "\u1546", "n": "CANADIAN SYLLABICS RI"}], "\u1546": [{"c": "\u1623", "n": "CANADIAN SYLLABICS CARRIER LO"}], "\u1624": [{"c": "\u154a", "n": "CANADIAN SYLLABICS WEST-CREE LO"}], "\u154a": [{"c": "\u1624", "n": "CANADIAN SYLLABICS CARRIER LE"}], "\u154f": [{"c": "\u154c\u00b7", "n": "CANADIAN SYLLABICS RAA, MIDDLE DOT"}], "\u154c\u00b7": [{"c": "\u154f", "n": "CANADIAN SYLLABICS WEST-CREE RWAA"}], "\u1583": [{"c": "\u1550b", "n": "CANADIAN SYLLABICS R, LATIN SMALL LETTER B"}], "\u1550b": [{"c": "\u1583", "n": "CANADIAN SYLLABICS QA"}], "\u1584": [{"c": "\u1550b\u0307", "n": "CANADIAN SYLLABICS R, LATIN SMALL LETTER B, COMBINING DOT ABOVE"}], "\u1550b\u0307": [{"c": "\u1584", "n": "CANADIAN SYLLABICS QAA"}], "\u1581": [{"c": "\u1550d", "n": "CANADIAN SYLLABICS R, LATIN SMALL LETTER D"}], "\u1550d": [{"c": "\u1581", "n": "CANADIAN SYLLABICS QO"}], "\u157f": [{"c": "\u1550P", "n": "CANADIAN SYLLABICS R, LATIN CAPITAL LETTER P"}], "\u1550P": [{"c": "\u157f", "n": "CANADIAN SYLLABICS QI"}], "\u166f": [{"c": "\u1550\u146b", "n": "CANADIAN SYLLABICS R, CANADIAN SYLLABICS KE"}], "\u1550\u146b": [{"c": "\u166f", "n": "CANADIAN SYLLABICS QAI"}], "\u157e": [{"c": "\u1550\u146c", "n": "CANADIAN SYLLABICS R, CANADIAN SYLLABICS KAAI"}], "\u1550\u146c": [{"c": "\u157e", "n": "CANADIAN SYLLABICS QAAI"}], "\u1580": [{"c": "\u1550\u146e", "n": "CANADIAN SYLLABICS R, CANADIAN SYLLABICS KII"}], "\u1550\u146e": [{"c": "\u1580", "n": "CANADIAN SYLLABICS QII"}], "\u1582": [{"c": "\u1550\u1470", "n": "CANADIAN SYLLABICS R, CANADIAN SYLLABICS KOO"}], "\u1550\u1470": [{"c": "\u1582", "n": "CANADIAN SYLLABICS QOO"}], "\u1585": [{"c": "\u1550\u1483", "n": "CANADIAN SYLLABICS R, CANADIAN SYLLABICS K"}], "\u1550\u1483": [{"c": "\u1585", "n": "CANADIAN SYLLABICS Q"}], "\u155c": [{"c": "\u155a\u00b7", "n": "CANADIAN SYLLABICS FAA, MIDDLE DOT"}], "\u155a\u00b7": [{"c": "\u155c", "n": "CANADIAN SYLLABICS WEST-CREE FWAA"}], "\u18e3": [{"c": "\u155e\u00b7", "n": "CANADIAN SYLLABICS THE, MIDDLE DOT"}], "\u155e\u00b7": [{"c": "\u18e3", "n": "CANADIAN SYLLABICS THWE"}], "\u18e4": [{"c": "\u1566\u00b7", "n": "CANADIAN SYLLABICS THA, MIDDLE DOT"}], "\u1566\u00b7": [{"c": "\u18e4", "n": "CANADIAN SYLLABICS THWA"}], "\u1569": [{"c": "\u1567\u00b7", "n": "CANADIAN SYLLABICS THAA, MIDDLE DOT"}], "\u1567\u00b7": [{"c": "\u1569", "n": "CANADIAN SYLLABICS WEST-CREE THWAA"}], "\u18e5": [{"c": "\u156b\u00b7", "n": "CANADIAN SYLLABICS TTHE, MIDDLE DOT"}], "\u156b\u00b7": [{"c": "\u18e5", "n": "CANADIAN SYLLABICS TTHWE"}], "\u18e8": [{"c": "\u1586\u00b7", "n": "CANADIAN SYLLABICS TLHE, MIDDLE DOT"}], "\u1586\u00b7": [{"c": "\u18e8", "n": "CANADIAN SYLLABICS TLHWE"}], "\u1591": [{"c": "\u1595J", "n": "CANADIAN SYLLABICS NG, LATIN CAPITAL LETTER J"}], "\u1595J": [{"c": "\u1591", "n": "CANADIAN SYLLABICS NGO"}], "\u1670": [{"c": "\u1595\u1489", "n": "CANADIAN SYLLABICS NG, CANADIAN SYLLABICS CE"}], "\u1595\u1489": [{"c": "\u1670", "n": "CANADIAN SYLLABICS NGAI"}], "\u158e": [{"c": "\u1595\u148a", "n": "CANADIAN SYLLABICS NG, CANADIAN SYLLABICS CAAI"}], "\u1595\u148a": [{"c": "\u158e", "n": "CANADIAN SYLLABICS NGAAI"}], "\u158f": [{"c": "\u1595\u148b", "n": "CANADIAN SYLLABICS NG, CANADIAN SYLLABICS CI"}], "\u1595\u148b": [{"c": "\u158f", "n": "CANADIAN SYLLABICS NGI"}], "\u1590": [{"c": "\u1595\u148c", "n": "CANADIAN SYLLABICS NG, CANADIAN SYLLABICS CII"}], "\u1595\u148c": [{"c": "\u1590", "n": "CANADIAN SYLLABICS NGII"}], "\u1592": [{"c": "\u1595\u148e", "n": "CANADIAN SYLLABICS NG, CANADIAN SYLLABICS COO"}], "\u1595\u148e": [{"c": "\u1592", "n": "CANADIAN SYLLABICS NGOO"}], "\u1593": [{"c": "\u1595\u1490", "n": "CANADIAN SYLLABICS NG, CANADIAN SYLLABICS CA"}], "\u1595\u1490": [{"c": "\u1593", "n": "CANADIAN SYLLABICS NGA"}], "\u1594": [{"c": "\u1595\u1491", "n": "CANADIAN SYLLABICS NG, CANADIAN SYLLABICS CAA"}], "\u1595\u1491": [{"c": "\u1594", "n": "CANADIAN SYLLABICS NGAA"}], "\u1673": [{"c": "\u1596J", "n": "CANADIAN SYLLABICS NNG, LATIN CAPITAL LETTER J"}], "\u1596J": [{"c": "\u1673", "n": "CANADIAN SYLLABICS NNGO"}], "\u1671": [{"c": "\u1596\u148b", "n": "CANADIAN SYLLABICS NNG, CANADIAN SYLLABICS CI"}], "\u1596\u148b": [{"c": "\u1671", "n": "CANADIAN SYLLABICS NNGI"}], "\u1672": [{"c": "\u1596\u148c", "n": "CANADIAN SYLLABICS NNG, CANADIAN SYLLABICS CII"}], "\u1596\u148c": [{"c": "\u1672", "n": "CANADIAN SYLLABICS NNGII"}], "\u1674": [{"c": "\u1596\u148e", "n": "CANADIAN SYLLABICS NNG, CANADIAN SYLLABICS COO"}], "\u1596\u148e": [{"c": "\u1674", "n": "CANADIAN SYLLABICS NNGOO"}], "\u1675": [{"c": "\u1596\u1490", "n": "CANADIAN SYLLABICS NNG, CANADIAN SYLLABICS CA"}], "\u1596\u1490": [{"c": "\u1675", "n": "CANADIAN SYLLABICS NNGA"}], "\u1676": [{"c": "\u1596\u1491", "n": "CANADIAN SYLLABICS NNG, CANADIAN SYLLABICS CAA"}], "\u1596\u1491": [{"c": "\u1676", "n": "CANADIAN SYLLABICS NNGAA"}], "\u18ea": [{"c": "\u1597\u00b7", "n": "CANADIAN SYLLABICS SAYISI SHE, MIDDLE DOT"}], "\u1597\u00b7": [{"c": "\u18ea", "n": "CANADIAN SYLLABICS SAYISI SHWE"}], "\u1677": [{"c": "\u15a7\u00b7", "n": "CANADIAN SYLLABICS TH-CREE THE, MIDDLE DOT"}], "\u15a7\u00b7": [{"c": "\u1677", "n": "CANADIAN SYLLABICS WOODS-CREE THWEE"}], "\u1678": [{"c": "\u15a8\u00b7", "n": "CANADIAN SYLLABICS TH-CREE THI, MIDDLE DOT"}], "\u15a8\u00b7": [{"c": "\u1678", "n": "CANADIAN SYLLABICS WOODS-CREE THWI"}], "\u1679": [{"c": "\u15a9\u00b7", "n": "CANADIAN SYLLABICS TH-CREE THII, MIDDLE DOT"}], "\u15a9\u00b7": [{"c": "\u1679", "n": "CANADIAN SYLLABICS WOODS-CREE THWII"}], "\u167a": [{"c": "\u15aa\u00b7", "n": "CANADIAN SYLLABICS TH-CREE THO, MIDDLE DOT"}], "\u15aa\u00b7": [{"c": "\u167a", "n": "CANADIAN SYLLABICS WOODS-CREE THWO"}], "\u167b": [{"c": "\u15ab\u00b7", "n": "CANADIAN SYLLABICS TH-CREE THOO, MIDDLE DOT"}], "\u15ab\u00b7": [{"c": "\u167b", "n": "CANADIAN SYLLABICS WOODS-CREE THWOO"}], "\u167c": [{"c": "\u15ac\u00b7", "n": "CANADIAN SYLLABICS TH-CREE THA, MIDDLE DOT"}], "\u15ac\u00b7": [{"c": "\u167c", "n": "CANADIAN SYLLABICS WOODS-CREE THWA"}], "\u167d": [{"c": "\u15ad\u00b7", "n": "CANADIAN SYLLABICS TH-CREE THAA, MIDDLE DOT"}], "\u15ad\u00b7": [{"c": "\u167d", "n": "CANADIAN SYLLABICS WOODS-CREE THWAA"}], "\u2aab": [{"c": "\u15d2", "n": "CANADIAN SYLLABICS CARRIER WE"}], "\u15d2": [{"c": "\u2aab", "n": "LARGER THAN"}], "\u2aaa": [{"c": "\u15d5", "n": "CANADIAN SYLLABICS CARRIER WA"}], "\u15d5": [{"c": "\u2aaa", "n": "SMALLER THAN"}], "\ua4f7": [{"c": "\u15e1", "n": "CANADIAN SYLLABICS CARRIER THA"}], "\u15e1": [{"c": "\ua4f7", "n": "LISU LETTER OE"}], "\u18f0": [{"c": "\u15f4\u00b7", "n": "CANADIAN SYLLABICS CARRIER GA, MIDDLE DOT"}], "\u15f4\u00b7": [{"c": "\u18f0", "n": "CANADIAN SYLLABICS CARRIER GWA"}], "\u18f2": [{"c": "\u161b\u00b7", "n": "CANADIAN SYLLABICS CARRIER JA, MIDDLE DOT"}], "\u161b\u00b7": [{"c": "\u18f2", "n": "CANADIAN SYLLABICS CARRIER JWA"}], "\u1dbb": [{"c": "\u1646", "n": "CANADIAN SYLLABICS CARRIER Z"}], "\u1646": [{"c": "\u1dbb", "n": "MODIFIER LETTER SMALL Z"}], "\ua4ed": [{"c": "\u1660", "n": "CANADIAN SYLLABICS CARRIER TSA"}], "\u1660": [{"c": "\ua4ed", "n": "LISU LETTER GHA"}], "\u1dba": [{"c": "\u18d4", "n": "CANADIAN SYLLABICS OJIBWAY P"}], "\u18d4": [{"c": "\u1dba", "n": "MODIFIER LETTER SMALL TURNED V"}], "\u1d3e": [{"c": "\u18d6", "n": "CANADIAN SYLLABICS OJIBWAY K"}], "\u18d6": [{"c": "\u1d3e", "n": "MODIFIER LETTER CAPITAL P"}], "\u18dc": [{"c": "\u18df\u141e", "n": "CANADIAN SYLLABICS FINAL RAISED DOT, CANADIAN SYLLABICS GLOTTAL STOP"}], "\u18df\u141e": [{"c": "\u18dc", "n": "CANADIAN SYLLABICS EASTERN W"}], "\u02e1": [{"c": "\u18f3", "n": "CANADIAN SYLLABICS BEAVER DENE L"}], "\u18f3": [{"c": "\u02e1", "n": "MODIFIER LETTER SMALL L"}], "\u02b3": [{"c": "\u18f4", "n": "CANADIAN SYLLABICS BEAVER DENE R"}], "\u18f4": [{"c": "\u02b3", "n": "MODIFIER LETTER SMALL R"}], "\u02e2": [{"c": "\u18f5", "n": "CANADIAN SYLLABICS CARRIER DENTAL S"}], "\u18f5": [{"c": "\u02e2", "n": "MODIFIER LETTER SMALL S"}, {"c": "\u18db", "n": "CANADIAN SYLLABICS OJIBWAY SH"}], "\u18db": [{"c": "\u18f5", "n": "CANADIAN SYLLABICS CARRIER DENTAL S"}], "\ua6b0": [{"c": "\u16b9", "n": "RUNIC LETTER WUNJO WYNN W"}], "\u16b9": [{"c": "\ua6b0", "n": "BAMUM LETTER TAA"}], "\u16e1": [{"c": "\u16bc", "n": "RUNIC LETTER LONG-BRANCH-HAGALL H"}], "\u16bc": [{"c": "\u16e1", "n": "RUNIC LETTER IOR"}], "\u237f": [{"c": "\u16bd", "n": "RUNIC LETTER SHORT-TWIG-HAGALL H"}], "\u16bd": [{"c": "\u237f", "n": "VERTICAL LINE WITH MIDDLE DOT"}, {"c": "\u16c2", "n": "RUNIC LETTER E"}], "\u16c2": [{"c": "\u16bd", "n": "RUNIC LETTER SHORT-TWIG-HAGALL H"}], "\ud834\ude3f": [{"c": "\u16cb", "n": "RUNIC LETTER SIGEL LONG-BRANCH-SOL S"}], "\u16cb": [{"c": "\ud834\ude3f", "n": "GREEK INSTRUMENTAL NOTATION SYMBOL-52"}], "\u2191": [{"c": "\u16cf", "n": "RUNIC LETTER TIWAZ TIR TYR T"}], "\u16cf": [{"c": "\u2191", "n": "UPWARDS ARROW"}], "\u21bf": [{"c": "\u16d0", "n": "RUNIC LETTER SHORT-TWIG-TYR T"}], "\u16d0": [{"c": "\u21bf", "n": "UPWARDS HARPOON WITH BARB LEFTWARDS"}], "\u296e": [{"c": "\u16d0\u21c2", "n": "RUNIC LETTER SHORT-TWIG-TYR T, DOWNWARDS HARPOON WITH BARB RIGHTWARDS"}], "\u16d0\u21c2": [{"c": "\u296e", "n": "UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT"}], "\u2963": [{"c": "\u16d0\u16da", "n": "RUNIC LETTER SHORT-TWIG-TYR T, RUNIC LETTER LAUKAZ LAGU LOGR L"}], "\u16d0\u16da": [{"c": "\u2963", "n": "UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT"}], "\u2d63": [{"c": "\u16ef", "n": "RUNIC TVIMADUR SYMBOL"}], "\u16ef": [{"c": "\u2d63", "n": "TIFINAGH LETTER YAZ"}], "\u21be": [{"c": "\u16da", "n": "RUNIC LETTER LAUKAZ LAGU LOGR L"}], "\u16da": [{"c": "\u21be", "n": "UPWARDS HARPOON WITH BARB RIGHTWARDS"}, {"c": "\u2a21", "n": "Z NOTATION SCHEMA PROJECTION"}], "\u2a21": [{"c": "\u16da", "n": "RUNIC LETTER LAUKAZ LAGU LOGR L"}], "\u22c4": [{"c": "\u16dc", "n": "RUNIC LETTER INGWAZ"}], "\u16dc": [{"c": "\u22c4", "n": "DIAMOND OPERATOR"}, {"c": "\u25c7", "n": "WHITE DIAMOND"}, {"c": "\u25ca", "n": "LOZENGE"}, {"c": "\u2662", "n": "WHITE DIAMOND SUIT"}, {"c": "\ud83d\udf54", "n": "ALCHEMICAL SYMBOL FOR SOAP"}, {"c": "\ud806\udcb7", "n": "WARANG CITI CAPITAL LETTER BU"}, {"c": "\ud800\ude94", "n": "LYCIAN LETTER KK"}], "\u25c7": [{"c": "\u16dc", "n": "RUNIC LETTER INGWAZ"}], "\u25ca": [{"c": "\u16dc", "n": "RUNIC LETTER INGWAZ"}], "\u2662": [{"c": "\u16dc", "n": "RUNIC LETTER INGWAZ"}], "\ud83d\udf54": [{"c": "\u16dc", "n": "RUNIC LETTER INGWAZ"}], "\ud806\udcb7": [{"c": "\u16dc", "n": "RUNIC LETTER INGWAZ"}], "\ud800\ude94": [{"c": "\u16dc", "n": "RUNIC LETTER INGWAZ"}], "\u235a": [{"c": "\u16dc\u0332", "n": "RUNIC LETTER INGWAZ, COMBINING LOW LINE"}], "\u16dc\u0332": [{"c": "\u235a", "n": "APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR"}], "\u22c8": [{"c": "\u16de", "n": "RUNIC LETTER DAGAZ DAEG D"}], "\u16de": [{"c": "\u22c8", "n": "BOWTIE"}, {"c": "\u2a1d", "n": "JOIN"}], "\u2a1d": [{"c": "\u16de", "n": "RUNIC LETTER DAGAZ DAEG D"}], "\ud801\udcd0": [{"c": "\u16e6", "n": "RUNIC LETTER LONG-BRANCH-YR"}], "\u16e6": [{"c": "\ud801\udcd0", "n": "OSAGE CAPITAL LETTER KHA"}], "\u2195": [{"c": "\u16e8", "n": "RUNIC LETTER ICELANDIC-YR"}], "\u16e8": [{"c": "\u2195", "n": "UP DOWN ARROW"}], "\u200e\ud803\udcfc\u200e": [{"c": "\u200e\ud803\udc82\u200e", "n": "OLD HUNGARIAN CAPITAL LETTER EB"}], "\u200e\ud803\udc82\u200e": [{"c": "\u200e\ud803\udcfc\u200e", "n": "OLD HUNGARIAN NUMBER TEN"}], "\u200e\ud803\udcfa\u200e": [{"c": "\u200e\ud803\udca5\u200e", "n": "OLD HUNGARIAN CAPITAL LETTER ESZ"}], "\u200e\ud803\udca5\u200e": [{"c": "\u200e\ud803\udcfa\u200e", "n": "OLD HUNGARIAN NUMBER ONE"}], "\u3131": [{"c": "\u1100", "n": "HANGUL CHOSEONG KIYEOK"}], "\u1100": [{"c": "\u3131", "n": "HANGUL LETTER KIYEOK"}, {"c": "\u11a8", "n": "HANGUL JONGSEONG KIYEOK"}], "\u11a8": [{"c": "\u1100", "n": "HANGUL CHOSEONG KIYEOK"}], "\u1101": [{"c": "\u1100\u1100", "n": "HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG KIYEOK"}], "\u1100\u1100": [{"c": "\u1101", "n": "HANGUL CHOSEONG SSANGKIYEOK"}, {"c": "\u3132", "n": "HANGUL LETTER SSANGKIYEOK"}, {"c": "\u11a9", "n": "HANGUL JONGSEONG SSANGKIYEOK"}], "\u3132": [{"c": "\u1100\u1100", "n": "HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG KIYEOK"}], "\u11a9": [{"c": "\u1100\u1100", "n": "HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG KIYEOK"}], "\u11fa": [{"c": "\u1100\u1102", "n": "HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG NIEUN"}], "\u1100\u1102": [{"c": "\u11fa", "n": "HANGUL JONGSEONG KIYEOK-NIEUN"}], "\u115a": [{"c": "\u1100\u1103", "n": "HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG TIKEUT"}], "\u1100\u1103": [{"c": "\u115a", "n": "HANGUL CHOSEONG KIYEOK-TIKEUT"}], "\u11c3": [{"c": "\u1100\u1105", "n": "HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG RIEUL"}], "\u1100\u1105": [{"c": "\u11c3", "n": "HANGUL JONGSEONG KIYEOK-RIEUL"}], "\u11fb": [{"c": "\u1100\u1107", "n": "HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG PIEUP"}], "\u1100\u1107": [{"c": "\u11fb", "n": "HANGUL JONGSEONG KIYEOK-PIEUP"}], "\u11aa": [{"c": "\u1100\u1109", "n": "HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG SIOS"}], "\u1100\u1109": [{"c": "\u11aa", "n": "HANGUL JONGSEONG KIYEOK-SIOS"}, {"c": "\u3133", "n": "HANGUL LETTER KIYEOK-SIOS"}], "\u3133": [{"c": "\u1100\u1109", "n": "HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG SIOS"}], "\u11c4": [{"c": "\u1100\u1109\u1100", "n": "HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KIYEOK"}], "\u1100\u1109\u1100": [{"c": "\u11c4", "n": "HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK"}], "\u11fc": [{"c": "\u1100\u110e", "n": "HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG CHIEUCH"}], "\u1100\u110e": [{"c": "\u11fc", "n": "HANGUL JONGSEONG KIYEOK-CHIEUCH"}], "\u11fd": [{"c": "\u1100\u110f", "n": "HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG KHIEUKH"}], "\u1100\u110f": [{"c": "\u11fd", "n": "HANGUL JONGSEONG KIYEOK-KHIEUKH"}], "\u11fe": [{"c": "\u1100\u1112", "n": "HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG HIEUH"}], "\u1100\u1112": [{"c": "\u11fe", "n": "HANGUL JONGSEONG KIYEOK-HIEUH"}], "\u3134": [{"c": "\u1102", "n": "HANGUL CHOSEONG NIEUN"}], "\u1102": [{"c": "\u3134", "n": "HANGUL LETTER NIEUN"}, {"c": "\u11ab", "n": "HANGUL JONGSEONG NIEUN"}], "\u11ab": [{"c": "\u1102", "n": "HANGUL CHOSEONG NIEUN"}], "\u1113": [{"c": "\u1102\u1100", "n": "HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG KIYEOK"}], "\u1102\u1100": [{"c": "\u1113", "n": "HANGUL CHOSEONG NIEUN-KIYEOK"}, {"c": "\u11c5", "n": "HANGUL JONGSEONG NIEUN-KIYEOK"}], "\u11c5": [{"c": "\u1102\u1100", "n": "HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG KIYEOK"}], "\u1114": [{"c": "\u1102\u1102", "n": "HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG NIEUN"}], "\u1102\u1102": [{"c": "\u1114", "n": "HANGUL CHOSEONG SSANGNIEUN"}, {"c": "\u3165", "n": "HANGUL LETTER SSANGNIEUN"}, {"c": "\u11ff", "n": "HANGUL JONGSEONG SSANGNIEUN"}], "\u3165": [{"c": "\u1102\u1102", "n": "HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG NIEUN"}], "\u11ff": [{"c": "\u1102\u1102", "n": "HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG NIEUN"}], "\u1115": [{"c": "\u1102\u1103", "n": "HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG TIKEUT"}], "\u1102\u1103": [{"c": "\u1115", "n": "HANGUL CHOSEONG NIEUN-TIKEUT"}, {"c": "\u3166", "n": "HANGUL LETTER NIEUN-TIKEUT"}, {"c": "\u11c6", "n": "HANGUL JONGSEONG NIEUN-TIKEUT"}], "\u3166": [{"c": "\u1102\u1103", "n": "HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG TIKEUT"}], "\u11c6": [{"c": "\u1102\u1103", "n": "HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG TIKEUT"}], "\ud7cb": [{"c": "\u1102\u1105", "n": "HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG RIEUL"}], "\u1102\u1105": [{"c": "\ud7cb", "n": "HANGUL JONGSEONG NIEUN-RIEUL"}], "\u1116": [{"c": "\u1102\u1107", "n": "HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG PIEUP"}], "\u1102\u1107": [{"c": "\u1116", "n": "HANGUL CHOSEONG NIEUN-PIEUP"}], "\u115b": [{"c": "\u1102\u1109", "n": "HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG SIOS"}], "\u1102\u1109": [{"c": "\u115b", "n": "HANGUL CHOSEONG NIEUN-SIOS"}, {"c": "\u11c7", "n": "HANGUL JONGSEONG NIEUN-SIOS"}, {"c": "\u3167", "n": "HANGUL LETTER NIEUN-SIOS"}], "\u11c7": [{"c": "\u1102\u1109", "n": "HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG SIOS"}], "\u3167": [{"c": "\u1102\u1109", "n": "HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG SIOS"}], "\u115c": [{"c": "\u1102\u110c", "n": "HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG CIEUC"}], "\u1102\u110c": [{"c": "\u115c", "n": "HANGUL CHOSEONG NIEUN-CIEUC"}, {"c": "\u11ac", "n": "HANGUL JONGSEONG NIEUN-CIEUC"}, {"c": "\u3135", "n": "HANGUL LETTER NIEUN-CIEUC"}], "\u11ac": [{"c": "\u1102\u110c", "n": "HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG CIEUC"}], "\u3135": [{"c": "\u1102\u110c", "n": "HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG CIEUC"}], "\ud7cc": [{"c": "\u1102\u110e", "n": "HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG CHIEUCH"}], "\u1102\u110e": [{"c": "\ud7cc", "n": "HANGUL JONGSEONG NIEUN-CHIEUCH"}], "\u11c9": [{"c": "\u1102\u1110", "n": "HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG THIEUTH"}], "\u1102\u1110": [{"c": "\u11c9", "n": "HANGUL JONGSEONG NIEUN-THIEUTH"}], "\u115d": [{"c": "\u1102\u1112", "n": "HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG HIEUH"}], "\u1102\u1112": [{"c": "\u115d", "n": "HANGUL CHOSEONG NIEUN-HIEUH"}, {"c": "\u11ad", "n": "HANGUL JONGSEONG NIEUN-HIEUH"}, {"c": "\u3136", "n": "HANGUL LETTER NIEUN-HIEUH"}], "\u11ad": [{"c": "\u1102\u1112", "n": "HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG HIEUH"}], "\u3136": [{"c": "\u1102\u1112", "n": "HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG HIEUH"}], "\u11c8": [{"c": "\u1102\u1140", "n": "HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG PANSIOS"}], "\u1102\u1140": [{"c": "\u11c8", "n": "HANGUL JONGSEONG NIEUN-PANSIOS"}, {"c": "\u3168", "n": "HANGUL LETTER NIEUN-PANSIOS"}], "\u3168": [{"c": "\u1102\u1140", "n": "HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG PANSIOS"}], "\u3137": [{"c": "\u1103", "n": "HANGUL CHOSEONG TIKEUT"}], "\u1103": [{"c": "\u3137", "n": "HANGUL LETTER TIKEUT"}, {"c": "\u11ae", "n": "HANGUL JONGSEONG TIKEUT"}], "\u11ae": [{"c": "\u1103", "n": "HANGUL CHOSEONG TIKEUT"}], "\u1117": [{"c": "\u1103\u1100", "n": "HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG KIYEOK"}], "\u1103\u1100": [{"c": "\u1117", "n": "HANGUL CHOSEONG TIKEUT-KIYEOK"}, {"c": "\u11ca", "n": "HANGUL JONGSEONG TIKEUT-KIYEOK"}], "\u11ca": [{"c": "\u1103\u1100", "n": "HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG KIYEOK"}], "\u1104": [{"c": "\u1103\u1103", "n": "HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG TIKEUT"}], "\u1103\u1103": [{"c": "\u1104", "n": "HANGUL CHOSEONG SSANGTIKEUT"}, {"c": "\u3138", "n": "HANGUL LETTER SSANGTIKEUT"}, {"c": "\ud7cd", "n": "HANGUL JONGSEONG SSANGTIKEUT"}], "\u3138": [{"c": "\u1103\u1103", "n": "HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG TIKEUT"}], "\ud7cd": [{"c": "\u1103\u1103", "n": "HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG TIKEUT"}], "\ud7ce": [{"c": "\u1103\u1103\u1107", "n": "HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG PIEUP"}], "\u1103\u1103\u1107": [{"c": "\ud7ce", "n": "HANGUL JONGSEONG SSANGTIKEUT-PIEUP"}], "\u115e": [{"c": "\u1103\u1105", "n": "HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG RIEUL"}], "\u1103\u1105": [{"c": "\u115e", "n": "HANGUL CHOSEONG TIKEUT-RIEUL"}, {"c": "\u11cb", "n": "HANGUL JONGSEONG TIKEUT-RIEUL"}], "\u11cb": [{"c": "\u1103\u1105", "n": "HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG RIEUL"}], "\ua960": [{"c": "\u1103\u1106", "n": "HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG MIEUM"}], "\u1103\u1106": [{"c": "\ua960", "n": "HANGUL CHOSEONG TIKEUT-MIEUM"}], "\ua961": [{"c": "\u1103\u1107", "n": "HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG PIEUP"}], "\u1103\u1107": [{"c": "\ua961", "n": "HANGUL CHOSEONG TIKEUT-PIEUP"}, {"c": "\ud7cf", "n": "HANGUL JONGSEONG TIKEUT-PIEUP"}], "\ud7cf": [{"c": "\u1103\u1107", "n": "HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG PIEUP"}], "\ua962": [{"c": "\u1103\u1109", "n": "HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG SIOS"}], "\u1103\u1109": [{"c": "\ua962", "n": "HANGUL CHOSEONG TIKEUT-SIOS"}, {"c": "\ud7d0", "n": "HANGUL JONGSEONG TIKEUT-SIOS"}], "\ud7d0": [{"c": "\u1103\u1109", "n": "HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG SIOS"}], "\ud7d1": [{"c": "\u1103\u1109\u1100", "n": "HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KIYEOK"}], "\u1103\u1109\u1100": [{"c": "\ud7d1", "n": "HANGUL JONGSEONG TIKEUT-SIOS-KIYEOK"}], "\ua963": [{"c": "\u1103\u110c", "n": "HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG CIEUC"}], "\u1103\u110c": [{"c": "\ua963", "n": "HANGUL CHOSEONG TIKEUT-CIEUC"}, {"c": "\ud7d2", "n": "HANGUL JONGSEONG TIKEUT-CIEUC"}], "\ud7d2": [{"c": "\u1103\u110c", "n": "HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG CIEUC"}], "\ud7d3": [{"c": "\u1103\u110e", "n": "HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG CHIEUCH"}], "\u1103\u110e": [{"c": "\ud7d3", "n": "HANGUL JONGSEONG TIKEUT-CHIEUCH"}], "\ud7d4": [{"c": "\u1103\u1110", "n": "HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG THIEUTH"}], "\u1103\u1110": [{"c": "\ud7d4", "n": "HANGUL JONGSEONG TIKEUT-THIEUTH"}], "\u3139": [{"c": "\u1105", "n": "HANGUL CHOSEONG RIEUL"}], "\u1105": [{"c": "\u3139", "n": "HANGUL LETTER RIEUL"}, {"c": "\u11af", "n": "HANGUL JONGSEONG RIEUL"}], "\u11af": [{"c": "\u1105", "n": "HANGUL CHOSEONG RIEUL"}], "\ua964": [{"c": "\u1105\u1100", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KIYEOK"}], "\u1105\u1100": [{"c": "\ua964", "n": "HANGUL CHOSEONG RIEUL-KIYEOK"}, {"c": "\u11b0", "n": "HANGUL JONGSEONG RIEUL-KIYEOK"}, {"c": "\u313a", "n": "HANGUL LETTER RIEUL-KIYEOK"}], "\u11b0": [{"c": "\u1105\u1100", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KIYEOK"}], "\u313a": [{"c": "\u1105\u1100", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KIYEOK"}], "\ua965": [{"c": "\u1105\u1100\u1100", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG KIYEOK"}], "\u1105\u1100\u1100": [{"c": "\ua965", "n": "HANGUL CHOSEONG RIEUL-SSANGKIYEOK"}, {"c": "\ud7d5", "n": "HANGUL JONGSEONG RIEUL-SSANGKIYEOK"}], "\ud7d5": [{"c": "\u1105\u1100\u1100", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG KIYEOK"}], "\u11cc": [{"c": "\u1105\u1100\u1109", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG SIOS"}], "\u1105\u1100\u1109": [{"c": "\u11cc", "n": "HANGUL JONGSEONG RIEUL-KIYEOK-SIOS"}, {"c": "\u3169", "n": "HANGUL LETTER RIEUL-KIYEOK-SIOS"}], "\u3169": [{"c": "\u1105\u1100\u1109", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG SIOS"}], "\ud7d6": [{"c": "\u1105\u1100\u1112", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG HIEUH"}], "\u1105\u1100\u1112": [{"c": "\ud7d6", "n": "HANGUL JONGSEONG RIEUL-KIYEOK-HIEUH"}], "\u1118": [{"c": "\u1105\u1102", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG NIEUN"}], "\u1105\u1102": [{"c": "\u1118", "n": "HANGUL CHOSEONG RIEUL-NIEUN"}, {"c": "\u11cd", "n": "HANGUL JONGSEONG RIEUL-NIEUN"}], "\u11cd": [{"c": "\u1105\u1102", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG NIEUN"}], "\ua966": [{"c": "\u1105\u1103", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG TIKEUT"}], "\u1105\u1103": [{"c": "\ua966", "n": "HANGUL CHOSEONG RIEUL-TIKEUT"}, {"c": "\u11ce", "n": "HANGUL JONGSEONG RIEUL-TIKEUT"}, {"c": "\u316a", "n": "HANGUL LETTER RIEUL-TIKEUT"}], "\u11ce": [{"c": "\u1105\u1103", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG TIKEUT"}], "\u316a": [{"c": "\u1105\u1103", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG TIKEUT"}], "\ua967": [{"c": "\u1105\u1103\u1103", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG TIKEUT"}], "\u1105\u1103\u1103": [{"c": "\ua967", "n": "HANGUL CHOSEONG RIEUL-SSANGTIKEUT"}], "\u11cf": [{"c": "\u1105\u1103\u1112", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG HIEUH"}], "\u1105\u1103\u1112": [{"c": "\u11cf", "n": "HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH"}], "\u1119": [{"c": "\u1105\u1105", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG RIEUL"}], "\u1105\u1105": [{"c": "\u1119", "n": "HANGUL CHOSEONG SSANGRIEUL"}, {"c": "\u11d0", "n": "HANGUL JONGSEONG SSANGRIEUL"}], "\u11d0": [{"c": "\u1105\u1105", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG RIEUL"}], "\ud7d7": [{"c": "\u1105\u1105\u110f", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KHIEUKH"}], "\u1105\u1105\u110f": [{"c": "\ud7d7", "n": "HANGUL JONGSEONG SSANGRIEUL-KHIEUKH"}], "\ua968": [{"c": "\u1105\u1106", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG MIEUM"}], "\u1105\u1106": [{"c": "\ua968", "n": "HANGUL CHOSEONG RIEUL-MIEUM"}, {"c": "\u11b1", "n": "HANGUL JONGSEONG RIEUL-MIEUM"}, {"c": "\u313b", "n": "HANGUL LETTER RIEUL-MIEUM"}], "\u11b1": [{"c": "\u1105\u1106", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG MIEUM"}], "\u313b": [{"c": "\u1105\u1106", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG MIEUM"}], "\u11d1": [{"c": "\u1105\u1106\u1100", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG KIYEOK"}], "\u1105\u1106\u1100": [{"c": "\u11d1", "n": "HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK"}], "\u11d2": [{"c": "\u1105\u1106\u1109", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG SIOS"}], "\u1105\u1106\u1109": [{"c": "\u11d2", "n": "HANGUL JONGSEONG RIEUL-MIEUM-SIOS"}], "\ud7d8": [{"c": "\u1105\u1106\u1112", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG HIEUH"}], "\u1105\u1106\u1112": [{"c": "\ud7d8", "n": "HANGUL JONGSEONG RIEUL-MIEUM-HIEUH"}], "\ua969": [{"c": "\u1105\u1107", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP"}], "\u1105\u1107": [{"c": "\ua969", "n": "HANGUL CHOSEONG RIEUL-PIEUP"}, {"c": "\u11b2", "n": "HANGUL JONGSEONG RIEUL-PIEUP"}, {"c": "\u313c", "n": "HANGUL LETTER RIEUL-PIEUP"}], "\u11b2": [{"c": "\u1105\u1107", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP"}], "\u313c": [{"c": "\u1105\u1107", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP"}], "\ud7d9": [{"c": "\u1105\u1107\u1103", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG TIKEUT"}], "\u1105\u1107\u1103": [{"c": "\ud7d9", "n": "HANGUL JONGSEONG RIEUL-PIEUP-TIKEUT"}], "\ua96a": [{"c": "\u1105\u1107\u1107", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PIEUP"}], "\u1105\u1107\u1107": [{"c": "\ua96a", "n": "HANGUL CHOSEONG RIEUL-SSANGPIEUP"}], "\u11d3": [{"c": "\u1105\u1107\u1109", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS"}], "\u1105\u1107\u1109": [{"c": "\u11d3", "n": "HANGUL JONGSEONG RIEUL-PIEUP-SIOS"}, {"c": "\u316b", "n": "HANGUL LETTER RIEUL-PIEUP-SIOS"}], "\u316b": [{"c": "\u1105\u1107\u1109", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS"}], "\ua96b": [{"c": "\u1105\u1107\u110b", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG"}], "\u1105\u1107\u110b": [{"c": "\ua96b", "n": "HANGUL CHOSEONG RIEUL-KAPYEOUNPIEUP"}, {"c": "\u11d5", "n": "HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP"}], "\u11d5": [{"c": "\u1105\u1107\u110b", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG"}], "\ud7da": [{"c": "\u1105\u1107\u1111", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PHIEUPH"}], "\u1105\u1107\u1111": [{"c": "\ud7da", "n": "HANGUL JONGSEONG RIEUL-PIEUP-PHIEUPH"}], "\u11d4": [{"c": "\u1105\u1107\u1112", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG HIEUH"}], "\u1105\u1107\u1112": [{"c": "\u11d4", "n": "HANGUL JONGSEONG RIEUL-PIEUP-HIEUH"}], "\ua96c": [{"c": "\u1105\u1109", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG SIOS"}], "\u1105\u1109": [{"c": "\ua96c", "n": "HANGUL CHOSEONG RIEUL-SIOS"}, {"c": "\u11b3", "n": "HANGUL JONGSEONG RIEUL-SIOS"}, {"c": "\u313d", "n": "HANGUL LETTER RIEUL-SIOS"}], "\u11b3": [{"c": "\u1105\u1109", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG SIOS"}], "\u313d": [{"c": "\u1105\u1109", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG SIOS"}], "\u11d6": [{"c": "\u1105\u1109\u1109", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS"}], "\u1105\u1109\u1109": [{"c": "\u11d6", "n": "HANGUL JONGSEONG RIEUL-SSANGSIOS"}], "\u111b": [{"c": "\u1105\u110b", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG IEUNG"}], "\u1105\u110b": [{"c": "\u111b", "n": "HANGUL CHOSEONG KAPYEOUNRIEUL"}, {"c": "\ud7dd", "n": "HANGUL JONGSEONG KAPYEOUNRIEUL"}], "\ud7dd": [{"c": "\u1105\u110b", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG IEUNG"}], "\ua96d": [{"c": "\u1105\u110c", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG CIEUC"}], "\u1105\u110c": [{"c": "\ua96d", "n": "HANGUL CHOSEONG RIEUL-CIEUC"}], "\ua96e": [{"c": "\u1105\u110f", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KHIEUKH"}], "\u1105\u110f": [{"c": "\ua96e", "n": "HANGUL CHOSEONG RIEUL-KHIEUKH"}, {"c": "\u11d8", "n": "HANGUL JONGSEONG RIEUL-KHIEUKH"}], "\u11d8": [{"c": "\u1105\u110f", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KHIEUKH"}], "\u11b4": [{"c": "\u1105\u1110", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG THIEUTH"}], "\u1105\u1110": [{"c": "\u11b4", "n": "HANGUL JONGSEONG RIEUL-THIEUTH"}, {"c": "\u313e", "n": "HANGUL LETTER RIEUL-THIEUTH"}], "\u313e": [{"c": "\u1105\u1110", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG THIEUTH"}], "\u11b5": [{"c": "\u1105\u1111", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PHIEUPH"}], "\u1105\u1111": [{"c": "\u11b5", "n": "HANGUL JONGSEONG RIEUL-PHIEUPH"}, {"c": "\u313f", "n": "HANGUL LETTER RIEUL-PHIEUPH"}], "\u313f": [{"c": "\u1105\u1111", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PHIEUPH"}], "\u111a": [{"c": "\u1105\u1112", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG HIEUH"}], "\u1105\u1112": [{"c": "\u111a", "n": "HANGUL CHOSEONG RIEUL-HIEUH"}, {"c": "\u3140", "n": "HANGUL LETTER RIEUL-HIEUH"}, {"c": "\u113b", "n": "HANGUL CHOSEONG SIOS-HIEUH"}, {"c": "\u11b6", "n": "HANGUL JONGSEONG RIEUL-HIEUH"}, {"c": "\ud7f2", "n": "HANGUL JONGSEONG SIOS-HIEUH"}], "\u3140": [{"c": "\u1105\u1112", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG HIEUH"}], "\u113b": [{"c": "\u1105\u1112", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG HIEUH"}], "\u11b6": [{"c": "\u1105\u1112", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG HIEUH"}], "\ud7f2": [{"c": "\u1105\u1112", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG HIEUH"}], "\u11d7": [{"c": "\u1105\u1140", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PANSIOS"}], "\u1105\u1140": [{"c": "\u11d7", "n": "HANGUL JONGSEONG RIEUL-PANSIOS"}, {"c": "\u316c", "n": "HANGUL LETTER RIEUL-PANSIOS"}], "\u316c": [{"c": "\u1105\u1140", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PANSIOS"}], "\ud7db": [{"c": "\u1105\u114c", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG YESIEUNG"}], "\u1105\u114c": [{"c": "\ud7db", "n": "HANGUL JONGSEONG RIEUL-YESIEUNG"}], "\u11d9": [{"c": "\u1105\u1159", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG YEORINHIEUH"}], "\u1105\u1159": [{"c": "\u11d9", "n": "HANGUL JONGSEONG RIEUL-YEORINHIEUH"}, {"c": "\u316d", "n": "HANGUL LETTER RIEUL-YEORINHIEUH"}], "\u316d": [{"c": "\u1105\u1159", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG YEORINHIEUH"}], "\ud7dc": [{"c": "\u1105\u1159\u1112", "n": "HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG YEORINHIEUH, HANGUL CHOSEONG HIEUH"}], "\u1105\u1159\u1112": [{"c": "\ud7dc", "n": "HANGUL JONGSEONG RIEUL-YEORINHIEUH-HIEUH"}], "\u3141": [{"c": "\u1106", "n": "HANGUL CHOSEONG MIEUM"}], "\u1106": [{"c": "\u3141", "n": "HANGUL LETTER MIEUM"}, {"c": "\u11b7", "n": "HANGUL JONGSEONG MIEUM"}], "\u11b7": [{"c": "\u1106", "n": "HANGUL CHOSEONG MIEUM"}], "\ua96f": [{"c": "\u1106\u1100", "n": "HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG KIYEOK"}], "\u1106\u1100": [{"c": "\ua96f", "n": "HANGUL CHOSEONG MIEUM-KIYEOK"}, {"c": "\u11da", "n": "HANGUL JONGSEONG MIEUM-KIYEOK"}], "\u11da": [{"c": "\u1106\u1100", "n": "HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG KIYEOK"}], "\ud7de": [{"c": "\u1106\u1102", "n": "HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG NIEUN"}], "\u1106\u1102": [{"c": "\ud7de", "n": "HANGUL JONGSEONG MIEUM-NIEUN"}], "\ud7df": [{"c": "\u1106\u1102\u1102", "n": "HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG NIEUN"}], "\u1106\u1102\u1102": [{"c": "\ud7df", "n": "HANGUL JONGSEONG MIEUM-SSANGNIEUN"}], "\ua970": [{"c": "\u1106\u1103", "n": "HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG TIKEUT"}], "\u1106\u1103": [{"c": "\ua970", "n": "HANGUL CHOSEONG MIEUM-TIKEUT"}], "\u11db": [{"c": "\u1106\u1105", "n": "HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG RIEUL"}], "\u1106\u1105": [{"c": "\u11db", "n": "HANGUL JONGSEONG MIEUM-RIEUL"}], "\ud7e0": [{"c": "\u1106\u1106", "n": "HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG MIEUM"}], "\u1106\u1106": [{"c": "\ud7e0", "n": "HANGUL JONGSEONG SSANGMIEUM"}], "\u111c": [{"c": "\u1106\u1107", "n": "HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG PIEUP"}], "\u1106\u1107": [{"c": "\u111c", "n": "HANGUL CHOSEONG MIEUM-PIEUP"}, {"c": "\u316e", "n": "HANGUL LETTER MIEUM-PIEUP"}, {"c": "\u11dc", "n": "HANGUL JONGSEONG MIEUM-PIEUP"}], "\u316e": [{"c": "\u1106\u1107", "n": "HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG PIEUP"}], "\u11dc": [{"c": "\u1106\u1107", "n": "HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG PIEUP"}], "\ud7e1": [{"c": "\u1106\u1107\u1109", "n": "HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS"}], "\u1106\u1107\u1109": [{"c": "\ud7e1", "n": "HANGUL JONGSEONG MIEUM-PIEUP-SIOS"}], "\ua971": [{"c": "\u1106\u1109", "n": "HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG SIOS"}], "\u1106\u1109": [{"c": "\ua971", "n": "HANGUL CHOSEONG MIEUM-SIOS"}, {"c": "\u11dd", "n": "HANGUL JONGSEONG MIEUM-SIOS"}, {"c": "\u316f", "n": "HANGUL LETTER MIEUM-SIOS"}], "\u11dd": [{"c": "\u1106\u1109", "n": "HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG SIOS"}], "\u316f": [{"c": "\u1106\u1109", "n": "HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG SIOS"}], "\u11de": [{"c": "\u1106\u1109\u1109", "n": "HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS"}], "\u1106\u1109\u1109": [{"c": "\u11de", "n": "HANGUL JONGSEONG MIEUM-SSANGSIOS"}], "\u111d": [{"c": "\u1106\u110b", "n": "HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG IEUNG"}], "\u1106\u110b": [{"c": "\u111d", "n": "HANGUL CHOSEONG KAPYEOUNMIEUM"}, {"c": "\u3171", "n": "HANGUL LETTER KAPYEOUNMIEUM"}, {"c": "\u11e2", "n": "HANGUL JONGSEONG KAPYEOUNMIEUM"}], "\u3171": [{"c": "\u1106\u110b", "n": "HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG IEUNG"}], "\u11e2": [{"c": "\u1106\u110b", "n": "HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG IEUNG"}], "\ud7e2": [{"c": "\u1106\u110c", "n": "HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG CIEUC"}], "\u1106\u110c": [{"c": "\ud7e2", "n": "HANGUL JONGSEONG MIEUM-CIEUC"}], "\u11e0": [{"c": "\u1106\u110e", "n": "HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG CHIEUCH"}], "\u1106\u110e": [{"c": "\u11e0", "n": "HANGUL JONGSEONG MIEUM-CHIEUCH"}], "\u11e1": [{"c": "\u1106\u1112", "n": "HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG HIEUH"}], "\u1106\u1112": [{"c": "\u11e1", "n": "HANGUL JONGSEONG MIEUM-HIEUH"}], "\u11df": [{"c": "\u1106\u1140", "n": "HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG PANSIOS"}], "\u1106\u1140": [{"c": "\u11df", "n": "HANGUL JONGSEONG MIEUM-PANSIOS"}, {"c": "\u3170", "n": "HANGUL LETTER MIEUM-PANSIOS"}], "\u3170": [{"c": "\u1106\u1140", "n": "HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG PANSIOS"}], "\u3142": [{"c": "\u1107", "n": "HANGUL CHOSEONG PIEUP"}], "\u1107": [{"c": "\u3142", "n": "HANGUL LETTER PIEUP"}, {"c": "\u11b8", "n": "HANGUL JONGSEONG PIEUP"}], "\u11b8": [{"c": "\u1107", "n": "HANGUL CHOSEONG PIEUP"}], "\u111e": [{"c": "\u1107\u1100", "n": "HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG KIYEOK"}], "\u1107\u1100": [{"c": "\u111e", "n": "HANGUL CHOSEONG PIEUP-KIYEOK"}, {"c": "\u3172", "n": "HANGUL LETTER PIEUP-KIYEOK"}], "\u3172": [{"c": "\u1107\u1100", "n": "HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG KIYEOK"}], "\u111f": [{"c": "\u1107\u1102", "n": "HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG NIEUN"}], "\u1107\u1102": [{"c": "\u111f", "n": "HANGUL CHOSEONG PIEUP-NIEUN"}], "\u1120": [{"c": "\u1107\u1103", "n": "HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG TIKEUT"}], "\u1107\u1103": [{"c": "\u1120", "n": "HANGUL CHOSEONG PIEUP-TIKEUT"}, {"c": "\u3173", "n": "HANGUL LETTER PIEUP-TIKEUT"}, {"c": "\ud7e3", "n": "HANGUL JONGSEONG PIEUP-TIKEUT"}], "\u3173": [{"c": "\u1107\u1103", "n": "HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG TIKEUT"}], "\ud7e3": [{"c": "\u1107\u1103", "n": "HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG TIKEUT"}], "\u11e3": [{"c": "\u1107\u1105", "n": "HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG RIEUL"}], "\u1107\u1105": [{"c": "\u11e3", "n": "HANGUL JONGSEONG PIEUP-RIEUL"}], "\ud7e4": [{"c": "\u1107\u1105\u1111", "n": "HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PHIEUPH"}], "\u1107\u1105\u1111": [{"c": "\ud7e4", "n": "HANGUL JONGSEONG PIEUP-RIEUL-PHIEUPH"}], "\ud7e5": [{"c": "\u1107\u1106", "n": "HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG MIEUM"}], "\u1107\u1106": [{"c": "\ud7e5", "n": "HANGUL JONGSEONG PIEUP-MIEUM"}], "\u1108": [{"c": "\u1107\u1107", "n": "HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PIEUP"}], "\u1107\u1107": [{"c": "\u1108", "n": "HANGUL CHOSEONG SSANGPIEUP"}, {"c": "\u3143", "n": "HANGUL LETTER SSANGPIEUP"}, {"c": "\ud7e6", "n": "HANGUL JONGSEONG SSANGPIEUP"}], "\u3143": [{"c": "\u1107\u1107", "n": "HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PIEUP"}], "\ud7e6": [{"c": "\u1107\u1107", "n": "HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PIEUP"}], "\u112c": [{"c": "\u1107\u1107\u110b", "n": "HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG"}], "\u1107\u1107\u110b": [{"c": "\u112c", "n": "HANGUL CHOSEONG KAPYEOUNSSANGPIEUP"}, {"c": "\u3179", "n": "HANGUL LETTER KAPYEOUNSSANGPIEUP"}], "\u3179": [{"c": "\u1107\u1107\u110b", "n": "HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG"}], "\u1121": [{"c": "\u1107\u1109", "n": "HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS"}], "\u1107\u1109": [{"c": "\u1121", "n": "HANGUL CHOSEONG PIEUP-SIOS"}, {"c": "\u3144", "n": "HANGUL LETTER PIEUP-SIOS"}, {"c": "\u11b9", "n": "HANGUL JONGSEONG PIEUP-SIOS"}], "\u3144": [{"c": "\u1107\u1109", "n": "HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS"}], "\u11b9": [{"c": "\u1107\u1109", "n": "HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS"}], "\u1122": [{"c": "\u1107\u1109\u1100", "n": "HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KIYEOK"}], "\u1107\u1109\u1100": [{"c": "\u1122", "n": "HANGUL CHOSEONG PIEUP-SIOS-KIYEOK"}, {"c": "\u3174", "n": "HANGUL LETTER PIEUP-SIOS-KIYEOK"}], "\u3174": [{"c": "\u1107\u1109\u1100", "n": "HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KIYEOK"}], "\u1123": [{"c": "\u1107\u1109\u1103", "n": "HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG TIKEUT"}], "\u1107\u1109\u1103": [{"c": "\u1123", "n": "HANGUL CHOSEONG PIEUP-SIOS-TIKEUT"}, {"c": "\u3175", "n": "HANGUL LETTER PIEUP-SIOS-TIKEUT"}, {"c": "\ud7e7", "n": "HANGUL JONGSEONG PIEUP-SIOS-TIKEUT"}], "\u3175": [{"c": "\u1107\u1109\u1103", "n": "HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG TIKEUT"}], "\ud7e7": [{"c": "\u1107\u1109\u1103", "n": "HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG TIKEUT"}], "\u1124": [{"c": "\u1107\u1109\u1107", "n": "HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PIEUP"}], "\u1107\u1109\u1107": [{"c": "\u1124", "n": "HANGUL CHOSEONG PIEUP-SIOS-PIEUP"}], "\u1125": [{"c": "\u1107\u1109\u1109", "n": "HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS"}], "\u1107\u1109\u1109": [{"c": "\u1125", "n": "HANGUL CHOSEONG PIEUP-SSANGSIOS"}], "\u1126": [{"c": "\u1107\u1109\u110c", "n": "HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG CIEUC"}], "\u1107\u1109\u110c": [{"c": "\u1126", "n": "HANGUL CHOSEONG PIEUP-SIOS-CIEUC"}], "\ua972": [{"c": "\u1107\u1109\u1110", "n": "HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG THIEUTH"}], "\u1107\u1109\u1110": [{"c": "\ua972", "n": "HANGUL CHOSEONG PIEUP-SIOS-THIEUTH"}], "\u112b": [{"c": "\u1107\u110b", "n": "HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG"}], "\u1107\u110b": [{"c": "\u112b", "n": "HANGUL CHOSEONG KAPYEOUNPIEUP"}, {"c": "\u3178", "n": "HANGUL LETTER KAPYEOUNPIEUP"}, {"c": "\u11e6", "n": "HANGUL JONGSEONG KAPYEOUNPIEUP"}], "\u3178": [{"c": "\u1107\u110b", "n": "HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG"}], "\u11e6": [{"c": "\u1107\u110b", "n": "HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG"}], "\u1127": [{"c": "\u1107\u110c", "n": "HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG CIEUC"}], "\u1107\u110c": [{"c": "\u1127", "n": "HANGUL CHOSEONG PIEUP-CIEUC"}, {"c": "\u3176", "n": "HANGUL LETTER PIEUP-CIEUC"}, {"c": "\ud7e8", "n": "HANGUL JONGSEONG PIEUP-CIEUC"}], "\u3176": [{"c": "\u1107\u110c", "n": "HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG CIEUC"}], "\ud7e8": [{"c": "\u1107\u110c", "n": "HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG CIEUC"}], "\u1128": [{"c": "\u1107\u110e", "n": "HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG CHIEUCH"}], "\u1107\u110e": [{"c": "\u1128", "n": "HANGUL CHOSEONG PIEUP-CHIEUCH"}, {"c": "\ud7e9", "n": "HANGUL JONGSEONG PIEUP-CHIEUCH"}], "\ud7e9": [{"c": "\u1107\u110e", "n": "HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG CHIEUCH"}], "\ua973": [{"c": "\u1107\u110f", "n": "HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG KHIEUKH"}], "\u1107\u110f": [{"c": "\ua973", "n": "HANGUL CHOSEONG PIEUP-KHIEUKH"}], "\u1129": [{"c": "\u1107\u1110", "n": "HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG THIEUTH"}], "\u1107\u1110": [{"c": "\u1129", "n": "HANGUL CHOSEONG PIEUP-THIEUTH"}, {"c": "\u3177", "n": "HANGUL LETTER PIEUP-THIEUTH"}], "\u3177": [{"c": "\u1107\u1110", "n": "HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG THIEUTH"}], "\u112a": [{"c": "\u1107\u1111", "n": "HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PHIEUPH"}], "\u1107\u1111": [{"c": "\u112a", "n": "HANGUL CHOSEONG PIEUP-PHIEUPH"}, {"c": "\u11e4", "n": "HANGUL JONGSEONG PIEUP-PHIEUPH"}], "\u11e4": [{"c": "\u1107\u1111", "n": "HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PHIEUPH"}], "\ua974": [{"c": "\u1107\u1112", "n": "HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG HIEUH"}], "\u1107\u1112": [{"c": "\ua974", "n": "HANGUL CHOSEONG PIEUP-HIEUH"}, {"c": "\u11e5", "n": "HANGUL JONGSEONG PIEUP-HIEUH"}], "\u11e5": [{"c": "\u1107\u1112", "n": "HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG HIEUH"}], "\u3145": [{"c": "\u1109", "n": "HANGUL CHOSEONG SIOS"}], "\u1109": [{"c": "\u3145", "n": "HANGUL LETTER SIOS"}, {"c": "\u11ba", "n": "HANGUL JONGSEONG SIOS"}], "\u11ba": [{"c": "\u1109", "n": "HANGUL CHOSEONG SIOS"}], "\u112d": [{"c": "\u1109\u1100", "n": "HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KIYEOK"}], "\u1109\u1100": [{"c": "\u112d", "n": "HANGUL CHOSEONG SIOS-KIYEOK"}, {"c": "\u317a", "n": "HANGUL LETTER SIOS-KIYEOK"}, {"c": "\u11e7", "n": "HANGUL JONGSEONG SIOS-KIYEOK"}], "\u317a": [{"c": "\u1109\u1100", "n": "HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KIYEOK"}], "\u11e7": [{"c": "\u1109\u1100", "n": "HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KIYEOK"}], "\u112e": [{"c": "\u1109\u1102", "n": "HANGUL CHOSEONG SIOS, HANGUL CHOSEONG NIEUN"}], "\u1109\u1102": [{"c": "\u112e", "n": "HANGUL CHOSEONG SIOS-NIEUN"}, {"c": "\u317b", "n": "HANGUL LETTER SIOS-NIEUN"}], "\u317b": [{"c": "\u1109\u1102", "n": "HANGUL CHOSEONG SIOS, HANGUL CHOSEONG NIEUN"}], "\u112f": [{"c": "\u1109\u1103", "n": "HANGUL CHOSEONG SIOS, HANGUL CHOSEONG TIKEUT"}], "\u1109\u1103": [{"c": "\u112f", "n": "HANGUL CHOSEONG SIOS-TIKEUT"}, {"c": "\u317c", "n": "HANGUL LETTER SIOS-TIKEUT"}, {"c": "\u11e8", "n": "HANGUL JONGSEONG SIOS-TIKEUT"}], "\u317c": [{"c": "\u1109\u1103", "n": "HANGUL CHOSEONG SIOS, HANGUL CHOSEONG TIKEUT"}], "\u11e8": [{"c": "\u1109\u1103", "n": "HANGUL CHOSEONG SIOS, HANGUL CHOSEONG TIKEUT"}], "\u1130": [{"c": "\u1109\u1105", "n": "HANGUL CHOSEONG SIOS, HANGUL CHOSEONG RIEUL"}], "\u1109\u1105": [{"c": "\u1130", "n": "HANGUL CHOSEONG SIOS-RIEUL"}, {"c": "\u11e9", "n": "HANGUL JONGSEONG SIOS-RIEUL"}], "\u11e9": [{"c": "\u1109\u1105", "n": "HANGUL CHOSEONG SIOS, HANGUL CHOSEONG RIEUL"}], "\u1131": [{"c": "\u1109\u1106", "n": "HANGUL CHOSEONG SIOS, HANGUL CHOSEONG MIEUM"}], "\u1109\u1106": [{"c": "\u1131", "n": "HANGUL CHOSEONG SIOS-MIEUM"}, {"c": "\ud7ea", "n": "HANGUL JONGSEONG SIOS-MIEUM"}], "\ud7ea": [{"c": "\u1109\u1106", "n": "HANGUL CHOSEONG SIOS, HANGUL CHOSEONG MIEUM"}], "\u1132": [{"c": "\u1109\u1107", "n": "HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PIEUP"}], "\u1109\u1107": [{"c": "\u1132", "n": "HANGUL CHOSEONG SIOS-PIEUP"}, {"c": "\u317d", "n": "HANGUL LETTER SIOS-PIEUP"}, {"c": "\u11ea", "n": "HANGUL JONGSEONG SIOS-PIEUP"}], "\u317d": [{"c": "\u1109\u1107", "n": "HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PIEUP"}], "\u11ea": [{"c": "\u1109\u1107", "n": "HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PIEUP"}], "\u1133": [{"c": "\u1109\u1107\u1100", "n": "HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG KIYEOK"}], "\u1109\u1107\u1100": [{"c": "\u1133", "n": "HANGUL CHOSEONG SIOS-PIEUP-KIYEOK"}], "\ud7eb": [{"c": "\u1109\u1107\u110b", "n": "HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG"}], "\u1109\u1107\u110b": [{"c": "\ud7eb", "n": "HANGUL JONGSEONG SIOS-KAPYEOUNPIEUP"}], "\u110a": [{"c": "\u1109\u1109", "n": "HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS"}], "\u1109\u1109": [{"c": "\u110a", "n": "HANGUL CHOSEONG SSANGSIOS"}, {"c": "\u3146", "n": "HANGUL LETTER SSANGSIOS"}, {"c": "\u11bb", "n": "HANGUL JONGSEONG SSANGSIOS"}], "\u3146": [{"c": "\u1109\u1109", "n": "HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS"}], "\u11bb": [{"c": "\u1109\u1109", "n": "HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS"}], "\ud7ec": [{"c": "\u1109\u1109\u1100", "n": "HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KIYEOK"}], "\u1109\u1109\u1100": [{"c": "\ud7ec", "n": "HANGUL JONGSEONG SSANGSIOS-KIYEOK"}], "\ud7ed": [{"c": "\u1109\u1109\u1103", "n": "HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG TIKEUT"}], "\u1109\u1109\u1103": [{"c": "\ud7ed", "n": "HANGUL JONGSEONG SSANGSIOS-TIKEUT"}], "\ua975": [{"c": "\u1109\u1109\u1107", "n": "HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PIEUP"}], "\u1109\u1109\u1107": [{"c": "\ua975", "n": "HANGUL CHOSEONG SSANGSIOS-PIEUP"}], "\u1134": [{"c": "\u1109\u1109\u1109", "n": "HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS"}], "\u1109\u1109\u1109": [{"c": "\u1134", "n": "HANGUL CHOSEONG SIOS-SSANGSIOS"}], "\u1135": [{"c": "\u1109\u110b", "n": "HANGUL CHOSEONG SIOS, HANGUL CHOSEONG IEUNG"}], "\u1109\u110b": [{"c": "\u1135", "n": "HANGUL CHOSEONG SIOS-IEUNG"}], "\u1136": [{"c": "\u1109\u110c", "n": "HANGUL CHOSEONG SIOS, HANGUL CHOSEONG CIEUC"}], "\u1109\u110c": [{"c": "\u1136", "n": "HANGUL CHOSEONG SIOS-CIEUC"}, {"c": "\u317e", "n": "HANGUL LETTER SIOS-CIEUC"}, {"c": "\ud7ef", "n": "HANGUL JONGSEONG SIOS-CIEUC"}], "\u317e": [{"c": "\u1109\u110c", "n": "HANGUL CHOSEONG SIOS, HANGUL CHOSEONG CIEUC"}], "\ud7ef": [{"c": "\u1109\u110c", "n": "HANGUL CHOSEONG SIOS, HANGUL CHOSEONG CIEUC"}], "\u1137": [{"c": "\u1109\u110e", "n": "HANGUL CHOSEONG SIOS, HANGUL CHOSEONG CHIEUCH"}], "\u1109\u110e": [{"c": "\u1137", "n": "HANGUL CHOSEONG SIOS-CHIEUCH"}, {"c": "\ud7f0", "n": "HANGUL JONGSEONG SIOS-CHIEUCH"}], "\ud7f0": [{"c": "\u1109\u110e", "n": "HANGUL CHOSEONG SIOS, HANGUL CHOSEONG CHIEUCH"}], "\u1138": [{"c": "\u1109\u110f", "n": "HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KHIEUKH"}], "\u1109\u110f": [{"c": "\u1138", "n": "HANGUL CHOSEONG SIOS-KHIEUKH"}], "\u1139": [{"c": "\u1109\u1110", "n": "HANGUL CHOSEONG SIOS, HANGUL CHOSEONG THIEUTH"}], "\u1109\u1110": [{"c": "\u1139", "n": "HANGUL CHOSEONG SIOS-THIEUTH"}, {"c": "\ud7f1", "n": "HANGUL JONGSEONG SIOS-THIEUTH"}], "\ud7f1": [{"c": "\u1109\u1110", "n": "HANGUL CHOSEONG SIOS, HANGUL CHOSEONG THIEUTH"}], "\u113a": [{"c": "\u1109\u1111", "n": "HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PHIEUPH"}], "\u1109\u1111": [{"c": "\u113a", "n": "HANGUL CHOSEONG SIOS-PHIEUPH"}], "\ud7ee": [{"c": "\u1109\u1140", "n": "HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PANSIOS"}], "\u1109\u1140": [{"c": "\ud7ee", "n": "HANGUL JONGSEONG SIOS-PANSIOS"}], "\u3147": [{"c": "\u110b", "n": "HANGUL CHOSEONG IEUNG"}], "\u110b": [{"c": "\u3147", "n": "HANGUL LETTER IEUNG"}, {"c": "\u11bc", "n": "HANGUL JONGSEONG IEUNG"}], "\u11bc": [{"c": "\u110b", "n": "HANGUL CHOSEONG IEUNG"}], "\u1141": [{"c": "\u110b\u1100", "n": "HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG KIYEOK"}], "\u110b\u1100": [{"c": "\u1141", "n": "HANGUL CHOSEONG IEUNG-KIYEOK"}, {"c": "\u11ec", "n": "HANGUL JONGSEONG IEUNG-KIYEOK"}], "\u11ec": [{"c": "\u110b\u1100", "n": "HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG KIYEOK"}], "\u11ed": [{"c": "\u110b\u1100\u1100", "n": "HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG KIYEOK"}], "\u110b\u1100\u1100": [{"c": "\u11ed", "n": "HANGUL JONGSEONG IEUNG-SSANGKIYEOK"}], "\u1142": [{"c": "\u110b\u1103", "n": "HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG TIKEUT"}], "\u110b\u1103": [{"c": "\u1142", "n": "HANGUL CHOSEONG IEUNG-TIKEUT"}], "\ua976": [{"c": "\u110b\u1105", "n": "HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG RIEUL"}], "\u110b\u1105": [{"c": "\ua976", "n": "HANGUL CHOSEONG IEUNG-RIEUL"}], "\u1143": [{"c": "\u110b\u1106", "n": "HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG MIEUM"}], "\u110b\u1106": [{"c": "\u1143", "n": "HANGUL CHOSEONG IEUNG-MIEUM"}], "\u1144": [{"c": "\u110b\u1107", "n": "HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG PIEUP"}], "\u110b\u1107": [{"c": "\u1144", "n": "HANGUL CHOSEONG IEUNG-PIEUP"}], "\u1145": [{"c": "\u110b\u1109", "n": "HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG SIOS"}], "\u110b\u1109": [{"c": "\u1145", "n": "HANGUL CHOSEONG IEUNG-SIOS"}, {"c": "\u11f1", "n": "HANGUL JONGSEONG YESIEUNG-SIOS"}, {"c": "\u3182", "n": "HANGUL LETTER YESIEUNG-SIOS"}], "\u11f1": [{"c": "\u110b\u1109", "n": "HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG SIOS"}], "\u3182": [{"c": "\u110b\u1109", "n": "HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG SIOS"}], "\u1147": [{"c": "\u110b\u110b", "n": "HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG IEUNG"}], "\u110b\u110b": [{"c": "\u1147", "n": "HANGUL CHOSEONG SSANGIEUNG"}, {"c": "\u3180", "n": "HANGUL LETTER SSANGIEUNG"}, {"c": "\u11ee", "n": "HANGUL JONGSEONG SSANGIEUNG"}], "\u3180": [{"c": "\u110b\u110b", "n": "HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG IEUNG"}], "\u11ee": [{"c": "\u110b\u110b", "n": "HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG IEUNG"}], "\u1148": [{"c": "\u110b\u110c", "n": "HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG CIEUC"}], "\u110b\u110c": [{"c": "\u1148", "n": "HANGUL CHOSEONG IEUNG-CIEUC"}], "\u1149": [{"c": "\u110b\u110e", "n": "HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG CHIEUCH"}], "\u110b\u110e": [{"c": "\u1149", "n": "HANGUL CHOSEONG IEUNG-CHIEUCH"}], "\u11ef": [{"c": "\u110b\u110f", "n": "HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG KHIEUKH"}], "\u110b\u110f": [{"c": "\u11ef", "n": "HANGUL JONGSEONG IEUNG-KHIEUKH"}], "\u114a": [{"c": "\u110b\u1110", "n": "HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG THIEUTH"}], "\u110b\u1110": [{"c": "\u114a", "n": "HANGUL CHOSEONG IEUNG-THIEUTH"}], "\u114b": [{"c": "\u110b\u1111", "n": "HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG PHIEUPH"}], "\u110b\u1111": [{"c": "\u114b", "n": "HANGUL CHOSEONG IEUNG-PHIEUPH"}], "\ua977": [{"c": "\u110b\u1112", "n": "HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG HIEUH"}], "\u110b\u1112": [{"c": "\ua977", "n": "HANGUL CHOSEONG IEUNG-HIEUH"}], "\u1146": [{"c": "\u110b\u1140", "n": "HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG PANSIOS"}], "\u110b\u1140": [{"c": "\u1146", "n": "HANGUL CHOSEONG IEUNG-PANSIOS"}, {"c": "\u11f2", "n": "HANGUL JONGSEONG YESIEUNG-PANSIOS"}, {"c": "\u3183", "n": "HANGUL LETTER YESIEUNG-PANSIOS"}], "\u11f2": [{"c": "\u110b\u1140", "n": "HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG PANSIOS"}], "\u3183": [{"c": "\u110b\u1140", "n": "HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG PANSIOS"}], "\u3148": [{"c": "\u110c", "n": "HANGUL CHOSEONG CIEUC"}], "\u110c": [{"c": "\u3148", "n": "HANGUL LETTER CIEUC"}, {"c": "\u11bd", "n": "HANGUL JONGSEONG CIEUC"}], "\u11bd": [{"c": "\u110c", "n": "HANGUL CHOSEONG CIEUC"}], "\ud7f7": [{"c": "\u110c\u1107", "n": "HANGUL CHOSEONG CIEUC, HANGUL CHOSEONG PIEUP"}], "\u110c\u1107": [{"c": "\ud7f7", "n": "HANGUL JONGSEONG CIEUC-PIEUP"}], "\ud7f8": [{"c": "\u110c\u1107\u1107", "n": "HANGUL CHOSEONG CIEUC, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PIEUP"}], "\u110c\u1107\u1107": [{"c": "\ud7f8", "n": "HANGUL JONGSEONG CIEUC-SSANGPIEUP"}], "\u114d": [{"c": "\u110c\u110b", "n": "HANGUL CHOSEONG CIEUC, HANGUL CHOSEONG IEUNG"}], "\u110c\u110b": [{"c": "\u114d", "n": "HANGUL CHOSEONG CIEUC-IEUNG"}], "\u110d": [{"c": "\u110c\u110c", "n": "HANGUL CHOSEONG CIEUC, HANGUL CHOSEONG CIEUC"}], "\u110c\u110c": [{"c": "\u110d", "n": "HANGUL CHOSEONG SSANGCIEUC"}, {"c": "\u3149", "n": "HANGUL LETTER SSANGCIEUC"}, {"c": "\ud7f9", "n": "HANGUL JONGSEONG SSANGCIEUC"}], "\u3149": [{"c": "\u110c\u110c", "n": "HANGUL CHOSEONG CIEUC, HANGUL CHOSEONG CIEUC"}], "\ud7f9": [{"c": "\u110c\u110c", "n": "HANGUL CHOSEONG CIEUC, HANGUL CHOSEONG CIEUC"}], "\ua978": [{"c": "\u110c\u110c\u1112", "n": "HANGUL CHOSEONG CIEUC, HANGUL CHOSEONG CIEUC, HANGUL CHOSEONG HIEUH"}], "\u110c\u110c\u1112": [{"c": "\ua978", "n": "HANGUL CHOSEONG SSANGCIEUC-HIEUH"}], "\u314a": [{"c": "\u110e", "n": "HANGUL CHOSEONG CHIEUCH"}], "\u110e": [{"c": "\u314a", "n": "HANGUL LETTER CHIEUCH"}, {"c": "\u11be", "n": "HANGUL JONGSEONG CHIEUCH"}], "\u11be": [{"c": "\u110e", "n": "HANGUL CHOSEONG CHIEUCH"}], "\u1152": [{"c": "\u110e\u110f", "n": "HANGUL CHOSEONG CHIEUCH, HANGUL CHOSEONG KHIEUKH"}], "\u110e\u110f": [{"c": "\u1152", "n": "HANGUL CHOSEONG CHIEUCH-KHIEUKH"}], "\u1153": [{"c": "\u110e\u1112", "n": "HANGUL CHOSEONG CHIEUCH, HANGUL CHOSEONG HIEUH"}], "\u110e\u1112": [{"c": "\u1153", "n": "HANGUL CHOSEONG CHIEUCH-HIEUH"}], "\u314b": [{"c": "\u110f", "n": "HANGUL CHOSEONG KHIEUKH"}], "\u110f": [{"c": "\u314b", "n": "HANGUL LETTER KHIEUKH"}, {"c": "\u11bf", "n": "HANGUL JONGSEONG KHIEUKH"}], "\u11bf": [{"c": "\u110f", "n": "HANGUL CHOSEONG KHIEUKH"}], "\u314c": [{"c": "\u1110", "n": "HANGUL CHOSEONG THIEUTH"}], "\u1110": [{"c": "\u314c", "n": "HANGUL LETTER THIEUTH"}, {"c": "\u11c0", "n": "HANGUL JONGSEONG THIEUTH"}], "\u11c0": [{"c": "\u1110", "n": "HANGUL CHOSEONG THIEUTH"}], "\ua979": [{"c": "\u1110\u1110", "n": "HANGUL CHOSEONG THIEUTH, HANGUL CHOSEONG THIEUTH"}], "\u1110\u1110": [{"c": "\ua979", "n": "HANGUL CHOSEONG SSANGTHIEUTH"}], "\u314d": [{"c": "\u1111", "n": "HANGUL CHOSEONG PHIEUPH"}], "\u1111": [{"c": "\u314d", "n": "HANGUL LETTER PHIEUPH"}, {"c": "\u11c1", "n": "HANGUL JONGSEONG PHIEUPH"}], "\u11c1": [{"c": "\u1111", "n": "HANGUL CHOSEONG PHIEUPH"}], "\u1156": [{"c": "\u1111\u1107", "n": "HANGUL CHOSEONG PHIEUPH, HANGUL CHOSEONG PIEUP"}], "\u1111\u1107": [{"c": "\u1156", "n": "HANGUL CHOSEONG PHIEUPH-PIEUP"}, {"c": "\u11f3", "n": "HANGUL JONGSEONG PHIEUPH-PIEUP"}], "\u11f3": [{"c": "\u1111\u1107", "n": "HANGUL CHOSEONG PHIEUPH, HANGUL CHOSEONG PIEUP"}], "\ud7fa": [{"c": "\u1111\u1109", "n": "HANGUL CHOSEONG PHIEUPH, HANGUL CHOSEONG SIOS"}], "\u1111\u1109": [{"c": "\ud7fa", "n": "HANGUL JONGSEONG PHIEUPH-SIOS"}], "\u1157": [{"c": "\u1111\u110b", "n": "HANGUL CHOSEONG PHIEUPH, HANGUL CHOSEONG IEUNG"}], "\u1111\u110b": [{"c": "\u1157", "n": "HANGUL CHOSEONG KAPYEOUNPHIEUPH"}, {"c": "\u3184", "n": "HANGUL LETTER KAPYEOUNPHIEUPH"}, {"c": "\u11f4", "n": "HANGUL JONGSEONG KAPYEOUNPHIEUPH"}], "\u3184": [{"c": "\u1111\u110b", "n": "HANGUL CHOSEONG PHIEUPH, HANGUL CHOSEONG IEUNG"}], "\u11f4": [{"c": "\u1111\u110b", "n": "HANGUL CHOSEONG PHIEUPH, HANGUL CHOSEONG IEUNG"}], "\ud7fb": [{"c": "\u1111\u1110", "n": "HANGUL CHOSEONG PHIEUPH, HANGUL CHOSEONG THIEUTH"}], "\u1111\u1110": [{"c": "\ud7fb", "n": "HANGUL JONGSEONG PHIEUPH-THIEUTH"}], "\ua97a": [{"c": "\u1111\u1112", "n": "HANGUL CHOSEONG PHIEUPH, HANGUL CHOSEONG HIEUH"}], "\u1111\u1112": [{"c": "\ua97a", "n": "HANGUL CHOSEONG PHIEUPH-HIEUH"}], "\u314e": [{"c": "\u1112", "n": "HANGUL CHOSEONG HIEUH"}], "\u1112": [{"c": "\u314e", "n": "HANGUL LETTER HIEUH"}, {"c": "\u11c2", "n": "HANGUL JONGSEONG HIEUH"}], "\u11c2": [{"c": "\u1112", "n": "HANGUL CHOSEONG HIEUH"}], "\u11f5": [{"c": "\u1112\u1102", "n": "HANGUL CHOSEONG HIEUH, HANGUL CHOSEONG NIEUN"}], "\u1112\u1102": [{"c": "\u11f5", "n": "HANGUL JONGSEONG HIEUH-NIEUN"}], "\u11f6": [{"c": "\u1112\u1105", "n": "HANGUL CHOSEONG HIEUH, HANGUL CHOSEONG RIEUL"}], "\u1112\u1105": [{"c": "\u11f6", "n": "HANGUL JONGSEONG HIEUH-RIEUL"}], "\u11f7": [{"c": "\u1112\u1106", "n": "HANGUL CHOSEONG HIEUH, HANGUL CHOSEONG MIEUM"}], "\u1112\u1106": [{"c": "\u11f7", "n": "HANGUL JONGSEONG HIEUH-MIEUM"}], "\u11f8": [{"c": "\u1112\u1107", "n": "HANGUL CHOSEONG HIEUH, HANGUL CHOSEONG PIEUP"}], "\u1112\u1107": [{"c": "\u11f8", "n": "HANGUL JONGSEONG HIEUH-PIEUP"}], "\ua97b": [{"c": "\u1112\u1109", "n": "HANGUL CHOSEONG HIEUH, HANGUL CHOSEONG SIOS"}], "\u1112\u1109": [{"c": "\ua97b", "n": "HANGUL CHOSEONG HIEUH-SIOS"}], "\u1158": [{"c": "\u1112\u1112", "n": "HANGUL CHOSEONG HIEUH, HANGUL CHOSEONG HIEUH"}], "\u1112\u1112": [{"c": "\u1158", "n": "HANGUL CHOSEONG SSANGHIEUH"}, {"c": "\u3185", "n": "HANGUL LETTER SSANGHIEUH"}], "\u3185": [{"c": "\u1112\u1112", "n": "HANGUL CHOSEONG HIEUH, HANGUL CHOSEONG HIEUH"}], "\u113d": [{"c": "\u113c\u113c", "n": "HANGUL CHOSEONG CHITUEUMSIOS, HANGUL CHOSEONG CHITUEUMSIOS"}], "\u113c\u113c": [{"c": "\u113d", "n": "HANGUL CHOSEONG CHITUEUMSSANGSIOS"}], "\u113f": [{"c": "\u113e\u113e", "n": "HANGUL CHOSEONG CEONGCHIEUMSIOS, HANGUL CHOSEONG CEONGCHIEUMSIOS"}], "\u113e\u113e": [{"c": "\u113f", "n": "HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS"}], "\u317f": [{"c": "\u1140", "n": "HANGUL CHOSEONG PANSIOS"}], "\u1140": [{"c": "\u317f", "n": "HANGUL LETTER PANSIOS"}, {"c": "\u11eb", "n": "HANGUL JONGSEONG PANSIOS"}], "\u11eb": [{"c": "\u1140", "n": "HANGUL CHOSEONG PANSIOS"}], "\ud7f3": [{"c": "\u1140\u1107", "n": "HANGUL CHOSEONG PANSIOS, HANGUL CHOSEONG PIEUP"}], "\u1140\u1107": [{"c": "\ud7f3", "n": "HANGUL JONGSEONG PANSIOS-PIEUP"}], "\ud7f4": [{"c": "\u1140\u1107\u110b", "n": "HANGUL CHOSEONG PANSIOS, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG"}], "\u1140\u1107\u110b": [{"c": "\ud7f4", "n": "HANGUL JONGSEONG PANSIOS-KAPYEOUNPIEUP"}], "\u3181": [{"c": "\u114c", "n": "HANGUL CHOSEONG YESIEUNG"}], "\u114c": [{"c": "\u3181", "n": "HANGUL LETTER YESIEUNG"}, {"c": "\u11f0", "n": "HANGUL JONGSEONG YESIEUNG"}], "\u11f0": [{"c": "\u114c", "n": "HANGUL CHOSEONG YESIEUNG"}], "\ud7f5": [{"c": "\u114c\u1106", "n": "HANGUL CHOSEONG YESIEUNG, HANGUL CHOSEONG MIEUM"}], "\u114c\u1106": [{"c": "\ud7f5", "n": "HANGUL JONGSEONG YESIEUNG-MIEUM"}], "\ud7f6": [{"c": "\u114c\u1112", "n": "HANGUL CHOSEONG YESIEUNG, HANGUL CHOSEONG HIEUH"}], "\u114c\u1112": [{"c": "\ud7f6", "n": "HANGUL JONGSEONG YESIEUNG-HIEUH"}], "\u114f": [{"c": "\u114e\u114e", "n": "HANGUL CHOSEONG CHITUEUMCIEUC, HANGUL CHOSEONG CHITUEUMCIEUC"}], "\u114e\u114e": [{"c": "\u114f", "n": "HANGUL CHOSEONG CHITUEUMSSANGCIEUC"}], "\u1151": [{"c": "\u1150\u1150", "n": "HANGUL CHOSEONG CEONGCHIEUMCIEUC, HANGUL CHOSEONG CEONGCHIEUMCIEUC"}], "\u1150\u1150": [{"c": "\u1151", "n": "HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC"}], "\u3186": [{"c": "\u1159", "n": "HANGUL CHOSEONG YEORINHIEUH"}], "\u1159": [{"c": "\u3186", "n": "HANGUL LETTER YEORINHIEUH"}, {"c": "\u11f9", "n": "HANGUL JONGSEONG YEORINHIEUH"}], "\u11f9": [{"c": "\u1159", "n": "HANGUL CHOSEONG YEORINHIEUH"}], "\ua97c": [{"c": "\u1159\u1159", "n": "HANGUL CHOSEONG YEORINHIEUH, HANGUL CHOSEONG YEORINHIEUH"}], "\u1159\u1159": [{"c": "\ua97c", "n": "HANGUL CHOSEONG SSANGYEORINHIEUH"}], "\u314f": [{"c": "\u1161", "n": "HANGUL JUNGSEONG A"}], "\u1161": [{"c": "\u314f", "n": "HANGUL LETTER A"}], "\u11a3": [{"c": "\u1161\u30fc", "n": "HANGUL JUNGSEONG A, KATAKANA-HIRAGANA PROLONGED SOUND MARK"}], "\u1161\u30fc": [{"c": "\u11a3", "n": "HANGUL JUNGSEONG A-EU"}], "\u1176": [{"c": "\u1161\u1169", "n": "HANGUL JUNGSEONG A, HANGUL JUNGSEONG O"}], "\u1161\u1169": [{"c": "\u1176", "n": "HANGUL JUNGSEONG A-O"}], "\u1177": [{"c": "\u1161\u116e", "n": "HANGUL JUNGSEONG A, HANGUL JUNGSEONG U"}], "\u1161\u116e": [{"c": "\u1177", "n": "HANGUL JUNGSEONG A-U"}], "\u1162": [{"c": "\u1161\u4e28", "n": "HANGUL JUNGSEONG A, CJK UNIFIED IDEOGRAPH-4E28"}], "\u1161\u4e28": [{"c": "\u1162", "n": "HANGUL JUNGSEONG AE"}, {"c": "\u3150", "n": "HANGUL LETTER AE"}], "\u3150": [{"c": "\u1161\u4e28", "n": "HANGUL JUNGSEONG A, CJK UNIFIED IDEOGRAPH-4E28"}], "\u3151": [{"c": "\u1163", "n": "HANGUL JUNGSEONG YA"}], "\u1163": [{"c": "\u3151", "n": "HANGUL LETTER YA"}], "\u1178": [{"c": "\u1163\u1169", "n": "HANGUL JUNGSEONG YA, HANGUL JUNGSEONG O"}], "\u1163\u1169": [{"c": "\u1178", "n": "HANGUL JUNGSEONG YA-O"}], "\u1179": [{"c": "\u1163\u116d", "n": "HANGUL JUNGSEONG YA, HANGUL JUNGSEONG YO"}], "\u1163\u116d": [{"c": "\u1179", "n": "HANGUL JUNGSEONG YA-YO"}], "\u11a4": [{"c": "\u1163\u116e", "n": "HANGUL JUNGSEONG YA, HANGUL JUNGSEONG U"}], "\u1163\u116e": [{"c": "\u11a4", "n": "HANGUL JUNGSEONG YA-U"}], "\u1164": [{"c": "\u1163\u4e28", "n": "HANGUL JUNGSEONG YA, CJK UNIFIED IDEOGRAPH-4E28"}], "\u1163\u4e28": [{"c": "\u1164", "n": "HANGUL JUNGSEONG YAE"}, {"c": "\u3152", "n": "HANGUL LETTER YAE"}], "\u3152": [{"c": "\u1163\u4e28", "n": "HANGUL JUNGSEONG YA, CJK UNIFIED IDEOGRAPH-4E28"}], "\u3153": [{"c": "\u1165", "n": "HANGUL JUNGSEONG EO"}], "\u1165": [{"c": "\u3153", "n": "HANGUL LETTER EO"}], "\u117c": [{"c": "\u1165\u30fc", "n": "HANGUL JUNGSEONG EO, KATAKANA-HIRAGANA PROLONGED SOUND MARK"}], "\u1165\u30fc": [{"c": "\u117c", "n": "HANGUL JUNGSEONG EO-EU"}], "\u117a": [{"c": "\u1165\u1169", "n": "HANGUL JUNGSEONG EO, HANGUL JUNGSEONG O"}], "\u1165\u1169": [{"c": "\u117a", "n": "HANGUL JUNGSEONG EO-O"}], "\u117b": [{"c": "\u1165\u116e", "n": "HANGUL JUNGSEONG EO, HANGUL JUNGSEONG U"}], "\u1165\u116e": [{"c": "\u117b", "n": "HANGUL JUNGSEONG EO-U"}], "\u1166": [{"c": "\u1165\u4e28", "n": "HANGUL JUNGSEONG EO, CJK UNIFIED IDEOGRAPH-4E28"}], "\u1165\u4e28": [{"c": "\u1166", "n": "HANGUL JUNGSEONG E"}, {"c": "\u3154", "n": "HANGUL LETTER E"}], "\u3154": [{"c": "\u1165\u4e28", "n": "HANGUL JUNGSEONG EO, CJK UNIFIED IDEOGRAPH-4E28"}], "\u3155": [{"c": "\u1167", "n": "HANGUL JUNGSEONG YEO"}], "\u1167": [{"c": "\u3155", "n": "HANGUL LETTER YEO"}], "\u11a5": [{"c": "\u1167\u1163", "n": "HANGUL JUNGSEONG YEO, HANGUL JUNGSEONG YA"}], "\u1167\u1163": [{"c": "\u11a5", "n": "HANGUL JUNGSEONG YEO-YA"}], "\u117d": [{"c": "\u1167\u1169", "n": "HANGUL JUNGSEONG YEO, HANGUL JUNGSEONG O"}], "\u1167\u1169": [{"c": "\u117d", "n": "HANGUL JUNGSEONG YEO-O"}], "\u117e": [{"c": "\u1167\u116e", "n": "HANGUL JUNGSEONG YEO, HANGUL JUNGSEONG U"}], "\u1167\u116e": [{"c": "\u117e", "n": "HANGUL JUNGSEONG YEO-U"}], "\u1168": [{"c": "\u1167\u4e28", "n": "HANGUL JUNGSEONG YEO, CJK UNIFIED IDEOGRAPH-4E28"}], "\u1167\u4e28": [{"c": "\u1168", "n": "HANGUL JUNGSEONG YE"}, {"c": "\u3156", "n": "HANGUL LETTER YE"}], "\u3156": [{"c": "\u1167\u4e28", "n": "HANGUL JUNGSEONG YEO, CJK UNIFIED IDEOGRAPH-4E28"}], "\u3157": [{"c": "\u1169", "n": "HANGUL JUNGSEONG O"}], "\u1169": [{"c": "\u3157", "n": "HANGUL LETTER O"}], "\u116a": [{"c": "\u1169\u1161", "n": "HANGUL JUNGSEONG O, HANGUL JUNGSEONG A"}], "\u1169\u1161": [{"c": "\u116a", "n": "HANGUL JUNGSEONG WA"}, {"c": "\u3158", "n": "HANGUL LETTER WA"}], "\u3158": [{"c": "\u1169\u1161", "n": "HANGUL JUNGSEONG O, HANGUL JUNGSEONG A"}], "\u116b": [{"c": "\u1169\u1161\u4e28", "n": "HANGUL JUNGSEONG O, HANGUL JUNGSEONG A, CJK UNIFIED IDEOGRAPH-4E28"}], "\u1169\u1161\u4e28": [{"c": "\u116b", "n": "HANGUL JUNGSEONG WAE"}, {"c": "\u3159", "n": "HANGUL LETTER WAE"}], "\u3159": [{"c": "\u1169\u1161\u4e28", "n": "HANGUL JUNGSEONG O, HANGUL JUNGSEONG A, CJK UNIFIED IDEOGRAPH-4E28"}], "\u11a6": [{"c": "\u1169\u1163", "n": "HANGUL JUNGSEONG O, HANGUL JUNGSEONG YA"}], "\u1169\u1163": [{"c": "\u11a6", "n": "HANGUL JUNGSEONG O-YA"}], "\u11a7": [{"c": "\u1169\u1163\u4e28", "n": "HANGUL JUNGSEONG O, HANGUL JUNGSEONG YA, CJK UNIFIED IDEOGRAPH-4E28"}], "\u1169\u1163\u4e28": [{"c": "\u11a7", "n": "HANGUL JUNGSEONG O-YAE"}], "\u117f": [{"c": "\u1169\u1165", "n": "HANGUL JUNGSEONG O, HANGUL JUNGSEONG EO"}], "\u1169\u1165": [{"c": "\u117f", "n": "HANGUL JUNGSEONG O-EO"}], "\u1180": [{"c": "\u1169\u1165\u4e28", "n": "HANGUL JUNGSEONG O, HANGUL JUNGSEONG EO, CJK UNIFIED IDEOGRAPH-4E28"}], "\u1169\u1165\u4e28": [{"c": "\u1180", "n": "HANGUL JUNGSEONG O-E"}], "\ud7b0": [{"c": "\u1169\u1167", "n": "HANGUL JUNGSEONG O, HANGUL JUNGSEONG YEO"}], "\u1169\u1167": [{"c": "\ud7b0", "n": "HANGUL JUNGSEONG O-YEO"}], "\u1181": [{"c": "\u1169\u1167\u4e28", "n": "HANGUL JUNGSEONG O, HANGUL JUNGSEONG YEO, CJK UNIFIED IDEOGRAPH-4E28"}], "\u1169\u1167\u4e28": [{"c": "\u1181", "n": "HANGUL JUNGSEONG O-YE"}], "\u1182": [{"c": "\u1169\u1169", "n": "HANGUL JUNGSEONG O, HANGUL JUNGSEONG O"}], "\u1169\u1169": [{"c": "\u1182", "n": "HANGUL JUNGSEONG O-O"}], "\ud7b1": [{"c": "\u1169\u1169\u4e28", "n": "HANGUL JUNGSEONG O, HANGUL JUNGSEONG O, CJK UNIFIED IDEOGRAPH-4E28"}], "\u1169\u1169\u4e28": [{"c": "\ud7b1", "n": "HANGUL JUNGSEONG O-O-I"}], "\u1183": [{"c": "\u1169\u116e", "n": "HANGUL JUNGSEONG O, HANGUL JUNGSEONG U"}], "\u1169\u116e": [{"c": "\u1183", "n": "HANGUL JUNGSEONG O-U"}], "\u116c": [{"c": "\u1169\u4e28", "n": "HANGUL JUNGSEONG O, CJK UNIFIED IDEOGRAPH-4E28"}], "\u1169\u4e28": [{"c": "\u116c", "n": "HANGUL JUNGSEONG OE"}, {"c": "\u315a", "n": "HANGUL LETTER OE"}], "\u315a": [{"c": "\u1169\u4e28", "n": "HANGUL JUNGSEONG O, CJK UNIFIED IDEOGRAPH-4E28"}], "\u315b": [{"c": "\u116d", "n": "HANGUL JUNGSEONG YO"}], "\u116d": [{"c": "\u315b", "n": "HANGUL LETTER YO"}], "\ud7b2": [{"c": "\u116d\u1161", "n": "HANGUL JUNGSEONG YO, HANGUL JUNGSEONG A"}], "\u116d\u1161": [{"c": "\ud7b2", "n": "HANGUL JUNGSEONG YO-A"}], "\ud7b3": [{"c": "\u116d\u1161\u4e28", "n": "HANGUL JUNGSEONG YO, HANGUL JUNGSEONG A, CJK UNIFIED IDEOGRAPH-4E28"}], "\u116d\u1161\u4e28": [{"c": "\ud7b3", "n": "HANGUL JUNGSEONG YO-AE"}], "\u1184": [{"c": "\u116d\u1163", "n": "HANGUL JUNGSEONG YO, HANGUL JUNGSEONG YA"}], "\u116d\u1163": [{"c": "\u1184", "n": "HANGUL JUNGSEONG YO-YA"}, {"c": "\u3187", "n": "HANGUL LETTER YO-YA"}, {"c": "\u1186", "n": "HANGUL JUNGSEONG YO-YEO"}], "\u3187": [{"c": "\u116d\u1163", "n": "HANGUL JUNGSEONG YO, HANGUL JUNGSEONG YA"}], "\u1186": [{"c": "\u116d\u1163", "n": "HANGUL JUNGSEONG YO, HANGUL JUNGSEONG YA"}], "\u1185": [{"c": "\u116d\u1163\u4e28", "n": "HANGUL JUNGSEONG YO, HANGUL JUNGSEONG YA, CJK UNIFIED IDEOGRAPH-4E28"}], "\u116d\u1163\u4e28": [{"c": "\u1185", "n": "HANGUL JUNGSEONG YO-YAE"}, {"c": "\u3188", "n": "HANGUL LETTER YO-YAE"}], "\u3188": [{"c": "\u116d\u1163\u4e28", "n": "HANGUL JUNGSEONG YO, HANGUL JUNGSEONG YA, CJK UNIFIED IDEOGRAPH-4E28"}], "\ud7b4": [{"c": "\u116d\u1165", "n": "HANGUL JUNGSEONG YO, HANGUL JUNGSEONG EO"}], "\u116d\u1165": [{"c": "\ud7b4", "n": "HANGUL JUNGSEONG YO-EO"}], "\u1187": [{"c": "\u116d\u1169", "n": "HANGUL JUNGSEONG YO, HANGUL JUNGSEONG O"}], "\u116d\u1169": [{"c": "\u1187", "n": "HANGUL JUNGSEONG YO-O"}], "\u1188": [{"c": "\u116d\u4e28", "n": "HANGUL JUNGSEONG YO, CJK UNIFIED IDEOGRAPH-4E28"}], "\u116d\u4e28": [{"c": "\u1188", "n": "HANGUL JUNGSEONG YO-I"}, {"c": "\u3189", "n": "HANGUL LETTER YO-I"}], "\u3189": [{"c": "\u116d\u4e28", "n": "HANGUL JUNGSEONG YO, CJK UNIFIED IDEOGRAPH-4E28"}], "\u315c": [{"c": "\u116e", "n": "HANGUL JUNGSEONG U"}], "\u116e": [{"c": "\u315c", "n": "HANGUL LETTER U"}], "\u1189": [{"c": "\u116e\u1161", "n": "HANGUL JUNGSEONG U, HANGUL JUNGSEONG A"}], "\u116e\u1161": [{"c": "\u1189", "n": "HANGUL JUNGSEONG U-A"}], "\u118a": [{"c": "\u116e\u1161\u4e28", "n": "HANGUL JUNGSEONG U, HANGUL JUNGSEONG A, CJK UNIFIED IDEOGRAPH-4E28"}], "\u116e\u1161\u4e28": [{"c": "\u118a", "n": "HANGUL JUNGSEONG U-AE"}], "\u116f": [{"c": "\u116e\u1165", "n": "HANGUL JUNGSEONG U, HANGUL JUNGSEONG EO"}], "\u116e\u1165": [{"c": "\u116f", "n": "HANGUL JUNGSEONG WEO"}, {"c": "\u315d", "n": "HANGUL LETTER WEO"}], "\u315d": [{"c": "\u116e\u1165", "n": "HANGUL JUNGSEONG U, HANGUL JUNGSEONG EO"}], "\u118b": [{"c": "\u116e\u1165\u30fc", "n": "HANGUL JUNGSEONG U, HANGUL JUNGSEONG EO, KATAKANA-HIRAGANA PROLONGED SOUND MARK"}], "\u116e\u1165\u30fc": [{"c": "\u118b", "n": "HANGUL JUNGSEONG U-EO-EU"}], "\u1170": [{"c": "\u116e\u1165\u4e28", "n": "HANGUL JUNGSEONG U, HANGUL JUNGSEONG EO, CJK UNIFIED IDEOGRAPH-4E28"}], "\u116e\u1165\u4e28": [{"c": "\u1170", "n": "HANGUL JUNGSEONG WE"}, {"c": "\u315e", "n": "HANGUL LETTER WE"}], "\u315e": [{"c": "\u116e\u1165\u4e28", "n": "HANGUL JUNGSEONG U, HANGUL JUNGSEONG EO, CJK UNIFIED IDEOGRAPH-4E28"}], "\ud7b5": [{"c": "\u116e\u1167", "n": "HANGUL JUNGSEONG U, HANGUL JUNGSEONG YEO"}], "\u116e\u1167": [{"c": "\ud7b5", "n": "HANGUL JUNGSEONG U-YEO"}], "\u118c": [{"c": "\u116e\u1167\u4e28", "n": "HANGUL JUNGSEONG U, HANGUL JUNGSEONG YEO, CJK UNIFIED IDEOGRAPH-4E28"}], "\u116e\u1167\u4e28": [{"c": "\u118c", "n": "HANGUL JUNGSEONG U-YE"}], "\u118d": [{"c": "\u116e\u116e", "n": "HANGUL JUNGSEONG U, HANGUL JUNGSEONG U"}], "\u116e\u116e": [{"c": "\u118d", "n": "HANGUL JUNGSEONG U-U"}], "\u1171": [{"c": "\u116e\u4e28", "n": "HANGUL JUNGSEONG U, CJK UNIFIED IDEOGRAPH-4E28"}], "\u116e\u4e28": [{"c": "\u1171", "n": "HANGUL JUNGSEONG WI"}, {"c": "\u315f", "n": "HANGUL LETTER WI"}], "\u315f": [{"c": "\u116e\u4e28", "n": "HANGUL JUNGSEONG U, CJK UNIFIED IDEOGRAPH-4E28"}], "\ud7b6": [{"c": "\u116e\u4e28\u4e28", "n": "HANGUL JUNGSEONG U, CJK UNIFIED IDEOGRAPH-4E28, CJK UNIFIED IDEOGRAPH-4E28"}], "\u116e\u4e28\u4e28": [{"c": "\ud7b6", "n": "HANGUL JUNGSEONG U-I-I"}], "\u3160": [{"c": "\u1172", "n": "HANGUL JUNGSEONG YU"}], "\u1172": [{"c": "\u3160", "n": "HANGUL LETTER YU"}], "\u118e": [{"c": "\u1172\u1161", "n": "HANGUL JUNGSEONG YU, HANGUL JUNGSEONG A"}], "\u1172\u1161": [{"c": "\u118e", "n": "HANGUL JUNGSEONG YU-A"}], "\ud7b7": [{"c": "\u1172\u1161\u4e28", "n": "HANGUL JUNGSEONG YU, HANGUL JUNGSEONG A, CJK UNIFIED IDEOGRAPH-4E28"}], "\u1172\u1161\u4e28": [{"c": "\ud7b7", "n": "HANGUL JUNGSEONG YU-AE"}], "\u118f": [{"c": "\u1172\u1165", "n": "HANGUL JUNGSEONG YU, HANGUL JUNGSEONG EO"}], "\u1172\u1165": [{"c": "\u118f", "n": "HANGUL JUNGSEONG YU-EO"}], "\u1190": [{"c": "\u1172\u1165\u4e28", "n": "HANGUL JUNGSEONG YU, HANGUL JUNGSEONG EO, CJK UNIFIED IDEOGRAPH-4E28"}], "\u1172\u1165\u4e28": [{"c": "\u1190", "n": "HANGUL JUNGSEONG YU-E"}], "\u1191": [{"c": "\u1172\u1167", "n": "HANGUL JUNGSEONG YU, HANGUL JUNGSEONG YEO"}], "\u1172\u1167": [{"c": "\u1191", "n": "HANGUL JUNGSEONG YU-YEO"}, {"c": "\u318a", "n": "HANGUL LETTER YU-YEO"}], "\u318a": [{"c": "\u1172\u1167", "n": "HANGUL JUNGSEONG YU, HANGUL JUNGSEONG YEO"}], "\u1192": [{"c": "\u1172\u1167\u4e28", "n": "HANGUL JUNGSEONG YU, HANGUL JUNGSEONG YEO, CJK UNIFIED IDEOGRAPH-4E28"}], "\u1172\u1167\u4e28": [{"c": "\u1192", "n": "HANGUL JUNGSEONG YU-YE"}, {"c": "\u318b", "n": "HANGUL LETTER YU-YE"}], "\u318b": [{"c": "\u1172\u1167\u4e28", "n": "HANGUL JUNGSEONG YU, HANGUL JUNGSEONG YEO, CJK UNIFIED IDEOGRAPH-4E28"}], "\ud7b8": [{"c": "\u1172\u1169", "n": "HANGUL JUNGSEONG YU, HANGUL JUNGSEONG O"}], "\u1172\u1169": [{"c": "\ud7b8", "n": "HANGUL JUNGSEONG YU-O"}], "\u1193": [{"c": "\u1172\u116e", "n": "HANGUL JUNGSEONG YU, HANGUL JUNGSEONG U"}], "\u1172\u116e": [{"c": "\u1193", "n": "HANGUL JUNGSEONG YU-U"}], "\u1194": [{"c": "\u1172\u4e28", "n": "HANGUL JUNGSEONG YU, CJK UNIFIED IDEOGRAPH-4E28"}], "\u1172\u4e28": [{"c": "\u1194", "n": "HANGUL JUNGSEONG YU-I"}, {"c": "\u318c", "n": "HANGUL LETTER YU-I"}], "\u318c": [{"c": "\u1172\u4e28", "n": "HANGUL JUNGSEONG YU, CJK UNIFIED IDEOGRAPH-4E28"}], "\u318d": [{"c": "\u119e", "n": "HANGUL JUNGSEONG ARAEA"}], "\u119e": [{"c": "\u318d", "n": "HANGUL LETTER ARAEA"}], "\ud7c5": [{"c": "\u119e\u1161", "n": "HANGUL JUNGSEONG ARAEA, HANGUL JUNGSEONG A"}], "\u119e\u1161": [{"c": "\ud7c5", "n": "HANGUL JUNGSEONG ARAEA-A"}], "\u119f": [{"c": "\u119e\u1165", "n": "HANGUL JUNGSEONG ARAEA, HANGUL JUNGSEONG EO"}], "\u119e\u1165": [{"c": "\u119f", "n": "HANGUL JUNGSEONG ARAEA-EO"}], "\ud7c6": [{"c": "\u119e\u1165\u4e28", "n": "HANGUL JUNGSEONG ARAEA, HANGUL JUNGSEONG EO, CJK UNIFIED IDEOGRAPH-4E28"}], "\u119e\u1165\u4e28": [{"c": "\ud7c6", "n": "HANGUL JUNGSEONG ARAEA-E"}], "\u11a0": [{"c": "\u119e\u116e", "n": "HANGUL JUNGSEONG ARAEA, HANGUL JUNGSEONG U"}], "\u119e\u116e": [{"c": "\u11a0", "n": "HANGUL JUNGSEONG ARAEA-U"}], "\u11a2": [{"c": "\u119e\u119e", "n": "HANGUL JUNGSEONG ARAEA, HANGUL JUNGSEONG ARAEA"}], "\u119e\u119e": [{"c": "\u11a2", "n": "HANGUL JUNGSEONG SSANGARAEA"}], "\u11a1": [{"c": "\u119e\u4e28", "n": "HANGUL JUNGSEONG ARAEA, CJK UNIFIED IDEOGRAPH-4E28"}], "\u119e\u4e28": [{"c": "\u11a1", "n": "HANGUL JUNGSEONG ARAEA-I"}, {"c": "\u318e", "n": "HANGUL LETTER ARAEAE"}], "\u318e": [{"c": "\u119e\u4e28", "n": "HANGUL JUNGSEONG ARAEA, CJK UNIFIED IDEOGRAPH-4E28"}], "\u30d8": [{"c": "\u3078", "n": "HIRAGANA LETTER HE"}], "\u3078": [{"c": "\u30d8", "n": "KATAKANA LETTER HE"}], "\u2341": [{"c": "\u303c", "n": "MASU MARK"}], "\u303c": [{"c": "\u2341", "n": "APL FUNCTIONAL SYMBOL QUAD SLASH"}, {"c": "\u29c4", "n": "SQUARED RISING DIAGONAL SLASH"}], "\u29c4": [{"c": "\u303c", "n": "MASU MARK"}], "\ua49e": [{"c": "\ua04a", "n": "YI SYLLABLE PUT"}], "\ua04a": [{"c": "\ua49e", "n": "YI RADICAL PUT"}], "\ua4ac": [{"c": "\ua050", "n": "YI SYLLABLE PYT"}], "\ua050": [{"c": "\ua4ac", "n": "YI RADICAL PYT"}], "\ua49c": [{"c": "\ua0c0", "n": "YI SYLLABLE MOP"}], "\ua0c0": [{"c": "\ua49c", "n": "YI RADICAL MOP"}], "\ua4a8": [{"c": "\ua132", "n": "YI SYLLABLE TU"}], "\ua132": [{"c": "\ua4a8", "n": "YI RADICAL TU"}], "\ua4bf": [{"c": "\ua259", "n": "YI SYLLABLE HXOP"}], "\ua259": [{"c": "\ua4bf", "n": "YI RADICAL HXOP"}], "\ua4be": [{"c": "\ua2b1", "n": "YI SYLLABLE CIP"}], "\ua2b1": [{"c": "\ua4be", "n": "YI RADICAL CIP"}], "\ua494": [{"c": "\ua2cd", "n": "YI SYLLABLE CYP"}], "\ua2cd": [{"c": "\ua494", "n": "YI RADICAL CYP"}], "\ua4c0": [{"c": "\ua3ab", "n": "YI SYLLABLE SHAT"}], "\ua3ab": [{"c": "\ua4c0", "n": "YI RADICAL SHAT"}], "\ua4c2": [{"c": "\ua3b5", "n": "YI SYLLABLE SHOP"}], "\ua3b5": [{"c": "\ua4c2", "n": "YI RADICAL SHOP"}], "\ua4ba": [{"c": "\ua3bf", "n": "YI SYLLABLE SHUR"}], "\ua3bf": [{"c": "\ua4ba", "n": "YI RADICAL SHUR"}], "\ua4b0": [{"c": "\ua3c2", "n": "YI SYLLABLE SHY"}], "\ua3c2": [{"c": "\ua4b0", "n": "YI RADICAL SHY"}], "\ua4a7": [{"c": "\ua458", "n": "YI SYLLABLE NYOP"}], "\ua458": [{"c": "\ua4a7", "n": "YI RADICAL NYOP"}], "\u22a5": [{"c": "\ua4d5", "n": "LISU LETTER THA"}], "\ua4d5": [{"c": "\u22a5", "n": "UP TACK"}, {"c": "\u27c2", "n": "PERPENDICULAR"}, {"c": "\ud834\ude1c", "n": "GREEK VOCAL NOTATION SYMBOL-54"}, {"c": "\ua7b1", "n": "LATIN CAPITAL LETTER TURNED T"}], "\u27c2": [{"c": "\ua4d5", "n": "LISU LETTER THA"}], "\ud834\ude1c": [{"c": "\ua4d5", "n": "LISU LETTER THA"}], "\ua7b1": [{"c": "\ua4d5", "n": "LISU LETTER THA"}], "\ua79e": [{"c": "\ua4e4", "n": "LISU LETTER ZA"}], "\ua4e4": [{"c": "\ua79e", "n": "LATIN CAPITAL LETTER VOLAPUK UE"}], "\u2141": [{"c": "\ua4e8", "n": "LISU LETTER HHA"}], "\ua4e8": [{"c": "\u2141", "n": "TURNED SANS-SERIF CAPITAL G"}], "\u2142": [{"c": "\ua4f6", "n": "LISU LETTER UH"}], "\ua4f6": [{"c": "\u2142", "n": "TURNED SANS-SERIF CAPITAL L"}, {"c": "\ud834\ude15", "n": "GREEK VOCAL NOTATION SYMBOL-22"}, {"c": "\ud834\ude2b", "n": "GREEK INSTRUMENTAL NOTATION SYMBOL-24"}, {"c": "\ud81b\udf26", "n": "MIAO LETTER HA"}, {"c": "\ud801\udc11", "n": "DESERET CAPITAL LETTER PEE"}], "\ud834\ude15": [{"c": "\ua4f6", "n": "LISU LETTER UH"}], "\ud834\ude2b": [{"c": "\ua4f6", "n": "LISU LETTER UH"}], "\ud81b\udf26": [{"c": "\ua4f6", "n": "LISU LETTER UH"}], "\ud801\udc11": [{"c": "\ua4f6", "n": "LISU LETTER UH"}], "\u2143": [{"c": "\ud81b\udf00", "n": "MIAO LETTER PA"}], "\ud81b\udf00": [{"c": "\u2143", "n": "REVERSED SANS-SERIF CAPITAL L"}], "\ud806\udee6": [{"c": "\ud806\udee5\ud806\udeef", "n": "PAU CIN HAU RISING TONE LONG, PAU CIN HAU MID-LEVEL TONE"}], "\ud806\udee5\ud806\udeef": [{"c": "\ud806\udee6", "n": "PAU CIN HAU RISING TONE"}], "\ud806\udee8": [{"c": "\ud806\udee5\ud806\udee5", "n": "PAU CIN HAU RISING TONE LONG, PAU CIN HAU RISING TONE LONG"}], "\ud806\udee5\ud806\udee5": [{"c": "\ud806\udee8", "n": "PAU CIN HAU RISING TONE LONG FINAL"}], "\ud806\udee9": [{"c": "\ud806\udee5\ud806\udee5\ud806\udeef", "n": "PAU CIN HAU RISING TONE LONG, PAU CIN HAU RISING TONE LONG, PAU CIN HAU MID-LEVEL TONE"}], "\ud806\udee5\ud806\udee5\ud806\udeef": [{"c": "\ud806\udee9", "n": "PAU CIN HAU RISING TONE FINAL"}], "\ud806\udeea": [{"c": "\ud806\udee5\ud806\udee5\ud806\udef0", "n": "PAU CIN HAU RISING TONE LONG, PAU CIN HAU RISING TONE LONG, PAU CIN HAU GLOTTAL STOP VARIANT"}], "\ud806\udee5\ud806\udee5\ud806\udef0": [{"c": "\ud806\udeea", "n": "PAU CIN HAU SANDHI GLOTTAL STOP FINAL"}], "\ud806\udee7": [{"c": "\ud806\udee5\ud806\udef0", "n": "PAU CIN HAU RISING TONE LONG, PAU CIN HAU GLOTTAL STOP VARIANT"}], "\ud806\udee5\ud806\udef0": [{"c": "\ud806\udee7", "n": "PAU CIN HAU SANDHI GLOTTAL STOP"}], "\ud806\udef4": [{"c": "\ud806\udef3\ud806\udeef", "n": "PAU CIN HAU LOW-FALLING TONE LONG, PAU CIN HAU MID-LEVEL TONE"}], "\ud806\udef3\ud806\udeef": [{"c": "\ud806\udef4", "n": "PAU CIN HAU LOW-FALLING TONE"}], "\ud806\udef6": [{"c": "\ud806\udef3\ud806\udef3", "n": "PAU CIN HAU LOW-FALLING TONE LONG, PAU CIN HAU LOW-FALLING TONE LONG"}], "\ud806\udef3\ud806\udef3": [{"c": "\ud806\udef6", "n": "PAU CIN HAU LOW-FALLING TONE LONG FINAL"}], "\ud806\udef7": [{"c": "\ud806\udef3\ud806\udef3\ud806\udeef", "n": "PAU CIN HAU LOW-FALLING TONE LONG, PAU CIN HAU LOW-FALLING TONE LONG, PAU CIN HAU MID-LEVEL TONE"}], "\ud806\udef3\ud806\udef3\ud806\udeef": [{"c": "\ud806\udef7", "n": "PAU CIN HAU LOW-FALLING TONE FINAL"}], "\ud806\udef8": [{"c": "\ud806\udef3\ud806\udef3\ud806\udef0", "n": "PAU CIN HAU LOW-FALLING TONE LONG, PAU CIN HAU LOW-FALLING TONE LONG, PAU CIN HAU GLOTTAL STOP VARIANT"}], "\ud806\udef3\ud806\udef3\ud806\udef0": [{"c": "\ud806\udef8", "n": "PAU CIN HAU GLOTTAL STOP FINAL"}], "\ud806\udef5": [{"c": "\ud806\udef3\ud806\udef0", "n": "PAU CIN HAU LOW-FALLING TONE LONG, PAU CIN HAU GLOTTAL STOP VARIANT"}], "\ud806\udef3\ud806\udef0": [{"c": "\ud806\udef5", "n": "PAU CIN HAU GLOTTAL STOP"}], "\ud806\udeec": [{"c": "\ud806\udeeb\ud806\udeef", "n": "PAU CIN HAU SANDHI TONE LONG, PAU CIN HAU MID-LEVEL TONE"}], "\ud806\udeeb\ud806\udeef": [{"c": "\ud806\udeec", "n": "PAU CIN HAU SANDHI TONE"}], "\ud806\udeed": [{"c": "\ud806\udeeb\ud806\udeeb", "n": "PAU CIN HAU SANDHI TONE LONG, PAU CIN HAU SANDHI TONE LONG"}], "\ud806\udeeb\ud806\udeeb": [{"c": "\ud806\udeed", "n": "PAU CIN HAU SANDHI TONE LONG FINAL"}], "\ud806\udeee": [{"c": "\ud806\udeeb\ud806\udeeb\ud806\udeef", "n": "PAU CIN HAU SANDHI TONE LONG, PAU CIN HAU SANDHI TONE LONG, PAU CIN HAU MID-LEVEL TONE"}], "\ud806\udeeb\ud806\udeeb\ud806\udeef": [{"c": "\ud806\udeee", "n": "PAU CIN HAU SANDHI TONE FINAL"}], "\u2295": [{"c": "\ud800\udea8", "n": "CARIAN LETTER Q"}], "\ud800\udea8": [{"c": "\u2295", "n": "CIRCLED PLUS"}, {"c": "\u2a01", "n": "N-ARY CIRCLED PLUS OPERATOR"}, {"c": "\ud83d\udf28", "n": "ALCHEMICAL SYMBOL FOR VERDIGRIS"}, {"c": "\ua69a", "n": "CYRILLIC CAPITAL LETTER CROSSED O"}], "\u2a01": [{"c": "\ud800\udea8", "n": "CARIAN LETTER Q"}], "\ud83d\udf28": [{"c": "\ud800\udea8", "n": "CARIAN LETTER Q"}], "\ua69a": [{"c": "\ud800\udea8", "n": "CARIAN LETTER Q"}], "\u25bd": [{"c": "\ud800\udebc", "n": "CARIAN LETTER K"}], "\ud800\udebc": [{"c": "\u25bd", "n": "WHITE DOWN-POINTING TRIANGLE"}, {"c": "\ud834\ude14", "n": "GREEK VOCAL NOTATION SYMBOL-21"}, {"c": "\ud83d\udf04", "n": "ALCHEMICAL SYMBOL FOR WATER"}], "\ud834\ude14": [{"c": "\ud800\udebc", "n": "CARIAN LETTER K"}], "\ud83d\udf04": [{"c": "\ud800\udebc", "n": "CARIAN LETTER K"}], "\u29d6": [{"c": "\ud800\udec0", "n": "CARIAN LETTER G"}], "\ud800\udec0": [{"c": "\u29d6", "n": "WHITE HOURGLASS"}], "\ua79b": [{"c": "\ud801\udc3a", "n": "DESERET SMALL LETTER BEE"}], "\ud801\udc3a": [{"c": "\ua79b", "n": "LATIN SMALL LETTER VOLAPUK AE"}], "\ua79a": [{"c": "\ud801\udc12", "n": "DESERET CAPITAL LETTER BEE"}], "\ud801\udc12": [{"c": "\ua79a", "n": "LATIN CAPITAL LETTER VOLAPUK AE"}], "\ud801\udca0": [{"c": "\ud801\udc86", "n": "OSMANYA LETTER DEEL"}], "\ud801\udc86": [{"c": "\ud801\udca0", "n": "OSMANYA DIGIT ZERO"}], "\ud800\udfd1": [{"c": "\ud800\udf82", "n": "UGARITIC LETTER GAMLA"}], "\ud800\udf82": [{"c": "\ud800\udfd1", "n": "OLD PERSIAN NUMBER ONE"}], "\ud800\udfd3": [{"c": "\ud800\udf93", "n": "UGARITIC LETTER AIN"}], "\ud800\udf93": [{"c": "\ud800\udfd3", "n": "OLD PERSIAN NUMBER TEN"}], "\ud808\udc38": [{"c": "\ud800\udf9a", "n": "UGARITIC LETTER TO"}], "\ud800\udf9a": [{"c": "\ud808\udc38", "n": "CUNEIFORM SIGN ASH"}], "\u2625": [{"c": "\u200e\ud802\udd9e\u200e", "n": "MEROITIC HIEROGLYPHIC SYMBOL VIDJ"}], "\u200e\ud802\udd9e\u200e": [{"c": "\u2625", "n": "ANKH"}, {"c": "\ud80c\udef9", "n": "EGYPTIAN HIEROGLYPH S034"}], "\ud80c\udef9": [{"c": "\u200e\ud802\udd9e\u200e", "n": "MEROITIC HIEROGLYPHIC SYMBOL VIDJ"}], "\u3039": [{"c": "\u5344", "n": "CJK UNIFIED IDEOGRAPH-5344"}], "\u5344": [{"c": "\u3039", "n": "HANGZHOU NUMERAL TWENTY"}], "\uf967": [{"c": "\u4e0d", "n": "CJK UNIFIED IDEOGRAPH-4E0D"}], "\u4e0d": [{"c": "\uf967", "n": "CJK COMPATIBILITY IDEOGRAPH-F967"}], "\ud87e\udc00": [{"c": "\u4e3d", "n": "CJK UNIFIED IDEOGRAPH-4E3D"}], "\u4e3d": [{"c": "\ud87e\udc00", "n": "CJK COMPATIBILITY IDEOGRAPH-2F800"}], "\ufa70": [{"c": "\u4e26", "n": "CJK UNIFIED IDEOGRAPH-4E26"}], "\u4e26": [{"c": "\ufa70", "n": "CJK COMPATIBILITY IDEOGRAPH-FA70"}], "\u239c": [{"c": "\u4e28", "n": "CJK UNIFIED IDEOGRAPH-4E28"}], "\u4e28": [{"c": "\u239c", "n": "LEFT PARENTHESIS EXTENSION"}, {"c": "\u239f", "n": "RIGHT PARENTHESIS EXTENSION"}, {"c": "\u23a2", "n": "LEFT SQUARE BRACKET EXTENSION"}, {"c": "\u23a5", "n": "RIGHT SQUARE BRACKET EXTENSION"}, {"c": "\u23aa", "n": "CURLY BRACKET EXTENSION"}, {"c": "\u23ae", "n": "INTEGRAL EXTENSION"}, {"c": "\u31d1", "n": "CJK STROKE S"}, {"c": "\u1175", "n": "HANGUL JUNGSEONG I"}, {"c": "\u3163", "n": "HANGUL LETTER I"}, {"c": "\u2f01", "n": "KANGXI RADICAL LINE"}], "\u239f": [{"c": "\u4e28", "n": "CJK UNIFIED IDEOGRAPH-4E28"}], "\u23a2": [{"c": "\u4e28", "n": "CJK UNIFIED IDEOGRAPH-4E28"}], "\u23a5": [{"c": "\u4e28", "n": "CJK UNIFIED IDEOGRAPH-4E28"}], "\u23aa": [{"c": "\u4e28", "n": "CJK UNIFIED IDEOGRAPH-4E28"}], "\u23ae": [{"c": "\u4e28", "n": "CJK UNIFIED IDEOGRAPH-4E28"}], "\u31d1": [{"c": "\u4e28", "n": "CJK UNIFIED IDEOGRAPH-4E28"}], "\u1175": [{"c": "\u4e28", "n": "CJK UNIFIED IDEOGRAPH-4E28"}], "\u3163": [{"c": "\u4e28", "n": "CJK UNIFIED IDEOGRAPH-4E28"}], "\u2f01": [{"c": "\u4e28", "n": "CJK UNIFIED IDEOGRAPH-4E28"}], "\u119c": [{"c": "\u4e28\u30fc", "n": "CJK UNIFIED IDEOGRAPH-4E28, KATAKANA-HIRAGANA PROLONGED SOUND MARK"}], "\u4e28\u30fc": [{"c": "\u119c", "n": "HANGUL JUNGSEONG I-EU"}], "\u1198": [{"c": "\u4e28\u1161", "n": "CJK UNIFIED IDEOGRAPH-4E28, HANGUL JUNGSEONG A"}], "\u4e28\u1161": [{"c": "\u1198", "n": "HANGUL JUNGSEONG I-A"}], "\u1199": [{"c": "\u4e28\u1163", "n": "CJK UNIFIED IDEOGRAPH-4E28, HANGUL JUNGSEONG YA"}], "\u4e28\u1163": [{"c": "\u1199", "n": "HANGUL JUNGSEONG I-YA"}], "\ud7bd": [{"c": "\u4e28\u1163\u1169", "n": "CJK UNIFIED IDEOGRAPH-4E28, HANGUL JUNGSEONG YA, HANGUL JUNGSEONG O"}], "\u4e28\u1163\u1169": [{"c": "\ud7bd", "n": "HANGUL JUNGSEONG I-YA-O"}], "\ud7be": [{"c": "\u4e28\u1163\u4e28", "n": "CJK UNIFIED IDEOGRAPH-4E28, HANGUL JUNGSEONG YA, CJK UNIFIED IDEOGRAPH-4E28"}], "\u4e28\u1163\u4e28": [{"c": "\ud7be", "n": "HANGUL JUNGSEONG I-YAE"}], "\ud7bf": [{"c": "\u4e28\u1167", "n": "CJK UNIFIED IDEOGRAPH-4E28, HANGUL JUNGSEONG YEO"}], "\u4e28\u1167": [{"c": "\ud7bf", "n": "HANGUL JUNGSEONG I-YEO"}], "\ud7c0": [{"c": "\u4e28\u1167\u4e28", "n": "CJK UNIFIED IDEOGRAPH-4E28, HANGUL JUNGSEONG YEO, CJK UNIFIED IDEOGRAPH-4E28"}], "\u4e28\u1167\u4e28": [{"c": "\ud7c0", "n": "HANGUL JUNGSEONG I-YE"}], "\u119a": [{"c": "\u4e28\u1169", "n": "CJK UNIFIED IDEOGRAPH-4E28, HANGUL JUNGSEONG O"}], "\u4e28\u1169": [{"c": "\u119a", "n": "HANGUL JUNGSEONG I-O"}], "\ud7c1": [{"c": "\u4e28\u1169\u4e28", "n": "CJK UNIFIED IDEOGRAPH-4E28, HANGUL JUNGSEONG O, CJK UNIFIED IDEOGRAPH-4E28"}], "\u4e28\u1169\u4e28": [{"c": "\ud7c1", "n": "HANGUL JUNGSEONG I-O-I"}], "\ud7c2": [{"c": "\u4e28\u116d", "n": "CJK UNIFIED IDEOGRAPH-4E28, HANGUL JUNGSEONG YO"}], "\u4e28\u116d": [{"c": "\ud7c2", "n": "HANGUL JUNGSEONG I-YO"}], "\u119b": [{"c": "\u4e28\u116e", "n": "CJK UNIFIED IDEOGRAPH-4E28, HANGUL JUNGSEONG U"}], "\u4e28\u116e": [{"c": "\u119b", "n": "HANGUL JUNGSEONG I-U"}], "\ud7c3": [{"c": "\u4e28\u1172", "n": "CJK UNIFIED IDEOGRAPH-4E28, HANGUL JUNGSEONG YU"}], "\u4e28\u1172": [{"c": "\ud7c3", "n": "HANGUL JUNGSEONG I-YU"}], "\u119d": [{"c": "\u4e28\u119e", "n": "CJK UNIFIED IDEOGRAPH-4E28, HANGUL JUNGSEONG ARAEA"}], "\u4e28\u119e": [{"c": "\u119d", "n": "HANGUL JUNGSEONG I-ARAEA"}], "\ud7c4": [{"c": "\u4e28\u4e28", "n": "CJK UNIFIED IDEOGRAPH-4E28, CJK UNIFIED IDEOGRAPH-4E28"}], "\u4e28\u4e28": [{"c": "\ud7c4", "n": "HANGUL JUNGSEONG I-I"}], "\uf905": [{"c": "\u4e32", "n": "CJK UNIFIED IDEOGRAPH-4E32"}], "\u4e32": [{"c": "\uf905", "n": "CJK COMPATIBILITY IDEOGRAPH-F905"}], "\ud87e\udc01": [{"c": "\u4e38", "n": "CJK UNIFIED IDEOGRAPH-4E38"}], "\u4e38": [{"c": "\ud87e\udc01", "n": "CJK COMPATIBILITY IDEOGRAPH-2F801"}], "\uf95e": [{"c": "\u4e39", "n": "CJK UNIFIED IDEOGRAPH-4E39"}], "\u4e39": [{"c": "\uf95e", "n": "CJK COMPATIBILITY IDEOGRAPH-F95E"}], "\ud87e\udc02": [{"c": "\u4e41", "n": "CJK UNIFIED IDEOGRAPH-4E41"}], "\u4e41": [{"c": "\ud87e\udc02", "n": "CJK COMPATIBILITY IDEOGRAPH-2F802"}], "\u31e0": [{"c": "\u4e59", "n": "CJK UNIFIED IDEOGRAPH-4E59"}], "\u4e59": [{"c": "\u31e0", "n": "CJK STROKE HXWG"}, {"c": "\u2f04", "n": "KANGXI RADICAL SECOND"}], "\u2f04": [{"c": "\u4e59", "n": "CJK UNIFIED IDEOGRAPH-4E59"}], "\u31df": [{"c": "\u4e5a", "n": "CJK UNIFIED IDEOGRAPH-4E5A"}], "\u4e5a": [{"c": "\u31df", "n": "CJK STROKE SWG"}, {"c": "\u2e83", "n": "CJK RADICAL SECOND TWO"}], "\u2e83": [{"c": "\u4e5a", "n": "CJK UNIFIED IDEOGRAPH-4E5A"}], "\u31d6": [{"c": "\u4e5b", "n": "CJK UNIFIED IDEOGRAPH-4E5B"}], "\u4e5b": [{"c": "\u31d6", "n": "CJK STROKE HG"}, {"c": "\u2e82", "n": "CJK RADICAL SECOND ONE"}], "\u2e82": [{"c": "\u4e5b", "n": "CJK UNIFIED IDEOGRAPH-4E5B"}], "\u2ef2": [{"c": "\u4e80", "n": "CJK UNIFIED IDEOGRAPH-4E80"}], "\u4e80": [{"c": "\u2ef2", "n": "CJK RADICAL J-SIMPLIFIED TURTLE"}], "\uf91b": [{"c": "\u4e82", "n": "CJK UNIFIED IDEOGRAPH-4E82"}], "\u4e82": [{"c": "\uf91b", "n": "CJK COMPATIBILITY IDEOGRAPH-F91B"}], "\u31da": [{"c": "\u4e85", "n": "CJK UNIFIED IDEOGRAPH-4E85"}], "\u4e85": [{"c": "\u31da", "n": "CJK STROKE SG"}, {"c": "\u2f05", "n": "KANGXI RADICAL HOOK"}], "\u2f05": [{"c": "\u4e85", "n": "CJK UNIFIED IDEOGRAPH-4E85"}], "\uf9ba": [{"c": "\u4e86", "n": "CJK UNIFIED IDEOGRAPH-4E86"}], "\u4e86": [{"c": "\uf9ba", "n": "CJK COMPATIBILITY IDEOGRAPH-F9BA"}], "\u30cb": [{"c": "\u4e8c", "n": "CJK UNIFIED IDEOGRAPH-4E8C"}], "\u4e8c": [{"c": "\u30cb", "n": "KATAKANA LETTER NI"}, {"c": "\u2f06", "n": "KANGXI RADICAL TWO"}], "\u2f06": [{"c": "\u4e8c", "n": "CJK UNIFIED IDEOGRAPH-4E8C"}], "\ud87e\udc03": [{"c": "\ud840\udd22", "n": "CJK UNIFIED IDEOGRAPH-20122"}], "\ud840\udd22": [{"c": "\ud87e\udc03", "n": "CJK COMPATIBILITY IDEOGRAPH-2F803"}], "\u2f07": [{"c": "\u4ea0", "n": "CJK UNIFIED IDEOGRAPH-4EA0"}], "\u4ea0": [{"c": "\u2f07", "n": "KANGXI RADICAL LID"}], "\uf977": [{"c": "\u4eae", "n": "CJK UNIFIED IDEOGRAPH-4EAE"}], "\u4eae": [{"c": "\uf977", "n": "CJK COMPATIBILITY IDEOGRAPH-F977"}], "\u2f08": [{"c": "\u4eba", "n": "CJK UNIFIED IDEOGRAPH-4EBA"}], "\u4eba": [{"c": "\u2f08", "n": "KANGXI RADICAL MAN"}], "\u30a4": [{"c": "\u4ebb", "n": "CJK UNIFIED IDEOGRAPH-4EBB"}], "\u4ebb": [{"c": "\u30a4", "n": "KATAKANA LETTER I"}, {"c": "\u2e85", "n": "CJK RADICAL PERSON"}], "\u2e85": [{"c": "\u4ebb", "n": "CJK UNIFIED IDEOGRAPH-4EBB"}], "\uf9fd": [{"c": "\u4ec0", "n": "CJK UNIFIED IDEOGRAPH-4EC0"}], "\u4ec0": [{"c": "\uf9fd", "n": "CJK COMPATIBILITY IDEOGRAPH-F9FD"}], "\ud87e\udc19": [{"c": "\u4ecc", "n": "CJK UNIFIED IDEOGRAPH-4ECC"}], "\u4ecc": [{"c": "\ud87e\udc19", "n": "CJK COMPATIBILITY IDEOGRAPH-2F819"}], "\uf9a8": [{"c": "\u4ee4", "n": "CJK UNIFIED IDEOGRAPH-4EE4"}], "\u4ee4": [{"c": "\uf9a8", "n": "CJK COMPATIBILITY IDEOGRAPH-F9A8"}], "\ud87e\udc04": [{"c": "\u4f60", "n": "CJK UNIFIED IDEOGRAPH-4F60"}], "\u4f60": [{"c": "\ud87e\udc04", "n": "CJK COMPATIBILITY IDEOGRAPH-2F804"}], "\u5002": [{"c": "\u4f75", "n": "CJK UNIFIED IDEOGRAPH-4F75"}], "\u4f75": [{"c": "\u5002", "n": "CJK UNIFIED IDEOGRAPH-5002"}, {"c": "\ud87e\udc07", "n": "CJK COMPATIBILITY IDEOGRAPH-2F807"}], "\ud87e\udc07": [{"c": "\u4f75", "n": "CJK UNIFIED IDEOGRAPH-4F75"}], "\ufa73": [{"c": "\u4f80", "n": "CJK UNIFIED IDEOGRAPH-4F80"}], "\u4f80": [{"c": "\ufa73", "n": "CJK COMPATIBILITY IDEOGRAPH-FA73"}], "\uf92d": [{"c": "\u4f86", "n": "CJK UNIFIED IDEOGRAPH-4F86"}], "\u4f86": [{"c": "\uf92d", "n": "CJK COMPATIBILITY IDEOGRAPH-F92D"}], "\uf9b5": [{"c": "\u4f8b", "n": "CJK UNIFIED IDEOGRAPH-4F8B"}], "\u4f8b": [{"c": "\uf9b5", "n": "CJK COMPATIBILITY IDEOGRAPH-F9B5"}], "\ufa30": [{"c": "\u4fae", "n": "CJK UNIFIED IDEOGRAPH-4FAE"}], "\u4fae": [{"c": "\ufa30", "n": "CJK COMPATIBILITY IDEOGRAPH-FA30"}, {"c": "\ud87e\udc05", "n": "CJK COMPATIBILITY IDEOGRAPH-2F805"}], "\ud87e\udc05": [{"c": "\u4fae", "n": "CJK UNIFIED IDEOGRAPH-4FAE"}], "\ud87e\udc06": [{"c": "\u4fbb", "n": "CJK UNIFIED IDEOGRAPH-4FBB"}], "\u4fbb": [{"c": "\ud87e\udc06", "n": "CJK COMPATIBILITY IDEOGRAPH-2F806"}], "\uf965": [{"c": "\u4fbf", "n": "CJK UNIFIED IDEOGRAPH-4FBF"}], "\u4fbf": [{"c": "\uf965", "n": "CJK COMPATIBILITY IDEOGRAPH-F965"}], "\u503c": [{"c": "\u5024", "n": "CJK UNIFIED IDEOGRAPH-5024"}], "\u5024": [{"c": "\u503c", "n": "CJK UNIFIED IDEOGRAPH-503C"}], "\uf9d4": [{"c": "\u502b", "n": "CJK UNIFIED IDEOGRAPH-502B"}], "\u502b": [{"c": "\uf9d4", "n": "CJK COMPATIBILITY IDEOGRAPH-F9D4"}], "\ud87e\udc08": [{"c": "\u507a", "n": "CJK UNIFIED IDEOGRAPH-507A"}], "\u507a": [{"c": "\ud87e\udc08", "n": "CJK COMPATIBILITY IDEOGRAPH-2F808"}], "\ud87e\udc09": [{"c": "\u5099", "n": "CJK UNIFIED IDEOGRAPH-5099"}], "\u5099": [{"c": "\ud87e\udc09", "n": "CJK COMPATIBILITY IDEOGRAPH-2F809"}], "\ud87e\udc0b": [{"c": "\u50cf", "n": "CJK UNIFIED IDEOGRAPH-50CF"}], "\u50cf": [{"c": "\ud87e\udc0b", "n": "CJK COMPATIBILITY IDEOGRAPH-2F80B"}], "\uf9bb": [{"c": "\u50da", "n": "CJK UNIFIED IDEOGRAPH-50DA"}], "\u50da": [{"c": "\uf9bb", "n": "CJK COMPATIBILITY IDEOGRAPH-F9BB"}], "\ufa31": [{"c": "\u50e7", "n": "CJK UNIFIED IDEOGRAPH-50E7"}], "\u50e7": [{"c": "\ufa31", "n": "CJK COMPATIBILITY IDEOGRAPH-FA31"}, {"c": "\ud87e\udc0a", "n": "CJK COMPATIBILITY IDEOGRAPH-2F80A"}], "\ud87e\udc0a": [{"c": "\u50e7", "n": "CJK UNIFIED IDEOGRAPH-50E7"}], "\ud87e\udc0c": [{"c": "\u349e", "n": "CJK UNIFIED IDEOGRAPH-349E"}], "\u349e": [{"c": "\ud87e\udc0c", "n": "CJK COMPATIBILITY IDEOGRAPH-2F80C"}], "\u2f09": [{"c": "\u513f", "n": "CJK UNIFIED IDEOGRAPH-513F"}], "\u513f": [{"c": "\u2f09", "n": "KANGXI RADICAL LEGS"}], "\ufa0c": [{"c": "\u5140", "n": "CJK UNIFIED IDEOGRAPH-5140"}], "\u5140": [{"c": "\ufa0c", "n": "CJK COMPATIBILITY IDEOGRAPH-FA0C"}, {"c": "\u2e8e", "n": "CJK RADICAL LAME ONE"}], "\u2e8e": [{"c": "\u5140", "n": "CJK UNIFIED IDEOGRAPH-5140"}], "\ufa74": [{"c": "\u5145", "n": "CJK UNIFIED IDEOGRAPH-5145"}], "\u5145": [{"c": "\ufa74", "n": "CJK COMPATIBILITY IDEOGRAPH-FA74"}], "\ufa32": [{"c": "\u514d", "n": "CJK UNIFIED IDEOGRAPH-514D"}], "\u514d": [{"c": "\ufa32", "n": "CJK COMPATIBILITY IDEOGRAPH-FA32"}, {"c": "\ud87e\udc0e", "n": "CJK COMPATIBILITY IDEOGRAPH-2F80E"}], "\ud87e\udc0e": [{"c": "\u514d", "n": "CJK UNIFIED IDEOGRAPH-514D"}], "\ud87e\udc0f": [{"c": "\u5154", "n": "CJK UNIFIED IDEOGRAPH-5154"}], "\u5154": [{"c": "\ud87e\udc0f", "n": "CJK COMPATIBILITY IDEOGRAPH-2F80F"}], "\ud87e\udc10": [{"c": "\u5164", "n": "CJK UNIFIED IDEOGRAPH-5164"}], "\u5164": [{"c": "\ud87e\udc10", "n": "CJK COMPATIBILITY IDEOGRAPH-2F810"}], "\u2f0a": [{"c": "\u5165", "n": "CJK UNIFIED IDEOGRAPH-5165"}], "\u5165": [{"c": "\u2f0a", "n": "KANGXI RADICAL ENTER"}], "\ud87e\udc14": [{"c": "\u5167", "n": "CJK UNIFIED IDEOGRAPH-5167"}], "\u5167": [{"c": "\ud87e\udc14", "n": "CJK COMPATIBILITY IDEOGRAPH-2F814"}], "\ufa72": [{"c": "\u5168", "n": "CJK UNIFIED IDEOGRAPH-5168"}], "\u5168": [{"c": "\ufa72", "n": "CJK COMPATIBILITY IDEOGRAPH-FA72"}], "\uf978": [{"c": "\u5169", "n": "CJK UNIFIED IDEOGRAPH-5169"}], "\u5169": [{"c": "\uf978", "n": "CJK COMPATIBILITY IDEOGRAPH-F978"}], "\u30cf": [{"c": "\u516b", "n": "CJK UNIFIED IDEOGRAPH-516B"}], "\u516b": [{"c": "\u30cf", "n": "KATAKANA LETTER HA"}, {"c": "\u2f0b", "n": "KANGXI RADICAL EIGHT"}], "\u2f0b": [{"c": "\u516b", "n": "CJK UNIFIED IDEOGRAPH-516B"}], "\uf9d1": [{"c": "\u516d", "n": "CJK UNIFIED IDEOGRAPH-516D"}], "\u516d": [{"c": "\uf9d1", "n": "CJK COMPATIBILITY IDEOGRAPH-F9D1"}], "\ud87e\udc11": [{"c": "\u5177", "n": "CJK UNIFIED IDEOGRAPH-5177"}], "\u5177": [{"c": "\ud87e\udc11", "n": "CJK COMPATIBILITY IDEOGRAPH-2F811"}], "\ud87e\udc12": [{"c": "\ud841\udd1c", "n": "CJK UNIFIED IDEOGRAPH-2051C"}], "\ud841\udd1c": [{"c": "\ud87e\udc12", "n": "CJK COMPATIBILITY IDEOGRAPH-2F812"}], "\ud87e\udd1b": [{"c": "\ud841\udd25", "n": "CJK UNIFIED IDEOGRAPH-20525"}], "\ud841\udd25": [{"c": "\ud87e\udd1b", "n": "CJK COMPATIBILITY IDEOGRAPH-2F91B"}], "\ufa75": [{"c": "\u5180", "n": "CJK UNIFIED IDEOGRAPH-5180"}], "\u5180": [{"c": "\ufa75", "n": "CJK COMPATIBILITY IDEOGRAPH-FA75"}], "\ud87e\udc13": [{"c": "\u34b9", "n": "CJK UNIFIED IDEOGRAPH-34B9"}], "\u34b9": [{"c": "\ud87e\udc13", "n": "CJK COMPATIBILITY IDEOGRAPH-2F813"}], "\u2f0c": [{"c": "\u5182", "n": "CJK UNIFIED IDEOGRAPH-5182"}], "\u5182": [{"c": "\u2f0c", "n": "KANGXI RADICAL DOWN BOX"}], "\ud87e\udc15": [{"c": "\u518d", "n": "CJK UNIFIED IDEOGRAPH-518D"}], "\u518d": [{"c": "\ud87e\udc15", "n": "CJK COMPATIBILITY IDEOGRAPH-2F815"}], "\ud87e\udc16": [{"c": "\ud841\udd4b", "n": "CJK UNIFIED IDEOGRAPH-2054B"}], "\ud841\udd4b": [{"c": "\ud87e\udc16", "n": "CJK COMPATIBILITY IDEOGRAPH-2F816"}], "\ud87e\udcd2": [{"c": "\u5192", "n": "CJK UNIFIED IDEOGRAPH-5192"}], "\u5192": [{"c": "\ud87e\udcd2", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8D2"}], "\ud87e\udcd3": [{"c": "\u5195", "n": "CJK UNIFIED IDEOGRAPH-5195"}], "\u5195": [{"c": "\ud87e\udcd3", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8D3"}], "\ud87e\uddca": [{"c": "\u34bb", "n": "CJK UNIFIED IDEOGRAPH-34BB"}], "\u34bb": [{"c": "\ud87e\uddca", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9CA"}], "\ud87e\udcd4": [{"c": "\u6700", "n": "CJK UNIFIED IDEOGRAPH-6700"}], "\u6700": [{"c": "\ud87e\udcd4", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8D4"}], "\u2f0d": [{"c": "\u5196", "n": "CJK UNIFIED IDEOGRAPH-5196"}], "\u5196": [{"c": "\u2f0d", "n": "KANGXI RADICAL COVER"}], "\ud87e\udc17": [{"c": "\u5197", "n": "CJK UNIFIED IDEOGRAPH-5197"}], "\u5197": [{"c": "\ud87e\udc17", "n": "CJK COMPATIBILITY IDEOGRAPH-2F817"}], "\ud87e\udc18": [{"c": "\u51a4", "n": "CJK UNIFIED IDEOGRAPH-51A4"}], "\u51a4": [{"c": "\ud87e\udc18", "n": "CJK COMPATIBILITY IDEOGRAPH-2F818"}], "\u2f0e": [{"c": "\u51ab", "n": "CJK UNIFIED IDEOGRAPH-51AB"}], "\u51ab": [{"c": "\u2f0e", "n": "KANGXI RADICAL ICE"}], "\ud87e\udc1a": [{"c": "\u51ac", "n": "CJK UNIFIED IDEOGRAPH-51AC"}], "\u51ac": [{"c": "\ud87e\udc1a", "n": "CJK COMPATIBILITY IDEOGRAPH-2F81A"}], "\ufa71": [{"c": "\u51b5", "n": "CJK UNIFIED IDEOGRAPH-51B5"}], "\u51b5": [{"c": "\ufa71", "n": "CJK COMPATIBILITY IDEOGRAPH-FA71"}, {"c": "\ud87e\udc1b", "n": "CJK COMPATIBILITY IDEOGRAPH-2F81B"}], "\ud87e\udc1b": [{"c": "\u51b5", "n": "CJK UNIFIED IDEOGRAPH-51B5"}], "\uf92e": [{"c": "\u51b7", "n": "CJK UNIFIED IDEOGRAPH-51B7"}], "\u51b7": [{"c": "\uf92e", "n": "CJK COMPATIBILITY IDEOGRAPH-F92E"}], "\uf979": [{"c": "\u51c9", "n": "CJK UNIFIED IDEOGRAPH-51C9"}], "\u51c9": [{"c": "\uf979", "n": "CJK COMPATIBILITY IDEOGRAPH-F979"}], "\uf955": [{"c": "\u51cc", "n": "CJK UNIFIED IDEOGRAPH-51CC"}], "\u51cc": [{"c": "\uf955", "n": "CJK COMPATIBILITY IDEOGRAPH-F955"}], "\uf954": [{"c": "\u51dc", "n": "CJK UNIFIED IDEOGRAPH-51DC"}], "\u51dc": [{"c": "\uf954", "n": "CJK COMPATIBILITY IDEOGRAPH-F954"}], "\ufa15": [{"c": "\u51de", "n": "CJK UNIFIED IDEOGRAPH-51DE"}], "\u51de": [{"c": "\ufa15", "n": "CJK COMPATIBILITY IDEOGRAPH-FA15"}], "\u2f0f": [{"c": "\u51e0", "n": "CJK UNIFIED IDEOGRAPH-51E0"}], "\u51e0": [{"c": "\u2f0f", "n": "KANGXI RADICAL TABLE"}], "\ud87e\udc0d": [{"c": "\ud841\ude3a", "n": "CJK UNIFIED IDEOGRAPH-2063A"}], "\ud841\ude3a": [{"c": "\ud87e\udc0d", "n": "CJK COMPATIBILITY IDEOGRAPH-2F80D"}], "\ud87e\udc1d": [{"c": "\u51f5", "n": "CJK UNIFIED IDEOGRAPH-51F5"}], "\u51f5": [{"c": "\ud87e\udc1d", "n": "CJK COMPATIBILITY IDEOGRAPH-2F81D"}, {"c": "\u2f10", "n": "KANGXI RADICAL OPEN BOX"}], "\u2f10": [{"c": "\u51f5", "n": "CJK UNIFIED IDEOGRAPH-51F5"}], "\u2f11": [{"c": "\u5200", "n": "CJK UNIFIED IDEOGRAPH-5200"}], "\u5200": [{"c": "\u2f11", "n": "KANGXI RADICAL KNIFE"}], "\u2e89": [{"c": "\u5202", "n": "CJK UNIFIED IDEOGRAPH-5202"}], "\u5202": [{"c": "\u2e89", "n": "CJK RADICAL KNIFE TWO"}], "\ud87e\udc1e": [{"c": "\u5203", "n": "CJK UNIFIED IDEOGRAPH-5203"}], "\u5203": [{"c": "\ud87e\udc1e", "n": "CJK COMPATIBILITY IDEOGRAPH-2F81E"}], "\ufa00": [{"c": "\u5207", "n": "CJK UNIFIED IDEOGRAPH-5207"}], "\u5207": [{"c": "\ufa00", "n": "CJK COMPATIBILITY IDEOGRAPH-FA00"}, {"c": "\ud87e\udc50", "n": "CJK COMPATIBILITY IDEOGRAPH-2F850"}], "\ud87e\udc50": [{"c": "\u5207", "n": "CJK UNIFIED IDEOGRAPH-5207"}], "\uf99c": [{"c": "\u5217", "n": "CJK UNIFIED IDEOGRAPH-5217"}], "\u5217": [{"c": "\uf99c", "n": "CJK COMPATIBILITY IDEOGRAPH-F99C"}], "\uf9dd": [{"c": "\u5229", "n": "CJK UNIFIED IDEOGRAPH-5229"}], "\u5229": [{"c": "\uf9dd", "n": "CJK COMPATIBILITY IDEOGRAPH-F9DD"}], "\ud87e\udc1f": [{"c": "\u34df", "n": "CJK UNIFIED IDEOGRAPH-34DF"}], "\u34df": [{"c": "\ud87e\udc1f", "n": "CJK COMPATIBILITY IDEOGRAPH-2F81F"}], "\uf9ff": [{"c": "\u523a", "n": "CJK UNIFIED IDEOGRAPH-523A"}], "\u523a": [{"c": "\uf9ff", "n": "CJK COMPATIBILITY IDEOGRAPH-F9FF"}], "\ud87e\udc20": [{"c": "\u523b", "n": "CJK UNIFIED IDEOGRAPH-523B"}], "\u523b": [{"c": "\ud87e\udc20", "n": "CJK COMPATIBILITY IDEOGRAPH-2F820"}], "\ud87e\udc21": [{"c": "\u5246", "n": "CJK UNIFIED IDEOGRAPH-5246"}], "\u5246": [{"c": "\ud87e\udc21", "n": "CJK COMPATIBILITY IDEOGRAPH-2F821"}], "\ud87e\udc22": [{"c": "\u5272", "n": "CJK UNIFIED IDEOGRAPH-5272"}], "\u5272": [{"c": "\ud87e\udc22", "n": "CJK COMPATIBILITY IDEOGRAPH-2F822"}], "\ud87e\udc23": [{"c": "\u5277", "n": "CJK UNIFIED IDEOGRAPH-5277"}], "\u5277": [{"c": "\ud87e\udc23", "n": "CJK COMPATIBILITY IDEOGRAPH-2F823"}], "\uf9c7": [{"c": "\u5289", "n": "CJK UNIFIED IDEOGRAPH-5289"}], "\u5289": [{"c": "\uf9c7", "n": "CJK COMPATIBILITY IDEOGRAPH-F9C7"}], "\ud87e\uddd9": [{"c": "\ud842\udc04", "n": "CJK UNIFIED IDEOGRAPH-20804"}], "\ud842\udc04": [{"c": "\ud87e\uddd9", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9D9"}], "\u30ab": [{"c": "\u529b", "n": "CJK UNIFIED IDEOGRAPH-529B"}], "\u529b": [{"c": "\u30ab", "n": "KATAKANA LETTER KA"}, {"c": "\uf98a", "n": "CJK COMPATIBILITY IDEOGRAPH-F98A"}, {"c": "\u2f12", "n": "KANGXI RADICAL POWER"}], "\uf98a": [{"c": "\u529b", "n": "CJK UNIFIED IDEOGRAPH-529B"}], "\u2f12": [{"c": "\u529b", "n": "CJK UNIFIED IDEOGRAPH-529B"}], "\uf99d": [{"c": "\u52a3", "n": "CJK UNIFIED IDEOGRAPH-52A3"}], "\u52a3": [{"c": "\uf99d", "n": "CJK COMPATIBILITY IDEOGRAPH-F99D"}], "\ud87e\udc24": [{"c": "\u3515", "n": "CJK UNIFIED IDEOGRAPH-3515"}], "\u3515": [{"c": "\ud87e\udc24", "n": "CJK COMPATIBILITY IDEOGRAPH-2F824"}], "\ud87e\udd92": [{"c": "\u52b3", "n": "CJK UNIFIED IDEOGRAPH-52B3"}], "\u52b3": [{"c": "\ud87e\udd92", "n": "CJK COMPATIBILITY IDEOGRAPH-2F992"}], "\ufa76": [{"c": "\u52c7", "n": "CJK UNIFIED IDEOGRAPH-52C7"}], "\u52c7": [{"c": "\ufa76", "n": "CJK COMPATIBILITY IDEOGRAPH-FA76"}, {"c": "\ud87e\udc25", "n": "CJK COMPATIBILITY IDEOGRAPH-2F825"}], "\ud87e\udc25": [{"c": "\u52c7", "n": "CJK UNIFIED IDEOGRAPH-52C7"}], "\ufa33": [{"c": "\u52c9", "n": "CJK UNIFIED IDEOGRAPH-52C9"}], "\u52c9": [{"c": "\ufa33", "n": "CJK COMPATIBILITY IDEOGRAPH-FA33"}, {"c": "\ud87e\udc26", "n": "CJK COMPATIBILITY IDEOGRAPH-2F826"}], "\ud87e\udc26": [{"c": "\u52c9", "n": "CJK UNIFIED IDEOGRAPH-52C9"}], "\uf952": [{"c": "\u52d2", "n": "CJK UNIFIED IDEOGRAPH-52D2"}], "\u52d2": [{"c": "\uf952", "n": "CJK COMPATIBILITY IDEOGRAPH-F952"}], "\uf92f": [{"c": "\u52de", "n": "CJK UNIFIED IDEOGRAPH-52DE"}], "\u52de": [{"c": "\uf92f", "n": "CJK COMPATIBILITY IDEOGRAPH-F92F"}], "\ufa34": [{"c": "\u52e4", "n": "CJK UNIFIED IDEOGRAPH-52E4"}], "\u52e4": [{"c": "\ufa34", "n": "CJK COMPATIBILITY IDEOGRAPH-FA34"}, {"c": "\ud87e\udc27", "n": "CJK COMPATIBILITY IDEOGRAPH-2F827"}], "\ud87e\udc27": [{"c": "\u52e4", "n": "CJK UNIFIED IDEOGRAPH-52E4"}], "\uf97f": [{"c": "\u52f5", "n": "CJK UNIFIED IDEOGRAPH-52F5"}], "\u52f5": [{"c": "\uf97f", "n": "CJK COMPATIBILITY IDEOGRAPH-F97F"}], "\u2f13": [{"c": "\u52f9", "n": "CJK UNIFIED IDEOGRAPH-52F9"}], "\u52f9": [{"c": "\u2f13", "n": "KANGXI RADICAL WRAP"}], "\ufa77": [{"c": "\u52fa", "n": "CJK UNIFIED IDEOGRAPH-52FA"}], "\u52fa": [{"c": "\ufa77", "n": "CJK COMPATIBILITY IDEOGRAPH-FA77"}, {"c": "\ud87e\udc28", "n": "CJK COMPATIBILITY IDEOGRAPH-2F828"}], "\ud87e\udc28": [{"c": "\u52fa", "n": "CJK UNIFIED IDEOGRAPH-52FA"}], "\ud87e\udc29": [{"c": "\u5305", "n": "CJK UNIFIED IDEOGRAPH-5305"}], "\u5305": [{"c": "\ud87e\udc29", "n": "CJK COMPATIBILITY IDEOGRAPH-2F829"}], "\ud87e\udc2a": [{"c": "\u5306", "n": "CJK UNIFIED IDEOGRAPH-5306"}], "\u5306": [{"c": "\ud87e\udc2a", "n": "CJK COMPATIBILITY IDEOGRAPH-2F82A"}], "\ud87e\udddd": [{"c": "\ud842\udcde", "n": "CJK UNIFIED IDEOGRAPH-208DE"}], "\ud842\udcde": [{"c": "\ud87e\udddd", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9DD"}], "\u2f14": [{"c": "\u5315", "n": "CJK UNIFIED IDEOGRAPH-5315"}], "\u5315": [{"c": "\u2f14", "n": "KANGXI RADICAL SPOON"}], "\uf963": [{"c": "\u5317", "n": "CJK UNIFIED IDEOGRAPH-5317"}], "\u5317": [{"c": "\uf963", "n": "CJK COMPATIBILITY IDEOGRAPH-F963"}, {"c": "\ud87e\udc2b", "n": "CJK COMPATIBILITY IDEOGRAPH-2F82B"}], "\ud87e\udc2b": [{"c": "\u5317", "n": "CJK UNIFIED IDEOGRAPH-5317"}], "\u2f15": [{"c": "\u531a", "n": "CJK UNIFIED IDEOGRAPH-531A"}], "\u531a": [{"c": "\u2f15", "n": "KANGXI RADICAL RIGHT OPEN BOX"}], "\u2f16": [{"c": "\u5338", "n": "CJK UNIFIED IDEOGRAPH-5338"}], "\u5338": [{"c": "\u2f16", "n": "KANGXI RADICAL HIDING ENCLOSURE"}], "\uf9eb": [{"c": "\u533f", "n": "CJK UNIFIED IDEOGRAPH-533F"}], "\u533f": [{"c": "\uf9eb", "n": "CJK COMPATIBILITY IDEOGRAPH-F9EB"}], "\u2f17": [{"c": "\u5341", "n": "CJK UNIFIED IDEOGRAPH-5341"}], "\u5341": [{"c": "\u2f17", "n": "KANGXI RADICAL TEN"}, {"c": "\u3038", "n": "HANGZHOU NUMERAL TEN"}], "\u3038": [{"c": "\u5341", "n": "CJK UNIFIED IDEOGRAPH-5341"}], "\u303a": [{"c": "\u5345", "n": "CJK UNIFIED IDEOGRAPH-5345"}], "\u5345": [{"c": "\u303a", "n": "HANGZHOU NUMERAL THIRTY"}], "\ud87e\udc2c": [{"c": "\u5349", "n": "CJK UNIFIED IDEOGRAPH-5349"}], "\u5349": [{"c": "\ud87e\udc2c", "n": "CJK COMPATIBILITY IDEOGRAPH-2F82C"}], "\u0fd6": [{"c": "\u534d", "n": "CJK UNIFIED IDEOGRAPH-534D"}], "\u534d": [{"c": "\u0fd6", "n": "LEFT-FACING SVASTI SIGN"}], "\u0fd5": [{"c": "\u5350", "n": "CJK UNIFIED IDEOGRAPH-5350"}], "\u5350": [{"c": "\u0fd5", "n": "RIGHT-FACING SVASTI SIGN"}], "\ufa35": [{"c": "\u5351", "n": "CJK UNIFIED IDEOGRAPH-5351"}], "\u5351": [{"c": "\ufa35", "n": "CJK COMPATIBILITY IDEOGRAPH-FA35"}, {"c": "\ud87e\udc2d", "n": "CJK COMPATIBILITY IDEOGRAPH-2F82D"}], "\ud87e\udc2d": [{"c": "\u5351", "n": "CJK UNIFIED IDEOGRAPH-5351"}], "\ud87e\udc2e": [{"c": "\u535a", "n": "CJK UNIFIED IDEOGRAPH-535A"}], "\u535a": [{"c": "\ud87e\udc2e", "n": "CJK COMPATIBILITY IDEOGRAPH-2F82E"}], "\u30c8": [{"c": "\u535c", "n": "CJK UNIFIED IDEOGRAPH-535C"}], "\u535c": [{"c": "\u30c8", "n": "KATAKANA LETTER TO"}, {"c": "\u2f18", "n": "KANGXI RADICAL DIVINATION"}], "\u2f18": [{"c": "\u535c", "n": "CJK UNIFIED IDEOGRAPH-535C"}], "\u2f19": [{"c": "\u5369", "n": "CJK UNIFIED IDEOGRAPH-5369"}], "\u5369": [{"c": "\u2f19", "n": "KANGXI RADICAL SEAL"}], "\u2e8b": [{"c": "\u353e", "n": "CJK UNIFIED IDEOGRAPH-353E"}], "\u353e": [{"c": "\u2e8b", "n": "CJK RADICAL SEAL"}], "\ud87e\udc2f": [{"c": "\u5373", "n": "CJK UNIFIED IDEOGRAPH-5373"}], "\u5373": [{"c": "\ud87e\udc2f", "n": "CJK COMPATIBILITY IDEOGRAPH-2F82F"}], "\uf91c": [{"c": "\u5375", "n": "CJK UNIFIED IDEOGRAPH-5375"}], "\u5375": [{"c": "\uf91c", "n": "CJK COMPATIBILITY IDEOGRAPH-F91C"}], "\ud87e\udc30": [{"c": "\u537d", "n": "CJK UNIFIED IDEOGRAPH-537D"}], "\u537d": [{"c": "\ud87e\udc30", "n": "CJK COMPATIBILITY IDEOGRAPH-2F830"}], "\ud87e\udc31": [{"c": "\u537f", "n": "CJK UNIFIED IDEOGRAPH-537F"}], "\u537f": [{"c": "\ud87e\udc31", "n": "CJK COMPATIBILITY IDEOGRAPH-2F831"}, {"c": "\ud87e\udc32", "n": "CJK COMPATIBILITY IDEOGRAPH-2F832"}, {"c": "\ud87e\udc33", "n": "CJK COMPATIBILITY IDEOGRAPH-2F833"}], "\ud87e\udc32": [{"c": "\u537f", "n": "CJK UNIFIED IDEOGRAPH-537F"}], "\ud87e\udc33": [{"c": "\u537f", "n": "CJK UNIFIED IDEOGRAPH-537F"}], "\u2f1a": [{"c": "\u5382", "n": "CJK UNIFIED IDEOGRAPH-5382"}], "\u5382": [{"c": "\u2f1a", "n": "KANGXI RADICAL CLIFF"}], "\ud87e\udc34": [{"c": "\ud842\ude2c", "n": "CJK UNIFIED IDEOGRAPH-20A2C"}], "\ud842\ude2c": [{"c": "\ud87e\udc34", "n": "CJK COMPATIBILITY IDEOGRAPH-2F834"}], "\u2f1b": [{"c": "\u53b6", "n": "CJK UNIFIED IDEOGRAPH-53B6"}], "\u53b6": [{"c": "\u2f1b", "n": "KANGXI RADICAL PRIVATE"}], "\uf96b": [{"c": "\u53c3", "n": "CJK UNIFIED IDEOGRAPH-53C3"}], "\u53c3": [{"c": "\uf96b", "n": "CJK COMPATIBILITY IDEOGRAPH-F96B"}], "\u2f1c": [{"c": "\u53c8", "n": "CJK UNIFIED IDEOGRAPH-53C8"}], "\u53c8": [{"c": "\u2f1c", "n": "KANGXI RADICAL AGAIN"}], "\ud87e\udc36": [{"c": "\u53ca", "n": "CJK UNIFIED IDEOGRAPH-53CA"}], "\u53ca": [{"c": "\ud87e\udc36", "n": "CJK COMPATIBILITY IDEOGRAPH-2F836"}], "\ud87e\udc37": [{"c": "\u53df", "n": "CJK UNIFIED IDEOGRAPH-53DF"}], "\u53df": [{"c": "\ud87e\udc37", "n": "CJK COMPATIBILITY IDEOGRAPH-2F837"}], "\ud87e\udc38": [{"c": "\ud842\udf63", "n": "CJK UNIFIED IDEOGRAPH-20B63"}], "\ud842\udf63": [{"c": "\ud87e\udc38", "n": "CJK COMPATIBILITY IDEOGRAPH-2F838"}], "\u30ed": [{"c": "\u53e3", "n": "CJK UNIFIED IDEOGRAPH-53E3"}], "\u53e3": [{"c": "\u30ed", "n": "KATAKANA LETTER RO"}, {"c": "\u2f1d", "n": "KANGXI RADICAL MOUTH"}, {"c": "\u56d7", "n": "CJK UNIFIED IDEOGRAPH-56D7"}, {"c": "\u2f1e", "n": "KANGXI RADICAL ENCLOSURE"}], "\u2f1d": [{"c": "\u53e3", "n": "CJK UNIFIED IDEOGRAPH-53E3"}], "\u56d7": [{"c": "\u53e3", "n": "CJK UNIFIED IDEOGRAPH-53E3"}], "\u2f1e": [{"c": "\u53e3", "n": "CJK UNIFIED IDEOGRAPH-53E3"}], "\uf906": [{"c": "\u53e5", "n": "CJK UNIFIED IDEOGRAPH-53E5"}], "\u53e5": [{"c": "\uf906", "n": "CJK COMPATIBILITY IDEOGRAPH-F906"}], "\ud87e\udc39": [{"c": "\u53eb", "n": "CJK UNIFIED IDEOGRAPH-53EB"}], "\u53eb": [{"c": "\ud87e\udc39", "n": "CJK COMPATIBILITY IDEOGRAPH-2F839"}], "\ud87e\udc3a": [{"c": "\u53f1", "n": "CJK UNIFIED IDEOGRAPH-53F1"}], "\u53f1": [{"c": "\ud87e\udc3a", "n": "CJK COMPATIBILITY IDEOGRAPH-2F83A"}], "\ud87e\udc3b": [{"c": "\u5406", "n": "CJK UNIFIED IDEOGRAPH-5406"}], "\u5406": [{"c": "\ud87e\udc3b", "n": "CJK COMPATIBILITY IDEOGRAPH-2F83B"}], "\uf9de": [{"c": "\u540f", "n": "CJK UNIFIED IDEOGRAPH-540F"}], "\u540f": [{"c": "\uf9de", "n": "CJK COMPATIBILITY IDEOGRAPH-F9DE"}], "\uf9ed": [{"c": "\u541d", "n": "CJK UNIFIED IDEOGRAPH-541D"}], "\u541d": [{"c": "\uf9ed", "n": "CJK COMPATIBILITY IDEOGRAPH-F9ED"}], "\ud87e\udc3d": [{"c": "\u5438", "n": "CJK UNIFIED IDEOGRAPH-5438"}], "\u5438": [{"c": "\ud87e\udc3d", "n": "CJK COMPATIBILITY IDEOGRAPH-2F83D"}], "\uf980": [{"c": "\u5442", "n": "CJK UNIFIED IDEOGRAPH-5442"}], "\u5442": [{"c": "\uf980", "n": "CJK COMPATIBILITY IDEOGRAPH-F980"}], "\ud87e\udc3e": [{"c": "\u5448", "n": "CJK UNIFIED IDEOGRAPH-5448"}], "\u5448": [{"c": "\ud87e\udc3e", "n": "CJK COMPATIBILITY IDEOGRAPH-2F83E"}], "\ud87e\udc3f": [{"c": "\u5468", "n": "CJK UNIFIED IDEOGRAPH-5468"}], "\u5468": [{"c": "\ud87e\udc3f", "n": "CJK COMPATIBILITY IDEOGRAPH-2F83F"}], "\ud87e\udc3c": [{"c": "\u549e", "n": "CJK UNIFIED IDEOGRAPH-549E"}], "\u549e": [{"c": "\ud87e\udc3c", "n": "CJK COMPATIBILITY IDEOGRAPH-2F83C"}], "\ud87e\udc40": [{"c": "\u54a2", "n": "CJK UNIFIED IDEOGRAPH-54A2"}], "\u54a2": [{"c": "\ud87e\udc40", "n": "CJK COMPATIBILITY IDEOGRAPH-2F840"}], "\uf99e": [{"c": "\u54bd", "n": "CJK UNIFIED IDEOGRAPH-54BD"}], "\u54bd": [{"c": "\uf99e", "n": "CJK COMPATIBILITY IDEOGRAPH-F99E"}], "\u439b": [{"c": "\u3588", "n": "CJK UNIFIED IDEOGRAPH-3588"}], "\u3588": [{"c": "\u439b", "n": "CJK UNIFIED IDEOGRAPH-439B"}], "\ud87e\udc41": [{"c": "\u54f6", "n": "CJK UNIFIED IDEOGRAPH-54F6"}], "\u54f6": [{"c": "\ud87e\udc41", "n": "CJK COMPATIBILITY IDEOGRAPH-2F841"}], "\ud87e\udc42": [{"c": "\u5510", "n": "CJK UNIFIED IDEOGRAPH-5510"}], "\u5510": [{"c": "\ud87e\udc42", "n": "CJK COMPATIBILITY IDEOGRAPH-2F842"}], "\ud87e\udc43": [{"c": "\u5553", "n": "CJK UNIFIED IDEOGRAPH-5553"}], "\u5553": [{"c": "\ud87e\udc43", "n": "CJK COMPATIBILITY IDEOGRAPH-2F843"}, {"c": "\u555f", "n": "CJK UNIFIED IDEOGRAPH-555F"}], "\u555f": [{"c": "\u5553", "n": "CJK UNIFIED IDEOGRAPH-5553"}], "\ufa79": [{"c": "\u5555", "n": "CJK UNIFIED IDEOGRAPH-5555"}], "\u5555": [{"c": "\ufa79", "n": "CJK COMPATIBILITY IDEOGRAPH-FA79"}], "\ud87e\udc44": [{"c": "\u5563", "n": "CJK UNIFIED IDEOGRAPH-5563"}], "\u5563": [{"c": "\ud87e\udc44", "n": "CJK COMPATIBILITY IDEOGRAPH-2F844"}], "\ud87e\udc45": [{"c": "\u5584", "n": "CJK UNIFIED IDEOGRAPH-5584"}], "\u5584": [{"c": "\ud87e\udc45", "n": "CJK COMPATIBILITY IDEOGRAPH-2F845"}, {"c": "\ud87e\udc46", "n": "CJK COMPATIBILITY IDEOGRAPH-2F846"}], "\ud87e\udc46": [{"c": "\u5584", "n": "CJK UNIFIED IDEOGRAPH-5584"}], "\uf90b": [{"c": "\u5587", "n": "CJK UNIFIED IDEOGRAPH-5587"}], "\u5587": [{"c": "\uf90b", "n": "CJK COMPATIBILITY IDEOGRAPH-F90B"}], "\ufa7a": [{"c": "\u5599", "n": "CJK UNIFIED IDEOGRAPH-5599"}], "\u5599": [{"c": "\ufa7a", "n": "CJK COMPATIBILITY IDEOGRAPH-FA7A"}, {"c": "\ud87e\udc47", "n": "CJK COMPATIBILITY IDEOGRAPH-2F847"}], "\ud87e\udc47": [{"c": "\u5599", "n": "CJK UNIFIED IDEOGRAPH-5599"}], "\ufa36": [{"c": "\u559d", "n": "CJK UNIFIED IDEOGRAPH-559D"}], "\u559d": [{"c": "\ufa36", "n": "CJK COMPATIBILITY IDEOGRAPH-FA36"}, {"c": "\ufa78", "n": "CJK COMPATIBILITY IDEOGRAPH-FA78"}], "\ufa78": [{"c": "\u559d", "n": "CJK UNIFIED IDEOGRAPH-559D"}], "\ud87e\udc48": [{"c": "\u55ab", "n": "CJK UNIFIED IDEOGRAPH-55AB"}], "\u55ab": [{"c": "\ud87e\udc48", "n": "CJK COMPATIBILITY IDEOGRAPH-2F848"}], "\ud87e\udc49": [{"c": "\u55b3", "n": "CJK UNIFIED IDEOGRAPH-55B3"}], "\u55b3": [{"c": "\ud87e\udc49", "n": "CJK COMPATIBILITY IDEOGRAPH-2F849"}], "\ufa0d": [{"c": "\u55c0", "n": "CJK UNIFIED IDEOGRAPH-55C0"}], "\u55c0": [{"c": "\ufa0d", "n": "CJK COMPATIBILITY IDEOGRAPH-FA0D"}], "\ud87e\udc4a": [{"c": "\u55c2", "n": "CJK UNIFIED IDEOGRAPH-55C2"}], "\u55c2": [{"c": "\ud87e\udc4a", "n": "CJK COMPATIBILITY IDEOGRAPH-2F84A"}], "\ufa7b": [{"c": "\u55e2", "n": "CJK UNIFIED IDEOGRAPH-55E2"}], "\u55e2": [{"c": "\ufa7b", "n": "CJK COMPATIBILITY IDEOGRAPH-FA7B"}], "\ufa37": [{"c": "\u5606", "n": "CJK UNIFIED IDEOGRAPH-5606"}], "\u5606": [{"c": "\ufa37", "n": "CJK COMPATIBILITY IDEOGRAPH-FA37"}, {"c": "\ud87e\udc4c", "n": "CJK COMPATIBILITY IDEOGRAPH-2F84C"}], "\ud87e\udc4c": [{"c": "\u5606", "n": "CJK UNIFIED IDEOGRAPH-5606"}], "\ud87e\udc4e": [{"c": "\u5651", "n": "CJK UNIFIED IDEOGRAPH-5651"}], "\u5651": [{"c": "\ud87e\udc4e", "n": "CJK COMPATIBILITY IDEOGRAPH-2F84E"}], "\ud87e\udc4f": [{"c": "\u5674", "n": "CJK UNIFIED IDEOGRAPH-5674"}], "\u5674": [{"c": "\ud87e\udc4f", "n": "CJK COMPATIBILITY IDEOGRAPH-2F84F"}], "\ufa38": [{"c": "\u5668", "n": "CJK UNIFIED IDEOGRAPH-5668"}], "\u5668": [{"c": "\ufa38", "n": "CJK COMPATIBILITY IDEOGRAPH-FA38"}], "\uf9a9": [{"c": "\u56f9", "n": "CJK UNIFIED IDEOGRAPH-56F9"}], "\u56f9": [{"c": "\uf9a9", "n": "CJK COMPATIBILITY IDEOGRAPH-F9A9"}], "\ud87e\udc4b": [{"c": "\u5716", "n": "CJK UNIFIED IDEOGRAPH-5716"}], "\u5716": [{"c": "\ud87e\udc4b", "n": "CJK COMPATIBILITY IDEOGRAPH-2F84B"}], "\ud87e\udc4d": [{"c": "\u5717", "n": "CJK UNIFIED IDEOGRAPH-5717"}], "\u5717": [{"c": "\ud87e\udc4d", "n": "CJK COMPATIBILITY IDEOGRAPH-2F84D"}], "\u2f1f": [{"c": "\u571f", "n": "CJK UNIFIED IDEOGRAPH-571F"}], "\u571f": [{"c": "\u2f1f", "n": "KANGXI RADICAL EARTH"}, {"c": "\u58eb", "n": "CJK UNIFIED IDEOGRAPH-58EB"}, {"c": "\u2f20", "n": "KANGXI RADICAL SCHOLAR"}], "\u58eb": [{"c": "\u571f", "n": "CJK UNIFIED IDEOGRAPH-571F"}], "\u2f20": [{"c": "\u571f", "n": "CJK UNIFIED IDEOGRAPH-571F"}], "\ud87e\udc55": [{"c": "\u578b", "n": "CJK UNIFIED IDEOGRAPH-578B"}], "\u578b": [{"c": "\ud87e\udc55", "n": "CJK COMPATIBILITY IDEOGRAPH-2F855"}], "\ud87e\udc52": [{"c": "\u57ce", "n": "CJK UNIFIED IDEOGRAPH-57CE"}], "\u57ce": [{"c": "\ud87e\udc52", "n": "CJK COMPATIBILITY IDEOGRAPH-2F852"}], "\u39b3": [{"c": "\u363d", "n": "CJK UNIFIED IDEOGRAPH-363D"}], "\u363d": [{"c": "\u39b3", "n": "CJK UNIFIED IDEOGRAPH-39B3"}], "\ud87e\udc53": [{"c": "\u57f4", "n": "CJK UNIFIED IDEOGRAPH-57F4"}], "\u57f4": [{"c": "\ud87e\udc53", "n": "CJK COMPATIBILITY IDEOGRAPH-2F853"}], "\ud87e\udc54": [{"c": "\u580d", "n": "CJK UNIFIED IDEOGRAPH-580D"}], "\u580d": [{"c": "\ud87e\udc54", "n": "CJK COMPATIBILITY IDEOGRAPH-2F854"}], "\ud87e\udc57": [{"c": "\u5831", "n": "CJK UNIFIED IDEOGRAPH-5831"}], "\u5831": [{"c": "\ud87e\udc57", "n": "CJK COMPATIBILITY IDEOGRAPH-2F857"}], "\ud87e\udc56": [{"c": "\u5832", "n": "CJK UNIFIED IDEOGRAPH-5832"}], "\u5832": [{"c": "\ud87e\udc56", "n": "CJK COMPATIBILITY IDEOGRAPH-2F856"}], "\ufa39": [{"c": "\u5840", "n": "CJK UNIFIED IDEOGRAPH-5840"}], "\u5840": [{"c": "\ufa39", "n": "CJK COMPATIBILITY IDEOGRAPH-FA39"}], "\ufa10": [{"c": "\u585a", "n": "CJK UNIFIED IDEOGRAPH-585A"}], "\u585a": [{"c": "\ufa10", "n": "CJK COMPATIBILITY IDEOGRAPH-FA10"}, {"c": "\ufa7c", "n": "CJK COMPATIBILITY IDEOGRAPH-FA7C"}], "\ufa7c": [{"c": "\u585a", "n": "CJK UNIFIED IDEOGRAPH-585A"}], "\uf96c": [{"c": "\u585e", "n": "CJK UNIFIED IDEOGRAPH-585E"}], "\u585e": [{"c": "\uf96c", "n": "CJK COMPATIBILITY IDEOGRAPH-F96C"}], "\u586b": [{"c": "\u5861", "n": "CJK UNIFIED IDEOGRAPH-5861"}], "\u5861": [{"c": "\u586b", "n": "CJK UNIFIED IDEOGRAPH-586B"}], "\u58ff": [{"c": "\u58ab", "n": "CJK UNIFIED IDEOGRAPH-58AB"}], "\u58ab": [{"c": "\u58ff", "n": "CJK UNIFIED IDEOGRAPH-58FF"}], "\ud87e\udc58": [{"c": "\u58ac", "n": "CJK UNIFIED IDEOGRAPH-58AC"}], "\u58ac": [{"c": "\ud87e\udc58", "n": "CJK COMPATIBILITY IDEOGRAPH-2F858"}], "\ufa7d": [{"c": "\u58b3", "n": "CJK UNIFIED IDEOGRAPH-58B3"}], "\u58b3": [{"c": "\ufa7d", "n": "CJK COMPATIBILITY IDEOGRAPH-FA7D"}], "\uf94a": [{"c": "\u58d8", "n": "CJK UNIFIED IDEOGRAPH-58D8"}], "\u58d8": [{"c": "\uf94a", "n": "CJK COMPATIBILITY IDEOGRAPH-F94A"}], "\uf942": [{"c": "\u58df", "n": "CJK UNIFIED IDEOGRAPH-58DF"}], "\u58df": [{"c": "\uf942", "n": "CJK COMPATIBILITY IDEOGRAPH-F942"}], "\ud87e\udc59": [{"c": "\ud845\udce4", "n": "CJK UNIFIED IDEOGRAPH-214E4"}], "\ud845\udce4": [{"c": "\ud87e\udc59", "n": "CJK COMPATIBILITY IDEOGRAPH-2F859"}], "\ud87e\udc51": [{"c": "\u58ee", "n": "CJK UNIFIED IDEOGRAPH-58EE"}], "\u58ee": [{"c": "\ud87e\udc51", "n": "CJK COMPATIBILITY IDEOGRAPH-2F851"}], "\ud87e\udc5a": [{"c": "\u58f2", "n": "CJK UNIFIED IDEOGRAPH-58F2"}], "\u58f2": [{"c": "\ud87e\udc5a", "n": "CJK COMPATIBILITY IDEOGRAPH-2F85A"}], "\ud87e\udc5b": [{"c": "\u58f7", "n": "CJK UNIFIED IDEOGRAPH-58F7"}], "\u58f7": [{"c": "\ud87e\udc5b", "n": "CJK COMPATIBILITY IDEOGRAPH-2F85B"}], "\u2f21": [{"c": "\u5902", "n": "CJK UNIFIED IDEOGRAPH-5902"}], "\u5902": [{"c": "\u2f21", "n": "KANGXI RADICAL GO"}], "\ud87e\udc5c": [{"c": "\u5906", "n": "CJK UNIFIED IDEOGRAPH-5906"}], "\u5906": [{"c": "\ud87e\udc5c", "n": "CJK COMPATIBILITY IDEOGRAPH-2F85C"}], "\u2f22": [{"c": "\u590a", "n": "CJK UNIFIED IDEOGRAPH-590A"}], "\u590a": [{"c": "\u2f22", "n": "KANGXI RADICAL GO SLOWLY"}], "\u30bf": [{"c": "\u5915", "n": "CJK UNIFIED IDEOGRAPH-5915"}], "\u5915": [{"c": "\u30bf", "n": "KATAKANA LETTER TA"}, {"c": "\u2f23", "n": "KANGXI RADICAL EVENING"}], "\u2f23": [{"c": "\u5915", "n": "CJK UNIFIED IDEOGRAPH-5915"}], "\ud87e\udc5d": [{"c": "\u591a", "n": "CJK UNIFIED IDEOGRAPH-591A"}], "\u591a": [{"c": "\ud87e\udc5d", "n": "CJK COMPATIBILITY IDEOGRAPH-2F85D"}], "\ud87e\udc5e": [{"c": "\u5922", "n": "CJK UNIFIED IDEOGRAPH-5922"}], "\u5922": [{"c": "\ud87e\udc5e", "n": "CJK COMPATIBILITY IDEOGRAPH-2F85E"}], "\u2f24": [{"c": "\u5927", "n": "CJK UNIFIED IDEOGRAPH-5927"}], "\u5927": [{"c": "\u2f24", "n": "KANGXI RADICAL BIG"}], "\ufa7e": [{"c": "\u5944", "n": "CJK UNIFIED IDEOGRAPH-5944"}], "\u5944": [{"c": "\ufa7e", "n": "CJK COMPATIBILITY IDEOGRAPH-FA7E"}], "\uf90c": [{"c": "\u5948", "n": "CJK UNIFIED IDEOGRAPH-5948"}], "\u5948": [{"c": "\uf90c", "n": "CJK COMPATIBILITY IDEOGRAPH-F90C"}], "\uf909": [{"c": "\u5951", "n": "CJK UNIFIED IDEOGRAPH-5951"}], "\u5951": [{"c": "\uf909", "n": "CJK COMPATIBILITY IDEOGRAPH-F909"}], "\ufa7f": [{"c": "\u5954", "n": "CJK UNIFIED IDEOGRAPH-5954"}], "\u5954": [{"c": "\ufa7f", "n": "CJK COMPATIBILITY IDEOGRAPH-FA7F"}], "\ud87e\udc5f": [{"c": "\u5962", "n": "CJK UNIFIED IDEOGRAPH-5962"}], "\u5962": [{"c": "\ud87e\udc5f", "n": "CJK COMPATIBILITY IDEOGRAPH-2F85F"}], "\uf981": [{"c": "\u5973", "n": "CJK UNIFIED IDEOGRAPH-5973"}], "\u5973": [{"c": "\uf981", "n": "CJK COMPATIBILITY IDEOGRAPH-F981"}, {"c": "\u2f25", "n": "KANGXI RADICAL WOMAN"}], "\u2f25": [{"c": "\u5973", "n": "CJK UNIFIED IDEOGRAPH-5973"}], "\ud87e\udc60": [{"c": "\ud845\udea8", "n": "CJK UNIFIED IDEOGRAPH-216A8"}], "\ud845\udea8": [{"c": "\ud87e\udc60", "n": "CJK COMPATIBILITY IDEOGRAPH-2F860"}], "\ud87e\udc61": [{"c": "\ud845\udeea", "n": "CJK UNIFIED IDEOGRAPH-216EA"}], "\ud845\udeea": [{"c": "\ud87e\udc61", "n": "CJK COMPATIBILITY IDEOGRAPH-2F861"}], "\ud87e\udc65": [{"c": "\u59d8", "n": "CJK UNIFIED IDEOGRAPH-59D8"}], "\u59d8": [{"c": "\ud87e\udc65", "n": "CJK COMPATIBILITY IDEOGRAPH-2F865"}], "\ud87e\udc62": [{"c": "\u59ec", "n": "CJK UNIFIED IDEOGRAPH-59EC"}], "\u59ec": [{"c": "\ud87e\udc62", "n": "CJK COMPATIBILITY IDEOGRAPH-2F862"}], "\ud87e\udc63": [{"c": "\u5a1b", "n": "CJK UNIFIED IDEOGRAPH-5A1B"}], "\u5a1b": [{"c": "\ud87e\udc63", "n": "CJK COMPATIBILITY IDEOGRAPH-2F863"}], "\ud87e\udc64": [{"c": "\u5a27", "n": "CJK UNIFIED IDEOGRAPH-5A27"}], "\u5a27": [{"c": "\ud87e\udc64", "n": "CJK COMPATIBILITY IDEOGRAPH-2F864"}], "\ufa80": [{"c": "\u5a62", "n": "CJK UNIFIED IDEOGRAPH-5A62"}], "\u5a62": [{"c": "\ufa80", "n": "CJK COMPATIBILITY IDEOGRAPH-FA80"}], "\ud87e\udc66": [{"c": "\u5a66", "n": "CJK UNIFIED IDEOGRAPH-5A66"}], "\u5a66": [{"c": "\ud87e\udc66", "n": "CJK COMPATIBILITY IDEOGRAPH-2F866"}], "\u5b00": [{"c": "\u5aaf", "n": "CJK UNIFIED IDEOGRAPH-5AAF"}], "\u5aaf": [{"c": "\u5b00", "n": "CJK UNIFIED IDEOGRAPH-5B00"}], "\ud87e\udc67": [{"c": "\u36ee", "n": "CJK UNIFIED IDEOGRAPH-36EE"}], "\u36ee": [{"c": "\ud87e\udc67", "n": "CJK COMPATIBILITY IDEOGRAPH-2F867"}], "\ud87e\udc68": [{"c": "\u36fc", "n": "CJK UNIFIED IDEOGRAPH-36FC"}], "\u36fc": [{"c": "\ud87e\udc68", "n": "CJK COMPATIBILITY IDEOGRAPH-2F868"}], "\ud87e\udd86": [{"c": "\u5ab5", "n": "CJK UNIFIED IDEOGRAPH-5AB5"}], "\u5ab5": [{"c": "\ud87e\udd86", "n": "CJK COMPATIBILITY IDEOGRAPH-2F986"}], "\ud87e\udc69": [{"c": "\u5b08", "n": "CJK UNIFIED IDEOGRAPH-5B08"}], "\u5b08": [{"c": "\ud87e\udc69", "n": "CJK COMPATIBILITY IDEOGRAPH-2F869"}], "\ufa81": [{"c": "\u5b28", "n": "CJK UNIFIED IDEOGRAPH-5B28"}], "\u5b28": [{"c": "\ufa81", "n": "CJK COMPATIBILITY IDEOGRAPH-FA81"}], "\ud87e\udc6a": [{"c": "\u5b3e", "n": "CJK UNIFIED IDEOGRAPH-5B3E"}], "\u5b3e": [{"c": "\ud87e\udc6a", "n": "CJK COMPATIBILITY IDEOGRAPH-2F86A"}, {"c": "\ud87e\udc6b", "n": "CJK COMPATIBILITY IDEOGRAPH-2F86B"}], "\ud87e\udc6b": [{"c": "\u5b3e", "n": "CJK UNIFIED IDEOGRAPH-5B3E"}], "\u2f26": [{"c": "\u5b50", "n": "CJK UNIFIED IDEOGRAPH-5B50"}], "\u5b50": [{"c": "\u2f26", "n": "KANGXI RADICAL CHILD"}], "\u2f27": [{"c": "\u5b80", "n": "CJK UNIFIED IDEOGRAPH-5B80"}], "\u5b80": [{"c": "\u2f27", "n": "KANGXI RADICAL ROOF"}], "\ufa04": [{"c": "\u5b85", "n": "CJK UNIFIED IDEOGRAPH-5B85"}], "\u5b85": [{"c": "\ufa04", "n": "CJK COMPATIBILITY IDEOGRAPH-FA04"}], "\ud87e\udc6c": [{"c": "\ud846\uddc8", "n": "CJK UNIFIED IDEOGRAPH-219C8"}], "\ud846\uddc8": [{"c": "\ud87e\udc6c", "n": "CJK COMPATIBILITY IDEOGRAPH-2F86C"}], "\ud87e\udc6d": [{"c": "\u5bc3", "n": "CJK UNIFIED IDEOGRAPH-5BC3"}], "\u5bc3": [{"c": "\ud87e\udc6d", "n": "CJK COMPATIBILITY IDEOGRAPH-2F86D"}], "\ud87e\udc6e": [{"c": "\u5bd8", "n": "CJK UNIFIED IDEOGRAPH-5BD8"}], "\u5bd8": [{"c": "\ud87e\udc6e", "n": "CJK COMPATIBILITY IDEOGRAPH-2F86E"}], "\uf95f": [{"c": "\u5be7", "n": "CJK UNIFIED IDEOGRAPH-5BE7"}], "\u5be7": [{"c": "\uf95f", "n": "CJK COMPATIBILITY IDEOGRAPH-F95F"}, {"c": "\uf9aa", "n": "CJK COMPATIBILITY IDEOGRAPH-F9AA"}, {"c": "\ud87e\udc6f", "n": "CJK COMPATIBILITY IDEOGRAPH-2F86F"}], "\uf9aa": [{"c": "\u5be7", "n": "CJK UNIFIED IDEOGRAPH-5BE7"}], "\ud87e\udc6f": [{"c": "\u5be7", "n": "CJK UNIFIED IDEOGRAPH-5BE7"}], "\uf9bc": [{"c": "\u5bee", "n": "CJK UNIFIED IDEOGRAPH-5BEE"}], "\u5bee": [{"c": "\uf9bc", "n": "CJK COMPATIBILITY IDEOGRAPH-F9BC"}], "\ud87e\udc70": [{"c": "\u5bf3", "n": "CJK UNIFIED IDEOGRAPH-5BF3"}], "\u5bf3": [{"c": "\ud87e\udc70", "n": "CJK COMPATIBILITY IDEOGRAPH-2F870"}], "\ud87e\udc71": [{"c": "\ud846\udf18", "n": "CJK UNIFIED IDEOGRAPH-21B18"}], "\ud846\udf18": [{"c": "\ud87e\udc71", "n": "CJK COMPATIBILITY IDEOGRAPH-2F871"}], "\u2f28": [{"c": "\u5bf8", "n": "CJK UNIFIED IDEOGRAPH-5BF8"}], "\u5bf8": [{"c": "\u2f28", "n": "KANGXI RADICAL INCH"}], "\ud87e\udc72": [{"c": "\u5bff", "n": "CJK UNIFIED IDEOGRAPH-5BFF"}], "\u5bff": [{"c": "\ud87e\udc72", "n": "CJK COMPATIBILITY IDEOGRAPH-2F872"}], "\ud87e\udc73": [{"c": "\u5c06", "n": "CJK UNIFIED IDEOGRAPH-5C06"}], "\u5c06": [{"c": "\ud87e\udc73", "n": "CJK COMPATIBILITY IDEOGRAPH-2F873"}], "\u2f29": [{"c": "\u5c0f", "n": "CJK UNIFIED IDEOGRAPH-5C0F"}], "\u5c0f": [{"c": "\u2f29", "n": "KANGXI RADICAL SMALL"}], "\ud87e\udc75": [{"c": "\u5c22", "n": "CJK UNIFIED IDEOGRAPH-5C22"}], "\u5c22": [{"c": "\ud87e\udc75", "n": "CJK COMPATIBILITY IDEOGRAPH-2F875"}, {"c": "\u2e90", "n": "CJK RADICAL LAME THREE"}, {"c": "\u2f2a", "n": "KANGXI RADICAL LAME"}], "\u2e90": [{"c": "\u5c22", "n": "CJK UNIFIED IDEOGRAPH-5C22"}], "\u2f2a": [{"c": "\u5c22", "n": "CJK UNIFIED IDEOGRAPH-5C22"}], "\u2e8f": [{"c": "\u5c23", "n": "CJK UNIFIED IDEOGRAPH-5C23"}], "\u5c23": [{"c": "\u2e8f", "n": "CJK RADICAL LAME TWO"}], "\ud87e\udc76": [{"c": "\u3781", "n": "CJK UNIFIED IDEOGRAPH-3781"}], "\u3781": [{"c": "\ud87e\udc76", "n": "CJK COMPATIBILITY IDEOGRAPH-2F876"}], "\u2f2b": [{"c": "\u5c38", "n": "CJK UNIFIED IDEOGRAPH-5C38"}], "\u5c38": [{"c": "\u2f2b", "n": "KANGXI RADICAL CORPSE"}], "\uf9bd": [{"c": "\u5c3f", "n": "CJK UNIFIED IDEOGRAPH-5C3F"}], "\u5c3f": [{"c": "\uf9bd", "n": "CJK COMPATIBILITY IDEOGRAPH-F9BD"}], "\ud87e\udc77": [{"c": "\u5c60", "n": "CJK UNIFIED IDEOGRAPH-5C60"}], "\u5c60": [{"c": "\ud87e\udc77", "n": "CJK COMPATIBILITY IDEOGRAPH-2F877"}], "\uf94b": [{"c": "\u5c62", "n": "CJK UNIFIED IDEOGRAPH-5C62"}], "\u5c62": [{"c": "\uf94b", "n": "CJK COMPATIBILITY IDEOGRAPH-F94B"}], "\ufa3b": [{"c": "\u5c64", "n": "CJK UNIFIED IDEOGRAPH-5C64"}], "\u5c64": [{"c": "\ufa3b", "n": "CJK COMPATIBILITY IDEOGRAPH-FA3B"}], "\uf9df": [{"c": "\u5c65", "n": "CJK UNIFIED IDEOGRAPH-5C65"}], "\u5c65": [{"c": "\uf9df", "n": "CJK COMPATIBILITY IDEOGRAPH-F9DF"}], "\ufa3c": [{"c": "\u5c6e", "n": "CJK UNIFIED IDEOGRAPH-5C6E"}], "\u5c6e": [{"c": "\ufa3c", "n": "CJK COMPATIBILITY IDEOGRAPH-FA3C"}, {"c": "\ud87e\udc78", "n": "CJK COMPATIBILITY IDEOGRAPH-2F878"}, {"c": "\u2f2c", "n": "KANGXI RADICAL SPROUT"}], "\ud87e\udc78": [{"c": "\u5c6e", "n": "CJK UNIFIED IDEOGRAPH-5C6E"}], "\u2f2c": [{"c": "\u5c6e", "n": "CJK UNIFIED IDEOGRAPH-5C6E"}], "\ud87e\udcf8": [{"c": "\ud847\udd0b", "n": "CJK UNIFIED IDEOGRAPH-21D0B"}], "\ud847\udd0b": [{"c": "\ud87e\udcf8", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8F8"}], "\u2f2d": [{"c": "\u5c71", "n": "CJK UNIFIED IDEOGRAPH-5C71"}], "\u5c71": [{"c": "\u2f2d", "n": "KANGXI RADICAL MOUNTAIN"}], "\ud87e\udc79": [{"c": "\u5cc0", "n": "CJK UNIFIED IDEOGRAPH-5CC0"}], "\u5cc0": [{"c": "\ud87e\udc79", "n": "CJK COMPATIBILITY IDEOGRAPH-2F879"}], "\ud87e\udc7a": [{"c": "\u5c8d", "n": "CJK UNIFIED IDEOGRAPH-5C8D"}], "\u5c8d": [{"c": "\ud87e\udc7a", "n": "CJK COMPATIBILITY IDEOGRAPH-2F87A"}], "\ud87e\udc7b": [{"c": "\ud847\udde4", "n": "CJK UNIFIED IDEOGRAPH-21DE4"}], "\ud847\udde4": [{"c": "\ud87e\udc7b", "n": "CJK COMPATIBILITY IDEOGRAPH-2F87B"}], "\ud87e\udc7d": [{"c": "\ud847\udde6", "n": "CJK UNIFIED IDEOGRAPH-21DE6"}], "\ud847\udde6": [{"c": "\ud87e\udc7d", "n": "CJK COMPATIBILITY IDEOGRAPH-2F87D"}], "\uf9d5": [{"c": "\u5d19", "n": "CJK UNIFIED IDEOGRAPH-5D19"}], "\u5d19": [{"c": "\uf9d5", "n": "CJK COMPATIBILITY IDEOGRAPH-F9D5"}], "\ud87e\udc7c": [{"c": "\u5d43", "n": "CJK UNIFIED IDEOGRAPH-5D43"}], "\u5d43": [{"c": "\ud87e\udc7c", "n": "CJK COMPATIBILITY IDEOGRAPH-2F87C"}], "\uf921": [{"c": "\u5d50", "n": "CJK UNIFIED IDEOGRAPH-5D50"}], "\u5d50": [{"c": "\uf921", "n": "CJK COMPATIBILITY IDEOGRAPH-F921"}], "\ud87e\udc7f": [{"c": "\u5d6b", "n": "CJK UNIFIED IDEOGRAPH-5D6B"}], "\u5d6b": [{"c": "\ud87e\udc7f", "n": "CJK COMPATIBILITY IDEOGRAPH-2F87F"}], "\ud87e\udc7e": [{"c": "\u5d6e", "n": "CJK UNIFIED IDEOGRAPH-5D6E"}], "\u5d6e": [{"c": "\ud87e\udc7e", "n": "CJK COMPATIBILITY IDEOGRAPH-2F87E"}], "\ud87e\udc80": [{"c": "\u5d7c", "n": "CJK UNIFIED IDEOGRAPH-5D7C"}], "\u5d7c": [{"c": "\ud87e\udc80", "n": "CJK COMPATIBILITY IDEOGRAPH-2F880"}], "\ud87e\uddf4": [{"c": "\u5db2", "n": "CJK UNIFIED IDEOGRAPH-5DB2"}], "\u5db2": [{"c": "\ud87e\uddf4", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9F4"}], "\uf9ab": [{"c": "\u5dba", "n": "CJK UNIFIED IDEOGRAPH-5DBA"}], "\u5dba": [{"c": "\uf9ab", "n": "CJK COMPATIBILITY IDEOGRAPH-F9AB"}], "\u2f2e": [{"c": "\u5ddb", "n": "CJK UNIFIED IDEOGRAPH-5DDB"}], "\u5ddb": [{"c": "\u2f2e", "n": "KANGXI RADICAL RIVER"}], "\ud87e\udc82": [{"c": "\u5de2", "n": "CJK UNIFIED IDEOGRAPH-5DE2"}], "\u5de2": [{"c": "\ud87e\udc82", "n": "CJK COMPATIBILITY IDEOGRAPH-2F882"}], "\u30a8": [{"c": "\u5de5", "n": "CJK UNIFIED IDEOGRAPH-5DE5"}], "\u5de5": [{"c": "\u30a8", "n": "KATAKANA LETTER E"}, {"c": "\u2f2f", "n": "KANGXI RADICAL WORK"}], "\u2f2f": [{"c": "\u5de5", "n": "CJK UNIFIED IDEOGRAPH-5DE5"}], "\u2f30": [{"c": "\u5df1", "n": "CJK UNIFIED IDEOGRAPH-5DF1"}], "\u5df1": [{"c": "\u2f30", "n": "KANGXI RADICAL ONESELF"}], "\u2e92": [{"c": "\u5df3", "n": "CJK UNIFIED IDEOGRAPH-5DF3"}], "\u5df3": [{"c": "\u2e92", "n": "CJK RADICAL SNAKE"}], "\ud87e\udc83": [{"c": "\u382f", "n": "CJK UNIFIED IDEOGRAPH-382F"}], "\u382f": [{"c": "\ud87e\udc83", "n": "CJK COMPATIBILITY IDEOGRAPH-2F883"}], "\ud87e\udc84": [{"c": "\u5dfd", "n": "CJK UNIFIED IDEOGRAPH-5DFD"}], "\u5dfd": [{"c": "\ud87e\udc84", "n": "CJK COMPATIBILITY IDEOGRAPH-2F884"}], "\u2f31": [{"c": "\u5dfe", "n": "CJK UNIFIED IDEOGRAPH-5DFE"}], "\u5dfe": [{"c": "\u2f31", "n": "KANGXI RADICAL TURBAN"}], "\u5e32": [{"c": "\u5e21", "n": "CJK UNIFIED IDEOGRAPH-5E21"}], "\u5e21": [{"c": "\u5e32", "n": "CJK UNIFIED IDEOGRAPH-5E32"}], "\ud87e\udc85": [{"c": "\u5e28", "n": "CJK UNIFIED IDEOGRAPH-5E28"}], "\u5e28": [{"c": "\ud87e\udc85", "n": "CJK COMPATIBILITY IDEOGRAPH-2F885"}], "\ud87e\udc86": [{"c": "\u5e3d", "n": "CJK UNIFIED IDEOGRAPH-5E3D"}], "\u5e3d": [{"c": "\ud87e\udc86", "n": "CJK COMPATIBILITY IDEOGRAPH-2F886"}], "\ud87e\udc87": [{"c": "\u5e69", "n": "CJK UNIFIED IDEOGRAPH-5E69"}], "\u5e69": [{"c": "\ud87e\udc87", "n": "CJK COMPATIBILITY IDEOGRAPH-2F887"}], "\ud87e\udc88": [{"c": "\u3862", "n": "CJK UNIFIED IDEOGRAPH-3862"}], "\u3862": [{"c": "\ud87e\udc88", "n": "CJK COMPATIBILITY IDEOGRAPH-2F888"}], "\ud87e\udc89": [{"c": "\ud848\udd83", "n": "CJK UNIFIED IDEOGRAPH-22183"}], "\ud848\udd83": [{"c": "\ud87e\udc89", "n": "CJK COMPATIBILITY IDEOGRAPH-2F889"}], "\u2f32": [{"c": "\u5e72", "n": "CJK UNIFIED IDEOGRAPH-5E72"}], "\u5e72": [{"c": "\u2f32", "n": "KANGXI RADICAL DRY"}], "\uf98e": [{"c": "\u5e74", "n": "CJK UNIFIED IDEOGRAPH-5E74"}], "\u5e74": [{"c": "\uf98e", "n": "CJK COMPATIBILITY IDEOGRAPH-F98E"}], "\ud87e\udd39": [{"c": "\ud848\udd9f", "n": "CJK UNIFIED IDEOGRAPH-2219F"}], "\ud848\udd9f": [{"c": "\ud87e\udd39", "n": "CJK COMPATIBILITY IDEOGRAPH-2F939"}], "\u2e93": [{"c": "\u5e7a", "n": "CJK UNIFIED IDEOGRAPH-5E7A"}], "\u5e7a": [{"c": "\u2e93", "n": "CJK RADICAL THREAD"}, {"c": "\u2f33", "n": "KANGXI RADICAL SHORT THREAD"}], "\u2f33": [{"c": "\u5e7a", "n": "CJK UNIFIED IDEOGRAPH-5E7A"}], "\u2f34": [{"c": "\u5e7f", "n": "CJK UNIFIED IDEOGRAPH-5E7F"}], "\u5e7f": [{"c": "\u2f34", "n": "KANGXI RADICAL DOTTED CLIFF"}], "\ufa01": [{"c": "\u5ea6", "n": "CJK UNIFIED IDEOGRAPH-5EA6"}], "\u5ea6": [{"c": "\ufa01", "n": "CJK COMPATIBILITY IDEOGRAPH-FA01"}], "\ud87e\udc8a": [{"c": "\u387c", "n": "CJK UNIFIED IDEOGRAPH-387C"}], "\u387c": [{"c": "\ud87e\udc8a", "n": "CJK COMPATIBILITY IDEOGRAPH-2F88A"}], "\ud87e\udc8b": [{"c": "\u5eb0", "n": "CJK UNIFIED IDEOGRAPH-5EB0"}], "\u5eb0": [{"c": "\ud87e\udc8b", "n": "CJK COMPATIBILITY IDEOGRAPH-2F88B"}], "\ud87e\udc8c": [{"c": "\u5eb3", "n": "CJK UNIFIED IDEOGRAPH-5EB3"}], "\u5eb3": [{"c": "\ud87e\udc8c", "n": "CJK COMPATIBILITY IDEOGRAPH-2F88C"}], "\ud87e\udc8d": [{"c": "\u5eb6", "n": "CJK UNIFIED IDEOGRAPH-5EB6"}], "\u5eb6": [{"c": "\ud87e\udc8d", "n": "CJK COMPATIBILITY IDEOGRAPH-2F88D"}], "\uf928": [{"c": "\u5eca", "n": "CJK UNIFIED IDEOGRAPH-5ECA"}], "\u5eca": [{"c": "\uf928", "n": "CJK COMPATIBILITY IDEOGRAPH-F928"}, {"c": "\ud87e\udc8e", "n": "CJK COMPATIBILITY IDEOGRAPH-2F88E"}], "\ud87e\udc8e": [{"c": "\u5eca", "n": "CJK UNIFIED IDEOGRAPH-5ECA"}], "\uf9a2": [{"c": "\u5ec9", "n": "CJK UNIFIED IDEOGRAPH-5EC9"}], "\u5ec9": [{"c": "\uf9a2", "n": "CJK COMPATIBILITY IDEOGRAPH-F9A2"}], "\ufa82": [{"c": "\u5ed2", "n": "CJK UNIFIED IDEOGRAPH-5ED2"}], "\u5ed2": [{"c": "\ufa82", "n": "CJK COMPATIBILITY IDEOGRAPH-FA82"}], "\ufa0b": [{"c": "\u5ed3", "n": "CJK UNIFIED IDEOGRAPH-5ED3"}], "\u5ed3": [{"c": "\ufa0b", "n": "CJK COMPATIBILITY IDEOGRAPH-FA0B"}], "\ufa83": [{"c": "\u5ed9", "n": "CJK UNIFIED IDEOGRAPH-5ED9"}], "\u5ed9": [{"c": "\ufa83", "n": "CJK COMPATIBILITY IDEOGRAPH-FA83"}], "\uf982": [{"c": "\u5eec", "n": "CJK UNIFIED IDEOGRAPH-5EEC"}], "\u5eec": [{"c": "\uf982", "n": "CJK COMPATIBILITY IDEOGRAPH-F982"}], "\u2f35": [{"c": "\u5ef4", "n": "CJK UNIFIED IDEOGRAPH-5EF4"}], "\u5ef4": [{"c": "\u2f35", "n": "KANGXI RADICAL LONG STRIDE"}], "\ud87e\udc90": [{"c": "\u5efe", "n": "CJK UNIFIED IDEOGRAPH-5EFE"}], "\u5efe": [{"c": "\ud87e\udc90", "n": "CJK COMPATIBILITY IDEOGRAPH-2F890"}, {"c": "\u2f36", "n": "KANGXI RADICAL TWO HANDS"}], "\u2f36": [{"c": "\u5efe", "n": "CJK UNIFIED IDEOGRAPH-5EFE"}], "\ud87e\udc91": [{"c": "\ud848\udf31", "n": "CJK UNIFIED IDEOGRAPH-22331"}], "\ud848\udf31": [{"c": "\ud87e\udc91", "n": "CJK COMPATIBILITY IDEOGRAPH-2F891"}, {"c": "\ud87e\udc92", "n": "CJK COMPATIBILITY IDEOGRAPH-2F892"}], "\ud87e\udc92": [{"c": "\ud848\udf31", "n": "CJK UNIFIED IDEOGRAPH-22331"}], "\uf943": [{"c": "\u5f04", "n": "CJK UNIFIED IDEOGRAPH-5F04"}], "\u5f04": [{"c": "\uf943", "n": "CJK COMPATIBILITY IDEOGRAPH-F943"}], "\u2f37": [{"c": "\u5f0b", "n": "CJK UNIFIED IDEOGRAPH-5F0B"}], "\u5f0b": [{"c": "\u2f37", "n": "KANGXI RADICAL SHOOT"}], "\u2f38": [{"c": "\u5f13", "n": "CJK UNIFIED IDEOGRAPH-5F13"}], "\u5f13": [{"c": "\u2f38", "n": "KANGXI RADICAL BOW"}], "\ud87e\udc94": [{"c": "\u5f22", "n": "CJK UNIFIED IDEOGRAPH-5F22"}], "\u5f22": [{"c": "\ud87e\udc94", "n": "CJK COMPATIBILITY IDEOGRAPH-2F894"}, {"c": "\ud87e\udc95", "n": "CJK COMPATIBILITY IDEOGRAPH-2F895"}], "\ud87e\udc95": [{"c": "\u5f22", "n": "CJK UNIFIED IDEOGRAPH-5F22"}], "\u2f39": [{"c": "\u5f50", "n": "CJK UNIFIED IDEOGRAPH-5F50"}], "\u5f50": [{"c": "\u2f39", "n": "KANGXI RADICAL SNOUT"}], "\u2e94": [{"c": "\u5f51", "n": "CJK UNIFIED IDEOGRAPH-5F51"}], "\u5f51": [{"c": "\u2e94", "n": "CJK RADICAL SNOUT ONE"}], "\ud87e\udc74": [{"c": "\u5f53", "n": "CJK UNIFIED IDEOGRAPH-5F53"}], "\u5f53": [{"c": "\ud87e\udc74", "n": "CJK COMPATIBILITY IDEOGRAPH-2F874"}], "\ud87e\udc96": [{"c": "\u38c7", "n": "CJK UNIFIED IDEOGRAPH-38C7"}], "\u38c7": [{"c": "\ud87e\udc96", "n": "CJK COMPATIBILITY IDEOGRAPH-2F896"}], "\u2f3a": [{"c": "\u5f61", "n": "CJK UNIFIED IDEOGRAPH-5F61"}], "\u5f61": [{"c": "\u2f3a", "n": "KANGXI RADICAL BRISTLE"}], "\ud87e\udc99": [{"c": "\u5f62", "n": "CJK UNIFIED IDEOGRAPH-5F62"}], "\u5f62": [{"c": "\ud87e\udc99", "n": "CJK COMPATIBILITY IDEOGRAPH-2F899"}], "\ufa84": [{"c": "\u5f69", "n": "CJK UNIFIED IDEOGRAPH-5F69"}], "\u5f69": [{"c": "\ufa84", "n": "CJK COMPATIBILITY IDEOGRAPH-FA84"}], "\ud87e\udc9a": [{"c": "\u5f6b", "n": "CJK UNIFIED IDEOGRAPH-5F6B"}], "\u5f6b": [{"c": "\ud87e\udc9a", "n": "CJK COMPATIBILITY IDEOGRAPH-2F89A"}], "\u2f3b": [{"c": "\u5f73", "n": "CJK UNIFIED IDEOGRAPH-5F73"}], "\u5f73": [{"c": "\u2f3b", "n": "KANGXI RADICAL STEP"}], "\uf9d8": [{"c": "\u5f8b", "n": "CJK UNIFIED IDEOGRAPH-5F8B"}], "\u5f8b": [{"c": "\uf9d8", "n": "CJK COMPATIBILITY IDEOGRAPH-F9D8"}], "\ud87e\udc9b": [{"c": "\u38e3", "n": "CJK UNIFIED IDEOGRAPH-38E3"}], "\u38e3": [{"c": "\ud87e\udc9b", "n": "CJK COMPATIBILITY IDEOGRAPH-2F89B"}], "\ud87e\udc9c": [{"c": "\u5f9a", "n": "CJK UNIFIED IDEOGRAPH-5F9A"}], "\u5f9a": [{"c": "\ud87e\udc9c", "n": "CJK COMPATIBILITY IDEOGRAPH-2F89C"}], "\uf966": [{"c": "\u5fa9", "n": "CJK UNIFIED IDEOGRAPH-5FA9"}], "\u5fa9": [{"c": "\uf966", "n": "CJK COMPATIBILITY IDEOGRAPH-F966"}], "\ufa85": [{"c": "\u5fad", "n": "CJK UNIFIED IDEOGRAPH-5FAD"}], "\u5fad": [{"c": "\ufa85", "n": "CJK COMPATIBILITY IDEOGRAPH-FA85"}], "\u2f3c": [{"c": "\u5fc3", "n": "CJK UNIFIED IDEOGRAPH-5FC3"}], "\u5fc3": [{"c": "\u2f3c", "n": "KANGXI RADICAL HEART"}], "\u2e96": [{"c": "\u5fc4", "n": "CJK UNIFIED IDEOGRAPH-5FC4"}], "\u5fc4": [{"c": "\u2e96", "n": "CJK RADICAL HEART ONE"}], "\u2e97": [{"c": "\u38fa", "n": "CJK UNIFIED IDEOGRAPH-38FA"}], "\u38fa": [{"c": "\u2e97", "n": "CJK RADICAL HEART TWO"}], "\ud87e\udc9d": [{"c": "\u5fcd", "n": "CJK UNIFIED IDEOGRAPH-5FCD"}], "\u5fcd": [{"c": "\ud87e\udc9d", "n": "CJK COMPATIBILITY IDEOGRAPH-2F89D"}], "\ud87e\udc9e": [{"c": "\u5fd7", "n": "CJK UNIFIED IDEOGRAPH-5FD7"}], "\u5fd7": [{"c": "\ud87e\udc9e", "n": "CJK COMPATIBILITY IDEOGRAPH-2F89E"}], "\uf9a3": [{"c": "\u5ff5", "n": "CJK UNIFIED IDEOGRAPH-5FF5"}], "\u5ff5": [{"c": "\uf9a3", "n": "CJK COMPATIBILITY IDEOGRAPH-F9A3"}], "\ud87e\udc9f": [{"c": "\u5ff9", "n": "CJK UNIFIED IDEOGRAPH-5FF9"}], "\u5ff9": [{"c": "\ud87e\udc9f", "n": "CJK COMPATIBILITY IDEOGRAPH-2F89F"}], "\uf960": [{"c": "\u6012", "n": "CJK UNIFIED IDEOGRAPH-6012"}], "\u6012": [{"c": "\uf960", "n": "CJK COMPATIBILITY IDEOGRAPH-F960"}], "\uf9ac": [{"c": "\u601c", "n": "CJK UNIFIED IDEOGRAPH-601C"}], "\u601c": [{"c": "\uf9ac", "n": "CJK COMPATIBILITY IDEOGRAPH-F9AC"}], "\ufa6b": [{"c": "\u6075", "n": "CJK UNIFIED IDEOGRAPH-6075"}], "\u6075": [{"c": "\ufa6b", "n": "CJK COMPATIBILITY IDEOGRAPH-FA6B"}], "\ud87e\udca2": [{"c": "\u391c", "n": "CJK UNIFIED IDEOGRAPH-391C"}], "\u391c": [{"c": "\ud87e\udca2", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8A2"}], "\ud87e\udca1": [{"c": "\u393a", "n": "CJK UNIFIED IDEOGRAPH-393A"}], "\u393a": [{"c": "\ud87e\udca1", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8A1"}], "\ud87e\udca0": [{"c": "\u6081", "n": "CJK UNIFIED IDEOGRAPH-6081"}], "\u6081": [{"c": "\ud87e\udca0", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8A0"}], "\ufa3d": [{"c": "\u6094", "n": "CJK UNIFIED IDEOGRAPH-6094"}], "\u6094": [{"c": "\ufa3d", "n": "CJK COMPATIBILITY IDEOGRAPH-FA3D"}, {"c": "\ud87e\udca3", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8A3"}], "\ud87e\udca3": [{"c": "\u6094", "n": "CJK UNIFIED IDEOGRAPH-6094"}], "\ud87e\udca5": [{"c": "\u60c7", "n": "CJK UNIFIED IDEOGRAPH-60C7"}], "\u60c7": [{"c": "\ud87e\udca5", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8A5"}], "\ufa86": [{"c": "\u60d8", "n": "CJK UNIFIED IDEOGRAPH-60D8"}], "\u60d8": [{"c": "\ufa86", "n": "CJK COMPATIBILITY IDEOGRAPH-FA86"}], "\uf9b9": [{"c": "\u60e1", "n": "CJK UNIFIED IDEOGRAPH-60E1"}], "\u60e1": [{"c": "\uf9b9", "n": "CJK COMPATIBILITY IDEOGRAPH-F9B9"}], "\ud87e\udca4": [{"c": "\ud849\uded4", "n": "CJK UNIFIED IDEOGRAPH-226D4"}], "\ud849\uded4": [{"c": "\ud87e\udca4", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8A4"}], "\ufa88": [{"c": "\u6108", "n": "CJK UNIFIED IDEOGRAPH-6108"}], "\u6108": [{"c": "\ufa88", "n": "CJK COMPATIBILITY IDEOGRAPH-FA88"}], "\ufa3e": [{"c": "\u6168", "n": "CJK UNIFIED IDEOGRAPH-6168"}], "\u6168": [{"c": "\ufa3e", "n": "CJK COMPATIBILITY IDEOGRAPH-FA3E"}], "\uf9d9": [{"c": "\u6144", "n": "CJK UNIFIED IDEOGRAPH-6144"}], "\u6144": [{"c": "\uf9d9", "n": "CJK COMPATIBILITY IDEOGRAPH-F9D9"}], "\ud87e\udca6": [{"c": "\u6148", "n": "CJK UNIFIED IDEOGRAPH-6148"}], "\u6148": [{"c": "\ud87e\udca6", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8A6"}], "\ud87e\udca7": [{"c": "\u614c", "n": "CJK UNIFIED IDEOGRAPH-614C"}], "\u614c": [{"c": "\ud87e\udca7", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8A7"}, {"c": "\ud87e\udca9", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8A9"}], "\ud87e\udca9": [{"c": "\u614c", "n": "CJK UNIFIED IDEOGRAPH-614C"}], "\ufa87": [{"c": "\u614e", "n": "CJK UNIFIED IDEOGRAPH-614E"}], "\u614e": [{"c": "\ufa87", "n": "CJK COMPATIBILITY IDEOGRAPH-FA87"}, {"c": "\ud87e\udca8", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8A8"}], "\ud87e\udca8": [{"c": "\u614e", "n": "CJK UNIFIED IDEOGRAPH-614E"}], "\ufa8a": [{"c": "\u6160", "n": "CJK UNIFIED IDEOGRAPH-6160"}], "\u6160": [{"c": "\ufa8a", "n": "CJK COMPATIBILITY IDEOGRAPH-FA8A"}], "\ud87e\udcaa": [{"c": "\u617a", "n": "CJK UNIFIED IDEOGRAPH-617A"}], "\u617a": [{"c": "\ud87e\udcaa", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8AA"}], "\ufa3f": [{"c": "\u618e", "n": "CJK UNIFIED IDEOGRAPH-618E"}], "\u618e": [{"c": "\ufa3f", "n": "CJK COMPATIBILITY IDEOGRAPH-FA3F"}, {"c": "\ufa89", "n": "CJK COMPATIBILITY IDEOGRAPH-FA89"}, {"c": "\ud87e\udcab", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8AB"}], "\ufa89": [{"c": "\u618e", "n": "CJK UNIFIED IDEOGRAPH-618E"}], "\ud87e\udcab": [{"c": "\u618e", "n": "CJK UNIFIED IDEOGRAPH-618E"}], "\uf98f": [{"c": "\u6190", "n": "CJK UNIFIED IDEOGRAPH-6190"}], "\u6190": [{"c": "\uf98f", "n": "CJK COMPATIBILITY IDEOGRAPH-F98F"}], "\ud87e\udcad": [{"c": "\u61a4", "n": "CJK UNIFIED IDEOGRAPH-61A4"}], "\u61a4": [{"c": "\ud87e\udcad", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8AD"}], "\ud87e\udcae": [{"c": "\u61af", "n": "CJK UNIFIED IDEOGRAPH-61AF"}], "\u61af": [{"c": "\ud87e\udcae", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8AE"}], "\ud87e\udcac": [{"c": "\u61b2", "n": "CJK UNIFIED IDEOGRAPH-61B2"}], "\u61b2": [{"c": "\ud87e\udcac", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8AC"}], "\ufad0": [{"c": "\ud84a\udc44", "n": "CJK UNIFIED IDEOGRAPH-22844"}], "\ud84a\udc44": [{"c": "\ufad0", "n": "CJK COMPATIBILITY IDEOGRAPH-FAD0"}], "\ufacf": [{"c": "\ud84a\udc4a", "n": "CJK UNIFIED IDEOGRAPH-2284A"}], "\ud84a\udc4a": [{"c": "\ufacf", "n": "CJK COMPATIBILITY IDEOGRAPH-FACF"}], "\ud87e\udcaf": [{"c": "\u61de", "n": "CJK UNIFIED IDEOGRAPH-61DE"}], "\u61de": [{"c": "\ud87e\udcaf", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8AF"}], "\ufa40": [{"c": "\u61f2", "n": "CJK UNIFIED IDEOGRAPH-61F2"}], "\u61f2": [{"c": "\ufa40", "n": "CJK COMPATIBILITY IDEOGRAPH-FA40"}, {"c": "\ufa8b", "n": "CJK COMPATIBILITY IDEOGRAPH-FA8B"}, {"c": "\ud87e\udcb0", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8B0"}], "\ufa8b": [{"c": "\u61f2", "n": "CJK UNIFIED IDEOGRAPH-61F2"}], "\ud87e\udcb0": [{"c": "\u61f2", "n": "CJK UNIFIED IDEOGRAPH-61F2"}], "\uf90d": [{"c": "\u61f6", "n": "CJK UNIFIED IDEOGRAPH-61F6"}], "\u61f6": [{"c": "\uf90d", "n": "CJK COMPATIBILITY IDEOGRAPH-F90D"}, {"c": "\ud87e\udcb1", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8B1"}], "\ud87e\udcb1": [{"c": "\u61f6", "n": "CJK UNIFIED IDEOGRAPH-61F6"}], "\uf990": [{"c": "\u6200", "n": "CJK UNIFIED IDEOGRAPH-6200"}], "\u6200": [{"c": "\uf990", "n": "CJK COMPATIBILITY IDEOGRAPH-F990"}], "\u2f3d": [{"c": "\u6208", "n": "CJK UNIFIED IDEOGRAPH-6208"}], "\u6208": [{"c": "\u2f3d", "n": "KANGXI RADICAL HALBERD"}], "\ud87e\udcb2": [{"c": "\u6210", "n": "CJK UNIFIED IDEOGRAPH-6210"}], "\u6210": [{"c": "\ud87e\udcb2", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8B2"}], "\ud87e\udcb3": [{"c": "\u621b", "n": "CJK UNIFIED IDEOGRAPH-621B"}], "\u621b": [{"c": "\ud87e\udcb3", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8B3"}], "\uf9d2": [{"c": "\u622e", "n": "CJK UNIFIED IDEOGRAPH-622E"}], "\u622e": [{"c": "\uf9d2", "n": "CJK COMPATIBILITY IDEOGRAPH-F9D2"}], "\ufa8c": [{"c": "\u6234", "n": "CJK UNIFIED IDEOGRAPH-6234"}], "\u6234": [{"c": "\ufa8c", "n": "CJK COMPATIBILITY IDEOGRAPH-FA8C"}], "\u2f3e": [{"c": "\u6236", "n": "CJK UNIFIED IDEOGRAPH-6236"}], "\u6236": [{"c": "\u2f3e", "n": "KANGXI RADICAL DOOR"}, {"c": "\u6238", "n": "CJK UNIFIED IDEOGRAPH-6238"}], "\u6238": [{"c": "\u6236", "n": "CJK UNIFIED IDEOGRAPH-6236"}], "\u2f3f": [{"c": "\u624b", "n": "CJK UNIFIED IDEOGRAPH-624B"}], "\u624b": [{"c": "\u2f3f", "n": "KANGXI RADICAL HAND"}], "\u2e98": [{"c": "\u624c", "n": "CJK UNIFIED IDEOGRAPH-624C"}], "\u624c": [{"c": "\u2e98", "n": "CJK RADICAL HAND"}], "\ud87e\udcb4": [{"c": "\u625d", "n": "CJK UNIFIED IDEOGRAPH-625D"}], "\u625d": [{"c": "\ud87e\udcb4", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8B4"}], "\ud87e\udcb5": [{"c": "\u62b1", "n": "CJK UNIFIED IDEOGRAPH-62B1"}], "\u62b1": [{"c": "\ud87e\udcb5", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8B5"}], "\uf925": [{"c": "\u62c9", "n": "CJK UNIFIED IDEOGRAPH-62C9"}], "\u62c9": [{"c": "\uf925", "n": "CJK COMPATIBILITY IDEOGRAPH-F925"}], "\uf95b": [{"c": "\u62cf", "n": "CJK UNIFIED IDEOGRAPH-62CF"}], "\u62cf": [{"c": "\uf95b", "n": "CJK COMPATIBILITY IDEOGRAPH-F95B"}], "\ufa02": [{"c": "\u62d3", "n": "CJK UNIFIED IDEOGRAPH-62D3"}], "\u62d3": [{"c": "\ufa02", "n": "CJK COMPATIBILITY IDEOGRAPH-FA02"}], "\ud87e\udcb6": [{"c": "\u62d4", "n": "CJK UNIFIED IDEOGRAPH-62D4"}], "\u62d4": [{"c": "\ud87e\udcb6", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8B6"}], "\ud87e\udcba": [{"c": "\u62fc", "n": "CJK UNIFIED IDEOGRAPH-62FC"}], "\u62fc": [{"c": "\ud87e\udcba", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8BA"}], "\uf973": [{"c": "\u62fe", "n": "CJK UNIFIED IDEOGRAPH-62FE"}], "\u62fe": [{"c": "\uf973", "n": "CJK COMPATIBILITY IDEOGRAPH-F973"}], "\ud87e\udcb8": [{"c": "\ud84a\udf0c", "n": "CJK UNIFIED IDEOGRAPH-22B0C"}], "\ud84a\udf0c": [{"c": "\ud87e\udcb8", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8B8"}], "\ud87e\udcb9": [{"c": "\u633d", "n": "CJK UNIFIED IDEOGRAPH-633D"}], "\u633d": [{"c": "\ud87e\udcb9", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8B9"}], "\ud87e\udcb7": [{"c": "\u6350", "n": "CJK UNIFIED IDEOGRAPH-6350"}], "\u6350": [{"c": "\ud87e\udcb7", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8B7"}], "\ud87e\udcbb": [{"c": "\u6368", "n": "CJK UNIFIED IDEOGRAPH-6368"}], "\u6368": [{"c": "\ud87e\udcbb", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8BB"}], "\uf9a4": [{"c": "\u637b", "n": "CJK UNIFIED IDEOGRAPH-637B"}], "\u637b": [{"c": "\uf9a4", "n": "CJK COMPATIBILITY IDEOGRAPH-F9A4"}], "\ud87e\udcbc": [{"c": "\u6383", "n": "CJK UNIFIED IDEOGRAPH-6383"}], "\u6383": [{"c": "\ud87e\udcbc", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8BC"}], "\uf975": [{"c": "\u63a0", "n": "CJK UNIFIED IDEOGRAPH-63A0"}], "\u63a0": [{"c": "\uf975", "n": "CJK COMPATIBILITY IDEOGRAPH-F975"}], "\ud87e\udcc1": [{"c": "\u63a9", "n": "CJK UNIFIED IDEOGRAPH-63A9"}], "\u63a9": [{"c": "\ud87e\udcc1", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8C1"}], "\ufa8d": [{"c": "\u63c4", "n": "CJK UNIFIED IDEOGRAPH-63C4"}], "\u63c4": [{"c": "\ufa8d", "n": "CJK COMPATIBILITY IDEOGRAPH-FA8D"}], "\ud87e\udcbd": [{"c": "\u63e4", "n": "CJK UNIFIED IDEOGRAPH-63E4"}], "\u63e4": [{"c": "\ud87e\udcbd", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8BD"}], "\ufa8f": [{"c": "\u6452", "n": "CJK UNIFIED IDEOGRAPH-6452"}], "\u6452": [{"c": "\ufa8f", "n": "CJK COMPATIBILITY IDEOGRAPH-FA8F"}], "\ud87e\udcbe": [{"c": "\ud84a\udff1", "n": "CJK UNIFIED IDEOGRAPH-22BF1"}], "\ud84a\udff1": [{"c": "\ud87e\udcbe", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8BE"}], "\ufa8e": [{"c": "\u641c", "n": "CJK UNIFIED IDEOGRAPH-641C"}], "\u641c": [{"c": "\ufa8e", "n": "CJK COMPATIBILITY IDEOGRAPH-FA8E"}], "\ud87e\udcbf": [{"c": "\u6422", "n": "CJK UNIFIED IDEOGRAPH-6422"}], "\u6422": [{"c": "\ud87e\udcbf", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8BF"}], "\ud87e\udcc0": [{"c": "\u63c5", "n": "CJK UNIFIED IDEOGRAPH-63C5"}], "\u63c5": [{"c": "\ud87e\udcc0", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8C0"}], "\ud87e\udcc3": [{"c": "\u6469", "n": "CJK UNIFIED IDEOGRAPH-6469"}], "\u6469": [{"c": "\ud87e\udcc3", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8C3"}], "\ud87e\udcc6": [{"c": "\u6477", "n": "CJK UNIFIED IDEOGRAPH-6477"}], "\u6477": [{"c": "\ud87e\udcc6", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8C6"}], "\ud87e\udcc4": [{"c": "\u647e", "n": "CJK UNIFIED IDEOGRAPH-647E"}], "\u647e": [{"c": "\ud87e\udcc4", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8C4"}], "\ud87e\udcc2": [{"c": "\u3a2e", "n": "CJK UNIFIED IDEOGRAPH-3A2E"}], "\u3a2e": [{"c": "\ud87e\udcc2", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8C2"}], "\u6409": [{"c": "\u3a41", "n": "CJK UNIFIED IDEOGRAPH-3A41"}], "\u3a41": [{"c": "\u6409", "n": "CJK UNIFIED IDEOGRAPH-6409"}], "\uf991": [{"c": "\u649a", "n": "CJK UNIFIED IDEOGRAPH-649A"}], "\u649a": [{"c": "\uf991", "n": "CJK COMPATIBILITY IDEOGRAPH-F991"}], "\ud87e\udcc5": [{"c": "\u649d", "n": "CJK UNIFIED IDEOGRAPH-649D"}], "\u649d": [{"c": "\ud87e\udcc5", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8C5"}], "\uf930": [{"c": "\u64c4", "n": "CJK UNIFIED IDEOGRAPH-64C4"}], "\u64c4": [{"c": "\uf930", "n": "CJK COMPATIBILITY IDEOGRAPH-F930"}], "\ud87e\udcc7": [{"c": "\u3a6c", "n": "CJK UNIFIED IDEOGRAPH-3A6C"}], "\u3a6c": [{"c": "\ud87e\udcc7", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8C7"}], "\u2f40": [{"c": "\u652f", "n": "CJK UNIFIED IDEOGRAPH-652F"}], "\u652f": [{"c": "\u2f40", "n": "KANGXI RADICAL BRANCH"}], "\u2f41": [{"c": "\u6534", "n": "CJK UNIFIED IDEOGRAPH-6534"}], "\u6534": [{"c": "\u2f41", "n": "KANGXI RADICAL RAP"}], "\u2e99": [{"c": "\u6535", "n": "CJK UNIFIED IDEOGRAPH-6535"}], "\u6535": [{"c": "\u2e99", "n": "CJK RADICAL RAP"}], "\ufa41": [{"c": "\u654f", "n": "CJK UNIFIED IDEOGRAPH-654F"}], "\u654f": [{"c": "\ufa41", "n": "CJK COMPATIBILITY IDEOGRAPH-FA41"}, {"c": "\ud87e\udcc8", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8C8"}], "\ud87e\udcc8": [{"c": "\u654f", "n": "CJK UNIFIED IDEOGRAPH-654F"}], "\ufa90": [{"c": "\u6556", "n": "CJK UNIFIED IDEOGRAPH-6556"}], "\u6556": [{"c": "\ufa90", "n": "CJK COMPATIBILITY IDEOGRAPH-FA90"}], "\ud87e\udcc9": [{"c": "\u656c", "n": "CJK UNIFIED IDEOGRAPH-656C"}], "\u656c": [{"c": "\ud87e\udcc9", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8C9"}], "\uf969": [{"c": "\u6578", "n": "CJK UNIFIED IDEOGRAPH-6578"}], "\u6578": [{"c": "\uf969", "n": "CJK COMPATIBILITY IDEOGRAPH-F969"}], "\ud87e\udcca": [{"c": "\ud84c\udc0a", "n": "CJK UNIFIED IDEOGRAPH-2300A"}], "\ud84c\udc0a": [{"c": "\ud87e\udcca", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8CA"}], "\u2f42": [{"c": "\u6587", "n": "CJK UNIFIED IDEOGRAPH-6587"}], "\u6587": [{"c": "\u2f42", "n": "KANGXI RADICAL SCRIPT"}], "\u2eeb": [{"c": "\u6589", "n": "CJK UNIFIED IDEOGRAPH-6589"}], "\u6589": [{"c": "\u2eeb", "n": "CJK RADICAL J-SIMPLIFIED EVEN"}], "\u2f43": [{"c": "\u6597", "n": "CJK UNIFIED IDEOGRAPH-6597"}], "\u6597": [{"c": "\u2f43", "n": "KANGXI RADICAL DIPPER"}], "\uf9be": [{"c": "\u6599", "n": "CJK UNIFIED IDEOGRAPH-6599"}], "\u6599": [{"c": "\uf9be", "n": "CJK COMPATIBILITY IDEOGRAPH-F9BE"}], "\u2f44": [{"c": "\u65a4", "n": "CJK UNIFIED IDEOGRAPH-65A4"}], "\u65a4": [{"c": "\u2f44", "n": "KANGXI RADICAL AXE"}], "\u2f45": [{"c": "\u65b9", "n": "CJK UNIFIED IDEOGRAPH-65B9"}], "\u65b9": [{"c": "\u2f45", "n": "KANGXI RADICAL SQUARE"}], "\uf983": [{"c": "\u65c5", "n": "CJK UNIFIED IDEOGRAPH-65C5"}], "\u65c5": [{"c": "\uf983", "n": "CJK COMPATIBILITY IDEOGRAPH-F983"}], "\u2f46": [{"c": "\u65e0", "n": "CJK UNIFIED IDEOGRAPH-65E0"}], "\u65e0": [{"c": "\u2f46", "n": "KANGXI RADICAL NOT"}], "\u2e9b": [{"c": "\u65e1", "n": "CJK UNIFIED IDEOGRAPH-65E1"}], "\u65e1": [{"c": "\u2e9b", "n": "CJK RADICAL CHOKE"}], "\ufa42": [{"c": "\u65e2", "n": "CJK UNIFIED IDEOGRAPH-65E2"}], "\u65e2": [{"c": "\ufa42", "n": "CJK COMPATIBILITY IDEOGRAPH-FA42"}], "\ud87e\udccb": [{"c": "\u65e3", "n": "CJK UNIFIED IDEOGRAPH-65E3"}], "\u65e3": [{"c": "\ud87e\udccb", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8CB"}], "\u2f47": [{"c": "\u65e5", "n": "CJK UNIFIED IDEOGRAPH-65E5"}], "\u65e5": [{"c": "\u2f47", "n": "KANGXI RADICAL SUN"}], "\uf9e0": [{"c": "\u6613", "n": "CJK UNIFIED IDEOGRAPH-6613"}], "\u6613": [{"c": "\uf9e0", "n": "CJK COMPATIBILITY IDEOGRAPH-F9E0"}], "\u66f6": [{"c": "\u3ada", "n": "CJK UNIFIED IDEOGRAPH-3ADA"}], "\u3ada": [{"c": "\u66f6", "n": "CJK UNIFIED IDEOGRAPH-66F6"}], "\ud87e\udcd1": [{"c": "\u3ae4", "n": "CJK UNIFIED IDEOGRAPH-3AE4"}], "\u3ae4": [{"c": "\ud87e\udcd1", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8D1"}], "\ud87e\udccd": [{"c": "\u6649", "n": "CJK UNIFIED IDEOGRAPH-6649"}], "\u6649": [{"c": "\ud87e\udccd", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8CD"}], "\u6669": [{"c": "\u665a", "n": "CJK UNIFIED IDEOGRAPH-665A"}], "\u665a": [{"c": "\u6669", "n": "CJK UNIFIED IDEOGRAPH-6669"}], "\ufa12": [{"c": "\u6674", "n": "CJK UNIFIED IDEOGRAPH-6674"}], "\u6674": [{"c": "\ufa12", "n": "CJK COMPATIBILITY IDEOGRAPH-FA12"}, {"c": "\ufa91", "n": "CJK COMPATIBILITY IDEOGRAPH-FA91"}], "\ufa91": [{"c": "\u6674", "n": "CJK UNIFIED IDEOGRAPH-6674"}], "\ufa43": [{"c": "\u6691", "n": "CJK UNIFIED IDEOGRAPH-6691"}], "\u6691": [{"c": "\ufa43", "n": "CJK COMPATIBILITY IDEOGRAPH-FA43"}, {"c": "\ud87e\udccf", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8CF"}], "\ud87e\udccf": [{"c": "\u6691", "n": "CJK UNIFIED IDEOGRAPH-6691"}], "\uf9c5": [{"c": "\u6688", "n": "CJK UNIFIED IDEOGRAPH-6688"}], "\u6688": [{"c": "\uf9c5", "n": "CJK COMPATIBILITY IDEOGRAPH-F9C5"}], "\ud87e\udcd0": [{"c": "\u3b08", "n": "CJK UNIFIED IDEOGRAPH-3B08"}], "\u3b08": [{"c": "\ud87e\udcd0", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8D0"}], "\ud87e\udcd5": [{"c": "\u669c", "n": "CJK UNIFIED IDEOGRAPH-669C"}], "\u669c": [{"c": "\ud87e\udcd5", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8D5"}], "\ufa06": [{"c": "\u66b4", "n": "CJK UNIFIED IDEOGRAPH-66B4"}], "\u66b4": [{"c": "\ufa06", "n": "CJK COMPATIBILITY IDEOGRAPH-FA06"}], "\uf98b": [{"c": "\u66c6", "n": "CJK UNIFIED IDEOGRAPH-66C6"}], "\u66c6": [{"c": "\uf98b", "n": "CJK COMPATIBILITY IDEOGRAPH-F98B"}], "\ud87e\udcce": [{"c": "\u3b19", "n": "CJK UNIFIED IDEOGRAPH-3B19"}], "\u3b19": [{"c": "\ud87e\udcce", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8CE"}], "\ud87e\udc97": [{"c": "\ud84c\udeb8", "n": "CJK UNIFIED IDEOGRAPH-232B8"}], "\ud84c\udeb8": [{"c": "\ud87e\udc97", "n": "CJK COMPATIBILITY IDEOGRAPH-2F897"}], "\u2f48": [{"c": "\u66f0", "n": "CJK UNIFIED IDEOGRAPH-66F0"}], "\u66f0": [{"c": "\u2f48", "n": "KANGXI RADICAL SAY"}], "\uf901": [{"c": "\u66f4", "n": "CJK UNIFIED IDEOGRAPH-66F4"}], "\u66f4": [{"c": "\uf901", "n": "CJK COMPATIBILITY IDEOGRAPH-F901"}], "\ud87e\udccc": [{"c": "\u66f8", "n": "CJK UNIFIED IDEOGRAPH-66F8"}], "\u66f8": [{"c": "\ud87e\udccc", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8CC"}], "\u2f49": [{"c": "\u6708", "n": "CJK UNIFIED IDEOGRAPH-6708"}], "\u6708": [{"c": "\u2f49", "n": "KANGXI RADICAL MOON"}], "\ud87e\udd80": [{"c": "\ud84c\udf5f", "n": "CJK UNIFIED IDEOGRAPH-2335F"}], "\ud84c\udf5f": [{"c": "\ud87e\udd80", "n": "CJK COMPATIBILITY IDEOGRAPH-2F980"}], "\u80a6": [{"c": "\u670c", "n": "CJK UNIFIED IDEOGRAPH-670C"}], "\u670c": [{"c": "\u80a6", "n": "CJK UNIFIED IDEOGRAPH-80A6"}], "\u80d0": [{"c": "\u670f", "n": "CJK UNIFIED IDEOGRAPH-670F"}], "\u670f": [{"c": "\u80d0", "n": "CJK UNIFIED IDEOGRAPH-80D0"}], "\u80ca": [{"c": "\u6710", "n": "CJK UNIFIED IDEOGRAPH-6710"}], "\u6710": [{"c": "\u80ca", "n": "CJK UNIFIED IDEOGRAPH-80CA"}], "\u8101": [{"c": "\u6713", "n": "CJK UNIFIED IDEOGRAPH-6713"}], "\u6713": [{"c": "\u8101", "n": "CJK UNIFIED IDEOGRAPH-8101"}], "\u80f6": [{"c": "\u3b35", "n": "CJK UNIFIED IDEOGRAPH-3B35"}], "\u3b35": [{"c": "\u80f6", "n": "CJK UNIFIED IDEOGRAPH-80F6"}], "\uf929": [{"c": "\u6717", "n": "CJK UNIFIED IDEOGRAPH-6717"}], "\u6717": [{"c": "\uf929", "n": "CJK COMPATIBILITY IDEOGRAPH-F929"}, {"c": "\ufa92", "n": "CJK COMPATIBILITY IDEOGRAPH-FA92"}, {"c": "\ud87e\udcd8", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8D8"}], "\ufa92": [{"c": "\u6717", "n": "CJK UNIFIED IDEOGRAPH-6717"}], "\ud87e\udcd8": [{"c": "\u6717", "n": "CJK UNIFIED IDEOGRAPH-6717"}], "\u8127": [{"c": "\u6718", "n": "CJK UNIFIED IDEOGRAPH-6718"}], "\u6718": [{"c": "\u8127", "n": "CJK UNIFIED IDEOGRAPH-8127"}], "\ufa93": [{"c": "\u671b", "n": "CJK UNIFIED IDEOGRAPH-671B"}], "\u671b": [{"c": "\ufa93", "n": "CJK COMPATIBILITY IDEOGRAPH-FA93"}, {"c": "\ud87e\udcd9", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8D9"}], "\ud87e\udcd9": [{"c": "\u671b", "n": "CJK UNIFIED IDEOGRAPH-671B"}], "\ud87e\udcda": [{"c": "\u6721", "n": "CJK UNIFIED IDEOGRAPH-6721"}], "\u6721": [{"c": "\ud87e\udcda", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8DA"}], "\u5e50": [{"c": "\u3b3a", "n": "CJK UNIFIED IDEOGRAPH-3B3A"}], "\u3b3a": [{"c": "\u5e50", "n": "CJK UNIFIED IDEOGRAPH-5E50"}], "\u4420": [{"c": "\u3b3b", "n": "CJK UNIFIED IDEOGRAPH-3B3B"}], "\u3b3b": [{"c": "\u4420", "n": "CJK UNIFIED IDEOGRAPH-4420"}], "\ud87e\udd89": [{"c": "\ud84c\udf93", "n": "CJK UNIFIED IDEOGRAPH-23393"}], "\ud84c\udf93": [{"c": "\ud87e\udd89", "n": "CJK COMPATIBILITY IDEOGRAPH-2F989"}], "\u81a7": [{"c": "\u6723", "n": "CJK UNIFIED IDEOGRAPH-6723"}], "\u6723": [{"c": "\u81a7", "n": "CJK UNIFIED IDEOGRAPH-81A7"}], "\ud87e\udd8a": [{"c": "\ud84c\udf9c", "n": "CJK UNIFIED IDEOGRAPH-2339C"}], "\ud84c\udf9c": [{"c": "\ud87e\udd8a", "n": "CJK COMPATIBILITY IDEOGRAPH-2F98A"}], "\u2f4a": [{"c": "\u6728", "n": "CJK UNIFIED IDEOGRAPH-6728"}], "\u6728": [{"c": "\u2f4a", "n": "KANGXI RADICAL TREE"}], "\uf9e1": [{"c": "\u674e", "n": "CJK UNIFIED IDEOGRAPH-674E"}], "\u674e": [{"c": "\uf9e1", "n": "CJK COMPATIBILITY IDEOGRAPH-F9E1"}], "\ud87e\udcdc": [{"c": "\u6753", "n": "CJK UNIFIED IDEOGRAPH-6753"}], "\u6753": [{"c": "\ud87e\udcdc", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8DC"}], "\ufa94": [{"c": "\u6756", "n": "CJK UNIFIED IDEOGRAPH-6756"}], "\u6756": [{"c": "\ufa94", "n": "CJK COMPATIBILITY IDEOGRAPH-FA94"}], "\ud87e\udcdb": [{"c": "\u675e", "n": "CJK UNIFIED IDEOGRAPH-675E"}], "\u675e": [{"c": "\ud87e\udcdb", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8DB"}], "\ud87e\udcdd": [{"c": "\ud84c\udfc3", "n": "CJK UNIFIED IDEOGRAPH-233C3"}], "\ud84c\udfc3": [{"c": "\ud87e\udcdd", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8DD"}], "\u67ff": [{"c": "\u676e", "n": "CJK UNIFIED IDEOGRAPH-676E"}], "\u676e": [{"c": "\u67ff", "n": "CJK UNIFIED IDEOGRAPH-67FF"}], "\uf9c8": [{"c": "\u677b", "n": "CJK UNIFIED IDEOGRAPH-677B"}], "\u677b": [{"c": "\uf9c8", "n": "CJK COMPATIBILITY IDEOGRAPH-F9C8"}], "\ud87e\udce0": [{"c": "\u6785", "n": "CJK UNIFIED IDEOGRAPH-6785"}], "\u6785": [{"c": "\ud87e\udce0", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8E0"}], "\uf9f4": [{"c": "\u6797", "n": "CJK UNIFIED IDEOGRAPH-6797"}], "\u6797": [{"c": "\uf9f4", "n": "CJK COMPATIBILITY IDEOGRAPH-F9F4"}], "\ud87e\udcde": [{"c": "\u3b49", "n": "CJK UNIFIED IDEOGRAPH-3B49"}], "\u3b49": [{"c": "\ud87e\udcde", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8DE"}], "\ufad1": [{"c": "\ud84c\udfd5", "n": "CJK UNIFIED IDEOGRAPH-233D5"}], "\ud84c\udfd5": [{"c": "\ufad1", "n": "CJK COMPATIBILITY IDEOGRAPH-FAD1"}], "\uf9c9": [{"c": "\u67f3", "n": "CJK UNIFIED IDEOGRAPH-67F3"}], "\u67f3": [{"c": "\uf9c9", "n": "CJK COMPATIBILITY IDEOGRAPH-F9C9"}], "\ud87e\udcdf": [{"c": "\u67fa", "n": "CJK UNIFIED IDEOGRAPH-67FA"}], "\u67fa": [{"c": "\ud87e\udcdf", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8DF"}], "\uf9da": [{"c": "\u6817", "n": "CJK UNIFIED IDEOGRAPH-6817"}], "\u6817": [{"c": "\uf9da", "n": "CJK COMPATIBILITY IDEOGRAPH-F9DA"}], "\ud87e\udce5": [{"c": "\u681f", "n": "CJK UNIFIED IDEOGRAPH-681F"}], "\u681f": [{"c": "\ud87e\udce5", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8E5"}], "\ud87e\udce1": [{"c": "\u6852", "n": "CJK UNIFIED IDEOGRAPH-6852"}], "\u6852": [{"c": "\ud87e\udce1", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8E1"}], "\ud87e\udce3": [{"c": "\ud84d\udc6d", "n": "CJK UNIFIED IDEOGRAPH-2346D"}], "\ud84d\udc6d": [{"c": "\ud87e\udce3", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8E3"}], "\uf97a": [{"c": "\u6881", "n": "CJK UNIFIED IDEOGRAPH-6881"}], "\u6881": [{"c": "\uf97a", "n": "CJK COMPATIBILITY IDEOGRAPH-F97A"}], "\ufa44": [{"c": "\u6885", "n": "CJK UNIFIED IDEOGRAPH-6885"}], "\u6885": [{"c": "\ufa44", "n": "CJK COMPATIBILITY IDEOGRAPH-FA44"}, {"c": "\ud87e\udce2", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8E2"}], "\ud87e\udce2": [{"c": "\u6885", "n": "CJK UNIFIED IDEOGRAPH-6885"}], "\ud87e\udce4": [{"c": "\u688e", "n": "CJK UNIFIED IDEOGRAPH-688E"}], "\u688e": [{"c": "\ud87e\udce4", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8E4"}], "\uf9e2": [{"c": "\u68a8", "n": "CJK UNIFIED IDEOGRAPH-68A8"}], "\u68a8": [{"c": "\uf9e2", "n": "CJK COMPATIBILITY IDEOGRAPH-F9E2"}], "\ud87e\udce6": [{"c": "\u6914", "n": "CJK UNIFIED IDEOGRAPH-6914"}], "\u6914": [{"c": "\ud87e\udce6", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8E6"}], "\ud87e\udce8": [{"c": "\u6942", "n": "CJK UNIFIED IDEOGRAPH-6942"}], "\u6942": [{"c": "\ud87e\udce8", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8E8"}], "\ufad2": [{"c": "\u3b9d", "n": "CJK UNIFIED IDEOGRAPH-3B9D"}], "\u3b9d": [{"c": "\ufad2", "n": "CJK COMPATIBILITY IDEOGRAPH-FAD2"}, {"c": "\ud87e\udce7", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8E7"}], "\ud87e\udce7": [{"c": "\u3b9d", "n": "CJK UNIFIED IDEOGRAPH-3B9D"}], "\u69e9": [{"c": "\u3ba3", "n": "CJK UNIFIED IDEOGRAPH-3BA3"}], "\u3ba3": [{"c": "\u69e9", "n": "CJK UNIFIED IDEOGRAPH-69E9"}], "\u6a27": [{"c": "\u699d", "n": "CJK UNIFIED IDEOGRAPH-699D"}], "\u699d": [{"c": "\u6a27", "n": "CJK UNIFIED IDEOGRAPH-6A27"}], "\ud87e\udce9": [{"c": "\u69a3", "n": "CJK UNIFIED IDEOGRAPH-69A3"}], "\u69a3": [{"c": "\ud87e\udce9", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8E9"}], "\ud87e\udcea": [{"c": "\u69ea", "n": "CJK UNIFIED IDEOGRAPH-69EA"}], "\u69ea": [{"c": "\ud87e\udcea", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8EA"}], "\uf914": [{"c": "\u6a02", "n": "CJK UNIFIED IDEOGRAPH-6A02"}], "\u6a02": [{"c": "\uf914", "n": "CJK COMPATIBILITY IDEOGRAPH-F914"}, {"c": "\uf95c", "n": "CJK COMPATIBILITY IDEOGRAPH-F95C"}, {"c": "\uf9bf", "n": "CJK COMPATIBILITY IDEOGRAPH-F9BF"}], "\uf95c": [{"c": "\u6a02", "n": "CJK UNIFIED IDEOGRAPH-6A02"}], "\uf9bf": [{"c": "\u6a02", "n": "CJK UNIFIED IDEOGRAPH-6A02"}], "\uf94c": [{"c": "\u6a13", "n": "CJK UNIFIED IDEOGRAPH-6A13"}], "\u6a13": [{"c": "\uf94c", "n": "CJK COMPATIBILITY IDEOGRAPH-F94C"}], "\ud87e\udcec": [{"c": "\ud84d\udea3", "n": "CJK UNIFIED IDEOGRAPH-236A3"}], "\ud84d\udea3": [{"c": "\ud87e\udcec", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8EC"}], "\ud87e\udceb": [{"c": "\u6aa8", "n": "CJK UNIFIED IDEOGRAPH-6AA8"}], "\u6aa8": [{"c": "\ud87e\udceb", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8EB"}], "\uf931": [{"c": "\u6ad3", "n": "CJK UNIFIED IDEOGRAPH-6AD3"}], "\u6ad3": [{"c": "\uf931", "n": "CJK COMPATIBILITY IDEOGRAPH-F931"}], "\ud87e\udced": [{"c": "\u6adb", "n": "CJK UNIFIED IDEOGRAPH-6ADB"}], "\u6adb": [{"c": "\ud87e\udced", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8ED"}], "\uf91d": [{"c": "\u6b04", "n": "CJK UNIFIED IDEOGRAPH-6B04"}], "\u6b04": [{"c": "\uf91d", "n": "CJK COMPATIBILITY IDEOGRAPH-F91D"}], "\ud87e\udcee": [{"c": "\u3c18", "n": "CJK UNIFIED IDEOGRAPH-3C18"}], "\u3c18": [{"c": "\ud87e\udcee", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8EE"}], "\u2f4b": [{"c": "\u6b20", "n": "CJK UNIFIED IDEOGRAPH-6B20"}], "\u6b20": [{"c": "\u2f4b", "n": "KANGXI RADICAL LACK"}], "\ud87e\udcef": [{"c": "\u6b21", "n": "CJK UNIFIED IDEOGRAPH-6B21"}], "\u6b21": [{"c": "\ud87e\udcef", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8EF"}], "\ud87e\udcf0": [{"c": "\ud84e\udca7", "n": "CJK UNIFIED IDEOGRAPH-238A7"}], "\ud84e\udca7": [{"c": "\ud87e\udcf0", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8F0"}], "\ud87e\udcf1": [{"c": "\u6b54", "n": "CJK UNIFIED IDEOGRAPH-6B54"}], "\u6b54": [{"c": "\ud87e\udcf1", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8F1"}], "\ud87e\udcf2": [{"c": "\u3c4e", "n": "CJK UNIFIED IDEOGRAPH-3C4E"}], "\u3c4e": [{"c": "\ud87e\udcf2", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8F2"}], "\u2f4c": [{"c": "\u6b62", "n": "CJK UNIFIED IDEOGRAPH-6B62"}], "\u6b62": [{"c": "\u2f4c", "n": "KANGXI RADICAL STOP"}], "\u2eed": [{"c": "\u6b6f", "n": "CJK UNIFIED IDEOGRAPH-6B6F"}], "\u6b6f": [{"c": "\u2eed", "n": "CJK RADICAL J-SIMPLIFIED TOOTH"}], "\ud87e\udcf3": [{"c": "\u6b72", "n": "CJK UNIFIED IDEOGRAPH-6B72"}], "\u6b72": [{"c": "\ud87e\udcf3", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8F3"}], "\uf98c": [{"c": "\u6b77", "n": "CJK UNIFIED IDEOGRAPH-6B77"}], "\u6b77": [{"c": "\uf98c", "n": "CJK COMPATIBILITY IDEOGRAPH-F98C"}], "\ufa95": [{"c": "\u6b79", "n": "CJK UNIFIED IDEOGRAPH-6B79"}], "\u6b79": [{"c": "\ufa95", "n": "CJK COMPATIBILITY IDEOGRAPH-FA95"}, {"c": "\u2f4d", "n": "KANGXI RADICAL DEATH"}], "\u2f4d": [{"c": "\u6b79", "n": "CJK UNIFIED IDEOGRAPH-6B79"}], "\u2e9e": [{"c": "\u6b7a", "n": "CJK UNIFIED IDEOGRAPH-6B7A"}], "\u6b7a": [{"c": "\u2e9e", "n": "CJK RADICAL DEATH"}], "\ud87e\udcf4": [{"c": "\u6b9f", "n": "CJK UNIFIED IDEOGRAPH-6B9F"}], "\u6b9f": [{"c": "\ud87e\udcf4", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8F4"}], "\uf9a5": [{"c": "\u6bae", "n": "CJK UNIFIED IDEOGRAPH-6BAE"}], "\u6bae": [{"c": "\uf9a5", "n": "CJK COMPATIBILITY IDEOGRAPH-F9A5"}], "\u2f4e": [{"c": "\u6bb3", "n": "CJK UNIFIED IDEOGRAPH-6BB3"}], "\u6bb3": [{"c": "\u2f4e", "n": "KANGXI RADICAL WEAPON"}], "\uf970": [{"c": "\u6bba", "n": "CJK UNIFIED IDEOGRAPH-6BBA"}], "\u6bba": [{"c": "\uf970", "n": "CJK COMPATIBILITY IDEOGRAPH-F970"}, {"c": "\ufa96", "n": "CJK COMPATIBILITY IDEOGRAPH-FA96"}, {"c": "\ud87e\udcf5", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8F5"}], "\ufa96": [{"c": "\u6bba", "n": "CJK UNIFIED IDEOGRAPH-6BBA"}], "\ud87e\udcf5": [{"c": "\u6bba", "n": "CJK UNIFIED IDEOGRAPH-6BBA"}], "\ud87e\udcf6": [{"c": "\u6bbb", "n": "CJK UNIFIED IDEOGRAPH-6BBB"}], "\u6bbb": [{"c": "\ud87e\udcf6", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8F6"}], "\ud87e\udcf7": [{"c": "\ud84e\ude8d", "n": "CJK UNIFIED IDEOGRAPH-23A8D"}], "\ud84e\ude8d": [{"c": "\ud87e\udcf7", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8F7"}], "\u2f4f": [{"c": "\u6bcb", "n": "CJK UNIFIED IDEOGRAPH-6BCB"}], "\u6bcb": [{"c": "\u2f4f", "n": "KANGXI RADICAL DO NOT"}], "\u2e9f": [{"c": "\u6bcd", "n": "CJK UNIFIED IDEOGRAPH-6BCD"}], "\u6bcd": [{"c": "\u2e9f", "n": "CJK RADICAL MOTHER"}], "\ud87e\udcf9": [{"c": "\ud84e\udefa", "n": "CJK UNIFIED IDEOGRAPH-23AFA"}], "\ud84e\udefa": [{"c": "\ud87e\udcf9", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8F9"}], "\u2f50": [{"c": "\u6bd4", "n": "CJK UNIFIED IDEOGRAPH-6BD4"}], "\u6bd4": [{"c": "\u2f50", "n": "KANGXI RADICAL COMPARE"}], "\u2f51": [{"c": "\u6bdb", "n": "CJK UNIFIED IDEOGRAPH-6BDB"}], "\u6bdb": [{"c": "\u2f51", "n": "KANGXI RADICAL FUR"}], "\u2f52": [{"c": "\u6c0f", "n": "CJK UNIFIED IDEOGRAPH-6C0F"}], "\u6c0f": [{"c": "\u2f52", "n": "KANGXI RADICAL CLAN"}], "\u2ea0": [{"c": "\u6c11", "n": "CJK UNIFIED IDEOGRAPH-6C11"}], "\u6c11": [{"c": "\u2ea0", "n": "CJK RADICAL CIVILIAN"}], "\u2f53": [{"c": "\u6c14", "n": "CJK UNIFIED IDEOGRAPH-6C14"}], "\u6c14": [{"c": "\u2f53", "n": "KANGXI RADICAL STEAM"}], "\u2f54": [{"c": "\u6c34", "n": "CJK UNIFIED IDEOGRAPH-6C34"}], "\u6c34": [{"c": "\u2f54", "n": "KANGXI RADICAL WATER"}], "\u2ea1": [{"c": "\u6c35", "n": "CJK UNIFIED IDEOGRAPH-6C35"}], "\u6c35": [{"c": "\u2ea1", "n": "CJK RADICAL WATER ONE"}], "\u2ea2": [{"c": "\u6c3a", "n": "CJK UNIFIED IDEOGRAPH-6C3A"}], "\u6c3a": [{"c": "\u2ea2", "n": "CJK RADICAL WATER TWO"}], "\ud87e\udcfa": [{"c": "\u6c4e", "n": "CJK UNIFIED IDEOGRAPH-6C4E"}], "\u6c4e": [{"c": "\ud87e\udcfa", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8FA"}], "\ud87e\udcfe": [{"c": "\u6c67", "n": "CJK UNIFIED IDEOGRAPH-6C67"}], "\u6c67": [{"c": "\ud87e\udcfe", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8FE"}], "\uf972": [{"c": "\u6c88", "n": "CJK UNIFIED IDEOGRAPH-6C88"}], "\u6c88": [{"c": "\uf972", "n": "CJK COMPATIBILITY IDEOGRAPH-F972"}], "\ud87e\udcfc": [{"c": "\u6cbf", "n": "CJK UNIFIED IDEOGRAPH-6CBF"}], "\u6cbf": [{"c": "\ud87e\udcfc", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8FC"}], "\uf968": [{"c": "\u6ccc", "n": "CJK UNIFIED IDEOGRAPH-6CCC"}], "\u6ccc": [{"c": "\uf968", "n": "CJK COMPATIBILITY IDEOGRAPH-F968"}], "\ud87e\udcfd": [{"c": "\u6ccd", "n": "CJK UNIFIED IDEOGRAPH-6CCD"}], "\u6ccd": [{"c": "\ud87e\udcfd", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8FD"}], "\uf9e3": [{"c": "\u6ce5", "n": "CJK UNIFIED IDEOGRAPH-6CE5"}], "\u6ce5": [{"c": "\uf9e3", "n": "CJK COMPATIBILITY IDEOGRAPH-F9E3"}], "\ud87e\udcfb": [{"c": "\ud84f\udcbc", "n": "CJK UNIFIED IDEOGRAPH-23CBC"}], "\ud84f\udcbc": [{"c": "\ud87e\udcfb", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8FB"}], "\uf915": [{"c": "\u6d1b", "n": "CJK UNIFIED IDEOGRAPH-6D1B"}], "\u6d1b": [{"c": "\uf915", "n": "CJK COMPATIBILITY IDEOGRAPH-F915"}], "\ufa05": [{"c": "\u6d1e", "n": "CJK UNIFIED IDEOGRAPH-6D1E"}], "\u6d1e": [{"c": "\ufa05", "n": "CJK COMPATIBILITY IDEOGRAPH-FA05"}], "\ud87e\udd07": [{"c": "\u6d34", "n": "CJK UNIFIED IDEOGRAPH-6D34"}], "\u6d34": [{"c": "\ud87e\udd07", "n": "CJK COMPATIBILITY IDEOGRAPH-2F907"}], "\ud87e\udd00": [{"c": "\u6d3e", "n": "CJK UNIFIED IDEOGRAPH-6D3E"}], "\u6d3e": [{"c": "\ud87e\udd00", "n": "CJK COMPATIBILITY IDEOGRAPH-2F900"}], "\uf9ca": [{"c": "\u6d41", "n": "CJK UNIFIED IDEOGRAPH-6D41"}], "\u6d41": [{"c": "\uf9ca", "n": "CJK COMPATIBILITY IDEOGRAPH-F9CA"}, {"c": "\ufa97", "n": "CJK COMPATIBILITY IDEOGRAPH-FA97"}, {"c": "\ud87e\udd02", "n": "CJK COMPATIBILITY IDEOGRAPH-2F902"}], "\ufa97": [{"c": "\u6d41", "n": "CJK UNIFIED IDEOGRAPH-6D41"}], "\ud87e\udd02": [{"c": "\u6d41", "n": "CJK UNIFIED IDEOGRAPH-6D41"}], "\ud87e\udcff": [{"c": "\u6d16", "n": "CJK UNIFIED IDEOGRAPH-6D16"}], "\u6d16": [{"c": "\ud87e\udcff", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8FF"}], "\ud87e\udd03": [{"c": "\u6d69", "n": "CJK UNIFIED IDEOGRAPH-6D69"}], "\u6d69": [{"c": "\ud87e\udd03", "n": "CJK COMPATIBILITY IDEOGRAPH-2F903"}], "\uf92a": [{"c": "\u6d6a", "n": "CJK UNIFIED IDEOGRAPH-6D6A"}], "\u6d6a": [{"c": "\uf92a", "n": "CJK COMPATIBILITY IDEOGRAPH-F92A"}], "\ufa45": [{"c": "\u6d77", "n": "CJK UNIFIED IDEOGRAPH-6D77"}], "\u6d77": [{"c": "\ufa45", "n": "CJK COMPATIBILITY IDEOGRAPH-FA45"}, {"c": "\ud87e\udd01", "n": "CJK COMPATIBILITY IDEOGRAPH-2F901"}], "\ud87e\udd01": [{"c": "\u6d77", "n": "CJK UNIFIED IDEOGRAPH-6D77"}], "\ud87e\udd04": [{"c": "\u6d78", "n": "CJK UNIFIED IDEOGRAPH-6D78"}], "\u6d78": [{"c": "\ud87e\udd04", "n": "CJK COMPATIBILITY IDEOGRAPH-2F904"}], "\ud87e\udd05": [{"c": "\u6d85", "n": "CJK UNIFIED IDEOGRAPH-6D85"}], "\u6d85": [{"c": "\ud87e\udd05", "n": "CJK COMPATIBILITY IDEOGRAPH-2F905"}], "\ud87e\udd06": [{"c": "\ud84f\udd1e", "n": "CJK UNIFIED IDEOGRAPH-23D1E"}], "\ud84f\udd1e": [{"c": "\ud87e\udd06", "n": "CJK COMPATIBILITY IDEOGRAPH-2F906"}], "\uf9f5": [{"c": "\u6dcb", "n": "CJK UNIFIED IDEOGRAPH-6DCB"}], "\u6dcb": [{"c": "\uf9f5", "n": "CJK COMPATIBILITY IDEOGRAPH-F9F5"}], "\uf94d": [{"c": "\u6dda", "n": "CJK UNIFIED IDEOGRAPH-6DDA"}], "\u6dda": [{"c": "\uf94d", "n": "CJK COMPATIBILITY IDEOGRAPH-F94D"}], "\uf9d6": [{"c": "\u6dea", "n": "CJK UNIFIED IDEOGRAPH-6DEA"}], "\u6dea": [{"c": "\uf9d6", "n": "CJK COMPATIBILITY IDEOGRAPH-F9D6"}], "\ud87e\udd0e": [{"c": "\u6df9", "n": "CJK UNIFIED IDEOGRAPH-6DF9"}], "\u6df9": [{"c": "\ud87e\udd0e", "n": "CJK COMPATIBILITY IDEOGRAPH-2F90E"}], "\ufa46": [{"c": "\u6e1a", "n": "CJK UNIFIED IDEOGRAPH-6E1A"}], "\u6e1a": [{"c": "\ufa46", "n": "CJK COMPATIBILITY IDEOGRAPH-FA46"}], "\ud87e\udd08": [{"c": "\u6e2f", "n": "CJK UNIFIED IDEOGRAPH-6E2F"}], "\u6e2f": [{"c": "\ud87e\udd08", "n": "CJK COMPATIBILITY IDEOGRAPH-2F908"}], "\ud87e\udd09": [{"c": "\u6e6e", "n": "CJK UNIFIED IDEOGRAPH-6E6E"}], "\u6e6e": [{"c": "\ud87e\udd09", "n": "CJK COMPATIBILITY IDEOGRAPH-2F909"}], "\u6f59": [{"c": "\u6e88", "n": "CJK UNIFIED IDEOGRAPH-6E88"}], "\u6e88": [{"c": "\u6f59", "n": "CJK UNIFIED IDEOGRAPH-6F59"}], "\ufa99": [{"c": "\u6ecb", "n": "CJK UNIFIED IDEOGRAPH-6ECB"}], "\u6ecb": [{"c": "\ufa99", "n": "CJK COMPATIBILITY IDEOGRAPH-FA99"}, {"c": "\ud87e\udd0b", "n": "CJK COMPATIBILITY IDEOGRAPH-2F90B"}], "\ud87e\udd0b": [{"c": "\u6ecb", "n": "CJK UNIFIED IDEOGRAPH-6ECB"}], "\uf9cb": [{"c": "\u6e9c", "n": "CJK UNIFIED IDEOGRAPH-6E9C"}], "\u6e9c": [{"c": "\uf9cb", "n": "CJK COMPATIBILITY IDEOGRAPH-F9CB"}], "\uf9ec": [{"c": "\u6eba", "n": "CJK UNIFIED IDEOGRAPH-6EBA"}], "\u6eba": [{"c": "\uf9ec", "n": "CJK COMPATIBILITY IDEOGRAPH-F9EC"}], "\ud87e\udd0c": [{"c": "\u6ec7", "n": "CJK UNIFIED IDEOGRAPH-6EC7"}], "\u6ec7": [{"c": "\ud87e\udd0c", "n": "CJK COMPATIBILITY IDEOGRAPH-2F90C"}], "\uf904": [{"c": "\u6ed1", "n": "CJK UNIFIED IDEOGRAPH-6ED1"}], "\u6ed1": [{"c": "\uf904", "n": "CJK COMPATIBILITY IDEOGRAPH-F904"}], "\ufa98": [{"c": "\u6edb", "n": "CJK UNIFIED IDEOGRAPH-6EDB"}], "\u6edb": [{"c": "\ufa98", "n": "CJK COMPATIBILITY IDEOGRAPH-FA98"}], "\ud87e\udd0a": [{"c": "\u3d33", "n": "CJK UNIFIED IDEOGRAPH-3D33"}], "\u3d33": [{"c": "\ud87e\udd0a", "n": "CJK COMPATIBILITY IDEOGRAPH-2F90A"}], "\uf94e": [{"c": "\u6f0f", "n": "CJK UNIFIED IDEOGRAPH-6F0F"}], "\u6f0f": [{"c": "\uf94e", "n": "CJK COMPATIBILITY IDEOGRAPH-F94E"}], "\ufa47": [{"c": "\u6f22", "n": "CJK UNIFIED IDEOGRAPH-6F22"}], "\u6f22": [{"c": "\ufa47", "n": "CJK COMPATIBILITY IDEOGRAPH-FA47"}, {"c": "\ufa9a", "n": "CJK COMPATIBILITY IDEOGRAPH-FA9A"}], "\ufa9a": [{"c": "\u6f22", "n": "CJK UNIFIED IDEOGRAPH-6F22"}], "\uf992": [{"c": "\u6f23", "n": "CJK UNIFIED IDEOGRAPH-6F23"}], "\u6f23": [{"c": "\uf992", "n": "CJK COMPATIBILITY IDEOGRAPH-F992"}], "\ud87e\udd0d": [{"c": "\ud84f\uded1", "n": "CJK UNIFIED IDEOGRAPH-23ED1"}], "\ud84f\uded1": [{"c": "\ud87e\udd0d", "n": "CJK COMPATIBILITY IDEOGRAPH-2F90D"}], "\ud87e\udd0f": [{"c": "\u6f6e", "n": "CJK UNIFIED IDEOGRAPH-6F6E"}], "\u6f6e": [{"c": "\ud87e\udd0f", "n": "CJK COMPATIBILITY IDEOGRAPH-2F90F"}], "\ud87e\udd10": [{"c": "\ud84f\udf5e", "n": "CJK UNIFIED IDEOGRAPH-23F5E"}], "\ud84f\udf5e": [{"c": "\ud87e\udd10", "n": "CJK COMPATIBILITY IDEOGRAPH-2F910"}], "\ud87e\udd11": [{"c": "\ud84f\udf8e", "n": "CJK UNIFIED IDEOGRAPH-23F8E"}], "\ud84f\udf8e": [{"c": "\ud87e\udd11", "n": "CJK COMPATIBILITY IDEOGRAPH-2F911"}], "\ud87e\udd12": [{"c": "\u6fc6", "n": "CJK UNIFIED IDEOGRAPH-6FC6"}], "\u6fc6": [{"c": "\ud87e\udd12", "n": "CJK COMPATIBILITY IDEOGRAPH-2F912"}], "\uf922": [{"c": "\u6feb", "n": "CJK UNIFIED IDEOGRAPH-6FEB"}], "\u6feb": [{"c": "\uf922", "n": "CJK COMPATIBILITY IDEOGRAPH-F922"}], "\uf984": [{"c": "\u6ffe", "n": "CJK UNIFIED IDEOGRAPH-6FFE"}], "\u6ffe": [{"c": "\uf984", "n": "CJK COMPATIBILITY IDEOGRAPH-F984"}], "\ud87e\udd15": [{"c": "\u701b", "n": "CJK UNIFIED IDEOGRAPH-701B"}], "\u701b": [{"c": "\ud87e\udd15", "n": "CJK COMPATIBILITY IDEOGRAPH-2F915"}], "\ufa9b": [{"c": "\u701e", "n": "CJK UNIFIED IDEOGRAPH-701E"}], "\u701e": [{"c": "\ufa9b", "n": "CJK COMPATIBILITY IDEOGRAPH-FA9B"}, {"c": "\ud87e\udd14", "n": "CJK COMPATIBILITY IDEOGRAPH-2F914"}], "\ud87e\udd14": [{"c": "\u701e", "n": "CJK UNIFIED IDEOGRAPH-701E"}], "\ud87e\udd13": [{"c": "\u7039", "n": "CJK UNIFIED IDEOGRAPH-7039"}], "\u7039": [{"c": "\ud87e\udd13", "n": "CJK COMPATIBILITY IDEOGRAPH-2F913"}], "\ud87e\udd17": [{"c": "\u704a", "n": "CJK UNIFIED IDEOGRAPH-704A"}], "\u704a": [{"c": "\ud87e\udd17", "n": "CJK COMPATIBILITY IDEOGRAPH-2F917"}], "\ud87e\udd16": [{"c": "\u3d96", "n": "CJK UNIFIED IDEOGRAPH-3D96"}], "\u3d96": [{"c": "\ud87e\udd16", "n": "CJK COMPATIBILITY IDEOGRAPH-2F916"}], "\u2f55": [{"c": "\u706b", "n": "CJK UNIFIED IDEOGRAPH-706B"}], "\u706b": [{"c": "\u2f55", "n": "KANGXI RADICAL FIRE"}], "\u2ea3": [{"c": "\u706c", "n": "CJK UNIFIED IDEOGRAPH-706C"}], "\u706c": [{"c": "\u2ea3", "n": "CJK RADICAL FIRE"}], "\ud87e\udc35": [{"c": "\u7070", "n": "CJK UNIFIED IDEOGRAPH-7070"}], "\u7070": [{"c": "\ud87e\udc35", "n": "CJK COMPATIBILITY IDEOGRAPH-2F835"}], "\ud87e\udd19": [{"c": "\u7077", "n": "CJK UNIFIED IDEOGRAPH-7077"}], "\u7077": [{"c": "\ud87e\udd19", "n": "CJK COMPATIBILITY IDEOGRAPH-2F919"}], "\ud87e\udd18": [{"c": "\u707d", "n": "CJK UNIFIED IDEOGRAPH-707D"}], "\u707d": [{"c": "\ud87e\udd18", "n": "CJK COMPATIBILITY IDEOGRAPH-2F918"}], "\uf9fb": [{"c": "\u7099", "n": "CJK UNIFIED IDEOGRAPH-7099"}], "\u7099": [{"c": "\uf9fb", "n": "CJK COMPATIBILITY IDEOGRAPH-F9FB"}], "\ud87e\udd1a": [{"c": "\u70ad", "n": "CJK UNIFIED IDEOGRAPH-70AD"}], "\u70ad": [{"c": "\ud87e\udd1a", "n": "CJK COMPATIBILITY IDEOGRAPH-2F91A"}], "\uf99f": [{"c": "\u70c8", "n": "CJK UNIFIED IDEOGRAPH-70C8"}], "\u70c8": [{"c": "\uf99f", "n": "CJK COMPATIBILITY IDEOGRAPH-F99F"}], "\uf916": [{"c": "\u70d9", "n": "CJK UNIFIED IDEOGRAPH-70D9"}], "\u70d9": [{"c": "\uf916", "n": "CJK COMPATIBILITY IDEOGRAPH-F916"}], "\ufa48": [{"c": "\u716e", "n": "CJK UNIFIED IDEOGRAPH-716E"}], "\u716e": [{"c": "\ufa48", "n": "CJK COMPATIBILITY IDEOGRAPH-FA48"}, {"c": "\ufa9c", "n": "CJK COMPATIBILITY IDEOGRAPH-FA9C"}], "\ufa9c": [{"c": "\u716e", "n": "CJK UNIFIED IDEOGRAPH-716E"}], "\ud87e\udd1d": [{"c": "\ud850\ude63", "n": "CJK UNIFIED IDEOGRAPH-24263"}], "\ud850\ude63": [{"c": "\ud87e\udd1d", "n": "CJK COMPATIBILITY IDEOGRAPH-2F91D"}], "\ud87e\udd1c": [{"c": "\u7145", "n": "CJK UNIFIED IDEOGRAPH-7145"}], "\u7145": [{"c": "\ud87e\udd1c", "n": "CJK COMPATIBILITY IDEOGRAPH-2F91C"}], "\uf993": [{"c": "\u7149", "n": "CJK UNIFIED IDEOGRAPH-7149"}], "\u7149": [{"c": "\uf993", "n": "CJK COMPATIBILITY IDEOGRAPH-F993"}], "\ufa6c": [{"c": "\ud850\udeee", "n": "CJK UNIFIED IDEOGRAPH-242EE"}], "\ud850\udeee": [{"c": "\ufa6c", "n": "CJK COMPATIBILITY IDEOGRAPH-FA6C"}], "\ud87e\udd1e": [{"c": "\u719c", "n": "CJK UNIFIED IDEOGRAPH-719C"}], "\u719c": [{"c": "\ud87e\udd1e", "n": "CJK COMPATIBILITY IDEOGRAPH-2F91E"}], "\uf9c0": [{"c": "\u71ce", "n": "CJK UNIFIED IDEOGRAPH-71CE"}], "\u71ce": [{"c": "\uf9c0", "n": "CJK COMPATIBILITY IDEOGRAPH-F9C0"}], "\uf9ee": [{"c": "\u71d0", "n": "CJK UNIFIED IDEOGRAPH-71D0"}], "\u71d0": [{"c": "\uf9ee", "n": "CJK COMPATIBILITY IDEOGRAPH-F9EE"}], "\ud87e\udd1f": [{"c": "\ud850\udfab", "n": "CJK UNIFIED IDEOGRAPH-243AB"}], "\ud850\udfab": [{"c": "\ud87e\udd1f", "n": "CJK COMPATIBILITY IDEOGRAPH-2F91F"}], "\uf932": [{"c": "\u7210", "n": "CJK UNIFIED IDEOGRAPH-7210"}], "\u7210": [{"c": "\uf932", "n": "CJK COMPATIBILITY IDEOGRAPH-F932"}], "\uf91e": [{"c": "\u721b", "n": "CJK UNIFIED IDEOGRAPH-721B"}], "\u721b": [{"c": "\uf91e", "n": "CJK COMPATIBILITY IDEOGRAPH-F91E"}], "\ud87e\udd20": [{"c": "\u7228", "n": "CJK UNIFIED IDEOGRAPH-7228"}], "\u7228": [{"c": "\ud87e\udd20", "n": "CJK COMPATIBILITY IDEOGRAPH-2F920"}], "\u2f56": [{"c": "\u722a", "n": "CJK UNIFIED IDEOGRAPH-722A"}], "\u722a": [{"c": "\u2f56", "n": "KANGXI RADICAL CLAW"}], "\ufa49": [{"c": "\u722b", "n": "CJK UNIFIED IDEOGRAPH-722B"}], "\u722b": [{"c": "\ufa49", "n": "CJK COMPATIBILITY IDEOGRAPH-FA49"}, {"c": "\u2ea4", "n": "CJK RADICAL PAW ONE"}], "\u2ea4": [{"c": "\u722b", "n": "CJK UNIFIED IDEOGRAPH-722B"}], "\ufa9e": [{"c": "\u7235", "n": "CJK UNIFIED IDEOGRAPH-7235"}], "\u7235": [{"c": "\ufa9e", "n": "CJK COMPATIBILITY IDEOGRAPH-FA9E"}, {"c": "\ud87e\udd21", "n": "CJK COMPATIBILITY IDEOGRAPH-2F921"}], "\ud87e\udd21": [{"c": "\u7235", "n": "CJK UNIFIED IDEOGRAPH-7235"}], "\u2f57": [{"c": "\u7236", "n": "CJK UNIFIED IDEOGRAPH-7236"}], "\u7236": [{"c": "\u2f57", "n": "KANGXI RADICAL FATHER"}], "\u2f58": [{"c": "\u723b", "n": "CJK UNIFIED IDEOGRAPH-723B"}], "\u723b": [{"c": "\u2f58", "n": "KANGXI RADICAL DOUBLE X"}], "\u2ea6": [{"c": "\u4e2c", "n": "CJK UNIFIED IDEOGRAPH-4E2C"}], "\u4e2c": [{"c": "\u2ea6", "n": "CJK RADICAL SIMPLIFIED HALF TREE TRUNK"}], "\u2f59": [{"c": "\u723f", "n": "CJK UNIFIED IDEOGRAPH-723F"}], "\u723f": [{"c": "\u2f59", "n": "KANGXI RADICAL HALF TREE TRUNK"}], "\u2f5a": [{"c": "\u7247", "n": "CJK UNIFIED IDEOGRAPH-7247"}], "\u7247": [{"c": "\u2f5a", "n": "KANGXI RADICAL SLICE"}], "\ud87e\udd22": [{"c": "\u7250", "n": "CJK UNIFIED IDEOGRAPH-7250"}], "\u7250": [{"c": "\ud87e\udd22", "n": "CJK COMPATIBILITY IDEOGRAPH-2F922"}], "\u2f5b": [{"c": "\u7259", "n": "CJK UNIFIED IDEOGRAPH-7259"}], "\u7259": [{"c": "\u2f5b", "n": "KANGXI RADICAL FANG"}], "\ud87e\udd23": [{"c": "\ud851\ude08", "n": "CJK UNIFIED IDEOGRAPH-24608"}], "\ud851\ude08": [{"c": "\ud87e\udd23", "n": "CJK COMPATIBILITY IDEOGRAPH-2F923"}], "\u2f5c": [{"c": "\u725b", "n": "CJK UNIFIED IDEOGRAPH-725B"}], "\u725b": [{"c": "\u2f5c", "n": "KANGXI RADICAL COW"}], "\uf946": [{"c": "\u7262", "n": "CJK UNIFIED IDEOGRAPH-7262"}], "\u7262": [{"c": "\uf946", "n": "CJK COMPATIBILITY IDEOGRAPH-F946"}], "\ud87e\udd24": [{"c": "\u7280", "n": "CJK UNIFIED IDEOGRAPH-7280"}], "\u7280": [{"c": "\ud87e\udd24", "n": "CJK COMPATIBILITY IDEOGRAPH-2F924"}], "\ud87e\udd25": [{"c": "\u7295", "n": "CJK UNIFIED IDEOGRAPH-7295"}], "\u7295": [{"c": "\ud87e\udd25", "n": "CJK COMPATIBILITY IDEOGRAPH-2F925"}], "\u2f5d": [{"c": "\u72ac", "n": "CJK UNIFIED IDEOGRAPH-72AC"}], "\u72ac": [{"c": "\u2f5d", "n": "KANGXI RADICAL DOG"}], "\u2ea8": [{"c": "\u72ad", "n": "CJK UNIFIED IDEOGRAPH-72AD"}], "\u72ad": [{"c": "\u2ea8", "n": "CJK RADICAL DOG"}], "\ufa9f": [{"c": "\u72af", "n": "CJK UNIFIED IDEOGRAPH-72AF"}], "\u72af": [{"c": "\ufa9f", "n": "CJK COMPATIBILITY IDEOGRAPH-FA9F"}], "\uf9fa": [{"c": "\u72c0", "n": "CJK UNIFIED IDEOGRAPH-72C0"}], "\u72c0": [{"c": "\uf9fa", "n": "CJK COMPATIBILITY IDEOGRAPH-F9FA"}], "\ud87e\udd26": [{"c": "\ud851\udf35", "n": "CJK UNIFIED IDEOGRAPH-24735"}], "\ud851\udf35": [{"c": "\ud87e\udd26", "n": "CJK COMPATIBILITY IDEOGRAPH-2F926"}], "\uf92b": [{"c": "\u72fc", "n": "CJK UNIFIED IDEOGRAPH-72FC"}], "\u72fc": [{"c": "\uf92b", "n": "CJK COMPATIBILITY IDEOGRAPH-F92B"}], "\ufa16": [{"c": "\u732a", "n": "CJK UNIFIED IDEOGRAPH-732A"}], "\u732a": [{"c": "\ufa16", "n": "CJK COMPATIBILITY IDEOGRAPH-FA16"}, {"c": "\ufaa0", "n": "CJK COMPATIBILITY IDEOGRAPH-FAA0"}], "\ufaa0": [{"c": "\u732a", "n": "CJK UNIFIED IDEOGRAPH-732A"}], "\ud87e\udd27": [{"c": "\ud852\udc14", "n": "CJK UNIFIED IDEOGRAPH-24814"}], "\ud852\udc14": [{"c": "\ud87e\udd27", "n": "CJK COMPATIBILITY IDEOGRAPH-2F927"}], "\uf9a7": [{"c": "\u7375", "n": "CJK UNIFIED IDEOGRAPH-7375"}], "\u7375": [{"c": "\uf9a7", "n": "CJK COMPATIBILITY IDEOGRAPH-F9A7"}], "\ud87e\udd28": [{"c": "\u737a", "n": "CJK UNIFIED IDEOGRAPH-737A"}], "\u737a": [{"c": "\ud87e\udd28", "n": "CJK COMPATIBILITY IDEOGRAPH-2F928"}], "\u2f5e": [{"c": "\u7384", "n": "CJK UNIFIED IDEOGRAPH-7384"}], "\u7384": [{"c": "\u2f5e", "n": "KANGXI RADICAL PROFOUND"}], "\uf961": [{"c": "\u7387", "n": "CJK UNIFIED IDEOGRAPH-7387"}], "\u7387": [{"c": "\uf961", "n": "CJK COMPATIBILITY IDEOGRAPH-F961"}, {"c": "\uf9db", "n": "CJK COMPATIBILITY IDEOGRAPH-F9DB"}], "\uf9db": [{"c": "\u7387", "n": "CJK UNIFIED IDEOGRAPH-7387"}], "\u2f5f": [{"c": "\u7389", "n": "CJK UNIFIED IDEOGRAPH-7389"}], "\u7389": [{"c": "\u2f5f", "n": "KANGXI RADICAL JADE"}], "\ud87e\udd29": [{"c": "\u738b", "n": "CJK UNIFIED IDEOGRAPH-738B"}], "\u738b": [{"c": "\ud87e\udd29", "n": "CJK COMPATIBILITY IDEOGRAPH-2F929"}], "\ud87e\udd2a": [{"c": "\u3eac", "n": "CJK UNIFIED IDEOGRAPH-3EAC"}], "\u3eac": [{"c": "\ud87e\udd2a", "n": "CJK COMPATIBILITY IDEOGRAPH-2F92A"}], "\ud87e\udd2b": [{"c": "\u73a5", "n": "CJK UNIFIED IDEOGRAPH-73A5"}], "\u73a5": [{"c": "\ud87e\udd2b", "n": "CJK COMPATIBILITY IDEOGRAPH-2F92B"}], "\uf9ad": [{"c": "\u73b2", "n": "CJK UNIFIED IDEOGRAPH-73B2"}], "\u73b2": [{"c": "\uf9ad", "n": "CJK COMPATIBILITY IDEOGRAPH-F9AD"}], "\ud87e\udd2c": [{"c": "\u3eb8", "n": "CJK UNIFIED IDEOGRAPH-3EB8"}], "\u3eb8": [{"c": "\ud87e\udd2c", "n": "CJK COMPATIBILITY IDEOGRAPH-2F92C"}, {"c": "\ud87e\udd2d", "n": "CJK COMPATIBILITY IDEOGRAPH-2F92D"}], "\ud87e\udd2d": [{"c": "\u3eb8", "n": "CJK UNIFIED IDEOGRAPH-3EB8"}], "\uf917": [{"c": "\u73de", "n": "CJK UNIFIED IDEOGRAPH-73DE"}], "\u73de": [{"c": "\uf917", "n": "CJK COMPATIBILITY IDEOGRAPH-F917"}], "\uf9cc": [{"c": "\u7409", "n": "CJK UNIFIED IDEOGRAPH-7409"}], "\u7409": [{"c": "\uf9cc", "n": "CJK COMPATIBILITY IDEOGRAPH-F9CC"}], "\uf9e4": [{"c": "\u7406", "n": "CJK UNIFIED IDEOGRAPH-7406"}], "\u7406": [{"c": "\uf9e4", "n": "CJK COMPATIBILITY IDEOGRAPH-F9E4"}], "\ufa4a": [{"c": "\u7422", "n": "CJK UNIFIED IDEOGRAPH-7422"}], "\u7422": [{"c": "\ufa4a", "n": "CJK COMPATIBILITY IDEOGRAPH-FA4A"}], "\ud87e\udd2e": [{"c": "\u7447", "n": "CJK UNIFIED IDEOGRAPH-7447"}], "\u7447": [{"c": "\ud87e\udd2e", "n": "CJK COMPATIBILITY IDEOGRAPH-2F92E"}], "\ud87e\udd2f": [{"c": "\u745c", "n": "CJK UNIFIED IDEOGRAPH-745C"}], "\u745c": [{"c": "\ud87e\udd2f", "n": "CJK COMPATIBILITY IDEOGRAPH-2F92F"}], "\uf9ae": [{"c": "\u7469", "n": "CJK UNIFIED IDEOGRAPH-7469"}], "\u7469": [{"c": "\uf9ae", "n": "CJK COMPATIBILITY IDEOGRAPH-F9AE"}], "\ufaa1": [{"c": "\u7471", "n": "CJK UNIFIED IDEOGRAPH-7471"}], "\u7471": [{"c": "\ufaa1", "n": "CJK COMPATIBILITY IDEOGRAPH-FAA1"}, {"c": "\ud87e\udd30", "n": "CJK COMPATIBILITY IDEOGRAPH-2F930"}], "\ud87e\udd30": [{"c": "\u7471", "n": "CJK UNIFIED IDEOGRAPH-7471"}], "\ud87e\udd31": [{"c": "\u7485", "n": "CJK UNIFIED IDEOGRAPH-7485"}], "\u7485": [{"c": "\ud87e\udd31", "n": "CJK COMPATIBILITY IDEOGRAPH-2F931"}], "\uf994": [{"c": "\u7489", "n": "CJK UNIFIED IDEOGRAPH-7489"}], "\u7489": [{"c": "\uf994", "n": "CJK COMPATIBILITY IDEOGRAPH-F994"}], "\uf9ef": [{"c": "\u7498", "n": "CJK UNIFIED IDEOGRAPH-7498"}], "\u7498": [{"c": "\uf9ef", "n": "CJK COMPATIBILITY IDEOGRAPH-F9EF"}], "\ud87e\udd32": [{"c": "\u74ca", "n": "CJK UNIFIED IDEOGRAPH-74CA"}], "\u74ca": [{"c": "\ud87e\udd32", "n": "CJK COMPATIBILITY IDEOGRAPH-2F932"}], "\u2f60": [{"c": "\u74dc", "n": "CJK UNIFIED IDEOGRAPH-74DC"}], "\u74dc": [{"c": "\u2f60", "n": "KANGXI RADICAL MELON"}], "\u2f61": [{"c": "\u74e6", "n": "CJK UNIFIED IDEOGRAPH-74E6"}], "\u74e6": [{"c": "\u2f61", "n": "KANGXI RADICAL TILE"}], "\ud87e\udd33": [{"c": "\u3f1b", "n": "CJK UNIFIED IDEOGRAPH-3F1B"}], "\u3f1b": [{"c": "\ud87e\udd33", "n": "CJK COMPATIBILITY IDEOGRAPH-2F933"}], "\ufaa2": [{"c": "\u7506", "n": "CJK UNIFIED IDEOGRAPH-7506"}], "\u7506": [{"c": "\ufaa2", "n": "CJK COMPATIBILITY IDEOGRAPH-FAA2"}], "\u2f62": [{"c": "\u7518", "n": "CJK UNIFIED IDEOGRAPH-7518"}], "\u7518": [{"c": "\u2f62", "n": "KANGXI RADICAL SWEET"}], "\u2f63": [{"c": "\u751f", "n": "CJK UNIFIED IDEOGRAPH-751F"}], "\u751f": [{"c": "\u2f63", "n": "KANGXI RADICAL LIFE"}], "\ud87e\udd34": [{"c": "\u7524", "n": "CJK UNIFIED IDEOGRAPH-7524"}], "\u7524": [{"c": "\ud87e\udd34", "n": "CJK COMPATIBILITY IDEOGRAPH-2F934"}], "\u2f64": [{"c": "\u7528", "n": "CJK UNIFIED IDEOGRAPH-7528"}], "\u7528": [{"c": "\u2f64", "n": "KANGXI RADICAL USE"}], "\u2f65": [{"c": "\u7530", "n": "CJK UNIFIED IDEOGRAPH-7530"}], "\u7530": [{"c": "\u2f65", "n": "KANGXI RADICAL FIELD"}], "\ufaa3": [{"c": "\u753b", "n": "CJK UNIFIED IDEOGRAPH-753B"}], "\u753b": [{"c": "\ufaa3", "n": "CJK COMPATIBILITY IDEOGRAPH-FAA3"}], "\ud87e\udd36": [{"c": "\u753e", "n": "CJK UNIFIED IDEOGRAPH-753E"}], "\u753e": [{"c": "\ud87e\udd36", "n": "CJK COMPATIBILITY IDEOGRAPH-2F936"}], "\ud87e\udd35": [{"c": "\ud853\udc36", "n": "CJK UNIFIED IDEOGRAPH-24C36"}], "\ud853\udc36": [{"c": "\ud87e\udd35", "n": "CJK COMPATIBILITY IDEOGRAPH-2F935"}], "\uf9cd": [{"c": "\u7559", "n": "CJK UNIFIED IDEOGRAPH-7559"}], "\u7559": [{"c": "\uf9cd", "n": "CJK COMPATIBILITY IDEOGRAPH-F9CD"}], "\uf976": [{"c": "\u7565", "n": "CJK UNIFIED IDEOGRAPH-7565"}], "\u7565": [{"c": "\uf976", "n": "CJK COMPATIBILITY IDEOGRAPH-F976"}], "\uf962": [{"c": "\u7570", "n": "CJK UNIFIED IDEOGRAPH-7570"}], "\u7570": [{"c": "\uf962", "n": "CJK COMPATIBILITY IDEOGRAPH-F962"}, {"c": "\ud87e\udd38", "n": "CJK COMPATIBILITY IDEOGRAPH-2F938"}], "\ud87e\udd38": [{"c": "\u7570", "n": "CJK UNIFIED IDEOGRAPH-7570"}], "\ud87e\udd37": [{"c": "\ud853\udc92", "n": "CJK UNIFIED IDEOGRAPH-24C92"}], "\ud853\udc92": [{"c": "\ud87e\udd37", "n": "CJK COMPATIBILITY IDEOGRAPH-2F937"}], "\u2f66": [{"c": "\u758b", "n": "CJK UNIFIED IDEOGRAPH-758B"}], "\u758b": [{"c": "\u2f66", "n": "KANGXI RADICAL BOLT OF CLOTH"}], "\u2f67": [{"c": "\u7592", "n": "CJK UNIFIED IDEOGRAPH-7592"}], "\u7592": [{"c": "\u2f67", "n": "KANGXI RADICAL SICKNESS"}], "\uf9e5": [{"c": "\u75e2", "n": "CJK UNIFIED IDEOGRAPH-75E2"}], "\u75e2": [{"c": "\uf9e5", "n": "CJK COMPATIBILITY IDEOGRAPH-F9E5"}], "\ud87e\udd3a": [{"c": "\u7610", "n": "CJK UNIFIED IDEOGRAPH-7610"}], "\u7610": [{"c": "\ud87e\udd3a", "n": "CJK COMPATIBILITY IDEOGRAPH-2F93A"}], "\ufaa5": [{"c": "\u761f", "n": "CJK UNIFIED IDEOGRAPH-761F"}], "\u761f": [{"c": "\ufaa5", "n": "CJK COMPATIBILITY IDEOGRAPH-FAA5"}], "\ufaa4": [{"c": "\u761d", "n": "CJK UNIFIED IDEOGRAPH-761D"}], "\u761d": [{"c": "\ufaa4", "n": "CJK COMPATIBILITY IDEOGRAPH-FAA4"}], "\uf9c1": [{"c": "\u7642", "n": "CJK UNIFIED IDEOGRAPH-7642"}], "\u7642": [{"c": "\uf9c1", "n": "CJK COMPATIBILITY IDEOGRAPH-F9C1"}], "\uf90e": [{"c": "\u7669", "n": "CJK UNIFIED IDEOGRAPH-7669"}], "\u7669": [{"c": "\uf90e", "n": "CJK COMPATIBILITY IDEOGRAPH-F90E"}], "\u2f68": [{"c": "\u7676", "n": "CJK UNIFIED IDEOGRAPH-7676"}], "\u7676": [{"c": "\u2f68", "n": "KANGXI RADICAL DOTTED TENT"}], "\u2f69": [{"c": "\u767d", "n": "CJK UNIFIED IDEOGRAPH-767D"}], "\u767d": [{"c": "\u2f69", "n": "KANGXI RADICAL WHITE"}], "\ud87e\udd3b": [{"c": "\ud853\udfa1", "n": "CJK UNIFIED IDEOGRAPH-24FA1"}], "\ud853\udfa1": [{"c": "\ud87e\udd3b", "n": "CJK COMPATIBILITY IDEOGRAPH-2F93B"}], "\ud87e\udd3c": [{"c": "\ud853\udfb8", "n": "CJK UNIFIED IDEOGRAPH-24FB8"}], "\ud853\udfb8": [{"c": "\ud87e\udd3c", "n": "CJK COMPATIBILITY IDEOGRAPH-2F93C"}], "\u2f6a": [{"c": "\u76ae", "n": "CJK UNIFIED IDEOGRAPH-76AE"}], "\u76ae": [{"c": "\u2f6a", "n": "KANGXI RADICAL SKIN"}], "\u2f6b": [{"c": "\u76bf", "n": "CJK UNIFIED IDEOGRAPH-76BF"}], "\u76bf": [{"c": "\u2f6b", "n": "KANGXI RADICAL DISH"}], "\ud87e\udd3d": [{"c": "\ud854\udc44", "n": "CJK UNIFIED IDEOGRAPH-25044"}], "\ud854\udc44": [{"c": "\ud87e\udd3d", "n": "CJK COMPATIBILITY IDEOGRAPH-2F93D"}], "\ud87e\udd3e": [{"c": "\u3ffc", "n": "CJK UNIFIED IDEOGRAPH-3FFC"}], "\u3ffc": [{"c": "\ud87e\udd3e", "n": "CJK COMPATIBILITY IDEOGRAPH-2F93E"}], "\ufa17": [{"c": "\u76ca", "n": "CJK UNIFIED IDEOGRAPH-76CA"}], "\u76ca": [{"c": "\ufa17", "n": "CJK COMPATIBILITY IDEOGRAPH-FA17"}, {"c": "\ufaa6", "n": "CJK COMPATIBILITY IDEOGRAPH-FAA6"}], "\ufaa6": [{"c": "\u76ca", "n": "CJK UNIFIED IDEOGRAPH-76CA"}], "\ufaa7": [{"c": "\u76db", "n": "CJK UNIFIED IDEOGRAPH-76DB"}], "\u76db": [{"c": "\ufaa7", "n": "CJK COMPATIBILITY IDEOGRAPH-FAA7"}], "\uf933": [{"c": "\u76e7", "n": "CJK UNIFIED IDEOGRAPH-76E7"}], "\u76e7": [{"c": "\uf933", "n": "CJK COMPATIBILITY IDEOGRAPH-F933"}], "\ud87e\udd3f": [{"c": "\u4008", "n": "CJK UNIFIED IDEOGRAPH-4008"}], "\u4008": [{"c": "\ud87e\udd3f", "n": "CJK COMPATIBILITY IDEOGRAPH-2F93F"}], "\u2f6c": [{"c": "\u76ee", "n": "CJK UNIFIED IDEOGRAPH-76EE"}], "\u76ee": [{"c": "\u2f6c", "n": "KANGXI RADICAL EYE"}], "\ufaa8": [{"c": "\u76f4", "n": "CJK UNIFIED IDEOGRAPH-76F4"}], "\u76f4": [{"c": "\ufaa8", "n": "CJK COMPATIBILITY IDEOGRAPH-FAA8"}, {"c": "\ud87e\udd40", "n": "CJK COMPATIBILITY IDEOGRAPH-2F940"}], "\ud87e\udd40": [{"c": "\u76f4", "n": "CJK UNIFIED IDEOGRAPH-76F4"}], "\ud87e\udd42": [{"c": "\ud854\udcf2", "n": "CJK UNIFIED IDEOGRAPH-250F2"}], "\ud854\udcf2": [{"c": "\ud87e\udd42", "n": "CJK COMPATIBILITY IDEOGRAPH-2F942"}], "\ud87e\udd41": [{"c": "\ud854\udcf3", "n": "CJK UNIFIED IDEOGRAPH-250F3"}], "\ud854\udcf3": [{"c": "\ud87e\udd41", "n": "CJK COMPATIBILITY IDEOGRAPH-2F941"}], "\uf96d": [{"c": "\u7701", "n": "CJK UNIFIED IDEOGRAPH-7701"}], "\u7701": [{"c": "\uf96d", "n": "CJK COMPATIBILITY IDEOGRAPH-F96D"}], "\ufad3": [{"c": "\u4018", "n": "CJK UNIFIED IDEOGRAPH-4018"}], "\u4018": [{"c": "\ufad3", "n": "CJK COMPATIBILITY IDEOGRAPH-FAD3"}], "\ud87e\udd43": [{"c": "\ud854\udd19", "n": "CJK UNIFIED IDEOGRAPH-25119"}], "\ud854\udd19": [{"c": "\ud87e\udd43", "n": "CJK COMPATIBILITY IDEOGRAPH-2F943"}], "\ud87e\udd45": [{"c": "\u771e", "n": "CJK UNIFIED IDEOGRAPH-771E"}], "\u771e": [{"c": "\ud87e\udd45", "n": "CJK COMPATIBILITY IDEOGRAPH-2F945"}], "\ud87e\udd46": [{"c": "\u771f", "n": "CJK UNIFIED IDEOGRAPH-771F"}], "\u771f": [{"c": "\ud87e\udd46", "n": "CJK COMPATIBILITY IDEOGRAPH-2F946"}, {"c": "\ud87e\udd47", "n": "CJK COMPATIBILITY IDEOGRAPH-2F947"}], "\ud87e\udd47": [{"c": "\u771f", "n": "CJK UNIFIED IDEOGRAPH-771F"}], "\ud87e\udd44": [{"c": "\ud854\udd33", "n": "CJK UNIFIED IDEOGRAPH-25133"}], "\ud854\udd33": [{"c": "\ud87e\udd44", "n": "CJK COMPATIBILITY IDEOGRAPH-2F944"}], "\ufaaa": [{"c": "\u7740", "n": "CJK UNIFIED IDEOGRAPH-7740"}], "\u7740": [{"c": "\ufaaa", "n": "CJK COMPATIBILITY IDEOGRAPH-FAAA"}], "\ufaa9": [{"c": "\u774a", "n": "CJK UNIFIED IDEOGRAPH-774A"}], "\u774a": [{"c": "\ufaa9", "n": "CJK COMPATIBILITY IDEOGRAPH-FAA9"}, {"c": "\ud87e\udd48", "n": "CJK COMPATIBILITY IDEOGRAPH-2F948"}], "\ud87e\udd48": [{"c": "\u774a", "n": "CJK UNIFIED IDEOGRAPH-774A"}], "\u9fc3": [{"c": "\u4039", "n": "CJK UNIFIED IDEOGRAPH-4039"}], "\u4039": [{"c": "\u9fc3", "n": "CJK UNIFIED IDEOGRAPH-9FC3"}, {"c": "\ufad4", "n": "CJK COMPATIBILITY IDEOGRAPH-FAD4"}, {"c": "\ud87e\udd49", "n": "CJK COMPATIBILITY IDEOGRAPH-2F949"}], "\ufad4": [{"c": "\u4039", "n": "CJK UNIFIED IDEOGRAPH-4039"}], "\ud87e\udd49": [{"c": "\u4039", "n": "CJK UNIFIED IDEOGRAPH-4039"}], "\u6663": [{"c": "\u403f", "n": "CJK UNIFIED IDEOGRAPH-403F"}], "\u403f": [{"c": "\u6663", "n": "CJK UNIFIED IDEOGRAPH-6663"}], "\ud87e\udd4b": [{"c": "\u4046", "n": "CJK UNIFIED IDEOGRAPH-4046"}], "\u4046": [{"c": "\ud87e\udd4b", "n": "CJK COMPATIBILITY IDEOGRAPH-2F94B"}], "\ud87e\udd4a": [{"c": "\u778b", "n": "CJK UNIFIED IDEOGRAPH-778B"}], "\u778b": [{"c": "\ud87e\udd4a", "n": "CJK COMPATIBILITY IDEOGRAPH-2F94A"}], "\ufad5": [{"c": "\ud854\ude49", "n": "CJK UNIFIED IDEOGRAPH-25249"}], "\ud854\ude49": [{"c": "\ufad5", "n": "CJK COMPATIBILITY IDEOGRAPH-FAD5"}], "\ufa9d": [{"c": "\u77a7", "n": "CJK UNIFIED IDEOGRAPH-77A7"}], "\u77a7": [{"c": "\ufa9d", "n": "CJK COMPATIBILITY IDEOGRAPH-FA9D"}], "\u2f6d": [{"c": "\u77db", "n": "CJK UNIFIED IDEOGRAPH-77DB"}], "\u77db": [{"c": "\u2f6d", "n": "KANGXI RADICAL SPEAR"}], "\u2f6e": [{"c": "\u77e2", "n": "CJK UNIFIED IDEOGRAPH-77E2"}], "\u77e2": [{"c": "\u2f6e", "n": "KANGXI RADICAL ARROW"}], "\u2f6f": [{"c": "\u77f3", "n": "CJK UNIFIED IDEOGRAPH-77F3"}], "\u77f3": [{"c": "\u2f6f", "n": "KANGXI RADICAL STONE"}], "\ud87e\udd4c": [{"c": "\u4096", "n": "CJK UNIFIED IDEOGRAPH-4096"}], "\u4096": [{"c": "\ud87e\udd4c", "n": "CJK COMPATIBILITY IDEOGRAPH-2F94C"}], "\ud87e\udd4d": [{"c": "\ud855\udc1d", "n": "CJK UNIFIED IDEOGRAPH-2541D"}], "\ud855\udc1d": [{"c": "\ud87e\udd4d", "n": "CJK COMPATIBILITY IDEOGRAPH-2F94D"}], "\u784f": [{"c": "\u7814", "n": "CJK UNIFIED IDEOGRAPH-7814"}], "\u7814": [{"c": "\u784f", "n": "CJK UNIFIED IDEOGRAPH-784F"}], "\ud87e\udd4e": [{"c": "\u784e", "n": "CJK UNIFIED IDEOGRAPH-784E"}], "\u784e": [{"c": "\ud87e\udd4e", "n": "CJK COMPATIBILITY IDEOGRAPH-2F94E"}], "\uf9ce": [{"c": "\u786b", "n": "CJK UNIFIED IDEOGRAPH-786B"}], "\u786b": [{"c": "\uf9ce", "n": "CJK COMPATIBILITY IDEOGRAPH-F9CE"}], "\uf93b": [{"c": "\u788c", "n": "CJK UNIFIED IDEOGRAPH-788C"}], "\u788c": [{"c": "\uf93b", "n": "CJK COMPATIBILITY IDEOGRAPH-F93B"}, {"c": "\ud87e\udd4f", "n": "CJK COMPATIBILITY IDEOGRAPH-2F94F"}], "\ud87e\udd4f": [{"c": "\u788c", "n": "CJK UNIFIED IDEOGRAPH-788C"}], "\ufa4b": [{"c": "\u7891", "n": "CJK UNIFIED IDEOGRAPH-7891"}], "\u7891": [{"c": "\ufa4b", "n": "CJK COMPATIBILITY IDEOGRAPH-FA4B"}], "\uf947": [{"c": "\u78ca", "n": "CJK UNIFIED IDEOGRAPH-78CA"}], "\u78ca": [{"c": "\uf947", "n": "CJK COMPATIBILITY IDEOGRAPH-F947"}], "\ufaab": [{"c": "\u78cc", "n": "CJK UNIFIED IDEOGRAPH-78CC"}], "\u78cc": [{"c": "\ufaab", "n": "CJK COMPATIBILITY IDEOGRAPH-FAAB"}, {"c": "\ud87e\udd50", "n": "CJK COMPATIBILITY IDEOGRAPH-2F950"}], "\ud87e\udd50": [{"c": "\u78cc", "n": "CJK UNIFIED IDEOGRAPH-78CC"}], "\uf964": [{"c": "\u78fb", "n": "CJK UNIFIED IDEOGRAPH-78FB"}], "\u78fb": [{"c": "\uf964", "n": "CJK COMPATIBILITY IDEOGRAPH-F964"}], "\ud87e\udd51": [{"c": "\u40e3", "n": "CJK UNIFIED IDEOGRAPH-40E3"}], "\u40e3": [{"c": "\ud87e\udd51", "n": "CJK COMPATIBILITY IDEOGRAPH-2F951"}], "\uf985": [{"c": "\u792a", "n": "CJK UNIFIED IDEOGRAPH-792A"}], "\u792a": [{"c": "\uf985", "n": "CJK COMPATIBILITY IDEOGRAPH-F985"}], "\u2f70": [{"c": "\u793a", "n": "CJK UNIFIED IDEOGRAPH-793A"}], "\u793a": [{"c": "\u2f70", "n": "KANGXI RADICAL SPIRIT"}], "\u2ead": [{"c": "\u793b", "n": "CJK UNIFIED IDEOGRAPH-793B"}], "\u793b": [{"c": "\u2ead", "n": "CJK RADICAL SPIRIT TWO"}], "\ufa18": [{"c": "\u793c", "n": "CJK UNIFIED IDEOGRAPH-793C"}], "\u793c": [{"c": "\ufa18", "n": "CJK COMPATIBILITY IDEOGRAPH-FA18"}], "\ufa4c": [{"c": "\u793e", "n": "CJK UNIFIED IDEOGRAPH-793E"}], "\u793e": [{"c": "\ufa4c", "n": "CJK COMPATIBILITY IDEOGRAPH-FA4C"}], "\ufa4e": [{"c": "\u7948", "n": "CJK UNIFIED IDEOGRAPH-7948"}], "\u7948": [{"c": "\ufa4e", "n": "CJK COMPATIBILITY IDEOGRAPH-FA4E"}], "\ufa4d": [{"c": "\u7949", "n": "CJK UNIFIED IDEOGRAPH-7949"}], "\u7949": [{"c": "\ufa4d", "n": "CJK COMPATIBILITY IDEOGRAPH-FA4D"}], "\ud87e\udd52": [{"c": "\ud855\ude26", "n": "CJK UNIFIED IDEOGRAPH-25626"}], "\ud855\ude26": [{"c": "\ud87e\udd52", "n": "CJK COMPATIBILITY IDEOGRAPH-2F952"}], "\ufa4f": [{"c": "\u7950", "n": "CJK UNIFIED IDEOGRAPH-7950"}], "\u7950": [{"c": "\ufa4f", "n": "CJK COMPATIBILITY IDEOGRAPH-FA4F"}], "\ufa50": [{"c": "\u7956", "n": "CJK UNIFIED IDEOGRAPH-7956"}], "\u7956": [{"c": "\ufa50", "n": "CJK COMPATIBILITY IDEOGRAPH-FA50"}, {"c": "\ud87e\udd53", "n": "CJK COMPATIBILITY IDEOGRAPH-2F953"}], "\ud87e\udd53": [{"c": "\u7956", "n": "CJK UNIFIED IDEOGRAPH-7956"}], "\ufa51": [{"c": "\u795d", "n": "CJK UNIFIED IDEOGRAPH-795D"}], "\u795d": [{"c": "\ufa51", "n": "CJK COMPATIBILITY IDEOGRAPH-FA51"}], "\ufa19": [{"c": "\u795e", "n": "CJK UNIFIED IDEOGRAPH-795E"}], "\u795e": [{"c": "\ufa19", "n": "CJK COMPATIBILITY IDEOGRAPH-FA19"}], "\ufa1a": [{"c": "\u7965", "n": "CJK UNIFIED IDEOGRAPH-7965"}], "\u7965": [{"c": "\ufa1a", "n": "CJK COMPATIBILITY IDEOGRAPH-FA1A"}], "\ufa61": [{"c": "\u8996", "n": "CJK UNIFIED IDEOGRAPH-8996"}], "\u8996": [{"c": "\ufa61", "n": "CJK COMPATIBILITY IDEOGRAPH-FA61"}, {"c": "\ufab8", "n": "CJK COMPATIBILITY IDEOGRAPH-FAB8"}], "\ufab8": [{"c": "\u8996", "n": "CJK UNIFIED IDEOGRAPH-8996"}], "\uf93c": [{"c": "\u797f", "n": "CJK UNIFIED IDEOGRAPH-797F"}], "\u797f": [{"c": "\uf93c", "n": "CJK COMPATIBILITY IDEOGRAPH-F93C"}], "\ud87e\udd54": [{"c": "\ud855\ude9a", "n": "CJK UNIFIED IDEOGRAPH-2569A"}], "\ud855\ude9a": [{"c": "\ud87e\udd54", "n": "CJK COMPATIBILITY IDEOGRAPH-2F954"}], "\ufa52": [{"c": "\u798d", "n": "CJK UNIFIED IDEOGRAPH-798D"}], "\u798d": [{"c": "\ufa52", "n": "CJK COMPATIBILITY IDEOGRAPH-FA52"}], "\ufa53": [{"c": "\u798e", "n": "CJK UNIFIED IDEOGRAPH-798E"}], "\u798e": [{"c": "\ufa53", "n": "CJK COMPATIBILITY IDEOGRAPH-FA53"}], "\ufa1b": [{"c": "\u798f", "n": "CJK UNIFIED IDEOGRAPH-798F"}], "\u798f": [{"c": "\ufa1b", "n": "CJK COMPATIBILITY IDEOGRAPH-FA1B"}, {"c": "\ud87e\udd56", "n": "CJK COMPATIBILITY IDEOGRAPH-2F956"}], "\ud87e\udd56": [{"c": "\u798f", "n": "CJK UNIFIED IDEOGRAPH-798F"}], "\ud87e\udd55": [{"c": "\ud855\udec5", "n": "CJK UNIFIED IDEOGRAPH-256C5"}], "\ud855\udec5": [{"c": "\ud87e\udd55", "n": "CJK COMPATIBILITY IDEOGRAPH-2F955"}], "\uf9b6": [{"c": "\u79ae", "n": "CJK UNIFIED IDEOGRAPH-79AE"}], "\u79ae": [{"c": "\uf9b6", "n": "CJK COMPATIBILITY IDEOGRAPH-F9B6"}], "\u2f71": [{"c": "\u79b8", "n": "CJK UNIFIED IDEOGRAPH-79B8"}], "\u79b8": [{"c": "\u2f71", "n": "KANGXI RADICAL TRACK"}], "\u2f72": [{"c": "\u79be", "n": "CJK UNIFIED IDEOGRAPH-79BE"}], "\u79be": [{"c": "\u2f72", "n": "KANGXI RADICAL GRAIN"}], "\uf995": [{"c": "\u79ca", "n": "CJK UNIFIED IDEOGRAPH-79CA"}], "\u79ca": [{"c": "\uf995", "n": "CJK COMPATIBILITY IDEOGRAPH-F995"}], "\ud87e\udd58": [{"c": "\u412f", "n": "CJK UNIFIED IDEOGRAPH-412F"}], "\u412f": [{"c": "\ud87e\udd58", "n": "CJK COMPATIBILITY IDEOGRAPH-2F958"}], "\ud87e\udd57": [{"c": "\u79eb", "n": "CJK UNIFIED IDEOGRAPH-79EB"}], "\u79eb": [{"c": "\ud87e\udd57", "n": "CJK COMPATIBILITY IDEOGRAPH-2F957"}], "\uf956": [{"c": "\u7a1c", "n": "CJK UNIFIED IDEOGRAPH-7A1C"}], "\u7a1c": [{"c": "\uf956", "n": "CJK COMPATIBILITY IDEOGRAPH-F956"}], "\ud87e\udd5a": [{"c": "\u7a4a", "n": "CJK UNIFIED IDEOGRAPH-7A4A"}], "\u7a4a": [{"c": "\ud87e\udd5a", "n": "CJK COMPATIBILITY IDEOGRAPH-2F95A"}], "\ufa54": [{"c": "\u7a40", "n": "CJK UNIFIED IDEOGRAPH-7A40"}], "\u7a40": [{"c": "\ufa54", "n": "CJK COMPATIBILITY IDEOGRAPH-FA54"}, {"c": "\ud87e\udd59", "n": "CJK COMPATIBILITY IDEOGRAPH-2F959"}], "\ud87e\udd59": [{"c": "\u7a40", "n": "CJK UNIFIED IDEOGRAPH-7A40"}], "\ud87e\udd5b": [{"c": "\u7a4f", "n": "CJK UNIFIED IDEOGRAPH-7A4F"}], "\u7a4f": [{"c": "\ud87e\udd5b", "n": "CJK COMPATIBILITY IDEOGRAPH-2F95B"}], "\u2f73": [{"c": "\u7a74", "n": "CJK UNIFIED IDEOGRAPH-7A74"}], "\u7a74": [{"c": "\u2f73", "n": "KANGXI RADICAL CAVE"}], "\ufa55": [{"c": "\u7a81", "n": "CJK UNIFIED IDEOGRAPH-7A81"}], "\u7a81": [{"c": "\ufa55", "n": "CJK COMPATIBILITY IDEOGRAPH-FA55"}], "\ud87e\udd5c": [{"c": "\ud856\udd7c", "n": "CJK UNIFIED IDEOGRAPH-2597C"}], "\ud856\udd7c": [{"c": "\ud87e\udd5c", "n": "CJK COMPATIBILITY IDEOGRAPH-2F95C"}], "\ufaac": [{"c": "\u7ab1", "n": "CJK UNIFIED IDEOGRAPH-7AB1"}], "\u7ab1": [{"c": "\ufaac", "n": "CJK COMPATIBILITY IDEOGRAPH-FAAC"}], "\uf9f7": [{"c": "\u7acb", "n": "CJK UNIFIED IDEOGRAPH-7ACB"}], "\u7acb": [{"c": "\uf9f7", "n": "CJK COMPATIBILITY IDEOGRAPH-F9F7"}, {"c": "\u2f74", "n": "KANGXI RADICAL STAND"}], "\u2f74": [{"c": "\u7acb", "n": "CJK UNIFIED IDEOGRAPH-7ACB"}], "\u2eef": [{"c": "\u7adc", "n": "CJK UNIFIED IDEOGRAPH-7ADC"}], "\u7adc": [{"c": "\u2eef", "n": "CJK RADICAL J-SIMPLIFIED DRAGON"}], "\ud87e\udd5d": [{"c": "\ud856\udea7", "n": "CJK UNIFIED IDEOGRAPH-25AA7"}], "\ud856\udea7": [{"c": "\ud87e\udd5d", "n": "CJK COMPATIBILITY IDEOGRAPH-2F95D"}, {"c": "\ud87e\udd5e", "n": "CJK COMPATIBILITY IDEOGRAPH-2F95E"}], "\ud87e\udd5e": [{"c": "\ud856\udea7", "n": "CJK UNIFIED IDEOGRAPH-25AA7"}], "\ud87e\udd5f": [{"c": "\u7aee", "n": "CJK UNIFIED IDEOGRAPH-7AEE"}], "\u7aee": [{"c": "\ud87e\udd5f", "n": "CJK COMPATIBILITY IDEOGRAPH-2F95F"}], "\u2f75": [{"c": "\u7af9", "n": "CJK UNIFIED IDEOGRAPH-7AF9"}], "\u7af9": [{"c": "\u2f75", "n": "KANGXI RADICAL BAMBOO"}], "\uf9f8": [{"c": "\u7b20", "n": "CJK UNIFIED IDEOGRAPH-7B20"}], "\u7b20": [{"c": "\uf9f8", "n": "CJK COMPATIBILITY IDEOGRAPH-F9F8"}], "\ufa56": [{"c": "\u7bc0", "n": "CJK UNIFIED IDEOGRAPH-7BC0"}], "\u7bc0": [{"c": "\ufa56", "n": "CJK COMPATIBILITY IDEOGRAPH-FA56"}, {"c": "\ufaad", "n": "CJK COMPATIBILITY IDEOGRAPH-FAAD"}], "\ufaad": [{"c": "\u7bc0", "n": "CJK UNIFIED IDEOGRAPH-7BC0"}], "\ud87e\udd60": [{"c": "\u4202", "n": "CJK UNIFIED IDEOGRAPH-4202"}], "\u4202": [{"c": "\ud87e\udd60", "n": "CJK COMPATIBILITY IDEOGRAPH-2F960"}], "\ud87e\udd61": [{"c": "\ud856\udfab", "n": "CJK UNIFIED IDEOGRAPH-25BAB"}], "\ud856\udfab": [{"c": "\ud87e\udd61", "n": "CJK COMPATIBILITY IDEOGRAPH-2F961"}], "\ud87e\udd62": [{"c": "\u7bc6", "n": "CJK UNIFIED IDEOGRAPH-7BC6"}], "\u7bc6": [{"c": "\ud87e\udd62", "n": "CJK COMPATIBILITY IDEOGRAPH-2F962"}], "\ud87e\udd64": [{"c": "\u4227", "n": "CJK UNIFIED IDEOGRAPH-4227"}], "\u4227": [{"c": "\ud87e\udd64", "n": "CJK COMPATIBILITY IDEOGRAPH-2F964"}], "\ud87e\udd63": [{"c": "\u7bc9", "n": "CJK UNIFIED IDEOGRAPH-7BC9"}], "\u7bc9": [{"c": "\ud87e\udd63", "n": "CJK COMPATIBILITY IDEOGRAPH-2F963"}], "\ud87e\udd65": [{"c": "\ud857\udc80", "n": "CJK UNIFIED IDEOGRAPH-25C80"}], "\ud857\udc80": [{"c": "\ud87e\udd65", "n": "CJK COMPATIBILITY IDEOGRAPH-2F965"}], "\ufad6": [{"c": "\ud857\udcd0", "n": "CJK UNIFIED IDEOGRAPH-25CD0"}], "\ud857\udcd0": [{"c": "\ufad6", "n": "CJK COMPATIBILITY IDEOGRAPH-FAD6"}], "\uf9a6": [{"c": "\u7c3e", "n": "CJK UNIFIED IDEOGRAPH-7C3E"}], "\u7c3e": [{"c": "\uf9a6", "n": "CJK COMPATIBILITY IDEOGRAPH-F9A6"}], "\uf944": [{"c": "\u7c60", "n": "CJK UNIFIED IDEOGRAPH-7C60"}], "\u7c60": [{"c": "\uf944", "n": "CJK COMPATIBILITY IDEOGRAPH-F944"}], "\u2f76": [{"c": "\u7c73", "n": "CJK UNIFIED IDEOGRAPH-7C73"}], "\u7c73": [{"c": "\u2f76", "n": "KANGXI RADICAL RICE"}], "\ufaae": [{"c": "\u7c7b", "n": "CJK UNIFIED IDEOGRAPH-7C7B"}], "\u7c7b": [{"c": "\ufaae", "n": "CJK COMPATIBILITY IDEOGRAPH-FAAE"}], "\uf9f9": [{"c": "\u7c92", "n": "CJK UNIFIED IDEOGRAPH-7C92"}], "\u7c92": [{"c": "\uf9f9", "n": "CJK COMPATIBILITY IDEOGRAPH-F9F9"}], "\ufa1d": [{"c": "\u7cbe", "n": "CJK UNIFIED IDEOGRAPH-7CBE"}], "\u7cbe": [{"c": "\ufa1d", "n": "CJK COMPATIBILITY IDEOGRAPH-FA1D"}], "\ud87e\udd66": [{"c": "\u7cd2", "n": "CJK UNIFIED IDEOGRAPH-7CD2"}], "\u7cd2": [{"c": "\ud87e\udd66", "n": "CJK COMPATIBILITY IDEOGRAPH-2F966"}], "\ufa03": [{"c": "\u7cd6", "n": "CJK UNIFIED IDEOGRAPH-7CD6"}], "\u7cd6": [{"c": "\ufa03", "n": "CJK COMPATIBILITY IDEOGRAPH-FA03"}], "\ud87e\udd68": [{"c": "\u7ce8", "n": "CJK UNIFIED IDEOGRAPH-7CE8"}], "\u7ce8": [{"c": "\ud87e\udd68", "n": "CJK COMPATIBILITY IDEOGRAPH-2F968"}], "\ud87e\udd67": [{"c": "\u42a0", "n": "CJK UNIFIED IDEOGRAPH-42A0"}], "\u42a0": [{"c": "\ud87e\udd67", "n": "CJK COMPATIBILITY IDEOGRAPH-2F967"}], "\ud87e\udd69": [{"c": "\u7ce3", "n": "CJK UNIFIED IDEOGRAPH-7CE3"}], "\u7ce3": [{"c": "\ud87e\udd69", "n": "CJK COMPATIBILITY IDEOGRAPH-2F969"}], "\uf97b": [{"c": "\u7ce7", "n": "CJK UNIFIED IDEOGRAPH-7CE7"}], "\u7ce7": [{"c": "\uf97b", "n": "CJK COMPATIBILITY IDEOGRAPH-F97B"}], "\u2f77": [{"c": "\u7cf8", "n": "CJK UNIFIED IDEOGRAPH-7CF8"}], "\u7cf8": [{"c": "\u2f77", "n": "KANGXI RADICAL SILK"}], "\u2eaf": [{"c": "\u7cf9", "n": "CJK UNIFIED IDEOGRAPH-7CF9"}], "\u7cf9": [{"c": "\u2eaf", "n": "CJK RADICAL SILK"}], "\ud87e\udd6b": [{"c": "\ud857\udf86", "n": "CJK UNIFIED IDEOGRAPH-25F86"}], "\ud857\udf86": [{"c": "\ud87e\udd6b", "n": "CJK COMPATIBILITY IDEOGRAPH-2F96B"}], "\ud87e\udd6a": [{"c": "\u7d00", "n": "CJK UNIFIED IDEOGRAPH-7D00"}], "\u7d00": [{"c": "\ud87e\udd6a", "n": "CJK COMPATIBILITY IDEOGRAPH-2F96A"}], "\uf9cf": [{"c": "\u7d10", "n": "CJK UNIFIED IDEOGRAPH-7D10"}], "\u7d10": [{"c": "\uf9cf", "n": "CJK COMPATIBILITY IDEOGRAPH-F9CF"}], "\uf96a": [{"c": "\u7d22", "n": "CJK UNIFIED IDEOGRAPH-7D22"}], "\u7d22": [{"c": "\uf96a", "n": "CJK COMPATIBILITY IDEOGRAPH-F96A"}], "\uf94f": [{"c": "\u7d2f", "n": "CJK UNIFIED IDEOGRAPH-7D2F"}], "\u7d2f": [{"c": "\uf94f", "n": "CJK COMPATIBILITY IDEOGRAPH-F94F"}], "\u7d76": [{"c": "\u7d55", "n": "CJK UNIFIED IDEOGRAPH-7D55"}], "\u7d55": [{"c": "\u7d76", "n": "CJK UNIFIED IDEOGRAPH-7D76"}], "\ud87e\udd6c": [{"c": "\u7d63", "n": "CJK UNIFIED IDEOGRAPH-7D63"}], "\u7d63": [{"c": "\ud87e\udd6c", "n": "CJK COMPATIBILITY IDEOGRAPH-2F96C"}], "\ufaaf": [{"c": "\u7d5b", "n": "CJK UNIFIED IDEOGRAPH-7D5B"}], "\u7d5b": [{"c": "\ufaaf", "n": "CJK COMPATIBILITY IDEOGRAPH-FAAF"}], "\uf93d": [{"c": "\u7da0", "n": "CJK UNIFIED IDEOGRAPH-7DA0"}], "\u7da0": [{"c": "\uf93d", "n": "CJK COMPATIBILITY IDEOGRAPH-F93D"}], "\uf957": [{"c": "\u7dbe", "n": "CJK UNIFIED IDEOGRAPH-7DBE"}], "\u7dbe": [{"c": "\uf957", "n": "CJK COMPATIBILITY IDEOGRAPH-F957"}], "\ud87e\udd6e": [{"c": "\u7dc7", "n": "CJK UNIFIED IDEOGRAPH-7DC7"}], "\u7dc7": [{"c": "\ud87e\udd6e", "n": "CJK COMPATIBILITY IDEOGRAPH-2F96E"}], "\uf996": [{"c": "\u7df4", "n": "CJK UNIFIED IDEOGRAPH-7DF4"}], "\u7df4": [{"c": "\uf996", "n": "CJK COMPATIBILITY IDEOGRAPH-F996"}, {"c": "\ufa57", "n": "CJK COMPATIBILITY IDEOGRAPH-FA57"}, {"c": "\ufab0", "n": "CJK COMPATIBILITY IDEOGRAPH-FAB0"}], "\ufa57": [{"c": "\u7df4", "n": "CJK UNIFIED IDEOGRAPH-7DF4"}], "\ufab0": [{"c": "\u7df4", "n": "CJK UNIFIED IDEOGRAPH-7DF4"}], "\ud87e\udd6f": [{"c": "\u7e02", "n": "CJK UNIFIED IDEOGRAPH-7E02"}], "\u7e02": [{"c": "\ud87e\udd6f", "n": "CJK COMPATIBILITY IDEOGRAPH-2F96F"}], "\ud87e\udd6d": [{"c": "\u4301", "n": "CJK UNIFIED IDEOGRAPH-4301"}], "\u4301": [{"c": "\ud87e\udd6d", "n": "CJK COMPATIBILITY IDEOGRAPH-2F96D"}], "\ufa58": [{"c": "\u7e09", "n": "CJK UNIFIED IDEOGRAPH-7E09"}], "\u7e09": [{"c": "\ufa58", "n": "CJK COMPATIBILITY IDEOGRAPH-FA58"}], "\uf950": [{"c": "\u7e37", "n": "CJK UNIFIED IDEOGRAPH-7E37"}], "\u7e37": [{"c": "\uf950", "n": "CJK COMPATIBILITY IDEOGRAPH-F950"}], "\ufa59": [{"c": "\u7e41", "n": "CJK UNIFIED IDEOGRAPH-7E41"}], "\u7e41": [{"c": "\ufa59", "n": "CJK COMPATIBILITY IDEOGRAPH-FA59"}], "\ud87e\udd70": [{"c": "\u7e45", "n": "CJK UNIFIED IDEOGRAPH-7E45"}], "\u7e45": [{"c": "\ud87e\udd70", "n": "CJK COMPATIBILITY IDEOGRAPH-2F970"}], "\ud87e\udc98": [{"c": "\ud858\uddda", "n": "CJK UNIFIED IDEOGRAPH-261DA"}], "\ud858\uddda": [{"c": "\ud87e\udc98", "n": "CJK COMPATIBILITY IDEOGRAPH-2F898"}], "\ud87e\udd71": [{"c": "\u4334", "n": "CJK UNIFIED IDEOGRAPH-4334"}], "\u4334": [{"c": "\ud87e\udd71", "n": "CJK COMPATIBILITY IDEOGRAPH-2F971"}], "\u2f78": [{"c": "\u7f36", "n": "CJK UNIFIED IDEOGRAPH-7F36"}], "\u7f36": [{"c": "\u2f78", "n": "KANGXI RADICAL JAR"}], "\ud87e\udd72": [{"c": "\ud858\ude28", "n": "CJK UNIFIED IDEOGRAPH-26228"}], "\ud858\ude28": [{"c": "\ud87e\udd72", "n": "CJK COMPATIBILITY IDEOGRAPH-2F972"}], "\ufab1": [{"c": "\u7f3e", "n": "CJK UNIFIED IDEOGRAPH-7F3E"}], "\u7f3e": [{"c": "\ufab1", "n": "CJK COMPATIBILITY IDEOGRAPH-FAB1"}], "\ud87e\udd73": [{"c": "\ud858\ude47", "n": "CJK UNIFIED IDEOGRAPH-26247"}], "\ud858\ude47": [{"c": "\ud87e\udd73", "n": "CJK COMPATIBILITY IDEOGRAPH-2F973"}], "\u2f79": [{"c": "\u7f51", "n": "CJK UNIFIED IDEOGRAPH-7F51"}], "\u7f51": [{"c": "\u2f79", "n": "KANGXI RADICAL NET"}], "\u2eab": [{"c": "\u7f52", "n": "CJK UNIFIED IDEOGRAPH-7F52"}], "\u7f52": [{"c": "\u2eab", "n": "CJK RADICAL EYE"}, {"c": "\u2eb2", "n": "CJK RADICAL NET TWO"}], "\u2eb2": [{"c": "\u7f52", "n": "CJK UNIFIED IDEOGRAPH-7F52"}], "\u2eb1": [{"c": "\u7f53", "n": "CJK UNIFIED IDEOGRAPH-7F53"}], "\u7f53": [{"c": "\u2eb1", "n": "CJK RADICAL NET ONE"}], "\ud87e\udd74": [{"c": "\u4359", "n": "CJK UNIFIED IDEOGRAPH-4359"}], "\u4359": [{"c": "\ud87e\udd74", "n": "CJK COMPATIBILITY IDEOGRAPH-2F974"}], "\ufa5a": [{"c": "\u7f72", "n": "CJK UNIFIED IDEOGRAPH-7F72"}], "\u7f72": [{"c": "\ufa5a", "n": "CJK COMPATIBILITY IDEOGRAPH-FA5A"}], "\ud87e\udd75": [{"c": "\ud858\uded9", "n": "CJK UNIFIED IDEOGRAPH-262D9"}], "\ud858\uded9": [{"c": "\ud87e\udd75", "n": "CJK COMPATIBILITY IDEOGRAPH-2F975"}], "\uf9e6": [{"c": "\u7f79", "n": "CJK UNIFIED IDEOGRAPH-7F79"}], "\u7f79": [{"c": "\uf9e6", "n": "CJK COMPATIBILITY IDEOGRAPH-F9E6"}], "\ud87e\udd76": [{"c": "\u7f7a", "n": "CJK UNIFIED IDEOGRAPH-7F7A"}], "\u7f7a": [{"c": "\ud87e\udd76", "n": "CJK COMPATIBILITY IDEOGRAPH-2F976"}], "\uf90f": [{"c": "\u7f85", "n": "CJK UNIFIED IDEOGRAPH-7F85"}], "\u7f85": [{"c": "\uf90f", "n": "CJK COMPATIBILITY IDEOGRAPH-F90F"}], "\ud87e\udd77": [{"c": "\ud858\udf3e", "n": "CJK UNIFIED IDEOGRAPH-2633E"}], "\ud858\udf3e": [{"c": "\ud87e\udd77", "n": "CJK COMPATIBILITY IDEOGRAPH-2F977"}], "\u2f7a": [{"c": "\u7f8a", "n": "CJK UNIFIED IDEOGRAPH-7F8A"}], "\u7f8a": [{"c": "\u2f7a", "n": "KANGXI RADICAL SHEEP"}], "\ud87e\udd78": [{"c": "\u7f95", "n": "CJK UNIFIED IDEOGRAPH-7F95"}], "\u7f95": [{"c": "\ud87e\udd78", "n": "CJK COMPATIBILITY IDEOGRAPH-2F978"}], "\uf9af": [{"c": "\u7f9a", "n": "CJK UNIFIED IDEOGRAPH-7F9A"}], "\u7f9a": [{"c": "\uf9af", "n": "CJK COMPATIBILITY IDEOGRAPH-F9AF"}], "\ufa1e": [{"c": "\u7fbd", "n": "CJK UNIFIED IDEOGRAPH-7FBD"}], "\u7fbd": [{"c": "\ufa1e", "n": "CJK COMPATIBILITY IDEOGRAPH-FA1E"}, {"c": "\u2f7b", "n": "KANGXI RADICAL FEATHER"}], "\u2f7b": [{"c": "\u7fbd", "n": "CJK UNIFIED IDEOGRAPH-7FBD"}], "\ud87e\udd79": [{"c": "\u7ffa", "n": "CJK UNIFIED IDEOGRAPH-7FFA"}], "\u7ffa": [{"c": "\ud87e\udd79", "n": "CJK COMPATIBILITY IDEOGRAPH-2F979"}], "\uf934": [{"c": "\u8001", "n": "CJK UNIFIED IDEOGRAPH-8001"}], "\u8001": [{"c": "\uf934", "n": "CJK COMPATIBILITY IDEOGRAPH-F934"}, {"c": "\u2f7c", "n": "KANGXI RADICAL OLD"}], "\u2f7c": [{"c": "\u8001", "n": "CJK UNIFIED IDEOGRAPH-8001"}], "\u2eb9": [{"c": "\u8002", "n": "CJK UNIFIED IDEOGRAPH-8002"}], "\u8002": [{"c": "\u2eb9", "n": "CJK RADICAL OLD"}], "\ufa5b": [{"c": "\u8005", "n": "CJK UNIFIED IDEOGRAPH-8005"}], "\u8005": [{"c": "\ufa5b", "n": "CJK COMPATIBILITY IDEOGRAPH-FA5B"}, {"c": "\ufab2", "n": "CJK COMPATIBILITY IDEOGRAPH-FAB2"}, {"c": "\ud87e\udd7a", "n": "CJK COMPATIBILITY IDEOGRAPH-2F97A"}], "\ufab2": [{"c": "\u8005", "n": "CJK UNIFIED IDEOGRAPH-8005"}], "\ud87e\udd7a": [{"c": "\u8005", "n": "CJK UNIFIED IDEOGRAPH-8005"}], "\u2f7d": [{"c": "\u800c", "n": "CJK UNIFIED IDEOGRAPH-800C"}], "\u800c": [{"c": "\u2f7d", "n": "KANGXI RADICAL AND"}], "\ud87e\udd7b": [{"c": "\ud859\udcda", "n": "CJK UNIFIED IDEOGRAPH-264DA"}], "\ud859\udcda": [{"c": "\ud87e\udd7b", "n": "CJK COMPATIBILITY IDEOGRAPH-2F97B"}], "\u2f7e": [{"c": "\u8012", "n": "CJK UNIFIED IDEOGRAPH-8012"}], "\u8012": [{"c": "\u2f7e", "n": "KANGXI RADICAL PLOW"}], "\ud87e\udd7c": [{"c": "\ud859\udd23", "n": "CJK UNIFIED IDEOGRAPH-26523"}], "\ud859\udd23": [{"c": "\ud87e\udd7c", "n": "CJK COMPATIBILITY IDEOGRAPH-2F97C"}], "\u2f7f": [{"c": "\u8033", "n": "CJK UNIFIED IDEOGRAPH-8033"}], "\u8033": [{"c": "\u2f7f", "n": "KANGXI RADICAL EAR"}], "\uf9b0": [{"c": "\u8046", "n": "CJK UNIFIED IDEOGRAPH-8046"}], "\u8046": [{"c": "\uf9b0", "n": "CJK COMPATIBILITY IDEOGRAPH-F9B0"}], "\ud87e\udd7d": [{"c": "\u8060", "n": "CJK UNIFIED IDEOGRAPH-8060"}], "\u8060": [{"c": "\ud87e\udd7d", "n": "CJK COMPATIBILITY IDEOGRAPH-2F97D"}], "\ud87e\udd7e": [{"c": "\ud859\udda8", "n": "CJK UNIFIED IDEOGRAPH-265A8"}], "\ud859\udda8": [{"c": "\ud87e\udd7e", "n": "CJK COMPATIBILITY IDEOGRAPH-2F97E"}], "\uf997": [{"c": "\u806f", "n": "CJK UNIFIED IDEOGRAPH-806F"}], "\u806f": [{"c": "\uf997", "n": "CJK COMPATIBILITY IDEOGRAPH-F997"}], "\ud87e\udd7f": [{"c": "\u8070", "n": "CJK UNIFIED IDEOGRAPH-8070"}], "\u8070": [{"c": "\ud87e\udd7f", "n": "CJK COMPATIBILITY IDEOGRAPH-2F97F"}], "\uf945": [{"c": "\u807e", "n": "CJK UNIFIED IDEOGRAPH-807E"}], "\u807e": [{"c": "\uf945", "n": "CJK COMPATIBILITY IDEOGRAPH-F945"}], "\u2f80": [{"c": "\u807f", "n": "CJK UNIFIED IDEOGRAPH-807F"}], "\u807f": [{"c": "\u2f80", "n": "KANGXI RADICAL BRUSH"}], "\u2eba": [{"c": "\u8080", "n": "CJK UNIFIED IDEOGRAPH-8080"}], "\u8080": [{"c": "\u2eba", "n": "CJK RADICAL BRUSH ONE"}], "\u2f81": [{"c": "\u8089", "n": "CJK UNIFIED IDEOGRAPH-8089"}], "\u8089": [{"c": "\u2f81", "n": "KANGXI RADICAL MEAT"}], "\uf953": [{"c": "\u808b", "n": "CJK UNIFIED IDEOGRAPH-808B"}], "\u808b": [{"c": "\uf953", "n": "CJK COMPATIBILITY IDEOGRAPH-F953"}], "\ud87e\udcd6": [{"c": "\u80ad", "n": "CJK UNIFIED IDEOGRAPH-80AD"}], "\u80ad": [{"c": "\ud87e\udcd6", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8D6"}], "\ud87e\udd82": [{"c": "\u80b2", "n": "CJK UNIFIED IDEOGRAPH-80B2"}], "\u80b2": [{"c": "\ud87e\udd82", "n": "CJK COMPATIBILITY IDEOGRAPH-2F982"}], "\ud87e\udd81": [{"c": "\u43d5", "n": "CJK UNIFIED IDEOGRAPH-43D5"}], "\u43d5": [{"c": "\ud87e\udd81", "n": "CJK COMPATIBILITY IDEOGRAPH-2F981"}], "\ud87e\udcd7": [{"c": "\u43d9", "n": "CJK UNIFIED IDEOGRAPH-43D9"}], "\u43d9": [{"c": "\ud87e\udcd7", "n": "CJK COMPATIBILITY IDEOGRAPH-2F8D7"}], "\u8141": [{"c": "\u80fc", "n": "CJK UNIFIED IDEOGRAPH-80FC"}], "\u80fc": [{"c": "\u8141", "n": "CJK UNIFIED IDEOGRAPH-8141"}], "\ud87e\udd83": [{"c": "\u8103", "n": "CJK UNIFIED IDEOGRAPH-8103"}], "\u8103": [{"c": "\ud87e\udd83", "n": "CJK COMPATIBILITY IDEOGRAPH-2F983"}], "\ud87e\udd85": [{"c": "\u813e", "n": "CJK UNIFIED IDEOGRAPH-813E"}], "\u813e": [{"c": "\ud87e\udd85", "n": "CJK COMPATIBILITY IDEOGRAPH-2F985"}], "\ud87e\udd84": [{"c": "\u440b", "n": "CJK UNIFIED IDEOGRAPH-440B"}], "\u440b": [{"c": "\ud87e\udd84", "n": "CJK COMPATIBILITY IDEOGRAPH-2F984"}], "\ud87e\udd87": [{"c": "\ud859\udfa7", "n": "CJK UNIFIED IDEOGRAPH-267A7"}], "\ud859\udfa7": [{"c": "\ud87e\udd87", "n": "CJK COMPATIBILITY IDEOGRAPH-2F987"}], "\ud87e\udd88": [{"c": "\ud859\udfb5", "n": "CJK UNIFIED IDEOGRAPH-267B5"}], "\ud859\udfb5": [{"c": "\ud87e\udd88", "n": "CJK COMPATIBILITY IDEOGRAPH-2F988"}], "\u6726": [{"c": "\u4443", "n": "CJK UNIFIED IDEOGRAPH-4443"}], "\u4443": [{"c": "\u6726", "n": "CJK UNIFIED IDEOGRAPH-6726"}], "\uf926": [{"c": "\u81d8", "n": "CJK UNIFIED IDEOGRAPH-81D8"}], "\u81d8": [{"c": "\uf926", "n": "CJK COMPATIBILITY IDEOGRAPH-F926"}], "\u2f82": [{"c": "\u81e3", "n": "CJK UNIFIED IDEOGRAPH-81E3"}], "\u81e3": [{"c": "\u2f82", "n": "KANGXI RADICAL MINISTER"}], "\uf9f6": [{"c": "\u81e8", "n": "CJK UNIFIED IDEOGRAPH-81E8"}], "\u81e8": [{"c": "\uf9f6", "n": "CJK COMPATIBILITY IDEOGRAPH-F9F6"}], "\u2f83": [{"c": "\u81ea", "n": "CJK UNIFIED IDEOGRAPH-81EA"}], "\u81ea": [{"c": "\u2f83", "n": "KANGXI RADICAL SELF"}], "\ufa5c": [{"c": "\u81ed", "n": "CJK UNIFIED IDEOGRAPH-81ED"}], "\u81ed": [{"c": "\ufa5c", "n": "CJK COMPATIBILITY IDEOGRAPH-FA5C"}], "\u2f84": [{"c": "\u81f3", "n": "CJK UNIFIED IDEOGRAPH-81F3"}], "\u81f3": [{"c": "\u2f84", "n": "KANGXI RADICAL ARRIVE"}], "\u2f85": [{"c": "\u81fc", "n": "CJK UNIFIED IDEOGRAPH-81FC"}], "\u81fc": [{"c": "\u2f85", "n": "KANGXI RADICAL MORTAR"}], "\ud87e\udc93": [{"c": "\u8201", "n": "CJK UNIFIED IDEOGRAPH-8201"}], "\u8201": [{"c": "\ud87e\udc93", "n": "CJK COMPATIBILITY IDEOGRAPH-2F893"}, {"c": "\ud87e\udd8b", "n": "CJK COMPATIBILITY IDEOGRAPH-2F98B"}], "\ud87e\udd8b": [{"c": "\u8201", "n": "CJK UNIFIED IDEOGRAPH-8201"}], "\ud87e\udd8c": [{"c": "\u8204", "n": "CJK UNIFIED IDEOGRAPH-8204"}], "\u8204": [{"c": "\ud87e\udd8c", "n": "CJK COMPATIBILITY IDEOGRAPH-2F98C"}], "\u2f86": [{"c": "\u820c", "n": "CJK UNIFIED IDEOGRAPH-820C"}], "\u820c": [{"c": "\u2f86", "n": "KANGXI RADICAL TONGUE"}], "\ufa6d": [{"c": "\u8218", "n": "CJK UNIFIED IDEOGRAPH-8218"}], "\u8218": [{"c": "\ufa6d", "n": "CJK COMPATIBILITY IDEOGRAPH-FA6D"}], "\u2f87": [{"c": "\u821b", "n": "CJK UNIFIED IDEOGRAPH-821B"}], "\u821b": [{"c": "\u2f87", "n": "KANGXI RADICAL OPPOSE"}], "\u2f88": [{"c": "\u821f", "n": "CJK UNIFIED IDEOGRAPH-821F"}], "\u821f": [{"c": "\u2f88", "n": "KANGXI RADICAL BOAT"}], "\ud87e\udd8e": [{"c": "\u446b", "n": "CJK UNIFIED IDEOGRAPH-446B"}], "\u446b": [{"c": "\ud87e\udd8e", "n": "CJK COMPATIBILITY IDEOGRAPH-2F98E"}], "\u2f89": [{"c": "\u826e", "n": "CJK UNIFIED IDEOGRAPH-826E"}], "\u826e": [{"c": "\u2f89", "n": "KANGXI RADICAL STOPPING"}], "\uf97c": [{"c": "\u826f", "n": "CJK UNIFIED IDEOGRAPH-826F"}], "\u826f": [{"c": "\uf97c", "n": "CJK COMPATIBILITY IDEOGRAPH-F97C"}], "\u2f8a": [{"c": "\u8272", "n": "CJK UNIFIED IDEOGRAPH-8272"}], "\u8272": [{"c": "\u2f8a", "n": "KANGXI RADICAL COLOR"}], "\u2f8b": [{"c": "\u8278", "n": "CJK UNIFIED IDEOGRAPH-8278"}], "\u8278": [{"c": "\u2f8b", "n": "KANGXI RADICAL GRASS"}], "\ufa5d": [{"c": "\u8279", "n": "CJK UNIFIED IDEOGRAPH-8279"}], "\u8279": [{"c": "\ufa5d", "n": "CJK COMPATIBILITY IDEOGRAPH-FA5D"}, {"c": "\ufa5e", "n": "CJK COMPATIBILITY IDEOGRAPH-FA5E"}, {"c": "\u2ebe", "n": "CJK RADICAL GRASS ONE"}, {"c": "\u2ebf", "n": "CJK RADICAL GRASS TWO"}, {"c": "\u2ec0", "n": "CJK RADICAL GRASS THREE"}], "\ufa5e": [{"c": "\u8279", "n": "CJK UNIFIED IDEOGRAPH-8279"}], "\u2ebe": [{"c": "\u8279", "n": "CJK UNIFIED IDEOGRAPH-8279"}], "\u2ebf": [{"c": "\u8279", "n": "CJK UNIFIED IDEOGRAPH-8279"}], "\u2ec0": [{"c": "\u8279", "n": "CJK UNIFIED IDEOGRAPH-8279"}], "\ud87e\udd90": [{"c": "\u828b", "n": "CJK UNIFIED IDEOGRAPH-828B"}], "\u828b": [{"c": "\ud87e\udd90", "n": "CJK COMPATIBILITY IDEOGRAPH-2F990"}], "\ud87e\udd8f": [{"c": "\u8291", "n": "CJK UNIFIED IDEOGRAPH-8291"}], "\u8291": [{"c": "\ud87e\udd8f", "n": "CJK COMPATIBILITY IDEOGRAPH-2F98F"}], "\ud87e\udd91": [{"c": "\u829d", "n": "CJK UNIFIED IDEOGRAPH-829D"}], "\u829d": [{"c": "\ud87e\udd91", "n": "CJK COMPATIBILITY IDEOGRAPH-2F991"}], "\ud87e\udd93": [{"c": "\u82b1", "n": "CJK UNIFIED IDEOGRAPH-82B1"}], "\u82b1": [{"c": "\ud87e\udd93", "n": "CJK COMPATIBILITY IDEOGRAPH-2F993"}], "\ud87e\udd94": [{"c": "\u82b3", "n": "CJK UNIFIED IDEOGRAPH-82B3"}], "\u82b3": [{"c": "\ud87e\udd94", "n": "CJK COMPATIBILITY IDEOGRAPH-2F994"}], "\ud87e\udd95": [{"c": "\u82bd", "n": "CJK UNIFIED IDEOGRAPH-82BD"}], "\u82bd": [{"c": "\ud87e\udd95", "n": "CJK COMPATIBILITY IDEOGRAPH-2F995"}], "\uf974": [{"c": "\u82e5", "n": "CJK UNIFIED IDEOGRAPH-82E5"}], "\u82e5": [{"c": "\uf974", "n": "CJK COMPATIBILITY IDEOGRAPH-F974"}, {"c": "\ud87e\udd98", "n": "CJK COMPATIBILITY IDEOGRAPH-2F998"}], "\ud87e\udd98": [{"c": "\u82e5", "n": "CJK UNIFIED IDEOGRAPH-82E5"}], "\ud87e\udd96": [{"c": "\u82e6", "n": "CJK UNIFIED IDEOGRAPH-82E6"}], "\u82e6": [{"c": "\ud87e\udd96", "n": "CJK COMPATIBILITY IDEOGRAPH-2F996"}], "\ud87e\udd97": [{"c": "\ud85a\udf3c", "n": "CJK UNIFIED IDEOGRAPH-26B3C"}], "\ud85a\udf3c": [{"c": "\ud87e\udd97", "n": "CJK COMPATIBILITY IDEOGRAPH-2F997"}], "\uf9fe": [{"c": "\u8336", "n": "CJK UNIFIED IDEOGRAPH-8336"}], "\u8336": [{"c": "\uf9fe", "n": "CJK COMPATIBILITY IDEOGRAPH-F9FE"}], "\ufab3": [{"c": "\u8352", "n": "CJK UNIFIED IDEOGRAPH-8352"}], "\u8352": [{"c": "\ufab3", "n": "CJK COMPATIBILITY IDEOGRAPH-FAB3"}], "\ud87e\udd9a": [{"c": "\u8363", "n": "CJK UNIFIED IDEOGRAPH-8363"}], "\u8363": [{"c": "\ud87e\udd9a", "n": "CJK COMPATIBILITY IDEOGRAPH-2F99A"}], "\ud87e\udd99": [{"c": "\u831d", "n": "CJK UNIFIED IDEOGRAPH-831D"}], "\u831d": [{"c": "\ud87e\udd99", "n": "CJK COMPATIBILITY IDEOGRAPH-2F999"}], "\ud87e\udd9c": [{"c": "\u8323", "n": "CJK UNIFIED IDEOGRAPH-8323"}], "\u8323": [{"c": "\ud87e\udd9c", "n": "CJK COMPATIBILITY IDEOGRAPH-2F99C"}], "\ud87e\udd9d": [{"c": "\u83bd", "n": "CJK UNIFIED IDEOGRAPH-83BD"}], "\u83bd": [{"c": "\ud87e\udd9d", "n": "CJK COMPATIBILITY IDEOGRAPH-2F99D"}], "\ud87e\udda0": [{"c": "\u8353", "n": "CJK UNIFIED IDEOGRAPH-8353"}], "\u8353": [{"c": "\ud87e\udda0", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9A0"}], "\uf93e": [{"c": "\u83c9", "n": "CJK UNIFIED IDEOGRAPH-83C9"}], "\u83c9": [{"c": "\uf93e", "n": "CJK COMPATIBILITY IDEOGRAPH-F93E"}], "\ud87e\udda1": [{"c": "\u83ca", "n": "CJK UNIFIED IDEOGRAPH-83CA"}], "\u83ca": [{"c": "\ud87e\udda1", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9A1"}], "\ud87e\udda2": [{"c": "\u83cc", "n": "CJK UNIFIED IDEOGRAPH-83CC"}], "\u83cc": [{"c": "\ud87e\udda2", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9A2"}], "\ud87e\udda3": [{"c": "\u83dc", "n": "CJK UNIFIED IDEOGRAPH-83DC"}], "\u83dc": [{"c": "\ud87e\udda3", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9A3"}], "\ud87e\udd9e": [{"c": "\u83e7", "n": "CJK UNIFIED IDEOGRAPH-83E7"}], "\u83e7": [{"c": "\ud87e\udd9e", "n": "CJK COMPATIBILITY IDEOGRAPH-2F99E"}], "\ufab4": [{"c": "\u83ef", "n": "CJK UNIFIED IDEOGRAPH-83EF"}], "\u83ef": [{"c": "\ufab4", "n": "CJK COMPATIBILITY IDEOGRAPH-FAB4"}], "\uf958": [{"c": "\u83f1", "n": "CJK UNIFIED IDEOGRAPH-83F1"}], "\u83f1": [{"c": "\uf958", "n": "CJK COMPATIBILITY IDEOGRAPH-F958"}], "\ufa5f": [{"c": "\u8457", "n": "CJK UNIFIED IDEOGRAPH-8457"}], "\u8457": [{"c": "\ufa5f", "n": "CJK COMPATIBILITY IDEOGRAPH-FA5F"}, {"c": "\ud87e\udd9f", "n": "CJK COMPATIBILITY IDEOGRAPH-2F99F"}], "\ud87e\udd9f": [{"c": "\u8457", "n": "CJK UNIFIED IDEOGRAPH-8457"}], "\ud87e\udda4": [{"c": "\ud85b\udc36", "n": "CJK UNIFIED IDEOGRAPH-26C36"}], "\ud85b\udc36": [{"c": "\ud87e\udda4", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9A4"}], "\ud87e\udd9b": [{"c": "\u83ad", "n": "CJK UNIFIED IDEOGRAPH-83AD"}], "\u83ad": [{"c": "\ud87e\udd9b", "n": "CJK COMPATIBILITY IDEOGRAPH-2F99B"}], "\uf918": [{"c": "\u843d", "n": "CJK UNIFIED IDEOGRAPH-843D"}], "\u843d": [{"c": "\uf918", "n": "CJK COMPATIBILITY IDEOGRAPH-F918"}], "\uf96e": [{"c": "\u8449", "n": "CJK UNIFIED IDEOGRAPH-8449"}], "\u8449": [{"c": "\uf96e", "n": "CJK COMPATIBILITY IDEOGRAPH-F96E"}], "\u853f": [{"c": "\u848d", "n": "CJK UNIFIED IDEOGRAPH-848D"}], "\u848d": [{"c": "\u853f", "n": "CJK UNIFIED IDEOGRAPH-853F"}], "\ud87e\udda6": [{"c": "\ud85b\udcd5", "n": "CJK UNIFIED IDEOGRAPH-26CD5"}], "\ud85b\udcd5": [{"c": "\ud87e\udda6", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9A6"}], "\ud87e\udda5": [{"c": "\ud85b\udd6b", "n": "CJK UNIFIED IDEOGRAPH-26D6B"}], "\ud85b\udd6b": [{"c": "\ud87e\udda5", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9A5"}], "\uf999": [{"c": "\u84ee", "n": "CJK UNIFIED IDEOGRAPH-84EE"}], "\u84ee": [{"c": "\uf999", "n": "CJK COMPATIBILITY IDEOGRAPH-F999"}], "\ud87e\udda8": [{"c": "\u84f1", "n": "CJK UNIFIED IDEOGRAPH-84F1"}], "\u84f1": [{"c": "\ud87e\udda8", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9A8"}], "\ud87e\udda9": [{"c": "\u84f3", "n": "CJK UNIFIED IDEOGRAPH-84F3"}], "\u84f3": [{"c": "\ud87e\udda9", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9A9"}], "\uf9c2": [{"c": "\u84fc", "n": "CJK UNIFIED IDEOGRAPH-84FC"}], "\u84fc": [{"c": "\uf9c2", "n": "CJK COMPATIBILITY IDEOGRAPH-F9C2"}], "\ud87e\uddaa": [{"c": "\u8516", "n": "CJK UNIFIED IDEOGRAPH-8516"}], "\u8516": [{"c": "\ud87e\uddaa", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9AA"}], "\ud87e\udda7": [{"c": "\u452b", "n": "CJK UNIFIED IDEOGRAPH-452B"}], "\u452b": [{"c": "\ud87e\udda7", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9A7"}], "\ud87e\uddac": [{"c": "\u8564", "n": "CJK UNIFIED IDEOGRAPH-8564"}], "\u8564": [{"c": "\ud87e\uddac", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9AC"}], "\ud87e\uddad": [{"c": "\ud85b\udf2c", "n": "CJK UNIFIED IDEOGRAPH-26F2C"}], "\ud85b\udf2c": [{"c": "\ud87e\uddad", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9AD"}], "\uf923": [{"c": "\u85cd", "n": "CJK UNIFIED IDEOGRAPH-85CD"}], "\u85cd": [{"c": "\uf923", "n": "CJK COMPATIBILITY IDEOGRAPH-F923"}], "\ud87e\uddae": [{"c": "\u455d", "n": "CJK UNIFIED IDEOGRAPH-455D"}], "\u455d": [{"c": "\ud87e\uddae", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9AE"}], "\ud87e\uddb0": [{"c": "\ud85b\udfb1", "n": "CJK UNIFIED IDEOGRAPH-26FB1"}], "\ud85b\udfb1": [{"c": "\ud87e\uddb0", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9B0"}], "\ud87e\uddaf": [{"c": "\u4561", "n": "CJK UNIFIED IDEOGRAPH-4561"}], "\u4561": [{"c": "\ud87e\uddaf", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9AF"}], "\uf9f0": [{"c": "\u85fa", "n": "CJK UNIFIED IDEOGRAPH-85FA"}], "\u85fa": [{"c": "\uf9f0", "n": "CJK COMPATIBILITY IDEOGRAPH-F9F0"}], "\uf935": [{"c": "\u8606", "n": "CJK UNIFIED IDEOGRAPH-8606"}], "\u8606": [{"c": "\uf935", "n": "CJK COMPATIBILITY IDEOGRAPH-F935"}], "\ud87e\uddb2": [{"c": "\u456b", "n": "CJK UNIFIED IDEOGRAPH-456B"}], "\u456b": [{"c": "\ud87e\uddb2", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9B2"}], "\ufa20": [{"c": "\u8612", "n": "CJK UNIFIED IDEOGRAPH-8612"}], "\u8612": [{"c": "\ufa20", "n": "CJK COMPATIBILITY IDEOGRAPH-FA20"}], "\uf91f": [{"c": "\u862d", "n": "CJK UNIFIED IDEOGRAPH-862D"}], "\u862d": [{"c": "\uf91f", "n": "CJK COMPATIBILITY IDEOGRAPH-F91F"}], "\ud87e\uddb1": [{"c": "\ud85c\udcd2", "n": "CJK UNIFIED IDEOGRAPH-270D2"}], "\ud85c\udcd2": [{"c": "\ud87e\uddb1", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9B1"}], "\u8641": [{"c": "\u8637", "n": "CJK UNIFIED IDEOGRAPH-8637"}], "\u8637": [{"c": "\u8641", "n": "CJK UNIFIED IDEOGRAPH-8641"}], "\uf910": [{"c": "\u863f", "n": "CJK UNIFIED IDEOGRAPH-863F"}], "\u863f": [{"c": "\uf910", "n": "CJK COMPATIBILITY IDEOGRAPH-F910"}], "\u2f8c": [{"c": "\u864d", "n": "CJK UNIFIED IDEOGRAPH-864D"}], "\u864d": [{"c": "\u2f8c", "n": "KANGXI RADICAL TIGER"}], "\u2ec1": [{"c": "\u864e", "n": "CJK UNIFIED IDEOGRAPH-864E"}], "\u864e": [{"c": "\u2ec1", "n": "CJK RADICAL TIGER"}], "\ud87e\uddb3": [{"c": "\u8650", "n": "CJK UNIFIED IDEOGRAPH-8650"}], "\u8650": [{"c": "\ud87e\uddb3", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9B3"}], "\uf936": [{"c": "\u865c", "n": "CJK UNIFIED IDEOGRAPH-865C"}], "\u865c": [{"c": "\uf936", "n": "CJK COMPATIBILITY IDEOGRAPH-F936"}, {"c": "\ud87e\uddb4", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9B4"}], "\ud87e\uddb4": [{"c": "\u865c", "n": "CJK UNIFIED IDEOGRAPH-865C"}], "\ud87e\uddb5": [{"c": "\u8667", "n": "CJK UNIFIED IDEOGRAPH-8667"}], "\u8667": [{"c": "\ud87e\uddb5", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9B5"}], "\ud87e\uddb6": [{"c": "\u8669", "n": "CJK UNIFIED IDEOGRAPH-8669"}], "\u8669": [{"c": "\ud87e\uddb6", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9B6"}], "\u2f8d": [{"c": "\u866b", "n": "CJK UNIFIED IDEOGRAPH-866B"}], "\u866b": [{"c": "\u2f8d", "n": "KANGXI RADICAL INSECT"}], "\ud87e\uddb7": [{"c": "\u86a9", "n": "CJK UNIFIED IDEOGRAPH-86A9"}], "\u86a9": [{"c": "\ud87e\uddb7", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9B7"}], "\ud87e\uddb8": [{"c": "\u8688", "n": "CJK UNIFIED IDEOGRAPH-8688"}], "\u8688": [{"c": "\ud87e\uddb8", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9B8"}], "\ud87e\uddba": [{"c": "\u86e2", "n": "CJK UNIFIED IDEOGRAPH-86E2"}], "\u86e2": [{"c": "\ud87e\uddba", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9BA"}], "\ud87e\uddb9": [{"c": "\u870e", "n": "CJK UNIFIED IDEOGRAPH-870E"}], "\u870e": [{"c": "\ud87e\uddb9", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9B9"}], "\ud87e\uddbc": [{"c": "\u8728", "n": "CJK UNIFIED IDEOGRAPH-8728"}], "\u8728": [{"c": "\ud87e\uddbc", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9BC"}], "\ud87e\uddbd": [{"c": "\u876b", "n": "CJK UNIFIED IDEOGRAPH-876B"}], "\u876b": [{"c": "\ud87e\uddbd", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9BD"}], "\ud87e\uddc0": [{"c": "\u87e1", "n": "CJK UNIFIED IDEOGRAPH-87E1"}], "\u87e1": [{"c": "\ud87e\uddc0", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9C0"}], "\ufab5": [{"c": "\u8779", "n": "CJK UNIFIED IDEOGRAPH-8779"}], "\u8779": [{"c": "\ufab5", "n": "CJK COMPATIBILITY IDEOGRAPH-FAB5"}, {"c": "\ud87e\uddbb", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9BB"}], "\ud87e\uddbb": [{"c": "\u8779", "n": "CJK UNIFIED IDEOGRAPH-8779"}], "\ud87e\uddbe": [{"c": "\u8786", "n": "CJK UNIFIED IDEOGRAPH-8786"}], "\u8786": [{"c": "\ud87e\uddbe", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9BE"}], "\ud87e\uddbf": [{"c": "\u45d7", "n": "CJK UNIFIED IDEOGRAPH-45D7"}], "\u45d7": [{"c": "\ud87e\uddbf", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9BF"}], "\ud87e\uddab": [{"c": "\ud85c\udfca", "n": "CJK UNIFIED IDEOGRAPH-273CA"}], "\ud85c\udfca": [{"c": "\ud87e\uddab", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9AB"}], "\uf911": [{"c": "\u87ba", "n": "CJK UNIFIED IDEOGRAPH-87BA"}], "\u87ba": [{"c": "\uf911", "n": "CJK COMPATIBILITY IDEOGRAPH-F911"}], "\ud87e\uddc1": [{"c": "\u8801", "n": "CJK UNIFIED IDEOGRAPH-8801"}], "\u8801": [{"c": "\ud87e\uddc1", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9C1"}], "\ud87e\uddc2": [{"c": "\u45f9", "n": "CJK UNIFIED IDEOGRAPH-45F9"}], "\u45f9": [{"c": "\ud87e\uddc2", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9C2"}], "\uf927": [{"c": "\u881f", "n": "CJK UNIFIED IDEOGRAPH-881F"}], "\u881f": [{"c": "\uf927", "n": "CJK COMPATIBILITY IDEOGRAPH-F927"}], "\u2f8e": [{"c": "\u8840", "n": "CJK UNIFIED IDEOGRAPH-8840"}], "\u8840": [{"c": "\u2f8e", "n": "KANGXI RADICAL BLOOD"}], "\ufa08": [{"c": "\u884c", "n": "CJK UNIFIED IDEOGRAPH-884C"}], "\u884c": [{"c": "\ufa08", "n": "CJK COMPATIBILITY IDEOGRAPH-FA08"}, {"c": "\u2f8f", "n": "KANGXI RADICAL WALK ENCLOSURE"}], "\u2f8f": [{"c": "\u884c", "n": "CJK UNIFIED IDEOGRAPH-884C"}], "\ud87e\uddc3": [{"c": "\u8860", "n": "CJK UNIFIED IDEOGRAPH-8860"}], "\u8860": [{"c": "\ud87e\uddc3", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9C3"}], "\ud87e\uddc4": [{"c": "\u8863", "n": "CJK UNIFIED IDEOGRAPH-8863"}], "\u8863": [{"c": "\ud87e\uddc4", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9C4"}, {"c": "\u2f90", "n": "KANGXI RADICAL CLOTHES"}], "\u2f90": [{"c": "\u8863", "n": "CJK UNIFIED IDEOGRAPH-8863"}], "\u2ec2": [{"c": "\u8864", "n": "CJK UNIFIED IDEOGRAPH-8864"}], "\u8864": [{"c": "\u2ec2", "n": "CJK RADICAL CLOTHES"}], "\uf9a0": [{"c": "\u88c2", "n": "CJK UNIFIED IDEOGRAPH-88C2"}], "\u88c2": [{"c": "\uf9a0", "n": "CJK COMPATIBILITY IDEOGRAPH-F9A0"}], "\ud87e\uddc5": [{"c": "\ud85d\ude67", "n": "CJK UNIFIED IDEOGRAPH-27667"}], "\ud85d\ude67": [{"c": "\ud87e\uddc5", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9C5"}], "\uf9e7": [{"c": "\u88cf", "n": "CJK UNIFIED IDEOGRAPH-88CF"}], "\u88cf": [{"c": "\uf9e7", "n": "CJK COMPATIBILITY IDEOGRAPH-F9E7"}], "\ud87e\uddc6": [{"c": "\u88d7", "n": "CJK UNIFIED IDEOGRAPH-88D7"}], "\u88d7": [{"c": "\ud87e\uddc6", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9C6"}], "\ud87e\uddc7": [{"c": "\u88de", "n": "CJK UNIFIED IDEOGRAPH-88DE"}], "\u88de": [{"c": "\ud87e\uddc7", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9C7"}], "\uf9e8": [{"c": "\u88e1", "n": "CJK UNIFIED IDEOGRAPH-88E1"}], "\u88e1": [{"c": "\uf9e8", "n": "CJK COMPATIBILITY IDEOGRAPH-F9E8"}], "\uf912": [{"c": "\u88f8", "n": "CJK UNIFIED IDEOGRAPH-88F8"}], "\u88f8": [{"c": "\uf912", "n": "CJK COMPATIBILITY IDEOGRAPH-F912"}], "\ud87e\uddc9": [{"c": "\u88fa", "n": "CJK UNIFIED IDEOGRAPH-88FA"}], "\u88fa": [{"c": "\ud87e\uddc9", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9C9"}], "\ud87e\uddc8": [{"c": "\u4635", "n": "CJK UNIFIED IDEOGRAPH-4635"}], "\u4635": [{"c": "\ud87e\uddc8", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9C8"}], "\ufa60": [{"c": "\u8910", "n": "CJK UNIFIED IDEOGRAPH-8910"}], "\u8910": [{"c": "\ufa60", "n": "CJK COMPATIBILITY IDEOGRAPH-FA60"}], "\ufab6": [{"c": "\u8941", "n": "CJK UNIFIED IDEOGRAPH-8941"}], "\u8941": [{"c": "\ufab6", "n": "CJK COMPATIBILITY IDEOGRAPH-FAB6"}], "\uf924": [{"c": "\u8964", "n": "CJK UNIFIED IDEOGRAPH-8964"}], "\u8964": [{"c": "\uf924", "n": "CJK COMPATIBILITY IDEOGRAPH-F924"}], "\u2f91": [{"c": "\u897e", "n": "CJK UNIFIED IDEOGRAPH-897E"}], "\u897e": [{"c": "\u2f91", "n": "KANGXI RADICAL WEST"}], "\u2ec4": [{"c": "\u897f", "n": "CJK UNIFIED IDEOGRAPH-897F"}], "\u897f": [{"c": "\u2ec4", "n": "CJK RADICAL WEST TWO"}], "\u2ec3": [{"c": "\u8980", "n": "CJK UNIFIED IDEOGRAPH-8980"}], "\u8980": [{"c": "\u2ec3", "n": "CJK RADICAL WEST ONE"}], "\ufab7": [{"c": "\u8986", "n": "CJK UNIFIED IDEOGRAPH-8986"}], "\u8986": [{"c": "\ufab7", "n": "CJK COMPATIBILITY IDEOGRAPH-FAB7"}], "\ufa0a": [{"c": "\u898b", "n": "CJK UNIFIED IDEOGRAPH-898B"}], "\u898b": [{"c": "\ufa0a", "n": "CJK COMPATIBILITY IDEOGRAPH-FA0A"}, {"c": "\u2f92", "n": "KANGXI RADICAL SEE"}], "\u2f92": [{"c": "\u898b", "n": "CJK UNIFIED IDEOGRAPH-898B"}], "\ud87e\uddcb": [{"c": "\ud85e\udcae", "n": "CJK UNIFIED IDEOGRAPH-278AE"}], "\ud85e\udcae": [{"c": "\ud87e\uddcb", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9CB"}], "\u2ec5": [{"c": "\u89c1", "n": "CJK UNIFIED IDEOGRAPH-89C1"}], "\u89c1": [{"c": "\u2ec5", "n": "CJK RADICAL C-SIMPLIFIED SEE"}], "\u2f93": [{"c": "\u89d2", "n": "CJK UNIFIED IDEOGRAPH-89D2"}], "\u89d2": [{"c": "\u2f93", "n": "KANGXI RADICAL HORN"}], "\u2f94": [{"c": "\u8a00", "n": "CJK UNIFIED IDEOGRAPH-8A00"}], "\u8a00": [{"c": "\u2f94", "n": "KANGXI RADICAL SPEECH"}], "\ud87e\uddcc": [{"c": "\ud85e\udd66", "n": "CJK UNIFIED IDEOGRAPH-27966"}], "\ud85e\udd66": [{"c": "\ud87e\uddcc", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9CC"}], "\u8a7d": [{"c": "\u8a2e", "n": "CJK UNIFIED IDEOGRAPH-8A2E"}], "\u8a2e": [{"c": "\u8a7d", "n": "CJK UNIFIED IDEOGRAPH-8A7D"}], "\u8a1e": [{"c": "\u46b6", "n": "CJK UNIFIED IDEOGRAPH-46B6"}], "\u46b6": [{"c": "\u8a1e", "n": "CJK UNIFIED IDEOGRAPH-8A1E"}], "\ud87e\uddcd": [{"c": "\u46be", "n": "CJK UNIFIED IDEOGRAPH-46BE"}], "\u46be": [{"c": "\ud87e\uddcd", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9CD"}], "\ud87e\uddce": [{"c": "\u46c7", "n": "CJK UNIFIED IDEOGRAPH-46C7"}], "\u46c7": [{"c": "\ud87e\uddce", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9CE"}], "\ud87e\uddcf": [{"c": "\u8aa0", "n": "CJK UNIFIED IDEOGRAPH-8AA0"}], "\u8aa0": [{"c": "\ud87e\uddcf", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9CF"}], "\uf96f": [{"c": "\u8aaa", "n": "CJK UNIFIED IDEOGRAPH-8AAA"}], "\u8aaa": [{"c": "\uf96f", "n": "CJK COMPATIBILITY IDEOGRAPH-F96F"}, {"c": "\uf9a1", "n": "CJK COMPATIBILITY IDEOGRAPH-F9A1"}], "\uf9a1": [{"c": "\u8aaa", "n": "CJK UNIFIED IDEOGRAPH-8AAA"}], "\ufab9": [{"c": "\u8abf", "n": "CJK UNIFIED IDEOGRAPH-8ABF"}], "\u8abf": [{"c": "\ufab9", "n": "CJK COMPATIBILITY IDEOGRAPH-FAB9"}], "\ufabb": [{"c": "\u8acb", "n": "CJK UNIFIED IDEOGRAPH-8ACB"}], "\u8acb": [{"c": "\ufabb", "n": "CJK COMPATIBILITY IDEOGRAPH-FABB"}], "\uf97d": [{"c": "\u8ad2", "n": "CJK UNIFIED IDEOGRAPH-8AD2"}], "\u8ad2": [{"c": "\uf97d", "n": "CJK COMPATIBILITY IDEOGRAPH-F97D"}], "\uf941": [{"c": "\u8ad6", "n": "CJK UNIFIED IDEOGRAPH-8AD6"}], "\u8ad6": [{"c": "\uf941", "n": "CJK COMPATIBILITY IDEOGRAPH-F941"}], "\ufabe": [{"c": "\u8aed", "n": "CJK UNIFIED IDEOGRAPH-8AED"}], "\u8aed": [{"c": "\ufabe", "n": "CJK COMPATIBILITY IDEOGRAPH-FABE"}, {"c": "\ud87e\uddd0", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9D0"}], "\ud87e\uddd0": [{"c": "\u8aed", "n": "CJK UNIFIED IDEOGRAPH-8AED"}], "\ufa22": [{"c": "\u8af8", "n": "CJK UNIFIED IDEOGRAPH-8AF8"}], "\u8af8": [{"c": "\ufa22", "n": "CJK COMPATIBILITY IDEOGRAPH-FA22"}, {"c": "\ufaba", "n": "CJK COMPATIBILITY IDEOGRAPH-FABA"}], "\ufaba": [{"c": "\u8af8", "n": "CJK UNIFIED IDEOGRAPH-8AF8"}], "\uf95d": [{"c": "\u8afe", "n": "CJK UNIFIED IDEOGRAPH-8AFE"}], "\u8afe": [{"c": "\uf95d", "n": "CJK COMPATIBILITY IDEOGRAPH-F95D"}, {"c": "\ufabd", "n": "CJK COMPATIBILITY IDEOGRAPH-FABD"}], "\ufabd": [{"c": "\u8afe", "n": "CJK UNIFIED IDEOGRAPH-8AFE"}], "\ufa62": [{"c": "\u8b01", "n": "CJK UNIFIED IDEOGRAPH-8B01"}], "\u8b01": [{"c": "\ufa62", "n": "CJK COMPATIBILITY IDEOGRAPH-FA62"}, {"c": "\ufabc", "n": "CJK COMPATIBILITY IDEOGRAPH-FABC"}], "\ufabc": [{"c": "\u8b01", "n": "CJK UNIFIED IDEOGRAPH-8B01"}], "\ufa63": [{"c": "\u8b39", "n": "CJK UNIFIED IDEOGRAPH-8B39"}], "\u8b39": [{"c": "\ufa63", "n": "CJK COMPATIBILITY IDEOGRAPH-FA63"}, {"c": "\ufabf", "n": "CJK COMPATIBILITY IDEOGRAPH-FABF"}], "\ufabf": [{"c": "\u8b39", "n": "CJK UNIFIED IDEOGRAPH-8B39"}], "\uf9fc": [{"c": "\u8b58", "n": "CJK UNIFIED IDEOGRAPH-8B58"}], "\u8b58": [{"c": "\uf9fc", "n": "CJK COMPATIBILITY IDEOGRAPH-F9FC"}], "\uf95a": [{"c": "\u8b80", "n": "CJK UNIFIED IDEOGRAPH-8B80"}], "\u8b80": [{"c": "\uf95a", "n": "CJK COMPATIBILITY IDEOGRAPH-F95A"}], "\u8b8f": [{"c": "\u8b86", "n": "CJK UNIFIED IDEOGRAPH-8B86"}], "\u8b86": [{"c": "\u8b8f", "n": "CJK UNIFIED IDEOGRAPH-8B8F"}], "\ufac0": [{"c": "\u8b8a", "n": "CJK UNIFIED IDEOGRAPH-8B8A"}], "\u8b8a": [{"c": "\ufac0", "n": "CJK COMPATIBILITY IDEOGRAPH-FAC0"}, {"c": "\ud87e\uddd1", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9D1"}], "\ud87e\uddd1": [{"c": "\u8b8a", "n": "CJK UNIFIED IDEOGRAPH-8B8A"}], "\u2ec8": [{"c": "\u8ba0", "n": "CJK UNIFIED IDEOGRAPH-8BA0"}], "\u8ba0": [{"c": "\u2ec8", "n": "CJK RADICAL C-SIMPLIFIED SPEECH"}], "\u2f95": [{"c": "\u8c37", "n": "CJK UNIFIED IDEOGRAPH-8C37"}], "\u8c37": [{"c": "\u2f95", "n": "KANGXI RADICAL VALLEY"}], "\u2f96": [{"c": "\u8c46", "n": "CJK UNIFIED IDEOGRAPH-8C46"}], "\u8c46": [{"c": "\u2f96", "n": "KANGXI RADICAL BEAN"}], "\uf900": [{"c": "\u8c48", "n": "CJK UNIFIED IDEOGRAPH-8C48"}], "\u8c48": [{"c": "\uf900", "n": "CJK COMPATIBILITY IDEOGRAPH-F900"}], "\ud87e\uddd2": [{"c": "\u8c55", "n": "CJK UNIFIED IDEOGRAPH-8C55"}], "\u8c55": [{"c": "\ud87e\uddd2", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9D2"}, {"c": "\u2f97", "n": "KANGXI RADICAL PIG"}], "\u2f97": [{"c": "\u8c55", "n": "CJK UNIFIED IDEOGRAPH-8C55"}], "\u8c63": [{"c": "\u8c5c", "n": "CJK UNIFIED IDEOGRAPH-8C5C"}], "\u8c5c": [{"c": "\u8c63", "n": "CJK UNIFIED IDEOGRAPH-8C63"}], "\u2f98": [{"c": "\u8c78", "n": "CJK UNIFIED IDEOGRAPH-8C78"}], "\u8c78": [{"c": "\u2f98", "n": "KANGXI RADICAL BADGER"}], "\ud87e\uddd3": [{"c": "\ud85f\udca8", "n": "CJK UNIFIED IDEOGRAPH-27CA8"}], "\ud85f\udca8": [{"c": "\ud87e\uddd3", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9D3"}], "\u2f99": [{"c": "\u8c9d", "n": "CJK UNIFIED IDEOGRAPH-8C9D"}], "\u8c9d": [{"c": "\u2f99", "n": "KANGXI RADICAL SHELL"}], "\ud87e\uddd4": [{"c": "\u8cab", "n": "CJK UNIFIED IDEOGRAPH-8CAB"}], "\u8cab": [{"c": "\ud87e\uddd4", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9D4"}], "\ud87e\uddd5": [{"c": "\u8cc1", "n": "CJK UNIFIED IDEOGRAPH-8CC1"}], "\u8cc1": [{"c": "\ud87e\uddd5", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9D5"}], "\uf948": [{"c": "\u8cc2", "n": "CJK UNIFIED IDEOGRAPH-8CC2"}], "\u8cc2": [{"c": "\uf948", "n": "CJK COMPATIBILITY IDEOGRAPH-F948"}], "\uf903": [{"c": "\u8cc8", "n": "CJK UNIFIED IDEOGRAPH-8CC8"}], "\u8cc8": [{"c": "\uf903", "n": "CJK COMPATIBILITY IDEOGRAPH-F903"}], "\ufa64": [{"c": "\u8cd3", "n": "CJK UNIFIED IDEOGRAPH-8CD3"}], "\u8cd3": [{"c": "\ufa64", "n": "CJK COMPATIBILITY IDEOGRAPH-FA64"}], "\ufa65": [{"c": "\u8d08", "n": "CJK UNIFIED IDEOGRAPH-8D08"}], "\u8d08": [{"c": "\ufa65", "n": "CJK COMPATIBILITY IDEOGRAPH-FA65"}, {"c": "\ufac1", "n": "CJK COMPATIBILITY IDEOGRAPH-FAC1"}], "\ufac1": [{"c": "\u8d08", "n": "CJK UNIFIED IDEOGRAPH-8D08"}], "\ud87e\uddd6": [{"c": "\u8d1b", "n": "CJK UNIFIED IDEOGRAPH-8D1B"}], "\u8d1b": [{"c": "\ud87e\uddd6", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9D6"}], "\u2ec9": [{"c": "\u8d1d", "n": "CJK UNIFIED IDEOGRAPH-8D1D"}], "\u8d1d": [{"c": "\u2ec9", "n": "CJK RADICAL C-SIMPLIFIED SHELL"}], "\u2f9a": [{"c": "\u8d64", "n": "CJK UNIFIED IDEOGRAPH-8D64"}], "\u8d64": [{"c": "\u2f9a", "n": "KANGXI RADICAL RED"}], "\u2f9b": [{"c": "\u8d70", "n": "CJK UNIFIED IDEOGRAPH-8D70"}], "\u8d70": [{"c": "\u2f9b", "n": "KANGXI RADICAL RUN"}], "\ud87e\uddd7": [{"c": "\u8d77", "n": "CJK UNIFIED IDEOGRAPH-8D77"}], "\u8d77": [{"c": "\ud87e\uddd7", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9D7"}], "\u8d86": [{"c": "\u8d7f", "n": "CJK UNIFIED IDEOGRAPH-8D7F"}], "\u8d7f": [{"c": "\u8d86", "n": "CJK UNIFIED IDEOGRAPH-8D86"}], "\ufad7": [{"c": "\ud85f\uded3", "n": "CJK UNIFIED IDEOGRAPH-27ED3"}], "\ud85f\uded3": [{"c": "\ufad7", "n": "CJK COMPATIBILITY IDEOGRAPH-FAD7"}], "\ud87e\uddd8": [{"c": "\ud85f\udf2f", "n": "CJK UNIFIED IDEOGRAPH-27F2F"}], "\ud85f\udf2f": [{"c": "\ud87e\uddd8", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9D8"}], "\u2f9c": [{"c": "\u8db3", "n": "CJK UNIFIED IDEOGRAPH-8DB3"}], "\u8db3": [{"c": "\u2f9c", "n": "KANGXI RADICAL FOOT"}], "\ud87e\uddda": [{"c": "\u8dcb", "n": "CJK UNIFIED IDEOGRAPH-8DCB"}], "\u8dcb": [{"c": "\ud87e\uddda", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9DA"}], "\ud87e\udddb": [{"c": "\u8dbc", "n": "CJK UNIFIED IDEOGRAPH-8DBC"}], "\u8dbc": [{"c": "\ud87e\udddb", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9DB"}], "\u8dfa": [{"c": "\u8de5", "n": "CJK UNIFIED IDEOGRAPH-8DE5"}], "\u8de5": [{"c": "\u8dfa", "n": "CJK UNIFIED IDEOGRAPH-8DFA"}], "\uf937": [{"c": "\u8def", "n": "CJK UNIFIED IDEOGRAPH-8DEF"}], "\u8def": [{"c": "\uf937", "n": "CJK COMPATIBILITY IDEOGRAPH-F937"}], "\ud87e\udddc": [{"c": "\u8df0", "n": "CJK UNIFIED IDEOGRAPH-8DF0"}], "\u8df0": [{"c": "\ud87e\udddc", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9DC"}], "\u8e9b": [{"c": "\u8e97", "n": "CJK UNIFIED IDEOGRAPH-8E97"}], "\u8e97": [{"c": "\u8e9b", "n": "CJK UNIFIED IDEOGRAPH-8E9B"}], "\u2f9d": [{"c": "\u8eab", "n": "CJK UNIFIED IDEOGRAPH-8EAB"}], "\u8eab": [{"c": "\u2f9d", "n": "KANGXI RADICAL BODY"}], "\uf902": [{"c": "\u8eca", "n": "CJK UNIFIED IDEOGRAPH-8ECA"}], "\u8eca": [{"c": "\uf902", "n": "CJK COMPATIBILITY IDEOGRAPH-F902"}, {"c": "\u2f9e", "n": "KANGXI RADICAL CART"}], "\u2f9e": [{"c": "\u8eca", "n": "CJK UNIFIED IDEOGRAPH-8ECA"}], "\ud87e\uddde": [{"c": "\u8ed4", "n": "CJK UNIFIED IDEOGRAPH-8ED4"}], "\u8ed4": [{"c": "\ud87e\uddde", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9DE"}], "\u8f27": [{"c": "\u8eff", "n": "CJK UNIFIED IDEOGRAPH-8EFF"}], "\u8eff": [{"c": "\u8f27", "n": "CJK UNIFIED IDEOGRAPH-8F27"}], "\uf998": [{"c": "\u8f26", "n": "CJK UNIFIED IDEOGRAPH-8F26"}], "\u8f26": [{"c": "\uf998", "n": "CJK COMPATIBILITY IDEOGRAPH-F998"}], "\uf9d7": [{"c": "\u8f2a", "n": "CJK UNIFIED IDEOGRAPH-8F2A"}], "\u8f2a": [{"c": "\uf9d7", "n": "CJK COMPATIBILITY IDEOGRAPH-F9D7"}], "\ufac2": [{"c": "\u8f38", "n": "CJK UNIFIED IDEOGRAPH-8F38"}], "\u8f38": [{"c": "\ufac2", "n": "CJK COMPATIBILITY IDEOGRAPH-FAC2"}, {"c": "\ud87e\udddf", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9DF"}], "\ud87e\udddf": [{"c": "\u8f38", "n": "CJK UNIFIED IDEOGRAPH-8F38"}], "\ufa07": [{"c": "\u8f3b", "n": "CJK UNIFIED IDEOGRAPH-8F3B"}], "\u8f3b": [{"c": "\ufa07", "n": "CJK COMPATIBILITY IDEOGRAPH-FA07"}], "\uf98d": [{"c": "\u8f62", "n": "CJK UNIFIED IDEOGRAPH-8F62"}], "\u8f62": [{"c": "\uf98d", "n": "CJK COMPATIBILITY IDEOGRAPH-F98D"}], "\u2ecb": [{"c": "\u8f66", "n": "CJK UNIFIED IDEOGRAPH-8F66"}], "\u8f66": [{"c": "\u2ecb", "n": "CJK RADICAL C-SIMPLIFIED CART"}], "\u2f9f": [{"c": "\u8f9b", "n": "CJK UNIFIED IDEOGRAPH-8F9B"}], "\u8f9b": [{"c": "\u2f9f", "n": "KANGXI RADICAL BITTER"}], "\ud87e\udd8d": [{"c": "\u8f9e", "n": "CJK UNIFIED IDEOGRAPH-8F9E"}], "\u8f9e": [{"c": "\ud87e\udd8d", "n": "CJK COMPATIBILITY IDEOGRAPH-2F98D"}], "\uf971": [{"c": "\u8fb0", "n": "CJK UNIFIED IDEOGRAPH-8FB0"}], "\u8fb0": [{"c": "\uf971", "n": "CJK COMPATIBILITY IDEOGRAPH-F971"}, {"c": "\u2fa0", "n": "KANGXI RADICAL MORNING"}], "\u2fa0": [{"c": "\u8fb0", "n": "CJK UNIFIED IDEOGRAPH-8FB0"}], "\u2fa1": [{"c": "\u8fb5", "n": "CJK UNIFIED IDEOGRAPH-8FB5"}], "\u8fb5": [{"c": "\u2fa1", "n": "KANGXI RADICAL WALK"}], "\ufa66": [{"c": "\u8fb6", "n": "CJK UNIFIED IDEOGRAPH-8FB6"}], "\u8fb6": [{"c": "\ufa66", "n": "CJK COMPATIBILITY IDEOGRAPH-FA66"}, {"c": "\u2ecc", "n": "CJK RADICAL SIMPLIFIED WALK"}, {"c": "\u2ecd", "n": "CJK RADICAL WALK ONE"}], "\u2ecc": [{"c": "\u8fb6", "n": "CJK UNIFIED IDEOGRAPH-8FB6"}], "\u2ecd": [{"c": "\u8fb6", "n": "CJK UNIFIED IDEOGRAPH-8FB6"}], "\ud87e\udc81": [{"c": "\u5de1", "n": "CJK UNIFIED IDEOGRAPH-5DE1"}], "\u5de1": [{"c": "\ud87e\udc81", "n": "CJK COMPATIBILITY IDEOGRAPH-2F881"}], "\uf99a": [{"c": "\u9023", "n": "CJK UNIFIED IDEOGRAPH-9023"}], "\u9023": [{"c": "\uf99a", "n": "CJK COMPATIBILITY IDEOGRAPH-F99A"}], "\ufa25": [{"c": "\u9038", "n": "CJK UNIFIED IDEOGRAPH-9038"}], "\u9038": [{"c": "\ufa25", "n": "CJK COMPATIBILITY IDEOGRAPH-FA25"}, {"c": "\ufa67", "n": "CJK COMPATIBILITY IDEOGRAPH-FA67"}], "\ufa67": [{"c": "\u9038", "n": "CJK UNIFIED IDEOGRAPH-9038"}], "\ufac3": [{"c": "\u9072", "n": "CJK UNIFIED IDEOGRAPH-9072"}], "\u9072": [{"c": "\ufac3", "n": "CJK COMPATIBILITY IDEOGRAPH-FAC3"}], "\uf9c3": [{"c": "\u907c", "n": "CJK UNIFIED IDEOGRAPH-907C"}], "\u907c": [{"c": "\uf9c3", "n": "CJK COMPATIBILITY IDEOGRAPH-F9C3"}], "\ud87e\udde0": [{"c": "\ud861\uddd2", "n": "CJK UNIFIED IDEOGRAPH-285D2"}], "\ud861\uddd2": [{"c": "\ud87e\udde0", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9E0"}], "\ud87e\udde1": [{"c": "\ud861\udded", "n": "CJK UNIFIED IDEOGRAPH-285ED"}], "\ud861\udded": [{"c": "\ud87e\udde1", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9E1"}], "\uf913": [{"c": "\u908f", "n": "CJK UNIFIED IDEOGRAPH-908F"}], "\u908f": [{"c": "\uf913", "n": "CJK COMPATIBILITY IDEOGRAPH-F913"}], "\u2fa2": [{"c": "\u9091", "n": "CJK UNIFIED IDEOGRAPH-9091"}], "\u9091": [{"c": "\u2fa2", "n": "KANGXI RADICAL CITY"}], "\ud87e\udde2": [{"c": "\u9094", "n": "CJK UNIFIED IDEOGRAPH-9094"}], "\u9094": [{"c": "\ud87e\udde2", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9E2"}], "\uf92c": [{"c": "\u90ce", "n": "CJK UNIFIED IDEOGRAPH-90CE"}], "\u90ce": [{"c": "\uf92c", "n": "CJK COMPATIBILITY IDEOGRAPH-F92C"}, {"c": "\u90de", "n": "CJK UNIFIED IDEOGRAPH-90DE"}, {"c": "\ufa2e", "n": "CJK COMPATIBILITY IDEOGRAPH-FA2E"}], "\u90de": [{"c": "\u90ce", "n": "CJK UNIFIED IDEOGRAPH-90CE"}], "\ufa2e": [{"c": "\u90ce", "n": "CJK UNIFIED IDEOGRAPH-90CE"}], "\ud87e\udde3": [{"c": "\u90f1", "n": "CJK UNIFIED IDEOGRAPH-90F1"}], "\u90f1": [{"c": "\ud87e\udde3", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9E3"}], "\ufa26": [{"c": "\u90fd", "n": "CJK UNIFIED IDEOGRAPH-90FD"}], "\u90fd": [{"c": "\ufa26", "n": "CJK COMPATIBILITY IDEOGRAPH-FA26"}], "\ud87e\udde5": [{"c": "\ud861\udf2e", "n": "CJK UNIFIED IDEOGRAPH-2872E"}], "\ud861\udf2e": [{"c": "\ud87e\udde5", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9E5"}], "\ud87e\udde4": [{"c": "\u9111", "n": "CJK UNIFIED IDEOGRAPH-9111"}], "\u9111": [{"c": "\ud87e\udde4", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9E4"}], "\ud87e\udde6": [{"c": "\u911b", "n": "CJK UNIFIED IDEOGRAPH-911B"}], "\u911b": [{"c": "\ud87e\udde6", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9E6"}], "\u2fa3": [{"c": "\u9149", "n": "CJK UNIFIED IDEOGRAPH-9149"}], "\u9149": [{"c": "\u2fa3", "n": "KANGXI RADICAL WINE"}], "\uf919": [{"c": "\u916a", "n": "CJK UNIFIED IDEOGRAPH-916A"}], "\u916a": [{"c": "\uf919", "n": "CJK COMPATIBILITY IDEOGRAPH-F919"}], "\ufac4": [{"c": "\u9199", "n": "CJK UNIFIED IDEOGRAPH-9199"}], "\u9199": [{"c": "\ufac4", "n": "CJK COMPATIBILITY IDEOGRAPH-FAC4"}], "\uf9b7": [{"c": "\u91b4", "n": "CJK UNIFIED IDEOGRAPH-91B4"}], "\u91b4": [{"c": "\uf9b7", "n": "CJK COMPATIBILITY IDEOGRAPH-F9B7"}], "\u2fa4": [{"c": "\u91c6", "n": "CJK UNIFIED IDEOGRAPH-91C6"}], "\u91c6": [{"c": "\u2fa4", "n": "KANGXI RADICAL DISTINGUISH"}], "\uf9e9": [{"c": "\u91cc", "n": "CJK UNIFIED IDEOGRAPH-91CC"}], "\u91cc": [{"c": "\uf9e9", "n": "CJK COMPATIBILITY IDEOGRAPH-F9E9"}, {"c": "\u2fa5", "n": "KANGXI RADICAL VILLAGE"}], "\u2fa5": [{"c": "\u91cc", "n": "CJK UNIFIED IDEOGRAPH-91CC"}], "\uf97e": [{"c": "\u91cf", "n": "CJK UNIFIED IDEOGRAPH-91CF"}], "\u91cf": [{"c": "\uf97e", "n": "CJK COMPATIBILITY IDEOGRAPH-F97E"}], "\uf90a": [{"c": "\u91d1", "n": "CJK UNIFIED IDEOGRAPH-91D1"}], "\u91d1": [{"c": "\uf90a", "n": "CJK COMPATIBILITY IDEOGRAPH-F90A"}, {"c": "\u2fa6", "n": "KANGXI RADICAL GOLD"}], "\u2fa6": [{"c": "\u91d1", "n": "CJK UNIFIED IDEOGRAPH-91D1"}], "\uf9b1": [{"c": "\u9234", "n": "CJK UNIFIED IDEOGRAPH-9234"}], "\u9234": [{"c": "\uf9b1", "n": "CJK COMPATIBILITY IDEOGRAPH-F9B1"}], "\ud87e\udde7": [{"c": "\u9238", "n": "CJK UNIFIED IDEOGRAPH-9238"}], "\u9238": [{"c": "\ud87e\udde7", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9E7"}], "\ufac5": [{"c": "\u9276", "n": "CJK UNIFIED IDEOGRAPH-9276"}], "\u9276": [{"c": "\ufac5", "n": "CJK COMPATIBILITY IDEOGRAPH-FAC5"}], "\ud87e\udde8": [{"c": "\u92d7", "n": "CJK UNIFIED IDEOGRAPH-92D7"}], "\u92d7": [{"c": "\ud87e\udde8", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9E8"}], "\ud87e\udde9": [{"c": "\u92d8", "n": "CJK UNIFIED IDEOGRAPH-92D8"}], "\u92d8": [{"c": "\ud87e\udde9", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9E9"}], "\ud87e\uddea": [{"c": "\u927c", "n": "CJK UNIFIED IDEOGRAPH-927C"}], "\u927c": [{"c": "\ud87e\uddea", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9EA"}], "\uf93f": [{"c": "\u9304", "n": "CJK UNIFIED IDEOGRAPH-9304"}], "\u9304": [{"c": "\uf93f", "n": "CJK COMPATIBILITY IDEOGRAPH-F93F"}], "\uf99b": [{"c": "\u934a", "n": "CJK UNIFIED IDEOGRAPH-934A"}], "\u934a": [{"c": "\uf99b", "n": "CJK COMPATIBILITY IDEOGRAPH-F99B"}], "\u93ae": [{"c": "\u93ad", "n": "CJK UNIFIED IDEOGRAPH-93AD"}], "\u93ad": [{"c": "\u93ae", "n": "CJK UNIFIED IDEOGRAPH-93AE"}], "\ud87e\uddeb": [{"c": "\u93f9", "n": "CJK UNIFIED IDEOGRAPH-93F9"}], "\u93f9": [{"c": "\ud87e\uddeb", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9EB"}], "\ud87e\uddec": [{"c": "\u9415", "n": "CJK UNIFIED IDEOGRAPH-9415"}], "\u9415": [{"c": "\ud87e\uddec", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9EC"}], "\ud87e\udded": [{"c": "\ud862\udffa", "n": "CJK UNIFIED IDEOGRAPH-28BFA"}], "\ud862\udffa": [{"c": "\ud87e\udded", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9ED"}], "\u2ed0": [{"c": "\u9485", "n": "CJK UNIFIED IDEOGRAPH-9485"}], "\u9485": [{"c": "\u2ed0", "n": "CJK RADICAL C-SIMPLIFIED GOLD"}], "\u2ed1": [{"c": "\u9577", "n": "CJK UNIFIED IDEOGRAPH-9577"}], "\u9577": [{"c": "\u2ed1", "n": "CJK RADICAL LONG ONE"}, {"c": "\u2fa7", "n": "KANGXI RADICAL LONG"}], "\u2fa7": [{"c": "\u9577", "n": "CJK UNIFIED IDEOGRAPH-9577"}], "\u2ed2": [{"c": "\u9578", "n": "CJK UNIFIED IDEOGRAPH-9578"}], "\u9578": [{"c": "\u2ed2", "n": "CJK RADICAL LONG TWO"}], "\u2ed3": [{"c": "\u957f", "n": "CJK UNIFIED IDEOGRAPH-957F"}], "\u957f": [{"c": "\u2ed3", "n": "CJK RADICAL C-SIMPLIFIED LONG"}], "\u2fa8": [{"c": "\u9580", "n": "CJK UNIFIED IDEOGRAPH-9580"}], "\u9580": [{"c": "\u2fa8", "n": "KANGXI RADICAL GATE"}], "\ud87e\uddee": [{"c": "\u958b", "n": "CJK UNIFIED IDEOGRAPH-958B"}], "\u958b": [{"c": "\ud87e\uddee", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9EE"}], "\ud87e\uddef": [{"c": "\u4995", "n": "CJK UNIFIED IDEOGRAPH-4995"}], "\u4995": [{"c": "\ud87e\uddef", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9EF"}], "\uf986": [{"c": "\u95ad", "n": "CJK UNIFIED IDEOGRAPH-95AD"}], "\u95ad": [{"c": "\uf986", "n": "CJK COMPATIBILITY IDEOGRAPH-F986"}], "\ud87e\uddf0": [{"c": "\u95b7", "n": "CJK UNIFIED IDEOGRAPH-95B7"}], "\u95b7": [{"c": "\ud87e\uddf0", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9F0"}], "\ud87e\uddf1": [{"c": "\ud863\udd77", "n": "CJK UNIFIED IDEOGRAPH-28D77"}], "\ud863\udd77": [{"c": "\ud87e\uddf1", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9F1"}], "\u2ed4": [{"c": "\u95e8", "n": "CJK UNIFIED IDEOGRAPH-95E8"}], "\u95e8": [{"c": "\u2ed4", "n": "CJK RADICAL C-SIMPLIFIED GATE"}], "\u2fa9": [{"c": "\u961c", "n": "CJK UNIFIED IDEOGRAPH-961C"}], "\u961c": [{"c": "\u2fa9", "n": "KANGXI RADICAL MOUND"}], "\u2ecf": [{"c": "\u961d", "n": "CJK UNIFIED IDEOGRAPH-961D"}], "\u961d": [{"c": "\u2ecf", "n": "CJK RADICAL CITY"}, {"c": "\u2ed6", "n": "CJK RADICAL MOUND TWO"}], "\u2ed6": [{"c": "\u961d", "n": "CJK UNIFIED IDEOGRAPH-961D"}], "\uf9c6": [{"c": "\u962e", "n": "CJK UNIFIED IDEOGRAPH-962E"}], "\u962e": [{"c": "\uf9c6", "n": "CJK COMPATIBILITY IDEOGRAPH-F9C6"}], "\uf951": [{"c": "\u964b", "n": "CJK UNIFIED IDEOGRAPH-964B"}], "\u964b": [{"c": "\uf951", "n": "CJK COMPATIBILITY IDEOGRAPH-F951"}], "\ufa09": [{"c": "\u964d", "n": "CJK UNIFIED IDEOGRAPH-964D"}], "\u964d": [{"c": "\ufa09", "n": "CJK COMPATIBILITY IDEOGRAPH-FA09"}], "\uf959": [{"c": "\u9675", "n": "CJK UNIFIED IDEOGRAPH-9675"}], "\u9675": [{"c": "\uf959", "n": "CJK COMPATIBILITY IDEOGRAPH-F959"}], "\uf9d3": [{"c": "\u9678", "n": "CJK UNIFIED IDEOGRAPH-9678"}], "\u9678": [{"c": "\uf9d3", "n": "CJK COMPATIBILITY IDEOGRAPH-F9D3"}], "\ufac6": [{"c": "\u967c", "n": "CJK UNIFIED IDEOGRAPH-967C"}], "\u967c": [{"c": "\ufac6", "n": "CJK COMPATIBILITY IDEOGRAPH-FAC6"}], "\uf9dc": [{"c": "\u9686", "n": "CJK UNIFIED IDEOGRAPH-9686"}], "\u9686": [{"c": "\uf9dc", "n": "CJK COMPATIBILITY IDEOGRAPH-F9DC"}], "\uf9f1": [{"c": "\u96a3", "n": "CJK UNIFIED IDEOGRAPH-96A3"}], "\u96a3": [{"c": "\uf9f1", "n": "CJK COMPATIBILITY IDEOGRAPH-F9F1"}], "\ud87e\uddf2": [{"c": "\u49e6", "n": "CJK UNIFIED IDEOGRAPH-49E6"}], "\u49e6": [{"c": "\ud87e\uddf2", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9F2"}], "\u2faa": [{"c": "\u96b6", "n": "CJK UNIFIED IDEOGRAPH-96B6"}], "\u96b6": [{"c": "\u2faa", "n": "KANGXI RADICAL SLAVE"}], "\ufa2f": [{"c": "\u96b7", "n": "CJK UNIFIED IDEOGRAPH-96B7"}], "\u96b7": [{"c": "\ufa2f", "n": "CJK COMPATIBILITY IDEOGRAPH-FA2F"}, {"c": "\u96b8", "n": "CJK UNIFIED IDEOGRAPH-96B8"}, {"c": "\uf9b8", "n": "CJK COMPATIBILITY IDEOGRAPH-F9B8"}], "\u96b8": [{"c": "\u96b7", "n": "CJK UNIFIED IDEOGRAPH-96B7"}], "\uf9b8": [{"c": "\u96b7", "n": "CJK UNIFIED IDEOGRAPH-96B7"}], "\u2fab": [{"c": "\u96b9", "n": "CJK UNIFIED IDEOGRAPH-96B9"}], "\u96b9": [{"c": "\u2fab", "n": "KANGXI RADICAL SHORT TAILED BIRD"}], "\ud87e\uddf3": [{"c": "\u96c3", "n": "CJK UNIFIED IDEOGRAPH-96C3"}], "\u96c3": [{"c": "\ud87e\uddf3", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9F3"}], "\uf9ea": [{"c": "\u96e2", "n": "CJK UNIFIED IDEOGRAPH-96E2"}], "\u96e2": [{"c": "\uf9ea", "n": "CJK COMPATIBILITY IDEOGRAPH-F9EA"}], "\ufa68": [{"c": "\u96e3", "n": "CJK UNIFIED IDEOGRAPH-96E3"}], "\u96e3": [{"c": "\ufa68", "n": "CJK COMPATIBILITY IDEOGRAPH-FA68"}, {"c": "\ufac7", "n": "CJK COMPATIBILITY IDEOGRAPH-FAC7"}], "\ufac7": [{"c": "\u96e3", "n": "CJK UNIFIED IDEOGRAPH-96E3"}], "\u2fac": [{"c": "\u96e8", "n": "CJK UNIFIED IDEOGRAPH-96E8"}], "\u96e8": [{"c": "\u2fac", "n": "KANGXI RADICAL RAIN"}], "\uf9b2": [{"c": "\u96f6", "n": "CJK UNIFIED IDEOGRAPH-96F6"}], "\u96f6": [{"c": "\uf9b2", "n": "CJK COMPATIBILITY IDEOGRAPH-F9B2"}], "\uf949": [{"c": "\u96f7", "n": "CJK UNIFIED IDEOGRAPH-96F7"}], "\u96f7": [{"c": "\uf949", "n": "CJK COMPATIBILITY IDEOGRAPH-F949"}], "\ud87e\uddf5": [{"c": "\u9723", "n": "CJK UNIFIED IDEOGRAPH-9723"}], "\u9723": [{"c": "\ud87e\uddf5", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9F5"}], "\ud87e\uddf6": [{"c": "\ud864\udd45", "n": "CJK UNIFIED IDEOGRAPH-29145"}], "\ud864\udd45": [{"c": "\ud87e\uddf6", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9F6"}], "\uf938": [{"c": "\u9732", "n": "CJK UNIFIED IDEOGRAPH-9732"}], "\u9732": [{"c": "\uf938", "n": "CJK COMPATIBILITY IDEOGRAPH-F938"}], "\uf9b3": [{"c": "\u9748", "n": "CJK UNIFIED IDEOGRAPH-9748"}], "\u9748": [{"c": "\uf9b3", "n": "CJK COMPATIBILITY IDEOGRAPH-F9B3"}], "\u2fad": [{"c": "\u9751", "n": "CJK UNIFIED IDEOGRAPH-9751"}], "\u9751": [{"c": "\u2fad", "n": "KANGXI RADICAL BLUE"}], "\u2ed8": [{"c": "\u9752", "n": "CJK UNIFIED IDEOGRAPH-9752"}], "\u9752": [{"c": "\u2ed8", "n": "CJK RADICAL BLUE"}], "\ufa1c": [{"c": "\u9756", "n": "CJK UNIFIED IDEOGRAPH-9756"}], "\u9756": [{"c": "\ufa1c", "n": "CJK COMPATIBILITY IDEOGRAPH-FA1C"}, {"c": "\ufac8", "n": "CJK COMPATIBILITY IDEOGRAPH-FAC8"}], "\ufac8": [{"c": "\u9756", "n": "CJK UNIFIED IDEOGRAPH-9756"}], "\ud87e\udc1c": [{"c": "\ud864\udddf", "n": "CJK UNIFIED IDEOGRAPH-291DF"}], "\ud864\udddf": [{"c": "\ud87e\udc1c", "n": "CJK COMPATIBILITY IDEOGRAPH-2F81C"}], "\u2fae": [{"c": "\u975e", "n": "CJK UNIFIED IDEOGRAPH-975E"}], "\u975e": [{"c": "\u2fae", "n": "KANGXI RADICAL WRONG"}], "\u2faf": [{"c": "\u9762", "n": "CJK UNIFIED IDEOGRAPH-9762"}], "\u9762": [{"c": "\u2faf", "n": "KANGXI RADICAL FACE"}], "\ud87e\uddf7": [{"c": "\ud864\ude1a", "n": "CJK UNIFIED IDEOGRAPH-2921A"}], "\ud864\ude1a": [{"c": "\ud87e\uddf7", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9F7"}], "\u2fb0": [{"c": "\u9769", "n": "CJK UNIFIED IDEOGRAPH-9769"}], "\u9769": [{"c": "\u2fb0", "n": "KANGXI RADICAL LEATHER"}], "\ud87e\uddf8": [{"c": "\u4a6e", "n": "CJK UNIFIED IDEOGRAPH-4A6E"}], "\u4a6e": [{"c": "\ud87e\uddf8", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9F8"}], "\ud87e\uddf9": [{"c": "\u4a76", "n": "CJK UNIFIED IDEOGRAPH-4A76"}], "\u4a76": [{"c": "\ud87e\uddf9", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9F9"}], "\u2fb1": [{"c": "\u97cb", "n": "CJK UNIFIED IDEOGRAPH-97CB"}], "\u97cb": [{"c": "\u2fb1", "n": "KANGXI RADICAL TANNED LEATHER"}], "\ufac9": [{"c": "\u97db", "n": "CJK UNIFIED IDEOGRAPH-97DB"}], "\u97db": [{"c": "\ufac9", "n": "CJK COMPATIBILITY IDEOGRAPH-FAC9"}], "\ud87e\uddfa": [{"c": "\u97e0", "n": "CJK UNIFIED IDEOGRAPH-97E0"}], "\u97e0": [{"c": "\ud87e\uddfa", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9FA"}], "\u2ed9": [{"c": "\u97e6", "n": "CJK UNIFIED IDEOGRAPH-97E6"}], "\u97e6": [{"c": "\u2ed9", "n": "CJK RADICAL C-SIMPLIFIED TANNED LEATHER"}], "\u2fb2": [{"c": "\u97ed", "n": "CJK UNIFIED IDEOGRAPH-97ED"}], "\u97ed": [{"c": "\u2fb2", "n": "KANGXI RADICAL LEEK"}], "\ud87e\uddfb": [{"c": "\ud865\udc0a", "n": "CJK UNIFIED IDEOGRAPH-2940A"}], "\ud865\udc0a": [{"c": "\ud87e\uddfb", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9FB"}], "\u2fb3": [{"c": "\u97f3", "n": "CJK UNIFIED IDEOGRAPH-97F3"}], "\u97f3": [{"c": "\u2fb3", "n": "KANGXI RADICAL SOUND"}], "\ufa69": [{"c": "\u97ff", "n": "CJK UNIFIED IDEOGRAPH-97FF"}], "\u97ff": [{"c": "\ufa69", "n": "CJK COMPATIBILITY IDEOGRAPH-FA69"}, {"c": "\ufaca", "n": "CJK COMPATIBILITY IDEOGRAPH-FACA"}], "\ufaca": [{"c": "\u97ff", "n": "CJK UNIFIED IDEOGRAPH-97FF"}], "\u2fb4": [{"c": "\u9801", "n": "CJK UNIFIED IDEOGRAPH-9801"}], "\u9801": [{"c": "\u2fb4", "n": "KANGXI RADICAL LEAF"}], "\ud87e\uddfc": [{"c": "\u4ab2", "n": "CJK UNIFIED IDEOGRAPH-4AB2"}], "\u4ab2": [{"c": "\ud87e\uddfc", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9FC"}], "\ufacb": [{"c": "\u980b", "n": "CJK UNIFIED IDEOGRAPH-980B"}], "\u980b": [{"c": "\ufacb", "n": "CJK COMPATIBILITY IDEOGRAPH-FACB"}, {"c": "\ud87e\uddfe", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9FE"}, {"c": "\ud87e\uddff", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9FF"}], "\ud87e\uddfe": [{"c": "\u980b", "n": "CJK UNIFIED IDEOGRAPH-980B"}], "\ud87e\uddff": [{"c": "\u980b", "n": "CJK UNIFIED IDEOGRAPH-980B"}], "\uf9b4": [{"c": "\u9818", "n": "CJK UNIFIED IDEOGRAPH-9818"}], "\u9818": [{"c": "\uf9b4", "n": "CJK COMPATIBILITY IDEOGRAPH-F9B4"}], "\ud87e\ude00": [{"c": "\u9829", "n": "CJK UNIFIED IDEOGRAPH-9829"}], "\u9829": [{"c": "\ud87e\ude00", "n": "CJK COMPATIBILITY IDEOGRAPH-2FA00"}], "\ud87e\uddfd": [{"c": "\ud865\udc96", "n": "CJK UNIFIED IDEOGRAPH-29496"}], "\ud865\udc96": [{"c": "\ud87e\uddfd", "n": "CJK COMPATIBILITY IDEOGRAPH-2F9FD"}], "\ufa6a": [{"c": "\u983b", "n": "CJK UNIFIED IDEOGRAPH-983B"}], "\u983b": [{"c": "\ufa6a", "n": "CJK COMPATIBILITY IDEOGRAPH-FA6A"}, {"c": "\ufacc", "n": "CJK COMPATIBILITY IDEOGRAPH-FACC"}], "\ufacc": [{"c": "\u983b", "n": "CJK UNIFIED IDEOGRAPH-983B"}], "\uf9d0": [{"c": "\u985e", "n": "CJK UNIFIED IDEOGRAPH-985E"}], "\u985e": [{"c": "\uf9d0", "n": "CJK COMPATIBILITY IDEOGRAPH-F9D0"}], "\u2eda": [{"c": "\u9875", "n": "CJK UNIFIED IDEOGRAPH-9875"}], "\u9875": [{"c": "\u2eda", "n": "CJK RADICAL C-SIMPLIFIED LEAF"}], "\u2fb5": [{"c": "\u98a8", "n": "CJK UNIFIED IDEOGRAPH-98A8"}], "\u98a8": [{"c": "\u2fb5", "n": "KANGXI RADICAL WIND"}], "\ud87e\ude01": [{"c": "\ud865\uddb6", "n": "CJK UNIFIED IDEOGRAPH-295B6"}], "\ud865\uddb6": [{"c": "\ud87e\ude01", "n": "CJK COMPATIBILITY IDEOGRAPH-2FA01"}], "\u2edb": [{"c": "\u98ce", "n": "CJK UNIFIED IDEOGRAPH-98CE"}], "\u98ce": [{"c": "\u2edb", "n": "CJK RADICAL C-SIMPLIFIED WIND"}], "\u2fb6": [{"c": "\u98db", "n": "CJK UNIFIED IDEOGRAPH-98DB"}], "\u98db": [{"c": "\u2fb6", "n": "KANGXI RADICAL FLY"}], "\u2edc": [{"c": "\u98de", "n": "CJK UNIFIED IDEOGRAPH-98DE"}], "\u98de": [{"c": "\u2edc", "n": "CJK RADICAL C-SIMPLIFIED FLY"}], "\u2edd": [{"c": "\u98df", "n": "CJK UNIFIED IDEOGRAPH-98DF"}], "\u98df": [{"c": "\u2edd", "n": "CJK RADICAL EAT ONE"}, {"c": "\u2fb7", "n": "KANGXI RADICAL EAT"}], "\u2fb7": [{"c": "\u98df", "n": "CJK UNIFIED IDEOGRAPH-98DF"}], "\u2edf": [{"c": "\u98e0", "n": "CJK UNIFIED IDEOGRAPH-98E0"}], "\u98e0": [{"c": "\u2edf", "n": "CJK RADICAL EAT THREE"}], "\ud87e\ude02": [{"c": "\u98e2", "n": "CJK UNIFIED IDEOGRAPH-98E2"}], "\u98e2": [{"c": "\ud87e\ude02", "n": "CJK COMPATIBILITY IDEOGRAPH-2FA02"}], "\ufa2a": [{"c": "\u98ef", "n": "CJK UNIFIED IDEOGRAPH-98EF"}], "\u98ef": [{"c": "\ufa2a", "n": "CJK COMPATIBILITY IDEOGRAPH-FA2A"}], "\ufa2b": [{"c": "\u98fc", "n": "CJK UNIFIED IDEOGRAPH-98FC"}], "\u98fc": [{"c": "\ufa2b", "n": "CJK COMPATIBILITY IDEOGRAPH-FA2B"}], "\ud87e\ude03": [{"c": "\u4b33", "n": "CJK UNIFIED IDEOGRAPH-4B33"}], "\u4b33": [{"c": "\ud87e\ude03", "n": "CJK COMPATIBILITY IDEOGRAPH-2FA03"}], "\ufa2c": [{"c": "\u9928", "n": "CJK UNIFIED IDEOGRAPH-9928"}], "\u9928": [{"c": "\ufa2c", "n": "CJK COMPATIBILITY IDEOGRAPH-FA2C"}], "\ud87e\ude04": [{"c": "\u9929", "n": "CJK UNIFIED IDEOGRAPH-9929"}], "\u9929": [{"c": "\ud87e\ude04", "n": "CJK COMPATIBILITY IDEOGRAPH-2FA04"}], "\u2ee0": [{"c": "\u9963", "n": "CJK UNIFIED IDEOGRAPH-9963"}], "\u9963": [{"c": "\u2ee0", "n": "CJK RADICAL C-SIMPLIFIED EAT"}], "\u2fb8": [{"c": "\u9996", "n": "CJK UNIFIED IDEOGRAPH-9996"}], "\u9996": [{"c": "\u2fb8", "n": "KANGXI RADICAL HEAD"}], "\u2fb9": [{"c": "\u9999", "n": "CJK UNIFIED IDEOGRAPH-9999"}], "\u9999": [{"c": "\u2fb9", "n": "KANGXI RADICAL FRAGRANT"}], "\ud87e\ude05": [{"c": "\u99a7", "n": "CJK UNIFIED IDEOGRAPH-99A7"}], "\u99a7": [{"c": "\ud87e\ude05", "n": "CJK COMPATIBILITY IDEOGRAPH-2FA05"}], "\u2fba": [{"c": "\u99ac", "n": "CJK UNIFIED IDEOGRAPH-99AC"}], "\u99ac": [{"c": "\u2fba", "n": "KANGXI RADICAL HORSE"}], "\ud87e\ude06": [{"c": "\u99c2", "n": "CJK UNIFIED IDEOGRAPH-99C2"}], "\u99c2": [{"c": "\ud87e\ude06", "n": "CJK COMPATIBILITY IDEOGRAPH-2FA06"}], "\uf91a": [{"c": "\u99f1", "n": "CJK UNIFIED IDEOGRAPH-99F1"}], "\u99f1": [{"c": "\uf91a", "n": "CJK COMPATIBILITY IDEOGRAPH-F91A"}], "\ud87e\ude07": [{"c": "\u99fe", "n": "CJK UNIFIED IDEOGRAPH-99FE"}], "\u99fe": [{"c": "\ud87e\ude07", "n": "CJK COMPATIBILITY IDEOGRAPH-2FA07"}], "\uf987": [{"c": "\u9a6a", "n": "CJK UNIFIED IDEOGRAPH-9A6A"}], "\u9a6a": [{"c": "\uf987", "n": "CJK COMPATIBILITY IDEOGRAPH-F987"}], "\u2ee2": [{"c": "\u9a6c", "n": "CJK UNIFIED IDEOGRAPH-9A6C"}], "\u9a6c": [{"c": "\u2ee2", "n": "CJK RADICAL C-SIMPLIFIED HORSE"}], "\u2fbb": [{"c": "\u9aa8", "n": "CJK UNIFIED IDEOGRAPH-9AA8"}], "\u9aa8": [{"c": "\u2fbb", "n": "KANGXI RADICAL BONE"}], "\ud87e\ude08": [{"c": "\u4bce", "n": "CJK UNIFIED IDEOGRAPH-4BCE"}], "\u4bce": [{"c": "\ud87e\ude08", "n": "CJK COMPATIBILITY IDEOGRAPH-2FA08"}], "\u2fbc": [{"c": "\u9ad8", "n": "CJK UNIFIED IDEOGRAPH-9AD8"}], "\u9ad8": [{"c": "\u2fbc", "n": "KANGXI RADICAL TALL"}], "\u2fbd": [{"c": "\u9adf", "n": "CJK UNIFIED IDEOGRAPH-9ADF"}], "\u9adf": [{"c": "\u2fbd", "n": "KANGXI RADICAL HAIR"}], "\ud87e\ude09": [{"c": "\ud866\udf30", "n": "CJK UNIFIED IDEOGRAPH-29B30"}], "\ud866\udf30": [{"c": "\ud87e\ude09", "n": "CJK COMPATIBILITY IDEOGRAPH-2FA09"}], "\ufacd": [{"c": "\u9b12", "n": "CJK UNIFIED IDEOGRAPH-9B12"}], "\u9b12": [{"c": "\ufacd", "n": "CJK COMPATIBILITY IDEOGRAPH-FACD"}, {"c": "\ud87e\ude0a", "n": "CJK COMPATIBILITY IDEOGRAPH-2FA0A"}], "\ud87e\ude0a": [{"c": "\u9b12", "n": "CJK UNIFIED IDEOGRAPH-9B12"}], "\u2fbe": [{"c": "\u9b25", "n": "CJK UNIFIED IDEOGRAPH-9B25"}], "\u9b25": [{"c": "\u2fbe", "n": "KANGXI RADICAL FIGHT"}], "\u2fbf": [{"c": "\u9b2f", "n": "CJK UNIFIED IDEOGRAPH-9B2F"}], "\u9b2f": [{"c": "\u2fbf", "n": "KANGXI RADICAL SACRIFICIAL WINE"}], "\u2fc0": [{"c": "\u9b32", "n": "CJK UNIFIED IDEOGRAPH-9B32"}], "\u9b32": [{"c": "\u2fc0", "n": "KANGXI RADICAL CAULDRON"}], "\u2fc1": [{"c": "\u9b3c", "n": "CJK UNIFIED IDEOGRAPH-9B3C"}], "\u9b3c": [{"c": "\u2fc1", "n": "KANGXI RADICAL GHOST"}, {"c": "\u2ee4", "n": "CJK RADICAL GHOST"}], "\u2ee4": [{"c": "\u9b3c", "n": "CJK UNIFIED IDEOGRAPH-9B3C"}], "\u2fc2": [{"c": "\u9b5a", "n": "CJK UNIFIED IDEOGRAPH-9B5A"}], "\u9b5a": [{"c": "\u2fc2", "n": "KANGXI RADICAL FISH"}], "\uf939": [{"c": "\u9b6f", "n": "CJK UNIFIED IDEOGRAPH-9B6F"}], "\u9b6f": [{"c": "\uf939", "n": "CJK COMPATIBILITY IDEOGRAPH-F939"}], "\ud87e\ude0b": [{"c": "\u9c40", "n": "CJK UNIFIED IDEOGRAPH-9C40"}], "\u9c40": [{"c": "\ud87e\ude0b", "n": "CJK COMPATIBILITY IDEOGRAPH-2FA0B"}], "\uf9f2": [{"c": "\u9c57", "n": "CJK UNIFIED IDEOGRAPH-9C57"}], "\u9c57": [{"c": "\uf9f2", "n": "CJK COMPATIBILITY IDEOGRAPH-F9F2"}], "\u2ee5": [{"c": "\u9c7c", "n": "CJK UNIFIED IDEOGRAPH-9C7C"}], "\u9c7c": [{"c": "\u2ee5", "n": "CJK RADICAL C-SIMPLIFIED FISH"}], "\u2fc3": [{"c": "\u9ce5", "n": "CJK UNIFIED IDEOGRAPH-9CE5"}], "\u9ce5": [{"c": "\u2fc3", "n": "KANGXI RADICAL BIRD"}], "\ud87e\ude0c": [{"c": "\u9cfd", "n": "CJK UNIFIED IDEOGRAPH-9CFD"}], "\u9cfd": [{"c": "\ud87e\ude0c", "n": "CJK COMPATIBILITY IDEOGRAPH-2FA0C"}], "\ud87e\ude0d": [{"c": "\u4cce", "n": "CJK UNIFIED IDEOGRAPH-4CCE"}], "\u4cce": [{"c": "\ud87e\ude0d", "n": "CJK COMPATIBILITY IDEOGRAPH-2FA0D"}], "\ud87e\ude0f": [{"c": "\u9d67", "n": "CJK UNIFIED IDEOGRAPH-9D67"}], "\u9d67": [{"c": "\ud87e\ude0f", "n": "CJK COMPATIBILITY IDEOGRAPH-2FA0F"}], "\ud87e\ude0e": [{"c": "\u4ced", "n": "CJK UNIFIED IDEOGRAPH-4CED"}], "\u4ced": [{"c": "\ud87e\ude0e", "n": "CJK COMPATIBILITY IDEOGRAPH-2FA0E"}], "\ud87e\ude10": [{"c": "\ud868\udcce", "n": "CJK UNIFIED IDEOGRAPH-2A0CE"}], "\ud868\udcce": [{"c": "\ud87e\ude10", "n": "CJK COMPATIBILITY IDEOGRAPH-2FA10"}], "\ufa2d": [{"c": "\u9db4", "n": "CJK UNIFIED IDEOGRAPH-9DB4"}], "\u9db4": [{"c": "\ufa2d", "n": "CJK COMPATIBILITY IDEOGRAPH-FA2D"}], "\ud87e\ude12": [{"c": "\ud868\udd05", "n": "CJK UNIFIED IDEOGRAPH-2A105"}], "\ud868\udd05": [{"c": "\ud87e\ude12", "n": "CJK COMPATIBILITY IDEOGRAPH-2FA12"}], "\ud87e\ude11": [{"c": "\u4cf8", "n": "CJK UNIFIED IDEOGRAPH-4CF8"}], "\u4cf8": [{"c": "\ud87e\ude11", "n": "CJK COMPATIBILITY IDEOGRAPH-2FA11"}], "\uf93a": [{"c": "\u9dfa", "n": "CJK UNIFIED IDEOGRAPH-9DFA"}], "\u9dfa": [{"c": "\uf93a", "n": "CJK COMPATIBILITY IDEOGRAPH-F93A"}], "\ud87e\ude13": [{"c": "\ud868\ude0e", "n": "CJK UNIFIED IDEOGRAPH-2A20E"}], "\ud868\ude0e": [{"c": "\ud87e\ude13", "n": "CJK COMPATIBILITY IDEOGRAPH-2FA13"}], "\uf920": [{"c": "\u9e1e", "n": "CJK UNIFIED IDEOGRAPH-9E1E"}], "\u9e1e": [{"c": "\uf920", "n": "CJK COMPATIBILITY IDEOGRAPH-F920"}], "\u9e43": [{"c": "\u9e42", "n": "CJK UNIFIED IDEOGRAPH-9E42"}], "\u9e42": [{"c": "\u9e43", "n": "CJK UNIFIED IDEOGRAPH-9E43"}], "\u2fc4": [{"c": "\u9e75", "n": "CJK UNIFIED IDEOGRAPH-9E75"}], "\u9e75": [{"c": "\u2fc4", "n": "KANGXI RADICAL SALT"}], "\uf940": [{"c": "\u9e7f", "n": "CJK UNIFIED IDEOGRAPH-9E7F"}], "\u9e7f": [{"c": "\uf940", "n": "CJK COMPATIBILITY IDEOGRAPH-F940"}, {"c": "\u2fc5", "n": "KANGXI RADICAL DEER"}], "\u2fc5": [{"c": "\u9e7f", "n": "CJK UNIFIED IDEOGRAPH-9E7F"}], "\ud87e\ude14": [{"c": "\ud868\ude91", "n": "CJK UNIFIED IDEOGRAPH-2A291"}], "\ud868\ude91": [{"c": "\ud87e\ude14", "n": "CJK COMPATIBILITY IDEOGRAPH-2FA14"}], "\uf988": [{"c": "\u9e97", "n": "CJK UNIFIED IDEOGRAPH-9E97"}], "\u9e97": [{"c": "\uf988", "n": "CJK COMPATIBILITY IDEOGRAPH-F988"}], "\uf9f3": [{"c": "\u9e9f", "n": "CJK UNIFIED IDEOGRAPH-9E9F"}], "\u9e9f": [{"c": "\uf9f3", "n": "CJK COMPATIBILITY IDEOGRAPH-F9F3"}], "\u2fc6": [{"c": "\u9ea5", "n": "CJK UNIFIED IDEOGRAPH-9EA5"}], "\u9ea5": [{"c": "\u2fc6", "n": "KANGXI RADICAL WHEAT"}], "\u2ee8": [{"c": "\u9ea6", "n": "CJK UNIFIED IDEOGRAPH-9EA6"}], "\u9ea6": [{"c": "\u2ee8", "n": "CJK RADICAL SIMPLIFIED WHEAT"}], "\ud87e\ude15": [{"c": "\u9ebb", "n": "CJK UNIFIED IDEOGRAPH-9EBB"}], "\u9ebb": [{"c": "\ud87e\ude15", "n": "CJK COMPATIBILITY IDEOGRAPH-2FA15"}, {"c": "\u2fc7", "n": "KANGXI RADICAL HEMP"}], "\u2fc7": [{"c": "\u9ebb", "n": "CJK UNIFIED IDEOGRAPH-9EBB"}], "\ud87e\udc8f": [{"c": "\ud868\udf92", "n": "CJK UNIFIED IDEOGRAPH-2A392"}], "\ud868\udf92": [{"c": "\ud87e\udc8f", "n": "CJK COMPATIBILITY IDEOGRAPH-2F88F"}], "\u2fc8": [{"c": "\u9ec3", "n": "CJK UNIFIED IDEOGRAPH-9EC3"}], "\u9ec3": [{"c": "\u2fc8", "n": "KANGXI RADICAL YELLOW"}], "\u2ee9": [{"c": "\u9ec4", "n": "CJK UNIFIED IDEOGRAPH-9EC4"}], "\u9ec4": [{"c": "\u2ee9", "n": "CJK RADICAL SIMPLIFIED YELLOW"}], "\u2fc9": [{"c": "\u9ecd", "n": "CJK UNIFIED IDEOGRAPH-9ECD"}], "\u9ecd": [{"c": "\u2fc9", "n": "KANGXI RADICAL MILLET"}], "\uf989": [{"c": "\u9ece", "n": "CJK UNIFIED IDEOGRAPH-9ECE"}], "\u9ece": [{"c": "\uf989", "n": "CJK COMPATIBILITY IDEOGRAPH-F989"}], "\ud87e\ude16": [{"c": "\u4d56", "n": "CJK UNIFIED IDEOGRAPH-4D56"}], "\u4d56": [{"c": "\ud87e\ude16", "n": "CJK COMPATIBILITY IDEOGRAPH-2FA16"}], "\u2fca": [{"c": "\u9ed1", "n": "CJK UNIFIED IDEOGRAPH-9ED1"}], "\u9ed1": [{"c": "\u2fca", "n": "KANGXI RADICAL BLACK"}, {"c": "\u9ed2", "n": "CJK UNIFIED IDEOGRAPH-9ED2"}], "\u9ed2": [{"c": "\u9ed1", "n": "CJK UNIFIED IDEOGRAPH-9ED1"}], "\ufa3a": [{"c": "\u58a8", "n": "CJK UNIFIED IDEOGRAPH-58A8"}], "\u58a8": [{"c": "\ufa3a", "n": "CJK COMPATIBILITY IDEOGRAPH-FA3A"}], "\ud87e\ude17": [{"c": "\u9ef9", "n": "CJK UNIFIED IDEOGRAPH-9EF9"}], "\u9ef9": [{"c": "\ud87e\ude17", "n": "CJK COMPATIBILITY IDEOGRAPH-2FA17"}, {"c": "\u2fcb", "n": "KANGXI RADICAL EMBROIDERY"}], "\u2fcb": [{"c": "\u9ef9", "n": "CJK UNIFIED IDEOGRAPH-9EF9"}], "\u2fcc": [{"c": "\u9efd", "n": "CJK UNIFIED IDEOGRAPH-9EFD"}], "\u9efd": [{"c": "\u2fcc", "n": "KANGXI RADICAL FROG"}], "\ud87e\ude19": [{"c": "\u9f05", "n": "CJK UNIFIED IDEOGRAPH-9F05"}], "\u9f05": [{"c": "\ud87e\ude19", "n": "CJK COMPATIBILITY IDEOGRAPH-2FA19"}], "\ud87e\ude18": [{"c": "\u9efe", "n": "CJK UNIFIED IDEOGRAPH-9EFE"}], "\u9efe": [{"c": "\ud87e\ude18", "n": "CJK COMPATIBILITY IDEOGRAPH-2FA18"}], "\u2fcd": [{"c": "\u9f0e", "n": "CJK UNIFIED IDEOGRAPH-9F0E"}], "\u9f0e": [{"c": "\u2fcd", "n": "KANGXI RADICAL TRIPOD"}], "\ud87e\ude1a": [{"c": "\u9f0f", "n": "CJK UNIFIED IDEOGRAPH-9F0F"}], "\u9f0f": [{"c": "\ud87e\ude1a", "n": "CJK COMPATIBILITY IDEOGRAPH-2FA1A"}], "\u2fce": [{"c": "\u9f13", "n": "CJK UNIFIED IDEOGRAPH-9F13"}], "\u9f13": [{"c": "\u2fce", "n": "KANGXI RADICAL DRUM"}], "\ud87e\ude1b": [{"c": "\u9f16", "n": "CJK UNIFIED IDEOGRAPH-9F16"}], "\u9f16": [{"c": "\ud87e\ude1b", "n": "CJK COMPATIBILITY IDEOGRAPH-2FA1B"}], "\u2fcf": [{"c": "\u9f20", "n": "CJK UNIFIED IDEOGRAPH-9F20"}], "\u9f20": [{"c": "\u2fcf", "n": "KANGXI RADICAL RAT"}], "\ud87e\ude1c": [{"c": "\u9f3b", "n": "CJK UNIFIED IDEOGRAPH-9F3B"}], "\u9f3b": [{"c": "\ud87e\ude1c", "n": "CJK COMPATIBILITY IDEOGRAPH-2FA1C"}, {"c": "\u2fd0", "n": "KANGXI RADICAL NOSE"}], "\u2fd0": [{"c": "\u9f3b", "n": "CJK UNIFIED IDEOGRAPH-9F3B"}], "\ufad8": [{"c": "\u9f43", "n": "CJK UNIFIED IDEOGRAPH-9F43"}], "\u9f43": [{"c": "\ufad8", "n": "CJK COMPATIBILITY IDEOGRAPH-FAD8"}], "\u2fd1": [{"c": "\u9f4a", "n": "CJK UNIFIED IDEOGRAPH-9F4A"}], "\u9f4a": [{"c": "\u2fd1", "n": "KANGXI RADICAL EVEN"}], "\u2eec": [{"c": "\u9f50", "n": "CJK UNIFIED IDEOGRAPH-9F50"}], "\u9f50": [{"c": "\u2eec", "n": "CJK RADICAL C-SIMPLIFIED EVEN"}], "\u2fd2": [{"c": "\u9f52", "n": "CJK UNIFIED IDEOGRAPH-9F52"}], "\u9f52": [{"c": "\u2fd2", "n": "KANGXI RADICAL TOOTH"}], "\ud87e\ude1d": [{"c": "\ud869\ude00", "n": "CJK UNIFIED IDEOGRAPH-2A600"}], "\ud869\ude00": [{"c": "\ud87e\ude1d", "n": "CJK COMPATIBILITY IDEOGRAPH-2FA1D"}], "\u2eee": [{"c": "\u9f7f", "n": "CJK UNIFIED IDEOGRAPH-9F7F"}], "\u9f7f": [{"c": "\u2eee", "n": "CJK RADICAL C-SIMPLIFIED TOOTH"}], "\uf9c4": [{"c": "\u9f8d", "n": "CJK UNIFIED IDEOGRAPH-9F8D"}], "\u9f8d": [{"c": "\uf9c4", "n": "CJK COMPATIBILITY IDEOGRAPH-F9C4"}, {"c": "\u2fd3", "n": "KANGXI RADICAL DRAGON"}], "\u2fd3": [{"c": "\u9f8d", "n": "CJK UNIFIED IDEOGRAPH-9F8D"}], "\ufad9": [{"c": "\u9f8e", "n": "CJK UNIFIED IDEOGRAPH-9F8E"}], "\u9f8e": [{"c": "\ufad9", "n": "CJK COMPATIBILITY IDEOGRAPH-FAD9"}], "\u2ef0": [{"c": "\u9f99", "n": "CJK UNIFIED IDEOGRAPH-9F99"}], "\u9f99": [{"c": "\u2ef0", "n": "CJK RADICAL C-SIMPLIFIED DRAGON"}], "\uf907": [{"c": "\u9f9c", "n": "CJK UNIFIED IDEOGRAPH-9F9C"}], "\u9f9c": [{"c": "\uf907", "n": "CJK COMPATIBILITY IDEOGRAPH-F907"}, {"c": "\uf908", "n": "CJK COMPATIBILITY IDEOGRAPH-F908"}, {"c": "\uface", "n": "CJK COMPATIBILITY IDEOGRAPH-FACE"}, {"c": "\u2fd4", "n": "KANGXI RADICAL TURTLE"}], "\uf908": [{"c": "\u9f9c", "n": "CJK UNIFIED IDEOGRAPH-9F9C"}], "\uface": [{"c": "\u9f9c", "n": "CJK UNIFIED IDEOGRAPH-9F9C"}], "\u2fd4": [{"c": "\u9f9c", "n": "CJK UNIFIED IDEOGRAPH-9F9C"}], "\u2ef3": [{"c": "\u9f9f", "n": "CJK UNIFIED IDEOGRAPH-9F9F"}], "\u9f9f": [{"c": "\u2ef3", "n": "CJK RADICAL C-SIMPLIFIED TURTLE"}], "\u2fd5": [{"c": "\u9fa0", "n": "CJK UNIFIED IDEOGRAPH-9FA0"}], "\u9fa0": [{"c": "\u2fd5", "n": "KANGXI RADICAL FLUTE"}]} \ No newline at end of file diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/confusable_homoglyphs/confusables.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/confusable_homoglyphs/confusables.py new file mode 100644 index 0000000..c912979 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/confusable_homoglyphs/confusables.py @@ -0,0 +1,162 @@ +# -*- coding: utf-8 -*- +from .utils import load +from .categories import unique_aliases, alias + + +confusables_data = load('confusables.json') + + +class Found(Exception): + pass + + +def is_mixed_script(string, allowed_aliases=['COMMON']): + """Checks if ``string`` contains mixed-scripts content, excluding script + blocks aliases in ``allowed_aliases``. + + E.g. ``B. C`` is not considered mixed-scripts by default: it contains characters + from **Latin** and **Common**, but **Common** is excluded by default. + + >>> confusables.is_mixed_script('Abç') + False + >>> confusables.is_mixed_script('ρτ.τ') + False + >>> confusables.is_mixed_script('ρτ.τ', allowed_aliases=[]) + True + >>> confusables.is_mixed_script('Alloτ') + True + + :param string: A unicode string + :type string: str + :param allowed_aliases: Script blocks aliases not to consider. + :type allowed_aliases: list(str) + :return: Whether ``string`` is considered mixed-scripts or not. + :rtype: bool + """ + allowed_aliases = [a.upper() for a in allowed_aliases] + cats = unique_aliases(string) - set(allowed_aliases) + return len(cats) > 1 + + +def is_confusable(string, greedy=False, preferred_aliases=[]): + """Checks if ``string`` contains characters which might be confusable with + characters from ``preferred_aliases``. + + If ``greedy=False``, it will only return the first confusable character + found without looking at the rest of the string, ``greedy=True`` returns + all of them. + + ``preferred_aliases=[]`` can take an array of unicode block aliases to + be considered as your 'base' unicode blocks: + + - considering ``paρa``, + + - with ``preferred_aliases=['latin']``, the 3rd character ``ρ`` + would be returned because this greek letter can be confused with + latin ``p``. + - with ``preferred_aliases=['greek']``, the 1st character ``p`` + would be returned because this latin letter can be confused with + greek ``ρ``. + - with ``preferred_aliases=[]`` and ``greedy=True``, you'll discover + the 29 characters that can be confused with ``p``, the 23 + characters that look like ``a``, and the one that looks like ``ρ`` + (which is, of course, *p* aka *LATIN SMALL LETTER P*). + + >>> confusables.is_confusable('paρa', preferred_aliases=['latin'])[0]['character'] + 'ρ' + >>> confusables.is_confusable('paρa', preferred_aliases=['greek'])[0]['character'] + 'p' + >>> confusables.is_confusable('Abç', preferred_aliases=['latin']) + False + >>> confusables.is_confusable('AlloΓ', preferred_aliases=['latin']) + False + >>> confusables.is_confusable('ρττ', preferred_aliases=['greek']) + False + >>> confusables.is_confusable('ρτ.τ', preferred_aliases=['greek', 'common']) + False + >>> confusables.is_confusable('ρττp') + [{'homoglyphs': [{'c': 'p', 'n': 'LATIN SMALL LETTER P'}], 'alias': 'GREEK', 'character': 'ρ'}] + + :param string: A unicode string + :type string: str + :param greedy: Don't stop on finding one confusable character - find all of them. + :type greedy: bool + :param preferred_aliases: Script blocks aliases which we don't want ``string``'s characters + to be confused with. + :type preferred_aliases: list(str) + :return: False if not confusable, all confusable characters and with what they are confusable + otherwise. + :rtype: bool or list + """ + preferred_aliases = [a.upper() for a in preferred_aliases] + outputs = [] + checked = set() + for char in string: + if char in checked: + continue + checked.add(char) + char_alias = alias(char) + if char_alias in preferred_aliases: + # it's safe if the character might be confusable with homoglyphs from other + # categories than our preferred categories (=aliases) + continue + found = confusables_data.get(char, False) + if found is False: + continue + # character λ is considered confusable if λ can be confused with a character from + # preferred_aliases, e.g. if 'LATIN', 'ρ' is confusable with 'p' from LATIN. + # if 'LATIN', 'Γ' is not confusable because in all the characters confusable with Γ, + # none of them is LATIN. + if preferred_aliases: + potentially_confusable = [] + try: + for d in found: + aliases = [alias(glyph) for glyph in d['c']] + for a in aliases: + if a in preferred_aliases: + potentially_confusable = found + raise Found() + except Found: + pass + else: + potentially_confusable = found + if potentially_confusable: # we found homoglyphs + output = { + 'character': char, + 'alias': char_alias, + 'homoglyphs': potentially_confusable, + } + if not greedy: + return [output] + outputs.append(output) + + return outputs or False + + +def is_dangerous(string, preferred_aliases=[]): + """Checks if ``string`` can be dangerous, i.e. is it not only mixed-scripts + but also contains characters from other scripts than the ones in ``preferred_aliases`` + that might be confusable with characters from scripts in ``preferred_aliases`` + + For ``preferred_aliases`` examples, see ``is_confusable`` docstring. + + >>> bool(confusables.is_dangerous('Allo')) + False + >>> bool(confusables.is_dangerous('AlloΓ', preferred_aliases=['latin'])) + False + >>> bool(confusables.is_dangerous('Alloρ')) + True + >>> bool(confusables.is_dangerous('AlaskaJazz')) + False + >>> bool(confusables.is_dangerous('ΑlaskaJazz')) + True + + :param string: A unicode string + :type string: str + :param preferred_aliases: Script blocks aliases which we don't want ``string``'s characters + to be confused with. + :type preferred_aliases: list(str) + :return: Is it dangerous. + :rtype: bool + """ + return is_mixed_script(string) and is_confusable(string, preferred_aliases=preferred_aliases) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/confusable_homoglyphs/utils.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/confusable_homoglyphs/utils.py new file mode 100644 index 0000000..9657298 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/confusable_homoglyphs/utils.py @@ -0,0 +1,58 @@ +# -*- coding: utf-8 -*- +import json +import os +import sys + +PACKAGE_DIR = os.path.abspath(os.path.dirname(__file__)) + +if sys.version_info < (3,): + import codecs + from urllib2 import urlopen + + def u(x): + return codecs.unicode_escape_decode(x)[0] + + def get(url, timeout=None): + return urlopen(url, timeout=timeout) + +else: + from urllib.request import urlopen + + def u(x): + return x + + def get(url, timeout=None): + return urlopen(url, timeout=timeout).read().decode('utf-8').split('\n') + + +def path(filename): + """Returns a file path relative to this package directory. + + :return: A file path string. + :rtype: str + """ + return os.path.join(PACKAGE_DIR, filename) + + +def load(filename): + """Loads a JSON data file. + + :return: A dict. + :rtype: dict + """ + with open(path(filename), 'r') as file: + return json.load(file) + + +def dump(filename, data): + with open(path(filename), 'w+') as file: + return json.dump(data, file) + + +def delete(filename): + """Deletes a JSON data file if it exists. + """ + try: + os.remove(path(filename)) + except OSError: + pass diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/context_processors.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/context_processors.py new file mode 100644 index 0000000..d91c56e --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/context_processors.py @@ -0,0 +1,6 @@ +def nonce(request): + nonce = request.csp_nonce if hasattr(request, 'csp_nonce') else '' + + return { + 'CSP_NONCE': nonce + } diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/contrib/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/contrib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/contrib/rate_limiting.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/contrib/rate_limiting.py new file mode 100644 index 0000000..8a4d087 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/contrib/rate_limiting.py @@ -0,0 +1,25 @@ +import random + +from django.conf import settings + +from csp.middleware import CSPMiddleware +from csp.utils import build_policy + + +class RateLimitedCSPMiddleware(CSPMiddleware): + """A CSP middleware that rate-limits the number of violation reports sent + to report-uri by excluding it from some requests.""" + + def build_policy(self, request, response): + config = getattr(response, '_csp_config', None) + update = getattr(response, '_csp_update', None) + replace = getattr(response, '_csp_replace', {}) + nonce = getattr(request, '_csp_nonce', None) + + report_percentage = getattr(settings, 'CSP_REPORT_PERCENTAGE') + include_report_uri = random.random() < report_percentage + if not include_report_uri: + replace['report-uri'] = None + + return build_policy(config=config, update=update, replace=replace, + nonce=nonce) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/decorators.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/decorators.py new file mode 100644 index 0000000..bce3352 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/decorators.py @@ -0,0 +1,53 @@ +from functools import wraps + + +def csp_exempt(f): + @wraps(f) + def _wrapped(*a, **kw): + r = f(*a, **kw) + r._csp_exempt = True + return r + return _wrapped + + +def csp_update(**kwargs): + update = dict((k.lower().replace('_', '-'), v) for k, v in kwargs.items()) + + def decorator(f): + @wraps(f) + def _wrapped(*a, **kw): + r = f(*a, **kw) + r._csp_update = update + return r + return _wrapped + return decorator + + +def csp_replace(**kwargs): + replace = dict((k.lower().replace('_', '-'), v) for k, v in kwargs.items()) + + def decorator(f): + @wraps(f) + def _wrapped(*a, **kw): + r = f(*a, **kw) + r._csp_replace = replace + return r + return _wrapped + return decorator + + +def csp(**kwargs): + config = dict( + (k.lower().replace('_', '-'), [v] if isinstance(v, str) else v) + for k, v + in kwargs.items() + ) + + def decorator(f): + @wraps(f) + def _wrapped(*a, **kw): + r = f(*a, **kw) + r._csp_config = config + return r + return _wrapped + return decorator diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/extensions/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/extensions/__init__.py new file mode 100644 index 0000000..c84a419 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/extensions/__init__.py @@ -0,0 +1,46 @@ +from __future__ import absolute_import + +from jinja2 import nodes +from jinja2.ext import Extension + +from csp.utils import SCRIPT_ATTRS, build_script_tag + + +class NoncedScript(Extension): + # a set of names that trigger the extension. + tags = set(['script']) + + def parse(self, parser): + # the first token is the token that started the tag. In our case + # we only listen to ``'script'`` so this will be a name token with + # `script` as value. We get the line number so that we can give + # that line number to the nodes we create by hand. + lineno = next(parser.stream).lineno + + # Get the current context and pass along + kwargs = [nodes.Keyword('ctx', nodes.ContextReference())] + + # Parse until we are done with optional script tag attributes + while parser.stream.current.value in SCRIPT_ATTRS: + attr_name = parser.stream.current.value + parser.stream.skip(2) + kwargs.append( + nodes.Keyword(attr_name, parser.parse_expression())) + + # now we parse the body of the script block up to `endscript` and + # drop the needle (which would always be `endscript` in that case) + body = parser.parse_statements(['name:endscript'], drop_needle=True) + + # now return a `CallBlock` node that calls our _render_script + # helper method on this extension. + return nodes.CallBlock( + self.call_method('_render_script', kwargs=kwargs), + [], [], body).set_lineno(lineno) + + def _render_script(self, caller, **kwargs): + ctx = kwargs.pop('ctx') + request = ctx.get('request') + kwargs['nonce'] = request.csp_nonce + kwargs['content'] = caller().strip() + + return build_script_tag(**kwargs) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/middleware.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/middleware.py new file mode 100644 index 0000000..73397e1 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/middleware.py @@ -0,0 +1,89 @@ +from __future__ import absolute_import + +import os +import base64 +from functools import partial + +from django.conf import settings +from django.utils.functional import SimpleLazyObject + +try: + from django.utils.six.moves import http_client +except ImportError: + # django 3.x removed six + import http.client as http_client + +try: + from django.utils.deprecation import MiddlewareMixin +except ImportError: + class MiddlewareMixin(object): + """ + If this middleware doesn't exist, this is an older version of django + and we don't need it. + """ + pass + +from csp.utils import build_policy + + +class CSPMiddleware(MiddlewareMixin): + """ + Implements the Content-Security-Policy response header, which + conforming user-agents can use to restrict the permitted sources + of various content. + + See http://www.w3.org/TR/CSP/ + + """ + def _make_nonce(self, request): + # Ensure that any subsequent calls to request.csp_nonce return the + # same value + if not getattr(request, '_csp_nonce', None): + request._csp_nonce = ( + base64 + .b64encode(os.urandom(16)) + .decode("ascii") + ) + return request._csp_nonce + + def process_request(self, request): + nonce = partial(self._make_nonce, request) + request.csp_nonce = SimpleLazyObject(nonce) + + def process_response(self, request, response): + if getattr(response, '_csp_exempt', False): + return response + + # Check for ignored path prefix. + prefixes = getattr(settings, 'CSP_EXCLUDE_URL_PREFIXES', ()) + if request.path_info.startswith(prefixes): + return response + + # Check for debug view + status_code = response.status_code + exempted_debug_codes = ( + http_client.INTERNAL_SERVER_ERROR, + http_client.NOT_FOUND, + ) + if status_code in exempted_debug_codes and settings.DEBUG: + return response + + header = 'Content-Security-Policy' + if getattr(settings, 'CSP_REPORT_ONLY', False): + header += '-Report-Only' + + if header in response: + # Don't overwrite existing headers. + return response + + response[header] = self.build_policy(request, response) + + return response + + def build_policy(self, request, response): + config = getattr(response, '_csp_config', None) + update = getattr(response, '_csp_update', None) + replace = getattr(response, '_csp_replace', None) + nonce = getattr(request, '_csp_nonce', None) + return build_policy(config=config, update=update, replace=replace, + nonce=nonce) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/models.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/models.py new file mode 100644 index 0000000..218d892 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/models.py @@ -0,0 +1 @@ +# This file intentionally left blank. diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/templatetags/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/templatetags/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/templatetags/csp.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/templatetags/csp.py new file mode 100644 index 0000000..e5737df --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/templatetags/csp.py @@ -0,0 +1,44 @@ +from __future__ import absolute_import + +from django import template +from django.template.base import token_kwargs + +from csp.utils import build_script_tag + +register = template.Library() + + +def _unquote(s): + """Helper func that strips single and double quotes from inside strings""" + return s.replace('"', '').replace("'", "") + + +@register.tag(name='script') +def script(parser, token): + # Parse out any keyword args + token_args = token.split_contents() + kwargs = token_kwargs(token_args[1:], parser) + + nodelist = parser.parse(('endscript',)) + parser.delete_first_token() + + return NonceScriptNode(nodelist, **kwargs) + + +class NonceScriptNode(template.Node): + def __init__(self, nodelist, **kwargs): + self.nodelist = nodelist + self.script_attrs = {} + for k, v in kwargs.items(): + self.script_attrs[k] = self._get_token_value(v) + + def _get_token_value(self, t): + return _unquote(t.token) if getattr(t, 'token', None) else None + + def render(self, context): + output = self.nodelist.render(context).strip() + request = context.get('request') + nonce = request.csp_nonce if hasattr(request, 'csp_nonce') else '' + self.script_attrs.update({'nonce': nonce, 'content': output}) + + return build_script_tag(**self.script_attrs) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/tests/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/tests/environment.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/tests/environment.py new file mode 100644 index 0000000..9a218c5 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/tests/environment.py @@ -0,0 +1,6 @@ +from jinja2 import Environment + + +def environment(**options): + env = Environment(**options) + return env diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/tests/settings.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/tests/settings.py new file mode 100644 index 0000000..dc74ff1 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/tests/settings.py @@ -0,0 +1,47 @@ +import django + + +CSP_REPORT_ONLY = False + +CSP_INCLUDE_NONCE_IN = ['default-src'] + +DATABASES = { + 'default': { + 'NAME': 'test.db', + 'ENGINE': 'django.db.backends.sqlite3', + } +} + +INSTALLED_APPS = ( + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.sites', + 'csp', +) + +SECRET_KEY = 'csp-test-key' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.jinja2.Jinja2', + 'DIRS': [], + 'APP_DIRS': True, + 'OPTIONS': { + 'environment': 'csp.tests.environment.environment', + 'extensions': ['csp.extensions.NoncedScript'] + }, + }, + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [], + 'APP_DIRS': True, + 'OPTIONS': {}, + }, +] + + +# Django >1.6 requires `setup` call to initialise apps framework +if hasattr(django, 'setup'): + django.setup() diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/tests/test_context_processors.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/tests/test_context_processors.py new file mode 100644 index 0000000..6c4f062 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/tests/test_context_processors.py @@ -0,0 +1,26 @@ +from django.http import HttpResponse +from django.test import RequestFactory + +from csp.middleware import CSPMiddleware +from csp.context_processors import nonce + +rf = RequestFactory() +mw = CSPMiddleware() + + +def test_nonce_context_processor(): + request = rf.get('/') + mw.process_request(request) + context = nonce(request) + + response = HttpResponse() + mw.process_response(request, response) + + assert context['CSP_NONCE'] == request.csp_nonce + + +def test_nonce_context_processor_with_middleware_disabled(): + request = rf.get('/') + context = nonce(request) + + assert context['CSP_NONCE'] == '' diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/tests/test_contrib.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/tests/test_contrib.py new file mode 100644 index 0000000..33998ab --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/tests/test_contrib.py @@ -0,0 +1,23 @@ +from django.http import HttpResponse +from django.test import RequestFactory +from django.test.utils import override_settings + +from csp.contrib.rate_limiting import RateLimitedCSPMiddleware + + +HEADER = 'Content-Security-Policy' +mw = RateLimitedCSPMiddleware() +rf = RequestFactory() + + +@override_settings(CSP_REPORT_PERCENTAGE=0.1, CSP_REPORT_URI='x') +def test_report_percentage(): + times_seen = 0 + for _ in range(5000): + request = rf.get('/') + response = HttpResponse() + mw.process_response(request, response) + if 'report-uri' in response[HEADER]: + times_seen += 1 + # Roughly 10% + assert 400 <= times_seen <= 600 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/tests/test_decorators.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/tests/test_decorators.py new file mode 100644 index 0000000..6f2716e --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/tests/test_decorators.py @@ -0,0 +1,111 @@ +from django.http import HttpResponse +from django.test import RequestFactory +from django.test.utils import override_settings + +from csp.decorators import csp, csp_replace, csp_update, csp_exempt +from csp.middleware import CSPMiddleware + + +REQUEST = RequestFactory().get('/') +mw = CSPMiddleware() + + +def test_csp_exempt(): + @csp_exempt + def view(request): + return HttpResponse() + response = view(REQUEST) + assert response._csp_exempt + + +@override_settings(CSP_IMG_SRC=['foo.com']) +def test_csp_update(): + def view_without_decorator(request): + return HttpResponse() + response = view_without_decorator(REQUEST) + mw.process_response(REQUEST, response) + policy_list = sorted(response['Content-Security-Policy'].split("; ")) + assert policy_list == ["default-src 'self'", "img-src foo.com"] + + @csp_update(IMG_SRC='bar.com') + def view_with_decorator(request): + return HttpResponse() + response = view_with_decorator(REQUEST) + assert response._csp_update == {'img-src': 'bar.com'} + mw.process_response(REQUEST, response) + policy_list = sorted(response['Content-Security-Policy'].split("; ")) + assert policy_list == ["default-src 'self'", "img-src foo.com bar.com"] + + response = view_without_decorator(REQUEST) + mw.process_response(REQUEST, response) + policy_list = sorted(response['Content-Security-Policy'].split("; ")) + assert policy_list == ["default-src 'self'", "img-src foo.com"] + + +@override_settings(CSP_IMG_SRC=['foo.com']) +def test_csp_replace(): + def view_without_decorator(request): + return HttpResponse() + response = view_without_decorator(REQUEST) + mw.process_response(REQUEST, response) + policy_list = sorted(response['Content-Security-Policy'].split("; ")) + assert policy_list == ["default-src 'self'", "img-src foo.com"] + + @csp_replace(IMG_SRC='bar.com') + def view_with_decorator(request): + return HttpResponse() + response = view_with_decorator(REQUEST) + assert response._csp_replace == {'img-src': 'bar.com'} + mw.process_response(REQUEST, response) + policy_list = sorted(response['Content-Security-Policy'].split("; ")) + assert policy_list == ["default-src 'self'", "img-src bar.com"] + + response = view_without_decorator(REQUEST) + mw.process_response(REQUEST, response) + policy_list = sorted(response['Content-Security-Policy'].split("; ")) + assert policy_list == ["default-src 'self'", "img-src foo.com"] + + @csp_replace(IMG_SRC=None) + def view_removing_directive(request): + return HttpResponse() + response = view_removing_directive(REQUEST) + mw.process_response(REQUEST, response) + policy_list = sorted(response["Content-Security-Policy"].split("; ")) + assert policy_list == ["default-src 'self'"] + + +def test_csp(): + def view_without_decorator(request): + return HttpResponse() + response = view_without_decorator(REQUEST) + mw.process_response(REQUEST, response) + policy_list = sorted(response['Content-Security-Policy'].split("; ")) + assert policy_list == ["default-src 'self'"] + + @csp(IMG_SRC=['foo.com'], FONT_SRC=['bar.com']) + def view_with_decorator(request): + return HttpResponse() + response = view_with_decorator(REQUEST) + assert response._csp_config == \ + {'img-src': ['foo.com'], 'font-src': ['bar.com']} + mw.process_response(REQUEST, response) + policy_list = sorted(response['Content-Security-Policy'].split("; ")) + assert policy_list == ["font-src bar.com", "img-src foo.com"] + + response = view_without_decorator(REQUEST) + mw.process_response(REQUEST, response) + policy_list = sorted(response['Content-Security-Policy'].split("; ")) + assert policy_list == ["default-src 'self'"] + + +def test_csp_string_values(): + # Test backwards compatibility where values were strings + @csp(IMG_SRC='foo.com', FONT_SRC='bar.com') + def view_with_decorator(request): + return HttpResponse() + response = view_with_decorator(REQUEST) + assert response._csp_config == \ + {'img-src': ['foo.com'], 'font-src': ['bar.com']} + mw.process_response(REQUEST, response) + policy_list = sorted(response['Content-Security-Policy'].split("; ")) + assert policy_list == ["font-src bar.com", "img-src foo.com"] diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/tests/test_jinja_extension.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/tests/test_jinja_extension.py new file mode 100644 index 0000000..3415504 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/tests/test_jinja_extension.py @@ -0,0 +1,79 @@ +from csp.tests.utils import ScriptExtensionTestBase + + +class TestJinjaExtension(ScriptExtensionTestBase): + + def test_script_tag_injects_nonce(self): + tpl = """ + {% script %} + var hello='world'; + {% endscript %} + """ + + expected = ("""""") + self.assert_template_eq(*self.process_templates(tpl, expected)) + + def test_script_with_src_ignores_body(self): + tpl = """ + {% script src="foo" %} + var hello='world'; + {% endscript %} + """ + + expected = """""" + + self.assert_template_eq(*self.process_templates(tpl, expected)) + + def test_script_tag_sets_attrs_correctly(self): + tpl = """ + {% script id='jeff' defer=True %} + var hello='world'; + {% endscript %} + """ + expected = """ + """ + + self.assert_template_eq(*self.process_templates(tpl, expected)) + + def test_async_attribute_with_falsey(self): + tpl = """ + {% script id="jeff" async=False %} + var hello='world'; + {% endscript %}""" + + expected = ('') + + self.assert_template_eq(*self.process_templates(tpl, expected)) + + def test_async_attribute_with_truthy(self): + tpl = """ + {% script id="jeff" async=True %} + var hello='world'; + {% endscript %}""" + + expected = ('') + + self.assert_template_eq(*self.process_templates(tpl, expected)) + + def test_nested_script_tags_are_removed(self): + """Let users wrap their code in script tags for the sake of their + development environment""" + tpl = """ + {% script type="application/javascript" id="jeff" defer=True%} + + {% endscript %}""" + + expected = ( + '' + 'var hello=\'world\';') + + self.assert_template_eq(*self.process_templates(tpl, expected)) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/tests/test_middleware.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/tests/test_middleware.py new file mode 100644 index 0000000..f9413ce --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/tests/test_middleware.py @@ -0,0 +1,140 @@ +from django.http import ( + HttpResponse, + HttpResponseServerError, + HttpResponseNotFound, +) +from django.test import RequestFactory +from django.test.utils import override_settings + +from csp.middleware import CSPMiddleware + + +HEADER = 'Content-Security-Policy' +mw = CSPMiddleware() +rf = RequestFactory() + + +def test_add_header(): + request = rf.get('/') + response = HttpResponse() + mw.process_response(request, response) + assert HEADER in response + + +def test_exempt(): + request = rf.get('/') + response = HttpResponse() + response._csp_exempt = True + mw.process_response(request, response) + assert HEADER not in response + + +@override_settings(CSP_EXCLUDE_URL_PREFIXES=('/inlines-r-us')) +def text_exclude(): + request = rf.get('/inlines-r-us/foo') + response = HttpResponse() + mw.process_response(request, response) + assert HEADER not in response + + +@override_settings(CSP_REPORT_ONLY=True) +def test_report_only(): + request = rf.get('/') + response = HttpResponse() + mw.process_response(request, response) + assert HEADER not in response + assert HEADER + '-Report-Only' in response + + +def test_dont_replace(): + request = rf.get('/') + response = HttpResponse() + response[HEADER] = 'default-src example.com' + mw.process_response(request, response) + assert response[HEADER] == 'default-src example.com' + + +def test_use_config(): + request = rf.get('/') + response = HttpResponse() + response._csp_config = {'default-src': ['example.com']} + mw.process_response(request, response) + assert response[HEADER] == 'default-src example.com' + + +def test_use_update(): + request = rf.get('/') + response = HttpResponse() + response._csp_update = {'default-src': ['example.com']} + mw.process_response(request, response) + assert response[HEADER] == "default-src 'self' example.com" + + +@override_settings(CSP_IMG_SRC=['foo.com']) +def test_use_replace(): + request = rf.get('/') + response = HttpResponse() + response._csp_replace = {'img-src': ['bar.com']} + mw.process_response(request, response) + policy_list = sorted(response[HEADER].split('; ')) + assert policy_list == ["default-src 'self'", "img-src bar.com"] + + +@override_settings(DEBUG=True) +def test_debug_errors_exempt(): + request = rf.get('/') + response = HttpResponseServerError() + mw.process_response(request, response) + assert HEADER not in response + + +@override_settings(DEBUG=True) +def test_debug_notfound_exempt(): + request = rf.get('/') + response = HttpResponseNotFound() + mw.process_response(request, response) + assert HEADER not in response + + +def test_nonce_created_when_accessed(): + request = rf.get('/') + mw.process_request(request) + nonce = str(request.csp_nonce) + response = HttpResponse() + mw.process_response(request, response) + assert nonce in response[HEADER] + + +def test_no_nonce_when_not_accessed(): + request = rf.get('/') + mw.process_request(request) + response = HttpResponse() + mw.process_response(request, response) + assert 'nonce-' not in response[HEADER] + + +def test_nonce_regenerated_on_new_request(): + request1 = rf.get('/') + request2 = rf.get('/') + mw.process_request(request1) + mw.process_request(request2) + nonce1 = str(request1.csp_nonce) + nonce2 = str(request2.csp_nonce) + assert request1.csp_nonce != request2.csp_nonce + + response1 = HttpResponse() + response2 = HttpResponse() + mw.process_response(request1, response1) + mw.process_response(request2, response2) + assert nonce1 not in response2[HEADER] + assert nonce2 not in response1[HEADER] + + +@override_settings(CSP_INCLUDE_NONCE_IN=[]) +def test_no_nonce_when_disabled_by_settings(): + request = rf.get('/') + mw.process_request(request) + nonce = str(request.csp_nonce) + response = HttpResponse() + mw.process_response(request, response) + assert nonce not in response[HEADER] diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/tests/test_templatetags.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/tests/test_templatetags.py new file mode 100644 index 0000000..4a71e5e --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/tests/test_templatetags.py @@ -0,0 +1,78 @@ +from csp.tests.utils import ScriptTagTestBase + + +class TestDjangoTemplateTag(ScriptTagTestBase): + + def test_script_tag_injects_nonce(self): + tpl = """ + {% load csp %} + {% script %}var hello='world';{% endscript %}""" + + expected = """""" + + self.assert_template_eq(*self.process_templates(tpl, expected)) + + def test_script_with_src_ignores_body(self): + tpl = (""" + {% load csp %} + {% script src="foo" %} + var hello='world'; + {% endscript %}""") + + expected = """""" + + self.assert_template_eq(*self.process_templates(tpl, expected)) + + def test_script_tag_sets_attrs_correctly(self): + tpl = """ + {% load csp %} + {% script type="application/javascript" id="jeff" defer=True%} + var hello='world'; + {% endscript %}""" + + expected = ( + '' + 'var hello=\'world\';') + + self.assert_template_eq(*self.process_templates(tpl, expected)) + + def test_async_attribute_with_falsey(self): + tpl = """ + {% load csp %} + {% script src="foo.com/bar.js" async=False %} + {% endscript %}""" + + expected = ('') + + self.assert_template_eq(*self.process_templates(tpl, expected)) + + def test_async_attribute_with_truthy(self): + tpl = """ + {% load csp %} + {% script src="foo.com/bar.js" async=True %} + var hello='world'; + {% endscript %}""" + + expected = '' + + self.assert_template_eq(*self.process_templates(tpl, expected)) + + def test_nested_script_tags_are_removed(self): + """Lets end users wrap their code in script tags for the sake of their + development environment""" + tpl = """ + {% load csp %} + {% script type="application/javascript" id="jeff" defer=True%} + + {% endscript %}""" + + expected = ( + '' + 'var hello=\'world\';') + + self.assert_template_eq(*self.process_templates(tpl, expected)) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/tests/test_utils.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/tests/test_utils.py new file mode 100644 index 0000000..87b8908 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/tests/test_utils.py @@ -0,0 +1,295 @@ +from __future__ import absolute_import + +import pytest +import six +from django.conf import settings +from django.test.utils import override_settings +from django.utils.functional import lazy + +from csp.utils import build_policy + + +def policy_eq(a, b, msg='%r != %r'): + parts_a = sorted(a.split('; ')) + parts_b = sorted(b.split('; ')) + assert parts_a == parts_b, msg % (a, b) + + +def test_empty_policy(): + policy = build_policy() + assert "default-src 'self'" == policy + + +def literal(s): + return s + + +lazy_literal = lazy(literal, six.text_type) + + +@override_settings(CSP_DEFAULT_SRC=['example.com', 'example2.com']) +def test_default_src(): + policy = build_policy() + assert 'default-src example.com example2.com' == policy + + +@override_settings(CSP_SCRIPT_SRC=['example.com']) +def test_script_src(): + policy = build_policy() + policy_eq("default-src 'self'; script-src example.com", policy) + + +@override_settings(CSP_SCRIPT_SRC_ATTR=['example.com']) +def test_script_src_attr(): + policy = build_policy() + policy_eq("default-src 'self'; script-src-attr example.com", policy) + + +@override_settings(CSP_SCRIPT_SRC_ELEM=['example.com']) +def test_script_src_elem(): + policy = build_policy() + policy_eq("default-src 'self'; script-src-elem example.com", policy) + + +@override_settings(CSP_OBJECT_SRC=['example.com']) +def test_object_src(): + policy = build_policy() + policy_eq("default-src 'self'; object-src example.com", policy) + + +@override_settings(CSP_PREFETCH_SRC=['example.com']) +def test_prefetch_src(): + policy = build_policy() + policy_eq("default-src 'self'; prefetch-src example.com", policy) + + +@override_settings(CSP_STYLE_SRC=['example.com']) +def test_style_src(): + policy = build_policy() + policy_eq("default-src 'self'; style-src example.com", policy) + + +@override_settings(CSP_STYLE_SRC_ATTR=['example.com']) +def test_style_src_attr(): + policy = build_policy() + policy_eq("default-src 'self'; style-src-attr example.com", policy) + + +@override_settings(CSP_STYLE_SRC_ELEM=['example.com']) +def test_style_src_elem(): + policy = build_policy() + policy_eq("default-src 'self'; style-src-elem example.com", policy) + + +@override_settings(CSP_IMG_SRC=['example.com']) +def test_img_src(): + policy = build_policy() + policy_eq("default-src 'self'; img-src example.com", policy) + + +@override_settings(CSP_MEDIA_SRC=['example.com']) +def test_media_src(): + policy = build_policy() + policy_eq("default-src 'self'; media-src example.com", policy) + + +@override_settings(CSP_FRAME_SRC=['example.com']) +def test_frame_src(): + policy = build_policy() + policy_eq("default-src 'self'; frame-src example.com", policy) + + +@override_settings(CSP_FONT_SRC=['example.com']) +def test_font_src(): + policy = build_policy() + policy_eq("default-src 'self'; font-src example.com", policy) + + +@override_settings(CSP_CONNECT_SRC=['example.com']) +def test_connect_src(): + policy = build_policy() + policy_eq("default-src 'self'; connect-src example.com", policy) + + +@override_settings(CSP_SANDBOX=['allow-scripts']) +def test_sandbox(): + policy = build_policy() + policy_eq("default-src 'self'; sandbox allow-scripts", policy) + + +@override_settings(CSP_SANDBOX=[]) +def test_sandbox_empty(): + policy = build_policy() + policy_eq("default-src 'self'; sandbox", policy) + + +@override_settings(CSP_REPORT_URI='/foo') +def test_report_uri(): + policy = build_policy() + policy_eq("default-src 'self'; report-uri /foo", policy) + + +@override_settings(CSP_REPORT_URI=lazy_literal('/foo')) +def test_report_uri_lazy(): + policy = build_policy() + policy_eq("default-src 'self'; report-uri /foo", policy) + + +@override_settings(CSP_REPORT_TO='some_endpoint') +def test_report_to(): + policy = build_policy() + policy_eq("default-src 'self'; report-to some_endpoint", + policy) + + +@override_settings(CSP_IMG_SRC=['example.com']) +def test_update_img(): + policy = build_policy(update={'img-src': 'example2.com'}) + policy_eq("default-src 'self'; img-src example.com example2.com", + policy) + + +def test_update_missing_setting(): + """update should work even if the setting is not defined.""" + policy = build_policy(update={'img-src': 'example.com'}) + policy_eq("default-src 'self'; img-src example.com", policy) + + +@override_settings(CSP_IMG_SRC=['example.com']) +def test_replace_img(): + policy = build_policy(replace={'img-src': 'example2.com'}) + policy_eq("default-src 'self'; img-src example2.com", policy) + + +def test_replace_missing_setting(): + """replace should work even if the setting is not defined.""" + policy = build_policy(replace={'img-src': 'example.com'}) + policy_eq("default-src 'self'; img-src example.com", policy) + + +def test_config(): + policy = build_policy( + config={'default-src': ["'none'"], 'img-src': ["'self'"]}) + policy_eq("default-src 'none'; img-src 'self'", policy) + + +@override_settings(CSP_IMG_SRC=('example.com',)) +def test_update_string(): + """ + GitHub issue #40 - given project settings as a tuple, and + an update/replace with a string, concatenate correctly. + """ + policy = build_policy(update={'img-src': 'example2.com'}) + policy_eq("default-src 'self'; img-src example.com example2.com", + policy) + + +@override_settings(CSP_IMG_SRC=('example.com',)) +def test_replace_string(): + """ + Demonstrate that GitHub issue #40 doesn't affect replacements + """ + policy = build_policy(replace={'img-src': 'example2.com'}) + policy_eq("default-src 'self'; img-src example2.com", + policy) + + +@override_settings(CSP_FORM_ACTION=['example.com']) +def test_form_action(): + policy = build_policy() + policy_eq("default-src 'self'; form-action example.com", policy) + + +@override_settings(CSP_BASE_URI=['example.com']) +def test_base_uri(): + policy = build_policy() + policy_eq("default-src 'self'; base-uri example.com", policy) + + +@override_settings(CSP_CHILD_SRC=['example.com']) +def test_child_src(): + with pytest.warns(DeprecationWarning): + policy = build_policy() + policy_eq("default-src 'self'; child-src example.com", policy) + + +@override_settings(CSP_FRAME_ANCESTORS=['example.com']) +def test_frame_ancestors(): + policy = build_policy() + policy_eq("default-src 'self'; frame-ancestors example.com", policy) + + +@override_settings(CSP_NAVIGATE_TO=['example.com']) +def test_navigate_to(): + policy = build_policy() + policy_eq("default-src 'self'; navigate-to example.com", policy) + + +@override_settings(CSP_MANIFEST_SRC=['example.com']) +def test_manifest_src(): + policy = build_policy() + policy_eq("default-src 'self'; manifest-src example.com", policy) + + +@override_settings(CSP_WORKER_SRC=['example.com']) +def test_worker_src(): + policy = build_policy() + policy_eq("default-src 'self'; worker-src example.com", policy) + + +@override_settings(CSP_PLUGIN_TYPES=['application/pdf']) +def test_plugin_types(): + policy = build_policy() + policy_eq("default-src 'self'; plugin-types application/pdf", policy) + + +@override_settings(CSP_REQUIRE_SRI_FOR=['script']) +def test_require_sri_for(): + policy = build_policy() + policy_eq("default-src 'self'; require-sri-for script", policy) + + +@override_settings(CSP_REQUIRE_TRUSTED_TYPES_FOR=["'script'"]) +def test_require_trusted_types_for(): + policy = build_policy() + policy_eq("default-src 'self'; require-trusted-types-for 'script'", policy) + + +@override_settings(CSP_TRUSTED_TYPES=["strictPolicy", "laxPolicy", + "default", "'allow-duplicates'"]) +def test_trusted_types(): + policy = build_policy() + policy_eq("default-src 'self'; trusted-types strictPolicy laxPolicy " + + "default 'allow-duplicates'", policy) + + +@override_settings(CSP_UPGRADE_INSECURE_REQUESTS=True) +def test_upgrade_insecure_requests(): + policy = build_policy() + policy_eq("default-src 'self'; upgrade-insecure-requests", policy) + + +@override_settings(CSP_BLOCK_ALL_MIXED_CONTENT=True) +def test_block_all_mixed_content(): + policy = build_policy() + policy_eq("default-src 'self'; block-all-mixed-content", policy) + + +def test_nonce(): + policy = build_policy(nonce='abc123') + policy_eq("default-src 'self' 'nonce-abc123'", policy) + + +@override_settings(CSP_INCLUDE_NONCE_IN=['script-src', 'style-src']) +def test_nonce_include_in(): + policy = build_policy(nonce='abc123') + policy_eq(("default-src 'self'; " + "script-src 'nonce-abc123'; " + "style-src 'nonce-abc123'"), policy) + + +@override_settings() +def test_nonce_include_in_absent(): + del settings.CSP_INCLUDE_NONCE_IN + policy = build_policy(nonce='abc123') + policy_eq("default-src 'self' 'nonce-abc123'", policy) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/tests/utils.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/tests/utils.py new file mode 100644 index 0000000..7d7814f --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/tests/utils.py @@ -0,0 +1,39 @@ +from django.template import engines, Template, Context +from django.test import RequestFactory + +from csp.middleware import CSPMiddleware + + +JINJA_ENV = engines['jinja2'] +mw = CSPMiddleware() +rf = RequestFactory() + + +class ScriptTestBase(object): + def assert_template_eq(self, tpl1, tpl2): + aaa = tpl1.replace('\n', '').replace(' ', '') + bbb = tpl2.replace('\n', '').replace(' ', '') + assert aaa == bbb + + def process_templates(self, tpl, expected): + request = rf.get('/') + mw.process_request(request) + ctx = self.make_context(request) + return (self.make_template(tpl).render(ctx).strip(), + expected.format(request.csp_nonce)) + + +class ScriptTagTestBase(ScriptTestBase): + def make_context(self, request): + return Context({'request': request}) + + def make_template(self, tpl): + return Template(tpl) + + +class ScriptExtensionTestBase(ScriptTestBase): + def make_context(self, request): + return {'request': request} + + def make_template(self, tpl): + return JINJA_ENV.from_string(tpl) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/utils.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/utils.py new file mode 100644 index 0000000..a0d5c31 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/csp/utils.py @@ -0,0 +1,185 @@ +import copy +import re +import warnings + +from collections import OrderedDict +from itertools import chain + +from django.conf import settings +from django.utils.encoding import force_str + + +CHILD_SRC_DEPRECATION_WARNING = \ + 'child-src is deprecated in CSP v3. Use frame-src and worker-src.' + + +def from_settings(): + return { + # Fetch Directives + 'child-src': getattr(settings, 'CSP_CHILD_SRC', None), + 'connect-src': getattr(settings, 'CSP_CONNECT_SRC', None), + 'default-src': getattr(settings, 'CSP_DEFAULT_SRC', ["'self'"]), + 'script-src': getattr(settings, 'CSP_SCRIPT_SRC', None), + 'script-src-attr': getattr(settings, 'CSP_SCRIPT_SRC_ATTR', None), + 'script-src-elem': getattr(settings, 'CSP_SCRIPT_SRC_ELEM', None), + 'object-src': getattr(settings, 'CSP_OBJECT_SRC', None), + 'style-src': getattr(settings, 'CSP_STYLE_SRC', None), + 'style-src-attr': getattr(settings, 'CSP_STYLE_SRC_ATTR', None), + 'style-src-elem': getattr(settings, 'CSP_STYLE_SRC_ELEM', None), + 'font-src': getattr(settings, 'CSP_FONT_SRC', None), + 'frame-src': getattr(settings, 'CSP_FRAME_SRC', None), + 'img-src': getattr(settings, 'CSP_IMG_SRC', None), + 'manifest-src': getattr(settings, 'CSP_MANIFEST_SRC', None), + 'media-src': getattr(settings, 'CSP_MEDIA_SRC', None), + 'prefetch-src': getattr(settings, 'CSP_PREFETCH_SRC', None), + 'worker-src': getattr(settings, 'CSP_WORKER_SRC', None), + # Document Directives + 'base-uri': getattr(settings, 'CSP_BASE_URI', None), + 'plugin-types': getattr(settings, 'CSP_PLUGIN_TYPES', None), + 'sandbox': getattr(settings, 'CSP_SANDBOX', None), + # Navigation Directives + 'form-action': getattr(settings, 'CSP_FORM_ACTION', None), + 'frame-ancestors': getattr(settings, 'CSP_FRAME_ANCESTORS', None), + 'navigate-to': getattr(settings, 'CSP_NAVIGATE_TO', None), + # Reporting Directives + 'report-uri': getattr(settings, 'CSP_REPORT_URI', None), + 'report-to': getattr(settings, 'CSP_REPORT_TO', None), + 'require-sri-for': getattr(settings, 'CSP_REQUIRE_SRI_FOR', None), + #trusted Types Directives + 'require-trusted-types-for': getattr( + settings, + 'CSP_REQUIRE_TRUSTED_TYPES_FOR', None), + 'trusted-types': getattr(settings, 'CSP_TRUSTED_TYPES', None), + # Other Directives + 'upgrade-insecure-requests': getattr( + settings, 'CSP_UPGRADE_INSECURE_REQUESTS', False), + 'block-all-mixed-content': getattr( + settings, 'CSP_BLOCK_ALL_MIXED_CONTENT', False), + } + + +def build_policy(config=None, update=None, replace=None, nonce=None): + """Builds the policy as a string from the settings.""" + + if config is None: + config = from_settings() + # Be careful, don't mutate config as it could be from settings + + update = update if update is not None else {} + replace = replace if replace is not None else {} + csp = {} + + for k in set(chain(config, replace)): + if k in replace: + v = replace[k] + else: + v = config[k] + if v is not None: + v = copy.copy(v) + if not isinstance(v, (list, tuple)): + v = (v,) + csp[k] = v + + for k, v in update.items(): + if v is not None: + if not isinstance(v, (list, tuple)): + v = (v,) + if csp.get(k) is None: + csp[k] = v + else: + csp[k] += tuple(v) + + report_uri = csp.pop('report-uri', None) + + policy_parts = {} + for key, value in csp.items(): + # flag directives with an empty directive value + if len(value) and value[0] is True: + policy_parts[key] = '' + elif len(value) and value[0] is False: + pass + else: # directives with many values like src lists + policy_parts[key] = ' '.join(value) + + if key == 'child-src': + warnings.warn(CHILD_SRC_DEPRECATION_WARNING, DeprecationWarning) + + if report_uri: + report_uri = map(force_str, report_uri) + policy_parts['report-uri'] = ' '.join(report_uri) + + if nonce: + include_nonce_in = getattr(settings, 'CSP_INCLUDE_NONCE_IN', + ['default-src']) + for section in include_nonce_in: + policy = policy_parts.get(section, '') + policy_parts[section] = ("%s %s" % + (policy, "'nonce-%s'" % nonce)).strip() + + return '; '.join(['{} {}'.format(k, val).strip() + for k, val in policy_parts.items()]) + + +def _default_attr_mapper(attr_name, val): + if val: + return ' {}="{}"'.format(attr_name, val) + else: + return '' + + +def _bool_attr_mapper(attr_name, val): + # Only return the bare word if the value is truthy + # ie - defer=False should actually return an empty string + if val: + return ' {}'.format(attr_name) + else: + return '' + + +def _async_attr_mapper(attr_name, val): + """The `async` attribute works slightly different than the other bool + attributes. It can be set explicitly to `false` with no surrounding quotes + according to the spec.""" + if val in [False, 'False']: + return ' {}=false'.format(attr_name) + elif val: + return ' {}'.format(attr_name) + else: + return '' + + +# Allow per-attribute customization of returned string template +SCRIPT_ATTRS = OrderedDict() +SCRIPT_ATTRS['nonce'] = _default_attr_mapper +SCRIPT_ATTRS['id'] = _default_attr_mapper +SCRIPT_ATTRS['src'] = _default_attr_mapper +SCRIPT_ATTRS['type'] = _default_attr_mapper +SCRIPT_ATTRS['async'] = _async_attr_mapper +SCRIPT_ATTRS['defer'] = _bool_attr_mapper +SCRIPT_ATTRS['integrity'] = _default_attr_mapper +SCRIPT_ATTRS['nomodule'] = _bool_attr_mapper + +# Generates an interpolatable string of valid attrs eg - '{nonce}{id}...' +ATTR_FORMAT_STR = ''.join(['{{{}}}'.format(a) for a in SCRIPT_ATTRS]) + + +def _unwrap_script(text): + """Extract content defined between script tags""" + matches = re.search(r'([\s|\S]+?)', text) + if matches and len(matches.groups()): + return matches.group(1).strip() + + return text + + +def build_script_tag(content=None, **kwargs): + data = {} + # Iterate all possible script attrs instead of kwargs to make + # interpolation as easy as possible below + for attr_name, mapper in SCRIPT_ATTRS.items(): + data[attr_name] = mapper(attr_name, kwargs.get(attr_name)) + + # Don't render block contents if the script has a 'src' attribute + c = _unwrap_script(content) if content and not kwargs.get('src') else '' + attrs = ATTR_FORMAT_STR.format(**data).rstrip() + return ('{}'.format(attrs, c).strip()) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/decouple.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/decouple.py new file mode 100644 index 0000000..0788928 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/decouple.py @@ -0,0 +1,265 @@ +# coding: utf-8 +import os +import sys +import string +from shlex import shlex +from io import open +from collections import OrderedDict +from distutils.util import strtobool + +# Useful for very coarse version differentiation. +PY3 = sys.version_info[0] == 3 + +if PY3: + from configparser import ConfigParser + text_type = str +else: + from ConfigParser import SafeConfigParser as ConfigParser + text_type = unicode + +DEFAULT_ENCODING = 'UTF-8' + +class UndefinedValueError(Exception): + pass + + +class Undefined(object): + """ + Class to represent undefined type. + """ + pass + + +# Reference instance to represent undefined values +undefined = Undefined() + + +class Config(object): + """ + Handle .env file format used by Foreman. + """ + + def __init__(self, repository): + self.repository = repository + + def _cast_boolean(self, value): + """ + Helper to convert config values to boolean as ConfigParser do. + """ + value = str(value) + return bool(value) if value == '' else bool(strtobool(value)) + + @staticmethod + def _cast_do_nothing(value): + return value + + def get(self, option, default=undefined, cast=undefined): + """ + Return the value for option or default if defined. + """ + + # We can't avoid __contains__ because value may be empty. + if option in os.environ: + value = os.environ[option] + elif option in self.repository: + value = self.repository[option] + else: + if isinstance(default, Undefined): + raise UndefinedValueError('{} not found. Declare it as envvar or define a default value.'.format(option)) + + value = default + + if isinstance(cast, Undefined): + cast = self._cast_do_nothing + elif cast is bool: + cast = self._cast_boolean + + return cast(value) + + def __call__(self, *args, **kwargs): + """ + Convenient shortcut to get. + """ + return self.get(*args, **kwargs) + + +class RepositoryEmpty(object): + def __init__(self, source='', encoding=DEFAULT_ENCODING): + pass + + def __contains__(self, key): + return False + + def __getitem__(self, key): + return None + + +class RepositoryIni(RepositoryEmpty): + """ + Retrieves option keys from .ini files. + """ + SECTION = 'settings' + + def __init__(self, source, encoding=DEFAULT_ENCODING): + self.parser = ConfigParser() + with open(source, encoding=encoding) as file_: + self.parser.readfp(file_) + + def __contains__(self, key): + return (key in os.environ or + self.parser.has_option(self.SECTION, key)) + + def __getitem__(self, key): + return self.parser.get(self.SECTION, key) + + +class RepositoryEnv(RepositoryEmpty): + """ + Retrieves option keys from .env files with fall back to os.environ. + """ + def __init__(self, source, encoding=DEFAULT_ENCODING): + self.data = {} + + with open(source, encoding=encoding) as file_: + for line in file_: + line = line.strip() + if not line or line.startswith('#') or '=' not in line: + continue + k, v = line.split('=', 1) + k = k.strip() + v = v.strip() + if len(v) >= 2 and ((v[0] == "'" and v[-1] == "'") or (v[0] == '"' and v[-1] == '"')): + v = v.strip('\'"') + self.data[k] = v + + def __contains__(self, key): + return key in os.environ or key in self.data + + def __getitem__(self, key): + return self.data[key] + + +class AutoConfig(object): + """ + Autodetects the config file and type. + + Parameters + ---------- + search_path : str, optional + Initial search path. If empty, the default search path is the + caller's path. + + """ + SUPPORTED = OrderedDict([ + ('settings.ini', RepositoryIni), + ('.env', RepositoryEnv), + ]) + + encoding = DEFAULT_ENCODING + + def __init__(self, search_path=None): + self.search_path = search_path + self.config = None + + def _find_file(self, path): + # look for all files in the current path + for configfile in self.SUPPORTED: + filename = os.path.join(path, configfile) + if os.path.isfile(filename): + return filename + + # search the parent + parent = os.path.dirname(path) + if parent and parent != os.path.abspath(os.sep): + return self._find_file(parent) + + # reached root without finding any files. + return '' + + def _load(self, path): + # Avoid unintended permission errors + try: + filename = self._find_file(os.path.abspath(path)) + except Exception: + filename = '' + Repository = self.SUPPORTED.get(os.path.basename(filename), RepositoryEmpty) + + self.config = Config(Repository(filename, encoding=self.encoding)) + + def _caller_path(self): + # MAGIC! Get the caller's module path. + frame = sys._getframe() + path = os.path.dirname(frame.f_back.f_back.f_code.co_filename) + return path + + def __call__(self, *args, **kwargs): + if not self.config: + self._load(self.search_path or self._caller_path()) + + return self.config(*args, **kwargs) + + +# A pré-instantiated AutoConfig to improve decouple's usability +# now just import config and start using with no configuration. +config = AutoConfig() + +# Helpers + +class Csv(object): + """ + Produces a csv parser that return a list of transformed elements. + """ + + def __init__(self, cast=text_type, delimiter=',', strip=string.whitespace, post_process=list): + """ + Parameters: + cast -- callable that transforms the item just before it's added to the list. + delimiter -- string of delimiters chars passed to shlex. + strip -- string of non-relevant characters to be passed to str.strip after the split. + post_process -- callable to post process all casted values. Default is `list`. + """ + self.cast = cast + self.delimiter = delimiter + self.strip = strip + self.post_process = post_process + + def __call__(self, value): + """The actual transformation""" + transform = lambda s: self.cast(s.strip(self.strip)) + + splitter = shlex(value, posix=True) + splitter.whitespace = self.delimiter + splitter.whitespace_split = True + + return self.post_process(transform(s) for s in splitter) + + +class Choices(object): + """ + Allows for cast and validation based on a list of choices. + """ + + def __init__(self, flat=None, cast=text_type, choices=None): + """ + Parameters: + flat -- a flat list of valid choices. + cast -- callable that transforms value before validation. + choices -- tuple of Django-like choices. + """ + self.flat = flat or [] + self.cast = cast + self.choices = choices or [] + + self._valid_values = [] + self._valid_values.extend(self.flat) + self._valid_values.extend([value for value, _ in self.choices]) + + + def __call__(self, value): + transform = self.cast(value) + if transform not in self._valid_values: + raise ValueError(( + 'Value not in list: {!r}; valid values are {!r}' + ).format(value, self._valid_values)) + else: + return transform diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/__init__.py new file mode 100644 index 0000000..bcdeaf2 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/__init__.py @@ -0,0 +1,24 @@ +from django.utils.version import get_version + +VERSION = (3, 2, 5, '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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/__main__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/__main__.py new file mode 100644 index 0000000..8b96e91 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/__main__.py @@ -0,0 +1,9 @@ +""" +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/apps/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/apps/__init__.py new file mode 100644 index 0000000..79091dc --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/apps/__init__.py @@ -0,0 +1,4 @@ +from .config import AppConfig +from .registry import apps + +__all__ = ['AppConfig', 'apps'] diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/apps/config.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/apps/config.py new file mode 100644 index 0000000..bced53d --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/apps/config.py @@ -0,0 +1,306 @@ +import inspect +import os +import warnings +from importlib import import_module + +from django.core.exceptions import ImproperlyConfigured +from django.utils.deprecation import RemovedInDjango41Warning +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 paths to list because Python's _NamespacePath doesn't 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_config_name = 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] + app_config_name = '%s.%s' % (mod_path, app_configs[0][0]) + 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] + app_config_name = '%s.%s' % (mod_path, app_configs[0][0]) + + # If app_module specifies a default_app_config, follow the link. + # default_app_config is deprecated, but still takes over the + # automatic detection for backwards compatibility during the + # deprecation period. + try: + new_entry = app_module.default_app_config + except AttributeError: + # 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 + else: + message = ( + '%r defines default_app_config = %r. ' % (entry, new_entry) + ) + if new_entry == app_config_name: + message += ( + 'Django now detects this configuration automatically. ' + 'You can remove default_app_config.' + ) + else: + message += ( + "However, Django's automatic detection %s. You should " + "move the default config class to the apps submodule " + "of your application and, if this module defines " + "several config classes, mark the default one with " + "default = True." % ( + "picked another configuration, %r" % app_config_name + if app_config_name + else "did not find this configuration" + ) + ) + warnings.warn(message, RemovedInDjango41Warning, stacklevel=2) + entry = new_entry + app_config_class = None + + # 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/apps/registry.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/apps/registry.py new file mode 100644 index 0000000..62650ca --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/apps/registry.py @@ -0,0 +1,428 @@ +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 master 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 master 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.lru_cache(maxsize=None) + 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[len(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.lru_cache(maxsize=None) + 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 lru_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. + """ + 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 == 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 == 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. + """ + # 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/bin/django-admin.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/bin/django-admin.py new file mode 100755 index 0000000..594b0f1 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/bin/django-admin.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python +# When the django-admin.py deprecation ends, remove this script. +import warnings + +from django.core import management + +try: + from django.utils.deprecation import RemovedInDjango40Warning +except ImportError: + raise ImportError( + 'django-admin.py was deprecated in Django 3.1 and removed in Django ' + '4.0. Please manually remove this script from your virtual environment ' + 'and use django-admin instead.' + ) + +if __name__ == "__main__": + warnings.warn( + 'django-admin.py is deprecated in favor of django-admin.', + RemovedInDjango40Warning, + ) + management.execute_from_command_line() diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/__init__.py new file mode 100644 index 0000000..2830244 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/__init__.py @@ -0,0 +1,273 @@ +""" +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 RemovedInDjango40Warning +from django.utils.functional import LazyObject, empty + +ENVIRONMENT_VARIABLE = "DJANGO_SETTINGS_MODULE" + +PASSWORD_RESET_TIMEOUT_DAYS_DEPRECATED_MSG = ( + 'The PASSWORD_RESET_TIMEOUT_DAYS setting is deprecated. Use ' + 'PASSWORD_RESET_TIMEOUT instead.' +) + +DEFAULT_HASHING_ALGORITHM_DEPRECATED_MSG = ( + 'The DEFAULT_HASHING_ALGORITHM transitional setting is deprecated. ' + 'Support for it and tokens, cookies, sessions, and signatures that use ' + 'SHA-1 hashing algorithm will be removed in Django 4.0.' +) + + +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 self._wrapped is empty: + self._setup(name) + val = getattr(self._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 + + @property + def PASSWORD_RESET_TIMEOUT_DAYS(self): + stack = traceback.extract_stack() + # Show a warning if the setting is used outside of Django. + # Stack index: -1 this line, -2 the caller. + filename, _, _, _ = stack[-2] + if not filename.startswith(os.path.dirname(django.__file__)): + warnings.warn( + PASSWORD_RESET_TIMEOUT_DAYS_DEPRECATED_MSG, + RemovedInDjango40Warning, + stacklevel=2, + ) + return self.__getattr__('PASSWORD_RESET_TIMEOUT_DAYS') + + +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 = ( + "INSTALLED_APPS", + "TEMPLATE_DIRS", + "LOCALE_PATHS", + ) + 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('PASSWORD_RESET_TIMEOUT_DAYS'): + if self.is_overridden('PASSWORD_RESET_TIMEOUT'): + raise ImproperlyConfigured( + 'PASSWORD_RESET_TIMEOUT_DAYS/PASSWORD_RESET_TIMEOUT are ' + 'mutually exclusive.' + ) + setattr(self, 'PASSWORD_RESET_TIMEOUT', self.PASSWORD_RESET_TIMEOUT_DAYS * 60 * 60 * 24) + warnings.warn(PASSWORD_RESET_TIMEOUT_DAYS_DEPRECATED_MSG, RemovedInDjango40Warning) + + if self.is_overridden('DEFAULT_HASHING_ALGORITHM'): + warnings.warn(DEFAULT_HASHING_ALGORITHM_DEPRECATED_MSG, RemovedInDjango40Warning) + + 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 == 'PASSWORD_RESET_TIMEOUT_DAYS': + setattr(self, 'PASSWORD_RESET_TIMEOUT', value * 60 * 60 * 24) + warnings.warn(PASSWORD_RESET_TIMEOUT_DAYS_DEPRECATED_MSG, RemovedInDjango40Warning) + if name == 'DEFAULT_HASHING_ALGORITHM': + warnings.warn(DEFAULT_HASHING_ALGORITHM_DEPRECATED_MSG, RemovedInDjango40Warning) + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/app_template/__init__.py-tpl b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/app_template/__init__.py-tpl new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/app_template/admin.py-tpl b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/app_template/admin.py-tpl new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/app_template/admin.py-tpl @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/app_template/apps.py-tpl b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/app_template/apps.py-tpl new file mode 100644 index 0000000..b705352 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/app_template/apps.py-tpl @@ -0,0 +1,6 @@ +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/app_template/migrations/__init__.py-tpl b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/app_template/migrations/__init__.py-tpl new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/app_template/models.py-tpl b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/app_template/models.py-tpl new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/app_template/models.py-tpl @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/app_template/tests.py-tpl b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/app_template/tests.py-tpl new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/app_template/tests.py-tpl @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/app_template/views.py-tpl b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/app_template/views.py-tpl new file mode 100644 index 0000000..91ea44a --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/app_template/views.py-tpl @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/global_settings.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/global_settings.py new file mode 100644 index 0000000..cf9fae4 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/global_settings.py @@ -0,0 +1,654 @@ +""" +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 = False + +# Language code for this installation. All choices can be found here: +# http://www.i18nguy.com/unicode/language-identifiers.html +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')), + ('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')), + ('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')), + ('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", "fa", "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 + + +# If you set this to True, Django will format dates, numbers and calendars +# according to user current locale. +USE_L10N = False + +# 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' + +# 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 = '' + +# Default file storage mechanism that holds media. +DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage' + +# 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 + +# 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', '%m/%d/%Y', '%m/%d/%y', # '2006-10-25', '10/25/2006', '10/25/06' + '%b %d %Y', '%b %d, %Y', # 'Oct 25 2006', 'Oct 25, 2006' + '%d %b %Y', '%d %b, %Y', # '25 Oct 2006', '25 Oct, 2006' + '%B %d %Y', '%B %d, %Y', # 'October 25 2006', 'October 25, 2006' + '%d %B %Y', '%d %B, %Y', # '25 October 2006', '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 + +# Default hashing algorithm to use for encoding cookies, password reset tokens +# in the admin site, user sessions, and signatures. It's a transitional setting +# helpful in migrating multiple instance of the same project to Django 3.1+. +# Algorithm must be 'sha1' or 'sha256'. +DEFAULT_HASHING_ALGORITHM = 'sha256' + +############## +# 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 days a password reset link is valid for +PASSWORD_RESET_TIMEOUT_DAYS = 3 + +# 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', +] + +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 = [] + +# The default file storage backend used during the build process +STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.StaticFilesStorage' + +# 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_BROWSER_XSS_FILTER = False +SECURE_CONTENT_TYPE_NOSNIFF = True +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/__init__.py new file mode 100644 index 0000000..6285f20 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/__init__.py @@ -0,0 +1,611 @@ +""" +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à', + }, + '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': 'मराठी', + }, + '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': 'Удмурт', + }, + '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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/af/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/af/LC_MESSAGES/django.mo new file mode 100644 index 0000000..5da1748 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/af/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/af/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/af/LC_MESSAGES/django.po new file mode 100644 index 0000000..f7084ad --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/af/LC_MESSAGES/django.po @@ -0,0 +1,1267 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# F Wolff , 2019-2020 +# Stephen Cox , 2011-2012 +# unklphil , 2014,2019 +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-20 19:37+0000\n" +"Last-Translator: F Wolff \n" +"Language-Team: Afrikaans (http://www.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 "" + +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 "Czech" +msgstr "Tsjeggies" + +msgid "Welsh" +msgstr "Welsh" + +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 "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 "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" + +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 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 "" + +msgid "" +"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" + +msgid "Enter a valid IPv4 address." +msgstr "Gee ’n geldige IPv4-adres." + +msgid "Enter a valid IPv6 address." +msgstr "Gee ’n geldige IPv6-adres." + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Gee ’n geldige IPv4- of IPv6-adres." + +msgid "Enter only digits separated by commas." +msgstr "Gee slegs syfers in 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 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 "" + +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 "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 "" + +#, python-format +msgid "“%(value)s” value must be either True, False, or None." +msgstr "" + +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 "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 "" + +#, 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 (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 "" + +#, 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 (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 "" + +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 "" + +msgid "Floating point number" +msgstr "Dryfpuntgetal" + +#, python-format +msgid "“%(value)s” value must be an integer." +msgstr "“%(value)s”-waarde moet ’n heelgetal wees." + +msgid "Integer" +msgstr "Heelgetal" + +msgid "Big (8 byte) integer" +msgstr "Groot (8 greep) 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 "Small integer" +msgstr "Klein heelgetal" + +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 "" + +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 does not exist." +msgstr "%(model)s-objek met %(field)s %(value)r bestaan 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 ingedien 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" + +msgid "ManagementForm data is missing or has been tampered with" +msgstr "Die ManagementForm-data ontbreek of is mee gepeuter" + +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "Dien asseblief %d of minder vorms in." +msgstr[1] "Dien asseblief %d of minder vorms in." + +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "Dien asseblief %d of meer vorms in." +msgstr[1] "Dien asseblief %d of meer 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 "" + +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 "%d year" +msgid_plural "%d years" +msgstr[0] "%d jaar" +msgstr[1] "%d jare" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d maand" +msgstr[1] "%d maande" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d week" +msgstr[1] "%d weke" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d dag" +msgstr[1] "%d dae" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d uur" +msgstr[1] "%d ure" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minuut" +msgstr[1] "%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 "" + +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 "" +"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 "" + +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 "" + +#, 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 "" + +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 "Django: the Web framework for perfectionists with deadlines." +msgstr "Django: die webraamwerk vir perfeksioniste met sperdatums." + +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" +"Sien die vrystellingsnotas vir Django " +"%(version)s" + +msgid "The install worked successfully! Congratulations!" +msgstr "Die installasie was suksesvol! Geluk!" + +#, 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ar/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ar/LC_MESSAGES/django.mo new file mode 100644 index 0000000..d65a93a Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ar/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ar/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ar/LC_MESSAGES/django.po new file mode 100644 index 0000000..ccda018 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ar/LC_MESSAGES/django.po @@ -0,0 +1,1378 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Bashar Al-Abdulhadi, 2015-2016,2020 +# Bashar Al-Abdulhadi, 2014 +# Eyad Toma , 2013-2014 +# Jannis Leidel , 2011 +# 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: 2020-05-19 20:23+0200\n" +"PO-Revision-Date: 2020-07-15 00:40+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" + +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 "أدخِل رابطًا صحيحًا." + +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 "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 "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' ليست بنسق صحيح. القيمة يجب ان تكون من التنسيق\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" + +msgid "ManagementForm data is missing or has been tampered with" +msgstr "بيانات ManagementForm مفقودة أو تم العبث بها" + +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "الرجاء إرسال %d إستمارة أو أقل." +msgstr[1] "الرجاء إرسال إستمارة %d أو أقل" +msgstr[2] "الرجاء إرسال %d إستمارتين أو أقل" +msgstr[3] "الرجاء إرسال %d إستمارة أو أقل" +msgstr[4] "الرجاء إرسال %d إستمارة أو أقل" +msgstr[5] "الرجاء إرسال %d إستمارة أو أقل" + +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more 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 "%d year" +msgid_plural "%d years" +msgstr[0] "%d سنة" +msgstr[1] "%d سنة" +msgstr[2] "%d سنوات" +msgstr[3] "%d سنوات" +msgstr[4] "%d سنوات" +msgstr[5] "%d سنوات" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d شهر" +msgstr[1] "%d شهر" +msgstr[2] "%d شهرين" +msgstr[3] "%d أشهر" +msgstr[4] "%d شهر" +msgstr[5] "%d شهر" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d اسبوع." +msgstr[1] "%d اسبوع." +msgstr[2] "%d أسبوعين" +msgstr[3] "%d أسابيع" +msgstr[4] "%d اسبوع." +msgstr[5] "%d أسبوع" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d يوم" +msgstr[1] "%d يوم" +msgstr[2] "%d يومان" +msgstr[3] "%d أيام" +msgstr[4] "%d يوم" +msgstr[5] "%d يوم" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d ساعة" +msgstr[1] "%d ساعة واحدة" +msgstr[2] "%d ساعتين" +msgstr[3] "%d ساعات" +msgstr[4] "%d ساعة" +msgstr[5] "%d ساعة" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d دقيقة" +msgstr[1] "%d دقيقة" +msgstr[2] "%d دقيقتين" +msgstr[3] "%d دقائق" +msgstr[4] "%d دقيقة" +msgstr[5] "%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 هي 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 "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 "" +"تظهر لك هذه الصفحة لأن 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ar/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ar/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ar/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ar/formats.py new file mode 100644 index 0000000..19cc860 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ar/formats.py @@ -0,0 +1,21 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ar_DZ/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ar_DZ/LC_MESSAGES/django.mo new file mode 100644 index 0000000..1fce7bc Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ar_DZ/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ar_DZ/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ar_DZ/LC_MESSAGES/django.po new file mode 100644 index 0000000..373dea1 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ar_DZ/LC_MESSAGES/django.po @@ -0,0 +1,1379 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Riterix , 2019-2020 +# Riterix , 2019 +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: 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 "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 "أدخل رابطاً صحيحاً." + +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 "لا يمكن ترك هذا الحقل خالي." + +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 "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 "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” على تنسيق غير صالح. يجب أن يكون بتنسيق 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" + +msgid "ManagementForm data is missing or has been tampered with" +msgstr "بيانات ManagementForm مفقودة أو تم العبث بها" + +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "الرجاء إرسال %d إستمارة أو أقل" +msgstr[1] "الرجاء إرسال %d إستمارة أو أقل" +msgstr[2] "الرجاء إرسال %d إستمارة أو أقل" +msgstr[3] "الرجاء إرسال %d إستمارة أو أقل" +msgstr[4] "الرجاء إرسال %d إستمارة أو أقل" +msgstr[5] "الرجاء إرسال %d إستمارة أو أقل" + +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more 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] "%(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 "%d year" +msgid_plural "%d years" +msgstr[0] "%d سنة" +msgstr[1] "%d سنة" +msgstr[2] "%d سنتان" +msgstr[3] "%d سنوات" +msgstr[4] "%d سنة" +msgstr[5] "%d سنة" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d شهر" +msgstr[1] "%d شهر" +msgstr[2] "%d شهرين\"" +msgstr[3] "%d أشهر" +msgstr[4] "%d شهر" +msgstr[5] "%d شهر" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d أسبوع" +msgstr[1] "%d اسبوع" +msgstr[2] "%d أسبوعين" +msgstr[3] "%d أسابيع" +msgstr[4] "%d أسبوع" +msgstr[5] "%d أسبوع" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d يوم" +msgstr[1] "%d يوم" +msgstr[2] "%d يومان" +msgstr[3] "%d أيام" +msgstr[4] "%d يوم" +msgstr[5] "%d يوم" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d ساعة" +msgstr[1] "%d ساعة" +msgstr[2] "%d ساعتين" +msgstr[3] "%d ساعات" +msgstr[4] "%d ساعة" +msgstr[5] "%d ساعة" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d دقيقة" +msgstr[1] "%d دقيقة" +msgstr[2] "%d دقيقتين" +msgstr[3] "%d دقائق" +msgstr[4] "%d دقيقة" +msgstr[5] "%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” القيام بالتحقق من “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 "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 "" +"تشاهد هذه الصفحة لأن 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ar_DZ/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ar_DZ/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ar_DZ/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ar_DZ/formats.py new file mode 100644 index 0000000..e091e17 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ar_DZ/formats.py @@ -0,0 +1,29 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ast/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ast/LC_MESSAGES/django.mo new file mode 100644 index 0000000..31733b2 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ast/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ast/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ast/LC_MESSAGES/django.po new file mode 100644 index 0000000..417f18d --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ast/LC_MESSAGES/django.po @@ -0,0 +1,1237 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/az/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/az/LC_MESSAGES/django.mo new file mode 100644 index 0000000..dfb7d44 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/az/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/az/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/az/LC_MESSAGES/django.po new file mode 100644 index 0000000..95be54a --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/az/LC_MESSAGES/django.po @@ -0,0 +1,1278 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Emin Mastizada , 2018,2020 +# Emin Mastizada , 2015-2016 +# Metin Amiroff , 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: 2020-01-12 07:21+0000\n" +"Last-Translator: Emin Mastizada \n" +"Language-Team: Azerbaijani (http://www.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əbcə" + +msgid "Asturian" +msgstr "Asturiyaca" + +msgid "Azerbaijani" +msgstr "Azərbaycanca" + +msgid "Bulgarian" +msgstr "Bolqarca" + +msgid "Belarusian" +msgstr "Belarusca" + +msgid "Bengali" +msgstr "Benqalca" + +msgid "Breton" +msgstr "Bretonca" + +msgid "Bosnian" +msgstr "Bosniyaca" + +msgid "Catalan" +msgstr "Katalanca" + +msgid "Czech" +msgstr "Çexcə" + +msgid "Welsh" +msgstr "Uelscə" + +msgid "Danish" +msgstr "Danimarkaca" + +msgid "German" +msgstr "Almanca" + +msgid "Lower Sorbian" +msgstr "Aşağı Sorbca" + +msgid "Greek" +msgstr "Yunanca" + +msgid "English" +msgstr "İngiliscə" + +msgid "Australian English" +msgstr "Avstraliya İngiliscəsi" + +msgid "British English" +msgstr "Britaniya İngiliscəsi" + +msgid "Esperanto" +msgstr "Esperanto" + +msgid "Spanish" +msgstr "İspanca" + +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 "Estonca" + +msgid "Basque" +msgstr "Baskca" + +msgid "Persian" +msgstr "Farsca" + +msgid "Finnish" +msgstr "Fincə" + +msgid "French" +msgstr "Fransızca" + +msgid "Frisian" +msgstr "Friscə" + +msgid "Irish" +msgstr "İrlandca" + +msgid "Scottish Gaelic" +msgstr "Şotland Keltcəsi" + +msgid "Galician" +msgstr "Qallik dili" + +msgid "Hebrew" +msgstr "İbranicə" + +msgid "Hindi" +msgstr "Hindcə" + +msgid "Croatian" +msgstr "Xorvatca" + +msgid "Upper Sorbian" +msgstr "Üst Sorbca" + +msgid "Hungarian" +msgstr "Macarca" + +msgid "Armenian" +msgstr "Ermənicə" + +msgid "Interlingua" +msgstr "İnterlinqua" + +msgid "Indonesian" +msgstr "İndonezcə" + +msgid "Ido" +msgstr "İdoca" + +msgid "Icelandic" +msgstr "İslandca" + +msgid "Italian" +msgstr "İtalyanca" + +msgid "Japanese" +msgstr "Yaponca" + +msgid "Georgian" +msgstr "Gürcücə" + +msgid "Kabyle" +msgstr "Kabile" + +msgid "Kazakh" +msgstr "Qazax" + +msgid "Khmer" +msgstr "Kxmercə" + +msgid "Kannada" +msgstr "Kannada dili" + +msgid "Korean" +msgstr "Koreyca" + +msgid "Luxembourgish" +msgstr "Lüksemburqca" + +msgid "Lithuanian" +msgstr "Litva dili" + +msgid "Latvian" +msgstr "Latviya dili" + +msgid "Macedonian" +msgstr "Makedonca" + +msgid "Malayalam" +msgstr "Malayamca" + +msgid "Mongolian" +msgstr "Monqolca" + +msgid "Marathi" +msgstr "Marathicə" + +msgid "Burmese" +msgstr "Burmescə" + +msgid "Norwegian Bokmål" +msgstr "Norveç Bukmolcası" + +msgid "Nepali" +msgstr "Nepal" + +msgid "Dutch" +msgstr "Flamandca" + +msgid "Norwegian Nynorsk" +msgstr "Nynorsk Norveçcəsi" + +msgid "Ossetic" +msgstr "Osetincə" + +msgid "Punjabi" +msgstr "Pancabicə" + +msgid "Polish" +msgstr "Polyakca" + +msgid "Portuguese" +msgstr "Portuqalca" + +msgid "Brazilian Portuguese" +msgstr "Braziliya Portuqalcası" + +msgid "Romanian" +msgstr "Rumınca" + +msgid "Russian" +msgstr "Rusca" + +msgid "Slovak" +msgstr "Slovakca" + +msgid "Slovenian" +msgstr "Slovencə" + +msgid "Albanian" +msgstr "Albanca" + +msgid "Serbian" +msgstr "Serbcə" + +msgid "Serbian Latin" +msgstr "Serbcə Latın" + +msgid "Swedish" +msgstr "İsveçcə" + +msgid "Swahili" +msgstr "Suahili" + +msgid "Tamil" +msgstr "Tamilcə" + +msgid "Telugu" +msgstr "Teluqu dili" + +msgid "Thai" +msgstr "Tayca" + +msgid "Turkish" +msgstr "Türkcə" + +msgid "Tatar" +msgstr "Tatar" + +msgid "Udmurt" +msgstr "Udmurtca" + +msgid "Ukrainian" +msgstr "Ukraynaca" + +msgid "Urdu" +msgstr "Urduca" + +msgid "Uzbek" +msgstr "Özbəkcə" + +msgid "Vietnamese" +msgstr "Vyetnamca" + +msgid "Simplified Chinese" +msgstr "Sadələşdirilmiş Çincə" + +msgid "Traditional Chinese" +msgstr "Ənənəvi Çincə" + +msgid "Messages" +msgstr "Mesajlar" + +msgid "Site Maps" +msgstr "Sayt Xəritələri" + +msgid "Static Files" +msgstr "Statik Fayllar" + +msgid "Syndication" +msgstr "Sindikasiya" + +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 "Səhifədə nəticə yoxdur" + +msgid "Enter a valid value." +msgstr "Düzgün qiymət 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." + +msgid "Enter a valid IPv4 address." +msgstr "Düzgün IPv4 ünvanı daxil edin." + +msgid "Enter a valid IPv6 address." +msgstr "Düzgün IPv6 ünvanını daxil edin." + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Düzgün IPv4 və ya IPv6 ünvanını daxil edin." + +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 edin ki, bu qiymət %(limit_value)s-dir (bu %(show_value)s-dir)." + +#, python-format +msgid "Ensure this value is less than or equal to %(limit_value)s." +msgstr "" +"Bu qiymətin %(limit_value)s-ya 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-ya bərabər və ya ondan böyük olduğunu yoxlayın." + +#, 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 " +"var)" +msgstr[1] "" +"Bu dəyərin ən az %(limit_value)d simvol olduğuna əmin olun (%(show_value)d " +"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 " +"var)" +msgstr[1] "" +"Bu dəyərin ən çox %(limit_value)d simvol olduğuna əmin olun (%(show_value)d " +"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 "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 True və ya 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 "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 "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 Doğru, ya Yalan, ya da Heç nə)" + +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 "Small integer" +msgstr "Kiçik tam ədəd" + +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" + +#, 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." + +#. 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" + +msgid "ManagementForm data is missing or has been tampered with" +msgstr "ManagementForm məlumatları əksikdir və ya korlanıb" + +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "Lütfən %d və ya daha az forma göndərin." +msgstr[1] "Lütfən %d və ya daha az forma göndərin." + +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "Lütfən %d və ya daha çox forma göndərin." +msgstr[1] "Lütfən %d və ya daha çox forma göndərin." + +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 duallıq, 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" + +msgid "Year" +msgstr "İl" + +msgid "Month" +msgstr "Ay" + +msgid "Day" +msgstr "Gün" + +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 "p.m." + +msgid "a.m." +msgstr "a.m." + +msgid "PM" +msgstr "PM" + +msgid "AM" +msgstr "AM" + +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 "Sent." + +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 "%d year" +msgid_plural "%d years" +msgstr[0] "%d il" +msgstr[1] "%d il" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d ay" +msgstr[1] "%d ay" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d həftə" +msgstr[1] "%d həftə" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d gün" +msgstr[1] "%d gün" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d saat" +msgstr[1] "%d saat" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d dəqiqə" +msgstr[1] "%d dəqiqə" + +msgid "0 minutes" +msgstr "0 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 HTTPS sayt səyyahınız tərəfindən “Referer header” göndərilməsini tələb " +"edir, amma göndərilmir. Bu başlıq 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 “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 "Qeyri-düzgün 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 "Django: the Web framework for perfectionists with deadlines." +msgstr "Django: tələsən mükəmməlləkçilər üçün Web framework." + +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" +"Django %(version)s üçün buraxılış " +"qeydlərinə baxın" + +msgid "The install worked successfully! Congratulations!" +msgstr "Quruluş uğurla tamamlandı! Təbriklə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 "" +"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 Sənədləri" + +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-ya 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/az/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/az/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/az/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/az/formats.py new file mode 100644 index 0000000..6f655d1 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/az/formats.py @@ -0,0 +1,30 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/be/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/be/LC_MESSAGES/django.mo new file mode 100644 index 0000000..44c3dfb Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/be/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/be/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/be/LC_MESSAGES/django.po new file mode 100644 index 0000000..ddb7c34 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/be/LC_MESSAGES/django.po @@ -0,0 +1,1353 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Viktar Palstsiuk , 2014-2015 +# znotdead , 2016-2017,2019-2021 +# Дмитрий Шатера , 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-01-15 20:33+0000\n" +"Last-Translator: znotdead \n" +"Language-Team: Belarusian (http://www.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 "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 "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 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, личбаў, знакаў " +"падкрэслівання ці злучкі." + +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)." + +#, 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 "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 "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 %d form." +msgid_plural "Please submit at most %d forms." +msgstr[0] "Калі ласка, адпраўце не болей чым %d форму." +msgstr[1] "Калі ласка, адпраўце не болей чым %d формаў." +msgstr[2] "Калі ласка, адпраўце не болей чым %d формаў." +msgstr[3] "Калі ласка, адпраўце не болей чым %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 формаў." + +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 "%d year" +msgid_plural "%d years" +msgstr[0] "%d год" +msgstr[1] "%d гады" +msgstr[2] "%d гадоў" +msgstr[3] "%d гадоў" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d месяц" +msgstr[1] "%d месяцы" +msgstr[2] "%d месяцаў" +msgstr[3] "%d месяцаў" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d тыдзень" +msgstr[1] "%d тыдні" +msgstr[2] "%d тыдняў" +msgstr[3] "%d тыдняў" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d дзень" +msgstr[1] "%d дні" +msgstr[2] "%d дзён" +msgstr[3] "%d дзён" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d гадзіна" +msgstr[1] "%d гадзіны" +msgstr[2] "%d гадзін" +msgstr[3] "%d гадзін" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d хвіліна" +msgstr[1] "%d хвіліны" +msgstr[2] "%d хвілінаў" +msgstr[3] "%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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/bg/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/bg/LC_MESSAGES/django.mo new file mode 100644 index 0000000..a7886df Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/bg/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/bg/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/bg/LC_MESSAGES/django.po new file mode 100644 index 0000000..e911c00 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/bg/LC_MESSAGES/django.po @@ -0,0 +1,1269 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Boris Chervenkov , 2012 +# Claude Paroz , 2020 +# Jannis Leidel , 2011 +# Lyuboslav Petrov , 2014 +# 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: 2020-05-19 20:23+0200\n" +"PO-Revision-Date: 2020-07-14 21:42+0000\n" +"Last-Translator: Transifex Bot <>\n" +"Language-Team: Bulgarian (http://www.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 "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 "Бързи Maps" + +msgid "Static Files" +msgstr "Статични файлове" + +msgid "Syndication" +msgstr "Syndication" + +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 "" + +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 "" + +#, 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 "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 "Boolean (Възможните стойности са 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 "Slug (до %(max_length)s )" + +msgid "Small integer" +msgstr "2 байта цяло число" + +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 "" + +#, 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." + +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 "" +"Моля, коригирайте дублиранит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 "" + +#, 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 ТБ" + +#, 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 бисквитка когато " +"се подават формуляри. Тази бисквитка е задължителна от съображения за " +"сигурност, за да се гарантира, че вашият браузър не е компрометиран от трети " +"страни." + +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 "" +"Бъдещo %(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 "Django: Фреймуоркът за перфекционисти с крайни срокове." + +#, 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 "" +"Вие виждате тази страница защото 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 "" + +msgid "Connect, get help, or contribute" +msgstr "" diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/bg/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/bg/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/bg/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/bg/formats.py new file mode 100644 index 0000000..b7d0c3b --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/bg/formats.py @@ -0,0 +1,21 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/bn/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/bn/LC_MESSAGES/django.mo new file mode 100644 index 0000000..ef52f36 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/bn/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/bn/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/bn/LC_MESSAGES/django.po new file mode 100644 index 0000000..b554f7a --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/bn/LC_MESSAGES/django.po @@ -0,0 +1,1218 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/bn/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/bn/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/bn/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/bn/formats.py new file mode 100644 index 0000000..6205fb9 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/bn/formats.py @@ -0,0 +1,32 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/br/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/br/LC_MESSAGES/django.mo new file mode 100644 index 0000000..a9419c0 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/br/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/br/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/br/LC_MESSAGES/django.po new file mode 100644 index 0000000..9ab9cf0 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/br/LC_MESSAGES/django.po @@ -0,0 +1,1294 @@ +# 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-01-15 09:00+0100\n" +"PO-Revision-Date: 2021-02-28 17:37+0000\n" +"Last-Translator: Ewen \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 "" + +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 "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 "" + +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 "" + +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 "%d year" +msgid_plural "%d years" +msgstr[0] "%d bloaz" +msgstr[1] "%d bloaz" +msgstr[2] "%d bloaz" +msgstr[3] "%d bloaz" +msgstr[4] "%d bloaz" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d miz" +msgstr[1] "%d miz" +msgstr[2] "%d miz" +msgstr[3] "%d miz" +msgstr[4] "%d miz" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d sizhun" +msgstr[1] "%d sizhun" +msgstr[2] "%d sizhun" +msgstr[3] "%d sizhun" +msgstr[4] "%d sizhun" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d deiz" +msgstr[1] "%d deiz" +msgstr[2] "%d deiz" +msgstr[3] "%d deiz" +msgstr[4] "%d deiz" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d eur" +msgstr[1] "%d eur" +msgstr[2] "%d eur" +msgstr[3] "%d eur" +msgstr[4] "%d eur" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d munud" +msgstr[1] "%d munud" +msgstr[2] "%d munud" +msgstr[3] "%d munud" +msgstr[4] "%d munud" + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/bs/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/bs/LC_MESSAGES/django.mo new file mode 100644 index 0000000..064cc5d Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/bs/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/bs/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/bs/LC_MESSAGES/django.po new file mode 100644 index 0000000..a985b84 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/bs/LC_MESSAGES/django.po @@ -0,0 +1,1238 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/bs/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/bs/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/bs/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/bs/formats.py new file mode 100644 index 0000000..25d9b40 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/bs/formats.py @@ -0,0 +1,21 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ca/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ca/LC_MESSAGES/django.mo new file mode 100644 index 0000000..ea6425f Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ca/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ca/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ca/LC_MESSAGES/django.po new file mode 100644 index 0000000..721e90a --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ca/LC_MESSAGES/django.po @@ -0,0 +1,1322 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Antoni Aloy , 2012,2015-2017 +# Carles Barrobés , 2011-2012,2014,2020 +# duub qnnp, 2015 +# Gil Obradors Via , 2019 +# Gil Obradors Via , 2019 +# Jannis Leidel , 2011 +# Manel Clos , 2020 +# Manuel Miranda , 2015 +# Roger Pons , 2015 +# Santiago Lamora , 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-01-15 12:25+0000\n" +"Last-Translator: Transifex Bot <>\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 "Lower Sorbian" + +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 "Upper Sorbian" + +msgid "Hungarian" +msgstr "hongarès" + +msgid "Armenian" +msgstr "Armeni" + +msgid "Interlingua" +msgstr "Interlingua" + +msgid "Indonesian" +msgstr "indonesi" + +msgid "Igbo" +msgstr "" + +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 "" + +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 "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 "" + +msgid "Thai" +msgstr "tailandès" + +msgid "Turkmen" +msgstr "" + +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 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 "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 cap." + +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 de coma flotant." + +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 "" + +#, 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 "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 "%d year" +msgid_plural "%d years" +msgstr[0] "%d any" +msgstr[1] "%d anys" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d mes" +msgstr[1] "%d mesos" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d setmana" +msgstr[1] "%d setmanes" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d dia" +msgstr[1] "%d dies" + +#, 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 minut" +msgstr[1] "%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 infiltrat 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ca/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ca/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ca/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ca/formats.py new file mode 100644 index 0000000..746d08f --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ca/formats.py @@ -0,0 +1,30 @@ +# 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 = 'G:i' +DATETIME_FORMAT = r'j \d\e F \d\e Y \a \l\e\s G:i' +YEAR_MONTH_FORMAT = r'F \d\e\l Y' +MONTH_DAY_FORMAT = r'j \d\e 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 = [ + # '31/12/2009', '31/12/09' + '%d/%m/%Y', '%d/%m/%y' +] +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/cs/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/cs/LC_MESSAGES/django.mo new file mode 100644 index 0000000..121d7d4 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/cs/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/cs/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/cs/LC_MESSAGES/django.po new file mode 100644 index 0000000..33c32e1 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/cs/LC_MESSAGES/django.po @@ -0,0 +1,1349 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Claude Paroz , 2020 +# Jannis Leidel , 2011 +# Jan Papež , 2012 +# Jirka Vejrazka , 2011 +# trendspotter, 2020 +# Tomáš Ehrlich , 2015 +# Vláďa Macek , 2012-2014 +# Vláďa Macek , 2015-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-03-18 23:20+0000\n" +"Last-Translator: Vláďa Macek \n" +"Language-Team: Czech (http://www.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 "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 "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 "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 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." + +msgid "Enter a valid IPv4 address." +msgstr "Zadejte platnou adresu typu IPv4." + +msgid "Enter a valid IPv6 address." +msgstr "Zadejte platnou adresu typu IPv6." + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Zadejte platnou adresu typu 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 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 "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 "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 %d form." +msgid_plural "Please submit at most %d forms." +msgstr[0] "Odešlete nejvýše %d formulář." +msgstr[1] "Odešlete nejvýše %d formuláře." +msgstr[2] "Odešlete nejvýše %d formuláře." +msgstr[3] "Odešlete nejvýše %d formulářů." + +#, python-format +msgid "Please submit at least %d form." +msgid_plural "Please submit at least %d forms." +msgstr[0] "Odešlete nejméně %d formulář." +msgstr[1] "Odešlete nejméně %d formuláře." +msgstr[2] "Odešlete nejméně %d formuláře." +msgstr[3] "Odešlete nejméně %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 "%d year" +msgid_plural "%d years" +msgstr[0] "%d rok" +msgstr[1] "%d roky" +msgstr[2] "%d roku" +msgstr[3] "%d let" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d měsíc" +msgstr[1] "%d měsíce" +msgstr[2] "%d měsíců" +msgstr[3] "%d měsíců" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d týden" +msgstr[1] "%d týdny" +msgstr[2] "%d týdne" +msgstr[3] "%d týdnů" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d den" +msgstr[1] "%d dny" +msgstr[2] "%d dní" +msgstr[3] "%d dní" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d hodina" +msgstr[1] "%d hodiny" +msgstr[2] "%d hodiny" +msgstr[3] "%d hodin" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minuta" +msgstr[1] "%d minuty" +msgstr[2] "%d minut" +msgstr[3] "%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 "" +"Tato zpráva se zobrazuje, protože tento web na protokolu HTTPS požaduje " +"záhlaví \"Referer\" od vašeho webového prohlížeče. Záhlaví je požadováno z " +"bezpečnostních důvodů, aby se zajistilo, že vašeho prohlížeče se nezmocnil " +"někdo další." + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/cs/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/cs/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/cs/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/cs/formats.py new file mode 100644 index 0000000..c01af8b --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/cs/formats.py @@ -0,0 +1,40 @@ +# 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', '%d.%m.%y', # '05.01.2006', '05.01.06' + '%d. %m. %Y', '%d. %m. %y', # '5. 1. 2006', '5. 1. 06' + # '%d. %B %Y', '%d. %b. %Y', # '25. October 2006', '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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/cy/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/cy/LC_MESSAGES/django.mo new file mode 100644 index 0000000..ea5b45c Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/cy/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/cy/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/cy/LC_MESSAGES/django.po new file mode 100644 index 0000000..16383ce --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/cy/LC_MESSAGES/django.po @@ -0,0 +1,1278 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/cy/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/cy/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/cy/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/cy/formats.py new file mode 100644 index 0000000..db40cab --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/cy/formats.py @@ -0,0 +1,32 @@ +# 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', '%d/%m/%y', # '25/10/2006', '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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/da/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/da/LC_MESSAGES/django.mo new file mode 100644 index 0000000..e1db921 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/da/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/da/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/da/LC_MESSAGES/django.po new file mode 100644 index 0000000..6bde3e6 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/da/LC_MESSAGES/django.po @@ -0,0 +1,1304 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Christian Joergensen , 2012 +# Danni Randeris , 2014 +# Erik Ramsgaard Wognsen , 2020-2021 +# 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: 2021-01-15 09:00+0100\n" +"PO-Revision-Date: 2021-01-15 18:48+0000\n" +"Last-Translator: Erik Ramsgaard Wognsen \n" +"Language-Team: Danish (http://www.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 "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 "malaysisk" + +msgid "Mongolian" +msgstr "mongolsk" + +msgid "Marathi" +msgstr "Marathi" + +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 "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 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." + +msgid "Enter a valid IPv4 address." +msgstr "Indtast en gyldig IPv4-adresse." + +msgid "Enter a valid IPv6 address." +msgstr "Indtast en gyldig IPv6-adresse." + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Indtast en gyldig IPv4- eller IPv6-adresse." + +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 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 "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 "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 does not exist." +msgstr "%(model)s instans med %(field)s %(value)r findes ikke." + +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 %d form." +msgid_plural "Please submit at most %d forms." +msgstr[0] "Send venligst højst %d formular." +msgstr[1] "Send venligst højst %d formularer." + +#, python-format +msgid "Please submit at least %d form." +msgid_plural "Please submit at least %d forms." +msgstr[0] "Send venligst mindst %d formular." +msgstr[1] "Send venligst mindst %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 "%d year" +msgid_plural "%d years" +msgstr[0] "%d år" +msgstr[1] "%d år" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d måned" +msgstr[1] "%d måneder" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d uge" +msgstr[1] "%d uger" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d dag" +msgstr[1] "%d dage" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d time" +msgstr[1] "%d timer" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minut" +msgstr[1] "%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”, men den blev ikke 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/da/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/da/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/da/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/da/formats.py new file mode 100644 index 0000000..6237a72 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/da/formats.py @@ -0,0 +1,26 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/de/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/de/LC_MESSAGES/django.mo new file mode 100644 index 0000000..09c7bcf Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/de/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/de/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/de/LC_MESSAGES/django.po new file mode 100644 index 0000000..1405164 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/de/LC_MESSAGES/django.po @@ -0,0 +1,1318 @@ +# 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 +# Jannis Vajen, 2011,2013 +# Jannis Leidel , 2013-2018,2020 +# Jannis Vajen, 2016 +# Markus Holtermann , 2013,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-17 07:52+0000\n" +"Last-Translator: Florian Apolloner \n" +"Language-Team: German (http://www.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 "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 "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 "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" + +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 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 "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 "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 "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 "Small integer" +msgstr "Kleine Ganzzahl" + +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" + +msgid "ManagementForm data is missing or has been tampered with" +msgstr "ManagementForm-Daten fehlen oder wurden manipuliert." + +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "Bitte höchstens %d Formular abschicken." +msgstr[1] "Bitte höchstens %d Formulare abschicken." + +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "Bitte %d oder mehr Formulare abschicken." +msgstr[1] "Bitte %d oder mehr 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 "%d year" +msgid_plural "%d years" +msgstr[0] "%d Jahr" +msgstr[1] "%d Jahre" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d Monat" +msgstr[1] "%d Monate" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d Woche" +msgstr[1] "%d Wochen" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d Tag" +msgstr[1] "%d Tage" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d Stunde" +msgstr[1] "%d Stunden" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d Minute" +msgstr[1] "%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 "Django: the Web framework for perfectionists with deadlines." +msgstr "Django: Das Webframework für Perfektionisten mit Termindruck." + +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" +"Versionshinweise für Django %(version)s " +"anzeigen" + +msgid "The install worked successfully! Congratulations!" +msgstr "Die Installation war erfolgreich. Herzlichen Glückwunsch!" + +#, 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/de/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/de/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/de/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/de/formats.py new file mode 100644 index 0000000..7bd5e05 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/de/formats.py @@ -0,0 +1,27 @@ +# 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', '%d.%m.%y', # '25.10.2006', '25.10.06' + # '%d. %B %Y', '%d. %b. %Y', # '25. October 2006', '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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/de_CH/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/de_CH/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/de_CH/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/de_CH/formats.py new file mode 100644 index 0000000..59a9fcb --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/de_CH/formats.py @@ -0,0 +1,33 @@ +# 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', '%d.%m.%y', # '25.10.2006', '25.10.06' + # '%d. %B %Y', '%d. %b. %Y', # '25. October 2006', '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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/dsb/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/dsb/LC_MESSAGES/django.mo new file mode 100644 index 0000000..10059e5 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/dsb/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/dsb/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/dsb/LC_MESSAGES/django.po new file mode 100644 index 0000000..e539a6f --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/dsb/LC_MESSAGES/django.po @@ -0,0 +1,1355 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Michael Wolf , 2016-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-02-01 22:04+0000\n" +"Last-Translator: Michael Wolf \n" +"Language-Team: Lower Sorbian (http://www.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 "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 "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 "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 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." + +msgid "Enter a valid IPv4 address." +msgstr "Zapódajśo płaśiwu IPv4-adresu." + +msgid "Enter a valid IPv6 address." +msgstr "Zapódajśo płaśiwu IPv6-adresu." + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Zapódajśo płaśiwu IPv4- abo IPv6-adresu." + +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 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 "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 "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 does not exist." +msgstr "Instanca %(model)s z %(field)s %(value)r njeeksistěrujo." + +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 %d form." +msgid_plural "Please submit at most %d forms." +msgstr[0] "Pšosym wótposćelśo maksimalnje %d formular." +msgstr[1] "Pšosym wótposćelśo maksimalnje %d formulara." +msgstr[2] "Pšosym wótposćelśo maksimalnje %d formulary." +msgstr[3] "Pšosym wótposćelśo maksimalnje %d formularow." + +#, python-format +msgid "Please submit at least %d form." +msgid_plural "Please submit at least %d forms." +msgstr[0] "Pšosym wótposćelśo minimalnje %d formular." +msgstr[1] "Pšosym wótposćelśo minimalnje %d formulara." +msgstr[2] "Pšosym wótposćelśo minimalnje %d formulary." +msgstr[3] "Pšosym wótposćelśo minimalnje %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 "%d year" +msgid_plural "%d years" +msgstr[0] "%d lěto" +msgstr[1] "%d lěśe" +msgstr[2] "%d lěta" +msgstr[3] "%d lět" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d mjasec" +msgstr[1] "%d mjaseca" +msgstr[2] "%d mjasece" +msgstr[3] "%d mjasecow" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d tyźeń" +msgstr[1] "%d tyéznja" +msgstr[2] "%d tyźenje" +msgstr[3] "%d tyźenjow" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d źeń" +msgstr[1] "%d dnja" +msgstr[2] "%d dny" +msgstr[3] "%d dnjow" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d góźina" +msgstr[1] "%d góźinje" +msgstr[2] "%d góźiny" +msgstr[3] "%d góźin" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minuta" +msgstr[1] "%d minuśe" +msgstr[2] "%d minuty" +msgstr[3] "%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 głowu 'Referer', " +"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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/el/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/el/LC_MESSAGES/django.mo new file mode 100644 index 0000000..e4acdcd Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/el/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/el/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/el/LC_MESSAGES/django.po new file mode 100644 index 0000000..dd6b95a --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/el/LC_MESSAGES/django.po @@ -0,0 +1,1332 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Apostolis Bessas , 2013 +# Dimitris Glezos , 2011,2013,2017 +# 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-01-15 09:00+0100\n" +"PO-Revision-Date: 2021-01-15 12:25+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 "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] "" +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 "Η τιμή δεν είναι ίση με την αντίστοιχη τιμή του γονικού 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 "%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 "" +"Βλέπετε αυτό το μήνυμα επειδή αυτή η HTTPS σελίδα απαιτεί από τον Web " +"browser σας να σταλεί ένας 'Referer header', όμως τίποτα δεν στάλθηκε. Αυτός " +"ο header είναι απαραίτητος για λόγους ασφαλείας, για να εξασφαλιστεί ότι ο " +"browser δεν έχει γίνει hijacked από τρίτους." + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/el/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/el/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/el/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/el/formats.py new file mode 100644 index 0000000..8d3175a --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/el/formats.py @@ -0,0 +1,32 @@ +# 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', '%d/%m/%y', '%Y-%m-%d', # '25/10/2006', '25/10/06', '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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/en/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/en/LC_MESSAGES/django.mo new file mode 100644 index 0000000..0d4c976 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/en/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/en/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/en/LC_MESSAGES/django.po new file mode 100644 index 0000000..e3d7690 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/en/LC_MESSAGES/django.po @@ -0,0 +1,1570 @@ +# 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: 2021-01-15 09:00+0100\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:52 +msgid "Afrikaans" +msgstr "" + +#: conf/global_settings.py:53 +msgid "Arabic" +msgstr "" + +#: conf/global_settings.py:54 +msgid "Algerian Arabic" +msgstr "" + +#: conf/global_settings.py:55 +msgid "Asturian" +msgstr "" + +#: conf/global_settings.py:56 +msgid "Azerbaijani" +msgstr "" + +#: conf/global_settings.py:57 +msgid "Bulgarian" +msgstr "" + +#: conf/global_settings.py:58 +msgid "Belarusian" +msgstr "" + +#: conf/global_settings.py:59 +msgid "Bengali" +msgstr "" + +#: conf/global_settings.py:60 +msgid "Breton" +msgstr "" + +#: conf/global_settings.py:61 +msgid "Bosnian" +msgstr "" + +#: conf/global_settings.py:62 +msgid "Catalan" +msgstr "" + +#: conf/global_settings.py:63 +msgid "Czech" +msgstr "" + +#: conf/global_settings.py:64 +msgid "Welsh" +msgstr "" + +#: conf/global_settings.py:65 +msgid "Danish" +msgstr "" + +#: conf/global_settings.py:66 +msgid "German" +msgstr "" + +#: conf/global_settings.py:67 +msgid "Lower Sorbian" +msgstr "" + +#: conf/global_settings.py:68 +msgid "Greek" +msgstr "" + +#: conf/global_settings.py:69 +msgid "English" +msgstr "" + +#: conf/global_settings.py:70 +msgid "Australian English" +msgstr "" + +#: conf/global_settings.py:71 +msgid "British English" +msgstr "" + +#: conf/global_settings.py:72 +msgid "Esperanto" +msgstr "" + +#: conf/global_settings.py:73 +msgid "Spanish" +msgstr "" + +#: conf/global_settings.py:74 +msgid "Argentinian Spanish" +msgstr "" + +#: conf/global_settings.py:75 +msgid "Colombian Spanish" +msgstr "" + +#: conf/global_settings.py:76 +msgid "Mexican Spanish" +msgstr "" + +#: conf/global_settings.py:77 +msgid "Nicaraguan Spanish" +msgstr "" + +#: conf/global_settings.py:78 +msgid "Venezuelan Spanish" +msgstr "" + +#: conf/global_settings.py:79 +msgid "Estonian" +msgstr "" + +#: conf/global_settings.py:80 +msgid "Basque" +msgstr "" + +#: conf/global_settings.py:81 +msgid "Persian" +msgstr "" + +#: conf/global_settings.py:82 +msgid "Finnish" +msgstr "" + +#: conf/global_settings.py:83 +msgid "French" +msgstr "" + +#: conf/global_settings.py:84 +msgid "Frisian" +msgstr "" + +#: conf/global_settings.py:85 +msgid "Irish" +msgstr "" + +#: conf/global_settings.py:86 +msgid "Scottish Gaelic" +msgstr "" + +#: conf/global_settings.py:87 +msgid "Galician" +msgstr "" + +#: conf/global_settings.py:88 +msgid "Hebrew" +msgstr "" + +#: conf/global_settings.py:89 +msgid "Hindi" +msgstr "" + +#: conf/global_settings.py:90 +msgid "Croatian" +msgstr "" + +#: conf/global_settings.py:91 +msgid "Upper Sorbian" +msgstr "" + +#: conf/global_settings.py:92 +msgid "Hungarian" +msgstr "" + +#: conf/global_settings.py:93 +msgid "Armenian" +msgstr "" + +#: conf/global_settings.py:94 +msgid "Interlingua" +msgstr "" + +#: conf/global_settings.py:95 +msgid "Indonesian" +msgstr "" + +#: conf/global_settings.py:96 +msgid "Igbo" +msgstr "" + +#: conf/global_settings.py:97 +msgid "Ido" +msgstr "" + +#: conf/global_settings.py:98 +msgid "Icelandic" +msgstr "" + +#: conf/global_settings.py:99 +msgid "Italian" +msgstr "" + +#: conf/global_settings.py:100 +msgid "Japanese" +msgstr "" + +#: conf/global_settings.py:101 +msgid "Georgian" +msgstr "" + +#: conf/global_settings.py:102 +msgid "Kabyle" +msgstr "" + +#: conf/global_settings.py:103 +msgid "Kazakh" +msgstr "" + +#: conf/global_settings.py:104 +msgid "Khmer" +msgstr "" + +#: conf/global_settings.py:105 +msgid "Kannada" +msgstr "" + +#: conf/global_settings.py:106 +msgid "Korean" +msgstr "" + +#: conf/global_settings.py:107 +msgid "Kyrgyz" +msgstr "" + +#: conf/global_settings.py:108 +msgid "Luxembourgish" +msgstr "" + +#: conf/global_settings.py:109 +msgid "Lithuanian" +msgstr "" + +#: conf/global_settings.py:110 +msgid "Latvian" +msgstr "" + +#: conf/global_settings.py:111 +msgid "Macedonian" +msgstr "" + +#: conf/global_settings.py:112 +msgid "Malayalam" +msgstr "" + +#: conf/global_settings.py:113 +msgid "Mongolian" +msgstr "" + +#: conf/global_settings.py:114 +msgid "Marathi" +msgstr "" + +#: conf/global_settings.py:115 +msgid "Burmese" +msgstr "" + +#: conf/global_settings.py:116 +msgid "Norwegian Bokmål" +msgstr "" + +#: conf/global_settings.py:117 +msgid "Nepali" +msgstr "" + +#: conf/global_settings.py:118 +msgid "Dutch" +msgstr "" + +#: conf/global_settings.py:119 +msgid "Norwegian Nynorsk" +msgstr "" + +#: conf/global_settings.py:120 +msgid "Ossetic" +msgstr "" + +#: conf/global_settings.py:121 +msgid "Punjabi" +msgstr "" + +#: conf/global_settings.py:122 +msgid "Polish" +msgstr "" + +#: conf/global_settings.py:123 +msgid "Portuguese" +msgstr "" + +#: conf/global_settings.py:124 +msgid "Brazilian Portuguese" +msgstr "" + +#: conf/global_settings.py:125 +msgid "Romanian" +msgstr "" + +#: conf/global_settings.py:126 +msgid "Russian" +msgstr "" + +#: conf/global_settings.py:127 +msgid "Slovak" +msgstr "" + +#: conf/global_settings.py:128 +msgid "Slovenian" +msgstr "" + +#: conf/global_settings.py:129 +msgid "Albanian" +msgstr "" + +#: conf/global_settings.py:130 +msgid "Serbian" +msgstr "" + +#: conf/global_settings.py:131 +msgid "Serbian Latin" +msgstr "" + +#: conf/global_settings.py:132 +msgid "Swedish" +msgstr "" + +#: conf/global_settings.py:133 +msgid "Swahili" +msgstr "" + +#: conf/global_settings.py:134 +msgid "Tamil" +msgstr "" + +#: conf/global_settings.py:135 +msgid "Telugu" +msgstr "" + +#: conf/global_settings.py:136 +msgid "Tajik" +msgstr "" + +#: conf/global_settings.py:137 +msgid "Thai" +msgstr "" + +#: conf/global_settings.py:138 +msgid "Turkmen" +msgstr "" + +#: conf/global_settings.py:139 +msgid "Turkish" +msgstr "" + +#: conf/global_settings.py:140 +msgid "Tatar" +msgstr "" + +#: conf/global_settings.py:141 +msgid "Udmurt" +msgstr "" + +#: conf/global_settings.py:142 +msgid "Ukrainian" +msgstr "" + +#: conf/global_settings.py:143 +msgid "Urdu" +msgstr "" + +#: conf/global_settings.py:144 +msgid "Uzbek" +msgstr "" + +#: conf/global_settings.py:145 +msgid "Vietnamese" +msgstr "" + +#: conf/global_settings.py:146 +msgid "Simplified Chinese" +msgstr "" + +#: conf/global_settings.py:147 +msgid "Traditional Chinese" +msgstr "" + +#: contrib/messages/apps.py:7 +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:51 +msgid "That page number is not an integer" +msgstr "" + +#: core/paginator.py:53 +msgid "That page number is less than 1" +msgstr "" + +#: core/paginator.py:58 +msgid "That page contains no results" +msgstr "" + +#: core/validators.py:22 +msgid "Enter a valid value." +msgstr "" + +#: core/validators.py:93 forms/fields.py:664 +msgid "Enter a valid URL." +msgstr "" + +#: core/validators.py:147 +msgid "Enter a valid integer." +msgstr "" + +#: core/validators.py:158 +msgid "Enter a valid email address." +msgstr "" + +#. 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 "" + +#: core/validators.py:266 +msgid "" +"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" + +#: core/validators.py:275 core/validators.py:295 +msgid "Enter a valid IPv4 address." +msgstr "" + +#: core/validators.py:280 core/validators.py:296 +msgid "Enter a valid IPv6 address." +msgstr "" + +#: core/validators.py:290 core/validators.py:294 +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "" + +#: core/validators.py:324 +msgid "Enter only digits separated by commas." +msgstr "" + +#: core/validators.py:330 +#, python-format +msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." +msgstr "" + +#: core/validators.py:363 +#, python-format +msgid "Ensure this value is less than or equal to %(limit_value)s." +msgstr "" + +#: core/validators.py:372 +#, python-format +msgid "Ensure this value is greater than or equal to %(limit_value)s." +msgstr "" + +#: core/validators.py:382 +#, 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:397 +#, 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:416 forms/fields.py:292 forms/fields.py:327 +msgid "Enter a number." +msgstr "" + +#: core/validators.py:418 +#, 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:423 +#, 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:428 +#, 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:490 +#, python-format +msgid "" +"File extension “%(extension)s” is not allowed. Allowed extensions are: " +"%(allowed_extensions)s." +msgstr "" + +#: core/validators.py:543 +msgid "Null characters are not allowed." +msgstr "" + +#: db/models/base.py:1197 forms/models.py:768 +msgid "and" +msgstr "" + +#: db/models/base.py:1199 +#, python-format +msgid "%(model_name)s with this %(field_labels)s already exists." +msgstr "" + +#: db/models/fields/__init__.py:100 +#, python-format +msgid "Value %(value)r is not a valid choice." +msgstr "" + +#: db/models/fields/__init__.py:101 +msgid "This field cannot be null." +msgstr "" + +#: db/models/fields/__init__.py:102 +msgid "This field cannot be blank." +msgstr "" + +#: db/models/fields/__init__.py:103 +#, 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:107 +#, python-format +msgid "" +"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." +msgstr "" + +#: db/models/fields/__init__.py:126 +#, python-format +msgid "Field of type: %(field_type)s" +msgstr "" + +#: db/models/fields/__init__.py:958 +#, python-format +msgid "“%(value)s” value must be either True or False." +msgstr "" + +#: db/models/fields/__init__.py:959 +#, python-format +msgid "“%(value)s” value must be either True, False, or None." +msgstr "" + +#: db/models/fields/__init__.py:961 +msgid "Boolean (Either True or False)" +msgstr "" + +#: db/models/fields/__init__.py:1002 +#, python-format +msgid "String (up to %(max_length)s)" +msgstr "" + +#: db/models/fields/__init__.py:1096 +msgid "Comma-separated integers" +msgstr "" + +#: db/models/fields/__init__.py:1145 +#, 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:1147 db/models/fields/__init__.py:1290 +#, 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:1150 +msgid "Date (without time)" +msgstr "" + +#: db/models/fields/__init__.py:1288 +#, 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:1292 +#, 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:1296 +msgid "Date (with time)" +msgstr "" + +#: db/models/fields/__init__.py:1444 +#, python-format +msgid "“%(value)s” value must be a decimal number." +msgstr "" + +#: db/models/fields/__init__.py:1446 +msgid "Decimal number" +msgstr "" + +#: db/models/fields/__init__.py:1585 +#, 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:1588 +msgid "Duration" +msgstr "" + +#: db/models/fields/__init__.py:1638 +msgid "Email address" +msgstr "" + +#: db/models/fields/__init__.py:1661 +msgid "File path" +msgstr "" + +#: db/models/fields/__init__.py:1727 +#, python-format +msgid "“%(value)s” value must be a float." +msgstr "" + +#: db/models/fields/__init__.py:1729 +msgid "Floating point number" +msgstr "" + +#: db/models/fields/__init__.py:1767 +#, python-format +msgid "“%(value)s” value must be an integer." +msgstr "" + +#: db/models/fields/__init__.py:1769 +msgid "Integer" +msgstr "" + +#: db/models/fields/__init__.py:1852 +msgid "Big (8 byte) integer" +msgstr "" + +#: db/models/fields/__init__.py:1867 +msgid "Small integer" +msgstr "" + +#: db/models/fields/__init__.py:1875 +msgid "IPv4 address" +msgstr "" + +#: db/models/fields/__init__.py:1906 +msgid "IP address" +msgstr "" + +#: db/models/fields/__init__.py:1986 db/models/fields/__init__.py:1987 +#, python-format +msgid "“%(value)s” value must be either None, True or False." +msgstr "" + +#: db/models/fields/__init__.py:1989 +msgid "Boolean (Either True, False or None)" +msgstr "" + +#: db/models/fields/__init__.py:2043 +msgid "Positive big integer" +msgstr "" + +#: db/models/fields/__init__.py:2056 +msgid "Positive integer" +msgstr "" + +#: db/models/fields/__init__.py:2069 +msgid "Positive small integer" +msgstr "" + +#: db/models/fields/__init__.py:2083 +#, python-format +msgid "Slug (up to %(max_length)s)" +msgstr "" + +#: db/models/fields/__init__.py:2115 +msgid "Text" +msgstr "" + +#: db/models/fields/__init__.py:2181 +#, 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:2183 +#, 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:2186 +msgid "Time" +msgstr "" + +#: db/models/fields/__init__.py:2312 +msgid "URL" +msgstr "" + +#: db/models/fields/__init__.py:2334 +msgid "Raw binary data" +msgstr "" + +#: db/models/fields/__init__.py:2399 +#, python-format +msgid "“%(value)s” is not a valid UUID." +msgstr "" + +#: db/models/fields/__init__.py:2401 +msgid "Universally unique identifier" +msgstr "" + +#: db/models/fields/files.py:225 +msgid "File" +msgstr "" + +#: db/models/fields/files.py:373 +msgid "Image" +msgstr "" + +#: db/models/fields/json.py:18 +msgid "A JSON object" +msgstr "" + +#: db/models/fields/json.py:20 +msgid "Value must be valid JSON." +msgstr "" + +#: db/models/fields/related.py:790 +#, python-format +msgid "%(model)s instance with %(field)s %(value)r does not exist." +msgstr "" + +#: db/models/fields/related.py:792 +msgid "Foreign Key (type determined by related field)" +msgstr "" + +#: db/models/fields/related.py:1045 +msgid "One-to-one relationship" +msgstr "" + +#: db/models/fields/related.py:1099 +#, python-format +msgid "%(from)s-%(to)s relationship" +msgstr "" + +#: db/models/fields/related.py:1100 +#, python-format +msgid "%(from)s-%(to)s relationships" +msgstr "" + +#: db/models/fields/related.py:1142 +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:150 +msgid ":?.!" +msgstr "" + +#: forms/fields.py:54 +msgid "This field is required." +msgstr "" + +#: forms/fields.py:247 +msgid "Enter a whole number." +msgstr "" + +#: forms/fields.py:391 forms/fields.py:1132 +msgid "Enter a valid date." +msgstr "" + +#: forms/fields.py:415 forms/fields.py:1133 +msgid "Enter a valid time." +msgstr "" + +#: forms/fields.py:443 +msgid "Enter a valid date/time." +msgstr "" + +#: forms/fields.py:477 +msgid "Enter a valid duration." +msgstr "" + +#: forms/fields.py:478 +#, python-brace-format +msgid "The number of days must be between {min_days} and {max_days}." +msgstr "" + +#: forms/fields.py:538 +msgid "No file was submitted. Check the encoding type on the form." +msgstr "" + +#: forms/fields.py:539 +msgid "No file was submitted." +msgstr "" + +#: forms/fields.py:540 +msgid "The submitted file is empty." +msgstr "" + +#: forms/fields.py:542 +#, 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:545 +msgid "Please either submit a file or check the clear checkbox, not both." +msgstr "" + +#: forms/fields.py:606 +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" + +#: forms/fields.py:768 forms/fields.py:858 forms/models.py:1309 +#, python-format +msgid "Select a valid choice. %(value)s is not one of the available choices." +msgstr "" + +#: forms/fields.py:859 forms/fields.py:974 forms/models.py:1308 +msgid "Enter a list of values." +msgstr "" + +#: forms/fields.py:975 +msgid "Enter a complete value." +msgstr "" + +#: forms/fields.py:1191 +msgid "Enter a valid UUID." +msgstr "" + +#: forms/fields.py:1221 +msgid "Enter a valid JSON." +msgstr "" + +#. Translators: This is the default suffix added to form field labels +#: forms/forms.py:76 +msgid ":" +msgstr "" + +#: forms/forms.py:203 +#, 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:370 +#, python-format +msgid "Please submit at most %d form." +msgid_plural "Please submit at most %d forms." +msgstr[0] "" +msgstr[1] "" + +#: forms/formsets.py:377 +#, python-format +msgid "Please submit at least %d form." +msgid_plural "Please submit at least %d forms." +msgstr[0] "" +msgstr[1] "" + +#: forms/formsets.py:405 forms/formsets.py:412 +msgid "Order" +msgstr "" + +#: forms/formsets.py:417 +msgid "Delete" +msgstr "" + +#: forms/models.py:763 +#, python-format +msgid "Please correct the duplicate data for %(field)s." +msgstr "" + +#: forms/models.py:767 +#, python-format +msgid "Please correct the duplicate data for %(field)s, which must be unique." +msgstr "" + +#: forms/models.py:773 +#, 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:782 +msgid "Please correct the duplicate values below." +msgstr "" + +#: forms/models.py:1109 +msgid "The inline value did not match the parent instance." +msgstr "" + +#: forms/models.py:1193 +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "" + +#: forms/models.py:1311 +#, python-format +msgid "“%(pk)s” is not a valid value." +msgstr "" + +#: forms/utils.py:167 +#, 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:403 +msgid "Clear" +msgstr "" + +#: forms/widgets.py:404 +msgid "Currently" +msgstr "" + +#: forms/widgets.py:405 +msgid "Change" +msgstr "" + +#: forms/widgets.py:714 +msgid "Unknown" +msgstr "" + +#: forms/widgets.py:715 +msgid "Yes" +msgstr "" + +#: forms/widgets.py:716 +msgid "No" +msgstr "" + +#. Translators: Please do not add spaces around commas. +#: template/defaultfilters.py:805 +msgid "yes,no,maybe" +msgstr "" + +#: template/defaultfilters.py:834 template/defaultfilters.py:851 +#, python-format +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "" +msgstr[1] "" + +#: template/defaultfilters.py:853 +#, python-format +msgid "%s KB" +msgstr "" + +#: template/defaultfilters.py:855 +#, python-format +msgid "%s MB" +msgstr "" + +#: template/defaultfilters.py:857 +#, python-format +msgid "%s GB" +msgstr "" + +#: template/defaultfilters.py:859 +#, python-format +msgid "%s TB" +msgstr "" + +#: template/defaultfilters.py:861 +#, python-format +msgid "%s PB" +msgstr "" + +#: utils/dateformat.py:65 +msgid "p.m." +msgstr "" + +#: utils/dateformat.py:66 +msgid "a.m." +msgstr "" + +#: utils/dateformat.py:71 +msgid "PM" +msgstr "" + +#: utils/dateformat.py:72 +msgid "AM" +msgstr "" + +#: utils/dateformat.py:145 +msgid "midnight" +msgstr "" + +#: utils/dateformat.py:147 +msgid "noon" +msgstr "" + +#: utils/dates.py:6 +msgid "Monday" +msgstr "" + +#: utils/dates.py:6 +msgid "Tuesday" +msgstr "" + +#: utils/dates.py:6 +msgid "Wednesday" +msgstr "" + +#: utils/dates.py:6 +msgid "Thursday" +msgstr "" + +#: utils/dates.py:6 +msgid "Friday" +msgstr "" + +#: utils/dates.py:7 +msgid "Saturday" +msgstr "" + +#: utils/dates.py:7 +msgid "Sunday" +msgstr "" + +#: utils/dates.py:10 +msgid "Mon" +msgstr "" + +#: utils/dates.py:10 +msgid "Tue" +msgstr "" + +#: utils/dates.py:10 +msgid "Wed" +msgstr "" + +#: utils/dates.py:10 +msgid "Thu" +msgstr "" + +#: utils/dates.py:10 +msgid "Fri" +msgstr "" + +#: utils/dates.py:11 +msgid "Sat" +msgstr "" + +#: utils/dates.py:11 +msgid "Sun" +msgstr "" + +#: utils/dates.py:14 +msgid "January" +msgstr "" + +#: utils/dates.py:14 +msgid "February" +msgstr "" + +#: utils/dates.py:14 +msgid "March" +msgstr "" + +#: utils/dates.py:14 +msgid "April" +msgstr "" + +#: utils/dates.py:14 +msgid "May" +msgstr "" + +#: utils/dates.py:14 +msgid "June" +msgstr "" + +#: utils/dates.py:15 +msgid "July" +msgstr "" + +#: utils/dates.py:15 +msgid "August" +msgstr "" + +#: utils/dates.py:15 +msgid "September" +msgstr "" + +#: utils/dates.py:15 +msgid "October" +msgstr "" + +#: utils/dates.py:15 +msgid "November" +msgstr "" + +#: utils/dates.py:16 +msgid "December" +msgstr "" + +#: utils/dates.py:19 +msgid "jan" +msgstr "" + +#: utils/dates.py:19 +msgid "feb" +msgstr "" + +#: utils/dates.py:19 +msgid "mar" +msgstr "" + +#: utils/dates.py:19 +msgid "apr" +msgstr "" + +#: utils/dates.py:19 +msgid "may" +msgstr "" + +#: utils/dates.py:19 +msgid "jun" +msgstr "" + +#: utils/dates.py:20 +msgid "jul" +msgstr "" + +#: utils/dates.py:20 +msgid "aug" +msgstr "" + +#: utils/dates.py:20 +msgid "sep" +msgstr "" + +#: utils/dates.py:20 +msgid "oct" +msgstr "" + +#: utils/dates.py:20 +msgid "nov" +msgstr "" + +#: utils/dates.py:20 +msgid "dec" +msgstr "" + +#: utils/dates.py:23 +msgctxt "abbrev. month" +msgid "Jan." +msgstr "" + +#: utils/dates.py:24 +msgctxt "abbrev. month" +msgid "Feb." +msgstr "" + +#: utils/dates.py:25 +msgctxt "abbrev. month" +msgid "March" +msgstr "" + +#: utils/dates.py:26 +msgctxt "abbrev. month" +msgid "April" +msgstr "" + +#: utils/dates.py:27 +msgctxt "abbrev. month" +msgid "May" +msgstr "" + +#: utils/dates.py:28 +msgctxt "abbrev. month" +msgid "June" +msgstr "" + +#: utils/dates.py:29 +msgctxt "abbrev. month" +msgid "July" +msgstr "" + +#: utils/dates.py:30 +msgctxt "abbrev. month" +msgid "Aug." +msgstr "" + +#: utils/dates.py:31 +msgctxt "abbrev. month" +msgid "Sept." +msgstr "" + +#: utils/dates.py:32 +msgctxt "abbrev. month" +msgid "Oct." +msgstr "" + +#: utils/dates.py:33 +msgctxt "abbrev. month" +msgid "Nov." +msgstr "" + +#: utils/dates.py:34 +msgctxt "abbrev. month" +msgid "Dec." +msgstr "" + +#: utils/dates.py:37 +msgctxt "alt. month" +msgid "January" +msgstr "" + +#: utils/dates.py:38 +msgctxt "alt. month" +msgid "February" +msgstr "" + +#: utils/dates.py:39 +msgctxt "alt. month" +msgid "March" +msgstr "" + +#: utils/dates.py:40 +msgctxt "alt. month" +msgid "April" +msgstr "" + +#: utils/dates.py:41 +msgctxt "alt. month" +msgid "May" +msgstr "" + +#: utils/dates.py:42 +msgctxt "alt. month" +msgid "June" +msgstr "" + +#: utils/dates.py:43 +msgctxt "alt. month" +msgid "July" +msgstr "" + +#: utils/dates.py:44 +msgctxt "alt. month" +msgid "August" +msgstr "" + +#: utils/dates.py:45 +msgctxt "alt. month" +msgid "September" +msgstr "" + +#: utils/dates.py:46 +msgctxt "alt. month" +msgid "October" +msgstr "" + +#: utils/dates.py:47 +msgctxt "alt. month" +msgid "November" +msgstr "" + +#: utils/dates.py:48 +msgctxt "alt. month" +msgid "December" +msgstr "" + +#: utils/ipv6.py:8 +msgid "This is not a valid IPv6 address." +msgstr "" + +#: utils/text.py:70 +#, python-format +msgctxt "String to return when truncating text" +msgid "%(truncated_text)s…" +msgstr "" + +#: utils/text.py:236 +msgid "or" +msgstr "" + +#. Translators: This string is used as a separator between list elements +#: utils/text.py:255 utils/timesince.py:94 +msgid ", " +msgstr "" + +#: utils/timesince.py:9 +#, python-format +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "" +msgstr[1] "" + +#: utils/timesince.py:10 +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "" +msgstr[1] "" + +#: utils/timesince.py:11 +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "" +msgstr[1] "" + +#: utils/timesince.py:12 +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "" +msgstr[1] "" + +#: utils/timesince.py:13 +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "" +msgstr[1] "" + +#: utils/timesince.py:14 +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "" +msgstr[1] "" + +#: views/csrf.py:110 +msgid "Forbidden" +msgstr "" + +#: views/csrf.py:111 +msgid "CSRF verification failed. Request aborted." +msgstr "" + +#: views/csrf.py:115 +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:120 +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:124 +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:132 +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:137 +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:142 +msgid "More information is available with DEBUG=True." +msgstr "" + +#: views/generic/dates.py:41 +msgid "No year specified" +msgstr "" + +#: views/generic/dates.py:61 views/generic/dates.py:111 +#: views/generic/dates.py:208 +msgid "Date out of range" +msgstr "" + +#: views/generic/dates.py:90 +msgid "No month specified" +msgstr "" + +#: views/generic/dates.py:142 +msgid "No day specified" +msgstr "" + +#: views/generic/dates.py:188 +msgid "No week specified" +msgstr "" + +#: views/generic/dates.py:338 views/generic/dates.py:367 +#, python-format +msgid "No %(verbose_name_plural)s available" +msgstr "" + +#: views/generic/dates.py:594 +#, python-format +msgid "" +"Future %(verbose_name_plural)s not available because %(class_name)s." +"allow_future is False." +msgstr "" + +#: views/generic/dates.py:628 +#, python-format +msgid "Invalid date string “%(datestr)s” given format “%(format)s”" +msgstr "" + +#: views/generic/detail.py:54 +#, python-format +msgid "No %(verbose_name)s found matching the query" +msgstr "" + +#: views/generic/list.py:67 +msgid "Page is not “last”, nor can it be converted to an int." +msgstr "" + +#: views/generic/list.py:72 +#, python-format +msgid "Invalid page (%(page_number)s): %(message)s" +msgstr "" + +#: views/generic/list.py:154 +#, python-format +msgid "Empty list and “%(class_name)s.allow_empty” is False." +msgstr "" + +#: views/static.py:40 +msgid "Directory indexes are not allowed here." +msgstr "" + +#: views/static.py:42 +#, python-format +msgid "“%(path)s” does not exist" +msgstr "" + +#: views/static.py:80 +#, python-format +msgid "Index of %(directory)s" +msgstr "" + +#: views/templates/default_urlconf.html:7 +#: views/templates/default_urlconf.html:221 +msgid "The install worked successfully! Congratulations!" +msgstr "" + +#: views/templates/default_urlconf.html:207 +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" + +#: views/templates/default_urlconf.html:222 +#, 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:230 +msgid "Django Documentation" +msgstr "" + +#: views/templates/default_urlconf.html:231 +msgid "Topics, references, & how-to’s" +msgstr "" + +#: views/templates/default_urlconf.html:239 +msgid "Tutorial: A Polling App" +msgstr "" + +#: views/templates/default_urlconf.html:240 +msgid "Get started with Django" +msgstr "" + +#: views/templates/default_urlconf.html:248 +msgid "Django Community" +msgstr "" + +#: views/templates/default_urlconf.html:249 +msgid "Connect, get help, or contribute" +msgstr "" diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/en/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/en/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/en/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/en/formats.py new file mode 100644 index 0000000..ccace3d --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/en/formats.py @@ -0,0 +1,37 @@ +# 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', '%m/%d/%Y', '%m/%d/%y', # '2006-10-25', '10/25/2006', '10/25/06' + # '%b %d %Y', '%b %d, %Y', # 'Oct 25 2006', 'Oct 25, 2006' + # '%d %b %Y', '%d %b, %Y', # '25 Oct 2006', '25 Oct, 2006' + # '%B %d %Y', '%B %d, %Y', # 'October 25 2006', 'October 25, 2006' + # '%d %B %Y', '%d %B, %Y', # '25 October 2006', '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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/en_AU/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/en_AU/LC_MESSAGES/django.mo new file mode 100644 index 0000000..2850447 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/en_AU/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/en_AU/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/en_AU/LC_MESSAGES/django.po new file mode 100644 index 0000000..a7e39e6 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/en_AU/LC_MESSAGES/django.po @@ -0,0 +1,1231 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Tom Fifield , 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: 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 "Asturian" +msgstr "" + +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 "" + +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 "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 "" + +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 "Interlingua" + +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 "Luxembourgish" + +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 "Burmese" + +msgid "Norwegian Bokmål" +msgstr "" + +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 "Thai" +msgstr "Thai" + +msgid "Turkish" +msgstr "Turkish" + +msgid "Tatar" +msgstr "Tatar" + +msgid "Udmurt" +msgstr "Udmurt" + +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 "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 "" + +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] "" +"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 "" + +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 "Raw binary data" + +#, 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] "" +"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 "" + +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 "(Hidden field %(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] "Please submit %d or fewer forms." +msgstr[1] "Please submit %d or fewer forms." + +#, 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] "%d year" +msgstr[1] "%d years" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d month" +msgstr[1] "%d months" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d week" +msgstr[1] "%d weeks" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d day" +msgstr[1] "%d days" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d hour" +msgstr[1] "%d hours" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minute" +msgstr[1] "%d minutes" + +msgid "0 minutes" +msgstr "0 minutes" + +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 "Invalid page (%(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 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/en_AU/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/en_AU/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/en_AU/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/en_AU/formats.py new file mode 100644 index 0000000..310577c --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/en_AU/formats.py @@ -0,0 +1,36 @@ +# 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', '%d/%m/%y', # '25/10/2006', '25/10/06' + # '%b %d %Y', '%b %d, %Y', # 'Oct 25 2006', 'Oct 25, 2006' + # '%d %b %Y', '%d %b, %Y', # '25 Oct 2006', '25 Oct, 2006' + # '%B %d %Y', '%B %d, %Y', # 'October 25 2006', 'October 25, 2006' + # '%d %B %Y', '%d %B, %Y', # '25 October 2006', '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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/en_GB/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/en_GB/LC_MESSAGES/django.mo new file mode 100644 index 0000000..bc4b2cc Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/en_GB/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/en_GB/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/en_GB/LC_MESSAGES/django.po new file mode 100644 index 0000000..348adb0 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/en_GB/LC_MESSAGES/django.po @@ -0,0 +1,1221 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/en_GB/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/en_GB/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/en_GB/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/en_GB/formats.py new file mode 100644 index 0000000..8895179 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/en_GB/formats.py @@ -0,0 +1,36 @@ +# 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', '%d/%m/%y', # '25/10/2006', '25/10/06' + # '%b %d %Y', '%b %d, %Y', # 'Oct 25 2006', 'Oct 25, 2006' + # '%d %b %Y', '%d %b, %Y', # '25 Oct 2006', '25 Oct, 2006' + # '%B %d %Y', '%B %d, %Y', # 'October 25 2006', 'October 25, 2006' + # '%d %B %Y', '%d %B, %Y', # '25 October 2006', '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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/eo/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/eo/LC_MESSAGES/django.mo new file mode 100644 index 0000000..e606154 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/eo/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/eo/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/eo/LC_MESSAGES/django.po new file mode 100644 index 0000000..72d36b0 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/eo/LC_MESSAGES/django.po @@ -0,0 +1,1275 @@ +# 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 +# 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: 2021-01-15 09:00+0100\n" +"PO-Revision-Date: 2021-04-13 08:22+0000\n" +"Last-Translator: Matthieu Desplantes \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 "Lukszemburga" + +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 "Burmese" +msgstr "Birma" + +msgid "Norwegian Bokmål" +msgstr "Norvega Bbokmå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 "Tuo paĝnumero ne estas entjero" + +msgid "That page number is less than 1" +msgstr "Tuo 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 validan valoron." + +msgid "Enter a valid URL." +msgstr "Enigu validan adreson." + +msgid "Enter a valid integer." +msgstr "Enigu validan entjero." + +msgid "Enter a valid email address." +msgstr "Enigu validan 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 "" + +msgid "" +"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" + +msgid "Enter a valid IPv4 address." +msgstr "Enigu validan IPv4-adreson." + +msgid "Enter a valid IPv6 address." +msgstr "Enigu validan IPv6-adreson." + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Enigu validan 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 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 tiu valoro havas %(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 tiu valoro maksimume havas %(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 "" + +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 "Value %(value)r is not a valid choice." +msgstr "Valoro %(value)r ne estas valida 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 "" + +#, python-format +msgid "“%(value)s” value must be either True, False, or None." +msgstr "" + +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 "Kom-apartigitaj 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 "" + +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 "Dekuma nombro" + +#, python-format +msgid "" +"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." +"uuuuuu] format." +msgstr "" + +msgid "Duration" +msgstr "Daŭro" + +msgid "Email address" +msgstr "Retpoŝtadreso" + +msgid "File path" +msgstr "Dosiervojo" + +#, python-format +msgid "“%(value)s” value must be a float." +msgstr "" + +msgid "Floating point number" +msgstr "Glitkoma 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 "" + +msgid "Boolean (Either True, False or None)" +msgstr "Buleo (Vera, Malvera aŭ Neniu)" + +msgid "Positive big integer" +msgstr "" + +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 "" + +#, 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 "Universe unika identigilo" + +msgid "File" +msgstr "Dosiero" + +msgid "Image" +msgstr "Bildo" + +msgid "A JSON object" +msgstr "JSON-objekto" + +msgid "Value must be valid JSON." +msgstr "" + +#, python-format +msgid "%(model)s instance with %(field)s %(value)r does not exist." +msgstr "%(model)s kazo kun %(field)s %(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 validan daton." + +msgid "Enter a valid time." +msgstr "Enigu validan horon." + +msgid "Enter a valid date/time." +msgstr "Enigu validan daton/tempon." + +msgid "Enter a valid duration." +msgstr "Enigu validan daŭron." + +#, python-brace-format +msgid "The number of days must be between {min_days} and {max_days}." +msgstr "La nombro da 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 tiu 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 malplenan markobutonon, ne ambaŭ." + +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" +"Alŝutu validan 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 validan elekton. %(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 validan UUID-n." + +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 "(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 "" + +#, 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 "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 aperon." + +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "Elektu validan elekton. Ĉi tiu elekto ne estas el la eblaj elektoj." + +#, 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 "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 "marto" + +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 "Tiu ne estas valida 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 "%d year" +msgid_plural "%d years" +msgstr[0] "%d jaro" +msgstr[1] "%d jaroj" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d monato" +msgstr[1] "%d monatoj" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d semajno" +msgstr[1] "%d semajnoj" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d tago" +msgstr[1] "%d tagoj" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d horo" +msgstr[1] "%d horoj" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minuto" +msgstr[1] "%d minutoj" + +msgid "Forbidden" +msgstr "Malpermesa" + +msgid "CSRF verification failed. Request aborted." +msgstr "CSRF konfirmo 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 "" + +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 "" +"Vi vidas tiun mesaĝon ĉar tiu-ĉi retejo postulas CSRF kuketon sendante " +"formojn. Tiu-ĉi kuketo estas bezonata pro motivoj de sekureco, por certigi " +"ke via retumilo ne esti forrabita de triaj partioj." + +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 "Pliaj informoj estas videblaj kun DEBUG=True." + +msgid "No year specified" +msgstr "Neniu jaro specifita" + +msgid "Date out of range" +msgstr "Dato ne en la intervalo" + +msgid "No month specified" +msgstr "Neniu monato specifita" + +msgid "No day specified" +msgstr "Neniu tago specifita" + +msgid "No week specified" +msgstr "Neniu semajno specifita" + +#, python-format +msgid "No %(verbose_name_plural)s available" +msgstr "Neniu %(verbose_name_plural)s disponeblaj" + +#, python-format +msgid "" +"Future %(verbose_name_plural)s not available because %(class_name)s." +"allow_future is False." +msgstr "" +"Estonta %(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 "" + +#, python-format +msgid "No %(verbose_name)s found matching the query" +msgstr "Neniu %(verbose_name)s trovita kongruas kun la informpeto" + +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 "Nevalida paĝo (%(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 "Dosierujaj indeksoj ne estas permesitaj 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 "Djanga dokumentaro" + +msgid "Topics, references, & how-to’s" +msgstr "" + +msgid "Tutorial: A Polling App" +msgstr "Instruilo: apo pri enketoj" + +msgid "Get started with Django" +msgstr "Komencu kun Dĵango" + +msgid "Django Community" +msgstr "Djanga komunumo" + +msgid "Connect, get help, or contribute" +msgstr "Konektiĝu, ricevu helpon aŭ kontribuu" diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/eo/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/eo/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/eo/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/eo/formats.py new file mode 100644 index 0000000..604e5f5 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/eo/formats.py @@ -0,0 +1,47 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es/LC_MESSAGES/django.mo new file mode 100644 index 0000000..f40f75a Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es/LC_MESSAGES/django.po new file mode 100644 index 0000000..a07e001 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es/LC_MESSAGES/django.po @@ -0,0 +1,1338 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Abe Estrada, 2013 +# albertoalcolea , 2014 +# Amanda Copete, 2017 +# Antoni Aloy , 2011-2014,2017,2019 +# Claude Paroz , 2020 +# Diego Andres Sanabria Martin , 2012 +# Diego Schulz , 2012 +# e4db27214f7e7544f2022c647b585925_bb0e321, 2015-2016 +# e4db27214f7e7544f2022c647b585925_bb0e321, 2014 +# e4db27214f7e7544f2022c647b585925_bb0e321, 2020 +# Ernesto Rico Schmidt , 2017 +# 8cb2d5a716c3c9a99b6d20472609a4d5_6d03802 , 2011 +# Ignacio José Lizarán Rus , 2019 +# Igor Támara , 2015 +# Jannis Leidel , 2011 +# José Luis , 2016 +# Josue Naaman Nistal Guerra , 2014 +# Leonardo J. Caballero G. , 2011,2013 +# Luigy, 2019 +# Marc Garcia , 2011 +# monobotsoft , 2012 +# ntrrgc , 2013 +# ntrrgc , 2013 +# Pablo, 2015 +# Sebastián Magrí, 2013 +# Uriel Medina , 2020-2021 +# Veronicabh , 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-02-11 06:03+0000\n" +"Last-Translator: Uriel Medina \n" +"Language-Team: Spanish (http://www.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" + +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 "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 "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 "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 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." + +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 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 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)." + +#, 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)." + +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." + +#, 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." + +#, 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." + +#, 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 "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 "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)." + +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 %d form." +msgid_plural "Please submit at most %d forms." +msgstr[0] "Por favor, envíe %d formulario como máximo." +msgstr[1] "Por favor, envíe %d formularios como máximo." + +#, python-format +msgid "Please submit at least %d form." +msgid_plural "Please submit at least %d forms." +msgstr[0] "Por favor, envíe %d formulario como máximo." +msgstr[1] "Por favor, envíe %d formularios como máximo." + +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" + +#, 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 "Mar." + +msgctxt "abbrev. month" +msgid "April" +msgstr "Abr." + +msgctxt "abbrev. month" +msgid "May" +msgstr "Mayo" + +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 "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 "%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 "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á viendo este mensaje porque este sitio HTTPS requiere que su 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es/formats.py new file mode 100644 index 0000000..b7aca78 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es/formats.py @@ -0,0 +1,30 @@ +# 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 = [ + # '31/12/2009', '31/12/09' + '%d/%m/%Y', '%d/%m/%y' +] +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es_AR/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es_AR/LC_MESSAGES/django.mo new file mode 100644 index 0000000..9d8e897 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es_AR/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es_AR/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es_AR/LC_MESSAGES/django.po new file mode 100644 index 0000000..f4519de --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es_AR/LC_MESSAGES/django.po @@ -0,0 +1,1317 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# lardissone , 2014 +# poli , 2014 +# Ramiro Morales, 2013-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-03-21 12:52+0000\n" +"Last-Translator: Ramiro Morales\n" +"Language-Team: Spanish (Argentina) (http://www.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 "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 "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 "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 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." + +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 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 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 caracter " +"(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 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." + +#, 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." + +#, 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." + +#, 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 "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 "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 does not exist." +msgstr "No existe una instancia de %(model)s con %(field)s %(value)r." + +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 caracter " +"(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 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 %d form." +msgid_plural "Please submit at most %d forms." +msgstr[0] "Por favor envíe un máximo de %d formulario." +msgstr[1] "Por favor envíe un máximo de %d formularios." + +#, python-format +msgid "Please submit at least %d form." +msgid_plural "Please submit at least %d forms." +msgstr[0] "Por favor envíe %d o mas formularios." +msgstr[1] "Por favor envíe %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" + +#, 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 "%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. 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 browser Web envíe una cabecera “Referer” pero el mismo " +"no ha enviado una. El hecho de que esta cabecera 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 “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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es_AR/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es_AR/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es_AR/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es_AR/formats.py new file mode 100644 index 0000000..e856c4a --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es_AR/formats.py @@ -0,0 +1,30 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es_CO/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es_CO/LC_MESSAGES/django.mo new file mode 100644 index 0000000..678fdc7 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es_CO/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es_CO/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es_CO/LC_MESSAGES/django.po new file mode 100644 index 0000000..9f839fe --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es_CO/LC_MESSAGES/django.po @@ -0,0 +1,1258 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es_CO/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es_CO/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es_CO/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es_CO/formats.py new file mode 100644 index 0000000..cefbe26 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es_CO/formats.py @@ -0,0 +1,26 @@ +# 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', '%d/%m/%y', # '25/10/2006', '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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es_MX/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es_MX/LC_MESSAGES/django.mo new file mode 100644 index 0000000..2dc6ed6 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es_MX/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es_MX/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es_MX/LC_MESSAGES/django.po new file mode 100644 index 0000000..3b4705d --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es_MX/LC_MESSAGES/django.po @@ -0,0 +1,1261 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Abe Estrada, 2011-2013 +# Claude Paroz , 2020 +# 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: 2021-01-15 09:00+0100\n" +"PO-Revision-Date: 2021-02-17 03:02+0000\n" +"Last-Translator: Sergio Benitez \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 "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 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 "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 "" + +#, 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 "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 "" + +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 "" + +#, 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 "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 "" + +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 "" + +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] "" + +#, python-format +msgid "Please submit at least %d form." +msgid_plural "Please submit at least %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 "%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 "" + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es_MX/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es_MX/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es_MX/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es_MX/formats.py new file mode 100644 index 0000000..760edcf --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es_MX/formats.py @@ -0,0 +1,25 @@ +# 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', '%d/%m/%y', # '25/10/2006', '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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es_NI/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es_NI/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es_NI/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es_NI/formats.py new file mode 100644 index 0000000..2eacf50 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es_NI/formats.py @@ -0,0 +1,26 @@ +# 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', '%d/%m/%y', # '25/10/2006', '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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es_PR/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es_PR/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es_PR/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es_PR/formats.py new file mode 100644 index 0000000..7f53ef9 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es_PR/formats.py @@ -0,0 +1,27 @@ +# 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 = [ + # '31/12/2009', '31/12/09' + '%d/%m/%Y', '%d/%m/%y' +] +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es_VE/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es_VE/LC_MESSAGES/django.mo new file mode 100644 index 0000000..f7efb3e Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es_VE/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es_VE/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es_VE/LC_MESSAGES/django.po new file mode 100644 index 0000000..bd0a904 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/es_VE/LC_MESSAGES/django.po @@ -0,0 +1,1260 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/et/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/et/LC_MESSAGES/django.mo new file mode 100644 index 0000000..d4f7c64 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/et/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/et/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/et/LC_MESSAGES/django.po new file mode 100644 index 0000000..d38446f --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/et/LC_MESSAGES/django.po @@ -0,0 +1,1307 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# eallik , 2011 +# Erlend , 2020 +# Jannis Leidel , 2011 +# Janno Liivak , 2013-2015 +# madisvain , 2011 +# Martin , 2014-2015,2021 +# 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: 2021-01-15 09:00+0100\n" +"PO-Revision-Date: 2021-03-22 11:50+0000\n" +"Last-Translator: Martin \n" +"Language-Team: Estonian (http://www.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 "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 "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 "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 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." + +msgid "Enter a valid IPv4 address." +msgstr "Sisestage korrektne IPv4 aadress." + +msgid "Enter a valid IPv6 address." +msgstr "Sisestage korrektne IPv6 aadress." + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Sisestage korrektne IPv4 või IPv6 aadress." + +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 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 "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 "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 does not exist." +msgstr "%(model)s isendit %(field)s %(value)r ei leidu." + +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 %d form." +msgid_plural "Please submit at most %d forms." +msgstr[0] "Palun kinnitage kõige rohkem %d vorm." +msgstr[1] "Palun kinnitage kõige rohkem %d vormi." + +#, python-format +msgid "Please submit at least %d form." +msgid_plural "Please submit at least %d forms." +msgstr[0] "Palun kinnitage vähemalt %d vorm." +msgstr[1] "Palun kinnitage vähemalt %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 "%d year" +msgid_plural "%d years" +msgstr[0] "%d aasta" +msgstr[1] "%d aastat" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d kuu" +msgstr[1] "%d kuud" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d nädal" +msgstr[1] "%d nädalat" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d päev" +msgstr[1] "%d päeva" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d tund" +msgstr[1] "%d tundi" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minut" +msgstr[1] "%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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/et/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/et/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/et/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/et/formats.py new file mode 100644 index 0000000..1e1e458 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/et/formats.py @@ -0,0 +1,21 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/eu/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/eu/LC_MESSAGES/django.mo new file mode 100644 index 0000000..cf1b961 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/eu/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/eu/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/eu/LC_MESSAGES/django.po new file mode 100644 index 0000000..028cc45 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/eu/LC_MESSAGES/django.po @@ -0,0 +1,1279 @@ +# 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 +# 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: 2021-01-15 09:00+0100\n" +"PO-Revision-Date: 2021-05-09 16:11+0000\n" +"Last-Translator: Mikel Maldonado \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" + +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 "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 "" + +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 "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 "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 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 "" + +msgid "Enter a valid IPv4 address." +msgstr "Idatzi baleko IPv4 sare-helbide bat." + +msgid "Enter a valid IPv6 address." +msgstr "Idatzi baleko IPv6 sare-helbide bat." + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Idatzi baleko IPv4 edo IPv6 sare-helbide bat." + +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 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 "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 "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 %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 "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 "%d year" +msgid_plural "%d years" +msgstr[0] "urte %d" +msgstr[1] "%d urte" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "hilabete %d" +msgstr[1] "%d hilabete" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "aste %d" +msgstr[1] "%d aste" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "egun %d" +msgstr[1] "%d egun" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "ordu %d" +msgstr[1] "%d ordu" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "minutu %d" +msgstr[1] "%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 "" + +#, 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/eu/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/eu/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/eu/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/eu/formats.py new file mode 100644 index 0000000..33e6305 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/eu/formats.py @@ -0,0 +1,21 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/fa/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/fa/LC_MESSAGES/django.mo new file mode 100644 index 0000000..6037b1f Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/fa/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/fa/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/fa/LC_MESSAGES/django.po new file mode 100644 index 0000000..45af4c2 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/fa/LC_MESSAGES/django.po @@ -0,0 +1,1310 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Ahmad Hosseini , 2020 +# Ali Vakilzade , 2015 +# Arash Fazeli , 2012 +# Eric Hamiter , 2019 +# Jannis Leidel , 2011 +# 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: 2021-01-15 09:00+0100\n" +"PO-Revision-Date: 2021-04-03 06:19+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" + +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 "نروژی 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 "اردو" + +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 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 "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 "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 "" + +#, 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 "مقدار درون خطی موجود با نمونه والد آن مطابقت ندارد." + +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 "%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 "" +"شما این پیغام را می‌بینید چون این وب‌گاه 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 "لیست خالی و \"%(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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/fa/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/fa/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/fa/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/fa/formats.py new file mode 100644 index 0000000..c8666f7 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/fa/formats.py @@ -0,0 +1,21 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/fi/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/fi/LC_MESSAGES/django.mo new file mode 100644 index 0000000..2f42d35 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/fi/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/fi/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/fi/LC_MESSAGES/django.po new file mode 100644 index 0000000..4f52bf6 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/fi/LC_MESSAGES/django.po @@ -0,0 +1,1303 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Aarni Koskela, 2015,2017-2018,2020-2021 +# Antti Kaihola , 2011 +# Jannis Leidel , 2011 +# Lasse Liehu , 2015 +# Mika Mäkelä , 2018 +# Klaus Dahlén , 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-13 07:20+0000\n" +"Last-Translator: Aarni Koskela\n" +"Language-Team: Finnish (http://www.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 "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 "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 "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 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." + +msgid "Enter a valid IPv4 address." +msgstr "DSyötä kelvollinen IPv4-osoite." + +msgid "Enter a valid IPv6 address." +msgstr "Syötä kelvollinen IPv6-osoite." + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Syötä kelvollinen IPv4- tai IPv6-osoite." + +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 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] "" +"Varmista, että tämä arvo on 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] "" +"Varmista, että tämä arvo on 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 "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 "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 does not exist." +msgstr "%(model)s-tietuetta %(field)s-kentällä %(value)r ei ole olemassa." + +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] "" +"Varmista, että tämä tiedostonimi on 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 %d form." +msgid_plural "Please submit at most %d forms." +msgstr[0] "Lähetä enintään %d lomake." +msgstr[1] "Lähetä enintään %d lomaketta." + +#, python-format +msgid "Please submit at least %d form." +msgid_plural "Please submit at least %d forms." +msgstr[0] "Lähetä vähintään %d lomake." +msgstr[1] "Lähetä vähintään %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 allaolevat 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 "%d year" +msgid_plural "%d years" +msgstr[0] "%d vuosi" +msgstr[1] "%d vuotta" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d kuukausi" +msgstr[1] "%d kuukautta" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d viikko" +msgstr[1] "%d viikkoa" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d päivä" +msgstr[1] "%d päivää" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d tunti" +msgstr[1] "%d tuntia" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minuutti" +msgstr[1] "%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 Django %(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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/fi/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/fi/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/fi/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/fi/formats.py new file mode 100644 index 0000000..0a56b37 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/fi/formats.py @@ -0,0 +1,37 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/fr/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/fr/LC_MESSAGES/django.mo new file mode 100644 index 0000000..72747ef Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/fr/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/fr/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/fr/LC_MESSAGES/django.po new file mode 100644 index 0000000..dcec3a7 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/fr/LC_MESSAGES/django.po @@ -0,0 +1,1333 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Bruno Brouard , 2021 +# Simon Charette , 2012 +# Claude Paroz , 2013-2021 +# 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: 2021-01-15 09:00+0100\n" +"PO-Revision-Date: 2021-03-02 13:13+0000\n" +"Last-Translator: Bruno Brouard \n" +"Language-Team: French (http://www.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 "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 "Burmese" +msgstr "Birman" + +msgid "Norwegian Bokmål" +msgstr "Norvégien bokmål" + +msgid "Nepali" +msgstr "Népalais" + +msgid "Dutch" +msgstr "Hollandais" + +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 "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 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." + +msgid "Enter a valid IPv4 address." +msgstr "Saisissez une adresse IPv4 valide." + +msgid "Enter a valid IPv6 address." +msgstr "Saisissez une adresse IPv6 valide." + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Saisissez une adresse IPv4 ou IPv6 valide." + +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 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)." + +#, 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)." + +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." + +#, 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." + +#, 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." + +#, 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 "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 "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 does not exist." +msgstr "L’instance %(model)s avec %(value)r dans %(field)s n’existe pas." + +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)." + +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 %d form." +msgid_plural "Please submit at most %d forms." +msgstr[0] "Veuillez soumettre au plus %d formulaire." +msgstr[1] "Veuillez soumettre au plus %d formulaires." + +#, python-format +msgid "Please submit at least %d form." +msgid_plural "Please submit at least %d forms." +msgstr[0] "Veuillez soumettre au moins %d formulaire." +msgstr[1] "Veuillez soumettre au moins %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" + +#, 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 "%d year" +msgid_plural "%d years" +msgstr[0] "%d année" +msgstr[1] "%d années" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d mois" +msgstr[1] "%d mois" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d semaine" +msgstr[1] "%d semaines" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d jour" +msgstr[1] "%d jours" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d heure" +msgstr[1] "%d heures" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minute" +msgstr[1] "%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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/fr/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/fr/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/fr/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/fr/formats.py new file mode 100644 index 0000000..f24e77f --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/fr/formats.py @@ -0,0 +1,31 @@ +# 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 N Y' +SHORT_DATETIME_FORMAT = 'j N 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', '%d/%m/%y', # '25/10/2006', '25/10/06' + '%d.%m.%Y', '%d.%m.%y', # Swiss [fr_CH), '25.10.2006', '25.10.06' + # '%d %B %Y', '%d %b %Y', # '25 octobre 2006', '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' + '%d.%m.%Y %H:%M:%S', # Swiss [fr_CH), '25.10.2006 14:30:59' + '%d.%m.%Y %H:%M:%S.%f', # Swiss (fr_CH), '25.10.2006 14:30:59.000200' + '%d.%m.%Y %H:%M', # Swiss (fr_CH), '25.10.2006 14:30' +] +DECIMAL_SEPARATOR = ',' +THOUSAND_SEPARATOR = '\xa0' # non-breaking space +NUMBER_GROUPING = 3 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/fy/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/fy/LC_MESSAGES/django.mo new file mode 100644 index 0000000..2eff5df Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/fy/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/fy/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/fy/LC_MESSAGES/django.po new file mode 100644 index 0000000..172f283 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/fy/LC_MESSAGES/django.po @@ -0,0 +1,1218 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/fy/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/fy/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/fy/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/fy/formats.py new file mode 100644 index 0000000..3825be4 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/fy/formats.py @@ -0,0 +1,21 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ga/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ga/LC_MESSAGES/django.mo new file mode 100644 index 0000000..c2a8a88 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ga/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ga/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ga/LC_MESSAGES/django.po new file mode 100644 index 0000000..2b1b528 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ga/LC_MESSAGES/django.po @@ -0,0 +1,1293 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# 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: 2020-05-19 20:23+0200\n" +"PO-Revision-Date: 2020-07-14 21:42+0000\n" +"Last-Translator: Transifex Bot <>\n" +"Language-Team: Irish (http://www.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 "" + +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 "Czech" +msgstr "Seicis" + +msgid "Welsh" +msgstr "Breatnais" + +msgid "Danish" +msgstr "Danmhairgis " + +msgid "German" +msgstr "Gearmáinis" + +msgid "Lower Sorbian" +msgstr "" + +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 "" + +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 "" + +msgid "Hungarian" +msgstr "Ungáiris" + +msgid "Armenian" +msgstr "" + +msgid "Interlingua" +msgstr "Interlingua" + +msgid "Indonesian" +msgstr "Indinéisis" + +msgid "Igbo" +msgstr "" + +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 "" + +msgid "Kazakh" +msgstr "Casaicis" + +msgid "Khmer" +msgstr "Ciméiris" + +msgid "Kannada" +msgstr "Cannadais" + +msgid "Korean" +msgstr "Cóiréis" + +msgid "Kyrgyz" +msgstr "" + +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 "Burmese" +msgstr "Burmais" + +msgid "Norwegian Bokmål" +msgstr "" + +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 "" + +msgid "Tamil" +msgstr "Tamailis" + +msgid "Telugu" +msgstr "Teileagúis" + +msgid "Tajik" +msgstr "" + +msgid "Thai" +msgstr "Téalainnis" + +msgid "Turkmen" +msgstr "" + +msgid "Turkish" +msgstr "Tuircis" + +msgid "Tatar" +msgstr "" + +msgid "Udmurt" +msgstr "" + +msgid "Ukrainian" +msgstr "Úcráinis" + +msgid "Urdu" +msgstr "Urdais" + +msgid "Uzbek" +msgstr "" + +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 "" + +msgid "Static Files" +msgstr "Comhaid Statach" + +msgid "Syndication" +msgstr "Sindeacáitiú" + +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 "Iontráil luach bailí" + +msgid "Enter a valid URL." +msgstr "Iontráil URL bailí." + +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 "Iontráil seoladh IPv4 bailí." + +msgid "Enter a valid IPv6 address." +msgstr "Cuir seoladh bailí IPv6 isteach." + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Cuir seoladh bailí IPv4 nó IPv6 isteach." + +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 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 "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] "" +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 "agus" + +#, 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í 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 "" + +#, 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 "" + +#, python-format +msgid "“%(value)s” value must be either True, False, or None." +msgstr "" + +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 "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 "" + +#, 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 "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 "" + +#, 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 "Dáta (le am)" + +#, python-format +msgid "“%(value)s” value must be a decimal number." +msgstr "" + +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 "" + +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 "" + +msgid "Floating point number" +msgstr "Snámhphointe" + +#, python-format +msgid "“%(value)s” value must be an integer." +msgstr "" + +msgid "Integer" +msgstr "Slánuimhir" + +msgid "Big (8 byte) integer" +msgstr "Mór (8 byte) slánuimhi" + +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 "" + +msgid "Boolean (Either True, False or None)" +msgstr "Boole (Fíor, Bréagach nó Dada)" + +msgid "Positive big integer" +msgstr "" + +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 "Small integer" +msgstr "Slánuimhir beag" + +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 "" + +#, python-format +msgid "" +"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " +"invalid time." +msgstr "" + +msgid "Time" +msgstr "Am" + +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 "Comhaid" + +msgid "Image" +msgstr "Íomhá" + +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 "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 "" + +#, python-format +msgid "%(from)s-%(to)s relationships" +msgstr "" + +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 "" + +#, 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í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] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" + +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 "" + +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] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" + +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" + +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 "" + +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 "" + +#, 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 "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 "" + +#, python-format +msgctxt "String to return when truncating text" +msgid "%(truncated_text)s…" +msgstr "" + +msgid "or" +msgstr "nó" + +#. 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] "" +msgstr[3] "" +msgstr[4] "" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d nóiméad" +msgstr[1] "%d nóiméad" +msgstr[2] "%d nóiméad" +msgstr[3] "%d nóiméad" +msgstr[4] "%d nóiméad" + +msgid "Forbidden" +msgstr "Toirmiscthe" + +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 "Tá tuilleadh eolais ar fáil le DEBUG=True." + +msgid "No year specified" +msgstr "Bliain gan sonrú" + +msgid "Date out of range" +msgstr "" + +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 "" + +#, 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 "" + +#, 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 "" + +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 "" + +#, python-format +msgid "Index of %(directory)s" +msgstr "Innéacs 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 "Tosaigh le Django" + +msgid "Django Community" +msgstr "" + +msgid "Connect, get help, or contribute" +msgstr "" diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ga/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ga/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ga/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ga/formats.py new file mode 100644 index 0000000..eb3614a --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ga/formats.py @@ -0,0 +1,21 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/gd/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/gd/LC_MESSAGES/django.mo new file mode 100644 index 0000000..5173b1a Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/gd/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/gd/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/gd/LC_MESSAGES/django.po new file mode 100644 index 0000000..8c46e5a --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/gd/LC_MESSAGES/django.po @@ -0,0 +1,1380 @@ +# 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-01-15 09:00+0100\n" +"PO-Revision-Date: 2021-04-05 09:31+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 "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 "" + +#, 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 "Ò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 "%d year" +msgid_plural "%d years" +msgstr[0] "%d bhliadhna" +msgstr[1] "%d bhliadhna" +msgstr[2] "%d bliadhnaichean" +msgstr[3] "%d bliadhna" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d mhìos" +msgstr[1] "%d mhìos" +msgstr[2] "%d mìosan" +msgstr[3] "%d mìos" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d seachdain" +msgstr[1] "%d sheachdain" +msgstr[2] "%d seachdainean" +msgstr[3] "%d seachdain" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d latha" +msgstr[1] "%d latha" +msgstr[2] "%d làithean" +msgstr[3] "%d latha" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d uair" +msgstr[1] "%d uair" +msgstr[2] "%d uairean" +msgstr[3] "%d uair" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d mhionaid" +msgstr[1] "%d mhionaid" +msgstr[2] "%d mionaidean" +msgstr[3] "%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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/gd/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/gd/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/gd/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/gd/formats.py new file mode 100644 index 0000000..19b42ee --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/gd/formats.py @@ -0,0 +1,21 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/gl/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/gl/LC_MESSAGES/django.mo new file mode 100644 index 0000000..b53513d Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/gl/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/gl/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/gl/LC_MESSAGES/django.po new file mode 100644 index 0000000..ae3fa24 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/gl/LC_MESSAGES/django.po @@ -0,0 +1,1233 @@ +# 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 +# Oscar Carballal , 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: Galician (http://www.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 "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 "Czech" +msgstr "Checo" + +msgid "Welsh" +msgstr "Galés" + +msgid "Danish" +msgstr "Dinamarqués" + +msgid "German" +msgstr "Alemán" + +msgid "Lower Sorbian" +msgstr "" + +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 "" + +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 "" + +msgid "Galician" +msgstr "Galego" + +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 "Ido" +msgstr "" + +msgid "Icelandic" +msgstr "islandés" + +msgid "Italian" +msgstr "Italiano" + +msgid "Japanese" +msgstr "xaponés" + +msgid "Georgian" +msgstr "xeorxiano" + +msgid "Kabyle" +msgstr "" + +msgid "Kazakh" +msgstr "casaco" + +msgid "Khmer" +msgstr "camboxano" + +msgid "Kannada" +msgstr "canará" + +msgid "Korean" +msgstr "Coreano" + +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 "" + +msgid "Burmese" +msgstr "birmano" + +msgid "Norwegian Bokmål" +msgstr "" + +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 "Thai" +msgstr "tai" + +msgid "Turkish" +msgstr "turco" + +msgid "Tatar" +msgstr "tártaro" + +msgid "Udmurt" +msgstr "udmurt" + +msgid "Ukrainian" +msgstr "ucraíno" + +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 "" + +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 "Insira un valor válido." + +msgid "Enter a valid URL." +msgstr "Insira un URL válido." + +msgid "Enter a valid integer." +msgstr "" + +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 "" + +msgid "" +"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" + +msgid "Enter a valid IPv4 address." +msgstr "Insira unha dirección IPv4 válida." + +msgid "Enter a valid IPv6 address." +msgstr "Insira unha dirección IPv6 válida" + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Insira unha dirección IPv4 ou IPv6 válida" + +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 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 "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] "" +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 "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 "" + +#, 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 "" + +#, python-format +msgid "“%(value)s” value must be either True, False, or None." +msgstr "" + +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 "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 "" + +#, 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 (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 "" + +#, 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 (coa 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 "" + +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 "" + +msgid "Floating point number" +msgstr "Número en coma flotante" + +#, python-format +msgid "“%(value)s” value must be an integer." +msgstr "" + +msgid "Integer" +msgstr "Número enteiro" + +msgid "Big (8 byte) integer" +msgstr "Enteiro grande (8 bytes)" + +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 "" + +msgid "Boolean (Either True, False or None)" +msgstr "Booleano (verdadeiro, falso ou ningún)" + +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 "Small integer" +msgstr "Enteiro pequeno" + +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 binarios en bruto" + +#, python-format +msgid "“%(value)s” is not a valid UUID." +msgstr "" + +msgid "Universally unique identifier" +msgstr "" + +msgid "File" +msgstr "Ficheiro" + +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 Estranxeira (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 "" + +#, python-format +msgid "%(from)s-%(to)s relationships" +msgstr "" + +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 "" + +#, 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 "" +"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] "" +msgstr[1] "" + +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 "" + +msgid "Enter a valid UUID." +msgstr "Insira un UUID 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 "" + +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 "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 "" + +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 "" + +#, 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 "Actualmente" + +msgid "Change" +msgstr "Modificar" + +msgid "Unknown" +msgstr "Descoñecido" + +msgid "Yes" +msgstr "Si" + +msgid "No" +msgstr "Non" + +msgid "Year" +msgstr "" + +msgid "Month" +msgstr "" + +msgid "Day" +msgstr "" + +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 "mar." + +msgctxt "abbrev. month" +msgid "April" +msgstr "abr." + +msgctxt "abbrev. month" +msgid "May" +msgstr "maio" + +msgctxt "abbrev. month" +msgid "June" +msgstr "xuño" + +msgctxt "abbrev. month" +msgid "July" +msgstr "xul." + +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 "" + +#, python-format +msgctxt "String to return when truncating text" +msgid "%(truncated_text)s…" +msgstr "" + +msgid "or" +msgstr "ou" + +#. 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 ano" +msgstr[1] "%d anos" + +#, 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 "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 "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 "" + +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 "" + +#, 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 "" + +#, 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 "" + +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 "" + +#, 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/gl/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/gl/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/gl/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/gl/formats.py new file mode 100644 index 0000000..9f29c23 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/gl/formats.py @@ -0,0 +1,21 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/he/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/he/LC_MESSAGES/django.mo new file mode 100644 index 0000000..03d57e2 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/he/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/he/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/he/LC_MESSAGES/django.po new file mode 100644 index 0000000..00ada75 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/he/LC_MESSAGES/django.po @@ -0,0 +1,1311 @@ +# 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 +# אורי רודברג , 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-08-02 13:17+0000\n" +"Last-Translator: Meir Kriheli \n" +"Language-Team: Hebrew (http://www.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 "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' חוקי המכיל אותיות לטיניות, ספרות, קווים תחתונים או מקפים." + +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 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 "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\" מכיל פורמט תאריך לא חוקי. חייב להיות בפורמט 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 "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 "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” מכיל פורמט לא חוקי. הוא חייב להיות בפורמט 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 "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)." +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" + +msgid "ManagementForm data is missing or has been tampered with" +msgstr "מידע ManagementForm חסר או התעסקו איתו." + +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "נא לשלוח טופס %d לכל היותר." +msgstr[1] "נא לשלוח %d טפסים לכל היותר." +msgstr[2] "נא לשלוח %d טפסים לכל היותר." +msgstr[3] "נא לשלוח %d טפסים לכל היותר." + +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "נא לשלוח טופס %d או יותר." +msgstr[1] "נא לשלוח %d טפסים או יותר." +msgstr[2] "נא לשלוח %d טפסים או יותר." +msgstr[3] "נא לשלוח %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 "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 "%d year" +msgid_plural "%d years" +msgstr[0] "שנה %d" +msgstr[1] "%d שנים" +msgstr[2] "%d שנים" +msgstr[3] "%d שנים" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "חודש %d" +msgstr[1] "%d חודשים" +msgstr[2] "%d חודשים" +msgstr[3] "%d חודשים" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "שבוע %d" +msgstr[1] "%d שבועות" +msgstr[2] "%d שבועות" +msgstr[3] "%d שבועות" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "יום %d" +msgstr[1] "%d ימים" +msgstr[2] "%d ימים" +msgstr[3] "%d ימים" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "שעה %d" +msgstr[1] "%d שעות" +msgstr[2] "%d שעות" +msgstr[3] "%d שעות" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "דקה %d" +msgstr[1] "%d דקות" +msgstr[2] "%d דקות" +msgstr[3] "%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 "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 בקובץ ההגדרות שלך ולא הגדרת שום 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/he/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/he/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/he/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/he/formats.py new file mode 100644 index 0000000..2314565 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/he/formats.py @@ -0,0 +1,21 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/hi/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/hi/LC_MESSAGES/django.mo new file mode 100644 index 0000000..b1aa3f6 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/hi/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/hi/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/hi/LC_MESSAGES/django.po new file mode 100644 index 0000000..427d015 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/hi/LC_MESSAGES/django.po @@ -0,0 +1,1237 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# alkuma , 2013 +# 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: 2020-05-19 20:23+0200\n" +"PO-Revision-Date: 2020-07-14 21:42+0000\n" +"Last-Translator: Transifex Bot <>\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 "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 "वैध आइ.पि वी 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 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 "बड़ा (8 बाइट) पूर्णांक " + +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 "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 "छवि" + +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 "मान्य इच्छा चयन करें । %(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 "" + +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 "नहीं" + +#. 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 "%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 "%(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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/hi/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/hi/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/hi/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/hi/formats.py new file mode 100644 index 0000000..923967a --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/hi/formats.py @@ -0,0 +1,21 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/hr/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/hr/LC_MESSAGES/django.mo new file mode 100644 index 0000000..f7afa5d Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/hr/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/hr/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/hr/LC_MESSAGES/django.po new file mode 100644 index 0000000..574a7ab --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/hr/LC_MESSAGES/django.po @@ -0,0 +1,1274 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/hr/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/hr/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/hr/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/hr/formats.py new file mode 100644 index 0000000..96ad195 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/hr/formats.py @@ -0,0 +1,42 @@ +# 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.', '%d.%m.%y.', # '25.10.2006.', '25.10.06.' + '%d. %m. %Y.', '%d. %m. %y.', # '25. 10. 2006.', '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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/hsb/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/hsb/LC_MESSAGES/django.mo new file mode 100644 index 0000000..0c8da03 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/hsb/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/hsb/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/hsb/LC_MESSAGES/django.po new file mode 100644 index 0000000..1d0aa18 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/hsb/LC_MESSAGES/django.po @@ -0,0 +1,1346 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Michael Wolf , 2016-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-02-01 21:57+0000\n" +"Last-Translator: Michael Wolf \n" +"Language-Team: Upper Sorbian (http://www.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 "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 "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 "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 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." + +msgid "Enter a valid IPv4 address." +msgstr "Zapodajće płaćiwu IPv4-adresu." + +msgid "Enter a valid IPv6 address." +msgstr "Zapodajće płaćiwu IPv6-adresu." + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Zapodajće płaćiwu IPv4- abo IPv6-adresu." + +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 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 "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 "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 does not exist." +msgstr "Instanca %(model)s z %(field)s %(value)r njeeksistuje." + +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 %d form." +msgid_plural "Please submit at most %d forms." +msgstr[0] "Prošu wotpósćelće maksimalnje %d formular." +msgstr[1] "Prošu wotpósćelće maksimalnje %d formularaj." +msgstr[2] "Prošu wotpósćelće maksimalnje %d formulary." +msgstr[3] "Prošu wotpósćelće maksimalnje %d formularow." + +#, python-format +msgid "Please submit at least %d form." +msgid_plural "Please submit at least %d forms." +msgstr[0] "Prošu wotpósćelće minimalnje %d formular." +msgstr[1] "Prošu wotpósćelće minimalnje %d formularaj." +msgstr[2] "Prošu wotpósćelće minimalnje %d formulary." +msgstr[3] "Prošu wotpósćelće minimalnje %d formularow." + +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 "%d year" +msgid_plural "%d years" +msgstr[0] "%d lěto" +msgstr[1] "%d lěće" +msgstr[2] "%d lěta" +msgstr[3] "%d lět" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d měsac" +msgstr[1] "%d měsacaj" +msgstr[2] "%d měsacy" +msgstr[3] "%d měsacow" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d tydźeń" +msgstr[1] "%d njedźeli" +msgstr[2] "%d njedźele" +msgstr[3] "%d njedźel" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d dźeń" +msgstr[1] "%d njej" +msgstr[2] "%d dny" +msgstr[3] "%d dnjow" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d hodźina" +msgstr[1] "%d hodźinje" +msgstr[2] "%d hodźiny" +msgstr[3] "%d hodźin" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d mjeńšina" +msgstr[1] "%d mjeńšinje" +msgstr[2] "%d mjeńšiny" +msgstr[3] "%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ž HTTPS-sydło „hłowu Referer“ trjeba, zo by so " +"do webwobhladowaka słało, ale njeje so pósłała. Tuta hłowa je z přičinow " +"wěstoty trěbna, 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/hu/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/hu/LC_MESSAGES/django.mo new file mode 100644 index 0000000..858f0c4 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/hu/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/hu/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/hu/LC_MESSAGES/django.po new file mode 100644 index 0000000..3661576 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/hu/LC_MESSAGES/django.po @@ -0,0 +1,1327 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Akos Zsolt Hochrein , 2018 +# András Veres-Szentkirályi, 2016-2021 +# Attila Nagy <>, 2012 +# Dóra Szendrei , 2017 +# Istvan Farkas , 2019 +# Jannis Leidel , 2011 +# János R, 2011-2012,2014 +# Máté Őry , 2013 +# Szilveszter Farkas , 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-01 15:20+0000\n" +"Last-Translator: András Veres-Szentkirályi\n" +"Language-Team: Hungarian (http://www.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 "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 "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 "tadzsik" + +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 "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 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." + +msgid "Enter a valid IPv4 address." +msgstr "Írjon be egy érvényes IPv4 címet." + +msgid "Enter a valid IPv6 address." +msgstr "Írjon be egy érvényes IPv6 címet." + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Írjon be egy érvényes IPv4 vagy IPv6 címet." + +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 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 "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 "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 does not exist." +msgstr "%(model)s példány %(value)r %(field)s értékkel nem létezik." + +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 %d form." +msgid_plural "Please submit at most %d forms." +msgstr[0] "Legfeljebb %d űrlapot küldjön be." +msgstr[1] "Legfeljebb %d űrlapot küldjön be." + +#, python-format +msgid "Please submit at least %d form." +msgid_plural "Please submit at least %d forms." +msgstr[0] "Legalább %d űrlapot küldjön be." +msgstr[1] "Legalább %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 "%d year" +msgid_plural "%d years" +msgstr[0] "%d év" +msgstr[1] "%d év" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d hónap" +msgstr[1] "%d hónap" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d hét" +msgstr[1] "%d hét" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d nap" +msgstr[1] "%d nap" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d óra" +msgstr[1] "%d óra" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d perc" +msgstr[1] "%d perc" + +msgid "Forbidden" +msgstr "Hozzáférés megtagadva" + +msgid "CSRF verification failed. Request aborted." +msgstr "CSRF ellenőrzés sikertelen. Kérést 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/hu/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/hu/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/hu/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/hu/formats.py new file mode 100644 index 0000000..f0bfa21 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/hu/formats.py @@ -0,0 +1,30 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/hy/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/hy/LC_MESSAGES/django.mo new file mode 100644 index 0000000..9dcc472 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/hy/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/hy/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/hy/LC_MESSAGES/django.po new file mode 100644 index 0000000..e4860e2 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/hy/LC_MESSAGES/django.po @@ -0,0 +1,1237 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ia/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ia/LC_MESSAGES/django.mo new file mode 100644 index 0000000..4ff3ff5 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ia/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ia/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ia/LC_MESSAGES/django.po new file mode 100644 index 0000000..46d8e54 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ia/LC_MESSAGES/django.po @@ -0,0 +1,1245 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Martijn Dekker , 2012,2014,2016 +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: 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 "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 "" + +msgid "Interlingua" +msgstr "interlingua" + +msgid "Indonesian" +msgstr "indonesiano" + +msgid "Ido" +msgstr "ido" + +msgid "Icelandic" +msgstr "islandese" + +msgid "Italian" +msgstr "italiano" + +msgid "Japanese" +msgstr "japonese" + +msgid "Georgian" +msgstr "georgiano" + +msgid "Kabyle" +msgstr "" + +msgid "Kazakh" +msgstr "kazakh" + +msgid "Khmer" +msgstr "khmer" + +msgid "Kannada" +msgstr "kannada" + +msgid "Korean" +msgstr "coreano" + +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 "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 "Thai" +msgstr "thailandese" + +msgid "Turkish" +msgstr "turco" + +msgid "Tatar" +msgstr "tartaro" + +msgid "Udmurt" +msgstr "udmurto" + +msgid "Ukrainian" +msgstr "ukrainiano" + +msgid "Urdu" +msgstr "urdu" + +msgid "Uzbek" +msgstr "" + +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" + +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 "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 "" + +msgid "" +"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" + +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 "" + +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 "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 "" + +#, python-format +msgid "“%(value)s” value must be either True, False, or None." +msgstr "" + +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 "" + +#, 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 (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 "Data (con hora)" + +#, python-format +msgid "“%(value)s” value must be a decimal number." +msgstr "" + +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 "" + +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 "" + +msgid "Floating point number" +msgstr "Numero a comma flottante" + +#, python-format +msgid "“%(value)s” value must be an integer." +msgstr "" + +msgid "Integer" +msgstr "Numero integre" + +msgid "Big (8 byte) integer" +msgstr "Numero integre grande (8 bytes)" + +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 "" + +msgid "Boolean (Either True, False or None)" +msgstr "Booleano (ver, false o nulle)" + +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 "Small integer" +msgstr "Parve numero integre" + +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 binari crude" + +#, python-format +msgid "“%(value)s” is not a valid UUID." +msgstr "" + +msgid "Universally unique identifier" +msgstr "" + +msgid "File" +msgstr "File" + +msgid "Image" +msgstr "Imagine" + +#, 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." + +#. 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" + +msgid "ManagementForm data is missing or has been tampered with" +msgstr "Le datos ManagementForm manca o ha essite manipulate" + +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "Per favor, submitte %d o minus formularios." +msgstr[1] "Per favor, submitte %d o minus formularios." + +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "Per favor, submitte %d o plus formularios." +msgstr[1] "Per favor, submitte %d o plus formularios." + +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" + +msgid "Year" +msgstr "" + +msgid "Month" +msgstr "" + +msgid "Day" +msgstr "" + +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 "%d year" +msgid_plural "%d years" +msgstr[0] "%d anno" +msgstr[1] "%d annos" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d mense" +msgstr[1] "%d menses" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d septimana" +msgstr[1] "%d septimanas" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d die" +msgstr[1] "%d dies" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d horas" +msgstr[1] "%d horas" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minuta" +msgstr[1] "%d minutas" + +msgid "0 minutes" +msgstr "0 minutas" + +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 "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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/id/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/id/LC_MESSAGES/django.mo new file mode 100644 index 0000000..8bd1695 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/id/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/id/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/id/LC_MESSAGES/django.po new file mode 100644 index 0000000..598668a --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/id/LC_MESSAGES/django.po @@ -0,0 +1,1297 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Adiyat Mubarak , 2017 +# Claude Paroz , 2018 +# Fery Setiawan , 2015-2019 +# Jannis Leidel , 2011 +# M Asep Indrayana , 2015 +# oon arfiandwi , 2016,2020 +# rodin , 2011 +# rodin , 2013-2016 +# sage , 2018-2019 +# Sutrisno Efendi , 2015,2017 +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 12:25+0000\n" +"Last-Translator: Transifex Bot <>\n" +"Language-Team: Indonesian (http://www.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 "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 "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 "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 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." + +msgid "Enter a valid IPv4 address." +msgstr "Masukkan alamat IPv4 yang valid." + +msgid "Enter a valid IPv6 address." +msgstr "Masukkan alamat IPv6 yang valid" + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Masukkan alamat IPv4 atau IPv6 yang valid" + +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 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 "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 "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 does not exist." +msgstr "Salinan %(model)s dengan %(field)s %(value)r tidak ada." + +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 "" + +#, python-format +msgid "Please submit at most %d form." +msgid_plural "Please submit at most %d forms." +msgstr[0] "" + +#, python-format +msgid "Please submit at least %d form." +msgid_plural "Please submit at least %d forms." +msgstr[0] "" + +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 "%d year" +msgid_plural "%d years" +msgstr[0] "%d tahun" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d bulan" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d minggu" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d hari" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d jam" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%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 sedang melihat pesan ini karena situs HTTPS ini membutuhkan “Referer " +"header” dikirim oleh peramban Web Anda, tetapi tidak terkirim. Bagian kepala " +"tersebut dibutuhkan karena 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/id/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/id/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/id/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/id/formats.py new file mode 100644 index 0000000..b1e08f1 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/id/formats.py @@ -0,0 +1,46 @@ +# 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', '%d/%m/%Y', # '25-10-2009', 25/10/2009' + '%d-%m-%y', '%d/%m/%y', # '25-10-09', 25/10/09' + '%d %b %Y', # '25 Oct 2006', + '%d %B %Y', # '25 October 2006' + '%m/%d/%y', '%m/%d/%Y', # '10/25/06', '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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ig/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ig/LC_MESSAGES/django.mo new file mode 100644 index 0000000..8e689c8 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ig/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ig/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ig/LC_MESSAGES/django.po new file mode 100644 index 0000000..19e47ed --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ig/LC_MESSAGES/django.po @@ -0,0 +1,1271 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ig/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ig/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ig/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ig/formats.py new file mode 100644 index 0000000..61fc2c0 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ig/formats.py @@ -0,0 +1,32 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/io/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/io/LC_MESSAGES/django.mo new file mode 100644 index 0000000..79b81f4 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/io/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/io/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/io/LC_MESSAGES/django.po new file mode 100644 index 0000000..d14d544 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/io/LC_MESSAGES/django.po @@ -0,0 +1,1231 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/is/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/is/LC_MESSAGES/django.mo new file mode 100644 index 0000000..6d631ac Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/is/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/is/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/is/LC_MESSAGES/django.po new file mode 100644 index 0000000..27607b8 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/is/LC_MESSAGES/django.po @@ -0,0 +1,1298 @@ +# 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-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: 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 "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 "" + +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 "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 "Small integer" +msgstr "Lítil heiltala" + +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" + +msgid "ManagementForm data is missing or has been tampered with" +msgstr "Gögn fyrir ManagementForm vantar eða hefur verið breytt" + +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "Vinsamlegast sendu %d eða færri form." +msgstr[1] "Vinsamlegast sendu %d eða færri form." + +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "Vinsamlegast sendu %d eða fleiri form." +msgstr[1] "Vinsamlegast sendu %d eða fleiri 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 "%d year" +msgid_plural "%d years" +msgstr[0] "%d ár" +msgstr[1] "%d ár" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d mánuður" +msgstr[1] "%d mánuðir" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d vika" +msgstr[1] "%d vikur" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d dagur" +msgstr[1] "%d dagar" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d klukkustund" +msgstr[1] "%d klukkustundir" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d mínúta" +msgstr[1] "%d mínútur" + +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 "" +"Þú ert að fá þessi skilaboð því þetta HTTPS vefsvæði þarfnast að vafrinn " +"þinn sendi „Referer“ haus (e. referer header) sem var ekki sendur. Þessi " +"haus er nauðsynlegur 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 “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 "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 "" +"Þú 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/is/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/is/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/is/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/is/formats.py new file mode 100644 index 0000000..e6cc7d5 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/is/formats.py @@ -0,0 +1,21 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/it/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/it/LC_MESSAGES/django.mo new file mode 100644 index 0000000..b0b7ccf Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/it/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/it/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/it/LC_MESSAGES/django.po new file mode 100644 index 0000000..e573034 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/it/LC_MESSAGES/django.po @@ -0,0 +1,1323 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# 0d21a39e384d88c2313b89b5042c04cb, 2017 +# Carlo Miron , 2011 +# Carlo Miron , 2014 +# Carlo Miron , 2018-2019 +# Denis Darii , 2011 +# 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 +# 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: 2021-01-15 09:00+0100\n" +"PO-Revision-Date: 2021-01-15 16:42+0000\n" +"Last-Translator: palmux \n" +"Language-Team: Italian (http://www.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 "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 "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 "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 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." + +msgid "Enter a valid IPv4 address." +msgstr "Inserisci un indirizzo IPv4 valido." + +msgid "Enter a valid IPv6 address." +msgstr "Inserisci un indirizzo IPv6 valido." + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Inserisci un indirizzo IPv4 o IPv6 valido." + +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 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)." + +#, 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)." + +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." + +#, 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." + +#, 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." + +#, 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 "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 "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 does not exist." +msgstr "L'istanza del modello %(model)s con %(field)s %(value)r non esiste." + +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)." + +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 %d form." +msgid_plural "Please submit at most %d forms." +msgstr[0] "Si prega di inviare al massimo %d form." +msgstr[1] "Si prega di inviare al massimo %d form." + +#, python-format +msgid "Please submit at least %d form." +msgid_plural "Please submit at least %d forms." +msgstr[0] "Si prega di inviare almeno %d form." +msgstr[1] "Si prega di inviare almeno %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" + +#, 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 "%d year" +msgid_plural "%d years" +msgstr[0] "%d anno" +msgstr[1] "%d anni" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d mese" +msgstr[1] "%d mesi" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d settimana" +msgstr[1] "%d settimane" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d giorno" +msgstr[1] "%d giorni" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d ora" +msgstr[1] "%d ore" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minuto" +msgstr[1] "%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 "" +"Stai vedendo questo messaggio perché questo sito HTTPS richiede una " +"\"Referer header\" che deve essere inviata dal tuo browser web, ma non è " +"stato inviato nulla. Questo header è richiesto 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 “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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/it/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/it/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/it/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/it/formats.py new file mode 100644 index 0000000..8562aef --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/it/formats.py @@ -0,0 +1,40 @@ +# 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', '%Y/%m/%d', # '25/10/2006', '2008/10/25' + '%d-%m-%Y', '%Y-%m-%d', # '25-10-2006', '2008-10-25' + '%d-%m-%y', '%d/%m/%y', # '25-10-06', '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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ja/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ja/LC_MESSAGES/django.mo new file mode 100644 index 0000000..70d2d5b Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ja/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ja/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ja/LC_MESSAGES/django.po new file mode 100644 index 0000000..bb4c2c4 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ja/LC_MESSAGES/django.po @@ -0,0 +1,1287 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# xiu1 , 2016 +# tadasu , 2020 +# GOTO Hayato , 2019 +# Jannis Leidel , 2011 +# Kentaro Matsuzaki , 2015 +# Masashi SHIBATA , 2017 +# Nikita K , 2019 +# Shinichi Katsumata , 2019 +# Shinya Okano , 2012-2019 +# Takuro Onoue , 2020 +# Takuya N , 2020 +# Tetsuya Morimoto , 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 12:25+0000\n" +"Last-Translator: Transifex Bot <>\n" +"Language-Team: Japanese (http://www.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 "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 "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 "" +"ユニコード文字、数字、アンダースコアまたはハイフンで構成された、有効なスラグ" +"を入力してください。" + +msgid "Enter a valid IPv4 address." +msgstr "有効なIPアドレス (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 "この %(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 "" +"%(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 "" +"“%(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 "" + +#, python-format +msgid "Please submit at most %d form." +msgid_plural "Please submit at most %d forms." +msgstr[0] "" + +#, python-format +msgid "Please submit at least %d form." +msgid_plural "Please submit at least %d 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 " +"では %(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 "%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 "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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ja/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ja/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ja/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ja/formats.py new file mode 100644 index 0000000..2f1faa6 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ja/formats.py @@ -0,0 +1,21 @@ +# 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 = diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ka/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ka/LC_MESSAGES/django.mo new file mode 100644 index 0000000..7cdc3c5 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ka/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ka/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ka/LC_MESSAGES/django.po new file mode 100644 index 0000000..1f342b9 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ka/LC_MESSAGES/django.po @@ -0,0 +1,1239 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ka/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ka/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ka/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ka/formats.py new file mode 100644 index 0000000..86308e3 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ka/formats.py @@ -0,0 +1,42 @@ +# 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', '%m/%d/%Y', '%m/%d/%y', # '2006-10-25', '10/25/2006', '10/25/06' + '%d.%m.%Y', '%d.%m.%y', # '25.10.2006', '25.10.06' + # '%d %b %Y', '%d %b, %Y', '%d %b. %Y', # '25 Oct 2006', '25 Oct, 2006', '25 Oct. 2006' + # '%d %B %Y', '%d %B, %Y', # '25 October 2006', '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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/kab/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/kab/LC_MESSAGES/django.mo new file mode 100644 index 0000000..151ed67 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/kab/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/kab/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/kab/LC_MESSAGES/django.po new file mode 100644 index 0000000..b0f6fa2 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/kab/LC_MESSAGES/django.po @@ -0,0 +1,1211 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/kk/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/kk/LC_MESSAGES/django.mo new file mode 100644 index 0000000..38300b2 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/kk/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/kk/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/kk/LC_MESSAGES/django.po new file mode 100644 index 0000000..2858be0 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/kk/LC_MESSAGES/django.po @@ -0,0 +1,1223 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/km/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/km/LC_MESSAGES/django.mo new file mode 100644 index 0000000..3de6c80 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/km/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/km/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/km/LC_MESSAGES/django.po new file mode 100644 index 0000000..c706129 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/km/LC_MESSAGES/django.po @@ -0,0 +1,1196 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/km/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/km/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/km/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/km/formats.py new file mode 100644 index 0000000..b704e9c --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/km/formats.py @@ -0,0 +1,21 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/kn/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/kn/LC_MESSAGES/django.mo new file mode 100644 index 0000000..c926f57 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/kn/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/kn/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/kn/LC_MESSAGES/django.po new file mode 100644 index 0000000..f2ba2aa --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/kn/LC_MESSAGES/django.po @@ -0,0 +1,1232 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/kn/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/kn/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/kn/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/kn/formats.py new file mode 100644 index 0000000..5003c64 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/kn/formats.py @@ -0,0 +1,21 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ko/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ko/LC_MESSAGES/django.mo new file mode 100644 index 0000000..28903f3 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ko/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ko/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ko/LC_MESSAGES/django.po new file mode 100644 index 0000000..fe8727c --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ko/LC_MESSAGES/django.po @@ -0,0 +1,1285 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# BJ Jang , 2014 +# JunGu Kang , 2017 +# Jiyoon, Ha , 2016 +# 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 +# Seho Noh , 2018 +# Subin Choi , 2016 +# Taesik Yoon , 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-09-05 12:57+0000\n" +"Last-Translator: DONGHO JEONG \n" +"Language-Team: Korean (http://www.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 "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 "문자, 숫자, '_', '-'만 가능합니다." + +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 "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(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' 값은 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 "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 "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\" 값의 형식이 올바르지 않습니다. 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 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 hidden 필드) %(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 개 이하의 양식을 제출하세요." + +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more 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 "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 "%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 "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 "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 "" +"이 페이지는 어떤 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ko/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ko/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ko/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ko/formats.py new file mode 100644 index 0000000..0e281e9 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ko/formats.py @@ -0,0 +1,49 @@ +# 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', '%m/%d/%Y', '%m/%d/%y', # '2006-10-25', '10/25/2006', '10/25/06' + # '%b %d %Y', '%b %d, %Y', # 'Oct 25 2006', 'Oct 25, 2006' + # '%d %b %Y', '%d %b, %Y', # '25 Oct 2006', '25 Oct, 2006' + # '%B %d %Y', '%B %d, %Y', # 'October 25 2006', 'October 25, 2006' + # '%d %B %Y', '%d %B, %Y', # '25 October 2006', '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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ky/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ky/LC_MESSAGES/django.mo new file mode 100644 index 0000000..e394984 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ky/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ky/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ky/LC_MESSAGES/django.po new file mode 100644 index 0000000..b923e3b --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ky/LC_MESSAGES/django.po @@ -0,0 +1,1276 @@ +# 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:54+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 "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 "%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 "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 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ky/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ky/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ky/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ky/formats.py new file mode 100644 index 0000000..1dc42c4 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ky/formats.py @@ -0,0 +1,32 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/lb/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/lb/LC_MESSAGES/django.mo new file mode 100644 index 0000000..2cf2c8b Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/lb/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/lb/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/lb/LC_MESSAGES/django.po new file mode 100644 index 0000000..b0d4755 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/lb/LC_MESSAGES/django.po @@ -0,0 +1,1213 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/lt/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/lt/LC_MESSAGES/django.mo new file mode 100644 index 0000000..aa88229 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/lt/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/lt/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/lt/LC_MESSAGES/django.po new file mode 100644 index 0000000..66e31a9 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/lt/LC_MESSAGES/django.po @@ -0,0 +1,1299 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Kostas , 2011 +# lauris , 2011 +# 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: 2019-09-27 22:40+0200\n" +"PO-Revision-Date: 2019-11-05 00:38+0000\n" +"Last-Translator: Ramiro Morales\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 "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 "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 "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 "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 "Thai" +msgstr "Tailando" + +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" + +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 "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 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 "Small integer" +msgstr "Nedidelis sveikasis skaičius" + +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" + +#, 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." + +#. 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" + +msgid "ManagementForm data is missing or has been tampered with" +msgstr "ManagementForm duomenys buvo sugadinti arba neegzistuoja" + +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "Prašome pateikti %d arba mažiau formų." +msgstr[1] "Prašome pateikti %d arba mažiau formų." +msgstr[2] "Prašome pateikti %d arba mažiau formų." +msgstr[3] "Prašome pateikti %d arba mažiau formų." + +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "Prašome pateikti %d arba daugiau formų." +msgstr[1] "Prašome pateikti %d arba daugiau formų." +msgstr[2] "Prašome pateikti %d arba daugiau formų." +msgstr[3] "Prašome pateikti %d arba daugiau formų." + +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" + +msgid "Year" +msgstr "" + +msgid "Month" +msgstr "" + +msgid "Day" +msgstr "" + +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 "%d year" +msgid_plural "%d years" +msgstr[0] "%d metas" +msgstr[1] "%d metai" +msgstr[2] "%d metų" +msgstr[3] "%d metų" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d mėnuo" +msgstr[1] "%d mėnesiai" +msgstr[2] "%d mėnesių" +msgstr[3] "%d mėnesių" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d savaitė" +msgstr[1] "%d savaitės" +msgstr[2] "%d savaičių" +msgstr[3] "%d savaičių" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d diena" +msgstr[1] "%d dienos" +msgstr[2] "%d dienų" +msgstr[3] "%d dienų" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d valanda" +msgstr[1] "%d valandos" +msgstr[2] "%d valandų" +msgstr[3] "%d valandų" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minutė" +msgstr[1] "%d minutės" +msgstr[2] "%d minučių" +msgstr[3] "%d minučių" + +msgid "0 minutes" +msgstr "0 minučių" + +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 "Django: the Web framework for perfectionists with deadlines." +msgstr "Django: Žiniatinklio karkasas perfekcionistams su terminais." + +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" +"Žiūrėti Django %(version)s išleidimo " +"pastabas" + +msgid "The install worked successfully! Congratulations!" +msgstr "Diegimas pavyko! Sveikiname!" + +#, 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/lt/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/lt/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/lt/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/lt/formats.py new file mode 100644 index 0000000..57631ff --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/lt/formats.py @@ -0,0 +1,43 @@ +# 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', '%d.%m.%Y', '%d.%m.%y', # '2006-10-25', '25.10.2006', '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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/lv/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/lv/LC_MESSAGES/django.mo new file mode 100644 index 0000000..5b90ead Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/lv/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/lv/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/lv/LC_MESSAGES/django.po new file mode 100644 index 0000000..fd9b656 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/lv/LC_MESSAGES/django.po @@ -0,0 +1,1328 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# edgars , 2011 +# NullIsNot0 , 2017 +# NullIsNot0 , 2017-2018 +# Jannis Leidel , 2011 +# krikulis , 2014 +# Māris Nartišs , 2016 +# Mārtiņš Šulcs , 2018 +# NullIsNot0 , 2018-2021 +# peterisb , 2016-2017 +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-25 23:29+0000\n" +"Last-Translator: NullIsNot0 \n" +"Language-Team: Latvian (http://www.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 "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 valoda" + +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 "vācu" + +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 "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 "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 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 \"vienkāršotā teksta\" 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 \"vienkāršotā teksta\" vērtību, kas satur tikai Unikoda " +"burtus, ciparus, apakšsvītras vai defises." + +msgid "Enter a valid IPv4 address." +msgstr "Ievadiet korektu IPv4 adresi." + +msgid "Enter a valid IPv6 address." +msgstr "Ievadiet korektu IPv6 adresi" + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Ievadiet korektu IPv4 vai IPv6 adresi" + +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 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 "Value %(value)r is not a valid choice." +msgstr "Vērtība %(value)r ir nederī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 (True vai False)" + +#, python-format +msgid "String (up to %(max_length)s)" +msgstr "Simbolu virkne (līdz pat %(max_length)s)" + +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 "Plūstošā punkta 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 (jā, nē vai neviens)" + +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 does not exist." +msgstr "%(model)s instance ar %(field)s %(value)r neeksistē." + +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 "Ievadi 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 %d form." +msgid_plural "Please submit at most %d forms." +msgstr[0] "Lūdzu iesniedziet ne vairāk kā %d formu." +msgstr[1] "Lūdzu iesniedziet ne vairāk kā %d formu." +msgstr[2] "Lūdzu iesniedziet ne vairāk kā %d formas." + +#, python-format +msgid "Please submit at least %d form." +msgid_plural "Please submit at least %d forms." +msgstr[0] "Lūdzu iesniedziet vismaz %d formu." +msgstr[1] "Lūdzu iesniedziet vismaz %d formu." +msgstr[2] "Lūdzu iesniedziet vismaz %d formas." + +msgid "Order" +msgstr "Sakārtojums" + +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 "Izmainī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 "%d year" +msgid_plural "%d years" +msgstr[0] "%d gadi" +msgstr[1] "%d gads" +msgstr[2] "%d gadi" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d mēneši" +msgstr[1] "%d mēnesis" +msgstr[2] "%d mēneši" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d nedēļas" +msgstr[1] "%d nedēļa" +msgstr[2] "%d nedēļas" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d dienas" +msgstr[1] "%d diena" +msgstr[2] "%d dienas" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d stundas" +msgstr[1] "%d stunda" +msgstr[2] "%d stundas" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minūtes" +msgstr[1] "%d minūte" +msgstr[2] "%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 ziņojumu, jo šai HTTPS vietnei nepieciešams “Referer header”, " +"kuru bija paredzēts, ka nosūtīs jūsu tīmekļa pārlūkprogramma, bet tas netika " +"nosūtīts. Šis headeris ir vajadzīgs drošības apsvērumu dēļ, lai " +"pārliecinātos, ka trešās puses nepārņems kontroli pār jūsu pārlūkprogrammu." + +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 "Pievienojaties, saņemiet palīdzību vai dodiet ieguldījumu" diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/lv/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/lv/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/lv/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/lv/formats.py new file mode 100644 index 0000000..bc5f3b2 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/lv/formats.py @@ -0,0 +1,44 @@ +# 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', '%d.%m.%Y', '%d.%m.%y', # '2006-10-25', '25.10.2006', '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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/mk/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/mk/LC_MESSAGES/django.mo new file mode 100644 index 0000000..798ca7e Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/mk/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/mk/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/mk/LC_MESSAGES/django.po new file mode 100644 index 0000000..ecd62ce --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/mk/LC_MESSAGES/django.po @@ -0,0 +1,1273 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/mk/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/mk/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/mk/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/mk/formats.py new file mode 100644 index 0000000..18d4782 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/mk/formats.py @@ -0,0 +1,38 @@ +# 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', '%d.%m.%y', # '25.10.2006', '25.10.06' + '%d. %m. %Y', '%d. %m. %y', # '25. 10. 2006', '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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ml/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ml/LC_MESSAGES/django.mo new file mode 100644 index 0000000..bf62b26 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ml/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ml/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ml/LC_MESSAGES/django.po new file mode 100644 index 0000000..4078bd1 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ml/LC_MESSAGES/django.po @@ -0,0 +1,1265 @@ +# 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 +# Rag sagar , 2016 +# Rajeesh Nair , 2011-2012 +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: 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 "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 "" +"അക്ഷരങ്ങള്‍, അക്കങ്ങള്‍, അണ്ടര്‍സ്കോര്‍, ഹൈഫന്‍ എന്നിവ മാത്രം അടങ്ങിയ ശരിയായ ഒരു 'സ്ലഗ്ഗ്' നൽകുക. " + +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 "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 "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 "%(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" + +msgid "ManagementForm data is missing or has been tampered with" +msgstr "ManagementForm ടാറ്റ കാണ്മാനില്ല അല്ലെങ്കിൽ തിരിമറി നടത്തപ്പെട്ടു ." + +#, 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 "" +"%(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 "%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 "സി എസ് ആർ എഫ് പരിശോധന പരാജയപ്പെട്ടു. റിക്വെസ്റ്റ് റദ്ദാക്കി." + +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 "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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ml/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ml/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ml/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ml/formats.py new file mode 100644 index 0000000..ccace3d --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ml/formats.py @@ -0,0 +1,37 @@ +# 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', '%m/%d/%Y', '%m/%d/%y', # '2006-10-25', '10/25/2006', '10/25/06' + # '%b %d %Y', '%b %d, %Y', # 'Oct 25 2006', 'Oct 25, 2006' + # '%d %b %Y', '%d %b, %Y', # '25 Oct 2006', '25 Oct, 2006' + # '%B %d %Y', '%B %d, %Y', # 'October 25 2006', 'October 25, 2006' + # '%d %B %Y', '%d %B, %Y', # '25 October 2006', '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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/mn/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/mn/LC_MESSAGES/django.mo new file mode 100644 index 0000000..06071c9 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/mn/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/mn/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/mn/LC_MESSAGES/django.po new file mode 100644 index 0000000..d846523 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/mn/LC_MESSAGES/django.po @@ -0,0 +1,1256 @@ +# 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 +# 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: 2019-09-27 22:40+0200\n" +"PO-Revision-Date: 2019-11-05 07:28+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" + +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 "Interlingua" + +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 "Хуудасны дугаар бүхэл тоо / 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 "" + +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] "" +"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 "" + +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 "" +"%(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 "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 "" + +#, 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 "“%(value)s” бутархай тоон утга байх ёстой." + +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 "Boolean (Үнэн, худал, эсвэл юу ч биш)" + +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 "UUID" + +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 "%(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 оруулна уу." + +#. 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 "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 "" + +#, 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 "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 "%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 күүки шаардлагатай учир Та энэ " +"мэдэгдлийг харж байна. Энэ күүки нь гуравдагч этгээдээс хамгаалахын тулд " +"шаардлагатай." + +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 нь худлаа учраас %(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 "“%(path)s” хуудас байхгүй байна." + +#, python-format +msgid "Index of %(directory)s" +msgstr "%(directory)s ийн жагсаалт" + +msgid "Django: the Web framework for perfectionists with deadlines." +msgstr "Джанго: Чанартай бөгөөд хугацаанд нь хийхэд зориулсан Web framework." + +#, 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 "" +"Таний тохиргооны файл дээр 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/mn/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/mn/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/mn/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/mn/formats.py new file mode 100644 index 0000000..24c7dec --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/mn/formats.py @@ -0,0 +1,21 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/mr/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/mr/LC_MESSAGES/django.mo new file mode 100644 index 0000000..46c9f34 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/mr/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/mr/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/mr/LC_MESSAGES/django.po new file mode 100644 index 0000000..ab69085 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/mr/LC_MESSAGES/django.po @@ -0,0 +1,1212 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Suraj Kawade, 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: Marathi (http://www.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 "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] "" +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 "" + +#, 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] "" +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] "" +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/my/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/my/LC_MESSAGES/django.mo new file mode 100644 index 0000000..06d9129 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/my/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/my/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/my/LC_MESSAGES/django.po new file mode 100644 index 0000000..a1c7e9a --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/my/LC_MESSAGES/django.po @@ -0,0 +1,1197 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/nb/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/nb/LC_MESSAGES/django.mo new file mode 100644 index 0000000..46a9be6 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/nb/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/nb/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/nb/LC_MESSAGES/django.po new file mode 100644 index 0000000..a75f20e --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/nb/LC_MESSAGES/django.po @@ -0,0 +1,1307 @@ +# 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-2021 +# 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: 2021-01-15 09:00+0100\n" +"PO-Revision-Date: 2021-03-18 14:23+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" + +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 "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 "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 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 "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 "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 %d form." +msgid_plural "Please submit at most %d forms." +msgstr[0] "Vennligst send inn maks %d skjema." +msgstr[1] "Vennligst send inn maks %d skjemaer." + +#, python-format +msgid "Please submit at least %d form." +msgid_plural "Please submit at least %d forms." +msgstr[0] "Vennligst send inn minst %d skjema." +msgstr[1] "Vennligst send inn minst %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 "%d year" +msgid_plural "%d years" +msgstr[0] "%d år" +msgstr[1] "%d år" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d måned" +msgstr[1] "%d måneder" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d uke" +msgstr[1] "%d uker" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d dag" +msgstr[1] "%d dager" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d time" +msgstr[1] "%d timer" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minutt" +msgstr[1] "%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 for å 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/nb/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/nb/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/nb/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/nb/formats.py new file mode 100644 index 0000000..91dd9e6 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/nb/formats.py @@ -0,0 +1,36 @@ +# 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', '%d.%m.%Y', '%d.%m.%y', # '2006-10-25', '25.10.2006', '25.10.06' + # '%d. %b %Y', '%d %b %Y', # '25. okt 2006', '25 okt 2006' + # '%d. %b. %Y', '%d %b. %Y', # '25. okt. 2006', '25 okt. 2006' + # '%d. %B %Y', '%d %B %Y', # '25. oktober 2006', '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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ne/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ne/LC_MESSAGES/django.mo new file mode 100644 index 0000000..2a10814 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ne/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ne/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ne/LC_MESSAGES/django.po new file mode 100644 index 0000000..6882466 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ne/LC_MESSAGES/django.po @@ -0,0 +1,1253 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/nl/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/nl/LC_MESSAGES/django.mo new file mode 100644 index 0000000..ea4b8d6 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/nl/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/nl/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/nl/LC_MESSAGES/django.po new file mode 100644 index 0000000..e8ccbca --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/nl/LC_MESSAGES/django.po @@ -0,0 +1,1311 @@ +# 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 +# Jannis Leidel , 2011 +# Jeffrey Gelens , 2011-2012,2014 +# Michiel Overtoom , 2014 +# Meteor0id, 2019-2020 +# 8de006b1b0894aab6aef71979dcd8bd6_5c6b207 , 2014-2015 +# Tino de Bruijn , 2013 +# Tonnes , 2017,2019-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-15 08:30+0000\n" +"Last-Translator: Tonnes \n" +"Language-Team: Dutch (http://www.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 "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 "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 "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" + +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 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." + +msgid "Enter a valid IPv4 address." +msgstr "Voer een geldig IPv4-adres in." + +msgid "Enter a valid IPv6 address." +msgstr "Voer een geldig IPv6-adres in." + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Voer een geldig IPv4- of IPv6-adres in." + +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 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 "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 "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 "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 "Postitief klein geheel getal" + +#, python-format +msgid "Slug (up to %(max_length)s)" +msgstr "Slug (max. lengte %(max_length)s)" + +msgid "Small integer" +msgstr "Klein geheel getal" + +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 does not exist." +msgstr "%(model)s-instantie met %(field)s %(value)r bestaat niet." + +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" + +msgid "ManagementForm data is missing or has been tampered with" +msgstr "ManagementForm-gegevens ontbreken, of er is mee geknoeid" + +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "Verstuur niet meer dan %d formulier." +msgstr[1] "Verstuur niet meer dan %d formulieren." + +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "Verstuur %d of meer formulieren." +msgstr[1] "Verstuur %d of meer 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 "%d year" +msgid_plural "%d years" +msgstr[0] "%d jaar" +msgstr[1] "%d jaar" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d maand" +msgstr[1] "%d maanden" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d week" +msgstr[1] "%d weken" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d dag" +msgstr[1] "%d dagen" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d uur" +msgstr[1] "%d uur" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minuut" +msgstr[1] "%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 "Django: the Web framework for perfectionists with deadlines." +msgstr "Django: het webframework voor perfectionisten met deadlines." + +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" +"Uitgaveopmerkingen voor Django %(version)s " +"weergeven" + +msgid "The install worked successfully! Congratulations!" +msgstr "De installatie is gelukt! Gefeliciteerd!" + +#, 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 "Beginnen 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/nl/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/nl/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/nl/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/nl/formats.py new file mode 100644 index 0000000..afadb9f --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/nl/formats.py @@ -0,0 +1,66 @@ +# 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', '%d-%m-%y', # '20-01-2009', '20-01-09' + '%d/%m/%Y', '%d/%m/%y', # '20/01/2009', '20/01/09' + '%Y/%m/%d', # '2009/01/20' + # '%d %b %Y', '%d %b %y', # '20 jan 2009', '20 jan 09' + # '%d %B %Y', '%d %B %y', # '20 januari 2009', '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', '%d-%m-%y %H:%M:%S', '%Y-%m-%d %H:%M:%S', + # '20-01-2009 15:23:35', '20-01-09 15:23:35', '2009-01-20 15:23:35' + '%d/%m/%Y %H:%M:%S', '%d/%m/%y %H:%M:%S', '%Y/%m/%d %H:%M:%S', + # '20/01/2009 15:23:35', '20/01/09 15:23:35', '2009/01/20 15:23:35' + # '%d %b %Y %H:%M:%S', '%d %b %y %H:%M:%S', # '20 jan 2009 15:23:35', '20 jan 09 15:23:35' + # '%d %B %Y %H:%M:%S', '%d %B %y %H:%M:%S', # '20 januari 2009 15:23:35', '20 januari 2009 15:23:35' + # With time in %H:%M:%S.%f : + '%d-%m-%Y %H:%M:%S.%f', '%d-%m-%y %H:%M:%S.%f', '%Y-%m-%d %H:%M:%S.%f', + # '20-01-2009 15:23:35.000200', '20-01-09 15:23:35.000200', '2009-01-20 15:23:35.000200' + '%d/%m/%Y %H:%M:%S.%f', '%d/%m/%y %H:%M:%S.%f', '%Y/%m/%d %H:%M:%S.%f', + # '20/01/2009 15:23:35.000200', '20/01/09 15:23:35.000200', '2009/01/20 15:23:35.000200' + # With time in %H.%M:%S : + '%d-%m-%Y %H.%M:%S', '%d-%m-%y %H.%M:%S', # '20-01-2009 15.23:35', '20-01-09 15.23:35' + '%d/%m/%Y %H.%M:%S', '%d/%m/%y %H.%M:%S', # '20/01/2009 15.23:35', '20/01/09 15.23:35' + # '%d %b %Y %H.%M:%S', '%d %b %y %H.%M:%S', # '20 jan 2009 15.23:35', '20 jan 09 15.23:35' + # '%d %B %Y %H.%M:%S', '%d %B %y %H.%M:%S', # '20 januari 2009 15.23:35', '20 januari 2009 15.23:35' + # With time in %H.%M:%S.%f : + '%d-%m-%Y %H.%M:%S.%f', '%d-%m-%y %H.%M:%S.%f', # '20-01-2009 15.23:35.000200', '20-01-09 15.23:35.000200' + '%d/%m/%Y %H.%M:%S.%f', '%d/%m/%y %H.%M:%S.%f', # '20/01/2009 15.23:35.000200', '20/01/09 15.23:35.000200' + # With time in %H:%M : + '%d-%m-%Y %H:%M', '%d-%m-%y %H:%M', '%Y-%m-%d %H:%M', # '20-01-2009 15:23', '20-01-09 15:23', '2009-01-20 15:23' + '%d/%m/%Y %H:%M', '%d/%m/%y %H:%M', '%Y/%m/%d %H:%M', # '20/01/2009 15:23', '20/01/09 15:23', '2009/01/20 15:23' + # '%d %b %Y %H:%M', '%d %b %y %H:%M', # '20 jan 2009 15:23', '20 jan 09 15:23' + # '%d %B %Y %H:%M', '%d %B %y %H:%M', # '20 januari 2009 15:23', '20 januari 2009 15:23' + # With time in %H.%M : + '%d-%m-%Y %H.%M', '%d-%m-%y %H.%M', # '20-01-2009 15.23', '20-01-09 15.23' + '%d/%m/%Y %H.%M', '%d/%m/%y %H.%M', # '20/01/2009 15.23', '20/01/09 15.23' + # '%d %b %Y %H.%M', '%d %b %y %H.%M', # '20 jan 2009 15.23', '20 jan 09 15.23' + # '%d %B %Y %H.%M', '%d %B %y %H.%M', # '20 januari 2009 15.23', '20 januari 2009 15.23' +] +DECIMAL_SEPARATOR = ',' +THOUSAND_SEPARATOR = '.' +NUMBER_GROUPING = 3 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/nn/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/nn/LC_MESSAGES/django.mo new file mode 100644 index 0000000..5629cea Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/nn/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/nn/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/nn/LC_MESSAGES/django.po new file mode 100644 index 0000000..b95b0b0 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/nn/LC_MESSAGES/django.po @@ -0,0 +1,1223 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# hgrimelid , 2011 +# Jannis Leidel , 2011 +# jensadne , 2013 +# Sigurd Gartmann , 2012 +# velmont , 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: 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 "Asturian" +msgstr "" + +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 "" + +msgid "Greek" +msgstr "Gresk" + +msgid "English" +msgstr "Engelsk" + +msgid "Australian English" +msgstr "" + +msgid "British English" +msgstr "Engelsk (britisk)" + +msgid "Esperanto" +msgstr "Esperanto" + +msgid "Spanish" +msgstr "Spansk" + +msgid "Argentinian Spanish" +msgstr "Spansk (argentinsk)" + +msgid "Colombian Spanish" +msgstr "" + +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 "" + +msgid "Galician" +msgstr "Galisisk" + +msgid "Hebrew" +msgstr "Hebraisk" + +msgid "Hindi" +msgstr "Hindi" + +msgid "Croatian" +msgstr "Kroatisk" + +msgid "Upper Sorbian" +msgstr "" + +msgid "Hungarian" +msgstr "Ungarsk" + +msgid "Armenian" +msgstr "" + +msgid "Interlingua" +msgstr "" + +msgid "Indonesian" +msgstr "Indonesisk" + +msgid "Ido" +msgstr "" + +msgid "Icelandic" +msgstr "Islandsk" + +msgid "Italian" +msgstr "Italiensk" + +msgid "Japanese" +msgstr "Japansk" + +msgid "Georgian" +msgstr "Georgisk" + +msgid "Kabyle" +msgstr "" + +msgid "Kazakh" +msgstr "Kasakhisk" + +msgid "Khmer" +msgstr "Khmer" + +msgid "Kannada" +msgstr "Kannada" + +msgid "Korean" +msgstr "Koreansk" + +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 "" + +msgid "Burmese" +msgstr "Burmesisk" + +msgid "Norwegian Bokmål" +msgstr "" + +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 "Thai" +msgstr "Thai" + +msgid "Turkish" +msgstr "Tyrkisk" + +msgid "Tatar" +msgstr "Tatarisk" + +msgid "Udmurt" +msgstr "Udmurtisk" + +msgid "Ukrainian" +msgstr "Ukrainsk" + +msgid "Urdu" +msgstr "Urdu" + +msgid "Uzbek" +msgstr "" + +msgid "Vietnamese" +msgstr "Vietnamesisk" + +msgid "Simplified Chinese" +msgstr "Simplifisert kinesisk" + +msgid "Traditional Chinese" +msgstr "Tradisjonell kinesisk" + +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 "Oppgje ein gyldig verdi." + +msgid "Enter a valid URL." +msgstr "Oppgje ei gyldig nettadresse." + +msgid "Enter a valid integer." +msgstr "" + +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 "" + +msgid "" +"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" + +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] "" +msgstr[1] "" + +msgid "Enter a number." +msgstr "Oppgje eit 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] "" +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 "og" + +#, 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 "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 "" + +#, 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 "" + +#, python-format +msgid "“%(value)s” value must be either True, False, or None." +msgstr "" + +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 "" + +#, 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 (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 "" + +#, 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 (med tid)" + +#, python-format +msgid "“%(value)s” value must be a decimal number." +msgstr "" + +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 "" + +msgid "Duration" +msgstr "" + +msgid "Email address" +msgstr "E-postadresse" + +msgid "File path" +msgstr "Filsti" + +#, python-format +msgid "“%(value)s” value must be a float." +msgstr "" + +msgid "Floating point number" +msgstr "Flyttall" + +#, python-format +msgid "“%(value)s” value must be an integer." +msgstr "" + +msgid "Integer" +msgstr "Heiltal" + +msgid "Big (8 byte) integer" +msgstr "Stort (8 bitar) 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 "" + +msgid "Boolean (Either True, False or None)" +msgstr "Boolsk (True, False eller None)" + +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 "Small integer" +msgstr "Lite heiltal" + +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 "Tid" + +msgid "URL" +msgstr "Nettadresse" + +msgid "Raw binary data" +msgstr "" + +#, python-format +msgid "“%(value)s” is not a valid UUID." +msgstr "" + +msgid "Universally unique identifier" +msgstr "" + +msgid "File" +msgstr "Fil" + +msgid "Image" +msgstr "Bilete" + +#, python-format +msgid "%(model)s instance with %(field)s %(value)r does not exist." +msgstr "" + +msgid "Foreign Key (type determined by related field)" +msgstr "Primærnø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 "" + +#, python-format +msgid "%(from)s-%(to)s relationships" +msgstr "" + +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 heiltall." + +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 "" + +#, 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 "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] "" +msgstr[1] "" + +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 "" + +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 "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 "" + +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 "" + +#, 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 "Tøm" + +msgid "Currently" +msgstr "Noverande" + +msgid "Change" +msgstr "Endre" + +msgid "Unknown" +msgstr "Ukjend" + +msgid "Yes" +msgstr "Ja" + +msgid "No" +msgstr "Nei" + +msgid "Year" +msgstr "" + +msgid "Month" +msgstr "" + +msgid "Day" +msgstr "" + +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 "" + +#, python-format +msgctxt "String to return when truncating text" +msgid "%(truncated_text)s…" +msgstr "" + +msgid "or" +msgstr "eller" + +#. 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 år" +msgstr[1] "%d år" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d månad" +msgstr[1] "%d månader" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d veke" +msgstr[1] "%d veker" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d dag" +msgstr[1] "%d dagar" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d time" +msgstr[1] "%d timar" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "" +msgstr[1] "" + +msgid "0 minutes" +msgstr "0 minutt" + +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 "Årstal ikkje spesifisert" + +msgid "Date out of range" +msgstr "" + +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 "" + +#, 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 "" + +#, 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 "Mappeindeksar er ikkje tillate her." + +#, python-format +msgid "“%(path)s” does not exist" +msgstr "" + +#, python-format +msgid "Index of %(directory)s" +msgstr "Indeks for %(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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/nn/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/nn/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/nn/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/nn/formats.py new file mode 100644 index 0000000..91dd9e6 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/nn/formats.py @@ -0,0 +1,36 @@ +# 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', '%d.%m.%Y', '%d.%m.%y', # '2006-10-25', '25.10.2006', '25.10.06' + # '%d. %b %Y', '%d %b %Y', # '25. okt 2006', '25 okt 2006' + # '%d. %b. %Y', '%d %b. %Y', # '25. okt. 2006', '25 okt. 2006' + # '%d. %B %Y', '%d %B %Y', # '25. oktober 2006', '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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/os/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/os/LC_MESSAGES/django.mo new file mode 100644 index 0000000..b17907e Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/os/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/os/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/os/LC_MESSAGES/django.po new file mode 100644 index 0000000..f3badb7 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/os/LC_MESSAGES/django.po @@ -0,0 +1,1235 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/pa/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/pa/LC_MESSAGES/django.mo new file mode 100644 index 0000000..a8fa88b Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/pa/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/pa/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/pa/LC_MESSAGES/django.po new file mode 100644 index 0000000..d71b5f7 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/pa/LC_MESSAGES/django.po @@ -0,0 +1,1213 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/pl/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/pl/LC_MESSAGES/django.mo new file mode 100644 index 0000000..790751b Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/pl/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/pl/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/pl/LC_MESSAGES/django.po new file mode 100644 index 0000000..67c6609 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/pl/LC_MESSAGES/django.po @@ -0,0 +1,1380 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# sidewinder , 2014 +# Adam Stachowicz , 2015 +# angularcircle, 2011,2013 +# angularcircle, 2011,2013 +# angularcircle, 2014 +# Dariusz Paluch , 2015 +# Jannis Leidel , 2011 +# Janusz Harkot , 2014-2015 +# Kacper Krupa , 2013 +# Karol , 2012 +# 0d5641585fd67fbdb97037c19ab83e4c_18c98b0 , 2011 +# 0d5641585fd67fbdb97037c19ab83e4c_18c98b0 , 2011 +# Łukasz Rekucki (lqc) , 2011 +# m_aciek , 2016-2021 +# m_aciek , 2015 +# Mariusz Felisiak , 2020-2021 +# 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 +# sidewinder , 2014 +# Tomasz Kajtoch , 2016-2017 +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-01 19:45+0000\n" +"Last-Translator: m_aciek \n" +"Language-Team: Polish (http://www.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 "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 "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 "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 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." + +msgid "Enter a valid IPv4 address." +msgstr "Wprowadź poprawny adres IPv4." + +msgid "Enter a valid IPv6 address." +msgstr "Wprowadź poprawny adres IPv6." + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Wprowadź poprawny adres 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 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 "%(model_name)s z tymi %(field_labels)s już istnieje." + +#, 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 "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 does not exist." +msgstr "%(model)s z polem %(field)s o wartości %(value)r nie istnieje." + +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 %d form." +msgid_plural "Please submit at most %d forms." +msgstr[0] "Proszę wysłać co najwyżej %d formularz." +msgstr[1] "Proszę wysłać co najwyżej %d formularze." +msgstr[2] "Proszę wysłać co najwyżej %d formularzy." +msgstr[3] "Proszę wysłać co najwyżej %d formularzy." + +#, python-format +msgid "Please submit at least %d form." +msgid_plural "Please submit at least %d forms." +msgstr[0] "Proszę wysłać co najmniej %d formularz." +msgstr[1] "Proszę wysłać co najmniej %d formularze." +msgstr[2] "Proszę wysłać co najmniej %d formularzy." +msgstr[3] "Proszę wysłać co najmniej %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 "%d year" +msgid_plural "%d years" +msgstr[0] "%d rok" +msgstr[1] "%d lata" +msgstr[2] "%d lat" +msgstr[3] "%d lat" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d miesiąc" +msgstr[1] "%d miesiące" +msgstr[2] "%d miesięcy" +msgstr[3] "%d miesięcy" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d tydzień" +msgstr[1] "%d tygodnie" +msgstr[2] "%d tygodni" +msgstr[3] "%d tygodni" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d dzień" +msgstr[1] "%d dni" +msgstr[2] "%d dni" +msgstr[3] "%d dni" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d godzina" +msgstr[1] "%d godziny" +msgstr[2] "%d godzin" +msgstr[3] "%d godzin" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minuta" +msgstr[1] "%d minuty" +msgstr[2] "%d minut" +msgstr[3] "%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 header”, 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/pl/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/pl/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/pl/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/pl/formats.py new file mode 100644 index 0000000..e666544 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/pl/formats.py @@ -0,0 +1,28 @@ +# 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', '%d.%m.%y', # '25.10.2006', '25.10.06' + '%y-%m-%d', # '06-10-25' + # '%d. %B %Y', '%d. %b. %Y', # '25. October 2006', '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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/pt/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/pt/LC_MESSAGES/django.mo new file mode 100644 index 0000000..2842e75 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/pt/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/pt/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/pt/LC_MESSAGES/django.po new file mode 100644 index 0000000..311c21c --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/pt/LC_MESSAGES/django.po @@ -0,0 +1,1254 @@ +# 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 +# Nuno Mariz , 2011-2013,2015-2018 +# Paulo Köch , 2011 +# Raúl Pedro Fernandes Santos, 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: Portuguese (http://www.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 "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 "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 "" + +msgid "Interlingua" +msgstr "Interlíngua" + +msgid "Indonesian" +msgstr "Indonésio" + +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 "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 "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 "Thai" +msgstr "Thai" + +msgid "Turkish" +msgstr "Turco" + +msgid "Tatar" +msgstr "Tatar" + +msgid "Udmurt" +msgstr "Udmurte" + +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" + +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 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 "" + +msgid "Enter a valid IPv4 address." +msgstr "Introduza um endereço IPv4 válido." + +msgid "Enter a valid IPv6 address." +msgstr "Insira um endereço IPv6 válido." + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Digite um endereço válido 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 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)." + +#, 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)." + +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." + +#, 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." + +#, 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." + +#, 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 "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 "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 "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 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 "Small integer" +msgstr "Inteiro pequeno" + +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 "" + +msgid "File" +msgstr "Ficheiro" + +msgid "Image" +msgstr "Imagem" + +#, 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 "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)." + +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." + +#. 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 "Os dados do ManagementForm estão em falta ou foram adulterados" + +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "Por favor submeta %d ou menos formulários." +msgstr[1] "Por favor submeta %d ou menos formulários." + +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "Por favor submeta %d ou mais formulários." +msgstr[1] "Por favor submeta %d ou mais 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 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" + +msgid "Year" +msgstr "" + +msgid "Month" +msgstr "" + +msgid "Day" +msgstr "" + +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" + +#, 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 "" + +msgid "or" +msgstr "ou" + +#. 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 ano" +msgstr[1] "%d anos" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d mês" +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 dia" +msgstr[1] "%d dias" + +#, 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 "0 minutes" +msgstr "0 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 "" + +#, python-format +msgid "Index of %(directory)s" +msgstr "Índice de %(directory)s" + +msgid "Django: the Web framework for perfectionists with deadlines." +msgstr "Django: the Web framework for perfectionists with deadlines." + +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" +"Visualizar notas de lançamento do Django " +"%(version)s" + +msgid "The install worked successfully! Congratulations!" +msgstr "A instalação funcionou com sucesso! Parabéns!" + +#, 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 "" + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/pt/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/pt/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/pt/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/pt/formats.py new file mode 100644 index 0000000..b0fbbad --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/pt/formats.py @@ -0,0 +1,35 @@ +# 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', '%d/%m/%Y', '%d/%m/%y', # '2006-10-25', '25/10/2006', '25/10/06' + # '%d de %b de %Y', '%d de %b, %Y', # '25 de Out de 2006', '25 Out, 2006' + # '%d de %B de %Y', '%d de %B, %Y', # '25 de Outubro de 2006', '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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/pt_BR/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/pt_BR/LC_MESSAGES/django.mo new file mode 100644 index 0000000..556d475 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/pt_BR/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/pt_BR/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/pt_BR/LC_MESSAGES/django.po new file mode 100644 index 0000000..a039f91 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/pt_BR/LC_MESSAGES/django.po @@ -0,0 +1,1334 @@ +# 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 C. Leite , 2020 +# Carlos C. Leite , 2016,2019 +# Filipe Cifali Stangler , 2016 +# Claudio Rogerio Carvalho Filho , 2020 +# dudanogueira , 2012 +# dudanogueira , 2019 +# Elyézer Rezende , 2013 +# Fábio C. Barrionuevo da Luz , 2014-2015 +# Felipe Rodrigues , 2016 +# Filipe Cifali Stangler , 2019 +# Gladson , 2013 +# semente, 2011-2014 +# Igor Cavalcante , 2017 +# Jannis Leidel , 2011 +# Lucas Infante , 2015 +# Luiz Boaretto , 2017 +# Marcelo Moro Brondani , 2018 +# Rafael Fontenelle , 2021 +# 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: 2021-01-15 09:00+0100\n" +"PO-Revision-Date: 2021-01-17 05:42+0000\n" +"Last-Translator: Rafael Fontenelle \n" +"Language-Team: Portuguese (Brazil) (http://www.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 "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 "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 "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 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." + +msgid "Enter a valid IPv4 address." +msgstr "Insira um endereço IPv4 válido." + +msgid "Enter a valid IPv6 address." +msgstr "Insira um endereço IPv6 válido." + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Insira um endereço IPv4 ou IPv6 válido." + +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 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)." + +#, 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)." + +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." + +#, 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." + +#, 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." + +#, 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 "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 "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 " +"YYY-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)." + +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 %d form." +msgid_plural "Please submit at most %d forms." +msgstr[0] "Por favor, envie no máximo %d formulário." +msgstr[1] "Por favor, envie no máximo %d formulários." + +#, python-format +msgid "Please submit at least %d form." +msgid_plural "Please submit at least %d forms." +msgstr[0] "Por favor, envie no mínimo %d formulário." +msgstr[1] "Por favor, envie no mínimo %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" + +#, 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 "%d year" +msgid_plural "%d years" +msgstr[0] "%d ano" +msgstr[1] "%d anos" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d mês" +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 dia" +msgstr[1] "%d dias" + +#, 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 "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 “Referer " +"header” seja enviado pelo seu Web browser, mas nenhum foi enviado. Este " +"cabeçalho é requierido por razões de segurança, para assegurar que seu " +"browser não foi sequestrado 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/pt_BR/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/pt_BR/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/pt_BR/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/pt_BR/formats.py new file mode 100644 index 0000000..ed0c09f --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/pt_BR/formats.py @@ -0,0 +1,31 @@ +# 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', '%d/%m/%y', # '25/10/2006', '25/10/06' + # '%d de %b de %Y', '%d de %b, %Y', # '25 de Out de 2006', '25 Out, 2006' + # '%d de %B de %Y', '%d de %B, %Y', # '25 de Outubro de 2006', '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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ro/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ro/LC_MESSAGES/django.mo new file mode 100644 index 0000000..6d863c2 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ro/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ro/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ro/LC_MESSAGES/django.po new file mode 100644 index 0000000..49dc828 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ro/LC_MESSAGES/django.po @@ -0,0 +1,1284 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Abel Radac , 2017 +# Bogdan Mateescu, 2018-2019 +# mihneasim , 2011 +# Daniel Ursache-Dogariu, 2011 +# Denis Darii , 2011,2014 +# Ionel Cristian Mărieș , 2012 +# Jannis Leidel , 2011 +# Răzvan Ionescu , 2015 +# Razvan Stefanescu , 2016-2017 +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 05:57+0000\n" +"Last-Translator: Bogdan Mateescu\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 "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 "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 "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 "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 "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 "Thai" +msgstr "Tailandeză" + +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" + +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 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 "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 "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 "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 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 "Small integer" +msgstr "Întreg mic" + +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" + +#, 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." + +#. 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" + +msgid "ManagementForm data is missing or has been tampered with" +msgstr "Datele pentru ManagementForm lipsesc sau au fost alterate" + +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "Trimiteți maxim %d formular." +msgstr[1] "Trimiteți maxim %d formulare." +msgstr[2] "Trimiteți maxim %d de formulare." + +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "Trimiteți minim %d formular." +msgstr[1] "Trimiteți minim %d formulare." +msgstr[2] "Trimiteți minim %d de formulare." + +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" + +msgid "Year" +msgstr "Anul" + +msgid "Month" +msgstr "Luna" + +msgid "Day" +msgstr "Ziua" + +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 "%d year" +msgid_plural "%d years" +msgstr[0] "%d an" +msgstr[1] "%d ani" +msgstr[2] "%d de ani" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d lună" +msgstr[1] "%d luni" +msgstr[2] "%d de luni" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d săptămână" +msgstr[1] "%d săptămâni" +msgstr[2] "%d de săptămâni" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d zi" +msgstr[1] "%d zile" +msgstr[2] "%d de zile" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d oră" +msgstr[1] "%d ore" +msgstr[2] "%d de ore" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minut" +msgstr[1] "%d minute" +msgstr[2] "%d de minute" + +msgid "0 minutes" +msgstr "0 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 "Django: the Web framework for perfectionists with deadlines." +msgstr "Django: Framework-ul web pentru perfecționiști cu termene limită." + +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" +"Vezi notele de lansare pentru Django " +"%(version)s" + +msgid "The install worked successfully! Congratulations!" +msgstr "Instalarea a funcționat cu succes! Felicitări!" + +#, 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ro/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ro/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ro/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ro/formats.py new file mode 100644 index 0000000..8cefeb8 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ro/formats.py @@ -0,0 +1,35 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ru/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ru/LC_MESSAGES/django.mo new file mode 100644 index 0000000..75c5572 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ru/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ru/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ru/LC_MESSAGES/django.po new file mode 100644 index 0000000..efc6812 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ru/LC_MESSAGES/django.po @@ -0,0 +1,1386 @@ +# 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 +# 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 +# Дмитрий Шатера , 2016,2018 +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-16 22:50+0000\n" +"Last-Translator: Panasoft\n" +"Language-Team: Russian (http://www.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 "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 "Введите правильный 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)." +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 "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” имеет неверный формат даты. Оно должно быть в формате " +"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 %d form." +msgid_plural "Please submit at most %d forms." +msgstr[0] "Пожалуйста, отправляйте не больше %d формы." +msgstr[1] "Пожалуйста, отправляйте не больше %d форм." +msgstr[2] "Пожалуйста, отправляйте не больше %d форм." +msgstr[3] "Пожалуйста, отправляйте не больше %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 форм." + +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 "%d year" +msgid_plural "%d years" +msgstr[0] "%d год" +msgstr[1] "%d года" +msgstr[2] "%d лет" +msgstr[3] "%d лет" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d месяц" +msgstr[1] "%d месяца" +msgstr[2] "%d месяцев" +msgstr[3] "%d месяцев" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d неделя" +msgstr[1] "%d недели" +msgstr[2] "%d недель" +msgstr[3] "%d недель" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d день" +msgstr[1] "%d дня" +msgstr[2] "%d дней" +msgstr[3] "%d дней" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d час" +msgstr[1] "%d часа" +msgstr[2] "%d часов" +msgstr[3] "%d часов" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d минута" +msgstr[1] "%d минуты" +msgstr[2] "%d минут" +msgstr[3] "%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” был передан вашим браузером, " +"но он не был им передан. Данный заголовок необходим по соображениям " +"безопасности, чтобы убедиться, что ваш браузер не был взломан, а запрос к " +"серверу не был перехвачен или подменён." + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ru/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ru/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ru/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ru/formats.py new file mode 100644 index 0000000..c601c3e --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ru/formats.py @@ -0,0 +1,30 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sk/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sk/LC_MESSAGES/django.mo new file mode 100644 index 0000000..f27fa2a Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sk/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sk/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sk/LC_MESSAGES/django.po new file mode 100644 index 0000000..01edca7 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sk/LC_MESSAGES/django.po @@ -0,0 +1,1320 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# 18f25ad6fa9930fc67cb11aca9d16a27, 2012-2013 +# Marian Andre , 2013,2015,2017-2018 +# Martin Kosír, 2011 +# Martin Tóth , 2017 +# Peter Stríž , 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-01-15 12:25+0000\n" +"Last-Translator: Transifex Bot <>\n" +"Language-Team: Slovak (http://www.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 "" + +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 "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 "" + +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 "" + +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 "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 "" + +msgid "Thai" +msgstr "thajsky" + +msgid "Turkmen" +msgstr "" + +msgid "Turkish" +msgstr "turecky" + +msgid "Tatar" +msgstr "tatársky" + +msgid "Udmurt" +msgstr "udmurtsky" + +msgid "Ukrainian" +msgstr "ukrajinsky" + +msgid "Urdu" +msgstr "urdsky" + +msgid "Uzbek" +msgstr "" + +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 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 "" + +msgid "" +"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" + +msgid "Enter a valid IPv4 address." +msgstr "Zadajte platnú IPv4 adresu." + +msgid "Enter a valid IPv6 address." +msgstr "Zadajte platnú IPv6 adresu." + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Zadajte platnú IPv4 alebo IPv6 adresu." + +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 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 "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ť unikátne 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 "'%(value)s' value musí byť True alebo False." + +#, python-format +msgid "“%(value)s” value must be either True, False, or None." +msgstr "'%(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 "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 "'%(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 "" +"'%(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 "" + +#, 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 "Dátum (a čas)" + +#, python-format +msgid "“%(value)s” value must be a decimal number." +msgstr "'%(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 "" + +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 "" + +msgid "Floating point number" +msgstr "Číslo s plávajúcou desatinnou čiarkou" + +#, python-format +msgid "“%(value)s” value must be an integer." +msgstr "'%(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 "" + +msgid "Boolean (Either True, False or None)" +msgstr "Logická hodnota (buď True, False alebo None)" + +msgid "Positive big integer" +msgstr "" + +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 "" + +#, 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" + +msgid "Raw binary data" +msgstr "Binárne údaje" + +#, python-format +msgid "“%(value)s” is not a valid UUID." +msgstr "" + +msgid "Universally unique identifier" +msgstr "Úplne všade 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 "" + +#, 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 "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ť unikátne, 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ť unikátne 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 "" + +#, 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 "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 "" + +msgid "or" +msgstr "alebo" + +#. 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 rok" +msgstr[1] "%d roky" +msgstr[2] "%d rokov" +msgstr[3] "%d rokov" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d mesiac" +msgstr[1] "%d mesiace" +msgstr[2] "%d mesiacov" +msgstr[3] "%d mesiacov" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d týždeň" +msgstr[1] "%d týždne" +msgstr[2] "%d týždňov" +msgstr[3] "%d týždňov" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d deň" +msgstr[1] "%d dni" +msgstr[2] "%d dní" +msgstr[3] "%d dní" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d hodina" +msgstr[1] "%d hodiny" +msgstr[2] "%d hodín" +msgstr[3] "%d hodín" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minúta" +msgstr[1] "%d minúty" +msgstr[2] "%d minút" +msgstr[3] "%d minút" + +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 "" + +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 "" +"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 "" + +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 "" + +#, 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 "" + +#, 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 "" + +msgid "Directory indexes are not allowed here." +msgstr "Výpis adresárov tu nieje povolený." + +#, python-format +msgid "“%(path)s” does not exist" +msgstr "" + +#, 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 "" + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sk/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sk/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sk/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sk/formats.py new file mode 100644 index 0000000..2052641 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sk/formats.py @@ -0,0 +1,28 @@ +# 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', '%d.%m.%y', # '25.10.2006', '25.10.06' + '%y-%m-%d', # '06-10-25' + # '%d. %B %Y', '%d. %b. %Y', # '25. October 2006', '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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sl/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sl/LC_MESSAGES/django.mo new file mode 100644 index 0000000..e01103d Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sl/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sl/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sl/LC_MESSAGES/django.po new file mode 100644 index 0000000..ff3cbc5 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sl/LC_MESSAGES/django.po @@ -0,0 +1,1297 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# iElectric , 2011-2012 +# Jannis Leidel , 2011 +# Jure Cuhalev , 2012-2013 +# Marko Zabreznik , 2016 +# Primož Verdnik , 2017 +# zejn , 2013,2016-2017 +# zejn , 2011-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: Slovenian (http://www.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 "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 "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 "" + +msgid "Interlingua" +msgstr "Interlingua" + +msgid "Indonesian" +msgstr "Indonezijski" + +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 "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 "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 "Thai" +msgstr "Tajski jezik" + +msgid "Turkish" +msgstr "Turščina" + +msgid "Tatar" +msgstr "Tatarščina" + +msgid "Udmurt" +msgstr "Udmurski jezik" + +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" + +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 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 "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 "" + +#, 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 "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 "" + +#, 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 (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 "" + +msgid "Floating point number" +msgstr "Število s plavajočo vejico" + +#, python-format +msgid "“%(value)s” value must be an integer." +msgstr "" + +msgid "Integer" +msgstr "Celo število (integer)" + +msgid "Big (8 byte) integer" +msgstr "Velika (8 bajtna) cela števila " + +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 "" + +msgid "Boolean (Either True, False or None)" +msgstr "Boolova vrednost (True, False ali None)" + +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 "Small integer" +msgstr "Celo število" + +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" + +#, 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." + +#. 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" + +msgid "ManagementForm data is missing or has been tampered with" +msgstr "Podatki iz ManagementForm manjkajo ali pa so bili spreminjani." + +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "Pošljite največ %d obrazec." +msgstr[1] "Pošljite največ %d obrazca." +msgstr[2] "Pošljite največ %d obrazce." +msgstr[3] "Pošljite največ %d obrazcev." + +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "Prosimo vnesite %d ali več vnosov." +msgstr[1] "Prosimo vnesite %d ali več vnosov." +msgstr[2] "Prosimo vnesite %d ali več vnosov." +msgstr[3] "Prosimo vnesite %d ali več vnosov." + +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" + +msgid "Year" +msgstr "" + +msgid "Month" +msgstr "" + +msgid "Day" +msgstr "" + +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 "%d year" +msgid_plural "%d years" +msgstr[0] "%d leto" +msgstr[1] "%d leti" +msgstr[2] "%d leta" +msgstr[3] "%d let" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d mesec" +msgstr[1] "%d meseca" +msgstr[2] "%d mesece" +msgstr[3] "%d mesecev" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d teden" +msgstr[1] "%d tedna" +msgstr[2] "%d tedne" +msgstr[3] "%d tednov" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d dan" +msgstr[1] "%d dneva" +msgstr[2] "%d dni" +msgstr[3] "%d dni" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d ura" +msgstr[1] "%d uri" +msgstr[2] "%d ure" +msgstr[3] "%d ur" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minuta" +msgstr[1] "%d minuti" +msgstr[2] "%d minute" +msgstr[3] "%d minut" + +msgid "0 minutes" +msgstr "0 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 "" + +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 "" + +#, 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 "" + +#, python-format +msgid "Index of %(directory)s" +msgstr "Vsebina mape %(directory)s" + +msgid "Django: the Web framework for perfectionists with deadlines." +msgstr "Django: spletno ogrodje za perfekcioniste s časovnimi roki." + +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" +"Oglejte si obvestila ob izdaji za Django " +"%(version)s" + +msgid "The install worked successfully! Congratulations!" +msgstr "Namestitev se je uspešno izvedla! Čestitke!" + +#, 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sl/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sl/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sl/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sl/formats.py new file mode 100644 index 0000000..35de5ad --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sl/formats.py @@ -0,0 +1,42 @@ +# 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', '%d.%m.%y', # '25.10.2006', '25.10.06' + '%d-%m-%Y', # '25-10-2006' + '%d. %m. %Y', '%d. %m. %y', # '25. 10. 2006', '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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sq/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sq/LC_MESSAGES/django.mo new file mode 100644 index 0000000..0a1e5e2 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sq/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sq/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sq/LC_MESSAGES/django.po new file mode 100644 index 0000000..82ac0d0 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sq/LC_MESSAGES/django.po @@ -0,0 +1,1314 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Besnik Bleta , 2011-2014 +# Besnik Bleta , 2020-2021 +# Besnik Bleta , 2015-2019 +# 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 13:59+0000\n" +"Last-Translator: Besnik Bleta \n" +"Language-Team: Albanian (http://www.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 "Arabe" + +msgid "Algerian Arabic" +msgstr "Arabishte Algjeriane" + +msgid "Asturian" +msgstr "Asturiase" + +msgid "Azerbaijani" +msgstr "Azerbaixhanase" + +msgid "Bulgarian" +msgstr "Bulgare" + +msgid "Belarusian" +msgstr "Bjelloruse" + +msgid "Bengali" +msgstr "Bengaleze" + +msgid "Breton" +msgstr "Bretone" + +msgid "Bosnian" +msgstr "Boshnjake" + +msgid "Catalan" +msgstr "Katalane" + +msgid "Czech" +msgstr "Çeke" + +msgid "Welsh" +msgstr "Uellsiane" + +msgid "Danish" +msgstr "Daneze" + +msgid "German" +msgstr "Gjermane" + +msgid "Lower Sorbian" +msgstr "Sorbiane e Poshtme" + +msgid "Greek" +msgstr "Greke" + +msgid "English" +msgstr "Angleze" + +msgid "Australian English" +msgstr "Angleze Australiane" + +msgid "British English" +msgstr "Angleze Britanike" + +msgid "Esperanto" +msgstr "Esperanto" + +msgid "Spanish" +msgstr "Spanjolle" + +msgid "Argentinian Spanish" +msgstr "Spanjolle Argjentinase" + +msgid "Colombian Spanish" +msgstr "Spanjolle Kolumbiane" + +msgid "Mexican Spanish" +msgstr "Spanjolle Meksikane" + +msgid "Nicaraguan Spanish" +msgstr "Spanjolle Nikaraguane" + +msgid "Venezuelan Spanish" +msgstr "Spanjolle Venezuelane" + +msgid "Estonian" +msgstr "Estoneze" + +msgid "Basque" +msgstr "Baske" + +msgid "Persian" +msgstr "Persiane" + +msgid "Finnish" +msgstr "Finlandeze" + +msgid "French" +msgstr "Frënge" + +msgid "Frisian" +msgstr "Frisiane" + +msgid "Irish" +msgstr "Irlandeze" + +msgid "Scottish Gaelic" +msgstr "Skoceze Gaelike" + +msgid "Galician" +msgstr "Galike" + +msgid "Hebrew" +msgstr "Hebraishte" + +msgid "Hindi" +msgstr "Indiane" + +msgid "Croatian" +msgstr "Kroate" + +msgid "Upper Sorbian" +msgstr "Sorbiane e Sipërme" + +msgid "Hungarian" +msgstr "Hungareze" + +msgid "Armenian" +msgstr "Armenisht" + +msgid "Interlingua" +msgstr "Interlingua" + +msgid "Indonesian" +msgstr "Indoneziane" + +msgid "Igbo" +msgstr "Igbo" + +msgid "Ido" +msgstr "Ido" + +msgid "Icelandic" +msgstr "Islandeze" + +msgid "Italian" +msgstr "Italiane" + +msgid "Japanese" +msgstr "Japoneze" + +msgid "Georgian" +msgstr "Gjeorgjiane" + +msgid "Kabyle" +msgstr "Kabilase" + +msgid "Kazakh" +msgstr "Kazake" + +msgid "Khmer" +msgstr "Khmere" + +msgid "Kannada" +msgstr "Kannada" + +msgid "Korean" +msgstr "Koreane" + +msgid "Kyrgyz" +msgstr "Kirgize" + +msgid "Luxembourgish" +msgstr "Luksemburgase" + +msgid "Lithuanian" +msgstr "Lituaneze" + +msgid "Latvian" +msgstr "Letoneze" + +msgid "Macedonian" +msgstr "Maqedone" + +msgid "Malayalam" +msgstr "Malajalame" + +msgid "Mongolian" +msgstr "Mongoliane" + +msgid "Marathi" +msgstr "Marati" + +msgid "Burmese" +msgstr "Burmeze" + +msgid "Norwegian Bokmål" +msgstr "Norvegjeze Bokmal" + +msgid "Nepali" +msgstr "Nepaleze" + +msgid "Dutch" +msgstr "Holandeze" + +msgid "Norwegian Nynorsk" +msgstr "Norvegjeze Nynorsk" + +msgid "Ossetic" +msgstr "Osetishte" + +msgid "Punjabi" +msgstr "Panxhabe" + +msgid "Polish" +msgstr "Polake" + +msgid "Portuguese" +msgstr "Portugeze" + +msgid "Brazilian Portuguese" +msgstr "Portugeze Braziliane" + +msgid "Romanian" +msgstr "Rumune" + +msgid "Russian" +msgstr "Ruse" + +msgid "Slovak" +msgstr "Sllovake " + +msgid "Slovenian" +msgstr "Slovene" + +msgid "Albanian" +msgstr "Shqipe" + +msgid "Serbian" +msgstr "Serbe" + +msgid "Serbian Latin" +msgstr "Serbe Latine" + +msgid "Swedish" +msgstr "Suedeze" + +msgid "Swahili" +msgstr "Swahili" + +msgid "Tamil" +msgstr "Tamileze" + +msgid "Telugu" +msgstr "Telugu" + +msgid "Tajik" +msgstr "Taxhike" + +msgid "Thai" +msgstr "Tajlandeze" + +msgid "Turkmen" +msgstr "Turkmene" + +msgid "Turkish" +msgstr "Turke" + +msgid "Tatar" +msgstr "Tatare" + +msgid "Udmurt" +msgstr "Udmurt" + +msgid "Ukrainian" +msgstr "Ukrainase" + +msgid "Urdu" +msgstr "Urdu" + +msgid "Uzbek" +msgstr "Uzbeke" + +msgid "Vietnamese" +msgstr "Vietnameze" + +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 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ë “slug” të vlefshëm, të përbërë nga shkronja, numra, nëvija ose " +"vija në mes." + +msgid "" +"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" +"Jepni një “slug” të vlefshëm, të përbërë nga shkronja, numra, nënvija ose " +"vija ndarëse Unikod." + +msgid "Enter a valid IPv4 address." +msgstr "Jepni një adresë IPv4 të vlefshme." + +msgid "Enter a valid IPv6 address." +msgstr "Jepni një adresë IPv6 të vlefshme." + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Jepni një adresë IPv4 ose IPv6 të vlefshme." + +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 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] "" +"Sigurohuni 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] "" +"Sigurohuni 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] "Sigurohuni 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] "Sigurohuni 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] "" +"Sigurohuni 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 "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 "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 does not exist." +msgstr "Instanca %(model)s me %(field)s %(value)r s’ekziston." + +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 (it has " +"%(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 %d form." +msgid_plural "Please submit at most %d forms." +msgstr[0] "Ju lutemi, parashtroni e shumta 1%d formular." +msgstr[1] "Ju lutemi, parashtroni e shumta %d formularë." + +#, python-format +msgid "Please submit at least %d form." +msgid_plural "Please submit at least %d forms." +msgstr[0] "Ju lutemi, parashtroni të paktën 1%d formular." +msgstr[1] "Ju lutemi, parashtroni të paktën 1%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 prind." + +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "" +"Përzgjidhni një zgjedhje të vlefshme. Ajo zgjedhje nuk ë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 "%d year" +msgid_plural "%d years" +msgstr[0] "%d vit" +msgstr[1] "%d vjet" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d muaj" +msgstr[1] "%d muaj" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d javë" +msgstr[1] "%d javë" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d ditë" +msgstr[1] "%d ditë" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d orë" +msgstr[1] "%d orë" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minutë" +msgstr[1] "%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 të dhëna 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 nuk ë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, & how-to" + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sq/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sq/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sq/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sq/formats.py new file mode 100644 index 0000000..2f0da0d --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sq/formats.py @@ -0,0 +1,21 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sr/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sr/LC_MESSAGES/django.mo new file mode 100644 index 0000000..9e02bf0 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sr/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sr/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sr/LC_MESSAGES/django.po new file mode 100644 index 0000000..de472f4 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sr/LC_MESSAGES/django.po @@ -0,0 +1,1326 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Branko Kokanovic , 2018-2019 +# Igor Jerosimić, 2019-2021 +# Jannis Leidel , 2011 +# Janos Guljas , 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 17:16+0000\n" +"Last-Translator: Igor Jerosimić\n" +"Language-Team: Serbian (http://www.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 "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 "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 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)." +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 "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 "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 does not exist." +msgstr "%(model)s инстанца са вредношћу %(value)r у пољу %(field)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)." +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 %d form." +msgid_plural "Please submit at most %d forms." +msgstr[0] "Молим проследите највише %d форму." +msgstr[1] "Молим проследите највише %d форме." +msgstr[2] "Молим проследите највише %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 форми." + +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 "%d year" +msgid_plural "%d years" +msgstr[0] "%d година" +msgstr[1] "%d године" +msgstr[2] "%d година" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d месец" +msgstr[1] "%d месеца" +msgstr[2] "%d месеци" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d недеља" +msgstr[1] "%d недеље" +msgstr[2] "%d недеља" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d дан" +msgstr[1] "%d дана" +msgstr[2] "%d дана" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d час" +msgstr[1] "%d часа" +msgstr[2] "%d часова" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d минут" +msgstr[1] "%d минута" +msgstr[2] "%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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sr/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sr/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sr/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sr/formats.py new file mode 100644 index 0000000..937a409 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sr/formats.py @@ -0,0 +1,39 @@ +# 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.', '%d.%m.%y.', # '25.10.2006.', '25.10.06.' + '%d. %m. %Y.', '%d. %m. %y.', # '25. 10. 2006.', '25. 10. 06.' + # '%d. %b %y.', '%d. %B %y.', # '25. Oct 06.', '25. October 06.' + # '%d. %b \'%y.', '%d. %B \'%y.', # '25. Oct '06.', '25. October '06.' + # '%d. %b %Y.', '%d. %B %Y.', # '25. Oct 2006.', '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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sr_Latn/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sr_Latn/LC_MESSAGES/django.mo new file mode 100644 index 0000000..e686f26 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sr_Latn/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sr_Latn/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sr_Latn/LC_MESSAGES/django.po new file mode 100644 index 0000000..a30442b --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sr_Latn/LC_MESSAGES/django.po @@ -0,0 +1,1297 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Aleksa Cukovic` , 2020 +# Igor Jerosimić, 2019-2021 +# Jannis Leidel , 2011 +# Janos Guljas , 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 17:37+0000\n" +"Last-Translator: Igor Jerosimić\n" +"Language-Team: Serbian (Latin) (http://www.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" + +msgid "Afrikaans" +msgstr "afrikanski" + +msgid "Arabic" +msgstr "arapski" + +msgid "Algerian Arabic" +msgstr "Alžirski arapski" + +msgid "Asturian" +msgstr "asturijski" + +msgid "Azerbaijani" +msgstr "azerbejdžanski" + +msgid "Bulgarian" +msgstr "bugarski" + +msgid "Belarusian" +msgstr "beloruski" + +msgid "Bengali" +msgstr "bengalski" + +msgid "Breton" +msgstr "bretonski" + +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 "nemački" + +msgid "Lower Sorbian" +msgstr "donjolužičkosrpski" + +msgid "Greek" +msgstr "grčki" + +msgid "English" +msgstr "engleski" + +msgid "Australian English" +msgstr "australijski engleski" + +msgid "British English" +msgstr "britanski engleski" + +msgid "Esperanto" +msgstr "esperanto" + +msgid "Spanish" +msgstr "španski" + +msgid "Argentinian Spanish" +msgstr "argentinski španski" + +msgid "Colombian Spanish" +msgstr "kolumbijski španski" + +msgid "Mexican Spanish" +msgstr "meksički španski" + +msgid "Nicaraguan Spanish" +msgstr "nikaragvanski španski" + +msgid "Venezuelan Spanish" +msgstr "venecuelanski španski" + +msgid "Estonian" +msgstr "estonski" + +msgid "Basque" +msgstr "baskijski" + +msgid "Persian" +msgstr "persijski" + +msgid "Finnish" +msgstr "finski" + +msgid "French" +msgstr "francuski" + +msgid "Frisian" +msgstr "frizijski" + +msgid "Irish" +msgstr "irski" + +msgid "Scottish Gaelic" +msgstr "škotski galski" + +msgid "Galician" +msgstr "galski" + +msgid "Hebrew" +msgstr "hebrejski" + +msgid "Hindi" +msgstr "hindu" + +msgid "Croatian" +msgstr "hrvatski" + +msgid "Upper Sorbian" +msgstr "gornjolužičkosrpski" + +msgid "Hungarian" +msgstr "mađarski" + +msgid "Armenian" +msgstr "jermenski" + +msgid "Interlingua" +msgstr "interlingva" + +msgid "Indonesian" +msgstr "indonežanski" + +msgid "Igbo" +msgstr "Igbo" + +msgid "Ido" +msgstr "ido" + +msgid "Icelandic" +msgstr "islandski" + +msgid "Italian" +msgstr "italijanski" + +msgid "Japanese" +msgstr "japanski" + +msgid "Georgian" +msgstr "gruzijski" + +msgid "Kabyle" +msgstr "kabilski" + +msgid "Kazakh" +msgstr "kazaški" + +msgid "Khmer" +msgstr "kambodijski" + +msgid "Kannada" +msgstr "kanada" + +msgid "Korean" +msgstr "korejski" + +msgid "Kyrgyz" +msgstr "Kirgiski" + +msgid "Luxembourgish" +msgstr "luksemburški" + +msgid "Lithuanian" +msgstr "litvanski" + +msgid "Latvian" +msgstr "latvijski" + +msgid "Macedonian" +msgstr "makedonski" + +msgid "Malayalam" +msgstr "malajalamski" + +msgid "Mongolian" +msgstr "mongolski" + +msgid "Marathi" +msgstr "marathi" + +msgid "Burmese" +msgstr "burmanski" + +msgid "Norwegian Bokmål" +msgstr "norveški književni" + +msgid "Nepali" +msgstr "nepalski" + +msgid "Dutch" +msgstr "holandski" + +msgid "Norwegian Nynorsk" +msgstr "norveški novi" + +msgid "Ossetic" +msgstr "osetinski" + +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 (latinica)" + +msgid "Swedish" +msgstr "švedski" + +msgid "Swahili" +msgstr "svahili" + +msgid "Tamil" +msgstr "tamilski" + +msgid "Telugu" +msgstr "telugu" + +msgid "Tajik" +msgstr "Tadžiki" + +msgid "Thai" +msgstr "tajlandski" + +msgid "Turkmen" +msgstr "Turkmenski" + +msgid "Turkish" +msgstr "turski" + +msgid "Tatar" +msgstr "tatarski" + +msgid "Udmurt" +msgstr "udmurtski" + +msgid "Ukrainian" +msgstr "ukrajinski" + +msgid "Urdu" +msgstr "Urdu" + +msgid "Uzbek" +msgstr "Uzbekistanski" + +msgid "Vietnamese" +msgstr "vijetnamski" + +msgid "Simplified Chinese" +msgstr "novokineski" + +msgid "Traditional Chinese" +msgstr "starokineski" + +msgid "Messages" +msgstr "Poruke" + +msgid "Site Maps" +msgstr "Mape sajta" + +msgid "Static Files" +msgstr "Statičke datoteke" + +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]. +msgid "…" +msgstr "…" + +msgid "That page number is not an integer" +msgstr "Zadati broj strane nije ceo broj" + +msgid "That page number is less than 1" +msgstr "Zadati broj strane je manji od 1" + +msgid "That page contains no results" +msgstr "Tražena strana ne sadrži rezultate" + +msgid "Enter a valid value." +msgstr "Unesite ispravnu vrednost." + +msgid "Enter a valid URL." +msgstr "Unesite ispravan URL." + +msgid "Enter a valid integer." +msgstr "Unesite ispravan ceo broj." + +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 "" +"Unesite isrpavan „slag“, koji se sastoji od slova, brojki, donjih crta ili " +"cirtica." + +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." + +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 brojke razdvojene zapetama." + +#, 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)." + +#, 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." + +#, 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." + +#, 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 )." + +#, 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)." + +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] "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." + +#, 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." + +#, 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 "'Null' karakteri nisu dozvoljeni." + +msgid "and" +msgstr "i" + +#, python-format +msgid "%(model_name)s with this %(field_labels)s already exists." +msgstr "%(model_name)s sa poljem %(field_labels)s već postoji." + +#, python-format +msgid "Value %(value)r is not a valid choice." +msgstr "Vrednost %(value)r nije validna." + +msgid "This field cannot be null." +msgstr "Ovo polje ne može da ostane prazno." + +msgid "This field cannot be blank." +msgstr "Ovo polje ne može da ostane prazno." + +#, 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" +#, 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 vrednost (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 "Celi 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 "Vremenski interval" + +msgid "Email address" +msgstr "Imejl 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 "Ceo broj" + +msgid "Big (8 byte) integer" +msgstr "Veliki ceo broj" + +msgid "Small integer" +msgstr "Mali ceo broj" + +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 "Bulova vrednost (True, False ili None)" + +msgid "Positive big integer" +msgstr "Velik pozitivan celi broj" + +msgid "Positive integer" +msgstr "Pozitivan ceo broj" + +msgid "Positive small integer" +msgstr "Pozitivan mali ceo broj" + +#, python-format +msgid "Slug (up to %(max_length)s)" +msgstr "Slag (ne duži od %(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 "" + +#, python-format +msgid "" +"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " +"invalid time." +msgstr "" + +msgid "Time" +msgstr "Vreme" + +msgid "URL" +msgstr "URL" + +msgid "Raw binary data" +msgstr "Sirovi binarni podaci" + +#, python-format +msgid "“%(value)s” is not a valid UUID." +msgstr "" + +msgid "Universally unique identifier" +msgstr "Univerzalno jedinstveni identifikator" + +msgid "File" +msgstr "Fajl" + +msgid "Image" +msgstr "Slika" + +msgid "A JSON object" +msgstr "JSON objekat" + +msgid "Value must be valid JSON." +msgstr "Vrednost mora biti ispravni 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 "Strani ključ (tip određuje referentno polje)" + +msgid "One-to-one relationship" +msgstr "Relacija jedan na jedan" + +#, python-format +msgid "%(from)s-%(to)s relationship" +msgstr "" + +#, python-format +msgid "%(from)s-%(to)s relationships" +msgstr "" + +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 +msgid ":?.!" +msgstr ":?.!" + +msgid "This field is required." +msgstr "Ovo polje se mora popuniti." + +msgid "Enter a whole number." +msgstr "Unesite ceo broj." + +msgid "Enter a valid date." +msgstr "Unesite ispravan datum." + +msgid "Enter a valid time." +msgstr "Unesite ispravno vreme" + +msgid "Enter a valid date/time." +msgstr "Unesite ispravan datum/vreme." + +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 "Broj dana mora biti između {min_days} i {max_days}." + +msgid "No file was submitted. Check the encoding type on the form." +msgstr "Fajl nije prebačen. Proverite 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 "Može se samo poslati fajl ili izbrisati, ne oba." + +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 vrednostima. Odaberite jednu od ponuđenih." + +msgid "Enter a list of values." +msgstr "Unesite listu vrednosti." + +msgid "Enter a complete value." +msgstr "Unesite kompletnu vrednost." + +msgid "Enter a valid UUID." +msgstr "Unesite ispravan UUID." + +msgid "Enter a valid JSON." +msgstr "Unesite ispravan 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 "" +"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." + +#, python-format +msgid "Please submit at most %d form." +msgid_plural "Please submit at most %d forms." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, python-format +msgid "Please submit at least %d form." +msgid_plural "Please submit at least %d forms." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +msgid "Order" +msgstr "Redosled" + +msgid "Delete" +msgstr "Obriši" + +#, python-format +msgid "Please correct the duplicate data for %(field)s." +msgstr "Ispravite dupliran sadržaj za polja: %(field)s." + +#, 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." + +#, 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." + +msgid "Please correct the duplicate values below." +msgstr "Ispravite duplirane vrednosti dole." + +msgid "The inline value did not match the parent instance." +msgstr "Direktno uneta vrednost ne odgovara instanci roditelja." + +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." + +#, 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 "Izmeni" + +msgid "Unknown" +msgstr "Nepoznato" + +msgid "Yes" +msgstr "Da" + +msgid "No" +msgstr "Ne" + +#. Translators: Please do not add spaces around commas. +msgid "yes,no,maybe" +msgstr "da,ne,možda" + +#, 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" + +#, 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 "pre p." + +msgid "PM" +msgstr "PM" + +msgid "AM" +msgstr "AM" + +msgid "midnight" +msgstr "ponoć" + +msgid "noon" +msgstr "podne" + +msgid "Monday" +msgstr "ponedeljak" + +msgid "Tuesday" +msgstr "utorak" + +msgid "Wednesday" +msgstr "sreda" + +msgid "Thursday" +msgstr "četvrtak" + +msgid "Friday" +msgstr "petak" + +msgid "Saturday" +msgstr "subota" + +msgid "Sunday" +msgstr "nedelja" + +msgid "Mon" +msgstr "pon." + +msgid "Tue" +msgstr "uto." + +msgid "Wed" +msgstr "sre." + +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 "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" + +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 "Jun" + +msgctxt "abbrev. month" +msgid "July" +msgstr "Jul" + +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 "Mart" + +msgctxt "alt. month" +msgid "April" +msgstr "April" + +msgctxt "alt. month" +msgid "May" +msgstr "Maj" + +msgctxt "alt. month" +msgid "June" +msgstr "Jun" + +msgctxt "alt. month" +msgid "July" +msgstr "Jul" + +msgctxt "alt. month" +msgid "August" +msgstr "Avgust" + +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 "Ovo 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 godine" +msgstr[2] "%d godina" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d mesec" +msgstr[1] "%d meseca" +msgstr[2] "%d meseci" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d nedelja" +msgstr[1] "%d nedelje" +msgstr[2] "%d nedelja" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d dan" +msgstr[1] "%d dana" +msgstr[2] "%d dana" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d čas" +msgstr[1] "%d časa" +msgstr[2] "%d časova" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minut" +msgstr[1] "%d minute" +msgstr[2] "%d minuta" + +msgid "Forbidden" +msgstr "Zabranjeno" + +msgid "CSRF verification failed. Request aborted." +msgstr "CSRF verifikacija nije prošla. Zahtev odbijen." + +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." + +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." + +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 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." + +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." + +msgid "More information is available with DEBUG=True." +msgstr "Više informacija je dostupno sa DEBUG=True." + +msgid "No year specified" +msgstr "Godina nije naznačena" + +msgid "Date out of range" +msgstr "Datum van opsega" + +msgid "No month specified" +msgstr "Mesec nije naznačen" + +msgid "No day specified" +msgstr "Dan nije naznačen" + +msgid "No week specified" +msgstr "Nedelja nije naznačena" + +#, python-format +msgid "No %(verbose_name_plural)s available" +msgstr "Nedostupni objekti %(verbose_name_plural)s" + +#, 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." + +#, 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 "Nijedan objekat klase %(verbose_name)s nije nađen datim upitom." + +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\"." + +#, 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 "Prazna lista i „%(class_name)s.allow_empty“ ima vrednost False." + +msgid "Directory indexes are not allowed here." +msgstr "Indeksi direktorijuma nisu dozvoljeni ovde." + +#, python-format +msgid "“%(path)s” does not exist" +msgstr "„%(path)s“ ne postoji" + +#, python-format +msgid "Index of %(directory)s" +msgstr "Indeks direktorijuma %(directory)s" + +msgid "The install worked successfully! Congratulations!" +msgstr "Instalacija je prošla uspešno. Čestitke!" + +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" +"Pogledajte napomene uz izdanje za Đ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 "" +"Ova strana je prikazana jer je DEBUG=True u vašim podešavanjima i niste konfigurisali nijedan URL." + +msgid "Django Documentation" +msgstr "Đango dokumentacija" + +msgid "Topics, references, & how-to’s" +msgstr "Teme, reference, & kako-da" + +msgid "Tutorial: A Polling App" +msgstr "Uputstvo: aplikacija za glasanje" + +msgid "Get started with Django" +msgstr "Počnite sa Đangom" + +msgid "Django Community" +msgstr "Đango zajednica" + +msgid "Connect, get help, or contribute" +msgstr "Povežite se, potražite pomoć ili dajte doprinos" diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sr_Latn/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sr_Latn/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sr_Latn/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sr_Latn/formats.py new file mode 100644 index 0000000..937a409 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sr_Latn/formats.py @@ -0,0 +1,39 @@ +# 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.', '%d.%m.%y.', # '25.10.2006.', '25.10.06.' + '%d. %m. %Y.', '%d. %m. %y.', # '25. 10. 2006.', '25. 10. 06.' + # '%d. %b %y.', '%d. %B %y.', # '25. Oct 06.', '25. October 06.' + # '%d. %b \'%y.', '%d. %B \'%y.', # '25. Oct '06.', '25. October '06.' + # '%d. %b %Y.', '%d. %B %Y.', # '25. Oct 2006.', '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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sv/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sv/LC_MESSAGES/django.mo new file mode 100644 index 0000000..b66581b Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sv/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sv/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sv/LC_MESSAGES/django.po new file mode 100644 index 0000000..8139b42 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sv/LC_MESSAGES/django.po @@ -0,0 +1,1288 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Alex Nordlund , 2012 +# Andreas Pelme , 2014,2021 +# Gustaf Hansen , 2015 +# Jannis Leidel , 2011 +# Jonathan Lindén, 2015 +# 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: 2021-01-15 09:00+0100\n" +"PO-Revision-Date: 2021-05-06 06:05+0000\n" +"Last-Translator: Tomas Lööw \n" +"Language-Team: Swedish (http://www.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 "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 "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 "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 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." + +msgid "Enter a valid IPv4 address." +msgstr "Fyll i en giltig IPv4 adress." + +msgid "Enter a valid IPv6 address." +msgstr "Ange en giltig IPv6-adress." + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Ange en giltig IPv4 eller IPv6-adress." + +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 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 "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 "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 "" + +#, 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 (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 "" + +#, 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 (med tid)" + +#, python-format +msgid "“%(value)s” value must be a decimal number." +msgstr "" + +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 "" + +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 "" + +#, python-format +msgid "" +"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " +"invalid time." +msgstr "" + +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 "" + +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 "" + +#. 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 "" + +#, 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 "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 "" + +#, 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 "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 "%d year" +msgid_plural "%d years" +msgstr[0] "%d år" +msgstr[1] "%d år" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d månad" +msgstr[1] "%d månader" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d vecka" +msgstr[1] "%d veckor" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d dag" +msgstr[1] "%d dagar" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d timme" +msgstr[1] "%d timmar" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minut" +msgstr[1] "%d minuter" + +msgid "Forbidden" +msgstr "Ottillå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 "" + +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 "" +"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 "" + +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 "" + +#, 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 "" + +#, 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 "" + +msgid "Directory indexes are not allowed here." +msgstr "Kataloglistningar är inte tillåtna här." + +#, python-format +msgid "“%(path)s” does not exist" +msgstr "" + +#, 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 "" + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sv/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sv/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sv/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sv/formats.py new file mode 100644 index 0000000..9467526 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sv/formats.py @@ -0,0 +1,35 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sw/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sw/LC_MESSAGES/django.mo new file mode 100644 index 0000000..449d588 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sw/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sw/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sw/LC_MESSAGES/django.po new file mode 100644 index 0000000..273893d --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/sw/LC_MESSAGES/django.po @@ -0,0 +1,1221 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ta/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ta/LC_MESSAGES/django.mo new file mode 100644 index 0000000..1c684f8 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ta/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ta/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ta/LC_MESSAGES/django.po new file mode 100644 index 0000000..ad7bf71 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ta/LC_MESSAGES/django.po @@ -0,0 +1,1230 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ta/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ta/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ta/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ta/formats.py new file mode 100644 index 0000000..61810e3 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ta/formats.py @@ -0,0 +1,21 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/te/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/te/LC_MESSAGES/django.mo new file mode 100644 index 0000000..1366ff2 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/te/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/te/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/te/LC_MESSAGES/django.po new file mode 100644 index 0000000..168ffa4 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/te/LC_MESSAGES/django.po @@ -0,0 +1,1233 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/te/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/te/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/te/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/te/formats.py new file mode 100644 index 0000000..8fb98cf --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/te/formats.py @@ -0,0 +1,21 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/tg/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/tg/LC_MESSAGES/django.mo new file mode 100644 index 0000000..e93dc87 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/tg/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/tg/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/tg/LC_MESSAGES/django.po new file mode 100644 index 0000000..05a4ca9 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/tg/LC_MESSAGES/django.po @@ -0,0 +1,1299 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/tg/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/tg/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/tg/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/tg/formats.py new file mode 100644 index 0000000..3e7651d --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/tg/formats.py @@ -0,0 +1,32 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/th/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/th/LC_MESSAGES/django.mo new file mode 100644 index 0000000..3969ebd Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/th/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/th/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/th/LC_MESSAGES/django.po new file mode 100644 index 0000000..8ab31f2 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/th/LC_MESSAGES/django.po @@ -0,0 +1,1208 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/th/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/th/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/th/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/th/formats.py new file mode 100644 index 0000000..d7394eb --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/th/formats.py @@ -0,0 +1,33 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/tk/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/tk/LC_MESSAGES/django.mo new file mode 100644 index 0000000..2c98ebf Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/tk/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/tk/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/tk/LC_MESSAGES/django.po new file mode 100644 index 0000000..9992a74 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/tk/LC_MESSAGES/django.po @@ -0,0 +1,1297 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Mariusz Felisiak , 2020 +# Resulkary , 2020 +# Welbeck Garli , 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-08-24 20:32+0000\n" +"Last-Translator: Resulkary \n" +"Language-Team: Turkmen (http://www.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 "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 "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 "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" + +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 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ň." + +msgid "Enter a valid IPv4 address." +msgstr "Dogry IPv4 salgysyny giriziň." + +msgid "Enter a valid IPv6 address." +msgstr "Dogry IPv6 salgysyny giriziň." + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Dogry IPv4 ýa-da IPv6 adresi giriziň." + +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 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 "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 "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 "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 "Small integer" +msgstr "Kiçi bitewi san" + +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" + +msgid "ManagementForm data is missing or has been tampered with" +msgstr "ManagementForm maglumatlary ýok ýa-da bozulandyr" + +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "%dýa-da ondan azyrak forma tabşyryň" +msgstr[1] "%d ýa-da ondan azyrak forma tabşyryň." + +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "%d ýa-da ondan köp forma tabşyryň." +msgstr[1] "%d ýa-da ondan köp forma 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 "%d year" +msgid_plural "%d years" +msgstr[0] "%d ýyl" +msgstr[1] "%d ýyl" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d aý" +msgstr[1] "%d aý" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d hepde" +msgstr[1] "%d hepde" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d gün" +msgstr[1] "%d gün" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d sagat" +msgstr[1] "%d sagat" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minut" +msgstr[1] "%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 habary görýärsiňiz, sebäbi bu HTTPS sahypasy web brauzeriňiz tarapyndan " +"iberilmegi üçin \"Referer sözbaşy\" talap edýär, ýöne hiç biri iberilmedi. " +"Bu sözbaşy, brauzeriňiziň üçünji taraplar 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 "Django: the Web framework for perfectionists with deadlines." +msgstr "" +"Django: möhletleri bolan we kämillik talap edýänler üçin web freýmworky." + +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" +"Django %(version)s üçin goýberiş " +"belliklerini görüň" + +msgid "The install worked successfully! Congratulations!" +msgstr "Üstünlikli guruldy! Gutlaýarys!" + +#, 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/tk/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/tk/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/tk/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/tk/formats.py new file mode 100644 index 0000000..3e7651d --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/tk/formats.py @@ -0,0 +1,32 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/tr/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/tr/LC_MESSAGES/django.mo new file mode 100644 index 0000000..001ec73 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/tr/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/tr/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/tr/LC_MESSAGES/django.po new file mode 100644 index 0000000..6f426f2 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/tr/LC_MESSAGES/django.po @@ -0,0 +1,1322 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Ahmet Emre Aladağ , 2013 +# BouRock, 2015-2021 +# 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: 2021-01-15 09:00+0100\n" +"PO-Revision-Date: 2021-01-16 19:28+0000\n" +"Last-Translator: BouRock\n" +"Language-Team: Turkish (http://www.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 "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 İngilizce" + +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 "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 "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 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." + +msgid "Enter a valid IPv4 address." +msgstr "Geçerli bir IPv4 adresi girin." + +msgid "Enter a valid IPv6 address." +msgstr "Geçerli bir IPv6 adresi girin." + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Geçerli bir IPv4 veya IPv6 adresi girin." + +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 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 "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 "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 does not exist." +msgstr "%(field)s %(value)r olan %(model)s benzeri mevcut 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 %d form." +msgid_plural "Please submit at most %d forms." +msgstr[0] "Lütfen en fazla %d form gönderin." +msgstr[1] "Lütfen en fazla %d form gönderin." + +#, python-format +msgid "Please submit at least %d form." +msgid_plural "Please submit at least %d forms." +msgstr[0] "Lütfen en az %d form gönderin." +msgstr[1] "Lütfen en az %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 "%d year" +msgid_plural "%d years" +msgstr[0] "%d yıl" +msgstr[1] "%d yıl" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d ay" +msgstr[1] "%d ay" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d hafta" +msgstr[1] "%d hafta" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d gün" +msgstr[1] "%d gün" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d saat" +msgstr[1] "%d saat" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d dakika" +msgstr[1] "%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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/tr/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/tr/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/tr/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/tr/formats.py new file mode 100644 index 0000000..1be5ac5 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/tr/formats.py @@ -0,0 +1,28 @@ +# 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', '%d/%m/%y', # '25/10/2006', '25/10/06' + '%y-%m-%d', # '06-10-25' + # '%d %B %Y', '%d %b. %Y', # '25 Ekim 2006', '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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/tt/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/tt/LC_MESSAGES/django.mo new file mode 100644 index 0000000..843b012 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/tt/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/tt/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/tt/LC_MESSAGES/django.po new file mode 100644 index 0000000..84d06ef --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/tt/LC_MESSAGES/django.po @@ -0,0 +1,1211 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/udm/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/udm/LC_MESSAGES/django.mo new file mode 100644 index 0000000..0c7ab6d Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/udm/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/udm/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/udm/LC_MESSAGES/django.po new file mode 100644 index 0000000..68c2bc7 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/udm/LC_MESSAGES/django.po @@ -0,0 +1,1197 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/uk/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/uk/LC_MESSAGES/django.mo new file mode 100644 index 0000000..9c31ff0 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/uk/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/uk/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/uk/LC_MESSAGES/django.po new file mode 100644 index 0000000..db42ec1 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/uk/LC_MESSAGES/django.po @@ -0,0 +1,1336 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Oleksandr Chernihov , 2014 +# Boryslav Larin , 2011 +# Denis Podlesniy , 2016 +# Igor Melnyk, 2014-2015,2017 +# Illia Volochii , 2019,2021 +# Jannis Leidel , 2011 +# Kirill Gagarski , 2014 +# Max V. Stotsky , 2014 +# Mikhail Kolesnik , 2015 +# Mykola Zamkovoi , 2014 +# 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: 2021-01-15 09:00+0100\n" +"PO-Revision-Date: 2021-01-20 00:05+0000\n" +"Last-Translator: Illia Volochii \n" +"Language-Team: Ukrainian (http://www.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 "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 "Введіть коректний 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)." +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 "" + +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 "Це поле не може бути пустим." + +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 "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 "" + +#, 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 "Кількість днів повинна бути від {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 "" + +#. 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] "" +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 "Послідовність" + +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 "%d year" +msgid_plural "%d years" +msgstr[0] "%d рік" +msgstr[1] "%d роки" +msgstr[2] "%d років" +msgstr[3] "%d років" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d місяць" +msgstr[1] "%d місяці" +msgstr[2] "%d місяців" +msgstr[3] "%d місяців" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d тиждень" +msgstr[1] "%d тижні" +msgstr[2] "%d тижнів" +msgstr[3] "%d тижнів" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d день" +msgstr[1] "%d дня" +msgstr[2] "%d днів" +msgstr[3] "%d днів" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d година" +msgstr[1] "%d години" +msgstr[2] "%d годин" +msgstr[3] "%d годин" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d хвилина" +msgstr[1] "%d хвилини" +msgstr[2] "%d хвилин" +msgstr[3] "%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. Даний тип 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/uk/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/uk/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/uk/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/uk/formats.py new file mode 100644 index 0000000..ca2593b --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/uk/formats.py @@ -0,0 +1,35 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ur/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ur/LC_MESSAGES/django.mo new file mode 100644 index 0000000..706c2ce Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ur/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ur/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ur/LC_MESSAGES/django.po new file mode 100644 index 0000000..6067c00 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/ur/LC_MESSAGES/django.po @@ -0,0 +1,1222 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/uz/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/uz/LC_MESSAGES/django.mo new file mode 100644 index 0000000..57f89e8 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/uz/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/uz/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/uz/LC_MESSAGES/django.po new file mode 100644 index 0000000..4e9b6cf --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/uz/LC_MESSAGES/django.po @@ -0,0 +1,1295 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Abdulaminkhon Khaydarov , 2020 +# Bedilbek Khamidov , 2019 +# Claude Paroz , 2020 +# Sukhrobbek Ismatov , 2019 +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-25 17:08+0000\n" +"Last-Translator: Abdulaminkhon Khaydarov \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" + +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 "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 "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 "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" + +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 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 "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 "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 "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 "Small integer" +msgstr "Kichik butun son" + +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" + +msgid "ManagementForm data is missing or has been tampered with" +msgstr "ManagementForm ma'lumotlari yo'q yoki o'zgartirilgan" + +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "Iltimos, %d ta yoki kamroq forma topshiring." + +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "Iltimos, %d ta yoki ko'proq forma topshiring." + +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 "%d year" +msgid_plural "%d years" +msgstr[0] "%dyil" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%doy" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%dhafta" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%dkun" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%dsoat" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%dminut" + +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 "" +"Siz ushbu xabarni ko'rmoqdasiz, chunki bu HTTPS saytida veb-brauzeringiz " +"tomonidan \"Referer header\" yuborilishi talab qilinadi, ammo hech biri " +"yuborilmadi. Ushbu sarlavha xavfsizlik nuqtai nazaridan, brauzeringizni " +"uchinchi shaxslar tomonidan o'g'irlanmasligini ta'minlash uchun talab " +"qilinadi." + +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 "Django: the Web framework for perfectionists with deadlines." +msgstr "Django: muddati chegaralangan perfektsionistlar uchun veb freymvork." + +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" +"Django %(version)s uchun chiqarilgan " +"nashrlarni ko'rish" + +msgid "The install worked successfully! Congratulations!" +msgstr "O'rnatish muvaffaqiyatli amalga oshdi! Tabriklaymiz!" + +#, 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/uz/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/uz/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/uz/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/uz/formats.py new file mode 100644 index 0000000..14af096 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/uz/formats.py @@ -0,0 +1,30 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/vi/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/vi/LC_MESSAGES/django.mo new file mode 100644 index 0000000..43a2a61 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/vi/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/vi/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/vi/LC_MESSAGES/django.po new file mode 100644 index 0000000..a0e6eb4 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/vi/LC_MESSAGES/django.po @@ -0,0 +1,1234 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/vi/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/vi/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/vi/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/vi/formats.py new file mode 100644 index 0000000..495b6f7 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/vi/formats.py @@ -0,0 +1,21 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/zh_Hans/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/zh_Hans/LC_MESSAGES/django.mo new file mode 100644 index 0000000..9755f5f Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/zh_Hans/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/zh_Hans/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/zh_Hans/LC_MESSAGES/django.po new file mode 100644 index 0000000..e867840 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/zh_Hans/LC_MESSAGES/django.po @@ -0,0 +1,1283 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# HuanCheng Bai白宦成 , 2017-2018 +# Daniel Duan , 2013 +# jamin M , 2019 +# Jannis Leidel , 2011 +# Kevin Sze , 2012 +# Lele Long , 2011,2015,2017 +# Le Yang , 2018 +# li beite , 2020 +# Liping Wang , 2016-2017 +# matthew Yip , 2020 +# mozillazg , 2016 +# Ronald White , 2014 +# pylemon , 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 +# fangjiaqi77 <370358679@qq.com>, 2020 +# Kevin Sze , 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-02-07 04:20+0000\n" +"Last-Translator: Veoco \n" +"Language-Team: Chinese (China) (http://www.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 "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 "输入一个有效的 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字母,数字,下划线或连字符号组成的有效“字段”。" + +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 "包含 %(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 "“%(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 "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 %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 在 %(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 "%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 "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站点要求Web浏览器发送的“Referer头”没被发送。出于安全" +"原因,此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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/zh_Hans/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/zh_Hans/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/zh_Hans/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/zh_Hans/formats.py new file mode 100644 index 0000000..018b9b1 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/zh_Hans/formats.py @@ -0,0 +1,42 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/zh_Hant/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/zh_Hant/LC_MESSAGES/django.mo new file mode 100644 index 0000000..b6726c5 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/zh_Hant/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/zh_Hant/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/zh_Hant/LC_MESSAGES/django.po new file mode 100644 index 0000000..61d827a --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/zh_Hant/LC_MESSAGES/django.po @@ -0,0 +1,1218 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Chen Chun-Chia , 2015 +# Eric Ho , 2013 +# ilay , 2012 +# Jannis Leidel , 2011 +# mail6543210 , 2013 +# ming hsien tzang , 2011 +# tcc , 2011 +# Tzu-ping Chung , 2016-2017 +# Yeh-Yung , 2013 +# Yeh-Yung , 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: Chinese (Taiwan) (http://www.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 "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 "該頁碼小於 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 "" + +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 "這個值不能是 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 "電子郵件地址" + +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 "%(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 "" + +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。" + +#. 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 "ManagementForm 資料缺失或遭竄改" + +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "請送出不多於 %d 個表單。" + +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more 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 "" + +#, 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 "這是無效的 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 年" + +#, 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 "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。這個 " +"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 "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 "" +"你看到這個訊息,是因為你在 Django 設定檔中包含 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/zh_Hant/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/zh_Hant/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/zh_Hant/formats.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/zh_Hant/formats.py new file mode 100644 index 0000000..018b9b1 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/locale/zh_Hant/formats.py @@ -0,0 +1,42 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/project_template/manage.py-tpl b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/project_template/manage.py-tpl new file mode 100755 index 0000000..a628884 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/project_template/manage.py-tpl @@ -0,0 +1,22 @@ +#!/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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/project_template/project_name/__init__.py-tpl b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/project_template/project_name/__init__.py-tpl new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/project_template/project_name/asgi.py-tpl b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/project_template/project_name/asgi.py-tpl new file mode 100644 index 0000000..a827238 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/project_template/project_name/asgi.py-tpl @@ -0,0 +1,16 @@ +""" +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/project_template/project_name/settings.py-tpl b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/project_template/project_name/settings.py-tpl new file mode 100644 index 0000000..7830fb2 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/project_template/project_name/settings.py-tpl @@ -0,0 +1,125 @@ +""" +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.debug', + '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_L10N = 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/project_template/project_name/urls.py-tpl b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/project_template/project_name/urls.py-tpl new file mode 100644 index 0000000..e23d6a9 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/project_template/project_name/urls.py-tpl @@ -0,0 +1,21 @@ +"""{{ project_name }} URL Configuration + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/project_template/project_name/wsgi.py-tpl b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/project_template/project_name/wsgi.py-tpl new file mode 100644 index 0000000..1ee28d0 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/project_template/project_name/wsgi.py-tpl @@ -0,0 +1,16 @@ +""" +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/urls/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/urls/__init__.py new file mode 100644 index 0000000..c58e581 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/urls/__init__.py @@ -0,0 +1,22 @@ +import warnings + +from django.urls import include, re_path +from django.utils.deprecation import RemovedInDjango40Warning +from django.views import defaults + +__all__ = ['handler400', 'handler403', 'handler404', 'handler500', 'include', 'url'] + +handler400 = defaults.bad_request +handler403 = defaults.permission_denied +handler404 = defaults.page_not_found +handler500 = defaults.server_error + + +def url(regex, view, kwargs=None, name=None): + warnings.warn( + 'django.conf.urls.url() is deprecated in favor of ' + 'django.urls.re_path().', + RemovedInDjango40Warning, + stacklevel=2, + ) + return re_path(regex, view, kwargs, name) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/urls/i18n.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/urls/i18n.py new file mode 100644 index 0000000..256c247 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/urls/i18n.py @@ -0,0 +1,39 @@ +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.lru_cache(maxsize=None) +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/urls/static.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/urls/static.py new file mode 100644 index 0000000..fa83645 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/conf/urls/static.py @@ -0,0 +1,28 @@ +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/__init__.py new file mode 100644 index 0000000..975cf05 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/__init__.py @@ -0,0 +1,24 @@ +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, 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", "autodiscover", +] + + +def autodiscover(): + autodiscover_modules('admin', register_to=site) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/actions.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/actions.py new file mode 100644 index 0000000..665d83c --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/actions.py @@ -0,0 +1,80 @@ +""" +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 _, 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 = queryset.count() + if n: + for obj in queryset: + obj_display = str(obj) + modeladmin.log_deletion(request, obj, obj_display) + 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 = _("Are you sure?") + + context = { + **modeladmin.admin_site.each_context(request), + 'title': title, + '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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/apps.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/apps.py new file mode 100644 index 0000000..c4fba88 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/apps.py @@ -0,0 +1,27 @@ +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/checks.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/checks.py new file mode 100644 index 0000000..fea5e24 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/checks.py @@ -0,0 +1,1137 @@ +import collections +from itertools import chain + +from django.apps import apps +from django.conf import settings +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' + ) + related_admin = obj.admin_site._registry.get(field.remote_field.model) + if related_admin is None: + 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', + ) + ] + elif 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: + 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: + return must_be('a many-to-many field', option=label, obj=obj, id='admin.E020') + 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: + if field_name.startswith('-'): + field_name = field_name[1:] + 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' is not a callable, an attribute of " + "'%s', or an attribute of '%s'." % ( + label, 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_action_permission_methods(admin_obj), + *self._check_actions_uniqueness(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: + return [ + checks.Error( + "The value of '%s' refers to '%s', which is not a " + "callable, an attribute of '%s', or an attribute or " + "method on '%s'." % ( + label, item, obj.__class__.__name__, + obj.model._meta.label, + ), + obj=obj.__class__, + id='admin.E108', + ) + ] + if isinstance(field, models.ManyToManyField): + return [ + checks.Error( + "The value of '%s' must not be a ManyToManyField." % label, + 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: + 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 not isinstance(field, (models.DateField, models.DateTimeField)): + return must_be('a DateField or DateTimeField', option='date_hierarchy', obj=obj, id='admin.E128') + else: + return [] + + def _check_action_permission_methods(self, obj): + """ + Actions with an allowed_permission attribute require the ModelAdmin to + implement a has__permission() method for each permission. + """ + actions = obj._get_base_actions() + errors = [] + 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', + ) + ) + return errors + + def _check_actions_uniqueness(self, obj): + """Check that every action has a unique __name__.""" + errors = [] + names = collections.Counter(name for _, name, _ in obj._get_base_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 an attribute of " + "'%s'." % (option, field, obj.model._meta.label), + obj=obj.__class__, + id=id, + ), + ] diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/decorators.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/decorators.py new file mode 100644 index 0000000..4de9958 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/decorators.py @@ -0,0 +1,103 @@ +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, 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/exceptions.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/exceptions.py new file mode 100644 index 0000000..f619bc2 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/exceptions.py @@ -0,0 +1,11 @@ +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 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/filters.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/filters.py new file mode 100644 index 0000000..7f46908 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/filters.py @@ -0,0 +1,476 @@ +""" +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.options import IncorrectLookupParameters +from django.contrib.admin.utils import ( + 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): + # 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 SimpleListFilter(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 + 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 choices(self, changelist): + yield { + 'selected': self.value() is None, + 'query_string': changelist.get_query_string(remove=[self.parameter_name]), + 'display': _('All'), + } + for lookup, title in self.lookup_choices: + yield { + 'selected': self.value() == str(lookup), + 'query_string': changelist.get_query_string({self.parameter_name: lookup}), + 'display': title, + } + + +class FieldListFilter(ListFilter): + _field_list_filters = [] + _take_priority_index = 0 + + 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) + + def has_output(self): + return True + + def queryset(self, request, queryset): + try: + return queryset.filter(**self.used_parameters) + 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 = params.get(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. + """ + related_admin = model_admin.admin_site._registry.get(field.remote_field.model) + if related_admin is not None: + return related_admin.get_ordering(request) + return () + + 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 choices(self, changelist): + 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'), + } + for pk_val, val in self.lookup_choices: + yield { + 'selected': self.lookup_val == str(pk_val), + 'query_string': changelist.get_query_string({self.lookup_kwarg: pk_val}, [self.lookup_kwarg_isnull]), + 'display': val, + } + if self.include_empty_choice: + yield { + 'selected': bool(self.lookup_val_isnull), + 'query_string': changelist.get_query_string({self.lookup_kwarg_isnull: 'True'}, [self.lookup_kwarg]), + 'display': self.empty_value_display, + } + + +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 = params.get(self.lookup_kwarg) + self.lookup_val2 = params.get(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 choices(self, changelist): + field_choices = dict(self.field.flatchoices) + for lookup, title in ( + (None, _('All')), + ('1', field_choices.get(True, _('Yes'))), + ('0', field_choices.get(False, _('No'))), + ): + 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: + yield { + 'selected': self.lookup_val2 == 'True', + 'query_string': changelist.get_query_string({self.lookup_kwarg2: 'True'}, [self.lookup_kwarg]), + 'display': field_choices.get(None, _('Unknown')), + } + + +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 = params.get(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 choices(self, changelist): + 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 lookup, title in self.field.flatchoices: + if lookup is None: + none_title = title + continue + yield { + 'selected': str(lookup) == 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 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: str(today), + self.lookup_kwarg_until: str(tomorrow), + }), + (_('Past 7 days'), { + self.lookup_kwarg_since: str(today - datetime.timedelta(days=7)), + self.lookup_kwarg_until: str(tomorrow), + }), + (_('This month'), { + self.lookup_kwarg_since: str(today.replace(day=1)), + self.lookup_kwarg_until: str(next_month), + }), + (_('This year'), { + self.lookup_kwarg_since: str(today.replace(month=1, day=1)), + self.lookup_kwarg_until: str(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 choices(self, changelist): + for title, param_dict in self.links: + yield { + 'selected': self.date_params == param_dict, + 'query_string': changelist.get_query_string(param_dict, [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 = params.get(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 choices(self, changelist): + 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 + for val in self.lookup_choices: + if val is None: + include_none = True + continue + val = str(val) + yield { + 'selected': self.lookup_val == val, + 'query_string': changelist.get_query_string({self.lookup_kwarg: val}, [self.lookup_kwarg_isnull]), + 'display': 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': self.empty_value_display, + } + + +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 = params.get(self.lookup_kwarg) + super().__init__(field, request, params, model, model_admin, field_path) + + 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 = models.Q() + if self.field.empty_strings_allowed: + lookup_condition |= models.Q(**{self.field_path: ''}) + if self.field.null: + lookup_condition |= models.Q(**{'%s__isnull' % self.field_path: True}) + if self.lookup_val == '1': + return queryset.filter(lookup_condition) + return queryset.exclude(lookup_condition) + + def expected_parameters(self): + return [self.lookup_kwarg] + + def choices(self, changelist): + for lookup, title in ( + (None, _('All')), + ('1', _('Empty')), + ('0', _('Not empty')), + ): + yield { + 'selected': self.lookup_val == lookup, + 'query_string': changelist.get_query_string({self.lookup_kwarg: lookup}), + 'display': title, + } diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/forms.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/forms.py new file mode 100644 index 0000000..ee27509 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/forms.py @@ -0,0 +1,30 @@ +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/helpers.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/helpers.py new file mode 100644 index 0000000..6f0be6b --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/helpers.py @@ -0,0 +1,424 @@ +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.html import conditional_escape, format_html +from django.utils.safestring import mark_safe +from django.utils.translation import gettext, 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'}), + ) + + +checkbox = forms.CheckboxInput({'class': 'action-select'}, lambda value: False) + + +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 __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 media(self): + media = self.form.media + for fs in self: + media = 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): + if 'collapse' in self.classes: + return forms.Media(js=['admin/js/collapse.js']) + return forms.Media() + + 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) + + self.field = { + 'name': class_name, + 'label': label, + 'help_text': help_text, + 'field': field, + } + 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)]) + 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: + 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': False}, + '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 + + @property + def non_form_errors(self): + return self.formset.non_form_errors + + @property + def media(self): + media = self.opts.media + self.formset.media + for fs in self: + media = 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 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.get_parent_list()) + ) + + 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) + + def ordering_field(self): + from django.forms.formsets import ORDERING_FIELD_NAME + return AdminField(self.form, ORDERING_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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/af/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/af/LC_MESSAGES/django.mo new file mode 100644 index 0000000..eb14776 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/af/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/af/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/af/LC_MESSAGES/django.po new file mode 100644 index 0000000..f8a95ae --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/af/LC_MESSAGES/django.po @@ -0,0 +1,720 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Christopher Penkin, 2012 +# Christopher Penkin, 2012 +# F Wolff , 2019-2020 +# Pi Delport , 2012 +# Pi Delport , 2012 +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-20 17:06+0000\n" +"Last-Translator: F Wolff \n" +"Language-Team: Afrikaans (http://www.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 "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 "Are you sure?" +msgstr "Is u seker?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Skrap gekose %(verbose_name_plural)s" + +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." + +#, 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 added successfully. You may edit it again below." +msgstr "" +"Die {name} “{obj}” is suksesvol bygevoeg. 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" + +#, 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" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Modelle in die %(name)s-toepassing" + +msgid "Add" +msgstr "Voeg by" + +msgid "View" +msgstr "Bekyk" + +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 "" +"Gee eerstens ’n gebruikernaam en wagwoord. Daarna kan meer gebruikervelde " +"geredigeer word." + +msgid "Enter a username and password." +msgstr "Vul ’n gebruikersnaam en wagwoord in." + +msgid "Change password" +msgstr "Verander wagwoord" + +msgid "Please correct the error below." +msgstr "Maak die onderstaande fout asb. reg." + +msgid "Please correct the errors below." +msgstr "Maak die onderstaande foute asb. reg." + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "Vul ’n nuwe wagwoord vir gebruiker %(username)s in." + +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 "Clear all filters" +msgstr "" + +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 "Delete" +msgstr "Skrap" + +#, 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" + +msgid "Delete multiple objects" +msgstr "Skrap meerdere objekte" + +#, 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 "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 password or username?" +msgstr "Wagwoord of gebruikersnaam vergeet?" + +msgid "Toggle navigation" +msgstr "" + +msgid "Date/time" +msgstr "Datum/tyd" + +msgid "User" +msgstr "Gebruiker" + +msgid "Action" +msgstr "Aksie" + +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" + +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 "Your username, in case you’ve forgotten:" +msgstr "U gebruikernaam vir ingeval u vergeet het:" + +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 "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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/af/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/af/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..896cad2 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/af/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/af/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/af/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..816ef6e --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/af/LC_MESSAGES/djangojs.po @@ -0,0 +1,219 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# F Wolff , 2019 +# Pi Delport , 2013 +# Pi Delport , 2013 +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-04 18:43+0000\n" +"Last-Translator: F Wolff \n" +"Language-Team: Afrikaans (http://www.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 "" +"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 "" +"Hierdie is die lys beskikbare %s. Kies gerus deur hulle in die boksie " +"hieronder te merk en dan die “Kies”-knoppie tussen die boksies te klik." + +#, 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" + +msgid "Choose all" +msgstr "Kies almal" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "Klik om al die %s gelyktydig te kies." + +msgid "Choose" +msgstr "Kies" + +msgid "Remove" +msgstr "Verwyder" + +#, javascript-format +msgid "Chosen %s" +msgstr "Gekose %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 "" +"Hierdie is die lys gekose %s. Verwyder gerus deur hulle in die boksie " +"hieronder te merk en dan die “Verwyder”-knoppie tussen die boksies te klik." + +msgid "Remove all" +msgstr "Verwyder almal" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "Klik om al die %s gelyktydig te verwyder." + +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 "" +"U het ’n aksie gekies, maar nog nie die veranderinge aan individuele velde " +"gestoor nie. Klik asb. OK om te stoor. Dit sal nodig wees om weer die aksie " +"uit te voer." + +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 het ’n aksie gekies en het nie enige veranderinge aan individuele velde " +"aangebring nie. U soek waarskynlik na die Gaan-knoppie eerder as 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 "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" + +msgid "Show" +msgstr "Wys" + +msgid "Hide" +msgstr "Versteek" diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/am/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/am/LC_MESSAGES/django.mo new file mode 100644 index 0000000..37fd72a Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/am/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/am/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/am/LC_MESSAGES/django.po new file mode 100644 index 0000000..b42fc41 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/am/LC_MESSAGES/django.po @@ -0,0 +1,636 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ar/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ar/LC_MESSAGES/django.mo new file mode 100644 index 0000000..064ada0 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ar/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ar/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ar/LC_MESSAGES/django.po new file mode 100644 index 0000000..eaa04f2 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ar/LC_MESSAGES/django.po @@ -0,0 +1,725 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Bashar Al-Abdulhadi, 2015-2016,2018,2020 +# 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: 2020-07-14 19:53+0200\n" +"PO-Revision-Date: 2020-07-15 00:40+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 "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 "به تاريخ" + +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 "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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ar/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ar/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..f25264b Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ar/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ar/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ar/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..f22d6e6 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ar/LC_MESSAGES/djangojs.po @@ -0,0 +1,230 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Bashar Al-Abdulhadi, 2015,2020 +# 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: 2020-05-11 20:56+0200\n" +"PO-Revision-Date: 2020-07-06 09:56+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 "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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ar_DZ/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ar_DZ/LC_MESSAGES/django.mo new file mode 100644 index 0000000..af3d2aa Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ar_DZ/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ar_DZ/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ar_DZ/LC_MESSAGES/django.po new file mode 100644 index 0000000..5be9463 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ar_DZ/LC_MESSAGES/django.po @@ -0,0 +1,720 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Riterix , 2019-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: 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 "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 "به تاريخ" + +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 "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 نتيجة" +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 المختارة" + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ar_DZ/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ar_DZ/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..135c8e2 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ar_DZ/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ar_DZ/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ar_DZ/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..3bc48c8 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ar_DZ/LC_MESSAGES/djangojs.po @@ -0,0 +1,226 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Riterix , 2019-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-06-23 12:16+0000\n" +"Last-Translator: Riterix \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 "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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ast/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ast/LC_MESSAGES/django.mo new file mode 100644 index 0000000..e35811b Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ast/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ast/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ast/LC_MESSAGES/django.po new file mode 100644 index 0000000..437b080 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ast/LC_MESSAGES/django.po @@ -0,0 +1,636 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ast/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ast/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..7b7e49b Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ast/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ast/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ast/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..53705c7 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ast/LC_MESSAGES/djangojs.po @@ -0,0 +1,211 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/az/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/az/LC_MESSAGES/django.mo new file mode 100644 index 0000000..509db8d Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/az/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/az/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/az/LC_MESSAGES/django.po new file mode 100644 index 0000000..f964429 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/az/LC_MESSAGES/django.po @@ -0,0 +1,704 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Emin Mastizada , 2018,2020 +# Emin Mastizada , 2016 +# Konul Allahverdiyeva , 2016 +# Zulfugar Ismayilzadeh , 2017 +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: Azerbaijani (http://www.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 "Successfully deleted %(count)d %(items)s." +msgstr "%(count)d %(items)s uğurla silindi." + +#, python-format +msgid "Cannot delete %(name)s" +msgstr "%(name)s silinmir" + +msgid "Are you sure?" +msgstr "Əminsiniz?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Seçilmiş %(verbose_name_plural)s-ləri sil" + +msgid "Administration" +msgstr "Administrasiya" + +msgid "All" +msgstr "Hamısı" + +msgid "Yes" +msgstr "Hə" + +msgid "No" +msgstr "Yox" + +msgid "Unknown" +msgstr "Bilinmir" + +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ə parol daxil olun. " +"Nəzərə alın ki, hər iki sahə 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" + +msgid "Addition" +msgstr "Əlavə" + +msgid "Change" +msgstr "Dəyiş" + +msgid "Deletion" +msgstr "Silmə" + +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 "bayraq" + +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şmədi." + +msgid "None" +msgstr "Heç nə" + +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." + +#, 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 added successfully. You may edit it again below." +msgstr "" +"{name} “{obj}” uğurla əlavə edildi. Bunu 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 "" +"Biz elementlər üzərində nəsə ə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. Silinmiş ola bilər?" + +#, python-format +msgid "Add %s" +msgstr "%s əlavə et" + +#, python-format +msgid "Change %s" +msgstr "%s dəyiş" + +#, python-format +msgid "View %s" +msgstr "%s gör" + +msgid "Database error" +msgstr "Bazada xəta" + +#, 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ğurlu 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çili" + +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "%(cnt)s-dan 0 seçilib" + +#, 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 silmə əlaqəli qorunmalı obyektləri silməyi tələb " +"edir: %(related_objects)s" + +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 "Ev" + +msgid "Server error" +msgstr "Serverdə xəta" + +msgid "Server error (500)" +msgstr "Serverdə xəta (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 "" + +msgid "Run the selected action" +msgstr "Seçdiyim əməliyyatı yerinə yetir" + +msgid "Go" +msgstr "Getdik" + +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 tıqlayın" + +#, python-format +msgid "Select all %(total_count)s %(module_name)s" +msgstr "Bütün %(total_count)s sayda %(module_name)s seç" + +msgid "Clear selection" +msgstr "Seçimi təmizlə" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "%(name)s proqramındakı modellər" + +msgid "Add" +msgstr "Əlavə et" + +msgid "View" +msgstr "Gör" + +msgid "You don’t have permission to view or edit anything." +msgstr "Nəyi isə görmək və ya redaktə etmək icazəniz yoxdur." + +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 "İstifadəçi adını və parolu daxil edin." + +msgid "Change password" +msgstr "Parolu dəyiş" + +msgid "Please correct the error below." +msgstr "Lütfən aşağıdakı xətanı düzəldin." + +msgid "Please correct the errors below." +msgstr "Lütfən aşağıdakı səhvləri düzəldin." + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "%(username)s üçün yeni parol daxil edin." + +msgid "Welcome," +msgstr "Xoş gördük," + +msgid "View site" +msgstr "Saytı ziyarət et" + +msgid "Documentation" +msgstr "Sənədləşdirmə" + +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 göstər" + +msgid "Filter" +msgstr "Süzgəc" + +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 "Delete" +msgstr "Sil" + +#, 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, məni geri götür" + +msgid "Delete multiple objects" +msgstr "Bir neçə obyekt sil" + +#, 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 "Silək?" + +#, python-format +msgid " By %(filter_title)s " +msgstr " %(filter_title)s 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 "Unknown content" +msgstr "Naməlum" + +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 olaraq daxil olmusunuz, amma bu səhifəyə icazəniz yoxdur. Başqa " +"bir hesaba daxil olmaq istərdiniz?" + +msgid "Forgotten your password or username?" +msgstr "Parol və ya istifadəçi adını unutmusan?" + +msgid "Toggle navigation" +msgstr "" + +msgid "Date/time" +msgstr "Tarix/vaxt" + +msgid "User" +msgstr "İstifadəçi" + +msgid "Action" +msgstr "Əməliyyat" + +msgid "" +"This object doesn’t have a change history. It probably wasn’t added via this " +"admin site." +msgstr "" + +msgid "Show all" +msgstr "Hamısını göstər" + +msgid "Save" +msgstr "Yadda saxla" + +msgid "Popup closing…" +msgstr "Qəfil pəncərə qapatı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 "Saxla və gör" + +msgid "Close" +msgstr "Qapat" + +#, 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" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Sayt ilə səmərəli vaxt keçirdiyiniz üçün təşəkkür." + +msgid "Log in again" +msgstr "Yenidən daxil ol" + +msgid "Password change" +msgstr "Parol dəyişmək" + +msgid "Your password was changed." +msgstr "Sizin parolunuz dəyişdi." + +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 "Mənim parolumu dəyiş" + +msgid "Password reset" +msgstr "Parolun sıfırlanması" + +msgid "Your password has been set. You may go ahead and log in now." +msgstr "Yeni parol artıq qüvvədədir. Yenidən daxil ola bilərsiniz." + +msgid "Password reset confirmation" +msgstr "Parolun sıfırlanması üçün təsdiq" + +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "Yeni parolu iki dəfə daxil edin ki, səhv etmədiyinizə əmin olaq." + +msgid "New password:" +msgstr "Yeni parol:" + +msgid "Confirm password:" +msgstr "Yeni parol (bir daha):" + +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" +"Parolun sıfırlanması üçün olan keçid, yəqin ki, artıq istifadə olunub. " +"Parolu 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 "" + +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 saytında parolu 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 parolu seçin:" + +msgid "Your username, in case you’ve forgotten:" +msgstr "İstifadəçi adınız, əgər unutmusunuzsa:" + +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 "" + +msgid "Email address:" +msgstr "E-poçt:" + +msgid "Reset my password" +msgstr "Parolumu sıfırla" + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/az/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/az/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..b3088a5 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/az/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/az/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/az/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..e49194d --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/az/LC_MESSAGES/djangojs.po @@ -0,0 +1,218 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Ali Ismayilov , 2011-2012 +# Emin Mastizada , 2016,2020 +# Emin Mastizada , 2016 +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-14 20:39+0000\n" +"Last-Translator: Emin Mastizada \n" +"Language-Team: Azerbaijani (http://www.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ümkü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 "" +"Bu, mümkün %s siyahısıdır. Onlardan bir neçəsini qarşısındakı xanaya işarə " +"qoymaq və iki xana arasındakı \"Seç\"i tıqlamaqla seçmək olar." + +#, javascript-format +msgid "Type into this box to filter down the list of available %s." +msgstr "Bu xanaya yazmaqla mümkün %s siyahısını filtrləyə bilərsiniz." + +msgid "Filter" +msgstr "Süzgəc" + +msgid "Choose all" +msgstr "Hamısını seç" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "Bütün %s siyahısını seçmək üçün tıqlayın." + +msgid "Choose" +msgstr "Seç" + +msgid "Remove" +msgstr "Yığışdır" + +#, javascript-format +msgid "Chosen %s" +msgstr "Seçilmiş %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, seçilmiş %s siyahısıdır. Onlardan bir neçəsini aşağıdakı xanaya işarə " +"qoymaq və iki xana arasındakı \"Sil\"i tıqlamaqla silmək olar." + +msgid "Remove all" +msgstr "Hamısını sil" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "Seçilmiş %s siyahısının hamısını silmək üçün tıqlayın." + +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] "%(sel)s / %(cnt)s seçilib" + +msgid "" +"You have unsaved changes on individual editable fields. If you run an " +"action, your unsaved changes will be lost." +msgstr "" +"Bəzi sahələrdə etdiyiniz dəyişiklikləri hələ yadda saxlamamışıq. Əgər " +"əməliyyatı işə salsanız, 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 sahələrdəki 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 işlətmə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 sahələrdə dəyişiklər etməmisiniz. Böyük " +"ehtimal Saxla düyməsi yerinə Get düyməsinə ehtiyyacınız var." + +msgid "Now" +msgstr "İndi" + +msgid "Midnight" +msgstr "Gecə yarısı" + +msgid "6 a.m." +msgstr "6 a.m." + +msgid "Noon" +msgstr "Günorta" + +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] "Diqqət: Server vaxtından %s saat irəlidəsiniz." +msgstr[1] "Diqqət: 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] "Diqqət: 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 "Ləğv et" + +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 "one letter Sunday" +msgid "S" +msgstr "B" + +msgctxt "one letter Monday" +msgid "M" +msgstr "B" + +msgctxt "one letter Tuesday" +msgid "T" +msgstr "Ç" + +msgctxt "one letter Wednesday" +msgid "W" +msgstr "Ç" + +msgctxt "one letter Thursday" +msgid "T" +msgstr "C" + +msgctxt "one letter Friday" +msgid "F" +msgstr "C" + +msgctxt "one letter Saturday" +msgid "S" +msgstr "Ş" + +msgid "Show" +msgstr "Göstər" + +msgid "Hide" +msgstr "Gizlət" diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/be/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/be/LC_MESSAGES/django.mo new file mode 100644 index 0000000..18713a0 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/be/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/be/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/be/LC_MESSAGES/django.po new file mode 100644 index 0000000..5baf1e0 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/be/LC_MESSAGES/django.po @@ -0,0 +1,720 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Viktar Palstsiuk , 2015 +# znotdead , 2016-2017,2019-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-15 01:22+0000\n" +"Last-Translator: znotdead \n" +"Language-Team: Belarusian (http://www.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 "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 "Мае дату" + +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, каб вылучыць " +"больш за адзін." + +#, 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." + +#, 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 "Не абіраць нічога" + +#, 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 "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 вынікі" +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" + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/be/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/be/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..d854574 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/be/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/be/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/be/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..96a4413 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/be/LC_MESSAGES/djangojs.po @@ -0,0 +1,272 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Viktar Palstsiuk , 2015 +# znotdead , 2016,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-01-15 18:10+0000\n" +"Last-Translator: znotdead \n" +"Language-Team: Belarusian (http://www.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. Каб нешта прыбраць, пазначце патрэбнае ў полі ніжэй і " +"пстрыкніце па стрэлцы «Прыбраць» між двума палямі." + +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" +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 "Сне" + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/bg/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/bg/LC_MESSAGES/django.mo new file mode 100644 index 0000000..4a04342 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/bg/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/bg/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/bg/LC_MESSAGES/django.po new file mode 100644 index 0000000..767c727 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/bg/LC_MESSAGES/django.po @@ -0,0 +1,700 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# 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: 2021-01-15 09:00+0100\n" +"PO-Revision-Date: 2020-12-06 05:54+0000\n" +"Last-Translator: Todor Lubenov \n" +"Language-Team: Bulgarian (http://www.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 "" + +#, 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 "" +"Елементите трябва да бъдат избрани, за да се извършат действия по тях. Няма " +"променени елементи." + +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 "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 "Променете избрания %(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 "E-mail адреси:" + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/bg/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/bg/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..4940bb9 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/bg/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/bg/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/bg/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..ded64ac --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/bg/LC_MESSAGES/djangojs.po @@ -0,0 +1,218 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Venelin Stoykov , 2015-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-19 16:41+0000\n" +"Last-Translator: Venelin Stoykov \n" +"Language-Team: Bulgarian (http://www.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. Можете да премахнете някои, като ги изберете в " +"полето по-долу и след това щракнете върху \"Премахни\" стрелка между двете " +"кутии." + +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 бутон, а не бутона Save." + +#, 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 "6 a.m." + +msgid "Noon" +msgstr "По обяд" + +msgid "6 p.m." +msgstr "6 след обяд" + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/bn/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/bn/LC_MESSAGES/django.mo new file mode 100644 index 0000000..ab1d7ee Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/bn/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/bn/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/bn/LC_MESSAGES/django.po new file mode 100644 index 0000000..e36fb61 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/bn/LC_MESSAGES/django.po @@ -0,0 +1,652 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Anubhab Baksi, 2013 +# Jannis Leidel , 2011 +# Tahmid Rafi , 2012-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: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" + +#, 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 "%(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 "" + +#, 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 "%(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 "চিহ্নিত অংশের চিহ্ন মুছে ফেলুন" + +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 "" + +#, 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 "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] "" +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 "" +"আপনি এই ই-মেইলটি পেয়েছেন কারন আপনি %(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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/bn/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/bn/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..b3f7f97 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/bn/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/bn/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/bn/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..139d81c --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/bn/LC_MESSAGES/djangojs.po @@ -0,0 +1,207 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/br/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/br/LC_MESSAGES/django.mo new file mode 100644 index 0000000..296f113 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/br/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/br/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/br/LC_MESSAGES/django.po new file mode 100644 index 0000000..cbdc359 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/br/LC_MESSAGES/django.po @@ -0,0 +1,671 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/br/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/br/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..58664d0 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/br/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/br/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/br/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..3f81956 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/br/LC_MESSAGES/djangojs.po @@ -0,0 +1,217 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/bs/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/bs/LC_MESSAGES/django.mo new file mode 100644 index 0000000..f920c9b Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/bs/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/bs/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/bs/LC_MESSAGES/django.po new file mode 100644 index 0000000..1d7eb6e --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/bs/LC_MESSAGES/django.po @@ -0,0 +1,657 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/bs/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/bs/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..0a373ec Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/bs/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/bs/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/bs/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..4866fd3 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/bs/LC_MESSAGES/djangojs.po @@ -0,0 +1,211 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ca/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ca/LC_MESSAGES/django.mo new file mode 100644 index 0000000..72873a1 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ca/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ca/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ca/LC_MESSAGES/django.po new file mode 100644 index 0000000..2322313 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ca/LC_MESSAGES/django.po @@ -0,0 +1,732 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Antoni Aloy , 2014-2015,2017 +# Carles Barrobés , 2011-2012,2014 +# duub qnnp, 2015 +# 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: 2021-01-15 09:00+0100\n" +"PO-Revision-Date: 2021-04-04 21:09+0000\n" +"Last-Translator: Marc Compte \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 "Date/time" +msgstr "Data/hora" + +msgid "User" +msgstr "Usuari" + +msgid "Action" +msgstr "Acció" + +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" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Gràcies per passar una estona de qualitat al web durant el dia d'avui." + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ca/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ca/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..7b6e4de Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ca/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ca/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ca/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..5fbbab8 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ca/LC_MESSAGES/djangojs.po @@ -0,0 +1,221 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Antoni Aloy , 2017 +# Carles Barrobés , 2011-2012,2014 +# Jannis Leidel , 2011 +# Roger Pons , 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: Antoni Aloy \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" + +#, 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." + +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." + +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 "" +"Heu seleccionat una acció, però encara no heu desat els vostres canvis a " +"camps individuals. Si us plau premeu OK per desar. Haureu de 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 "" +"Heu seleccionat una acció i no heu fet cap canvi a camps individuals. " +"Probablement esteu cercant el botó 'Anar' enlloc 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 "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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/cs/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/cs/LC_MESSAGES/django.mo new file mode 100644 index 0000000..3329fe2 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/cs/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/cs/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/cs/LC_MESSAGES/django.po new file mode 100644 index 0000000..be87f4a --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/cs/LC_MESSAGES/django.po @@ -0,0 +1,732 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Jirka Vejrazka , 2011 +# Tomáš Ehrlich , 2015 +# Vláďa Macek , 2013-2014 +# Vláďa Macek , 2015-2020 +# yedpodtrzitko , 2016 +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-20 09:24+0000\n" +"Last-Translator: Vláďa Macek \n" +"Language-Team: Czech (http://www.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 "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?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Odstranit vybrané položky typu %(verbose_name_plural)s" + +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\"." + +#, 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 added successfully. You may edit it again below." +msgstr "" +"Položka \"{obj}\" typu {name} byla úspěšně přidá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" + +#, 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 "Please correct the error below." +msgstr "Opravte níže uvedenou chybu." + +msgid "Please correct the errors below." +msgstr "Opravte 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 "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 "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 "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 "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 "Date/time" +msgstr "Datum a čas" + +msgid "User" +msgstr "Uživatel" + +msgid "Action" +msgstr "Operace" + +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" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Děkujeme za čas strávený s tímto 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 "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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/cs/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/cs/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..39c441e Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/cs/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/cs/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/cs/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..39d02b6 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/cs/LC_MESSAGES/djangojs.po @@ -0,0 +1,274 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# 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: 2021-01-15 09:00+0100\n" +"PO-Revision-Date: 2021-03-18 23:23+0000\n" +"Last-Translator: Vláďa Macek \n" +"Language-Team: Czech (http://www.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." + +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." + +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" + +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" + +msgid "Show" +msgstr "Zobrazit" + +msgid "Hide" +msgstr "Skrýt" diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/cy/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/cy/LC_MESSAGES/django.mo new file mode 100644 index 0000000..e20f6a4 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/cy/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/cy/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/cy/LC_MESSAGES/django.po new file mode 100644 index 0000000..82e82f7 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/cy/LC_MESSAGES/django.po @@ -0,0 +1,675 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/cy/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/cy/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..ee9a9ca Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/cy/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/cy/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/cy/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..fa7ad2a --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/cy/LC_MESSAGES/djangojs.po @@ -0,0 +1,222 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/da/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/da/LC_MESSAGES/django.mo new file mode 100644 index 0000000..985a5e5 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/da/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/da/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/da/LC_MESSAGES/django.po new file mode 100644 index 0000000..1435a36 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/da/LC_MESSAGES/django.po @@ -0,0 +1,722 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Christian Joergensen , 2012 +# Dimitris Glezos , 2012 +# Erik Ramsgaard Wognsen , 2020 +# 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: 2020-07-14 19:53+0200\n" +"PO-Revision-Date: 2020-07-15 08:56+0000\n" +"Last-Translator: Erik Ramsgaard Wognsen \n" +"Language-Team: Danish (http://www.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 "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 "Are you sure?" +msgstr "Er du sikker?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Slet valgte %(verbose_name_plural)s" + +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." + +#, 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 added successfully. You may edit it again below." +msgstr "{name} “{obj}” blev tilføjet. 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" + +#, 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" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Modeller i applikationen %(name)s" + +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 "" +"First, enter a username and password. Then, you’ll be able to edit more user " +"options." +msgstr "" +"Indtast først et brugernavn og en adgangskode. Derefter får du yderligere " +"redigeringsmuligheder." + +msgid "Enter a username and password." +msgstr "Indtast et brugernavn og en adgangskode." + +msgid "Change password" +msgstr "Skift adgangskode" + +msgid "Please correct the error below." +msgstr "Ret venligst fejlen herunder." + +msgid "Please correct the errors below." +msgstr "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 "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 "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 "Delete" +msgstr "Slet" + +#, 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" + +msgid "Delete multiple objects" +msgstr "Slet 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 "" +"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 "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 password or username?" +msgstr "Har du glemt dit password eller brugernavn?" + +msgid "Toggle navigation" +msgstr "Vis/skjul navigation" + +msgid "Date/time" +msgstr "Dato/tid" + +msgid "User" +msgstr "Bruger" + +msgid "Action" +msgstr "Funktion" + +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" + +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 "Your username, in case you’ve forgotten:" +msgstr "Hvis du skulle have glemt dit brugernavn er det:" + +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 "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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/da/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/da/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..8801448 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/da/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/da/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/da/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..4929fd3 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/da/LC_MESSAGES/djangojs.po @@ -0,0 +1,270 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Christian Joergensen , 2012 +# Erik Ramsgaard Wognsen , 2021 +# 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: 2021-01-15 09:00+0100\n" +"PO-Revision-Date: 2021-01-15 18:53+0000\n" +"Last-Translator: Erik Ramsgaard Wognsen \n" +"Language-Team: Danish (http://www.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 "" +"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 tilgængelige %s. Du kan vælge dem enkeltvis ved at " +"markere dem i kassen nedenfor og derefter klikke på \"Vælg\"-pilen mellem de " +"to kasser." + +#, 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" + +msgid "Choose all" +msgstr "Vælg alle" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "Klik for at vælge alle %s med det samme." + +msgid "Choose" +msgstr "Vælg" + +msgid "Remove" +msgstr "Fjern" + +#, 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 dem enkeltvis ved at markere " +"dem i kassen nedenfor og derefter klikke på \"Fjern\"-pilen mellem de to " +"kasser." + +msgid "Remove all" +msgstr "Fjern alle" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "Klik for at fjerne alle valgte %s med det samme." + +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" + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/de/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/de/LC_MESSAGES/django.mo new file mode 100644 index 0000000..8c59438 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/de/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/de/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/de/LC_MESSAGES/django.po new file mode 100644 index 0000000..d628530 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/de/LC_MESSAGES/django.po @@ -0,0 +1,735 @@ +# 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 +# Jannis Vajen, 2013 +# Jannis Leidel , 2013-2018,2020 +# Jannis Vajen, 2016 +# Markus Holtermann , 2020 +# Markus Holtermann , 2013,2015 +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-17 07:47+0000\n" +"Last-Translator: Florian Apolloner \n" +"Language-Team: German (http://www.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 "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?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Ausgewählte %(verbose_name_plural)s löschen" + +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." + +#, 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" + +#, 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." +msgstr "Bitte den unten aufgeführten Fehler korrigieren." + +msgid "Please correct the errors below." +msgstr "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 "Welcome," +msgstr "Willkommen," + +msgid "View site" +msgstr "Auf der 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 "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 "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 "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 "Date/time" +msgstr "Datum/Zeit" + +msgid "User" +msgstr "Benutzer" + +msgid "Action" +msgstr "Aktion" + +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" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Vielen Dank, dass Sie hier ein paar nette Minuten 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 "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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/de/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/de/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..1ae1cce Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/de/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/de/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/de/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..7d009f3 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/de/LC_MESSAGES/djangojs.po @@ -0,0 +1,223 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# André Hagenbruch, 2011-2012 +# Florian Apolloner , 2020 +# Jannis Leidel , 2011,2013-2016 +# Jannis Vajen, 2016 +# Markus Holtermann , 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-06-16 13:07+0000\n" +"Last-Translator: Florian Apolloner \n" +"Language-Team: German (http://www.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." + +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." + +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 "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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/dsb/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/dsb/LC_MESSAGES/django.mo new file mode 100644 index 0000000..03060dc Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/dsb/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/dsb/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/dsb/LC_MESSAGES/django.po new file mode 100644 index 0000000..33a4adf --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/dsb/LC_MESSAGES/django.po @@ -0,0 +1,722 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Michael Wolf , 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-21 12:54+0000\n" +"Last-Translator: Michael Wolf \n" +"Language-Team: Lower Sorbian (http://www.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 "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 "Are you sure?" +msgstr "Sćo se wěsty?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Wubrane %(verbose_name_plural)s 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ł." + +#, 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 added successfully. You may edit it again below." +msgstr "" +"{name} „{obj}“ jo se wuspěšnje pśidał. 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" + +#, 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ś" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Modele w nałoženju %(name)s" + +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 "" +"First, enter a username and password. Then, you’ll be able to edit more user " +"options." +msgstr "" +"Zapódajśo nejpjerwjej wužywarske mě a gronidło. Pótom móžośo dalšne " +"wužywarske nastajenja wobźěłowaś." + +msgid "Enter a username and password." +msgstr "Zapódajśo wužywarske mě a gronidło." + +msgid "Change password" +msgstr "Gronidło změniś" + +msgid "Please correct the error below." +msgstr "Pšosym korigěrujśo slědujucu zmólku." + +msgid "Please correct the errors below." +msgstr "Pšosym skorigě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 "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 "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 "Delete" +msgstr "Lašowaś" + +#, 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" + +msgid "Delete multiple objects" +msgstr "Někotare objekty lašowaś" + +#, 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 "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 password or username?" +msgstr "Sćo swójo gronidło abo wužywarske mě zabył?" + +msgid "Toggle navigation" +msgstr "Nawigaciju pśešaltowaś" + +msgid "Date/time" +msgstr "Datum/cas" + +msgid "User" +msgstr "Wužywaŕ" + +msgid "Action" +msgstr "Akcija" + +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ś" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Źěkujomy se, až sćo źinsa wěsty cas na websedle pśebywał." + +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 "Your username, in case you’ve forgotten:" +msgstr "Wašo wužywarske mě, jolic sćo jo zabył:" + +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 "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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/dsb/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/dsb/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..c1742a6 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/dsb/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/dsb/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/dsb/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..bfdb386 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/dsb/LC_MESSAGES/djangojs.po @@ -0,0 +1,273 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Michael Wolf , 2016,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-02-01 22:10+0000\n" +"Last-Translator: Michael Wolf \n" +"Language-Team: Lower Sorbian (http://www.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 "" +"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 jo lisćina k dispoziciji stojecych %s. Klikniśo na šypku „Wubraś“ mjazy " +"kašćikoma, aby někotare z nich w slědujucem kašćiku 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ś" + +msgid "Choose all" +msgstr "Wšykne wubraś" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "Klikniśo, aby wšykne %s naraz wubrał." + +msgid "Choose" +msgstr "Wubraś" + +msgid "Remove" +msgstr "Wótpóraś" + +#, javascript-format +msgid "Chosen %s" +msgstr "Wubrane %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 jo lisćina wubranych %s. Klikniśo na šypku „Wótpóraś“ mjazy kašćikoma, " +"aby někotare z nich w slědujucem kašćiku wótpórał." + +msgid "Remove all" +msgstr "Wšykne wótpóraś" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "Klikniśo, aby wšykne wubrane %s naraz wótpórał." + +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." + +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" + +msgid "Show" +msgstr "Pokazaś" + +msgid "Hide" +msgstr "Schowaś" diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/el/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/el/LC_MESSAGES/django.mo new file mode 100644 index 0000000..0f88816 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/el/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/el/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/el/LC_MESSAGES/django.po new file mode 100644 index 0000000..ec1dc94 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/el/LC_MESSAGES/django.po @@ -0,0 +1,737 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/el/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/el/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..5da3e88 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/el/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/el/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/el/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..223eccb --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/el/LC_MESSAGES/djangojs.po @@ -0,0 +1,223 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Dimitris Glezos , 2011 +# 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: 2016-05-17 23:12+0200\n" +"PO-Revision-Date: 2017-09-23 19:47+0000\n" +"Last-Translator: Nick Mavrakis \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 αντί του κουμπιού Αποθήκευσης." + +#, 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 "6 π.μ." + +msgid "Noon" +msgstr "Μεσημέρι" + +msgid "6 p.m." +msgstr "6 μ.μ." + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/en/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/en/LC_MESSAGES/django.mo new file mode 100644 index 0000000..08a7b68 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/en/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/en/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/en/LC_MESSAGES/django.po new file mode 100644 index 0000000..d5dc5e5 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/en/LC_MESSAGES/django.po @@ -0,0 +1,900 @@ +# 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: 2021-01-15 09:00+0100\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:16 +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "" + +#: contrib/admin/actions.py:46 +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "" + +#: contrib/admin/actions.py:55 contrib/admin/options.py:1886 +#, python-format +msgid "Cannot delete %(name)s" +msgstr "" + +#: contrib/admin/actions.py:57 contrib/admin/options.py:1888 +msgid "Are you sure?" +msgstr "" + +#: contrib/admin/apps.py:13 +msgid "Administration" +msgstr "" + +#: contrib/admin/filters.py:108 contrib/admin/filters.py:213 +#: contrib/admin/filters.py:249 contrib/admin/filters.py:284 +#: contrib/admin/filters.py:403 contrib/admin/filters.py:468 +msgid "All" +msgstr "" + +#: contrib/admin/filters.py:250 +msgid "Yes" +msgstr "" + +#: contrib/admin/filters.py:251 +msgid "No" +msgstr "" + +#: contrib/admin/filters.py:262 +msgid "Unknown" +msgstr "" + +#: contrib/admin/filters.py:332 +msgid "Any date" +msgstr "" + +#: contrib/admin/filters.py:333 +msgid "Today" +msgstr "" + +#: contrib/admin/filters.py:337 +msgid "Past 7 days" +msgstr "" + +#: contrib/admin/filters.py:341 +msgid "This month" +msgstr "" + +#: contrib/admin/filters.py:345 +msgid "This year" +msgstr "" + +#: contrib/admin/filters.py:353 +msgid "No date" +msgstr "" + +#: contrib/admin/filters.py:354 +msgid "Has date" +msgstr "" + +#: contrib/admin/filters.py:469 +msgid "Empty" +msgstr "" + +#: contrib/admin/filters.py:470 +msgid "Not empty" +msgstr "" + +#: contrib/admin/forms.py:13 +#, 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:23 +msgid "Action:" +msgstr "" + +#: contrib/admin/helpers.py:329 +#, python-format +msgid "Add another %(verbose_name)s" +msgstr "" + +#: contrib/admin/helpers.py:332 +msgid "Remove" +msgstr "" + +#: contrib/admin/models.py:17 +msgid "Addition" +msgstr "" + +#: contrib/admin/models.py:18 contrib/admin/templates/admin/app_list.html:28 +#: contrib/admin/templates/admin/edit_inline/stacked.html:12 +#: contrib/admin/templates/admin/edit_inline/tabular.html:34 +#: contrib/admin/templates/admin/widgets/related_widget_wrapper.html:11 +msgid "Change" +msgstr "" + +#: contrib/admin/models.py:19 +msgid "Deletion" +msgstr "" + +#: contrib/admin/models.py:41 +msgid "action time" +msgstr "" + +#: contrib/admin/models.py:48 +msgid "user" +msgstr "" + +#: contrib/admin/models.py:53 +msgid "content type" +msgstr "" + +#: contrib/admin/models.py:56 +msgid "object id" +msgstr "" + +#. Translators: 'repr' means representation (https://docs.python.org/library/functions.html#repr) +#: contrib/admin/models.py:58 +msgid "object repr" +msgstr "" + +#: contrib/admin/models.py:59 +msgid "action flag" +msgstr "" + +#: contrib/admin/models.py:61 +msgid "change message" +msgstr "" + +#: contrib/admin/models.py:66 +msgid "log entry" +msgstr "" + +#: contrib/admin/models.py:67 +msgid "log entries" +msgstr "" + +#: contrib/admin/models.py:76 +#, python-format +msgid "Added “%(object)s”." +msgstr "" + +#: contrib/admin/models.py:78 +#, python-format +msgid "Changed “%(object)s” — %(changes)s" +msgstr "" + +#: contrib/admin/models.py:83 +#, python-format +msgid "Deleted “%(object)s.”" +msgstr "" + +#: contrib/admin/models.py:85 +msgid "LogEntry Object" +msgstr "" + +#: contrib/admin/models.py:111 +#, python-brace-format +msgid "Added {name} “{object}”." +msgstr "" + +#: contrib/admin/models.py:113 +msgid "Added." +msgstr "" + +#: contrib/admin/models.py:117 contrib/admin/options.py:2112 +msgid "and" +msgstr "" + +#: contrib/admin/models.py:121 +#, python-brace-format +msgid "Changed {fields} for {name} “{object}”." +msgstr "" + +#: contrib/admin/models.py:125 +#, python-brace-format +msgid "Changed {fields}." +msgstr "" + +#: contrib/admin/models.py:129 +#, python-brace-format +msgid "Deleted {name} “{object}”." +msgstr "" + +#: contrib/admin/models.py:132 +msgid "No fields changed." +msgstr "" + +#: contrib/admin/options.py:203 contrib/admin/options.py:235 +msgid "None" +msgstr "" + +#: contrib/admin/options.py:281 +msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." +msgstr "" + +#: contrib/admin/options.py:1221 contrib/admin/options.py:1245 +#, python-brace-format +msgid "The {name} “{obj}” was added successfully." +msgstr "" + +#: contrib/admin/options.py:1223 +msgid "You may edit it again below." +msgstr "" + +#: contrib/admin/options.py:1235 +#, python-brace-format +msgid "" +"The {name} “{obj}” was added successfully. You may add another {name} below." +msgstr "" + +#: contrib/admin/options.py:1285 +#, python-brace-format +msgid "" +"The {name} “{obj}” was changed successfully. You may edit it again below." +msgstr "" + +#: contrib/admin/options.py:1295 +#, python-brace-format +msgid "The {name} “{obj}” was added successfully. You may edit it again below." +msgstr "" + +#: contrib/admin/options.py:1308 +#, python-brace-format +msgid "" +"The {name} “{obj}” was changed successfully. You may add another {name} " +"below." +msgstr "" + +#: contrib/admin/options.py:1320 +#, python-brace-format +msgid "The {name} “{obj}” was changed successfully." +msgstr "" + +#: contrib/admin/options.py:1397 contrib/admin/options.py:1727 +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" + +#: contrib/admin/options.py:1416 +msgid "No action selected." +msgstr "" + +#: contrib/admin/options.py:1441 +#, python-format +msgid "The %(name)s “%(obj)s” was deleted successfully." +msgstr "" + +#: contrib/admin/options.py:1527 +#, python-format +msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" +msgstr "" + +#: contrib/admin/options.py:1622 +#, python-format +msgid "Add %s" +msgstr "" + +#: contrib/admin/options.py:1624 +#, python-format +msgid "Change %s" +msgstr "" + +#: contrib/admin/options.py:1626 +#, python-format +msgid "View %s" +msgstr "" + +#: contrib/admin/options.py:1705 +msgid "Database error" +msgstr "" + +#: contrib/admin/options.py:1774 +#, 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:1805 +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "" +msgstr[1] "" + +#: contrib/admin/options.py:1813 +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "" + +#: contrib/admin/options.py:1932 +#, 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:2105 +#, python-format +msgid "%(class_name)s %(instance)s" +msgstr "" + +#: contrib/admin/options.py:2114 +#, 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:47 contrib/admin/templates/admin/base_site.html:3 +msgid "Django site admin" +msgstr "" + +#: contrib/admin/sites.py:50 contrib/admin/templates/admin/base_site.html:6 +msgid "Django administration" +msgstr "" + +#: contrib/admin/sites.py:53 +msgid "Site administration" +msgstr "" + +#: contrib/admin/sites.py:399 contrib/admin/templates/admin/login.html:63 +#: contrib/admin/templates/registration/password_reset_complete.html:15 +#: contrib/admin/tests.py:135 +msgid "Log in" +msgstr "" + +#: contrib/admin/sites.py:544 +#, 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:9 +#: contrib/admin/templates/admin/auth/user/change_password.html:10 +#: contrib/admin/templates/admin/base.html:65 +#: contrib/admin/templates/admin/change_form.html:18 +#: contrib/admin/templates/admin/change_list.html:31 +#: 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:6 +#: contrib/admin/templates/registration/password_change_form.html:7 +#: contrib/admin/templates/registration/password_reset_complete.html:6 +#: contrib/admin/templates/registration/password_reset_confirm.html:7 +#: contrib/admin/templates/registration/password_reset_done.html:6 +#: contrib/admin/templates/registration/password_reset_form.html:7 +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_list.html:8 +#, python-format +msgid "Models in the %(name)s application" +msgstr "" + +#: contrib/admin/templates/admin/app_list.html:19 +#: contrib/admin/templates/admin/widgets/related_widget_wrapper.html:18 +msgid "Add" +msgstr "" + +#: contrib/admin/templates/admin/app_list.html:26 +#: contrib/admin/templates/admin/edit_inline/stacked.html:12 +#: contrib/admin/templates/admin/edit_inline/tabular.html:34 +msgid "View" +msgstr "" + +#: contrib/admin/templates/admin/app_list.html:39 +msgid "You don’t have permission to view or edit anything." +msgstr "" + +#: contrib/admin/templates/admin/auth/user/add_form.html:6 +msgid "" +"First, enter a username and password. Then, you’ll be able to edit more user " +"options." +msgstr "" + +#: contrib/admin/templates/admin/auth/user/add_form.html:8 +msgid "Enter a username and password." +msgstr "" + +#: contrib/admin/templates/admin/auth/user/change_password.html:14 +#: contrib/admin/templates/admin/auth/user/change_password.html:52 +#: contrib/admin/templates/admin/base.html:53 +#: contrib/admin/templates/registration/password_change_done.html:3 +#: contrib/admin/templates/registration/password_change_form.html:4 +msgid "Change password" +msgstr "" + +#: contrib/admin/templates/admin/auth/user/change_password.html:25 +#: contrib/admin/templates/admin/change_form.html:43 +#: contrib/admin/templates/admin/change_list.html:51 +#: contrib/admin/templates/admin/login.html:23 +#: contrib/admin/templates/registration/password_change_form.html:18 +msgid "Please correct the error below." +msgstr "" + +#: contrib/admin/templates/admin/auth/user/change_password.html:25 +#: contrib/admin/templates/admin/change_form.html:43 +#: contrib/admin/templates/admin/change_list.html:51 +#: contrib/admin/templates/admin/login.html:23 +#: contrib/admin/templates/registration/password_change_form.html:18 +msgid "Please correct the errors below." +msgstr "" + +#: contrib/admin/templates/admin/auth/user/change_password.html:29 +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "" + +#: contrib/admin/templates/admin/base.html:39 +msgid "Welcome," +msgstr "" + +#: contrib/admin/templates/admin/base.html:44 +msgid "View site" +msgstr "" + +#: contrib/admin/templates/admin/base.html:49 +#: contrib/admin/templates/registration/password_change_done.html:3 +#: contrib/admin/templates/registration/password_change_form.html:4 +msgid "Documentation" +msgstr "" + +#: contrib/admin/templates/admin/base.html:55 +#: contrib/admin/templates/registration/password_change_done.html:3 +#: contrib/admin/templates/registration/password_change_form.html:4 +msgid "Log out" +msgstr "" + +#: contrib/admin/templates/admin/change_form.html:21 +#: 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:14 +#: contrib/admin/templates/admin/edit_inline/tabular.html:36 +msgid "View on site" +msgstr "" + +#: contrib/admin/templates/admin/change_list.html:76 +msgid "Filter" +msgstr "" + +#: contrib/admin/templates/admin/change_list.html:78 +msgid "Clear all filters" +msgstr "" + +#: contrib/admin/templates/admin/change_list_results.html:17 +msgid "Remove from sorting" +msgstr "" + +#: contrib/admin/templates/admin/change_list_results.html:18 +#, python-format +msgid "Sorting priority: %(priority_number)s" +msgstr "" + +#: contrib/admin/templates/admin/change_list_results.html:19 +msgid "Toggle sorting" +msgstr "" + +#: contrib/admin/templates/admin/delete_confirmation.html:18 +#: contrib/admin/templates/admin/submit_line.html:7 +#: contrib/admin/templates/admin/widgets/related_widget_wrapper.html:25 +msgid "Delete" +msgstr "" + +#: contrib/admin/templates/admin/delete_confirmation.html:24 +#, 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:31 +#, 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:38 +#, 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:40 +#: contrib/admin/templates/admin/delete_selected_confirmation.html:39 +msgid "Objects" +msgstr "" + +#: contrib/admin/templates/admin/delete_confirmation.html:47 +#: contrib/admin/templates/admin/delete_selected_confirmation.html:50 +msgid "Yes, I’m sure" +msgstr "" + +#: contrib/admin/templates/admin/delete_confirmation.html:48 +#: contrib/admin/templates/admin/delete_selected_confirmation.html:51 +msgid "No, take me back" +msgstr "" + +#: contrib/admin/templates/admin/delete_selected_confirmation.html:17 +msgid "Delete multiple objects" +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:30 +#, 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:37 +#, 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:20 +msgid "Delete?" +msgstr "" + +#: contrib/admin/templates/admin/filter.html:2 +#, 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:42 +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:39 +#, 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:59 +msgid "Forgotten your password or username?" +msgstr "" + +#: contrib/admin/templates/admin/nav_sidebar.html:2 +msgid "Toggle navigation" +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:38 +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:9 +msgid "Save as new" +msgstr "" + +#: contrib/admin/templates/admin/submit_line.html:10 +msgid "Save and add another" +msgstr "" + +#: contrib/admin/templates/admin/submit_line.html:11 +msgid "Save and continue editing" +msgstr "" + +#: contrib/admin/templates/admin/submit_line.html:11 +msgid "Save and view" +msgstr "" + +#: contrib/admin/templates/admin/submit_line.html:12 +msgid "Close" +msgstr "" + +#: contrib/admin/templates/admin/widgets/related_widget_wrapper.html:10 +#, python-format +msgid "Change selected %(model)s" +msgstr "" + +#: contrib/admin/templates/admin/widgets/related_widget_wrapper.html:17 +#, python-format +msgid "Add another %(model)s" +msgstr "" + +#: contrib/admin/templates/admin/widgets/related_widget_wrapper.html:24 +#, python-format +msgid "Delete 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:7 +#: contrib/admin/templates/registration/password_change_form.html:8 +msgid "Password change" +msgstr "" + +#: contrib/admin/templates/registration/password_change_done.html:12 +msgid "Your password was changed." +msgstr "" + +#: contrib/admin/templates/registration/password_change_form.html:23 +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:51 +#: contrib/admin/templates/registration/password_reset_confirm.html:31 +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:8 +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:8 +msgid "Password reset confirmation" +msgstr "" + +#: contrib/admin/templates/registration/password_reset_confirm.html:16 +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:23 +msgid "New password:" +msgstr "" + +#: contrib/admin/templates/registration/password_reset_confirm.html:28 +msgid "Confirm password:" +msgstr "" + +#: contrib/admin/templates/registration/password_reset_confirm.html:37 +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 "Your username, in case you’ve forgotten:" +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:14 +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:20 +msgid "Email address:" +msgstr "" + +#: contrib/admin/templates/registration/password_reset_form.html:23 +msgid "Reset my password" +msgstr "" + +#: contrib/admin/templatetags/admin_list.py:390 +msgid "All dates" +msgstr "" + +#: contrib/admin/views/main.py:102 +#, python-format +msgid "Select %s" +msgstr "" + +#: contrib/admin/views/main.py:104 +#, python-format +msgid "Select %s to change" +msgstr "" + +#: contrib/admin/views/main.py:106 +#, python-format +msgid "Select %s to view" +msgstr "" + +#: contrib/admin/widgets.py:87 +msgid "Date:" +msgstr "" + +#: contrib/admin/widgets.py:88 +msgid "Time:" +msgstr "" + +#: contrib/admin/widgets.py:150 +msgid "Lookup" +msgstr "" + +#: contrib/admin/widgets.py:340 +msgid "Currently:" +msgstr "" + +#: contrib/admin/widgets.py:341 +msgid "Change:" +msgstr "" diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/en/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/en/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..08a7b68 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/en/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/en/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/en/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..bca964a --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/en/LC_MESSAGES/djangojs.po @@ -0,0 +1,316 @@ +# 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: 2021-01-15 09:00+0100\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:38 +#, javascript-format +msgid "Available %s" +msgstr "" + +#: contrib/admin/static/admin/js/SelectFilter2.js:44 +#, 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 "" + +#: contrib/admin/static/admin/js/SelectFilter2.js:60 +#, javascript-format +msgid "Type into this box to filter down the list of available %s." +msgstr "" + +#: contrib/admin/static/admin/js/SelectFilter2.js:65 +msgid "Filter" +msgstr "" + +#: contrib/admin/static/admin/js/SelectFilter2.js:69 +msgid "Choose all" +msgstr "" + +#: contrib/admin/static/admin/js/SelectFilter2.js:69 +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "" + +#: contrib/admin/static/admin/js/SelectFilter2.js:75 +msgid "Choose" +msgstr "" + +#: contrib/admin/static/admin/js/SelectFilter2.js:77 +msgid "Remove" +msgstr "" + +#: contrib/admin/static/admin/js/SelectFilter2.js:83 +#, javascript-format +msgid "Chosen %s" +msgstr "" + +#: contrib/admin/static/admin/js/SelectFilter2.js:89 +#, 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 "" + +#: contrib/admin/static/admin/js/SelectFilter2.js:99 +msgid "Remove all" +msgstr "" + +#: contrib/admin/static/admin/js/SelectFilter2.js:99 +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "" + +#: contrib/admin/static/admin/js/actions.js:64 +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:130 +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:143 +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:144 +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:111 +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:129 +msgid "Choose a Time" +msgstr "" + +#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:159 +msgid "Choose a time" +msgstr "" + +#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:176 +#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:334 +msgid "Cancel" +msgstr "" + +#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:239 +#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:319 +msgid "Today" +msgstr "" + +#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:256 +msgid "Choose a Date" +msgstr "" + +#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:313 +msgid "Yesterday" +msgstr "" + +#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:325 +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 +msgctxt "one letter Sunday" +msgid "S" +msgstr "" + +#: contrib/admin/static/admin/js/calendar.js:40 +msgctxt "one letter Monday" +msgid "M" +msgstr "" + +#: contrib/admin/static/admin/js/calendar.js:41 +msgctxt "one letter Tuesday" +msgid "T" +msgstr "" + +#: contrib/admin/static/admin/js/calendar.js:42 +msgctxt "one letter Wednesday" +msgid "W" +msgstr "" + +#: contrib/admin/static/admin/js/calendar.js:43 +msgctxt "one letter Thursday" +msgid "T" +msgstr "" + +#: contrib/admin/static/admin/js/calendar.js:44 +msgctxt "one letter Friday" +msgid "F" +msgstr "" + +#: contrib/admin/static/admin/js/calendar.js:45 +msgctxt "one letter Saturday" +msgid "S" +msgstr "" + +#: contrib/admin/static/admin/js/collapse.js:16 +#: contrib/admin/static/admin/js/collapse.js:34 +msgid "Show" +msgstr "" + +#: contrib/admin/static/admin/js/collapse.js:30 +msgid "Hide" +msgstr "" diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/en_AU/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/en_AU/LC_MESSAGES/django.mo new file mode 100644 index 0000000..a19397e Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/en_AU/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/en_AU/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/en_AU/LC_MESSAGES/django.po new file mode 100644 index 0000000..111eb38 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/en_AU/LC_MESSAGES/django.po @@ -0,0 +1,636 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Tom Fifield , 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 21:09+0000\n" +"Last-Translator: Jannis Leidel \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 "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 "" + +msgid "All" +msgstr "All" + +msgid "Yes" +msgstr "" + +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 "" + +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 "" +"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 "" + +msgid "Remove" +msgstr "" + +msgid "action time" +msgstr "action time" + +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 "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 "" + +msgid "Added." +msgstr "" + +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. 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 "" +"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 "" + +#, 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" + +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 "" + +#. 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] "" +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/en_AU/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/en_AU/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..775077f Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/en_AU/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/en_AU/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/en_AU/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..fe991ff --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/en_AU/LC_MESSAGES/djangojs.po @@ -0,0 +1,209 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Tom Fifield , 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 21:09+0000\n" +"Last-Translator: Jannis Leidel \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] "" +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 "" + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/en_GB/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/en_GB/LC_MESSAGES/django.mo new file mode 100644 index 0000000..b20f7bd Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/en_GB/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/en_GB/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/en_GB/LC_MESSAGES/django.po new file mode 100644 index 0000000..167a0db --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/en_GB/LC_MESSAGES/django.po @@ -0,0 +1,691 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/en_GB/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/en_GB/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..0967a38 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/en_GB/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/en_GB/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/en_GB/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..03cf679 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/en_GB/LC_MESSAGES/djangojs.po @@ -0,0 +1,218 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/eo/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/eo/LC_MESSAGES/django.mo new file mode 100644 index 0000000..b9a3fd9 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/eo/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/eo/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/eo/LC_MESSAGES/django.po new file mode 100644 index 0000000..5a74272 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/eo/LC_MESSAGES/django.po @@ -0,0 +1,711 @@ +# 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 +# Nikolay Korotkiy , 2017 +# Adamo Mesha , 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-04-13 08:23+0000\n" +"Last-Translator: Matthieu Desplantes \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 eniri la ĝustan %(username)s-n kaj pasvorton por personara konto. " +"Notu, ke ambaŭ kampoj povas esti usklecodistinga." + +msgid "Action:" +msgstr "Ago:" + +#, python-format +msgid "Add another %(verbose_name)s" +msgstr "Aldoni alian %(verbose_name)sn" + +msgid "Remove" +msgstr "Forigu" + +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 "Aldonis “%(object)s”" + +#, python-format +msgid "Changed “%(object)s” — %(changes)s" +msgstr "" + +#, python-format +msgid "Deleted “%(object)s.”" +msgstr "" + +msgid "LogEntry Object" +msgstr "Protokolera objekto" + +#, python-brace-format +msgid "Added {name} “{object}”." +msgstr "" + +msgid "Added." +msgstr "Aldonita." + +msgid "and" +msgstr "kaj" + +#, python-brace-format +msgid "Changed {fields} for {name} “{object}”." +msgstr "" + +#, python-brace-format +msgid "Changed {fields}." +msgstr "Ŝanĝita {fields}." + +#, python-brace-format +msgid "Deleted {name} “{object}”." +msgstr "" + +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 "" + +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 elfari agojn sur ilin. 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 "" + +#, 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 "Djanga reteja administrado" + +msgid "Django administration" +msgstr "Djanga administrado" + +msgid "Site administration" +msgstr "Reteja administrado" + +msgid "Log in" +msgstr "Ensaluti" + +#, python-format +msgid "%(app)s administration" +msgstr "%(app)s administrado" + +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 elektita 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 %(name)s aplikaĵo" + +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ŭ salutnomo?" + +msgid "Toggle navigation" +msgstr "Ŝalti navigadon" + +msgid "Date/time" +msgstr "Dato/horo" + +msgid "User" +msgstr "Uzanto" + +msgid "Action" +msgstr "Ago" + +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" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Dankon pro pasigo de kvalita tempon kun la retejo hodiaŭ." + +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 iri antaŭen kaj 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, bonvolu certiĝi, 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/eo/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/eo/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..9b6aa8f Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/eo/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/eo/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/eo/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..f101319 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/eo/LC_MESSAGES/djangojs.po @@ -0,0 +1,220 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Baptiste Darthenay , 2012 +# Baptiste Darthenay , 2014-2016 +# Jaffa McNeill , 2011 +# Adamo Mesha , 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: Baptiste Darthenay \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 "Disponebla %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 forigi kelkajn elektante " +"ilin en la suba skatolo kaj tiam klakante la \"Elekti\" sagon inter la du " +"skatoloj." + +#, javascript-format +msgid "Type into this box to filter down the list of available %s." +msgstr "Entipu en ĉi-tiu skatolo por filtri la liston de haveblaj %s." + +msgid "Filter" +msgstr "Filtru" + +msgid "Choose all" +msgstr "Elekti ĉiuj" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "Klaku por tuj elekti ĉiuj %s." + +msgid "Choose" +msgstr "Elekti" + +msgid "Remove" +msgstr "Forigu" + +#, javascript-format +msgid "Chosen %s" +msgstr "Elektita %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 forigi kelkajn elektante " +"ilin en la suba skatolo kaj tiam klakante la \"Forigi\" sagon inter la du " +"skatoloj." + +msgid "Remove all" +msgstr "Forigu ĉiujn" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "Klaku por tuj forigi ĉiujn %s 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 de %(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 "" +"Vi elektas agon, sed vi ne ŝirmis viajn ŝanĝojn al individuaj kampoj ĝis " +"nun. Bonvolu klaku BONA por ŝirmi. Vi devos ripeton la agon" + +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 "" +"Vi elektas agon, kaj vi ne faris ajnajn ŝanĝojn ĉe unuopaj kampoj. Vi " +"verŝajne serĉas la Iru-butonon prefere ol la Ŝirmu-butono." + +msgid "Now" +msgstr "Nun" + +msgid "Midnight" +msgstr "Noktomezo" + +msgid "6 a.m." +msgstr "6 a.t.m." + +msgid "Noon" +msgstr "Tagmezo" + +msgid "6 p.m." +msgstr "6 ptm" + +#, 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 horo antaŭ la servila horo." +msgstr[1] "Noto: Vi estas %s horoj antaŭ 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 horo post la servila horo." +msgstr[1] "Noto: Vi estas %s horoj post la servila horo." + +msgid "Choose a Time" +msgstr "Elektu horon" + +msgid "Choose a time" +msgstr "Elektu tempon" + +msgid "Cancel" +msgstr "Malmendu" + +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 "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 "Show" +msgstr "Montru" + +msgid "Hide" +msgstr "Kaŝu" diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es/LC_MESSAGES/django.mo new file mode 100644 index 0000000..3e5dbb4 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es/LC_MESSAGES/django.po new file mode 100644 index 0000000..2931189 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es/LC_MESSAGES/django.po @@ -0,0 +1,745 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# abraham.martin , 2014 +# Antoni Aloy , 2011-2014 +# Claude Paroz , 2014 +# Ernesto Avilés, 2015-2016 +# 8cb2d5a716c3c9a99b6d20472609a4d5_6d03802 , 2011 +# guillem , 2012 +# Ignacio José Lizarán Rus , 2019 +# Igor Támara , 2013 +# Jannis Leidel , 2011 +# Jorge Puente Sarrín , 2014-2015 +# José Luis , 2016 +# Josue Naaman Nistal Guerra , 2014 +# Luigy, 2019 +# Marc Garcia , 2011 +# Miguel Angel Tribaldos , 2017 +# Pablo, 2015 +# Uriel Medina , 2020 +# Veronicabh , 2015 +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-25 17:35+0000\n" +"Last-Translator: Uriel Medina \n" +"Language-Team: Spanish (http://www.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 "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 "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." + +#, 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 added successfully. You may edit it again below." +msgstr "" +"El {name} “{obj}” se agregó 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." + +#, 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 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" + +#, 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 "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 "" +"Introduzca una nueva contraseña para el usuario %(username)s." + +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 "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 "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 "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 "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 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" + +#, 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" + +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 "" +"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 "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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..d732ed0 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..bdfacec --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es/LC_MESSAGES/djangojs.po @@ -0,0 +1,273 @@ +# 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-2021 +# Veronicabh , 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-02-11 05:37+0000\n" +"Last-Translator: Uriel Medina \n" +"Language-Team: Spanish (http://www.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." + +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 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." + +#, 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 "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" + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es_AR/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es_AR/LC_MESSAGES/django.mo new file mode 100644 index 0000000..862aaa6 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es_AR/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es_AR/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es_AR/LC_MESSAGES/django.po new file mode 100644 index 0000000..189f5b5 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es_AR/LC_MESSAGES/django.po @@ -0,0 +1,730 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Leonardo José Guzmán , 2013 +# Ramiro Morales, 2013-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-03-21 12:55+0000\n" +"Last-Translator: Ramiro Morales\n" +"Language-Team: Spanish (Argentina) (http://www.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 "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/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." + +#, 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 added successfully. You may edit it again below." +msgstr "Se agregó con éxito {name} \"{obj}”. Puede modificarlo/a 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." + +#, 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 "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" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Modelos en la aplicación %(name)s" + +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 "" +"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á " +"configurar opciones adicionales para el usuario." + +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 "Por favor, corrija el error detallado mas abajo." + +msgid "Please correct the errors below." +msgstr "Por favor corrija los errores detallados abajo." + +#, 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/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 "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 "(des)activar ordenamiento" + +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 "" +"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" + +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/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 "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 password or username?" +msgstr "¿Olvidó su contraseña o nombre de usuario?" + +msgid "Toggle navigation" +msgstr "(des)activar ordenamiento" + +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 historia de modificaciones. Probablemente no fue " +"añadido usando este sitio de administración." + +msgid "Show all" +msgstr "Mostrar todos/as" + +msgid "Save" +msgstr "Guardar" + +msgid "Popup closing…" +msgstr "Cerrando ventana amergente…" + +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 "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" + +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 "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 "" +"¿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 "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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es_AR/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es_AR/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..abd7d36 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es_AR/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es_AR/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es_AR/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..782aa17 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es_AR/LC_MESSAGES/djangojs.po @@ -0,0 +1,276 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Ramiro Morales, 2014-2016,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-03-21 12:54+0000\n" +"Last-Translator: Ramiro Morales\n" +"Language-Team: Spanish (Argentina) (http://www.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 "" +"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/as seleccionándolos/" +"as en el cuadro de abajo y luego haciendo click en la flecha \"Seleccionar\" " +"ubicada entre las dos listas." + +#, 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" + +msgid "Choose all" +msgstr "Seleccionar todos/as" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "Haga click para seleccionar todos/as los/as %s." + +msgid "Choose" +msgstr "Seleccionar" + +msgid "Remove" +msgstr "Eliminar" + +#, javascript-format +msgid "Chosen %s" +msgstr "%s seleccionados/as" + +#, 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 %s seleccionados. Puede deseleccionar algunos de ellos " +"activándolos en la lista de abajo y luego haciendo click en la flecha " +"\"Eliminar\" ubicada entre las dos listas." + +msgid "Remove all" +msgstr "Eliminar todos/as" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "Haga clic para deselecionar todos/as los/as %s." + +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 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." + +#, 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." + +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" + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es_CO/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es_CO/LC_MESSAGES/django.mo new file mode 100644 index 0000000..f806074 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es_CO/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es_CO/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es_CO/LC_MESSAGES/django.po new file mode 100644 index 0000000..5831fbf --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es_CO/LC_MESSAGES/django.po @@ -0,0 +1,697 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es_CO/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es_CO/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..3d428a0 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es_CO/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es_CO/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es_CO/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..4bcc1cc --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es_CO/LC_MESSAGES/djangojs.po @@ -0,0 +1,223 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es_MX/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es_MX/LC_MESSAGES/django.mo new file mode 100644 index 0000000..f141d32 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es_MX/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es_MX/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es_MX/LC_MESSAGES/django.po new file mode 100644 index 0000000..fd4d403 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es_MX/LC_MESSAGES/django.po @@ -0,0 +1,702 @@ +# 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 +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: 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 "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?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Eliminar %(verbose_name_plural)s seleccionados/as" + +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 "" + +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 "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 "" + +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 "" + +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 "" + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es_MX/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es_MX/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..fbd765a Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es_MX/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es_MX/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es_MX/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..76af2f3 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es_MX/LC_MESSAGES/djangojs.po @@ -0,0 +1,219 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es_VE/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es_VE/LC_MESSAGES/django.mo new file mode 100644 index 0000000..ab04e3f Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es_VE/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es_VE/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es_VE/LC_MESSAGES/django.po new file mode 100644 index 0000000..c9e1509 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es_VE/LC_MESSAGES/django.po @@ -0,0 +1,698 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es_VE/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es_VE/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..6cc0519 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es_VE/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es_VE/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es_VE/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..1ab4dcd --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/es_VE/LC_MESSAGES/djangojs.po @@ -0,0 +1,222 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/et/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/et/LC_MESSAGES/django.mo new file mode 100644 index 0000000..dbfc3b8 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/et/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/et/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/et/LC_MESSAGES/django.po new file mode 100644 index 0000000..18a4e18 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/et/LC_MESSAGES/django.po @@ -0,0 +1,720 @@ +# 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 Pajuste , 2015 +# Martin Pajuste , 2016,2019-2020 +# Marti Raudsepp , 2016 +# Ragnar Rebase , 2019 +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-03 15:38+0000\n" +"Last-Translator: Erlend Eelmets \n" +"Language-Team: Estonian (http://www.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 "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 "Are you sure?" +msgstr "Kas olete kindel?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Kustuta valitud %(verbose_name_plural)s" + +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 "Mitte tühi" + +#, 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." + +#, 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 added successfully. You may edit it again below." +msgstr "{name} “{obj}” lisamine õ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" + +#, 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" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Rakenduse %(name)s moodulid" + +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 "" +"First, enter a username and password. Then, you’ll be able to edit more user " +"options." +msgstr "" +"Kõigepealt sisestage kasutajatunnus ja salasõna. Seejärel saate muuta " +"täiendavaid kasutajaandmeid." + +msgid "Enter a username and password." +msgstr "Sisestage kasutajanimi ja salasõna." + +msgid "Change password" +msgstr "Muuda salasõna" + +msgid "Please correct the error below." +msgstr "Palun parandage allolev viga." + +msgid "Please correct the errors below." +msgstr "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 "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 "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 "Delete" +msgstr "Kustuta" + +#, 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" + +msgid "Delete multiple objects" +msgstr "Kustuta mitu 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 "" +"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 "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 password or username?" +msgstr "Unustasite oma parooli või kasutajanime?" + +msgid "Toggle navigation" +msgstr "Lülita navigeerimine sisse" + +msgid "Date/time" +msgstr "Kuupäev/kellaaeg" + +msgid "User" +msgstr "Kasutaja" + +msgid "Action" +msgstr "Toiming" + +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" + +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 "Your username, in case you’ve forgotten:" +msgstr "Teie kasutajatunnus juhuks, kui olete unustanud:" + +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 "Reseti parool" + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/et/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/et/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..d14d676 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/et/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/et/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/et/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..0c06004 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/et/LC_MESSAGES/djangojs.po @@ -0,0 +1,270 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# eallik , 2011 +# Jannis Leidel , 2011 +# Janno Liivak , 2013-2015 +# Martin , 2021 +# Martin , 2016,2020 +# Ragnar Rebase , 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-03-22 11:55+0000\n" +"Last-Translator: Martin \n" +"Language-Team: Estonian (http://www.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 "" +"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 "" +"Nimekiri välja \"%s\" võimalikest väärtustest. Saad valida ühe või mitu " +"kirjet allolevast kastist ning vajutades noolt \"Vali\" liigutada neid ühest " +"kastist teise." + +#, 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" + +msgid "Choose all" +msgstr "Vali kõik" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "Kliki, et valida kõik %s korraga." + +msgid "Choose" +msgstr "Vali" + +msgid "Remove" +msgstr "Eemalda" + +#, javascript-format +msgid "Chosen %s" +msgstr "Valitud %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 "" +"Nimekiri välja \"%s\" valitud väärtustest. Saad valida ühe või mitu kirjet " +"allolevast kastist ning vajutades noolt \"Eemalda\" liigutada neid ühest " +"kastist teise." + +msgid "Remove all" +msgstr "Eemalda kõik" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "Kliki, et eemaldada kõik valitud %s korraga." + +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" + +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" + +msgid "Show" +msgstr "Näita" + +msgid "Hide" +msgstr "Varja" diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/eu/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/eu/LC_MESSAGES/django.mo new file mode 100644 index 0000000..7274559 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/eu/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/eu/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/eu/LC_MESSAGES/django.po new file mode 100644 index 0000000..5853594 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/eu/LC_MESSAGES/django.po @@ -0,0 +1,709 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Aitzol Naberan , 2013,2016 +# Eneko Illarramendi , 2017-2019 +# 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: 2021-01-15 09:00+0100\n" +"PO-Revision-Date: 2021-03-22 12:29+0000\n" +"Last-Translator: Yoaira García \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 "" + +#, python-format +msgid "Changed “%(object)s” — %(changes)s" +msgstr "" + +#, python-format +msgid "Deleted “%(object)s.”" +msgstr "" + +msgid "LogEntry Object" +msgstr "LogEntry objetua" + +#, python-brace-format +msgid "Added {name} “{object}”." +msgstr "" + +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 "" + +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 "" + +#, 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 "" + +#, 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 "" +"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 "" + +#, python-format +msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" +msgstr "" + +#, 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 "Date/time" +msgstr "Data/ordua" + +msgid "User" +msgstr "Erabiltzailea" + +msgid "Action" +msgstr "Ekintza" + +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" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Eskerrik asko webguneari zure probetxuzko denbora eskaintzeagatik." + +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 "" + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/eu/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/eu/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..6b9adaa Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/eu/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/eu/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/eu/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..40d86fa --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/eu/LC_MESSAGES/djangojs.po @@ -0,0 +1,218 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Aitzol Naberan , 2011 +# Eneko Illarramendi , 2017 +# Jannis Leidel , 2011 +# julen , 2012-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-23 18:54+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 "" +"Ekintza bat hautatu duzu, baina oraindik ez duzu eremuetako aldaketak gorde. " +"Mesedez, sakatu OK gordetzeko. Ekintza berriro exekutatu beharko duzu." + +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 "" +"Ekintza bat hautatu duzu, baina ez duzu inongo aldaketarik egin eremuetan. " +"Litekeena da, Gorde botoia beharrean Aurrera botoiaren bila aritzea." + +#, 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 "Now" +msgstr "Orain" + +msgid "Choose a Time" +msgstr "Aukeratu ordu bat" + +msgid "Choose a time" +msgstr "Aukeratu ordu bat" + +msgid "Midnight" +msgstr "Gauerdia" + +msgid "6 a.m." +msgstr "6 a.m." + +msgid "Noon" +msgstr "Eguerdia" + +msgid "6 p.m." +msgstr "6 p.m." + +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 "one letter Sunday" +msgid "S" +msgstr "I" + +msgctxt "one letter Monday" +msgid "M" +msgstr "A" + +msgctxt "one letter Tuesday" +msgid "T" +msgstr "A" + +msgctxt "one letter Wednesday" +msgid "W" +msgstr "A" + +msgctxt "one letter Thursday" +msgid "T" +msgstr "O" + +msgctxt "one letter Friday" +msgid "F" +msgstr "O" + +msgctxt "one letter Saturday" +msgid "S" +msgstr "L" + +msgid "Show" +msgstr "Erakutsi" + +msgid "Hide" +msgstr "Izkutatu" diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/fa/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/fa/LC_MESSAGES/django.mo new file mode 100644 index 0000000..7ebef69 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/fa/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/fa/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/fa/LC_MESSAGES/django.po new file mode 100644 index 0000000..70431e4 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/fa/LC_MESSAGES/django.po @@ -0,0 +1,730 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Ahmad Hosseini , 2020 +# Ali Nikneshan , 2015,2020 +# Ali Vakilzade , 2015 +# Amir Ajorloo , 2020 +# Arash Fazeli , 2012 +# Jannis Leidel , 2011 +# MJafar Mashhadi , 2018 +# Mohammad Hossein Mojtahedi , 2017,2019 +# Pouya Abbassi, 2016 +# rahim agh , 2021 +# Reza Mohammadi , 2013-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-04-03 06:12+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" + +#, 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، را پایین نگه " +"دارید." + +#, 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 "لغو انتخاب‌ها" + +#, 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 "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 "تغییر دادن %(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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/fa/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/fa/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..2add5c7 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/fa/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/fa/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/fa/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..f082b60 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/fa/LC_MESSAGES/djangojs.po @@ -0,0 +1,271 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/fi/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/fi/LC_MESSAGES/django.mo new file mode 100644 index 0000000..b9134b2 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/fi/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/fi/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/fi/LC_MESSAGES/django.po new file mode 100644 index 0000000..6417007 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/fi/LC_MESSAGES/django.po @@ -0,0 +1,717 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Aarni Koskela, 2015,2017,2020 +# Antti Kaihola , 2011 +# Jannis Leidel , 2011 +# Klaus Dahlén , 2012 +# Nikolay Korotkiy , 2018 +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: 2020-12-09 06:47+0000\n" +"Last-Translator: Aarni Koskela\n" +"Language-Team: Finnish (http://www.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 "Are you sure?" +msgstr "Oletko varma?" + +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." + +#, 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 added successfully. You may edit it again below." +msgstr "{name} \"{obj}\" on lisätty. 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" + +#, 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" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "%(name)s -applikaation mallit" + +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 "" +"First, enter a username and password. Then, you’ll be able to edit more user " +"options." +msgstr "" +"Syötä ensin käyttäjätunnus ja salasana. Sen jälkeen voit muokata muita " +"käyttäjän tietoja." + +msgid "Enter a username and password." +msgstr "Syötä käyttäjätunnus ja salasana." + +msgid "Change password" +msgstr "Vaihda salasana" + +msgid "Please correct the error below." +msgstr "Korjaa allaoleva virhe." + +msgid "Please correct the errors below." +msgstr "Korjaa allaolevat 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 "Welcome," +msgstr "Tervetuloa," + +msgid "View site" +msgstr "Näytä sivusto" + +msgid "Documentation" +msgstr "Ohjeita" + +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 "Clear all filters" +msgstr "Tyhjennä kaikki suotimet" + +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 "Delete" +msgstr "Poista" + +#, 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" + +msgid "Delete multiple objects" +msgstr "Poista useita kohteita" + +#, 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 "" +"Haluatki 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 "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 password or username?" +msgstr "Unohditko salasanasi tai käyttäjätunnuksesi?" + +msgid "Toggle navigation" +msgstr "Kytke navigaatio" + +msgid "Date/time" +msgstr "Pvm/klo" + +msgid "User" +msgstr "Käyttäjä" + +msgid "Action" +msgstr "Tapahtuma" + +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" + +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 "Your username, in case you’ve forgotten:" +msgstr "Käyttäjätunnuksesi siltä varalta, että olet unohtanut sen:" + +msgid "Thanks for using our site!" +msgstr "Kiitos vierailustasi sivuillamme!" + +#, python-format +msgid "The %(site_name)s team" +msgstr "%(site_name)s -sivuston 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 "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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/fi/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/fi/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..7ff9be7 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/fi/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/fi/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/fi/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..05b1602 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/fi/LC_MESSAGES/djangojs.po @@ -0,0 +1,269 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Aarni Koskela, 2015,2017,2020-2021 +# Antti Kaihola , 2011 +# 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-04-14 12:20+0000\n" +"Last-Translator: Aarni Koskela\n" +"Language-Team: Finnish (http://www.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 "" +"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 "" +"Tämä on lista saatavillaolevista %s. Valitse allaolevasta laatikosta " +"haluamasi ja siirrä ne valittuihin klikkamalla \"Valitse\"-nuolta " +"laatikoiden välillä." + +#, 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" + +msgid "Choose all" +msgstr "Valitse kaikki" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "Klikkaa valitaksesi kaikki %s kerralla." + +msgid "Choose" +msgstr "Valitse" + +msgid "Remove" +msgstr "Poista" + +#, javascript-format +msgid "Chosen %s" +msgstr "Valitut %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 "" +"Tämä on lista valituista %s. Voit poistaa valintoja valitsemalla ne " +"allaolevasta laatikosta ja siirtämällä ne takaisin valitsemattomiin " +"klikkamalla \"Poista\"-nuolta laatikoiden välillä." + +msgid "Remove all" +msgstr "Poista kaikki" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "Klikkaa poistaaksesi kaikki valitut %s kerralla." + +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" + +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" + +msgid "Show" +msgstr "Näytä" + +msgid "Hide" +msgstr "Piilota" diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/fr/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/fr/LC_MESSAGES/django.mo new file mode 100644 index 0000000..e24a337 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/fr/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/fr/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/fr/LC_MESSAGES/django.po new file mode 100644 index 0000000..86d0b2b --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/fr/LC_MESSAGES/django.po @@ -0,0 +1,738 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Bruno Brouard , 2021 +# Claude Paroz , 2013-2020 +# Claude Paroz , 2011,2013 +# 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-03-04 20:53+0000\n" +"Last-Translator: Bruno Brouard \n" +"Language-Team: French (http://www.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 "Are you sure?" +msgstr "Êtes-vous sûr ?" + +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 "Supprimer" + +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." + +#, 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 added successfully. You may edit it again below." +msgstr "" +"L’objet {name} « {obj} » a été ajouté 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." + +#, 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" + +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "0 sur %(cnt)s sélectionné" + +#, 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" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Modèles de l’application %(name)s" + +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 "" +"First, enter a username and password. Then, you’ll be able to edit more user " +"options." +msgstr "" +"Saisissez tout d’abord un nom d’utilisateur et un mot de passe. Vous pourrez " +"ensuite modifier plus d’options." + +msgid "Enter a username and password." +msgstr "Saisissez un nom d’utilisateur et un mot de passe." + +msgid "Change password" +msgstr "Modifier le mot de passe" + +msgid "Please correct the error below." +msgstr "Corrigez l’erreur ci-dessous." + +msgid "Please correct the errors below." +msgstr "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 "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 "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 "Delete" +msgstr "Supprimer" + +#, 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" + +msgid "Delete multiple objects" +msgstr "Supprimer plusieurs objets" + +#, 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 "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 password or username?" +msgstr "Mot de passe ou nom d’utilisateur oublié ?" + +msgid "Toggle navigation" +msgstr "Basculer la navigation" + +msgid "Date/time" +msgstr "Date/heure" + +msgid "User" +msgstr "Utilisateur" + +msgid "Action" +msgstr "Action" + +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" + +#, 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é" + +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 "Your username, in case you’ve forgotten:" +msgstr "Votre nom d’utilisateur, en cas d’oubli :" + +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 "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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/fr/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/fr/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..2e4d5c3 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/fr/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/fr/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/fr/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..87491ce --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/fr/LC_MESSAGES/djangojs.po @@ -0,0 +1,268 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Claude Paroz , 2014-2017,2020-2021 +# Claude Paroz , 2011-2012 +# 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 14:34+0000\n" +"Last-Translator: Claude Paroz \n" +"Language-Team: French (http://www.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 "" +"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 "" +"Ceci est une liste des « %s » disponibles. Vous pouvez en choisir en les " +"sélectionnant dans la zone ci-dessous, puis en cliquant sur la flèche " +"« Choisir » entre les deux zones." + +#, 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" + +msgid "Choose all" +msgstr "Tout choisir" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "Cliquez pour choisir tous les « %s » en une seule opération." + +msgid "Choose" +msgstr "Choisir" + +msgid "Remove" +msgstr "Enlever" + +#, javascript-format +msgid "Chosen %s" +msgstr "Choix des « %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 "" +"Ceci est la liste des « %s » choisi(e)s. Vous pouvez en enlever en les " +"sélectionnant dans la zone ci-dessous, puis en cliquant sur la flèche « " +"Enlever » entre les deux zones." + +msgid "Remove all" +msgstr "Tout enlever" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "Cliquez pour enlever tous les « %s » en une seule opération." + +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" + +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." + +#, 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." + +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" + +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 "Afficher" + +msgid "Hide" +msgstr "Masquer" diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/fy/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/fy/LC_MESSAGES/django.mo new file mode 100644 index 0000000..cdea1d8 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/fy/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/fy/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/fy/LC_MESSAGES/django.po new file mode 100644 index 0000000..52310d3 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/fy/LC_MESSAGES/django.po @@ -0,0 +1,609 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/fy/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/fy/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..489bbab Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/fy/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/fy/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/fy/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..ba09bad --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/fy/LC_MESSAGES/djangojs.po @@ -0,0 +1,145 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ga/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ga/LC_MESSAGES/django.mo new file mode 100644 index 0000000..8c029af Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ga/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ga/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ga/LC_MESSAGES/django.po new file mode 100644 index 0000000..252e50d --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ga/LC_MESSAGES/django.po @@ -0,0 +1,715 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# 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: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-06-22 21:17+0000\n" +"Last-Translator: Luke Blaney \n" +"Language-Team: Irish (http://www.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 "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?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Scrios %(verbose_name_plural) roghnaithe" + +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" + +#, 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 "" + +msgid "Change" +msgstr "Athraigh" + +msgid "Deletion" +msgstr "Scriosadh" + +msgid "action time" +msgstr "am aicsean" + +msgid "user" +msgstr "úsáideoir" + +msgid "content type" +msgstr "" + +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 "\"%(object)s\" curtha isteach." + +#, python-format +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "\"%(object)s\" - %(changes)s aithrithe" + +#, python-format +msgid "Deleted \"%(object)s.\"" +msgstr "\"%(object)s.\" scrioste" + +msgid "LogEntry Object" +msgstr "Oibiacht LogEntry" + +#, python-brace-format +msgid "Added {name} \"{object}\"." +msgstr "{name} curtha leis \"{object}\"." + +msgid "Added." +msgstr "Curtha leis." + +msgid "and" +msgstr "agus" + +#, python-brace-format +msgid "Changed {fields} for {name} \"{object}\"." +msgstr "{fields} athrithe don {name} \"{object}\"." + +#, python-brace-format +msgid "Changed {fields}." +msgstr "{fields} athrithe." + +#, python-brace-format +msgid "Deleted {name} \"{object}\"." +msgstr "{name} scrioste: \"{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 \"Control\", nó \"Command\" ar Mac chun níos mó ná ceann " +"amháin a roghnú." + +#, python-brace-format +msgid "The {name} \"{obj}\" was added successfully." +msgstr "Bhí {name} \"{obj}\" curtha 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 "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may edit it again below." +msgstr "" +"D'athraigh {name} \"{obj}\" go rathúil.\n" +"Thig leat é a athrú arís faoi seo." + +#, 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 "" +"D'athraigh {name} \"{obj}\" go rathúil.\n" +"Thig leat {name} eile a chuir leis." + +#, python-brace-format +msgid "The {name} \"{obj}\" was changed successfully." +msgstr "D'athraigh {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 "Bhí %(name)s \"%(obj)s\" scrioste go rathúil." + +#, python-format +msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgstr "Níl%(name)s ann le aitheantais \"%(key)s\". 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 "Tá brón orainn, ach ní bhfuarthas an leathanach iarraite." + +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 don riarthóirí suíomh tríd an ríomhphost agus " +"ba chóir 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 "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "" +"Ar dtús, iontráil ainm úsaideoir agus focal faire. Ansin, beidh tú in ann " +"cuir in eagar níos mó roghaí úsaideoira." + +msgid "Enter a username and password." +msgstr "Cuir isteach ainm úsáideora agus focal faire." + +msgid "Change password" +msgstr "Athraigh focal faire" + +msgid "Please correct the error below." +msgstr "Ceartaigh an botún thíos le do thoil." + +msgid "Please correct the errors below." +msgstr "Le do thoil cheartú earráidí thíos." + +#, 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 "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 "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 "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 "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 "View" +msgstr "Amharc ar" + +msgid "Delete?" +msgstr "Cealaigh?" + +#, python-format +msgid " By %(filter_title)s " +msgstr " Trí %(filter_title)s " + +msgid "Summary" +msgstr "Achoimre" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Samhlacha ins an %(name)s iarratais" + +msgid "Add" +msgstr "Cuir le" + +msgid "You don't have permission to view or edit anything." +msgstr "" + +msgid "Recent actions" +msgstr "" + +msgid "My actions" +msgstr "" + +msgid "None available" +msgstr "Dada ar fáil" + +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 mícheart le suitéail do bunachar sonraí. Déan cinnte go bhfuil " +"boird an bunachar sonraI cruthaithe cheana, agus déan cinnte go bhfuil do " +"úsaideoir in ann an bunacchar sonraí a léamh." + +#, 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 "Dearmad déanta ar do focal faire nó ainm úsaideora" + +msgid "Date/time" +msgstr "Dáta/am" + +msgid "User" +msgstr "Úsaideoir" + +msgid "Action" +msgstr "Aicsean" + +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "" +"Níl stáir aitraithe ag an oibiacht seo agús is dócha ná cuir le tríd an an " +"suíomh riarachán." + +msgid "Show all" +msgstr "Taispéan gach rud" + +msgid "Save" +msgstr "Sábháil" + +msgid "Popup closing…" +msgstr "" + +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" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Go raibh maith agat le hadhaigh do cuairt ar an suíomh idirlínn inniú." + +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 "" +"Le do thoil, iontráil do sean-focal faire, ar son slándáil, agus ansin " +"iontráil do focal faire dhá uaire cé go mbeimid in ann a seiceal go bhfuil " +"sé scríobhte isteach 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 "" + +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 "" +"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 "Do ainm úsaideoir, má tá dearmad déanta agat." + +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 "" + +msgid "Email address:" +msgstr "Seoladh ríomhphoist:" + +msgid "Reset my password" +msgstr "Athsocraigh mo focal faire" + +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 "" + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ga/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ga/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..ee000e2 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ga/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ga/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ga/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..ce0a412 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ga/LC_MESSAGES/djangojs.po @@ -0,0 +1,234 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# 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: 2018-05-17 11:50+0200\n" +"PO-Revision-Date: 2019-06-22 21:36+0000\n" +"Last-Translator: Luke Blaney \n" +"Language-Team: Irish (http://www.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í." + +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." + +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íl do aithrithe sabhailte ar cuid de na " +"réímse. Clic OK chun iad a sábháil. Caithfidh tú an gníomh 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, ach níl do aithrithe sabhailte ar cuid de na " +"réímse. Is dócha go bhfuil tú ag iarraidh an cnaipe Té ná 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 "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" + +msgid "Show" +msgstr "Taispeán" + +msgid "Hide" +msgstr "Folaigh" diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/gd/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/gd/LC_MESSAGES/django.mo new file mode 100644 index 0000000..d1e1690 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/gd/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/gd/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/gd/LC_MESSAGES/django.po new file mode 100644 index 0000000..28cc9e9 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/gd/LC_MESSAGES/django.po @@ -0,0 +1,748 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# GunChleoc, 2015-2017 +# 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: 2020-12-16 08:31+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 "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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/gd/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/gd/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..db338a4 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/gd/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/gd/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/gd/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..17b7a76 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/gd/LC_MESSAGES/djangojs.po @@ -0,0 +1,286 @@ +# 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-01-15 11:28+0000\n" +"Last-Translator: Transifex Bot <>\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 "" + +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 "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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/gl/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/gl/LC_MESSAGES/django.mo new file mode 100644 index 0000000..7cf4d84 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/gl/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/gl/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/gl/LC_MESSAGES/django.po new file mode 100644 index 0000000..47f1115 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/gl/LC_MESSAGES/django.po @@ -0,0 +1,679 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# fasouto , 2011-2012 +# fonso , 2011,2013 +# fasouto , 2017 +# Jannis Leidel , 2011 +# Leandro Regueiro , 2013 +# Oscar Carballal , 2011-2012 +# Pablo, 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-23 18:54+0000\n" +"Last-Translator: fasouto \n" +"Language-Team: Galician (http://www.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 "Successfully deleted %(count)d %(items)s." +msgstr "Borrado exitosamente %(count)d %(items)s" + +#, python-format +msgid "Cannot delete %(name)s" +msgstr "Non foi posíbel eliminar %(name)s" + +msgid "Are you sure?" +msgstr "¿Está seguro?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Borrar %(verbose_name_plural)s seleccionados." + +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" + +#, 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 "action time" +msgstr "hora da acción" + +msgid "user" +msgstr "usuario" + +msgid "content type" +msgstr "" + +msgid "object id" +msgstr "id do obxecto" + +#. Translators: 'repr' means representation +#. (https://docs.python.org/3/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 "Modificados \"%(object)s\" - %(changes)s" + +#, python-format +msgid "Deleted \"%(object)s.\"" +msgstr "Borrados \"%(object)s.\"" + +msgid "LogEntry Object" +msgstr "Obxecto LogEntry" + +#, python-brace-format +msgid "Added {name} \"{object}\"." +msgstr "" + +msgid "Added." +msgstr "Engadido" + +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 "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 "" + +#, 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 "" +"Deb 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 o/a %(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 "Engadir %s" + +#, python-format +msgid "Change %s" +msgstr "Modificar %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 "" + +#, 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 "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 "" +"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 "Please correct the error below." +msgstr "Corrixa os erros de embaixo." + +msgid "Please correct the errors below." +msgstr "Por favor, corrixa os erros de embaixo" + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "" +"Insira un novo contrasinal para o usuario %(username)s." + +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 "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 "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 "Si, estou seguro" + +msgid "No, take me back" +msgstr "" + +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 "Change" +msgstr "Modificar" + +msgid "Delete?" +msgstr "¿Eliminar?" + +#, python-format +msgid " By %(filter_title)s " +msgstr " Por %(filter_title)s " + +msgid "Summary" +msgstr "" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Modelos na aplicación %(name)s" + +msgid "Add" +msgstr "Engadir" + +msgid "You don't have permission to edit anything." +msgstr "Non ten permiso para editar nada." + +msgid "Recent actions" +msgstr "Accións recentes" + +msgid "My actions" +msgstr "As miñas accións" + +msgid "None available" +msgstr "Ningunha dispoñíbel" + +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 "" + +msgid "Forgotten your password or username?" +msgstr "¿Olvidou o usuario ou contrasinal?" + +msgid "Date/time" +msgstr "Data/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 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 "" + +#, python-format +msgid "Change selected %(model)s" +msgstr "" + +#, python-format +msgid "Add another %(model)s" +msgstr "Engadir outro %(model)s" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "" + +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 "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. Despois introduza " +"dúas veces o contrasinal para verificarmos 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 "" + +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 "" +"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 "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" + +msgid "Date:" +msgstr "Data:" + +msgid "Time:" +msgstr "Hora:" + +msgid "Lookup" +msgstr "Procurar" + +msgid "Currently:" +msgstr "Actualmente:" + +msgid "Change:" +msgstr "Modificar:" diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/gl/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/gl/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..fefbe0d Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/gl/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/gl/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/gl/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..2df9fa0 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/gl/LC_MESSAGES/djangojs.po @@ -0,0 +1,221 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# fasouto , 2011 +# fonso , 2011,2013 +# Jannis Leidel , 2011 +# Leandro Regueiro , 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-23 18:54+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Galician (http://www.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." + +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." + +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. Probabelmente estea buscando o botón Ir no canto do botón " +"Gardar." + +#, 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 "Escolla unha hora" + +msgid "Midnight" +msgstr "Medianoite" + +msgid "6 a.m." +msgstr "6 da mañá" + +msgid "Noon" +msgstr "Mediodía" + +msgid "6 p.m." +msgstr "" + +msgid "Cancel" +msgstr "Cancelar" + +msgid "Today" +msgstr "Hoxe" + +msgid "Choose a Date" +msgstr "" + +msgid "Yesterday" +msgstr "Onte" + +msgid "Tomorrow" +msgstr "Mañá" + +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 "Esconder" diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/he/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/he/LC_MESSAGES/django.mo new file mode 100644 index 0000000..49935c8 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/he/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/he/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/he/LC_MESSAGES/django.po new file mode 100644 index 0000000..f7f8889 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/he/LC_MESSAGES/django.po @@ -0,0 +1,710 @@ +# 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 +# Yaron Shahrabani , 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: 2020-11-12 12:52+0000\n" +"Last-Translator: Yaron Shahrabani \n" +"Language-Team: Hebrew (http://www.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 "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 "" + +#, 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 "יש להחזיק \"Control\" או \"Command\" במק, כדי לבחור יותר מאחד." + +#, 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 בוצע בהצלחה." +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 "ניהול אתר 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 "איפוס בחירה" + +#, 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 "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 תוצאות" +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 הנבחר." + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/he/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/he/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..56ec238 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/he/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/he/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/he/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..3d94448 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/he/LC_MESSAGES/djangojs.po @@ -0,0 +1,223 @@ +# 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 +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-08-01 18:00+0000\n" +"Last-Translator: Meir Kriheli \n" +"Language-Team: Hebrew (http://www.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 אשר נבחרו. ניתן להסיר חלק ע\"י בחירה בתיבה מתחת ולחיצה על חץ " +"\"הסרה\" בין שתי התיבות." + +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 נבחרות" +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 "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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hi/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hi/LC_MESSAGES/django.mo new file mode 100644 index 0000000..b8c97bb Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hi/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hi/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hi/LC_MESSAGES/django.po new file mode 100644 index 0000000..8ed2fb9 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hi/LC_MESSAGES/django.po @@ -0,0 +1,666 @@ +# 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 +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: 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 "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 "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. 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 "ज्याँगो साइट प्रशासन" + +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 "श्रेणीकरण प्राथमिकता : %(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 "" +"कूटशब्द भूल गए? नीचे अपना डाक पता भरें, वहाँ पर हम आपको नया कूटशब्द रखने के निर्देश भेजेंगे।" + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hi/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hi/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..bb755ad Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hi/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hi/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hi/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..78b49e7 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hi/LC_MESSAGES/djangojs.po @@ -0,0 +1,217 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hr/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hr/LC_MESSAGES/django.mo new file mode 100644 index 0000000..eb87cd1 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hr/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hr/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hr/LC_MESSAGES/django.po new file mode 100644 index 0000000..b919286 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hr/LC_MESSAGES/django.po @@ -0,0 +1,716 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hr/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hr/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..e8231f6 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hr/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hr/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hr/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..0878d8a --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hr/LC_MESSAGES/djangojs.po @@ -0,0 +1,223 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hsb/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hsb/LC_MESSAGES/django.mo new file mode 100644 index 0000000..3cb66b6 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hsb/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hsb/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hsb/LC_MESSAGES/django.po new file mode 100644 index 0000000..31c4a76 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hsb/LC_MESSAGES/django.po @@ -0,0 +1,720 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Michael Wolf , 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-21 12:57+0000\n" +"Last-Translator: Michael Wolf \n" +"Language-Team: Upper Sorbian (http://www.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 "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 "Are you sure?" +msgstr "Sće wěsty?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Wubrane %(verbose_name_plural)s 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ł." + +#, 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 added successfully. You may edit it again below." +msgstr "{name} „{obj}“ je so wuspěšnje přidał. 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" + +#, 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ć" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Modele w nałoženju %(name)s" + +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 "" +"First, enter a username and password. Then, you’ll be able to edit more user " +"options." +msgstr "" +"Zapodajće najprjedy wužiwarske mjeno a hesło. Potom móžeće dalše wužiwarske " +"nastajenja wobdźěłować." + +msgid "Enter a username and password." +msgstr "Zapodajće wužiwarske mjeno a hesło." + +msgid "Change password" +msgstr "Hesło změnić" + +msgid "Please correct the error below." +msgstr "Prošu porjedźće slědowacy zmylk." + +msgid "Please correct the errors below." +msgstr "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 "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 "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 "Delete" +msgstr "Zhašeć" + +#, 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" + +msgid "Delete multiple objects" +msgstr "Wjacore objekty zhašeć" + +#, 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 "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 password or username?" +msgstr "Sće swoje hesło abo wužiwarske mjeno zabył?" + +msgid "Toggle navigation" +msgstr "Nawigaciju přepinać" + +msgid "Date/time" +msgstr "Datum/čas" + +msgid "User" +msgstr "Wužiwar" + +msgid "Action" +msgstr "Akcija" + +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ć" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Wulki dźak, zo sće dźensa rjane chwile z websydłom přebywali." + +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 "Your username, in case you’ve forgotten:" +msgstr "Waše wužiwarske mjeno, jeli sće jo zabył:" + +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 "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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hsb/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hsb/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..562a4d4 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hsb/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hsb/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hsb/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..9408a8c --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hsb/LC_MESSAGES/djangojs.po @@ -0,0 +1,274 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Michael Wolf , 2016,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-02-01 21:45+0000\n" +"Last-Translator: Michael Wolf \n" +"Language-Team: Upper Sorbian (http://www.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 "" +"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 lisćina k dispoziciji stejacych %s. Móžeće někotre z nich w slědowacym " +"kašćiku wubrać a potom na šipk „Wubrać“ mjez kašćikomaj kliknyć." + +#, 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ć" + +msgid "Choose all" +msgstr "Wšě wubrać" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "Klikńće, zo byšće wšě %s naraz wubrał." + +msgid "Choose" +msgstr "Wubrać" + +msgid "Remove" +msgstr "Wotstronić" + +#, javascript-format +msgid "Chosen %s" +msgstr "Wubrane %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 lisćina wubranych %s. Móžeće někotre z nich wotstronić, hdyž je w " +"slědowacym kašćiku wuběraće a potom na šipk „Wotstronić“ mjez kašćikomaj " +"kliknjeće." + +msgid "Remove all" +msgstr "Wšě wotstronić" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "Klikńće, zo byšće wšě wubrane %s naraz wotstronił." + +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." + +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" + +msgid "Show" +msgstr "Pokazać" + +msgid "Hide" +msgstr "Schować" diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hu/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hu/LC_MESSAGES/django.mo new file mode 100644 index 0000000..972ab3d Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hu/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hu/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hu/LC_MESSAGES/django.po new file mode 100644 index 0000000..1649564 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hu/LC_MESSAGES/django.po @@ -0,0 +1,731 @@ +# 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 +# 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: 2020-07-14 19:53+0200\n" +"PO-Revision-Date: 2020-07-20 07:29+0000\n" +"Last-Translator: András Veres-Szentkirályi\n" +"Language-Team: Hungarian (http://www.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 "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 "Are you sure?" +msgstr "Biztos benne?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Kiválasztott %(verbose_name_plural)s 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." + +#, 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 added successfully. You may edit it again below." +msgstr "A(z) \"{obj}\" {name} sikeresen hozzáadva. 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" + +#, 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" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "%(name)s alkalmazásban elérhető modellek." + +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 "" +"First, enter a username and password. Then, you’ll be able to edit more user " +"options." +msgstr "" +"Először adjon meg egy felhasználónevet és jelszót. A mentés után a többi " +"felhasználói adat is szerkeszthető lesz." + +msgid "Enter a username and password." +msgstr "Írjon be egy felhasználónevet és jelszót." + +msgid "Change password" +msgstr "Jelszó megváltoztatása" + +msgid "Please correct the error below." +msgstr "Kérem javítsa a hibát alább." + +msgid "Please correct the errors below." +msgstr "Kérem javítsa ki 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 "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 "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 "Delete" +msgstr "Törlé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 "" +"\"%(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" + +msgid "Delete multiple objects" +msgstr "Több elem törlése" + +#, 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 "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 password or username?" +msgstr "Elfelejtette jelszavát vagy felhasználónevét?" + +msgid "Toggle navigation" +msgstr "Navigáció megjelenítése/elrejtése" + +msgid "Date/time" +msgstr "Dátum/idő" + +msgid "User" +msgstr "Felhasználó" + +msgid "Action" +msgstr "Művelet" + +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" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Köszönjük hogy egy kis 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 "Your username, in case you’ve forgotten:" +msgstr "A felhasználóneve, amennyiben nem emlékezne rá:" + +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 "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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hu/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hu/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..2cc3c16 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hu/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hu/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hu/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..1cd0459 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hu/LC_MESSAGES/djangojs.po @@ -0,0 +1,269 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# András Veres-Szentkirályi, 2016,2020-2021 +# Attila Nagy <>, 2012 +# 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: 2021-01-15 09:00+0100\n" +"PO-Revision-Date: 2021-04-01 15:16+0000\n" +"Last-Translator: András Veres-Szentkirályi\n" +"Language-Team: Hungarian (http://www.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." + +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." + +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" + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hy/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hy/LC_MESSAGES/django.mo new file mode 100644 index 0000000..1627b2d Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hy/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hy/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hy/LC_MESSAGES/django.po new file mode 100644 index 0000000..b39e1a7 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hy/LC_MESSAGES/django.po @@ -0,0 +1,708 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hy/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hy/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..b9a8fa2 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hy/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hy/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hy/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..e209f54 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/hy/LC_MESSAGES/djangojs.po @@ -0,0 +1,219 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ia/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ia/LC_MESSAGES/django.mo new file mode 100644 index 0000000..06ddd42 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ia/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ia/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ia/LC_MESSAGES/django.po new file mode 100644 index 0000000..f7986c9 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ia/LC_MESSAGES/django.po @@ -0,0 +1,664 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ia/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ia/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..4c9eccc Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ia/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ia/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ia/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..8285097 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ia/LC_MESSAGES/djangojs.po @@ -0,0 +1,216 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/id/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/id/LC_MESSAGES/django.mo new file mode 100644 index 0000000..7d56210 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/id/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/id/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/id/LC_MESSAGES/django.po new file mode 100644 index 0000000..3fe3a15 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/id/LC_MESSAGES/django.po @@ -0,0 +1,723 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Claude Paroz , 2014 +# Fery Setiawan , 2015-2019 +# Jannis Leidel , 2011 +# M Asep Indrayana , 2015 +# oon arfiandwi , 2016,2020 +# rodin , 2011-2013 +# rodin , 2013-2017 +# sage , 2019 +# Sutrisno Efendi , 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: 2020-12-24 09:53+0000\n" +"Last-Translator: oon arfiandwi \n" +"Language-Team: Indonesian (http://www.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 "Are you sure?" +msgstr "Yakin?" + +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." + +#, 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 added successfully. You may edit it again below." +msgstr "" +"{name} “{obj}” berhasil ditambahkan. 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" + +#, 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" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Model pada 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 memiliki izin untuk melihat atau mengedit apa pun." + +msgid "" +"First, enter a username and password. Then, you’ll be able to edit more user " +"options." +msgstr "" +"Pertama-tama, masukkan nama pengguna dan sandi. Anda akan dapat mengubah " +"opsi pengguna lebih lengkap setelah itu." + +msgid "Enter a username and password." +msgstr "Masukkan nama pengguna dan sandi." + +msgid "Change password" +msgstr "Ganti sandi" + +msgid "Please correct the error below." +msgstr "Mohon perbaiki kesalahan di bawah ini." + +msgid "Please correct the errors below." +msgstr "Perbaiki galat di bawah ini." + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "Masukkan sandi baru untuk pengguna %(username)s." + +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 "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 "Delete" +msgstr "Hapus" + +#, 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" + +msgid "Delete multiple objects" +msgstr "Hapus beberapa objek sekaligus" + +#, 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 "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 password or username?" +msgstr "Lupa nama pengguna atau sandi?" + +msgid "Toggle navigation" +msgstr "Alihkan navigasi" + +msgid "Date/time" +msgstr "Tanggal/waktu" + +msgid "User" +msgstr "Pengguna" + +msgid "Action" +msgstr "Aksi" + +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" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Terima kasih telah menggunakan situs ini 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 "Your username, in case you’ve forgotten:" +msgstr "Nama pengguna Anda, jika lupa:" + +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 "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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/id/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/id/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..9aa68a7 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/id/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/id/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/id/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..125897b --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/id/LC_MESSAGES/djangojs.po @@ -0,0 +1,267 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Fery Setiawan , 2015-2016 +# Jannis Leidel , 2011 +# oon arfiandwi , 2020 +# rodin , 2011-2012 +# rodin , 2014,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-01-15 11:28+0000\n" +"Last-Translator: Transifex Bot <>\n" +"Language-Team: Indonesian (http://www.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 "" +"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 "" +"Berikut adalah daftar %s yang tersedia. Anda dapat memilih satu atau lebih " +"dengan memilihnya pada kotak di bawah, lalu mengeklik tanda panah \"Pilih\" " +"di antara kedua kotak." + +#, 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" + +msgid "Choose all" +msgstr "Pilih semua" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "Pilih untuk memilih seluruh %s sekaligus." + +msgid "Choose" +msgstr "Pilih" + +msgid "Remove" +msgstr "Hapus" + +#, javascript-format +msgid "Chosen %s" +msgstr "%s terpilih" + +#, 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 "" +"Berikut adalah daftar %s yang terpilih. Anda dapat menghapus satu atau lebih " +"dengan memilihnya pada kotak di bawah, lalu mengeklik tanda panah \"Hapus\" " +"di antara kedua kotak." + +msgid "Remove all" +msgstr "Hapus semua" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "Klik untuk menghapus semua pilihan %s sekaligus." + +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 "" + +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 "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" + +msgid "Show" +msgstr "Bentangkan" + +msgid "Hide" +msgstr "Ciutkan" diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/io/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/io/LC_MESSAGES/django.mo new file mode 100644 index 0000000..abe5bb5 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/io/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/io/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/io/LC_MESSAGES/django.po new file mode 100644 index 0000000..ddf09c2 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/io/LC_MESSAGES/django.po @@ -0,0 +1,668 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/io/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/io/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..fba64da Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/io/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/io/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/io/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..d7be82e --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/io/LC_MESSAGES/djangojs.po @@ -0,0 +1,145 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/is/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/is/LC_MESSAGES/django.mo new file mode 100644 index 0000000..5532968 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/is/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/is/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/is/LC_MESSAGES/django.po new file mode 100644 index 0000000..868a452 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/is/LC_MESSAGES/django.po @@ -0,0 +1,720 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/is/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/is/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..5b06183 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/is/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/is/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/is/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..480c550 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/is/LC_MESSAGES/djangojs.po @@ -0,0 +1,219 @@ +# 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 +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-07 22:53+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 "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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/it/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/it/LC_MESSAGES/django.mo new file mode 100644 index 0000000..099be53 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/it/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/it/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/it/LC_MESSAGES/django.po new file mode 100644 index 0000000..98e90bc --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/it/LC_MESSAGES/django.po @@ -0,0 +1,735 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# 0d21a39e384d88c2313b89b5042c04cb, 2017 +# Carlo Miron , 2018-2019 +# Denis Darii , 2011 +# Flavio Curella , 2013 +# Jannis Leidel , 2011 +# Luciano De Falco Alfano, 2016 +# Marco Bonetti, 2014 +# Mirco Grillo , 2018,2020 +# Nicola Larosa , 2013 +# palmux , 2014-2015,2021 +# Mattia Procopio , 2015 +# Stefano Brentegani , 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-01-15 15:53+0000\n" +"Last-Translator: palmux \n" +"Language-Team: Italian (http://www.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." + +#, 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." + +#, 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" + +#, 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" + +#, 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." +msgstr "Per favore, correggi l'errore sottostante" + +msgid "Please correct the errors below." +msgstr "Correggi gli errori qui sotto." + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "" +"Inserisci una nuova password per l'utente %(username)s." + +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 "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 "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 "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 "Date/time" +msgstr "Data/ora" + +msgid "User" +msgstr "Utente" + +msgid "Action" +msgstr "Azione" + +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" + +#, 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" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Grazie per aver speso il tuo tempo prezioso su questo 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 "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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/it/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/it/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..dfa33eb Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/it/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/it/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/it/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..1ebba61 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/it/LC_MESSAGES/djangojs.po @@ -0,0 +1,272 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Denis Darii , 2011 +# Jannis Leidel , 2011 +# Luciano De Falco Alfano, 2016 +# Marco Bonetti, 2014 +# Mirco Grillo , 2020 +# Nicola Larosa , 2011-2012 +# palmux , 2015,2021 +# Stefano Brentegani , 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-01-15 15:58+0000\n" +"Last-Translator: palmux \n" +"Language-Team: Italian (http://www.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 "" +"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 "" +"Questa è la lista dei %s disponibili. Puoi sceglierne alcuni selezionandoli " +"nella casella qui sotto e poi facendo clic sulla freccia \"Scegli\" tra le " +"due caselle." + +#, 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" + +msgid "Choose all" +msgstr "Scegli tutto" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "Fai clic per scegliere tutti i %s in una volta." + +msgid "Choose" +msgstr "Scegli" + +msgid "Remove" +msgstr "Elimina" + +#, javascript-format +msgid "Chosen %s" +msgstr "%s scelti" + +#, 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 "" +"Questa è la lista dei %s scelti. Puoi eliminarne alcuni selezionandoli nella " +"casella qui sotto e poi facendo clic sulla freccia \"Elimina\" tra le due " +"caselle." + +msgid "Remove all" +msgstr "Elimina tutti" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "Fai clic per eliminare tutti i %s in una volta." + +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" + +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." + +#, 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." + +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" + +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" + +msgid "Show" +msgstr "Mostra" + +msgid "Hide" +msgstr "Nascondi" diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ja/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ja/LC_MESSAGES/django.mo new file mode 100644 index 0000000..ceaede5 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ja/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ja/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ja/LC_MESSAGES/django.po new file mode 100644 index 0000000..0775826 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ja/LC_MESSAGES/django.po @@ -0,0 +1,717 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# akiyoko , 2020 +# Claude Paroz , 2016 +# GOTO Hayato , 2019 +# Jannis Leidel , 2011 +# Shinichi Katsumata , 2019 +# Shinya Okano , 2012-2018 +# Takuro Onoue , 2020 +# Takuya N , 2020 +# Tetsuya Morimoto , 2011 +# 上田慶祐 , 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: 2020-12-08 04:30+0000\n" +"Last-Translator: Takuro Onoue \n" +"Language-Team: Japanese (http://www.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 キーを使ってください" + +#, 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 "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 "選択を解除" + +#, 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 "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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ja/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ja/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..3cd4e36 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ja/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ja/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ja/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..65a0872 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ja/LC_MESSAGES/djangojs.po @@ -0,0 +1,262 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Shinya Okano , 2012,2014-2016 +# Takuro Onoue , 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-01-15 11:28+0000\n" +"Last-Translator: Transifex Bot <>\n" +"Language-Team: Japanese (http://www.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つのボックス間の " +"\"削除\"矢印をクリックして一部を削除することができます。" + +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 "" +"操作を選択しましたが、フィールドに未保存の変更があります。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 "" + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ka/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ka/LC_MESSAGES/django.mo new file mode 100644 index 0000000..ed45180 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ka/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ka/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ka/LC_MESSAGES/django.po new file mode 100644 index 0000000..75aee9c --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ka/LC_MESSAGES/django.po @@ -0,0 +1,699 @@ +# 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: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-01-18 00:36+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" + +#, 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/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 "" + +#, 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-დან არცერთი არჩეული არ არის" + +#, 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 "" +"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 "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 "" + +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 "მონიშნული %(model)s-ის შეცვლა" + +#, 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 "" + +msgid "Date:" +msgstr "თარიღი;" + +msgid "Time:" +msgstr "დრო:" + +msgid "Lookup" +msgstr "ძიება" + +msgid "Currently:" +msgstr "ამჟამად:" + +msgid "Change:" +msgstr "შეცვლა:" diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ka/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ka/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..a66299c Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ka/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ka/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ka/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..65ee60f --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ka/LC_MESSAGES/djangojs.po @@ -0,0 +1,218 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/kab/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/kab/LC_MESSAGES/django.mo new file mode 100644 index 0000000..d095721 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/kab/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/kab/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/kab/LC_MESSAGES/django.po new file mode 100644 index 0000000..b3d8958 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/kab/LC_MESSAGES/django.po @@ -0,0 +1,631 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/kab/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/kab/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..755849a Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/kab/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/kab/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/kab/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..57f70c9 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/kab/LC_MESSAGES/djangojs.po @@ -0,0 +1,204 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/kk/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/kk/LC_MESSAGES/django.mo new file mode 100644 index 0000000..abc3c54 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/kk/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/kk/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/kk/LC_MESSAGES/django.po new file mode 100644 index 0000000..6d9625a --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/kk/LC_MESSAGES/django.po @@ -0,0 +1,695 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/kk/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/kk/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..0b65151 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/kk/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/kk/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/kk/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..9c51f35 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/kk/LC_MESSAGES/djangojs.po @@ -0,0 +1,210 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/km/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/km/LC_MESSAGES/django.mo new file mode 100644 index 0000000..a50821c Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/km/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/km/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/km/LC_MESSAGES/django.po new file mode 100644 index 0000000..8b16d1f --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/km/LC_MESSAGES/django.po @@ -0,0 +1,636 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/km/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/km/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..c0b94c1 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/km/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/km/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/km/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..fbe0ae1 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/km/LC_MESSAGES/djangojs.po @@ -0,0 +1,201 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/kn/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/kn/LC_MESSAGES/django.mo new file mode 100644 index 0000000..3740da2 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/kn/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/kn/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/kn/LC_MESSAGES/django.po new file mode 100644 index 0000000..3ae96cf --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/kn/LC_MESSAGES/django.po @@ -0,0 +1,639 @@ +# 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=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 "%(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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/kn/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/kn/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..988728c Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/kn/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/kn/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/kn/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..90363b7 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/kn/LC_MESSAGES/djangojs.po @@ -0,0 +1,205 @@ +# 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=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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ko/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ko/LC_MESSAGES/django.mo new file mode 100644 index 0000000..bbfe573 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ko/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ko/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ko/LC_MESSAGES/django.po new file mode 100644 index 0000000..c968af1 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ko/LC_MESSAGES/django.po @@ -0,0 +1,733 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jiyoon, Ha , 2016 +# DONGHO JEONG , 2020 +# 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 +# Seho Noh , 2018 +# Seacbyul Lee , 2017 +# Taesik Yoon , 2015 +# Yang Chan Woo , 2019 +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-05 05:57+0000\n" +"Last-Translator: DONGHO JEONG \n" +"Language-Team: Korean (http://www.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 "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 "%(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\" 키를 눌러주세요." + +#, 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 "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 "선택 해제" + +#, 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 "" +"당신의 데이터베이스 설치, 설치본에 오류가 있습니다. \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 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개 나옴" + +#, 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 "보기위한 1%s 를(을) 선택" + +msgid "Date:" +msgstr "날짜:" + +msgid "Time:" +msgstr "시각:" + +msgid "Lookup" +msgstr "찾아보기" + +msgid "Currently:" +msgstr "현재:" + +msgid "Change:" +msgstr "변경:" diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ko/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ko/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..9d8de15 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ko/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ko/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ko/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..9bfafc8 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ko/LC_MESSAGES/djangojs.po @@ -0,0 +1,217 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# DaHae Sung , 2016 +# Hoseok Lee , 2016 +# Jaehong Kim , 2011 +# Jannis Leidel , 2011 +# Jay Oh , 2020 +# Le Tartuffe , 2014 +# minsung kang, 2015 +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-04 14:16+0000\n" +"Last-Translator: Jay Oh \n" +"Language-Team: Korean (http://www.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 리스트 입니다. 아래의 상자에서 선택하고 두 상자 사이의 \"제거\" 화" +"살표를 클릭하여 일부를 제거 할 수 있습니다." + +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개 중에 선택됨." + +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 "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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ky/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ky/LC_MESSAGES/django.mo new file mode 100644 index 0000000..35be3e9 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ky/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ky/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ky/LC_MESSAGES/django.po new file mode 100644 index 0000000..c26d68e --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ky/LC_MESSAGES/django.po @@ -0,0 +1,705 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Belek , 2016 +# Chyngyz Monokbaev , 2016 +# Soyuzbek Orozbek uulu , 2020 +# 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: 2020-11-23 00:50+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 "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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ky/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ky/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..037e5fd Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ky/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ky/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ky/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..76ca738 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ky/LC_MESSAGES/djangojs.po @@ -0,0 +1,260 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/lb/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/lb/LC_MESSAGES/django.mo new file mode 100644 index 0000000..f989aed Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/lb/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/lb/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/lb/LC_MESSAGES/django.po new file mode 100644 index 0000000..5e2e794 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/lb/LC_MESSAGES/django.po @@ -0,0 +1,632 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/lb/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/lb/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..5b7937f Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/lb/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/lb/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/lb/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..e1c4a6a --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/lb/LC_MESSAGES/djangojs.po @@ -0,0 +1,145 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/lt/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/lt/LC_MESSAGES/django.mo new file mode 100644 index 0000000..b225f66 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/lt/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/lt/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/lt/LC_MESSAGES/django.po new file mode 100644 index 0000000..0c93418 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/lt/LC_MESSAGES/django.po @@ -0,0 +1,720 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/lt/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/lt/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..77922d3 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/lt/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/lt/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/lt/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..a922bd6 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/lt/LC_MESSAGES/djangojs.po @@ -0,0 +1,236 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/lv/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/lv/LC_MESSAGES/django.mo new file mode 100644 index 0000000..bc907fc Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/lv/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/lv/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/lv/LC_MESSAGES/django.po new file mode 100644 index 0000000..e865dd1 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/lv/LC_MESSAGES/django.po @@ -0,0 +1,720 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# edgars , 2011 +# NullIsNot0 , 2017 +# NullIsNot0 , 2018 +# Jannis Leidel , 2011 +# Māris Nartišs , 2016 +# NullIsNot0 , 2019-2020 +# peterisb , 2016 +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-22 17:27+0000\n" +"Last-Translator: NullIsNot0 \n" +"Language-Team: Latvian (http://www.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 "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 "Are you sure?" +msgstr "Vai esat pārliecināts?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Izdzēst izvēlēto %(verbose_name_plural)s" + +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ģistr jūtī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 "Laboti {fields} {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 "Lauki nav izmainīti" + +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." + +#, 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}” veiksmīgi labots. Zemāk to varat atkal labot." + +#, python-brace-format +msgid "The {name} “{obj}” was added successfully. You may edit it again below." +msgstr "{name} “{obj}” veiksmīgi pievienots. Zemāk to varat atkal labot." + +#, python-brace-format +msgid "" +"The {name} “{obj}” was changed successfully. You may add another {name} " +"below." +msgstr "{name} “{obj}” veiksmīgi labots. Zemāk varat pievienot vēl {name}." + +#, python-brace-format +msgid "The {name} “{obj}” was changed successfully." +msgstr "{name} “{obj}” veiksmīgi labots." + +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "Lai veiktu darbību, jāizvēlas rindas. Rindas nav izmainītas." + +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 ir laboti sekmīgi" +msgstr[1] "%(count)s %(name)s ir sekmīgi rediģēts" +msgstr[2] "%(count)s %(name)s ir sekmīgi rediģē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" + +#, 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" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Modeļi %(name)s lietotnē" + +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 "" +"First, enter a username and password. Then, you’ll be able to edit more user " +"options." +msgstr "" +"Vispirms ievadiet lietotāja vārdu un paroli. Tad varēsiet labot pārējos " +"lietotāja uzstādījumus." + +msgid "Enter a username and password." +msgstr "Ievadi lietotājvārdu un paroli." + +msgid "Change password" +msgstr "Paroles maiņa" + +msgid "Please correct the error below." +msgstr "Lūdzu izlabojiet zemāk redzamo kļūdu." + +msgid "Please correct the errors below." +msgstr "Lūdzu labo kļūdas zemāk." + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "Ievadiet jaunu paroli lietotājam %(username)s." + +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 "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 "Delete" +msgstr "Dzēst" + +#, 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ļ" + +msgid "Delete multiple objects" +msgstr "Dzēst vairākus 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 "" +"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 "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 password or username?" +msgstr "Aizmirsi paroli vai lietotājvārdu?" + +msgid "Toggle navigation" +msgstr "Pārslēgt navigāciju" + +msgid "Date/time" +msgstr "Datums/laiks" + +msgid "User" +msgstr "Lietotājs" + +msgid "Action" +msgstr "Darbība" + +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" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Paldies par pavadīto laiku mājas lapā." + +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 pārstatīšana(reset)" + +msgid "Your password has been set. You may go ahead and log in now." +msgstr "Jūsu parole ir uzstādīta. Varat pieslēgties." + +msgid "Password reset confirmation" +msgstr "Paroles pārstatīš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 pārstatīš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 "Your username, in case you’ve forgotten:" +msgstr "Jūsu lietotājvārds, gadījumā ja tas ir aizmirsts:" + +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 pārstatīšana" + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/lv/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/lv/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..6fa404d Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/lv/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/lv/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/lv/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..eea2c77 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/lv/LC_MESSAGES/djangojs.po @@ -0,0 +1,273 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# NullIsNot0 , 2017 +# Jannis Leidel , 2011 +# NullIsNot0 , 2020-2021 +# peterisb , 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-01-25 22:47+0000\n" +"Last-Translator: NullIsNot0 \n" +"Language-Team: Latvian (http://www.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 "" +"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 ir saraksts ar pieejamajiem %s. Tev ir jāizvēlas atbilstošās vērtības " +"atzīmējot izvēlēs zemāk esošajā sarakstā un pēc tam spiežot pogu \"Izvēlēties" +"\", lai pārvietotu starp izvēļu sarakstiem." + +#, 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" + +msgid "Choose all" +msgstr "Izvēlēties visu" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "Izvēlies, lai pievienotu visas %s izvēles vienā reizē." + +msgid "Choose" +msgstr "Izvēlies" + +msgid "Remove" +msgstr "Izņemt" + +#, javascript-format +msgid "Chosen %s" +msgstr "Izvēlies %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 ir saraksts ar izvēlētajiem %s. Tev ir jāizvēlas atbilstošās vērtības " +"atzīmējot izvēlēs zemāk esošajā sarakstā un pēc tam spiežot pogu \"Izņemt\", " +"lai izņemtu no izvēlēto ierakstu saraksta." + +msgid "Remove all" +msgstr "Izņemt visu" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "Izvēlies, lai izņemtu visas %s izvēles vienā reizē." + +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" + +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" + +msgid "Show" +msgstr "Parādīt" + +msgid "Hide" +msgstr "Slēpt" diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/mk/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/mk/LC_MESSAGES/django.mo new file mode 100644 index 0000000..dfbc8b1 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/mk/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/mk/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/mk/LC_MESSAGES/django.po new file mode 100644 index 0000000..2efa5d3 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/mk/LC_MESSAGES/django.po @@ -0,0 +1,699 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# dekomote , 2015 +# Jannis Leidel , 2011 +# 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: 2021-01-15 09:00+0100\n" +"PO-Revision-Date: 2021-06-11 17:28+0000\n" +"Last-Translator: Vasil Vangelovski \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 "" + +#, 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 "Избришан {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 "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 "Промени ги избраните %(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 "" +"Го примате овој 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/mk/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/mk/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..5b11c78 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/mk/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/mk/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/mk/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..04e9dcb --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/mk/LC_MESSAGES/djangojs.po @@ -0,0 +1,219 @@ +# 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: 2016-05-17 23:12+0200\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: Vasil Vangelovski \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 "" +"Избравте акција и немате направено промени на поединечни полиња. Веројатно " +"го барате копчето Оди наместо Зачувај." + +#, 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 "6 наутро" + +msgid "Noon" +msgstr "Пладне" + +msgid "6 p.m." +msgstr "6 попладне" + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ml/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ml/LC_MESSAGES/django.mo new file mode 100644 index 0000000..f75d3d6 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ml/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ml/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ml/LC_MESSAGES/django.po new file mode 100644 index 0000000..d96aab9 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ml/LC_MESSAGES/django.po @@ -0,0 +1,700 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ml/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ml/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..0abc5e7 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ml/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ml/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ml/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..964d355 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ml/LC_MESSAGES/djangojs.po @@ -0,0 +1,214 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/mn/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/mn/LC_MESSAGES/django.mo new file mode 100644 index 0000000..57a9d75 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/mn/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/mn/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/mn/LC_MESSAGES/django.po new file mode 100644 index 0000000..8137103 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/mn/LC_MESSAGES/django.po @@ -0,0 +1,712 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Ankhbayar , 2013 +# Jannis Leidel , 2011 +# jargalan , 2011 +# Zorig, 2016 +# Анхбаяр Анхаа , 2013-2016,2018-2019 +# Баясгалан Цэвлээ , 2011,2017 +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-13 09:17+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" + +#, 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 "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 "агуулгын төрөл" + +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 "Хоосон" + +msgid "" +"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgstr "" +"Олон утга сонгохын тулд \"Control\", эсвэл Mac дээр \"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 "" +"Үйлдэл хийхийн тулд Та ядаж 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\" дугаартай %(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 "%(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 "" +"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 "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 үр дүн" +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 "" +"Таны оруулсан имайл хаяг бүртгэлтэй бол таны имайл хаягруу нууц үг " +"тохируулах зааварыг удахгүй очих болно. Та удахгүй имайл хүлээж авах болно. " + +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 "" +"Хэрвээ та имайл хүлээж аваагүй бол оруулсан имайл хаягаараа бүртгүүлсэн " +"эсхээ шалгаад мөн имайлийнхаа Spam фолдер ийг шалгана уу." + +#, 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/mn/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/mn/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..9f58362 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/mn/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/mn/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/mn/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..5fda297 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/mn/LC_MESSAGES/djangojs.po @@ -0,0 +1,218 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/mr/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/mr/LC_MESSAGES/django.mo new file mode 100644 index 0000000..d847b48 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/mr/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/mr/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/mr/LC_MESSAGES/django.po new file mode 100644 index 0000000..c02c72b --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/mr/LC_MESSAGES/django.po @@ -0,0 +1,609 @@ +# 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: 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" + +#, 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/mr/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/mr/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..183b3d1 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/mr/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/mr/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/mr/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..2026d16 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/mr/LC_MESSAGES/djangojs.po @@ -0,0 +1,145 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/my/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/my/LC_MESSAGES/django.mo new file mode 100644 index 0000000..c22fe6c Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/my/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/my/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/my/LC_MESSAGES/django.po new file mode 100644 index 0000000..34054de --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/my/LC_MESSAGES/django.po @@ -0,0 +1,629 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/my/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/my/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..000b8bc Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/my/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/my/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/my/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..06b49fc --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/my/LC_MESSAGES/djangojs.po @@ -0,0 +1,206 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/nb/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/nb/LC_MESSAGES/django.mo new file mode 100644 index 0000000..ea77ddd Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/nb/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/nb/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/nb/LC_MESSAGES/django.po new file mode 100644 index 0000000..3f6445e --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/nb/LC_MESSAGES/django.po @@ -0,0 +1,720 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/nb/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/nb/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..6b1d74e Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/nb/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/nb/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/nb/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..1e6ddb6 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/nb/LC_MESSAGES/djangojs.po @@ -0,0 +1,269 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ne/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ne/LC_MESSAGES/django.mo new file mode 100644 index 0000000..903f979 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ne/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ne/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ne/LC_MESSAGES/django.po new file mode 100644 index 0000000..a328113 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ne/LC_MESSAGES/django.po @@ -0,0 +1,669 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Sagar Chalise , 2011 +# Santosh Purbey , 2020 +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: 2020-01-21 09:52+0000\n" +"Last-Translator: Santosh Purbey \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 "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 "" + +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 "चुनेको कुरा हटाउनुहोस ।" + +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 "%(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 नतिजा" +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ne/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ne/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..8208857 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ne/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ne/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ne/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..d55bd9f --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ne/LC_MESSAGES/djangojs.po @@ -0,0 +1,213 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/nl/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/nl/LC_MESSAGES/django.mo new file mode 100644 index 0000000..0564585 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/nl/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/nl/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/nl/LC_MESSAGES/django.po new file mode 100644 index 0000000..34f1d16 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/nl/LC_MESSAGES/django.po @@ -0,0 +1,735 @@ +# 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 +# Jeffrey Gelens , 2011-2012 +# dokterbob , 2015 +# Meteor0id, 2019-2020 +# 8de006b1b0894aab6aef71979dcd8bd6_5c6b207 , 2014-2015 +# Tino de Bruijn , 2011 +# Tonnes , 2017,2019-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-15 08:30+0000\n" +"Last-Translator: Tonnes \n" +"Language-Team: Dutch (http://www.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 "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?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Geselecteerde %(verbose_name_plural)s verwijderen" + +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." + +#, 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 added successfully. You may edit it again below." +msgstr "" +"De {name} ‘{obj}’ is met succes toegevoegd. 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" + +#, 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 "Please correct the error below." +msgstr "Corrigeer de fout hieronder." + +msgid "Please correct the errors below." +msgstr "Corrigeer de fouten hieronder." + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "" +"Voer een nieuw wachtwoord in voor de gebruiker %(username)s." + +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 "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 "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 "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 "Date/time" +msgstr "Datum/tijd" + +msgid "User" +msgstr "Gebruiker" + +msgid "Action" +msgstr "Actie" + +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" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Bedankt voor de aanwezigheid op de site vandaag." + +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 "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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/nl/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/nl/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..814d1e8 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/nl/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/nl/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/nl/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..8ed513c --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/nl/LC_MESSAGES/djangojs.po @@ -0,0 +1,227 @@ +# 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 +# Jeffrey Gelens , 2011-2012 +# Meteor0id, 2019-2020 +# 8de006b1b0894aab6aef71979dcd8bd6_5c6b207 , 2015 +# Tonnes , 2019-2020 +# wunki , 2011 +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 11:10+0000\n" +"Last-Translator: Tonnes \n" +"Language-Team: Dutch (http://www.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." + +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." + +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 "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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/nn/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/nn/LC_MESSAGES/django.mo new file mode 100644 index 0000000..78170f0 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/nn/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/nn/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/nn/LC_MESSAGES/django.po new file mode 100644 index 0000000..a85f011 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/nn/LC_MESSAGES/django.po @@ -0,0 +1,664 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# hgrimelid , 2011-2012 +# Jannis Leidel , 2011 +# jensadne , 2013 +# Sigurd Gartmann , 2012 +# velmont , 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: 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 "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?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Slett valgte %(verbose_name_plural)s" + +msgid "Administration" +msgstr "" + +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 "" + +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 "Handling:" + +#, python-format +msgid "Add another %(verbose_name)s" +msgstr "Legg til ny %(verbose_name)s." + +msgid "Remove" +msgstr "Fjern" + +msgid "action time" +msgstr "tid for handling" + +msgid "user" +msgstr "" + +msgid "content type" +msgstr "" + +msgid "object id" +msgstr "objekt-ID" + +#. Translators: 'repr' means representation +#. (https://docs.python.org/3/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 "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 "" + +msgid "Added." +msgstr "" + +msgid "and" +msgstr "og" + +#, 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 "Ingen felt endra." + +msgid "None" +msgstr "Ingen" + +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 "" +"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 "" + +#, python-format +msgid "Add %s" +msgstr "Opprett %s" + +#, python-format +msgid "Change %s" +msgstr "Rediger %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 "" + +#, 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 "" + +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 "" + +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" + +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 feila under." + +msgid "Please correct the errors below." +msgstr "" + +#, 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 "" + +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 "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 "" + +msgid "Yes, I'm sure" +msgstr "Ja, eg er sikker" + +msgid "No, take me back" +msgstr "" + +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 "Change" +msgstr "Endre" + +msgid "Delete?" +msgstr "Slette?" + +#, python-format +msgid " By %(filter_title)s " +msgstr "Etter %(filter_title)s " + +msgid "Summary" +msgstr "" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "" + +msgid "Add" +msgstr "Opprett" + +msgid "You don't have permission to edit anything." +msgstr "Du har ikkje løyve til å redigere noko." + +msgid "Recent actions" +msgstr "" + +msgid "My actions" +msgstr "" + +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 "" + +msgid "Forgotten your password or username?" +msgstr "Gløymd brukarnamn eller passord?" + +msgid "Date/time" +msgstr "Dato/tid" + +msgid "User" +msgstr "Brukar" + +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 var sannsynlegvis ikkje " +"oppretta med administrasjonssida." + +msgid "Show all" +msgstr "Vis alle" + +msgid "Save" +msgstr "Lagre" + +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 "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 "Thanks for spending some quality time with the Web site today." +msgstr "Takk for at du brukte kvalitetstid på nettstaden 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 gonger, 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 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 "" + +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 "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 "" + +msgid "Email address:" +msgstr "" + +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" + +msgid "Date:" +msgstr "Dato:" + +msgid "Time:" +msgstr "Tid:" + +msgid "Lookup" +msgstr "Oppslag" + +msgid "Currently:" +msgstr "" + +msgid "Change:" +msgstr "" diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/nn/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/nn/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..c4c8241 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/nn/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/nn/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/nn/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..07ba2f6 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/nn/LC_MESSAGES/djangojs.po @@ -0,0 +1,217 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# hgrimelid , 2011 +# Jannis Leidel , 2011 +# velmont , 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: 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." + +#, 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 "No" + +msgid "Choose a Time" +msgstr "" + +msgid "Choose a time" +msgstr "Velg eit klokkeslett" + +msgid "Midnight" +msgstr "Midnatt" + +msgid "6 a.m." +msgstr "06:00" + +msgid "Noon" +msgstr "12:00" + +msgid "6 p.m." +msgstr "" + +msgid "Cancel" +msgstr "Avbryt" + +msgid "Today" +msgstr "I dag" + +msgid "Choose a Date" +msgstr "" + +msgid "Yesterday" +msgstr "I går" + +msgid "Tomorrow" +msgstr "I morgon" + +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 "Vis" + +msgid "Hide" +msgstr "Skjul" diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/os/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/os/LC_MESSAGES/django.mo new file mode 100644 index 0000000..dbf509f Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/os/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/os/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/os/LC_MESSAGES/django.po new file mode 100644 index 0000000..aae9d9c --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/os/LC_MESSAGES/django.po @@ -0,0 +1,665 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/os/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/os/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..7af0f79 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/os/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/os/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/os/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..ec6c9c4 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/os/LC_MESSAGES/djangojs.po @@ -0,0 +1,217 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/pa/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/pa/LC_MESSAGES/django.mo new file mode 100644 index 0000000..7f97615 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/pa/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/pa/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/pa/LC_MESSAGES/django.po new file mode 100644 index 0000000..14b83e8 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/pa/LC_MESSAGES/django.po @@ -0,0 +1,668 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# A S Alam , 2018 +# Jannis Leidel , 2011 +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-05-28 01:29+0000\n" +"Last-Translator: Jannis Leidel \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 "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 "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 "ਲਾਗ ਐਂਟਰੀ" + +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] "%(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 "ਚੋਣ ਸਾਫ਼ ਕਰੋ" + +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 "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 "" + +#, python-format +msgid "Change selected %(model)s" +msgstr "" + +#, python-format +msgid "View 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 "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 "" + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/pa/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/pa/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..57cc79f Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/pa/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/pa/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/pa/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..2a36046 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/pa/LC_MESSAGES/djangojs.po @@ -0,0 +1,205 @@ +# 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: 2018-05-17 11:50+0200\n" +"PO-Revision-Date: 2017-09-19 16:41+0000\n" +"Last-Translator: Jannis Leidel \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 "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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/pl/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/pl/LC_MESSAGES/django.mo new file mode 100644 index 0000000..20d6375 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/pl/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/pl/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/pl/LC_MESSAGES/django.po new file mode 100644 index 0000000..3601c18 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/pl/LC_MESSAGES/django.po @@ -0,0 +1,743 @@ +# 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 +# m_aciek , 2016-2021 +# m_aciek , 2015 +# Mariusz Felisiak , 2020 +# 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: 2021-01-15 09:00+0100\n" +"PO-Revision-Date: 2021-06-20 11:10+0000\n" +"Last-Translator: m_aciek \n" +"Language-Team: Polish (http://www.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 "Are you sure?" +msgstr "Jesteś pewien?" + +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ą) %(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." + +#, python-brace-format +msgid "The {name} “{obj}” was added successfully." +msgstr "{name} „{obj}” został dodany 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ł dodany pomyślnie. Można dodać kolejny {name} poniżej." + +#, python-brace-format +msgid "" +"The {name} “{obj}” was changed successfully. You may edit it again below." +msgstr "" +"{name} „{obj}” został pomyślnie zmieniony. Można edytować go ponownie " +"poniżej." + +#, python-brace-format +msgid "The {name} “{obj}” was added successfully. You may edit it again below." +msgstr "" +"{name} „{obj}” został dodany pomyślnie. Można edytować go ponownie poniżej." + +#, python-brace-format +msgid "" +"The {name} “{obj}” was changed successfully. You may add another {name} " +"below." +msgstr "" +"{name} „{obj}” został pomyślnie zmieniony. Można dodać kolejny {name} " +"poniżej." + +#, python-brace-format +msgid "The {name} “{obj}” was changed successfully." +msgstr "{name} „{obj}” został pomyślnie zmieniony." + +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 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ł usunięty?" + +#, 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(-li) pomyślnie zmienione(-nieni)." +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" + +#, 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 %(total_count)s %(module_name)s" + +msgid "Clear selection" +msgstr "Wyczyść wybór" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Modele w aplikacji %(name)s" + +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 "" +"First, enter a username and password. Then, you’ll be able to edit more user " +"options." +msgstr "" +"Najpierw podaj nazwę użytkownika i hasło. Następnie będziesz mógł edytować " +"więcej opcji użytkownika." + +msgid "Enter a username and password." +msgstr "Podaj nazwę użytkownika i hasło." + +msgid "Change password" +msgstr "Zmiana hasła" + +msgid "Please correct the error below." +msgstr "Prosimy poprawić poniższy błąd." + +msgid "Please correct the errors below." +msgstr "Proszę, popraw 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 "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 "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 "Delete" +msgstr "Usuń" + +#, 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 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 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" + +msgid "Delete multiple objects" +msgstr "Usuwanie wielu obiektów" + +#, 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 %(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 "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 password or username?" +msgstr "Nie pamiętasz swojego hasła lub nazwy użytkownika?" + +msgid "Toggle navigation" +msgstr "Przełącz nawigację" + +msgid "Date/time" +msgstr "Data/czas" + +msgid "User" +msgstr "Użytkownik" + +msgid "Action" +msgstr "Akcja" + +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ń wybrane %(model)s" + +#, python-format +msgid "Add another %(model)s" +msgstr "Dodaj kolejny %(model)s" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "Usuń wybrane %(model)s" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Dziękujemy za spędzenie cennego czasu na stronie." + +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 "Your username, in case you’ve forgotten:" +msgstr "Twoja nazwa użytkownika, na wypadek, gdybyś zapomniał(a):" + +msgid "Thanks for using our site!" +msgstr "Dziękujemy za korzystanie 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 email:" + +msgid "Reset my password" +msgstr "Zresetuj moje hasło" + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/pl/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/pl/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..8cb3501 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/pl/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/pl/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/pl/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..e2763f2 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/pl/LC_MESSAGES/djangojs.po @@ -0,0 +1,293 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# angularcircle, 2011 +# Jannis Leidel , 2011 +# Janusz Harkot , 2014-2015 +# 0d5641585fd67fbdb97037c19ab83e4c_18c98b0 , 2011 +# m_aciek , 2016,2018,2020 +# Mariusz Felisiak , 2021 +# Roman Barczyński, 2012 +# Tomasz Kajtoch , 2016-2017 +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-19 11:03+0000\n" +"Last-Translator: Mariusz Felisiak \n" +"Language-Team: Polish (http://www.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 "" +"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 lista dostępnych %s. Aby wybrać pozycje, zaznacz je i kliknij strzałkę " +"„Wybierz” pomiędzy listami." + +#, 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" + +msgid "Choose all" +msgstr "Wybierz wszystkie" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "Kliknij, aby wybrać jednocześnie wszystkie %s." + +msgid "Choose" +msgstr "Wybierz" + +msgid "Remove" +msgstr "Usuń" + +#, javascript-format +msgid "Chosen %s" +msgstr "Wybrane %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 lista wybranych %s. Aby usunąć, zaznacz pozycje wybrane do usunięcia i " +"kliknij strzałkę „Usuń” pomiędzy listami." + +msgid "Remove all" +msgstr "Usuń wszystkie" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "Kliknij, aby usunąć jednocześnie wszystkie wybrane %s." + +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" + +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" + +msgid "Show" +msgstr "Pokaż" + +msgid "Hide" +msgstr "Ukryj" diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/pt/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/pt/LC_MESSAGES/django.mo new file mode 100644 index 0000000..d7ec87d Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/pt/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/pt/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/pt/LC_MESSAGES/django.po new file mode 100644 index 0000000..2d39cdb --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/pt/LC_MESSAGES/django.po @@ -0,0 +1,725 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Henrique Azevedo , 2018 +# Jannis Leidel , 2011 +# jorgecarleitao , 2015 +# Nuno Mariz , 2013,2015,2017-2018 +# Paulo Köch , 2011 +# Raúl Pedro Fernandes Santos, 2014 +# Rui Dinis Silva, 2017 +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: Portuguese (http://www.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 "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 "Are you sure?" +msgstr "Tem a certeza?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Remover %(verbose_name_plural)s selecionados" + +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" + +#, 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 "Foram modificados \"%(object)s\" - %(changes)s" + +#, python-format +msgid "Deleted \"%(object)s.\"" +msgstr "Foram removidos \"%(object)s.\"" + +msgid "LogEntry Object" +msgstr "Objeto LogEntry" + +#, python-brace-format +msgid "Added {name} \"{object}\"." +msgstr "Foi adicionado {name} \"{object}\"." + +msgid "Added." +msgstr "Adicionado." + +msgid "and" +msgstr "e" + +#, python-brace-format +msgid "Changed {fields} for {name} \"{object}\"." +msgstr "Foram modificados os {fields} para {name} \"{object}\"." + +#, python-brace-format +msgid "Changed {fields}." +msgstr "Foi modificado {fields}." + +#, python-brace-format +msgid "Deleted {name} \"{object}\"." +msgstr "Foi 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 pressionado o \"Control\", ou \"Command\" no Mac, para selecionar " +"mais do que um." + +#, 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 um novo {name} " +"abaixo." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may edit it again below." +msgstr "" +"O {name} \"{obj}\" foi modificado com sucesso. Pode voltar a editar " +"novamente abaixo." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgstr "" +"O {name} \"{obj}\" foi adicionado com sucesso. Pode voltar a editar " +"novamente abaixo." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"below." +msgstr "" +"O {name} \"{obj}\" foi modificado com sucesso. Pode adicionar um novo {name} " +"abaixo." + +#, python-brace-format +msgid "The {name} \"{obj}\" was changed successfully." +msgstr "O {name} \"{obj}\" foi modificado 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(A) %(name)s \"%(obj)s\" foi removido(a) com sucesso." + +#, python-format +msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgstr "%(name)s com ID \"%(key)s\" não existe. Talvez foi removido?" + +#, 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." + +#, 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" + +#, 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 %(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 enviada uma notificação para os administradores do " +"site, devendo o mesmo ser corrigido em breve. Obrigado pela atençã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 "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "" +"Primeiro introduza o nome do utilizador e palavra-passe. Depois poderá " +"editar mais opções do utilizador." + +msgid "Enter a username and password." +msgstr "Introduza o utilizador e palavra-passe." + +msgid "Change password" +msgstr "Modificar palavra-passe" + +msgid "Please correct the error below." +msgstr "Por favor corrija o erro abaixo." + +msgid "Please correct the errors below." +msgstr "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 "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 "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 "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' 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" + +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 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 "View" +msgstr "View" + +msgid "Delete?" +msgstr "Remover?" + +#, python-format +msgid " By %(filter_title)s " +msgstr " Por %(filter_title)s " + +msgid "Summary" +msgstr "Sumário" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Modelos na aplicação %(name)s" + +msgid "Add" +msgstr "Adicionar" + +msgid "You don't have permission to view or edit anything." +msgstr "Não tem permissão para ver ou editar nada." + +msgid "Recent actions" +msgstr "Ações recentes" + +msgid "My actions" +msgstr "As minhas ações" + +msgid "None available" +msgstr "Nenhum disponível" + +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 "" +"Passa-se algo de errado com a instalação da sua base de dados. Verifique se " +"as tabelas da base de dados foram criadas apropriadamente e verifique se a " +"base de dados pode ser lida pelo utilizador definido." + +#, 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 password or username?" +msgstr "Esqueceu-se da sua palavra-passe ou utilizador?" + +msgid "Date/time" +msgstr "Data/hora" + +msgid "User" +msgstr "Utilizador" + +msgid "Action" +msgstr "Ação" + +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 modificações. Provavelmente não foi " +"modificado via site de administração." + +msgid "Show all" +msgstr "Mostrar todos" + +msgid "Save" +msgstr "Gravar" + +msgid "Popup closing…" +msgstr "" + +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" + +#, 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" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Obrigado pela sua visita." + +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, por favor introduza a sua palavra-passe antiga e " +"depois introduza a nova duas vezes para que possamos verificar se introduziu " +"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 "" +"Foram enviadas para o email indicado as instruções de configuração da " +"palavra-passe, se existir uma conta com o email que indicou. Deverá recebê-" +"las brevemente." + +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 um email, por favor assegure-se de que introduziu o endereço " +"com o qual se registou e verifique a sua pasta de correio electrónico não " +"solicitado." + +#, 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 "Your username, in case you've forgotten:" +msgstr "O seu nome de utilizador, no caso de se ter esquecido:" + +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-chave? Introduza o seu endereço de email e enviar-" +"lhe-emos instruções para definir uma nova." + +msgid "Email address:" +msgstr "Endereço de email:" + +msgid "Reset my password" +msgstr "Reinicializar a minha palavra-passe" + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/pt/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/pt/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..bc7ae61 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/pt/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/pt/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/pt/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..1737994 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/pt/LC_MESSAGES/djangojs.po @@ -0,0 +1,222 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Nuno Mariz , 2011-2012,2015,2017 +# Paulo Köch , 2011 +# Raúl Pedro Fernandes Santos, 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-11-30 23:49+0000\n" +"Last-Translator: Nuno Mariz \n" +"Language-Team: Portuguese (http://www.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 "" +"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. Poderá escolher alguns, selecionando-os na " +"caixa 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 nesta caixa para filtrar a lista de %s disponíveis." + +msgid "Filter" +msgstr "Filtrar" + +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 vez." + +msgid "Choose" +msgstr "Escolher" + +msgid "Remove" +msgstr "Remover" + +#, javascript-format +msgid "Chosen %s" +msgstr "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 escolhidos. Poderá remover alguns, selecionando-os na " +"caixa abaixo e clicando na seta \"Remover\" entre as duas caixas." + +msgid "Remove all" +msgstr "Remover todos" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "Clique para remover todos os %s escolhidos de uma vez." + +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" + +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 "" +"Selecionou uma ação mas ainda não guardou as mudanças dos campos " +"individuais. Carregue em OK para gravar. Precisará de correr de novo 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 "" +"Selecionou uma ação mas ainda não guardou as mudanças dos campos " +"individuais. Provavelmente quererá o botão Ir ao invés do botão 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: 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." + +#, 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." + +msgid "Now" +msgstr "Agora" + +msgid "Choose a Time" +msgstr "Escolha a Hora" + +msgid "Choose a time" +msgstr "Escolha a hora" + +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." + +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 "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" + +msgid "Show" +msgstr "Mostrar" + +msgid "Hide" +msgstr "Ocultar" diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/pt_BR/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/pt_BR/LC_MESSAGES/django.mo new file mode 100644 index 0000000..dfc9541 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/pt_BR/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/pt_BR/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/pt_BR/LC_MESSAGES/django.po new file mode 100644 index 0000000..0adf231 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/pt_BR/LC_MESSAGES/django.po @@ -0,0 +1,747 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Allisson Azevedo , 2014 +# Bruce de Sá , 2019 +# bruno.devpod , 2014 +# Carlos C. Leite , 2019 +# Carlos C. Leite , 2019 +# Filipe Cifali Stangler , 2016 +# dudanogueira , 2012 +# Elyézer Rezende , 2013 +# Fábio C. Barrionuevo da Luz , 2015 +# Fabio Cerqueira , 2019 +# Xico Petry , 2016 +# Gladson , 2013 +# Guilherme Ferreira , 2017 +# semente, 2012-2013 +# Jannis Leidel , 2011 +# João Paulo Andrade , 2018 +# Lucas Infante , 2015 +# Luiz Boaretto , 2017 +# 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 +# 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: 2020-07-14 19:53+0200\n" +"PO-Revision-Date: 2020-09-22 14:07+0000\n" +"Last-Translator: Samuel Nogueira Bacelar \n" +"Language-Team: Portuguese (Brazil) (http://www.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 "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 excluir %(name)s " + +msgid "Are you sure?" +msgstr "Tem certeza?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Remover %(verbose_name_plural)s selecionados" + +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 "Eliminaçã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 "Deletado “%(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 "Deletado {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." + +#, 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 added successfully. You may edit it again below." +msgstr "" +"O {name} “{obj}” foi adicionado com sucesso. Você pode editá-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 deletado 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 deletado." + +#, 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." + +#, 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" + +#, 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 "" +"Excluir o %(class_name)s %(instance)s exigiria excluir 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" + +#, 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 seu 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 "Please correct the error below." +msgstr "Por favor corrija o erro abaixo " + +msgid "Please correct the errors below." +msgstr "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 "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 "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 "Delete" +msgstr "Apagar" + +#, 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 "" +"Excluir o %(object_name)s ' %(escaped_object)s ' exigiria excluir 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 "" +"Excluir o %(objects_name)s selecionado pode resultar na remoção de objetos " +"relacionados, mas sua conta não tem permissão para excluir os seguintes " +"tipos de objetos:" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" +"Excluir o %(objects_name)s selecionado exigiria excluir 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 apagar o %(objects_name)s selecionado? Todos os " +"seguintes objetos e seus itens relacionados serão removidos:" + +msgid "Delete?" +msgstr "Apagar?" + +#, 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 "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 "Date/time" +msgstr "Data/hora" + +msgid "User" +msgstr "Usuário" + +msgid "Action" +msgstr "Ação" + +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" + +#, 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 "Excluir %(model)s selecionado" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Obrigado por visitar nosso Web 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 "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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/pt_BR/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/pt_BR/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..813a169 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/pt_BR/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/pt_BR/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/pt_BR/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..565b6ac --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/pt_BR/LC_MESSAGES/djangojs.po @@ -0,0 +1,272 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Allisson Azevedo , 2014 +# andrewsmedina , 2016 +# Eduardo Cereto Carvalho, 2011 +# semente, 2012 +# Jannis Leidel , 2011 +# Lucas Infante , 2015 +# 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: 2021-01-15 09:00+0100\n" +"PO-Revision-Date: 2021-01-17 05:53+0000\n" +"Last-Translator: Rafael Fontenelle \n" +"Language-Team: Portuguese (Brazil) (http://www.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." + +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." + +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" + +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 Go ao invés do botão Save." + +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." + +#, 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." + +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" + +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" + +msgid "Show" +msgstr "Mostrar" + +msgid "Hide" +msgstr "Esconder" diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ro/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ro/LC_MESSAGES/django.mo new file mode 100644 index 0000000..78e6b31 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ro/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ro/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ro/LC_MESSAGES/django.po new file mode 100644 index 0000000..db64193 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ro/LC_MESSAGES/django.po @@ -0,0 +1,717 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Bogdan Mateescu, 2018-2019 +# Daniel Ursache-Dogariu, 2011 +# 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: 2020-07-14 19:53+0200\n" +"PO-Revision-Date: 2020-07-15 11:07+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" + +#, 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 "Ești sigur?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Elimină %(verbose_name_plural)s selectate" + +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 o 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 "Schimbă" + +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 "schimbă mesaj" + +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 "" + +msgid "You may edit it again below." +msgstr "O poți edita din nou mai jos." + +#, 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 "" +"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." +msgstr "Corectați eroarea de mai jos." + +msgid "Please correct the errors below." +msgstr "Corectați erorile de mai jos." + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "" +"Introduceți o parolă nouă pentru utilizatorul %(username)s." + +msgid "Welcome," +msgstr "Bun venit," + +msgid "View site" +msgstr "Vizualizare site" + +msgid "Documentation" +msgstr "Documentație" + +msgid "Log out" +msgstr "Deconectează-te" + +#, 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 "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 "" + +msgid "Date/time" +msgstr "Dată/oră" + +msgid "User" +msgstr "Utilizator" + +msgid "Action" +msgstr "Acțiune" + +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" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Mulţumiri pentru timpul petrecut astăzi pe sit." + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ro/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ro/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..59f694e Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ro/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ro/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ro/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..e681dde --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ro/LC_MESSAGES/djangojs.po @@ -0,0 +1,228 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ru/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ru/LC_MESSAGES/django.mo new file mode 100644 index 0000000..72c8ce6 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ru/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ru/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ru/LC_MESSAGES/django.po new file mode 100644 index 0000000..f9e671d --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ru/LC_MESSAGES/django.po @@ -0,0 +1,738 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Ivan Ivaschenko , 2013 +# Denis Darii , 2011 +# Dimmus , 2011 +# Eugene , 2016-2017 +# crazyzubr , 2020 +# Sergey , 2016 +# Jannis Leidel , 2011 +# SeryiMysh , 2020 +# Алексей Борискин , 2012-2015 +# Дмитрий , 2019 +# Дмитрий Шатера , 2018 +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-21 09:32+0000\n" +"Last-Translator: crazyzubr \n" +"Language-Team: Russian (http://www.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 "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 "Удалено “%(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), чтобы выбрать несколько " +"значений." + +#, 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 были успешно изменены." + +#, 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 "Снять выделение" + +#, 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 "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 результата" +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\"" + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ru/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ru/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..fe63491 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ru/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ru/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ru/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..478d770 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ru/LC_MESSAGES/djangojs.po @@ -0,0 +1,287 @@ +# 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 +# Андрей Щуров , 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-03-16 22:55+0000\n" +"Last-Translator: Panasoft\n" +"Language-Team: Russian (http://www.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. Вы можете удалить некоторые из них, выделив их в " +"поле ниже и кликнув \"Удалить\", либо двойным щелчком." + +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" +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 "Дек" + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sk/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sk/LC_MESSAGES/django.mo new file mode 100644 index 0000000..f0244f3 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sk/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sk/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sk/LC_MESSAGES/django.po new file mode 100644 index 0000000..a0d0831 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sk/LC_MESSAGES/django.po @@ -0,0 +1,708 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# 18f25ad6fa9930fc67cb11aca9d16a27, 2012-2013 +# Marian Andre , 2013-2015,2017 +# Martin Kosír, 2011 +# Martin Tóth , 2017 +# Peter Stríž , 2020 +# Zbynek Drlik , 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: 2020-12-14 18:32+0000\n" +"Last-Translator: Peter Stríž \n" +"Language-Team: Slovak (http://www.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 "Zmazať označené %(verbose_name_plural)s" + +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "Úspešne zmazaných %(count)d %(items)s." + +#, python-format +msgid "Cannot delete %(name)s" +msgstr "Nedá sa vymazať %(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ázdny" + +msgid "Not empty" +msgstr "Obsadený" + +#, 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 "Mazanie" + +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 "Zmazaný %(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 "Zmazaný {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\"" + +#, 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 "Nižšie môžete začať znovu editovať " + +#, 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 "" +"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 "" + +#, python-format +msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" +msgstr "" + +#, 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 "" + +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 "" + +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" + +#, 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 "" + +msgid "Enter a username and password." +msgstr "Zadajte používateľské meno a heslo." + +msgid "Change password" +msgstr "Zmeniť heslo" + +msgid "Please correct the error below." +msgstr "" + +msgid "Please correct the errors below." +msgstr "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 "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 "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 "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 "Zmazať 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 "" +"Vymazanie označených %(objects_name)s by spôsobilo vymazanie súvisiacich " +"objektov, ale váš účet nemá oprávnenie na vymazanie 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 isty, že chcete vymazať označené %(objects_name)s? Vymažú sa všetky " +"nasledujúce objekty a ich súvisiace položky:" + +msgid "Delete?" +msgstr "Zmazať?" + +#, 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 "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 "" + +#, 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 "" + +msgid "Date/time" +msgstr "Dátum a čas" + +msgid "User" +msgstr "Používateľ" + +msgid "Action" +msgstr "Akcia" + +msgid "" +"This object doesn’t have a change history. It probably wasn’t added via this " +"admin site." +msgstr "" + +msgid "Show all" +msgstr "Zobraziť všetky" + +msgid "Save" +msgstr "Uložiť" + +msgid "Popup closing…" +msgstr "" + +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 "" + +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 "Zmazať vybrané %(model)s" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Ďakujeme za čas strávený na našich stránkach." + +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 "" + +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 "" + +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 "" +"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 "" + +msgid "Email address:" +msgstr "E-mailová adresa:" + +msgid "Reset my password" +msgstr "Obnova môjho hesla" + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sk/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sk/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..798ad96 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sk/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sk/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sk/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..d703330 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sk/LC_MESSAGES/djangojs.po @@ -0,0 +1,226 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Dimitris Glezos , 2012 +# Jannis Leidel , 2011 +# Juraj Bubniak , 2012 +# Marian Andre , 2012,2015 +# Martin Kosír, 2011 +# Martin Tóth , 2017 +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-23 18:54+0000\n" +"Last-Translator: Marian Andre \n" +"Language-Team: Slovak (http://www.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ť." + +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." + +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 "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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sl/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sl/LC_MESSAGES/django.mo new file mode 100644 index 0000000..0085a30 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sl/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sl/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sl/LC_MESSAGES/django.po new file mode 100644 index 0000000..d454257 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sl/LC_MESSAGES/django.po @@ -0,0 +1,690 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Primož Verdnik , 2017 +# zejn , 2013,2016 +# zejn , 2011-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-23 18:54+0000\n" +"Last-Translator: Primož Verdnik \n" +"Language-Team: Slovenian (http://www.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 "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?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Izbriši izbrano: %(verbose_name_plural)s" + +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" + +#, 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 "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/3/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 "Dodan \"%(object)s\"." + +#, python-format +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "Spremenjen \"%(object)s\" - %(changes)s" + +#, 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 vnos {name} \"{object}\"." + +msgid "Added." +msgstr "Dodano." + +msgid "and" +msgstr "in" + +#, python-brace-format +msgid "Changed {fields} for {name} \"{object}\"." +msgstr "Spremenjena polja {fields} za {name} \"{object}\"." + +#, python-brace-format +msgid "Changed {fields}." +msgstr "Spremenjena polja {fields}." + +#, python-brace-format +msgid "Deleted {name} \"{object}\"." +msgstr "Izbrisan vnos {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 "Držite \"Control\" (ali \"Command\" na Mac-u) za izbiro več kot enega." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgstr "" +"Vnos {name} \"{obj}\" je bil uspešno dodan. Lahko ga znova uredite spodaj." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may add another {name} " +"below." +msgstr "" +"Vnos {name} \"{obj}\" je bil uspešno dodan. Lahko dodate še en {name} spodaj." + +#, python-brace-format +msgid "The {name} \"{obj}\" was added successfully." +msgstr "Vnos {name} \"{obj}\" je bil uspešno dodan." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may edit it again below." +msgstr "" +"Vnos {name} \"{obj}\" je bil uspešno spremenjen. Lahko ga znova uredite " +"spodaj." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"below." +msgstr "" +"Vnos {name} \"{obj}\" je bil uspešno spremenjen. Spodaj lahko dodate nov " +"vnos {name}." + +#, python-brace-format +msgid "The {name} \"{obj}\" was changed successfully." +msgstr "Vnos {name} \"{obj}\" je bil uspešno spremenjen." + +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 "%(name)s \"%(obj)s\" je bil uspešno izbrisan." + +#, python-format +msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgstr "%(name)s s ključem \"%(key)s\" ne obstaja. Morda je bil izbrisan?" + +#, python-format +msgid "Add %s" +msgstr "Dodaj %s" + +#, python-format +msgid "Change %s" +msgstr "Spremeni %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 javljena administratorjem " +"spletne strani in naj bi jo v kratkem odpravili. 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 "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "" +"Najprej vpišite uporabniško ime in geslo, nato boste lahko urejali druge " +"lastnosti uporabnika." + +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." +msgstr "Prosimo, odpravite sledeče napake." + +msgid "Please correct the errors below." +msgstr "Prosimo 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 "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 "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 "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 "Ja, 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 "Change" +msgstr "Spremeni" + +msgid "Delete?" +msgstr "Izbrišem?" + +#, python-format +msgid " By %(filter_title)s " +msgstr " Po %(filter_title)s " + +msgid "Summary" +msgstr "Povzetek" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Model v %(name)s aplikaciji" + +msgid "Add" +msgstr "Dodaj" + +msgid "You don't have permission to edit anything." +msgstr "Nimate dovoljenja za urejanje česarkoli." + +msgid "Recent actions" +msgstr "Nedavna dejanja" + +msgid "My actions" +msgstr "Moja dejanja" + +msgid "None available" +msgstr "Ni na voljo" + +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 "" +"Nekaj je narobe z namestitvijo vaše podatkovne baze. Preverite, da so bile " +"ustvarjene prave tabele v podatkovni bazi in da je dostop do branja baze " +"omogočen pravemu uporabniku." + +#, 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 "Date/time" +msgstr "Datum/čas" + +msgid "User" +msgstr "Uporabnik" + +msgid "Action" +msgstr "Dejanje" + +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "" +"Ta objekt nima zgodovine sprememb. Verjetno ni bil dodan preko te strani za " +"administracijo." + +msgid "Show all" +msgstr "Prikaži vse" + +msgid "Save" +msgstr "Shrani" + +msgid "Popup closing..." +msgstr "Zapiram pojavno okno ..." + +#, 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" + +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 "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 "" +"Vnesite vaše staro geslo (zaradi varnosti) in nato še dvakrat novo, da se " +"izognete tipkarskim napakam." + +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 "" +"Če obstaja račun z navedenim e-poštnim naslovom, smo vam prek epošte poslali " +"navodila za nastavitev vašega gesla. Prejeti bi jih morali v kratkem." + +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 e-pošte niste prejeli, prosimo preverite, da ste vnesli pravilen e-poštni " +"naslov in preverite nezaželeno 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 (za vsak primer):" + +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? Vnesite vaš e-poštni naslov in poslali vam bomo navodila " +"za ponastavitev gesla." + +msgid "Email address:" +msgstr "E-poštni naslov:" + +msgid "Reset my password" +msgstr "Ponastavi moje geslo" + +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" + +msgid "Date:" +msgstr "Datum:" + +msgid "Time:" +msgstr "Ura:" + +msgid "Lookup" +msgstr "Poizvedba" + +msgid "Currently:" +msgstr "Trenutno:" + +msgid "Change:" +msgstr "Spremembe:" diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sl/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sl/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..255885e Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sl/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sl/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sl/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..35ab1ce --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sl/LC_MESSAGES/djangojs.po @@ -0,0 +1,225 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# zejn , 2016 +# zejn , 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-23 18:54+0000\n" +"Last-Translator: Primož Verdnik \n" +"Language-Team: Slovenian (http://www.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." + +msgid "Remove all" +msgstr "Odstrani vse" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "Kliknite za odstranitev vseh %s hkrati." + +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 niste shranili sprememb na posameznih poljih. " +"Kliknite na 'V redu', da boste shranili. Dejanje boste morali ponovno " +"izvesti." + +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, vendar niste naredili nobenih sprememb na posameznih " +"poljih. Verjetno iščete gumb Pojdi namesto Shrani." + +#, 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 "Now" +msgstr "Takoj" + +msgid "Choose a Time" +msgstr "Izberite čas" + +msgid "Choose a time" +msgstr "Izbor časa" + +msgid "Midnight" +msgstr "Polnoč" + +msgid "6 a.m." +msgstr "Ob 6h" + +msgid "Noon" +msgstr "Opoldne" + +msgid "6 p.m." +msgstr "Ob 18h" + +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 "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" + +msgid "Show" +msgstr "Prikaži" + +msgid "Hide" +msgstr "Skrij" diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sq/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sq/LC_MESSAGES/django.mo new file mode 100644 index 0000000..e9ea005 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sq/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sq/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sq/LC_MESSAGES/django.po new file mode 100644 index 0000000..aac5afe --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sq/LC_MESSAGES/django.po @@ -0,0 +1,724 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Besnik Bleta , 2011,2015 +# Besnik Bleta , 2020 +# Besnik Bleta , 2015,2018-2019 +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: Albanian (http://www.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 "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 "Are you sure?" +msgstr "Jeni i sigurt?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Fshiji %(verbose_name_plural)s e përzgjedhur" + +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ë regjistrimi" + +msgid "log entries" +msgstr "zëra regjistrimi" + +#, 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." + +#, 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 added successfully. You may edit it again below." +msgstr "{name} “{obj}” u shtua 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" + +#, 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 "Xhiro 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" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Modele te aplikacioni %(name)s" + +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 "" +"First, enter a username and password. Then, you’ll be able to edit more user " +"options." +msgstr "" +"Së pari, jepni një emër përdoruesi dhe një fjalëkalim. Mandej, do të jeni në " +"gjendje të përpunoni më tepër mundësi përdoruesi." + +msgid "Enter a username and password." +msgstr "Jepni emër përdoruesi dhe fjalëkalim." + +msgid "Change password" +msgstr "Ndryshoni fjalëkalimin" + +msgid "Please correct the error below." +msgstr "Ju lutemi, ndreqni gabimin më poshtë." + +msgid "Please correct the errors below." +msgstr "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 "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 "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 "Delete" +msgstr "Fshije" + +#, 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 nuk 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" + +msgid "Delete multiple objects" +msgstr "Fshini disa objekte njëherësh" + +#, 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 nuk 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 "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 "" +"Jeni mirëfilltësuar 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 password or username?" +msgstr "Harruat fjalëkalimin ose emrin tuaj të përdoruesit?" + +msgid "Toggle navigation" +msgstr "" + +msgid "Date/time" +msgstr "Datë/kohë" + +msgid "User" +msgstr "Përdorues" + +msgid "Action" +msgstr "Veprim" + +msgid "" +"This object doesn’t have a change history. It probably wasn’t added via this " +"admin site." +msgstr "" +"Ky objekt nuk 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" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Faleminderit që shpenzoni sot pak kohë të çmuar me sajtin Web." + +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 "Your username, in case you’ve forgotten:" +msgstr "Emri juaj i përdoruesit, në rast se e keni harruar:" + +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 "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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sq/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sq/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..3feecc2 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sq/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sq/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sq/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..fe02462 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sq/LC_MESSAGES/djangojs.po @@ -0,0 +1,269 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Besnik Bleta , 2011-2012,2015 +# Besnik Bleta , 2020-2021 +# Besnik Bleta , 2015,2017 +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 13:33+0000\n" +"Last-Translator: Besnik Bleta \n" +"Language-Team: Albanian (http://www.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 "" +"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 "" +"Kjo është lista e %s të gatshëm. Mund të zgjidhni disa duke i përzgjedhur te " +"kutiza më poshtë dhe mandej duke klikuar mbi shigjetën \"Zgjidhe\" mes dy " +"kutizave." + +#, javascript-format +msgid "Type into this box to filter down the list of available %s." +msgstr "Shkruani brenda kutizës që të filtrohet lista e %s të passhme." + +msgid "Filter" +msgstr "Filtro" + +msgid "Choose all" +msgstr "Zgjidheni krejt" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "Klikoni që të zgjidhen krejt %s njëherësh." + +msgid "Choose" +msgstr "Zgjidhni" + +msgid "Remove" +msgstr "Hiqe" + +#, javascript-format +msgid "Chosen %s" +msgstr "U zgjodh %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 "" +"Kjo është lista e %s të gatshme. Mund të hiqni disa duke i përzgjedhur te " +"kutiza më poshtë e mandej duke klikuar mbi shigjetën \"Hiqe\" mes dy " +"kutizave." + +msgid "Remove all" +msgstr "Hiqi krejt" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "Klikoni që të hiqen krejt %s e zgjedhura njëherësh." + +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 nuk 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" + +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" + +msgid "Show" +msgstr "Shfaqe" + +msgid "Hide" +msgstr "Fshihe" diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sr/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sr/LC_MESSAGES/django.mo new file mode 100644 index 0000000..ae2b979 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sr/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sr/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sr/LC_MESSAGES/django.po new file mode 100644 index 0000000..246d8b1 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sr/LC_MESSAGES/django.po @@ -0,0 +1,702 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Branko Kokanovic , 2018 +# Igor Jerosimić, 2019,2021 +# Jannis Leidel , 2011 +# Janos Guljas , 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 18:04+0000\n" +"Last-Translator: Igor Jerosimić\n" +"Language-Team: Serbian (http://www.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 "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 "" + +#, 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] "Успешно промењен %(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 изабрано" + +#, 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 "Поништи избор" + +#, 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 "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 резултата" +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" + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sr/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sr/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..e7c3325 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sr/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sr/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sr/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..947d6fd --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sr/LC_MESSAGES/djangojs.po @@ -0,0 +1,270 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Branko Kokanovic , 2018 +# Igor Jerosimić, 2021 +# Jannis Leidel , 2011 +# Janos Guljas , 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 16:56+0000\n" +"Last-Translator: Igor Jerosimić\n" +"Language-Team: Serbian (http://www.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 "" +"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 изабрана" +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 "дец" + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sr_Latn/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sr_Latn/LC_MESSAGES/django.mo new file mode 100644 index 0000000..65c851b Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sr_Latn/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sr_Latn/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sr_Latn/LC_MESSAGES/django.po new file mode 100644 index 0000000..4c3d304 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sr_Latn/LC_MESSAGES/django.po @@ -0,0 +1,694 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Igor Jerosimić, 2019 +# Jannis Leidel , 2011 +# Janos Guljas , 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-06-27 12:37+0000\n" +"Last-Translator: Igor Jerosimić\n" +"Language-Team: Serbian (Latin) (http://www.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" + +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "Uspešno obrisano: %(count)d %(items)s." + +#, python-format +msgid "Cannot delete %(name)s" +msgstr "Nesuspelo brisanje %(name)s" + +msgid "Are you sure?" +msgstr "Da li ste sigurni?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Briši označene objekte klase %(verbose_name_plural)s" + +msgid "Administration" +msgstr "Administracija" + +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 "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 "" +"Molim vas unesite ispravno %(username)s i lozinku. Obratite pažnju da mala i " +"velika slova predstavljaju različite karaktere." + +msgid "Action:" +msgstr "Radnja:" + +#, python-format +msgid "Add another %(verbose_name)s" +msgstr "Dodaj još jedan objekat klase %(verbose_name)s." + +msgid "Remove" +msgstr "Obriši" + +msgid "Addition" +msgstr "Dodavanja" + +msgid "Change" +msgstr "Izmeni" + +msgid "Deletion" +msgstr "Brisanja" + +msgid "action time" +msgstr "vreme radnje" + +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 "opis objekta" + +msgid "action flag" +msgstr "oznaka radnje" + +msgid "change message" +msgstr "opis izmene" + +msgid "log entry" +msgstr "zapis u logovima" + +msgid "log entries" +msgstr "zapisi u logovima" + +#, python-format +msgid "Added \"%(object)s\"." +msgstr "Dodat objekat klase „%(object)s“." + +#, python-format +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "Promenjen objekat klase „%(object)s“ - %(changes)s" + +#, python-format +msgid "Deleted \"%(object)s.\"" +msgstr "Uklonjen objekat klase „%(object)s“." + +msgid "LogEntry Object" +msgstr "Objekat unosa loga" + +#, python-brace-format +msgid "Added {name} \"{object}\"." +msgstr "Dodat objekat {name} \"{object}\"." + +msgid "Added." +msgstr "Dodato." + +msgid "and" +msgstr "i" + +#, python-brace-format +msgid "Changed {fields} for {name} \"{object}\"." +msgstr "Izmenjena polja {fields} za {name} \"{object}\"." + +#, python-brace-format +msgid "Changed {fields}." +msgstr "Izmenjena polja {fields}." + +#, python-brace-format +msgid "Deleted {name} \"{object}\"." +msgstr "Obrisan objekat {name} \"{object}\"." + +msgid "No fields changed." +msgstr "Bez izmena u poljima." + +msgid "None" +msgstr "Ništa" + +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 "" +"Potrebno je izabrati objekte da bi se izvršila akcija nad njima. Nijedan " +"objekat nije promenjen." + +msgid "No action selected." +msgstr "Nije izabrana nijedna akcija." + +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "Objekat „%(obj)s“ klase %(name)s uspešno je obrisan." + +#, 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 "Izmeni objekat klase %s" + +#, python-format +msgid "View %s" +msgstr "Pregled %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] "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." + +#, 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" + +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "0 od %(cnt)s izabrano" + +#, 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. +#, 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 "Izaberi sve objekte na ovoj stranici." + +#, python-format +msgid "Select all %(total_count)s %(module_name)s" +msgstr "Izaberi sve %(module_name)s od %(total_count)s ukupno." + +msgid "Clear selection" +msgstr "Poništi 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 menjate još " +"korisničkih podešavanja." + +msgid "Enter a username and password." +msgstr "Unesite korisničko ime i lozinku" + +msgid "Change password" +msgstr "Promena 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 "Pogledaj sajt" + +msgid "Documentation" +msgstr "Dokumentacija" + +msgid "Log out" +msgstr "Odjava" + +#, python-format +msgid "Add %(name)s" +msgstr "Dodaj objekat klase %(name)s" + +msgid "History" +msgstr "Istorijat" + +msgid "View on site" +msgstr "Pregled na sajtu" + +msgid "Filter" +msgstr "Filter" + +msgid "Remove from sorting" +msgstr "Izbaci iz sortiranja" + +#, python-format +msgid "Sorting priority: %(priority_number)s" +msgstr "Prioritet sortiranja: %(priority_number)s" + +msgid "Toggle sorting" +msgstr "Uključi/isključi sortiranje" + +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 sledećih tipova objekata:" + +#, 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:" + +#, 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:" + +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 "" +"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:" + +#, 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:" + +#, 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:" + +msgid "View" +msgstr "Pregled" + +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 view or edit anything." +msgstr "Nemate dozvolu da pogledate ili izmenite bilo šta." + +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. Proverite 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 "Zaboravili ste lozinku ili korisničko ime?" + +msgid "Date/time" +msgstr "Datum/vreme" + +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 zabeležen istorijat izmena. Verovatno nije dodat kroz ovaj " +"sajt za administraciju." + +msgid "Show all" +msgstr "Prikaži sve" + +msgid "Save" +msgstr "Sačuvaj" + +msgid "Popup closing…" +msgstr "" + +msgid "Search" +msgstr "Pretraga" + +#, 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 "ukupno %(full_result_count)s" + +msgid "Save as new" +msgstr "Sačuvaj kao novi" + +msgid "Save and add another" +msgstr "Sačuvaj i dodaj sledeći" + +msgid "Save and continue editing" +msgstr "Sačuvaj i nastavi sa izmenama" + +msgid "Save and view" +msgstr "Snimi i pogledaj" + +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 "Hvala što ste danas proveli vreme na ovom sajtu." + +msgid "Log in again" +msgstr "Ponovna prijava" + +msgid "Password change" +msgstr "Izmena lozinke" + +msgid "Your password was changed." +msgstr "Vaša lozinka je izmenjena." + +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." + +msgid "Change my password" +msgstr "Izmeni 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 proverimo da li ste je " +"pravilno uneli." + +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, verovatno 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 sledeć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 "Ekipa 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 izmenu" + +#, python-format +msgid "Select %s to view" +msgstr "Odaberi %sza pregled" + +msgid "Date:" +msgstr "Datum:" + +msgid "Time:" +msgstr "Vreme:" + +msgid "Lookup" +msgstr "Pretraži" + +msgid "Currently:" +msgstr "" + +msgid "Change:" +msgstr "" diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sr_Latn/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sr_Latn/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..af577b2 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sr_Latn/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sr_Latn/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sr_Latn/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..4414514 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sr_Latn/LC_MESSAGES/djangojs.po @@ -0,0 +1,269 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Igor Jerosimić, 2019,2021 +# Jannis Leidel , 2011 +# Janos Guljas , 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 17:00+0000\n" +"Last-Translator: Igor Jerosimić\n" +"Language-Team: Serbian (Latin) (http://www.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 "" +"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 lista dostupnih „%s“. Možete izabrati elemente tako što ćete ih " +"izabrati u listi i kliknuti na „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" + +msgid "Choose all" +msgstr "Izaberi sve" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "Izaberite sve „%s“ odjednom." + +msgid "Choose" +msgstr "Izaberi" + +msgid "Remove" +msgstr "Ukloni" + +#, javascript-format +msgid "Chosen %s" +msgstr "Izabrano „%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 lista izabranih „%s“. Možete ukloniti elemente tako što ćete ih " +"izabrati u listi i kliknuti na „Ukloni“." + +msgid "Remove all" +msgstr "Ukloni sve" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "Uklonite sve izabrane „%s“ odjednom." + +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" + +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 "Pokaži" + +msgid "Hide" +msgstr "Sakrij" diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sv/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sv/LC_MESSAGES/django.mo new file mode 100644 index 0000000..3acb958 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sv/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sv/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sv/LC_MESSAGES/django.po new file mode 100644 index 0000000..6d656d3 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sv/LC_MESSAGES/django.po @@ -0,0 +1,725 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Alex Nordlund , 2012 +# Andreas Pelme , 2014 +# d7bcbd5f5cbecdc2b959899620582440, 2011 +# Cybjit , 2012 +# Henrik Palmlund Wahlgren , 2019 +# Jannis Leidel , 2011 +# Johan Rohdin, 2021 +# Jonathan Lindén, 2015 +# Jonathan Lindén, 2014 +# metteludwig , 2019 +# Mattias Hansson , 2016 +# Mikko Hellsing , 2011 +# Thomas Lundqvist, 2013,2016-2017 +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-01 12:33+0000\n" +"Last-Translator: Johan Rohdin\n" +"Language-Team: Swedish (http://www.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 "Are you sure?" +msgstr "Är du säker?" + +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 "" + +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 "" +"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." + +#, 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 added successfully. You may edit it again below." +msgstr "Lade till {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" + +#, 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" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Modeller i applikationen %(name)s" + +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 "" +"First, enter a username and password. Then, you’ll be able to edit more user " +"options." +msgstr "" +"Ange först ett användarnamn och ett lösenord. Därefter kan du ändra fler " +"egenskaper för användaren." + +msgid "Enter a username and password." +msgstr "Mata in användarnamn och lösenord." + +msgid "Change password" +msgstr "Ändra lösenord" + +msgid "Please correct the error below." +msgstr "Vänligen rätta nedanstående fel" + +msgid "Please correct the errors below." +msgstr "Vänligen rätta till 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 "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 "Clear all filters" +msgstr "" + +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 "Delete" +msgstr "Radera" + +#, 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" + +msgid "Delete multiple objects" +msgstr "Ta bort flera 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 "" +"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 "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 password or username?" +msgstr "Har du glömt lösenordet eller användarnamnet?" + +msgid "Toggle navigation" +msgstr "" + +msgid "Date/time" +msgstr "Datum tid" + +msgid "User" +msgstr "Användare" + +msgid "Action" +msgstr "Händelse" + +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" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Tack för att du spenderade lite 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 "Your username, in case you’ve forgotten:" +msgstr "Ditt användarnamn, utifall du glömt det:" + +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 "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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sv/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sv/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..5d20207 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sv/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sv/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sv/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..6d833d7 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sv/LC_MESSAGES/djangojs.po @@ -0,0 +1,223 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Andreas Pelme , 2012 +# Jannis Leidel , 2011 +# 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: 2018-05-17 11:50+0200\n" +"PO-Revision-Date: 2017-09-19 16:41+0000\n" +"Last-Translator: Mattias Hansson \n" +"Language-Team: Swedish (http://www.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." + +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." + +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 "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 "Visa" + +msgid "Hide" +msgstr "Göm" diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sw/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sw/LC_MESSAGES/django.mo new file mode 100644 index 0000000..6e917f5 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sw/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sw/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sw/LC_MESSAGES/django.po new file mode 100644 index 0000000..1271dff --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sw/LC_MESSAGES/django.po @@ -0,0 +1,676 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Machaku , 2013-2014 +# Machaku , 2016 +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: 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" + +#, 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?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Futa %(verbose_name_plural)s teule" + +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" + +#, 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 "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/3/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 "Kuongezwa kwa \"%(object)s\"." + +#, python-format +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "Kubadilishwa kwa \"%(object)s\" - %(changes)s" + +#, python-format +msgid "Deleted \"%(object)s.\"" +msgstr "Kufutwa kwa \"%(object)s\"." + +msgid "LogEntry Object" +msgstr "Kitu cha Ingizo la Kumbukumbu" + +#, python-brace-format +msgid "Added {name} \"{object}\"." +msgstr "Kumeongezeka {name} \"{object}\"." + +msgid "Added." +msgstr "Imeongezwa" + +msgid "and" +msgstr "na" + +#, python-brace-format +msgid "Changed {fields} for {name} \"{object}\"." +msgstr "Mabadiliko ya {fields} yamefanyika katika {name} \"{object}\"." + +#, python-brace-format +msgid "Changed {fields}." +msgstr "Mabadiliko yamefanyika katika {fields} " + +#, python-brace-format +msgid "Deleted {name} \"{object}\"." +msgstr "Futa {name} \"{object}\"." + +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 "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgstr "" +"Ingizo la {name} \"{obj}\" limefanyika kwa mafanikio. Unaweza kuhariri tena" + +#, 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 "" +"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 "Ufutaji wa \"%(obj)s\" %(name)s umefanikiwa." + +#, python-format +msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgstr "" + +#, python-format +msgid "Add %s" +msgstr "Ongeza %s" + +#, python-format +msgid "Change %s" +msgstr "Badilisha %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 uliohitajika haukupatikana." + +msgid "Home" +msgstr "Sebule" + +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 hitilafu. Imeripotiwa kwa watawala kupitia barua pepe na " +"inatakiwa kurekebishwa mapema." + +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 "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "" +"Kwanza, ingiza jina lamtumiaji na nywila. Kisha, utaweza kuhariri zaidi " +"machaguo ya 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." +msgstr "Tafadhali sahihisha makosa yafuatayo " + +msgid "Please correct the errors below." +msgstr "Tafadhali sahihisha makosa yafuatayo." + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "ingiza nywila ya mtumiaji %(username)s." + +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 "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 "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 "Change" +msgstr "Badilisha" + +msgid "Delete?" +msgstr "Futa?" + +#, python-format +msgid " By %(filter_title)s " +msgstr " Kwa %(filter_title)s" + +msgid "Summary" +msgstr "Muhtasari" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Models katika application %(name)s" + +msgid "Add" +msgstr "Ongeza" + +msgid "You don't have permission to edit anything." +msgstr "Huna ruhusa ya kuhariri chochote" + +msgid "Recent actions" +msgstr "Matendo ya karibuni" + +msgid "My actions" +msgstr "Matendo yangu" + +msgid "None available" +msgstr "Hakuna kilichopatikana" + +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 limetokea katika usanikishaji wako wa hifadhidata. Hakikisha " +"kuwa majedwali sahihi ya hifadhidata yameundwa, na hakikisha hifadhidata " +"inaweza kusomwana 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 "" + +msgid "Forgotten your password or username?" +msgstr "Umesahau jina na nenosiri lako?" + +msgid "Date/time" +msgstr "Tarehe/saa" + +msgid "User" +msgstr "Mtumiaji" + +msgid "Action" +msgstr "Tendo" + +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "" +"Kiumbile hiki hakina historia ya kubadilika. Inawezekana hakikuwekwa kupitia " +"hii tovuti ya utawala." + +msgid "Show all" +msgstr "Onesha yotee" + +msgid "Save" +msgstr "Hifadhi" + +msgid "Popup closing..." +msgstr "Udukizi unafunga" + +#, 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" + +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 "Thanks for spending some quality time with the Web site today." +msgstr "Ahsante kwa kutumia muda wako katika Tovuti yetu 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 ajili ya usalama, kisha ingiza " +"nywila mpya mara mbili ili tuweze kuthibitisha kuwa umelichapisha 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 "" + +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 hujapata barua pepe, tafadhali hakikisha umeingiza anuani ya barua " +"pepe uliyoitumia kujisajili na angalia katika folda la spam" + +#, 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 mtumiaji, 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 "" +"Umesahau nywila yako? Ingiza anuani yako ya barua pepe hapo chini, nasi " +"tutakutumia maelekezo ya kuseti nenosiri jipya. " + +msgid "Email address:" +msgstr "Anuani ya barua pepe:" + +msgid "Reset my password" +msgstr "Seti nywila yangu upya" + +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" + +msgid "Date:" +msgstr "Tarehe" + +msgid "Time:" +msgstr "Saa" + +msgid "Lookup" +msgstr "`Lookup`" + +msgid "Currently:" +msgstr "Kwa sasa:" + +msgid "Change:" +msgstr "Badilisha:" diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sw/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sw/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..12f1466 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sw/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sw/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sw/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..5806dd9 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/sw/LC_MESSAGES/djangojs.po @@ -0,0 +1,217 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ta/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ta/LC_MESSAGES/django.mo new file mode 100644 index 0000000..398f1f2 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ta/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ta/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ta/LC_MESSAGES/django.po new file mode 100644 index 0000000..3a3cf1b --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ta/LC_MESSAGES/django.po @@ -0,0 +1,643 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ta/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ta/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..3393111 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ta/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ta/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ta/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..0a7bfcc --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ta/LC_MESSAGES/djangojs.po @@ -0,0 +1,204 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/te/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/te/LC_MESSAGES/django.mo new file mode 100644 index 0000000..17e7dc6 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/te/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/te/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/te/LC_MESSAGES/django.po new file mode 100644 index 0000000..f624d4f --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/te/LC_MESSAGES/django.po @@ -0,0 +1,640 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/te/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/te/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..92b65f1 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/te/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/te/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/te/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..cfa35a1 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/te/LC_MESSAGES/djangojs.po @@ -0,0 +1,205 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/tg/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/tg/LC_MESSAGES/django.mo new file mode 100644 index 0000000..34085cb Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/tg/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/tg/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/tg/LC_MESSAGES/django.po new file mode 100644 index 0000000..dee2872 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/tg/LC_MESSAGES/django.po @@ -0,0 +1,699 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/tg/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/tg/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..2c06551 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/tg/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/tg/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/tg/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..b5f4fdb --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/tg/LC_MESSAGES/djangojs.po @@ -0,0 +1,222 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/th/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/th/LC_MESSAGES/django.mo new file mode 100644 index 0000000..5beeadd Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/th/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/th/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/th/LC_MESSAGES/django.po new file mode 100644 index 0000000..53054f8 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/th/LC_MESSAGES/django.po @@ -0,0 +1,671 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/th/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/th/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..71eff63 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/th/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/th/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/th/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..5cca152 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/th/LC_MESSAGES/djangojs.po @@ -0,0 +1,213 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/tr/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/tr/LC_MESSAGES/django.mo new file mode 100644 index 0000000..f1a96bd Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/tr/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/tr/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/tr/LC_MESSAGES/django.po new file mode 100644 index 0000000..f7b9195 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/tr/LC_MESSAGES/django.po @@ -0,0 +1,729 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# BouRock, 2015-2020 +# 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: 2020-07-14 19:53+0200\n" +"PO-Revision-Date: 2020-07-15 08:30+0000\n" +"Last-Translator: BouRock\n" +"Language-Team: Turkish (http://www.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 "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 "Are you sure?" +msgstr "Emin misiniz?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Seçili %(verbose_name_plural)s nesnelerini 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." + +#, 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 added successfully. You may edit it again below." +msgstr "" +"{name} “{obj}” başarılı olarak eklendi. 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" + +#, 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" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "%(name)s uygulamasındaki modeller" + +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 "" +"First, enter a username and password. Then, you’ll be able to edit more user " +"options." +msgstr "" +"Önce, bir kullanıcı adı ve parola girin. Ondan sonra, daha fazla kullanıcı " +"seçeneğini düzenleyebileceksiniz." + +msgid "Enter a username and password." +msgstr "Kullanıcı adı ve parola girin." + +msgid "Change password" +msgstr "Parolayı değiştir" + +msgid "Please correct the error below." +msgstr "Lütfen aşağıdaki hataları düzeltin." + +msgid "Please correct the errors below." +msgstr "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 "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 "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 "Delete" +msgstr "Sil" + +#, 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" + +msgid "Delete multiple objects" +msgstr "Birden fazla nesneyi sil" + +#, 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 "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 password or username?" +msgstr "Kullanıcı adınızı veya parolanızı mı unuttunuz?" + +msgid "Toggle navigation" +msgstr "Gezinmeyi aç/kapat" + +msgid "Date/time" +msgstr "Tarih/saat" + +msgid "User" +msgstr "Kullanıcı" + +msgid "Action" +msgstr "Eylem" + +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" + +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 "Your username, in case you’ve forgotten:" +msgstr "Unutma ihtimalinize karşı, kullanıcı adınız:" + +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 "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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/tr/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/tr/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..aff5543 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/tr/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/tr/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/tr/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..354c99b --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/tr/LC_MESSAGES/djangojs.po @@ -0,0 +1,269 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# BouRock, 2015-2016,2019-2021 +# 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: 2021-01-15 09:00+0100\n" +"PO-Revision-Date: 2021-01-16 19:30+0000\n" +"Last-Translator: BouRock\n" +"Language-Team: Turkish (http://www.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 "" +"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 mevcut %s listesidir. Aşağıdaki kutudan bazılarını işaretleyerek ve ondan " +"sonra iki kutu arasındaki \"Seçin\" okuna tıklayarak seçebilirsiniz." + +#, 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ç" + +msgid "Choose all" +msgstr "Tümünü seçin" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "Bir kerede tüm %s seçilmesi için tıklayın." + +msgid "Choose" +msgstr "Seçin" + +msgid "Remove" +msgstr "Kaldır" + +#, javascript-format +msgid "Chosen %s" +msgstr "Seçilen %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 seçilen %s listesidir. Aşağıdaki kutudan bazılarını işaretleyerek ve " +"ondan sonra iki kutu arasındaki \"Kaldır\" okuna tıklayarak " +"kaldırabilirsiniz." + +msgid "Remove all" +msgstr "Tümünü kaldır" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "Bir kerede tüm seçilen %s kaldırılması için tıklayın." + +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" + +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" + +msgid "Show" +msgstr "Göster" + +msgid "Hide" +msgstr "Gizle" diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/tt/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/tt/LC_MESSAGES/django.mo new file mode 100644 index 0000000..6bfde60 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/tt/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/tt/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/tt/LC_MESSAGES/django.po new file mode 100644 index 0000000..9d0260b --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/tt/LC_MESSAGES/django.po @@ -0,0 +1,655 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/tt/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/tt/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..16af5a0 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/tt/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/tt/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/tt/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..36e7c72 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/tt/LC_MESSAGES/djangojs.po @@ -0,0 +1,208 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/udm/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/udm/LC_MESSAGES/django.mo new file mode 100644 index 0000000..d51b11a Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/udm/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/udm/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/udm/LC_MESSAGES/django.po new file mode 100644 index 0000000..df03f5f --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/udm/LC_MESSAGES/django.po @@ -0,0 +1,606 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/udm/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/udm/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..af7ab53 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/udm/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/udm/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/udm/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..e3826f0 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/udm/LC_MESSAGES/djangojs.po @@ -0,0 +1,142 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/uk/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/uk/LC_MESSAGES/django.mo new file mode 100644 index 0000000..731bd86 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/uk/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/uk/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/uk/LC_MESSAGES/django.po new file mode 100644 index 0000000..593ccc3 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/uk/LC_MESSAGES/django.po @@ -0,0 +1,730 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Oleksandr Chernihov , 2014 +# Andriy Sokolovskiy , 2015 +# Boryslav Larin , 2011 +# Денис Подлесный , 2016 +# Igor Melnyk, 2014,2017 +# Ivan Dmytrenko , 2019 +# Jannis Leidel , 2011 +# Kirill Gagarski , 2015 +# Max V. Stotsky , 2014 +# Mikhail Kolesnik , 2015 +# 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: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-02-18 21:37+0000\n" +"Last-Translator: Ivan Dmytrenko \n" +"Language-Team: Ukrainian (http://www.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 "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/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, щоб обрати більше " +"однієї опції." + +#, 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 було успішно змінено." + +#, 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 "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 "Сортувати в іншому напрямку" + +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, але вам не надано доступ до цієї " +"сторінки.\n" +"Ввійти в інший аккаунт?" + +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 результати" +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" + +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 щоб змінити" + +#, 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/uk/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/uk/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..f70d010 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/uk/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/uk/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/uk/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..502c548 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/uk/LC_MESSAGES/djangojs.po @@ -0,0 +1,230 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Oleksandr Chernihov , 2014 +# Boryslav Larin , 2011 +# Денис Подлесный , 2016 +# Jannis Leidel , 2011 +# panasoft , 2016 +# Sergey Lysach , 2011-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: Денис Подлесный \n" +"Language-Team: Ukrainian (http://www.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 "" +"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" +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 "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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ur/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ur/LC_MESSAGES/django.mo new file mode 100644 index 0000000..0735f5d Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ur/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ur/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ur/LC_MESSAGES/django.po new file mode 100644 index 0000000..81ef111 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ur/LC_MESSAGES/django.po @@ -0,0 +1,661 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ur/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ur/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..65de198 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ur/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ur/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ur/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..a4f5642 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/ur/LC_MESSAGES/djangojs.po @@ -0,0 +1,211 @@ +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/uz/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/uz/LC_MESSAGES/django.mo new file mode 100644 index 0000000..6fa3374 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/uz/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/uz/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/uz/LC_MESSAGES/django.po new file mode 100644 index 0000000..b5cdb16 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/uz/LC_MESSAGES/django.po @@ -0,0 +1,670 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Anvar Ulugov , 2020 +# Bedilbek Khamidov , 2019 +# Claude Paroz , 2019 +# Shukrullo Turgunov , 2021 +# Sukhrobbek Ismatov , 2019 +# Yet Sum , 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-03-23 11:13+0000\n" +"Last-Translator: Shukrullo Turgunov \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" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "%(verbose_name_plural)s tanlanganlarni 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 "Hammasi" + +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 "Olib tashlash" + +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 "" + +msgid "log entries" +msgstr "" + +#, 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 "" + +#, 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 "" + +#, 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 "O'zgartirish %s" + +#, python-format +msgid "View %s" +msgstr "Ko'rish %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 "" + +#. 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 "" + +#, 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." +msgstr "" + +msgid "Please correct the errors below." +msgstr "" + +#, python-format +msgid "Enter a new password for the user %(username)s." +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 "" + +msgid "History" +msgstr "" + +msgid "View on site" +msgstr "Saytda ko'rish" + +msgid "Filter" +msgstr "Saralash" + +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 "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 "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 "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 "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 "" + +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 "" + +#, 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/uz/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/uz/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..914da08 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/uz/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/uz/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/uz/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..05e4641 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/uz/LC_MESSAGES/djangojs.po @@ -0,0 +1,218 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Otabek Umurzakov , 2019 +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-12-13 21:48+0000\n" +"Last-Translator: Otabek Umurzakov \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 "" +"Siz harakatni tanladingiz, lekin hali ham o'zgartirishlaringizni alohida " +"maydonlarga saqlamadingiz. Iltimos saqlash uchun OK ni bosing. Harakatni " +"qayta ishga tushurishingiz kerak bo'ladi." + +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 "" +"Siz harakatni tanladingiz va alohida maydonlarda hech qanday o'zgartirishlar " +"kiritmadingiz. Ehtimol siz Saqlash tugmasini emas, balki O'tish tugmasini " +"qidirmoqdasiz." + +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 "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 "Ko'rsatish" + +msgid "Hide" +msgstr "Yashirish" diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/vi/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/vi/LC_MESSAGES/django.mo new file mode 100644 index 0000000..298498a Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/vi/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/vi/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/vi/LC_MESSAGES/django.po new file mode 100644 index 0000000..68fd78c --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/vi/LC_MESSAGES/django.po @@ -0,0 +1,702 @@ +# 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 +# Vuong Nguyen , 2011 +# xgenvn , 2014 +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: 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 "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?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Xóa các %(verbose_name_plural)s đã chọn" + +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 "" + +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 "" +"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 "" + +msgid "Change" +msgstr "Thay đổi" + +msgid "Deletion" +msgstr "" + +msgid "action time" +msgstr "Thời gian tác động" + +msgid "user" +msgstr "" + +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 "Đối tượng \"%(object)s.\" đã được xoá." + +msgid "LogEntry Object" +msgstr "LogEntry Object" + +#, python-brace-format +msgid "Added {name} \"{object}\"." +msgstr "{name} \"{object}\" đã được thêm vào." + +msgid "Added." +msgstr "Được thêm." + +msgid "and" +msgstr "và" + +#, 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 "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 "" +"Giữ phím \"Control\", hoặc \"Command\" trên Mac, để chọn nhiều hơn một." + +#, 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 "" +"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 "" + +#, python-format +msgid "Add %s" +msgstr "Thêm %s" + +#, python-format +msgid "Change %s" +msgstr "Thay đổi %s" + +#, python-format +msgid "View %s" +msgstr "" + +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 "Xin lỗi bạn! Trang mà bạn yêu cầu không tìm thấy." + +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" + +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 "" + +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 "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 "" + +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 "View" +msgstr "" + +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 "" + +#, 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 "You don't have permission to view or edit anything." +msgstr "" + +msgid "Recent actions" +msgstr "" + +msgid "My actions" +msgstr "" + +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 "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 "" + +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 "" + +msgid "Close" +msgstr "" + +#, python-format +msgid "Change selected %(model)s" +msgstr "" + +#, 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 website này" + +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 "" + +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 kiểm tra lại địa chỉ email mà bạn dùng để " +"đăng kí hoặc kiểm tra trong thư mục spam/rác" + +#, 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 "" + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/vi/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/vi/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..7588ed6 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/vi/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/vi/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/vi/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..d2155ca --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/vi/LC_MESSAGES/djangojs.po @@ -0,0 +1,220 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Tran , 2011 +# Tran Van , 2013 +# Vuong Nguyen , 2011 +# xgenvn , 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: 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 đã lựa chọn một hành động, nhưng bạn không lưu thay đổi của bạn đến các " +"lĩnh vực cá nhân được nêu ra. Xin vui lòng click OK để lưu lại. Bạn sẽ cần " +"phải chạy lại các hành độ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 đã lựa 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 đang tìm kiếm nút bấm Go thay vì nút bấm Save." + +#, 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 "Now" +msgstr "Bây giờ" + +msgid "Choose a Time" +msgstr "" + +msgid "Choose a time" +msgstr "Chọn 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 "" + +msgid "Cancel" +msgstr "Hủy bỏ" + +msgid "Today" +msgstr "Hôm nay" + +msgid "Choose a Date" +msgstr "" + +msgid "Yesterday" +msgstr "Hôm qua" + +msgid "Tomorrow" +msgstr "Ngày mai" + +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 "Hiện ra" + +msgid "Hide" +msgstr "Dấu đi" diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/django.mo new file mode 100644 index 0000000..1d6d75a Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/django.po new file mode 100644 index 0000000..773847b --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/django.po @@ -0,0 +1,710 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Brian Wang , 2018 +# Fulong Sun , 2016 +# 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 +# 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 +# 嘉琪 方 <370358679@qq.com>, 2020 +# Kevin Sze , 2012 +# 考证 李 , 2020 +# 雨翌 , 2016 +# Ronald White , 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-11 01:47+0000\n" +"Last-Translator: 嘉琪 方 <370358679@qq.com>\n" +"Language-Team: Chinese (China) (http://www.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 "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 "对象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 键来选择多项。" + +#, 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 个中 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 "清除选中" + +#, 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 "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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..505b8e1 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..32dfa61 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/djangojs.po @@ -0,0 +1,270 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# HuanCheng Bai白宦成 , 2018 +# Jannis Leidel , 2011 +# 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 +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-02-07 04:25+0000\n" +"Last-Translator: Veoco \n" +"Language-Team: Chinese (China) (http://www.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 的列表。你可以在选择框下面进行选择,然后点击两选框之间的“删" +"除”箭头进行删除。" + +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 "" +"你已经选择一个动作,但是你没有保存你单独修改的地方。请点击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 "十二月" + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/zh_Hant/LC_MESSAGES/django.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/zh_Hant/LC_MESSAGES/django.mo new file mode 100644 index 0000000..a96ef9a Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/zh_Hant/LC_MESSAGES/django.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/zh_Hant/LC_MESSAGES/django.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/zh_Hant/LC_MESSAGES/django.po new file mode 100644 index 0000000..a2a1d9a --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/zh_Hant/LC_MESSAGES/django.po @@ -0,0 +1,660 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Chen Chun-Chia , 2015 +# ilay , 2012 +# Jannis Leidel , 2011 +# mail6543210 , 2013-2014 +# ming hsien tzang , 2011 +# tcc , 2011 +# Tzu-ping Chung , 2016-2017 +# Yeh-Yung , 2013 +# Yeh-Yung , 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:40+0000\n" +"Last-Translator: Tzu-ping Chung \n" +"Language-Team: Chinese (Taiwan) (http://www.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 "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 "物件 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 "紀錄項目" + +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\" 或 \"Command\" (Mac),可選取多個值" + +#, 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 added successfully. You may add another {name} " +"below." +msgstr "{name} \"{obj}\" 新增成功。你可以在下方加入其他 {name}。" + +#, python-brace-format +msgid "The {name} \"{obj}\" was added successfully." +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 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" + +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 "" +"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 應用程式中的Model" + +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 "" +"您已認證為 %(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 "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 結果" + +#, 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/zh_Hant/LC_MESSAGES/djangojs.mo b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/zh_Hant/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..9368f69 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/zh_Hant/LC_MESSAGES/djangojs.mo differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/zh_Hant/LC_MESSAGES/djangojs.po b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/zh_Hant/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..48739ec --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/locale/zh_Hant/LC_MESSAGES/djangojs.po @@ -0,0 +1,213 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# ilay , 2012 +# mail6543210 , 2013 +# tcc , 2011 +# Tzu-ping Chung , 2016 +# Yeh-Yung , 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: Tzu-ping Chung \n" +"Language-Team: Chinese (Taiwan) (http://www.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 "" +"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 "" +"你已選了一個動作, 但有一個可編輯欄位的變更尚未儲存。請點選 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] "備註:您的電腦時間比伺服器快 %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 "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 "下午 6 點" + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/migrations/0001_initial.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/migrations/0001_initial.py new file mode 100644 index 0000000..78cd7a7 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/migrations/0001_initial.py @@ -0,0 +1,47 @@ +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( + to_field='id', + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/migrations/0002_logentry_remove_auto_add.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/migrations/0002_logentry_remove_auto_add.py new file mode 100644 index 0000000..a2b1916 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/migrations/0002_logentry_remove_auto_add.py @@ -0,0 +1,22 @@ +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/migrations/0003_logentry_add_action_flag_choices.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/migrations/0003_logentry_add_action_flag_choices.py new file mode 100644 index 0000000..a041a9d --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/migrations/0003_logentry_add_action_flag_choices.py @@ -0,0 +1,20 @@ +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/migrations/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/models.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/models.py new file mode 100644 index 0000000..a0fbb02 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/models.py @@ -0,0 +1,150 @@ +import json + +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.text import get_text_list +from django.utils.translation import gettext, 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=''): + 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, + ) + + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/options.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/options.py new file mode 100644 index 0000000..6eba48f --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/options.py @@ -0,0 +1,2204 @@ +import copy +import json +import operator +import re +from functools import partial, reduce, update_wrapper +from urllib.parse import quote as urlquote + +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.decorators import display +from django.contrib.admin.exceptions import DisallowedModelAdminToField +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_needs_distinct, 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.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.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 _, ngettext +from django.views.decorators.csrf import csrf_protect +from django.views.generic import RedirectView + +IS_POPUP_VAR = '_popup' +TO_FIELD_VAR = '_to_field' + + +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: + related_modeladmin = self.admin_site._registry.get(db_field.remote_field.model) + wrapper_kwargs = {} + if related_modeladmin: + wrapper_kwargs.update( + 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). + """ + related_admin = self.admin_site._registry.get(db_field.remote_field.model) + if related_admin is not None: + 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'] = _('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 + 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 + }) + + 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) + + def lookup_allowed(self, lookup, value): + 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 + for part in lookup.split(LOOKUP_SEP): + try: + field = model._meta.get_field(part) + except FieldDoesNotExist: + # Lookups on nonexistent fields are ok, since they're ignored + # later. + break + # It is allowed to filter on values that would be found from local + # model anyways. For example, if you filter on employee__department__id, + # then the id value would be found already from employee__department_id. + if not prev_field or (prev_field.is_relation and + field not in prev_field.get_path_info()[-1].target_fields): + relation_parts.append(part) + if not getattr(field, 'get_path_info', None): + # This is not a relational field, so further parts + # must be transforms. + break + prev_field = field + model = field.get_path_info()[-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} + for filter_item in self.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. + """ + opts = self.model._meta + + try: + field = 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 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 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 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 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 = () + date_hierarchy = None + save_as = False + save_as_continue = True + save_on_top = False + paginator = Paginator + preserve_filters = True + 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.model._meta.app_label, self.__class__.__name__) + + 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.model._meta.app_label, self.model._meta.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, + ) + + 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, object, 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_action( + user_id=request.user.pk, + content_type_id=get_content_type_for_model(object).pk, + object_id=object.pk, + object_repr=str(object), + action_flag=ADDITION, + change_message=message, + ) + + def log_change(self, request, object, 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_action( + user_id=request.user.pk, + content_type_id=get_content_type_for_model(object).pk, + object_id=object.pk, + object_repr=str(object), + action_flag=CHANGE, + change_message=message, + ) + + def log_deletion(self, request, object, 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. + """ + 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(object).pk, + object_id=object.pk, + object_repr=object_repr, + action_flag=DELETION, + ) + + @display(description=mark_safe('')) + def action_checkbox(self, obj): + """ + A list_display column containing a checkbox widget. + """ + return helpers.checkbox.render(helpers.ACTION_CHECKBOX_NAME, str(obj.pk)) + + @staticmethod + def _get_action_description(func, name): + return getattr(func, 'short_description', 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[1:] + elif field_name.startswith('='): + return "%s__iexact" % field_name[1:] + elif field_name.startswith('@'): + return "%s__search" % field_name[1:] + # 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 path_part in 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): + return field_name + else: + prev_field = field + if hasattr(field, 'get_path_info'): + # Update opts to follow the relation. + opts = field.get_path_info()[-1].to_opts + # Otherwise, use the field with icontains. + return "%s__icontains" % field_name + + may_have_duplicates = False + search_fields = self.get_search_fields(request) + if search_fields and search_term: + orm_lookups = [construct_search(str(search_field)) + for search_field in search_fields] + for bit in smart_split(search_term): + if bit.startswith(('"', "'")) and bit[0] == bit[-1]: + bit = unescape_string_literal(bit) + or_queries = [models.Q(**{orm_lookup: bit}) + for orm_lookup in orm_lookups] + queryset = queryset.filter(reduce(operator.or_, or_queries)) + may_have_duplicates |= any( + lookup_needs_distinct(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: + opts = self.model._meta + current_url = '%s:%s' % (match.app_name, match.url_name) + changelist_url = 'admin:%s_%s_changelist' % (opts.app_label, 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): + opts = self.model._meta + app_label = opts.app_label + preserved_filters = self.get_preserved_filters(request) + form_url = add_preserved_filters({'preserved_filters': preserved_filters, 'opts': 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': 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, opts.model_name), + "admin/%s/change_form.html" % app_label, + "admin/change_form.html" + ], context) + + 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) + 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, '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, '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.model._meta + preserved_filters = self.get_preserved_filters(request) + + 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, 'opts': opts}, redirect_url) + return HttpResponseRedirect(redirect_url) + + elif "_saveasnew" in request.POST: + msg = format_html( + _('The {name} “{obj}” was added successfully. You may edit it again below.'), + **msg_dict + ) + self.message_user(request, msg, messages.SUCCESS) + redirect_url = reverse('admin:%s_%s_change' % + (opts.app_label, opts.model_name), + args=(obj.pk,), + current_app=self.admin_site.name) + redirect_url = add_preserved_filters({'preserved_filters': preserved_filters, '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, '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): + opts = self.model._meta + if self.has_view_or_change_permission(request): + post_url = reverse('admin:%s_%s_changelist' % + (opts.app_label, 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': 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. + """ + opts = self.model._meta + + 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' % (opts.app_label, opts.model_name), + 'admin/%s/popup_response.html' % 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': opts.verbose_name, + 'obj': obj_display, + }, + messages.SUCCESS, + ) + + if self.has_change_permission(request, None): + post_url = reverse( + 'admin:%s_%s_changelist' % (opts.app_label, 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': 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): + opts = self.model._meta + app_label = 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, 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 overide 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.model._meta.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): + 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) + + model = self.model + opts = model._meta + + 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, 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) + form_validated = form.is_valid() + if form_validated: + new_object = self.save_form(request, form, change=not add) + else: + new_object = form.instance + formsets, inline_instances = self._create_formsets(request, new_object, change=not add) + 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) + adminForm = 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 + adminForm.media + + inline_formsets = self.get_inline_formsets(request, formsets, inline_instances, obj) + for inline_formset in inline_formsets: + media = 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 % opts.verbose_name, + 'subtitle': str(obj) if obj else None, + 'adminform': adminForm, + '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.model._meta.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 + opts = self.model._meta + app_label = 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 + 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(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(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, 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): + 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." + opts = self.model._meta + app_label = 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, 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 opts.pk.attname + obj_id = obj.serializable_value(attr) + self.log_deletion(request, obj, obj_display) + self.delete_model(request, obj) + + return self.response_delete(request, obj_display, obj_id) + + object_name = str(opts.verbose_name) + + if perms_needed or protected: + title = _("Cannot delete %(name)s") % {"name": object_name} + else: + title = _("Are you sure?") + + 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': 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 + + # 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. + opts = model._meta + app_label = 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') + + context = { + **self.admin_site.each_context(request), + 'title': _('Change history: %s') % obj, + 'subtitle': None, + 'action_list': action_list, + 'module_name': str(capfirst(opts.verbose_name_plural)), + 'object': obj, + 'opts': 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, opts.model_name), + "admin/%s/object_history.html" % app_label, + "admin/object_history.html" + ], context) + + 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 = { + '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 + }) + formset = FormSet(**formset_params) + + def user_deleted_form(request, obj, formset, index): + """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): + 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 is None: + self.verbose_name = self.model._meta.verbose_name + if self.verbose_name_plural is None: + self.verbose_name_plural = self.model._meta.verbose_name_plural + + @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']) + if self.classes and 'collapse' in self.classes: + js.append('collapse.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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/sites.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/sites.py new file mode 100644 index 0000000..3d9492e --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/sites.py @@ -0,0 +1,569 @@ +import re +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.views.autocomplete import AutocompleteJsonView +from django.contrib.auth import REDIRECT_FIELD_NAME +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 +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 _, 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 AlreadyRegistered(Exception): + pass + + +class NotRegistered(Exception): + pass + + +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 <h1>. + 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 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 in self._registry: + registered_admin = str(self._registry[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.' % re.sub(r'\.ModelAdmin$', '', registered_admin) + 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 model not in self._registry: + 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 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 + 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/<int: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, + } + + 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) + + @never_cache + 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) + + @never_cache + 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'), + '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('%s/' % request.path) + 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 = { + '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], + } + + if label: + return app_dict.get(label) + return app_dict + + def get_app_list(self, request): + """ + Return a sorted list of all the installed apps that have been + registered in this site. + """ + app_dict = self._build_app_dict(request) + + # 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 + + @never_cache + 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_dict = self._build_app_dict(request, app_label) + if not app_dict: + raise Http404('The requested admin page does not exist.') + # Sort the models alphabetically within each app. + app_dict['models'].sort(key=lambda x: x['name']) + context = { + **self.each_context(request), + 'title': _('%(app)s administration') % {'app': app_dict['name']}, + 'subtitle': None, + 'app_list': [app_dict], + '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) + + +class DefaultAdminSite(LazyObject): + def _setup(self): + AdminSiteClass = import_string(apps.get_app_config('admin').default_site) + self._wrapped = AdminSiteClass() + + +# 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/css/autocomplete.css b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/css/autocomplete.css new file mode 100644 index 0000000..69c94e7 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/css/autocomplete.css @@ -0,0 +1,275 @@ +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; +} diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/css/base.css b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/css/base.css new file mode 100644 index 0000000..1cb3acd --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/css/base.css @@ -0,0 +1,1052 @@ +/* + DJANGO Admin styles +*/ + +@import url(fonts.css); + +/* VARIABLE DEFINITIONS */ +:root { + --primary: #79aec8; + --secondary: #417690; + --accent: #f5dd5d; + --primary-fg: #fff; + + --body-fg: #333; + --body-bg: #fff; + --body-quiet-color: #666; + --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: var(--primary); + + --link-fg: #447e9b; + --link-hover-color: #036; + --link-selected-fg: #5b80b2; + + --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(--primary); + --button-hover-bg: #609ab6; + --default-button-bg: var(--secondary); + --default-button-hover-bg: #205067; + --close-button-bg: #888; /* Previously #bbb, contrast 1.92 */ + --close-button-hover-bg: #747474; + --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); +} + +@media (prefers-color-scheme: dark) { + :root { + --primary: #264b5d; + --primary-fg: #eee; + + --body-fg: #eeeeee; + --body-bg: #121212; + --body-quiet-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; + } +} + +html, body { + height: 100%; +} + +body { + margin: 0; + padding: 0; + font-size: 14px; + font-family: "Roboto","Lucida Grande","DejaVu Sans","Bitstream Vera Sans",Verdana,Arial,sans-serif; + 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: 20px; + color: var(--body-quiet-color); +} + +h2 { + font-size: 16px; + margin: 1em 0 .5em 0; +} + +h2.subhead { + font-weight: normal; + margin-top: 0; +} + +h3 { + font-size: 14px; + margin: .8em 0 .3em 0; + color: var(--body-quiet-color); + font-weight: bold; +} + +h4 { + font-size: 12px; + margin: 1em 0 .8em 0; + padding-bottom: 3px; +} + +h5 { + font-size: 10px; + 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: 13px; + line-height: 20px; +} + +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); +} + +blockquote { + font-size: 11px; + color: #777; + margin-left: 2px; + padding-left: 10px; + border-left: 5px solid #ddd; +} + +code, pre { + font-family: "Bitstream Vera Sans Mono", Monaco, "Courier New", Courier, monospace; + color: var(--body-quiet-color); + font-size: 12px; + 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; + font-size: 1px; + line-height: 1px; +} + +/* TEXT STYLES & MODIFIERS */ + +.small { + font-size: 11px; +} + +.mini { + font-size: 10px; +} + +.help, p.help, form p.help, div.help, form div.help, div.help li { + font-size: 11px; + 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; +} + +/* TABLES */ + +table { + border-collapse: collapse; + border-color: var(--border-color); +} + +td, th { + font-size: 13px; + line-height: 16px; + border-bottom: 1px solid var(--hairline-color); + vertical-align: top; + padding: 8px; +} + +th { + font-weight: 600; + text-align: left; +} + +thead th, +tfoot td { + color: var(--body-quiet-color); + padding: 5px 10px; + font-size: 11px; + 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 { + color: var(--body-loud-color); +} + +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: 18px; + 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: "Roboto", "Lucida Grande", Verdana, Arial, sans-serif; + font-weight: normal; + font-size: 13px; +} +.form-row div.help { + padding: 2px 3px; +} + +textarea { + vertical-align: top; +} + +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); +} + +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: 30px; +} + +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 { + float: right; + 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: 13px; + text-align: left; + background: var(--primary); + color: var(--header-link-color); +} + +.module caption, +.inline-group h2 { + font-size: 12px; + 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: 13px; + 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); +} + +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: 14px; + 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: 13px; + 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: 12px; + 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; +} + +.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: 10px; + font-weight: bold; + padding-left: 0; + float: right; + position: relative; + margin-top: -48px; +} + +.object-tools li { + display: block; + float: left; + margin-left: 5px; + height: 16px; +} + +.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: 11px; + 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 */ + +table#change-history { + width: 100%; +} + +table#change-history tbody th { + width: 16em; +} + +/* PAGE STRUCTURE */ + +#container { + position: relative; + width: 100%; + min-width: 980px; + padding: 0; + display: flex; + flex-direction: column; + height: 100%; +} + +#container > div { + flex-shrink: 0; +} + +#container > .main { + display: flex; + flex: 1 0 auto; +} + +.main > .content { + flex: 1 0; + max-width: 100%; +} + +#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; +} + +#footer { + clear: both; + padding: 10px; +} + +/* 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); + overflow: hidden; +} + +#header a:link, #header a:visited { + color: var(--header-link-color); +} + +#header a:focus , #header a:hover { + text-decoration: underline; +} + +#branding { + float: left; +} + +#branding h1 { + padding: 0; + margin: 0 20px 0 0; + font-weight: 300; + font-size: 24px; + color: var(--accent); +} + +#branding h1, #branding h1 a:link, #branding h1 a:visited { + color: var(--accent); +} + +#branding h2 { + padding: 0 10px; + font-size: 14px; + margin: -8px 0 8px 0; + font-weight: normal; + color: var(--header-color); +} + +#branding a:hover { + text-decoration: none; +} + +#user-tools { + float: right; + padding: 0; + margin: 0 0 0 20px; + font-weight: 300; + font-size: 11px; + letter-spacing: 0.5px; + text-transform: uppercase; + text-align: right; +} + +#user-tools a { + border-bottom: 1px solid rgba(255, 255, 255, 0.25); +} + +#user-tools a:focus, #user-tools a:hover { + text-decoration: none; + border-bottom-color: var(--primary); + color: var(--primary); +} + +/* 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: 13px; +} + +#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: 18px; + 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: 15px; + line-height: 15px; + 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; +} diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/css/changelists.css b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/css/changelists.css new file mode 100644 index 0000000..b4a1557 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/css/changelists.css @@ -0,0 +1,351 @@ +/* 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: 14px; + padding: 5px; + color: var(--body-fg); +} + +#toolbar #searchbar { + height: 19px; + border: 1px solid var(--border-color); + padding: 2px 5px; + margin: 0; + vertical-align: top; + font-size: 13px; + 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: 13px; + 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; +} + +/* FILTER COLUMN */ + +#changelist-filter { + flex: 0 0 240px; + order: 1; + background: var(--darkened-bg); + border-left: none; + margin: 0 0 0 30px; +} + +#changelist-filter h2 { + font-size: 14px; + text-transform: uppercase; + letter-spacing: 0.5px; + padding: 5px 15px; + margin-bottom: 12px; + border-bottom: none; +} + +#changelist-filter h3 { + font-weight: 400; + padding: 0 15px; + margin-bottom: 10px; +} + +#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); + text-overflow: ellipsis; + overflow-x: hidden; +} + +#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-clear a { + font-size: 13px; + padding-bottom: 10px; + border-bottom: 1px solid var(--hairline-color); +} + +/* DATE DRILLDOWN */ + +.change-list ul.toplinks { + display: block; + float: left; + padding: 0; + margin: 0; + width: 100%; +} + +.change-list ul.toplinks li { + padding: 3px 6px; + font-weight: bold; + list-style-type: none; + display: inline-block; +} + +.change-list ul.toplinks .date-back a { + color: var(--body-quiet-color); +} + +.change-list ul.toplinks .date-back a:focus, +.change-list ul.toplinks .date-back a:hover { + color: var(--link-hover-color); +} + +/* PAGINATOR */ + +.paginator { + font-size: 13px; + padding-top: 10px; + padding-bottom: 10px; + line-height: 22px; + margin: 0; + border-top: 1px solid var(--hairline-color); + width: 100%; +} + +.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: 13px; + vertical-align: top; +} + +.paginator a:focus, .paginator a:hover { + color: white; + background: var(--link-hover-color); +} + +/* ACTIONS */ + +.filtered .actions { + border-right: none; +} + +#changelist table input { + margin: 0; + vertical-align: baseline; +} + +#changelist table tbody tr.selected { + background-color: var(--selected-row); +} + +#changelist .actions { + padding: 10px; + background: var(--body-bg); + border-top: none; + border-bottom: none; + line-height: 24px; + color: var(--body-quiet-color); + width: 100%; +} + +#changelist .actions.selected { /* XXX Probably unused? */ + background: var(--body-bg); + border-top: 1px solid var(--body-bg); + border-bottom: 1px solid #edecd6; +} + +#changelist .actions span.all, +#changelist .actions span.action-counter, +#changelist .actions span.clear, +#changelist .actions span.question { + font-size: 13px; + margin: 0 0.5em; +} + +#changelist .actions:last-child { + border-bottom: none; +} + +#changelist .actions select { + vertical-align: top; + height: 24px; + color: var(--body-fg); + border: 1px solid var(--border-color); + border-radius: 4px; + font-size: 14px; + 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: 13px; +} + +#changelist .actions .button { + font-size: 13px; + 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: 24px; + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/css/dashboard.css b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/css/dashboard.css new file mode 100644 index 0000000..91d6efd --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/css/dashboard.css @@ -0,0 +1,26 @@ +/* DASHBOARD */ + +.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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/css/fonts.css b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/css/fonts.css new file mode 100644 index 0000000..c837e01 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/css/fonts.css @@ -0,0 +1,20 @@ +@font-face { + font-family: 'Roboto'; + src: url('../fonts/Roboto-Bold-webfont.woff'); + font-weight: 700; + font-style: normal; +} + +@font-face { + font-family: 'Roboto'; + src: url('../fonts/Roboto-Regular-webfont.woff'); + font-weight: 400; + font-style: normal; +} + +@font-face { + font-family: 'Roboto'; + src: url('../fonts/Roboto-Light-webfont.woff'); + font-weight: 300; + font-style: normal; +} diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/css/forms.css b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/css/forms.css new file mode 100644 index 0000000..89b2270 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/css/forms.css @@ -0,0 +1,523 @@ +@import url('widgets.css'); + +/* FORM ROWS */ + +.form-row { + overflow: hidden; + padding: 10px; + font-size: 13px; + 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; +} + +/* FORM LABELS */ + +label { + font-weight: normal; + color: var(--body-quiet-color); + font-size: 13px; +} + +.required label, label.required { + font-weight: bold; + color: var(--body-fg); +} + +/* RADIO BUTTONS */ + +form ul.radiolist li { + list-style-type: none; +} + +form ul.radiolist label { + float: none; + display: inline; +} + +form ul.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; +} + +/* ALIGNED FIELDSETS */ + +.aligned label { + display: block; + padding: 4px 10px 0 0; + float: left; + width: 160px; + word-wrap: break-word; + line-height: 1; +} + +.aligned label:not(.vCheckboxLabel):after { + content: ''; + display: inline-block; + vertical-align: middle; + height: 26px; +} + +.aligned label + p, .aligned label + div.help, .aligned label + div.readonly { + padding: 6px 0; + margin-top: 0; + margin-bottom: 0; + margin-left: 170px; +} + +.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 ul.radiolist { + display: inline-block; + margin: 0; + padding: 0; +} + +form .aligned p.help, +form .aligned div.help { + clear: left; + margin-top: 0; + margin-left: 160px; + padding-left: 10px; +} + +form .aligned label + p.help, +form .aligned label + div.help { + margin-left: 0; + padding-left: 0; +} + +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 ul li { + list-style: none; +} + +form .aligned table p { + margin-left: 0; + padding-left: 0; +} + +.aligned .vCheckboxLabel { + float: none; + width: auto; + display: inline-block; + vertical-align: -3px; + padding: 0 0 5px 5px; +} + +.aligned .vCheckboxLabel + p.help, +.aligned .vCheckboxLabel + div.help { + margin-top: -4px; +} + +.colM .aligned .vLargeTextField, .colM .aligned .vXMLLargeTextField { + width: 610px; +} + +.checkbox-row p.help, +.checkbox-row div.help { + margin-left: 0; + padding-left: 0; +} + +fieldset .fieldBox { + float: left; + margin-right: 20px; +} + +/* WIDE FIELDSETS */ + +.wide label { + width: 200px; +} + +form .wide p, +form .wide input + p.help, +form .wide input + div.help { + margin-left: 200px; +} + +form .wide p.help, +form .wide div.help { + padding-left: 38px; +} + +form div.help ul { + padding-left: 0; + margin-left: 0; +} + +.colM fieldset.wide .vLargeTextField, .colM fieldset.wide .vXMLLargeTextField { + width: 450px; +} + +/* COLLAPSED FIELDSETS */ + +fieldset.collapsed * { + display: none; +} + +fieldset.collapsed h2, fieldset.collapsed { + display: block; +} + +fieldset.collapsed { + border: 1px solid var(--hairline-color); + border-radius: 4px; + overflow: hidden; +} + +fieldset.collapsed h2 { + background: var(--darkened-bg); + color: var(--body-quiet-color); +} + +fieldset .collapse-toggle { + color: var(--header-link-color); +} + +fieldset.collapsed .collapse-toggle { + background: transparent; + display: inline; + color: var(--link-fg); +} + +/* MONOSPACE TEXTAREAS */ + +fieldset.monospace textarea { + font-family: "Bitstream Vera Sans Mono", Monaco, "Courier New", Courier, monospace; +} + +/* SUBMIT ROW */ + +.submit-row { + padding: 12px 14px; + margin: 0 0 20px; + background: var(--darkened-bg); + border: 1px solid var(--hairline-color); + border-radius: 4px; + text-align: right; + overflow: hidden; +} + +body.popup .submit-row { + overflow: auto; +} + +.submit-row input { + height: 35px; + line-height: 15px; + margin: 0 0 0 5px; +} + +.submit-row input.default { + margin: 0 0 0 8px; + text-transform: uppercase; +} + +.submit-row p { + margin: 0.3em; +} + +.submit-row p.deletelink-box { + float: left; + margin: 0; +} + +.submit-row a.deletelink { + display: block; + background: var(--delete-button-bg); + border-radius: 4px; + padding: 10px 15px; + height: 15px; + line-height: 15px; + color: var(--button-fg); +} + +.submit-row a.closelink { + display: inline-block; + background: var(--close-button-bg); + border-radius: 4px; + padding: 10px 15px; + height: 15px; + line-height: 15px; + margin: 0 0 0 5px; + 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); +} + +.submit-row a.closelink:focus, +.submit-row a.closelink:hover, +.submit-row a.closelink:active { + background: var(--close-button-hover-bg); +} + +/* 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; +} + +.vTextField, .vUUIDField { + width: 20em; +} + +.vIntegerField { + width: 5em; +} + +.vBigIntegerField { + width: 10em; +} + +.vForeignKeyRawIdAdminField { + width: 5em; +} + +/* 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 h3 { + margin: 0; + color: var(--body-quiet-color); + padding: 5px; + font-size: 13px; + background: var(--darkened-bg); + border-top: 1px solid var(--hairline-color); + border-bottom: 1px solid var(--hairline-color); +} + +.inline-related h3 span.delete { + float: right; +} + +.inline-related h3 span.delete label { + margin-left: 2px; + font-size: 11px; +} + +.inline-related fieldset { + margin: 0; + background: var(--body-bg); + border: none; + width: 100%; +} + +.inline-related fieldset.module h3 { + margin: 0; + padding: 2px 5px 3px 5px; + font-size: 11px; + text-align: left; + font-weight: bold; + background: #bcd; + color: var(--body-bg); +} + +.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: 9px; + font-weight: bold; + color: var(--body-quiet-color); + _width: 700px; +} + +.inline-group ul.tools { + padding: 0; + margin: 0; + list-style: none; +} + +.inline-group ul.tools li { + display: inline; + padding: 0 5px; +} + +.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 ul.tools a.add, +.inline-group div.add-row a, +.inline-group .tabular tr.add-row td a { + background: url(../img/icon-addlink.svg) 0 1px no-repeat; + padding-left: 16px; + font-size: 12px; +} + +.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: 16px; + height: 16px; + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/css/login.css b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/css/login.css new file mode 100644 index 0000000..10d9d22 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/css/login.css @@ -0,0 +1,60 @@ +/* LOGIN FORM */ + +.login { + background: var(--darkened-bg); + height: auto; +} + +.login #header { + height: auto; + padding: 15px 16px; + justify-content: center; +} + +.login #header h1 { + font-size: 18px; +} + +.login #header h1 a { + color: var(--header-link-color); +} + +.login #content { + padding: 20px 20px 0; +} + +.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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/css/nav_sidebar.css b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/css/nav_sidebar.css new file mode 100644 index 0000000..f3c2fd8 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/css/nav_sidebar.css @@ -0,0 +1,120 @@ +.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: 20px; + 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.shifted > #nav-sidebar { + left: 24px; + margin-left: 0; +} + +[dir="rtl"] .main.shifted > #nav-sidebar { + left: 0; + right: 24px; + 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); +} + +.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%; + } +} diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/css/responsive.css b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/css/responsive.css new file mode 100644 index 0000000..8c6dd81 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/css/responsive.css @@ -0,0 +1,1003 @@ +/* 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: 14px; + } + + .small { + font-size: 12px; + } + + /* Layout */ + + #container { + min-width: 0; + } + + #content { + padding: 20px 30px 30px; + } + + div.breadcrumbs { + padding: 10px 30px; + } + + /* Header */ + + #header { + flex-direction: column; + padding: 15px 30px; + justify-content: flex-start; + } + + #branding h1 { + margin: 0 0 8px; + font-size: 20px; + 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: 13px; + } + + /* Changelist */ + + #toolbar { + border: none; + padding: 15px; + } + + #changelist-search > div { + display: flex; + flex-wrap: nowrap; + max-width: 480px; + } + + #changelist-search label { + line-height: 22px; + } + + #toolbar form #searchbar { + flex: 1 0 auto; + width: 0; + height: 22px; + 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.selected { + border: none; + } + + #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: 11px; + 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: 14px; + } + + .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: 36px; + font-size: 14px; + } + + .form-row select { + height: 36px; + } + + .form-row select[multiple] { + height: auto; + min-height: 0; + } + + fieldset .fieldBox { + float: none; + margin: 0 -10px; + padding: 0 10px; + } + + 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 ul.radiolist { + margin-left: 2px; + } + + /* Related widget */ + + .related-widget-wrapper { + float: none; + } + + .related-widget-wrapper-link + .selector { + max-width: calc(100% - 30px); + margin-right: 15px; + } + + select + .related-widget-wrapper-link, + .related-widget-wrapper-link + .related-widget-wrapper-link { + margin-left: 10px; + } + + /* Selector */ + + .selector { + display: flex; + width: 100%; + } + + .selector .selector-filter { + display: flex; + align-items: center; + } + + .selector .selector-filter label { + margin: 0 8px 0 0; + } + + .selector .selector-filter input { + width: auto; + 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 ul.selector-chooser { + width: 26px; + height: 52px; + padding: 2px 0; + margin: auto 15px; + border-radius: 20px; + transform: translateY(-10px); + } + + .selector-add, .selector-remove { + width: 20px; + height: 20px; + background-size: 20px auto; + } + + .selector-add { + background-position: 0 -120px; + } + + .selector-remove { + background-position: 0 -80px; + } + + a.selector-chooseall, a.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 { + width: 52px; + height: 26px; + padding: 0 2px; + margin: 15px auto; + transform: none; + } + + .stacked .selector-chooser li { + padding: 3px; + } + + .stacked .selector-add, .stacked .selector-remove { + background-size: 20px auto; + } + + .stacked .selector-add { + background-position: 0 -40px; + } + + .stacked .active.selector-add { + background-position: 0 -40px; + } + + .active.selector-add:focus, .active.selector-add:hover { + background-position: 0 -140px; + } + + .stacked .active.selector-add:focus, .stacked .active.selector-add:hover { + background-position: 0 -60px; + } + + .stacked .selector-remove { + background-position: 0 0; + } + + .stacked .active.selector-remove { + background-position: 0 0; + } + + .active.selector-remove:focus, .active.selector-remove:hover { + background-position: 0 -100px; + } + + .stacked .active.selector-remove:focus, .stacked .active.selector-remove:hover { + background-position: 0 -20px; + } + + .help-tooltip, .selector .help-icon { + display: none; + } + + form .form-row p.datetime { + width: 100%; + } + + .datetime input { + width: 50%; + max-width: 120px; + } + + .datetime span { + font-size: 13px; + } + + .datetime .timezonewarning { + display: block; + font-size: 11px; + 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 #branding h1 { + 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, #footer { + padding: 15px; + } + + #footer:empty { + padding: 0; + } + + 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: 16px; + } + + /* 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 { + display: flex; + flex-wrap: wrap; + max-width: 100vw; + } + + .aligned .form-row > div { + width: calc(100vw - 30px); + } + + textarea { + max-width: none; + } + + .vURLField { + width: auto; + } + + fieldset .fieldBox + .fieldBox { + margin-top: 15px; + padding-top: 15px; + } + + fieldset.collapsed .form-row { + display: none; + } + + .aligned label { + width: 100%; + 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 { + align-items: center; + } + + .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 { + margin-left: 0; + font-size: 13px; + } + + span.clearable-file-input { + margin-left: 15px; + } + + span.clearable-file-input label { + font-size: 13px; + 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 { + margin-left: 0; + padding-left: 0; + } + + form .aligned ul.radiolist { + margin-right: 15px; + margin-bottom: -3px; + } + + form .aligned ul.radiolist:not(.inline) li + li { + margin-top: 5px; + } + + /* Related widget */ + + .related-widget-wrapper { + width: 100%; + display: flex; + align-items: flex-start; + } + + .related-widget-wrapper .selector { + order: 1; + } + + .related-widget-wrapper > a { + order: 2; + } + + .related-widget-wrapper .radiolist ~ a { + align-self: flex-end; + } + + .related-widget-wrapper > select ~ a { + align-self: center; + } + + select + .related-widget-wrapper-link, + .related-widget-wrapper-link + .related-widget-wrapper-link { + margin-left: 15px; + } + + /* Selector */ + + .selector { + flex-direction: column; + } + + .selector > * { + float: none; + } + + .selector-available, .selector-chosen { + margin-bottom: 0; + flex: 1 1 auto; + } + + .selector select { + max-height: 96px; + } + + .selector ul.selector-chooser { + display: block; + float: none; + width: 52px; + height: 26px; + padding: 0 2px; + margin: 15px auto 20px; + transform: none; + } + + .selector ul.selector-chooser li { + float: left; + } + + .selector-remove { + background-position: 0 0; + } + + .active.selector-remove:focus, .active.selector-remove:hover { + background-position: 0 -20px; + } + + .selector-add { + background-position: 0 -40px; + } + + .active.selector-add:focus, .active.selector-add:hover { + background-position: 0 -60px; + } + + /* 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 10px 0; + margin: 0 0 15px; + display: flex; + flex-direction: column; + } + + .submit-row > * { + width: 100%; + } + + .submit-row input, .submit-row input.default, .submit-row a, .submit-row a.closelink { + float: none; + margin: 0 0 10px; + text-align: center; + } + + .submit-row a.closelink { + padding: 10px 0; + } + + .submit-row p.deletelink-box { + order: 4; + } + + /* 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: 13px; + } + + /* 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: 12px; + line-height: 12px; + } + + .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: 13px; + word-break: break-word; + } + + table#change-history tbody th { + width: auto; + } + + /* Docs */ + + table.model tbody th, table.model tbody td { + font-size: 13px; + word-break: break-word; + } +} diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/css/responsive_rtl.css b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/css/responsive_rtl.css new file mode 100644 index 0000000..66d3c2f --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/css/responsive_rtl.css @@ -0,0 +1,80 @@ +/* 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 ul.tools a.add, + [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"] .related-widget-wrapper-link + .selector { + margin-right: 0; + margin-left: 15px; + } + + [dir="rtl"] .selector .selector-filter label { + margin-right: 0; + margin-left: 8px; + } + + [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 { + margin-right: 0; + } + + [dir="rtl"] #changelist-filter { + margin-left: 0; + margin-right: 0; + } +} diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/css/rtl.css b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/css/rtl.css new file mode 100644 index 0000000..0447f89 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/css/rtl.css @@ -0,0 +1,227 @@ +/* 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 { + 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; +} + +/* FORMS */ + +.aligned label { + padding: 0 0 3px 1em; + float: right; +} + +.submit-row { + text-align: left +} + +.submit-row p.deletelink-box { + float: right; +} + +.submit-row input.default { + margin-left: 0; +} + +.vDateField, .vTimeField { + margin-left: 2px; +} + +.aligned .form-row input { + margin-left: 5px; +} + +form .aligned p.help, form .aligned div.help { + clear: right; +} + +form .aligned ul { + margin-right: 163px; + margin-left: 0; +} + +form ul.inline li { + float: right; + padding-right: 0; + padding-left: 7px; +} + +input[type=submit].default, .submit-row input.default { + float: left; +} + +fieldset .fieldBox { + float: right; + 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; +} + +.calendarnav-next { + top: 0; + right: auto; + left: 10px; +} + +.calendar caption, .calendarbox h2 { + text-align: center; +} + +.selector { + float: right; +} + +.selector .selector-filter { + text-align: right; +} + +.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; +} diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/css/vendor/select2/LICENSE-SELECT2.md b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/css/vendor/select2/LICENSE-SELECT2.md new file mode 100644 index 0000000..8cb8a2b --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/css/vendor/select2/LICENSE-SELECT2.md @@ -0,0 +1,21 @@ +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/css/vendor/select2/select2.css b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/css/vendor/select2/select2.css new file mode 100644 index 0000000..750b320 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/css/vendor/select2/select2.css @@ -0,0 +1,481 @@ +.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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/css/vendor/select2/select2.min.css b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/css/vendor/select2/select2.min.css new file mode 100644 index 0000000..7c18ad5 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/css/vendor/select2/select2.min.css @@ -0,0 +1 @@ +.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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/css/widgets.css b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/css/widgets.css new file mode 100644 index 0000000..c7d6456 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/css/widgets.css @@ -0,0 +1,574 @@ +/* SELECTOR (FILTER INTERFACE) */ + +.selector { + width: 800px; + float: left; +} + +.selector select { + width: 380px; + height: 17.2em; +} + +.selector-available, .selector-chosen { + float: left; + width: 380px; + text-align: center; + margin-bottom: 5px; +} + +.selector-chosen select { + border-top: none; +} + +.selector-available h2, .selector-chosen h2 { + border: 1px solid var(--border-color); + border-radius: 4px 4px 0 0; +} + +.selector-chosen h2 { + background: var(--primary); + color: var(--header-link-color); +} + +.selector .selector-available h2 { + background: var(--darkened-bg); + color: var(--body-quiet-color); +} + +.selector .selector-filter { + border: 1px solid var(--border-color); + border-width: 0 1px; + padding: 8px; + color: var(--body-quiet-color); + font-size: 10px; + margin: 0; + text-align: left; +} + +.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; +} + +.selector .selector-available input { + width: 320px; + margin-left: 8px; +} + +.selector ul.selector-chooser { + float: left; + width: 22px; + background-color: var(--selected-bg); + border-radius: 10px; + margin: 10em 5px 0 5px; + padding: 0; +} + +.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-add, .selector-remove { + width: 16px; + height: 16px; + display: block; + text-indent: -3000px; + overflow: hidden; + cursor: default; + opacity: 0.55; +} + +.active.selector-add, .active.selector-remove { + opacity: 1; +} + +.active.selector-add:hover, .active.selector-remove:hover { + cursor: pointer; +} + +.selector-add { + background: url(../img/selector-icons.svg) 0 -96px no-repeat; +} + +.active.selector-add:focus, .active.selector-add:hover { + background-position: 0 -112px; +} + +.selector-remove { + background: url(../img/selector-icons.svg) 0 -64px no-repeat; +} + +.active.selector-remove:focus, .active.selector-remove:hover { + background-position: 0 -80px; +} + +a.selector-chooseall, a.selector-clearall { + display: inline-block; + height: 16px; + text-align: left; + margin: 1px auto 3px; + overflow: hidden; + font-weight: bold; + line-height: 16px; + color: var(--body-quiet-color); + text-decoration: none; + opacity: 0.55; +} + +a.active.selector-chooseall:focus, a.active.selector-clearall:focus, +a.active.selector-chooseall:hover, a.active.selector-clearall:hover { + color: var(--link-fg); +} + +a.active.selector-chooseall, a.active.selector-clearall { + opacity: 1; +} + +a.active.selector-chooseall:hover, a.active.selector-clearall:hover { + cursor: pointer; +} + +a.selector-chooseall { + padding: 0 18px 0 0; + background: url(../img/selector-icons.svg) right -160px no-repeat; + cursor: default; +} + +a.active.selector-chooseall:focus, a.active.selector-chooseall:hover { + background-position: 100% -176px; +} + +a.selector-clearall { + padding: 0 0 0 18px; + background: url(../img/selector-icons.svg) 0 -128px no-repeat; + cursor: default; +} + +a.active.selector-clearall:focus, a.active.selector-clearall:hover { + background-position: 0 -144px; +} + +/* STACKED SELECTORS */ + +.stacked { + float: left; + width: 490px; +} + +.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 { + height: 22px; + width: 50px; + margin: 0 0 10px 40%; + background-color: #eee; + border-radius: 10px; +} + +.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 -32px no-repeat; + cursor: default; +} + +.stacked .active.selector-add { + background-position: 0 -32px; + cursor: pointer; +} + +.stacked .active.selector-add:focus, .stacked .active.selector-add:hover { + background-position: 0 -48px; + cursor: pointer; +} + +.stacked .selector-remove { + background: url(../img/selector-icons.svg) 0 0 no-repeat; + cursor: default; +} + +.stacked .active.selector-remove { + background-position: 0 0px; + cursor: pointer; +} + +.stacked .active.selector-remove:focus, .stacked .active.selector-remove:hover { + background-position: 0 -16px; + 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: 18px; + width: 18px; +} + +/* 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: 11px; + 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: 11px; + margin-left: 0; + padding-left: 0; +} + +.datetimeshortcuts .clock-icon, .datetimeshortcuts .date-icon { + position: relative; + display: inline-block; + vertical-align: middle; + height: 16px; + width: 16px; + overflow: hidden; +} + +.datetimeshortcuts .clock-icon { + background: url(../img/icon-clock.svg) 0 0 no-repeat; +} + +.datetimeshortcuts a:focus .clock-icon, +.datetimeshortcuts a:hover .clock-icon { + background-position: 0 -16px; +} + +.datetimeshortcuts .date-icon { + background: url(../img/icon-calendar.svg) 0 0 no-repeat; + top: -1px; +} + +.datetimeshortcuts a:focus .date-icon, +.datetimeshortcuts a:hover .date-icon { + background-position: 0 -16px; +} + +.timezonewarning { + font-size: 11px; + color: var(--body-quiet-color); +} + +/* URL */ + +p.url { + line-height: 20px; + margin: 0; + padding: 0; + color: var(--body-quiet-color); + font-size: 11px; + 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: 11px; + font-weight: bold; +} + +.aligned p.file-upload { + margin-left: 170px; +} + +.file-upload a { + font-weight: normal; +} + +.file-upload .deletelink { + margin-left: 5px; +} + +span.clearable-file-input label { + color: var(--body-fg); + font-size: 11px; + display: inline; + float: none; +} + +/* CALENDARS & CLOCKS */ + +.calendarbox, .clockbox { + margin: 5px auto; + font-size: 12px; + 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: 12px; + 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: 12px; + text-align: center; + color: var(--body-quiet-color); +} + +.calendar td { + font-weight: 400; + font-size: 12px; + text-align: center; + padding: 0; + border-top: 1px solid var(--hairline-color); + border-bottom: none; +} + +.calendar td.selected a { + background: var(--primary); + 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: 10px; + 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: 11px; + line-height: 11px; + 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; +} + +.calendarbox .calendarnav-previous:focus, +.calendarbox .calendarnav-previous:hover { + background-position: 0 -15px; +} + +.calendarnav-next { + right: 10px; + background: url(../img/calendar-icons.svg) 0 -30px no-repeat; +} + +.calendarbox .calendarnav-next:focus, +.calendarbox .calendarnav-next:hover { + background-position: 0 -45px; +} + +.calendar-cancel { + margin: 0; + padding: 4px 0; + font-size: 12px; + background: #eee; + border-top: 1px solid var(--border-color); + color: var(--body-fg); +} + +.calendar-cancel:focus, .calendar-cancel:hover { + background: #ddd; +} + +.calendar-cancel a { + color: black; + 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: 16px; + height: 16px; + border: 0px none; +} + +.inline-deletelink:focus, .inline-deletelink:hover { + cursor: pointer; +} + +/* RELATED WIDGET WRAPPER */ +.related-widget-wrapper { + float: left; /* display properly in form rows with multiple fields */ + overflow: hidden; /* clear floated contents */ +} + +.related-widget-wrapper-link { + opacity: 0.3; +} + +.related-widget-wrapper-link:link { + opacity: .8; +} + +.related-widget-wrapper-link:link:focus, +.related-widget-wrapper-link:link:hover { + opacity: 1; +} + +select + .related-widget-wrapper-link, +.related-widget-wrapper-link + .related-widget-wrapper-link { + margin-left: 7px; +} diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/fonts/LICENSE.txt b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/fonts/LICENSE.txt new file mode 100644 index 0000000..75b5248 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/fonts/LICENSE.txt @@ -0,0 +1,202 @@ + + 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 + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/fonts/README.txt b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/fonts/README.txt new file mode 100644 index 0000000..b247bef --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/fonts/README.txt @@ -0,0 +1,3 @@ +Roboto webfont source: https://www.google.com/fonts/specimen/Roboto +WOFF files extracted using https://github.com/majodev/google-webfonts-helper +Weights used in this project: Light (300), Regular (400), Bold (700) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/fonts/Roboto-Bold-webfont.woff b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/fonts/Roboto-Bold-webfont.woff new file mode 100644 index 0000000..6e0f562 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/fonts/Roboto-Bold-webfont.woff differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/fonts/Roboto-Light-webfont.woff b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/fonts/Roboto-Light-webfont.woff new file mode 100644 index 0000000..b9e9918 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/fonts/Roboto-Light-webfont.woff differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/fonts/Roboto-Regular-webfont.woff b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/fonts/Roboto-Regular-webfont.woff new file mode 100644 index 0000000..96c1986 Binary files /dev/null and b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/fonts/Roboto-Regular-webfont.woff differ diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/LICENSE b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/LICENSE new file mode 100644 index 0000000..a4faaa1 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/LICENSE @@ -0,0 +1,20 @@ +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/README.txt b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/README.txt new file mode 100644 index 0000000..4eb2e49 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/README.txt @@ -0,0 +1,7 @@ +All icons are taken from Font Awesome (http://fontawesome.io/) 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/calendar-icons.svg b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/calendar-icons.svg new file mode 100644 index 0000000..dbf21c3 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/calendar-icons.svg @@ -0,0 +1,14 @@ +<svg width="15" height="60" viewBox="0 0 1792 7168" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <defs> + <g id="previous"> + <path 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="next"> + <path 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="#previous" x="0" y="0" fill="#333333" /> + <use xlink:href="#previous" x="0" y="1792" fill="#000000" /> + <use xlink:href="#next" x="0" y="3584" fill="#333333" /> + <use xlink:href="#next" x="0" y="5376" fill="#000000" /> +</svg> diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/gis/move_vertex_off.svg b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/gis/move_vertex_off.svg new file mode 100644 index 0000000..228854f --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/gis/move_vertex_off.svg @@ -0,0 +1 @@ +<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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/gis/move_vertex_on.svg b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/gis/move_vertex_on.svg new file mode 100644 index 0000000..96b87fd --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/gis/move_vertex_on.svg @@ -0,0 +1 @@ +<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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/icon-addlink.svg b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/icon-addlink.svg new file mode 100644 index 0000000..e004fb1 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/icon-addlink.svg @@ -0,0 +1,3 @@ +<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"> + <path fill="#70bf2b" 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/icon-alert.svg b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/icon-alert.svg new file mode 100644 index 0000000..e51ea83 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/icon-alert.svg @@ -0,0 +1,3 @@ +<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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/icon-calendar.svg b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/icon-calendar.svg new file mode 100644 index 0000000..97910a9 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/icon-calendar.svg @@ -0,0 +1,9 @@ +<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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/icon-changelink.svg b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/icon-changelink.svg new file mode 100644 index 0000000..bbb137a --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/icon-changelink.svg @@ -0,0 +1,3 @@ +<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"> + <path fill="#efb80b" 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/icon-clock.svg b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/icon-clock.svg new file mode 100644 index 0000000..bf9985d --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/icon-clock.svg @@ -0,0 +1,9 @@ +<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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/icon-deletelink.svg b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/icon-deletelink.svg new file mode 100644 index 0000000..4059b15 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/icon-deletelink.svg @@ -0,0 +1,3 @@ +<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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/icon-no.svg b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/icon-no.svg new file mode 100644 index 0000000..2e0d383 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/icon-no.svg @@ -0,0 +1,3 @@ +<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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/icon-unknown-alt.svg b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/icon-unknown-alt.svg new file mode 100644 index 0000000..1c6b99f --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/icon-unknown-alt.svg @@ -0,0 +1,3 @@ +<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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/icon-unknown.svg b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/icon-unknown.svg new file mode 100644 index 0000000..50b4f97 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/icon-unknown.svg @@ -0,0 +1,3 @@ +<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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/icon-viewlink.svg b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/icon-viewlink.svg new file mode 100644 index 0000000..a1ca1d3 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/icon-viewlink.svg @@ -0,0 +1,3 @@ +<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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/icon-yes.svg b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/icon-yes.svg new file mode 100644 index 0000000..5883d87 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/icon-yes.svg @@ -0,0 +1,3 @@ +<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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/inline-delete.svg b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/inline-delete.svg new file mode 100644 index 0000000..17d1ad6 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/inline-delete.svg @@ -0,0 +1,3 @@ +<svg width="16" height="16" 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/search.svg b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/search.svg new file mode 100644 index 0000000..c8c69b2 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/search.svg @@ -0,0 +1,3 @@ +<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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/selector-icons.svg b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/selector-icons.svg new file mode 100644 index 0000000..926b8e2 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/selector-icons.svg @@ -0,0 +1,34 @@ +<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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/sorting-icons.svg b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/sorting-icons.svg new file mode 100644 index 0000000..7c31ec9 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/sorting-icons.svg @@ -0,0 +1,19 @@ +<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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/tooltag-add.svg b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/tooltag-add.svg new file mode 100644 index 0000000..1ca64ae --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/tooltag-add.svg @@ -0,0 +1,3 @@ +<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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/tooltag-arrowright.svg b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/tooltag-arrowright.svg new file mode 100644 index 0000000..b664d61 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/img/tooltag-arrowright.svg @@ -0,0 +1,3 @@ +<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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/SelectBox.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/SelectBox.js new file mode 100644 index 0000000..ace6d9d --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/SelectBox.js @@ -0,0 +1,112 @@ +'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); + }, + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/SelectFilter2.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/SelectFilter2.js new file mode 100644 index 0000000..6c709a0 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/SelectFilter2.js @@ -0,0 +1,236 @@ +/*global SelectBox, gettext, 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'; + + 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); + 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 title_available = quickElement('h2', selector_available, interpolate(gettext('Available %s') + ' ', [field_name])); + quickElement( + 'span', title_available, '', + 'class', 'help help-tooltip help-icon', + 'title', interpolate( + gettext( + '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.' + ), + [field_name] + ) + ); + + 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', + 'title', 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('a', selector_available, gettext('Choose all'), 'title', interpolate(gettext('Click to choose all %s at once.'), [field_name]), 'href', '#', 'id', field_id + '_add_all_link'); + choose_all.className = 'selector-chooseall'; + + // <ul class="selector-chooser"> + const selector_chooser = quickElement('ul', selector_div); + selector_chooser.className = 'selector-chooser'; + const add_link = quickElement('a', quickElement('li', selector_chooser), gettext('Choose'), 'title', gettext('Choose'), 'href', '#', 'id', field_id + '_add_link'); + add_link.className = 'selector-add'; + const remove_link = quickElement('a', quickElement('li', selector_chooser), gettext('Remove'), 'title', gettext('Remove'), 'href', '#', 'id', field_id + '_remove_link'); + remove_link.className = 'selector-remove'; + + // <div class="selector-chosen"> + const selector_chosen = quickElement('div', selector_div); + selector_chosen.className = 'selector-chosen'; + const title_chosen = quickElement('h2', selector_chosen, interpolate(gettext('Chosen %s') + ' ', [field_name])); + quickElement( + 'span', title_chosen, '', + 'class', 'help help-tooltip help-icon', + 'title', interpolate( + gettext( + '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.' + ), + [field_name] + ) + ); + + const to_box = quickElement('select', selector_chosen, '', 'id', field_id + '_to', 'multiple', '', 'size', from_box.size, 'name', from_box.name); + to_box.className = 'filtered'; + const clear_all = quickElement('a', selector_chosen, gettext('Remove all'), 'title', interpolate(gettext('Click to remove all chosen %s at once.'), [field_name]), 'href', '#', 'id', field_id + '_remove_all_link'); + clear_all.className = '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.classList.contains('active')) { + move_func(from, to); + SelectFilter.refresh_icons(field_id); + } + e.preventDefault(); + }; + choose_all.addEventListener('click', function(e) { + move_selection(e, this, SelectBox.move_all, field_id + '_from', field_id + '_to'); + }); + add_link.addEventListener('click', function(e) { + move_selection(e, this, SelectBox.move, field_id + '_from', field_id + '_to'); + }); + remove_link.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'); + }); + filter_input.addEventListener('keypress', function(e) { + SelectFilter.filter_key_press(e, field_id); + }); + filter_input.addEventListener('keyup', function(e) { + SelectFilter.filter_key_up(e, field_id); + }); + filter_input.addEventListener('keydown', function(e) { + SelectFilter.filter_key_down(e, field_id); + }); + 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.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'); + + if (!is_stacked) { + // In horizontal mode, give the same height to the two boxes. + const j_from_box = document.getElementById(field_id + '_from'); + const j_to_box = document.getElementById(field_id + '_to'); + let height = filter_p.offsetHeight + j_from_box.offsetHeight; + + const j_to_box_style = window.getComputedStyle(j_to_box); + if (j_to_box_style.getPropertyValue('box-sizing') === 'border-box') { + // Add the padding and border to the final height. + height += parseInt(j_to_box_style.getPropertyValue('padding-top'), 10) + + parseInt(j_to_box_style.getPropertyValue('padding-bottom'), 10) + + parseInt(j_to_box_style.getPropertyValue('border-top-width'), 10) + + parseInt(j_to_box_style.getPropertyValue('border-bottom-width'), 10); + } + + j_to_box.style.height = height + 'px'; + } + + // 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_icons: function(field_id) { + const from = document.getElementById(field_id + '_from'); + const to = document.getElementById(field_id + '_to'); + // Active if at least one item is selected + document.getElementById(field_id + '_add_link').classList.toggle('active', SelectFilter.any_selected(from)); + document.getElementById(field_id + '_remove_link').classList.toggle('active', SelectFilter.any_selected(to)); + // Active if the corresponding box isn't empty + document.getElementById(field_id + '_add_all_link').classList.toggle('active', from.querySelector('option')); + document.getElementById(field_id + '_remove_all_link').classList.toggle('active', to.querySelector('option')); + }, + filter_key_press: function(event, field_id) { + const from = document.getElementById(field_id + '_from'); + // don't submit form if user pressed Enter + if ((event.which && event.which === 13) || (event.keyCode && event.keyCode === 13)) { + from.selectedIndex = 0; + SelectBox.move(field_id + '_from', field_id + '_to'); + from.selectedIndex = 0; + event.preventDefault(); + } + }, + filter_key_up: function(event, field_id) { + const from = document.getElementById(field_id + '_from'); + const temp = from.selectedIndex; + SelectBox.filter(field_id + '_from', document.getElementById(field_id + '_input').value); + from.selectedIndex = temp; + }, + filter_key_down: function(event, field_id) { + const from = document.getElementById(field_id + '_from'); + // right arrow -- move across + if ((event.which && event.which === 39) || (event.keyCode && event.keyCode === 39)) { + const old_index = from.selectedIndex; + SelectBox.move(field_id + '_from', field_id + '_to'); + from.selectedIndex = (old_index === from.length) ? from.length - 1 : old_index; + return; + } + // down arrow -- wrap around + if ((event.which && event.which === 40) || (event.keyCode && event.keyCode === 40)) { + from.selectedIndex = (from.length === from.selectedIndex + 1) ? 0 : from.selectedIndex + 1; + } + // up arrow -- wrap around + if ((event.which && event.which === 38) || (event.keyCode && event.keyCode === 38)) { + from.selectedIndex = (from.selectedIndex === 0) ? from.length - 1 : from.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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/actions.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/actions.js new file mode 100644 index 0000000..da1c310 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/actions.js @@ -0,0 +1,196 @@ +/*global gettext, interpolate, ngettext*/ +'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); + document.querySelector(options.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 acrossInput = document.querySelector(options.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() { + 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(); + } + } + }); + } + }; + + // 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/admin/DateTimeShortcuts.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/admin/DateTimeShortcuts.js new file mode 100644 index 0000000..9bad0f5 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/admin/DateTimeShortcuts.js @@ -0,0 +1,415 @@ +/*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('span'); + warning.className = warningClass; + warning.textContent = message; + inp.parentNode.appendChild(document.createElement('br')); + 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) { + let format = get_format('DATE_INPUT_FORMATS')[0]; + // the format needs to be escaped a little + format = format.replace('\\', '\\\\') + .replace('\r', '\\r') + .replace('\n', '\\n') + .replace('\t', '\\t') + .replace("'", "\\'"); + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/admin/RelatedObjectLookups.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/admin/RelatedObjectLookups.js new file mode 100644 index 0000000..289e1ce --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/admin/RelatedObjectLookups.js @@ -0,0 +1,155 @@ +/*global SelectBox, interpolate*/ +// Handles related-objects functionality: lookup link for raw_id_fields +// and Add Another links. +'use strict'; +{ + const $ = django.jQuery; + + function showAdminPopup(triggeringLink, name_regexp, add_popup) { + const name = 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'); + win.focus(); + return false; + } + + function showRelatedObjectLookupPopup(triggeringLink) { + return showAdminPopup(triggeringLink, /^lookup_/, true); + } + + function dismissRelatedLookupPopup(win, chosenId) { + const name = win.name; + const elem = document.getElementById(name); + if (elem.classList.contains('vManyToManyRawIdAdminField') && elem.value) { + elem.value += ',' + chosenId; + } else { + document.getElementById(name).value = chosenId; + } + 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)); + }); + } else { + siblings.removeAttr('href'); + } + } + + function dismissAddRelatedObjectPopup(win, newId, newRepr) { + const name = 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); + } 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 o = new Option(newRepr, newId); + SelectBox.add_to_cache(toId, o); + SelectBox.redisplay(toId); + } + win.close(); + } + + function dismissChangeRelatedObjectPopup(win, objId, newRepr, newId) { + const id = 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; + } + }); + 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; + }); + win.close(); + } + + function dismissDeleteRelatedObjectPopup(win, objId) { + const id = 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'); + win.close(); + } + + window.showRelatedObjectLookupPopup = showRelatedObjectLookupPopup; + window.dismissRelatedLookupPopup = dismissRelatedLookupPopup; + window.showRelatedObjectPopup = showRelatedObjectPopup; + window.updateRelatedObjectLinks = updateRelatedObjectLinks; + window.dismissAddRelatedObjectPopup = dismissAddRelatedObjectPopup; + window.dismissChangeRelatedObjectPopup = dismissChangeRelatedObjectPopup; + window.dismissDeleteRelatedObjectPopup = dismissDeleteRelatedObjectPopup; + + // Kept for backward compatibility + window.showAddAnotherPopup = showRelatedObjectPopup; + window.dismissAddAnotherPopup = dismissAddRelatedObjectPopup; + + $(document).ready(function() { + $("a[data-popup-opener]").on('click', function(event) { + event.preventDefault(); + opener.dismissRelatedLookupPopup(window, $(this).data("popup-opener")); + }); + $('body').on('click', '.related-widget-wrapper-link', 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/autocomplete.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/autocomplete.js new file mode 100644 index 0000000..c55eee1 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/autocomplete.js @@ -0,0 +1,41 @@ +'use strict'; +{ + const $ = django.jQuery; + const init = function($element, options) { + const settings = $.extend({ + ajax: { + data: function(params) { + return { + term: params.term, + page: params.page, + app_label: $element.data('app-label'), + model_name: $element.data('model-name'), + field_name: $element.data('field-name') + }; + } + } + }, options); + $element.select2(settings); + }; + + $.fn.djangoAdminSelect2 = function(options) { + const settings = $.extend({}, options); + $.each(this, function(i, element) { + const $element = $(element); + init($element, settings); + }); + 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).on('formset:added', (function() { + return function(event, $newFormset) { + return $newFormset.find('.admin-autocomplete').djangoAdminSelect2(); + }; + })(this)); +} diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/calendar.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/calendar.js new file mode 100644 index 0000000..a62d10a --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/calendar.js @@ -0,0 +1,221 @@ +/*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: [ + 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.daysOfWeek[(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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/cancel.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/cancel.js new file mode 100644 index 0000000..3069c6f --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/cancel.js @@ -0,0 +1,29 @@ +'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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/change_form.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/change_form.js new file mode 100644 index 0000000..96a4c62 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/change_form.js @@ -0,0 +1,16 @@ +'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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/collapse.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/collapse.js new file mode 100644 index 0000000..c6c7b0f --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/collapse.js @@ -0,0 +1,43 @@ +/*global gettext*/ +'use strict'; +{ + window.addEventListener('load', function() { + // Add anchor tag for Show/Hide link + const fieldsets = document.querySelectorAll('fieldset.collapse'); + for (const [i, elem] of fieldsets.entries()) { + // Don't hide if fields in this fieldset have errors + if (elem.querySelectorAll('div.errors, ul.errorlist').length === 0) { + elem.classList.add('collapsed'); + const h2 = elem.querySelector('h2'); + const link = document.createElement('a'); + link.id = 'fieldsetcollapser' + i; + link.className = 'collapse-toggle'; + link.href = '#'; + link.textContent = gettext('Show'); + h2.appendChild(document.createTextNode(' (')); + h2.appendChild(link); + h2.appendChild(document.createTextNode(')')); + } + } + // Add toggle to hide/show anchor tag + const toggleFunc = function(ev) { + if (ev.target.matches('.collapse-toggle')) { + ev.preventDefault(); + ev.stopPropagation(); + const fieldset = ev.target.closest('fieldset'); + if (fieldset.classList.contains('collapsed')) { + // Show + ev.target.textContent = gettext('Hide'); + fieldset.classList.remove('collapsed'); + } else { + // Hide + ev.target.textContent = gettext('Show'); + fieldset.classList.add('collapsed'); + } + } + }; + document.querySelectorAll('fieldset.module').forEach(function(el) { + el.addEventListener('click', toggleFunc); + }); + }); +} diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/core.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/core.js new file mode 100644 index 0000000..3a2e4aa --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/core.js @@ -0,0 +1,170 @@ +// 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.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 = { + 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 = result + fields[format.charAt(i + 1)]; + ++i; + } + else { + result = 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/inlines.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/inlines.js new file mode 100644 index 0000000..82ec027 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/inlines.js @@ -0,0 +1,348 @@ +/*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 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 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); + } + $(document).trigger('formset:added', [row, 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 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 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 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).trigger('formset:removed', [row, 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) { + const namearr = value.name.split('-'); + SelectFilter.init(value.id, namearr[namearr.length - 1], false); + }); + $('.selectfilterstacked').each(function(index, value) { + const namearr = value.name.split('-'); + SelectFilter.init(value.id, namearr[namearr.length - 1], 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) { + const namearr = value.name.split('-'); + SelectFilter.init(value.id, namearr[namearr.length - 1], false); + }); + $(".selectfilterstacked").each(function(index, value) { + const namearr = value.name.split('-'); + SelectFilter.init(value.id, namearr[namearr.length - 1], 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('.form-row .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", + 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/jquery.init.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/jquery.init.js new file mode 100644 index 0000000..f40b27f --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/jquery.init.js @@ -0,0 +1,8 @@ +/*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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/nav_sidebar.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/nav_sidebar.js new file mode 100644 index 0000000..efaa721 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/nav_sidebar.js @@ -0,0 +1,39 @@ +'use strict'; +{ + const toggleNavSidebar = document.getElementById('toggle-nav-sidebar'); + if (toggleNavSidebar !== null) { + const navLinks = document.querySelectorAll('#nav-sidebar a'); + function disableNavLinkTabbing() { + for (const navLink of navLinks) { + navLink.tabIndex = -1; + } + } + function enableNavLinkTabbing() { + for (const navLink of navLinks) { + navLink.tabIndex = 0; + } + } + + const main = document.getElementById('main'); + let navSidebarIsOpen = localStorage.getItem('django.admin.navSidebarIsOpen'); + if (navSidebarIsOpen === null) { + navSidebarIsOpen = 'true'; + } + if (navSidebarIsOpen === 'false') { + disableNavLinkTabbing(); + } + main.classList.toggle('shifted', navSidebarIsOpen === 'true'); + + toggleNavSidebar.addEventListener('click', function() { + if (navSidebarIsOpen === 'true') { + navSidebarIsOpen = 'false'; + disableNavLinkTabbing(); + } else { + navSidebarIsOpen = 'true'; + enableNavLinkTabbing(); + } + localStorage.setItem('django.admin.navSidebarIsOpen', navSidebarIsOpen); + main.classList.toggle('shifted'); + }); + } +} diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/popup_response.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/popup_response.js new file mode 100644 index 0000000..2b1d3dd --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/popup_response.js @@ -0,0 +1,16 @@ +/*global opener */ +'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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/prepopulate.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/prepopulate.js new file mode 100644 index 0000000..89e95ab --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/prepopulate.js @@ -0,0 +1,43 @@ +/*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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/prepopulate_init.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/prepopulate_init.js new file mode 100644 index 0000000..72ebdcf --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/prepopulate_init.js @@ -0,0 +1,11 @@ +'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).addClass('prepopulated_field'); + $(field.id).data('dependency_list', field.dependency_list).prepopulate( + field.dependency_ids, field.maxLength, field.allowUnicode + ); + }); +} diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/urlify.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/urlify.js new file mode 100644 index 0000000..61dedb2 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/urlify.js @@ -0,0 +1,170 @@ +/*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 + s = s.replace(/-+$/g, ''); // trim any trailing hyphens + return s; + } + window.URLify = URLify; +} diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/jquery/LICENSE.txt b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/jquery/LICENSE.txt new file mode 100644 index 0000000..e3dbacb --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/jquery/LICENSE.txt @@ -0,0 +1,20 @@ +Copyright JS Foundation and other contributors, https://js.foundation/ + +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/jquery/jquery.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/jquery/jquery.js new file mode 100644 index 0000000..5093733 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/jquery/jquery.js @@ -0,0 +1,10872 @@ +/*! + * jQuery JavaScript Library v3.5.1 + * https://jquery.com/ + * + * Includes Sizzle.js + * https://sizzlejs.com/ + * + * Copyright JS Foundation and other contributors + * Released under the MIT license + * https://jquery.org/license + * + * Date: 2020-05-04T22:49Z + */ +( 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 #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. + return typeof obj === "function" && typeof obj.nodeType !== "number"; + }; + + +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.5.1", + + // 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; + }, + + // 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 ); + }, + + // 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; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.3.5 + * https://sizzlejs.com/ + * + * Copyright JS Foundation and other contributors + * Released under the MIT license + * https://js.foundation/ + * + * Date: 2020-03-14 + */ +( function( window ) { +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + nonnativeSelectorCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // Instance methods + hasOwn = ( {} ).hasOwnProperty, + arr = [], + pop = arr.pop, + pushNative = arr.push, + push = arr.push, + slice = arr.slice, + + // Use a stripped-down indexOf as it's faster than native + // https://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[ i ] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + + "ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + + // 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: http://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" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = 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" ) + }, + + rhtml = /HTML$/i, + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + + // CSS escapes + // http://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; + + return nonHex ? + + // Strip the backslash prefix from a non-hex escape sequence + 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 + high < 0 ? + String.fromCharCode( high + 0x10000 ) : + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // CSS string/identifier serialization + // https://drafts.csswg.org/cssom/#common-serializing-idioms + rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, + fcssescape = function( 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; + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }, + + inDisabledFieldset = addCombinator( + function( elem ) { + return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; + }, + { dir: "parentNode", next: "legend" } + ); + +// 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: arr.length ? + + // Leverage slice if possible + function( target, els ) { + pushNative.apply( target, slice.call( els ) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + + // Can't trust NodeList.length + while ( ( target[ j++ ] = els[ i++ ] ) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( 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, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( newContext && ( elem = newContext.getElementById( m ) ) && + contains( context, elem ) && + elem.id === m ) { + + results.push( elem ); + return results; + } + } + + // Type selector + } else if ( match[ 2 ] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && + context.getElementsByClassName ) { + + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( support.qsa && + !nonnativeSelectorCache[ selector + " " ] && + ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && + + // Support: IE 8 only + // Exclude object elements + ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { + + 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 ) || rcombinators.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. + if ( newContext !== context || !support.scope ) { + + // Capture the context ID, setting it first if necessary + if ( ( nid = context.getAttribute( "id" ) ) ) { + nid = nid.replace( rcssescape, fcssescape ); + } 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( rtrim, "$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 Issue #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 Sizzle + * @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; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split( "|" ), + i = arr.length; + + while ( i-- ) { + Expr.attrHandle[ arr[ i ] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + a.sourceIndex - b.sourceIndex; + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( ( cur = cur.nextSibling ) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return ( name === "input" || name === "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 + /* jshint -W018 */ + 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 Sizzle 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; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + var namespace = elem.namespaceURI, + docElem = ( elem.ownerDocument || elem ).documentElement; + + // Support: IE <=8 + // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes + // https://bugs.jquery.com/ticket/4833 + return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, 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; + docElem = document.documentElement; + documentIsHTML = !isXML( document ); + + // Support: IE 9 - 11+, Edge 12 - 18+ + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + // 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 ( preferredDoc != document && + ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { + + // Support: IE 11, Edge + if ( subWindow.addEventListener ) { + subWindow.addEventListener( "unload", unloadHandler, false ); + + // Support: IE 9 - 10 only + } else if ( subWindow.attachEvent ) { + subWindow.attachEvent( "onunload", unloadHandler ); + } + } + + // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, + // Safari 4 - 5 only, Opera <=11.6 - 12.x only + // IE/Edge & older browsers don't support the :scope pseudo-class. + // Support: Safari 6.0 only + // Safari 6.0 supports :scope but it's an alias of :root there. + support.scope = assert( function( el ) { + docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); + return typeof el.querySelectorAll !== "undefined" && + !el.querySelectorAll( ":scope fieldset div" ).length; + } ); + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert( function( el ) { + el.className = "i"; + return !el.getAttribute( "className" ); + } ); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert( function( el ) { + el.appendChild( document.createComment( "" ) ); + return !el.getElementsByTagName( "*" ).length; + } ); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( document.getElementsByClassName ); + + // 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 ) { + docElem.appendChild( el ).id = expando; + return !document.getElementsByName || !document.getElementsByName( expando ).length; + } ); + + // 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" ] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( ( elem = results[ i++ ] ) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See https://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { + + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert( function( el ) { + + var input; + + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // https://bugs.jquery.com/ticket/12359 + docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" + + "<select id='" + expando + "-\r\\' msallowcapture=''>" + + "<option selected=''></option></select>"; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !el.querySelectorAll( "[selected]" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ + if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push( "~=" ); + } + + // 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 + "*(?:''|\"\")" ); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !el.querySelectorAll( ":checked" ).length ) { + rbuggyQSA.push( ":checked" ); + } + + // Support: Safari 8+, iOS 8+ + // 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: Firefox <=3.6 - 5 only + // Old Firefox doesn't throw on a badly-escaped identifier. + el.querySelectorAll( "\\\f" ); + rbuggyQSA.push( "[\\r\\n\\f]" ); + } ); + + assert( function( el ) { + el.innerHTML = "<a href='' disabled='disabled'></a>" + + "<select disabled='disabled'><option/></select>"; + + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = document.createElement( "input" ); + input.setAttribute( "type", "hidden" ); + el.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( el.querySelectorAll( "[name=d]" ).length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: IE9-11+ + // IE's :disabled selector does not pick up the children of disabled fieldsets + docElem.appendChild( el ).disabled = true; + if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: Opera 10 - 11 only + // Opera 10-11 does not throw on post-comma invalid pseudos + el.querySelectorAll( "*,:x" ); + rbuggyQSA.push( ",.*:" ); + } ); + } + + if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector ) ) ) ) { + + assert( function( el ) { + + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( el, "*" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( el, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + } ); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully self-exclusive + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + ) ); + } : + function( a, b ) { + if ( b ) { + while ( ( b = b.parentNode ) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + 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 && + 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 && + contains( preferredDoc, b ) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + /* eslint-disable eqeqeq */ + return a == document ? -1 : + b == document ? 1 : + /* eslint-enable eqeqeq */ + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( ( cur = cur.parentNode ) ) { + ap.unshift( cur ); + } + cur = b; + while ( ( cur = cur.parentNode ) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[ i ] === bp[ i ] ) { + i++; + } + + return i ? + + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[ i ], bp[ i ] ) : + + // Otherwise nodes in our document sort first + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + /* eslint-disable eqeqeq */ + ap[ i ] == preferredDoc ? -1 : + bp[ i ] == preferredDoc ? 1 : + /* eslint-enable eqeqeq */ + 0; + }; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + setDocument( elem ); + + if ( support.matchesSelector && documentIsHTML && + !nonnativeSelectorCache[ expr + " " ] && + ( !rbuggyMatches || !rbuggyMatches.test( 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 Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.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 contains( context, elem ); +}; + +Sizzle.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 (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + ( val = elem.getAttributeNode( name ) ) && val.specified ? + val.value : + null; +}; + +Sizzle.escape = function( sel ) { + return ( sel + "" ).replace( rcssescape, fcssescape ); +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( ( elem = results[ i++ ] ) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = 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 += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // 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 ] ) { + Sizzle.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 ] ) { + Sizzle.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 nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { + return true; + } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "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 = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + /* eslint-disable max-len */ + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + /* eslint-enable max-len */ + + }; + }, + + "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, uniqueCache, 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 ? + node.nodeName.toLowerCase() === 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 + + // ...in a gzip-friendly way + node = parent; + outerCache = node[ expando ] || ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + cache = uniqueCache[ 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 ) { + uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + + // Use previously-cached element index if available + if ( useCache ) { + + // ...in a gzip-friendly way + node = elem; + outerCache = node[ expando ] || ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + cache = uniqueCache[ 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 ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || + ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + uniqueCache[ 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 + // http://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() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle 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( 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( rtrim, "$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 (issue #299) + input[ 0 ] = null; + return !results.pop(); + }; + } ), + + "has": markFunction( function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + } ), + + "contains": markFunction( function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || getText( 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." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + + // lang value must be a valid identifier + if ( !ridentifier.test( lang || "" ) ) { + Sizzle.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 === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && + ( !document.hasFocus || 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 + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return ( nodeName === "input" && !!elem.checked ) || + ( nodeName === "option" && !!elem.selected ); + }, + + "selected": function( elem ) { + + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + // eslint-disable-next-line no-unused-expressions + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + + // http://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 ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // 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 = argument < 0 ? + argument + length : + argument > length ? + length : + 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(); + +tokenize = Sizzle.tokenize = function( 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 = rcombinators.exec( soFar ) ) ) { + matched = match.shift(); + tokens.push( { + value: matched, + + // Cast descendant combinators to space + type: match[ 0 ].replace( rtrim, " " ) + } ); + 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 + return parseOnly ? + soFar.length : + soFar ? + Sizzle.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, uniqueCache, 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 ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ elem.uniqueID ] || + ( outerCache[ elem.uniqueID ] = {} ); + + if ( skip && skip === elem.nodeName.toLowerCase() ) { + elem = elem[ dir ] || elem; + } else if ( ( oldCache = uniqueCache[ 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 + uniqueCache[ 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++ ) { + Sizzle( 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, + 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, + + matcherOut = matcher ? + + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // 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( 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( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + ( checkContext = context ).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + + // Avoid hanging onto element (issue #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( rtrim, "$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: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id + 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 ) ) { + results.push( 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 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( 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 Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( 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 + +// Sort stability +support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// 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; +} ); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert( function( el ) { + el.innerHTML = "<a href='#'></a>"; + return el.firstChild.getAttribute( "href" ) === "#"; +} ) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + } ); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert( function( el ) { + el.innerHTML = "<input/>"; + el.firstChild.setAttribute( "value", "" ); + return el.firstChild.getAttribute( "value" ) === ""; +} ) ) { + addHandle( "value", function( elem, _name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + } ); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert( function( el ) { + return el.getAttribute( "disabled" ) == null; +} ) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + ( val = elem.getAttributeNode( name ) ) && val.specified ? + val.value : + null; + } + } ); +} + +return Sizzle; + +} )( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; + +// Deprecated +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; +jQuery.escapeSelector = Sizzle.escape; + + + + +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; + + + +function nodeName( elem, name ) { + + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + +}; +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 (#9521) + // Strict HTML recognition (#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 Sizzle + 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.stackTrace ); + } + + // 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 stack, in case of exception + // since it's otherwise lost when execution goes async + if ( jQuery.Deferred.getStackHook ) { + process.stackTrace = 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 master Deferred + master = 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 ) ) { + master.resolveWith( resolveContexts, resolveValues ); + } + }; + }; + + // Single- and empty arguments are adopted like Promise.resolve + if ( remaining <= 1 ) { + adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, + !remaining ); + + // Use .then() to unwrap secondary thenables (cf. gh-3000) + if ( master.state() === "pending" || + isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { + + return master.then(); + } + } + + // Multiple arguments are aggregated like Promise.all array elements + while ( i-- ) { + adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); + } + + return master.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$/; + +jQuery.Deferred.exceptionHook = function( error, stack ) { + + // 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, stack ); + } +}; + + + + +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 #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 (#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 #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 (#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 (#11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#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 (#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 (#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 (#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 + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +// Support: IE <=9 - 11+ +// focus() and blur() are asynchronous, except when they are no-op. +// So expect focus to be synchronous when the element is already active, +// and blur to be synchronous when the element is not already active. +// (focus and blur are always synchronous in other supported browsers, +// this just defines when we can count on it). +function expectSync( elem, type ) { + return ( elem === safeActiveElement() ) === ( type === "focus" ); +} + +// Support: IE <=9 only +// Accessing document.activeElement can throw unexpectedly +// https://bugs.jquery.com/ticket/13393 +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +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 (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #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 (#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", returnTrue ); + } + + // 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, expectSync ) { + + // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add + if ( !expectSync ) { + 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 notAsync, result, + saved = dataPriv.get( this, type ); + + if ( ( event.isTrigger & 1 ) && this[ type ] ) { + + // Interrupt processing of the outer synthetic .trigger()ed event + // Saved data should be false in such cases, but might be a leftover capture object + // from an async native handler (gh-4350) + if ( !saved.length ) { + + // 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 + // Support: IE <=9 - 11+ + // focus() and blur() are asynchronous + notAsync = expectSync( this, type ); + this[ type ](); + result = dataPriv.get( this, type ); + if ( saved !== result || notAsync ) { + dataPriv.set( this, type, false ); + } else { + result = {}; + } + if ( saved !== result ) { + + // Cancel the outer synthetic event + event.stopImmediatePropagation(); + event.preventDefault(); + return result.value; + } + + // 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.length ) { + + // ...and capture the result + dataPriv.set( this, type, { + value: jQuery.event.trigger( + + // Support: IE <=9 - 11+ + // Extend with the prototype to reset the above stopImmediatePropagation() + jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), + saved.slice( 1 ), + this + ) + } ); + + // Abort handling of the native event + event.stopImmediatePropagation(); + } + } + } ); +} + +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 (#504, #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: function( event ) { + var button = event.button; + + // Add which for key events + if ( event.which == null && rkeyEvent.test( event.type ) ) { + return event.charCode != null ? event.charCode : event.keyCode; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { + if ( button & 1 ) { + return 1; + } + + if ( button & 2 ) { + return 3; + } + + if ( button & 4 ) { + return 2; + } + + return 0; + } + + return event.which; + } +}, jQuery.event.addProp ); + +jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { + jQuery.event.special[ type ] = { + + // Utilize native event if possible so blur/focus sequence is correct + setup: function() { + + // Claim the first handler + // dataPriv.set( this, "focus", ... ) + // dataPriv.set( this, "blur", ... ) + leverageNative( this, type, expectSync ); + + // 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; + }, + + delegateType: delegateType + }; +} ); + +// 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 (#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; + + // Reenable 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 { + 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 Sizzle 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 getStyles = function( elem ) { + + // Support: IE <=11 only, Firefox <=30 (#15098, #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 (#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! + 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"; + tr.style.height = "1px"; + trChild.style.height = "9px"; + + documentElement + .appendChild( table ) + .appendChild( tr ) + .appendChild( trChild ); + + trStyle = window.getComputedStyle( tr ); + reliableTrDimensionsVal = parseInt( trStyle.height ) > 3; + + documentElement.removeChild( table ); + } + return reliableTrDimensionsVal; + } + } ); +} )(); + + +function curCSS( elem, name, computed ) { + var width, minWidth, maxWidth, ret, + + // 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, #12537) + // .css('--customProperty) (#3144) + if ( computed ) { + ret = computed.getPropertyValue( name ) || computed[ name ]; + + 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]).+)/, + rcustomProp = /^--/, + 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; + + // Adjustment may not be necessary + if ( box === ( isBorderBox ? "border" : "content" ) ) { + return 0; + } + + for ( ; i < 4; i += 2 ) { + + // Both box models exclude margin + if ( box === "margin" ) { + delta += 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; +} + +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, + "columnCount": true, + "fillOpacity": 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, + "widows": true, + "zIndex": true, + "zoom": 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 (#7345) + if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { + value = adjustCSS( elem, name, ret ); + + // Fixes bug #9237 + type = "number"; + } + + // Make sure that null and NaN values aren't set (#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 )` (#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. +// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ +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 + // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + // Use proper attribute retrieval(#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 classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + classes = classesToArray( value ); + + if ( classes.length ) { + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + if ( cur.indexOf( " " + clazz + " " ) < 0 ) { + cur += clazz + " "; + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( !arguments.length ) { + return this.attr( "class", "" ); + } + + classes = classesToArray( value ); + + if ( classes.length ) { + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + + // This expression is here for better compressibility (see addClass) + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + + // Remove *all* instances + while ( cur.indexOf( " " + clazz + " " ) > -1 ) { + cur = cur.replace( " " + clazz + " ", " " ); + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, + isValidValue = type === "string" || Array.isArray( value ); + + if ( typeof stateVal === "boolean" && isValidValue ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + + if ( isFunction( value ) ) { + return this.each( function( i ) { + jQuery( this ).toggleClass( + value.call( this, i, getClass( this ), stateVal ), + stateVal + ); + } ); + } + + return this.each( function() { + var className, i, self, classNames; + + if ( isValidValue ) { + + // Toggle individual class names + i = 0; + self = jQuery( this ); + classNames = classesToArray( value ); + + while ( ( 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 (#14686, #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 (#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 + + +support.focusin = "onfocusin" in window; + + +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 (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#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 (#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 ); + } + } +} ); + + +// 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 +if ( !support.focusin ) { + jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + + // Handle: regular nodes (via `this.ownerDocument`), window + // (via `this.document`) & document (via `this`). + var doc = this.ownerDocument || this.document || this, + attaches = dataPriv.access( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this.document || this, + attaches = dataPriv.access( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + dataPriv.remove( doc, fix ); + + } else { + dataPriv.access( doc, fix, attaches ); + } + } + }; + } ); +} +var location = window.location; + +var nonce = { guid: Date.now() }; + +var rquery = ( /\?/ ); + + + +// Cross-browser xml parsing +jQuery.parseXML = function( data ) { + var xml; + 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 ) { + xml = undefined; + } + + if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { + jQuery.error( "Invalid XML: " + data ); + } + return xml; +}; + + +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, + + // #7653, #8125, #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 (#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 #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 (#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 #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 (#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; + + // #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 + if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) { + 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 (#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 + // #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 #8605, #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 ) { + + // #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 { + if ( typeof props.top === "number" ) { + props.top += "px"; + } + if ( typeof props.left === "number" ) { + props.left += "px"; + } + 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.mouseenter( fnOver ).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 +var rtrim = /^[\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, "" ); +}; + + + +// 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 +// (#7102#comment:10, https://github.com/jquery/jquery/pull/557) +// and CommonJS for browser emulators (#13566) +if ( typeof noGlobal === "undefined" ) { + window.jQuery = window.$ = jQuery; +} + + + + +return jQuery; +} ); diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/jquery/jquery.min.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/jquery/jquery.min.js new file mode 100644 index 0000000..b061403 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/jquery/jquery.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.5.1 | (c) JS 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(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.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:u,sort:t.sort,splice:t.splice},S.extend=S.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||m(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&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+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]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(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},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},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(p(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:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),D=function(e,t){return e===t&&(l=!0),0},j={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=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))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(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&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(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&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(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 ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);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&&E){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=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&j.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(D),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,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(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===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]||se.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]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(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(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(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=se.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(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(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:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?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=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!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 J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(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]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(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 Te(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 Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(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=[be(we(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 Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[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?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(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=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=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]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(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&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.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(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(D).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(D(this,e||[],!1))},not:function(e){return this.pushStack(D(this,e||[],!0))},is:function(e){return!!D(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var j,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.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 S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.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&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.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){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.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},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.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 S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(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,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.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=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(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},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(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[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(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(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.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&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.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=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.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=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.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 ue={};function le(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]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={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 ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(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"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.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<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^key/,we=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Te=/^([^.]*)(?:\.(.+)|)/;function Ce(){return!0}function Ee(){return!1}function Se(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function ke(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)ke(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=Ee;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Ae(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,Ce)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=Te.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.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),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=Te.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.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)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.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=S.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=((S.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<S(i,this).index(l):S.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(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(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[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Ae(t,"click",Ce),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Ae(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?Ce:Ee,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&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Ee,isPropagationStopped:Ee,isImmediatePropagationStopped:Ee,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=Ce,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=Ce,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=Ce,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.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:function(e){var t=e.button;return null==e.which&&be.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&we.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Ae(this,e,Se),!1},trigger:function(){return Ae(this,e),!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return ke(this,e,t,n,r)},one:function(e,t,n,r){return ke(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(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=Ee),this.each(function(){S.event.remove(this,e,n,t)})}});var Ne=/<script|<style|<link/i,De=/checked\s*(?:[^=]|=\s*.checked.)/i,je=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function Pe(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=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&De.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),Pe(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),Le)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,He),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(je,""),u,l))}return n}function Re(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Oe(o[r],a[r]);else Oe(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Re(this,e,!0)},remove:function(e){return Re(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.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 Pe(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||qe(this,e).appendChild(e)})},prepend:function(){return Pe(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=qe(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Pe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Pe(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&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(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&&!Ne.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return Pe(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Me=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Ie=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},We=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},Fe=new RegExp(ne.join("|"),"i");function Be(e,t,n){var r,i,o,a,s=e.style;return(n=n||Ie(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Me.test(a)&&Fe.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function $e(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%",re.appendChild(u).appendChild(l);var e=C.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),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{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=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px",t.style.height="1px",n.style.height="9px",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=3<parseInt(r.height),re.removeChild(e)),a}}))}();var _e=["Webkit","Moz","ms"],ze=E.createElement("div").style,Ue={};function Xe(e){var t=S.cssProps[e]||Ue[e];return t||(e in ze?e:Ue[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=_e.length;while(n--)if((e=_e[n]+t)in ze)return e}(e)||e)}var Ve=/^(none|table(?!-c[ea]).+)/,Ge=/^--/,Ye={position:"absolute",visibility:"hidden",display:"block"},Qe={letterSpacing:"0",fontWeight:"400"};function Je(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Ke(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[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}function Ze(e,t,n){var r=Ie(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=Be(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Me.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Ke(e,t,n||(i?"border":"content"),o,r,a)+"px"}function et(e,t,n,r,i){return new et.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Be(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!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,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Ge.test(t),l=e.style;if(u||(t=Xe(s)),a=S.cssHooks[t]||S.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=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.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=X(t);return Ge.test(t)||(t=Xe(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Be(e,t,r)),"normal"===i&&t in Qe&&(i=Qe[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ve.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Ze(e,u,n):We(e,Ye,function(){return Ze(e,u,n)})},set:function(e,t,n){var r,i=Ie(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Ke(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Ke(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Je(0,t,s)}}}),S.cssHooks.marginLeft=$e(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Be(e,"marginLeft"))||e.getBoundingClientRect().left-We(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Je)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Ie(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=et).prototype={constructor:et,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=et.propHooks[this.prop];return e&&e.get?e.get(this):et.propHooks._default.get(this)},run:function(e){var t,n=et.propHooks[this.prop];return this.options.duration?this.pos=t=S.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):et.propHooks._default.set(this),this}}).init.prototype=et.prototype,(et.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=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[Xe(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=et.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=et.prototype.init,S.fx.step={};var tt,nt,rt,it,ot=/^(?:toggle|show|hide)$/,at=/queueHooks$/;function st(){nt&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(st):C.setTimeout(st,S.fx.interval),S.fx.tick())}function ut(){return C.setTimeout(function(){tt=void 0}),tt=Date.now()}function lt(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ct(e,t,n){for(var r,i=(ft.tweeners[t]||[]).concat(ft.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function ft(o,e,t){var n,a,r=0,i=ft.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=tt||ut(),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:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:tt||ut(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.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=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.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=ft.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ct,l),m(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),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(ft,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],ft.tweeners[n]=ft.tweeners[n]||[],ft.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&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._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--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],ot.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]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.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=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ct(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?ft.prefilters.unshift(e):ft.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=ft(this,S.extend({},t),o);(i||Y.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=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&at.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||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.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})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(lt(r,!0),e,t,n)}}),S.each({slideDown:lt("show"),slideUp:lt("hide"),slideToggle:lt("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(tt=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),tt=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){nt||(nt=!0,st())},S.fx.stop=function(){nt=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},rt=E.createElement("input"),it=E.createElement("select").appendChild(E.createElement("option")),rt.type="checkbox",y.checkOn=""!==rt.value,y.optSelected=it.selected,(rt=E.createElement("input")).value="t",rt.type="radio",y.radioValue="t"===rt.value;var pt,dt=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?pt:void 0)),void 0!==n?null===n?void S.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=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(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(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),pt={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=dt[t]||S.find.attr;dt[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=dt[o],dt[o]=r,r=null!=a(e,t,n)?o:null,dt[o]=i),r}});var ht=/^(?:input|select|textarea|button)$/i,gt=/^(?:a|area)$/i;function vt(e){return(e.match(P)||[]).join(" ")}function yt(e){return e.getAttribute&&e.getAttribute("class")||""}function mt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.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=S.find.attr(e,"tabindex");return t?parseInt(t,10):ht.test(e.nodeName)||gt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.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)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,yt(this)))});if((e=mt(t)).length)while(n=this[u++])if(i=yt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,yt(this)))});if(!arguments.length)return this.attr("class","");if((e=mt(t)).length)while(n=this[u++])if(i=yt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,yt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=mt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=yt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+vt(yt(n))+" ").indexOf(t))return!0;return!1}});var xt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(xt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:vt(S.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||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var bt=/^(?:focusinfocus|focusoutblur)$/,wt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!bt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.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]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,bt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(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)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,wt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,wt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var Tt=C.location,Ct={guid:Date.now()},Et=/\?/;S.parseXML=function(e){var t;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){t=void 0}return t&&!t.getElementsByTagName("parsererror").length||S.error("Invalid XML: "+e),t};var St=/\[\]$/,kt=/\r?\n/g,At=/^(?:submit|button|image|reset|file)$/i,Nt=/^(?:input|select|textarea|keygen)/i;function Dt(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||St.test(n)?i(n,t):Dt(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)Dt(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)Dt(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&Nt.test(this.nodeName)&&!At.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(kt,"\r\n")}}):{name:t.name,value:n.replace(kt,"\r\n")}}).get()}});var jt=/%20/g,qt=/#.*$/,Lt=/([?&])_=[^&]*/,Ht=/^(.*?):[ \t]*([^\r\n]*)$/gm,Ot=/^(?:GET|HEAD)$/,Pt=/^\/\//,Rt={},Mt={},It="*/".concat("*"),Wt=E.createElement("a");function Ft(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Bt(t,i,o,a){var s={},u=t===Mt;function l(e){var r;return s[e]=!0,S.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 $t(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Wt.href=Tt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Tt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Tt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":It,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":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?$t($t(e,S.ajaxSettings),t):$t(S.ajaxSettings,e)},ajaxPrefilter:Ft(Rt),ajaxTransport:Ft(Mt),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=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.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=Ht.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||Tt.href)+"").replace(Pt,Tt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Wt.protocol+"//"+Wt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Bt(Rt,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Ot.test(v.type),f=v.url.replace(qt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(jt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Et.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Lt,"$1"),o=(Et.test(f)?"&":"?")+"_="+Ct.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.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]?", "+It+"; 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=Bt(Mt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.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&&C.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<S.inArray("script",v.dataTypes)&&(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"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.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]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(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 m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var _t={0:200,1223:204},zt=S.ajaxSettings.xhr();y.cors=!!zt&&"withCredentials"in zt,y.ajax=zt=!!zt,S.ajaxTransport(function(i){var o,a;if(y.cors||zt&&!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(_t[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&&C.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()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.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 S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<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)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=vt(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.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),m(t)&&(t=t.call(e,n,S.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):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.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"===S.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"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(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)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(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?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.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.mouseenter(e).mouseleave(t||e)}}),S.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){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Gt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Gt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Yt=C.jQuery,Qt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Qt),e&&C.jQuery===S&&(C.jQuery=Yt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S}); diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/LICENSE.md b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/LICENSE.md new file mode 100644 index 0000000..8cb8a2b --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/LICENSE.md @@ -0,0 +1,21 @@ +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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/af.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/af.js new file mode 100644 index 0000000..32e5ac7 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/af.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ar.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ar.js new file mode 100644 index 0000000..64e1caa --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ar.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/az.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/az.js new file mode 100644 index 0000000..1d52c26 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/az.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/bg.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/bg.js new file mode 100644 index 0000000..73b730a --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/bg.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/bn.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/bn.js new file mode 100644 index 0000000..2d17b9d --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/bn.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/bs.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/bs.js new file mode 100644 index 0000000..46b084d --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/bs.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ca.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ca.js new file mode 100644 index 0000000..82dbbb7 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ca.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/cs.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/cs.js new file mode 100644 index 0000000..7116d6c --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/cs.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/da.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/da.js new file mode 100644 index 0000000..cda32c3 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/da.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/de.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/de.js new file mode 100644 index 0000000..c2e61e5 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/de.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/dsb.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/dsb.js new file mode 100644 index 0000000..02f283a --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/dsb.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/el.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/el.js new file mode 100644 index 0000000..d4922a1 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/el.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/en.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/en.js new file mode 100644 index 0000000..3b19285 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/en.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/es.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/es.js new file mode 100644 index 0000000..68afd6d --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/es.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/et.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/et.js new file mode 100644 index 0000000..070b61a --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/et.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/eu.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/eu.js new file mode 100644 index 0000000..90d5e73 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/eu.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/fa.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/fa.js new file mode 100644 index 0000000..e1ffdbe --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/fa.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/fi.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/fi.js new file mode 100644 index 0000000..ffed124 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/fi.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/fr.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/fr.js new file mode 100644 index 0000000..dd02f97 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/fr.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/gl.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/gl.js new file mode 100644 index 0000000..208a005 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/gl.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/he.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/he.js new file mode 100644 index 0000000..25a8805 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/he.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/hi.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/hi.js new file mode 100644 index 0000000..f3ed798 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/hi.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/hr.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/hr.js new file mode 100644 index 0000000..cb3268d --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/hr.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/hsb.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/hsb.js new file mode 100644 index 0000000..3d5bf09 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/hsb.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/hu.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/hu.js new file mode 100644 index 0000000..4893aa2 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/hu.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/hy.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/hy.js new file mode 100644 index 0000000..8230007 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/hy.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/id.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/id.js new file mode 100644 index 0000000..4a0b3bf --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/id.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/is.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/is.js new file mode 100644 index 0000000..cca5bbe --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/is.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/it.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/it.js new file mode 100644 index 0000000..507c7d9 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/it.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ja.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ja.js new file mode 100644 index 0000000..451025e --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ja.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ka.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ka.js new file mode 100644 index 0000000..60c593b --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ka.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/km.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/km.js new file mode 100644 index 0000000..4dca94f --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/km.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ko.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ko.js new file mode 100644 index 0000000..f2880fb --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ko.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/lt.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/lt.js new file mode 100644 index 0000000..f6a4215 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/lt.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/lv.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/lv.js new file mode 100644 index 0000000..806dc5c --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/lv.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/mk.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/mk.js new file mode 100644 index 0000000..cb7b84a --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/mk.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ms.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ms.js new file mode 100644 index 0000000..6bd7eaa --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ms.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/nb.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/nb.js new file mode 100644 index 0000000..25d89c6 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/nb.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ne.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ne.js new file mode 100644 index 0000000..1c39f67 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ne.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/nl.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/nl.js new file mode 100644 index 0000000..2b74058 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/nl.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/pl.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/pl.js new file mode 100644 index 0000000..4ca5748 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/pl.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ps.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ps.js new file mode 100644 index 0000000..9b008e4 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ps.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/pt-BR.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/pt-BR.js new file mode 100644 index 0000000..c991e25 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/pt-BR.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/pt.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/pt.js new file mode 100644 index 0000000..b5da1a6 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/pt.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ro.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ro.js new file mode 100644 index 0000000..1ba7b40 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ro.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ru.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ru.js new file mode 100644 index 0000000..63a7d66 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ru.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sk.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sk.js new file mode 100644 index 0000000..5049528 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sk.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sl.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sl.js new file mode 100644 index 0000000..4d0b7d3 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sl.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sq.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sq.js new file mode 100644 index 0000000..5916202 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sq.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sr-Cyrl.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sr-Cyrl.js new file mode 100644 index 0000000..ce13ce8 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sr-Cyrl.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sr.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sr.js new file mode 100644 index 0000000..dd407a0 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sr.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sv.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sv.js new file mode 100644 index 0000000..1bc8724 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sv.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/th.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/th.js new file mode 100644 index 0000000..63eab71 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/th.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/tk.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/tk.js new file mode 100644 index 0000000..30255ff --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/tk.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/tr.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/tr.js new file mode 100644 index 0000000..fc4c0bf --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/tr.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/uk.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/uk.js new file mode 100644 index 0000000..63697e3 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/uk.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/vi.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/vi.js new file mode 100644 index 0000000..24f3bc2 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/vi.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/zh-CN.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/zh-CN.js new file mode 100644 index 0000000..2c5649d --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/zh-CN.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/zh-TW.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/zh-TW.js new file mode 100644 index 0000000..570a566 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/zh-TW.js @@ -0,0 +1,3 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/select2.full.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/select2.full.js new file mode 100644 index 0000000..358572a --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/select2.full.js @@ -0,0 +1,6820 @@ +/*! + * 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/select2.full.min.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/select2.full.min.js new file mode 100644 index 0000000..fa78191 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/select2/select2.full.min.js @@ -0,0 +1,2 @@ +/*! 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/xregexp/LICENSE.txt b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/xregexp/LICENSE.txt new file mode 100644 index 0000000..43f08b4 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/xregexp/LICENSE.txt @@ -0,0 +1,21 @@ +The MIT License + +Copyright (c) 2007-2017 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/xregexp/xregexp.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/xregexp/xregexp.js new file mode 100644 index 0000000..ded6f6f --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/xregexp/xregexp.js @@ -0,0 +1,4652 @@ +(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 e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ +/*! + * XRegExp.build 3.2.0 + * <xregexp.com> + * Steven Levithan (c) 2012-2017 MIT License + * Inspired by Lea Verou's RegExp.create <lea.verou.me> + */ + +module.exports = function(XRegExp) { + 'use strict'; + + var REGEX_DATA = 'xregexp'; + var subParts = /(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*\]/g; + var parts = XRegExp.union([/\({{([\w$]+)}}\)|{{([\w$]+)}}/, subParts], 'g', { + conjunction: 'or' + }); + + /** + * Strips a leading `^` and trailing unescaped `$`, if both are present. + * + * @private + * @param {String} pattern Pattern to process. + * @returns {String} Pattern with edge anchors removed. + */ + function deanchor(pattern) { + // Allow any number of empty noncapturing groups before/after anchors, because regexes + // built/generated by XRegExp sometimes include them + var leadingAnchor = /^(?:\(\?:\))*\^/; + var trailingAnchor = /\$(?:\(\?:\))*$/; + + if ( + leadingAnchor.test(pattern) && + trailingAnchor.test(pattern) && + // Ensure that the trailing `$` isn't escaped + trailingAnchor.test(pattern.replace(/\\[\s\S]/g, '')) + ) { + return pattern.replace(leadingAnchor, '').replace(trailingAnchor, ''); + } + + return pattern; + } + + /** + * Converts the provided value to an XRegExp. Native RegExp flags are not preserved. + * + * @private + * @param {String|RegExp} value Value to convert. + * @param {Boolean} [addFlagX] Whether to apply the `x` flag in cases when `value` is not + * already a regex generated by XRegExp + * @returns {RegExp} XRegExp object with XRegExp syntax applied. + */ + function asXRegExp(value, addFlagX) { + var flags = addFlagX ? 'x' : ''; + return XRegExp.isRegExp(value) ? + (value[REGEX_DATA] && value[REGEX_DATA].captureNames ? + // Don't recompile, to preserve capture names + value : + // Recompile as XRegExp + XRegExp(value.source, flags) + ) : + // Compile string as XRegExp + XRegExp(value, flags); + } + + /** + * Builds regexes using named subpatterns, for readability and pattern reuse. Backreferences in + * the outer pattern and provided subpatterns are automatically renumbered to work correctly. + * Native flags used by provided subpatterns are ignored in favor of the `flags` argument. + * + * @memberOf XRegExp + * @param {String} pattern XRegExp pattern using `{{name}}` for embedded subpatterns. Allows + * `({{name}})` as shorthand for `(?<name>{{name}})`. Patterns cannot be embedded within + * character classes. + * @param {Object} subs Lookup object for named subpatterns. Values can be strings or regexes. A + * leading `^` and trailing unescaped `$` are stripped from subpatterns, if both are present. + * @param {String} [flags] Any combination of XRegExp flags. + * @returns {RegExp} Regex with interpolated subpatterns. + * @example + * + * var time = XRegExp.build('(?x)^ {{hours}} ({{minutes}}) $', { + * hours: XRegExp.build('{{h12}} : | {{h24}}', { + * h12: /1[0-2]|0?[1-9]/, + * h24: /2[0-3]|[01][0-9]/ + * }, 'x'), + * minutes: /^[0-5][0-9]$/ + * }); + * time.test('10:59'); // -> true + * XRegExp.exec('10:59', time).minutes; // -> '59' + */ + XRegExp.build = function(pattern, subs, flags) { + flags = flags || ''; + // Used with `asXRegExp` calls for `pattern` and subpatterns in `subs`, to work around how + // some browsers convert `RegExp('\n')` to a regex that contains the literal characters `\` + // and `n`. See more details at <https://github.com/slevithan/xregexp/pull/163>. + var addFlagX = flags.indexOf('x') > -1; + var inlineFlags = /^\(\?([\w$]+)\)/.exec(pattern); + // Add flags within a leading mode modifier to the overall pattern's flags + if (inlineFlags) { + flags = XRegExp._clipDuplicates(flags + inlineFlags[1]); + } + + var data = {}; + for (var p in subs) { + if (subs.hasOwnProperty(p)) { + // Passing to XRegExp enables extended syntax and ensures independent validity, + // lest an unescaped `(`, `)`, `[`, or trailing `\` breaks the `(?:)` wrapper. For + // subpatterns provided as native regexes, it dies on octals and adds the property + // used to hold extended regex instance data, for simplicity. + var sub = asXRegExp(subs[p], addFlagX); + data[p] = { + // Deanchoring allows embedding independently useful anchored regexes. If you + // really need to keep your anchors, double them (i.e., `^^...$$`). + pattern: deanchor(sub.source), + names: sub[REGEX_DATA].captureNames || [] + }; + } + } + + // Passing to XRegExp dies on octals and ensures the outer pattern is independently valid; + // helps keep this simple. Named captures will be put back. + var patternAsRegex = asXRegExp(pattern, addFlagX); + + // 'Caps' is short for 'captures' + var numCaps = 0; + var numPriorCaps; + var numOuterCaps = 0; + var outerCapsMap = [0]; + var outerCapNames = patternAsRegex[REGEX_DATA].captureNames || []; + var output = patternAsRegex.source.replace(parts, function($0, $1, $2, $3, $4) { + var subName = $1 || $2; + var capName; + var intro; + var localCapIndex; + // Named subpattern + if (subName) { + if (!data.hasOwnProperty(subName)) { + throw new ReferenceError('Undefined property ' + $0); + } + // Named subpattern was wrapped in a capturing group + if ($1) { + capName = outerCapNames[numOuterCaps]; + outerCapsMap[++numOuterCaps] = ++numCaps; + // If it's a named group, preserve the name. Otherwise, use the subpattern name + // as the capture name + intro = '(?<' + (capName || subName) + '>'; + } else { + intro = '(?:'; + } + numPriorCaps = numCaps; + return intro + data[subName].pattern.replace(subParts, function(match, paren, backref) { + // Capturing group + if (paren) { + capName = data[subName].names[numCaps - numPriorCaps]; + ++numCaps; + // If the current capture has a name, preserve the name + if (capName) { + return '(?<' + capName + '>'; + } + // Backreference + } else if (backref) { + localCapIndex = +backref - 1; + // Rewrite the backreference + return data[subName].names[localCapIndex] ? + // Need to preserve the backreference name in case using flag `n` + '\\k<' + data[subName].names[localCapIndex] + '>' : + '\\' + (+backref + numPriorCaps); + } + return match; + }) + ')'; + } + // Capturing group + if ($3) { + capName = outerCapNames[numOuterCaps]; + outerCapsMap[++numOuterCaps] = ++numCaps; + // If the current capture has a name, preserve the name + if (capName) { + return '(?<' + capName + '>'; + } + // Backreference + } else if ($4) { + localCapIndex = +$4 - 1; + // Rewrite the backreference + return outerCapNames[localCapIndex] ? + // Need to preserve the backreference name in case using flag `n` + '\\k<' + outerCapNames[localCapIndex] + '>' : + '\\' + outerCapsMap[+$4]; + } + return $0; + }); + + return XRegExp(output, flags); + }; + +}; + +},{}],2:[function(require,module,exports){ +/*! + * XRegExp.matchRecursive 3.2.0 + * <xregexp.com> + * Steven Levithan (c) 2009-2017 MIT License + */ + +module.exports = function(XRegExp) { + 'use strict'; + + /** + * Returns a match detail object composed of the provided values. + * + * @private + */ + function row(name, value, start, end) { + return { + name: name, + value: value, + start: start, + end: end + }; + } + + /** + * Returns an array of match strings between outermost left and right delimiters, or an array of + * objects with detailed match parts and position data. An error is thrown if delimiters are + * unbalanced within the data. + * + * @memberOf XRegExp + * @param {String} str String to search. + * @param {String} left Left delimiter as an XRegExp pattern. + * @param {String} right Right delimiter as an XRegExp pattern. + * @param {String} [flags] Any native or XRegExp flags, used for the left and right delimiters. + * @param {Object} [options] Lets you specify `valueNames` and `escapeChar` options. + * @returns {Array} Array of matches, or an empty array. + * @example + * + * // Basic usage + * var str = '(t((e))s)t()(ing)'; + * XRegExp.matchRecursive(str, '\\(', '\\)', 'g'); + * // -> ['t((e))s', '', 'ing'] + * + * // Extended information mode with valueNames + * str = 'Here is <div> <div>an</div></div> example'; + * XRegExp.matchRecursive(str, '<div\\s*>', '</div>', 'gi', { + * valueNames: ['between', 'left', 'match', 'right'] + * }); + * // -> [ + * // {name: 'between', value: 'Here is ', start: 0, end: 8}, + * // {name: 'left', value: '<div>', start: 8, end: 13}, + * // {name: 'match', value: ' <div>an</div>', start: 13, end: 27}, + * // {name: 'right', value: '</div>', start: 27, end: 33}, + * // {name: 'between', value: ' example', start: 33, end: 41} + * // ] + * + * // Omitting unneeded parts with null valueNames, and using escapeChar + * str = '...{1}.\\{{function(x,y){return {y:x}}}'; + * XRegExp.matchRecursive(str, '{', '}', 'g', { + * valueNames: ['literal', null, 'value', null], + * escapeChar: '\\' + * }); + * // -> [ + * // {name: 'literal', value: '...', start: 0, end: 3}, + * // {name: 'value', value: '1', start: 4, end: 5}, + * // {name: 'literal', value: '.\\{', start: 6, end: 9}, + * // {name: 'value', value: 'function(x,y){return {y:x}}', start: 10, end: 37} + * // ] + * + * // Sticky mode via flag y + * str = '<1><<<2>>><3>4<5>'; + * XRegExp.matchRecursive(str, '<', '>', 'gy'); + * // -> ['1', '<<2>>', '3'] + */ + XRegExp.matchRecursive = function(str, left, right, flags, options) { + flags = flags || ''; + options = options || {}; + var global = flags.indexOf('g') > -1; + var sticky = flags.indexOf('y') > -1; + // Flag `y` is controlled internally + var basicFlags = flags.replace(/y/g, ''); + var escapeChar = options.escapeChar; + var vN = options.valueNames; + var output = []; + var openTokens = 0; + var delimStart = 0; + var delimEnd = 0; + var lastOuterEnd = 0; + var outerStart; + var innerStart; + var leftMatch; + var rightMatch; + var esc; + left = XRegExp(left, basicFlags); + right = XRegExp(right, basicFlags); + + if (escapeChar) { + if (escapeChar.length > 1) { + throw new Error('Cannot use more than one escape character'); + } + escapeChar = XRegExp.escape(escapeChar); + // Example of concatenated `esc` regex: + // `escapeChar`: '%' + // `left`: '<' + // `right`: '>' + // Regex is: /(?:%[\S\s]|(?:(?!<|>)[^%])+)+/ + esc = new RegExp( + '(?:' + escapeChar + '[\\S\\s]|(?:(?!' + + // Using `XRegExp.union` safely rewrites backreferences in `left` and `right`. + // Intentionally not passing `basicFlags` to `XRegExp.union` since any syntax + // transformation resulting from those flags was already applied to `left` and + // `right` when they were passed through the XRegExp constructor above. + XRegExp.union([left, right], '', {conjunction: 'or'}).source + + ')[^' + escapeChar + '])+)+', + // Flags `gy` not needed here + flags.replace(/[^imu]+/g, '') + ); + } + + while (true) { + // If using an escape character, advance to the delimiter's next starting position, + // skipping any escaped characters in between + if (escapeChar) { + delimEnd += (XRegExp.exec(str, esc, delimEnd, 'sticky') || [''])[0].length; + } + leftMatch = XRegExp.exec(str, left, delimEnd); + rightMatch = XRegExp.exec(str, right, delimEnd); + // Keep the leftmost match only + if (leftMatch && rightMatch) { + if (leftMatch.index <= rightMatch.index) { + rightMatch = null; + } else { + leftMatch = null; + } + } + // Paths (LM: leftMatch, RM: rightMatch, OT: openTokens): + // LM | RM | OT | Result + // 1 | 0 | 1 | loop + // 1 | 0 | 0 | loop + // 0 | 1 | 1 | loop + // 0 | 1 | 0 | throw + // 0 | 0 | 1 | throw + // 0 | 0 | 0 | break + // The paths above don't include the sticky mode special case. The loop ends after the + // first completed match if not `global`. + if (leftMatch || rightMatch) { + delimStart = (leftMatch || rightMatch).index; + delimEnd = delimStart + (leftMatch || rightMatch)[0].length; + } else if (!openTokens) { + break; + } + if (sticky && !openTokens && delimStart > lastOuterEnd) { + break; + } + if (leftMatch) { + if (!openTokens) { + outerStart = delimStart; + innerStart = delimEnd; + } + ++openTokens; + } else if (rightMatch && openTokens) { + if (!--openTokens) { + if (vN) { + if (vN[0] && outerStart > lastOuterEnd) { + output.push(row(vN[0], str.slice(lastOuterEnd, outerStart), lastOuterEnd, outerStart)); + } + if (vN[1]) { + output.push(row(vN[1], str.slice(outerStart, innerStart), outerStart, innerStart)); + } + if (vN[2]) { + output.push(row(vN[2], str.slice(innerStart, delimStart), innerStart, delimStart)); + } + if (vN[3]) { + output.push(row(vN[3], str.slice(delimStart, delimEnd), delimStart, delimEnd)); + } + } else { + output.push(str.slice(innerStart, delimStart)); + } + lastOuterEnd = delimEnd; + if (!global) { + break; + } + } + } else { + throw new Error('Unbalanced delimiter found in string'); + } + // If the delimiter matched an empty string, avoid an infinite loop + if (delimStart === delimEnd) { + ++delimEnd; + } + } + + if (global && !sticky && vN && vN[0] && str.length > lastOuterEnd) { + output.push(row(vN[0], str.slice(lastOuterEnd), lastOuterEnd, str.length)); + } + + return output; + }; + +}; + +},{}],3:[function(require,module,exports){ +/*! + * XRegExp Unicode Base 3.2.0 + * <xregexp.com> + * Steven Levithan (c) 2008-2017 MIT License + */ + +module.exports = function(XRegExp) { + 'use strict'; + + /** + * 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, blocks, and properties. + * + * @requires XRegExp + */ + + // ==--------------------------== + // Private stuff + // ==--------------------------== + + // Storage for Unicode data + var unicode = {}; + + // 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.charAt(0) === '\\' ? 1 : 0); + } + + // Inverts a list of ordered BMP characters and ranges + function invertBmp(range) { + var output = ''; + var lastEnd = -1; + + XRegExp.forEach( + range, + /(\\x..|\\u....|\\?[\s\S])(?:-(\\x..|\\u....|\\?[\s\S]))?/, + function(m) { + var start = charCode(m[1]); + if (start > (lastEnd + 1)) { + output += '\\u' + pad4(hex(lastEnd + 1)); + if (start > (lastEnd + 2)) { + output += '-\\u' + pad4(hex(start - 1)); + } + } + lastEnd = charCode(m[2] || m[1]); + } + ); + + if (lastEnd < 0xFFFF) { + output += '\\u' + 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) { + combined = '[' + item.bmp + ']' + (item.astral ? '|' : ''); + } + if (item.astral) { + combined += item.astral; + } + if (item.isBmpLast && item.bmp) { + combined += (item.astral ? '|' : '') + '[' + item.bmp + ']'; + } + + // Astral Unicode tokens always match a code point, never a code unit + return isNegated ? + '(?:(?!' + combined + ')(?:[\uD800-\uDBFF][\uDC00-\uDFFF]|[\0-\uFFFF]))' : + '(?:' + 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])(?:{(\^?)([^}]*)}|([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'; + // Negated via \P{..} or \p{^..} + var isNegated = match[1] === 'P' || !!match[2]; + // Switch from BMP (0-FFFF) to astral (0-10FFFF) mode via flag A + var isAstralMode = flags.indexOf('A') > -1; + // Token lookup name. Check `[4]` first to avoid passing `undefined` via `\p{}` + var slug = normalize(match[4] || match[3]); + // Token data object + var item = unicode[slug]; + + if (match[1] === 'P' && match[2]) { + throw new SyntaxError(ERR_DOUBLE_NEG + match[0]); + } + if (!unicode.hasOwnProperty(slug)) { + throw new SyntaxError(ERR_UNKNOWN_NAME + match[0]); + } + + // Switch to the negated form of the referenced Unicode token + if (item.inverseOf) { + slug = normalize(item.inverseOf); + if (!unicode.hasOwnProperty(slug)) { + throw new ReferenceError(ERR_UNKNOWN_REF + match[0] + ' -> ' + item.inverseOf); + } + item = unicode[slug]; + isNegated = !isNegated; + } + + if (!(item.bmp || isAstralMode)) { + throw new SyntaxError(ERR_ASTRAL_ONLY + match[0]); + } + if (isAstralMode) { + if (scope === 'class') { + throw new SyntaxError(ERR_ASTRAL_IN_CLASS); + } + + return cacheAstral(slug, isNegated); + } + + return scope === 'class' ? + (isNegated ? cacheInvertedBmp(slug) : item.bmp) : + (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. + * @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) { + var ERR_NO_NAME = 'Unicode token requires name'; + var ERR_NO_DATA = 'Unicode token has no character data '; + var item; + + for (var i = 0; i < data.length; ++i) { + item = data[i]; + if (!item.name) { + throw new Error(ERR_NO_NAME); + } + if (!(item.inverseOf || item.bmp || item.astral)) { + throw new Error(ERR_NO_DATA + item.name); + } + unicode[normalize(item.name)] = item; + if (item.alias) { + unicode[normalize(item.alias)] = item; + } + } + + // Reset the pattern cache used by the `XRegExp` constructor, since the same pattern and + // flags might now produce different results + 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]; + }; + +}; + +},{}],4:[function(require,module,exports){ +/*! + * XRegExp Unicode Blocks 3.2.0 + * <xregexp.com> + * Steven Levithan (c) 2010-2017 MIT License + * Unicode data by Mathias Bynens <mathiasbynens.be> + */ + +module.exports = function(XRegExp) { + 'use strict'; + + /** + * Adds support for all Unicode blocks. Block names use the prefix 'In'. E.g., + * `\p{InBasicLatin}`. Token names are case insensitive, and any spaces, hyphens, and + * underscores are ignored. + * + * Uses Unicode 9.0.0. + * + * @requires XRegExp, Unicode Base + */ + + if (!XRegExp.addUnicodeData) { + throw new ReferenceError('Unicode Base must be loaded before Unicode Blocks'); + } + + XRegExp.addUnicodeData([ + { + name: 'InAdlam', + astral: '\uD83A[\uDD00-\uDD5F]' + }, + { + name: 'InAegean_Numbers', + astral: '\uD800[\uDD00-\uDD3F]' + }, + { + name: 'InAhom', + astral: '\uD805[\uDF00-\uDF3F]' + }, + { + name: 'InAlchemical_Symbols', + astral: '\uD83D[\uDF00-\uDF7F]' + }, + { + name: 'InAlphabetic_Presentation_Forms', + bmp: '\uFB00-\uFB4F' + }, + { + name: 'InAnatolian_Hieroglyphs', + astral: '\uD811[\uDC00-\uDE7F]' + }, + { + name: 'InAncient_Greek_Musical_Notation', + astral: '\uD834[\uDE00-\uDE4F]' + }, + { + name: 'InAncient_Greek_Numbers', + astral: '\uD800[\uDD40-\uDD8F]' + }, + { + name: 'InAncient_Symbols', + astral: '\uD800[\uDD90-\uDDCF]' + }, + { + name: 'InArabic', + bmp: '\u0600-\u06FF' + }, + { + name: 'InArabic_Extended_A', + bmp: '\u08A0-\u08FF' + }, + { + name: 'InArabic_Mathematical_Alphabetic_Symbols', + astral: '\uD83B[\uDE00-\uDEFF]' + }, + { + name: 'InArabic_Presentation_Forms_A', + bmp: '\uFB50-\uFDFF' + }, + { + name: 'InArabic_Presentation_Forms_B', + bmp: '\uFE70-\uFEFF' + }, + { + name: 'InArabic_Supplement', + bmp: '\u0750-\u077F' + }, + { + name: 'InArmenian', + bmp: '\u0530-\u058F' + }, + { + name: 'InArrows', + bmp: '\u2190-\u21FF' + }, + { + name: 'InAvestan', + astral: '\uD802[\uDF00-\uDF3F]' + }, + { + name: 'InBalinese', + bmp: '\u1B00-\u1B7F' + }, + { + name: 'InBamum', + bmp: '\uA6A0-\uA6FF' + }, + { + name: 'InBamum_Supplement', + astral: '\uD81A[\uDC00-\uDE3F]' + }, + { + name: 'InBasic_Latin', + bmp: '\0-\x7F' + }, + { + name: 'InBassa_Vah', + astral: '\uD81A[\uDED0-\uDEFF]' + }, + { + name: 'InBatak', + bmp: '\u1BC0-\u1BFF' + }, + { + name: 'InBengali', + bmp: '\u0980-\u09FF' + }, + { + name: 'InBhaiksuki', + astral: '\uD807[\uDC00-\uDC6F]' + }, + { + name: 'InBlock_Elements', + bmp: '\u2580-\u259F' + }, + { + name: 'InBopomofo', + bmp: '\u3100-\u312F' + }, + { + name: 'InBopomofo_Extended', + bmp: '\u31A0-\u31BF' + }, + { + name: 'InBox_Drawing', + bmp: '\u2500-\u257F' + }, + { + name: 'InBrahmi', + astral: '\uD804[\uDC00-\uDC7F]' + }, + { + name: 'InBraille_Patterns', + bmp: '\u2800-\u28FF' + }, + { + name: 'InBuginese', + bmp: '\u1A00-\u1A1F' + }, + { + name: 'InBuhid', + bmp: '\u1740-\u175F' + }, + { + name: 'InByzantine_Musical_Symbols', + astral: '\uD834[\uDC00-\uDCFF]' + }, + { + name: 'InCJK_Compatibility', + bmp: '\u3300-\u33FF' + }, + { + name: 'InCJK_Compatibility_Forms', + bmp: '\uFE30-\uFE4F' + }, + { + name: 'InCJK_Compatibility_Ideographs', + bmp: '\uF900-\uFAFF' + }, + { + name: 'InCJK_Compatibility_Ideographs_Supplement', + astral: '\uD87E[\uDC00-\uDE1F]' + }, + { + name: 'InCJK_Radicals_Supplement', + bmp: '\u2E80-\u2EFF' + }, + { + name: 'InCJK_Strokes', + bmp: '\u31C0-\u31EF' + }, + { + name: 'InCJK_Symbols_and_Punctuation', + bmp: '\u3000-\u303F' + }, + { + name: 'InCJK_Unified_Ideographs', + bmp: '\u4E00-\u9FFF' + }, + { + name: 'InCJK_Unified_Ideographs_Extension_A', + bmp: '\u3400-\u4DBF' + }, + { + name: 'InCJK_Unified_Ideographs_Extension_B', + astral: '[\uD840-\uD868][\uDC00-\uDFFF]|\uD869[\uDC00-\uDEDF]' + }, + { + name: 'InCJK_Unified_Ideographs_Extension_C', + astral: '\uD869[\uDF00-\uDFFF]|[\uD86A-\uD86C][\uDC00-\uDFFF]|\uD86D[\uDC00-\uDF3F]' + }, + { + name: 'InCJK_Unified_Ideographs_Extension_D', + astral: '\uD86D[\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1F]' + }, + { + name: 'InCJK_Unified_Ideographs_Extension_E', + astral: '\uD86E[\uDC20-\uDFFF]|[\uD86F-\uD872][\uDC00-\uDFFF]|\uD873[\uDC00-\uDEAF]' + }, + { + name: 'InCarian', + astral: '\uD800[\uDEA0-\uDEDF]' + }, + { + name: 'InCaucasian_Albanian', + astral: '\uD801[\uDD30-\uDD6F]' + }, + { + name: 'InChakma', + astral: '\uD804[\uDD00-\uDD4F]' + }, + { + name: 'InCham', + bmp: '\uAA00-\uAA5F' + }, + { + name: 'InCherokee', + bmp: '\u13A0-\u13FF' + }, + { + name: 'InCherokee_Supplement', + bmp: '\uAB70-\uABBF' + }, + { + name: 'InCombining_Diacritical_Marks', + bmp: '\u0300-\u036F' + }, + { + name: 'InCombining_Diacritical_Marks_Extended', + bmp: '\u1AB0-\u1AFF' + }, + { + name: 'InCombining_Diacritical_Marks_Supplement', + bmp: '\u1DC0-\u1DFF' + }, + { + name: 'InCombining_Diacritical_Marks_for_Symbols', + bmp: '\u20D0-\u20FF' + }, + { + name: 'InCombining_Half_Marks', + bmp: '\uFE20-\uFE2F' + }, + { + name: 'InCommon_Indic_Number_Forms', + bmp: '\uA830-\uA83F' + }, + { + name: 'InControl_Pictures', + bmp: '\u2400-\u243F' + }, + { + name: 'InCoptic', + bmp: '\u2C80-\u2CFF' + }, + { + name: 'InCoptic_Epact_Numbers', + astral: '\uD800[\uDEE0-\uDEFF]' + }, + { + name: 'InCounting_Rod_Numerals', + astral: '\uD834[\uDF60-\uDF7F]' + }, + { + name: 'InCuneiform', + astral: '\uD808[\uDC00-\uDFFF]' + }, + { + name: 'InCuneiform_Numbers_and_Punctuation', + astral: '\uD809[\uDC00-\uDC7F]' + }, + { + name: 'InCurrency_Symbols', + bmp: '\u20A0-\u20CF' + }, + { + name: 'InCypriot_Syllabary', + astral: '\uD802[\uDC00-\uDC3F]' + }, + { + name: 'InCyrillic', + bmp: '\u0400-\u04FF' + }, + { + name: 'InCyrillic_Extended_A', + bmp: '\u2DE0-\u2DFF' + }, + { + name: 'InCyrillic_Extended_B', + bmp: '\uA640-\uA69F' + }, + { + name: 'InCyrillic_Extended_C', + bmp: '\u1C80-\u1C8F' + }, + { + name: 'InCyrillic_Supplement', + bmp: '\u0500-\u052F' + }, + { + name: 'InDeseret', + astral: '\uD801[\uDC00-\uDC4F]' + }, + { + name: 'InDevanagari', + bmp: '\u0900-\u097F' + }, + { + name: 'InDevanagari_Extended', + bmp: '\uA8E0-\uA8FF' + }, + { + name: 'InDingbats', + bmp: '\u2700-\u27BF' + }, + { + name: 'InDomino_Tiles', + astral: '\uD83C[\uDC30-\uDC9F]' + }, + { + name: 'InDuployan', + astral: '\uD82F[\uDC00-\uDC9F]' + }, + { + name: 'InEarly_Dynastic_Cuneiform', + astral: '\uD809[\uDC80-\uDD4F]' + }, + { + name: 'InEgyptian_Hieroglyphs', + astral: '\uD80C[\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2F]' + }, + { + name: 'InElbasan', + astral: '\uD801[\uDD00-\uDD2F]' + }, + { + name: 'InEmoticons', + astral: '\uD83D[\uDE00-\uDE4F]' + }, + { + name: 'InEnclosed_Alphanumeric_Supplement', + astral: '\uD83C[\uDD00-\uDDFF]' + }, + { + name: 'InEnclosed_Alphanumerics', + bmp: '\u2460-\u24FF' + }, + { + name: 'InEnclosed_CJK_Letters_and_Months', + bmp: '\u3200-\u32FF' + }, + { + name: 'InEnclosed_Ideographic_Supplement', + astral: '\uD83C[\uDE00-\uDEFF]' + }, + { + name: 'InEthiopic', + bmp: '\u1200-\u137F' + }, + { + name: 'InEthiopic_Extended', + bmp: '\u2D80-\u2DDF' + }, + { + name: 'InEthiopic_Extended_A', + bmp: '\uAB00-\uAB2F' + }, + { + name: 'InEthiopic_Supplement', + bmp: '\u1380-\u139F' + }, + { + name: 'InGeneral_Punctuation', + bmp: '\u2000-\u206F' + }, + { + name: 'InGeometric_Shapes', + bmp: '\u25A0-\u25FF' + }, + { + name: 'InGeometric_Shapes_Extended', + astral: '\uD83D[\uDF80-\uDFFF]' + }, + { + name: 'InGeorgian', + bmp: '\u10A0-\u10FF' + }, + { + name: 'InGeorgian_Supplement', + bmp: '\u2D00-\u2D2F' + }, + { + name: 'InGlagolitic', + bmp: '\u2C00-\u2C5F' + }, + { + name: 'InGlagolitic_Supplement', + astral: '\uD838[\uDC00-\uDC2F]' + }, + { + name: 'InGothic', + astral: '\uD800[\uDF30-\uDF4F]' + }, + { + name: 'InGrantha', + astral: '\uD804[\uDF00-\uDF7F]' + }, + { + name: 'InGreek_Extended', + bmp: '\u1F00-\u1FFF' + }, + { + name: 'InGreek_and_Coptic', + bmp: '\u0370-\u03FF' + }, + { + name: 'InGujarati', + bmp: '\u0A80-\u0AFF' + }, + { + name: 'InGurmukhi', + bmp: '\u0A00-\u0A7F' + }, + { + name: 'InHalfwidth_and_Fullwidth_Forms', + bmp: '\uFF00-\uFFEF' + }, + { + name: 'InHangul_Compatibility_Jamo', + bmp: '\u3130-\u318F' + }, + { + name: 'InHangul_Jamo', + bmp: '\u1100-\u11FF' + }, + { + name: 'InHangul_Jamo_Extended_A', + bmp: '\uA960-\uA97F' + }, + { + name: 'InHangul_Jamo_Extended_B', + bmp: '\uD7B0-\uD7FF' + }, + { + name: 'InHangul_Syllables', + bmp: '\uAC00-\uD7AF' + }, + { + name: 'InHanunoo', + bmp: '\u1720-\u173F' + }, + { + name: 'InHatran', + astral: '\uD802[\uDCE0-\uDCFF]' + }, + { + name: 'InHebrew', + bmp: '\u0590-\u05FF' + }, + { + name: 'InHigh_Private_Use_Surrogates', + bmp: '\uDB80-\uDBFF' + }, + { + name: 'InHigh_Surrogates', + bmp: '\uD800-\uDB7F' + }, + { + name: 'InHiragana', + bmp: '\u3040-\u309F' + }, + { + name: 'InIPA_Extensions', + bmp: '\u0250-\u02AF' + }, + { + name: 'InIdeographic_Description_Characters', + bmp: '\u2FF0-\u2FFF' + }, + { + name: 'InIdeographic_Symbols_and_Punctuation', + astral: '\uD81B[\uDFE0-\uDFFF]' + }, + { + name: 'InImperial_Aramaic', + astral: '\uD802[\uDC40-\uDC5F]' + }, + { + name: 'InInscriptional_Pahlavi', + astral: '\uD802[\uDF60-\uDF7F]' + }, + { + name: 'InInscriptional_Parthian', + astral: '\uD802[\uDF40-\uDF5F]' + }, + { + name: 'InJavanese', + bmp: '\uA980-\uA9DF' + }, + { + name: 'InKaithi', + astral: '\uD804[\uDC80-\uDCCF]' + }, + { + name: 'InKana_Supplement', + astral: '\uD82C[\uDC00-\uDCFF]' + }, + { + name: 'InKanbun', + bmp: '\u3190-\u319F' + }, + { + name: 'InKangxi_Radicals', + bmp: '\u2F00-\u2FDF' + }, + { + name: 'InKannada', + bmp: '\u0C80-\u0CFF' + }, + { + name: 'InKatakana', + bmp: '\u30A0-\u30FF' + }, + { + name: 'InKatakana_Phonetic_Extensions', + bmp: '\u31F0-\u31FF' + }, + { + name: 'InKayah_Li', + bmp: '\uA900-\uA92F' + }, + { + name: 'InKharoshthi', + astral: '\uD802[\uDE00-\uDE5F]' + }, + { + name: 'InKhmer', + bmp: '\u1780-\u17FF' + }, + { + name: 'InKhmer_Symbols', + bmp: '\u19E0-\u19FF' + }, + { + name: 'InKhojki', + astral: '\uD804[\uDE00-\uDE4F]' + }, + { + name: 'InKhudawadi', + astral: '\uD804[\uDEB0-\uDEFF]' + }, + { + name: 'InLao', + bmp: '\u0E80-\u0EFF' + }, + { + name: 'InLatin_Extended_Additional', + bmp: '\u1E00-\u1EFF' + }, + { + name: 'InLatin_Extended_A', + bmp: '\u0100-\u017F' + }, + { + name: 'InLatin_Extended_B', + bmp: '\u0180-\u024F' + }, + { + name: 'InLatin_Extended_C', + bmp: '\u2C60-\u2C7F' + }, + { + name: 'InLatin_Extended_D', + bmp: '\uA720-\uA7FF' + }, + { + name: 'InLatin_Extended_E', + bmp: '\uAB30-\uAB6F' + }, + { + name: 'InLatin_1_Supplement', + bmp: '\x80-\xFF' + }, + { + name: 'InLepcha', + bmp: '\u1C00-\u1C4F' + }, + { + name: 'InLetterlike_Symbols', + bmp: '\u2100-\u214F' + }, + { + name: 'InLimbu', + bmp: '\u1900-\u194F' + }, + { + name: 'InLinear_A', + astral: '\uD801[\uDE00-\uDF7F]' + }, + { + name: 'InLinear_B_Ideograms', + astral: '\uD800[\uDC80-\uDCFF]' + }, + { + name: 'InLinear_B_Syllabary', + astral: '\uD800[\uDC00-\uDC7F]' + }, + { + name: 'InLisu', + bmp: '\uA4D0-\uA4FF' + }, + { + name: 'InLow_Surrogates', + bmp: '\uDC00-\uDFFF' + }, + { + name: 'InLycian', + astral: '\uD800[\uDE80-\uDE9F]' + }, + { + name: 'InLydian', + astral: '\uD802[\uDD20-\uDD3F]' + }, + { + name: 'InMahajani', + astral: '\uD804[\uDD50-\uDD7F]' + }, + { + name: 'InMahjong_Tiles', + astral: '\uD83C[\uDC00-\uDC2F]' + }, + { + name: 'InMalayalam', + bmp: '\u0D00-\u0D7F' + }, + { + name: 'InMandaic', + bmp: '\u0840-\u085F' + }, + { + name: 'InManichaean', + astral: '\uD802[\uDEC0-\uDEFF]' + }, + { + name: 'InMarchen', + astral: '\uD807[\uDC70-\uDCBF]' + }, + { + name: 'InMathematical_Alphanumeric_Symbols', + astral: '\uD835[\uDC00-\uDFFF]' + }, + { + name: 'InMathematical_Operators', + bmp: '\u2200-\u22FF' + }, + { + name: 'InMeetei_Mayek', + bmp: '\uABC0-\uABFF' + }, + { + name: 'InMeetei_Mayek_Extensions', + bmp: '\uAAE0-\uAAFF' + }, + { + name: 'InMende_Kikakui', + astral: '\uD83A[\uDC00-\uDCDF]' + }, + { + name: 'InMeroitic_Cursive', + astral: '\uD802[\uDDA0-\uDDFF]' + }, + { + name: 'InMeroitic_Hieroglyphs', + astral: '\uD802[\uDD80-\uDD9F]' + }, + { + name: 'InMiao', + astral: '\uD81B[\uDF00-\uDF9F]' + }, + { + name: 'InMiscellaneous_Mathematical_Symbols_A', + bmp: '\u27C0-\u27EF' + }, + { + name: 'InMiscellaneous_Mathematical_Symbols_B', + bmp: '\u2980-\u29FF' + }, + { + name: 'InMiscellaneous_Symbols', + bmp: '\u2600-\u26FF' + }, + { + name: 'InMiscellaneous_Symbols_and_Arrows', + bmp: '\u2B00-\u2BFF' + }, + { + name: 'InMiscellaneous_Symbols_and_Pictographs', + astral: '\uD83C[\uDF00-\uDFFF]|\uD83D[\uDC00-\uDDFF]' + }, + { + name: 'InMiscellaneous_Technical', + bmp: '\u2300-\u23FF' + }, + { + name: 'InModi', + astral: '\uD805[\uDE00-\uDE5F]' + }, + { + name: 'InModifier_Tone_Letters', + bmp: '\uA700-\uA71F' + }, + { + name: 'InMongolian', + bmp: '\u1800-\u18AF' + }, + { + name: 'InMongolian_Supplement', + astral: '\uD805[\uDE60-\uDE7F]' + }, + { + name: 'InMro', + astral: '\uD81A[\uDE40-\uDE6F]' + }, + { + name: 'InMultani', + astral: '\uD804[\uDE80-\uDEAF]' + }, + { + name: 'InMusical_Symbols', + astral: '\uD834[\uDD00-\uDDFF]' + }, + { + name: 'InMyanmar', + bmp: '\u1000-\u109F' + }, + { + name: 'InMyanmar_Extended_A', + bmp: '\uAA60-\uAA7F' + }, + { + name: 'InMyanmar_Extended_B', + bmp: '\uA9E0-\uA9FF' + }, + { + name: 'InNKo', + bmp: '\u07C0-\u07FF' + }, + { + name: 'InNabataean', + astral: '\uD802[\uDC80-\uDCAF]' + }, + { + name: 'InNew_Tai_Lue', + bmp: '\u1980-\u19DF' + }, + { + name: 'InNewa', + astral: '\uD805[\uDC00-\uDC7F]' + }, + { + name: 'InNumber_Forms', + bmp: '\u2150-\u218F' + }, + { + name: 'InOgham', + bmp: '\u1680-\u169F' + }, + { + name: 'InOl_Chiki', + bmp: '\u1C50-\u1C7F' + }, + { + name: 'InOld_Hungarian', + astral: '\uD803[\uDC80-\uDCFF]' + }, + { + name: 'InOld_Italic', + astral: '\uD800[\uDF00-\uDF2F]' + }, + { + name: 'InOld_North_Arabian', + astral: '\uD802[\uDE80-\uDE9F]' + }, + { + name: 'InOld_Permic', + astral: '\uD800[\uDF50-\uDF7F]' + }, + { + name: 'InOld_Persian', + astral: '\uD800[\uDFA0-\uDFDF]' + }, + { + name: 'InOld_South_Arabian', + astral: '\uD802[\uDE60-\uDE7F]' + }, + { + name: 'InOld_Turkic', + astral: '\uD803[\uDC00-\uDC4F]' + }, + { + name: 'InOptical_Character_Recognition', + bmp: '\u2440-\u245F' + }, + { + name: 'InOriya', + bmp: '\u0B00-\u0B7F' + }, + { + name: 'InOrnamental_Dingbats', + astral: '\uD83D[\uDE50-\uDE7F]' + }, + { + name: 'InOsage', + astral: '\uD801[\uDCB0-\uDCFF]' + }, + { + name: 'InOsmanya', + astral: '\uD801[\uDC80-\uDCAF]' + }, + { + name: 'InPahawh_Hmong', + astral: '\uD81A[\uDF00-\uDF8F]' + }, + { + name: 'InPalmyrene', + astral: '\uD802[\uDC60-\uDC7F]' + }, + { + name: 'InPau_Cin_Hau', + astral: '\uD806[\uDEC0-\uDEFF]' + }, + { + name: 'InPhags_pa', + bmp: '\uA840-\uA87F' + }, + { + name: 'InPhaistos_Disc', + astral: '\uD800[\uDDD0-\uDDFF]' + }, + { + name: 'InPhoenician', + astral: '\uD802[\uDD00-\uDD1F]' + }, + { + name: 'InPhonetic_Extensions', + bmp: '\u1D00-\u1D7F' + }, + { + name: 'InPhonetic_Extensions_Supplement', + bmp: '\u1D80-\u1DBF' + }, + { + name: 'InPlaying_Cards', + astral: '\uD83C[\uDCA0-\uDCFF]' + }, + { + name: 'InPrivate_Use_Area', + bmp: '\uE000-\uF8FF' + }, + { + name: 'InPsalter_Pahlavi', + astral: '\uD802[\uDF80-\uDFAF]' + }, + { + name: 'InRejang', + bmp: '\uA930-\uA95F' + }, + { + name: 'InRumi_Numeral_Symbols', + astral: '\uD803[\uDE60-\uDE7F]' + }, + { + name: 'InRunic', + bmp: '\u16A0-\u16FF' + }, + { + name: 'InSamaritan', + bmp: '\u0800-\u083F' + }, + { + name: 'InSaurashtra', + bmp: '\uA880-\uA8DF' + }, + { + name: 'InSharada', + astral: '\uD804[\uDD80-\uDDDF]' + }, + { + name: 'InShavian', + astral: '\uD801[\uDC50-\uDC7F]' + }, + { + name: 'InShorthand_Format_Controls', + astral: '\uD82F[\uDCA0-\uDCAF]' + }, + { + name: 'InSiddham', + astral: '\uD805[\uDD80-\uDDFF]' + }, + { + name: 'InSinhala', + bmp: '\u0D80-\u0DFF' + }, + { + name: 'InSinhala_Archaic_Numbers', + astral: '\uD804[\uDDE0-\uDDFF]' + }, + { + name: 'InSmall_Form_Variants', + bmp: '\uFE50-\uFE6F' + }, + { + name: 'InSora_Sompeng', + astral: '\uD804[\uDCD0-\uDCFF]' + }, + { + name: 'InSpacing_Modifier_Letters', + bmp: '\u02B0-\u02FF' + }, + { + name: 'InSpecials', + bmp: '\uFFF0-\uFFFF' + }, + { + name: 'InSundanese', + bmp: '\u1B80-\u1BBF' + }, + { + name: 'InSundanese_Supplement', + bmp: '\u1CC0-\u1CCF' + }, + { + name: 'InSuperscripts_and_Subscripts', + bmp: '\u2070-\u209F' + }, + { + name: 'InSupplemental_Arrows_A', + bmp: '\u27F0-\u27FF' + }, + { + name: 'InSupplemental_Arrows_B', + bmp: '\u2900-\u297F' + }, + { + name: 'InSupplemental_Arrows_C', + astral: '\uD83E[\uDC00-\uDCFF]' + }, + { + name: 'InSupplemental_Mathematical_Operators', + bmp: '\u2A00-\u2AFF' + }, + { + name: 'InSupplemental_Punctuation', + bmp: '\u2E00-\u2E7F' + }, + { + name: 'InSupplemental_Symbols_and_Pictographs', + astral: '\uD83E[\uDD00-\uDDFF]' + }, + { + name: 'InSupplementary_Private_Use_Area_A', + astral: '[\uDB80-\uDBBF][\uDC00-\uDFFF]' + }, + { + name: 'InSupplementary_Private_Use_Area_B', + astral: '[\uDBC0-\uDBFF][\uDC00-\uDFFF]' + }, + { + name: 'InSutton_SignWriting', + astral: '\uD836[\uDC00-\uDEAF]' + }, + { + name: 'InSyloti_Nagri', + bmp: '\uA800-\uA82F' + }, + { + name: 'InSyriac', + bmp: '\u0700-\u074F' + }, + { + name: 'InTagalog', + bmp: '\u1700-\u171F' + }, + { + name: 'InTagbanwa', + bmp: '\u1760-\u177F' + }, + { + name: 'InTags', + astral: '\uDB40[\uDC00-\uDC7F]' + }, + { + name: 'InTai_Le', + bmp: '\u1950-\u197F' + }, + { + name: 'InTai_Tham', + bmp: '\u1A20-\u1AAF' + }, + { + name: 'InTai_Viet', + bmp: '\uAA80-\uAADF' + }, + { + name: 'InTai_Xuan_Jing_Symbols', + astral: '\uD834[\uDF00-\uDF5F]' + }, + { + name: 'InTakri', + astral: '\uD805[\uDE80-\uDECF]' + }, + { + name: 'InTamil', + bmp: '\u0B80-\u0BFF' + }, + { + name: 'InTangut', + astral: '[\uD81C-\uD821][\uDC00-\uDFFF]' + }, + { + name: 'InTangut_Components', + astral: '\uD822[\uDC00-\uDEFF]' + }, + { + name: 'InTelugu', + bmp: '\u0C00-\u0C7F' + }, + { + name: 'InThaana', + bmp: '\u0780-\u07BF' + }, + { + name: 'InThai', + bmp: '\u0E00-\u0E7F' + }, + { + name: 'InTibetan', + bmp: '\u0F00-\u0FFF' + }, + { + name: 'InTifinagh', + bmp: '\u2D30-\u2D7F' + }, + { + name: 'InTirhuta', + astral: '\uD805[\uDC80-\uDCDF]' + }, + { + name: 'InTransport_and_Map_Symbols', + astral: '\uD83D[\uDE80-\uDEFF]' + }, + { + name: 'InUgaritic', + astral: '\uD800[\uDF80-\uDF9F]' + }, + { + name: 'InUnified_Canadian_Aboriginal_Syllabics', + bmp: '\u1400-\u167F' + }, + { + name: 'InUnified_Canadian_Aboriginal_Syllabics_Extended', + bmp: '\u18B0-\u18FF' + }, + { + name: 'InVai', + bmp: '\uA500-\uA63F' + }, + { + name: 'InVariation_Selectors', + bmp: '\uFE00-\uFE0F' + }, + { + name: 'InVariation_Selectors_Supplement', + astral: '\uDB40[\uDD00-\uDDEF]' + }, + { + name: 'InVedic_Extensions', + bmp: '\u1CD0-\u1CFF' + }, + { + name: 'InVertical_Forms', + bmp: '\uFE10-\uFE1F' + }, + { + name: 'InWarang_Citi', + astral: '\uD806[\uDCA0-\uDCFF]' + }, + { + name: 'InYi_Radicals', + bmp: '\uA490-\uA4CF' + }, + { + name: 'InYi_Syllables', + bmp: '\uA000-\uA48F' + }, + { + name: 'InYijing_Hexagram_Symbols', + bmp: '\u4DC0-\u4DFF' + } + ]); + +}; + +},{}],5:[function(require,module,exports){ +/*! + * XRegExp Unicode Categories 3.2.0 + * <xregexp.com> + * Steven Levithan (c) 2010-2017 MIT License + * Unicode data by Mathias Bynens <mathiasbynens.be> + */ + +module.exports = function(XRegExp) { + 'use strict'; + + /** + * 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 9.0.0. + * + * @requires XRegExp, Unicode Base + */ + + if (!XRegExp.addUnicodeData) { + throw new ReferenceError('Unicode Base must be loaded before Unicode Categories'); + } + + XRegExp.addUnicodeData([ + { + name: 'C', + alias: 'Other', + isBmpLast: true, + bmp: '\0-\x1F\x7F-\x9F\xAD\u0378\u0379\u0380-\u0383\u038B\u038D\u03A2\u0530\u0557\u0558\u0560\u0588\u058B\u058C\u0590\u05C8-\u05CF\u05EB-\u05EF\u05F5-\u0605\u061C\u061D\u06DD\u070E\u070F\u074B\u074C\u07B2-\u07BF\u07FB-\u07FF\u082E\u082F\u083F\u085C\u085D\u085F-\u089F\u08B5\u08BE-\u08D3\u08E2\u0984\u098D\u098E\u0991\u0992\u09A9\u09B1\u09B3-\u09B5\u09BA\u09BB\u09C5\u09C6\u09C9\u09CA\u09CF-\u09D6\u09D8-\u09DB\u09DE\u09E4\u09E5\u09FC-\u0A00\u0A04\u0A0B-\u0A0E\u0A11\u0A12\u0A29\u0A31\u0A34\u0A37\u0A3A\u0A3B\u0A3D\u0A43-\u0A46\u0A49\u0A4A\u0A4E-\u0A50\u0A52-\u0A58\u0A5D\u0A5F-\u0A65\u0A76-\u0A80\u0A84\u0A8E\u0A92\u0AA9\u0AB1\u0AB4\u0ABA\u0ABB\u0AC6\u0ACA\u0ACE\u0ACF\u0AD1-\u0ADF\u0AE4\u0AE5\u0AF2-\u0AF8\u0AFA-\u0B00\u0B04\u0B0D\u0B0E\u0B11\u0B12\u0B29\u0B31\u0B34\u0B3A\u0B3B\u0B45\u0B46\u0B49\u0B4A\u0B4E-\u0B55\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\u0C04\u0C0D\u0C11\u0C29\u0C3A-\u0C3C\u0C45\u0C49\u0C4E-\u0C54\u0C57\u0C5B-\u0C5F\u0C64\u0C65\u0C70-\u0C77\u0C84\u0C8D\u0C91\u0CA9\u0CB4\u0CBA\u0CBB\u0CC5\u0CC9\u0CCE-\u0CD4\u0CD7-\u0CDD\u0CDF\u0CE4\u0CE5\u0CF0\u0CF3-\u0D00\u0D04\u0D0D\u0D11\u0D3B\u0D3C\u0D45\u0D49\u0D50-\u0D53\u0D64\u0D65\u0D80\u0D81\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\u0E86\u0E89\u0E8B\u0E8C\u0E8E-\u0E93\u0E98\u0EA0\u0EA4\u0EA6\u0EA8\u0EA9\u0EAC\u0EBA\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\u170D\u1715-\u171F\u1737-\u173F\u1754-\u175F\u176D\u1771\u1774-\u177F\u17DE\u17DF\u17EA-\u17EF\u17FA-\u17FF\u180E\u180F\u181A-\u181F\u1878-\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\u1ABF-\u1AFF\u1B4C-\u1B4F\u1B7D-\u1B7F\u1BF4-\u1BFB\u1C38-\u1C3A\u1C4A-\u1C4C\u1C89-\u1CBF\u1CC8-\u1CCF\u1CF7\u1CFA-\u1CFF\u1DF6-\u1DFA\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\u20BF-\u20CF\u20F1-\u20FF\u218C-\u218F\u23FF\u2427-\u243F\u244B-\u245F\u2B74\u2B75\u2B96\u2B97\u2BBA-\u2BBC\u2BC9\u2BD2-\u2BEB\u2BF0-\u2BFF\u2C2F\u2C5F\u2CF4-\u2CF8\u2D26\u2D28-\u2D2C\u2D2E\u2D2F\u2D68-\u2D6E\u2D71-\u2D7E\u2D97-\u2D9F\u2DA7\u2DAF\u2DB7\u2DBF\u2DC7\u2DCF\u2DD7\u2DDF\u2E45-\u2E7F\u2E9A\u2EF4-\u2EFF\u2FD6-\u2FEF\u2FFC-\u2FFF\u3040\u3097\u3098\u3100-\u3104\u312E-\u3130\u318F\u31BB-\u31BF\u31E4-\u31EF\u321F\u32FF\u4DB6-\u4DBF\u9FD6-\u9FFF\uA48D-\uA48F\uA4C7-\uA4CF\uA62C-\uA63F\uA6F8-\uA6FF\uA7AF\uA7B8-\uA7F6\uA82C-\uA82F\uA83A-\uA83F\uA878-\uA87F\uA8C6-\uA8CD\uA8DA-\uA8DF\uA8FE\uA8FF\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\uAB66-\uAB6F\uABEE\uABEF\uABFA-\uABFF\uD7A4-\uD7AF\uD7C7-\uD7CA\uD7FC-\uF8FF\uFA6E\uFA6F\uFADA-\uFAFF\uFB07-\uFB12\uFB18-\uFB1C\uFB37\uFB3D\uFB3F\uFB42\uFB45\uFBC2-\uFBD2\uFD40-\uFD4F\uFD90\uFD91\uFDC8-\uFDEF\uFDFE\uFDFF\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\uDD9C-\uDD9F\uDDA1-\uDDCF\uDDFE-\uDE7F\uDE9D-\uDE9F\uDED1-\uDEDF\uDEFC-\uDEFF\uDF24-\uDF2F\uDF4B-\uDF4F\uDF7B-\uDF7F\uDF9E\uDFC4-\uDFC7\uDFD6-\uDFFF]|\uD801[\uDC9E\uDC9F\uDCAA-\uDCAF\uDCD4-\uDCD7\uDCFC-\uDCFF\uDD28-\uDD2F\uDD64-\uDD6E\uDD70-\uDDFF\uDF37-\uDF3F\uDF56-\uDF5F\uDF68-\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\uDE34-\uDE37\uDE3B-\uDE3E\uDE48-\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\uDD00-\uDE5F\uDE7F-\uDFFF]|\uD804[\uDC4E-\uDC51\uDC70-\uDC7E\uDCBD\uDCC2-\uDCCF\uDCE9-\uDCEF\uDCFA-\uDCFF\uDD35\uDD44-\uDD4F\uDD77-\uDD7F\uDDCE\uDDCF\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\uDF3B\uDF45\uDF46\uDF49\uDF4A\uDF4E\uDF4F\uDF51-\uDF56\uDF58-\uDF5C\uDF64\uDF65\uDF6D-\uDF6F\uDF75-\uDFFF]|\uD805[\uDC5A\uDC5C\uDC5E-\uDC7F\uDCC8-\uDCCF\uDCDA-\uDD7F\uDDB6\uDDB7\uDDDE-\uDDFF\uDE45-\uDE4F\uDE5A-\uDE5F\uDE6D-\uDE7F\uDEB8-\uDEBF\uDECA-\uDEFF\uDF1A-\uDF1C\uDF2C-\uDF2F\uDF40-\uDFFF]|\uD806[\uDC00-\uDC9F\uDCF3-\uDCFE\uDD00-\uDEBF\uDEF9-\uDFFF]|\uD807[\uDC09\uDC37\uDC46-\uDC4F\uDC6D-\uDC6F\uDC90\uDC91\uDCA8\uDCB7-\uDFFF]|\uD808[\uDF9A-\uDFFF]|\uD809[\uDC6F\uDC75-\uDC7F\uDD44-\uDFFF]|[\uD80A\uD80B\uD80E-\uD810\uD812-\uD819\uD823-\uD82B\uD82D\uD82E\uD830-\uD833\uD837\uD839\uD83F\uD874-\uD87D\uD87F-\uDB3F\uDB41-\uDBFF][\uDC00-\uDFFF]|\uD80D[\uDC2F-\uDFFF]|\uD811[\uDE47-\uDFFF]|\uD81A[\uDE39-\uDE3F\uDE5F\uDE6A-\uDE6D\uDE70-\uDECF\uDEEE\uDEEF\uDEF6-\uDEFF\uDF46-\uDF4F\uDF5A\uDF62\uDF78-\uDF7C\uDF90-\uDFFF]|\uD81B[\uDC00-\uDEFF\uDF45-\uDF4F\uDF7F-\uDF8E\uDFA0-\uDFDF\uDFE1-\uDFFF]|\uD821[\uDFED-\uDFFF]|\uD822[\uDEF3-\uDFFF]|\uD82C[\uDC02-\uDFFF]|\uD82F[\uDC6B-\uDC6F\uDC7D-\uDC7F\uDC89-\uDC8F\uDC9A\uDC9B\uDCA0-\uDFFF]|\uD834[\uDCF6-\uDCFF\uDD27\uDD28\uDD73-\uDD7A\uDDE9-\uDDFF\uDE46-\uDEFF\uDF57-\uDF5F\uDF72-\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]|\uD838[\uDC07\uDC19\uDC1A\uDC22\uDC25\uDC2B-\uDFFF]|\uD83A[\uDCC5\uDCC6\uDCD7-\uDCFF\uDD4B-\uDD4F\uDD5A-\uDD5D\uDD60-\uDFFF]|\uD83B[\uDC00-\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\uDD0D-\uDD0F\uDD2F\uDD6C-\uDD6F\uDDAD-\uDDE5\uDE03-\uDE0F\uDE3C-\uDE3F\uDE49-\uDE4F\uDE52-\uDEFF]|\uD83D[\uDED3-\uDEDF\uDEED-\uDEEF\uDEF7-\uDEFF\uDF74-\uDF7F\uDFD5-\uDFFF]|\uD83E[\uDC0C-\uDC0F\uDC48-\uDC4F\uDC5A-\uDC5F\uDC88-\uDC8F\uDCAE-\uDD0F\uDD1F\uDD28-\uDD2F\uDD31\uDD32\uDD3F\uDD4C-\uDD4F\uDD5F-\uDD7F\uDD92-\uDDBF\uDDC1-\uDFFF]|\uD869[\uDED7-\uDEFF]|\uD86D[\uDF35-\uDF3F]|\uD86E[\uDC1E\uDC1F]|\uD873[\uDEA2-\uDFFF]|\uD87E[\uDE1E-\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\u08E2\u180E\u200B-\u200F\u202A-\u202E\u2060-\u2064\u2066-\u206F\uFEFF\uFFF9-\uFFFB', + astral: '\uD804\uDCBD|\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\u0560\u0588\u058B\u058C\u0590\u05C8-\u05CF\u05EB-\u05EF\u05F5-\u05FF\u061D\u070E\u074B\u074C\u07B2-\u07BF\u07FB-\u07FF\u082E\u082F\u083F\u085C\u085D\u085F-\u089F\u08B5\u08BE-\u08D3\u0984\u098D\u098E\u0991\u0992\u09A9\u09B1\u09B3-\u09B5\u09BA\u09BB\u09C5\u09C6\u09C9\u09CA\u09CF-\u09D6\u09D8-\u09DB\u09DE\u09E4\u09E5\u09FC-\u0A00\u0A04\u0A0B-\u0A0E\u0A11\u0A12\u0A29\u0A31\u0A34\u0A37\u0A3A\u0A3B\u0A3D\u0A43-\u0A46\u0A49\u0A4A\u0A4E-\u0A50\u0A52-\u0A58\u0A5D\u0A5F-\u0A65\u0A76-\u0A80\u0A84\u0A8E\u0A92\u0AA9\u0AB1\u0AB4\u0ABA\u0ABB\u0AC6\u0ACA\u0ACE\u0ACF\u0AD1-\u0ADF\u0AE4\u0AE5\u0AF2-\u0AF8\u0AFA-\u0B00\u0B04\u0B0D\u0B0E\u0B11\u0B12\u0B29\u0B31\u0B34\u0B3A\u0B3B\u0B45\u0B46\u0B49\u0B4A\u0B4E-\u0B55\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\u0C04\u0C0D\u0C11\u0C29\u0C3A-\u0C3C\u0C45\u0C49\u0C4E-\u0C54\u0C57\u0C5B-\u0C5F\u0C64\u0C65\u0C70-\u0C77\u0C84\u0C8D\u0C91\u0CA9\u0CB4\u0CBA\u0CBB\u0CC5\u0CC9\u0CCE-\u0CD4\u0CD7-\u0CDD\u0CDF\u0CE4\u0CE5\u0CF0\u0CF3-\u0D00\u0D04\u0D0D\u0D11\u0D3B\u0D3C\u0D45\u0D49\u0D50-\u0D53\u0D64\u0D65\u0D80\u0D81\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\u0E86\u0E89\u0E8B\u0E8C\u0E8E-\u0E93\u0E98\u0EA0\u0EA4\u0EA6\u0EA8\u0EA9\u0EAC\u0EBA\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\u170D\u1715-\u171F\u1737-\u173F\u1754-\u175F\u176D\u1771\u1774-\u177F\u17DE\u17DF\u17EA-\u17EF\u17FA-\u17FF\u180F\u181A-\u181F\u1878-\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\u1ABF-\u1AFF\u1B4C-\u1B4F\u1B7D-\u1B7F\u1BF4-\u1BFB\u1C38-\u1C3A\u1C4A-\u1C4C\u1C89-\u1CBF\u1CC8-\u1CCF\u1CF7\u1CFA-\u1CFF\u1DF6-\u1DFA\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\u20BF-\u20CF\u20F1-\u20FF\u218C-\u218F\u23FF\u2427-\u243F\u244B-\u245F\u2B74\u2B75\u2B96\u2B97\u2BBA-\u2BBC\u2BC9\u2BD2-\u2BEB\u2BF0-\u2BFF\u2C2F\u2C5F\u2CF4-\u2CF8\u2D26\u2D28-\u2D2C\u2D2E\u2D2F\u2D68-\u2D6E\u2D71-\u2D7E\u2D97-\u2D9F\u2DA7\u2DAF\u2DB7\u2DBF\u2DC7\u2DCF\u2DD7\u2DDF\u2E45-\u2E7F\u2E9A\u2EF4-\u2EFF\u2FD6-\u2FEF\u2FFC-\u2FFF\u3040\u3097\u3098\u3100-\u3104\u312E-\u3130\u318F\u31BB-\u31BF\u31E4-\u31EF\u321F\u32FF\u4DB6-\u4DBF\u9FD6-\u9FFF\uA48D-\uA48F\uA4C7-\uA4CF\uA62C-\uA63F\uA6F8-\uA6FF\uA7AF\uA7B8-\uA7F6\uA82C-\uA82F\uA83A-\uA83F\uA878-\uA87F\uA8C6-\uA8CD\uA8DA-\uA8DF\uA8FE\uA8FF\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\uAB66-\uAB6F\uABEE\uABEF\uABFA-\uABFF\uD7A4-\uD7AF\uD7C7-\uD7CA\uD7FC-\uD7FF\uFA6E\uFA6F\uFADA-\uFAFF\uFB07-\uFB12\uFB18-\uFB1C\uFB37\uFB3D\uFB3F\uFB42\uFB45\uFBC2-\uFBD2\uFD40-\uFD4F\uFD90\uFD91\uFDC8-\uFDEF\uFDFE\uFDFF\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\uDD9C-\uDD9F\uDDA1-\uDDCF\uDDFE-\uDE7F\uDE9D-\uDE9F\uDED1-\uDEDF\uDEFC-\uDEFF\uDF24-\uDF2F\uDF4B-\uDF4F\uDF7B-\uDF7F\uDF9E\uDFC4-\uDFC7\uDFD6-\uDFFF]|\uD801[\uDC9E\uDC9F\uDCAA-\uDCAF\uDCD4-\uDCD7\uDCFC-\uDCFF\uDD28-\uDD2F\uDD64-\uDD6E\uDD70-\uDDFF\uDF37-\uDF3F\uDF56-\uDF5F\uDF68-\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\uDE34-\uDE37\uDE3B-\uDE3E\uDE48-\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\uDD00-\uDE5F\uDE7F-\uDFFF]|\uD804[\uDC4E-\uDC51\uDC70-\uDC7E\uDCC2-\uDCCF\uDCE9-\uDCEF\uDCFA-\uDCFF\uDD35\uDD44-\uDD4F\uDD77-\uDD7F\uDDCE\uDDCF\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\uDF3B\uDF45\uDF46\uDF49\uDF4A\uDF4E\uDF4F\uDF51-\uDF56\uDF58-\uDF5C\uDF64\uDF65\uDF6D-\uDF6F\uDF75-\uDFFF]|\uD805[\uDC5A\uDC5C\uDC5E-\uDC7F\uDCC8-\uDCCF\uDCDA-\uDD7F\uDDB6\uDDB7\uDDDE-\uDDFF\uDE45-\uDE4F\uDE5A-\uDE5F\uDE6D-\uDE7F\uDEB8-\uDEBF\uDECA-\uDEFF\uDF1A-\uDF1C\uDF2C-\uDF2F\uDF40-\uDFFF]|\uD806[\uDC00-\uDC9F\uDCF3-\uDCFE\uDD00-\uDEBF\uDEF9-\uDFFF]|\uD807[\uDC09\uDC37\uDC46-\uDC4F\uDC6D-\uDC6F\uDC90\uDC91\uDCA8\uDCB7-\uDFFF]|\uD808[\uDF9A-\uDFFF]|\uD809[\uDC6F\uDC75-\uDC7F\uDD44-\uDFFF]|[\uD80A\uD80B\uD80E-\uD810\uD812-\uD819\uD823-\uD82B\uD82D\uD82E\uD830-\uD833\uD837\uD839\uD83F\uD874-\uD87D\uD87F-\uDB3F\uDB41-\uDB7F][\uDC00-\uDFFF]|\uD80D[\uDC2F-\uDFFF]|\uD811[\uDE47-\uDFFF]|\uD81A[\uDE39-\uDE3F\uDE5F\uDE6A-\uDE6D\uDE70-\uDECF\uDEEE\uDEEF\uDEF6-\uDEFF\uDF46-\uDF4F\uDF5A\uDF62\uDF78-\uDF7C\uDF90-\uDFFF]|\uD81B[\uDC00-\uDEFF\uDF45-\uDF4F\uDF7F-\uDF8E\uDFA0-\uDFDF\uDFE1-\uDFFF]|\uD821[\uDFED-\uDFFF]|\uD822[\uDEF3-\uDFFF]|\uD82C[\uDC02-\uDFFF]|\uD82F[\uDC6B-\uDC6F\uDC7D-\uDC7F\uDC89-\uDC8F\uDC9A\uDC9B\uDCA4-\uDFFF]|\uD834[\uDCF6-\uDCFF\uDD27\uDD28\uDDE9-\uDDFF\uDE46-\uDEFF\uDF57-\uDF5F\uDF72-\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]|\uD838[\uDC07\uDC19\uDC1A\uDC22\uDC25\uDC2B-\uDFFF]|\uD83A[\uDCC5\uDCC6\uDCD7-\uDCFF\uDD4B-\uDD4F\uDD5A-\uDD5D\uDD60-\uDFFF]|\uD83B[\uDC00-\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\uDD0D-\uDD0F\uDD2F\uDD6C-\uDD6F\uDDAD-\uDDE5\uDE03-\uDE0F\uDE3C-\uDE3F\uDE49-\uDE4F\uDE52-\uDEFF]|\uD83D[\uDED3-\uDEDF\uDEED-\uDEEF\uDEF7-\uDEFF\uDF74-\uDF7F\uDFD5-\uDFFF]|\uD83E[\uDC0C-\uDC0F\uDC48-\uDC4F\uDC5A-\uDC5F\uDC88-\uDC8F\uDCAE-\uDD0F\uDD1F\uDD28-\uDD2F\uDD31\uDD32\uDD3F\uDD4C-\uDD4F\uDD5F-\uDD7F\uDD92-\uDDBF\uDDC1-\uDFFF]|\uD869[\uDED7-\uDEFF]|\uD86D[\uDF35-\uDF3F]|\uD86E[\uDC1E\uDC1F]|\uD873[\uDEA2-\uDFFF]|\uD87E[\uDE1E-\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\u0561-\u0587\u05D0-\u05EA\u05F0-\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\u08A0-\u08B4\u08B6-\u08BD\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\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\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\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\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\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-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\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-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\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-\u2C2E\u2C30-\u2C5E\u2C60-\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-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\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-\uAB65\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\uDF30-\uDF40\uDF42-\uDF49\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\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-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\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\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F]|\uD808[\uDC00-\uDF99]|\uD809[\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00\uDC01]|\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]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\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-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]' + }, + { + 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\u0561-\u0587\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-\u2C5E\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\uA7B5\uA7B7\uA7FA\uAB30-\uAB5A\uAB60-\uAB65\uAB70-\uABBF\uFB00-\uFB06\uFB13-\uFB17\uFF41-\uFF5A', + astral: '\uD801[\uDC28-\uDC4F\uDCD8-\uDCFB]|\uD803[\uDCC0-\uDCF2]|\uD806[\uDCC0-\uDCDF]|\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]|\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\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\uA7F8\uA7F9\uA9CF\uA9E6\uAA70\uAADD\uAAF3\uAAF4\uAB5C-\uAB5F\uFF70\uFF9E\uFF9F', + astral: '\uD81A[\uDF40-\uDF43]|\uD81B[\uDF93-\uDF9F\uDFE0]' + }, + { + name: 'Lo', + alias: 'Other_Letter', + bmp: '\xAA\xBA\u01BB\u01C0-\u01C3\u0294\u05D0-\u05EA\u05F0-\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\u08A0-\u08B4\u08B6-\u08BD\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\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\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\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\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\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\u10D0-\u10FA\u10FD-\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-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17DC\u1820-\u1842\u1844-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C77\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\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-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\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\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\uDF30-\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-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\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\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCFF\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F]|\uD808[\uDC00-\uDF99]|\uD809[\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\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-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]' + }, + { + 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\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-\u2C2E\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\uFF21-\uFF3A', + astral: '\uD801[\uDC00-\uDC27\uDCB0-\uDCD3]|\uD803[\uDC80-\uDCB2]|\uD806[\uDCA0-\uDCBF]|\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\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u08D4-\u08E1\u08E3-\u0903\u093A-\u093C\u093E-\u094F\u0951-\u0957\u0962\u0963\u0981-\u0983\u09BC\u09BE-\u09C4\u09C7\u09C8\u09CB-\u09CD\u09D7\u09E2\u09E3\u0A01-\u0A03\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A70\u0A71\u0A75\u0A81-\u0A83\u0ABC\u0ABE-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AE2\u0AE3\u0B01-\u0B03\u0B3C\u0B3E-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B62\u0B63\u0B82\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0C00-\u0C03\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C81-\u0C83\u0CBC\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CE2\u0CE3\u0D01-\u0D03\u0D3E-\u0D44\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D62\u0D63\u0D82\u0D83\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EB9\u0EBB\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-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17B4-\u17D3\u17DD\u180B-\u180D\u1885\u1886\u18A9\u1920-\u192B\u1930-\u193B\u1A17-\u1A1B\u1A55-\u1A5E\u1A60-\u1A7C\u1A7F\u1AB0-\u1ABE\u1B00-\u1B04\u1B34-\u1B44\u1B6B-\u1B73\u1B80-\u1B82\u1BA1-\u1BAD\u1BE6-\u1BF3\u1C24-\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE8\u1CED\u1CF2-\u1CF4\u1CF8\u1CF9\u1DC0-\u1DF5\u1DFB-\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\uA880\uA881\uA8B4-\uA8C5\uA8E0-\uA8F1\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]|\uD804[\uDC00-\uDC02\uDC38-\uDC46\uDC7F-\uDC82\uDCB0-\uDCBA\uDD00-\uDD02\uDD27-\uDD34\uDD73\uDD80-\uDD82\uDDB3-\uDDC0\uDDCA-\uDDCC\uDE2C-\uDE37\uDE3E\uDEDF-\uDEEA\uDF00-\uDF03\uDF3C\uDF3E-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF57\uDF62\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC35-\uDC46\uDCB0-\uDCC3\uDDAF-\uDDB5\uDDB8-\uDDC0\uDDDC\uDDDD\uDE30-\uDE40\uDEAB-\uDEB7\uDF1D-\uDF2B]|\uD807[\uDC2F-\uDC36\uDC38-\uDC3F\uDC92-\uDCA7\uDCA9-\uDCB6]|\uD81A[\uDEF0-\uDEF4\uDF30-\uDF36]|\uD81B[\uDF51-\uDF7E\uDF8F-\uDF92]|\uD82F[\uDC9D\uDC9E]|\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]|\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\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\u1CF2\u1CF3\u302E\u302F\uA823\uA824\uA827\uA880\uA881\uA8B4-\uA8C3\uA952\uA953\uA983\uA9B4\uA9B5\uA9BA\uA9BB\uA9BD-\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\uDD82\uDDB3-\uDDB5\uDDBF\uDDC0\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]|\uD807[\uDC2F\uDC3E\uDCA9\uDCB1\uDCB4]|\uD81B[\uDF51-\uDF7E]|\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\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u08D4-\u08E1\u08E3-\u0902\u093A\u093C\u0941-\u0948\u094D\u0951-\u0957\u0962\u0963\u0981\u09BC\u09C1-\u09C4\u09CD\u09E2\u09E3\u0A01\u0A02\u0A3C\u0A41\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A70\u0A71\u0A75\u0A81\u0A82\u0ABC\u0AC1-\u0AC5\u0AC7\u0AC8\u0ACD\u0AE2\u0AE3\u0B01\u0B3C\u0B3F\u0B41-\u0B44\u0B4D\u0B56\u0B62\u0B63\u0B82\u0BC0\u0BCD\u0C00\u0C3E-\u0C40\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C81\u0CBC\u0CBF\u0CC6\u0CCC\u0CCD\u0CE2\u0CE3\u0D01\u0D41-\u0D44\u0D4D\u0D62\u0D63\u0DCA\u0DD2-\u0DD4\u0DD6\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EB9\u0EBB\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-\u1734\u1752\u1753\u1772\u1773\u17B4\u17B5\u17B7-\u17BD\u17C6\u17C9-\u17D3\u17DD\u180B-\u180D\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\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-\u1DF5\u1DFB-\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\uA8C4\uA8C5\uA8E0-\uA8F1\uA926-\uA92D\uA947-\uA951\uA980-\uA982\uA9B3\uA9B6-\uA9B9\uA9BC\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]|\uD804[\uDC01\uDC38-\uDC46\uDC7F-\uDC81\uDCB3-\uDCB6\uDCB9\uDCBA\uDD00-\uDD02\uDD27-\uDD2B\uDD2D-\uDD34\uDD73\uDD80\uDD81\uDDB6-\uDDBE\uDDCA-\uDDCC\uDE2F-\uDE31\uDE34\uDE36\uDE37\uDE3E\uDEDF\uDEE3-\uDEEA\uDF00\uDF01\uDF3C\uDF40\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC38-\uDC3F\uDC42-\uDC44\uDC46\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]|\uD807[\uDC30-\uDC36\uDC38-\uDC3D\uDC3F\uDC92-\uDCA7\uDCAA-\uDCB0\uDCB2\uDCB3\uDCB5\uDCB6]|\uD81A[\uDEF0-\uDEF4\uDF30-\uDF36]|\uD81B[\uDF8F-\uDF92]|\uD82F[\uDC9D\uDC9E]|\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]|\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-\uDE47\uDE7D\uDE7E\uDE9D-\uDE9F\uDEEB-\uDEEF\uDF58-\uDF5F\uDF78-\uDF7F\uDFA9-\uDFAF]|\uD803[\uDCFA-\uDCFF\uDE60-\uDE7E]|\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]|\uD807[\uDC50-\uDC6C]|\uD809[\uDC00-\uDC6E]|\uD81A[\uDE60-\uDE69\uDF50-\uDF59\uDF5B-\uDF61]|\uD834[\uDF60-\uDF71]|\uD835[\uDFCE-\uDFFF]|\uD83A[\uDCC7-\uDCCF\uDD50-\uDD59]|\uD83C[\uDD00-\uDD0C]' + }, + { + 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]|\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]|\uD807[\uDC50-\uDC59]|\uD81A[\uDE60-\uDE69\uDF50-\uDF59]|\uD835[\uDFCE-\uDFFF]|\uD83A[\uDD50-\uDD59]' + }, + { + 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-\uDE47\uDE7D\uDE7E\uDE9D-\uDE9F\uDEEB-\uDEEF\uDF58-\uDF5F\uDF78-\uDF7F\uDFA9-\uDFAF]|\uD803[\uDCFA-\uDCFF\uDE60-\uDE7E]|\uD804[\uDC52-\uDC65\uDDE1-\uDDF4]|\uD805[\uDF3A\uDF3B]|\uD806[\uDCEA-\uDCF2]|\uD807[\uDC5A-\uDC6C]|\uD81A[\uDF5B-\uDF61]|\uD834[\uDF60-\uDF71]|\uD83A[\uDCC7-\uDCCF]|\uD83C[\uDD00-\uDD0C]' + }, + { + name: 'P', + alias: 'Punctuation', + bmp: '\x21-\x23\x25-\\x2A\x2C-\x2F\x3A\x3B\\x3F\x40\\x5B-\\x5D\x5F\\x7B\x7D\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u0AF0\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\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-\u2E44\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]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC9\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDC4B-\uDC4F\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDF3C-\uDF3E]|\uD807[\uDC41-\uDC45\uDC70\uDC71]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD83A[\uDD5E\uDD5F]' + }, + { + name: 'Pc', + alias: 'Connector_Punctuation', + bmp: '\x5F\u203F\u2040\u2054\uFE33\uFE34\uFE4D-\uFE4F\uFF3F' + }, + { + name: 'Pd', + alias: 'Dash_Punctuation', + bmp: '\\x2D\u058A\u05BE\u1400\u1806\u2010-\u2015\u2E17\u2E1A\u2E3A\u2E3B\u2E40\u301C\u3030\u30A0\uFE31\uFE32\uFE58\uFE63\uFF0D' + }, + { + name: 'Pe', + alias: 'Close_Punctuation', + bmp: '\\x29\\x5D\x7D\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\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: '\x21-\x23\x25-\x27\\x2A\x2C\\x2E\x2F\x3A\x3B\\x3F\x40\\x5C\xA1\xA7\xB6\xB7\xBF\u037E\u0387\u055A-\u055F\u0589\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u0AF0\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u166D\u166E\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u1805\u1807-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\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\u2E44\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]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC9\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDC4B-\uDC4F\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDF3C-\uDF3E]|\uD807[\uDC41-\uDC45\uDC70\uDC71]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD83A[\uDD5E\uDD5F]' + }, + { + name: 'Ps', + alias: 'Open_Punctuation', + bmp: '\\x28\\x5B\\x7B\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\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: '\\x24\\x2B\x3C-\x3E\\x5E\x60\\x7C\x7E\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\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\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-\u20BE\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-\u23FE\u2400-\u2426\u2440-\u244A\u249C-\u24E9\u2500-\u2767\u2794-\u27C4\u27C7-\u27E5\u27F0-\u2982\u2999-\u29D7\u29DC-\u29FB\u29FE-\u2B73\u2B76-\u2B95\u2B98-\u2BB9\u2BBD-\u2BC8\u2BCA-\u2BD1\u2BEC-\u2BEF\u2CE5-\u2CEA\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-\u32FE\u3300-\u33FF\u4DC0-\u4DFF\uA490-\uA4C6\uA700-\uA716\uA720\uA721\uA789\uA78A\uA828-\uA82B\uA836-\uA839\uAA77-\uAA79\uAB5B\uFB29\uFBB2-\uFBC1\uFDFC\uFDFD\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-\uDD9B\uDDA0\uDDD0-\uDDFC]|\uD802[\uDC77\uDC78\uDEC8]|\uD805\uDF3F|\uD81A[\uDF3C-\uDF3F\uDF45]|\uD82F\uDC9C|\uD834[\uDC00-\uDCF5\uDD00-\uDD26\uDD29-\uDD64\uDD6A-\uDD6C\uDD83\uDD84\uDD8C-\uDDA9\uDDAE-\uDDE8\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]|\uD83B[\uDEF0\uDEF1]|\uD83C[\uDC00-\uDC2B\uDC30-\uDC93\uDCA0-\uDCAE\uDCB1-\uDCBF\uDCC1-\uDCCF\uDCD1-\uDCF5\uDD10-\uDD2E\uDD30-\uDD6B\uDD70-\uDDAC\uDDE6-\uDE02\uDE10-\uDE3B\uDE40-\uDE48\uDE50\uDE51\uDF00-\uDFFF]|\uD83D[\uDC00-\uDED2\uDEE0-\uDEEC\uDEF0-\uDEF6\uDF00-\uDF73\uDF80-\uDFD4]|\uD83E[\uDC00-\uDC0B\uDC10-\uDC47\uDC50-\uDC59\uDC60-\uDC87\uDC90-\uDCAD\uDD10-\uDD1E\uDD20-\uDD27\uDD30\uDD33-\uDD3E\uDD40-\uDD4B\uDD50-\uDD5E\uDD80-\uDD91\uDDC0]' + }, + { + name: 'Sc', + alias: 'Currency_Symbol', + bmp: '\\x24\xA2-\xA5\u058F\u060B\u09F2\u09F3\u09FB\u0AF1\u0BF9\u0E3F\u17DB\u20A0-\u20BE\uA838\uFDFC\uFE69\uFF04\uFFE0\uFFE1\uFFE5\uFFE6' + }, + { + name: 'Sk', + alias: 'Modifier_Symbol', + bmp: '\\x5E\x60\xA8\xAF\xB4\xB8\u02C2-\u02C5\u02D2-\u02DF\u02E5-\u02EB\u02ED\u02EF-\u02FF\u0375\u0384\u0385\u1FBD\u1FBF-\u1FC1\u1FCD-\u1FCF\u1FDD-\u1FDF\u1FED-\u1FEF\u1FFD\u1FFE\u309B\u309C\uA700-\uA716\uA720\uA721\uA789\uA78A\uAB5B\uFBB2-\uFBC1\uFF3E\uFF40\uFFE3', + astral: '\uD83C[\uDFFB-\uDFFF]' + }, + { + name: 'Sm', + alias: 'Math_Symbol', + bmp: '\\x2B\x3C-\x3E\\x7C\x7E\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\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-\u23FE\u2400-\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\u2B98-\u2BB9\u2BBD-\u2BC8\u2BCA-\u2BD1\u2BEC-\u2BEF\u2CE5-\u2CEA\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-\u32FE\u3300-\u33FF\u4DC0-\u4DFF\uA490-\uA4C6\uA828-\uA82B\uA836\uA837\uA839\uAA77-\uAA79\uFDFD\uFFE4\uFFE8\uFFED\uFFEE\uFFFC\uFFFD', + astral: '\uD800[\uDD37-\uDD3F\uDD79-\uDD89\uDD8C-\uDD8E\uDD90-\uDD9B\uDDA0\uDDD0-\uDDFC]|\uD802[\uDC77\uDC78\uDEC8]|\uD805\uDF3F|\uD81A[\uDF3C-\uDF3F\uDF45]|\uD82F\uDC9C|\uD834[\uDC00-\uDCF5\uDD00-\uDD26\uDD29-\uDD64\uDD6A-\uDD6C\uDD83\uDD84\uDD8C-\uDDA9\uDDAE-\uDDE8\uDE00-\uDE41\uDE45\uDF00-\uDF56]|\uD836[\uDC00-\uDDFF\uDE37-\uDE3A\uDE6D-\uDE74\uDE76-\uDE83\uDE85\uDE86]|\uD83C[\uDC00-\uDC2B\uDC30-\uDC93\uDCA0-\uDCAE\uDCB1-\uDCBF\uDCC1-\uDCCF\uDCD1-\uDCF5\uDD10-\uDD2E\uDD30-\uDD6B\uDD70-\uDDAC\uDDE6-\uDE02\uDE10-\uDE3B\uDE40-\uDE48\uDE50\uDE51\uDF00-\uDFFA]|\uD83D[\uDC00-\uDED2\uDEE0-\uDEEC\uDEF0-\uDEF6\uDF00-\uDF73\uDF80-\uDFD4]|\uD83E[\uDC00-\uDC0B\uDC10-\uDC47\uDC50-\uDC59\uDC60-\uDC87\uDC90-\uDCAD\uDD10-\uDD1E\uDD20-\uDD27\uDD30\uDD33-\uDD3E\uDD40-\uDD4B\uDD50-\uDD5E\uDD80-\uDD91\uDDC0]' + }, + { + name: 'Z', + alias: 'Separator', + bmp: '\x20\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: '\x20\xA0\u1680\u2000-\u200A\u202F\u205F\u3000' + } + ]); + +}; + +},{}],6:[function(require,module,exports){ +/*! + * XRegExp Unicode Properties 3.2.0 + * <xregexp.com> + * Steven Levithan (c) 2012-2017 MIT License + * Unicode data by Mathias Bynens <mathiasbynens.be> + */ + +module.exports = function(XRegExp) { + 'use strict'; + + /** + * Adds properties to meet the UTS #18 Level 1 RL1.2 requirements for Unicode regex support. See + * <http://unicode.org/reports/tr18/#RL1.2>. Following are definitions of these properties from + * UAX #44 <http://unicode.org/reports/tr44/>: + * + * - Alphabetic + * Characters with the Alphabetic property. Generated from: Lowercase + Uppercase + Lt + Lm + + * Lo + Nl + Other_Alphabetic. + * + * - Default_Ignorable_Code_Point + * For programmatic determination of default ignorable code points. New characters that should + * be ignored in rendering (unless explicitly supported) will be assigned in these ranges, + * permitting programs to correctly handle the default rendering of such characters when not + * otherwise supported. + * + * - Lowercase + * Characters with the Lowercase property. Generated from: Ll + Other_Lowercase. + * + * - Noncharacter_Code_Point + * Code points permanently reserved for internal use. + * + * - Uppercase + * Characters with the Uppercase property. Generated from: Lu + Other_Uppercase. + * + * - White_Space + * Spaces, separator characters and other control characters which should be treated by + * programming languages as "white space" for the purpose of parsing elements. + * + * The properties ASCII, Any, and Assigned are also included but are not defined in UAX #44. UTS + * #18 RL1.2 additionally requires support for Unicode scripts and general categories. These are + * included in XRegExp's Unicode Categories and Unicode Scripts addons. + * + * Token names are case insensitive, and any spaces, hyphens, and underscores are ignored. + * + * Uses Unicode 9.0.0. + * + * @requires XRegExp, Unicode Base + */ + + if (!XRegExp.addUnicodeData) { + throw new ReferenceError('Unicode Base must be loaded before Unicode Properties'); + } + + var unicodeData = [ + { + name: 'ASCII', + bmp: '\0-\x7F' + }, + { + name: 'Alphabetic', + bmp: 'A-Za-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0345\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05B0-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0657\u0659-\u065F\u066E-\u06D3\u06D5-\u06DC\u06E1-\u06E8\u06ED-\u06EF\u06FA-\u06FC\u06FF\u0710-\u073F\u074D-\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0817\u081A-\u082C\u0840-\u0858\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08DF\u08E3-\u08E9\u08F0-\u093B\u093D-\u094C\u094E-\u0950\u0955-\u0963\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD-\u09C4\u09C7\u09C8\u09CB\u09CC\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09F0\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3E-\u0A42\u0A47\u0A48\u0A4B\u0A4C\u0A51\u0A59-\u0A5C\u0A5E\u0A70-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD-\u0AC5\u0AC7-\u0AC9\u0ACB\u0ACC\u0AD0\u0AE0-\u0AE3\u0AF9\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D-\u0B44\u0B47\u0B48\u0B4B\u0B4C\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\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-\u0BCC\u0BD0\u0BD7\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4C\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCC\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4C\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E46\u0E4D\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0ECD\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F71-\u0F81\u0F88-\u0F97\u0F99-\u0FBC\u1000-\u1036\u1038\u103B-\u103F\u1050-\u1062\u1065-\u1068\u106E-\u1086\u108E\u109C\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\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1713\u1720-\u1733\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17B3\u17B6-\u17C8\u17D7\u17DC\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u1938\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A1B\u1A20-\u1A5E\u1A61-\u1A74\u1AA7\u1B00-\u1B33\u1B35-\u1B43\u1B45-\u1B4B\u1B80-\u1BA9\u1BAC-\u1BAF\u1BBA-\u1BE5\u1BE7-\u1BF1\u1C00-\u1C35\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1D00-\u1DBF\u1DE7-\u1DF4\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\u2160-\u2188\u24B6-\u24E9\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\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\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA674-\uA67B\uA67F-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA827\uA840-\uA873\uA880-\uA8C3\uA8C5\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA92A\uA930-\uA952\uA960-\uA97C\uA980-\uA9B2\uA9B4-\uA9BF\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA60-\uAA76\uAA7A\uAA7E-\uAABE\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF5\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\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\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\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\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-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC45\uDC82-\uDCB8\uDCD0-\uDCE8\uDD00-\uDD32\uDD50-\uDD72\uDD76\uDD80-\uDDBF\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE34\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEE8\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D-\uDF44\uDF47\uDF48\uDF4B\uDF4C\uDF50\uDF57\uDF5D-\uDF63]|\uD805[\uDC00-\uDC41\uDC43-\uDC45\uDC47-\uDC4A\uDC80-\uDCC1\uDCC4\uDCC5\uDCC7\uDD80-\uDDB5\uDDB8-\uDDBE\uDDD8-\uDDDD\uDE00-\uDE3E\uDE40\uDE44\uDE80-\uDEB5\uDF00-\uDF19\uDF1D-\uDF2A]|\uD806[\uDCA0-\uDCDF\uDCFF\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC3E\uDC40\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF36\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF93-\uDF9F\uDFE0]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9E]|\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]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43\uDD47]|\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]|\uD83C[\uDD30-\uDD49\uDD50-\uDD69\uDD70-\uDD89]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]' + }, + { + name: 'Any', + isBmpLast: true, + bmp: '\0-\uFFFF', + astral: '[\uD800-\uDBFF][\uDC00-\uDFFF]' + }, + { + name: 'Default_Ignorable_Code_Point', + bmp: '\xAD\u034F\u061C\u115F\u1160\u17B4\u17B5\u180B-\u180E\u200B-\u200F\u202A-\u202E\u2060-\u206F\u3164\uFE00-\uFE0F\uFEFF\uFFA0\uFFF0-\uFFF8', + astral: '\uD82F[\uDCA0-\uDCA3]|\uD834[\uDD73-\uDD7A]|[\uDB40-\uDB43][\uDC00-\uDFFF]' + }, + { + name: 'Lowercase', + bmp: 'a-z\xAA\xB5\xBA\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-\u02B8\u02C0\u02C1\u02E0-\u02E4\u0345\u0371\u0373\u0377\u037A-\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\u0561-\u0587\u13F8-\u13FD\u1C80-\u1C88\u1D00-\u1DBF\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\u2071\u207F\u2090-\u209C\u210A\u210E\u210F\u2113\u212F\u2134\u2139\u213C\u213D\u2146-\u2149\u214E\u2170-\u217F\u2184\u24D0-\u24E9\u2C30-\u2C5E\u2C61\u2C65\u2C66\u2C68\u2C6A\u2C6C\u2C71\u2C73\u2C74\u2C76-\u2C7D\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-\uA69D\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-\uA778\uA77A\uA77C\uA77F\uA781\uA783\uA785\uA787\uA78C\uA78E\uA791\uA793-\uA795\uA797\uA799\uA79B\uA79D\uA79F\uA7A1\uA7A3\uA7A5\uA7A7\uA7A9\uA7B5\uA7B7\uA7F8-\uA7FA\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABBF\uFB00-\uFB06\uFB13-\uFB17\uFF41-\uFF5A', + astral: '\uD801[\uDC28-\uDC4F\uDCD8-\uDCFB]|\uD803[\uDCC0-\uDCF2]|\uD806[\uDCC0-\uDCDF]|\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]|\uD83A[\uDD22-\uDD43]' + }, + { + name: 'Noncharacter_Code_Point', + bmp: '\uFDD0-\uFDEF\uFFFE\uFFFF', + astral: '[\uD83F\uD87F\uD8BF\uD8FF\uD93F\uD97F\uD9BF\uD9FF\uDA3F\uDA7F\uDABF\uDAFF\uDB3F\uDB7F\uDBBF\uDBFF][\uDFFE\uDFFF]' + }, + { + name: 'Uppercase', + 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\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\u2160-\u216F\u2183\u24B6-\u24CF\u2C00-\u2C2E\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\uFF21-\uFF3A', + astral: '\uD801[\uDC00-\uDC27\uDCB0-\uDCD3]|\uD803[\uDC80-\uDCB2]|\uD806[\uDCA0-\uDCBF]|\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]|\uD83C[\uDD30-\uDD49\uDD50-\uDD69\uDD70-\uDD89]' + }, + { + name: 'White_Space', + bmp: '\x09-\x0D\x20\x85\xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000' + } + ]; + + // Add non-generated data + unicodeData.push({ + name: 'Assigned', + // Since this is defined as the inverse of Unicode category Cn (Unassigned), the Unicode + // Categories addon is required to use this property + inverseOf: 'Cn' + }); + + XRegExp.addUnicodeData(unicodeData); + +}; + +},{}],7:[function(require,module,exports){ +/*! + * XRegExp Unicode Scripts 3.2.0 + * <xregexp.com> + * Steven Levithan (c) 2010-2017 MIT License + * Unicode data by Mathias Bynens <mathiasbynens.be> + */ + +module.exports = function(XRegExp) { + 'use strict'; + + /** + * Adds support for all Unicode scripts. E.g., `\p{Latin}`. Token names are case insensitive, + * and any spaces, hyphens, and underscores are ignored. + * + * Uses Unicode 9.0.0. + * + * @requires XRegExp, Unicode Base + */ + + if (!XRegExp.addUnicodeData) { + throw new ReferenceError('Unicode Base must be loaded before Unicode Scripts'); + } + + XRegExp.addUnicodeData([ + { + name: 'Adlam', + astral: '\uD83A[\uDD00-\uDD4A\uDD50-\uDD59\uDD5E\uDD5F]' + }, + { + name: 'Ahom', + astral: '\uD805[\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF3F]' + }, + { + name: 'Anatolian_Hieroglyphs', + astral: '\uD811[\uDC00-\uDE46]' + }, + { + name: 'Arabic', + bmp: '\u0600-\u0604\u0606-\u060B\u060D-\u061A\u061E\u0620-\u063F\u0641-\u064A\u0656-\u066F\u0671-\u06DC\u06DE-\u06FF\u0750-\u077F\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u08FF\uFB50-\uFBC1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFD\uFE70-\uFE74\uFE76-\uFEFC', + astral: '\uD803[\uDE60-\uDE7E]|\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\uDEF0\uDEF1]' + }, + { + name: 'Armenian', + bmp: '\u0531-\u0556\u0559-\u055F\u0561-\u0587\u058A\u058D-\u058F\uFB13-\uFB17' + }, + { + name: 'Avestan', + astral: '\uD802[\uDF00-\uDF35\uDF39-\uDF3F]' + }, + { + name: 'Balinese', + bmp: '\u1B00-\u1B4B\u1B50-\u1B7C' + }, + { + name: 'Bamum', + bmp: '\uA6A0-\uA6F7', + astral: '\uD81A[\uDC00-\uDE38]' + }, + { + name: 'Bassa_Vah', + astral: '\uD81A[\uDED0-\uDEED\uDEF0-\uDEF5]' + }, + { + name: 'Batak', + bmp: '\u1BC0-\u1BF3\u1BFC-\u1BFF' + }, + { + name: 'Bengali', + bmp: '\u0980-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09FB' + }, + { + name: 'Bhaiksuki', + astral: '\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC45\uDC50-\uDC6C]' + }, + { + name: 'Bopomofo', + bmp: '\u02EA\u02EB\u3105-\u312D\u31A0-\u31BA' + }, + { + name: 'Brahmi', + astral: '\uD804[\uDC00-\uDC4D\uDC52-\uDC6F\uDC7F]' + }, + { + name: 'Braille', + bmp: '\u2800-\u28FF' + }, + { + name: 'Buginese', + bmp: '\u1A00-\u1A1B\u1A1E\u1A1F' + }, + { + name: 'Buhid', + bmp: '\u1740-\u1753' + }, + { + name: 'Canadian_Aboriginal', + bmp: '\u1400-\u167F\u18B0-\u18F5' + }, + { + name: 'Carian', + astral: '\uD800[\uDEA0-\uDED0]' + }, + { + name: 'Caucasian_Albanian', + astral: '\uD801[\uDD30-\uDD63\uDD6F]' + }, + { + name: 'Chakma', + astral: '\uD804[\uDD00-\uDD34\uDD36-\uDD43]' + }, + { + name: 'Cham', + bmp: '\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA5C-\uAA5F' + }, + { + name: 'Cherokee', + bmp: '\u13A0-\u13F5\u13F8-\u13FD\uAB70-\uABBF' + }, + { + name: 'Common', + bmp: '\0-\x40\\x5B-\x60\\x7B-\xA9\xAB-\xB9\xBB-\xBF\xD7\xF7\u02B9-\u02DF\u02E5-\u02E9\u02EC-\u02FF\u0374\u037E\u0385\u0387\u0589\u0605\u060C\u061B\u061C\u061F\u0640\u06DD\u08E2\u0964\u0965\u0E3F\u0FD5-\u0FD8\u10FB\u16EB-\u16ED\u1735\u1736\u1802\u1803\u1805\u1CD3\u1CE1\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u2000-\u200B\u200E-\u2064\u2066-\u2070\u2074-\u207E\u2080-\u208E\u20A0-\u20BE\u2100-\u2125\u2127-\u2129\u212C-\u2131\u2133-\u214D\u214F-\u215F\u2189-\u218B\u2190-\u23FE\u2400-\u2426\u2440-\u244A\u2460-\u27FF\u2900-\u2B73\u2B76-\u2B95\u2B98-\u2BB9\u2BBD-\u2BC8\u2BCA-\u2BD1\u2BEC-\u2BEF\u2E00-\u2E44\u2FF0-\u2FFB\u3000-\u3004\u3006\u3008-\u3020\u3030-\u3037\u303C-\u303F\u309B\u309C\u30A0\u30FB\u30FC\u3190-\u319F\u31C0-\u31E3\u3220-\u325F\u327F-\u32CF\u3358-\u33FF\u4DC0-\u4DFF\uA700-\uA721\uA788-\uA78A\uA830-\uA839\uA92E\uA9CF\uAB5B\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE66\uFE68-\uFE6B\uFEFF\uFF01-\uFF20\uFF3B-\uFF40\uFF5B-\uFF65\uFF70\uFF9E\uFF9F\uFFE0-\uFFE6\uFFE8-\uFFEE\uFFF9-\uFFFD', + astral: '\uD800[\uDD00-\uDD02\uDD07-\uDD33\uDD37-\uDD3F\uDD90-\uDD9B\uDDD0-\uDDFC\uDEE1-\uDEFB]|\uD82F[\uDCA0-\uDCA3]|\uD834[\uDC00-\uDCF5\uDD00-\uDD26\uDD29-\uDD66\uDD6A-\uDD7A\uDD83\uDD84\uDD8C-\uDDA9\uDDAE-\uDDE8\uDF00-\uDF56\uDF60-\uDF71]|\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-\uDFCB\uDFCE-\uDFFF]|\uD83C[\uDC00-\uDC2B\uDC30-\uDC93\uDCA0-\uDCAE\uDCB1-\uDCBF\uDCC1-\uDCCF\uDCD1-\uDCF5\uDD00-\uDD0C\uDD10-\uDD2E\uDD30-\uDD6B\uDD70-\uDDAC\uDDE6-\uDDFF\uDE01\uDE02\uDE10-\uDE3B\uDE40-\uDE48\uDE50\uDE51\uDF00-\uDFFF]|\uD83D[\uDC00-\uDED2\uDEE0-\uDEEC\uDEF0-\uDEF6\uDF00-\uDF73\uDF80-\uDFD4]|\uD83E[\uDC00-\uDC0B\uDC10-\uDC47\uDC50-\uDC59\uDC60-\uDC87\uDC90-\uDCAD\uDD10-\uDD1E\uDD20-\uDD27\uDD30\uDD33-\uDD3E\uDD40-\uDD4B\uDD50-\uDD5E\uDD80-\uDD91\uDDC0]|\uDB40[\uDC01\uDC20-\uDC7F]' + }, + { + name: 'Coptic', + bmp: '\u03E2-\u03EF\u2C80-\u2CF3\u2CF9-\u2CFF' + }, + { + name: 'Cuneiform', + astral: '\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC70-\uDC74\uDC80-\uDD43]' + }, + { + name: 'Cypriot', + astral: '\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F]' + }, + { + name: 'Cyrillic', + bmp: '\u0400-\u0484\u0487-\u052F\u1C80-\u1C88\u1D2B\u1D78\u2DE0-\u2DFF\uA640-\uA69F\uFE2E\uFE2F' + }, + { + name: 'Deseret', + astral: '\uD801[\uDC00-\uDC4F]' + }, + { + name: 'Devanagari', + bmp: '\u0900-\u0950\u0953-\u0963\u0966-\u097F\uA8E0-\uA8FD' + }, + { + name: 'Duployan', + astral: '\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9C-\uDC9F]' + }, + { + name: 'Egyptian_Hieroglyphs', + astral: '\uD80C[\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]' + }, + { + name: 'Elbasan', + astral: '\uD801[\uDD00-\uDD27]' + }, + { + name: 'Ethiopic', + bmp: '\u1200-\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-\u137C\u1380-\u1399\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E' + }, + { + name: 'Georgian', + bmp: '\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u10FF\u2D00-\u2D25\u2D27\u2D2D' + }, + { + name: 'Glagolitic', + bmp: '\u2C00-\u2C2E\u2C30-\u2C5E', + astral: '\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]' + }, + { + name: 'Gothic', + astral: '\uD800[\uDF30-\uDF4A]' + }, + { + name: 'Grantha', + astral: '\uD804[\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]' + }, + { + name: 'Greek', + bmp: '\u0370-\u0373\u0375-\u0377\u037A-\u037D\u037F\u0384\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03E1\u03F0-\u03FF\u1D26-\u1D2A\u1D5D-\u1D61\u1D66-\u1D6A\u1DBF\u1F00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FC4\u1FC6-\u1FD3\u1FD6-\u1FDB\u1FDD-\u1FEF\u1FF2-\u1FF4\u1FF6-\u1FFE\u2126\uAB65', + astral: '\uD800[\uDD40-\uDD8E\uDDA0]|\uD834[\uDE00-\uDE45]' + }, + { + name: 'Gujarati', + bmp: '\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AF1\u0AF9' + }, + { + name: 'Gurmukhi', + bmp: '\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' + }, + { + name: 'Han', + bmp: '\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u3005\u3007\u3021-\u3029\u3038-\u303B\u3400-\u4DB5\u4E00-\u9FD5\uF900-\uFA6D\uFA70-\uFAD9', + astral: '[\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]' + }, + { + name: 'Hangul', + bmp: '\u1100-\u11FF\u302E\u302F\u3131-\u318E\u3200-\u321E\u3260-\u327E\uA960-\uA97C\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uFFA0-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC' + }, + { + name: 'Hanunoo', + bmp: '\u1720-\u1734' + }, + { + name: 'Hatran', + astral: '\uD802[\uDCE0-\uDCF2\uDCF4\uDCF5\uDCFB-\uDCFF]' + }, + { + name: 'Hebrew', + bmp: '\u0591-\u05C7\u05D0-\u05EA\u05F0-\u05F4\uFB1D-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFB4F' + }, + { + name: 'Hiragana', + bmp: '\u3041-\u3096\u309D-\u309F', + astral: '\uD82C\uDC01|\uD83C\uDE00' + }, + { + name: 'Imperial_Aramaic', + astral: '\uD802[\uDC40-\uDC55\uDC57-\uDC5F]' + }, + { + name: 'Inherited', + bmp: '\u0300-\u036F\u0485\u0486\u064B-\u0655\u0670\u0951\u0952\u1AB0-\u1ABE\u1CD0-\u1CD2\u1CD4-\u1CE0\u1CE2-\u1CE8\u1CED\u1CF4\u1CF8\u1CF9\u1DC0-\u1DF5\u1DFB-\u1DFF\u200C\u200D\u20D0-\u20F0\u302A-\u302D\u3099\u309A\uFE00-\uFE0F\uFE20-\uFE2D', + astral: '\uD800[\uDDFD\uDEE0]|\uD834[\uDD67-\uDD69\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD]|\uDB40[\uDD00-\uDDEF]' + }, + { + name: 'Inscriptional_Pahlavi', + astral: '\uD802[\uDF60-\uDF72\uDF78-\uDF7F]' + }, + { + name: 'Inscriptional_Parthian', + astral: '\uD802[\uDF40-\uDF55\uDF58-\uDF5F]' + }, + { + name: 'Javanese', + bmp: '\uA980-\uA9CD\uA9D0-\uA9D9\uA9DE\uA9DF' + }, + { + name: 'Kaithi', + astral: '\uD804[\uDC80-\uDCC1]' + }, + { + name: 'Kannada', + bmp: '\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2' + }, + { + name: 'Katakana', + bmp: '\u30A1-\u30FA\u30FD-\u30FF\u31F0-\u31FF\u32D0-\u32FE\u3300-\u3357\uFF66-\uFF6F\uFF71-\uFF9D', + astral: '\uD82C\uDC00' + }, + { + name: 'Kayah_Li', + bmp: '\uA900-\uA92D\uA92F' + }, + { + name: 'Kharoshthi', + astral: '\uD802[\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F-\uDE47\uDE50-\uDE58]' + }, + { + name: 'Khmer', + bmp: '\u1780-\u17DD\u17E0-\u17E9\u17F0-\u17F9\u19E0-\u19FF' + }, + { + name: 'Khojki', + astral: '\uD804[\uDE00-\uDE11\uDE13-\uDE3E]' + }, + { + name: 'Khudawadi', + astral: '\uD804[\uDEB0-\uDEEA\uDEF0-\uDEF9]' + }, + { + name: 'Lao', + bmp: '\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF' + }, + { + name: 'Latin', + bmp: 'A-Za-z\xAA\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02B8\u02E0-\u02E4\u1D00-\u1D25\u1D2C-\u1D5C\u1D62-\u1D65\u1D6B-\u1D77\u1D79-\u1DBE\u1E00-\u1EFF\u2071\u207F\u2090-\u209C\u212A\u212B\u2132\u214E\u2160-\u2188\u2C60-\u2C7F\uA722-\uA787\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA7FF\uAB30-\uAB5A\uAB5C-\uAB64\uFB00-\uFB06\uFF21-\uFF3A\uFF41-\uFF5A' + }, + { + name: 'Lepcha', + bmp: '\u1C00-\u1C37\u1C3B-\u1C49\u1C4D-\u1C4F' + }, + { + name: 'Limbu', + bmp: '\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1940\u1944-\u194F' + }, + { + name: 'Linear_A', + astral: '\uD801[\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]' + }, + { + name: 'Linear_B', + astral: '\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA]' + }, + { + name: 'Lisu', + bmp: '\uA4D0-\uA4FF' + }, + { + name: 'Lycian', + astral: '\uD800[\uDE80-\uDE9C]' + }, + { + name: 'Lydian', + astral: '\uD802[\uDD20-\uDD39\uDD3F]' + }, + { + name: 'Mahajani', + astral: '\uD804[\uDD50-\uDD76]' + }, + { + name: 'Malayalam', + bmp: '\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4F\u0D54-\u0D63\u0D66-\u0D7F' + }, + { + name: 'Mandaic', + bmp: '\u0840-\u085B\u085E' + }, + { + name: 'Manichaean', + astral: '\uD802[\uDEC0-\uDEE6\uDEEB-\uDEF6]' + }, + { + name: 'Marchen', + astral: '\uD807[\uDC70-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6]' + }, + { + name: 'Meetei_Mayek', + bmp: '\uAAE0-\uAAF6\uABC0-\uABED\uABF0-\uABF9' + }, + { + name: 'Mende_Kikakui', + astral: '\uD83A[\uDC00-\uDCC4\uDCC7-\uDCD6]' + }, + { + name: 'Meroitic_Cursive', + astral: '\uD802[\uDDA0-\uDDB7\uDDBC-\uDDCF\uDDD2-\uDDFF]' + }, + { + name: 'Meroitic_Hieroglyphs', + astral: '\uD802[\uDD80-\uDD9F]' + }, + { + name: 'Miao', + astral: '\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F]' + }, + { + name: 'Modi', + astral: '\uD805[\uDE00-\uDE44\uDE50-\uDE59]' + }, + { + name: 'Mongolian', + bmp: '\u1800\u1801\u1804\u1806-\u180E\u1810-\u1819\u1820-\u1877\u1880-\u18AA', + astral: '\uD805[\uDE60-\uDE6C]' + }, + { + name: 'Mro', + astral: '\uD81A[\uDE40-\uDE5E\uDE60-\uDE69\uDE6E\uDE6F]' + }, + { + name: 'Multani', + astral: '\uD804[\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA9]' + }, + { + name: 'Myanmar', + bmp: '\u1000-\u109F\uA9E0-\uA9FE\uAA60-\uAA7F' + }, + { + name: 'Nabataean', + astral: '\uD802[\uDC80-\uDC9E\uDCA7-\uDCAF]' + }, + { + name: 'New_Tai_Lue', + bmp: '\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u19DE\u19DF' + }, + { + name: 'Newa', + astral: '\uD805[\uDC00-\uDC59\uDC5B\uDC5D]' + }, + { + name: 'Nko', + bmp: '\u07C0-\u07FA' + }, + { + name: 'Ogham', + bmp: '\u1680-\u169C' + }, + { + name: 'Ol_Chiki', + bmp: '\u1C50-\u1C7F' + }, + { + name: 'Old_Hungarian', + astral: '\uD803[\uDC80-\uDCB2\uDCC0-\uDCF2\uDCFA-\uDCFF]' + }, + { + name: 'Old_Italic', + astral: '\uD800[\uDF00-\uDF23]' + }, + { + name: 'Old_North_Arabian', + astral: '\uD802[\uDE80-\uDE9F]' + }, + { + name: 'Old_Permic', + astral: '\uD800[\uDF50-\uDF7A]' + }, + { + name: 'Old_Persian', + astral: '\uD800[\uDFA0-\uDFC3\uDFC8-\uDFD5]' + }, + { + name: 'Old_South_Arabian', + astral: '\uD802[\uDE60-\uDE7F]' + }, + { + name: 'Old_Turkic', + astral: '\uD803[\uDC00-\uDC48]' + }, + { + name: 'Oriya', + bmp: '\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B77' + }, + { + name: 'Osage', + astral: '\uD801[\uDCB0-\uDCD3\uDCD8-\uDCFB]' + }, + { + name: 'Osmanya', + astral: '\uD801[\uDC80-\uDC9D\uDCA0-\uDCA9]' + }, + { + name: 'Pahawh_Hmong', + astral: '\uD81A[\uDF00-\uDF45\uDF50-\uDF59\uDF5B-\uDF61\uDF63-\uDF77\uDF7D-\uDF8F]' + }, + { + name: 'Palmyrene', + astral: '\uD802[\uDC60-\uDC7F]' + }, + { + name: 'Pau_Cin_Hau', + astral: '\uD806[\uDEC0-\uDEF8]' + }, + { + name: 'Phags_Pa', + bmp: '\uA840-\uA877' + }, + { + name: 'Phoenician', + astral: '\uD802[\uDD00-\uDD1B\uDD1F]' + }, + { + name: 'Psalter_Pahlavi', + astral: '\uD802[\uDF80-\uDF91\uDF99-\uDF9C\uDFA9-\uDFAF]' + }, + { + name: 'Rejang', + bmp: '\uA930-\uA953\uA95F' + }, + { + name: 'Runic', + bmp: '\u16A0-\u16EA\u16EE-\u16F8' + }, + { + name: 'Samaritan', + bmp: '\u0800-\u082D\u0830-\u083E' + }, + { + name: 'Saurashtra', + bmp: '\uA880-\uA8C5\uA8CE-\uA8D9' + }, + { + name: 'Sharada', + astral: '\uD804[\uDD80-\uDDCD\uDDD0-\uDDDF]' + }, + { + name: 'Shavian', + astral: '\uD801[\uDC50-\uDC7F]' + }, + { + name: 'Siddham', + astral: '\uD805[\uDD80-\uDDB5\uDDB8-\uDDDD]' + }, + { + name: 'SignWriting', + astral: '\uD836[\uDC00-\uDE8B\uDE9B-\uDE9F\uDEA1-\uDEAF]' + }, + { + name: 'Sinhala', + bmp: '\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2-\u0DF4', + astral: '\uD804[\uDDE1-\uDDF4]' + }, + { + name: 'Sora_Sompeng', + astral: '\uD804[\uDCD0-\uDCE8\uDCF0-\uDCF9]' + }, + { + name: 'Sundanese', + bmp: '\u1B80-\u1BBF\u1CC0-\u1CC7' + }, + { + name: 'Syloti_Nagri', + bmp: '\uA800-\uA82B' + }, + { + name: 'Syriac', + bmp: '\u0700-\u070D\u070F-\u074A\u074D-\u074F' + }, + { + name: 'Tagalog', + bmp: '\u1700-\u170C\u170E-\u1714' + }, + { + name: 'Tagbanwa', + bmp: '\u1760-\u176C\u176E-\u1770\u1772\u1773' + }, + { + name: 'Tai_Le', + bmp: '\u1950-\u196D\u1970-\u1974' + }, + { + name: 'Tai_Tham', + bmp: '\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA0-\u1AAD' + }, + { + name: 'Tai_Viet', + bmp: '\uAA80-\uAAC2\uAADB-\uAADF' + }, + { + name: 'Takri', + astral: '\uD805[\uDE80-\uDEB7\uDEC0-\uDEC9]' + }, + { + name: 'Tamil', + bmp: '\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-\u0BFA' + }, + { + name: 'Tangut', + astral: '\uD81B\uDFE0|[\uD81C-\uD820][\uDC00-\uDFFF]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]' + }, + { + name: 'Telugu', + bmp: '\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C78-\u0C7F' + }, + { + name: 'Thaana', + bmp: '\u0780-\u07B1' + }, + { + name: 'Thai', + bmp: '\u0E01-\u0E3A\u0E40-\u0E5B' + }, + { + name: 'Tibetan', + bmp: '\u0F00-\u0F47\u0F49-\u0F6C\u0F71-\u0F97\u0F99-\u0FBC\u0FBE-\u0FCC\u0FCE-\u0FD4\u0FD9\u0FDA' + }, + { + name: 'Tifinagh', + bmp: '\u2D30-\u2D67\u2D6F\u2D70\u2D7F' + }, + { + name: 'Tirhuta', + astral: '\uD805[\uDC80-\uDCC7\uDCD0-\uDCD9]' + }, + { + name: 'Ugaritic', + astral: '\uD800[\uDF80-\uDF9D\uDF9F]' + }, + { + name: 'Vai', + bmp: '\uA500-\uA62B' + }, + { + name: 'Warang_Citi', + astral: '\uD806[\uDCA0-\uDCF2\uDCFF]' + }, + { + name: 'Yi', + bmp: '\uA000-\uA48C\uA490-\uA4C6' + } + ]); + +}; + +},{}],8:[function(require,module,exports){ +var XRegExp = require('./xregexp'); + +require('./addons/build')(XRegExp); +require('./addons/matchrecursive')(XRegExp); +require('./addons/unicode-base')(XRegExp); +require('./addons/unicode-blocks')(XRegExp); +require('./addons/unicode-categories')(XRegExp); +require('./addons/unicode-properties')(XRegExp); +require('./addons/unicode-scripts')(XRegExp); + +module.exports = XRegExp; + +},{"./addons/build":1,"./addons/matchrecursive":2,"./addons/unicode-base":3,"./addons/unicode-blocks":4,"./addons/unicode-categories":5,"./addons/unicode-properties":6,"./addons/unicode-scripts":7,"./xregexp":9}],9:[function(require,module,exports){ +/*! + * XRegExp 3.2.0 + * <xregexp.com> + * Steven Levithan (c) 2007-2017 MIT License + */ + +'use strict'; + +/** + * 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, + natives: false +}; +// Native methods to use and restore ('native' is an ES3 reserved keyword) +var nativ = { + exec: RegExp.prototype.exec, + test: RegExp.prototype.test, + match: String.prototype.match, + replace: String.prototype.replace, + split: String.prototype.split +}; +// 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 = /\$(?:{([\w$]+)}|(\d\d?|[\s\S]))/g; +// Check for correct `exec` handling of nonparticipating capturing groups +var correctExecNpcg = nativ.exec.call(/()??/, '')[1] === undefined; +// Check for ES6 `flags` prop support +var hasFlagsProp = /x/.flags !== undefined; +// Shortcut to `Object.prototype.toString` +var toString = {}.toString; + +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); + } catch (exception) { + isSupported = false; + } + return isSupported; +} +// 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 = { + g: true, + i: true, + m: true, + u: hasNativeU, + y: hasNativeY +}; + +/** + * 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 p; + + 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 (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 ? xFlags.split('').sort().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 nativ.replace.call(str, /([\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) { + 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 = nativ.replace.call(flags, new RegExp('[' + 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 (xData.flags != 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(xData.flags + flagsToAdd) : xData.flags; + } + } + + // 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) ? xData.captureNames.slice(0) : null, + xregexpSource, + xregexpFlags, + options.isInternalOnly + ); + + return regex; +} + +/** + * Converts hexadecimal to decimal. + * + * @private + * @param {String} hex + * @returns {Number} + */ +function dec(hex) { + return parseInt(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) { + if ( + // No need to separate tokens if at the beginning or end of a group + match.input.charAt(match.index - 1) === '(' || + match.input.charAt(match.index + match[0].length) === ')' || + // Avoid separating tokens when the following token is a quantifier + isPatternNext(match.input, match.index + match[0].length, flags, '[?*+]|{\\d+(?:,\\d*)?}') + ) { + 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 avoids 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 ? + regex.flags : + // 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 + nativ.exec.call(/\/([a-z]*)$/i, 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 parseInt(dec, 10).toString(16); +} + +/** + * Returns the first index at which a given value can be found in an array. + * + * @private + * @param {Array} array Array to search. + * @param {*} value Value to locate in the array. + * @returns {Number} Zero-based index at which the item is found, or -1. + */ +function indexOf(array, value) { + var len = array.length; + var i; + + for (i = 0; i < len; ++i) { + if (array[i] === value) { + return i; + } + } + + return -1; +} + +/** + * Checks whether the next nonignorable token after the specified position matches the + * `needlePattern` + * + * @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. + * @param {String} needlePattern Pattern to match the next token against. + * @returns {Boolean} Whether the next nonignorable token matches `needlePattern` + */ +function isPatternNext(pattern, pos, flags, needlePattern) { + var inlineCommentPattern = '\\(\\?#[^)]*\\)'; + var lineCommentPattern = '#[^#\\n]*'; + var patternsToIgnore = flags.indexOf('x') > -1 ? + // Ignore any leading whitespace, line comments, and inline comments + ['\\s', lineCommentPattern, inlineCommentPattern] : + // Ignore any leading inline comments + [inlineCommentPattern]; + return nativ.test.call( + new RegExp('^(?:' + patternsToIgnore.join('|') + ')*(?:' + needlePattern + ')'), + pattern.slice(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 toString.call(value) === '[object ' + type + ']'; +} + +/** + * 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' + 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) { + var i; + + // Recent browsers throw on duplicate flags, so copy this behavior for nonnative flags + if (clipDuplicates(flags) !== flags) { + throw new SyntaxError('Invalid duplicate regex flag ' + flags); + } + + // Strip and apply a leading mode modifier with any combination of flags except g or y + pattern = nativ.replace.call(pattern, /^\(\?([\w$]+)\)/, function($0, $1) { + if (nativ.test.call(/[gy]/, $1)) { + throw new SyntaxError('Cannot use flag g or y in mode modifier ' + $0); + } + // Allow duplicate flags within the mode modifier + flags = clipDuplicates(flags + $1); + return ''; + }); + + // Throw on unknown native or nonnative flags + for (i = 0; i < flags.length; ++i) { + if (!registeredFlags[flags.charAt(i)]) { + throw new SyntaxError('Unknown regex flag ' + flags.charAt(i)); + } + } + + 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')) { + XRegExp.forEach(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.charAt(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 && flags.indexOf(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; +} + +/** + * Enables or disables native method overrides. + * + * @private + * @param {Boolean} on `true` to enable; `false` to disable. + */ +function setNatives(on) { + RegExp.prototype.exec = (on ? fixed : nativ).exec; + RegExp.prototype.test = (on ? fixed : nativ).test; + String.prototype.match = (on ? fixed : nativ).match; + String.prototype.replace = (on ? fixed : nativ).replace; + String.prototype.split = (on ? fixed : nativ).split; + + features.natives = on; +} + +/** + * 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 toObject(value) { + // null or undefined + if (value == null) { + throw new TypeError('Cannot convert null or undefined to object'); + } + + return value; +} + +// ==--------------------------== +// 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: + * - `g` - global + * - `i` - ignore case + * - `m` - multiline anchors + * - `u` - unicode (ES6) + * - `y` - sticky (Firefox 3+, ES6) + * Additional XRegExp flags: + * - `n` - explicit capture + * - `s` - dot matches all (aka singleline) + * - `x` - free-spacing and line comments (aka extended) + * - `A` - 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 \n\ + * (?<month> [0-9]{2} ) -? # month \n\ + * (?<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') && flags.indexOf('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 = applied.flags; + + // 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 = appliedPattern.slice(0, pos) + + result.output + + appliedPattern.slice(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 token = XRegExp.exec(appliedPattern, nativeTokens[scope], pos, 'sticky')[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: nativ.replace.call(output, /(?:\(\?:\))+/g, '(?:)'), + // Strip all but native flags + flags: nativ.replace.call(appliedFlags, /[^gimuy]+/g, ''), + // `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, generated.flags), + generated.captures, + pattern, + flags + ); +} + +// Add `RegExp.prototype` to the prototype chain +XRegExp.prototype = new RegExp(); + +// ==--------------------------== +// 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 = '3.2.0'; + +// ==--------------------------== +// 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/, + * function() {return '\\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*)?})(\??)/, + * function(match) {return 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 optionalFlags = options.optionalFlags; + var i; + + if (options.flag) { + registerFlag(options.flag); + } + + if (optionalFlags) { + optionalFlags = nativ.split.call(optionalFlags, ''); + for (i = 0; i < optionalFlags.length; ++i) { + registerFlag(optionalFlags[i]); + } + } + + // 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 + * + * while (match = XRegExp.cache('.', 'gs').exec(str)) { + * // 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 point 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\?\ <\.>' + */ +XRegExp.escape = function(str) { + return nativ.replace.call(toObject(str), /[-\[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); +}; + +/** + * Executes a regex search in a specified string. Returns a match array or `null`. If the provided + * regex uses named capture, named backreference properties are included on the match array. + * 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 backreference properties, or `null`. + * @example + * + * // Basic use, with named backreference + * var match = XRegExp.exec('U+2620', XRegExp('U\\+(?<hex>[0-9A-F]{4})')); + * match.hex; // -> '2620' + * + * // With pos and sticky, in a loop + * var pos = 2, 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; + var r2; + + 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` + r2 = regex[REGEX_DATA][cacheKey] || ( + regex[REGEX_DATA][cacheKey] = copyRegex(regex, { + addG: true, + addY: addY, + source: fakeY ? 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 + * var evens = []; + * XRegExp.forEach('1a2345', /\d/, function(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 + * + * var 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, + * + * // DEPRECATED: Overrides native regex methods with fixed/extended versions + * natives: true + * }); + * + * // With an options string + * XRegExp.install('astral natives'); + */ +XRegExp.install = function(options) { + options = prepareOptions(options); + + if (!features.astral && options.astral) { + setAstral(true); + } + + if (!features.natives && options.natives) { + setNatives(true); + } +}; + +/** + * Checks whether an individual optional feature is installed. + * + * @memberOf XRegExp + * @param {String} feature Name of the feature to check. One of: + * - `astral` + * - `natives` + * @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 toString.call(value) === '[object RegExp]'; + //return isType(value, 'RegExp'); +}; + +/** + * 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'; + var result; + var r2; + + regex[REGEX_DATA] = regex[REGEX_DATA] || {}; + + // Shares cached copies with `XRegExp.exec`/`replace` + r2 = regex[REGEX_DATA][cacheKey] || ( + regex[REGEX_DATA][cacheKey] = copyRegex(regex, { + addG: !!global, + removeG: scope === 'one', + isInternalOnly: true + }) + ); + + result = nativ.match.call(toObject(str), 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 + * 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) { + // Safari 4.0.5 (but not 5.0.5+) inappropriately uses sparse arrays to hold the + // `undefined`s for backreferences to nonparticipating capturing groups. In such + // cases, a `hasOwnProperty` or `in` check on its own would inappropriately throw + // the exception, so also check if the backreference is a number that is within the + // bounds of the array. + if (!(match.hasOwnProperty(item.backref) || +item.backref < match.length)) { + throw new ReferenceError('Backreference to undefined group: ' + item.backref); + } + + matches.push(match[item.backref] || ''); + } else { + matches.push(match[0]); + } + } + + for (var i = 0; i < values.length; ++i) { + XRegExp.forEach(values[i], item.regex, addMatch); + } + + 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}` for named and numbered backreferences. Replacement + * functions can use named backreferences via `arguments[0].name`. 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 existent capturing group, inserts + * backreference n/nn. + * - ${n} - Where n is a name or any number of digits that reference an existent capturing + * group, inserts backreference n. + * Replacement functions are invoked with three or more arguments: + * - The matched substring (corresponds to $& above). Named backreferences are accessible as + * properties of this first argument. + * - 0..n arguments, one for each backreference (corresponding to $1, $2, etc. above). + * - The zero-based index of the match within the total search string. + * - The total string being searched. + * @param {String} [scope='one'] Use 'one' to replace the first match only, or 'all'. If not + * explicitly specified and using a regex with flag g, `scope` is 'all'. + * @returns {String} New string with one or all matches replaced. + * @example + * + * // Regex search, using named backreferences in replacement string + * var 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, function(match) { + * return match.last + ', ' + match.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; + var result; + + 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. + result = fixed.replace.call(toObject(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}`. + * + * @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, function($0) { + * return $0.toUpperCase(); + * }] + * ]); + */ +XRegExp.replaceEach = function(str, replacements) { + var i; + var r; + + for (i = 0; i < replacements.length; ++i) { + r = replacements[i]; + str = XRegExp.replace(str, r[0], r[1], r[2]); + } + + 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(toObject(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 + */ +XRegExp.test = function(str, regex, pos, sticky) { + // Do this the easy way :-) + return !!XRegExp.exec(str, regex, pos, sticky); +}; + +/** + * Uninstalls optional features according to the specified options. All optional features start out + * uninstalled, so this is 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 + * astral: true, + * + * // DEPRECATED: Restores native regex methods + * natives: true + * }); + * + * // With an options string + * XRegExp.uninstall('astral natives'); + */ +XRegExp.uninstall = function(options) { + options = prepareOptions(options); + + if (features.astral && options.astral) { + setAstral(false); + } + + if (features.natives && options.natives) { + setNatives(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 '(?<' + name + '>'; + } + // Backreference + } else if (backref) { + // Rewrite the backreference + return '\\' + (+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 pattern; + for (var i = 0; i < patterns.length; ++i) { + pattern = patterns[i]; + + 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(nativ.replace.call(XRegExp(pattern.source).source, parts, rewrite)); + } else { + output.push(XRegExp.escape(pattern)); + } + } + + 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`. Calling `XRegExp.install('natives')` uses this to + * override the native method. Use via `XRegExp.exec` without overriding natives. + * + * @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 = nativ.exec.apply(this, arguments); + var name; + var r2; + var i; + + 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 && indexOf(match, '') > -1) { + 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 + nativ.replace.call(String(str).slice(match.index), r2, function() { + var len = arguments.length; + var i; + // Skip index 0 and the last 2 + for (i = 1; i < len - 2; ++i) { + if (arguments[i] === undefined) { + match[i] = undefined; + } + } + }); + } + + // Attach named capture properties + if (this[REGEX_DATA] && this[REGEX_DATA].captureNames) { + // Skip index 0 + for (i = 1; i < match.length; ++i) { + name = this[REGEX_DATA].captureNames[i - 1]; + if (name) { + match[name] = match[i]; + } + } + } + + // 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`. Calling `XRegExp.install('natives')` + * uses this to override the native method. + * + * @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`. Calling `XRegExp.install('natives')` uses this to + * override the native method. + * + * @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) { + var result; + + if (!XRegExp.isRegExp(regex)) { + // Use the native `RegExp` rather than `XRegExp` + regex = new RegExp(regex); + } else if (regex.global) { + result = nativ.match.apply(this, arguments); + // Fixes IE bug + regex.lastIndex = 0; + + return result; + } + + return fixed.exec.call(regex, toObject(this)); +}; + +/** + * Adds support for `${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. Calling `XRegExp.install('natives')` uses this to override the native method. Note + * that this doesn't support SpiderMonkey's proprietary third (`flags`) argument. Use via + * `XRegExp.replace` without overriding natives. + * + * @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 = nativ.replace.call(String(this), search, function() { + var args = arguments; + var i; + if (captureNames) { + // Change the `arguments[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]); + // Store named backreferences on the first argument + for (i = 0; i < captureNames.length; ++i) { + if (captureNames[i]) { + args[0][captureNames[i]] = args[i + 1]; + } + } + } + // Update `lastIndex` before calling `replacement`. Fixes IE, Chrome, Firefox, Safari + // bug (last tested IE 9, Chrome 17, Firefox 11, Safari 5.1) + if (isRegex && search.global) { + search.lastIndex = args[args.length - 2] + args[0].length; + } + // ES6 specs the context for replacement functions as `undefined` + return replacement.apply(undefined, 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 = nativ.replace.call(this == null ? this : String(this), search, function() { + // Keep this function's `arguments` available through closure + var args = arguments; + return nativ.replace.call(String(replacement), replacementToken, function($0, $1, $2) { + var n; + // Named or numbered backreference with curly braces + if ($1) { + // XRegExp behavior for `${n}`: + // 1. Backreference to numbered capture, if `n` is an integer. Use `0` for the + // entire match. Any number of leading zeros may be used. + // 2. Backreference to named capture `n`, if it exists and is not an integer + // overridden by numbered capture. In practice, this does not overlap with + // numbered capture since XRegExp does not allow named capture to use a bare + // integer as the name. + // 3. If the name or number does not refer to an existing capturing group, it's + // an error. + n = +$1; // Type-convert; drop leading zeros + if (n <= args.length - 3) { + return args[n] || ''; + } + // Groups with the same name is an error, else would need `lastIndexOf` + n = captureNames ? indexOf(captureNames, $1) : -1; + if (n < 0) { + throw new SyntaxError('Backreference to undefined group ' + $0); + } + return args[n + 1] || ''; + } + // Else, special variable or numbered backreference without curly braces + if ($2 === '$') { // $$ + return '$'; + } + if ($2 === '&' || +$2 === 0) { // $&, $0 (not followed by 1-9), $00 + return args[0]; + } + if ($2 === '`') { // $` (left context) + return args[args.length - 1].slice(0, args[args.length - 2]); + } + if ($2 === "'") { // $' (right context) + return args[args.length - 1].slice(args[args.length - 2] + args[0].length); + } + // Else, numbered backreference without curly braces + $2 = +$2; // Type-convert; drop leading zero + // XRegExp behavior for `$n` and `$nn`: + // - Backrefs end after 1 or 2 digits. Use `${..}` for more digits. + // - `$1` is an error if no capturing groups. + // - `$10` is an error if less than 10 capturing groups. Use `${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($2)) { + if ($2 > args.length - 3) { + throw new SyntaxError('Backreference to undefined group ' + $0); + } + return args[$2] || ''; + } + // `$` followed by an unsupported char is an error, unlike native JS + throw new SyntaxError('Invalid token ' + $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`. Calling `XRegExp.install('natives')` + * uses this to override the native method. Use via `XRegExp.split` without overriding natives. + * + * @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 nativ.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; + + XRegExp.forEach(str, separator, function(match) { + // This condition is not the same as `if (match[0].length)` + if ((match.index + match[0].length) > lastLastIndex) { + output.push(str.slice(lastLastIndex, match.index)); + if (match.length > 1 && match.index < str.length) { + Array.prototype.push.apply(output, match.slice(1)); + } + lastLength = match[0].length; + lastLastIndex = match.index + lastLength; + } + }); + + if (lastLastIndex === str.length) { + if (!nativ.test.call(separator, '') || lastLength) { + output.push(''); + } + } else { + output.push(str.slice(lastLastIndex)); + } + + separator.lastIndex = origLastIndex; + return output.length > limit ? output.slice(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 ' + 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 ' + match[0]); + } + if (code <= 0xFFFF) { + // Converting to \uNNNN avoids needing to escape the literal character and keep it + // separate from preceding tokens + return '\\u' + pad4(hex(code)); + } + // If `code` is between 0xFFFF and 0x10FFFF, require and defer to native handling + if (hasNativeU && flags.indexOf('u') > -1) { + return match[0]; + } + throw new SyntaxError('Cannot use Unicode code point above \\u{FFFF} without flag u'); + }, + { + scope: 'all', + leadChar: '\\' + } +); + +/* + * Empty character class: `[]` or `[^]`. This fixes a critical cross-browser syntax inconsistency. + * Unless this is standardized (per the ES spec), regex syntax can't be accurately parsed because + * character class endings can't be determined. + */ +XRegExp.addToken( + /\[(\^?)\]/, + function(match) { + // For cross-browser compatibility with ES3, convert [] to \b\B and [^] to [\s\S]. + // (?!) should work like \b\B, but is unreliable in some versions of Firefox + return match[1] ? '[\\s\\S]' : '\\b\\B'; + }, + {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. + */ +XRegExp.addToken( + /\./, + function() { + return '[\\s\\S]'; + }, + { + flag: 's', + leadChar: '.' + } +); + +/* + * Named backreference: `\k<name>`. Backreference names can use the characters A-Z, a-z, 0-9, _, + * and $ only. Also allows numbered backreferences as `\k<n>`. + */ +XRegExp.addToken( + /\\k<([\w$]+)>/, + function(match) { + // Groups with the same name is an error, else would need `lastIndexOf` + var index = isNaN(match[1]) ? (indexOf(this.captureNames, 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 ' + match[0]); + } + // Keep backreferences separate from subsequent literal numbers. This avoids e.g. + // inadvertedly changing `(?<n>)\k<n>1` to `()\11`. + return '\\' + index + ( + endIndex === match.input.length || isNaN(match.input.charAt(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 ' + + match[0]); + } + return match[0]; + }, + { + scope: 'all', + leadChar: '\\' + } +); + +/* + * Named capturing group; match the opening delimiter only: `(?<name>`. Capture names can use the + * characters A-Z, a-z, 0-9, _, and $ 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?<([\w$]+)>/, + function(match) { + // Disallow bare integers as names because named backreferences are added to match arrays + // and therefore numeric properties may lead to incorrect lookups + if (!isNaN(match[1])) { + throw new SyntaxError('Cannot use integer as capture name ' + match[0]); + } + if (match[1] === 'length' || match[1] === '__proto__') { + throw new SyntaxError('Cannot use reserved word as capture name ' + match[0]); + } + if (indexOf(this.captureNames, match[1]) > -1) { + throw new SyntaxError('Cannot use same name for multiple groups ' + 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 explicit capture mode (flag n). + */ +XRegExp.addToken( + /\((?!\?)/, + function(match, scope, flags) { + if (flags.indexOf('n') > -1) { + return '(?:'; + } + this.captureNames.push(null); + return '('; + }, + { + optionalFlags: 'n', + leadChar: '(' + } +); + +module.exports = XRegExp; + +},{}]},{},[8])(8) +}); diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/xregexp/xregexp.min.js b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/xregexp/xregexp.min.js new file mode 100644 index 0000000..6d56b1b --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/js/vendor/xregexp/xregexp.min.js @@ -0,0 +1,160 @@ +/* + XRegExp.build 3.2.0 + <xregexp.com> + Steven Levithan (c) 2012-2017 MIT License + Inspired by Lea Verou's RegExp.create <lea.verou.me> + XRegExp.matchRecursive 3.2.0 + <xregexp.com> + Steven Levithan (c) 2009-2017 MIT License + XRegExp Unicode Base 3.2.0 + <xregexp.com> + Steven Levithan (c) 2008-2017 MIT License + XRegExp Unicode Blocks 3.2.0 + <xregexp.com> + Steven Levithan (c) 2010-2017 MIT License + Unicode data by Mathias Bynens <mathiasbynens.be> + XRegExp Unicode Categories 3.2.0 + <xregexp.com> + Steven Levithan (c) 2010-2017 MIT License + Unicode data by Mathias Bynens <mathiasbynens.be> + XRegExp Unicode Properties 3.2.0 + <xregexp.com> + Steven Levithan (c) 2012-2017 MIT License + Unicode data by Mathias Bynens <mathiasbynens.be> + XRegExp Unicode Scripts 3.2.0 + <xregexp.com> + Steven Levithan (c) 2010-2017 MIT License + Unicode data by Mathias Bynens <mathiasbynens.be> + XRegExp 3.2.0 + <xregexp.com> + Steven Levithan (c) 2007-2017 MIT License +*/ +(function(H){"object"===typeof exports&&"undefined"!==typeof module?module.exports=H():"function"===typeof define&&define.amd?define([],H):("undefined"!==typeof window?window:"undefined"!==typeof global?global:"undefined"!==typeof self?self:this).XRegExp=H()})(function(){return function c(d,g,p){function A(l,b){if(!g[l]){if(!d[l]){var k="function"==typeof require&&require;if(!b&&k)return k(l,!0);if(B)return B(l,!0);b=Error("Cannot find module '"+l+"'");throw b.code="MODULE_NOT_FOUND",b;}b=g[l]={exports:{}}; +d[l][0].call(b.exports,function(b){var c=d[l][1][b];return A(c?c:b)},b,b.exports,c,d,g,p)}return g[l].exports}for(var B="function"==typeof require&&require,z=0;z<p.length;z++)A(p[z]);return A}({1:[function(d,g,p){g.exports=function(c){function A(b){var c=/^(?:\(\?:\))*\^/,l=/\$(?:\(\?:\))*$/;return c.test(b)&&l.test(b)&&l.test(b.replace(/\\[\s\S]/g,""))?b.replace(c,"").replace(l,""):b}function B(b,l){l=l?"x":"";return c.isRegExp(b)?b.xregexp&&b.xregexp.captureNames?b:c(b.source,l):c(b,l)}var z=/(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*\]/g, +l=c.union([/\({{([\w$]+)}}\)|{{([\w$]+)}}/,z],"g",{conjunction:"or"});c.build=function(b,k,g){g=g||"";var y=-1<g.indexOf("x"),m=/^\(\?([\w$]+)\)/.exec(b);m&&(g=c._clipDuplicates(g+m[1]));var h={},w;for(w in k)k.hasOwnProperty(w)&&(m=B(k[w],y),h[w]={pattern:A(m.source),names:m.xregexp.captureNames||[]});b=B(b,y);var x=0,v,q=0,f=[0],d=b.xregexp.captureNames||[];b=b.source.replace(l,function(b,c,m,l,y){var n=c||m;if(n){if(!h.hasOwnProperty(n))throw new ReferenceError("Undefined property "+b);if(c){var k= +d[q];f[++q]=++x;b="(?<"+(k||n)+">"}else b="(?:";v=x;return b+h[n].pattern.replace(z,function(f,b,c){if(b){if(k=h[n].names[x-v],++x,k)return"(?<"+k+">"}else if(c)return g=+c-1,h[n].names[g]?"\\k<"+h[n].names[g]+">":"\\"+(+c+v);return f})+")"}if(l){if(k=d[q],f[++q]=++x,k)return"(?<"+k+">"}else if(y){var g=+y-1;return d[g]?"\\k<"+d[g]+">":"\\"+f[+y]}return b});return c(b,g)}}},{}],2:[function(d,g,p){g.exports=function(c){function g(c,g,l,b){return{name:c,value:g,start:l,end:b}}c.matchRecursive=function(d, +p,l,b,k){b=b||"";k=k||{};var A=-1<b.indexOf("g"),y=-1<b.indexOf("y"),m=b.replace(/y/g,""),h=k.escapeChar;k=k.valueNames;var w=[],x=0,v=0,q=0,f=0;p=c(p,m);l=c(l,m);if(h){if(1<h.length)throw Error("Cannot use more than one escape character");h=c.escape(h);var z=new RegExp("(?:"+h+"[\\S\\s]|(?:(?!"+c.union([p,l],"",{conjunction:"or"}).source+")[^"+h+"])+)+",b.replace(/[^imu]+/g,""))}for(;;){h&&(q+=(c.exec(d,z,q,"sticky")||[""])[0].length);b=c.exec(d,p,q);m=c.exec(d,l,q);b&&m&&(b.index<=m.index?m=null: +b=null);if(b||m)v=(b||m).index,q=v+(b||m)[0].length;else if(!x)break;if(y&&!x&&v>f)break;if(b){if(!x){var n=v;var r=q}++x}else if(m&&x){if(!--x&&(k?(k[0]&&n>f&&w.push(g(k[0],d.slice(f,n),f,n)),k[1]&&w.push(g(k[1],d.slice(n,r),n,r)),k[2]&&w.push(g(k[2],d.slice(r,v),r,v)),k[3]&&w.push(g(k[3],d.slice(v,q),v,q))):w.push(d.slice(r,v)),f=q,!A))break}else throw Error("Unbalanced delimiter found in string");v===q&&++q}A&&!y&&k&&k[0]&&d.length>f&&w.push(g(k[0],d.slice(f),f,d.length));return w}}},{}],3:[function(d, +g,p){g.exports=function(c){function g(b){return b.replace(/[- _]+/g,"").toLowerCase()}function d(c){var m=/^\\[xu](.+)/.exec(c);return m?b(m[1]):c.charCodeAt("\\"===c.charAt(0)?1:0)}function p(b){var m="",h=-1;c.forEach(b,/(\\x..|\\u....|\\?[\s\S])(?:-(\\x..|\\u....|\\?[\s\S]))?/,function(b){var c=d(b[1]);c>h+1&&(m+="\\u"+C(k(h+1)),c>h+2&&(m+="-\\u"+C(k(c-1))));h=d(b[2]||b[1])});65535>h&&(m+="\\u"+C(k(h+1)),65534>h&&(m+="-\\uFFFF"));return m}var l={},b=c._dec,k=c._hex,C=c._pad4;c.addToken(/\\([pP])(?:{(\^?)([^}]*)}|([A-Za-z]))/, +function(b,c,h){var m="P"===b[1]||!!b[2],d=-1<h.indexOf("A");h=g(b[4]||b[3]);var k=l[h];if("P"===b[1]&&b[2])throw new SyntaxError("Invalid double negation "+b[0]);if(!l.hasOwnProperty(h))throw new SyntaxError("Unknown Unicode token "+b[0]);if(k.inverseOf){h=g(k.inverseOf);if(!l.hasOwnProperty(h))throw new ReferenceError("Unicode token missing data "+b[0]+" -> "+k.inverseOf);k=l[h];m=!m}if(!k.bmp&&!d)throw new SyntaxError("Astral mode required for Unicode token "+b[0]);if(d){if("class"===c)throw new SyntaxError("Astral mode does not support Unicode tokens within character classes"); +b=m?"a!":"a=";(c=l[h][b])||(c=l[h],h=l[h],d="",h.bmp&&!h.isBmpLast&&(d="["+h.bmp+"]"+(h.astral?"|":"")),h.astral&&(d+=h.astral),h.isBmpLast&&h.bmp&&(d+=(h.astral?"|":"")+"["+h.bmp+"]"),c=c[b]=m?"(?:(?!"+d+")(?:[\ud800-\udbff][\udc00-\udfff]|[\x00-\uffff]))":"(?:"+d+")");return c}return"class"===c?m?l[h]["b!"]||(l[h]["b!"]=p(l[h].bmp)):k.bmp:(m?"[^":"[")+k.bmp+"]"},{scope:"all",optionalFlags:"A",leadChar:"\\"});c.addUnicodeData=function(b){for(var d,h=0;h<b.length;++h){d=b[h];if(!d.name)throw Error("Unicode token requires name"); +if(!(d.inverseOf||d.bmp||d.astral))throw Error("Unicode token has no character data "+d.name);l[g(d.name)]=d;d.alias&&(l[g(d.alias)]=d)}c.cache.flush("patterns")};c._getUnicodeProperty=function(b){b=g(b);return l[b]}}},{}],4:[function(d,g,p){g.exports=function(c){if(!c.addUnicodeData)throw new ReferenceError("Unicode Base must be loaded before Unicode Blocks");c.addUnicodeData([{name:"InAdlam",astral:"\ud83a[\udd00-\udd5f]"},{name:"InAegean_Numbers",astral:"\ud800[\udd00-\udd3f]"},{name:"InAhom", +astral:"\ud805[\udf00-\udf3f]"},{name:"InAlchemical_Symbols",astral:"\ud83d[\udf00-\udf7f]"},{name:"InAlphabetic_Presentation_Forms",bmp:"\ufb00-\ufb4f"},{name:"InAnatolian_Hieroglyphs",astral:"\ud811[\udc00-\ude7f]"},{name:"InAncient_Greek_Musical_Notation",astral:"\ud834[\ude00-\ude4f]"},{name:"InAncient_Greek_Numbers",astral:"\ud800[\udd40-\udd8f]"},{name:"InAncient_Symbols",astral:"\ud800[\udd90-\uddcf]"},{name:"InArabic",bmp:"\u0600-\u06ff"},{name:"InArabic_Extended_A",bmp:"\u08a0-\u08ff"},{name:"InArabic_Mathematical_Alphabetic_Symbols", +astral:"\ud83b[\ude00-\udeff]"},{name:"InArabic_Presentation_Forms_A",bmp:"\ufb50-\ufdff"},{name:"InArabic_Presentation_Forms_B",bmp:"\ufe70-\ufeff"},{name:"InArabic_Supplement",bmp:"\u0750-\u077f"},{name:"InArmenian",bmp:"\u0530-\u058f"},{name:"InArrows",bmp:"\u2190-\u21ff"},{name:"InAvestan",astral:"\ud802[\udf00-\udf3f]"},{name:"InBalinese",bmp:"\u1b00-\u1b7f"},{name:"InBamum",bmp:"\ua6a0-\ua6ff"},{name:"InBamum_Supplement",astral:"\ud81a[\udc00-\ude3f]"},{name:"InBasic_Latin",bmp:"\x00-\u007f"}, +{name:"InBassa_Vah",astral:"\ud81a[\uded0-\udeff]"},{name:"InBatak",bmp:"\u1bc0-\u1bff"},{name:"InBengali",bmp:"\u0980-\u09ff"},{name:"InBhaiksuki",astral:"\ud807[\udc00-\udc6f]"},{name:"InBlock_Elements",bmp:"\u2580-\u259f"},{name:"InBopomofo",bmp:"\u3100-\u312f"},{name:"InBopomofo_Extended",bmp:"\u31a0-\u31bf"},{name:"InBox_Drawing",bmp:"\u2500-\u257f"},{name:"InBrahmi",astral:"\ud804[\udc00-\udc7f]"},{name:"InBraille_Patterns",bmp:"\u2800-\u28ff"},{name:"InBuginese",bmp:"\u1a00-\u1a1f"},{name:"InBuhid", +bmp:"\u1740-\u175f"},{name:"InByzantine_Musical_Symbols",astral:"\ud834[\udc00-\udcff]"},{name:"InCJK_Compatibility",bmp:"\u3300-\u33ff"},{name:"InCJK_Compatibility_Forms",bmp:"\ufe30-\ufe4f"},{name:"InCJK_Compatibility_Ideographs",bmp:"\uf900-\ufaff"},{name:"InCJK_Compatibility_Ideographs_Supplement",astral:"\ud87e[\udc00-\ude1f]"},{name:"InCJK_Radicals_Supplement",bmp:"\u2e80-\u2eff"},{name:"InCJK_Strokes",bmp:"\u31c0-\u31ef"},{name:"InCJK_Symbols_and_Punctuation",bmp:"\u3000-\u303f"},{name:"InCJK_Unified_Ideographs", +bmp:"\u4e00-\u9fff"},{name:"InCJK_Unified_Ideographs_Extension_A",bmp:"\u3400-\u4dbf"},{name:"InCJK_Unified_Ideographs_Extension_B",astral:"[\ud840-\ud868][\udc00-\udfff]|\ud869[\udc00-\udedf]"},{name:"InCJK_Unified_Ideographs_Extension_C",astral:"\ud869[\udf00-\udfff]|[\ud86a-\ud86c][\udc00-\udfff]|\ud86d[\udc00-\udf3f]"},{name:"InCJK_Unified_Ideographs_Extension_D",astral:"\ud86d[\udf40-\udfff]|\ud86e[\udc00-\udc1f]"},{name:"InCJK_Unified_Ideographs_Extension_E",astral:"\ud86e[\udc20-\udfff]|[\ud86f-\ud872][\udc00-\udfff]|\ud873[\udc00-\udeaf]"}, +{name:"InCarian",astral:"\ud800[\udea0-\udedf]"},{name:"InCaucasian_Albanian",astral:"\ud801[\udd30-\udd6f]"},{name:"InChakma",astral:"\ud804[\udd00-\udd4f]"},{name:"InCham",bmp:"\uaa00-\uaa5f"},{name:"InCherokee",bmp:"\u13a0-\u13ff"},{name:"InCherokee_Supplement",bmp:"\uab70-\uabbf"},{name:"InCombining_Diacritical_Marks",bmp:"\u0300-\u036f"},{name:"InCombining_Diacritical_Marks_Extended",bmp:"\u1ab0-\u1aff"},{name:"InCombining_Diacritical_Marks_Supplement",bmp:"\u1dc0-\u1dff"},{name:"InCombining_Diacritical_Marks_for_Symbols", +bmp:"\u20d0-\u20ff"},{name:"InCombining_Half_Marks",bmp:"\ufe20-\ufe2f"},{name:"InCommon_Indic_Number_Forms",bmp:"\ua830-\ua83f"},{name:"InControl_Pictures",bmp:"\u2400-\u243f"},{name:"InCoptic",bmp:"\u2c80-\u2cff"},{name:"InCoptic_Epact_Numbers",astral:"\ud800[\udee0-\udeff]"},{name:"InCounting_Rod_Numerals",astral:"\ud834[\udf60-\udf7f]"},{name:"InCuneiform",astral:"\ud808[\udc00-\udfff]"},{name:"InCuneiform_Numbers_and_Punctuation",astral:"\ud809[\udc00-\udc7f]"},{name:"InCurrency_Symbols",bmp:"\u20a0-\u20cf"}, +{name:"InCypriot_Syllabary",astral:"\ud802[\udc00-\udc3f]"},{name:"InCyrillic",bmp:"\u0400-\u04ff"},{name:"InCyrillic_Extended_A",bmp:"\u2de0-\u2dff"},{name:"InCyrillic_Extended_B",bmp:"\ua640-\ua69f"},{name:"InCyrillic_Extended_C",bmp:"\u1c80-\u1c8f"},{name:"InCyrillic_Supplement",bmp:"\u0500-\u052f"},{name:"InDeseret",astral:"\ud801[\udc00-\udc4f]"},{name:"InDevanagari",bmp:"\u0900-\u097f"},{name:"InDevanagari_Extended",bmp:"\ua8e0-\ua8ff"},{name:"InDingbats",bmp:"\u2700-\u27bf"},{name:"InDomino_Tiles", +astral:"\ud83c[\udc30-\udc9f]"},{name:"InDuployan",astral:"\ud82f[\udc00-\udc9f]"},{name:"InEarly_Dynastic_Cuneiform",astral:"\ud809[\udc80-\udd4f]"},{name:"InEgyptian_Hieroglyphs",astral:"\ud80c[\udc00-\udfff]|\ud80d[\udc00-\udc2f]"},{name:"InElbasan",astral:"\ud801[\udd00-\udd2f]"},{name:"InEmoticons",astral:"\ud83d[\ude00-\ude4f]"},{name:"InEnclosed_Alphanumeric_Supplement",astral:"\ud83c[\udd00-\uddff]"},{name:"InEnclosed_Alphanumerics",bmp:"\u2460-\u24ff"},{name:"InEnclosed_CJK_Letters_and_Months", +bmp:"\u3200-\u32ff"},{name:"InEnclosed_Ideographic_Supplement",astral:"\ud83c[\ude00-\udeff]"},{name:"InEthiopic",bmp:"\u1200-\u137f"},{name:"InEthiopic_Extended",bmp:"\u2d80-\u2ddf"},{name:"InEthiopic_Extended_A",bmp:"\uab00-\uab2f"},{name:"InEthiopic_Supplement",bmp:"\u1380-\u139f"},{name:"InGeneral_Punctuation",bmp:"\u2000-\u206f"},{name:"InGeometric_Shapes",bmp:"\u25a0-\u25ff"},{name:"InGeometric_Shapes_Extended",astral:"\ud83d[\udf80-\udfff]"},{name:"InGeorgian",bmp:"\u10a0-\u10ff"},{name:"InGeorgian_Supplement", +bmp:"\u2d00-\u2d2f"},{name:"InGlagolitic",bmp:"\u2c00-\u2c5f"},{name:"InGlagolitic_Supplement",astral:"\ud838[\udc00-\udc2f]"},{name:"InGothic",astral:"\ud800[\udf30-\udf4f]"},{name:"InGrantha",astral:"\ud804[\udf00-\udf7f]"},{name:"InGreek_Extended",bmp:"\u1f00-\u1fff"},{name:"InGreek_and_Coptic",bmp:"\u0370-\u03ff"},{name:"InGujarati",bmp:"\u0a80-\u0aff"},{name:"InGurmukhi",bmp:"\u0a00-\u0a7f"},{name:"InHalfwidth_and_Fullwidth_Forms",bmp:"\uff00-\uffef"},{name:"InHangul_Compatibility_Jamo",bmp:"\u3130-\u318f"}, +{name:"InHangul_Jamo",bmp:"\u1100-\u11ff"},{name:"InHangul_Jamo_Extended_A",bmp:"\ua960-\ua97f"},{name:"InHangul_Jamo_Extended_B",bmp:"\ud7b0-\ud7ff"},{name:"InHangul_Syllables",bmp:"\uac00-\ud7af"},{name:"InHanunoo",bmp:"\u1720-\u173f"},{name:"InHatran",astral:"\ud802[\udce0-\udcff]"},{name:"InHebrew",bmp:"\u0590-\u05ff"},{name:"InHigh_Private_Use_Surrogates",bmp:"\udb80-\udbff"},{name:"InHigh_Surrogates",bmp:"\ud800-\udb7f"},{name:"InHiragana",bmp:"\u3040-\u309f"},{name:"InIPA_Extensions",bmp:"\u0250-\u02af"}, +{name:"InIdeographic_Description_Characters",bmp:"\u2ff0-\u2fff"},{name:"InIdeographic_Symbols_and_Punctuation",astral:"\ud81b[\udfe0-\udfff]"},{name:"InImperial_Aramaic",astral:"\ud802[\udc40-\udc5f]"},{name:"InInscriptional_Pahlavi",astral:"\ud802[\udf60-\udf7f]"},{name:"InInscriptional_Parthian",astral:"\ud802[\udf40-\udf5f]"},{name:"InJavanese",bmp:"\ua980-\ua9df"},{name:"InKaithi",astral:"\ud804[\udc80-\udccf]"},{name:"InKana_Supplement",astral:"\ud82c[\udc00-\udcff]"},{name:"InKanbun",bmp:"\u3190-\u319f"}, +{name:"InKangxi_Radicals",bmp:"\u2f00-\u2fdf"},{name:"InKannada",bmp:"\u0c80-\u0cff"},{name:"InKatakana",bmp:"\u30a0-\u30ff"},{name:"InKatakana_Phonetic_Extensions",bmp:"\u31f0-\u31ff"},{name:"InKayah_Li",bmp:"\ua900-\ua92f"},{name:"InKharoshthi",astral:"\ud802[\ude00-\ude5f]"},{name:"InKhmer",bmp:"\u1780-\u17ff"},{name:"InKhmer_Symbols",bmp:"\u19e0-\u19ff"},{name:"InKhojki",astral:"\ud804[\ude00-\ude4f]"},{name:"InKhudawadi",astral:"\ud804[\udeb0-\udeff]"},{name:"InLao",bmp:"\u0e80-\u0eff"},{name:"InLatin_Extended_Additional", +bmp:"\u1e00-\u1eff"},{name:"InLatin_Extended_A",bmp:"\u0100-\u017f"},{name:"InLatin_Extended_B",bmp:"\u0180-\u024f"},{name:"InLatin_Extended_C",bmp:"\u2c60-\u2c7f"},{name:"InLatin_Extended_D",bmp:"\ua720-\ua7ff"},{name:"InLatin_Extended_E",bmp:"\uab30-\uab6f"},{name:"InLatin_1_Supplement",bmp:"\u0080-\u00ff"},{name:"InLepcha",bmp:"\u1c00-\u1c4f"},{name:"InLetterlike_Symbols",bmp:"\u2100-\u214f"},{name:"InLimbu",bmp:"\u1900-\u194f"},{name:"InLinear_A",astral:"\ud801[\ude00-\udf7f]"},{name:"InLinear_B_Ideograms", +astral:"\ud800[\udc80-\udcff]"},{name:"InLinear_B_Syllabary",astral:"\ud800[\udc00-\udc7f]"},{name:"InLisu",bmp:"\ua4d0-\ua4ff"},{name:"InLow_Surrogates",bmp:"\udc00-\udfff"},{name:"InLycian",astral:"\ud800[\ude80-\ude9f]"},{name:"InLydian",astral:"\ud802[\udd20-\udd3f]"},{name:"InMahajani",astral:"\ud804[\udd50-\udd7f]"},{name:"InMahjong_Tiles",astral:"\ud83c[\udc00-\udc2f]"},{name:"InMalayalam",bmp:"\u0d00-\u0d7f"},{name:"InMandaic",bmp:"\u0840-\u085f"},{name:"InManichaean",astral:"\ud802[\udec0-\udeff]"}, +{name:"InMarchen",astral:"\ud807[\udc70-\udcbf]"},{name:"InMathematical_Alphanumeric_Symbols",astral:"\ud835[\udc00-\udfff]"},{name:"InMathematical_Operators",bmp:"\u2200-\u22ff"},{name:"InMeetei_Mayek",bmp:"\uabc0-\uabff"},{name:"InMeetei_Mayek_Extensions",bmp:"\uaae0-\uaaff"},{name:"InMende_Kikakui",astral:"\ud83a[\udc00-\udcdf]"},{name:"InMeroitic_Cursive",astral:"\ud802[\udda0-\uddff]"},{name:"InMeroitic_Hieroglyphs",astral:"\ud802[\udd80-\udd9f]"},{name:"InMiao",astral:"\ud81b[\udf00-\udf9f]"}, +{name:"InMiscellaneous_Mathematical_Symbols_A",bmp:"\u27c0-\u27ef"},{name:"InMiscellaneous_Mathematical_Symbols_B",bmp:"\u2980-\u29ff"},{name:"InMiscellaneous_Symbols",bmp:"\u2600-\u26ff"},{name:"InMiscellaneous_Symbols_and_Arrows",bmp:"\u2b00-\u2bff"},{name:"InMiscellaneous_Symbols_and_Pictographs",astral:"\ud83c[\udf00-\udfff]|\ud83d[\udc00-\uddff]"},{name:"InMiscellaneous_Technical",bmp:"\u2300-\u23ff"},{name:"InModi",astral:"\ud805[\ude00-\ude5f]"},{name:"InModifier_Tone_Letters",bmp:"\ua700-\ua71f"}, +{name:"InMongolian",bmp:"\u1800-\u18af"},{name:"InMongolian_Supplement",astral:"\ud805[\ude60-\ude7f]"},{name:"InMro",astral:"\ud81a[\ude40-\ude6f]"},{name:"InMultani",astral:"\ud804[\ude80-\udeaf]"},{name:"InMusical_Symbols",astral:"\ud834[\udd00-\uddff]"},{name:"InMyanmar",bmp:"\u1000-\u109f"},{name:"InMyanmar_Extended_A",bmp:"\uaa60-\uaa7f"},{name:"InMyanmar_Extended_B",bmp:"\ua9e0-\ua9ff"},{name:"InNKo",bmp:"\u07c0-\u07ff"},{name:"InNabataean",astral:"\ud802[\udc80-\udcaf]"},{name:"InNew_Tai_Lue", +bmp:"\u1980-\u19df"},{name:"InNewa",astral:"\ud805[\udc00-\udc7f]"},{name:"InNumber_Forms",bmp:"\u2150-\u218f"},{name:"InOgham",bmp:"\u1680-\u169f"},{name:"InOl_Chiki",bmp:"\u1c50-\u1c7f"},{name:"InOld_Hungarian",astral:"\ud803[\udc80-\udcff]"},{name:"InOld_Italic",astral:"\ud800[\udf00-\udf2f]"},{name:"InOld_North_Arabian",astral:"\ud802[\ude80-\ude9f]"},{name:"InOld_Permic",astral:"\ud800[\udf50-\udf7f]"},{name:"InOld_Persian",astral:"\ud800[\udfa0-\udfdf]"},{name:"InOld_South_Arabian",astral:"\ud802[\ude60-\ude7f]"}, +{name:"InOld_Turkic",astral:"\ud803[\udc00-\udc4f]"},{name:"InOptical_Character_Recognition",bmp:"\u2440-\u245f"},{name:"InOriya",bmp:"\u0b00-\u0b7f"},{name:"InOrnamental_Dingbats",astral:"\ud83d[\ude50-\ude7f]"},{name:"InOsage",astral:"\ud801[\udcb0-\udcff]"},{name:"InOsmanya",astral:"\ud801[\udc80-\udcaf]"},{name:"InPahawh_Hmong",astral:"\ud81a[\udf00-\udf8f]"},{name:"InPalmyrene",astral:"\ud802[\udc60-\udc7f]"},{name:"InPau_Cin_Hau",astral:"\ud806[\udec0-\udeff]"},{name:"InPhags_pa",bmp:"\ua840-\ua87f"}, +{name:"InPhaistos_Disc",astral:"\ud800[\uddd0-\uddff]"},{name:"InPhoenician",astral:"\ud802[\udd00-\udd1f]"},{name:"InPhonetic_Extensions",bmp:"\u1d00-\u1d7f"},{name:"InPhonetic_Extensions_Supplement",bmp:"\u1d80-\u1dbf"},{name:"InPlaying_Cards",astral:"\ud83c[\udca0-\udcff]"},{name:"InPrivate_Use_Area",bmp:"\ue000-\uf8ff"},{name:"InPsalter_Pahlavi",astral:"\ud802[\udf80-\udfaf]"},{name:"InRejang",bmp:"\ua930-\ua95f"},{name:"InRumi_Numeral_Symbols",astral:"\ud803[\ude60-\ude7f]"},{name:"InRunic", +bmp:"\u16a0-\u16ff"},{name:"InSamaritan",bmp:"\u0800-\u083f"},{name:"InSaurashtra",bmp:"\ua880-\ua8df"},{name:"InSharada",astral:"\ud804[\udd80-\udddf]"},{name:"InShavian",astral:"\ud801[\udc50-\udc7f]"},{name:"InShorthand_Format_Controls",astral:"\ud82f[\udca0-\udcaf]"},{name:"InSiddham",astral:"\ud805[\udd80-\uddff]"},{name:"InSinhala",bmp:"\u0d80-\u0dff"},{name:"InSinhala_Archaic_Numbers",astral:"\ud804[\udde0-\uddff]"},{name:"InSmall_Form_Variants",bmp:"\ufe50-\ufe6f"},{name:"InSora_Sompeng", +astral:"\ud804[\udcd0-\udcff]"},{name:"InSpacing_Modifier_Letters",bmp:"\u02b0-\u02ff"},{name:"InSpecials",bmp:"\ufff0-\uffff"},{name:"InSundanese",bmp:"\u1b80-\u1bbf"},{name:"InSundanese_Supplement",bmp:"\u1cc0-\u1ccf"},{name:"InSuperscripts_and_Subscripts",bmp:"\u2070-\u209f"},{name:"InSupplemental_Arrows_A",bmp:"\u27f0-\u27ff"},{name:"InSupplemental_Arrows_B",bmp:"\u2900-\u297f"},{name:"InSupplemental_Arrows_C",astral:"\ud83e[\udc00-\udcff]"},{name:"InSupplemental_Mathematical_Operators",bmp:"\u2a00-\u2aff"}, +{name:"InSupplemental_Punctuation",bmp:"\u2e00-\u2e7f"},{name:"InSupplemental_Symbols_and_Pictographs",astral:"\ud83e[\udd00-\uddff]"},{name:"InSupplementary_Private_Use_Area_A",astral:"[\udb80-\udbbf][\udc00-\udfff]"},{name:"InSupplementary_Private_Use_Area_B",astral:"[\udbc0-\udbff][\udc00-\udfff]"},{name:"InSutton_SignWriting",astral:"\ud836[\udc00-\udeaf]"},{name:"InSyloti_Nagri",bmp:"\ua800-\ua82f"},{name:"InSyriac",bmp:"\u0700-\u074f"},{name:"InTagalog",bmp:"\u1700-\u171f"},{name:"InTagbanwa", +bmp:"\u1760-\u177f"},{name:"InTags",astral:"\udb40[\udc00-\udc7f]"},{name:"InTai_Le",bmp:"\u1950-\u197f"},{name:"InTai_Tham",bmp:"\u1a20-\u1aaf"},{name:"InTai_Viet",bmp:"\uaa80-\uaadf"},{name:"InTai_Xuan_Jing_Symbols",astral:"\ud834[\udf00-\udf5f]"},{name:"InTakri",astral:"\ud805[\ude80-\udecf]"},{name:"InTamil",bmp:"\u0b80-\u0bff"},{name:"InTangut",astral:"[\ud81c-\ud821][\udc00-\udfff]"},{name:"InTangut_Components",astral:"\ud822[\udc00-\udeff]"},{name:"InTelugu",bmp:"\u0c00-\u0c7f"},{name:"InThaana", +bmp:"\u0780-\u07bf"},{name:"InThai",bmp:"\u0e00-\u0e7f"},{name:"InTibetan",bmp:"\u0f00-\u0fff"},{name:"InTifinagh",bmp:"\u2d30-\u2d7f"},{name:"InTirhuta",astral:"\ud805[\udc80-\udcdf]"},{name:"InTransport_and_Map_Symbols",astral:"\ud83d[\ude80-\udeff]"},{name:"InUgaritic",astral:"\ud800[\udf80-\udf9f]"},{name:"InUnified_Canadian_Aboriginal_Syllabics",bmp:"\u1400-\u167f"},{name:"InUnified_Canadian_Aboriginal_Syllabics_Extended",bmp:"\u18b0-\u18ff"},{name:"InVai",bmp:"\ua500-\ua63f"},{name:"InVariation_Selectors", +bmp:"\ufe00-\ufe0f"},{name:"InVariation_Selectors_Supplement",astral:"\udb40[\udd00-\uddef]"},{name:"InVedic_Extensions",bmp:"\u1cd0-\u1cff"},{name:"InVertical_Forms",bmp:"\ufe10-\ufe1f"},{name:"InWarang_Citi",astral:"\ud806[\udca0-\udcff]"},{name:"InYi_Radicals",bmp:"\ua490-\ua4cf"},{name:"InYi_Syllables",bmp:"\ua000-\ua48f"},{name:"InYijing_Hexagram_Symbols",bmp:"\u4dc0-\u4dff"}])}},{}],5:[function(d,g,p){g.exports=function(c){if(!c.addUnicodeData)throw new ReferenceError("Unicode Base must be loaded before Unicode Categories"); +c.addUnicodeData([{name:"C",alias:"Other",isBmpLast:!0,bmp:"\x00-\u001f\u007f-\u009f\u00ad\u0378\u0379\u0380-\u0383\u038b\u038d\u03a2\u0530\u0557\u0558\u0560\u0588\u058b\u058c\u0590\u05c8-\u05cf\u05eb-\u05ef\u05f5-\u0605\u061c\u061d\u06dd\u070e\u070f\u074b\u074c\u07b2-\u07bf\u07fb-\u07ff\u082e\u082f\u083f\u085c\u085d\u085f-\u089f\u08b5\u08be-\u08d3\u08e2\u0984\u098d\u098e\u0991\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba\u09bb\u09c5\u09c6\u09c9\u09ca\u09cf-\u09d6\u09d8-\u09db\u09de\u09e4\u09e5\u09fc-\u0a00\u0a04\u0a0b-\u0a0e\u0a11\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a\u0a3b\u0a3d\u0a43-\u0a46\u0a49\u0a4a\u0a4e-\u0a50\u0a52-\u0a58\u0a5d\u0a5f-\u0a65\u0a76-\u0a80\u0a84\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba\u0abb\u0ac6\u0aca\u0ace\u0acf\u0ad1-\u0adf\u0ae4\u0ae5\u0af2-\u0af8\u0afa-\u0b00\u0b04\u0b0d\u0b0e\u0b11\u0b12\u0b29\u0b31\u0b34\u0b3a\u0b3b\u0b45\u0b46\u0b49\u0b4a\u0b4e-\u0b55\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\u0c04\u0c0d\u0c11\u0c29\u0c3a-\u0c3c\u0c45\u0c49\u0c4e-\u0c54\u0c57\u0c5b-\u0c5f\u0c64\u0c65\u0c70-\u0c77\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba\u0cbb\u0cc5\u0cc9\u0cce-\u0cd4\u0cd7-\u0cdd\u0cdf\u0ce4\u0ce5\u0cf0\u0cf3-\u0d00\u0d04\u0d0d\u0d11\u0d3b\u0d3c\u0d45\u0d49\u0d50-\u0d53\u0d64\u0d65\u0d80\u0d81\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\u0e86\u0e89\u0e8b\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8\u0ea9\u0eac\u0eba\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\u170d\u1715-\u171f\u1737-\u173f\u1754-\u175f\u176d\u1771\u1774-\u177f\u17de\u17df\u17ea-\u17ef\u17fa-\u17ff\u180e\u180f\u181a-\u181f\u1878-\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\u1abf-\u1aff\u1b4c-\u1b4f\u1b7d-\u1b7f\u1bf4-\u1bfb\u1c38-\u1c3a\u1c4a-\u1c4c\u1c89-\u1cbf\u1cc8-\u1ccf\u1cf7\u1cfa-\u1cff\u1df6-\u1dfa\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\u20bf-\u20cf\u20f1-\u20ff\u218c-\u218f\u23ff\u2427-\u243f\u244b-\u245f\u2b74\u2b75\u2b96\u2b97\u2bba-\u2bbc\u2bc9\u2bd2-\u2beb\u2bf0-\u2bff\u2c2f\u2c5f\u2cf4-\u2cf8\u2d26\u2d28-\u2d2c\u2d2e\u2d2f\u2d68-\u2d6e\u2d71-\u2d7e\u2d97-\u2d9f\u2da7\u2daf\u2db7\u2dbf\u2dc7\u2dcf\u2dd7\u2ddf\u2e45-\u2e7f\u2e9a\u2ef4-\u2eff\u2fd6-\u2fef\u2ffc-\u2fff\u3040\u3097\u3098\u3100-\u3104\u312e-\u3130\u318f\u31bb-\u31bf\u31e4-\u31ef\u321f\u32ff\u4db6-\u4dbf\u9fd6-\u9fff\ua48d-\ua48f\ua4c7-\ua4cf\ua62c-\ua63f\ua6f8-\ua6ff\ua7af\ua7b8-\ua7f6\ua82c-\ua82f\ua83a-\ua83f\ua878-\ua87f\ua8c6-\ua8cd\ua8da-\ua8df\ua8fe\ua8ff\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\uab66-\uab6f\uabee\uabef\uabfa-\uabff\ud7a4-\ud7af\ud7c7-\ud7ca\ud7fc-\uf8ff\ufa6e\ufa6f\ufada-\ufaff\ufb07-\ufb12\ufb18-\ufb1c\ufb37\ufb3d\ufb3f\ufb42\ufb45\ufbc2-\ufbd2\ufd40-\ufd4f\ufd90\ufd91\ufdc8-\ufdef\ufdfe\ufdff\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\udd9c-\udd9f\udda1-\uddcf\uddfe-\ude7f\ude9d-\ude9f\uded1-\udedf\udefc-\udeff\udf24-\udf2f\udf4b-\udf4f\udf7b-\udf7f\udf9e\udfc4-\udfc7\udfd6-\udfff]|\ud801[\udc9e\udc9f\udcaa-\udcaf\udcd4-\udcd7\udcfc-\udcff\udd28-\udd2f\udd64-\udd6e\udd70-\uddff\udf37-\udf3f\udf56-\udf5f\udf68-\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\ude34-\ude37\ude3b-\ude3e\ude48-\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\udd00-\ude5f\ude7f-\udfff]|\ud804[\udc4e-\udc51\udc70-\udc7e\udcbd\udcc2-\udccf\udce9-\udcef\udcfa-\udcff\udd35\udd44-\udd4f\udd77-\udd7f\uddce\uddcf\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\udf3b\udf45\udf46\udf49\udf4a\udf4e\udf4f\udf51-\udf56\udf58-\udf5c\udf64\udf65\udf6d-\udf6f\udf75-\udfff]|\ud805[\udc5a\udc5c\udc5e-\udc7f\udcc8-\udccf\udcda-\udd7f\uddb6\uddb7\uddde-\uddff\ude45-\ude4f\ude5a-\ude5f\ude6d-\ude7f\udeb8-\udebf\udeca-\udeff\udf1a-\udf1c\udf2c-\udf2f\udf40-\udfff]|\ud806[\udc00-\udc9f\udcf3-\udcfe\udd00-\udebf\udef9-\udfff]|\ud807[\udc09\udc37\udc46-\udc4f\udc6d-\udc6f\udc90\udc91\udca8\udcb7-\udfff]|\ud808[\udf9a-\udfff]|\ud809[\udc6f\udc75-\udc7f\udd44-\udfff]|[\ud80a\ud80b\ud80e-\ud810\ud812-\ud819\ud823-\ud82b\ud82d\ud82e\ud830-\ud833\ud837\ud839\ud83f\ud874-\ud87d\ud87f-\udb3f\udb41-\udbff][\udc00-\udfff]|\ud80d[\udc2f-\udfff]|\ud811[\ude47-\udfff]|\ud81a[\ude39-\ude3f\ude5f\ude6a-\ude6d\ude70-\udecf\udeee\udeef\udef6-\udeff\udf46-\udf4f\udf5a\udf62\udf78-\udf7c\udf90-\udfff]|\ud81b[\udc00-\udeff\udf45-\udf4f\udf7f-\udf8e\udfa0-\udfdf\udfe1-\udfff]|\ud821[\udfed-\udfff]|\ud822[\udef3-\udfff]|\ud82c[\udc02-\udfff]|\ud82f[\udc6b-\udc6f\udc7d-\udc7f\udc89-\udc8f\udc9a\udc9b\udca0-\udfff]|\ud834[\udcf6-\udcff\udd27\udd28\udd73-\udd7a\udde9-\uddff\ude46-\udeff\udf57-\udf5f\udf72-\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]|\ud838[\udc07\udc19\udc1a\udc22\udc25\udc2b-\udfff]|\ud83a[\udcc5\udcc6\udcd7-\udcff\udd4b-\udd4f\udd5a-\udd5d\udd60-\udfff]|\ud83b[\udc00-\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\udd0d-\udd0f\udd2f\udd6c-\udd6f\uddad-\udde5\ude03-\ude0f\ude3c-\ude3f\ude49-\ude4f\ude52-\udeff]|\ud83d[\uded3-\udedf\udeed-\udeef\udef7-\udeff\udf74-\udf7f\udfd5-\udfff]|\ud83e[\udc0c-\udc0f\udc48-\udc4f\udc5a-\udc5f\udc88-\udc8f\udcae-\udd0f\udd1f\udd28-\udd2f\udd31\udd32\udd3f\udd4c-\udd4f\udd5f-\udd7f\udd92-\uddbf\uddc1-\udfff]|\ud869[\uded7-\udeff]|\ud86d[\udf35-\udf3f]|\ud86e[\udc1e\udc1f]|\ud873[\udea2-\udfff]|\ud87e[\ude1e-\udfff]|\udb40[\udc00-\udcff\uddf0-\udfff]"}, +{name:"Cc",alias:"Control",bmp:"\x00-\u001f\u007f-\u009f"},{name:"Cf",alias:"Format",bmp:"\u00ad\u0600-\u0605\u061c\u06dd\u070f\u08e2\u180e\u200b-\u200f\u202a-\u202e\u2060-\u2064\u2066-\u206f\ufeff\ufff9-\ufffb",astral:"\ud804\udcbd|\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\u0560\u0588\u058b\u058c\u0590\u05c8-\u05cf\u05eb-\u05ef\u05f5-\u05ff\u061d\u070e\u074b\u074c\u07b2-\u07bf\u07fb-\u07ff\u082e\u082f\u083f\u085c\u085d\u085f-\u089f\u08b5\u08be-\u08d3\u0984\u098d\u098e\u0991\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba\u09bb\u09c5\u09c6\u09c9\u09ca\u09cf-\u09d6\u09d8-\u09db\u09de\u09e4\u09e5\u09fc-\u0a00\u0a04\u0a0b-\u0a0e\u0a11\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a\u0a3b\u0a3d\u0a43-\u0a46\u0a49\u0a4a\u0a4e-\u0a50\u0a52-\u0a58\u0a5d\u0a5f-\u0a65\u0a76-\u0a80\u0a84\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba\u0abb\u0ac6\u0aca\u0ace\u0acf\u0ad1-\u0adf\u0ae4\u0ae5\u0af2-\u0af8\u0afa-\u0b00\u0b04\u0b0d\u0b0e\u0b11\u0b12\u0b29\u0b31\u0b34\u0b3a\u0b3b\u0b45\u0b46\u0b49\u0b4a\u0b4e-\u0b55\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\u0c04\u0c0d\u0c11\u0c29\u0c3a-\u0c3c\u0c45\u0c49\u0c4e-\u0c54\u0c57\u0c5b-\u0c5f\u0c64\u0c65\u0c70-\u0c77\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba\u0cbb\u0cc5\u0cc9\u0cce-\u0cd4\u0cd7-\u0cdd\u0cdf\u0ce4\u0ce5\u0cf0\u0cf3-\u0d00\u0d04\u0d0d\u0d11\u0d3b\u0d3c\u0d45\u0d49\u0d50-\u0d53\u0d64\u0d65\u0d80\u0d81\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\u0e86\u0e89\u0e8b\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8\u0ea9\u0eac\u0eba\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\u170d\u1715-\u171f\u1737-\u173f\u1754-\u175f\u176d\u1771\u1774-\u177f\u17de\u17df\u17ea-\u17ef\u17fa-\u17ff\u180f\u181a-\u181f\u1878-\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\u1abf-\u1aff\u1b4c-\u1b4f\u1b7d-\u1b7f\u1bf4-\u1bfb\u1c38-\u1c3a\u1c4a-\u1c4c\u1c89-\u1cbf\u1cc8-\u1ccf\u1cf7\u1cfa-\u1cff\u1df6-\u1dfa\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\u20bf-\u20cf\u20f1-\u20ff\u218c-\u218f\u23ff\u2427-\u243f\u244b-\u245f\u2b74\u2b75\u2b96\u2b97\u2bba-\u2bbc\u2bc9\u2bd2-\u2beb\u2bf0-\u2bff\u2c2f\u2c5f\u2cf4-\u2cf8\u2d26\u2d28-\u2d2c\u2d2e\u2d2f\u2d68-\u2d6e\u2d71-\u2d7e\u2d97-\u2d9f\u2da7\u2daf\u2db7\u2dbf\u2dc7\u2dcf\u2dd7\u2ddf\u2e45-\u2e7f\u2e9a\u2ef4-\u2eff\u2fd6-\u2fef\u2ffc-\u2fff\u3040\u3097\u3098\u3100-\u3104\u312e-\u3130\u318f\u31bb-\u31bf\u31e4-\u31ef\u321f\u32ff\u4db6-\u4dbf\u9fd6-\u9fff\ua48d-\ua48f\ua4c7-\ua4cf\ua62c-\ua63f\ua6f8-\ua6ff\ua7af\ua7b8-\ua7f6\ua82c-\ua82f\ua83a-\ua83f\ua878-\ua87f\ua8c6-\ua8cd\ua8da-\ua8df\ua8fe\ua8ff\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\uab66-\uab6f\uabee\uabef\uabfa-\uabff\ud7a4-\ud7af\ud7c7-\ud7ca\ud7fc-\ud7ff\ufa6e\ufa6f\ufada-\ufaff\ufb07-\ufb12\ufb18-\ufb1c\ufb37\ufb3d\ufb3f\ufb42\ufb45\ufbc2-\ufbd2\ufd40-\ufd4f\ufd90\ufd91\ufdc8-\ufdef\ufdfe\ufdff\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\udd9c-\udd9f\udda1-\uddcf\uddfe-\ude7f\ude9d-\ude9f\uded1-\udedf\udefc-\udeff\udf24-\udf2f\udf4b-\udf4f\udf7b-\udf7f\udf9e\udfc4-\udfc7\udfd6-\udfff]|\ud801[\udc9e\udc9f\udcaa-\udcaf\udcd4-\udcd7\udcfc-\udcff\udd28-\udd2f\udd64-\udd6e\udd70-\uddff\udf37-\udf3f\udf56-\udf5f\udf68-\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\ude34-\ude37\ude3b-\ude3e\ude48-\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\udd00-\ude5f\ude7f-\udfff]|\ud804[\udc4e-\udc51\udc70-\udc7e\udcc2-\udccf\udce9-\udcef\udcfa-\udcff\udd35\udd44-\udd4f\udd77-\udd7f\uddce\uddcf\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\udf3b\udf45\udf46\udf49\udf4a\udf4e\udf4f\udf51-\udf56\udf58-\udf5c\udf64\udf65\udf6d-\udf6f\udf75-\udfff]|\ud805[\udc5a\udc5c\udc5e-\udc7f\udcc8-\udccf\udcda-\udd7f\uddb6\uddb7\uddde-\uddff\ude45-\ude4f\ude5a-\ude5f\ude6d-\ude7f\udeb8-\udebf\udeca-\udeff\udf1a-\udf1c\udf2c-\udf2f\udf40-\udfff]|\ud806[\udc00-\udc9f\udcf3-\udcfe\udd00-\udebf\udef9-\udfff]|\ud807[\udc09\udc37\udc46-\udc4f\udc6d-\udc6f\udc90\udc91\udca8\udcb7-\udfff]|\ud808[\udf9a-\udfff]|\ud809[\udc6f\udc75-\udc7f\udd44-\udfff]|[\ud80a\ud80b\ud80e-\ud810\ud812-\ud819\ud823-\ud82b\ud82d\ud82e\ud830-\ud833\ud837\ud839\ud83f\ud874-\ud87d\ud87f-\udb3f\udb41-\udb7f][\udc00-\udfff]|\ud80d[\udc2f-\udfff]|\ud811[\ude47-\udfff]|\ud81a[\ude39-\ude3f\ude5f\ude6a-\ude6d\ude70-\udecf\udeee\udeef\udef6-\udeff\udf46-\udf4f\udf5a\udf62\udf78-\udf7c\udf90-\udfff]|\ud81b[\udc00-\udeff\udf45-\udf4f\udf7f-\udf8e\udfa0-\udfdf\udfe1-\udfff]|\ud821[\udfed-\udfff]|\ud822[\udef3-\udfff]|\ud82c[\udc02-\udfff]|\ud82f[\udc6b-\udc6f\udc7d-\udc7f\udc89-\udc8f\udc9a\udc9b\udca4-\udfff]|\ud834[\udcf6-\udcff\udd27\udd28\udde9-\uddff\ude46-\udeff\udf57-\udf5f\udf72-\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]|\ud838[\udc07\udc19\udc1a\udc22\udc25\udc2b-\udfff]|\ud83a[\udcc5\udcc6\udcd7-\udcff\udd4b-\udd4f\udd5a-\udd5d\udd60-\udfff]|\ud83b[\udc00-\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\udd0d-\udd0f\udd2f\udd6c-\udd6f\uddad-\udde5\ude03-\ude0f\ude3c-\ude3f\ude49-\ude4f\ude52-\udeff]|\ud83d[\uded3-\udedf\udeed-\udeef\udef7-\udeff\udf74-\udf7f\udfd5-\udfff]|\ud83e[\udc0c-\udc0f\udc48-\udc4f\udc5a-\udc5f\udc88-\udc8f\udcae-\udd0f\udd1f\udd28-\udd2f\udd31\udd32\udd3f\udd4c-\udd4f\udd5f-\udd7f\udd92-\uddbf\uddc1-\udfff]|\ud869[\uded7-\udeff]|\ud86d[\udf35-\udf3f]|\ud86e[\udc1e\udc1f]|\ud873[\udea2-\udfff]|\ud87e[\ude1e-\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\u00aa\u00b5\u00ba\u00c0-\u00d6\u00d8-\u00f6\u00f8-\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\u0561-\u0587\u05d0-\u05ea\u05f0-\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\u08a0-\u08b4\u08b6-\u08bd\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\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\u0c60\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\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\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\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-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1877\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-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\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-\u2c2e\u2c30-\u2c5e\u2c60-\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-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fd5\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6e5\ua717-\ua71f\ua722-\ua788\ua78b-\ua7ae\ua7b0-\ua7b7\ua7f7-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd\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-\uab65\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\udf30-\udf40\udf42-\udf49\udf50-\udf75\udf80-\udf9d\udfa0-\udfc3\udfc8-\udfcf]|\ud801[\udc00-\udc9d\udcb0-\udcd3\udcd8-\udcfb\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-\ude33\ude60-\ude7c\ude80-\ude9c\udec0-\udec7\udec9-\udee4\udf00-\udf35\udf40-\udf55\udf60-\udf72\udf80-\udf91]|\ud803[\udc00-\udc48\udc80-\udcb2\udcc0-\udcf2]|\ud804[\udc03-\udc37\udc83-\udcaf\udcd0-\udce8\udd03-\udd26\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\udc80-\udcaf\udcc4\udcc5\udcc7\udd80-\uddae\uddd8-\udddb\ude00-\ude2f\ude44\ude80-\udeaa\udf00-\udf19]|\ud806[\udca0-\udcdf\udcff\udec0-\udef8]|\ud807[\udc00-\udc08\udc0a-\udc2e\udc40\udc72-\udc8f]|\ud808[\udc00-\udf99]|\ud809[\udc80-\udd43]|[\ud80c\ud81c-\ud820\ud840-\ud868\ud86a-\ud86c\ud86f-\ud872][\udc00-\udfff]|\ud80d[\udc00-\udc2e]|\ud811[\udc00-\ude46]|\ud81a[\udc00-\ude38\ude40-\ude5e\uded0-\udeed\udf00-\udf2f\udf40-\udf43\udf63-\udf77\udf7d-\udf8f]|\ud81b[\udf00-\udf44\udf50\udf93-\udf9f\udfe0]|\ud821[\udc00-\udfec]|\ud822[\udc00-\udef2]|\ud82c[\udc00\udc01]|\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]|\ud83a[\udc00-\udcc4\udd00-\udd43]|\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-\uded6\udf00-\udfff]|\ud86d[\udc00-\udf34\udf40-\udfff]|\ud86e[\udc00-\udc1d\udc20-\udfff]|\ud873[\udc00-\udea1]|\ud87e[\udc00-\ude1d]"}, +{name:"Ll",alias:"Lowercase_Letter",bmp:"a-z\u00b5\u00df-\u00f6\u00f8-\u00ff\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\u0561-\u0587\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-\u2c5e\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\ua7b5\ua7b7\ua7fa\uab30-\uab5a\uab60-\uab65\uab70-\uabbf\ufb00-\ufb06\ufb13-\ufb17\uff41-\uff5a", +astral:"\ud801[\udc28-\udc4f\udcd8-\udcfb]|\ud803[\udcc0-\udcf2]|\ud806[\udcc0-\udcdf]|\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]|\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\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\ua7f8\ua7f9\ua9cf\ua9e6\uaa70\uaadd\uaaf3\uaaf4\uab5c-\uab5f\uff70\uff9e\uff9f",astral:"\ud81a[\udf40-\udf43]|\ud81b[\udf93-\udf9f\udfe0]"}, +{name:"Lo",alias:"Other_Letter",bmp:"\u00aa\u00ba\u01bb\u01c0-\u01c3\u0294\u05d0-\u05ea\u05f0-\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\u08a0-\u08b4\u08b6-\u08bd\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\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\u0c60\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\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\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\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\u10d0-\u10fa\u10fd-\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-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17dc\u1820-\u1842\u1844-\u1877\u1880-\u1884\u1887-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c77\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\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-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fd5\ua000-\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\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\udf30-\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-\ude33\ude60-\ude7c\ude80-\ude9c\udec0-\udec7\udec9-\udee4\udf00-\udf35\udf40-\udf55\udf60-\udf72\udf80-\udf91]|\ud803[\udc00-\udc48]|\ud804[\udc03-\udc37\udc83-\udcaf\udcd0-\udce8\udd03-\udd26\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\udc80-\udcaf\udcc4\udcc5\udcc7\udd80-\uddae\uddd8-\udddb\ude00-\ude2f\ude44\ude80-\udeaa\udf00-\udf19]|\ud806[\udcff\udec0-\udef8]|\ud807[\udc00-\udc08\udc0a-\udc2e\udc40\udc72-\udc8f]|\ud808[\udc00-\udf99]|\ud809[\udc80-\udd43]|[\ud80c\ud81c-\ud820\ud840-\ud868\ud86a-\ud86c\ud86f-\ud872][\udc00-\udfff]|\ud80d[\udc00-\udc2e]|\ud811[\udc00-\ude46]|\ud81a[\udc00-\ude38\ude40-\ude5e\uded0-\udeed\udf00-\udf2f\udf63-\udf77\udf7d-\udf8f]|\ud81b[\udf00-\udf44\udf50]|\ud821[\udc00-\udfec]|\ud822[\udc00-\udef2]|\ud82c[\udc00\udc01]|\ud82f[\udc00-\udc6a\udc70-\udc7c\udc80-\udc88\udc90-\udc99]|\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-\uded6\udf00-\udfff]|\ud86d[\udc00-\udf34\udf40-\udfff]|\ud86e[\udc00-\udc1d\udc20-\udfff]|\ud873[\udc00-\udea1]|\ud87e[\udc00-\ude1d]"}, +{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\u00c0-\u00d6\u00d8-\u00de\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\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-\u2c2e\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\uff21-\uff3a", +astral:"\ud801[\udc00-\udc27\udcb0-\udcd3]|\ud803[\udc80-\udcb2]|\ud806[\udca0-\udcbf]|\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\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u08d4-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0c00-\u0c03\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d01-\u0d03\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d82\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\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-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u180b-\u180d\u1885\u1886\u18a9\u1920-\u192b\u1930-\u193b\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f\u1ab0-\u1abe\u1b00-\u1b04\u1b34-\u1b44\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1be6-\u1bf3\u1c24-\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf2-\u1cf4\u1cf8\u1cf9\u1dc0-\u1df5\u1dfb-\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\ua880\ua881\ua8b4-\ua8c5\ua8e0-\ua8f1\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]|\ud804[\udc00-\udc02\udc38-\udc46\udc7f-\udc82\udcb0-\udcba\udd00-\udd02\udd27-\udd34\udd73\udd80-\udd82\uddb3-\uddc0\uddca-\uddcc\ude2c-\ude37\ude3e\udedf-\udeea\udf00-\udf03\udf3c\udf3e-\udf44\udf47\udf48\udf4b-\udf4d\udf57\udf62\udf63\udf66-\udf6c\udf70-\udf74]|\ud805[\udc35-\udc46\udcb0-\udcc3\uddaf-\uddb5\uddb8-\uddc0\udddc\udddd\ude30-\ude40\udeab-\udeb7\udf1d-\udf2b]|\ud807[\udc2f-\udc36\udc38-\udc3f\udc92-\udca7\udca9-\udcb6]|\ud81a[\udef0-\udef4\udf30-\udf36]|\ud81b[\udf51-\udf7e\udf8f-\udf92]|\ud82f[\udc9d\udc9e]|\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]|\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\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\u1cf2\u1cf3\u302e\u302f\ua823\ua824\ua827\ua880\ua881\ua8b4-\ua8c3\ua952\ua953\ua983\ua9b4\ua9b5\ua9ba\ua9bb\ua9bd-\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\udd82\uddb3-\uddb5\uddbf\uddc0\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]|\ud807[\udc2f\udc3e\udca9\udcb1\udcb4]|\ud81b[\udf51-\udf7e]|\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\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u08d4-\u08e1\u08e3-\u0902\u093a\u093c\u0941-\u0948\u094d\u0951-\u0957\u0962\u0963\u0981\u09bc\u09c1-\u09c4\u09cd\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b62\u0b63\u0b82\u0bc0\u0bcd\u0c00\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c81\u0cbc\u0cbf\u0cc6\u0ccc\u0ccd\u0ce2\u0ce3\u0d01\u0d41-\u0d44\u0d4d\u0d62\u0d63\u0dca\u0dd2-\u0dd4\u0dd6\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\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-\u1734\u1752\u1753\u1772\u1773\u17b4\u17b5\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\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\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-\u1df5\u1dfb-\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\ua8c4\ua8c5\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\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]|\ud804[\udc01\udc38-\udc46\udc7f-\udc81\udcb3-\udcb6\udcb9\udcba\udd00-\udd02\udd27-\udd2b\udd2d-\udd34\udd73\udd80\udd81\uddb6-\uddbe\uddca-\uddcc\ude2f-\ude31\ude34\ude36\ude37\ude3e\udedf\udee3-\udeea\udf00\udf01\udf3c\udf40\udf66-\udf6c\udf70-\udf74]|\ud805[\udc38-\udc3f\udc42-\udc44\udc46\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]|\ud807[\udc30-\udc36\udc38-\udc3d\udc3f\udc92-\udca7\udcaa-\udcb0\udcb2\udcb3\udcb5\udcb6]|\ud81a[\udef0-\udef4\udf30-\udf36]|\ud81b[\udf8f-\udf92]|\ud82f[\udc9d\udc9e]|\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]|\ud83a[\udcd0-\udcd6\udd44-\udd4a]|\udb40[\udd00-\uddef]"}, +{name:"N",alias:"Number",bmp:"0-9\u00b2\u00b3\u00b9\u00bc-\u00be\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-\ude47\ude7d\ude7e\ude9d-\ude9f\udeeb-\udeef\udf58-\udf5f\udf78-\udf7f\udfa9-\udfaf]|\ud803[\udcfa-\udcff\ude60-\ude7e]|\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]|\ud807[\udc50-\udc6c]|\ud809[\udc00-\udc6e]|\ud81a[\ude60-\ude69\udf50-\udf59\udf5b-\udf61]|\ud834[\udf60-\udf71]|\ud835[\udfce-\udfff]|\ud83a[\udcc7-\udccf\udd50-\udd59]|\ud83c[\udd00-\udd0c]"}, +{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]|\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]|\ud807[\udc50-\udc59]|\ud81a[\ude60-\ude69\udf50-\udf59]|\ud835[\udfce-\udfff]|\ud83a[\udd50-\udd59]"},{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:"\u00b2\u00b3\u00b9\u00bc-\u00be\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-\ude47\ude7d\ude7e\ude9d-\ude9f\udeeb-\udeef\udf58-\udf5f\udf78-\udf7f\udfa9-\udfaf]|\ud803[\udcfa-\udcff\ude60-\ude7e]|\ud804[\udc52-\udc65\udde1-\uddf4]|\ud805[\udf3a\udf3b]|\ud806[\udcea-\udcf2]|\ud807[\udc5a-\udc6c]|\ud81a[\udf5b-\udf61]|\ud834[\udf60-\udf71]|\ud83a[\udcc7-\udccf]|\ud83c[\udd00-\udd0c]"}, +{name:"P",alias:"Punctuation",bmp:"!-#%-\\x2A,-/:;\\x3F@\\x5B-\\x5D_\\x7B}\u00a1\u00a7\u00ab\u00b6\u00b7\u00bb\u00bf\u037e\u0387\u055a-\u055f\u0589\u058a\u05be\u05c0\u05c3\u05c6\u05f3\u05f4\u0609\u060a\u060c\u060d\u061b\u061e\u061f\u066a-\u066d\u06d4\u0700-\u070d\u07f7-\u07f9\u0830-\u083e\u085e\u0964\u0965\u0970\u0af0\u0df4\u0e4f\u0e5a\u0e5b\u0f04-\u0f12\u0f14\u0f3a-\u0f3d\u0f85\u0fd0-\u0fd4\u0fd9\u0fda\u104a-\u104f\u10fb\u1360-\u1368\u1400\u166d\u166e\u169b\u169c\u16eb-\u16ed\u1735\u1736\u17d4-\u17d6\u17d8-\u17da\u1800-\u180a\u1944\u1945\u1a1e\u1a1f\u1aa0-\u1aa6\u1aa8-\u1aad\u1b5a-\u1b60\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-\u2e44\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]|\ud804[\udc47-\udc4d\udcbb\udcbc\udcbe-\udcc1\udd40-\udd43\udd74\udd75\uddc5-\uddc9\uddcd\udddb\udddd-\udddf\ude38-\ude3d\udea9]|\ud805[\udc4b-\udc4f\udc5b\udc5d\udcc6\uddc1-\uddd7\ude41-\ude43\ude60-\ude6c\udf3c-\udf3e]|\ud807[\udc41-\udc45\udc70\udc71]|\ud809[\udc70-\udc74]|\ud81a[\ude6e\ude6f\udef5\udf37-\udf3b\udf44]|\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:"\\x2D\u058a\u05be\u1400\u1806\u2010-\u2015\u2e17\u2e1a\u2e3a\u2e3b\u2e40\u301c\u3030\u30a0\ufe31\ufe32\ufe58\ufe63\uff0d"},{name:"Pe",alias:"Close_Punctuation",bmp:"\\x29\\x5D}\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\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:"\u00bb\u2019\u201d\u203a\u2e03\u2e05\u2e0a\u2e0d\u2e1d\u2e21"},{name:"Pi",alias:"Initial_Punctuation",bmp:"\u00ab\u2018\u201b\u201c\u201f\u2039\u2e02\u2e04\u2e09\u2e0c\u2e1c\u2e20"},{name:"Po",alias:"Other_Punctuation",bmp:"!-#%-'\\x2A,\\x2E/:;\\x3F@\\x5C\u00a1\u00a7\u00b6\u00b7\u00bf\u037e\u0387\u055a-\u055f\u0589\u05c0\u05c3\u05c6\u05f3\u05f4\u0609\u060a\u060c\u060d\u061b\u061e\u061f\u066a-\u066d\u06d4\u0700-\u070d\u07f7-\u07f9\u0830-\u083e\u085e\u0964\u0965\u0970\u0af0\u0df4\u0e4f\u0e5a\u0e5b\u0f04-\u0f12\u0f14\u0f85\u0fd0-\u0fd4\u0fd9\u0fda\u104a-\u104f\u10fb\u1360-\u1368\u166d\u166e\u16eb-\u16ed\u1735\u1736\u17d4-\u17d6\u17d8-\u17da\u1800-\u1805\u1807-\u180a\u1944\u1945\u1a1e\u1a1f\u1aa0-\u1aa6\u1aa8-\u1aad\u1b5a-\u1b60\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\u2e44\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]|\ud804[\udc47-\udc4d\udcbb\udcbc\udcbe-\udcc1\udd40-\udd43\udd74\udd75\uddc5-\uddc9\uddcd\udddb\udddd-\udddf\ude38-\ude3d\udea9]|\ud805[\udc4b-\udc4f\udc5b\udc5d\udcc6\uddc1-\uddd7\ude41-\ude43\ude60-\ude6c\udf3c-\udf3e]|\ud807[\udc41-\udc45\udc70\udc71]|\ud809[\udc70-\udc74]|\ud81a[\ude6e\ude6f\udef5\udf37-\udf3b\udf44]|\ud82f\udc9f|\ud836[\ude87-\ude8b]|\ud83a[\udd5e\udd5f]"}, +{name:"Ps",alias:"Open_Punctuation",bmp:"\\x28\\x5B\\x7B\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\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:"\\x24\\x2B<->\\x5E`\\x7C~\u00a2-\u00a6\u00a8\u00a9\u00ac\u00ae-\u00b1\u00b4\u00b8\u00d7\u00f7\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\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\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-\u20be\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-\u23fe\u2400-\u2426\u2440-\u244a\u249c-\u24e9\u2500-\u2767\u2794-\u27c4\u27c7-\u27e5\u27f0-\u2982\u2999-\u29d7\u29dc-\u29fb\u29fe-\u2b73\u2b76-\u2b95\u2b98-\u2bb9\u2bbd-\u2bc8\u2bca-\u2bd1\u2bec-\u2bef\u2ce5-\u2cea\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-\u32fe\u3300-\u33ff\u4dc0-\u4dff\ua490-\ua4c6\ua700-\ua716\ua720\ua721\ua789\ua78a\ua828-\ua82b\ua836-\ua839\uaa77-\uaa79\uab5b\ufb29\ufbb2-\ufbc1\ufdfc\ufdfd\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-\udd9b\udda0\uddd0-\uddfc]|\ud802[\udc77\udc78\udec8]|\ud805\udf3f|\ud81a[\udf3c-\udf3f\udf45]|\ud82f\udc9c|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd64\udd6a-\udd6c\udd83\udd84\udd8c-\udda9\uddae-\udde8\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]|\ud83b[\udef0\udef1]|\ud83c[\udc00-\udc2b\udc30-\udc93\udca0-\udcae\udcb1-\udcbf\udcc1-\udccf\udcd1-\udcf5\udd10-\udd2e\udd30-\udd6b\udd70-\uddac\udde6-\ude02\ude10-\ude3b\ude40-\ude48\ude50\ude51\udf00-\udfff]|\ud83d[\udc00-\uded2\udee0-\udeec\udef0-\udef6\udf00-\udf73\udf80-\udfd4]|\ud83e[\udc00-\udc0b\udc10-\udc47\udc50-\udc59\udc60-\udc87\udc90-\udcad\udd10-\udd1e\udd20-\udd27\udd30\udd33-\udd3e\udd40-\udd4b\udd50-\udd5e\udd80-\udd91\uddc0]"}, +{name:"Sc",alias:"Currency_Symbol",bmp:"\\x24\u00a2-\u00a5\u058f\u060b\u09f2\u09f3\u09fb\u0af1\u0bf9\u0e3f\u17db\u20a0-\u20be\ua838\ufdfc\ufe69\uff04\uffe0\uffe1\uffe5\uffe6"},{name:"Sk",alias:"Modifier_Symbol",bmp:"\\x5E`\u00a8\u00af\u00b4\u00b8\u02c2-\u02c5\u02d2-\u02df\u02e5-\u02eb\u02ed\u02ef-\u02ff\u0375\u0384\u0385\u1fbd\u1fbf-\u1fc1\u1fcd-\u1fcf\u1fdd-\u1fdf\u1fed-\u1fef\u1ffd\u1ffe\u309b\u309c\ua700-\ua716\ua720\ua721\ua789\ua78a\uab5b\ufbb2-\ufbc1\uff3e\uff40\uffe3",astral:"\ud83c[\udffb-\udfff]"}, +{name:"Sm",alias:"Math_Symbol",bmp:"\\x2B<->\\x7C~\u00ac\u00b1\u00d7\u00f7\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:"\u00a6\u00a9\u00ae\u00b0\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\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-\u23fe\u2400-\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\u2b98-\u2bb9\u2bbd-\u2bc8\u2bca-\u2bd1\u2bec-\u2bef\u2ce5-\u2cea\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-\u32fe\u3300-\u33ff\u4dc0-\u4dff\ua490-\ua4c6\ua828-\ua82b\ua836\ua837\ua839\uaa77-\uaa79\ufdfd\uffe4\uffe8\uffed\uffee\ufffc\ufffd", +astral:"\ud800[\udd37-\udd3f\udd79-\udd89\udd8c-\udd8e\udd90-\udd9b\udda0\uddd0-\uddfc]|\ud802[\udc77\udc78\udec8]|\ud805\udf3f|\ud81a[\udf3c-\udf3f\udf45]|\ud82f\udc9c|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd64\udd6a-\udd6c\udd83\udd84\udd8c-\udda9\uddae-\udde8\ude00-\ude41\ude45\udf00-\udf56]|\ud836[\udc00-\uddff\ude37-\ude3a\ude6d-\ude74\ude76-\ude83\ude85\ude86]|\ud83c[\udc00-\udc2b\udc30-\udc93\udca0-\udcae\udcb1-\udcbf\udcc1-\udccf\udcd1-\udcf5\udd10-\udd2e\udd30-\udd6b\udd70-\uddac\udde6-\ude02\ude10-\ude3b\ude40-\ude48\ude50\ude51\udf00-\udffa]|\ud83d[\udc00-\uded2\udee0-\udeec\udef0-\udef6\udf00-\udf73\udf80-\udfd4]|\ud83e[\udc00-\udc0b\udc10-\udc47\udc50-\udc59\udc60-\udc87\udc90-\udcad\udd10-\udd1e\udd20-\udd27\udd30\udd33-\udd3e\udd40-\udd4b\udd50-\udd5e\udd80-\udd91\uddc0]"}, +{name:"Z",alias:"Separator",bmp:" \u00a0\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:" \u00a0\u1680\u2000-\u200a\u202f\u205f\u3000"}])}},{}],6:[function(d,g,p){g.exports=function(c){if(!c.addUnicodeData)throw new ReferenceError("Unicode Base must be loaded before Unicode Properties");var d=[{name:"ASCII",bmp:"\x00-\u007f"},{name:"Alphabetic",bmp:"A-Za-z\u00aa\u00b5\u00ba\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0345\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0561-\u0587\u05b0-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u05d0-\u05ea\u05f0-\u05f2\u0610-\u061a\u0620-\u0657\u0659-\u065f\u066e-\u06d3\u06d5-\u06dc\u06e1-\u06e8\u06ed-\u06ef\u06fa-\u06fc\u06ff\u0710-\u073f\u074d-\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0817\u081a-\u082c\u0840-\u0858\u08a0-\u08b4\u08b6-\u08bd\u08d4-\u08df\u08e3-\u08e9\u08f0-\u093b\u093d-\u094c\u094e-\u0950\u0955-\u0963\u0971-\u0983\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd-\u09c4\u09c7\u09c8\u09cb\u09cc\u09ce\u09d7\u09dc\u09dd\u09df-\u09e3\u09f0\u09f1\u0a01-\u0a03\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a3e-\u0a42\u0a47\u0a48\u0a4b\u0a4c\u0a51\u0a59-\u0a5c\u0a5e\u0a70-\u0a75\u0a81-\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd-\u0ac5\u0ac7-\u0ac9\u0acb\u0acc\u0ad0\u0ae0-\u0ae3\u0af9\u0b01-\u0b03\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d-\u0b44\u0b47\u0b48\u0b4b\u0b4c\u0b56\u0b57\u0b5c\u0b5d\u0b5f-\u0b63\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-\u0bcc\u0bd0\u0bd7\u0c00-\u0c03\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d-\u0c44\u0c46-\u0c48\u0c4a-\u0c4c\u0c55\u0c56\u0c58-\u0c5a\u0c60-\u0c63\u0c80-\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccc\u0cd5\u0cd6\u0cde\u0ce0-\u0ce3\u0cf1\u0cf2\u0d01-\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d-\u0d44\u0d46-\u0d48\u0d4a-\u0d4c\u0d4e\u0d54-\u0d57\u0d5f-\u0d63\u0d7a-\u0d7f\u0d82\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2\u0df3\u0e01-\u0e3a\u0e40-\u0e46\u0e4d\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb9\u0ebb-\u0ebd\u0ec0-\u0ec4\u0ec6\u0ecd\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f71-\u0f81\u0f88-\u0f97\u0f99-\u0fbc\u1000-\u1036\u1038\u103b-\u103f\u1050-\u1062\u1065-\u1068\u106e-\u1086\u108e\u109c\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\u135f\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u170c\u170e-\u1713\u1720-\u1733\u1740-\u1753\u1760-\u176c\u176e-\u1770\u1772\u1773\u1780-\u17b3\u17b6-\u17c8\u17d7\u17dc\u1820-\u1877\u1880-\u18aa\u18b0-\u18f5\u1900-\u191e\u1920-\u192b\u1930-\u1938\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a1b\u1a20-\u1a5e\u1a61-\u1a74\u1aa7\u1b00-\u1b33\u1b35-\u1b43\u1b45-\u1b4b\u1b80-\u1ba9\u1bac-\u1baf\u1bba-\u1be5\u1be7-\u1bf1\u1c00-\u1c35\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1d00-\u1dbf\u1de7-\u1df4\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\u2160-\u2188\u24b6-\u24e9\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\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\u2de0-\u2dff\u2e2f\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fd5\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua674-\ua67b\ua67f-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7ae\ua7b0-\ua7b7\ua7f7-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua827\ua840-\ua873\ua880-\ua8c3\ua8c5\ua8f2-\ua8f7\ua8fb\ua8fd\ua90a-\ua92a\ua930-\ua952\ua960-\ua97c\ua980-\ua9b2\ua9b4-\ua9bf\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa36\uaa40-\uaa4d\uaa60-\uaa76\uaa7a\uaa7e-\uaabe\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaef\uaaf2-\uaaf5\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab65\uab70-\uabea\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\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\udd40-\udd74\ude80-\ude9c\udea0-\uded0\udf00-\udf1f\udf30-\udf4a\udf50-\udf7a\udf80-\udf9d\udfa0-\udfc3\udfc8-\udfcf\udfd1-\udfd5]|\ud801[\udc00-\udc9d\udcb0-\udcd3\udcd8-\udcfb\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-\ude03\ude05\ude06\ude0c-\ude13\ude15-\ude17\ude19-\ude33\ude60-\ude7c\ude80-\ude9c\udec0-\udec7\udec9-\udee4\udf00-\udf35\udf40-\udf55\udf60-\udf72\udf80-\udf91]|\ud803[\udc00-\udc48\udc80-\udcb2\udcc0-\udcf2]|\ud804[\udc00-\udc45\udc82-\udcb8\udcd0-\udce8\udd00-\udd32\udd50-\udd72\udd76\udd80-\uddbf\uddc1-\uddc4\uddda\udddc\ude00-\ude11\ude13-\ude34\ude37\ude3e\ude80-\ude86\ude88\ude8a-\ude8d\ude8f-\ude9d\ude9f-\udea8\udeb0-\udee8\udf00-\udf03\udf05-\udf0c\udf0f\udf10\udf13-\udf28\udf2a-\udf30\udf32\udf33\udf35-\udf39\udf3d-\udf44\udf47\udf48\udf4b\udf4c\udf50\udf57\udf5d-\udf63]|\ud805[\udc00-\udc41\udc43-\udc45\udc47-\udc4a\udc80-\udcc1\udcc4\udcc5\udcc7\udd80-\uddb5\uddb8-\uddbe\uddd8-\udddd\ude00-\ude3e\ude40\ude44\ude80-\udeb5\udf00-\udf19\udf1d-\udf2a]|\ud806[\udca0-\udcdf\udcff\udec0-\udef8]|\ud807[\udc00-\udc08\udc0a-\udc36\udc38-\udc3e\udc40\udc72-\udc8f\udc92-\udca7\udca9-\udcb6]|\ud808[\udc00-\udf99]|\ud809[\udc00-\udc6e\udc80-\udd43]|[\ud80c\ud81c-\ud820\ud840-\ud868\ud86a-\ud86c\ud86f-\ud872][\udc00-\udfff]|\ud80d[\udc00-\udc2e]|\ud811[\udc00-\ude46]|\ud81a[\udc00-\ude38\ude40-\ude5e\uded0-\udeed\udf00-\udf36\udf40-\udf43\udf63-\udf77\udf7d-\udf8f]|\ud81b[\udf00-\udf44\udf50-\udf7e\udf93-\udf9f\udfe0]|\ud821[\udc00-\udfec]|\ud822[\udc00-\udef2]|\ud82c[\udc00\udc01]|\ud82f[\udc00-\udc6a\udc70-\udc7c\udc80-\udc88\udc90-\udc99\udc9e]|\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]|\ud838[\udc00-\udc06\udc08-\udc18\udc1b-\udc21\udc23\udc24\udc26-\udc2a]|\ud83a[\udc00-\udcc4\udd00-\udd43\udd47]|\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]|\ud83c[\udd30-\udd49\udd50-\udd69\udd70-\udd89]|\ud869[\udc00-\uded6\udf00-\udfff]|\ud86d[\udc00-\udf34\udf40-\udfff]|\ud86e[\udc00-\udc1d\udc20-\udfff]|\ud873[\udc00-\udea1]|\ud87e[\udc00-\ude1d]"}, +{name:"Any",isBmpLast:!0,bmp:"\x00-\uffff",astral:"[\ud800-\udbff][\udc00-\udfff]"},{name:"Default_Ignorable_Code_Point",bmp:"\u00ad\u034f\u061c\u115f\u1160\u17b4\u17b5\u180b-\u180e\u200b-\u200f\u202a-\u202e\u2060-\u206f\u3164\ufe00-\ufe0f\ufeff\uffa0\ufff0-\ufff8",astral:"\ud82f[\udca0-\udca3]|\ud834[\udd73-\udd7a]|[\udb40-\udb43][\udc00-\udfff]"},{name:"Lowercase",bmp:"a-z\u00aa\u00b5\u00ba\u00df-\u00f6\u00f8-\u00ff\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-\u02b8\u02c0\u02c1\u02e0-\u02e4\u0345\u0371\u0373\u0377\u037a-\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\u0561-\u0587\u13f8-\u13fd\u1c80-\u1c88\u1d00-\u1dbf\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\u2071\u207f\u2090-\u209c\u210a\u210e\u210f\u2113\u212f\u2134\u2139\u213c\u213d\u2146-\u2149\u214e\u2170-\u217f\u2184\u24d0-\u24e9\u2c30-\u2c5e\u2c61\u2c65\u2c66\u2c68\u2c6a\u2c6c\u2c71\u2c73\u2c74\u2c76-\u2c7d\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-\ua69d\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-\ua778\ua77a\ua77c\ua77f\ua781\ua783\ua785\ua787\ua78c\ua78e\ua791\ua793-\ua795\ua797\ua799\ua79b\ua79d\ua79f\ua7a1\ua7a3\ua7a5\ua7a7\ua7a9\ua7b5\ua7b7\ua7f8-\ua7fa\uab30-\uab5a\uab5c-\uab65\uab70-\uabbf\ufb00-\ufb06\ufb13-\ufb17\uff41-\uff5a", +astral:"\ud801[\udc28-\udc4f\udcd8-\udcfb]|\ud803[\udcc0-\udcf2]|\ud806[\udcc0-\udcdf]|\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]|\ud83a[\udd22-\udd43]"},{name:"Noncharacter_Code_Point", +bmp:"\ufdd0-\ufdef\ufffe\uffff",astral:"[\ud83f\ud87f\ud8bf\ud8ff\ud93f\ud97f\ud9bf\ud9ff\uda3f\uda7f\udabf\udaff\udb3f\udb7f\udbbf\udbff][\udffe\udfff]"},{name:"Uppercase",bmp:"A-Z\u00c0-\u00d6\u00d8-\u00de\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\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\u2160-\u216f\u2183\u24b6-\u24cf\u2c00-\u2c2e\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\uff21-\uff3a", +astral:"\ud801[\udc00-\udc27\udcb0-\udcd3]|\ud803[\udc80-\udcb2]|\ud806[\udca0-\udcbf]|\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]|\ud83c[\udd30-\udd49\udd50-\udd69\udd70-\udd89]"}, +{name:"White_Space",bmp:"\t-\r \u0085\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000"}];d.push({name:"Assigned",inverseOf:"Cn"});c.addUnicodeData(d)}},{}],7:[function(d,g,p){g.exports=function(c){if(!c.addUnicodeData)throw new ReferenceError("Unicode Base must be loaded before Unicode Scripts");c.addUnicodeData([{name:"Adlam",astral:"\ud83a[\udd00-\udd4a\udd50-\udd59\udd5e\udd5f]"},{name:"Ahom",astral:"\ud805[\udf00-\udf19\udf1d-\udf2b\udf30-\udf3f]"},{name:"Anatolian_Hieroglyphs",astral:"\ud811[\udc00-\ude46]"}, +{name:"Arabic",bmp:"\u0600-\u0604\u0606-\u060b\u060d-\u061a\u061e\u0620-\u063f\u0641-\u064a\u0656-\u066f\u0671-\u06dc\u06de-\u06ff\u0750-\u077f\u08a0-\u08b4\u08b6-\u08bd\u08d4-\u08e1\u08e3-\u08ff\ufb50-\ufbc1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfd\ufe70-\ufe74\ufe76-\ufefc",astral:"\ud803[\ude60-\ude7e]|\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\udef0\udef1]"}, +{name:"Armenian",bmp:"\u0531-\u0556\u0559-\u055f\u0561-\u0587\u058a\u058d-\u058f\ufb13-\ufb17"},{name:"Avestan",astral:"\ud802[\udf00-\udf35\udf39-\udf3f]"},{name:"Balinese",bmp:"\u1b00-\u1b4b\u1b50-\u1b7c"},{name:"Bamum",bmp:"\ua6a0-\ua6f7",astral:"\ud81a[\udc00-\ude38]"},{name:"Bassa_Vah",astral:"\ud81a[\uded0-\udeed\udef0-\udef5]"},{name:"Batak",bmp:"\u1bc0-\u1bf3\u1bfc-\u1bff"},{name:"Bengali",bmp:"\u0980-\u0983\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bc-\u09c4\u09c7\u09c8\u09cb-\u09ce\u09d7\u09dc\u09dd\u09df-\u09e3\u09e6-\u09fb"}, +{name:"Bhaiksuki",astral:"\ud807[\udc00-\udc08\udc0a-\udc36\udc38-\udc45\udc50-\udc6c]"},{name:"Bopomofo",bmp:"\u02ea\u02eb\u3105-\u312d\u31a0-\u31ba"},{name:"Brahmi",astral:"\ud804[\udc00-\udc4d\udc52-\udc6f\udc7f]"},{name:"Braille",bmp:"\u2800-\u28ff"},{name:"Buginese",bmp:"\u1a00-\u1a1b\u1a1e\u1a1f"},{name:"Buhid",bmp:"\u1740-\u1753"},{name:"Canadian_Aboriginal",bmp:"\u1400-\u167f\u18b0-\u18f5"},{name:"Carian",astral:"\ud800[\udea0-\uded0]"},{name:"Caucasian_Albanian",astral:"\ud801[\udd30-\udd63\udd6f]"}, +{name:"Chakma",astral:"\ud804[\udd00-\udd34\udd36-\udd43]"},{name:"Cham",bmp:"\uaa00-\uaa36\uaa40-\uaa4d\uaa50-\uaa59\uaa5c-\uaa5f"},{name:"Cherokee",bmp:"\u13a0-\u13f5\u13f8-\u13fd\uab70-\uabbf"},{name:"Common",bmp:"\x00-@\\x5B-`\\x7B-\u00a9\u00ab-\u00b9\u00bb-\u00bf\u00d7\u00f7\u02b9-\u02df\u02e5-\u02e9\u02ec-\u02ff\u0374\u037e\u0385\u0387\u0589\u0605\u060c\u061b\u061c\u061f\u0640\u06dd\u08e2\u0964\u0965\u0e3f\u0fd5-\u0fd8\u10fb\u16eb-\u16ed\u1735\u1736\u1802\u1803\u1805\u1cd3\u1ce1\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u2000-\u200b\u200e-\u2064\u2066-\u2070\u2074-\u207e\u2080-\u208e\u20a0-\u20be\u2100-\u2125\u2127-\u2129\u212c-\u2131\u2133-\u214d\u214f-\u215f\u2189-\u218b\u2190-\u23fe\u2400-\u2426\u2440-\u244a\u2460-\u27ff\u2900-\u2b73\u2b76-\u2b95\u2b98-\u2bb9\u2bbd-\u2bc8\u2bca-\u2bd1\u2bec-\u2bef\u2e00-\u2e44\u2ff0-\u2ffb\u3000-\u3004\u3006\u3008-\u3020\u3030-\u3037\u303c-\u303f\u309b\u309c\u30a0\u30fb\u30fc\u3190-\u319f\u31c0-\u31e3\u3220-\u325f\u327f-\u32cf\u3358-\u33ff\u4dc0-\u4dff\ua700-\ua721\ua788-\ua78a\ua830-\ua839\ua92e\ua9cf\uab5b\ufd3e\ufd3f\ufe10-\ufe19\ufe30-\ufe52\ufe54-\ufe66\ufe68-\ufe6b\ufeff\uff01-\uff20\uff3b-\uff40\uff5b-\uff65\uff70\uff9e\uff9f\uffe0-\uffe6\uffe8-\uffee\ufff9-\ufffd", +astral:"\ud800[\udd00-\udd02\udd07-\udd33\udd37-\udd3f\udd90-\udd9b\uddd0-\uddfc\udee1-\udefb]|\ud82f[\udca0-\udca3]|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd66\udd6a-\udd7a\udd83\udd84\udd8c-\udda9\uddae-\udde8\udf00-\udf56\udf60-\udf71]|\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-\udfcb\udfce-\udfff]|\ud83c[\udc00-\udc2b\udc30-\udc93\udca0-\udcae\udcb1-\udcbf\udcc1-\udccf\udcd1-\udcf5\udd00-\udd0c\udd10-\udd2e\udd30-\udd6b\udd70-\uddac\udde6-\uddff\ude01\ude02\ude10-\ude3b\ude40-\ude48\ude50\ude51\udf00-\udfff]|\ud83d[\udc00-\uded2\udee0-\udeec\udef0-\udef6\udf00-\udf73\udf80-\udfd4]|\ud83e[\udc00-\udc0b\udc10-\udc47\udc50-\udc59\udc60-\udc87\udc90-\udcad\udd10-\udd1e\udd20-\udd27\udd30\udd33-\udd3e\udd40-\udd4b\udd50-\udd5e\udd80-\udd91\uddc0]|\udb40[\udc01\udc20-\udc7f]"}, +{name:"Coptic",bmp:"\u03e2-\u03ef\u2c80-\u2cf3\u2cf9-\u2cff"},{name:"Cuneiform",astral:"\ud808[\udc00-\udf99]|\ud809[\udc00-\udc6e\udc70-\udc74\udc80-\udd43]"},{name:"Cypriot",astral:"\ud802[\udc00-\udc05\udc08\udc0a-\udc35\udc37\udc38\udc3c\udc3f]"},{name:"Cyrillic",bmp:"\u0400-\u0484\u0487-\u052f\u1c80-\u1c88\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f"},{name:"Deseret",astral:"\ud801[\udc00-\udc4f]"},{name:"Devanagari",bmp:"\u0900-\u0950\u0953-\u0963\u0966-\u097f\ua8e0-\ua8fd"},{name:"Duployan", +astral:"\ud82f[\udc00-\udc6a\udc70-\udc7c\udc80-\udc88\udc90-\udc99\udc9c-\udc9f]"},{name:"Egyptian_Hieroglyphs",astral:"\ud80c[\udc00-\udfff]|\ud80d[\udc00-\udc2e]"},{name:"Elbasan",astral:"\ud801[\udd00-\udd27]"},{name:"Ethiopic",bmp:"\u1200-\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-\u137c\u1380-\u1399\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e"}, +{name:"Georgian",bmp:"\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u10ff\u2d00-\u2d25\u2d27\u2d2d"},{name:"Glagolitic",bmp:"\u2c00-\u2c2e\u2c30-\u2c5e",astral:"\ud838[\udc00-\udc06\udc08-\udc18\udc1b-\udc21\udc23\udc24\udc26-\udc2a]"},{name:"Gothic",astral:"\ud800[\udf30-\udf4a]"},{name:"Grantha",astral:"\ud804[\udf00-\udf03\udf05-\udf0c\udf0f\udf10\udf13-\udf28\udf2a-\udf30\udf32\udf33\udf35-\udf39\udf3c-\udf44\udf47\udf48\udf4b-\udf4d\udf50\udf57\udf5d-\udf63\udf66-\udf6c\udf70-\udf74]"},{name:"Greek", +bmp:"\u0370-\u0373\u0375-\u0377\u037a-\u037d\u037f\u0384\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03e1\u03f0-\u03ff\u1d26-\u1d2a\u1d5d-\u1d61\u1d66-\u1d6a\u1dbf\u1f00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fc4\u1fc6-\u1fd3\u1fd6-\u1fdb\u1fdd-\u1fef\u1ff2-\u1ff4\u1ff6-\u1ffe\u2126\uab65",astral:"\ud800[\udd40-\udd8e\udda0]|\ud834[\ude00-\ude45]"},{name:"Gujarati",bmp:"\u0a81-\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abc-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ad0\u0ae0-\u0ae3\u0ae6-\u0af1\u0af9"}, +{name:"Gurmukhi",bmp:"\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"},{name:"Han",bmp:"\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u3005\u3007\u3021-\u3029\u3038-\u303b\u3400-\u4db5\u4e00-\u9fd5\uf900-\ufa6d\ufa70-\ufad9",astral:"[\ud840-\ud868\ud86a-\ud86c\ud86f-\ud872][\udc00-\udfff]|\ud869[\udc00-\uded6\udf00-\udfff]|\ud86d[\udc00-\udf34\udf40-\udfff]|\ud86e[\udc00-\udc1d\udc20-\udfff]|\ud873[\udc00-\udea1]|\ud87e[\udc00-\ude1d]"}, +{name:"Hangul",bmp:"\u1100-\u11ff\u302e\u302f\u3131-\u318e\u3200-\u321e\u3260-\u327e\ua960-\ua97c\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uffa0-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc"},{name:"Hanunoo",bmp:"\u1720-\u1734"},{name:"Hatran",astral:"\ud802[\udce0-\udcf2\udcf4\udcf5\udcfb-\udcff]"},{name:"Hebrew",bmp:"\u0591-\u05c7\u05d0-\u05ea\u05f0-\u05f4\ufb1d-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufb4f"},{name:"Hiragana",bmp:"\u3041-\u3096\u309d-\u309f",astral:"\ud82c\udc01|\ud83c\ude00"}, +{name:"Imperial_Aramaic",astral:"\ud802[\udc40-\udc55\udc57-\udc5f]"},{name:"Inherited",bmp:"\u0300-\u036f\u0485\u0486\u064b-\u0655\u0670\u0951\u0952\u1ab0-\u1abe\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1cf4\u1cf8\u1cf9\u1dc0-\u1df5\u1dfb-\u1dff\u200c\u200d\u20d0-\u20f0\u302a-\u302d\u3099\u309a\ufe00-\ufe0f\ufe20-\ufe2d",astral:"\ud800[\uddfd\udee0]|\ud834[\udd67-\udd69\udd7b-\udd82\udd85-\udd8b\uddaa-\uddad]|\udb40[\udd00-\uddef]"},{name:"Inscriptional_Pahlavi",astral:"\ud802[\udf60-\udf72\udf78-\udf7f]"}, +{name:"Inscriptional_Parthian",astral:"\ud802[\udf40-\udf55\udf58-\udf5f]"},{name:"Javanese",bmp:"\ua980-\ua9cd\ua9d0-\ua9d9\ua9de\ua9df"},{name:"Kaithi",astral:"\ud804[\udc80-\udcc1]"},{name:"Kannada",bmp:"\u0c80-\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbc-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0cde\u0ce0-\u0ce3\u0ce6-\u0cef\u0cf1\u0cf2"},{name:"Katakana",bmp:"\u30a1-\u30fa\u30fd-\u30ff\u31f0-\u31ff\u32d0-\u32fe\u3300-\u3357\uff66-\uff6f\uff71-\uff9d",astral:"\ud82c\udc00"}, +{name:"Kayah_Li",bmp:"\ua900-\ua92d\ua92f"},{name:"Kharoshthi",astral:"\ud802[\ude00-\ude03\ude05\ude06\ude0c-\ude13\ude15-\ude17\ude19-\ude33\ude38-\ude3a\ude3f-\ude47\ude50-\ude58]"},{name:"Khmer",bmp:"\u1780-\u17dd\u17e0-\u17e9\u17f0-\u17f9\u19e0-\u19ff"},{name:"Khojki",astral:"\ud804[\ude00-\ude11\ude13-\ude3e]"},{name:"Khudawadi",astral:"\ud804[\udeb0-\udeea\udef0-\udef9]"},{name:"Lao",bmp:"\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb9\u0ebb-\u0ebd\u0ec0-\u0ec4\u0ec6\u0ec8-\u0ecd\u0ed0-\u0ed9\u0edc-\u0edf"}, +{name:"Latin",bmp:"A-Za-z\u00aa\u00ba\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02b8\u02e0-\u02e4\u1d00-\u1d25\u1d2c-\u1d5c\u1d62-\u1d65\u1d6b-\u1d77\u1d79-\u1dbe\u1e00-\u1eff\u2071\u207f\u2090-\u209c\u212a\u212b\u2132\u214e\u2160-\u2188\u2c60-\u2c7f\ua722-\ua787\ua78b-\ua7ae\ua7b0-\ua7b7\ua7f7-\ua7ff\uab30-\uab5a\uab5c-\uab64\ufb00-\ufb06\uff21-\uff3a\uff41-\uff5a"},{name:"Lepcha",bmp:"\u1c00-\u1c37\u1c3b-\u1c49\u1c4d-\u1c4f"},{name:"Limbu",bmp:"\u1900-\u191e\u1920-\u192b\u1930-\u193b\u1940\u1944-\u194f"}, +{name:"Linear_A",astral:"\ud801[\ude00-\udf36\udf40-\udf55\udf60-\udf67]"},{name:"Linear_B",astral:"\ud800[\udc00-\udc0b\udc0d-\udc26\udc28-\udc3a\udc3c\udc3d\udc3f-\udc4d\udc50-\udc5d\udc80-\udcfa]"},{name:"Lisu",bmp:"\ua4d0-\ua4ff"},{name:"Lycian",astral:"\ud800[\ude80-\ude9c]"},{name:"Lydian",astral:"\ud802[\udd20-\udd39\udd3f]"},{name:"Mahajani",astral:"\ud804[\udd50-\udd76]"},{name:"Malayalam",bmp:"\u0d01-\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d-\u0d44\u0d46-\u0d48\u0d4a-\u0d4f\u0d54-\u0d63\u0d66-\u0d7f"}, +{name:"Mandaic",bmp:"\u0840-\u085b\u085e"},{name:"Manichaean",astral:"\ud802[\udec0-\udee6\udeeb-\udef6]"},{name:"Marchen",astral:"\ud807[\udc70-\udc8f\udc92-\udca7\udca9-\udcb6]"},{name:"Meetei_Mayek",bmp:"\uaae0-\uaaf6\uabc0-\uabed\uabf0-\uabf9"},{name:"Mende_Kikakui",astral:"\ud83a[\udc00-\udcc4\udcc7-\udcd6]"},{name:"Meroitic_Cursive",astral:"\ud802[\udda0-\uddb7\uddbc-\uddcf\uddd2-\uddff]"},{name:"Meroitic_Hieroglyphs",astral:"\ud802[\udd80-\udd9f]"},{name:"Miao",astral:"\ud81b[\udf00-\udf44\udf50-\udf7e\udf8f-\udf9f]"}, +{name:"Modi",astral:"\ud805[\ude00-\ude44\ude50-\ude59]"},{name:"Mongolian",bmp:"\u1800\u1801\u1804\u1806-\u180e\u1810-\u1819\u1820-\u1877\u1880-\u18aa",astral:"\ud805[\ude60-\ude6c]"},{name:"Mro",astral:"\ud81a[\ude40-\ude5e\ude60-\ude69\ude6e\ude6f]"},{name:"Multani",astral:"\ud804[\ude80-\ude86\ude88\ude8a-\ude8d\ude8f-\ude9d\ude9f-\udea9]"},{name:"Myanmar",bmp:"\u1000-\u109f\ua9e0-\ua9fe\uaa60-\uaa7f"},{name:"Nabataean",astral:"\ud802[\udc80-\udc9e\udca7-\udcaf]"},{name:"New_Tai_Lue",bmp:"\u1980-\u19ab\u19b0-\u19c9\u19d0-\u19da\u19de\u19df"}, +{name:"Newa",astral:"\ud805[\udc00-\udc59\udc5b\udc5d]"},{name:"Nko",bmp:"\u07c0-\u07fa"},{name:"Ogham",bmp:"\u1680-\u169c"},{name:"Ol_Chiki",bmp:"\u1c50-\u1c7f"},{name:"Old_Hungarian",astral:"\ud803[\udc80-\udcb2\udcc0-\udcf2\udcfa-\udcff]"},{name:"Old_Italic",astral:"\ud800[\udf00-\udf23]"},{name:"Old_North_Arabian",astral:"\ud802[\ude80-\ude9f]"},{name:"Old_Permic",astral:"\ud800[\udf50-\udf7a]"},{name:"Old_Persian",astral:"\ud800[\udfa0-\udfc3\udfc8-\udfd5]"},{name:"Old_South_Arabian",astral:"\ud802[\ude60-\ude7f]"}, +{name:"Old_Turkic",astral:"\ud803[\udc00-\udc48]"},{name:"Oriya",bmp:"\u0b01-\u0b03\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3c-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b5c\u0b5d\u0b5f-\u0b63\u0b66-\u0b77"},{name:"Osage",astral:"\ud801[\udcb0-\udcd3\udcd8-\udcfb]"},{name:"Osmanya",astral:"\ud801[\udc80-\udc9d\udca0-\udca9]"},{name:"Pahawh_Hmong",astral:"\ud81a[\udf00-\udf45\udf50-\udf59\udf5b-\udf61\udf63-\udf77\udf7d-\udf8f]"},{name:"Palmyrene",astral:"\ud802[\udc60-\udc7f]"}, +{name:"Pau_Cin_Hau",astral:"\ud806[\udec0-\udef8]"},{name:"Phags_Pa",bmp:"\ua840-\ua877"},{name:"Phoenician",astral:"\ud802[\udd00-\udd1b\udd1f]"},{name:"Psalter_Pahlavi",astral:"\ud802[\udf80-\udf91\udf99-\udf9c\udfa9-\udfaf]"},{name:"Rejang",bmp:"\ua930-\ua953\ua95f"},{name:"Runic",bmp:"\u16a0-\u16ea\u16ee-\u16f8"},{name:"Samaritan",bmp:"\u0800-\u082d\u0830-\u083e"},{name:"Saurashtra",bmp:"\ua880-\ua8c5\ua8ce-\ua8d9"},{name:"Sharada",astral:"\ud804[\udd80-\uddcd\uddd0-\udddf]"},{name:"Shavian", +astral:"\ud801[\udc50-\udc7f]"},{name:"Siddham",astral:"\ud805[\udd80-\uddb5\uddb8-\udddd]"},{name:"SignWriting",astral:"\ud836[\udc00-\ude8b\ude9b-\ude9f\udea1-\udeaf]"},{name:"Sinhala",bmp:"\u0d82\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2-\u0df4",astral:"\ud804[\udde1-\uddf4]"},{name:"Sora_Sompeng",astral:"\ud804[\udcd0-\udce8\udcf0-\udcf9]"},{name:"Sundanese",bmp:"\u1b80-\u1bbf\u1cc0-\u1cc7"},{name:"Syloti_Nagri",bmp:"\ua800-\ua82b"}, +{name:"Syriac",bmp:"\u0700-\u070d\u070f-\u074a\u074d-\u074f"},{name:"Tagalog",bmp:"\u1700-\u170c\u170e-\u1714"},{name:"Tagbanwa",bmp:"\u1760-\u176c\u176e-\u1770\u1772\u1773"},{name:"Tai_Le",bmp:"\u1950-\u196d\u1970-\u1974"},{name:"Tai_Tham",bmp:"\u1a20-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1aa0-\u1aad"},{name:"Tai_Viet",bmp:"\uaa80-\uaac2\uaadb-\uaadf"},{name:"Takri",astral:"\ud805[\ude80-\udeb7\udec0-\udec9]"},{name:"Tamil",bmp:"\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-\u0bfa"}, +{name:"Tangut",astral:"\ud81b\udfe0|[\ud81c-\ud820][\udc00-\udfff]|\ud821[\udc00-\udfec]|\ud822[\udc00-\udef2]"},{name:"Telugu",bmp:"\u0c00-\u0c03\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c58-\u0c5a\u0c60-\u0c63\u0c66-\u0c6f\u0c78-\u0c7f"},{name:"Thaana",bmp:"\u0780-\u07b1"},{name:"Thai",bmp:"\u0e01-\u0e3a\u0e40-\u0e5b"},{name:"Tibetan",bmp:"\u0f00-\u0f47\u0f49-\u0f6c\u0f71-\u0f97\u0f99-\u0fbc\u0fbe-\u0fcc\u0fce-\u0fd4\u0fd9\u0fda"}, +{name:"Tifinagh",bmp:"\u2d30-\u2d67\u2d6f\u2d70\u2d7f"},{name:"Tirhuta",astral:"\ud805[\udc80-\udcc7\udcd0-\udcd9]"},{name:"Ugaritic",astral:"\ud800[\udf80-\udf9d\udf9f]"},{name:"Vai",bmp:"\ua500-\ua62b"},{name:"Warang_Citi",astral:"\ud806[\udca0-\udcf2\udcff]"},{name:"Yi",bmp:"\ua000-\ua48c\ua490-\ua4c6"}])}},{}],8:[function(d,g,p){p=d("./xregexp");d("./addons/build")(p);d("./addons/matchrecursive")(p);d("./addons/unicode-base")(p);d("./addons/unicode-blocks")(p);d("./addons/unicode-categories")(p); +d("./addons/unicode-properties")(p);d("./addons/unicode-scripts")(p);g.exports=p},{"./addons/build":1,"./addons/matchrecursive":2,"./addons/unicode-base":3,"./addons/unicode-blocks":4,"./addons/unicode-categories":5,"./addons/unicode-properties":6,"./addons/unicode-scripts":7,"./xregexp":9}],9:[function(d,g,p){function c(a){var e=!0;try{RegExp("",a)}catch(u){e=!1}return e}function A(a,e,u,b,c){var J;a.xregexp={captureNames:e};if(c)return a;if(a.__proto__)a.__proto__=f.prototype;else for(J in f.prototype)a[J]= +f.prototype[J];a.xregexp.source=u;a.xregexp.flags=b?b.split("").sort().join(""):b;return a}function B(a){return n.replace.call(a,/([\s\S])(?=[\s\S]*\1)/g,"")}function z(a,e){if(!f.isRegExp(a))throw new TypeError("Type RegExp expected");var u=a.xregexp||{},b=Q?a.flags:n.exec.call(/\/([a-z]*)$/i,RegExp.prototype.toString.call(a))[1],c="",d="",E=null,h=null;e=e||{};e.removeG&&(d+="g");e.removeY&&(d+="y");d&&(b=n.replace.call(b,new RegExp("["+d+"]+","g"),""));e.addG&&(c+="g");e.addY&&(c+="y");c&&(b=B(b+ +c));e.isInternalOnly||(void 0!==u.source&&(E=u.source),null!=u.flags&&(h=c?B(u.flags+c):u.flags));return a=A(new RegExp(e.source||a.source,b),a.xregexp&&a.xregexp.captureNames?u.captureNames.slice(0):null,E,h,e.isInternalOnly)}function l(a){return parseInt(a,16)}function b(a,e,b){(e="("===a.input.charAt(a.index-1)||")"===a.input.charAt(a.index+a[0].length))||(e=a.input,a=a.index+a[0].length,b=-1<b.indexOf("x")?["\\s","#[^#\\n]*","\\(\\?#[^)]*\\)"]:["\\(\\?#[^)]*\\)"],e=n.test.call(new RegExp("^(?:"+ +b.join("|")+")*(?:[?*+]|{\\d+(?:,\\d*)?})"),e.slice(a)));return e?"":"(?:)"}function k(a){return parseInt(a,10).toString(16)}function C(a,e){var b=a.length,c;for(c=0;c<b;++c)if(a[c]===e)return c;return-1}function y(a,e){return L.call(a)==="[object "+e+"]"}function m(a){for(;4>a.length;)a="0"+a;return a}function h(a,e){var b;if(B(e)!==e)throw new SyntaxError("Invalid duplicate regex flag "+e);a=n.replace.call(a,/^\(\?([\w$]+)\)/,function(a,b){if(n.test.call(/[gy]/,b))throw new SyntaxError("Cannot use flag g or y in mode modifier "+ +a);e=B(e+b);return""});for(b=0;b<e.length;++b)if(!N[e.charAt(b)])throw new SyntaxError("Unknown regex flag "+e.charAt(b));return{pattern:a,flags:e}}function w(a){var e={};return y(a,"String")?(f.forEach(a,/[^\s,]+/,function(a){e[a]=!0}),e):a}function x(a){if(!/^[\w$]$/.test(a))throw Error("Flag must be a single character A-Za-z0-9_$");N[a]=!0}function v(a){RegExp.prototype.exec=(a?r:n).exec;RegExp.prototype.test=(a?r:n).test;String.prototype.match=(a?r:n).match;String.prototype.replace=(a?r:n).replace; +String.prototype.split=(a?r:n).split;D.natives=a}function q(a){if(null==a)throw new TypeError("Cannot convert null or undefined to object");return a}function f(a,e){if(f.isRegExp(a)){if(void 0!==e)throw new TypeError("Cannot supply flags when copying a RegExp");return z(a)}a=void 0===a?"":String(a);e=void 0===e?"":String(e);f.isInstalled("astral")&&-1===e.indexOf("A")&&(e+="A");F[a]||(F[a]={});if(!F[a][e]){var b={hasNamedCapture:!1,captureNames:[]},c="default",d="",g=0,E=h(a,e),k=E.pattern;for(E= +E.flags;g<k.length;){do{for(var l,m=k,p=E,q=g,r=c,v=b,w=I.length,x=m.charAt(q),y=null;w--;){var t=I[w];if(!(t.leadChar&&t.leadChar!==x||t.scope!==r&&"all"!==t.scope||t.flag&&-1===p.indexOf(t.flag))&&(l=f.exec(m,t.regex,q,"sticky"))){y={matchLength:l[0].length,output:t.handler.call(v,l,r,p),reparse:t.reparse};break}}(t=y)&&t.reparse&&(k=k.slice(0,g)+t.output+k.slice(g+t.matchLength))}while(t&&t.reparse);t?(d+=t.output,g+=t.matchLength||1):(t=f.exec(k,O[c],g,"sticky")[0],d+=t,g+=t.length,"["===t&&"default"=== +c?c="class":"]"===t&&"class"===c&&(c="default"))}F[a][e]={pattern:n.replace.call(d,/(?:\(\?:\))+/g,"(?:)"),flags:n.replace.call(E,/[^gimuy]+/g,""),captures:b.hasNamedCapture?b.captureNames:null}}b=F[a][e];return A(new RegExp(b.pattern,b.flags),b.captures,a,e)}var D={astral:!1,natives:!1},n={exec:RegExp.prototype.exec,test:RegExp.prototype.test,match:String.prototype.match,replace:String.prototype.replace,split:String.prototype.split},r={},G={},F={},I=[],O={"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]/},P=/\$(?:{([\w$]+)}|(\d\d?|[\s\S]))/g,R=void 0===n.exec.call(/()??/,"")[1],Q=void 0!==/x/.flags,L={}.toString,M=c("u"),K=c("y"),N={g:!0,i:!0,m:!0,u:M,y:K};f.prototype=RegExp();f.version="3.2.0";f._clipDuplicates=B;f._hasNativeFlag=c;f._dec=l;f._hex=k;f._pad4=m;f.addToken=function(a,e,b){b=b||{};var c=b.optionalFlags,d;b.flag&&x(b.flag);if(c)for(c=n.split.call(c,""),d=0;d<c.length;++d)x(c[d]); +I.push({regex:z(a,{addG:!0,addY:K,isInternalOnly:!0}),handler:e,scope:b.scope||"default",flag:b.flag,reparse:b.reparse,leadChar:b.leadChar});f.cache.flush("patterns")};f.cache=function(a,b){G[a]||(G[a]={});return G[a][b]||(G[a][b]=f(a,b))};f.cache.flush=function(a){"patterns"===a?F={}:G={}};f.escape=function(a){return n.replace.call(q(a),/[-\[\]{}()*+?.,\\^$|#\s]/g,"\\$&")};f.exec=function(a,b,c,d){var e="g",f,u=!1;(f=K&&!!(d||b.sticky&&!1!==d))?e+="y":d&&(u=!0,e+="FakeY");b.xregexp=b.xregexp||{}; +d=b.xregexp[e]||(b.xregexp[e]=z(b,{addG:!0,addY:f,source:u?b.source+"|()":void 0,removeY:!1===d,isInternalOnly:!0}));d.lastIndex=c||0;a=r.exec.call(d,a);u&&a&&""===a.pop()&&(a=null);b.global&&(b.lastIndex=a?d.lastIndex:0);return a};f.forEach=function(a,b,c){for(var e=0,d=-1;e=f.exec(a,b,e);)c(e,++d,a,b),e=e.index+(e[0].length||1)};f.globalize=function(a){return z(a,{addG:!0})};f.install=function(a){a=w(a);!D.astral&&a.astral&&(D.astral=!0);!D.natives&&a.natives&&v(!0)};f.isInstalled=function(a){return!!D[a]}; +f.isRegExp=function(a){return"[object RegExp]"===L.call(a)};f.match=function(a,b,c){var e=b.global&&"one"!==c||"all"===c,d=(e?"g":"")+(b.sticky?"y":"")||"noGY";b.xregexp=b.xregexp||{};d=b.xregexp[d]||(b.xregexp[d]=z(b,{addG:!!e,removeG:"one"===c,isInternalOnly:!0}));a=n.match.call(q(a),d);b.global&&(b.lastIndex="one"===c&&a?a.index+a[0].length:0);return e?a||[]:a&&a[0]};f.matchChain=function(a,b){return function S(a,e){function c(a){if(d.backref){if(!(a.hasOwnProperty(d.backref)||+d.backref<a.length))throw new ReferenceError("Backreference to undefined group: "+ +d.backref);g.push(a[d.backref]||"")}else g.push(a[0])}for(var d=b[e].regex?b[e]:{regex:b[e]},g=[],h=0;h<a.length;++h)f.forEach(a[h],d.regex,c);return e!==b.length-1&&g.length?S(g,e+1):g}([a],0)};f.replace=function(a,b,c,d){var e=f.isRegExp(b),g=b.global&&"one"!==d||"all"===d,h=(g?"g":"")+(b.sticky?"y":"")||"noGY",u=b;e?(b.xregexp=b.xregexp||{},u=b.xregexp[h]||(b.xregexp[h]=z(b,{addG:!!g,removeG:"one"===d,isInternalOnly:!0}))):g&&(u=new RegExp(f.escape(String(b)),"g"));a=r.replace.call(q(a),u,c);e&& +b.global&&(b.lastIndex=0);return a};f.replaceEach=function(a,b){var c;for(c=0;c<b.length;++c){var e=b[c];a=f.replace(a,e[0],e[1],e[2])}return a};f.split=function(a,b,c){return r.split.call(q(a),b,c)};f.test=function(a,b,c,d){return!!f.exec(a,b,c,d)};f.uninstall=function(a){a=w(a);D.astral&&a.astral&&(D.astral=!1);D.natives&&a.natives&&v(!1)};f.union=function(a,b,c){function d(a,b,c){var d=m[e-u];if(b){if(++e,d)return"(?<"+d+">"}else if(c)return"\\"+(+c+u);return a}c=c||{};c=c.conjunction||"or";var e= +0;if(!y(a,"Array")||!a.length)throw new TypeError("Must provide a nonempty array of patterns to merge");for(var g=/(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*\]/g,h=[],k,l=0;l<a.length;++l)if(k=a[l],f.isRegExp(k)){var u=e;var m=k.xregexp&&k.xregexp.captureNames||[];h.push(n.replace.call(f(k.source).source,g,d))}else h.push(f.escape(k));return f(h.join("none"===c?"":"|"),b)};r.exec=function(a){var b=this.lastIndex,c=n.exec.apply(this,arguments),d;if(c){if(!R&&1<c.length&&-1<C(c,"")){var f= +z(this,{removeG:!0,isInternalOnly:!0});n.replace.call(String(a).slice(c.index),f,function(){var a=arguments.length,b;for(b=1;b<a-2;++b)void 0===arguments[b]&&(c[b]=void 0)})}if(this.xregexp&&this.xregexp.captureNames)for(d=1;d<c.length;++d)(f=this.xregexp.captureNames[d-1])&&(c[f]=c[d]);this.global&&!c[0].length&&this.lastIndex>c.index&&(this.lastIndex=c.index)}this.global||(this.lastIndex=b);return c};r.test=function(a){return!!r.exec.call(this,a)};r.match=function(a){if(!f.isRegExp(a))a=new RegExp(a); +else if(a.global){var b=n.match.apply(this,arguments);a.lastIndex=0;return b}return r.exec.call(a,q(this))};r.replace=function(a,b){var c=f.isRegExp(a);if(c){if(a.xregexp)var d=a.xregexp.captureNames;var e=a.lastIndex}else a+="";var g=y(b,"Function")?n.replace.call(String(this),a,function(){var e=arguments,f;if(d)for(e[0]=new String(e[0]),f=0;f<d.length;++f)d[f]&&(e[0][d[f]]=e[f+1]);c&&a.global&&(a.lastIndex=e[e.length-2]+e[0].length);return b.apply(void 0,e)}):n.replace.call(null==this?this:String(this), +a,function(){var a=arguments;return n.replace.call(String(b),P,function(b,c,e){if(c){e=+c;if(e<=a.length-3)return a[e]||"";e=d?C(d,c):-1;if(0>e)throw new SyntaxError("Backreference to undefined group "+b);return a[e+1]||""}if("$"===e)return"$";if("&"===e||0===+e)return a[0];if("`"===e)return a[a.length-1].slice(0,a[a.length-2]);if("'"===e)return a[a.length-1].slice(a[a.length-2]+a[0].length);e=+e;if(!isNaN(e)){if(e>a.length-3)throw new SyntaxError("Backreference to undefined group "+b);return a[e]|| +""}throw new SyntaxError("Invalid token "+b);})});c&&(a.lastIndex=a.global?0:e);return g};r.split=function(a,b){if(!f.isRegExp(a))return n.split.apply(this,arguments);var c=String(this),d=[],e=a.lastIndex,g=0,h;b=(void 0===b?-1:b)>>>0;f.forEach(c,a,function(a){a.index+a[0].length>g&&(d.push(c.slice(g,a.index)),1<a.length&&a.index<c.length&&Array.prototype.push.apply(d,a.slice(1)),h=a[0].length,g=a.index+h)});g===c.length?(!n.test.call(a,"")||h)&&d.push(""):d.push(c.slice(g));a.lastIndex=e;return d.length> +b?d.slice(0,b):d};f.addToken(/\\([ABCE-RTUVXYZaeg-mopqyz]|c(?![A-Za-z])|u(?![\dA-Fa-f]{4}|{[\dA-Fa-f]+})|x(?![\dA-Fa-f]{2}))/,function(a,b){if("B"===a[1]&&"default"===b)return a[0];throw new SyntaxError("Invalid escape "+a[0]);},{scope:"all",leadChar:"\\"});f.addToken(/\\u{([\dA-Fa-f]+)}/,function(a,b,c){b=l(a[1]);if(1114111<b)throw new SyntaxError("Invalid Unicode code point "+a[0]);if(65535>=b)return"\\u"+m(k(b));if(M&&-1<c.indexOf("u"))return a[0];throw new SyntaxError("Cannot use Unicode code point above \\u{FFFF} without flag u"); +},{scope:"all",leadChar:"\\"});f.addToken(/\[(\^?)\]/,function(a){return a[1]?"[\\s\\S]":"\\b\\B"},{leadChar:"["});f.addToken(/\(\?#[^)]*\)/,b,{leadChar:"("});f.addToken(/\s+|#[^\n]*\n?/,b,{flag:"x"});f.addToken(/\./,function(){return"[\\s\\S]"},{flag:"s",leadChar:"."});f.addToken(/\\k<([\w$]+)>/,function(a){var b=isNaN(a[1])?C(this.captureNames,a[1])+1:+a[1],c=a.index+a[0].length;if(!b||b>this.captureNames.length)throw new SyntaxError("Backreference to undefined group "+a[0]);return"\\"+b+(c===a.input.length|| +isNaN(a.input.charAt(c))?"":"(?:)")},{leadChar:"\\"});f.addToken(/\\(\d+)/,function(a,b){if(!("default"===b&&/^[1-9]/.test(a[1])&&+a[1]<=this.captureNames.length)&&"0"!==a[1])throw new SyntaxError("Cannot use octal escape or backreference to undefined group "+a[0]);return a[0]},{scope:"all",leadChar:"\\"});f.addToken(/\(\?P?<([\w$]+)>/,function(a){if(!isNaN(a[1]))throw new SyntaxError("Cannot use integer as capture name "+a[0]);if("length"===a[1]||"__proto__"===a[1])throw new SyntaxError("Cannot use reserved word as capture name "+ +a[0]);if(-1<C(this.captureNames,a[1]))throw new SyntaxError("Cannot use same name for multiple groups "+a[0]);this.captureNames.push(a[1]);this.hasNamedCapture=!0;return"("},{leadChar:"("});f.addToken(/\((?!\?)/,function(a,b,c){if(-1<c.indexOf("n"))return"(?:";this.captureNames.push(null);return"("},{optionalFlags:"n",leadChar:"("});g.exports=f},{}]},{},[8])(8)}); diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/404.html b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/404.html new file mode 100644 index 0000000..19f0749 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/404.html @@ -0,0 +1,12 @@ +{% 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/500.html b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/500.html new file mode 100644 index 0000000..b5ac5c3 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/500.html @@ -0,0 +1,17 @@ +{% 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/actions.html b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/actions.html new file mode 100644 index 0000000..cbb25bf --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/actions.html @@ -0,0 +1,23 @@ +{% load i18n %} +<div class="actions"> + {% block actions %} + {% block actions-form %} + {% for field in action_form %}{% if field.label %}<label>{{ field.label }} {% endif %}{{ field }}{% if field.label %}</label>{% 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 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 href="#">{% translate "Clear selection" %}</a></span> + {% endif %} + {% endif %} + {% endblock %} + {% endblock %} +</div> diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/app_index.html b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/app_index.html new file mode 100644 index 0000000..886bf6c --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/app_index.html @@ -0,0 +1,18 @@ +{% extends "admin/index.html" %} +{% load i18n %} + +{% block bodyclass %}{{ block.super }} app-{{ app_label }}{% endblock %} + +{% if not is_popup %} +{% block breadcrumbs %} +<div class="breadcrumbs"> +<a href="{% url 'admin:index' %}">{% translate 'Home' %}</a> +› +{% for app in app_list %} +{{ app.name }} +{% endfor %} +</div> +{% endblock %} +{% endif %} + +{% block sidebar %}{% endblock %} diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/app_list.html b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/app_list.html new file mode 100644 index 0000000..ea4a85b --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/app_list.html @@ -0,0 +1,40 @@ +{% load i18n %} + +{% if app_list %} + {% for app in app_list %} + <div class="app-{{ app.app_label }} module{% if app.app_url in request.path %} 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> + {% for model in app.models %} + <tr class="model-{{ model.object_name|lower }}{% if model.admin_url in request.path %} current-model{% endif %}"> + {% if model.admin_url %} + <th scope="row"><a href="{{ model.admin_url }}"{% if model.admin_url in request.path %} aria-current="page"{% endif %}>{{ model.name }}</a></th> + {% else %} + <th scope="row">{{ model.name }}</th> + {% endif %} + + {% if model.add_url %} + <td><a href="{{ model.add_url }}" class="addlink">{% 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">{% translate 'View' %}</a></td> + {% else %} + <td><a href="{{ model.admin_url }}" class="changelink">{% translate 'Change' %}</a></td> + {% endif %} + {% elif show_changelinks %} + <td></td> + {% endif %} + </tr> + {% endfor %} + </table> + </div> + {% endfor %} +{% else %} + <p>{% translate 'You don’t have permission to view or edit anything.' %}</p> +{% endif %} diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/auth/user/add_form.html b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/auth/user/add_form.html new file mode 100644 index 0000000..61cf5b1 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/auth/user/add_form.html @@ -0,0 +1,10 @@ +{% extends "admin/change_form.html" %} +{% load i18n %} + +{% block form_top %} + {% if not is_popup %} + <p>{% translate 'First, enter a username and password. Then, you’ll be able to edit more user options.' %}</p> + {% else %} + <p>{% translate "Enter a username and password." %}</p> + {% endif %} +{% endblock %} diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/auth/user/change_password.html b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/auth/user/change_password.html new file mode 100644 index 0000000..c107161 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/auth/user/change_password.html @@ -0,0 +1,57 @@ +{% extends "admin/base_site.html" %} +{% load i18n static %} +{% load admin_urls %} + +{% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% static "admin/css/forms.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> +› {% translate 'Change password' %} +</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="_popup" value="1">{% endif %} +{% if form.errors %} + <p class="errornote"> + {% if form.errors.items|length == 1 %}{% translate "Please correct the error below." %}{% else %}{% translate "Please correct the errors below." %}{% endif %} + </p> +{% endif %} + +<p>{% blocktranslate with username=original %}Enter a new password for the user <strong>{{ username }}</strong>.{% endblocktranslate %}</p> + +<fieldset class="module aligned"> + +<div class="form-row"> + {{ form.password1.errors }} + {{ form.password1.label_tag }} {{ form.password1 }} + {% if form.password1.help_text %} + <div class="help">{{ form.password1.help_text|safe }}</div> + {% endif %} +</div> + +<div class="form-row"> + {{ form.password2.errors }} + {{ form.password2.label_tag }} {{ form.password2 }} + {% if form.password2.help_text %} + <div class="help">{{ form.password2.help_text|safe }}</div> + {% endif %} +</div> + +</fieldset> + +<div class="submit-row"> +<input type="submit" value="{% translate 'Change password' %}" class="default"> +</div> + +</div> +</form></div> +{% endblock %} diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/base.html b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/base.html new file mode 100644 index 0000000..e3788b9 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/base.html @@ -0,0 +1,104 @@ +{% 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 %} + +{% 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 %} + +{% load i18n %} + + + + +

+ + {% if not is_popup %} + + + + {% block 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 %} +
+
+
+ + + diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/base_site.html b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/base_site.html new file mode 100644 index 0000000..9e8cc60 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/base_site.html @@ -0,0 +1,9 @@ +{% extends "admin/base.html" %} + +{% block title %}{% if subtitle %}{{ subtitle }} | {% endif %}{{ title }} | {{ site_title|default:_('Django site admin') }}{% endblock %} + +{% block branding %} +

{{ site_header|default:_('Django administration') }}

+{% endblock %} + +{% block nav-global %}{% endblock %} diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/change_form.html b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/change_form.html new file mode 100644 index 0000000..21b1c9b --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/change_form.html @@ -0,0 +1,81 @@ +{% extends "admin/base_site.html" %} +{% load i18n admin_urls static admin_modify %} + +{% 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 %}{% if not is_popup %} +
    + {% block object-tools-items %} + {% change_form_object_tools %} + {% endblock %} +
+{% endif %}{% 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 %} +

+ {% if errors|length == 1 %}{% translate "Please correct the error below." %}{% else %}{% translate "Please correct the errors below." %}{% endif %} +

+ {{ adminform.form.non_field_errors }} +{% endif %} + +{% block field_sets %} +{% for fieldset in adminform %} + {% include "admin/includes/fieldset.html" %} +{% 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/change_form_object_tools.html b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/change_form_object_tools.html new file mode 100644 index 0000000..067ae83 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/change_form_object_tools.html @@ -0,0 +1,8 @@ +{% 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/change_list.html b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/change_list.html new file mode 100644 index 0000000..15508a9 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/change_list.html @@ -0,0 +1,86 @@ +{% extends "admin/base_site.html" %} +{% load i18n admin_urls static admin_list %} + +{% 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 %} +

    + {% if cl.formset.total_error_count == 1 %}{% translate "Please correct the error below." %}{% else %}{% translate "Please correct the errors below." %}{% endif %} +

    + {{ 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 %} +
    +

    {% translate 'Filter' %}

    + {% if cl.has_active_filters %}

    + ✖ {% translate "Clear all filters" %} +

    {% endif %} + {% for spec in cl.filter_specs %}{% admin_list_filter cl spec %}{% endfor %} +
    + {% endif %} + {% endblock %} +
    +
    +{% endblock %} diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/change_list_object_tools.html b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/change_list_object_tools.html new file mode 100644 index 0000000..11cc6fa --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/change_list_object_tools.html @@ -0,0 +1,12 @@ +{% 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/change_list_results.html b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/change_list_results.html new file mode 100644 index 0000000..f8099ce --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/change_list_results.html @@ -0,0 +1,38 @@ +{% load i18n static %} +{% 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 %} + {% if header.sort_priority > 0 %} +
    + + {% if num_sorted_fields > 1 %}{{ header.sort_priority }}{% endif %} + +
    + {% endif %} + {% endif %} +
    {% if header.sortable %}{{ header.text|capfirst }}{% else %}{{ header.text|capfirst }}{% endif %}
    +
    +
    {{ result.form.non_field_errors }}
    +
    +{% endif %} diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/date_hierarchy.html b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/date_hierarchy.html new file mode 100644 index 0000000..65ae800 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/date_hierarchy.html @@ -0,0 +1,16 @@ +{% if show %} +
    +
    +
    +{% endif %} diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/delete_confirmation.html b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/delete_confirmation.html new file mode 100644 index 0000000..d4c9b29 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/delete_confirmation.html @@ -0,0 +1,52 @@ +{% 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 %} +

    {% 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 %}

    +
      + {% for obj in perms_lacking %} +
    • {{ obj }}
    • + {% endfor %} +
    +{% elif protected %} +

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

    +
      + {% for obj in protected %} +
    • {{ obj }}
    • + {% endfor %} +
    +{% else %} +

    {% 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" %} +
    +
    +{% endif %} +{% endblock %} diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/delete_selected_confirmation.html b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/delete_selected_confirmation.html new file mode 100644 index 0000000..a49b6ad --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/delete_selected_confirmation.html @@ -0,0 +1,55 @@ +{% 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 %}

    +
      + {% for obj in perms_lacking %} +
    • {{ obj }}
    • + {% endfor %} +
    +{% elif protected %} +

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

    +
      + {% for obj in protected %} +
    • {{ obj }}
    • + {% endfor %} +
    +{% 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/edit_inline/stacked.html b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/edit_inline/stacked.html new file mode 100644 index 0000000..25b7b58 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/edit_inline/stacked.html @@ -0,0 +1,29 @@ +{% load i18n admin_urls static %} +
    +
    + {% 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 %} +{{ 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 %} + {% for fieldset in inline_admin_form %} + {% include "admin/includes/fieldset.html" %} + {% endfor %} + {% 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 %} +
    +
    diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/edit_inline/tabular.html b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/edit_inline/tabular.html new file mode 100644 index 0000000..7a4e7cb --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/edit_inline/tabular.html @@ -0,0 +1,79 @@ +{% load i18n admin_urls static admin_modify %} +
    + +
    diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/filter.html b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/filter.html new file mode 100644 index 0000000..35dc553 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/filter.html @@ -0,0 +1,8 @@ +{% load i18n %} +

    {% blocktranslate with filter_title=title %} By {{ filter_title }} {% endblocktranslate %}

    + diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/includes/fieldset.html b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/includes/fieldset.html new file mode 100644 index 0000000..218fd5a --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/includes/fieldset.html @@ -0,0 +1,29 @@ +
    + {% if fieldset.name %}

    {{ fieldset.name }}

    {% endif %} + {% if fieldset.description %} +
    {{ fieldset.description|safe }}
    + {% endif %} + {% for line in fieldset %} +
    + {% if line.fields|length_is:'1' %}{{ line.errors }}{% endif %} + {% for field in line %} + + {% if not line.fields|length_is:'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 %} + + {% endfor %} +
    diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/includes/object_delete_summary.html b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/includes/object_delete_summary.html new file mode 100644 index 0000000..9ad97db --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/includes/object_delete_summary.html @@ -0,0 +1,7 @@ +{% load i18n %} +

    {% translate "Summary" %}

    +
      + {% for model_name, object_count in model_count %} +
    • {{ model_name|capfirst }}: {{ object_count }}
    • + {% endfor %} +
    diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/index.html b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/index.html new file mode 100644 index 0000000..b6e84b6 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/index.html @@ -0,0 +1,50 @@ +{% extends "admin/base_site.html" %} +{% load i18n static %} + +{% block extrastyle %}{{ block.super }}{% endblock %} + +{% block coltype %}colMS{% endblock %} + +{% block bodyclass %}{{ block.super }} dashboard{% endblock %} + +{% block 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/invalid_setup.html b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/invalid_setup.html new file mode 100644 index 0000000..1ef7c71 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/invalid_setup.html @@ -0,0 +1,13 @@ +{% 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/login.html b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/login.html new file mode 100644 index 0000000..7a192a4 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/login.html @@ -0,0 +1,68 @@ +{% extends "admin/base_site.html" %} +{% load i18n static %} + +{% 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 breadcrumbs %}{% endblock %} + +{% block content %} +{% if form.errors and not form.non_field_errors %} +

    +{% if form.errors.items|length == 1 %}{% translate "Please correct the error below." %}{% else %}{% translate "Please correct the errors below." %}{% endif %} +

    +{% 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/nav_sidebar.html b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/nav_sidebar.html new file mode 100644 index 0000000..32c5b8f --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/nav_sidebar.html @@ -0,0 +1,5 @@ +{% load i18n %} + + diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/object_history.html b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/object_history.html new file mode 100644 index 0000000..3015f36 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/object_history.html @@ -0,0 +1,42 @@ +{% 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 }}
    +{% else %} +

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

    +{% endif %} +
    +
    +{% endblock %} diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/pagination.html b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/pagination.html new file mode 100644 index 0000000..bc3117b --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/pagination.html @@ -0,0 +1,12 @@ +{% 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/popup_response.html b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/popup_response.html new file mode 100644 index 0000000..57a1ae3 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/popup_response.html @@ -0,0 +1,10 @@ +{% load i18n static %} + + {% translate 'Popup closing…' %} + + + + diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/prepopulated_fields_js.html b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/prepopulated_fields_js.html new file mode 100644 index 0000000..bbe1916 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/prepopulated_fields_js.html @@ -0,0 +1,5 @@ +{% load l10n static %} + diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/search_form.html b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/search_form.html new file mode 100644 index 0000000..3ec37f2 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/search_form.html @@ -0,0 +1,16 @@ +{% load i18n static %} +{% if cl.search_fields %} +
    +{% endif %} diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/submit_line.html b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/submit_line.html new file mode 100644 index 0000000..f401f0d --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/submit_line.html @@ -0,0 +1,14 @@ +{% load i18n admin_urls %} +
    +{% block submit-row %} +{% if show_save %}{% endif %} +{% if show_delete_link and original %} + {% url opts|admin_urlname:'delete' original.pk|admin_urlquote as delete_url %} + +{% endif %} +{% if show_save_as_new %}{% endif %} +{% if show_save_and_add_another %}{% endif %} +{% if show_save_and_continue %}{% endif %} +{% if show_close %}{% translate 'Close' %}{% endif %} +{% endblock %} +
    diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/widgets/clearable_file_input.html b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/widgets/clearable_file_input.html new file mode 100644 index 0000000..fe71ebd --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/widgets/clearable_file_input.html @@ -0,0 +1,6 @@ +{% 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/widgets/foreign_key_raw_id.html b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/widgets/foreign_key_raw_id.html new file mode 100644 index 0000000..ca25b52 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/widgets/foreign_key_raw_id.html @@ -0,0 +1,2 @@ +{% include 'django/forms/widgets/input.html' %}{% if related_url %}{% endif %}{% if link_label %} +{% if link_url %}{% endif %}{{ link_label }}{% if link_url %}{% endif %}{% endif %} diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/widgets/many_to_many_raw_id.html b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/widgets/many_to_many_raw_id.html new file mode 100644 index 0000000..0dd0331 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/widgets/many_to_many_raw_id.html @@ -0,0 +1 @@ +{% include 'admin/widgets/foreign_key_raw_id.html' %} diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/widgets/radio.html b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/widgets/radio.html new file mode 100644 index 0000000..780899a --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/widgets/radio.html @@ -0,0 +1 @@ +{% include "django/forms/widgets/multiple_input.html" %} diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/widgets/related_widget_wrapper.html b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/widgets/related_widget_wrapper.html new file mode 100644 index 0000000..a97bec1 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/widgets/related_widget_wrapper.html @@ -0,0 +1,31 @@ +{% load i18n static %} + diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/widgets/split_datetime.html b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/widgets/split_datetime.html new file mode 100644 index 0000000..7fc7bf6 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/widgets/split_datetime.html @@ -0,0 +1,4 @@ +

    + {{ 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/widgets/url.html b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/widgets/url.html new file mode 100644 index 0000000..69dc401 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/widgets/url.html @@ -0,0 +1 @@ +{% if url_valid %}

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

    {% endif %} diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/registration/logged_out.html b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/registration/logged_out.html new file mode 100644 index 0000000..460e17e --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/registration/logged_out.html @@ -0,0 +1,14 @@ +{% 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/registration/password_change_done.html b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/registration/password_change_done.html new file mode 100644 index 0000000..e1bb982 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/registration/password_change_done.html @@ -0,0 +1,13 @@ +{% extends "admin/base_site.html" %} +{% load i18n %} +{% block userlinks %}{% url 'django-admindocs-docroot' as docsroot %}{% if docsroot %}{% translate 'Documentation' %} / {% endif %}{% translate 'Change password' %} / {% translate 'Log out' %}{% endblock %} +{% block breadcrumbs %} + +{% endblock %} + +{% block content %} +

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

    +{% endblock %} diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/registration/password_change_form.html b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/registration/password_change_form.html new file mode 100644 index 0000000..95c84f9 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/registration/password_change_form.html @@ -0,0 +1,57 @@ +{% extends "admin/base_site.html" %} +{% load i18n static %} +{% block extrastyle %}{{ block.super }}{% endblock %} +{% block userlinks %}{% url 'django-admindocs-docroot' as docsroot %}{% if docsroot %}{% translate 'Documentation' %} / {% endif %} {% translate 'Change password' %} / {% translate 'Log out' %}{% endblock %} +{% block breadcrumbs %} + +{% endblock %} + +{% block content %}
    + +
    {% csrf_token %} +
    +{% if form.errors %} +

    + {% if form.errors.items|length == 1 %}{% translate "Please correct the error below." %}{% else %}{% translate "Please correct the errors below." %}{% endif %} +

    +{% 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/registration/password_reset_complete.html b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/registration/password_reset_complete.html new file mode 100644 index 0000000..e6a383f --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/registration/password_reset_complete.html @@ -0,0 +1,17 @@ +{% 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/registration/password_reset_confirm.html b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/registration/password_reset_confirm.html new file mode 100644 index 0000000..373e703 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/registration/password_reset_confirm.html @@ -0,0 +1,41 @@ +{% extends "admin/base_site.html" %} +{% load i18n static %} + +{% 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/registration/password_reset_done.html b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/registration/password_reset_done.html new file mode 100644 index 0000000..8b1971a --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/registration/password_reset_done.html @@ -0,0 +1,17 @@ +{% 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/registration/password_reset_email.html b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/registration/password_reset_email.html new file mode 100644 index 0000000..6482209 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/registration/password_reset_email.html @@ -0,0 +1,14 @@ +{% 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 'Your username, in case you’ve forgotten:' %} {{ user.get_username }} + +{% translate "Thanks for using our site!" %} + +{% blocktranslate %}The {{ site_name }} team{% endblocktranslate %} + +{% endautoescape %} diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/registration/password_reset_form.html b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/registration/password_reset_form.html new file mode 100644 index 0000000..33785f7 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templates/registration/password_reset_form.html @@ -0,0 +1,27 @@ +{% extends "admin/base_site.html" %} +{% load i18n static %} + +{% 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templatetags/__init__.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templatetags/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templatetags/admin_list.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templatetags/admin_list.py new file mode 100644 index 0000000..f4b6d8d --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templatetags/admin_list.py @@ -0,0 +1,466 @@ +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, ORDER_VAR, PAGE_VAR, SEARCH_VAR, +) +from django.core.exceptions import ObjectDoesNotExist +from django.db import models +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': + yield { + "text": text, + "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: + 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)] + 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 f is None or f.auto_created: + if field_name == 'action_checkbox': + row_classes = ['action-checkbox'] + boolean = getattr(attr, '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) + 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_in_col(first, field_name, cl): + 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' + qs_kwargs = {'is_dst': True} + else: + dates_or_datetimes = 'dates' + qs_kwargs = {} + 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', **qs_kwargs) + 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', **qs_kwargs) + 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', **qs_kwargs) + 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 + } + + +@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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templatetags/admin_modify.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templatetags/admin_modify.py new file mode 100644 index 0000000..ee5f23b --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templatetags/admin_modify.py @@ -0,0 +1,116 @@ +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_change_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: + # Loop through all the fields (one per cell) + for line in fieldset: + for field in line: + count += 1 + if inline_admin_form.formset.can_delete: + # Delete checkbox + count += 1 + return count diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templatetags/admin_urls.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templatetags/admin_urls.py new file mode 100644 index 0000000..f817c25 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templatetags/admin_urls.py @@ -0,0 +1,56 @@ +from urllib.parse import parse_qsl, unquote, urlparse, urlunparse + +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') + + parsed_url = list(urlparse(url)) + parsed_qs = dict(parse_qsl(parsed_url[4])) + merged_qs = {} + + 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[4] = urlencode(merged_qs) + return urlunparse(parsed_url) diff --git a/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templatetags/base.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templatetags/base.py new file mode 100644 index 0000000..e98604a --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templatetags/base.py @@ -0,0 +1,33 @@ +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.object_name.lower() + # 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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templatetags/log.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templatetags/log.py new file mode 100644 index 0000000..08c2345 --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/templatetags/log.py @@ -0,0 +1,59 @@ +from django import template +from django.contrib.admin.models import LogEntry + +register = template.Library() + + +class AdminLogNode(template.Node): + def __init__(self, limit, varname, user): + self.limit, self.varname, self.user = limit, varname, user + + def __repr__(self): + return "" + + def render(self, context): + if self.user is None: + entries = LogEntry.objects.all() + else: + user_id = self.user + if not user_id.isdigit(): + user_id = context[self.user].pk + entries = LogEntry.objects.filter(user__pk=user_id) + context[self.varname] = entries.select_related('content_type', 'user')[: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_containing_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/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/tests.py b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/tests.py new file mode 100644 index 0000000..482027b --- /dev/null +++ b/examples/celery_progress_demo/.venv/lib/python3.8/site-packages/django/contrib/admin/tests.py @@ -0,0 +1,193 @@ +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 _ + + +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.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. + """ + 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