diff --git a/.codecov.yml b/.codecov.yml
index 5fa8e1639..d9a12a773 100644
--- a/.codecov.yml
+++ b/.codecov.yml
@@ -1,18 +1,18 @@
codecov:
require_ci_to_pass: true
-# https://docs.codecov.com/docs/flags#recommended-automatic-flag-management
-# Require each flag to have 1 upload before notification
-flag_management:
- individual_flags:
- - name: backend
+ # https://docs.codecov.com/docs/components
+component_management:
+ individual_components:
+ - component_id: backend
paths:
- - src/
- - name: frontend
+ - src/**
+ - component_id: frontend
paths:
- - src-ui/
+ - src-ui/**
# https://docs.codecov.com/docs/pull-request-comments
# codecov will only comment if coverage changes
comment:
+ layout: "header, diff, components, flags, files"
require_changes: true
# https://docs.codecov.com/docs/javascript-bundle-analysis
require_bundle_changes: true
diff --git a/.codespellrc b/.codespellrc
deleted file mode 100644
index 9b2cf624d..000000000
--- a/.codespellrc
+++ /dev/null
@@ -1,3 +0,0 @@
-[codespell]
-write-changes = True
-ignore-words-list = criterias,afterall,valeu,ureue,equest,ure,assertIn
diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile
index 2aecc45a1..fd6448e9b 100644
--- a/.devcontainer/Dockerfile
+++ b/.devcontainer/Dockerfile
@@ -76,18 +76,16 @@ RUN set -eux \
&& apt-get update \
&& apt-get install --yes --quiet --no-install-recommends ${RUNTIME_PACKAGES}
-ARG PYTHON_PACKAGES="\
- python3 \
- python3-pip \
- python3-wheel \
- pipenv \
- ca-certificates"
+ARG PYTHON_PACKAGES="ca-certificates"
RUN set -eux \
echo "Installing python packages" \
&& apt-get update \
&& apt-get install --yes --quiet ${PYTHON_PACKAGES}
+COPY --from=ghcr.io/astral-sh/uv:0.7.8 /uv /bin/uv
+
+
RUN set -eux \
&& echo "Installing pre-built updates" \
&& echo "Installing qpdf ${QPDF_VERSION}" \
@@ -123,13 +121,14 @@ RUN set -eux \
WORKDIR /usr/src/paperless/src/docker/
COPY [ \
- "docker/imagemagick-policy.xml", \
+ "docker/rootfs/etc/ImageMagick-6/paperless-policy.xml", \
"./" \
]
RUN set -eux \
&& echo "Configuring ImageMagick" \
- && mv imagemagick-policy.xml /etc/ImageMagick-6/policy.xml
+ && mv paperless-policy.xml /etc/ImageMagick-6/policy.xml
+
# Packages needed only for building a few quick Python
# dependencies
@@ -140,18 +139,17 @@ ARG BUILD_PACKAGES="\
libpq-dev \
# https://github.com/PyMySQL/mysqlclient#linux
default-libmysqlclient-dev \
- pkg-config \
- pre-commit"
+ pkg-config"
# hadolint ignore=DL3042
-RUN --mount=type=cache,target=/root/.cache/pip/,id=pip-cache \
+RUN --mount=type=cache,target=/root/.cache/uv,id=pip-cache \
set -eux \
&& echo "Installing build system packages" \
&& apt-get update \
&& apt-get install --yes --quiet ${BUILD_PACKAGES}
RUN set -eux \
- && npm update npm -g
+ && npm update -g pnpm
# add users, setup scripts
# Mount the compiled frontend to expected location
@@ -169,9 +167,6 @@ RUN set -eux \
&& mkdir --parents --verbose /usr/src/paperless/paperless-ngx/.venv \
&& echo "Adjusting all permissions" \
&& chown --from root:root --changes --recursive paperless:paperless /usr/src/paperless
-# && echo "Collecting static files" \
-# && gosu paperless python3 manage.py collectstatic --clear --no-input --link \
-# && gosu paperless python3 manage.py compilemessages
VOLUME ["/usr/src/paperless/paperless-ngx/data", \
"/usr/src/paperless/paperless-ngx/media", \
diff --git a/.devcontainer/README.md b/.devcontainer/README.md
new file mode 100644
index 000000000..cec62c802
--- /dev/null
+++ b/.devcontainer/README.md
@@ -0,0 +1,94 @@
+# Paperless-ngx Development Environment
+
+## Overview
+
+Welcome to the Paperless-ngx development environment! This setup uses VSCode DevContainers to provide a consistent and seamless development experience.
+
+### What are DevContainers?
+
+DevContainers are a feature in VSCode that allows you to develop within a Docker container. This ensures that your development environment is consistent across different machines and setups. By defining a containerized environment, you can eliminate the "works on my machine" problem.
+
+### Advantages of DevContainers
+
+- **Consistency**: Same environment for all developers.
+- **Isolation**: Separate development environment from your local machine.
+- **Reproducibility**: Easily recreate the environment on any machine.
+- **Pre-configured Tools**: Include all necessary tools and dependencies in the container.
+
+## DevContainer Setup
+
+The DevContainer configuration provides up all the necessary services for Paperless-ngx, including:
+
+- Redis
+- Gotenberg
+- Tika
+
+Data is stored using Docker volumes to ensure persistence across container restarts.
+
+## Configuration Files
+
+The setup includes debugging configurations (`launch.json`) and tasks (`tasks.json`) to help you manage and debug various parts of the project:
+
+- **Backend Debugging:**
+ - `manage.py runserver`
+ - `manage.py document-consumer`
+ - `celery`
+- **Maintenance Tasks:**
+ - Create superuser
+ - Run migrations
+ - Recreate virtual environment (`.venv` with `uv`)
+ - Compile frontend assets
+
+## Getting Started
+
+### Step 1: Running the DevContainer
+
+To start the DevContainer:
+
+1. Open VSCode.
+2. Open the project folder.
+3. Open the command palette and choose `Dev Containers: Rebuild and Reopen in Container`.
+
+VSCode will build and start the DevContainer environment.
+
+### Step 2: Initial Setup
+
+Once the DevContainer is up and running, run the `Project Setup: Run all Init Tasks` task to initialize the project.
+
+Alternatively, the Project Setup can be done with individual tasks:
+
+1. **Compile Frontend Assets**: `Maintenance: Compile frontend for production`.
+2. **Run Database Migrations**: `Maintenance: manage.py migrate`.
+3. **Create Superuser**: `Maintenance: manage.py createsuperuser`.
+
+### Debugging and Running Services
+
+You can start and debug backend services either as debugging sessions via `launch.json` or as tasks.
+
+#### Using `launch.json`
+
+1. Press `F5` or go to the **Run and Debug** view in VSCode.
+2. Select the desired configuration:
+ - `Runserver`
+ - `Document Consumer`
+ - `Celery`
+
+#### Using Tasks
+
+1. Open the command palette and select `Tasks: Run Task`.
+2. Choose the desired task:
+ - `Runserver`
+ - `Document Consumer`
+ - `Celery`
+
+### Additional Maintenance Tasks
+
+Additional tasks are available for common maintenance operations:
+
+- **Recreate .venv**: For setting up the virtual environment using `uv`.
+- **Migrate Database**: To apply database migrations.
+- **Create Superuser**: To create an admin user for the application.
+
+## Let's Get Started!
+
+Follow the steps above to get your development environment up and running. Happy coding!
diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
index 34446caea..7d39c3f14 100644
--- a/.devcontainer/devcontainer.json
+++ b/.devcontainer/devcontainer.json
@@ -3,7 +3,7 @@
"dockerComposeFile": "docker-compose.devcontainer.sqlite-tika.yml",
"service": "paperless-development",
"workspaceFolder": "/usr/src/paperless/paperless-ngx",
- "postCreateCommand": "pipenv install --dev && pipenv run pre-commit install",
+ "postCreateCommand": "/bin/bash -c 'uv sync --group dev && uv run pre-commit install'",
"customizations": {
"vscode": {
"extensions": [
diff --git a/.devcontainer/docker-compose.devcontainer.sqlite-tika.yml b/.devcontainer/docker-compose.devcontainer.sqlite-tika.yml
index 7209339e1..13d59c776 100644
--- a/.devcontainer/docker-compose.devcontainer.sqlite-tika.yml
+++ b/.devcontainer/docker-compose.devcontainer.sqlite-tika.yml
@@ -20,20 +20,17 @@
#
# This file is intended only to be used through VSCOde devcontainers. See README.md
# in the folder .devcontainer.
-
-
services:
broker:
image: docker.io/library/redis:7
restart: unless-stopped
volumes:
- ./redisdata:/data
-
# No ports need to be exposed; the VSCode DevContainer plugin manages them.
paperless-development:
image: paperless-ngx
build:
- context: ../ # Dockerfile cannot access files from parent directories if context is not set.
+ context: ../ # Dockerfile cannot access files from parent directories if context is not set.
dockerfile: ./.devcontainer/Dockerfile
restart: unless-stopped
depends_on:
@@ -43,7 +40,7 @@ services:
volumes:
- ..:/usr/src/paperless/paperless-ngx:delegated
- ../.devcontainer/vscode:/usr/src/paperless/paperless-ngx/.vscode:delegated # VSCode config files
- - pipenv:/usr/src/paperless/paperless-ngx/.venv
+ - virtualenv:/usr/src/paperless/paperless-ngx/.venv # Virtual environment persisted in volume
- /usr/src/paperless/paperless-ngx/src/documents/static/frontend # Static frontend files exist only in container
- /usr/src/paperless/paperless-ngx/src/.pytest_cache
- /usr/src/paperless/paperless-ngx/.ruff_cache
@@ -60,24 +57,22 @@ services:
PAPERLESS_TIKA_ENDPOINT: http://tika:9998
PAPERLESS_STATICDIR: ./src/documents/static
PAPERLESS_DEBUG: true
-
# Overrides default command so things don't shut down after the process ends.
command: /bin/sh -c "chown -R paperless:paperless /usr/src/paperless/paperless-ngx/src/documents/static/frontend && chown -R paperless:paperless /usr/src/paperless/paperless-ngx/.ruff_cache && while sleep 1000; do :; done"
-
gotenberg:
- image: docker.io/gotenberg/gotenberg:7.10
+ image: docker.io/gotenberg/gotenberg:8.17
restart: unless-stopped
-
# The Gotenberg Chromium route is used to convert .eml files. We do not
# want to allow external content like tracking pixels or even JavaScript.
command:
- "gotenberg"
- "--chromium-disable-javascript=true"
- "--chromium-allow-list=file:///tmp/.*"
-
tika:
image: docker.io/apache/tika:latest
restart: unless-stopped
-
volumes:
- pipenv:
+ data:
+ media:
+ redisdata:
+ virtualenv:
diff --git a/.devcontainer/vscode/tasks.json b/.devcontainer/vscode/tasks.json
index 6c58cdaa3..6475e14d1 100644
--- a/.devcontainer/vscode/tasks.json
+++ b/.devcontainer/vscode/tasks.json
@@ -5,7 +5,7 @@
"label": "Start: Celery Worker",
"description": "Start the Celery Worker which processes background and consume tasks",
"type": "shell",
- "command": "pipenv run celery --app paperless worker -l DEBUG",
+ "command": "uv run celery --app paperless worker -l DEBUG",
"isBackground": true,
"options": {
"cwd": "${workspaceFolder}/src"
@@ -33,7 +33,7 @@
"label": "Start: Frontend Angular",
"description": "Start the Frontend Angular Dev Server",
"type": "shell",
- "command": "npm start",
+ "command": "pnpm start",
"isBackground": true,
"options": {
"cwd": "${workspaceFolder}/src-ui"
@@ -61,7 +61,7 @@
"label": "Start: Consumer Service (manage.py document_consumer)",
"description": "Start the Consumer Service which processes files from a directory",
"type": "shell",
- "command": "pipenv run python manage.py document_consumer",
+ "command": "uv run python manage.py document_consumer",
"group": "build",
"presentation": {
"echo": true,
@@ -80,7 +80,7 @@
"label": "Start: Backend Server (manage.py runserver)",
"description": "Start the Backend Server which serves the Django API and the compiled Angular frontend",
"type": "shell",
- "command": "pipenv run python manage.py runserver",
+ "command": "uv run python manage.py runserver",
"group": "build",
"presentation": {
"echo": true,
@@ -99,7 +99,7 @@
"label": "Maintenance: manage.py migrate",
"description": "Apply database migrations",
"type": "shell",
- "command": "pipenv run python manage.py migrate",
+ "command": "uv run python manage.py migrate",
"group": "none",
"presentation": {
"echo": true,
@@ -118,7 +118,7 @@
"label": "Maintenance: Build Documentation",
"description": "Build the documentation with MkDocs",
"type": "shell",
- "command": "pipenv run mkdocs build --config-file mkdocs.yml && pipenv run mkdocs serve",
+ "command": "uv run mkdocs build --config-file mkdocs.yml && uv run mkdocs serve",
"group": "none",
"presentation": {
"echo": true,
@@ -137,7 +137,7 @@
"label": "Maintenance: manage.py createsuperuser",
"description": "Create a superuser",
"type": "shell",
- "command": "pipenv run python manage.py createsuperuser",
+ "command": "uv run python manage.py createsuperuser",
"group": "none",
"presentation": {
"echo": true,
@@ -156,7 +156,7 @@
"label": "Maintenance: recreate .venv",
"description": "Recreate the python virtual environment and install python dependencies",
"type": "shell",
- "command": "rm -R -v .venv/* || pipenv install --dev",
+ "command": "rm -rf .venv && uv venv && uv sync --dev",
"group": "none",
"presentation": {
"echo": true,
@@ -173,8 +173,8 @@
},
{
"label": "Maintenance: Install Frontend Dependencies",
- "description": "Install frontend (npm) dependencies",
- "type": "npm",
+ "description": "Install frontend (pnpm) dependencies",
+ "type": "pnpm",
"script": "install",
"path": "src-ui",
"group": "clean",
@@ -185,7 +185,7 @@
"description": "Clean install frontend dependencies and build the frontend for production",
"label": "Maintenance: Compile frontend for production",
"type": "shell",
- "command": "npm ci && ./node_modules/.bin/ng build --configuration production",
+ "command": "pnpm install && ./node_modules/.bin/ng build --configuration production",
"group": "none",
"presentation": {
"echo": true,
diff --git a/.editorconfig b/.editorconfig
index 741981f9d..8111f01d8 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -27,9 +27,6 @@ indent_style = space
[*.md]
indent_style = space
-[Pipfile.lock]
-indent_style = space
-
# Tests don't get a line width restriction. It's still a good idea to follow
# the 79 character rule, but in the interests of clarity, tests often need to
# violate it.
diff --git a/.github/DISCUSSION_TEMPLATE/support.yml b/.github/DISCUSSION_TEMPLATE/support.yml
new file mode 100644
index 000000000..18c0812f2
--- /dev/null
+++ b/.github/DISCUSSION_TEMPLATE/support.yml
@@ -0,0 +1,55 @@
+title: "[Support] "
+body:
+ - type: textarea
+ id: description
+ attributes:
+ label: What's your question or issue?
+ description: Provide a clear and concise description of what you're trying to do, and what's going wrong.
+ placeholder: |
+ I'm trying to...
+
+ [Include screenshots if helpful]
+ validations:
+ required: true
+ - type: textarea
+ id: steps
+ attributes:
+ label: What have you tried?
+ description: Describe any steps you've already taken to troubleshoot or solve the issue.
+ placeholder: |
+ - I checked the logs and saw...
+ - I followed the install guide and tried...
+ - type: input
+ id: version
+ attributes:
+ label: Paperless-ngx version
+ placeholder: e.g. 1.14.0
+ validations:
+ required: true
+ - type: input
+ id: host-os
+ attributes:
+ label: Host OS
+ description: Include architecture if relevant.
+ placeholder: e.g. Ubuntu 22.04 / Raspberry Pi arm64
+ - type: dropdown
+ id: install-method
+ attributes:
+ label: Installation method
+ options:
+ - Docker - official image
+ - Docker - linuxserver.io image
+ - Bare metal
+ - Other (please describe above)
+ - type: textarea
+ id: system-status
+ attributes:
+ label: System status
+ description: If available, copy & paste the system status output from Settings > System Status > Copy
+ render: json
+ - type: textarea
+ id: logs
+ attributes:
+ label: Relevant logs or output
+ description: If you have logs, errors that might help, paste it here.
+ render: bash
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
new file mode 100644
index 000000000..79e3a774d
--- /dev/null
+++ b/.github/FUNDING.yml
@@ -0,0 +1 @@
+github: [shamoon, stumpylog]
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index 1ed22b439..09721afb8 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -1,12 +1,13 @@
-# https://docs.github.com/en/code-security/supply-chain-security/keeping-your-dependencies-updated-automatically/configuration-options-for-dependency-updates#package-ecosystem
-
+# Please see the documentation for all configuration options:
+# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
version: 2
+# Required for uv support for now
+enable-beta-ecosystems: true
updates:
-
- # Enable version updates for npm
+ # Enable version updates for pnpm
- package-ecosystem: "npm"
target-branch: "dev"
- # Look for `package.json` and `lock` files in the `/src-ui` directory
+ # Look for `pnpm-lock.yaml` file in the `/src-ui` directory
directory: "/src-ui"
open-pull-requests-limit: 10
schedule:
@@ -14,9 +15,6 @@ updates:
labels:
- "frontend"
- "dependencies"
- # Add reviewers
- reviewers:
- - "paperless-ngx/frontend"
groups:
frontend-angular-dependencies:
patterns:
@@ -32,11 +30,9 @@ updates:
patterns:
- "@typescript-eslint*"
- "eslint"
-
# Enable version updates for Python
- - package-ecosystem: "pip"
+ - package-ecosystem: "uv"
target-branch: "dev"
- # Look for a `Pipfile` in the `root` directory
directory: "/"
# Check for updates once a week
schedule:
@@ -44,20 +40,17 @@ updates:
labels:
- "backend"
- "dependencies"
- # Add reviewers
- reviewers:
- - "paperless-ngx/backend"
- ignore:
- - dependency-name: "uvicorn"
groups:
development:
patterns:
- "*pytest*"
- "ruff"
- "mkdocs-material"
+ - "pre-commit*"
django:
patterns:
- "*django*"
+ - "drf-*"
major-versions:
update-types:
- "major"
@@ -65,7 +58,13 @@ updates:
update-types:
- "minor"
- "patch"
-
+ exclude-patterns:
+ - "*django*"
+ - "drf-*"
+ pre-built:
+ patterns:
+ - psycopg*
+ - zxing-cpp
# Enable updates for GitHub Actions
- package-ecosystem: "github-actions"
target-branch: "dev"
@@ -76,12 +75,50 @@ updates:
labels:
- "ci-cd"
- "dependencies"
- # Add reviewers
- reviewers:
- - "paperless-ngx/ci-cd"
groups:
actions:
update-types:
- "major"
- "minor"
- "patch"
+ # Update Dockerfile in root directory
+ - package-ecosystem: "docker"
+ directories:
+ - "/"
+ - "/.devcontainer/"
+ schedule:
+ interval: "weekly"
+ open-pull-requests-limit: 5
+ labels:
+ - "dependencies"
+ commit-message:
+ prefix: "docker"
+ include: "scope"
+ # Update Docker Compose files in docker/compose directory
+ - package-ecosystem: "docker-compose"
+ directory: "/docker/compose/"
+ schedule:
+ interval: "weekly"
+ open-pull-requests-limit: 5
+ labels:
+ - "dependencies"
+ commit-message:
+ prefix: "docker-compose"
+ include: "scope"
+ groups:
+ # Individual groups for each image
+ gotenberg:
+ patterns:
+ - "docker.io/gotenberg/gotenberg*"
+ tika:
+ patterns:
+ - "docker.io/apache/tika*"
+ redis:
+ patterns:
+ - "docker.io/library/redis*"
+ mariadb:
+ patterns:
+ - "docker.io/library/mariadb*"
+ postgres:
+ patterns:
+ - "docker.io/library/postgres*"
diff --git a/.github/labeler.yml b/.github/labeler.yml
new file mode 100644
index 000000000..7587db1b4
--- /dev/null
+++ b/.github/labeler.yml
@@ -0,0 +1,26 @@
+backend:
+ - changed-files:
+ - any-glob-to-any-file:
+ - 'src/**'
+ - 'pyproject.toml'
+ - 'uv.lock'
+ - 'requirements.txt'
+frontend:
+ - changed-files:
+ - any-glob-to-any-file:
+ - 'src-ui/**'
+documentation:
+ - changed-files:
+ - any-glob-to-any-file:
+ - 'docs/**'
+ci-cd:
+ - changed-files:
+ - any-glob-to-any-file:
+ - '.github/**'
+# pr types
+bug:
+ - head-branch:
+ - ['^fix']
+enhancement:
+ - head-branch:
+ - ['^feature']
diff --git a/.github/release-drafter.yml b/.github/release-drafter.yml
index cb48d4ba0..89c8a96ea 100644
--- a/.github/release-drafter.yml
+++ b/.github/release-drafter.yml
@@ -1,15 +1,3 @@
-autolabeler:
- - label: "bug"
- branch:
- - '/^fix/'
- title:
- - "/^fix/i"
- - "/^Bugfix/i"
- - label: "enhancement"
- branch:
- - '/^feature/'
- title:
- - "/^feature/i"
categories:
- title: 'Breaking Changes'
labels:
@@ -17,7 +5,7 @@ categories:
- title: 'Notable Changes'
labels:
- 'notable'
- - title: 'Features'
+ - title: 'Features / Enhancements'
labels:
- 'enhancement'
- title: 'Bug Fixes'
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 5e090a227..acc36e5b5 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -1,5 +1,4 @@
name: ci
-
on:
push:
tags:
@@ -12,87 +11,74 @@ on:
pull_request:
branches-ignore:
- 'translations**'
-
env:
- # This is the version of pipenv all the steps will use
- # If changing this, change Dockerfile
- DEFAULT_PIP_ENV_VERSION: "2024.4.1"
+ DEFAULT_UV_VERSION: "0.8.x"
# This is the default version of Python to use in most steps which aren't specific
DEFAULT_PYTHON_VERSION: "3.11"
-
+ NLTK_DATA: "/usr/share/nltk_data"
jobs:
pre-commit:
# We want to run on external PRs, but not on our own internal PRs as they'll be run
# by the push to the branch. Without this if check, checks are duplicated since
# internal PRs match both the push and pull_request events.
- if:
- github.event_name == 'push' || github.event.pull_request.head.repo.full_name !=
- github.repository
-
+ if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository
name: Linting Checks
runs-on: ubuntu-24.04
steps:
- -
- name: Checkout repository
+ - name: Checkout repository
uses: actions/checkout@v4
- -
- name: Install python
+ - name: Install python
uses: actions/setup-python@v5
with:
python-version: ${{ env.DEFAULT_PYTHON_VERSION }}
- -
- name: Check files
+ - name: Check files
uses: pre-commit/action@v3.0.1
-
documentation:
name: "Build & Deploy Documentation"
runs-on: ubuntu-24.04
needs:
- pre-commit
steps:
- -
- name: Checkout
+ - name: Checkout
uses: actions/checkout@v4
- -
- name: Set up Python
+ - name: Set up Python
id: setup-python
uses: actions/setup-python@v5
with:
python-version: ${{ env.DEFAULT_PYTHON_VERSION }}
- cache: "pipenv"
- cache-dependency-path: 'Pipfile.lock'
- -
- name: Install pipenv
+ - name: Install uv
+ uses: astral-sh/setup-uv@v6
+ with:
+ version: ${{ env.DEFAULT_UV_VERSION }}
+ enable-cache: true
+ python-version: ${{ env.DEFAULT_PYTHON_VERSION }}
+ - name: Install Python dependencies
run: |
- pip install --user pipenv==${{ env.DEFAULT_PIP_ENV_VERSION }}
- -
- name: Install dependencies
+ uv sync --python ${{ steps.setup-python.outputs.python-version }} --dev --frozen
+ - name: Make documentation
run: |
- pipenv --python ${{ steps.setup-python.outputs.python-version }} sync --dev
- -
- name: List installed Python dependencies
- run: |
- pipenv --python ${{ steps.setup-python.outputs.python-version }} run pip list
- -
- name: Make documentation
- run: |
- pipenv --python ${{ steps.setup-python.outputs.python-version }} run mkdocs build --config-file ./mkdocs.yml
- -
- name: Deploy documentation
+ uv run \
+ --python ${{ steps.setup-python.outputs.python-version }} \
+ --dev \
+ --frozen \
+ mkdocs build --config-file ./mkdocs.yml
+ - name: Deploy documentation
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
run: |
echo "docs.paperless-ngx.com" > "${{ github.workspace }}/docs/CNAME"
git config --global user.name "${{ github.actor }}"
git config --global user.email "${{ github.actor }}@users.noreply.github.com"
- pipenv --python ${{ steps.setup-python.outputs.python-version }} run mkdocs gh-deploy --force --no-history
- -
- name: Upload artifact
+ uv run \
+ --python ${{ steps.setup-python.outputs.python-version }} \
+ --dev \
+ --frozen \
+ mkdocs gh-deploy --force --no-history
+ - name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: documentation
path: site/
retention-days: 7
-
tests-backend:
name: "Backend Tests (Python ${{ matrix.python-version }})"
runs-on: ubuntu-24.04
@@ -103,107 +89,105 @@ jobs:
python-version: ['3.10', '3.11', '3.12']
fail-fast: false
steps:
- -
- name: Checkout
+ - name: Checkout
uses: actions/checkout@v4
- -
- name: Start containers
+ - name: Start containers
run: |
docker compose --file ${{ github.workspace }}/docker/compose/docker-compose.ci-test.yml pull --quiet
docker compose --file ${{ github.workspace }}/docker/compose/docker-compose.ci-test.yml up --detach
- -
- name: Set up Python
+ - name: Set up Python
id: setup-python
uses: actions/setup-python@v5
with:
python-version: "${{ matrix.python-version }}"
- cache: "pipenv"
- cache-dependency-path: 'Pipfile.lock'
- -
- name: Install pipenv
- run: |
- pip install --user pipenv==${{ env.DEFAULT_PIP_ENV_VERSION }}
- -
- name: Install system dependencies
+ - name: Install uv
+ uses: astral-sh/setup-uv@v6
+ with:
+ version: ${{ env.DEFAULT_UV_VERSION }}
+ enable-cache: true
+ python-version: ${{ steps.setup-python.outputs.python-version }}
+ - name: Install system dependencies
run: |
sudo apt-get update -qq
sudo apt-get install -qq --no-install-recommends unpaper tesseract-ocr imagemagick ghostscript libzbar0 poppler-utils
- -
- name: Configure ImageMagick
+ - name: Configure ImageMagick
run: |
sudo cp docker/rootfs/etc/ImageMagick-6/paperless-policy.xml /etc/ImageMagick-6/policy.xml
- -
- name: Install Python dependencies
+ - name: Install Python dependencies
run: |
- pipenv --python ${{ steps.setup-python.outputs.python-version }} run python --version
- pipenv --python ${{ steps.setup-python.outputs.python-version }} sync --dev
- -
- name: List installed Python dependencies
+ uv sync \
+ --python ${{ steps.setup-python.outputs.python-version }} \
+ --group testing \
+ --frozen
+ - name: List installed Python dependencies
run: |
- pipenv --python ${{ steps.setup-python.outputs.python-version }} run pip list
- -
- name: Tests
+ uv pip list
+ - name: Install or update NLTK dependencies
+ run: uv run python -m nltk.downloader punkt punkt_tab snowball_data stopwords -d ${{ env.NLTK_DATA }}
+ - name: Tests
env:
+ NLTK_DATA: ${{ env.NLTK_DATA }}
PAPERLESS_CI_TEST: 1
# Enable paperless_mail testing against real server
PAPERLESS_MAIL_TEST_HOST: ${{ secrets.TEST_MAIL_HOST }}
PAPERLESS_MAIL_TEST_USER: ${{ secrets.TEST_MAIL_USER }}
PAPERLESS_MAIL_TEST_PASSWD: ${{ secrets.TEST_MAIL_PASSWD }}
run: |
- cd src/
- pipenv --python ${{ steps.setup-python.outputs.python-version }} run pytest -ra
- -
- name: Upload coverage
- if: ${{ matrix.python-version == env.DEFAULT_PYTHON_VERSION }}
- uses: actions/upload-artifact@v4
+ uv run \
+ --python ${{ steps.setup-python.outputs.python-version }} \
+ --dev \
+ --frozen \
+ pytest
+ - name: Upload backend test results to Codecov
+ if: always()
+ uses: codecov/test-results-action@v1
with:
- name: backend-coverage-report
- path: src/coverage.xml
- retention-days: 7
- if-no-files-found: warn
- -
- name: Stop containers
+ token: ${{ secrets.CODECOV_TOKEN }}
+ flags: backend-python-${{ matrix.python-version }}
+ files: junit.xml
+ - name: Upload backend coverage to Codecov
+ uses: codecov/codecov-action@v5
+ with:
+ token: ${{ secrets.CODECOV_TOKEN }}
+ flags: backend-python-${{ matrix.python-version }}
+ files: coverage.xml
+ - name: Stop containers
if: always()
run: |
docker compose --file ${{ github.workspace }}/docker/compose/docker-compose.ci-test.yml logs
docker compose --file ${{ github.workspace }}/docker/compose/docker-compose.ci-test.yml down
-
- install-frontend-depedendencies:
+ install-frontend-dependencies:
name: "Install Frontend Dependencies"
runs-on: ubuntu-24.04
needs:
- pre-commit
steps:
- uses: actions/checkout@v4
- -
- name: Use Node.js 20
+ - name: Install pnpm
+ uses: pnpm/action-setup@v4
+ with:
+ version: 10
+ - name: Use Node.js 20
uses: actions/setup-node@v4
with:
node-version: 20.x
- cache: 'npm'
- cache-dependency-path: 'src-ui/package-lock.json'
+ cache: 'pnpm'
+ cache-dependency-path: 'src-ui/pnpm-lock.yaml'
- name: Cache frontend dependencies
id: cache-frontend-deps
uses: actions/cache@v4
with:
path: |
- ~/.npm
+ ~/.pnpm-store
~/.cache
- key: ${{ runner.os }}-frontenddeps-${{ hashFiles('src-ui/package-lock.json') }}
- -
- name: Install dependencies
- if: steps.cache-frontend-deps.outputs.cache-hit != 'true'
- run: cd src-ui && npm ci
- -
- name: Install Playwright
- if: steps.cache-frontend-deps.outputs.cache-hit != 'true'
- run: cd src-ui && npx playwright install --with-deps
-
+ key: ${{ runner.os }}-frontenddeps-${{ hashFiles('src-ui/pnpm-lock.yaml') }}
+ - name: Install dependencies
+ run: cd src-ui && pnpm install
tests-frontend:
- name: "Frontend Tests (Node ${{ matrix.node-version }} - ${{ matrix.shard-index }}/${{ matrix.shard-count }})"
+ name: "Frontend Unit Tests (Node ${{ matrix.node-version }} - ${{ matrix.shard-index }}/${{ matrix.shard-count }})"
runs-on: ubuntu-24.04
needs:
- - install-frontend-depedendencies
+ - install-frontend-dependencies
strategy:
fail-fast: false
matrix:
@@ -212,138 +196,136 @@ jobs:
shard-count: [4]
steps:
- uses: actions/checkout@v4
- -
- name: Use Node.js 20
+ - name: Install pnpm
+ uses: pnpm/action-setup@v4
+ with:
+ version: 10
+ - name: Use Node.js 20
uses: actions/setup-node@v4
with:
node-version: 20.x
- cache: 'npm'
- cache-dependency-path: 'src-ui/package-lock.json'
+ cache: 'pnpm'
+ cache-dependency-path: 'src-ui/pnpm-lock.yaml'
- name: Cache frontend dependencies
id: cache-frontend-deps
uses: actions/cache@v4
with:
path: |
- ~/.npm
+ ~/.pnpm-store
~/.cache
- key: ${{ runner.os }}-frontenddeps-${{ hashFiles('src-ui/package-lock.json') }}
+ key: ${{ runner.os }}-frontenddeps-${{ hashFiles('src-ui/pnpm-lock.yaml') }}
- name: Re-link Angular cli
- run: cd src-ui && npm link @angular/cli
- -
- name: Linting checks
- run: cd src-ui && npm run lint
- -
- name: Run Jest unit tests
- run: cd src-ui && npm run test -- --max-workers=2 --shard=${{ matrix.shard-index }}/${{ matrix.shard-count }}
- -
- name: Upload Jest coverage
+ run: cd src-ui && pnpm link @angular/cli
+ - name: Linting checks
+ run: cd src-ui && pnpm run lint
+ - name: Run Jest unit tests
+ run: cd src-ui && pnpm run test --max-workers=2 --shard=${{ matrix.shard-index }}/${{ matrix.shard-count }}
+ - name: Upload frontend test results to Codecov
+ uses: codecov/test-results-action@v1
if: always()
- uses: actions/upload-artifact@v4
with:
- name: jest-coverage-report-${{ matrix.shard-index }}
- path: |
- src-ui/coverage/coverage-final.json
- src-ui/coverage/lcov.info
- src-ui/coverage/clover.xml
- retention-days: 7
- if-no-files-found: warn
- -
- name: Run Playwright e2e tests
- run: cd src-ui && npx playwright test --shard ${{ matrix.shard-index }}/${{ matrix.shard-count }}
- -
- name: Upload Playwright test results
- if: always()
- uses: actions/upload-artifact@v4
+ token: ${{ secrets.CODECOV_TOKEN }}
+ flags: frontend-node-${{ matrix.node-version }}
+ directory: src-ui/
+ - name: Upload frontend coverage to Codecov
+ uses: codecov/codecov-action@v5
with:
- name: playwright-report-${{ matrix.shard-index }}
- path: src-ui/playwright-report
- retention-days: 7
-
- tests-coverage-upload:
- name: "Upload to Codecov"
+ token: ${{ secrets.CODECOV_TOKEN }}
+ flags: frontend-node-${{ matrix.node-version }}
+ directory: src-ui/coverage/
+ tests-frontend-e2e:
+ name: "Frontend E2E Tests (Node ${{ matrix.node-version }} - ${{ matrix.shard-index }}/${{ matrix.shard-count }})"
runs-on: ubuntu-24.04
needs:
- - tests-backend
- - tests-frontend
+ - install-frontend-dependencies
+ strategy:
+ fail-fast: false
+ matrix:
+ node-version: [20.x]
+ shard-index: [1, 2]
+ shard-count: [2]
steps:
- -
- uses: actions/checkout@v4
- -
- name: Download frontend jest coverage
- uses: actions/download-artifact@v4
+ - uses: actions/checkout@v4
+ - name: Install pnpm
+ uses: pnpm/action-setup@v4
with:
- path: src-ui/coverage/
- pattern: jest-coverage-report-*
- -
- name: Download frontend playwright coverage
- uses: actions/download-artifact@v4
- with:
- path: src-ui/coverage/
- pattern: playwright-report-*
- merge-multiple: true
- -
- name: Upload frontend coverage to Codecov
- uses: codecov/codecov-action@v5
- with:
- # not required for public repos, but intermittently fails otherwise
- token: ${{ secrets.CODECOV_TOKEN }}
- flags: frontend
- directory: src-ui/coverage/
- # dont include backend coverage files here
- files: '!coverage.xml'
- -
- name: Download backend coverage
- uses: actions/download-artifact@v4
- with:
- name: backend-coverage-report
- path: src/
- -
- name: Upload coverage to Codecov
- uses: codecov/codecov-action@v5
- with:
- # not required for public repos, but intermittently fails otherwise
- token: ${{ secrets.CODECOV_TOKEN }}
- # future expansion
- flags: backend
- directory: src/
- -
- name: Use Node.js 20
+ version: 10
+ - name: Use Node.js 20
uses: actions/setup-node@v4
with:
node-version: 20.x
- cache: 'npm'
- cache-dependency-path: 'src-ui/package-lock.json'
- -
- name: Cache frontend dependencies
+ cache: 'pnpm'
+ cache-dependency-path: 'src-ui/pnpm-lock.yaml'
+ - name: Cache frontend dependencies
id: cache-frontend-deps
uses: actions/cache@v4
with:
path: |
- ~/.npm
+ ~/.pnpm-store
+ ~/.cache
+ key: ${{ runner.os }}-frontenddeps-${{ hashFiles('src-ui/pnpm-lock.yaml') }}
+ - name: Re-link Angular cli
+ run: cd src-ui && pnpm link @angular/cli
+ - name: Cache Playwright browsers
+ uses: actions/cache@v4
+ with:
+ path: ~/.cache/ms-playwright
+ key: ${{ runner.os }}-playwright-${{ hashFiles('src-ui/pnpm-lock.yaml') }}
+ restore-keys: |
+ ${{ runner.os }}-playwright-
+ - name: Install Playwright system dependencies
+ run: npx playwright install-deps
+ - name: Install dependencies
+ run: cd src-ui && pnpm install --no-frozen-lockfile
+ - name: Install Playwright
+ run: cd src-ui && pnpm exec playwright install
+ - name: Run Playwright e2e tests
+ run: cd src-ui && pnpm exec playwright test --shard ${{ matrix.shard-index }}/${{ matrix.shard-count }}
+ frontend-bundle-analysis:
+ name: "Frontend Bundle Analysis"
+ runs-on: ubuntu-24.04
+ needs:
+ - tests-frontend
+ - tests-frontend-e2e
+ steps:
+ - uses: actions/checkout@v4
+ - name: Install pnpm
+ uses: pnpm/action-setup@v4
+ with:
+ version: 10
+ - name: Use Node.js 20
+ uses: actions/setup-node@v4
+ with:
+ node-version: 20.x
+ cache: 'pnpm'
+ cache-dependency-path: 'src-ui/pnpm-lock.yaml'
+ - name: Cache frontend dependencies
+ id: cache-frontend-deps
+ uses: actions/cache@v4
+ with:
+ path: |
+ ~/.pnpm-store
~/.cache
key: ${{ runner.os }}-frontenddeps-${{ hashFiles('src-ui/package-lock.json') }}
- -
- name: Re-link Angular cli
- run: cd src-ui && npm link @angular/cli
- -
- name: Build frontend and upload analysis
+ - name: Re-link Angular cli
+ run: cd src-ui && pnpm link @angular/cli
+ - name: Build frontend and upload analysis
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
- run: cd src-ui && ng build --configuration=production
-
+ run: cd src-ui && pnpm run build --configuration=production
build-docker-image:
name: Build Docker image for ${{ github.ref_name }}
runs-on: ubuntu-24.04
- if: github.event_name == 'push' && (startsWith(github.ref, 'refs/heads/feature-') || startsWith(github.ref, 'refs/heads/fix-') || github.ref == 'refs/heads/dev' || github.ref == 'refs/heads/beta' || contains(github.ref, 'beta.rc') || startsWith(github.ref, 'refs/tags/v'))
+ if: github.event_name == 'push' && (startsWith(github.ref, 'refs/heads/feature-') || startsWith(github.ref, 'refs/heads/fix-') || github.ref == 'refs/heads/dev' || github.ref == 'refs/heads/beta' || contains(github.ref, 'beta.rc') || startsWith(github.ref, 'refs/tags/v') || startsWith(github.ref, 'refs/heads/l10n_'))
concurrency:
group: ${{ github.workflow }}-build-docker-image-${{ github.ref_name }}
cancel-in-progress: true
needs:
- tests-backend
- tests-frontend
+ - tests-frontend-e2e
steps:
- -
- name: Check pushing to Docker Hub
+ - name: Check pushing to Docker Hub
id: push-other-places
# Only push to Dockerhub from the main repo AND the ref is either:
# main
@@ -359,15 +341,13 @@ jobs:
echo "Not pushing to DockerHub"
echo "enable=false" >> $GITHUB_OUTPUT
fi
- -
- name: Set ghcr repository name
+ - name: Set ghcr repository name
id: set-ghcr-repository
run: |
ghcr_name=$(echo "${{ github.repository }}" | awk '{ print tolower($0) }')
echo "Name is ${ghcr_name}"
echo "ghcr-repository=${ghcr_name}" >> $GITHUB_OUTPUT
- -
- name: Gather Docker metadata
+ - name: Gather Docker metadata
id: docker-meta
uses: docker/metadata-action@v5
with:
@@ -382,37 +362,31 @@ jobs:
# For a tag x.y.z or vX.Y.Z, output an x.y.z and x.y image tag
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
- -
- name: Checkout
+ - name: Checkout
uses: actions/checkout@v4
# If https://github.com/docker/buildx/issues/1044 is resolved,
# the append input with a native arm64 arch could be used to
# significantly speed up building
- -
- name: Set up Docker Buildx
+ - name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- -
- name: Set up QEMU
+ - name: Set up QEMU
uses: docker/setup-qemu-action@v3
with:
platforms: arm64
- -
- name: Login to GitHub Container Registry
+ - name: Login to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- -
- name: Login to Docker Hub
+ - name: Login to Docker Hub
uses: docker/login-action@v3
# Don't attempt to login if not pushing to Docker Hub
if: steps.push-other-places.outputs.enable == 'true'
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- -
- name: Login to Quay.io
+ - name: Login to Quay.io
uses: docker/login-action@v3
# Don't attempt to login if not pushing to Quay.io
if: steps.push-other-places.outputs.enable == 'true'
@@ -420,8 +394,7 @@ jobs:
registry: quay.io
username: ${{ secrets.QUAY_USERNAME }}
password: ${{ secrets.QUAY_ROBOT_TOKEN }}
- -
- name: Build and push
+ - name: Build and push
uses: docker/build-push-action@v6
with:
context: .
@@ -439,23 +412,19 @@ jobs:
type=registry,ref=ghcr.io/${{ steps.set-ghcr-repository.outputs.ghcr-repository }}/builder/cache/app:dev
cache-to: |
type=registry,mode=max,ref=ghcr.io/${{ steps.set-ghcr-repository.outputs.ghcr-repository }}/builder/cache/app:${{ github.ref_name }}
- -
- name: Inspect image
+ - name: Inspect image
run: |
docker buildx imagetools inspect ${{ fromJSON(steps.docker-meta.outputs.json).tags[0] }}
- -
- name: Export frontend artifact from docker
+ - name: Export frontend artifact from docker
run: |
docker create --name frontend-extract ${{ fromJSON(steps.docker-meta.outputs.json).tags[0] }}
docker cp frontend-extract:/usr/src/paperless/src/documents/static/frontend src/documents/static/frontend/
- -
- name: Upload frontend artifact
+ - name: Upload frontend artifact
uses: actions/upload-artifact@v4
with:
name: frontend-compiled
path: src/documents/static/frontend/
retention-days: 7
-
build-release:
name: "Build Release"
needs:
@@ -463,58 +432,52 @@ jobs:
- documentation
runs-on: ubuntu-24.04
steps:
- -
- name: Checkout
+ - name: Checkout
uses: actions/checkout@v4
- -
- name: Set up Python
+ - name: Set up Python
id: setup-python
uses: actions/setup-python@v5
with:
python-version: ${{ env.DEFAULT_PYTHON_VERSION }}
- cache: "pipenv"
- cache-dependency-path: 'Pipfile.lock'
- -
- name: Install pipenv + tools
+ - name: Install uv
+ uses: astral-sh/setup-uv@v6
+ with:
+ version: ${{ env.DEFAULT_UV_VERSION }}
+ enable-cache: true
+ python-version: ${{ steps.setup-python.outputs.python-version }}
+ - name: Install Python dependencies
run: |
- pip install --upgrade --user pipenv==${{ env.DEFAULT_PIP_ENV_VERSION }} setuptools wheel
- -
- name: Install Python dependencies
- run: |
- pipenv --python ${{ steps.setup-python.outputs.python-version }} sync --dev
- -
- name: Install system dependencies
+ uv sync --python ${{ steps.setup-python.outputs.python-version }} --dev --frozen
+ - name: Install system dependencies
run: |
sudo apt-get update -qq
sudo apt-get install -qq --no-install-recommends gettext liblept5
- -
- name: Download frontend artifact
+ - name: Download frontend artifact
uses: actions/download-artifact@v4
with:
name: frontend-compiled
path: src/documents/static/frontend/
- -
- name: Download documentation artifact
+ - name: Download documentation artifact
uses: actions/download-artifact@v4
with:
name: documentation
path: docs/_build/html/
- -
- name: Generate requirements file
+ - name: Generate requirements file
run: |
- pipenv --python ${{ steps.setup-python.outputs.python-version }} requirements > requirements.txt
- -
- name: Compile messages
+ uv export --quiet --no-dev --all-extras --format requirements-txt --output-file requirements.txt
+ - name: Compile messages
run: |
cd src/
- pipenv --python ${{ steps.setup-python.outputs.python-version }} run python3 manage.py compilemessages
- -
- name: Collect static files
+ uv run \
+ --python ${{ steps.setup-python.outputs.python-version }} \
+ manage.py compilemessages
+ - name: Collect static files
run: |
cd src/
- pipenv --python ${{ steps.setup-python.outputs.python-version }} run python3 manage.py collectstatic --no-input
- -
- name: Move files
+ uv run \
+ --python ${{ steps.setup-python.outputs.python-version }} \
+ manage.py collectstatic --no-input
+ - name: Move files
run: |
echo "Making dist folders"
for directory in dist \
@@ -528,13 +491,12 @@ jobs:
for file_name in .dockerignore \
.env \
Dockerfile \
- Pipfile \
- Pipfile.lock \
+ pyproject.toml \
+ uv.lock \
requirements.txt \
LICENSE \
README.md \
- paperless.conf.example \
- gunicorn.conf.py
+ paperless.conf.example
do
cp --verbose ${file_name} dist/paperless-ngx/
done
@@ -552,21 +514,18 @@ jobs:
cp --recursive docs/_build/html/ dist/paperless-ngx/docs
mv --verbose static dist/paperless-ngx
- -
- name: Make release package
+ - name: Make release package
run: |
echo "Creating release archive"
cd dist
sudo chown -R 1000:1000 paperless-ngx/
tar -cJf paperless-ngx.tar.xz paperless-ngx/
- -
- name: Upload release artifact
+ - name: Upload release artifact
uses: actions/upload-artifact@v4
with:
name: release
path: dist/paperless-ngx.tar.xz
retention-days: 7
-
publish-release:
name: "Publish Release"
runs-on: ubuntu-24.04
@@ -578,14 +537,12 @@ jobs:
- build-release
if: github.ref_type == 'tag' && (startsWith(github.ref_name, 'v') || contains(github.ref_name, '-beta.rc'))
steps:
- -
- name: Download release artifact
+ - name: Download release artifact
uses: actions/download-artifact@v4
with:
name: release
path: ./
- -
- name: Get version
+ - name: Get version
id: get_version
run: |
echo "version=${{ github.ref_name }}" >> $GITHUB_OUTPUT
@@ -594,8 +551,7 @@ jobs:
else
echo "prerelease=false" >> $GITHUB_OUTPUT
fi
- -
- name: Create Release and Changelog
+ - name: Create Release and Changelog
id: create-release
uses: release-drafter/release-drafter@v6
with:
@@ -606,8 +562,7 @@ jobs:
publish: true # ensures release is not marked as draft
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- -
- name: Upload release archive
+ - name: Upload release archive
id: upload-release-asset
uses: shogo82148/actions-upload-release-asset@v1
with:
@@ -616,7 +571,6 @@ jobs:
asset_path: ./paperless-ngx.tar.xz
asset_name: paperless-ngx-${{ steps.get_version.outputs.version }}.tar.xz
asset_content_type: application/x-xz
-
append-changelog:
name: "Append Changelog"
runs-on: ubuntu-24.04
@@ -624,24 +578,22 @@ jobs:
- publish-release
if: needs.publish-release.outputs.prerelease == 'false'
steps:
- -
- name: Checkout
+ - name: Checkout
uses: actions/checkout@v4
with:
ref: main
- -
- name: Set up Python
+ - name: Set up Python
+ id: setup-python
uses: actions/setup-python@v5
with:
python-version: ${{ env.DEFAULT_PYTHON_VERSION }}
- cache: "pipenv"
- cache-dependency-path: 'Pipfile.lock'
- -
- name: Install pipenv + tools
- run: |
- pip install --upgrade --user pipenv==${{ env.DEFAULT_PIP_ENV_VERSION }} setuptools wheel
- -
- name: Append Changelog to docs
+ - name: Install uv
+ uses: astral-sh/setup-uv@v6
+ with:
+ version: ${{ env.DEFAULT_UV_VERSION }}
+ enable-cache: true
+ python-version: ${{ env.DEFAULT_PYTHON_VERSION }}
+ - name: Append Changelog to docs
id: append-Changelog
working-directory: docs
run: |
@@ -655,13 +607,15 @@ jobs:
CURRENT_CHANGELOG=`tail --lines +2 changelog.md`
echo -e "$CURRENT_CHANGELOG" >> changelog-new.md
mv changelog-new.md changelog.md
- pipenv run pre-commit run --files changelog.md || true
+ uv run \
+ --python ${{ steps.setup-python.outputs.python-version }} \
+ --dev \
+ pre-commit run --files changelog.md || true
git config --global user.name "github-actions"
git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com"
git commit -am "Changelog ${{ needs.publish-release.outputs.version }} - GHA"
git push origin ${{ needs.publish-release.outputs.version }}-changelog
- -
- name: Create Pull Request
+ - name: Create Pull Request
uses: actions/github-script@v7
with:
script: |
diff --git a/.github/workflows/cleanup-tags.yml b/.github/workflows/cleanup-tags.yml
index 5d2c32984..0fe9cca1e 100644
--- a/.github/workflows/cleanup-tags.yml
+++ b/.github/workflows/cleanup-tags.yml
@@ -4,19 +4,15 @@
# Requires a PAT with the correct scope set in the secrets.
#
# This workflow will not trigger runs on forked repos.
-
name: Cleanup Image Tags
-
on:
delete:
push:
paths:
- ".github/workflows/cleanup-tags.yml"
-
concurrency:
group: registry-tags-cleanup
cancel-in-progress: false
-
jobs:
cleanup-images:
name: Cleanup Image Tags for ${{ matrix.primary-name }}
@@ -30,10 +26,9 @@ jobs:
# Requires a personal access token with the OAuth scope delete:packages
TOKEN: ${{ secrets.GHA_CONTAINER_DELETE_TOKEN }}
steps:
- -
- name: Clean temporary images
+ - name: Clean temporary images
if: "${{ env.TOKEN != '' }}"
- uses: stumpylog/image-cleaner-action/ephemeral@v0.9.0
+ uses: stumpylog/image-cleaner-action/ephemeral@v0.10.0
with:
token: "${{ env.TOKEN }}"
owner: "${{ github.repository_owner }}"
@@ -43,7 +38,6 @@ jobs:
repo_name: "paperless-ngx"
match_regex: "(feature|fix)"
do_delete: "true"
-
cleanup-untagged-images:
name: Cleanup Untagged Images Tags for ${{ matrix.primary-name }}
if: github.repository_owner == 'paperless-ngx'
@@ -58,10 +52,9 @@ jobs:
# Requires a personal access token with the OAuth scope delete:packages
TOKEN: ${{ secrets.GHA_CONTAINER_DELETE_TOKEN }}
steps:
- -
- name: Clean untagged images
+ - name: Clean untagged images
if: "${{ env.TOKEN != '' }}"
- uses: stumpylog/image-cleaner-action/untagged@v0.9.0
+ uses: stumpylog/image-cleaner-action/untagged@v0.10.0
with:
token: "${{ env.TOKEN }}"
owner: "${{ github.repository_owner }}"
diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml
index cdc0e7d6d..0be68b3ed 100644
--- a/.github/workflows/codeql-analysis.yml
+++ b/.github/workflows/codeql-analysis.yml
@@ -10,16 +10,14 @@
# supported CodeQL languages.
#
name: "CodeQL"
-
on:
push:
- branches: [ main, dev ]
+ branches: [main, dev]
pull_request:
# The branches below must be a subset of the branches above
- branches: [ dev ]
+ branches: [dev]
schedule:
- cron: '28 13 * * 5'
-
jobs:
analyze:
name: Analyze
@@ -28,27 +26,23 @@ jobs:
actions: read
contents: read
security-events: write
-
strategy:
fail-fast: false
matrix:
- language: [ 'javascript', 'python' ]
+ language: ['javascript', 'python']
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
# Learn more about CodeQL language support at https://git.io/codeql-language-support
-
steps:
- - name: Checkout repository
- uses: actions/checkout@v4
-
- # Initializes the CodeQL tools for scanning.
- - name: Initialize CodeQL
- uses: github/codeql-action/init@v3
- with:
- languages: ${{ matrix.language }}
- # If you wish to specify custom queries, you can do so here or in a config file.
- # By default, queries listed here will override any specified in a config file.
- # Prefix the list here with "+" to use these queries and those in the config file.
- # queries: ./path/to/local/query, your-org/your-repo/queries@main
-
- - name: Perform CodeQL Analysis
- uses: github/codeql-action/analyze@v3
+ - name: Checkout repository
+ uses: actions/checkout@v4
+ # Initializes the CodeQL tools for scanning.
+ - name: Initialize CodeQL
+ uses: github/codeql-action/init@v3
+ with:
+ languages: ${{ matrix.language }}
+ # If you wish to specify custom queries, you can do so here or in a config file.
+ # By default, queries listed here will override any specified in a config file.
+ # Prefix the list here with "+" to use these queries and those in the config file.
+ # queries: ./path/to/local/query, your-org/your-repo/queries@main
+ - name: Perform CodeQL Analysis
+ uses: github/codeql-action/analyze@v3
diff --git a/.github/workflows/crowdin.yml b/.github/workflows/crowdin.yml
index 308b646d7..152c2def1 100644
--- a/.github/workflows/crowdin.yml
+++ b/.github/workflows/crowdin.yml
@@ -1,35 +1,30 @@
name: Crowdin Action
-
on:
workflow_dispatch:
schedule:
- cron: '2 */12 * * *'
push:
- paths: [
- 'src/locale/**',
- 'src-ui/messages.xlf',
- 'src-ui/src/locale/**'
- ]
- branches: [ dev ]
-
+ paths: ['src/locale/**', 'src-ui/messages.xlf', 'src-ui/src/locale/**']
+ branches: [dev]
jobs:
synchronize-with-crowdin:
name: Crowdin Sync
if: github.repository_owner == 'paperless-ngx'
runs-on: ubuntu-24.04
-
steps:
- - name: Checkout
- uses: actions/checkout@v4
- - name: crowdin action
- uses: crowdin/github-action@v2
- with:
- upload_translations: false
- download_translations: true
- crowdin_branch_name: 'dev'
- localization_branch_name: l10n_dev
- pull_request_labels: 'skip-changelog, translation'
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }}
- CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }}
+ - name: Checkout
+ uses: actions/checkout@v4
+ with:
+ token: ${{ secrets.PNGX_BOT_PAT }}
+ - name: crowdin action
+ uses: crowdin/github-action@v2
+ with:
+ upload_translations: false
+ download_translations: true
+ crowdin_branch_name: 'dev'
+ localization_branch_name: l10n_dev
+ pull_request_labels: 'skip-changelog, translation'
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }}
+ CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }}
diff --git a/.github/workflows/pr-bot.yml b/.github/workflows/pr-bot.yml
new file mode 100644
index 000000000..5a5ff6ea9
--- /dev/null
+++ b/.github/workflows/pr-bot.yml
@@ -0,0 +1,112 @@
+name: PR Bot
+on:
+ pull_request_target:
+ types: [opened]
+permissions:
+ contents: read
+ pull-requests: write
+jobs:
+ pr-bot:
+ name: Automated PR Bot
+ runs-on: ubuntu-latest
+ steps:
+ - name: Label PR by file path or branch name
+ # see .github/labeler.yml for the labeler config
+ uses: actions/labeler@v5
+ with:
+ repo-token: ${{ secrets.GITHUB_TOKEN }}
+ - name: Label by size
+ uses: Gascon1/pr-size-labeler@v1.3.0
+ with:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ xs_label: 'small-change'
+ xs_diff: '9'
+ s_label: 'non-trivial'
+ s_diff: '99999'
+ fail_if_xl: 'false'
+ excluded_files: /\.lock$/ /\.txt$/ ^src-ui/pnpm-lock\.yaml$ ^src-ui/messages\.xlf$ ^src/locale/en_US/LC_MESSAGES/django\.po$
+ - name: Label by PR title
+ uses: actions/github-script@v7
+ with:
+ script: |
+ const pr = context.payload.pull_request;
+ const title = pr.title.toLowerCase();
+ const labels = [];
+
+ if (/^(fix|bugfix)/i.test(title)) {
+ labels.push('bug');
+ } else if (/^feature/i.test(title)) {
+ labels.push('enhancement');
+ } else if (!/^(dependabot)/i.test(title)) {
+ labels.push('enhancement'); // Default fallback
+ }
+
+ if (labels.length) {
+ await github.rest.issues.addLabels({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ issue_number: pr.number,
+ labels,
+ });
+ core.info(`Added labels based on title: ${labels.join(', ')}`);
+ }
+ - name: Label bot-generated PRs
+ if: ${{ contains(github.actor, 'dependabot') || contains(github.actor, 'crowdin-bot') }}
+ uses: actions/github-script@v7
+ with:
+ script: |
+ const pr = context.payload.pull_request;
+ const user = pr.user.login.toLowerCase();
+ const labels = [];
+
+ if (user.includes('dependabot')) {
+ labels.push('dependencies');
+ }
+
+ if (user.includes('crowdin-bot')) {
+ labels.push('translation', 'skip-changelog');
+ }
+
+ if (labels.length) {
+ await github.rest.issues.addLabels({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ issue_number: pr.number,
+ labels,
+ });
+ }
+ - name: Welcome comment
+ if: ${{ !contains(github.actor, 'bot') }}
+ uses: actions/github-script@v7
+ with:
+ script: |
+ const pr = context.payload.pull_request;
+ const user = pr.user.login;
+
+ const { data: members } = await github.rest.orgs.listMembers({
+ org: 'paperless-ngx',
+ });
+
+ const memberLogins = members.map(m => m.login.toLowerCase());
+ if (memberLogins.includes(user.toLowerCase())) {
+ core.info('Skipping comment: user is org member');
+ return;
+ }
+
+ const body =
+ "Hello @" + user + ",\n\n" +
+ "Thank you very much for submitting this PR to us!\n\n" +
+ "This is what will happen next:\n\n" +
+ "1. CI tests will run against your PR to ensure quality and consistency.\n" +
+ "2. Next, human contributors from paperless-ngx review your changes.\n" +
+ "3. Please address any issues that come up during the review as soon as you are able to.\n" +
+ "4. If accepted, your pull request will be merged into the `dev` branch and changes there will be tested further.\n" +
+ "5. Eventually, changes from you and other contributors will be merged into `main` and a new release will be made.\n\n" +
+ "You'll be hearing from us soon, and thank you again for contributing to our project.";
+
+ await github.rest.issues.createComment({
+ issue_number: pr.number,
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ body,
+ });
diff --git a/.github/workflows/project-actions.yml b/.github/workflows/project-actions.yml
index aa6ad2d38..ed27a0255 100644
--- a/.github/workflows/project-actions.yml
+++ b/.github/workflows/project-actions.yml
@@ -1,5 +1,4 @@
name: Project Automations
-
on:
pull_request_target: #_target allows access to secrets
types:
@@ -8,10 +7,8 @@ on:
branches:
- main
- dev
-
permissions:
contents: read
-
jobs:
pr_opened_or_reopened:
name: pr_opened_or_reopened
diff --git a/.github/workflows/repo-maintenance.yml b/.github/workflows/repo-maintenance.yml
index 930b2a7b5..0cfc57938 100644
--- a/.github/workflows/repo-maintenance.yml
+++ b/.github/workflows/repo-maintenance.yml
@@ -1,18 +1,14 @@
name: 'Repository Maintenance'
-
on:
schedule:
- cron: '0 3 * * *'
workflow_dispatch:
-
permissions:
issues: write
pull-requests: write
discussions: write
-
concurrency:
group: lock
-
jobs:
stale:
name: 'Stale'
@@ -23,13 +19,19 @@ jobs:
with:
days-before-stale: 7
days-before-close: 14
- any-of-labels: 'stale,cant-reproduce,not a bug'
+ any-of-issue-labels: 'cant-reproduce,not a bug'
stale-issue-label: stale
- stale-pr-label: stale
stale-issue-message: >
- This issue has been automatically marked as stale because it has not had
- recent activity. It will be closed if no further activity occurs. Thank you
- for your contributions. See our [contributing guidelines](https://github.com/paperless-ngx/paperless-ngx/blob/dev/CONTRIBUTING.md#automatic-repository-maintenance) for more details.
+ This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions. See our [contributing guidelines](https://github.com/paperless-ngx/paperless-ngx/blob/dev/CONTRIBUTING.md#automatic-repository-maintenance) for more details.
+
+ days-before-pr-stale: 14
+ days-before-pr-close: 7
+ stale-pr-message: ""
+ stale-pr-label: stale
+ exempt-pr-labels: 'notable'
+ close-pr-message: >
+ This pull request has been automatically closed because it has not had recent activity. Thank you for your contributions. Please open a new pull request or discussion if you would like to continue working on this change.
+
lock-threads:
name: 'Lock Old Threads'
if: github.repository_owner == 'paperless-ngx'
@@ -42,20 +44,14 @@ jobs:
discussion-inactive-days: '30'
log-output: true
issue-comment: >
- This issue has been automatically locked since there
- has not been any recent activity after it was closed.
- Please open a new discussion or issue for related concerns.
- See our [contributing guidelines](https://github.com/paperless-ngx/paperless-ngx/blob/dev/CONTRIBUTING.md#automatic-repository-maintenance) for more details.
+ This issue has been automatically locked since there has not been any recent activity after it was closed. Please open a new discussion or issue for related concerns. See our [contributing guidelines](https://github.com/paperless-ngx/paperless-ngx/blob/dev/CONTRIBUTING.md#automatic-repository-maintenance) for more details.
+
pr-comment: >
- This pull request has been automatically locked since there
- has not been any recent activity after it was closed.
- Please open a new discussion or issue for related concerns.
- See our [contributing guidelines](https://github.com/paperless-ngx/paperless-ngx/blob/dev/CONTRIBUTING.md#automatic-repository-maintenance) for more details.
+ This pull request has been automatically locked since there has not been any recent activity after it was closed. Please open a new discussion or issue for related concerns. See our [contributing guidelines](https://github.com/paperless-ngx/paperless-ngx/blob/dev/CONTRIBUTING.md#automatic-repository-maintenance) for more details.
+
discussion-comment: >
- This discussion has been automatically locked since there
- has not been any recent activity after it was closed.
- Please open a new discussion for related concerns.
- See our [contributing guidelines](https://github.com/paperless-ngx/paperless-ngx/blob/dev/CONTRIBUTING.md#automatic-repository-maintenance) for more details.
+ This discussion has been automatically locked since there has not been any recent activity after it was closed. Please open a new discussion for related concerns. See our [contributing guidelines](https://github.com/paperless-ngx/paperless-ngx/blob/dev/CONTRIBUTING.md#automatic-repository-maintenance) for more details.
+
close-answered-discussions:
name: 'Close Answered Discussions'
if: github.repository_owner == 'paperless-ngx'
diff --git a/.github/workflows/translate-strings.yml b/.github/workflows/translate-strings.yml
new file mode 100644
index 000000000..e2c99054a
--- /dev/null
+++ b/.github/workflows/translate-strings.yml
@@ -0,0 +1,69 @@
+name: Generate Translation Strings
+on:
+ push:
+ branches:
+ - dev
+jobs:
+ generate-translate-strings:
+ name: Generate Translation Strings
+ runs-on: ubuntu-latest
+ permissions:
+ contents: write
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+ with:
+ token: ${{ secrets.PNGX_BOT_PAT }}
+ ref: ${{ github.head_ref }}
+ - name: Set up Python
+ id: setup-python
+ uses: actions/setup-python@v5
+ - name: Install system dependencies
+ run: |
+ sudo apt-get update -qq
+ sudo apt-get install -qq --no-install-recommends gettext
+ - name: Install uv
+ uses: astral-sh/setup-uv@v6
+ with:
+ enable-cache: true
+ - name: Install backend python dependencies
+ run: |
+ uv sync \
+ --group dev \
+ --frozen
+ - name: Generate backend translation strings
+ run: cd src/ && uv run manage.py makemessages -l en_US -i "samples*"
+ - name: Install pnpm
+ uses: pnpm/action-setup@v4
+ with:
+ version: 10
+ - name: Use Node.js 20
+ uses: actions/setup-node@v4
+ with:
+ node-version: 20.x
+ cache: 'pnpm'
+ cache-dependency-path: 'src-ui/pnpm-lock.yaml'
+ - name: Cache frontend dependencies
+ id: cache-frontend-deps
+ uses: actions/cache@v4
+ with:
+ path: |
+ ~/.pnpm-store
+ ~/.cache
+ key: ${{ runner.os }}-frontenddeps-${{ hashFiles('src-ui/pnpm-lock.yaml') }}
+ - name: Install frontend dependencies
+ if: steps.cache-frontend-deps.outputs.cache-hit != 'true'
+ run: cd src-ui && pnpm install
+ - name: Re-link Angular cli
+ run: cd src-ui && pnpm link @angular/cli
+ - name: Generate frontend translation strings
+ run: |
+ cd src-ui
+ pnpm run ng extract-i18n
+ - name: Commit changes
+ uses: stefanzweifel/git-auto-commit-action@v6
+ with:
+ file_pattern: 'src-ui/messages.xlf src/locale/en_US/LC_MESSAGES/django.po'
+ commit_message: "Auto translate strings"
+ commit_user_name: "GitHub Actions"
+ commit_author: "GitHub Actions <41898282+github-actions[bot]@users.noreply.github.com>"
diff --git a/.gitignore b/.gitignore
index 0fd9d7bcd..452273705 100644
--- a/.gitignore
+++ b/.gitignore
@@ -44,6 +44,7 @@ nosetests.xml
coverage.xml
*,cover
.pytest_cache
+junit.xml
# Translations
*.mo
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 38edf91b5..93e38301e 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -1,7 +1,6 @@
# This file configures pre-commit hooks.
# See https://pre-commit.com/ for general information
# See https://pre-commit.com/hooks.html for a listing of possible hooks
-
repos:
# General hooks
- repo: https://github.com/pre-commit/pre-commit-hooks
@@ -29,35 +28,38 @@ repos:
- id: check-case-conflict
- id: detect-private-key
- repo: https://github.com/codespell-project/codespell
- rev: v2.4.0
+ rev: v2.4.1
hooks:
- id: codespell
- exclude: "(^src-ui/src/locale/)|(^src-ui/e2e/)|(^src/paperless_mail/tests/samples/)"
+ additional_dependencies: [tomli]
exclude_types:
- pofile
- json
# See https://github.com/prettier/prettier/issues/15742 for the fork reason
- repo: https://github.com/rbubley/mirrors-prettier
- rev: 'v3.3.3'
+ rev: 'v3.6.2'
hooks:
- id: prettier
types_or:
- javascript
- ts
- markdown
- exclude: "(^Pipfile\\.lock$)"
additional_dependencies:
- prettier@3.3.3
- 'prettier-plugin-organize-imports@4.1.0'
# Python hooks
- repo: https://github.com/astral-sh/ruff-pre-commit
- rev: v0.9.6
+ rev: v0.12.2
hooks:
- id: ruff
- id: ruff-format
+ - repo: https://github.com/tox-dev/pyproject-fmt
+ rev: "v2.6.0"
+ hooks:
+ - id: pyproject-fmt
# Dockerfile hooks
- repo: https://github.com/AleksaC/hadolint-py
- rev: v2.12.0.3
+ rev: v2.12.1b3
hooks:
- id: hadolint
# Shell script hooks
@@ -73,3 +75,8 @@ repos:
rev: "v0.10.0.1"
hooks:
- id: shellcheck
+ - repo: https://github.com/google/yamlfmt
+ rev: v0.17.2
+ hooks:
+ - id: yamlfmt
+ exclude: "^src-ui/pnpm-lock.yaml"
diff --git a/.python-version b/.python-version
deleted file mode 100644
index 8cc1b46f5..000000000
--- a/.python-version
+++ /dev/null
@@ -1 +0,0 @@
-3.10.15
diff --git a/.ruff.toml b/.ruff.toml
deleted file mode 100644
index ae1bed609..000000000
--- a/.ruff.toml
+++ /dev/null
@@ -1,87 +0,0 @@
-fix = true
-line-length = 88
-respect-gitignore = true
-src = ["src"]
-target-version = "py310"
-output-format = "grouped"
-show-fixes = true
-
-# https://docs.astral.sh/ruff/settings/
-# https://docs.astral.sh/ruff/rules/
-[lint]
-extend-select = [
- "W", # https://docs.astral.sh/ruff/rules/#pycodestyle-e-w
- "I", # https://docs.astral.sh/ruff/rules/#isort-i
- "UP", # https://docs.astral.sh/ruff/rules/#pyupgrade-up
- "COM", # https://docs.astral.sh/ruff/rules/#flake8-commas-com
- "DJ", # https://docs.astral.sh/ruff/rules/#flake8-django-dj
- "EXE", # https://docs.astral.sh/ruff/rules/#flake8-executable-exe
- "ISC", # https://docs.astral.sh/ruff/rules/#flake8-implicit-str-concat-isc
- "ICN", # https://docs.astral.sh/ruff/rules/#flake8-import-conventions-icn
- "G201", # https://docs.astral.sh/ruff/rules/#flake8-logging-format-g
- "INP", # https://docs.astral.sh/ruff/rules/#flake8-no-pep420-inp
- "PIE", # https://docs.astral.sh/ruff/rules/#flake8-pie-pie
- "Q", # https://docs.astral.sh/ruff/rules/#flake8-quotes-q
- "RSE", # https://docs.astral.sh/ruff/rules/#flake8-raise-rse
- "T20", # https://docs.astral.sh/ruff/rules/#flake8-print-t20
- "SIM", # https://docs.astral.sh/ruff/rules/#flake8-simplify-sim
- "TID", # https://docs.astral.sh/ruff/rules/#flake8-tidy-imports-tid
- "TCH", # https://docs.astral.sh/ruff/rules/#flake8-type-checking-tch
- "PLC", # https://docs.astral.sh/ruff/rules/#pylint-pl
- "PLE", # https://docs.astral.sh/ruff/rules/#pylint-pl
- "RUF", # https://docs.astral.sh/ruff/rules/#ruff-specific-rules-ruf
- "FLY", # https://docs.astral.sh/ruff/rules/#flynt-fly
- "PTH", # https://docs.astral.sh/ruff/rules/#flake8-use-pathlib-pth
- "FBT", # https://docs.astral.sh/ruff/rules/#flake8-boolean-trap-fbt
-]
-ignore = ["DJ001", "SIM105", "RUF012"]
-
-[lint.per-file-ignores]
-".github/scripts/*.py" = ["E501", "INP001", "SIM117"]
-"docker/wait-for-redis.py" = ["INP001", "T201"]
-"src/documents/file_handling.py" = ["PTH"] # TODO Enable & remove
-"src/documents/management/commands/document_consumer.py" = ["PTH"] # TODO Enable & remove
-"src/documents/management/commands/document_exporter.py" = ["PTH"] # TODO Enable & remove
-"src/documents/migrations/0012_auto_20160305_0040.py" = ["PTH"] # TODO Enable & remove
-"src/documents/migrations/0014_document_checksum.py" = ["PTH"] # TODO Enable & remove
-"src/documents/migrations/1003_mime_types.py" = ["PTH"] # TODO Enable & remove
-"src/documents/migrations/1012_fix_archive_files.py" = ["PTH"] # TODO Enable & remove
-"src/documents/models.py" = ["SIM115", "PTH"] # TODO PTH Enable & remove
-"src/documents/parsers.py" = ["PTH"] # TODO Enable & remove
-"src/documents/signals/handlers.py" = ["PTH"] # TODO Enable & remove
-"src/documents/tasks.py" = ["PTH"] # TODO Enable & remove
-"src/documents/tests/test_api_app_config.py" = ["PTH"] # TODO Enable & remove
-"src/documents/tests/test_classifier.py" = ["PTH"] # TODO Enable & remove
-"src/documents/tests/test_consumer.py" = ["PTH"] # TODO Enable & remove
-"src/documents/tests/test_file_handling.py" = ["PTH"] # TODO Enable & remove
-"src/documents/tests/test_management.py" = ["PTH"] # TODO Enable & remove
-"src/documents/tests/test_management_consumer.py" = ["PTH"] # TODO Enable & remove
-"src/documents/tests/test_management_exporter.py" = ["PTH"] # TODO Enable & remove
-"src/documents/tests/test_management_thumbnails.py" = ["PTH"] # TODO Enable & remove
-"src/documents/tests/test_migration_archive_files.py" = ["PTH"] # TODO Enable & remove
-"src/documents/tests/test_migration_document_pages_count.py" = ["PTH"] # TODO Enable & remove
-"src/documents/tests/test_migration_mime_type.py" = ["PTH"] # TODO Enable & remove
-"src/documents/tests/test_sanity_check.py" = ["PTH"] # TODO Enable & remove
-"src/documents/tests/test_tasks.py" = ["PTH"] # TODO Enable & remove
-"src/documents/tests/test_views.py" = ["PTH"] # TODO Enable & remove
-"src/documents/views.py" = ["PTH"] # TODO Enable & remove
-"src/paperless/checks.py" = ["PTH"] # TODO Enable & remove
-"src/paperless/settings.py" = ["PTH"] # TODO Enable & remove
-"src/paperless/tests/test_checks.py" = ["PTH"] # TODO Enable & remove
-"src/paperless/urls.py" = ["PTH"] # TODO Enable & remove
-"src/paperless/views.py" = ["PTH"] # TODO Enable & remove
-"src/paperless_mail/mail.py" = ["PTH"] # TODO Enable & remove
-"src/paperless_mail/preprocessor.py" = ["PTH"] # TODO Enable & remove
-"src/paperless_tesseract/parsers.py" = ["PTH"] # TODO Enable & remove
-"src/paperless_tesseract/tests/test_parser.py" = ["RUF001", "PTH"] # TODO PTH Enable & remove
-"src/paperless_tika/tests/test_live_tika.py" = ["PTH"] # TODO Enable & remove
-"src/paperless_tika/tests/test_tika_parser.py" = ["PTH"] # TODO Enable & remove
-# Testing
-"*/tests/*.py" = ["E501", "SIM117"]
-# Migrations
-"*/migrations/*.py" = ["E501", "SIM", "T201"]
-# Docker specific
-"docker/rootfs/usr/local/bin/wait-for-redis.py" = ["INP001", "T201"]
-
-[lint.isort]
-force-single-line = true
diff --git a/CODEOWNERS b/CODEOWNERS
index ad8c44cf6..f942cd4fb 100644
--- a/CODEOWNERS
+++ b/CODEOWNERS
@@ -5,5 +5,6 @@
/src-ui/ @paperless-ngx/frontend
/src/ @paperless-ngx/backend
-Pipfile* @paperless-ngx/backend
+pyproject.toml @paperless-ngx/backend
+uv.lock @paperless-ngx/backend
*.py @paperless-ngx/backend
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index aac5bd8a4..2f7952ad0 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -37,6 +37,8 @@ Before you can run `pytest`, ensure to [properly set up your local environment](
Once you have submitted a **P**ull **R**equest it will be reviewed, approved, and merged by one or more community members of any team. Automated code tests and formatting checks must be passed.
+Important: Pull requests that implement a new feature or enhancement _should almost always target an existing feature request_ with evidence of community interest and discussion. This is in order to balance the work of implementing and maintaining new features / enhancements. Instead of opening a PR which does not meet this requirement, please open a feature request instead, to gather feedback from both users and the project maintainers.
+
## Non-Trivial Requests
PRs deemed `non-trivial` will go through a stricter review process before being merged into `dev`. This is to ensure code quality and complete functionality (free of side effects).
@@ -81,7 +83,7 @@ Some notes about translation:
If a language has already been added, and you would like to contribute new translations or change existing translations, please read the "Translation" section in the README.md file for further details on that.
-If you would like the project to be translated to another language, first head over to https://crwd.in/paperless-ngx to check if that language has already been enabled for translation.
+If you would like the project to be translated to another language, first head over to https://crowdin.com/project/paperless-ngx to check if that language has already been enabled for translation.
If not, please request the language to be added by creating an issue on GitHub. The issue should contain:
- English name of the language (the localized name can be added on Crowdin).
@@ -109,28 +111,12 @@ Paperless-ngx is a community project. We do our best to delegate permission and
## Structure
-As of writing, there are 21 members in paperless-ngx. 4 of these people have complete administrative privileges to the repo:
+There are currently 2 members in paperless-ngx with complete administrative privileges to the repo:
- [@shamoon](https://github.com/shamoon)
-- [@bauerj](https://github.com/bauerj)
-- [@qcasey](https://github.com/qcasey)
-- [@FrankStrieter](https://github.com/FrankStrieter)
+- [@stumpylog](https://github.com/stumpylog)
-There are 5 teams collaborating on specific tasks within paperless-ngx:
-
-- @paperless-ngx/backend (Python / django)
-- @paperless-ngx/frontend (JavaScript / Typescript)
-- @paperless-ngx/ci-cd (GitHub Actions / Deployment)
-- @paperless-ngx/issues (Issue triage)
-- @paperless-ngx/test (General testing for larger PRs)
-
-## Permissions
-
-All team members are notified when mentioned or assigned to a relevant issue or pull request. Additionally, each team has slightly different access to paperless-ngx:
-
-- The **test** team has no special permissions.
-- The **issues** team has `triage` access. This means they can organize issues and pull requests.
-- The **backend**, **frontend**, and **ci-cd** teams have `write` access. This means they can approve PRs and push code, containers, releases, and more.
+There are other members who occasionally contribute but we are actively seeking more dedicated maintainers of the project. Please reach out if you are interested.
## Joining
@@ -141,7 +127,7 @@ The admins occasionally invite contributors directly if we believe having them o
# Automatic Repository Maintenance
The Paperless-ngx team appreciates all effort and interest from the community in filing bug reports, creating feature requests, sharing ideas and helping other
-community members. That said, in an effort to keep the repository organized and managebale the project uses automatic handling of certain areas:
+community members. That said, in an effort to keep the repository organized and manageable the project uses automatic handling of certain areas:
- Issues that cannot be reproduced will be marked 'stale' after 7 days of inactivity and closed after 14 further days of inactivity.
- Issues, pull requests and discussions that are closed will be locked after 30 days of inactivity.
diff --git a/Dockerfile b/Dockerfile
index 6a575be74..69196843b 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -4,50 +4,35 @@
# Stage: compile-frontend
# Purpose: Compiles the frontend
# Notes:
-# - Does NPM stuff with Typescript and such
+# - Does PNPM stuff with Typescript and such
FROM --platform=$BUILDPLATFORM docker.io/node:20-bookworm-slim AS compile-frontend
COPY ./src-ui /src/src-ui
WORKDIR /src/src-ui
RUN set -eux \
- && npm update npm -g \
- && npm ci
+ && npm update -g pnpm \
+ && npm install -g corepack@latest \
+ && corepack enable \
+ && pnpm install
ARG PNGX_TAG_VERSION=
# Add the tag to the environment file if its a tagged dev build
RUN set -eux && \
case "${PNGX_TAG_VERSION}" in \
dev|beta|fix*|feature*) \
- sed -i -E "s/version: '([0-9\.]+)'/version: '\1 #${PNGX_TAG_VERSION}'/g" /src/src-ui/src/environments/environment.prod.ts \
+ sed -i -E "s/tag: '([a-z\.]+)'/tag: '${PNGX_TAG_VERSION}'/g" /src/src-ui/src/environments/environment.prod.ts \
;; \
esac
RUN set -eux \
&& ./node_modules/.bin/ng build --configuration production
-# Stage: pipenv-base
-# Purpose: Generates a requirements.txt file for building
-# Comments:
-# - pipenv dependencies are not left in the final image
-# - pipenv can't touch the final image somehow
-FROM --platform=$BUILDPLATFORM docker.io/python:3.12-alpine AS pipenv-base
-
-WORKDIR /usr/src/pipenv
-
-COPY Pipfile* ./
-
-RUN set -eux \
- && echo "Installing pipenv" \
- && python3 -m pip install --no-cache-dir --upgrade pipenv==2024.4.1 \
- && echo "Generating requirement.txt" \
- && pipenv requirements > requirements.txt
-
# Stage: s6-overlay-base
# Purpose: Installs s6-overlay and rootfs
# Comments:
# - Don't leave anything extra in here either
-FROM docker.io/python:3.12-slim-bookworm AS s6-overlay-base
+FROM ghcr.io/astral-sh/uv:0.8.8-python3.12-bookworm-slim AS s6-overlay-base
WORKDIR /usr/src/s6
@@ -62,7 +47,7 @@ ENV \
ARG TARGETARCH
ARG TARGETVARIANT
# Lock this version
-ARG S6_OVERLAY_VERSION=3.2.0.2
+ARG S6_OVERLAY_VERSION=3.2.1.0
ARG S6_BUILD_TIME_PKGS="curl \
xz-utils"
@@ -116,16 +101,19 @@ ARG DEBIAN_FRONTEND=noninteractive
ARG TARGETARCH
# Can be workflow provided, defaults set for manual building
-ARG JBIG2ENC_VERSION=0.29
+ARG JBIG2ENC_VERSION=0.30
ARG QPDF_VERSION=11.9.0
ARG GS_VERSION=10.03.1
# Set Python environment variables
ENV PYTHONDONTWRITEBYTECODE=1 \
PYTHONUNBUFFERED=1 \
- # Ignore warning from Whitenoise
+ # Ignore warning from Whitenoise about async iterators
PYTHONWARNINGS="ignore:::django.http.response:517" \
- PNGX_CONTAINERIZED=1
+ PNGX_CONTAINERIZED=1 \
+ # https://docs.astral.sh/uv/reference/settings/#link-mode
+ UV_LINK_MODE=copy \
+ UV_CACHE_DIR=/cache/uv/
#
# Begin installation and configuration
@@ -204,46 +192,29 @@ RUN set -eux \
&& rm --force --verbose *.deb \
&& rm --recursive --force --verbose /var/lib/apt/lists/*
-# Copy gunicorn config
-# Changes very infrequently
-WORKDIR /usr/src/paperless/
-
-COPY --chown=1000:1000 gunicorn.conf.py /usr/src/paperless/gunicorn.conf.py
-
WORKDIR /usr/src/paperless/src/
# Python dependencies
# Change pretty frequently
-COPY --chown=1000:1000 --from=pipenv-base /usr/src/pipenv/requirements.txt ./
+COPY --chown=1000:1000 ["pyproject.toml", "uv.lock", "/usr/src/paperless/src/"]
# Packages needed only for building a few quick Python
# dependencies
ARG BUILD_PACKAGES="\
build-essential \
- git \
- # https://www.psycopg.org/docs/install.html#prerequisites
- libpq-dev \
# https://github.com/PyMySQL/mysqlclient#linux
default-libmysqlclient-dev \
pkg-config"
-ARG ZXING_VERSION=2.3.0
-ARG PSYCOPG_VERSION=3.2.4
-
# hadolint ignore=DL3042
-RUN --mount=type=cache,target=/root/.cache/pip/,id=pip-cache \
+RUN --mount=type=cache,target=${UV_CACHE_DIR},id=python-cache \
set -eux \
&& echo "Installing build system packages" \
&& apt-get update \
&& apt-get install --yes --quiet --no-install-recommends ${BUILD_PACKAGES} \
- && python3 -m pip install --upgrade wheel \
&& echo "Installing Python requirements" \
- && curl --fail --silent --no-progress-meter --show-error --location --remote-name-all --parallel --parallel-max 4 \
- https://github.com/paperless-ngx/builder/releases/download/psycopg-${PSYCOPG_VERSION}/psycopg_c-${PSYCOPG_VERSION}-cp312-cp312-linux_x86_64.whl \
- https://github.com/paperless-ngx/builder/releases/download/psycopg-${PSYCOPG_VERSION}/psycopg_c-${PSYCOPG_VERSION}-cp312-cp312-linux_aarch64.whl \
- https://github.com/paperless-ngx/builder/releases/download/zxing-${ZXING_VERSION}/zxing_cpp-${ZXING_VERSION}-cp312-cp312-linux_aarch64.whl \
- https://github.com/paperless-ngx/builder/releases/download/zxing-${ZXING_VERSION}/zxing_cpp-${ZXING_VERSION}-cp312-cp312-linux_x86_64.whl \
- && python3 -m pip install --default-timeout=1000 --find-links . --requirement requirements.txt \
+ && uv export --quiet --no-dev --all-extras --format requirements-txt --output-file requirements.txt \
+ && uv pip install --system --no-python-downloads --python-preference system --requirements requirements.txt \
&& echo "Installing NLTK data" \
&& python3 -W ignore::RuntimeWarning -m nltk.downloader -d "/usr/share/nltk_data" snowball_data \
&& python3 -W ignore::RuntimeWarning -m nltk.downloader -d "/usr/share/nltk_data" stopwords \
@@ -268,6 +239,7 @@ COPY --from=compile-frontend --chown=1000:1000 /src/src/documents/static/fronten
# add users, setup scripts
# Mount the compiled frontend to expected location
RUN set -eux \
+ && sed -i '1s|^#!/usr/bin/env python3|#!/command/with-contenv python3|' manage.py \
&& echo "Setting up user/group" \
&& addgroup --gid 1000 paperless \
&& useradd --uid 1000 --gid paperless --home-dir /usr/src/paperless paperless \
@@ -293,4 +265,4 @@ ENTRYPOINT ["/init"]
EXPOSE 8000
-HEALTHCHECK --interval=30s --timeout=10s --retries=5 CMD [ "curl", "-fs", "-S", "--max-time", "2", "http://localhost:8000" ]
+HEALTHCHECK --interval=30s --timeout=10s --retries=5 CMD [ "curl", "-fs", "-S", "-L", "--max-time", "2", "http://localhost:8000" ]
diff --git a/Pipfile b/Pipfile
deleted file mode 100644
index 863b157ec..000000000
--- a/Pipfile
+++ /dev/null
@@ -1,102 +0,0 @@
-[[source]]
-url = "https://pypi.python.org/simple"
-verify_ssl = true
-name = "pypi"
-
-[packages]
-dateparser = "~=1.2"
-# WARNING: django does not use semver.
-# Only patch versions are guaranteed to not introduce breaking changes.
-django = "~=5.1.5"
-django-allauth = {extras = ["mfa", "socialaccount"], version = "*"}
-django-auditlog = "*"
-django-celery-results = "*"
-django-compression-middleware = "*"
-django-cors-headers = "*"
-django-extensions = "*"
-django-filter = "~=24.3"
-django-guardian = "*"
-django-multiselectfield = "*"
-django-soft-delete = "*"
-djangorestframework = "~=3.15.2"
-djangorestframework-guardian = "*"
-drf-spectacular = "*"
-drf-spectacular-sidecar = "*"
-drf-writable-nested = "*"
-bleach = "*"
-celery = {extras = ["redis"], version = "*"}
-channels = "~=4.2"
-channels-redis = "*"
-concurrent-log-handler = "*"
-filelock = "*"
-flower = "*"
-gotenberg-client = "*"
-gunicorn = "*"
-httpx-oauth = "*"
-imap-tools = "*"
-inotifyrecursive = "~=0.3"
-jinja2 = "~=3.1"
-langdetect = "*"
-mysqlclient = "*"
-nltk = "*"
-ocrmypdf = "~=16.8"
-pathvalidate = "*"
-pdf2image = "*"
-psycopg = {version = "*", extras = ["c"]}
-python-dateutil = "*"
-python-dotenv = "*"
-python-gnupg = "*"
-python-ipware = "*"
-python-magic = "*"
-pyzbar = "*"
-rapidfuzz = "*"
-redis = {extras = ["hiredis"], version = "*"}
-scikit-learn = "~=1.6"
-setproctitle = "*"
-tika-client = "*"
-tqdm = "*"
-# See https://github.com/paperless-ngx/paperless-ngx/issues/5494
-uvicorn = {extras = ["standard"], version = "==0.25.0"}
-watchdog = "~=6.0"
-whitenoise = "~=6.8"
-whoosh = "~=2.7"
-zxing-cpp = "*"
-
-
-[dev-packages]
-# Linting
-pre-commit = "*"
-ruff = "*"
-factory-boy = "*"
-# Testing
-pytest = "*"
-pytest-cov = "*"
-pytest-django = "*"
-pytest-httpx = "*"
-pytest-env = "*"
-pytest-sugar = "*"
-pytest-xdist = "*"
-pytest-mock = "*"
-pytest-rerunfailures = "*"
-imagehash = "*"
-daphne = "*"
-# Documentation
-mkdocs-material = "*"
-mkdocs-glightbox = "*"
-
-[typing-dev]
-mypy = "*"
-types-Pillow = "*"
-django-filter-stubs = "*"
-types-python-dateutil = "*"
-djangorestframework-stubs = {extras= ["compatible-mypy"], version="*"}
-celery-types = "*"
-django-stubs = {extras= ["compatible-mypy"], version="*"}
-types-dateparser = "*"
-types-bleach = "*"
-types-redis = "*"
-types-tqdm = "*"
-types-Markdown = "*"
-types-Pygments = "*"
-types-colorama = "*"
-types-setuptools = "*"
diff --git a/Pipfile.lock b/Pipfile.lock
deleted file mode 100644
index 9ab953803..000000000
--- a/Pipfile.lock
+++ /dev/null
@@ -1,4965 +0,0 @@
-{
- "_meta": {
- "hash": {
- "sha256": "b08210d0d72465f043a0e0e59cba4a93456f4f658a0c2433404b62138db447e0"
- },
- "pipfile-spec": 6,
- "requires": {},
- "sources": [
- {
- "name": "pypi",
- "url": "https://pypi.python.org/simple",
- "verify_ssl": true
- }
- ]
- },
- "default": {
- "amqp": {
- "hashes": [
- "sha256:43b3319e1b4e7d1251833a93d672b4af1e40f3d632d479b98661a95f117880a2",
- "sha256:cddc00c725449522023bad949f70fff7b48f0b1ade74d170a6f10ab044739432"
- ],
- "markers": "python_version >= '3.6'",
- "version": "==5.3.1"
- },
- "anyio": {
- "hashes": [
- "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a",
- "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a"
- ],
- "markers": "python_version >= '3.9'",
- "version": "==4.8.0"
- },
- "asgiref": {
- "hashes": [
- "sha256:3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47",
- "sha256:c343bd80a0bec947a9860adb4c432ffa7db769836c64238fc34bdc3fec84d590"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==3.8.1"
- },
- "async-timeout": {
- "hashes": [
- "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c",
- "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==5.0.1"
- },
- "attrs": {
- "hashes": [
- "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346",
- "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"
- ],
- "markers": "python_version >= '3.7'",
- "version": "==24.2.0"
- },
- "billiard": {
- "hashes": [
- "sha256:12b641b0c539073fc8d3f5b8b7be998956665c4233c7c1fcd66a7e677c4fb36f",
- "sha256:40b59a4ac8806ba2c2369ea98d876bc6108b051c227baffd928c644d15d8f3cb"
- ],
- "markers": "python_version >= '3.7'",
- "version": "==4.2.1"
- },
- "bleach": {
- "hashes": [
- "sha256:117d9c6097a7c3d22fd578fcd8d35ff1e125df6736f554da4e432fdd63f31e5e",
- "sha256:123e894118b8a599fd80d3ec1a6d4cc7ce4e5882b1317a7e1ba69b56e95f991f"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.9'",
- "version": "==6.2.0"
- },
- "brotli": {
- "hashes": [
- "sha256:03d20af184290887bdea3f0f78c4f737d126c74dc2f3ccadf07e54ceca3bf208",
- "sha256:0541e747cce78e24ea12d69176f6a7ddb690e62c425e01d31cc065e69ce55b48",
- "sha256:069a121ac97412d1fe506da790b3e69f52254b9df4eb665cd42460c837193354",
- "sha256:0737ddb3068957cf1b054899b0883830bb1fec522ec76b1098f9b6e0f02d9419",
- "sha256:0b63b949ff929fbc2d6d3ce0e924c9b93c9785d877a21a1b678877ffbbc4423a",
- "sha256:0c6244521dda65ea562d5a69b9a26120769b7a9fb3db2fe9545935ed6735b128",
- "sha256:11d00ed0a83fa22d29bc6b64ef636c4552ebafcef57154b4ddd132f5638fbd1c",
- "sha256:141bd4d93984070e097521ed07e2575b46f817d08f9fa42b16b9b5f27b5ac088",
- "sha256:19c116e796420b0cee3da1ccec3b764ed2952ccfcc298b55a10e5610ad7885f9",
- "sha256:1ab4fbee0b2d9098c74f3057b2bc055a8bd92ccf02f65944a241b4349229185a",
- "sha256:1ae56aca0402a0f9a3431cddda62ad71666ca9d4dc3a10a142b9dce2e3c0cda3",
- "sha256:1b2c248cd517c222d89e74669a4adfa5577e06ab68771a529060cf5a156e9757",
- "sha256:1e9a65b5736232e7a7f91ff3d02277f11d339bf34099a56cdab6a8b3410a02b2",
- "sha256:224e57f6eac61cc449f498cc5f0e1725ba2071a3d4f48d5d9dffba42db196438",
- "sha256:22fc2a8549ffe699bfba2256ab2ed0421a7b8fadff114a3d201794e45a9ff578",
- "sha256:23032ae55523cc7bccb4f6a0bf368cd25ad9bcdcc1990b64a647e7bbcce9cb5b",
- "sha256:2333e30a5e00fe0fe55903c8832e08ee9c3b1382aacf4db26664a16528d51b4b",
- "sha256:2954c1c23f81c2eaf0b0717d9380bd348578a94161a65b3a2afc62c86467dd68",
- "sha256:2a24c50840d89ded6c9a8fdc7b6ed3692ed4e86f1c4a4a938e1e92def92933e0",
- "sha256:2de9d02f5bda03d27ede52e8cfe7b865b066fa49258cbab568720aa5be80a47d",
- "sha256:2feb1d960f760a575dbc5ab3b1c00504b24caaf6986e2dc2b01c09c87866a943",
- "sha256:30924eb4c57903d5a7526b08ef4a584acc22ab1ffa085faceb521521d2de32dd",
- "sha256:316cc9b17edf613ac76b1f1f305d2a748f1b976b033b049a6ecdfd5612c70409",
- "sha256:32d95b80260d79926f5fab3c41701dbb818fde1c9da590e77e571eefd14abe28",
- "sha256:38025d9f30cf4634f8309c6874ef871b841eb3c347e90b0851f63d1ded5212da",
- "sha256:39da8adedf6942d76dc3e46653e52df937a3c4d6d18fdc94a7c29d263b1f5b50",
- "sha256:3c0ef38c7a7014ffac184db9e04debe495d317cc9c6fb10071f7fefd93100a4f",
- "sha256:3d7954194c36e304e1523f55d7042c59dc53ec20dd4e9ea9d151f1b62b4415c0",
- "sha256:3ee8a80d67a4334482d9712b8e83ca6b1d9bc7e351931252ebef5d8f7335a547",
- "sha256:4093c631e96fdd49e0377a9c167bfd75b6d0bad2ace734c6eb20b348bc3ea180",
- "sha256:43395e90523f9c23a3d5bdf004733246fba087f2948f87ab28015f12359ca6a0",
- "sha256:43ce1b9935bfa1ede40028054d7f48b5469cd02733a365eec8a329ffd342915d",
- "sha256:4410f84b33374409552ac9b6903507cdb31cd30d2501fc5ca13d18f73548444a",
- "sha256:494994f807ba0b92092a163a0a283961369a65f6cbe01e8891132b7a320e61eb",
- "sha256:4d4a848d1837973bf0f4b5e54e3bec977d99be36a7895c61abb659301b02c112",
- "sha256:4ed11165dd45ce798d99a136808a794a748d5dc38511303239d4e2363c0695dc",
- "sha256:4f3607b129417e111e30637af1b56f24f7a49e64763253bbc275c75fa887d4b2",
- "sha256:510b5b1bfbe20e1a7b3baf5fed9e9451873559a976c1a78eebaa3b86c57b4265",
- "sha256:524f35912131cc2cabb00edfd8d573b07f2d9f21fa824bd3fb19725a9cf06327",
- "sha256:587ca6d3cef6e4e868102672d3bd9dc9698c309ba56d41c2b9c85bbb903cdb95",
- "sha256:58d4b711689366d4a03ac7957ab8c28890415e267f9b6589969e74b6e42225ec",
- "sha256:5b3cc074004d968722f51e550b41a27be656ec48f8afaeeb45ebf65b561481dd",
- "sha256:5dab0844f2cf82be357a0eb11a9087f70c5430b2c241493fc122bb6f2bb0917c",
- "sha256:5e55da2c8724191e5b557f8e18943b1b4839b8efc3ef60d65985bcf6f587dd38",
- "sha256:5eeb539606f18a0b232d4ba45adccde4125592f3f636a6182b4a8a436548b914",
- "sha256:5f4d5ea15c9382135076d2fb28dde923352fe02951e66935a9efaac8f10e81b0",
- "sha256:5fb2ce4b8045c78ebbc7b8f3c15062e435d47e7393cc57c25115cfd49883747a",
- "sha256:6172447e1b368dcbc458925e5ddaf9113477b0ed542df258d84fa28fc45ceea7",
- "sha256:6967ced6730aed543b8673008b5a391c3b1076d834ca438bbd70635c73775368",
- "sha256:6974f52a02321b36847cd19d1b8e381bf39939c21efd6ee2fc13a28b0d99348c",
- "sha256:6c3020404e0b5eefd7c9485ccf8393cfb75ec38ce75586e046573c9dc29967a0",
- "sha256:6c6e0c425f22c1c719c42670d561ad682f7bfeeef918edea971a79ac5252437f",
- "sha256:70051525001750221daa10907c77830bc889cb6d865cc0b813d9db7fefc21451",
- "sha256:7905193081db9bfa73b1219140b3d315831cbff0d8941f22da695832f0dd188f",
- "sha256:7bc37c4d6b87fb1017ea28c9508b36bbcb0c3d18b4260fcdf08b200c74a6aee8",
- "sha256:7c4855522edb2e6ae7fdb58e07c3ba9111e7621a8956f481c68d5d979c93032e",
- "sha256:7e4c4629ddad63006efa0ef968c8e4751c5868ff0b1c5c40f76524e894c50248",
- "sha256:7eedaa5d036d9336c95915035fb57422054014ebdeb6f3b42eac809928e40d0c",
- "sha256:7f4bf76817c14aa98cc6697ac02f3972cb8c3da93e9ef16b9c66573a68014f91",
- "sha256:81de08ac11bcb85841e440c13611c00b67d3bf82698314928d0b676362546724",
- "sha256:832436e59afb93e1836081a20f324cb185836c617659b07b129141a8426973c7",
- "sha256:861bf317735688269936f755fa136a99d1ed526883859f86e41a5d43c61d8966",
- "sha256:87a3044c3a35055527ac75e419dfa9f4f3667a1e887ee80360589eb8c90aabb9",
- "sha256:890b5a14ce214389b2cc36ce82f3093f96f4cc730c1cffdbefff77a7c71f2a97",
- "sha256:89f4988c7203739d48c6f806f1e87a1d96e0806d44f0fba61dba81392c9e474d",
- "sha256:8bf32b98b75c13ec7cf774164172683d6e7891088f6316e54425fde1efc276d5",
- "sha256:8dadd1314583ec0bf2d1379f7008ad627cd6336625d6679cf2f8e67081b83acf",
- "sha256:901032ff242d479a0efa956d853d16875d42157f98951c0230f69e69f9c09bac",
- "sha256:9011560a466d2eb3f5a6e4929cf4a09be405c64154e12df0dd72713f6500e32b",
- "sha256:906bc3a79de8c4ae5b86d3d75a8b77e44404b0f4261714306e3ad248d8ab0951",
- "sha256:919e32f147ae93a09fe064d77d5ebf4e35502a8df75c29fb05788528e330fe74",
- "sha256:91d7cc2a76b5567591d12c01f019dd7afce6ba8cba6571187e21e2fc418ae648",
- "sha256:929811df5462e182b13920da56c6e0284af407d1de637d8e536c5cd00a7daf60",
- "sha256:949f3b7c29912693cee0afcf09acd6ebc04c57af949d9bf77d6101ebb61e388c",
- "sha256:a090ca607cbb6a34b0391776f0cb48062081f5f60ddcce5d11838e67a01928d1",
- "sha256:a1fd8a29719ccce974d523580987b7f8229aeace506952fa9ce1d53a033873c8",
- "sha256:a37b8f0391212d29b3a91a799c8e4a2855e0576911cdfb2515487e30e322253d",
- "sha256:a3daabb76a78f829cafc365531c972016e4aa8d5b4bf60660ad8ecee19df7ccc",
- "sha256:a469274ad18dc0e4d316eefa616d1d0c2ff9da369af19fa6f3daa4f09671fd61",
- "sha256:a599669fd7c47233438a56936988a2478685e74854088ef5293802123b5b2460",
- "sha256:a743e5a28af5f70f9c080380a5f908d4d21d40e8f0e0c8901604d15cfa9ba751",
- "sha256:a77def80806c421b4b0af06f45d65a136e7ac0bdca3c09d9e2ea4e515367c7e9",
- "sha256:a7e53012d2853a07a4a79c00643832161a910674a893d296c9f1259859a289d2",
- "sha256:a93dde851926f4f2678e704fadeb39e16c35d8baebd5252c9fd94ce8ce68c4a0",
- "sha256:aac0411d20e345dc0920bdec5548e438e999ff68d77564d5e9463a7ca9d3e7b1",
- "sha256:ae15b066e5ad21366600ebec29a7ccbc86812ed267e4b28e860b8ca16a2bc474",
- "sha256:aea440a510e14e818e67bfc4027880e2fb500c2ccb20ab21c7a7c8b5b4703d75",
- "sha256:af6fa6817889314555aede9a919612b23739395ce767fe7fcbea9a80bf140fe5",
- "sha256:b760c65308ff1e462f65d69c12e4ae085cff3b332d894637f6273a12a482d09f",
- "sha256:be36e3d172dc816333f33520154d708a2657ea63762ec16b62ece02ab5e4daf2",
- "sha256:c247dd99d39e0338a604f8c2b3bc7061d5c2e9e2ac7ba9cc1be5a69cb6cd832f",
- "sha256:c5529b34c1c9d937168297f2c1fde7ebe9ebdd5e121297ff9c043bdb2ae3d6fb",
- "sha256:c8146669223164fc87a7e3de9f81e9423c67a79d6b3447994dfb9c95da16e2d6",
- "sha256:c8fd5270e906eef71d4a8d19b7c6a43760c6abcfcc10c9101d14eb2357418de9",
- "sha256:ca63e1890ede90b2e4454f9a65135a4d387a4585ff8282bb72964fab893f2111",
- "sha256:caf9ee9a5775f3111642d33b86237b05808dafcd6268faa492250e9b78046eb2",
- "sha256:cb1dac1770878ade83f2ccdf7d25e494f05c9165f5246b46a621cc849341dc01",
- "sha256:cdad5b9014d83ca68c25d2e9444e28e967ef16e80f6b436918c700c117a85467",
- "sha256:cdbc1fc1bc0bff1cef838eafe581b55bfbffaed4ed0318b724d0b71d4d377619",
- "sha256:ceb64bbc6eac5a140ca649003756940f8d6a7c444a68af170b3187623b43bebf",
- "sha256:d0c5516f0aed654134a2fc936325cc2e642f8a0e096d075209672eb321cff408",
- "sha256:d143fd47fad1db3d7c27a1b1d66162e855b5d50a89666af46e1679c496e8e579",
- "sha256:d192f0f30804e55db0d0e0a35d83a9fead0e9a359a9ed0285dbacea60cc10a84",
- "sha256:d2b35ca2c7f81d173d2fadc2f4f31e88cc5f7a39ae5b6db5513cf3383b0e0ec7",
- "sha256:d342778ef319e1026af243ed0a07c97acf3bad33b9f29e7ae6a1f68fd083e90c",
- "sha256:d487f5432bf35b60ed625d7e1b448e2dc855422e87469e3f450aa5552b0eb284",
- "sha256:d7702622a8b40c49bffb46e1e3ba2e81268d5c04a34f460978c6b5517a34dd52",
- "sha256:db85ecf4e609a48f4b29055f1e144231b90edc90af7481aa731ba2d059226b1b",
- "sha256:de6551e370ef19f8de1807d0a9aa2cdfdce2e85ce88b122fe9f6b2b076837e59",
- "sha256:e1140c64812cb9b06c922e77f1c26a75ec5e3f0fb2bf92cc8c58720dec276752",
- "sha256:e4fe605b917c70283db7dfe5ada75e04561479075761a0b3866c081d035b01c1",
- "sha256:e6a904cb26bfefc2f0a6f240bdf5233be78cd2488900a2f846f3c3ac8489ab80",
- "sha256:e79e6520141d792237c70bcd7a3b122d00f2613769ae0cb61c52e89fd3443839",
- "sha256:e84799f09591700a4154154cab9787452925578841a94321d5ee8fb9a9a328f0",
- "sha256:e93dfc1a1165e385cc8239fab7c036fb2cd8093728cbd85097b284d7b99249a2",
- "sha256:efa8b278894b14d6da122a72fefcebc28445f2d3f880ac59d46c90f4c13be9a3",
- "sha256:f0d8a7a6b5983c2496e364b969f0e526647a06b075d034f3297dc66f3b360c64",
- "sha256:f0db75f47be8b8abc8d9e31bc7aad0547ca26f24a54e6fd10231d623f183d089",
- "sha256:f296c40e23065d0d6650c4aefe7470d2a25fffda489bcc3eb66083f3ac9f6643",
- "sha256:f31859074d57b4639318523d6ffdca586ace54271a73ad23ad021acd807eb14b",
- "sha256:f66b5337fa213f1da0d9000bc8dc0cb5b896b726eefd9c6046f699b169c41b9e",
- "sha256:f733d788519c7e3e71f0855c96618720f5d3d60c3cb829d8bbb722dddce37985",
- "sha256:fce1473f3ccc4187f75b4690cfc922628aed4d3dd013d047f95a9b3919a86596",
- "sha256:fd5f17ff8f14003595ab414e45fce13d073e0762394f957182e69035c9f3d7c2",
- "sha256:fdc3ff3bfccdc6b9cc7c342c03aa2400683f0cb891d46e94b64a197910dc4064"
- ],
- "version": "==1.1.0"
- },
- "celery": {
- "extras": [
- "redis"
- ],
- "hashes": [
- "sha256:369631eb580cf8c51a82721ec538684994f8277637edde2dfc0dacd73ed97f64",
- "sha256:504a19140e8d3029d5acad88330c541d4c3f64c789d85f94756762d8bca7e706"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==5.4.0"
- },
- "certifi": {
- "hashes": [
- "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56",
- "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"
- ],
- "markers": "python_version >= '3.6'",
- "version": "==2024.12.14"
- },
- "cffi": {
- "hashes": [
- "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8",
- "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2",
- "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1",
- "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15",
- "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36",
- "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824",
- "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8",
- "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36",
- "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17",
- "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf",
- "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc",
- "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3",
- "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed",
- "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702",
- "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1",
- "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8",
- "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903",
- "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6",
- "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d",
- "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b",
- "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e",
- "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be",
- "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c",
- "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683",
- "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9",
- "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c",
- "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8",
- "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1",
- "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4",
- "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655",
- "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67",
- "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595",
- "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0",
- "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65",
- "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41",
- "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6",
- "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401",
- "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6",
- "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3",
- "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16",
- "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93",
- "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e",
- "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4",
- "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964",
- "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c",
- "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576",
- "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0",
- "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3",
- "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662",
- "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3",
- "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff",
- "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5",
- "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd",
- "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f",
- "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5",
- "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14",
- "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d",
- "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9",
- "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7",
- "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382",
- "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a",
- "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e",
- "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a",
- "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4",
- "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99",
- "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87",
- "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==1.17.1"
- },
- "channels": {
- "hashes": [
- "sha256:6b75bc8d6888fb7236e7e7bf1948520b72d296ad08216a242fc56b1db0ffde1a",
- "sha256:d9e707487431ba5dbce9af982970dab3b0efd786580fadb99e45dca5e39fdd59"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.8'",
- "version": "==4.2.0"
- },
- "channels-redis": {
- "hashes": [
- "sha256:2ca33105b3a04b5a327a9c47dd762b546f30b76a0cd3f3f593a23d91d346b6f4",
- "sha256:8375e81493e684792efe6e6eca60ef3d7782ef76c6664057d2e5c31e80d636dd"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.8'",
- "version": "==4.2.1"
- },
- "charset-normalizer": {
- "hashes": [
- "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537",
- "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa",
- "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a",
- "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294",
- "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b",
- "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd",
- "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601",
- "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd",
- "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4",
- "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d",
- "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2",
- "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313",
- "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd",
- "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa",
- "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8",
- "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1",
- "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2",
- "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496",
- "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d",
- "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b",
- "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e",
- "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a",
- "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4",
- "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca",
- "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78",
- "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408",
- "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5",
- "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3",
- "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f",
- "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a",
- "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765",
- "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6",
- "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146",
- "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6",
- "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9",
- "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd",
- "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c",
- "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f",
- "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545",
- "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176",
- "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770",
- "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824",
- "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f",
- "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf",
- "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487",
- "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d",
- "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd",
- "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b",
- "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534",
- "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f",
- "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b",
- "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9",
- "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd",
- "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125",
- "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9",
- "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de",
- "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11",
- "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d",
- "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35",
- "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f",
- "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda",
- "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7",
- "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a",
- "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971",
- "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8",
- "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41",
- "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d",
- "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f",
- "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757",
- "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a",
- "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886",
- "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77",
- "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76",
- "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247",
- "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85",
- "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb",
- "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7",
- "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e",
- "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6",
- "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037",
- "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1",
- "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e",
- "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807",
- "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407",
- "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c",
- "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12",
- "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3",
- "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089",
- "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd",
- "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e",
- "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00",
- "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616"
- ],
- "markers": "python_version >= '3.7'",
- "version": "==3.4.1"
- },
- "click": {
- "hashes": [
- "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2",
- "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"
- ],
- "markers": "python_version >= '3.7'",
- "version": "==8.1.8"
- },
- "click-didyoumean": {
- "hashes": [
- "sha256:4f82fdff0dbe64ef8ab2279bd6aa3f6a99c3b28c05aa09cbfc07c9d7fbb5a463",
- "sha256:5c4bb6007cfea5f2fd6583a2fb6701a22a41eb98957e63d0fac41c10e7c3117c"
- ],
- "markers": "python_full_version >= '3.6.2'",
- "version": "==0.3.1"
- },
- "click-plugins": {
- "hashes": [
- "sha256:46ab999744a9d831159c3411bb0c79346d94a444df9a3a3742e9ed63645f264b",
- "sha256:5d262006d3222f5057fd81e1623d4443e41dcda5dc815c06b442aa3c02889fc8"
- ],
- "version": "==1.1.1"
- },
- "click-repl": {
- "hashes": [
- "sha256:17849c23dba3d667247dc4defe1757fff98694e90fe37474f3feebb69ced26a9",
- "sha256:fb7e06deb8da8de86180a33a9da97ac316751c094c6899382da7feeeeb51b812"
- ],
- "markers": "python_version >= '3.6'",
- "version": "==0.3.0"
- },
- "concurrent-log-handler": {
- "hashes": [
- "sha256:157bee12914aa2a72246d1d0641ce07c1aa7a55faa3322bed02f21e60395eb82",
- "sha256:1e2c6f021414e214d3dac66107894827a3e78db63018304a4f29e55ba549ac22"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.6'",
- "version": "==0.9.25"
- },
- "cryptography": {
- "hashes": [
- "sha256:1923cb251c04be85eec9fda837661c67c1049063305d6be5721643c22dd4e2b7",
- "sha256:37d76e6863da3774cd9db5b409a9ecfd2c71c981c38788d3fcfaf177f447b731",
- "sha256:3c672a53c0fb4725a29c303be906d3c1fa99c32f58abe008a82705f9ee96f40b",
- "sha256:404fdc66ee5f83a1388be54300ae978b2efd538018de18556dde92575e05defc",
- "sha256:4ac4c9f37eba52cb6fbeaf5b59c152ea976726b865bd4cf87883a7e7006cc543",
- "sha256:62901fb618f74d7d81bf408c8719e9ec14d863086efe4185afd07c352aee1d2c",
- "sha256:660cb7312a08bc38be15b696462fa7cc7cd85c3ed9c576e81f4dc4d8b2b31591",
- "sha256:708ee5f1bafe76d041b53a4f95eb28cdeb8d18da17e597d46d7833ee59b97ede",
- "sha256:761817a3377ef15ac23cd7834715081791d4ec77f9297ee694ca1ee9c2c7e5eb",
- "sha256:831c3c4d0774e488fdc83a1923b49b9957d33287de923d58ebd3cec47a0ae43f",
- "sha256:84111ad4ff3f6253820e6d3e58be2cc2a00adb29335d4cacb5ab4d4d34f2a123",
- "sha256:8b3e6eae66cf54701ee7d9c83c30ac0a1e3fa17be486033000f2a73a12ab507c",
- "sha256:9e6fc8a08e116fb7c7dd1f040074c9d7b51d74a8ea40d4df2fc7aa08b76b9e6c",
- "sha256:a01956ddfa0a6790d594f5b34fc1bfa6098aca434696a03cfdbe469b8ed79285",
- "sha256:abc998e0c0eee3c8a1904221d3f67dcfa76422b23620173e28c11d3e626c21bd",
- "sha256:b15492a11f9e1b62ba9d73c210e2416724633167de94607ec6069ef724fad092",
- "sha256:be4ce505894d15d5c5037167ffb7f0ae90b7be6f2a98f9a5c3442395501c32fa",
- "sha256:c5eb858beed7835e5ad1faba59e865109f3e52b3783b9ac21e7e47dc5554e289",
- "sha256:cd4e834f340b4293430701e772ec543b0fbe6c2dea510a5286fe0acabe153a02",
- "sha256:d2436114e46b36d00f8b72ff57e598978b37399d2786fd39793c36c6d5cb1c64",
- "sha256:eb33480f1bad5b78233b0ad3e1b0be21e8ef1da745d8d2aecbb20671658b9053",
- "sha256:eca27345e1214d1b9f9490d200f9db5a874479be914199194e746c893788d417",
- "sha256:ed3534eb1090483c96178fcb0f8893719d96d5274dfde98aa6add34614e97c8e",
- "sha256:f3f6fdfa89ee2d9d496e2c087cebef9d4fcbb0ad63c40e821b39f74bf48d9c5e",
- "sha256:f53c2c87e0fb4b0c00fa9571082a057e37690a8f12233306161c8f4b819960b7",
- "sha256:f5e7cb1e5e56ca0933b4873c0220a78b773b24d40d186b6738080b73d3d0a756",
- "sha256:f677e1268c4e23420c3acade68fac427fffcb8d19d7df95ed7ad17cdef8404f4"
- ],
- "markers": "python_version >= '3.7' and python_full_version not in '3.9.0, 3.9.1'",
- "version": "==44.0.0"
- },
- "dateparser": {
- "hashes": [
- "sha256:0b21ad96534e562920a0083e97fd45fa959882d4162acc358705144520a35830",
- "sha256:7975b43a4222283e0ae15be7b4999d08c9a70e2d378ac87385b1ccf2cffbbb30"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.7'",
- "version": "==1.2.0"
- },
- "deprecated": {
- "hashes": [
- "sha256:353bc4a8ac4bfc96800ddab349d89c25dec1079f65fd53acdcc1e0b975b21320",
- "sha256:683e561a90de76239796e6b6feac66b99030d2dd3fcf61ef996330f14bbb9b0d"
- ],
- "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
- "version": "==1.2.15"
- },
- "deprecation": {
- "hashes": [
- "sha256:72b3bde64e5d778694b0cf68178aed03d15e15477116add3fb773e581f9518ff",
- "sha256:a10811591210e1fb0e768a8c25517cabeabcba6f0bf96564f8ff45189f90b14a"
- ],
- "version": "==2.1.0"
- },
- "django": {
- "hashes": [
- "sha256:1e39eafdd1b185e761d9fab7a9f0b9fa00af1b37b25ad980a8aa0dac13535690",
- "sha256:8d203400bc2952fbfb287c2bbda630297d654920c72a73cc82a9ad7926feaad5"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.10'",
- "version": "==5.1.6"
- },
- "django-allauth": {
- "extras": [
- "mfa",
- "socialaccount"
- ],
- "hashes": [
- "sha256:60b32aef7dbbcc213319aa4fd8f570e985266ea1162ae6ef7a26a24efca85c8c"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.8'",
- "version": "==65.4.1"
- },
- "django-auditlog": {
- "hashes": [
- "sha256:92db1cf4a51ceca5c26b3ff46997d9e3305a02da1bd435e2efb5b8b6d300ce1f",
- "sha256:9de49f80a4911135d136017123cd73461f869b4947eec14d5e76db4b88182f3f"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.8'",
- "version": "==3.0.0"
- },
- "django-celery-results": {
- "hashes": [
- "sha256:0da4cd5ecc049333e4524a23fcfc3460dfae91aa0a60f1fae4b6b2889c254e01",
- "sha256:3ecb7147f773f34d0381bac6246337ce4cf88a2ea7b82774ed48e518b67bb8fd"
- ],
- "index": "pypi",
- "version": "==2.5.1"
- },
- "django-compression-middleware": {
- "hashes": [
- "sha256:0df50f12d774659abc8bbc88e4c794f2785a8f11f30b5bb267c314b85d941b73",
- "sha256:9c59f56db6a5d83db50ca1c05d55f589d161062959defea41f26254e393cc37a"
- ],
- "index": "pypi",
- "version": "==0.5.0"
- },
- "django-cors-headers": {
- "hashes": [
- "sha256:6fdf31bf9c6d6448ba09ef57157db2268d515d94fc5c89a0a1028e1fc03ee52b",
- "sha256:f1c125dcd58479fe7a67fe2499c16ee38b81b397463cf025f0e2c42937421070"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.9'",
- "version": "==4.7.0"
- },
- "django-extensions": {
- "hashes": [
- "sha256:44d27919d04e23b3f40231c4ab7af4e61ce832ef46d610cc650d53e68328410a",
- "sha256:9600b7562f79a92cbf1fde6403c04fee314608fefbb595502e34383ae8203401"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.6'",
- "version": "==3.2.3"
- },
- "django-filter": {
- "hashes": [
- "sha256:c4852822928ce17fb699bcfccd644b3574f1a2d80aeb2b4ff4f16b02dd49dc64",
- "sha256:d8ccaf6732afd21ca0542f6733b11591030fa98669f8d15599b358e24a2cd9c3"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.8'",
- "version": "==24.3"
- },
- "django-guardian": {
- "hashes": [
- "sha256:440ca61358427e575323648b25f8384739e54c38b3d655c81d75e0cd0d61b697",
- "sha256:c58a68ae76922d33e6bdc0e69af1892097838de56e93e78a8361090bcd9f89a0"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.5'",
- "version": "==2.4.0"
- },
- "django-multiselectfield": {
- "hashes": [
- "sha256:437d72632f4c0ca416951917632529c3d1d42b62bb6c3c03e3396fa50265be94",
- "sha256:f146ef568c823a409f4021b98781666ec2debabfceca9176116d749dc39cb8b3"
- ],
- "index": "pypi",
- "version": "==0.1.13"
- },
- "django-soft-delete": {
- "hashes": [
- "sha256:603a29e82bbb7a5bada69f2754fad225ccd8cd7f485320ec06d0fc4e9dfddcf0",
- "sha256:d2f9db449a4f008e9786f82fa4bafbe4075f7a0b3284844735007e988b2a4df6"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.6'",
- "version": "==1.0.18"
- },
- "djangorestframework": {
- "hashes": [
- "sha256:2b8871b062ba1aefc2de01f773875441a961fefbf79f5eed1e32b2f096944b20",
- "sha256:36fe88cd2d6c6bec23dca9804bab2ba5517a8bb9d8f47ebc68981b56840107ad"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.8'",
- "version": "==3.15.2"
- },
- "djangorestframework-guardian": {
- "hashes": [
- "sha256:1883756452d9bfcc2a51fb4e039a6837a8f6697c756447aa83af085749b59330",
- "sha256:3bd3dd6ea58e1bceca5048faf6f8b1a93bb5dcff30ba5eb91b9a0e190a48a0c7"
- ],
- "index": "pypi",
- "version": "==0.3.0"
- },
- "drf-spectacular": {
- "hashes": [
- "sha256:2c778a47a40ab2f5078a7c42e82baba07397bb35b074ae4680721b2805943061",
- "sha256:856e7edf1056e49a4245e87a61e8da4baff46c83dbc25be1da2df77f354c7cb4"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.7'",
- "version": "==0.28.0"
- },
- "drf-spectacular-sidecar": {
- "hashes": [
- "sha256:674e1336810c7cf117442300b5c213c4fee1e984ba48689502c947a6ecd25d0c",
- "sha256:ca9507c5fe708680d6b8eda96928f3cf3ffc07e8d67678778bcd2e80f9f2baae"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.6'",
- "version": "==2025.2.1"
- },
- "drf-writable-nested": {
- "hashes": [
- "sha256:d8ddc606dc349e56373810842965712a5789e6a5ca7704729d15429b95f8f2ee"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.8'",
- "version": "==0.7.1"
- },
- "exceptiongroup": {
- "hashes": [
- "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b",
- "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"
- ],
- "markers": "python_version >= '3.7'",
- "version": "==1.2.2"
- },
- "fido2": {
- "hashes": [
- "sha256:e39f95920122d64283fda5e5581d95a206e704fa42846bfa4662f86aa0d3333b",
- "sha256:f7c8ee62e359aa980a45773f9493965bb29ede1b237a9218169dbfe60c80e130"
- ],
- "markers": "python_version >= '3.8' and python_version < '4.0'",
- "version": "==1.2.0"
- },
- "filelock": {
- "hashes": [
- "sha256:533dc2f7ba78dc2f0f531fc6c4940addf7b70a481e269a5a3b93be94ffbe8338",
- "sha256:ee4e77401ef576ebb38cd7f13b9b28893194acc20a8e68e18730ba9c0e54660e"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.9'",
- "version": "==3.17.0"
- },
- "flower": {
- "hashes": [
- "sha256:5ab717b979530770c16afb48b50d2a98d23c3e9fe39851dcf6bc4d01845a02a0",
- "sha256:9db2c621eeefbc844c8dd88be64aef61e84e2deb29b271e02ab2b5b9f01068e2"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.7'",
- "version": "==2.0.1"
- },
- "gotenberg-client": {
- "hashes": [
- "sha256:18955453e6b2a29a5015e95d645efff3ef6d000a663bd1550b2c92e9055bdd5b",
- "sha256:bd3c1ed42b74d470a7e192118276f3d91b558b90aa7c0035afbcac04f42179bb"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.9'",
- "version": "==0.9.0"
- },
- "gunicorn": {
- "hashes": [
- "sha256:ec400d38950de4dfd418cff8328b2c8faed0edb0d517d3394e457c317908ca4d",
- "sha256:f014447a0101dc57e294f6c18ca6b40227a4c90e9bdb586042628030cba004ec"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.7'",
- "version": "==23.0.0"
- },
- "h11": {
- "hashes": [
- "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d",
- "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"
- ],
- "markers": "python_version >= '3.7'",
- "version": "==0.14.0"
- },
- "h2": {
- "hashes": [
- "sha256:03a46bcf682256c95b5fd9e9a99c1323584c3eec6440d379b9903d709476bc6d",
- "sha256:a83aca08fbe7aacb79fec788c9c0bac936343560ed9ec18b82a13a12c28d2abb"
- ],
- "markers": "python_full_version >= '3.6.1'",
- "version": "==4.1.0"
- },
- "hiredis": {
- "hashes": [
- "sha256:0322d70f3328b97da14b6e98b18f0090a12ed8a8bf7ae20932e2eb9d1bb0aa2c",
- "sha256:0614e16339f1784df3bbd2800322e20b4127d3f3a3509f00a5562efddb2521aa",
- "sha256:072c162260ebb1d892683107da22d0d5da7a1414739eae4e185cac22fe89627f",
- "sha256:07ab990d0835f36bf358dbb84db4541ac0a8f533128ec09af8f80a576eef2e88",
- "sha256:09e89e7d34cfe5ca8f7a869fca827d1af0afe8aaddb26b38c01058730edb79ad",
- "sha256:0f8ca13e2476ffd6d5be4763f5868133506ddcfa5ce54b4dac231ebdc19be6c6",
- "sha256:0ffa2552f704a45954627697a378fc2f559004e53055b82f00daf30bd4305330",
- "sha256:107b66ce977bb2dff8f2239e68344360a75d05fed3d9fa0570ac4d3020ce2396",
- "sha256:1110eae007f30e70a058d743e369c24430327cd01fd97d99519d6794a58dd587",
- "sha256:13f5b16f97d0bbd1c04ce367c49097d1214d60e11f9fee7ef2a9b54e0a6645c8",
- "sha256:18e703ff860c1d83abbcf57012b309ead02b56b60e85150c6c3bfb37cbb16ebf",
- "sha256:1c22fa74ddd063396b19fe8445a1ae8b4190eff755d5750dda48e860a45b2ee7",
- "sha256:2102a94063d878c40df92f55199637a74f535e3a0b79ceba4a00538853a21be3",
- "sha256:230dd0e77cb0f525f58a1306a7b4aaf078037fc5229110922332ca46f90821bb",
- "sha256:2892db9db21f0cf7cc298d09f85d3e1f6dc4c4c24463ab67f79bc7a006d51867",
- "sha256:2af62070aa9433802cae7be7364d5e82f76462c6a2ae34e53008b637aaa9a156",
- "sha256:2e04c7feb9467e3170cd4d5bee381775783d81bbc45d6147c1c0ce3b50dc04f9",
- "sha256:3004ef7436feb7bfa61c0b36d422b8fb8c29aaa1a514c9405f0fdee5e9694dd3",
- "sha256:34d25aa25c10f966d5415795ed271da84605044dbf436c054966cea5442451b3",
- "sha256:34f3f5f0354db2d6797a6fb08d2c036a50af62a1d919d122c1c784304ef49347",
- "sha256:35b5fc061c8a0dbfdb440053280504d6aaa8d9726bd4d1d0e1cfcbbdf0d60b73",
- "sha256:363e21fba55e1a26349dc9ca7da6b14332123879b6359bcee4a9acecb40ca33b",
- "sha256:37aed4aa9348600145e2d019c7be27855e503ecc4906c6976ff2f3b52e3d5d97",
- "sha256:39efab176fca3d5111075f6ba56cd864f18db46d858289d39360c5672e0e5c3e",
- "sha256:3b5bd8adfe8742e331a94cccd782bffea251fa70d9a709e71f4510f50794d700",
- "sha256:3dbf9163296fa45fbddcfc4c5900f10e9ddadda37117dbfb641e327e536b53e0",
- "sha256:3e9445b7f117a9c8c8ccad97cb44daa55ddccff3cbc9079984eac56d982ba01f",
- "sha256:4180dc5f646b426e5fa1212e1348c167ee2a864b3a70d56579163d64a847dd1e",
- "sha256:4663a319ab7d22c597b9421e5ea384fd583e044f2f1ca9a1b98d4fef8a0fea2f",
- "sha256:4a018340c073cf88cb635b2bedff96619df2f666018c655e7911f46fa2c1c178",
- "sha256:4ef5ad8b91530e4d10a68562b0a380ea22705a60e88cecee086d7c63a38564ce",
- "sha256:4f12018e5c5f866a1c3f7017cb2d88e5c6f9440df2281e48865a2b6c40f247f4",
- "sha256:511e36a6fa41d3efab3cd5cd70ac388ed825993b9e66fa3b0e47cf27a2f5ffee",
- "sha256:51d40ac3611091020d7dea6b05ed62cb152bff595fa4f931e7b6479d777acf7c",
- "sha256:539e5bb725b62b76a5319a4e68fc7085f01349abc2316ef3df608ea0883c51d2",
- "sha256:570cbf31413c77fe5e7c157f2943ca4400493ddd9cf2184731cfcafc753becd7",
- "sha256:59a9230f3aa38a33d09d8171400de202f575d7a38869e5ce2947829bca6fe359",
- "sha256:5c54a88eb9d8ebc4e5eefaadbe2102a4f7499f9e413654172f40aefd25350959",
- "sha256:5ce71a797b5bc02c51da082428c00251ed6a7a67a03acbda5fbf9e8d028725f6",
- "sha256:676b3d88674134bfaaf70dac181d1790b0f33b3187bfb9da9221e17e0e624f83",
- "sha256:6c840b9cec086328f2ee2cfee0038b5d6bbb514bac7b5e579da6e346eaac056c",
- "sha256:72a98ccc7b8ec9ce0100ecf59f45f05d2023606e8e3676b07a316d1c1c364072",
- "sha256:732cf1c5cf1324f7bf3b6086976fe62a2ca98f0bf6316f31063c2c67be8797bc",
- "sha256:7acdc68e29a446ad17aadaff19c981a36b3bd8c894c3520412c8a7ab1c3e0de7",
- "sha256:7acf35cfa7ec9e1e7559c04e7095628f7d06049b5f24dcb58c1a55ef6dc689f8",
- "sha256:7c76e751fd1e2f221dec09cdc24040ee486886e943d5d7ffc256e8cf15c75e51",
- "sha256:7d3880f213b6f14e9c69ce52beffd1748eecc8669698c4782761887273b6e1bd",
- "sha256:802474c18e878b3f9905e160a8b7df87d57885758083eda76c5978265acb41aa",
- "sha256:8060fa256862b0c3de64a73ab45bc1ccf381caca464f2647af9075b200828948",
- "sha256:8095ef159896e5999a795b0f80e4d64281301a109e442a8d29cd750ca6bd8303",
- "sha256:87c2b3fe7e7c96eba376506a76e11514e07e848f737b254e0973e4b5c3a491e9",
- "sha256:89b83e76eb00ab0464e7b0752a3ffcb02626e742e9509bc141424a9c3202e8dc",
- "sha256:8a45ff7915392a55d9386bb235ea1d1eb9960615f301979f02143fc20036b699",
- "sha256:8f1240bde53d3d1676f0aba61b3661560dc9a681cae24d9de33e650864029aa4",
- "sha256:9020fd7e58f489fda6a928c31355add0e665fd6b87b21954e675cf9943eafa32",
- "sha256:93811d60b0f73d0f049c86f4373a3833b4a38fce374ab151074d929553eb4304",
- "sha256:93a6c9230e5a5565847130c0e1005c8d3aa5ca681feb0ed542c4651323d32feb",
- "sha256:93cfa6cc25ee2ceb0be81dc61eca9995160b9e16bdb7cca4a00607d57e998918",
- "sha256:9646de31f5994e6218311dcf216e971703dbf804c510fd3f84ddb9813c495824",
- "sha256:98ebf08c907836b70a8f40e030df8ab6f174dc7f6fa765251d813e89f14069d8",
- "sha256:9acf7f0e7106f631cd618eb60ec9bbd6e43045addd5310f66ba1177209567e59",
- "sha256:9b2d6e33601c67c074c367fdccdd6033e642284e7a56adc130f18f724c378ca8",
- "sha256:9b390f63191bcccbb6044d4c118acdf4fa55f38e5658ac4cfd5a33a6f0c07659",
- "sha256:9fc4e35b4afb0af6da55495dd0742ad32ab88150428a6ecdbb3085cbd60714e8",
- "sha256:a26fa888025badb5563f283cc19594c215a413e905729e59a5f7cf3f46d66c32",
- "sha256:a31806306a60f3565c04c964d6bee0e9d4a5120e1da589e41976b53972edf635",
- "sha256:a5f65e89ce50a94d9490d5442a649c6116f53f216c8c14eb37cf9637956482b2",
- "sha256:a86b9fef256c2beb162244791fdc025aa55f936d6358e86e2020e512fe2e4972",
- "sha256:aa36688c10a08f626fddcf68c2b1b91b0e90b070c26e550a4151a877f5c2d431",
- "sha256:aed10d9df1e2fb0011db2713ac64497462e9c2c0208b648c97569da772b959ca",
- "sha256:af46a4be0e82df470f68f35316fa16cd1e134d1c5092fc1082e1aad64cce716d",
- "sha256:b621a89fc29b3f4b01be6640ec81a6a94b5382bc78fecb876408d57a071e45aa",
- "sha256:b6d1c9e1fce5e0a94072667ae2bf0142b89ebbb1917d3531184e060a43f3ee11",
- "sha256:b87cddd8107487863fed6994de51e5594a0be267b0b19e213694e99cdd614623",
- "sha256:b885695dce7a39b1fd9a609ed9c4cf312e53df2ec028d5a78af7a891b5fbea4d",
- "sha256:b9b4da8162cf289781732d6a5ba01d820c42c05943fcdb7de307d03639961db3",
- "sha256:bad3b1e0c83849910f28c95953417106f539277035a4b515d1425f93947bc28f",
- "sha256:bc117a04bcb461d3bb1b2c5b417aee3442e1e8aa33ebc800481431f4c09fe0c5",
- "sha256:bc51f594c2c0863ded6501642dc96701ca8bbea9ced4fa3af0a1aeda8aa634cb",
- "sha256:bc63d698c43aea500a84d8b083f830c03808b6cf3933ae4d35a27f0a3d881652",
- "sha256:bd33db977ac7af97e8d035ffadb163b00546be22e5f1297b2123f5f9bf0f8a21",
- "sha256:c156156798729eadc9ab76ffee96c88b93cc1c3b493f4dd0a4341f53939194ee",
- "sha256:c2bc713ee73ab9de4a0d68b0ab0f29612342b63173714742437b977584adb2d8",
- "sha256:c339ff4b4739b2a40da463763dd566129762f72926bca611ad9a457a9fe64abd",
- "sha256:c5c44e9fa6f4462d0330cb5f5d46fa652512fc86b41d4d1974d0356f263e9105",
- "sha256:c5cd20804e3cb0d31e7d899d8dd091f569c33fe40d4bade670a067ab7d31c2ac",
- "sha256:c6b232c43e89755ba332c2745ddab059c0bc1a0f01448a3a14d506f8448b1ce6",
- "sha256:c7e06baea05de57e1e7548064f505a6964e992674fe61b8f274afe2ac93b6371",
- "sha256:c89d2dcb271d24c44f02264233b75d5db8c58831190fa92456a90b87fa17b748",
- "sha256:cf3d2299b054e57a9f97ca08704c2843e44f29b57dc69b76a2592ecd212efe1a",
- "sha256:cf6844035abf47d52a1c3f4257255af3bf3b0f14d559b08eaa45885418c6c55d",
- "sha256:d1a6f889514ee2452300c9a06862fceedef22a2891f1c421a27b1ba52ef130b2",
- "sha256:d302deff8cb63a7feffc1844e4dafc8076e566bbf10c5aaaf0f4fe791b8a6bd0",
- "sha256:d3cfb4089e96f8f8ee9554da93148a9261aa6612ad2cc202c1a494c7b712e31f",
- "sha256:d92144e0cd6e6e841a6ad343e9d58631626eeb4ac96b0322649379b5d4527447",
- "sha256:d968116caddd19d63120d1298e62b1bbc694db3360ed0d5df8c3a97edbc12552",
- "sha256:d968dde69e3fe903bf9ef00667669dcf04a3e096e33aaf138775106ead138bc8",
- "sha256:e38d7a56b1a79ed0bbb9e6fe376d82e3f4dcc646ae47472f2c858e19a597c112",
- "sha256:e38d8a325f9a6afac1b1c72d996d1add9e1b99696ce9410538ba5e9aa8fdba02",
- "sha256:e665b14ab50aa175cfa306fcb00fffd4e3ff02ceb36ca6a4df00b1246d6a73c4",
- "sha256:e812a4e656bbd1c1c15c844b28259c49e26bb384837e44e8d2aa55412c91d2f7",
- "sha256:ea4f5ecf9dbea93c827486f59c606684c3496ea71c7ba9a8131932780696e61a",
- "sha256:eb5316c9a65c4dde80796aa245b76011bab64eb84461a77b0a61c1bf2970bcc9",
- "sha256:f1e8ba6414ac1ae536129e18c069f3eb497df5a74e136e3566471620a4fa5f95",
- "sha256:f3982a9c16c1c4bc05a00b65d01ffb8d80ea1a7b6b533be2f1a769d3e989d2c0",
- "sha256:f50763cd819d4a52a47b5966d4bb47dee34b637c5fa6402509800eee6ecb61e6",
- "sha256:f7c7f89e0bc4246115754e2eda078a111282f6d6ecc6fb458557b724fe6f2aac",
- "sha256:f9ea0678806c53d96758e74c6a898f9d506a2e3367a344757f768bef9e069366",
- "sha256:fcb91ba42903de637b94a1b64477f381f94ad82c0742c264f9245be76a7a3cbc"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==3.1.0"
- },
- "hpack": {
- "hashes": [
- "sha256:157ac792668d995c657d93111f46b4535ed114f0c9c8d672271bbec7eae1b496",
- "sha256:ec5eca154f7056aa06f196a557655c5b009b382873ac8d1e66e79e87535f1dca"
- ],
- "markers": "python_version >= '3.9'",
- "version": "==4.1.0"
- },
- "httpcore": {
- "hashes": [
- "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c",
- "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==1.0.7"
- },
- "httptools": {
- "hashes": [
- "sha256:0614154d5454c21b6410fdf5262b4a3ddb0f53f1e1721cfd59d55f32138c578a",
- "sha256:0e563e54979e97b6d13f1bbc05a96109923e76b901f786a5eae36e99c01237bd",
- "sha256:16e603a3bff50db08cd578d54f07032ca1631450ceb972c2f834c2b860c28ea2",
- "sha256:288cd628406cc53f9a541cfaf06041b4c71d751856bab45e3702191f931ccd17",
- "sha256:28908df1b9bb8187393d5b5db91435ccc9c8e891657f9cbb42a2541b44c82fc8",
- "sha256:322d20ea9cdd1fa98bd6a74b77e2ec5b818abdc3d36695ab402a0de8ef2865a3",
- "sha256:342dd6946aa6bda4b8f18c734576106b8a31f2fe31492881a9a160ec84ff4bd5",
- "sha256:345c288418f0944a6fe67be8e6afa9262b18c7626c3ef3c28adc5eabc06a68da",
- "sha256:3c73ce323711a6ffb0d247dcd5a550b8babf0f757e86a52558fe5b86d6fefcc0",
- "sha256:40a5ec98d3f49904b9fe36827dcf1aadfef3b89e2bd05b0e35e94f97c2b14721",
- "sha256:40b0f7fe4fd38e6a507bdb751db0379df1e99120c65fbdc8ee6c1d044897a636",
- "sha256:40dc6a8e399e15ea525305a2ddba998b0af5caa2566bcd79dcbe8948181eeaff",
- "sha256:4b36913ba52008249223042dca46e69967985fb4051951f94357ea681e1f5dc0",
- "sha256:4d87b29bd4486c0093fc64dea80231f7c7f7eb4dc70ae394d70a495ab8436071",
- "sha256:4e93eee4add6493b59a5c514da98c939b244fce4a0d8879cd3f466562f4b7d5c",
- "sha256:59e724f8b332319e2875efd360e61ac07f33b492889284a3e05e6d13746876f4",
- "sha256:69422b7f458c5af875922cdb5bd586cc1f1033295aa9ff63ee196a87519ac8e1",
- "sha256:703c346571fa50d2e9856a37d7cd9435a25e7fd15e236c397bf224afaa355fe9",
- "sha256:85071a1e8c2d051b507161f6c3e26155b5c790e4e28d7f236422dbacc2a9cc44",
- "sha256:856f4bc0478ae143bad54a4242fccb1f3f86a6e1be5548fecfd4102061b3a083",
- "sha256:85797e37e8eeaa5439d33e556662cc370e474445d5fab24dcadc65a8ffb04003",
- "sha256:90d96a385fa941283ebd231464045187a31ad932ebfa541be8edf5b3c2328959",
- "sha256:94978a49b8f4569ad607cd4946b759d90b285e39c0d4640c6b36ca7a3ddf2efc",
- "sha256:aafe0f1918ed07b67c1e838f950b1c1fabc683030477e60b335649b8020e1076",
- "sha256:ab9ba8dcf59de5181f6be44a77458e45a578fc99c31510b8c65b7d5acc3cf490",
- "sha256:ade273d7e767d5fae13fa637f4d53b6e961fb7fd93c7797562663f0171c26660",
- "sha256:b799de31416ecc589ad79dd85a0b2657a8fe39327944998dea368c1d4c9e55e6",
- "sha256:c26f313951f6e26147833fc923f78f95604bbec812a43e5ee37f26dc9e5a686c",
- "sha256:ca80b7485c76f768a3bc83ea58373f8db7b015551117375e4918e2aa77ea9b50",
- "sha256:d1ffd262a73d7c28424252381a5b854c19d9de5f56f075445d33919a637e3547",
- "sha256:d3f0d369e7ffbe59c4b6116a44d6a8eb4783aae027f2c0b366cf0aa964185dba",
- "sha256:d54efd20338ac52ba31e7da78e4a72570cf729fac82bc31ff9199bedf1dc7440",
- "sha256:dacdd3d10ea1b4ca9df97a0a303cbacafc04b5cd375fa98732678151643d4988",
- "sha256:db353d22843cf1028f43c3651581e4bb49374d85692a85f95f7b9a130e1b2cab",
- "sha256:db78cb9ca56b59b016e64b6031eda5653be0589dba2b1b43453f6e8b405a0970",
- "sha256:deee0e3343f98ee8047e9f4c5bc7cedbf69f5734454a94c38ee829fb2d5fa3c1",
- "sha256:df017d6c780287d5c80601dafa31f17bddb170232d85c066604d8558683711a2",
- "sha256:df959752a0c2748a65ab5387d08287abf6779ae9165916fe053e68ae1fbdc47f",
- "sha256:ec4f178901fa1834d4a060320d2f3abc5c9e39766953d038f1458cb885f47e81",
- "sha256:f47f8ed67cc0ff862b84a1189831d1d33c963fb3ce1ee0c65d3b0cbe7b711069",
- "sha256:f8787367fbdfccae38e35abf7641dafc5310310a5987b689f4c32cc8cc3ee975",
- "sha256:f9eb89ecf8b290f2e293325c646a211ff1c2493222798bb80a530c5e7502494f",
- "sha256:fc411e1c0a7dcd2f902c7c48cf079947a7e65b5485dea9decb82b9105ca71a43"
- ],
- "markers": "python_full_version >= '3.8.0'",
- "version": "==0.6.4"
- },
- "httpx": {
- "extras": [
- "http2"
- ],
- "hashes": [
- "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc",
- "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==0.28.1"
- },
- "httpx-oauth": {
- "hashes": [
- "sha256:2fcad82f80f28d0473a0fc4b4eda223dc952050af7e3a8c8781342d850f09fb5",
- "sha256:7402f061f860abc092ea4f5c90acfc576a40bbb79633c1d2920f1ca282c296ee"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.9'",
- "version": "==0.16.1"
- },
- "humanize": {
- "hashes": [
- "sha256:b53caaec8532bcb2fff70c8826f904c35943f8cecaca29d272d9df38092736c0",
- "sha256:e66f36020a2d5a974c504bd2555cf770621dbdbb6d82f94a6857c0b1ea2608be"
- ],
- "markers": "python_version >= '3.9'",
- "version": "==4.11.0"
- },
- "hyperframe": {
- "hashes": [
- "sha256:b03380493a519fce58ea5af42e4a42317bf9bd425596f7a0835ffce80f1a42e5",
- "sha256:f630908a00854a7adeabd6382b43923a4c4cd4b821fcb527e6ab9e15382a3b08"
- ],
- "markers": "python_version >= '3.9'",
- "version": "==6.1.0"
- },
- "idna": {
- "hashes": [
- "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9",
- "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"
- ],
- "markers": "python_version >= '3.6'",
- "version": "==3.10"
- },
- "imap-tools": {
- "hashes": [
- "sha256:b5f0611156ad7ab64ea2a7283312480f5787406275f11574e35b3190028062df",
- "sha256:c2a866ec8c875613b6306b5874bd82d126d94ff85fbc6d5180f038f25af336f1"
- ],
- "index": "pypi",
- "version": "==1.9.1"
- },
- "img2pdf": {
- "hashes": [
- "sha256:73847e47242f4b5bd113c70049e03e03212936c2727cd2a8bf564229a67d0b95"
- ],
- "version": "==0.5.1"
- },
- "inflection": {
- "hashes": [
- "sha256:1a29730d366e996aaacffb2f1f1cb9593dc38e2ddd30c91250c6dde09ea9b417",
- "sha256:f38b2b640938a4f35ade69ac3d053042959b62a0f1076a5bbaa1b9526605a8a2"
- ],
- "markers": "python_version >= '3.5'",
- "version": "==0.5.1"
- },
- "inotify-simple": {
- "hashes": [
- "sha256:8440ffe49c4ae81a8df57c1ae1eb4b6bfa7acb830099bfb3e305b383005cc128"
- ],
- "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1'",
- "version": "==1.3.5"
- },
- "inotifyrecursive": {
- "hashes": [
- "sha256:7e5f4a2e1dc2bef0efa3b5f6b339c41fb4599055a2b54909d020e9e932cc8d2f",
- "sha256:a2c450b317693e4538416f90eb1d7858506dafe6b8b885037bd2dd9ae2dafa1e"
- ],
- "index": "pypi",
- "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1'",
- "version": "==0.3.5"
- },
- "jinja2": {
- "hashes": [
- "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb",
- "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.7'",
- "version": "==3.1.5"
- },
- "joblib": {
- "hashes": [
- "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6",
- "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==1.4.2"
- },
- "jsonschema": {
- "hashes": [
- "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4",
- "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==4.23.0"
- },
- "jsonschema-specifications": {
- "hashes": [
- "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272",
- "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf"
- ],
- "markers": "python_version >= '3.9'",
- "version": "==2024.10.1"
- },
- "kombu": {
- "hashes": [
- "sha256:14212f5ccf022fc0a70453bb025a1dcc32782a588c49ea866884047d66e14763",
- "sha256:eef572dd2fd9fc614b37580e3caeafdd5af46c1eff31e7fba89138cdb406f2cf"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==5.4.2"
- },
- "langdetect": {
- "hashes": [
- "sha256:7cbc0746252f19e76f77c0b1690aadf01963be835ef0cd4b56dddf2a8f1dfc2a",
- "sha256:cbc1fef89f8d062739774bd51eda3da3274006b3661d199c2655f6b3f6d605a0"
- ],
- "index": "pypi",
- "version": "==1.0.9"
- },
- "lxml": {
- "hashes": [
- "sha256:01220dca0d066d1349bd6a1726856a78f7929f3878f7e2ee83c296c69495309e",
- "sha256:02ced472497b8362c8e902ade23e3300479f4f43e45f4105c85ef43b8db85229",
- "sha256:052d99051e77a4f3e8482c65014cf6372e61b0a6f4fe9edb98503bb5364cfee3",
- "sha256:07da23d7ee08577760f0a71d67a861019103e4812c87e2fab26b039054594cc5",
- "sha256:094cb601ba9f55296774c2d57ad68730daa0b13dc260e1f941b4d13678239e70",
- "sha256:0a7056921edbdd7560746f4221dca89bb7a3fe457d3d74267995253f46343f15",
- "sha256:0c120f43553ec759f8de1fee2f4794452b0946773299d44c36bfe18e83caf002",
- "sha256:0d7b36afa46c97875303a94e8f3ad932bf78bace9e18e603f2085b652422edcd",
- "sha256:0fdf3a3059611f7585a78ee10399a15566356116a4288380921a4b598d807a22",
- "sha256:109fa6fede314cc50eed29e6e56c540075e63d922455346f11e4d7a036d2b8cf",
- "sha256:146173654d79eb1fc97498b4280c1d3e1e5d58c398fa530905c9ea50ea849b22",
- "sha256:1473427aff3d66a3fa2199004c3e601e6c4500ab86696edffdbc84954c72d832",
- "sha256:1483fd3358963cc5c1c9b122c80606a3a79ee0875bcac0204149fa09d6ff2727",
- "sha256:168f2dfcfdedf611eb285efac1516c8454c8c99caf271dccda8943576b67552e",
- "sha256:17e8d968d04a37c50ad9c456a286b525d78c4a1c15dd53aa46c1d8e06bf6fa30",
- "sha256:18feb4b93302091b1541221196a2155aa296c363fd233814fa11e181adebc52f",
- "sha256:1afe0a8c353746e610bd9031a630a95bcfb1a720684c3f2b36c4710a0a96528f",
- "sha256:1d04f064bebdfef9240478f7a779e8c5dc32b8b7b0b2fc6a62e39b928d428e51",
- "sha256:1fdc9fae8dd4c763e8a31e7630afef517eab9f5d5d31a278df087f307bf601f4",
- "sha256:1ffc23010330c2ab67fac02781df60998ca8fe759e8efde6f8b756a20599c5de",
- "sha256:20094fc3f21ea0a8669dc4c61ed7fa8263bd37d97d93b90f28fc613371e7a875",
- "sha256:213261f168c5e1d9b7535a67e68b1f59f92398dd17a56d934550837143f79c42",
- "sha256:218c1b2e17a710e363855594230f44060e2025b05c80d1f0661258142b2add2e",
- "sha256:23e0553b8055600b3bf4a00b255ec5c92e1e4aebf8c2c09334f8368e8bd174d6",
- "sha256:25f1b69d41656b05885aa185f5fdf822cb01a586d1b32739633679699f220391",
- "sha256:2b3778cb38212f52fac9fe913017deea2fdf4eb1a4f8e4cfc6b009a13a6d3fcc",
- "sha256:2bc9fd5ca4729af796f9f59cd8ff160fe06a474da40aca03fcc79655ddee1a8b",
- "sha256:2c226a06ecb8cdef28845ae976da407917542c5e6e75dcac7cc33eb04aaeb237",
- "sha256:2c3406b63232fc7e9b8783ab0b765d7c59e7c59ff96759d8ef9632fca27c7ee4",
- "sha256:2c86bf781b12ba417f64f3422cfc302523ac9cd1d8ae8c0f92a1c66e56ef2e86",
- "sha256:2d9b8d9177afaef80c53c0a9e30fa252ff3036fb1c6494d427c066a4ce6a282f",
- "sha256:2dec2d1130a9cda5b904696cec33b2cfb451304ba9081eeda7f90f724097300a",
- "sha256:2dfab5fa6a28a0b60a20638dc48e6343c02ea9933e3279ccb132f555a62323d8",
- "sha256:2ecdd78ab768f844c7a1d4a03595038c166b609f6395e25af9b0f3f26ae1230f",
- "sha256:315f9542011b2c4e1d280e4a20ddcca1761993dda3afc7a73b01235f8641e903",
- "sha256:36aef61a1678cb778097b4a6eeae96a69875d51d1e8f4d4b491ab3cfb54b5a03",
- "sha256:384aacddf2e5813a36495233b64cb96b1949da72bef933918ba5c84e06af8f0e",
- "sha256:3879cc6ce938ff4eb4900d901ed63555c778731a96365e53fadb36437a131a99",
- "sha256:3c174dc350d3ec52deb77f2faf05c439331d6ed5e702fc247ccb4e6b62d884b7",
- "sha256:3eb44520c4724c2e1a57c0af33a379eee41792595023f367ba3952a2d96c2aab",
- "sha256:406246b96d552e0503e17a1006fd27edac678b3fcc9f1be71a2f94b4ff61528d",
- "sha256:41ce1f1e2c7755abfc7e759dc34d7d05fd221723ff822947132dc934d122fe22",
- "sha256:423b121f7e6fa514ba0c7918e56955a1d4470ed35faa03e3d9f0e3baa4c7e492",
- "sha256:44264ecae91b30e5633013fb66f6ddd05c006d3e0e884f75ce0b4755b3e3847b",
- "sha256:482c2f67761868f0108b1743098640fbb2a28a8e15bf3f47ada9fa59d9fe08c3",
- "sha256:4b0c7a688944891086ba192e21c5229dea54382f4836a209ff8d0a660fac06be",
- "sha256:4c1fefd7e3d00921c44dc9ca80a775af49698bbfd92ea84498e56acffd4c5469",
- "sha256:4e109ca30d1edec1ac60cdbe341905dc3b8f55b16855e03a54aaf59e51ec8c6f",
- "sha256:501d0d7e26b4d261fca8132854d845e4988097611ba2531408ec91cf3fd9d20a",
- "sha256:516f491c834eb320d6c843156440fe7fc0d50b33e44387fcec5b02f0bc118a4c",
- "sha256:51806cfe0279e06ed8500ce19479d757db42a30fd509940b1701be9c86a5ff9a",
- "sha256:562e7494778a69086f0312ec9689f6b6ac1c6b65670ed7d0267e49f57ffa08c4",
- "sha256:56b9861a71575f5795bde89256e7467ece3d339c9b43141dbdd54544566b3b94",
- "sha256:5b8f5db71b28b8c404956ddf79575ea77aa8b1538e8b2ef9ec877945b3f46442",
- "sha256:5c2fb570d7823c2bbaf8b419ba6e5662137f8166e364a8b2b91051a1fb40ab8b",
- "sha256:5c54afdcbb0182d06836cc3d1be921e540be3ebdf8b8a51ee3ef987537455f84",
- "sha256:5d6a6972b93c426ace71e0be9a6f4b2cfae9b1baed2eed2006076a746692288c",
- "sha256:609251a0ca4770e5a8768ff902aa02bf636339c5a93f9349b48eb1f606f7f3e9",
- "sha256:62d172f358f33a26d6b41b28c170c63886742f5b6772a42b59b4f0fa10526cb1",
- "sha256:62f7fdb0d1ed2065451f086519865b4c90aa19aed51081979ecd05a21eb4d1be",
- "sha256:658f2aa69d31e09699705949b5fc4719cbecbd4a97f9656a232e7d6c7be1a367",
- "sha256:65ab5685d56914b9a2a34d67dd5488b83213d680b0c5d10b47f81da5a16b0b0e",
- "sha256:68934b242c51eb02907c5b81d138cb977b2129a0a75a8f8b60b01cb8586c7b21",
- "sha256:68b87753c784d6acb8a25b05cb526c3406913c9d988d51f80adecc2b0775d6aa",
- "sha256:69959bd3167b993e6e710b99051265654133a98f20cec1d9b493b931942e9c16",
- "sha256:6a7095eeec6f89111d03dabfe5883a1fd54da319c94e0fb104ee8f23616b572d",
- "sha256:6b038cc86b285e4f9fea2ba5ee76e89f21ed1ea898e287dc277a25884f3a7dfe",
- "sha256:6ba0d3dcac281aad8a0e5b14c7ed6f9fa89c8612b47939fc94f80b16e2e9bc83",
- "sha256:6e91cf736959057f7aac7adfc83481e03615a8e8dd5758aa1d95ea69e8931dba",
- "sha256:6ee8c39582d2652dcd516d1b879451500f8db3fe3607ce45d7c5957ab2596040",
- "sha256:6f651ebd0b21ec65dfca93aa629610a0dbc13dbc13554f19b0113da2e61a4763",
- "sha256:71a8dd38fbd2f2319136d4ae855a7078c69c9a38ae06e0c17c73fd70fc6caad8",
- "sha256:74068c601baff6ff021c70f0935b0c7bc528baa8ea210c202e03757c68c5a4ff",
- "sha256:7437237c6a66b7ca341e868cda48be24b8701862757426852c9b3186de1da8a2",
- "sha256:747a3d3e98e24597981ca0be0fd922aebd471fa99d0043a3842d00cdcad7ad6a",
- "sha256:74bcb423462233bc5d6066e4e98b0264e7c1bed7541fff2f4e34fe6b21563c8b",
- "sha256:78d9b952e07aed35fe2e1a7ad26e929595412db48535921c5013edc8aa4a35ce",
- "sha256:7b1cd427cb0d5f7393c31b7496419da594fe600e6fdc4b105a54f82405e6626c",
- "sha256:7d3d1ca42870cdb6d0d29939630dbe48fa511c203724820fc0fd507b2fb46577",
- "sha256:7e2f58095acc211eb9d8b5771bf04df9ff37d6b87618d1cbf85f92399c98dae8",
- "sha256:7f41026c1d64043a36fda21d64c5026762d53a77043e73e94b71f0521939cc71",
- "sha256:81b4e48da4c69313192d8c8d4311e5d818b8be1afe68ee20f6385d0e96fc9512",
- "sha256:86a6b24b19eaebc448dc56b87c4865527855145d851f9fc3891673ff97950540",
- "sha256:874a216bf6afaf97c263b56371434e47e2c652d215788396f60477540298218f",
- "sha256:89e043f1d9d341c52bf2af6d02e6adde62e0a46e6755d5eb60dc6e4f0b8aeca2",
- "sha256:8c72e9563347c7395910de6a3100a4840a75a6f60e05af5e58566868d5eb2d6a",
- "sha256:8dc2c0395bea8254d8daebc76dcf8eb3a95ec2a46fa6fae5eaccee366bfe02ce",
- "sha256:8f0de2d390af441fe8b2c12626d103540b5d850d585b18fcada58d972b74a74e",
- "sha256:92e67a0be1639c251d21e35fe74df6bcc40cba445c2cda7c4a967656733249e2",
- "sha256:94d6c3782907b5e40e21cadf94b13b0842ac421192f26b84c45f13f3c9d5dc27",
- "sha256:97acf1e1fd66ab53dacd2c35b319d7e548380c2e9e8c54525c6e76d21b1ae3b1",
- "sha256:9ada35dd21dc6c039259596b358caab6b13f4db4d4a7f8665764d616daf9cc1d",
- "sha256:9c52100e2c2dbb0649b90467935c4b0de5528833c76a35ea1a2691ec9f1ee7a1",
- "sha256:9e41506fec7a7f9405b14aa2d5c8abbb4dbbd09d88f9496958b6d00cb4d45330",
- "sha256:9e4b47ac0f5e749cfc618efdf4726269441014ae1d5583e047b452a32e221920",
- "sha256:9fb81d2824dff4f2e297a276297e9031f46d2682cafc484f49de182aa5e5df99",
- "sha256:a0eabd0a81625049c5df745209dc7fcef6e2aea7793e5f003ba363610aa0a3ff",
- "sha256:a3d819eb6f9b8677f57f9664265d0a10dd6551d227afb4af2b9cd7bdc2ccbf18",
- "sha256:a87de7dd873bf9a792bf1e58b1c3887b9264036629a5bf2d2e6579fe8e73edff",
- "sha256:aa617107a410245b8660028a7483b68e7914304a6d4882b5ff3d2d3eb5948d8c",
- "sha256:aac0bbd3e8dd2d9c45ceb82249e8bdd3ac99131a32b4d35c8af3cc9db1657179",
- "sha256:ab6dd83b970dc97c2d10bc71aa925b84788c7c05de30241b9e96f9b6d9ea3080",
- "sha256:ace2c2326a319a0bb8a8b0e5b570c764962e95818de9f259ce814ee666603f19",
- "sha256:ae5fe5c4b525aa82b8076c1a59d642c17b6e8739ecf852522c6321852178119d",
- "sha256:b11a5d918a6216e521c715b02749240fb07ae5a1fefd4b7bf12f833bc8b4fe70",
- "sha256:b1c8c20847b9f34e98080da785bb2336ea982e7f913eed5809e5a3c872900f32",
- "sha256:b369d3db3c22ed14c75ccd5af429086f166a19627e84a8fdade3f8f31426e52a",
- "sha256:b710bc2b8292966b23a6a0121f7a6c51d45d2347edcc75f016ac123b8054d3f2",
- "sha256:bd96517ef76c8654446fc3db9242d019a1bb5fe8b751ba414765d59f99210b79",
- "sha256:c00f323cc00576df6165cc9d21a4c21285fa6b9989c5c39830c3903dc4303ef3",
- "sha256:c162b216070f280fa7da844531169be0baf9ccb17263cf5a8bf876fcd3117fa5",
- "sha256:c1a69e58a6bb2de65902051d57fde951febad631a20a64572677a1052690482f",
- "sha256:c1f794c02903c2824fccce5b20c339a1a14b114e83b306ff11b597c5f71a1c8d",
- "sha256:c24037349665434f375645fa9d1f5304800cec574d0310f618490c871fd902b3",
- "sha256:c300306673aa0f3ed5ed9372b21867690a17dba38c68c44b287437c362ce486b",
- "sha256:c56a1d43b2f9ee4786e4658c7903f05da35b923fb53c11025712562d5cc02753",
- "sha256:c6379f35350b655fd817cd0d6cbeef7f265f3ae5fedb1caae2eb442bbeae9ab9",
- "sha256:c802e1c2ed9f0c06a65bc4ed0189d000ada8049312cfeab6ca635e39c9608957",
- "sha256:cb83f8a875b3d9b458cada4f880fa498646874ba4011dc974e071a0a84a1b033",
- "sha256:cf120cce539453ae086eacc0130a324e7026113510efa83ab42ef3fcfccac7fb",
- "sha256:dd36439be765e2dde7660212b5275641edbc813e7b24668831a5c8ac91180656",
- "sha256:dd5350b55f9fecddc51385463a4f67a5da829bc741e38cf689f38ec9023f54ab",
- "sha256:df5c7333167b9674aa8ae1d4008fa4bc17a313cc490b2cca27838bbdcc6bb15b",
- "sha256:e63601ad5cd8f860aa99d109889b5ac34de571c7ee902d6812d5d9ddcc77fa7d",
- "sha256:e92ce66cd919d18d14b3856906a61d3f6b6a8500e0794142338da644260595cd",
- "sha256:e99f5507401436fdcc85036a2e7dc2e28d962550afe1cbfc07c40e454256a859",
- "sha256:ea2e2f6f801696ad7de8aec061044d6c8c0dd4037608c7cab38a9a4d316bfb11",
- "sha256:eafa2c8658f4e560b098fe9fc54539f86528651f61849b22111a9b107d18910c",
- "sha256:ecd4ad8453ac17bc7ba3868371bffb46f628161ad0eefbd0a855d2c8c32dd81a",
- "sha256:ee70d08fd60c9565ba8190f41a46a54096afa0eeb8f76bd66f2c25d3b1b83005",
- "sha256:eec1bb8cdbba2925bedc887bc0609a80e599c75b12d87ae42ac23fd199445654",
- "sha256:ef0c1fe22171dd7c7c27147f2e9c3e86f8bdf473fed75f16b0c2e84a5030ce80",
- "sha256:f2901429da1e645ce548bf9171784c0f74f0718c3f6150ce166be39e4dd66c3e",
- "sha256:f422a209d2455c56849442ae42f25dbaaba1c6c3f501d58761c619c7836642ec",
- "sha256:f65e5120863c2b266dbcc927b306c5b78e502c71edf3295dfcb9501ec96e5fc7",
- "sha256:f7d4a670107d75dfe5ad080bed6c341d18c4442f9378c9f58e5851e86eb79965",
- "sha256:f914c03e6a31deb632e2daa881fe198461f4d06e57ac3d0e05bbcab8eae01945",
- "sha256:fb66442c2546446944437df74379e9cf9e9db353e61301d1a0e26482f43f0dd8"
- ],
- "markers": "python_version >= '3.6'",
- "version": "==5.3.0"
- },
- "markdown-it-py": {
- "hashes": [
- "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1",
- "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==3.0.0"
- },
- "markupsafe": {
- "hashes": [
- "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4",
- "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30",
- "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0",
- "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9",
- "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396",
- "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13",
- "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028",
- "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca",
- "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557",
- "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832",
- "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0",
- "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b",
- "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579",
- "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a",
- "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c",
- "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff",
- "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c",
- "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22",
- "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094",
- "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb",
- "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e",
- "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5",
- "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a",
- "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d",
- "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a",
- "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b",
- "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8",
- "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225",
- "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c",
- "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144",
- "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f",
- "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87",
- "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d",
- "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93",
- "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf",
- "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158",
- "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84",
- "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb",
- "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48",
- "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171",
- "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c",
- "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6",
- "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd",
- "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d",
- "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1",
- "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d",
- "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca",
- "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a",
- "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29",
- "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe",
- "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798",
- "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c",
- "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8",
- "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f",
- "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f",
- "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a",
- "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178",
- "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0",
- "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79",
- "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430",
- "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"
- ],
- "markers": "python_version >= '3.9'",
- "version": "==3.0.2"
- },
- "mdurl": {
- "hashes": [
- "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8",
- "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"
- ],
- "markers": "python_version >= '3.7'",
- "version": "==0.1.2"
- },
- "msgpack": {
- "hashes": [
- "sha256:06f5fd2f6bb2a7914922d935d3b8bb4a7fff3a9a91cfce6d06c13bc42bec975b",
- "sha256:071603e2f0771c45ad9bc65719291c568d4edf120b44eb36324dcb02a13bfddf",
- "sha256:0907e1a7119b337971a689153665764adc34e89175f9a34793307d9def08e6ca",
- "sha256:0f92a83b84e7c0749e3f12821949d79485971f087604178026085f60ce109330",
- "sha256:115a7af8ee9e8cddc10f87636767857e7e3717b7a2e97379dc2054712693e90f",
- "sha256:13599f8829cfbe0158f6456374e9eea9f44eee08076291771d8ae93eda56607f",
- "sha256:17fb65dd0bec285907f68b15734a993ad3fc94332b5bb21b0435846228de1f39",
- "sha256:2137773500afa5494a61b1208619e3871f75f27b03bcfca7b3a7023284140247",
- "sha256:3180065ec2abbe13a4ad37688b61b99d7f9e012a535b930e0e683ad6bc30155b",
- "sha256:398b713459fea610861c8a7b62a6fec1882759f308ae0795b5413ff6a160cf3c",
- "sha256:3d364a55082fb2a7416f6c63ae383fbd903adb5a6cf78c5b96cc6316dc1cedc7",
- "sha256:3df7e6b05571b3814361e8464f9304c42d2196808e0119f55d0d3e62cd5ea044",
- "sha256:41c991beebf175faf352fb940bf2af9ad1fb77fd25f38d9142053914947cdbf6",
- "sha256:42f754515e0f683f9c79210a5d1cad631ec3d06cea5172214d2176a42e67e19b",
- "sha256:452aff037287acb1d70a804ffd022b21fa2bb7c46bee884dbc864cc9024128a0",
- "sha256:4676e5be1b472909b2ee6356ff425ebedf5142427842aa06b4dfd5117d1ca8a2",
- "sha256:46c34e99110762a76e3911fc923222472c9d681f1094096ac4102c18319e6468",
- "sha256:471e27a5787a2e3f974ba023f9e265a8c7cfd373632247deb225617e3100a3c7",
- "sha256:4a1964df7b81285d00a84da4e70cb1383f2e665e0f1f2a7027e683956d04b734",
- "sha256:4b51405e36e075193bc051315dbf29168d6141ae2500ba8cd80a522964e31434",
- "sha256:4d1b7ff2d6146e16e8bd665ac726a89c74163ef8cd39fa8c1087d4e52d3a2325",
- "sha256:53258eeb7a80fc46f62fd59c876957a2d0e15e6449a9e71842b6d24419d88ca1",
- "sha256:534480ee5690ab3cbed89d4c8971a5c631b69a8c0883ecfea96c19118510c846",
- "sha256:58638690ebd0a06427c5fe1a227bb6b8b9fdc2bd07701bec13c2335c82131a88",
- "sha256:58dfc47f8b102da61e8949708b3eafc3504509a5728f8b4ddef84bd9e16ad420",
- "sha256:59caf6a4ed0d164055ccff8fe31eddc0ebc07cf7326a2aaa0dbf7a4001cd823e",
- "sha256:5dbad74103df937e1325cc4bfeaf57713be0b4f15e1c2da43ccdd836393e2ea2",
- "sha256:5e1da8f11a3dd397f0a32c76165cf0c4eb95b31013a94f6ecc0b280c05c91b59",
- "sha256:646afc8102935a388ffc3914b336d22d1c2d6209c773f3eb5dd4d6d3b6f8c1cb",
- "sha256:64fc9068d701233effd61b19efb1485587560b66fe57b3e50d29c5d78e7fef68",
- "sha256:65553c9b6da8166e819a6aa90ad15288599b340f91d18f60b2061f402b9a4915",
- "sha256:685ec345eefc757a7c8af44a3032734a739f8c45d1b0ac45efc5d8977aa4720f",
- "sha256:6ad622bf7756d5a497d5b6836e7fc3752e2dd6f4c648e24b1803f6048596f701",
- "sha256:73322a6cc57fcee3c0c57c4463d828e9428275fb85a27aa2aa1a92fdc42afd7b",
- "sha256:74bed8f63f8f14d75eec75cf3d04ad581da6b914001b474a5d3cd3372c8cc27d",
- "sha256:79ec007767b9b56860e0372085f8504db5d06bd6a327a335449508bbee9648fa",
- "sha256:7a946a8992941fea80ed4beae6bff74ffd7ee129a90b4dd5cf9c476a30e9708d",
- "sha256:7ad442d527a7e358a469faf43fda45aaf4ac3249c8310a82f0ccff9164e5dccd",
- "sha256:7c9a35ce2c2573bada929e0b7b3576de647b0defbd25f5139dcdaba0ae35a4cc",
- "sha256:7e7b853bbc44fb03fbdba34feb4bd414322180135e2cb5164f20ce1c9795ee48",
- "sha256:879a7b7b0ad82481c52d3c7eb99bf6f0645dbdec5134a4bddbd16f3506947feb",
- "sha256:8a706d1e74dd3dea05cb54580d9bd8b2880e9264856ce5068027eed09680aa74",
- "sha256:8a84efb768fb968381e525eeeb3d92857e4985aacc39f3c47ffd00eb4509315b",
- "sha256:8cf9e8c3a2153934a23ac160cc4cba0ec035f6867c8013cc6077a79823370346",
- "sha256:8da4bf6d54ceed70e8861f833f83ce0814a2b72102e890cbdfe4b34764cdd66e",
- "sha256:8e59bca908d9ca0de3dc8684f21ebf9a690fe47b6be93236eb40b99af28b6ea6",
- "sha256:914571a2a5b4e7606997e169f64ce53a8b1e06f2cf2c3a7273aa106236d43dd5",
- "sha256:a51abd48c6d8ac89e0cfd4fe177c61481aca2d5e7ba42044fd218cfd8ea9899f",
- "sha256:a52a1f3a5af7ba1c9ace055b659189f6c669cf3657095b50f9602af3a3ba0fe5",
- "sha256:ad33e8400e4ec17ba782f7b9cf868977d867ed784a1f5f2ab46e7ba53b6e1e1b",
- "sha256:b4c01941fd2ff87c2a934ee6055bda4ed353a7846b8d4f341c428109e9fcde8c",
- "sha256:bce7d9e614a04d0883af0b3d4d501171fbfca038f12c77fa838d9f198147a23f",
- "sha256:c40ffa9a15d74e05ba1fe2681ea33b9caffd886675412612d93ab17b58ea2fec",
- "sha256:c5a91481a3cc573ac8c0d9aace09345d989dc4a0202b7fcb312c88c26d4e71a8",
- "sha256:c921af52214dcbb75e6bdf6a661b23c3e6417f00c603dd2070bccb5c3ef499f5",
- "sha256:d46cf9e3705ea9485687aa4001a76e44748b609d260af21c4ceea7f2212a501d",
- "sha256:d8ce0b22b890be5d252de90d0e0d119f363012027cf256185fc3d474c44b1b9e",
- "sha256:dd432ccc2c72b914e4cb77afce64aab761c1137cc698be3984eee260bcb2896e",
- "sha256:e0856a2b7e8dcb874be44fea031d22e5b3a19121be92a1e098f46068a11b0870",
- "sha256:e1f3c3d21f7cf67bcf2da8e494d30a75e4cf60041d98b3f79875afb5b96f3a3f",
- "sha256:f1ba6136e650898082d9d5a5217d5906d1e138024f836ff48691784bbe1adf96",
- "sha256:f3e9b4936df53b970513eac1758f3882c88658a220b58dcc1e39606dccaaf01c",
- "sha256:f80bc7d47f76089633763f952e67f8214cb7b3ee6bfa489b3cb6a84cfac114cd",
- "sha256:fd2906780f25c8ed5d7b323379f6138524ba793428db5d0e9d226d3fa6aa1788"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==1.1.0"
- },
- "mysqlclient": {
- "hashes": [
- "sha256:199dab53a224357dd0cb4d78ca0e54018f9cee9bf9ec68d72db50e0a23569076",
- "sha256:201a6faa301011dd07bca6b651fe5aaa546d7c9a5426835a06c3172e1056a3c5",
- "sha256:24ae22b59416d5fcce7e99c9d37548350b4565baac82f95e149cac6ce4163845",
- "sha256:2e3c11f7625029d7276ca506f8960a7fd3c5a0a0122c9e7404e6a8fe961b3d22",
- "sha256:4b4c0200890837fc64014cc938ef2273252ab544c1b12a6c1d674c23943f3f2e",
- "sha256:92af368ed9c9144737af569c86d3b6c74a012a6f6b792eb868384787b52bb585",
- "sha256:977e35244fe6ef44124e9a1c2d1554728a7b76695598e4b92b37dc2130503069",
- "sha256:a22d99d26baf4af68ebef430e3131bb5a9b722b79a9fcfac6d9bbf8a88800687"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.8'",
- "version": "==2.2.7"
- },
- "nltk": {
- "hashes": [
- "sha256:4fa26829c5b00715afe3061398a8989dc643b92ce7dd93fb4585a70930d168a1",
- "sha256:87d127bd3de4bd89a4f81265e5fa59cb1b199b27440175370f7417d2bc7ae868"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.8'",
- "version": "==3.9.1"
- },
- "numpy": {
- "hashes": [
- "sha256:02935e2c3c0c6cbe9c7955a8efa8908dd4221d7755644c59d1bba28b94fd334f",
- "sha256:0349b025e15ea9d05c3d63f9657707a4e1d471128a3b1d876c095f328f8ff7f0",
- "sha256:09d6a2032faf25e8d0cadde7fd6145118ac55d2740132c1d845f98721b5ebcfd",
- "sha256:0bc61b307655d1a7f9f4b043628b9f2b721e80839914ede634e3d485913e1fb2",
- "sha256:0eec19f8af947a61e968d5429f0bd92fec46d92b0008d0a6685b40d6adf8a4f4",
- "sha256:106397dbbb1896f99e044efc90360d098b3335060375c26aa89c0d8a97c5f648",
- "sha256:128c41c085cab8a85dc29e66ed88c05613dccf6bc28b3866cd16050a2f5448be",
- "sha256:149d1113ac15005652e8d0d3f6fd599360e1a708a4f98e43c9c77834a28238cb",
- "sha256:159ff6ee4c4a36a23fe01b7c3d07bd8c14cc433d9720f977fcd52c13c0098160",
- "sha256:22ea3bb552ade325530e72a0c557cdf2dea8914d3a5e1fecf58fa5dbcc6f43cd",
- "sha256:23ae9f0c2d889b7b2d88a3791f6c09e2ef827c2446f1c4a3e3e76328ee4afd9a",
- "sha256:250c16b277e3b809ac20d1f590716597481061b514223c7badb7a0f9993c7f84",
- "sha256:2ec6c689c61df613b783aeb21f945c4cbe6c51c28cb70aae8430577ab39f163e",
- "sha256:2ffbb1acd69fdf8e89dd60ef6182ca90a743620957afb7066385a7bbe88dc748",
- "sha256:3074634ea4d6df66be04f6728ee1d173cfded75d002c75fac79503a880bf3825",
- "sha256:356ca982c188acbfa6af0d694284d8cf20e95b1c3d0aefa8929376fea9146f60",
- "sha256:3fbe72d347fbc59f94124125e73fc4976a06927ebc503ec5afbfb35f193cd957",
- "sha256:40c7ff5da22cd391944a28c6a9c638a5eef77fcf71d6e3a79e1d9d9e82752715",
- "sha256:41184c416143defa34cc8eb9d070b0a5ba4f13a0fa96a709e20584638254b317",
- "sha256:451e854cfae0febe723077bd0cf0a4302a5d84ff25f0bfece8f29206c7bed02e",
- "sha256:4525b88c11906d5ab1b0ec1f290996c0020dd318af8b49acaa46f198b1ffc283",
- "sha256:463247edcee4a5537841d5350bc87fe8e92d7dd0e8c71c995d2c6eecb8208278",
- "sha256:4dbd80e453bd34bd003b16bd802fac70ad76bd463f81f0c518d1245b1c55e3d9",
- "sha256:57b4012e04cc12b78590a334907e01b3a85efb2107df2b8733ff1ed05fce71de",
- "sha256:5a8c863ceacae696aff37d1fd636121f1a512117652e5dfb86031c8d84836369",
- "sha256:5acea83b801e98541619af398cc0109ff48016955cc0818f478ee9ef1c5c3dcb",
- "sha256:642199e98af1bd2b6aeb8ecf726972d238c9877b0f6e8221ee5ab945ec8a2189",
- "sha256:64bd6e1762cd7f0986a740fee4dff927b9ec2c5e4d9a28d056eb17d332158014",
- "sha256:6d9fc9d812c81e6168b6d405bf00b8d6739a7f72ef22a9214c4241e0dc70b323",
- "sha256:7079129b64cb78bdc8d611d1fd7e8002c0a2565da6a47c4df8062349fee90e3e",
- "sha256:7dca87ca328f5ea7dafc907c5ec100d187911f94825f8700caac0b3f4c384b49",
- "sha256:860fd59990c37c3ef913c3ae390b3929d005243acca1a86facb0773e2d8d9e50",
- "sha256:8e6da5cffbbe571f93588f562ed130ea63ee206d12851b60819512dd3e1ba50d",
- "sha256:8ec0636d3f7d68520afc6ac2dc4b8341ddb725039de042faf0e311599f54eb37",
- "sha256:9491100aba630910489c1d0158034e1c9a6546f0b1340f716d522dc103788e39",
- "sha256:97b974d3ba0fb4612b77ed35d7627490e8e3dff56ab41454d9e8b23448940576",
- "sha256:995f9e8181723852ca458e22de5d9b7d3ba4da3f11cc1cb113f093b271d7965a",
- "sha256:9dd47ff0cb2a656ad69c38da850df3454da88ee9a6fde0ba79acceee0e79daba",
- "sha256:9fad446ad0bc886855ddf5909cbf8cb5d0faa637aaa6277fb4b19ade134ab3c7",
- "sha256:a972cec723e0563aa0823ee2ab1df0cb196ed0778f173b381c871a03719d4826",
- "sha256:ac9bea18d6d58a995fac1b2cb4488e17eceeac413af014b1dd26170b766d8467",
- "sha256:b0531f0b0e07643eb089df4c509d30d72c9ef40defa53e41363eca8a8cc61495",
- "sha256:b208cfd4f5fe34e1535c08983a1a6803fdbc7a1e86cf13dd0c61de0b51a0aadc",
- "sha256:b3482cb7b3325faa5f6bc179649406058253d91ceda359c104dac0ad320e1391",
- "sha256:b6fb9c32a91ec32a689ec6410def76443e3c750e7cfc3fb2206b985ffb2b85f0",
- "sha256:b78ea78450fd96a498f50ee096f69c75379af5138f7881a51355ab0e11286c97",
- "sha256:bd249bc894af67cbd8bad2c22e7cbcd46cf87ddfca1f1289d1e7e54868cc785c",
- "sha256:c7d1fd447e33ee20c1f33f2c8e6634211124a9aabde3c617687d8b739aa69eac",
- "sha256:d0bbe7dd86dca64854f4b6ce2ea5c60b51e36dfd597300057cf473d3615f2369",
- "sha256:d6d6a0910c3b4368d89dde073e630882cdb266755565155bc33520283b2d9df8",
- "sha256:da1eeb460ecce8d5b8608826595c777728cdf28ce7b5a5a8c8ac8d949beadcf2",
- "sha256:e0c8854b09bc4de7b041148d8550d3bd712b5c21ff6a8ed308085f190235d7ff",
- "sha256:e0d4142eb40ca6f94539e4db929410f2a46052a0fe7a2c1c59f6179c39938d2a",
- "sha256:e9e82dcb3f2ebbc8cb5ce1102d5f1c5ed236bf8a11730fb45ba82e2841ec21df",
- "sha256:ed6906f61834d687738d25988ae117683705636936cc605be0bb208b23df4d8f"
- ],
- "markers": "python_version >= '3.10'",
- "version": "==2.2.2"
- },
- "oauthlib": {
- "hashes": [
- "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca",
- "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918"
- ],
- "markers": "python_version >= '3.6'",
- "version": "==3.2.2"
- },
- "ocrmypdf": {
- "hashes": [
- "sha256:007f2c536415ff570d43aabc01996578d3d07f277c585be446da771aff6d9a48",
- "sha256:28b7437a571610717de54d3074eaa3456721a6ea54c05cc15ad8301fdfdd4392"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.10'",
- "version": "==16.8.0"
- },
- "packaging": {
- "hashes": [
- "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759",
- "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==24.2"
- },
- "pathvalidate": {
- "hashes": [
- "sha256:59b5b9278e30382d6d213497623043ebe63f10e29055be4419a9c04c721739cb",
- "sha256:5eaf0562e345d4b6d0c0239d0f690c3bd84d2a9a3c4c73b99ea667401b27bee1"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.9'",
- "version": "==3.2.3"
- },
- "pdf2image": {
- "hashes": [
- "sha256:eaa959bc116b420dd7ec415fcae49b98100dda3dd18cd2fdfa86d09f112f6d57",
- "sha256:ecdd58d7afb810dffe21ef2b1bbc057ef434dabbac6c33778a38a3f7744a27e2"
- ],
- "index": "pypi",
- "version": "==1.17.0"
- },
- "pdfminer-six": {
- "hashes": [
- "sha256:c631a46d5da957a9ffe4460c5dce21e8431dabb615fee5f9f4400603a58d95a6",
- "sha256:f4f70e74174b4b3542fcb8406a210b6e2e27cd0f0b5fd04534a8cc0d8951e38c"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==20240706"
- },
- "pi-heif": {
- "hashes": [
- "sha256:06e57bebaeadc3d708744bc3d2e4216d86907a2154c7e64ff4198a965e7f1a16",
- "sha256:09c58325a8148b62a37c1973dc6aff7c5ccd0421bb711ff2697fccdea3e1a9d5",
- "sha256:0c77bf122504eafc12841cfe03413048ad0af3e5f17b43ac8cfd9930830160aa",
- "sha256:1077487878d2fd7a63fa3c65c96de6213c6c349f74b8c8625164e8edf4617441",
- "sha256:1733631b37ee01a4d0b2bf4f727e5a13815ccf5d02b12a1c00edb258899645b5",
- "sha256:2295ae1ed8e03fd96e988dba5bf4b179496093cb89c84bc326fcb8cf17c45b28",
- "sha256:235ca775c4500c30dc046352bdfddf97f909645cc187e5f382cd2ab4bf630d81",
- "sha256:274495e3a8495899ee8a8cfce5d1d3123217aa1093bf096077cdbf78d99ce712",
- "sha256:2f4f034aed9443ce811f0700dfaa0bbaae55ea331371ff85a18a66432764d353",
- "sha256:32648f66b95cec8bada6e3928d6eeed1f6cf9c4b73c7e1924cf84eec1ee8cda8",
- "sha256:35995f4ecf73425d71c68c24f54d7945316667b0b6f2f56928f926d94f198b58",
- "sha256:35a72089673bf0c9d7d0de994808718a91b2240e493a474c99ebcc3b7d536d96",
- "sha256:3b623724c75b3049fd10e268d3283f98be643b0e421264d405aa7c4bc310383a",
- "sha256:3ecd96cf9dad1ac9f4126771d164e901e668a8f28293ebccc3178b2c6f2bceb0",
- "sha256:4902cdb84e75505e1d9abdd5aff1e6dcfebe569ec825162d68a4a399a43689a4",
- "sha256:4b6a4fb3e73a7a859ba9ecf6d564e0445e961779145fff2282440915fe55310f",
- "sha256:504c6912fb60aeb031644f37ac0b7edfdc02bc0023cf1eec2995cdc1486a6c43",
- "sha256:59effc063d4715daa983ab8492e6d4bb104134a44821677185dfb99e9d16314d",
- "sha256:671a57cb82430aa0c43f51f881888d69a6274236ee6f8e084270549feec7bb56",
- "sha256:6a82187ac503ca57b5cbfce481e3ec9b18752b8dd3c259434d020de6adc9dcc2",
- "sha256:75da9aaf1b4a4c0bf56b0e3f75bbfa116c07b93be3f669b621d3a5b2ae5b4b44",
- "sha256:7c14255ccfdfa7719b664b7a47493412212acd6c075d3af7036adff34be29364",
- "sha256:8c7808526530d0c534b925b1b9e9477ffb1aefa5aa4a356487f0c839e74933a2",
- "sha256:8c83b87e1ca0950b5046963edfe450e04c6c8cf61ad21647898d563e45c555cb",
- "sha256:918f863cd86e3550aa1caa3f2f6c176c922a7180025b582d5e20bd2a1e8c64d4",
- "sha256:988619231bdd89bd39093e8d942397a07b832197d197e3c89d39a8614b051645",
- "sha256:9c9558a511f7455230daf7fd36f024cc54c79315abdd272e73df2d655504088c",
- "sha256:9e64cabc54900210b2e6ca8e7f6f0e496cd4e94e533f6a5bdf658c9204c7bc1a",
- "sha256:9ed397da8d10743d8f3499f636c8c15db11311d8d73b8ef120b364896b229f56",
- "sha256:a36d29a5ebce2541e11a104fbe2dacac25aa2b9f801fae5e28a13da6557bc694",
- "sha256:a48ed9c2cca45d464c09d56f71bfaa85ec3e30c8c8bcb43e5f51b71301b13352",
- "sha256:aa6d929305b62bb391066c2c3ee2ed219bdc5ea564f36091b50f942faf524815",
- "sha256:b3c111a39a08a56cc6b3c5f381a352d635fbe161d3aa9307a35e14a372bbbb9c",
- "sha256:b8617e40bba3b654496138ff6a0c99a14f58be012c41b2fdde9c1ba780944f14",
- "sha256:bec08ae26a3f73a62844fc7969e6903af7c13dfe3eab34846ffaaff245894c2a",
- "sha256:c37a4e0f4ef417d6bed1854e8176cacb7d9522003a9892ef0872c92909127f8f",
- "sha256:c6a5bca23e86449b8bc7821701013fd4c4cd0b9083caac72eeefaf5e3de022cc",
- "sha256:c9c21dec9b0f0d0bd659687f53f02cbc59b86f1cdff5e14da979e370e185fac8",
- "sha256:cbb0a2bc1c332664dd3bcbf96dd2f290ecabd1c9088b174412c29fafb667cd54",
- "sha256:cd29361e0c156bc5bf0adeb58081a1955b2f02f9caa8bed30afdd595ff9a4745",
- "sha256:d2b57c7c8b7f126970e2d655ac7b6b480a27a022b619e7463c071963571e498b",
- "sha256:e0e8c432b43cb982f8816218e6997a4e27eec414da42eade5b7585a68776dea7",
- "sha256:e471c29555bf8c9567d4176eabe85aedc27ec1e0d3af1616fdf8a5b4c45b1757",
- "sha256:e47cda8937cb2cdac2b9071e6380ec0c15bd6fd5f871d3d69bc25f9a523d4916",
- "sha256:f51a518f659ff79db74b9044a52bf5a45ed5f0d7f2eca5afdfe55ae1bafcd7a8",
- "sha256:f91a088b2b20d988c98aef6c85ca84ebf4829a4b65d800e72775b4759fa3310c"
- ],
- "markers": "python_version >= '3.9'",
- "version": "==0.21.0"
- },
- "pikepdf": {
- "hashes": [
- "sha256:031347be6efe62f943712d0b94872a4bb907ffd7ad2740263429acbc60311b69",
- "sha256:106ac4976000481da8721c77e108a5afdd1d4d38bb229f728adc6c323b66a772",
- "sha256:10f5f0724ff2d5b2bf4ad33ca334d1053d7d7c8cd871abddf03df72e58f42aa4",
- "sha256:17d1f5667cf19093e7b4861a1cfe8a7c44b8cc74179c117da492bbc8c0843109",
- "sha256:1aab4342ede54879bb0966af41aca58f4d73a5d2ecf8a661161fffced6590a34",
- "sha256:1bbfc4f03f3355f08f525d8ef65c09f61a92b0e7b16da49ee40bedb9aa5f4a9b",
- "sha256:2a7adcf55e8b9f9b5e4797976b0c6dd2a9834a330139b38777892a4214c1c8cb",
- "sha256:2d3e5de71505aec66da5c0fde8b786fdec78e660b759a35f6dd9ff12eb0e153f",
- "sha256:3fcb8dcba75138b59285f3d492b9350c8b643689d7d8de83216a4d9576b91082",
- "sha256:44033a1908fc2bd2827e6b4f7e039eb8e9742488047112e4ca3991d636641761",
- "sha256:48a258dc8f3ba5381d3000082264f4bca93e00b640c267844140fac4cfe3ec79",
- "sha256:4a2e889b5365522ca88301617512c15e53bd64b48ad50f44f3d321ae47187b79",
- "sha256:5d8d2dd974cac31473adaa0dcad276adc18a53a1aebb05533be8fb90404d472e",
- "sha256:5fdf7aed55487d72c213e9224aef49f0370dc3a6501baaaf89d4eedfb57f3ef8",
- "sha256:6446470c47694be0b73d19fb1527f418356f05acc252d99c9f84eca98eadc1be",
- "sha256:656b801d10603a7bd6208b2796fa9d69756174130369d728de870db31b356b90",
- "sha256:6a4dfde19b5f3fb49c093059f6b1cb834309c7e2788f31f654ba4d99c6c2cd1d",
- "sha256:713664b861c572b47898d04a40293df13be79f7e2e5709939ce3512474a787fb",
- "sha256:7245302119d137651cd7585279c3c731960742e93162d9f4df5837f424dcdc8b",
- "sha256:7da459d7e57794bd3b4171c13d5bd642bb33327342e341c4c5e8451aa844f575",
- "sha256:81b16393bf28dd62d61fa1b8bd92e721adffcbf6a2cfaaaaab6cd634ff59efca",
- "sha256:8d8840939098956c348d5ff1e4105b988a1060932c72c5e996c103be5b21a390",
- "sha256:8f8caba01bc1eb989e13c99c9da884ae6d343e0e53c9987fa561788ba920590d",
- "sha256:91028bb5672b79de49c9e7c3fe75d9c80fb0af8a096dc731b7e4425243b72676",
- "sha256:91cb8ec804845a2614ff65539e5b417a469182adf2fafa32d62ef4723b9926e4",
- "sha256:99355e88ee8d69f148196ec8df5f2f16326698da6acd3601b97bb6497ed1f780",
- "sha256:9aa11fbfc9b27a722b4ea6b7e766725676530b6ad1a12cc95393d2fd234fb431",
- "sha256:9b82f2fd382ee2c18fe78824e76f0b1841ee77ae68d0e2f8a39f411925a3a4b6",
- "sha256:9d44a83537360c24b1f773a5ac00b7d1ab66685baecbbc055b3da8fc759cfb2a",
- "sha256:a1246c3706a2e14dd421570de0e4f562bbe6f2a4b3a30bcba5de7a596ff395bb",
- "sha256:aa7bcf2a46623e3f68892c8a365bf4986eb0a8c0c2996bdbd627c79e2c7c6abc",
- "sha256:ac14f0d99c996d437ac8f1e72f5e39c4534f8e341b0d84baf7e01ae154148a11",
- "sha256:b516a64185d83b3b0a7f3bc34a5f7124da9faab35748d5cb611cab41853cf569",
- "sha256:bb8d67c0098a6fd248a7ae1e03310c193706b82e7b39c6c1486f141f3697ccd1",
- "sha256:ca8e5608a482773cee054b7b9e63202faed9ee613fe59bcb4c712219eaef3981",
- "sha256:d2a1ba67ea285bb4c5af7623438748c0686db714eaa6c994ccf33c76d04d73b7",
- "sha256:dccdab8c176956ab049bf527cf4f47b4f678ac77d65659cc2575a27e3965ce3f",
- "sha256:e8e27be3253a09e01a21d5bc25c4f0ac78ca0732be292361a0d74f5fce180812",
- "sha256:f9a064f56803a36ba6c57b6e6f27ba849a813e3536d68b032167ef0f1a6a19cf",
- "sha256:fda775e99c1b2d541bdc1c21245fc1d595b25b654cc4d749f4dba32513bd1359"
- ],
- "markers": "python_version >= '3.9'",
- "version": "==9.5.1"
- },
- "pillow": {
- "hashes": [
- "sha256:015c6e863faa4779251436db398ae75051469f7c903b043a48f078e437656f83",
- "sha256:0a2f91f8a8b367e7a57c6e91cd25af510168091fb89ec5146003e424e1558a96",
- "sha256:11633d58b6ee5733bde153a8dafd25e505ea3d32e261accd388827ee987baf65",
- "sha256:2062ffb1d36544d42fcaa277b069c88b01bb7298f4efa06731a7fd6cc290b81a",
- "sha256:31eba6bbdd27dde97b0174ddf0297d7a9c3a507a8a1480e1e60ef914fe23d352",
- "sha256:3362c6ca227e65c54bf71a5f88b3d4565ff1bcbc63ae72c34b07bbb1cc59a43f",
- "sha256:368da70808b36d73b4b390a8ffac11069f8a5c85f29eff1f1b01bcf3ef5b2a20",
- "sha256:36ba10b9cb413e7c7dfa3e189aba252deee0602c86c309799da5a74009ac7a1c",
- "sha256:3764d53e09cdedd91bee65c2527815d315c6b90d7b8b79759cc48d7bf5d4f114",
- "sha256:3a5fe20a7b66e8135d7fd617b13272626a28278d0e578c98720d9ba4b2439d49",
- "sha256:3cdcdb0b896e981678eee140d882b70092dac83ac1cdf6b3a60e2216a73f2b91",
- "sha256:4637b88343166249fe8aa94e7c4a62a180c4b3898283bb5d3d2fd5fe10d8e4e0",
- "sha256:4db853948ce4e718f2fc775b75c37ba2efb6aaea41a1a5fc57f0af59eee774b2",
- "sha256:4dd43a78897793f60766563969442020e90eb7847463eca901e41ba186a7d4a5",
- "sha256:54251ef02a2309b5eec99d151ebf5c9904b77976c8abdcbce7891ed22df53884",
- "sha256:54ce1c9a16a9561b6d6d8cb30089ab1e5eb66918cb47d457bd996ef34182922e",
- "sha256:593c5fd6be85da83656b93ffcccc2312d2d149d251e98588b14fbc288fd8909c",
- "sha256:5bb94705aea800051a743aa4874bb1397d4695fb0583ba5e425ee0328757f196",
- "sha256:67cd427c68926108778a9005f2a04adbd5e67c442ed21d95389fe1d595458756",
- "sha256:70ca5ef3b3b1c4a0812b5c63c57c23b63e53bc38e758b37a951e5bc466449861",
- "sha256:73ddde795ee9b06257dac5ad42fcb07f3b9b813f8c1f7f870f402f4dc54b5269",
- "sha256:758e9d4ef15d3560214cddbc97b8ef3ef86ce04d62ddac17ad39ba87e89bd3b1",
- "sha256:7d33d2fae0e8b170b6a6c57400e077412240f6f5bb2a342cf1ee512a787942bb",
- "sha256:7fdadc077553621911f27ce206ffcbec7d3f8d7b50e0da39f10997e8e2bb7f6a",
- "sha256:8000376f139d4d38d6851eb149b321a52bb8893a88dae8ee7d95840431977081",
- "sha256:837060a8599b8f5d402e97197d4924f05a2e0d68756998345c829c33186217b1",
- "sha256:89dbdb3e6e9594d512780a5a1c42801879628b38e3efc7038094430844e271d8",
- "sha256:8c730dc3a83e5ac137fbc92dfcfe1511ce3b2b5d7578315b63dbbb76f7f51d90",
- "sha256:8e275ee4cb11c262bd108ab2081f750db2a1c0b8c12c1897f27b160c8bd57bbc",
- "sha256:9044b5e4f7083f209c4e35aa5dd54b1dd5b112b108648f5c902ad586d4f945c5",
- "sha256:93a18841d09bcdd774dcdc308e4537e1f867b3dec059c131fde0327899734aa1",
- "sha256:9409c080586d1f683df3f184f20e36fb647f2e0bc3988094d4fd8c9f4eb1b3b3",
- "sha256:96f82000e12f23e4f29346e42702b6ed9a2f2fea34a740dd5ffffcc8c539eb35",
- "sha256:9aa9aeddeed452b2f616ff5507459e7bab436916ccb10961c4a382cd3e03f47f",
- "sha256:9ee85f0696a17dd28fbcfceb59f9510aa71934b483d1f5601d1030c3c8304f3c",
- "sha256:a07dba04c5e22824816b2615ad7a7484432d7f540e6fa86af60d2de57b0fcee2",
- "sha256:a3cd561ded2cf2bbae44d4605837221b987c216cff94f49dfeed63488bb228d2",
- "sha256:a697cd8ba0383bba3d2d3ada02b34ed268cb548b369943cd349007730c92bddf",
- "sha256:a76da0a31da6fcae4210aa94fd779c65c75786bc9af06289cd1c184451ef7a65",
- "sha256:a85b653980faad27e88b141348707ceeef8a1186f75ecc600c395dcac19f385b",
- "sha256:a8d65b38173085f24bc07f8b6c505cbb7418009fa1a1fcb111b1f4961814a442",
- "sha256:aa8dd43daa836b9a8128dbe7d923423e5ad86f50a7a14dc688194b7be5c0dea2",
- "sha256:ab8a209b8485d3db694fa97a896d96dd6533d63c22829043fd9de627060beade",
- "sha256:abc56501c3fd148d60659aae0af6ddc149660469082859fa7b066a298bde9482",
- "sha256:ad5db5781c774ab9a9b2c4302bbf0c1014960a0a7be63278d13ae6fdf88126fe",
- "sha256:ae98e14432d458fc3de11a77ccb3ae65ddce70f730e7c76140653048c71bfcbc",
- "sha256:b20be51b37a75cc54c2c55def3fa2c65bb94ba859dde241cd0a4fd302de5ae0a",
- "sha256:b523466b1a31d0dcef7c5be1f20b942919b62fd6e9a9be199d035509cbefc0ec",
- "sha256:b5d658fbd9f0d6eea113aea286b21d3cd4d3fd978157cbf2447a6035916506d3",
- "sha256:b6123aa4a59d75f06e9dd3dac5bf8bc9aa383121bb3dd9a7a612e05eabc9961a",
- "sha256:bd165131fd51697e22421d0e467997ad31621b74bfc0b75956608cb2906dda07",
- "sha256:bf902d7413c82a1bfa08b06a070876132a5ae6b2388e2712aab3a7cbc02205c6",
- "sha256:c12fc111ef090845de2bb15009372175d76ac99969bdf31e2ce9b42e4b8cd88f",
- "sha256:c1eec9d950b6fe688edee07138993e54ee4ae634c51443cfb7c1e7613322718e",
- "sha256:c640e5a06869c75994624551f45e5506e4256562ead981cce820d5ab39ae2192",
- "sha256:cc1331b6d5a6e144aeb5e626f4375f5b7ae9934ba620c0ac6b3e43d5e683a0f0",
- "sha256:cfd5cd998c2e36a862d0e27b2df63237e67273f2fc78f47445b14e73a810e7e6",
- "sha256:d3d8da4a631471dfaf94c10c85f5277b1f8e42ac42bade1ac67da4b4a7359b73",
- "sha256:d44ff19eea13ae4acdaaab0179fa68c0c6f2f45d66a4d8ec1eda7d6cecbcc15f",
- "sha256:dd0052e9db3474df30433f83a71b9b23bd9e4ef1de13d92df21a52c0303b8ab6",
- "sha256:dd0e081319328928531df7a0e63621caf67652c8464303fd102141b785ef9547",
- "sha256:dda60aa465b861324e65a78c9f5cf0f4bc713e4309f83bc387be158b077963d9",
- "sha256:e06695e0326d05b06833b40b7ef477e475d0b1ba3a6d27da1bb48c23209bf457",
- "sha256:e1abe69aca89514737465752b4bcaf8016de61b3be1397a8fc260ba33321b3a8",
- "sha256:e267b0ed063341f3e60acd25c05200df4193e15a4a5807075cd71225a2386e26",
- "sha256:e5449ca63da169a2e6068dd0e2fcc8d91f9558aba89ff6d02121ca8ab11e79e5",
- "sha256:e63e4e5081de46517099dc30abe418122f54531a6ae2ebc8680bcd7096860eab",
- "sha256:f189805c8be5ca5add39e6f899e6ce2ed824e65fb45f3c28cb2841911da19070",
- "sha256:f7955ecf5609dee9442cbface754f2c6e541d9e6eda87fad7f7a989b0bdb9d71",
- "sha256:f86d3a7a9af5d826744fabf4afd15b9dfef44fe69a98541f666f66fbb8d3fef9",
- "sha256:fbd43429d0d7ed6533b25fc993861b8fd512c42d04514a0dd6337fb3ccf22761"
- ],
- "markers": "python_version >= '3.9'",
- "version": "==11.1.0"
- },
- "pluggy": {
- "hashes": [
- "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1",
- "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==1.5.0"
- },
- "portalocker": {
- "hashes": [
- "sha256:80e984e24de292ff258a5bea0e4f3f778fff84c0ae1275dbaebc4658de4aacb3",
- "sha256:ec20f6dda2ad9ce89fa399a5f31f4f1495f515958f0cb7ca6543cef7bb5a749e"
- ],
- "markers": "python_version >= '3.9'",
- "version": "==3.1.1"
- },
- "prometheus-client": {
- "hashes": [
- "sha256:252505a722ac04b0456be05c05f75f45d760c2911ffc45f2a06bcaed9f3ae3fb",
- "sha256:594b45c410d6f4f8888940fe80b5cc2521b305a1fafe1c58609ef715a001f301"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==0.21.1"
- },
- "prompt-toolkit": {
- "hashes": [
- "sha256:544748f3860a2623ca5cd6d2795e7a14f3d0e1c3c9728359013f79877fc89bab",
- "sha256:9b6427eb19e479d98acff65196a307c555eb567989e6d88ebbb1b509d9779198"
- ],
- "markers": "python_full_version >= '3.8.0'",
- "version": "==3.0.50"
- },
- "psycopg": {
- "extras": [
- "c"
- ],
- "hashes": [
- "sha256:43665368ccd48180744cab26b74332f46b63b7e06e8ce0775547a3533883d381",
- "sha256:f26f1346d6bf1ef5f5ef1714dd405c67fb365cfd1c6cea07de1792747b167b92"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==3.2.4"
- },
- "psycopg-c": {
- "hashes": [
- "sha256:22097a04263efb2efd2cc8b00a51fa90e23f9cd4a2e09903fe4d9c6923dac17a"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==3.2.4"
- },
- "pycparser": {
- "hashes": [
- "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6",
- "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==2.22"
- },
- "pygments": {
- "hashes": [
- "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f",
- "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==2.19.1"
- },
- "pyjwt": {
- "extras": [
- "crypto"
- ],
- "hashes": [
- "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953",
- "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb"
- ],
- "markers": "python_version >= '3.9'",
- "version": "==2.10.1"
- },
- "python-dateutil": {
- "hashes": [
- "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3",
- "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"
- ],
- "index": "pypi",
- "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'",
- "version": "==2.9.0.post0"
- },
- "python-dotenv": {
- "hashes": [
- "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca",
- "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.8'",
- "version": "==1.0.1"
- },
- "python-gnupg": {
- "hashes": [
- "sha256:40ce25cde9df29af91fe931ce9df3ce544e14a37f62b13ca878c897217b2de6c",
- "sha256:f2fdb5fb29615c77c2743e1cb3d9314353a6e87b10c37d238d91ae1c6feae086"
- ],
- "index": "pypi",
- "version": "==0.5.4"
- },
- "python-ipware": {
- "hashes": [
- "sha256:9117b1c4dddcb5d5ca49e6a9617de2fc66aec2ef35394563ac4eecabdf58c062",
- "sha256:fc936e6e7ec9fcc107f9315df40658f468ac72f739482a707181742882e36b60"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.7'",
- "version": "==3.0.0"
- },
- "python-magic": {
- "hashes": [
- "sha256:c1ba14b08e4a5f5c31a302b7721239695b2f0f058d125bd5ce1ee36b9d9d3c3b",
- "sha256:c212960ad306f700aa0d01e5d7a325d20548ff97eb9920dcd29513174f0294d3"
- ],
- "index": "pypi",
- "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
- "version": "==0.4.27"
- },
- "pytz": {
- "hashes": [
- "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a",
- "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725"
- ],
- "version": "==2024.2"
- },
- "pyyaml": {
- "hashes": [
- "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff",
- "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48",
- "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086",
- "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e",
- "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133",
- "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5",
- "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484",
- "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee",
- "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5",
- "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68",
- "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a",
- "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf",
- "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99",
- "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8",
- "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85",
- "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19",
- "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc",
- "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a",
- "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1",
- "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317",
- "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c",
- "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631",
- "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d",
- "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652",
- "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5",
- "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e",
- "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b",
- "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8",
- "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476",
- "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706",
- "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563",
- "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237",
- "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b",
- "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083",
- "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180",
- "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425",
- "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e",
- "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f",
- "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725",
- "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183",
- "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab",
- "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774",
- "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725",
- "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e",
- "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5",
- "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d",
- "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290",
- "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44",
- "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed",
- "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4",
- "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba",
- "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12",
- "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==6.0.2"
- },
- "pyzbar": {
- "hashes": [
- "sha256:13e3ee5a2f3a545204a285f41814d5c0db571967e8d4af8699a03afc55182a9c",
- "sha256:4559628b8192feb25766d954b36a3753baaf5c97c03135aec7e4a026036b475d",
- "sha256:8f4c5264c9c7c6b9f20d01efc52a4eba1ded47d9ba857a94130afe33703eb518"
- ],
- "index": "pypi",
- "version": "==0.1.9"
- },
- "qrcode": {
- "hashes": [
- "sha256:025ce2b150f7fe4296d116ee9bad455a6643ab4f6e7dce541613a4758cbce347",
- "sha256:9fc05f03305ad27a709eb742cf3097fa19e6f6f93bb9e2f039c0979190f6f1b1"
- ],
- "markers": "python_version >= '3.9' and python_version < '4.0'",
- "version": "==8.0"
- },
- "rapidfuzz": {
- "hashes": [
- "sha256:0b488b244931d0291412917e6e46ee9f6a14376625e150056fe7c4426ef28225",
- "sha256:1315cd2a351144572e31fe3df68340d4b83ddec0af8b2e207cd32930c6acd037",
- "sha256:1bac4873f6186f5233b0084b266bfb459e997f4c21fc9f029918f44a9eccd304",
- "sha256:1cb1965a28b0fa64abdee130c788a0bc0bb3cf9ef7e3a70bf055c086c14a3d7e",
- "sha256:22033677982b9c4c49676f215b794b0404073f8974f98739cb7234e4a9ade9ad",
- "sha256:231c8b2efbd7f8d2ecd1ae900363ba168b8870644bb8f2b5aa96e4a7573bde19",
- "sha256:25398d9ac7294e99876a3027ffc52c6bebeb2d702b1895af6ae9c541ee676702",
- "sha256:2c87319b0ab9d269ab84f6453601fd49b35d9e4a601bbaef43743f26fabf496c",
- "sha256:3048c6ed29d693fba7d2a7caf165f5e0bb2b9743a0989012a98a47b975355cca",
- "sha256:339607394941801e6e3f6c1ecd413a36e18454e7136ed1161388de674f47f9d9",
- "sha256:3794df87313dfb56fafd679b962e0613c88a293fd9bd5dd5c2793d66bf06a101",
- "sha256:3857e335f97058c4b46fa39ca831290b70de554a5c5af0323d2f163b19c5f2a6",
- "sha256:3871fa7dfcef00bad3c7e8ae8d8fd58089bad6fb21f608d2bf42832267ca9663",
- "sha256:3f28952da055dbfe75828891cd3c9abf0984edc8640573c18b48c14c68ca5e06",
- "sha256:42f4dd264ada7a9aa0805ea0da776dc063533917773cf2df5217f14eb4429eae",
- "sha256:4416ca69af933d4a8ad30910149d3db6d084781d5c5fdedb713205389f535385",
- "sha256:4469307f464ae3089acf3210b8fc279110d26d10f79e576f385a98f4429f7d97",
- "sha256:4513dd01cee11e354c31b75f652d4d466c9440b6859f84e600bdebfccb17735a",
- "sha256:45b15b8a118856ac9caac6877f70f38b8a0d310475d50bc814698659eabc1cdb",
- "sha256:494eef2c68305ab75139034ea25328a04a548d297712d9cf887bf27c158c388b",
- "sha256:4d0d26c7172bdb64f86ee0765c5b26ea1dc45c52389175888ec073b9b28f4305",
- "sha256:4f9f12c2d0aa52b86206d2059916153876a9b1cf9dfb3cf2f344913167f1c3d4",
- "sha256:51f24cb39e64256221e6952f22545b8ce21cacd59c0d3e367225da8fc4b868d8",
- "sha256:54e7f442fb9cca81e9df32333fb075ef729052bcabe05b0afc0441f462299114",
- "sha256:5a167344c1d6db06915fb0225592afdc24d8bafaaf02de07d4788ddd37f4bc2f",
- "sha256:5b659e1e2ea2784a9a397075a7fc395bfa4fe66424042161c4bcaf6e4f637b38",
- "sha256:5bb636b0150daa6d3331b738f7c0f8b25eadc47f04a40e5c23c4bfb4c4e20ae3",
- "sha256:5e8ea35f2419c7d56b3e75fbde2698766daedb374f20eea28ac9b1f668ef4f74",
- "sha256:5e8f93bc736020351a6f8e71666e1f486bb8bd5ce8112c443a30c77bfde0eb68",
- "sha256:62171b270ecc4071be1c1f99960317db261d4c8c83c169e7f8ad119211fe7397",
- "sha256:6668321f90aa02a5a789d4e16058f2e4f2692c5230252425c3532a8a62bc3424",
- "sha256:6ad02bab756751c90fa27f3069d7b12146613061341459abf55f8190d899649f",
- "sha256:6b01c1ddbb054283797967ddc5433d5c108d680e8fa2684cf368be05407b07e4",
- "sha256:714a7ba31ba46b64d30fccfe95f8013ea41a2e6237ba11a805a27cdd3bce2573",
- "sha256:76a4a11ba8f678c9e5876a7d465ab86def047a4fcc043617578368755d63a1bc",
- "sha256:7864e80a0d4e23eb6194254a81ee1216abdc53f9dc85b7f4d56668eced022eb8",
- "sha256:82497f244aac10b20710448645f347d862364cc4f7d8b9ba14bd66b5ce4dec18",
- "sha256:84819390a36d6166cec706b9d8f0941f115f700b7faecab5a7e22fc367408bc3",
- "sha256:8724a978f8af7059c5323d523870bf272a097478e1471295511cf58b2642ff83",
- "sha256:8b63cb1f2eb371ef20fb155e95efd96e060147bdd4ab9fc400c97325dfee9fe1",
- "sha256:8c7af25bda96ac799378ac8aba54a8ece732835c7b74cfc201b688a87ed11152",
- "sha256:8dd501de6f7a8f83557d20613b58734d1cb5f0be78d794cde64fe43cfc63f5f2",
- "sha256:8ed59044aea9eb6c663112170f2399b040d5d7b162828b141f2673e822093fa8",
- "sha256:906f1f2a1b91c06599b3dd1be207449c5d4fc7bd1e1fa2f6aef161ea6223f165",
- "sha256:92ebb7c12f682b5906ed98429f48a3dd80dd0f9721de30c97a01473d1a346576",
- "sha256:99aebef8268f2bc0b445b5640fd3312e080bd17efd3fbae4486b20ac00466308",
- "sha256:9a1b3ebc62d4bcdfdeba110944a25ab40916d5383c5e57e7c4a8dc0b6c17211a",
- "sha256:9a52eea839e4bdc72c5e60a444d26004da00bb5bc6301e99b3dde18212e41465",
- "sha256:9c6d7fea39cb33e71de86397d38bf7ff1a6273e40367f31d05761662ffda49e4",
- "sha256:a53ca4d3f52f00b393fab9b5913c5bafb9afc27d030c8a1db1283da6917a860f",
- "sha256:a7743cca45b4684c54407e8638f6d07b910d8d811347b9d42ff21262c7c23245",
- "sha256:aaf391fb6715866bc14681c76dc0308f46877f7c06f61d62cc993b79fc3c4a2a",
- "sha256:ab9eab33ee3213f7751dc07a1a61b8d9a3d748ca4458fffddd9defa6f0493c16",
- "sha256:b04f29735bad9f06bb731c214f27253bd8bedb248ef9b8a1b4c5bde65b838454",
- "sha256:b1472986fd9c5d318399a01a0881f4a0bf4950264131bb8e2deba9df6d8c362b",
- "sha256:b1d67d67f89e4e013a5295e7523bc34a7a96f2dba5dd812c7c8cb65d113cbf28",
- "sha256:b1f7efdd7b7adb32102c2fa481ad6f11923e2deb191f651274be559d56fc913b",
- "sha256:b2669eafee38c5884a6e7cc9769d25c19428549dcdf57de8541cf9e82822e7db",
- "sha256:ba26d87fe7fcb56c4a53b549a9e0e9143f6b0df56d35fe6ad800c902447acd5b",
- "sha256:be15496e7244361ff0efcd86e52559bacda9cd975eccf19426a0025f9547c792",
- "sha256:c36539ed2c0173b053dafb221458812e178cfa3224ade0960599bec194637048",
- "sha256:c408f09649cbff8da76f8d3ad878b64ba7f7abdad1471efb293d2c075e80c822",
- "sha256:cd340bbd025302276b5aa221dccfe43040c7babfc32f107c36ad783f2ffd8775",
- "sha256:d0edecc3f90c2653298d380f6ea73b536944b767520c2179ec5d40b9145e47aa",
- "sha256:d2a0f7e17f33e7890257367a1662b05fecaf56625f7dbb6446227aaa2b86448b",
- "sha256:d71da0012face6f45432a11bc59af19e62fac5a41f8ce489e80c0add8153c3d1",
- "sha256:d895998fec712544c13cfe833890e0226585cf0391dd3948412441d5d68a2b8c",
- "sha256:d95f9e9f3777b96241d8a00d6377cc9c716981d828b5091082d0fe3a2924b43e",
- "sha256:d9727b85511b912571a76ce53c7640ba2c44c364e71cef6d7359b5412739c570",
- "sha256:d98a46cf07c0c875d27e8a7ed50f304d83063e49b9ab63f21c19c154b4c0d08d",
- "sha256:d994cf27e2f874069884d9bddf0864f9b90ad201fcc9cb2f5b82bacc17c8d5f2",
- "sha256:dc0e0d41ad8a056a9886bac91ff9d9978e54a244deb61c2972cc76b66752de9c",
- "sha256:dfaefe08af2a928e72344c800dcbaf6508e86a4ed481e28355e8d4b6a6a5230e",
- "sha256:e60814edd0c9b511b5f377d48b9782b88cfe8be07a98f99973669299c8bb318a",
- "sha256:eb8a54543d16ab1b69e2c5ed96cabbff16db044a50eddfc028000138ca9ddf33",
- "sha256:eb97c53112b593f89a90b4f6218635a9d1eea1d7f9521a3b7d24864228bbc0aa",
- "sha256:ebadd5b8624d8ad503e505a99b8eb26fe3ea9f8e9c2234e805a27b269e585842",
- "sha256:ec8d7d8567e14af34a7911c98f5ac74a3d4a743cd848643341fc92b12b3784ff",
- "sha256:ed78c8e94f57b44292c1a0350f580e18d3a3c5c0800e253f1583580c1b417ad2",
- "sha256:eea8d9e20632d68f653455265b18c35f90965e26f30d4d92f831899d6682149b",
- "sha256:ef8937dae823b889c0273dfa0f0f6c46a3658ac0d851349c464d1b00e7ff4252",
- "sha256:f06e3c4c0a8badfc4910b9fd15beb1ad8f3b8fafa8ea82c023e5e607b66a78e4",
- "sha256:f0821b9bdf18c5b7d51722b906b233a39b17f602501a966cfbd9b285f8ab83cd",
- "sha256:f0ba13557fec9d5ffc0a22826754a7457cc77f1b25145be10b7bb1d143ce84c6",
- "sha256:f382fec4a7891d66fb7163c90754454030bb9200a13f82ee7860b6359f3f2fa8",
- "sha256:fe7aaf5a54821d340d21412f7f6e6272a9b17a0cbafc1d68f77f2fc11009dcd5",
- "sha256:ff38378346b7018f42cbc1f6d1d3778e36e16d8595f79a312b31e7c25c50bd08",
- "sha256:ffa1bb0e26297b0f22881b219ffc82a33a3c84ce6174a9d69406239b14575bd5"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.9'",
- "version": "==3.11.0"
- },
- "redis": {
- "extras": [
- "hiredis"
- ],
- "hashes": [
- "sha256:16f2e22dff21d5125e8481515e386711a34cbec50f0e44413dd7d9c060a54e0f",
- "sha256:ee7e1056b9aea0f04c6c2ed59452947f34c4940ee025f5dd83e6a6418b6989e4"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==5.2.1"
- },
- "referencing": {
- "hashes": [
- "sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c",
- "sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==0.35.1"
- },
- "regex": {
- "hashes": [
- "sha256:02a02d2bb04fec86ad61f3ea7f49c015a0681bf76abb9857f945d26159d2968c",
- "sha256:02e28184be537f0e75c1f9b2f8847dc51e08e6e171c6bde130b2687e0c33cf60",
- "sha256:040df6fe1a5504eb0f04f048e6d09cd7c7110fef851d7c567a6b6e09942feb7d",
- "sha256:068376da5a7e4da51968ce4c122a7cd31afaaec4fccc7856c92f63876e57b51d",
- "sha256:06eb1be98df10e81ebaded73fcd51989dcf534e3c753466e4b60c4697a003b67",
- "sha256:072623554418a9911446278f16ecb398fb3b540147a7828c06e2011fa531e773",
- "sha256:086a27a0b4ca227941700e0b31425e7a28ef1ae8e5e05a33826e17e47fbfdba0",
- "sha256:08986dce1339bc932923e7d1232ce9881499a0e02925f7402fb7c982515419ef",
- "sha256:0a86e7eeca091c09e021db8eb72d54751e527fa47b8d5787caf96d9831bd02ad",
- "sha256:0c32f75920cf99fe6b6c539c399a4a128452eaf1af27f39bce8909c9a3fd8cbe",
- "sha256:0d7f453dca13f40a02b79636a339c5b62b670141e63efd511d3f8f73fba162b3",
- "sha256:1062b39a0a2b75a9c694f7a08e7183a80c63c0d62b301418ffd9c35f55aaa114",
- "sha256:13291b39131e2d002a7940fb176e120bec5145f3aeb7621be6534e46251912c4",
- "sha256:149f5008d286636e48cd0b1dd65018548944e495b0265b45e1bffecce1ef7f39",
- "sha256:164d8b7b3b4bcb2068b97428060b2a53be050085ef94eca7f240e7947f1b080e",
- "sha256:167ed4852351d8a750da48712c3930b031f6efdaa0f22fa1933716bfcd6bf4a3",
- "sha256:1c4de13f06a0d54fa0d5ab1b7138bfa0d883220965a29616e3ea61b35d5f5fc7",
- "sha256:202eb32e89f60fc147a41e55cb086db2a3f8cb82f9a9a88440dcfc5d37faae8d",
- "sha256:220902c3c5cc6af55d4fe19ead504de80eb91f786dc102fbd74894b1551f095e",
- "sha256:2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a",
- "sha256:2c89a8cc122b25ce6945f0423dc1352cb9593c68abd19223eebbd4e56612c5b7",
- "sha256:2d548dafee61f06ebdb584080621f3e0c23fff312f0de1afc776e2a2ba99a74f",
- "sha256:2e34b51b650b23ed3354b5a07aab37034d9f923db2a40519139af34f485f77d0",
- "sha256:32f9a4c643baad4efa81d549c2aadefaeba12249b2adc5af541759237eee1c54",
- "sha256:3a51ccc315653ba012774efca4f23d1d2a8a8f278a6072e29c7147eee7da446b",
- "sha256:3cde6e9f2580eb1665965ce9bf17ff4952f34f5b126beb509fee8f4e994f143c",
- "sha256:40291b1b89ca6ad8d3f2b82782cc33807f1406cf68c8d440861da6304d8ffbbd",
- "sha256:41758407fc32d5c3c5de163888068cfee69cb4c2be844e7ac517a52770f9af57",
- "sha256:4181b814e56078e9b00427ca358ec44333765f5ca1b45597ec7446d3a1ef6e34",
- "sha256:4f51f88c126370dcec4908576c5a627220da6c09d0bff31cfa89f2523843316d",
- "sha256:50153825ee016b91549962f970d6a4442fa106832e14c918acd1c8e479916c4f",
- "sha256:5056b185ca113c88e18223183aa1a50e66507769c9640a6ff75859619d73957b",
- "sha256:5071b2093e793357c9d8b2929dfc13ac5f0a6c650559503bb81189d0a3814519",
- "sha256:525eab0b789891ac3be914d36893bdf972d483fe66551f79d3e27146191a37d4",
- "sha256:52fb28f528778f184f870b7cf8f225f5eef0a8f6e3778529bdd40c7b3920796a",
- "sha256:5478c6962ad548b54a591778e93cd7c456a7a29f8eca9c49e4f9a806dcc5d638",
- "sha256:5670bce7b200273eee1840ef307bfa07cda90b38ae56e9a6ebcc9f50da9c469b",
- "sha256:5704e174f8ccab2026bd2f1ab6c510345ae8eac818b613d7d73e785f1310f839",
- "sha256:59dfe1ed21aea057a65c6b586afd2a945de04fc7db3de0a6e3ed5397ad491b07",
- "sha256:5e7e351589da0850c125f1600a4c4ba3c722efefe16b297de54300f08d734fbf",
- "sha256:63b13cfd72e9601125027202cad74995ab26921d8cd935c25f09c630436348ff",
- "sha256:658f90550f38270639e83ce492f27d2c8d2cd63805c65a13a14d36ca126753f0",
- "sha256:684d7a212682996d21ca12ef3c17353c021fe9de6049e19ac8481ec35574a70f",
- "sha256:69ab78f848845569401469da20df3e081e6b5a11cb086de3eed1d48f5ed57c95",
- "sha256:6f44ec28b1f858c98d3036ad5d7d0bfc568bdd7a74f9c24e25f41ef1ebfd81a4",
- "sha256:70b7fa6606c2881c1db9479b0eaa11ed5dfa11c8d60a474ff0e095099f39d98e",
- "sha256:764e71f22ab3b305e7f4c21f1a97e1526a25ebdd22513e251cf376760213da13",
- "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519",
- "sha256:805e6b60c54bf766b251e94526ebad60b7de0c70f70a4e6210ee2891acb70bf2",
- "sha256:8447d2d39b5abe381419319f942de20b7ecd60ce86f16a23b0698f22e1b70008",
- "sha256:86fddba590aad9208e2fa8b43b4c098bb0ec74f15718bb6a704e3c63e2cef3e9",
- "sha256:89d75e7293d2b3e674db7d4d9b1bee7f8f3d1609428e293771d1a962617150cc",
- "sha256:93c0b12d3d3bc25af4ebbf38f9ee780a487e8bf6954c115b9f015822d3bb8e48",
- "sha256:94d87b689cdd831934fa3ce16cc15cd65748e6d689f5d2b8f4f4df2065c9fa20",
- "sha256:9714398225f299aa85267fd222f7142fcb5c769e73d7733344efc46f2ef5cf89",
- "sha256:982e6d21414e78e1f51cf595d7f321dcd14de1f2881c5dc6a6e23bbbbd68435e",
- "sha256:997d6a487ff00807ba810e0f8332c18b4eb8d29463cfb7c820dc4b6e7562d0cf",
- "sha256:a03e02f48cd1abbd9f3b7e3586d97c8f7a9721c436f51a5245b3b9483044480b",
- "sha256:a36fdf2af13c2b14738f6e973aba563623cb77d753bbbd8d414d18bfaa3105dd",
- "sha256:a6ba92c0bcdf96cbf43a12c717eae4bc98325ca3730f6b130ffa2e3c3c723d84",
- "sha256:a7c2155f790e2fb448faed6dd241386719802296ec588a8b9051c1f5c481bc29",
- "sha256:a93c194e2df18f7d264092dc8539b8ffb86b45b899ab976aa15d48214138e81b",
- "sha256:abfa5080c374a76a251ba60683242bc17eeb2c9818d0d30117b4486be10c59d3",
- "sha256:ac10f2c4184420d881a3475fb2c6f4d95d53a8d50209a2500723d831036f7c45",
- "sha256:ad182d02e40de7459b73155deb8996bbd8e96852267879396fb274e8700190e3",
- "sha256:b2837718570f95dd41675328e111345f9b7095d821bac435aac173ac80b19983",
- "sha256:b489578720afb782f6ccf2840920f3a32e31ba28a4b162e13900c3e6bd3f930e",
- "sha256:b583904576650166b3d920d2bcce13971f6f9e9a396c673187f49811b2769dc7",
- "sha256:b85c2530be953a890eaffde05485238f07029600e8f098cdf1848d414a8b45e4",
- "sha256:b97c1e0bd37c5cd7902e65f410779d39eeda155800b65fc4d04cc432efa9bc6e",
- "sha256:ba9b72e5643641b7d41fa1f6d5abda2c9a263ae835b917348fc3c928182ad467",
- "sha256:bb26437975da7dc36b7efad18aa9dd4ea569d2357ae6b783bf1118dabd9ea577",
- "sha256:bb8f74f2f10dbf13a0be8de623ba4f9491faf58c24064f32b65679b021ed0001",
- "sha256:bde01f35767c4a7899b7eb6e823b125a64de314a8ee9791367c9a34d56af18d0",
- "sha256:bec9931dfb61ddd8ef2ebc05646293812cb6b16b60cf7c9511a832b6f1854b55",
- "sha256:c36f9b6f5f8649bb251a5f3f66564438977b7ef8386a52460ae77e6070d309d9",
- "sha256:cdf58d0e516ee426a48f7b2c03a332a4114420716d55769ff7108c37a09951bf",
- "sha256:d1cee317bfc014c2419a76bcc87f071405e3966da434e03e13beb45f8aced1a6",
- "sha256:d22326fcdef5e08c154280b71163ced384b428343ae16a5ab2b3354aed12436e",
- "sha256:d3660c82f209655a06b587d55e723f0b813d3a7db2e32e5e7dc64ac2a9e86fde",
- "sha256:da8f5fc57d1933de22a9e23eec290a0d8a5927a5370d24bda9a6abe50683fe62",
- "sha256:df951c5f4a1b1910f1a99ff42c473ff60f8225baa1cdd3539fe2819d9543e9df",
- "sha256:e5364a4502efca094731680e80009632ad6624084aff9a23ce8c8c6820de3e51",
- "sha256:ea1bfda2f7162605f6e8178223576856b3d791109f15ea99a9f95c16a7636fb5",
- "sha256:f02f93b92358ee3f78660e43b4b0091229260c5d5c408d17d60bf26b6c900e86",
- "sha256:f056bf21105c2515c32372bbc057f43eb02aae2fda61052e2f7622c801f0b4e2",
- "sha256:f1ac758ef6aebfc8943560194e9fd0fa18bcb34d89fd8bd2af18183afd8da3a2",
- "sha256:f2a19f302cd1ce5dd01a9099aaa19cae6173306d1302a43b627f62e21cf18ac0",
- "sha256:f654882311409afb1d780b940234208a252322c24a93b442ca714d119e68086c",
- "sha256:f65557897fc977a44ab205ea871b690adaef6b9da6afda4790a2484b04293a5f",
- "sha256:f9d1e379028e0fc2ae3654bac3cbbef81bf3fd571272a42d56c24007979bafb6",
- "sha256:fdabbfc59f2c6edba2a6622c647b716e34e8e3867e0ab975412c5c2f79b82da2",
- "sha256:fdd6028445d2460f33136c55eeb1f601ab06d74cb3347132e1c24250187500d9",
- "sha256:ff590880083d60acc0433f9c3f713c51f7ac6ebb9adf889c79a261ecf541aa91"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==2024.11.6"
- },
- "requests": {
- "hashes": [
- "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760",
- "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==2.32.3"
- },
- "requests-oauthlib": {
- "hashes": [
- "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36",
- "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9"
- ],
- "markers": "python_version >= '3.4'",
- "version": "==2.0.0"
- },
- "rich": {
- "hashes": [
- "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098",
- "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90"
- ],
- "markers": "python_full_version >= '3.8.0'",
- "version": "==13.9.4"
- },
- "rpds-py": {
- "hashes": [
- "sha256:031819f906bb146561af051c7cef4ba2003d28cff07efacef59da973ff7969ba",
- "sha256:0626238a43152918f9e72ede9a3b6ccc9e299adc8ade0d67c5e142d564c9a83d",
- "sha256:085ed25baac88953d4283e5b5bd094b155075bb40d07c29c4f073e10623f9f2e",
- "sha256:0a9e0759e7be10109645a9fddaaad0619d58c9bf30a3f248a2ea57a7c417173a",
- "sha256:0c025820b78817db6a76413fff6866790786c38f95ea3f3d3c93dbb73b632202",
- "sha256:1ff2eba7f6c0cb523d7e9cff0903f2fe1feff8f0b2ceb6bd71c0e20a4dcee271",
- "sha256:20cc1ed0bcc86d8e1a7e968cce15be45178fd16e2ff656a243145e0b439bd250",
- "sha256:241e6c125568493f553c3d0fdbb38c74babf54b45cef86439d4cd97ff8feb34d",
- "sha256:2c51d99c30091f72a3c5d126fad26236c3f75716b8b5e5cf8effb18889ced928",
- "sha256:2d6129137f43f7fa02d41542ffff4871d4aefa724a5fe38e2c31a4e0fd343fb0",
- "sha256:30b912c965b2aa76ba5168fd610087bad7fcde47f0a8367ee8f1876086ee6d1d",
- "sha256:30bdc973f10d28e0337f71d202ff29345320f8bc49a31c90e6c257e1ccef4333",
- "sha256:320c808df533695326610a1b6a0a6e98f033e49de55d7dc36a13c8a30cfa756e",
- "sha256:32eb88c30b6a4f0605508023b7141d043a79b14acb3b969aa0b4f99b25bc7d4a",
- "sha256:3b766a9f57663396e4f34f5140b3595b233a7b146e94777b97a8413a1da1be18",
- "sha256:3b929c2bb6e29ab31f12a1117c39f7e6d6450419ab7464a4ea9b0b417174f044",
- "sha256:3e30a69a706e8ea20444b98a49f386c17b26f860aa9245329bab0851ed100677",
- "sha256:3e53861b29a13d5b70116ea4230b5f0f3547b2c222c5daa090eb7c9c82d7f664",
- "sha256:40c91c6e34cf016fa8e6b59d75e3dbe354830777fcfd74c58b279dceb7975b75",
- "sha256:4991ca61656e3160cdaca4851151fd3f4a92e9eba5c7a530ab030d6aee96ec89",
- "sha256:4ab2c2a26d2f69cdf833174f4d9d86118edc781ad9a8fa13970b527bf8236027",
- "sha256:4e8921a259f54bfbc755c5bbd60c82bb2339ae0324163f32868f63f0ebb873d9",
- "sha256:4eb2de8a147ffe0626bfdc275fc6563aa7bf4b6db59cf0d44f0ccd6ca625a24e",
- "sha256:5145282a7cd2ac16ea0dc46b82167754d5e103a05614b724457cffe614f25bd8",
- "sha256:520ed8b99b0bf86a176271f6fe23024323862ac674b1ce5b02a72bfeff3fff44",
- "sha256:52c041802a6efa625ea18027a0723676a778869481d16803481ef6cc02ea8cb3",
- "sha256:5555db3e618a77034954b9dc547eae94166391a98eb867905ec8fcbce1308d95",
- "sha256:58a0e345be4b18e6b8501d3b0aa540dad90caeed814c515e5206bb2ec26736fd",
- "sha256:590ef88db231c9c1eece44dcfefd7515d8bf0d986d64d0caf06a81998a9e8cab",
- "sha256:5afb5efde74c54724e1a01118c6e5c15e54e642c42a1ba588ab1f03544ac8c7a",
- "sha256:688c93b77e468d72579351a84b95f976bd7b3e84aa6686be6497045ba84be560",
- "sha256:6b4ef7725386dc0762857097f6b7266a6cdd62bfd209664da6712cb26acef035",
- "sha256:6bc0e697d4d79ab1aacbf20ee5f0df80359ecf55db33ff41481cf3e24f206919",
- "sha256:6dcc4949be728ede49e6244eabd04064336012b37f5c2200e8ec8eb2988b209c",
- "sha256:6f54e7106f0001244a5f4cf810ba8d3f9c542e2730821b16e969d6887b664266",
- "sha256:808f1ac7cf3b44f81c9475475ceb221f982ef548e44e024ad5f9e7060649540e",
- "sha256:8404b3717da03cbf773a1d275d01fec84ea007754ed380f63dfc24fb76ce4592",
- "sha256:878f6fea96621fda5303a2867887686d7a198d9e0f8a40be100a63f5d60c88c9",
- "sha256:8a7ff941004d74d55a47f916afc38494bd1cfd4b53c482b77c03147c91ac0ac3",
- "sha256:95a5bad1ac8a5c77b4e658671642e4af3707f095d2b78a1fdd08af0dfb647624",
- "sha256:97ef67d9bbc3e15584c2f3c74bcf064af36336c10d2e21a2131e123ce0f924c9",
- "sha256:98486337f7b4f3c324ab402e83453e25bb844f44418c066623db88e4c56b7c7b",
- "sha256:98e4fe5db40db87ce1c65031463a760ec7906ab230ad2249b4572c2fc3ef1f9f",
- "sha256:998a8080c4495e4f72132f3d66ff91f5997d799e86cec6ee05342f8f3cda7dca",
- "sha256:9afe42102b40007f588666bc7de82451e10c6788f6f70984629db193849dced1",
- "sha256:9e20da3957bdf7824afdd4b6eeb29510e83e026473e04952dca565170cd1ecc8",
- "sha256:a017f813f24b9df929674d0332a374d40d7f0162b326562daae8066b502d0590",
- "sha256:a429b99337062877d7875e4ff1a51fe788424d522bd64a8c0a20ef3021fdb6ed",
- "sha256:a58ce66847711c4aa2ecfcfaff04cb0327f907fead8945ffc47d9407f41ff952",
- "sha256:a78d8b634c9df7f8d175451cfeac3810a702ccb85f98ec95797fa98b942cea11",
- "sha256:a89a8ce9e4e75aeb7fa5d8ad0f3fecdee813802592f4f46a15754dcb2fd6b061",
- "sha256:a8eeec67590e94189f434c6d11c426892e396ae59e4801d17a93ac96b8c02a6c",
- "sha256:aaeb25ccfb9b9014a10eaf70904ebf3f79faaa8e60e99e19eef9f478651b9b74",
- "sha256:ad116dda078d0bc4886cb7840e19811562acdc7a8e296ea6ec37e70326c1b41c",
- "sha256:af04ac89c738e0f0f1b913918024c3eab6e3ace989518ea838807177d38a2e94",
- "sha256:af4a644bf890f56e41e74be7d34e9511e4954894d544ec6b8efe1e21a1a8da6c",
- "sha256:b21747f79f360e790525e6f6438c7569ddbfb1b3197b9e65043f25c3c9b489d8",
- "sha256:b229ce052ddf1a01c67d68166c19cb004fb3612424921b81c46e7ea7ccf7c3bf",
- "sha256:b4de1da871b5c0fd5537b26a6fc6814c3cc05cabe0c941db6e9044ffbb12f04a",
- "sha256:b80b4690bbff51a034bfde9c9f6bf9357f0a8c61f548942b80f7b66356508bf5",
- "sha256:b876f2bc27ab5954e2fd88890c071bd0ed18b9c50f6ec3de3c50a5ece612f7a6",
- "sha256:b8f107395f2f1d151181880b69a2869c69e87ec079c49c0016ab96860b6acbe5",
- "sha256:b9b76e2afd585803c53c5b29e992ecd183f68285b62fe2668383a18e74abe7a3",
- "sha256:c2b2f71c6ad6c2e4fc9ed9401080badd1469fa9889657ec3abea42a3d6b2e1ed",
- "sha256:c3761f62fcfccf0864cc4665b6e7c3f0c626f0380b41b8bd1ce322103fa3ef87",
- "sha256:c38dbf31c57032667dd5a2f0568ccde66e868e8f78d5a0d27dcc56d70f3fcd3b",
- "sha256:ca9989d5d9b1b300bc18e1801c67b9f6d2c66b8fd9621b36072ed1df2c977f72",
- "sha256:cbd7504a10b0955ea287114f003b7ad62330c9e65ba012c6223dba646f6ffd05",
- "sha256:d167e4dbbdac48bd58893c7e446684ad5d425b407f9336e04ab52e8b9194e2ed",
- "sha256:d2132377f9deef0c4db89e65e8bb28644ff75a18df5293e132a8d67748397b9f",
- "sha256:da52d62a96e61c1c444f3998c434e8b263c384f6d68aca8274d2e08d1906325c",
- "sha256:daa8efac2a1273eed2354397a51216ae1e198ecbce9036fba4e7610b308b6153",
- "sha256:dc5695c321e518d9f03b7ea6abb5ea3af4567766f9852ad1560f501b17588c7b",
- "sha256:de552f4a1916e520f2703ec474d2b4d3f86d41f353e7680b597512ffe7eac5d0",
- "sha256:de609a6f1b682f70bb7163da745ee815d8f230d97276db049ab447767466a09d",
- "sha256:e12bb09678f38b7597b8346983d2323a6482dcd59e423d9448108c1be37cac9d",
- "sha256:e168afe6bf6ab7ab46c8c375606298784ecbe3ba31c0980b7dcbb9631dcba97e",
- "sha256:e78868e98f34f34a88e23ee9ccaeeec460e4eaf6db16d51d7a9b883e5e785a5e",
- "sha256:e860f065cc4ea6f256d6f411aba4b1251255366e48e972f8a347cf88077b24fd",
- "sha256:ea3a6ac4d74820c98fcc9da4a57847ad2cc36475a8bd9683f32ab6d47a2bd682",
- "sha256:ebf64e281a06c904a7636781d2e973d1f0926a5b8b480ac658dc0f556e7779f4",
- "sha256:ed6378c9d66d0de903763e7706383d60c33829581f0adff47b6535f1802fa6db",
- "sha256:ee1e4fc267b437bb89990b2f2abf6c25765b89b72dd4a11e21934df449e0c976",
- "sha256:ee4eafd77cc98d355a0d02f263efc0d3ae3ce4a7c24740010a8b4012bbb24937",
- "sha256:efec946f331349dfc4ae9d0e034c263ddde19414fe5128580f512619abed05f1",
- "sha256:f414da5c51bf350e4b7960644617c130140423882305f7574b6cf65a3081cecb",
- "sha256:f71009b0d5e94c0e86533c0b27ed7cacc1239cb51c178fd239c3cfefefb0400a",
- "sha256:f983e4c2f603c95dde63df633eec42955508eefd8d0f0e6d236d31a044c882d7",
- "sha256:faa5e8496c530f9c71f2b4e1c49758b06e5f4055e17144906245c99fa6d45356",
- "sha256:fed5dfefdf384d6fe975cc026886aece4f292feaf69d0eeb716cfd3c5a4dd8be"
- ],
- "markers": "python_version >= '3.9'",
- "version": "==0.21.0"
- },
- "scikit-learn": {
- "hashes": [
- "sha256:0650e730afb87402baa88afbf31c07b84c98272622aaba002559b614600ca691",
- "sha256:0c8d036eb937dbb568c6242fa598d551d88fb4399c0344d95c001980ec1c7d36",
- "sha256:1061b7c028a8663fb9a1a1baf9317b64a257fcb036dae5c8752b2abef31d136f",
- "sha256:25fc636bdaf1cc2f4a124a116312d837148b5e10872147bdaf4887926b8c03d8",
- "sha256:2c2cae262064e6a9b77eee1c8e768fc46aa0b8338c6a8297b9b6759720ec0ff2",
- "sha256:2e69fab4ebfc9c9b580a7a80111b43d214ab06250f8a7ef590a4edf72464dd86",
- "sha256:2ffa1e9e25b3d93990e74a4be2c2fc61ee5af85811562f1288d5d055880c4322",
- "sha256:3f59fe08dc03ea158605170eb52b22a105f238a5d512c4470ddeca71feae8e5f",
- "sha256:44a17798172df1d3c1065e8fcf9019183f06c87609b49a124ebdf57ae6cb0107",
- "sha256:6849dd3234e87f55dce1db34c89a810b489ead832aaf4d4550b7ea85628be6c1",
- "sha256:6a7aa5f9908f0f28f4edaa6963c0a6183f1911e63a69aa03782f0d924c830a35",
- "sha256:70b1d7e85b1c96383f872a519b3375f92f14731e279a7b4c6cfd650cf5dffc52",
- "sha256:72abc587c75234935e97d09aa4913a82f7b03ee0b74111dcc2881cba3c5a7b33",
- "sha256:775da975a471c4f6f467725dff0ced5c7ac7bda5e9316b260225b48475279a1b",
- "sha256:7a1c43c8ec9fde528d664d947dc4c0789be4077a3647f232869f41d9bf50e0fb",
- "sha256:7a73d457070e3318e32bdb3aa79a8d990474f19035464dfd8bede2883ab5dc3b",
- "sha256:8634c4bd21a2a813e0a7e3900464e6d593162a29dd35d25bdf0103b3fce60ed5",
- "sha256:8a600c31592bd7dab31e1c61b9bbd6dea1b3433e67d264d17ce1017dbdce8002",
- "sha256:926f207c804104677af4857b2c609940b743d04c4c35ce0ddc8ff4f053cddc1b",
- "sha256:a17c1dea1d56dcda2fac315712f3651a1fea86565b64b48fa1bc090249cbf236",
- "sha256:b3b00cdc8f1317b5f33191df1386c0befd16625f49d979fe77a8d44cae82410d",
- "sha256:b4fc2525eca2c69a59260f583c56a7557c6ccdf8deafdba6e060f94c1c59738e",
- "sha256:b8b7a3b86e411e4bce21186e1c180d792f3d99223dcfa3b4f597ecc92fa1a422",
- "sha256:c06beb2e839ecc641366000ca84f3cf6fa9faa1777e29cf0c04be6e4d096a348",
- "sha256:d056391530ccd1e501056160e3c9673b4da4805eb67eb2bdf4e983e1f9c9204e",
- "sha256:dc4765af3386811c3ca21638f63b9cf5ecf66261cc4815c1db3f1e7dc7b79db2",
- "sha256:dc5cf3d68c5a20ad6d571584c0750ec641cc46aeef1c1507be51300e6003a7e1",
- "sha256:e7be3fa5d2eb9be7d77c3734ff1d599151bb523674be9b834e8da6abe132f44e",
- "sha256:e8ca8cb270fee8f1f76fa9bfd5c3507d60c6438bbee5687f81042e2bb98e5a97",
- "sha256:fa909b1a36e000a03c382aade0bd2063fd5680ff8b8e501660c0f59f021a6415"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.9'",
- "version": "==1.6.1"
- },
- "scipy": {
- "hashes": [
- "sha256:033a75ddad1463970c96a88063a1df87ccfddd526437136b6ee81ff0312ebdf6",
- "sha256:0458839c9f873062db69a03de9a9765ae2e694352c76a16be44f93ea45c28d2b",
- "sha256:070d10654f0cb6abd295bc96c12656f948e623ec5f9a4eab0ddb1466c000716e",
- "sha256:09c52320c42d7f5c7748b69e9f0389266fd4f82cf34c38485c14ee976cb8cb04",
- "sha256:0ac102ce99934b162914b1e4a6b94ca7da0f4058b6d6fd65b0cef330c0f3346f",
- "sha256:0fb57b30f0017d4afa5fe5f5b150b8f807618819287c21cbe51130de7ccdaed2",
- "sha256:100193bb72fbff37dbd0bf14322314fc7cbe08b7ff3137f11a34d06dc0ee6b85",
- "sha256:14eaa373c89eaf553be73c3affb11ec6c37493b7eaaf31cf9ac5dffae700c2e0",
- "sha256:2114a08daec64980e4b4cbdf5bee90935af66d750146b1d2feb0d3ac30613692",
- "sha256:21e10b1dd56ce92fba3e786007322542361984f8463c6d37f6f25935a5a6ef52",
- "sha256:2722a021a7929d21168830790202a75dbb20b468a8133c74a2c0230c72626b6c",
- "sha256:395be70220d1189756068b3173853029a013d8c8dd5fd3d1361d505b2aa58fa7",
- "sha256:3fe1d95944f9cf6ba77aa28b82dd6bb2a5b52f2026beb39ecf05304b8392864b",
- "sha256:491d57fe89927fa1aafbe260f4cfa5ffa20ab9f1435025045a5315006a91b8f5",
- "sha256:4b17d4220df99bacb63065c76b0d1126d82bbf00167d1730019d2a30d6ae01ea",
- "sha256:4c9d8fc81d6a3b6844235e6fd175ee1d4c060163905a2becce8e74cb0d7554ce",
- "sha256:55cc79ce4085c702ac31e49b1e69b27ef41111f22beafb9b49fea67142b696c4",
- "sha256:5b190b935e7db569960b48840e5bef71dc513314cc4e79a1b7d14664f57fd4ff",
- "sha256:5bd8d27d44e2c13d0c1124e6a556454f52cd3f704742985f6b09e75e163d20d2",
- "sha256:5dff14e75cdbcf07cdaa1c7707db6017d130f0af9ac41f6ce443a93318d6c6e0",
- "sha256:5eb0ca35d4b08e95da99a9f9c400dc9f6c21c424298a0ba876fdc69c7afacedf",
- "sha256:63b9b6cd0333d0eb1a49de6f834e8aeaefe438df8f6372352084535ad095219e",
- "sha256:667f950bf8b7c3a23b4199db24cb9bf7512e27e86d0e3813f015b74ec2c6e3df",
- "sha256:6b3e71893c6687fc5e29208d518900c24ea372a862854c9888368c0b267387ab",
- "sha256:71ba9a76c2390eca6e359be81a3e879614af3a71dfdabb96d1d7ab33da6f2364",
- "sha256:74bb864ff7640dea310a1377d8567dc2cb7599c26a79ca852fc184cc851954ac",
- "sha256:82add84e8a9fb12af5c2c1a3a3f1cb51849d27a580cb9e6bd66226195142be6e",
- "sha256:837299eec3d19b7e042923448d17d95a86e43941104d33f00da7e31a0f715d3c",
- "sha256:900f3fa3db87257510f011c292a5779eb627043dd89731b9c461cd16ef76ab3d",
- "sha256:9f151e9fb60fbf8e52426132f473221a49362091ce7a5e72f8aa41f8e0da4f25",
- "sha256:af0b61c1de46d0565b4b39c6417373304c1d4f5220004058bdad3061c9fa8a95",
- "sha256:bc7136626261ac1ed988dca56cfc4ab5180f75e0ee52e58f1e6aa74b5f3eacd5",
- "sha256:be3deeb32844c27599347faa077b359584ba96664c5c79d71a354b80a0ad0ce0",
- "sha256:c09aa9d90f3500ea4c9b393ee96f96b0ccb27f2f350d09a47f533293c78ea776",
- "sha256:c352c1b6d7cac452534517e022f8f7b8d139cd9f27e6fbd9f3cbd0bfd39f5bef",
- "sha256:c64ded12dcab08afff9e805a67ff4480f5e69993310e093434b10e85dc9d43e1",
- "sha256:cdde8414154054763b42b74fe8ce89d7f3d17a7ac5dd77204f0e142cdc9239e9",
- "sha256:ce3a000cd28b4430426db2ca44d96636f701ed12e2b3ca1f2b1dd7abdd84b39a",
- "sha256:f735bc41bd1c792c96bc426dece66c8723283695f02df61dcc4d0a707a42fc54",
- "sha256:f82fcf4e5b377f819542fbc8541f7b5fbcf1c0017d0df0bc22c781bf60abc4d8"
- ],
- "markers": "python_version >= '3.10'",
- "version": "==1.15.1"
- },
- "setproctitle": {
- "hashes": [
- "sha256:020ea47a79b2bbd7bd7b94b85ca956ba7cb026e82f41b20d2e1dac4008cead25",
- "sha256:02ca3802902d91a89957f79da3ec44b25b5804c88026362cb85eea7c1fbdefd1",
- "sha256:0361428e6378911a378841509c56ba472d991cbed1a7e3078ec0cacc103da44a",
- "sha256:04d6ba8b816dbb0bfd62000b0c3e583160893e6e8c4233e1dca1a9ae4d95d924",
- "sha256:06c16b7a91cdc5d700271899e4383384a61aae83a3d53d0e2e5a266376083342",
- "sha256:0855006261635e8669646c7c304b494b6df0a194d2626683520103153ad63cc9",
- "sha256:091f682809a4d12291cf0205517619d2e7014986b7b00ebecfde3d76f8ae5a8f",
- "sha256:0ad212ae2b03951367a69584af034579b34e1e4199a75d377ef9f8e08ee299b1",
- "sha256:0b19813c852566fa031902124336fa1f080c51e262fc90266a8c3d65ca47b74c",
- "sha256:0b6a4cbabf024cb263a45bdef425760f14470247ff223f0ec51699ca9046c0fe",
- "sha256:0baadeb27f9e97e65922b4151f818b19c311d30b9efdb62af0e53b3db4006ce2",
- "sha256:0f6661a69c68349172ba7b4d5dd65fec2b0917abc99002425ad78c3e58cf7595",
- "sha256:10a78fce9018cc3e9a772b6537bbe3fe92380acf656c9f86db2f45e685af376e",
- "sha256:122c2e05697fa91f5d23f00bbe98a9da1bd457b32529192e934095fadb0853f1",
- "sha256:149fdfb8a26a555780c4ce53c92e6d3c990ef7b30f90a675eca02e83c6d5f76d",
- "sha256:1a2041b5788ce52f218b5be94af458e04470f997ab46fdebd57cf0b8374cc20e",
- "sha256:1a88e466fcaee659679c1d64dcb2eddbcb4bfadffeb68ba834d9c173a25b6184",
- "sha256:1bba0a866f5895d5b769d8c36b161271c7fd407e5065862ab80ff91c29fbe554",
- "sha256:1d2a154b79d5fb42d1eff06e05e22f0e8091261d877dd47b37d31352b74ecc37",
- "sha256:1eb115d53dc2a1299ae72f1119c96a556db36073bacb6da40c47ece5db0d9587",
- "sha256:202eae632815571297833876a0f407d0d9c7ad9d843b38adbe687fe68c5192ee",
- "sha256:24f3c8be826a7d44181eac2269b15b748b76d98cd9a539d4c69f09321dcb5c12",
- "sha256:28b8614de08679ae95bc4e8d6daaef6b61afdf027fa0d23bf13d619000286b3c",
- "sha256:2b0080819859e80a7776ac47cf6accb4b7ad313baf55fabac89c000480dcd103",
- "sha256:2b2ef636a6a25fe7f3d5a064bea0116b74a4c8c7df9646b17dc7386c439a26cf",
- "sha256:2c3b1ce68746557aa6e6f4547e76883925cdc7f8d7c7a9f518acd203f1265ca5",
- "sha256:3058a1bb0c767b3a6ccbb38b27ef870af819923eb732e21e44a3f300370fe159",
- "sha256:30bb223e6c3f95ad9e9bb2a113292759e947d1cfd60dbd4adb55851c370006b2",
- "sha256:317218c9d8b17a010ab2d2f0851e8ef584077a38b1ba2b7c55c9e44e79a61e73",
- "sha256:342570716e2647a51ea859b8a9126da9dc1a96a0153c9c0a3514effd60ab57ad",
- "sha256:3b40d32a3e1f04e94231ed6dfee0da9e43b4f9c6b5450d53e6dd7754c34e0c50",
- "sha256:3e55d7ecc68bdc80de5a553691a3ed260395d5362c19a266cf83cbb4e046551f",
- "sha256:475986ddf6df65d619acd52188336a20f616589403f5a5ceb3fc70cdc137037a",
- "sha256:47669fc8ed8b27baa2d698104732234b5389f6a59c37c046f6bcbf9150f7a94e",
- "sha256:4afcb38e22122465013f4621b7e9ff8d42a7a48ae0ffeb94133a806cb91b4aad",
- "sha256:4ee5b19a2d794463bcc19153dfceede7beec784b4cf7967dec0bc0fc212ab3a3",
- "sha256:5519f2a7b8c535b0f1f77b30441476571373add72008230c81211ee17b423b57",
- "sha256:59e0dda9ad245921af0328035a961767026e1fa94bb65957ab0db0a0491325d6",
- "sha256:5a97d37ee4fe0d1c6e87d2a97229c27a88787a8f4ebfbdeee95f91b818e52efe",
- "sha256:5d758e2eed2643afac5f2881542fbb5aa97640b54be20d0a5ed0691d02f0867d",
- "sha256:5edd01909348f3b0b2da329836d6b5419cd4869fec2e118e8ff3275b38af6267",
- "sha256:5f0521ed3bb9f02e9486573ea95e2062cd6bf036fa44e640bd54a06f22d85f35",
- "sha256:62d66e0423e3bd520b4c897063506b309843a8d07343fbfad04197e91a4edd28",
- "sha256:66821fada6426998762a3650a37fba77e814a249a95b1183011070744aff47f6",
- "sha256:6b17655a5f245b416e127e02087ea6347a48821cc4626bc0fd57101bfcd88afc",
- "sha256:6dc3d656702791565994e64035a208be56b065675a5bc87b644c657d6d9e2232",
- "sha256:6e61dd7d05da11fc69bb86d51f1e0ee08f74dccf3ecf884c94de41135ffdc75d",
- "sha256:726aee40357d4bdb70115442cb85ccc8e8bc554fc0bbbaa3a57cbe81df42287d",
- "sha256:743836d484151334ebba1490d6907ca9e718fe815dcd5756f2a01bc3067d099c",
- "sha256:754bac5e470adac7f7ec2239c485cd0b75f8197ca8a5b86ffb20eb3a3676cc42",
- "sha256:779006f9e1aade9522a40e8d9635115ab15dd82b7af8e655967162e9c01e2573",
- "sha256:8ab9f5b7f2bbc1754bc6292d9a7312071058e5a891b0391e6d13b226133f36aa",
- "sha256:8c52b12b10e4057fc302bd09cb3e3f28bb382c30c044eb3396e805179a8260e4",
- "sha256:90ea8d302a5d30b948451d146e94674a3c5b020cc0ced9a1c28f8ddb0f203a5d",
- "sha256:939d364a187b2adfbf6ae488664277e717d56c7951a4ddeb4f23b281bc50bfe5",
- "sha256:97f1f861998e326e640708488c442519ad69046374b2c3fe9bcc9869b387f23c",
- "sha256:9c76e43cb351ba8887371240b599925cdf3ecececc5dfb7125c71678e7722c55",
- "sha256:9c9d7d1267dee8c6627963d9376efa068858cfc8f573c083b1b6a2d297a8710f",
- "sha256:9f9732e59863eaeedd3feef94b2b216cb86d40dda4fad2d0f0aaec3b31592716",
- "sha256:a166251b8fbc6f2755e2ce9d3c11e9edb0c0c7d2ed723658ff0161fbce26ac1c",
- "sha256:a46ef3ecf61e4840fbc1145fdd38acf158d0da7543eda7b773ed2b30f75c2830",
- "sha256:a65a147f545f3fac86f11acb2d0b316d3e78139a9372317b7eb50561b2817ba0",
- "sha256:abda20aff8d1751e48d7967fa8945fef38536b82366c49be39b83678d4be3893",
- "sha256:acf41cf91bbc5a36d1fa4455a818bb02bf2a4ccfed2f892ba166ba2fcbb0ec8a",
- "sha256:adcd6ba863a315702184d92d3d3bbff290514f24a14695d310f02ae5e28bd1f7",
- "sha256:b3afa5a0ed08a477ded239c05db14c19af585975194a00adf594d48533b23701",
- "sha256:b669aaac70bd9f03c070270b953f78d9ee56c4af6f0ff9f9cd3e6d1878c10b40",
- "sha256:bdaaa81a6e95a0a19fba0285f10577377f3503ae4e9988b403feba79da3e2f80",
- "sha256:cb5fefb53b9d9f334a5d9ec518a36b92a10b936011ac8a6b6dffd60135f16459",
- "sha256:cb8a6a19be0cbf6da6fcbf3698b76c8af03fe83e4bd77c96c3922be3b88bf7da",
- "sha256:ceb3ce3262b0e8e088e4117175591b7a82b3bdc5e52e33b1e74778b5fb53fd38",
- "sha256:d06990dcfcd41bb3543c18dd25c8476fbfe1f236757f42fef560f6aa03ac8dfc",
- "sha256:d6e3b177e634aa6bbbfbf66d097b6d1cdb80fc60e912c7d8bace2e45699c07dd",
- "sha256:db78b645dc63c0ccffca367a498f3b13492fb106a2243a1e998303ba79c996e2",
- "sha256:ded03546938a987f463c68ab98d683af87a83db7ac8093bbc179e77680be5ba2",
- "sha256:e152f4ab9ea1632b5fecdd87cee354f2b2eb6e2dfc3aceb0eb36a01c1e12f94c",
- "sha256:ef133a1a2ee378d549048a12d56f4ef0e2b9113b0b25b6b77821e9af94d50634",
- "sha256:f0f749f07002c2d6fecf37cedc43207a88e6c651926a470a5f229070cf791879",
- "sha256:f7bc7088c15150745baf66db62a4ced4507d44419eb66207b609f91b64a682af",
- "sha256:f859c88193ed466bee4eb9d45fbc29d2253e6aa3ccd9119c9a1d8d95f409a60d",
- "sha256:f963b6ed8ba33eda374a98d979e8a0eaf21f891b6e334701693a2c9510613c4c",
- "sha256:fa5057a86df920faab8ee83960b724bace01a3231eb8e3f2c93d78283504d598",
- "sha256:fb693000b65842c85356b667d057ae0d0bac6519feca7e1c437cc2cfeb0afc59",
- "sha256:fc9d79b1bf833af63b7c720a6604eb16453ac1ad4e718eb8b59d1f97d986b98c",
- "sha256:ffcb09d5c0ffa043254ec9a734a73f3791fec8bf6333592f906bb2e91ed2af1a"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.8'",
- "version": "==1.3.4"
- },
- "six": {
- "hashes": [
- "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274",
- "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"
- ],
- "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'",
- "version": "==1.17.0"
- },
- "sniffio": {
- "hashes": [
- "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2",
- "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"
- ],
- "markers": "python_version >= '3.7'",
- "version": "==1.3.1"
- },
- "sqlparse": {
- "hashes": [
- "sha256:09f67787f56a0b16ecdbde1bfc7f5d9c3371ca683cfeaa8e6ff60b4807ec9272",
- "sha256:cf2196ed3418f3ba5de6af7e82c694a9fbdbfecccdfc72e281548517081f16ca"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==0.5.3"
- },
- "threadpoolctl": {
- "hashes": [
- "sha256:082433502dd922bf738de0d8bcc4fdcbf0979ff44c42bd40f5af8a282f6fa107",
- "sha256:56c1e26c150397e58c4926da8eeee87533b1e32bef131bd4bf6a2f45f3185467"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==3.5.0"
- },
- "tika-client": {
- "hashes": [
- "sha256:2464e8335b5e92c276641c729e7707f1e894a2bfb51cc59abdd3bdfb532da8a0",
- "sha256:c10bba8e40ede23c039f84ccd821fb2d290d339cc26cbd267ab9b561a1e83659"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.9'",
- "version": "==0.9.0"
- },
- "tornado": {
- "hashes": [
- "sha256:072ce12ada169c5b00b7d92a99ba089447ccc993ea2143c9ede887e0937aa803",
- "sha256:1a017d239bd1bb0919f72af256a970624241f070496635784d9bf0db640d3fec",
- "sha256:2876cef82e6c5978fde1e0d5b1f919d756968d5b4282418f3146b79b58556482",
- "sha256:304463bd0772442ff4d0f5149c6f1c2135a1fae045adf070821c6cdc76980634",
- "sha256:908b71bf3ff37d81073356a5fadcc660eb10c1476ee6e2725588626ce7e5ca38",
- "sha256:92bad5b4746e9879fd7bf1eb21dce4e3fc5128d71601f80005afa39237ad620b",
- "sha256:932d195ca9015956fa502c6b56af9eb06106140d844a335590c1ec7f5277d10c",
- "sha256:bca9eb02196e789c9cb5c3c7c0f04fb447dc2adffd95265b2c7223a8a615ccbf",
- "sha256:c36e62ce8f63409301537222faffcef7dfc5284f27eec227389f2ad11b09d946",
- "sha256:c82c46813ba483a385ab2a99caeaedf92585a1f90defb5693351fa7e4ea0bf73",
- "sha256:e828cce1123e9e44ae2a50a9de3055497ab1d0aeb440c5ac23064d9e44880da1"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==6.4.2"
- },
- "tqdm": {
- "hashes": [
- "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2",
- "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.7'",
- "version": "==4.67.1"
- },
- "typing-extensions": {
- "hashes": [
- "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d",
- "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"
- ],
- "markers": "python_version < '3.11'",
- "version": "==4.12.2"
- },
- "tzdata": {
- "hashes": [
- "sha256:24894909e88cdb28bd1636c6887801df64cb485bd593f2fd83ef29075a81d694",
- "sha256:7e127113816800496f027041c570f50bcd464a020098a3b6b199517772303639"
- ],
- "markers": "python_version >= '2'",
- "version": "==2025.1"
- },
- "tzlocal": {
- "hashes": [
- "sha256:49816ef2fe65ea8ac19d19aa7a1ae0551c834303d5014c6d5a62e4cbda8047b8",
- "sha256:8d399205578f1a9342816409cc1e46a93ebd5755e39ea2d85334bea911bf0e6e"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==5.2"
- },
- "uritemplate": {
- "hashes": [
- "sha256:4346edfc5c3b79f694bccd6d6099a322bbeb628dbf2cd86eea55a456ce5124f0",
- "sha256:830c08b8d99bdd312ea4ead05994a38e8936266f84b9a7878232db50b044e02e"
- ],
- "markers": "python_version >= '3.6'",
- "version": "==4.1.1"
- },
- "urllib3": {
- "hashes": [
- "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df",
- "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"
- ],
- "markers": "python_version >= '3.9'",
- "version": "==2.3.0"
- },
- "uvicorn": {
- "extras": [
- "standard"
- ],
- "hashes": [
- "sha256:6dddbad1d7ee0f5140aba5ec138ddc9612c5109399903828b4874c9937f009c2",
- "sha256:ce107f5d9bd02b4636001a77a4e74aab5e1e2b146868ebbad565237145af444c"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==0.25.0"
- },
- "uvloop": {
- "hashes": [
- "sha256:0878c2640cf341b269b7e128b1a5fed890adc4455513ca710d77d5e93aa6d6a0",
- "sha256:10d66943def5fcb6e7b37310eb6b5639fd2ccbc38df1177262b0640c3ca68c1f",
- "sha256:10da8046cc4a8f12c91a1c39d1dd1585c41162a15caaef165c2174db9ef18bdc",
- "sha256:17df489689befc72c39a08359efac29bbee8eee5209650d4b9f34df73d22e414",
- "sha256:183aef7c8730e54c9a3ee3227464daed66e37ba13040bb3f350bc2ddc040f22f",
- "sha256:196274f2adb9689a289ad7d65700d37df0c0930fd8e4e743fa4834e850d7719d",
- "sha256:221f4f2a1f46032b403bf3be628011caf75428ee3cc204a22addf96f586b19fd",
- "sha256:2d1f581393673ce119355d56da84fe1dd9d2bb8b3d13ce792524e1607139feff",
- "sha256:359ec2c888397b9e592a889c4d72ba3d6befba8b2bb01743f72fffbde663b59c",
- "sha256:3bf12b0fda68447806a7ad847bfa591613177275d35b6724b1ee573faa3704e3",
- "sha256:4509360fcc4c3bd2c70d87573ad472de40c13387f5fda8cb58350a1d7475e58d",
- "sha256:460def4412e473896ef179a1671b40c039c7012184b627898eea5072ef6f017a",
- "sha256:461d9ae6660fbbafedd07559c6a2e57cd553b34b0065b6550685f6653a98c1cb",
- "sha256:46923b0b5ee7fc0020bef24afe7836cb068f5050ca04caf6b487c513dc1a20b2",
- "sha256:53e420a3afe22cdcf2a0f4846e377d16e718bc70103d7088a4f7623567ba5fb0",
- "sha256:5ee4d4ef48036ff6e5cfffb09dd192c7a5027153948d85b8da7ff705065bacc6",
- "sha256:67dd654b8ca23aed0a8e99010b4c34aca62f4b7fce88f39d452ed7622c94845c",
- "sha256:787ae31ad8a2856fc4e7c095341cccc7209bd657d0e71ad0dc2ea83c4a6fa8af",
- "sha256:86975dca1c773a2c9864f4c52c5a55631038e387b47eaf56210f873887b6c8dc",
- "sha256:87c43e0f13022b998eb9b973b5e97200c8b90823454d4bc06ab33829e09fb9bb",
- "sha256:88cb67cdbc0e483da00af0b2c3cdad4b7c61ceb1ee0f33fe00e09c81e3a6cb75",
- "sha256:8a375441696e2eda1c43c44ccb66e04d61ceeffcd76e4929e527b7fa401b90fb",
- "sha256:a5c39f217ab3c663dc699c04cbd50c13813e31d917642d459fdcec07555cc553",
- "sha256:b9fb766bb57b7388745d8bcc53a359b116b8a04c83a2288069809d2b3466c37e",
- "sha256:baa0e6291d91649c6ba4ed4b2f982f9fa165b5bbd50a9e203c416a2797bab3c6",
- "sha256:baa4dcdbd9ae0a372f2167a207cd98c9f9a1ea1188a8a526431eef2f8116cc8d",
- "sha256:bc09f0ff191e61c2d592a752423c767b4ebb2986daa9ed62908e2b1b9a9ae206",
- "sha256:bd53ecc9a0f3d87ab847503c2e1552b690362e005ab54e8a48ba97da3924c0dc",
- "sha256:bfd55dfcc2a512316e65f16e503e9e450cab148ef11df4e4e679b5e8253a5281",
- "sha256:c097078b8031190c934ed0ebfee8cc5f9ba9642e6eb88322b9958b649750f72b",
- "sha256:c0f3fa6200b3108919f8bdabb9a7f87f20e7097ea3c543754cabc7d717d95cf8",
- "sha256:e678ad6fe52af2c58d2ae3c73dc85524ba8abe637f134bf3564ed07f555c5e79",
- "sha256:ec7e6b09a6fdded42403182ab6b832b71f4edaf7f37a9a0e371a01db5f0cb45f",
- "sha256:f0ce1b49560b1d2d8a2977e3ba4afb2414fb46b86a1b64056bc4ab929efdafbe",
- "sha256:f38b2e090258d051d68a5b14d1da7203a3c3677321cf32a95a6f4db4dd8b6f26",
- "sha256:f3df876acd7ec037a3d005b3ab85a7e4110422e4d9c1571d4fc89b0fc41b6816",
- "sha256:f7089d2dc73179ce5ac255bdf37c236a9f914b264825fdaacaded6990a7fb4c2"
- ],
- "markers": "python_full_version >= '3.8.0'",
- "version": "==0.21.0"
- },
- "vine": {
- "hashes": [
- "sha256:40fdf3c48b2cfe1c38a49e9ae2da6fda88e4794c810050a728bd7413811fb1dc",
- "sha256:8b62e981d35c41049211cf62a0a1242d8c1ee9bd15bb196ce38aefd6799e61e0"
- ],
- "markers": "python_version >= '3.6'",
- "version": "==5.1.0"
- },
- "watchdog": {
- "hashes": [
- "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a",
- "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2",
- "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f",
- "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c",
- "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c",
- "sha256:6eb11feb5a0d452ee41f824e271ca311a09e250441c262ca2fd7ebcf2461a06c",
- "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0",
- "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13",
- "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134",
- "sha256:7a0e56874cfbc4b9b05c60c8a1926fedf56324bb08cfbc188969777940aef3aa",
- "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e",
- "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379",
- "sha256:90c8e78f3b94014f7aaae121e6b909674df5b46ec24d6bebc45c44c56729af2a",
- "sha256:9513f27a1a582d9808cf21a07dae516f0fab1cf2d7683a742c498b93eedabb11",
- "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282",
- "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b",
- "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f",
- "sha256:afd0fe1b2270917c5e23c2a65ce50c2a4abb63daafb0d419fde368e272a76b7c",
- "sha256:bc64ab3bdb6a04d69d4023b29422170b74681784ffb9463ed4870cf2f3e66112",
- "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948",
- "sha256:c7ac31a19f4545dd92fc25d200694098f42c9a8e391bc00bdd362c5736dbf881",
- "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860",
- "sha256:c897ac1b55c5a1461e16dae288d22bb2e412ba9807df8397a635d88f671d36c3",
- "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680",
- "sha256:d1cdb490583ebd691c012b3d6dae011000fe42edb7a82ece80965b42abd61f26",
- "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26",
- "sha256:e6439e374fc012255b4ec786ae3c4bc838cd7309a540e5fe0952d03687d8804e",
- "sha256:e6f0e77c9417e7cd62af82529b10563db3423625c5fce018430b249bf977f9e8",
- "sha256:e7631a77ffb1f7d2eefa4445ebbee491c720a5661ddf6df3498ebecae5ed375c",
- "sha256:ef810fbf7b781a5a593894e4f439773830bdecb885e6880d957d5b9382a960d2"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.9'",
- "version": "==6.0.0"
- },
- "watchfiles": {
- "hashes": [
- "sha256:02a526ee5b5a09e8168314c905fc545c9bc46509896ed282aeb5a8ba9bd6ca27",
- "sha256:05d341c71f3d7098920f8551d4df47f7b57ac5b8dad56558064c3431bdfc0b74",
- "sha256:076f293100db3b0b634514aa0d294b941daa85fc777f9c698adb1009e5aca0b1",
- "sha256:0799ae68dfa95136dde7c472525700bd48777875a4abb2ee454e3ab18e9fc712",
- "sha256:0986902677a1a5e6212d0c49b319aad9cc48da4bd967f86a11bde96ad9676ca1",
- "sha256:0bc80d91ddaf95f70258cf78c471246846c1986bcc5fd33ccc4a1a67fcb40f9a",
- "sha256:13c2ce7b72026cfbca120d652f02c7750f33b4c9395d79c9790b27f014c8a5a2",
- "sha256:1941b4e39de9b38b868a69b911df5e89dc43767feeda667b40ae032522b9b5f1",
- "sha256:1eacd91daeb5158c598fe22d7ce66d60878b6294a86477a4715154990394c9b3",
- "sha256:229e6ec880eca20e0ba2f7e2249c85bae1999d330161f45c78d160832e026ee2",
- "sha256:22bb55a7c9e564e763ea06c7acea24fc5d2ee5dfc5dafc5cfbedfe58505e9f90",
- "sha256:278aaa395f405972e9f523bd786ed59dfb61e4b827856be46a42130605fd0899",
- "sha256:2a9f93f8439639dc244c4d2902abe35b0279102bca7bbcf119af964f51d53c19",
- "sha256:308ac265c56f936636e3b0e3f59e059a40003c655228c131e1ad439957592303",
- "sha256:31f1a379c9dcbb3f09cf6be1b7e83b67c0e9faabed0471556d9438a4a4e14202",
- "sha256:32b026a6ab64245b584acf4931fe21842374da82372d5c039cba6bf99ef722f3",
- "sha256:342622287b5604ddf0ed2d085f3a589099c9ae8b7331df3ae9845571586c4f3d",
- "sha256:39f4914548b818540ef21fd22447a63e7be6e24b43a70f7642d21f1e73371590",
- "sha256:3f68d8e9d5a321163ddacebe97091000955a1b74cd43724e346056030b0bacee",
- "sha256:43b168bba889886b62edb0397cab5b6490ffb656ee2fcb22dec8bfeb371a9e12",
- "sha256:47eb32ef8c729dbc4f4273baece89398a4d4b5d21a1493efea77a17059f4df8a",
- "sha256:4810ea2ae622add560f4aa50c92fef975e475f7ac4900ce5ff5547b2434642d8",
- "sha256:4e997802d78cdb02623b5941830ab06f8860038faf344f0d288d325cc9c5d2ff",
- "sha256:4ebbeca9360c830766b9f0df3640b791be569d988f4be6c06d6fae41f187f105",
- "sha256:4f8c4998506241dedf59613082d1c18b836e26ef2a4caecad0ec41e2a15e4226",
- "sha256:55ccfd27c497b228581e2838d4386301227fc0cb47f5a12923ec2fe4f97b95af",
- "sha256:5717021b199e8353782dce03bd8a8f64438832b84e2885c4a645f9723bf656d9",
- "sha256:5c11ea22304d17d4385067588123658e9f23159225a27b983f343fcffc3e796a",
- "sha256:5e0227b8ed9074c6172cf55d85b5670199c99ab11fd27d2c473aa30aec67ee42",
- "sha256:62c9953cf85529c05b24705639ffa390f78c26449e15ec34d5339e8108c7c407",
- "sha256:6ba473efd11062d73e4f00c2b730255f9c1bdd73cd5f9fe5b5da8dbd4a717205",
- "sha256:740d103cd01458f22462dedeb5a3382b7f2c57d07ff033fbc9465919e5e1d0f3",
- "sha256:74cb3ca19a740be4caa18f238298b9d472c850f7b2ed89f396c00a4c97e2d9ff",
- "sha256:7b75fee5a16826cf5c46fe1c63116e4a156924d668c38b013e6276f2582230f0",
- "sha256:7cf684aa9bba4cd95ecb62c822a56de54e3ae0598c1a7f2065d51e24637a3c5d",
- "sha256:8012bd820c380c3d3db8435e8cf7592260257b378b649154a7948a663b5f84e9",
- "sha256:857f5fc3aa027ff5e57047da93f96e908a35fe602d24f5e5d8ce64bf1f2fc733",
- "sha256:8b1f135238e75d075359cf506b27bf3f4ca12029c47d3e769d8593a2024ce161",
- "sha256:8d0d0630930f5cd5af929040e0778cf676a46775753e442a3f60511f2409f48f",
- "sha256:90192cdc15ab7254caa7765a98132a5a41471cf739513cc9bcf7d2ffcc0ec7b2",
- "sha256:95b42cac65beae3a362629950c444077d1b44f1790ea2772beaea95451c086bb",
- "sha256:9745a4210b59e218ce64c91deb599ae8775c8a9da4e95fb2ee6fe745fc87d01a",
- "sha256:9d1ef56b56ed7e8f312c934436dea93bfa3e7368adfcf3df4c0da6d4de959a1e",
- "sha256:9eea33ad8c418847dd296e61eb683cae1c63329b6d854aefcd412e12d94ee235",
- "sha256:9f25d0ba0fe2b6d2c921cf587b2bf4c451860086534f40c384329fb96e2044d1",
- "sha256:9fe37a2de80aa785d340f2980276b17ef697ab8db6019b07ee4fd28a8359d2f3",
- "sha256:a38320582736922be8c865d46520c043bff350956dfc9fbaee3b2df4e1740a4b",
- "sha256:a462490e75e466edbb9fc4cd679b62187153b3ba804868452ef0577ec958f5ff",
- "sha256:a5ae5706058b27c74bac987d615105da17724172d5aaacc6c362a40599b6de43",
- "sha256:aa216f87594f951c17511efe5912808dfcc4befa464ab17c98d387830ce07b60",
- "sha256:ab0311bb2ffcd9f74b6c9de2dda1612c13c84b996d032cd74799adb656af4e8b",
- "sha256:ab594e75644421ae0a2484554832ca5895f8cab5ab62de30a1a57db460ce06c6",
- "sha256:aee397456a29b492c20fda2d8961e1ffb266223625346ace14e4b6d861ba9c80",
- "sha256:b045c800d55bc7e2cadd47f45a97c7b29f70f08a7c2fa13241905010a5493f94",
- "sha256:b77d5622ac5cc91d21ae9c2b284b5d5c51085a0bdb7b518dba263d0af006132c",
- "sha256:ba5bb3073d9db37c64520681dd2650f8bd40902d991e7b4cfaeece3e32561d08",
- "sha256:bdef5a1be32d0b07dcea3318a0be95d42c98ece24177820226b56276e06b63b0",
- "sha256:c2acfa49dd0ad0bf2a9c0bb9a985af02e89345a7189be1efc6baa085e0f72d7c",
- "sha256:c7cce76c138a91e720d1df54014a047e680b652336e1b73b8e3ff3158e05061e",
- "sha256:cc27a65069bcabac4552f34fd2dce923ce3fcde0721a16e4fb1b466d63ec831f",
- "sha256:cdbd912a61543a36aef85e34f212e5d2486e7c53ebfdb70d1e0b060cc50dd0bf",
- "sha256:cdcc92daeae268de1acf5b7befcd6cfffd9a047098199056c72e4623f531de18",
- "sha256:d3452c1ec703aa1c61e15dfe9d482543e4145e7c45a6b8566978fbb044265a21",
- "sha256:d6097538b0ae5c1b88c3b55afa245a66793a8fec7ada6755322e465fb1a0e8cc",
- "sha256:d8d3d9203705b5797f0af7e7e5baa17c8588030aaadb7f6a86107b7247303817",
- "sha256:e0611d244ce94d83f5b9aff441ad196c6e21b55f77f3c47608dcf651efe54c4a",
- "sha256:f12969a3765909cf5dc1e50b2436eb2c0e676a3c75773ab8cc3aa6175c16e902",
- "sha256:f44a39aee3cbb9b825285ff979ab887a25c5d336e5ec3574f1506a4671556a8d",
- "sha256:f9ce064e81fe79faa925ff03b9f4c1a98b0bbb4a1b8c1b015afa93030cb21a49",
- "sha256:fb2c46e275fbb9f0c92e7654b231543c7bbfa1df07cdc4b99fa73bedfde5c844",
- "sha256:fc2eb5d14a8e0d5df7b36288979176fbb39672d45184fc4b1c004d7c3ce29317"
- ],
- "markers": "python_version >= '3.9'",
- "version": "==1.0.4"
- },
- "wcwidth": {
- "hashes": [
- "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859",
- "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"
- ],
- "version": "==0.2.13"
- },
- "webencodings": {
- "hashes": [
- "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78",
- "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"
- ],
- "version": "==0.5.1"
- },
- "websockets": {
- "hashes": [
- "sha256:02687db35dbc7d25fd541a602b5f8e451a238ffa033030b172ff86a93cb5dc2a",
- "sha256:065ce275e7c4ffb42cb738dd6b20726ac26ac9ad0a2a48e33ca632351a737267",
- "sha256:091ab63dfc8cea748cc22c1db2814eadb77ccbf82829bac6b2fbe3401d548eda",
- "sha256:0a52a6d7cf6938e04e9dceb949d35fbdf58ac14deea26e685ab6368e73744e4c",
- "sha256:0a6f3efd47ffd0d12080594f434faf1cd2549b31e54870b8470b28cc1d3817d9",
- "sha256:0d8c3e2cdb38f31d8bd7d9d28908005f6fa9def3324edb9bf336d7e4266fd397",
- "sha256:1979bee04af6a78608024bad6dfcc0cc930ce819f9e10342a29a05b5320355d0",
- "sha256:1a5a20d5843886d34ff8c57424cc65a1deda4375729cbca4cb6b3353f3ce4142",
- "sha256:1c9b6535c0e2cf8a6bf938064fb754aaceb1e6a4a51a80d884cd5db569886910",
- "sha256:1f20522e624d7ffbdbe259c6b6a65d73c895045f76a93719aa10cd93b3de100c",
- "sha256:2066dc4cbcc19f32c12a5a0e8cc1b7ac734e5b64ac0a325ff8353451c4b15ef2",
- "sha256:20e6dd0984d7ca3037afcb4494e48c74ffb51e8013cac71cf607fffe11df7205",
- "sha256:22441c81a6748a53bfcb98951d58d1af0661ab47a536af08920d129b4d1c3473",
- "sha256:2c6c0097a41968b2e2b54ed3424739aab0b762ca92af2379f152c1aef0187e1c",
- "sha256:2dddacad58e2614a24938a50b85969d56f88e620e3f897b7d80ac0d8a5800258",
- "sha256:2e20c5f517e2163d76e2729104abc42639c41cf91f7b1839295be43302713661",
- "sha256:34277a29f5303d54ec6468fb525d99c99938607bc96b8d72d675dee2b9f5bf1d",
- "sha256:3bdc8c692c866ce5fefcaf07d2b55c91d6922ac397e031ef9b774e5b9ea42166",
- "sha256:3c1426c021c38cf92b453cdf371228d3430acd775edee6bac5a4d577efc72365",
- "sha256:44bba1a956c2c9d268bdcdf234d5e5ff4c9b6dc3e300545cbe99af59dda9dcce",
- "sha256:4b27ece32f63150c268593d5fdb82819584831a83a3f5809b7521df0685cd5d8",
- "sha256:4da98b72009836179bb596a92297b1a61bb5a830c0e483a7d0766d45070a08ad",
- "sha256:4daa0faea5424d8713142b33825fff03c736f781690d90652d2c8b053345b0e7",
- "sha256:5059ed9c54945efb321f097084b4c7e52c246f2c869815876a69d1efc4ad6eb5",
- "sha256:577a4cebf1ceaf0b65ffc42c54856214165fb8ceeba3935852fc33f6b0c55e7f",
- "sha256:647b573f7d3ada919fd60e64d533409a79dcf1ea21daeb4542d1d996519ca967",
- "sha256:669c3e101c246aa85bc8534e495952e2ca208bd87994650b90a23d745902db9a",
- "sha256:6af6a4b26eea4fc06c6818a6b962a952441e0e39548b44773502761ded8cc1d4",
- "sha256:6af99a38e49f66be5a64b1e890208ad026cda49355661549c507152113049990",
- "sha256:6d7ff794c8b36bc402f2e07c0b2ceb4a2424147ed4785ff03e2a7af03711d60a",
- "sha256:6f1372e511c7409a542291bce92d6c83320e02c9cf392223272287ce55bc224e",
- "sha256:714a9b682deb4339d39ffa674f7b674230227d981a37d5d174a4a83e3978a610",
- "sha256:75862126b3d2d505e895893e3deac0a9339ce750bd27b4ba515f008b5acf832d",
- "sha256:7a570862c325af2111343cc9b0257b7119b904823c675b22d4ac547163088d0d",
- "sha256:7a6ceec4ea84469f15cf15807a747e9efe57e369c384fa86e022b3bea679b79b",
- "sha256:7cd5706caec1686c5d233bc76243ff64b1c0dc445339bd538f30547e787c11fe",
- "sha256:80c8efa38957f20bba0117b48737993643204645e9ec45512579132508477cfc",
- "sha256:862e9967b46c07d4dcd2532e9e8e3c2825e004ffbf91a5ef9dde519ee2effb0b",
- "sha256:86cf1aaeca909bf6815ea714d5c5736c8d6dd3a13770e885aafe062ecbd04f1f",
- "sha256:89a71173caaf75fa71a09a5f614f450ba3ec84ad9fca47cb2422a860676716f0",
- "sha256:9f05702e93203a6ff5226e21d9b40c037761b2cfb637187c9802c10f58e40473",
- "sha256:a39d7eceeea35db85b85e1169011bb4321c32e673920ae9c1b6e0978590012a3",
- "sha256:a3c4aa3428b904d5404a0ed85f3644d37e2cb25996b7f096d77caeb0e96a3b42",
- "sha256:a9b0f6c3ba3b1240f602ebb3971d45b02cc12bd1845466dd783496b3b05783a5",
- "sha256:a9e72fb63e5f3feacdcf5b4ff53199ec8c18d66e325c34ee4c551ca748623bbc",
- "sha256:ab95d357cd471df61873dadf66dd05dd4709cae001dd6342edafc8dc6382f307",
- "sha256:ad1c1d02357b7665e700eca43a31d52814ad9ad9b89b58118bdabc365454b574",
- "sha256:b374e8953ad477d17e4851cdc66d83fdc2db88d9e73abf755c94510ebddceb95",
- "sha256:b439ea828c4ba99bb3176dc8d9b933392a2413c0f6b149fdcba48393f573377f",
- "sha256:b4c8cef610e8d7c70dea92e62b6814a8cd24fbd01d7103cc89308d2bfe1659ef",
- "sha256:bbe03eb853e17fd5b15448328b4ec7fb2407d45fb0245036d06a3af251f8e48f",
- "sha256:bc63cee8596a6ec84d9753fd0fcfa0452ee12f317afe4beae6b157f0070c6c7f",
- "sha256:c3ecadc7ce90accf39903815697917643f5b7cfb73c96702318a096c00aa71f5",
- "sha256:c76193c1c044bd1e9b3316dcc34b174bbf9664598791e6fb606d8d29000e070c",
- "sha256:c93215fac5dadc63e51bcc6dceca72e72267c11def401d6668622b47675b097f",
- "sha256:cc45afb9c9b2dc0852d5c8b5321759cf825f82a31bfaf506b65bf4668c96f8b2",
- "sha256:d7d9cafbccba46e768be8a8ad4635fa3eae1ffac4c6e7cb4eb276ba41297ed29",
- "sha256:da85651270c6bfb630136423037dd4975199e5d4114cae6d3066641adcc9d1c7",
- "sha256:dec254fcabc7bd488dab64846f588fc5b6fe0d78f641180030f8ea27b76d72c3",
- "sha256:e3fbd68850c837e57373d95c8fe352203a512b6e49eaae4c2f4088ef8cf21980",
- "sha256:e8179f95323b9ab1c11723e5d91a89403903f7b001828161b480a7810b334885",
- "sha256:e9d0e53530ba7b8b5e389c02282f9d2aa47581514bd6049d3a7cffe1385cf5fe",
- "sha256:eabdb28b972f3729348e632ab08f2a7b616c7e53d5414c12108c29972e655b20",
- "sha256:ec607328ce95a2f12b595f7ae4c5d71bf502212bddcea528290b35c286932b12",
- "sha256:efd9b868d78b194790e6236d9cbc46d68aba4b75b22497eb4ab64fa640c3af56",
- "sha256:f2e53c72052f2596fb792a7acd9704cbc549bf70fcde8a99e899311455974ca3",
- "sha256:f390024a47d904613577df83ba700bd189eedc09c57af0a904e5c39624621270",
- "sha256:f8a86a269759026d2bde227652b87be79f8a734e582debf64c9d302faa1e9f03",
- "sha256:fd475a974d5352390baf865309fe37dec6831aafc3014ffac1eea99e84e83fc2"
- ],
- "markers": "python_version >= '3.9'",
- "version": "==14.2"
- },
- "whitenoise": {
- "hashes": [
- "sha256:486bd7267a375fa9650b136daaec156ac572971acc8bf99add90817a530dd1d4",
- "sha256:df12dce147a043d1956d81d288c6f0044147c6d2ab9726e5772ac50fb45d2280"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.9'",
- "version": "==6.8.2"
- },
- "whoosh": {
- "hashes": [
- "sha256:7ca5633dbfa9e0e0fa400d3151a8a0c4bec53bd2ecedc0a67705b17565c31a83",
- "sha256:aa39c3c3426e3fd107dcb4bde64ca1e276a65a889d9085a6e4b54ba82420a852",
- "sha256:e0857375f63e9041e03fedd5b7541f97cf78917ac1b6b06c1fcc9b45375dda69"
- ],
- "index": "pypi",
- "version": "==2.7.4"
- },
- "wrapt": {
- "hashes": [
- "sha256:08e7ce672e35efa54c5024936e559469436f8b8096253404faeb54d2a878416f",
- "sha256:0a6e821770cf99cc586d33833b2ff32faebdbe886bd6322395606cf55153246c",
- "sha256:0b929ac182f5ace000d459c59c2c9c33047e20e935f8e39371fa6e3b85d56f4a",
- "sha256:129a150f5c445165ff941fc02ee27df65940fcb8a22a61828b1853c98763a64b",
- "sha256:13e6afb7fe71fe7485a4550a8844cc9ffbe263c0f1a1eea569bc7091d4898555",
- "sha256:1473400e5b2733e58b396a04eb7f35f541e1fb976d0c0724d0223dd607e0f74c",
- "sha256:18983c537e04d11cf027fbb60a1e8dfd5190e2b60cc27bc0808e653e7b218d1b",
- "sha256:1a7ed2d9d039bd41e889f6fb9364554052ca21ce823580f6a07c4ec245c1f5d6",
- "sha256:1e1fe0e6ab7775fd842bc39e86f6dcfc4507ab0ffe206093e76d61cde37225c8",
- "sha256:1fb5699e4464afe5c7e65fa51d4f99e0b2eadcc176e4aa33600a3df7801d6662",
- "sha256:2696993ee1eebd20b8e4ee4356483c4cb696066ddc24bd70bcbb80fa56ff9061",
- "sha256:35621ae4c00e056adb0009f8e86e28eb4a41a4bfa8f9bfa9fca7d343fe94f998",
- "sha256:36ccae62f64235cf8ddb682073a60519426fdd4725524ae38874adf72b5f2aeb",
- "sha256:3cedbfa9c940fdad3e6e941db7138e26ce8aad38ab5fe9dcfadfed9db7a54e62",
- "sha256:3d57c572081fed831ad2d26fd430d565b76aa277ed1d30ff4d40670b1c0dd984",
- "sha256:3fc7cb4c1c744f8c05cd5f9438a3caa6ab94ce8344e952d7c45a8ed59dd88392",
- "sha256:4011d137b9955791f9084749cba9a367c68d50ab8d11d64c50ba1688c9b457f2",
- "sha256:40d615e4fe22f4ad3528448c193b218e077656ca9ccb22ce2cb20db730f8d306",
- "sha256:410a92fefd2e0e10d26210e1dfb4a876ddaf8439ef60d6434f21ef8d87efc5b7",
- "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3",
- "sha256:468090021f391fe0056ad3e807e3d9034e0fd01adcd3bdfba977b6fdf4213ea9",
- "sha256:49703ce2ddc220df165bd2962f8e03b84c89fee2d65e1c24a7defff6f988f4d6",
- "sha256:4a721d3c943dae44f8e243b380cb645a709ba5bd35d3ad27bc2ed947e9c68192",
- "sha256:4afd5814270fdf6380616b321fd31435a462019d834f83c8611a0ce7484c7317",
- "sha256:4c82b8785d98cdd9fed4cac84d765d234ed3251bd6afe34cb7ac523cb93e8b4f",
- "sha256:4db983e7bca53819efdbd64590ee96c9213894272c776966ca6306b73e4affda",
- "sha256:582530701bff1dec6779efa00c516496968edd851fba224fbd86e46cc6b73563",
- "sha256:58455b79ec2661c3600e65c0a716955adc2410f7383755d537584b0de41b1d8a",
- "sha256:58705da316756681ad3c9c73fd15499aa4d8c69f9fd38dc8a35e06c12468582f",
- "sha256:5bb1d0dbf99411f3d871deb6faa9aabb9d4e744d67dcaaa05399af89d847a91d",
- "sha256:5c803c401ea1c1c18de70a06a6f79fcc9c5acfc79133e9869e730ad7f8ad8ef9",
- "sha256:5cbabee4f083b6b4cd282f5b817a867cf0b1028c54d445b7ec7cfe6505057cf8",
- "sha256:612dff5db80beef9e649c6d803a8d50c409082f1fedc9dbcdfde2983b2025b82",
- "sha256:62c2caa1585c82b3f7a7ab56afef7b3602021d6da34fbc1cf234ff139fed3cd9",
- "sha256:69606d7bb691b50a4240ce6b22ebb319c1cfb164e5f6569835058196e0f3a845",
- "sha256:6d9187b01bebc3875bac9b087948a2bccefe464a7d8f627cf6e48b1bbae30f82",
- "sha256:6ed6ffac43aecfe6d86ec5b74b06a5be33d5bb9243d055141e8cabb12aa08125",
- "sha256:703919b1633412ab54bcf920ab388735832fdcb9f9a00ae49387f0fe67dad504",
- "sha256:766d8bbefcb9e00c3ac3b000d9acc51f1b399513f44d77dfe0eb026ad7c9a19b",
- "sha256:80dd7db6a7cb57ffbc279c4394246414ec99537ae81ffd702443335a61dbf3a7",
- "sha256:8112e52c5822fc4253f3901b676c55ddf288614dc7011634e2719718eaa187dc",
- "sha256:8c8b293cd65ad716d13d8dd3624e42e5a19cc2a2f1acc74b30c2c13f15cb61a6",
- "sha256:8fdbdb757d5390f7c675e558fd3186d590973244fab0c5fe63d373ade3e99d40",
- "sha256:91bd7d1773e64019f9288b7a5101f3ae50d3d8e6b1de7edee9c2ccc1d32f0c0a",
- "sha256:95c658736ec15602da0ed73f312d410117723914a5c91a14ee4cdd72f1d790b3",
- "sha256:99039fa9e6306880572915728d7f6c24a86ec57b0a83f6b2491e1d8ab0235b9a",
- "sha256:9a2bce789a5ea90e51a02dfcc39e31b7f1e662bc3317979aa7e5538e3a034f72",
- "sha256:9a7d15bbd2bc99e92e39f49a04653062ee6085c0e18b3b7512a4f2fe91f2d681",
- "sha256:9abc77a4ce4c6f2a3168ff34b1da9b0f311a8f1cfd694ec96b0603dff1c79438",
- "sha256:9e8659775f1adf02eb1e6f109751268e493c73716ca5761f8acb695e52a756ae",
- "sha256:9fee687dce376205d9a494e9c121e27183b2a3df18037f89d69bd7b35bcf59e2",
- "sha256:a5aaeff38654462bc4b09023918b7f21790efb807f54c000a39d41d69cf552cb",
- "sha256:a604bf7a053f8362d27eb9fefd2097f82600b856d5abe996d623babd067b1ab5",
- "sha256:abbb9e76177c35d4e8568e58650aa6926040d6a9f6f03435b7a522bf1c487f9a",
- "sha256:acc130bc0375999da18e3d19e5a86403667ac0c4042a094fefb7eec8ebac7cf3",
- "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8",
- "sha256:b4e42a40a5e164cbfdb7b386c966a588b1047558a990981ace551ed7e12ca9c2",
- "sha256:b5e251054542ae57ac7f3fba5d10bfff615b6c2fb09abeb37d2f1463f841ae22",
- "sha256:b60fb58b90c6d63779cb0c0c54eeb38941bae3ecf7a73c764c52c88c2dcb9d72",
- "sha256:b870b5df5b71d8c3359d21be8f0d6c485fa0ebdb6477dda51a1ea54a9b558061",
- "sha256:ba0f0eb61ef00ea10e00eb53a9129501f52385c44853dbd6c4ad3f403603083f",
- "sha256:bb87745b2e6dc56361bfde481d5a378dc314b252a98d7dd19a651a3fa58f24a9",
- "sha256:bb90fb8bda722a1b9d48ac1e6c38f923ea757b3baf8ebd0c82e09c5c1a0e7a04",
- "sha256:bc570b5f14a79734437cb7b0500376b6b791153314986074486e0b0fa8d71d98",
- "sha256:c86563182421896d73858e08e1db93afdd2b947a70064b813d515d66549e15f9",
- "sha256:c958bcfd59bacc2d0249dcfe575e71da54f9dcf4a8bdf89c4cb9a68a1170d73f",
- "sha256:d18a4865f46b8579d44e4fe1e2bcbc6472ad83d98e22a26c963d46e4c125ef0b",
- "sha256:d5e2439eecc762cd85e7bd37161d4714aa03a33c5ba884e26c81559817ca0925",
- "sha256:e3890b508a23299083e065f435a492b5435eba6e304a7114d2f919d400888cc6",
- "sha256:e496a8ce2c256da1eb98bd15803a79bee00fc351f5dfb9ea82594a3f058309e0",
- "sha256:e8b2816ebef96d83657b56306152a93909a83f23994f4b30ad4573b00bd11bb9",
- "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c",
- "sha256:ec89ed91f2fa8e3f52ae53cd3cf640d6feff92ba90d62236a81e4e563ac0e991",
- "sha256:ecc840861360ba9d176d413a5489b9a0aff6d6303d7e733e2c4623cfa26904a6",
- "sha256:f09b286faeff3c750a879d336fb6d8713206fc97af3adc14def0cdd349df6000",
- "sha256:f393cda562f79828f38a819f4788641ac7c4085f30f1ce1a68672baa686482bb",
- "sha256:f917c1180fdb8623c2b75a99192f4025e412597c50b2ac870f156de8fb101119",
- "sha256:fc78a84e2dfbc27afe4b2bd7c80c8db9bca75cc5b85df52bfe634596a1da846b",
- "sha256:ff04ef6eec3eee8a5efef2401495967a916feaa353643defcc03fc74fe213b58"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==1.17.2"
- },
- "zstandard": {
- "hashes": [
- "sha256:034b88913ecc1b097f528e42b539453fa82c3557e414b3de9d5632c80439a473",
- "sha256:0a7f0804bb3799414af278e9ad51be25edf67f78f916e08afdb983e74161b916",
- "sha256:11e3bf3c924853a2d5835b24f03eeba7fc9b07d8ca499e247e06ff5676461a15",
- "sha256:12a289832e520c6bd4dcaad68e944b86da3bad0d339ef7989fb7e88f92e96072",
- "sha256:1516c8c37d3a053b01c1c15b182f3b5f5eef19ced9b930b684a73bad121addf4",
- "sha256:157e89ceb4054029a289fb504c98c6a9fe8010f1680de0201b3eb5dc20aa6d9e",
- "sha256:1bfe8de1da6d104f15a60d4a8a768288f66aa953bbe00d027398b93fb9680b26",
- "sha256:1e172f57cd78c20f13a3415cc8dfe24bf388614324d25539146594c16d78fcc8",
- "sha256:1fd7e0f1cfb70eb2f95a19b472ee7ad6d9a0a992ec0ae53286870c104ca939e5",
- "sha256:203d236f4c94cd8379d1ea61db2fce20730b4c38d7f1c34506a31b34edc87bdd",
- "sha256:27d3ef2252d2e62476389ca8f9b0cf2bbafb082a3b6bfe9d90cbcbb5529ecf7c",
- "sha256:29a2bc7c1b09b0af938b7a8343174b987ae021705acabcbae560166567f5a8db",
- "sha256:2ef230a8fd217a2015bc91b74f6b3b7d6522ba48be29ad4ea0ca3a3775bf7dd5",
- "sha256:2ef3775758346d9ac6214123887d25c7061c92afe1f2b354f9388e9e4d48acfc",
- "sha256:2f146f50723defec2975fb7e388ae3a024eb7151542d1599527ec2aa9cacb152",
- "sha256:2fb4535137de7e244c230e24f9d1ec194f61721c86ebea04e1581d9d06ea1269",
- "sha256:32ba3b5ccde2d581b1e6aa952c836a6291e8435d788f656fe5976445865ae045",
- "sha256:34895a41273ad33347b2fc70e1bff4240556de3c46c6ea430a7ed91f9042aa4e",
- "sha256:379b378ae694ba78cef921581ebd420c938936a153ded602c4fea612b7eaa90d",
- "sha256:38302b78a850ff82656beaddeb0bb989a0322a8bbb1bf1ab10c17506681d772a",
- "sha256:3aa014d55c3af933c1315eb4bb06dd0459661cc0b15cd61077afa6489bec63bb",
- "sha256:4051e406288b8cdbb993798b9a45c59a4896b6ecee2f875424ec10276a895740",
- "sha256:40b33d93c6eddf02d2c19f5773196068d875c41ca25730e8288e9b672897c105",
- "sha256:43da0f0092281bf501f9c5f6f3b4c975a8a0ea82de49ba3f7100e64d422a1274",
- "sha256:445e4cb5048b04e90ce96a79b4b63140e3f4ab5f662321975679b5f6360b90e2",
- "sha256:48ef6a43b1846f6025dde6ed9fee0c24e1149c1c25f7fb0a0585572b2f3adc58",
- "sha256:50a80baba0285386f97ea36239855f6020ce452456605f262b2d33ac35c7770b",
- "sha256:519fbf169dfac1222a76ba8861ef4ac7f0530c35dd79ba5727014613f91613d4",
- "sha256:53dd9d5e3d29f95acd5de6802e909ada8d8d8cfa37a3ac64836f3bc4bc5512db",
- "sha256:53ea7cdc96c6eb56e76bb06894bcfb5dfa93b7adcf59d61c6b92674e24e2dd5e",
- "sha256:576856e8594e6649aee06ddbfc738fec6a834f7c85bf7cadd1c53d4a58186ef9",
- "sha256:59556bf80a7094d0cfb9f5e50bb2db27fefb75d5138bb16fb052b61b0e0eeeb0",
- "sha256:5d41d5e025f1e0bccae4928981e71b2334c60f580bdc8345f824e7c0a4c2a813",
- "sha256:61062387ad820c654b6a6b5f0b94484fa19515e0c5116faf29f41a6bc91ded6e",
- "sha256:61f89436cbfede4bc4e91b4397eaa3e2108ebe96d05e93d6ccc95ab5714be512",
- "sha256:62136da96a973bd2557f06ddd4e8e807f9e13cbb0bfb9cc06cfe6d98ea90dfe0",
- "sha256:64585e1dba664dc67c7cdabd56c1e5685233fbb1fc1966cfba2a340ec0dfff7b",
- "sha256:65308f4b4890aa12d9b6ad9f2844b7ee42c7f7a4fd3390425b242ffc57498f48",
- "sha256:66b689c107857eceabf2cf3d3fc699c3c0fe8ccd18df2219d978c0283e4c508a",
- "sha256:6a41c120c3dbc0d81a8e8adc73312d668cd34acd7725f036992b1b72d22c1772",
- "sha256:6f77fa49079891a4aab203d0b1744acc85577ed16d767b52fc089d83faf8d8ed",
- "sha256:72c68dda124a1a138340fb62fa21b9bf4848437d9ca60bd35db36f2d3345f373",
- "sha256:752bf8a74412b9892f4e5b58f2f890a039f57037f52c89a740757ebd807f33ea",
- "sha256:76e79bc28a65f467e0409098fa2c4376931fd3207fbeb6b956c7c476d53746dd",
- "sha256:774d45b1fac1461f48698a9d4b5fa19a69d47ece02fa469825b442263f04021f",
- "sha256:77da4c6bfa20dd5ea25cbf12c76f181a8e8cd7ea231c673828d0386b1740b8dc",
- "sha256:77ea385f7dd5b5676d7fd943292ffa18fbf5c72ba98f7d09fc1fb9e819b34c23",
- "sha256:80080816b4f52a9d886e67f1f96912891074903238fe54f2de8b786f86baded2",
- "sha256:80a539906390591dd39ebb8d773771dc4db82ace6372c4d41e2d293f8e32b8db",
- "sha256:82d17e94d735c99621bf8ebf9995f870a6b3e6d14543b99e201ae046dfe7de70",
- "sha256:837bb6764be6919963ef41235fd56a6486b132ea64afe5fafb4cb279ac44f259",
- "sha256:84433dddea68571a6d6bd4fbf8ff398236031149116a7fff6f777ff95cad3df9",
- "sha256:8c24f21fa2af4bb9f2c492a86fe0c34e6d2c63812a839590edaf177b7398f700",
- "sha256:8ed7d27cb56b3e058d3cf684d7200703bcae623e1dcc06ed1e18ecda39fee003",
- "sha256:9206649ec587e6b02bd124fb7799b86cddec350f6f6c14bc82a2b70183e708ba",
- "sha256:983b6efd649723474f29ed42e1467f90a35a74793437d0bc64a5bf482bedfa0a",
- "sha256:98da17ce9cbf3bfe4617e836d561e433f871129e3a7ac16d6ef4c680f13a839c",
- "sha256:9c236e635582742fee16603042553d276cca506e824fa2e6489db04039521e90",
- "sha256:9da6bc32faac9a293ddfdcb9108d4b20416219461e4ec64dfea8383cac186690",
- "sha256:a05e6d6218461eb1b4771d973728f0133b2a4613a6779995df557f70794fd60f",
- "sha256:a0817825b900fcd43ac5d05b8b3079937073d2b1ff9cf89427590718b70dd840",
- "sha256:a4ae99c57668ca1e78597d8b06d5af837f377f340f4cce993b551b2d7731778d",
- "sha256:a8c86881813a78a6f4508ef9daf9d4995b8ac2d147dcb1a450448941398091c9",
- "sha256:a8fffdbd9d1408006baaf02f1068d7dd1f016c6bcb7538682622c556e7b68e35",
- "sha256:a9b07268d0c3ca5c170a385a0ab9fb7fdd9f5fd866be004c4ea39e44edce47dd",
- "sha256:ab19a2d91963ed9e42b4e8d77cd847ae8381576585bad79dbd0a8837a9f6620a",
- "sha256:ac184f87ff521f4840e6ea0b10c0ec90c6b1dcd0bad2f1e4a9a1b4fa177982ea",
- "sha256:b0e166f698c5a3e914947388c162be2583e0c638a4703fc6a543e23a88dea3c1",
- "sha256:b2170c7e0367dde86a2647ed5b6f57394ea7f53545746104c6b09fc1f4223573",
- "sha256:b2d8c62d08e7255f68f7a740bae85b3c9b8e5466baa9cbf7f57f1cde0ac6bc09",
- "sha256:b4567955a6bc1b20e9c31612e615af6b53733491aeaa19a6b3b37f3b65477094",
- "sha256:b69bb4f51daf461b15e7b3db033160937d3ff88303a7bc808c67bbc1eaf98c78",
- "sha256:b8c0bd73aeac689beacd4e7667d48c299f61b959475cdbb91e7d3d88d27c56b9",
- "sha256:be9b5b8659dff1f913039c2feee1aca499cfbc19e98fa12bc85e037c17ec6ca5",
- "sha256:bf0a05b6059c0528477fba9054d09179beb63744355cab9f38059548fedd46a9",
- "sha256:c16842b846a8d2a145223f520b7e18b57c8f476924bda92aeee3a88d11cfc391",
- "sha256:c363b53e257246a954ebc7c488304b5592b9c53fbe74d03bc1c64dda153fb847",
- "sha256:c7c517d74bea1a6afd39aa612fa025e6b8011982a0897768a2f7c8ab4ebb78a2",
- "sha256:d20fd853fbb5807c8e84c136c278827b6167ded66c72ec6f9a14b863d809211c",
- "sha256:d2240ddc86b74966c34554c49d00eaafa8200a18d3a5b6ffbf7da63b11d74ee2",
- "sha256:d477ed829077cd945b01fc3115edd132c47e6540ddcd96ca169facff28173057",
- "sha256:d50d31bfedd53a928fed6707b15a8dbeef011bb6366297cc435accc888b27c20",
- "sha256:dc1d33abb8a0d754ea4763bad944fd965d3d95b5baef6b121c0c9013eaf1907d",
- "sha256:dc5d1a49d3f8262be192589a4b72f0d03b72dcf46c51ad5852a4fdc67be7b9e4",
- "sha256:e2d1a054f8f0a191004675755448d12be47fa9bebbcffa3cdf01db19f2d30a54",
- "sha256:e7792606d606c8df5277c32ccb58f29b9b8603bf83b48639b7aedf6df4fe8171",
- "sha256:ed1708dbf4d2e3a1c5c69110ba2b4eb6678262028afd6c6fbcc5a8dac9cda68e",
- "sha256:f2d4380bf5f62daabd7b751ea2339c1a21d1c9463f1feb7fc2bdcea2c29c3160",
- "sha256:f3513916e8c645d0610815c257cbfd3242adfd5c4cfa78be514e5a3ebb42a41b",
- "sha256:f8346bfa098532bc1fb6c7ef06783e969d87a99dd1d2a5a18a892c1d7a643c58",
- "sha256:f83fa6cae3fff8e98691248c9320356971b59678a17f20656a9e59cd32cee6d8",
- "sha256:fa6ce8b52c5987b3e34d5674b0ab529a4602b632ebab0a93b07bfb4dfc8f8a33",
- "sha256:fb2b1ecfef1e67897d336de3a0e3f52478182d6a47eda86cbd42504c5cbd009a",
- "sha256:fc9ca1c9718cb3b06634c7c8dec57d24e9438b2aa9a0f02b8bb36bf478538880",
- "sha256:fd30d9c67d13d891f2360b2a120186729c111238ac63b43dbd37a5a40670b8ca",
- "sha256:fd7699e8fd9969f455ef2926221e0233f81a2542921471382e77a9e2f2b57f4b",
- "sha256:fe3b385d996ee0822fd46528d9f0443b880d4d05528fd26a9119a54ec3f91c69"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==0.23.0"
- },
- "zxing-cpp": {
- "hashes": [
- "sha256:2f457c0aa53c1de263e34cac9917ef647bfb9adcc9e3d4f42a8a1fc02558e1a6",
- "sha256:3771e5b0255d8b3bd457573fb6d57d29a346b6c45682320509d8e1ecb49d07ea",
- "sha256:387690091a9edef2a44932d0aa705e267d4b72e5953a1d00a893ad22b365ebe0",
- "sha256:3babedb67a4c15c9de2c2b4c42d70af83a6c85780c1b2d9803ac64c6ae69f14e",
- "sha256:3da0fbf0d93ef85663def561e8f7880447970710ea6b1768dfc05550a9ee3e00",
- "sha256:49a07be29ca28278ab0d8d9924d873e28111b1067acae68f2112a25c7f7efe77",
- "sha256:4e1ffcdd8e44a344cbf32bb0435e1fbe67241337c0a0f22452c2b8f7c16dc75e",
- "sha256:504f59d6cef772c95fa328d6c2318149d34dc61803fa47541cdb4a4f10579d2d",
- "sha256:5469bc83ac137a211f54cc650c71af62435cb9b7235e32664f4d35bfd3ce68d0",
- "sha256:64e5a4ff5168142d8b33ca648978c8ec4125c50b33aa1521e0c5344c6ffacef7",
- "sha256:6d710241e311962bafa93fa3faf0b01904a878c27cd84374359d3a7f491c2f10",
- "sha256:6ef0548f4247480da988ce1dad4d9c5b8d7cb2871538894fb9615c9ac0bb8656",
- "sha256:7ba641ca5a0f19b97d7bc6a0212e61dab267a2b1a52a84946d02bdcd859ec318",
- "sha256:7d8d1ae8fa85d854414afe32280c1f75bfd90f20737d19bafdf4a91f53fcf831",
- "sha256:899955e0091fa0e159b9eb429e43d0a23e2be4a5347c9629c858844f02024b4b",
- "sha256:971dad40c4765eeb74a4f4557889053b934484ad8c7f9d64c412d3a3d8441f3f",
- "sha256:a0b36f3be2e6d928bea9bd529f173ef41092061f0f46d27f591c87486f9a7366",
- "sha256:b5bf247d887c8fc34021bd88caa04ac54674fbd79cbebbab35dd42fd0344522f",
- "sha256:bdb864239cea44b5374ecb26ad740a392849139f6fe6146cc14f2f174c99056f",
- "sha256:bfc1095dc3303ed24be2622916e199a071bae19b19d432a0ce7ca993f95879ec",
- "sha256:bfde95506d3fec439705dbc8771ace025d049dce324861ddbf74be3ab0fabd36",
- "sha256:c166dfc6ede7ae5c013a09abb4f9708fec0243d2b7c1730c22c64f95c2cf5dc4",
- "sha256:dec2805c0e9dec0d7707c97ca5196f98d2730d2dfcea80442807123b9f8ec850",
- "sha256:e19b3b8a05a4215b743f4552f135d2cb5e51466f95d704402d5d333facb36752",
- "sha256:fbd5b253ad0f8823c5c104feaaa19acab95c217cb924b012d55ff339c42b3583",
- "sha256:fd3f175f7b57cfbdea56afdb5335eaebaadeebc06e20a087d9aa3f99637c4aa5"
- ],
- "version": "==2.3.0"
- }
- },
- "develop": {
- "anyio": {
- "hashes": [
- "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a",
- "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a"
- ],
- "markers": "python_version >= '3.9'",
- "version": "==4.8.0"
- },
- "asgiref": {
- "hashes": [
- "sha256:3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47",
- "sha256:c343bd80a0bec947a9860adb4c432ffa7db769836c64238fc34bdc3fec84d590"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==3.8.1"
- },
- "attrs": {
- "hashes": [
- "sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff",
- "sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==24.3.0"
- },
- "autobahn": {
- "hashes": [
- "sha256:a2d71ef1b0cf780b6d11f8b205fd2c7749765e65795f2ea7d823796642ee92c9",
- "sha256:c56a2abe7ac78abbfb778c02892d673a4de58fd004d088cd7ab297db25918e81"
- ],
- "markers": "python_version >= '3.9'",
- "version": "==24.4.2"
- },
- "automat": {
- "hashes": [
- "sha256:b34227cf63f6325b8ad2399ede780675083e439b20c323d376373d8ee6306d88",
- "sha256:bf029a7bc3da1e2c24da2343e7598affaa9f10bf0ab63ff808566ce90551e02a"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==24.8.1"
- },
- "babel": {
- "hashes": [
- "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d",
- "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==2.17.0"
- },
- "certifi": {
- "hashes": [
- "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651",
- "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe"
- ],
- "markers": "python_version >= '3.6'",
- "version": "==2025.1.31"
- },
- "cffi": {
- "hashes": [
- "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8",
- "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2",
- "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1",
- "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15",
- "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36",
- "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824",
- "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8",
- "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36",
- "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17",
- "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf",
- "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc",
- "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3",
- "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed",
- "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702",
- "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1",
- "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8",
- "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903",
- "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6",
- "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d",
- "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b",
- "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e",
- "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be",
- "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c",
- "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683",
- "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9",
- "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c",
- "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8",
- "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1",
- "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4",
- "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655",
- "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67",
- "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595",
- "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0",
- "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65",
- "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41",
- "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6",
- "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401",
- "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6",
- "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3",
- "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16",
- "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93",
- "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e",
- "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4",
- "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964",
- "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c",
- "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576",
- "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0",
- "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3",
- "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662",
- "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3",
- "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff",
- "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5",
- "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd",
- "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f",
- "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5",
- "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14",
- "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d",
- "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9",
- "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7",
- "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382",
- "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a",
- "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e",
- "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a",
- "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4",
- "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99",
- "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87",
- "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==1.17.1"
- },
- "cfgv": {
- "hashes": [
- "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9",
- "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==3.4.0"
- },
- "charset-normalizer": {
- "hashes": [
- "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537",
- "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa",
- "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a",
- "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294",
- "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b",
- "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd",
- "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601",
- "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd",
- "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4",
- "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d",
- "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2",
- "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313",
- "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd",
- "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa",
- "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8",
- "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1",
- "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2",
- "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496",
- "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d",
- "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b",
- "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e",
- "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a",
- "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4",
- "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca",
- "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78",
- "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408",
- "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5",
- "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3",
- "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f",
- "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a",
- "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765",
- "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6",
- "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146",
- "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6",
- "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9",
- "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd",
- "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c",
- "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f",
- "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545",
- "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176",
- "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770",
- "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824",
- "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f",
- "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf",
- "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487",
- "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d",
- "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd",
- "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b",
- "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534",
- "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f",
- "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b",
- "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9",
- "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd",
- "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125",
- "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9",
- "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de",
- "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11",
- "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d",
- "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35",
- "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f",
- "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda",
- "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7",
- "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a",
- "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971",
- "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8",
- "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41",
- "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d",
- "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f",
- "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757",
- "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a",
- "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886",
- "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77",
- "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76",
- "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247",
- "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85",
- "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb",
- "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7",
- "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e",
- "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6",
- "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037",
- "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1",
- "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e",
- "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807",
- "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407",
- "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c",
- "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12",
- "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3",
- "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089",
- "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd",
- "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e",
- "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00",
- "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616"
- ],
- "markers": "python_version >= '3.7'",
- "version": "==3.4.1"
- },
- "click": {
- "hashes": [
- "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2",
- "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"
- ],
- "markers": "python_version >= '3.7'",
- "version": "==8.1.8"
- },
- "colorama": {
- "hashes": [
- "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44",
- "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"
- ],
- "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'",
- "version": "==0.4.6"
- },
- "constantly": {
- "hashes": [
- "sha256:3fd9b4d1c3dc1ec9757f3c52aef7e53ad9323dbe39f51dfd4c43853b68dfa3f9",
- "sha256:aa92b70a33e2ac0bb33cd745eb61776594dc48764b06c35e0efd050b7f1c7cbd"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==23.10.4"
- },
- "coverage": {
- "extras": [
- "toml"
- ],
- "hashes": [
- "sha256:05fca8ba6a87aabdd2d30d0b6c838b50510b56cdcfc604d40760dae7153b73d9",
- "sha256:0aa9692b4fdd83a4647eeb7db46410ea1322b5ed94cd1715ef09d1d5922ba87f",
- "sha256:0c807ca74d5a5e64427c8805de15b9ca140bba13572d6d74e262f46f50b13273",
- "sha256:0d7a2bf79378d8fb8afaa994f91bfd8215134f8631d27eba3e0e2c13546ce994",
- "sha256:0f460286cb94036455e703c66988851d970fdfd8acc2a1122ab7f4f904e4029e",
- "sha256:204a8238afe787323a8b47d8be4df89772d5c1e4651b9ffa808552bdf20e1d50",
- "sha256:2396e8116db77789f819d2bc8a7e200232b7a282c66e0ae2d2cd84581a89757e",
- "sha256:254f1a3b1eef5f7ed23ef265eaa89c65c8c5b6b257327c149db1ca9d4a35f25e",
- "sha256:26bcf5c4df41cad1b19c84af71c22cbc9ea9a547fc973f1f2cc9a290002c8b3c",
- "sha256:27c6e64726b307782fa5cbe531e7647aee385a29b2107cd87ba7c0105a5d3853",
- "sha256:299e91b274c5c9cdb64cbdf1b3e4a8fe538a7a86acdd08fae52301b28ba297f8",
- "sha256:2bcfa46d7709b5a7ffe089075799b902020b62e7ee56ebaed2f4bdac04c508d8",
- "sha256:2ccf240eb719789cedbb9fd1338055de2761088202a9a0b73032857e53f612fe",
- "sha256:32ee6d8491fcfc82652a37109f69dee9a830e9379166cb73c16d8dc5c2915165",
- "sha256:3f7b444c42bbc533aaae6b5a2166fd1a797cdb5eb58ee51a92bee1eb94a1e1cb",
- "sha256:457574f4599d2b00f7f637a0700a6422243b3565509457b2dbd3f50703e11f59",
- "sha256:489a01f94aa581dbd961f306e37d75d4ba16104bbfa2b0edb21d29b73be83609",
- "sha256:4bcc276261505d82f0ad426870c3b12cb177752834a633e737ec5ee79bbdff18",
- "sha256:4e0de1e902669dccbf80b0415fb6b43d27edca2fbd48c74da378923b05316098",
- "sha256:4e4630c26b6084c9b3cb53b15bd488f30ceb50b73c35c5ad7871b869cb7365fd",
- "sha256:4eea95ef275de7abaef630c9b2c002ffbc01918b726a39f5a4353916ec72d2f3",
- "sha256:507a20fc863cae1d5720797761b42d2d87a04b3e5aeb682ef3b7332e90598f43",
- "sha256:54a5f0f43950a36312155dae55c505a76cd7f2b12d26abeebbe7a0b36dbc868d",
- "sha256:55b201b97286cf61f5e76063f9e2a1d8d2972fc2fcfd2c1272530172fd28c359",
- "sha256:59af35558ba08b758aec4d56182b222976330ef8d2feacbb93964f576a7e7a90",
- "sha256:5c912978f7fbf47ef99cec50c4401340436d200d41d714c7a4766f377c5b7b78",
- "sha256:656c82b8a0ead8bba147de9a89bda95064874c91a3ed43a00e687f23cc19d53a",
- "sha256:6713ba4b4ebc330f3def51df1d5d38fad60b66720948112f114968feb52d3f99",
- "sha256:675cefc4c06e3b4c876b85bfb7c59c5e2218167bbd4da5075cbe3b5790a28988",
- "sha256:6f93531882a5f68c28090f901b1d135de61b56331bba82028489bc51bdd818d2",
- "sha256:714f942b9c15c3a7a5fe6876ce30af831c2ad4ce902410b7466b662358c852c0",
- "sha256:79109c70cc0882e4d2d002fe69a24aa504dec0cc17169b3c7f41a1d341a73694",
- "sha256:7bbd8c8f1b115b892e34ba66a097b915d3871db7ce0e6b9901f462ff3a975377",
- "sha256:7ed2f37cfce1ce101e6dffdfd1c99e729dd2ffc291d02d3e2d0af8b53d13840d",
- "sha256:7fb105327c8f8f0682e29843e2ff96af9dcbe5bab8eeb4b398c6a33a16d80a23",
- "sha256:89d76815a26197c858f53c7f6a656686ec392b25991f9e409bcef020cd532312",
- "sha256:9a7cfb50515f87f7ed30bc882f68812fd98bc2852957df69f3003d22a2aa0abf",
- "sha256:9e1747bab246d6ff2c4f28b4d186b205adced9f7bd9dc362051cc37c4a0c7bd6",
- "sha256:9e80eba8801c386f72e0712a0453431259c45c3249f0009aff537a517b52942b",
- "sha256:a01ec4af7dfeb96ff0078ad9a48810bb0cc8abcb0115180c6013a6b26237626c",
- "sha256:a372c89c939d57abe09e08c0578c1d212e7a678135d53aa16eec4430adc5e690",
- "sha256:a3b204c11e2b2d883946fe1d97f89403aa1811df28ce0447439178cc7463448a",
- "sha256:a534738b47b0de1995f85f582d983d94031dffb48ab86c95bdf88dc62212142f",
- "sha256:a5e37dc41d57ceba70956fa2fc5b63c26dba863c946ace9705f8eca99daecdc4",
- "sha256:aa744da1820678b475e4ba3dfd994c321c5b13381d1041fe9c608620e6676e25",
- "sha256:ab32947f481f7e8c763fa2c92fd9f44eeb143e7610c4ca9ecd6a36adab4081bd",
- "sha256:abb02e2f5a3187b2ac4cd46b8ced85a0858230b577ccb2c62c81482ca7d18852",
- "sha256:b330368cb99ef72fcd2dc3ed260adf67b31499584dc8a20225e85bfe6f6cfed0",
- "sha256:bc67deb76bc3717f22e765ab3e07ee9c7a5e26b9019ca19a3b063d9f4b874244",
- "sha256:c0b1818063dc9e9d838c09e3a473c1422f517889436dd980f5d721899e66f315",
- "sha256:c56e097019e72c373bae32d946ecf9858fda841e48d82df7e81c63ac25554078",
- "sha256:c7827a5bc7bdb197b9e066cdf650b2887597ad124dd99777332776f7b7c7d0d0",
- "sha256:ccc2b70a7ed475c68ceb548bf69cec1e27305c1c2606a5eb7c3afff56a1b3b27",
- "sha256:d37a84878285b903c0fe21ac8794c6dab58150e9359f1aaebbeddd6412d53132",
- "sha256:e2f0280519e42b0a17550072861e0bc8a80a0870de260f9796157d3fca2733c5",
- "sha256:e4ae5ac5e0d1e4edfc9b4b57b4cbecd5bc266a6915c500f358817a8496739247",
- "sha256:e67926f51821b8e9deb6426ff3164870976fe414d033ad90ea75e7ed0c2e5022",
- "sha256:e78b270eadb5702938c3dbe9367f878249b5ef9a2fcc5360ac7bff694310d17b",
- "sha256:ea3c8f04b3e4af80e17bab607c386a830ffc2fb88a5484e1df756478cf70d1d3",
- "sha256:ec22b5e7fe7a0fa8509181c4aac1db48f3dd4d3a566131b313d1efc102892c18",
- "sha256:f4f620668dbc6f5e909a0946a877310fb3d57aea8198bde792aae369ee1c23b5",
- "sha256:fd34e7b3405f0cc7ab03d54a334c17a9e802897580d964bd8c2001f4b9fd488f"
- ],
- "markers": "python_version >= '3.9'",
- "version": "==7.6.10"
- },
- "cryptography": {
- "hashes": [
- "sha256:1923cb251c04be85eec9fda837661c67c1049063305d6be5721643c22dd4e2b7",
- "sha256:37d76e6863da3774cd9db5b409a9ecfd2c71c981c38788d3fcfaf177f447b731",
- "sha256:3c672a53c0fb4725a29c303be906d3c1fa99c32f58abe008a82705f9ee96f40b",
- "sha256:404fdc66ee5f83a1388be54300ae978b2efd538018de18556dde92575e05defc",
- "sha256:4ac4c9f37eba52cb6fbeaf5b59c152ea976726b865bd4cf87883a7e7006cc543",
- "sha256:62901fb618f74d7d81bf408c8719e9ec14d863086efe4185afd07c352aee1d2c",
- "sha256:660cb7312a08bc38be15b696462fa7cc7cd85c3ed9c576e81f4dc4d8b2b31591",
- "sha256:708ee5f1bafe76d041b53a4f95eb28cdeb8d18da17e597d46d7833ee59b97ede",
- "sha256:761817a3377ef15ac23cd7834715081791d4ec77f9297ee694ca1ee9c2c7e5eb",
- "sha256:831c3c4d0774e488fdc83a1923b49b9957d33287de923d58ebd3cec47a0ae43f",
- "sha256:84111ad4ff3f6253820e6d3e58be2cc2a00adb29335d4cacb5ab4d4d34f2a123",
- "sha256:8b3e6eae66cf54701ee7d9c83c30ac0a1e3fa17be486033000f2a73a12ab507c",
- "sha256:9e6fc8a08e116fb7c7dd1f040074c9d7b51d74a8ea40d4df2fc7aa08b76b9e6c",
- "sha256:a01956ddfa0a6790d594f5b34fc1bfa6098aca434696a03cfdbe469b8ed79285",
- "sha256:abc998e0c0eee3c8a1904221d3f67dcfa76422b23620173e28c11d3e626c21bd",
- "sha256:b15492a11f9e1b62ba9d73c210e2416724633167de94607ec6069ef724fad092",
- "sha256:be4ce505894d15d5c5037167ffb7f0ae90b7be6f2a98f9a5c3442395501c32fa",
- "sha256:c5eb858beed7835e5ad1faba59e865109f3e52b3783b9ac21e7e47dc5554e289",
- "sha256:cd4e834f340b4293430701e772ec543b0fbe6c2dea510a5286fe0acabe153a02",
- "sha256:d2436114e46b36d00f8b72ff57e598978b37399d2786fd39793c36c6d5cb1c64",
- "sha256:eb33480f1bad5b78233b0ad3e1b0be21e8ef1da745d8d2aecbb20671658b9053",
- "sha256:eca27345e1214d1b9f9490d200f9db5a874479be914199194e746c893788d417",
- "sha256:ed3534eb1090483c96178fcb0f8893719d96d5274dfde98aa6add34614e97c8e",
- "sha256:f3f6fdfa89ee2d9d496e2c087cebef9d4fcbb0ad63c40e821b39f74bf48d9c5e",
- "sha256:f53c2c87e0fb4b0c00fa9571082a057e37690a8f12233306161c8f4b819960b7",
- "sha256:f5e7cb1e5e56ca0933b4873c0220a78b773b24d40d186b6738080b73d3d0a756",
- "sha256:f677e1268c4e23420c3acade68fac427fffcb8d19d7df95ed7ad17cdef8404f4"
- ],
- "markers": "python_version >= '3.7' and python_full_version not in '3.9.0, 3.9.1'",
- "version": "==44.0.0"
- },
- "daphne": {
- "hashes": [
- "sha256:618d1322bb4d875342b99dd2a10da2d9aae7ee3645f765965fdc1e658ea5290a",
- "sha256:fcbcace38eb86624ae247c7ffdc8ac12f155d7d19eafac4247381896d6f33761"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.8'",
- "version": "==4.1.2"
- },
- "distlib": {
- "hashes": [
- "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87",
- "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403"
- ],
- "version": "==0.3.9"
- },
- "exceptiongroup": {
- "hashes": [
- "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b",
- "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"
- ],
- "markers": "python_version < '3.11'",
- "version": "==1.2.2"
- },
- "execnet": {
- "hashes": [
- "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc",
- "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==2.1.1"
- },
- "factory-boy": {
- "hashes": [
- "sha256:7b1113c49736e1e9995bc2a18f4dbf2c52cf0f841103517010b1d825712ce3ca",
- "sha256:8317aa5289cdfc45f9cae570feb07a6177316c82e34d14df3c2e1f22f26abef0"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.8'",
- "version": "==3.3.1"
- },
- "faker": {
- "hashes": [
- "sha256:42f2da8cf561e38c72b25e9891168b1e25fec42b6b0b5b0b6cd6041da54af885",
- "sha256:926d2301787220e0554c2e39afc4dc535ce4b0a8d0a089657137999f66334ef4"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==35.0.0"
- },
- "filelock": {
- "hashes": [
- "sha256:533dc2f7ba78dc2f0f531fc6c4940addf7b70a481e269a5a3b93be94ffbe8338",
- "sha256:ee4e77401ef576ebb38cd7f13b9b28893194acc20a8e68e18730ba9c0e54660e"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.9'",
- "version": "==3.17.0"
- },
- "ghp-import": {
- "hashes": [
- "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619",
- "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"
- ],
- "version": "==2.1.0"
- },
- "h11": {
- "hashes": [
- "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d",
- "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"
- ],
- "markers": "python_version >= '3.7'",
- "version": "==0.14.0"
- },
- "httpcore": {
- "hashes": [
- "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c",
- "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==1.0.7"
- },
- "httpx": {
- "extras": [
- "http2"
- ],
- "hashes": [
- "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc",
- "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==0.28.1"
- },
- "hyperlink": {
- "hashes": [
- "sha256:427af957daa58bc909471c6c40f74c5450fa123dd093fc53efd2e91d2705a56b",
- "sha256:e6b14c37ecb73e89c77d78cdb4c2cc8f3fb59a885c5b3f819ff4ed80f25af1b4"
- ],
- "version": "==21.0.0"
- },
- "identify": {
- "hashes": [
- "sha256:7bec12768ed44ea4761efb47806f0a41f86e7c0a5fdf5950d4648c90eca7e251",
- "sha256:cbd1810bce79f8b671ecb20f53ee0ae8e86ae84b557de31d89709dc2a48ba881"
- ],
- "markers": "python_version >= '3.9'",
- "version": "==2.6.6"
- },
- "idna": {
- "hashes": [
- "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9",
- "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"
- ],
- "markers": "python_version >= '3.6'",
- "version": "==3.10"
- },
- "imagehash": {
- "hashes": [
- "sha256:5ad9a5cde14fe255745a8245677293ac0d67f09c330986a351f34b614ba62fb5",
- "sha256:7038d1b7f9e0585beb3dd8c0a956f02b95a346c0b5f24a9e8cc03ebadaf0aa70"
- ],
- "index": "pypi",
- "version": "==4.3.1"
- },
- "incremental": {
- "hashes": [
- "sha256:8cb2c3431530bec48ad70513931a760f446ad6c25e8333ca5d95e24b0ed7b8fe",
- "sha256:fb4f1d47ee60efe87d4f6f0ebb5f70b9760db2b2574c59c8e8912be4ebd464c9"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==24.7.2"
- },
- "iniconfig": {
- "hashes": [
- "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3",
- "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"
- ],
- "markers": "python_version >= '3.7'",
- "version": "==2.0.0"
- },
- "jinja2": {
- "hashes": [
- "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb",
- "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb"
- ],
- "markers": "python_version >= '3.7'",
- "version": "==3.1.5"
- },
- "markdown": {
- "hashes": [
- "sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2",
- "sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==3.7"
- },
- "markupsafe": {
- "hashes": [
- "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4",
- "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30",
- "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0",
- "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9",
- "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396",
- "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13",
- "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028",
- "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca",
- "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557",
- "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832",
- "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0",
- "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b",
- "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579",
- "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a",
- "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c",
- "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff",
- "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c",
- "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22",
- "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094",
- "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb",
- "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e",
- "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5",
- "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a",
- "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d",
- "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a",
- "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b",
- "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8",
- "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225",
- "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c",
- "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144",
- "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f",
- "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87",
- "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d",
- "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93",
- "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf",
- "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158",
- "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84",
- "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb",
- "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48",
- "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171",
- "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c",
- "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6",
- "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd",
- "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d",
- "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1",
- "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d",
- "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca",
- "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a",
- "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29",
- "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe",
- "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798",
- "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c",
- "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8",
- "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f",
- "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f",
- "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a",
- "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178",
- "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0",
- "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79",
- "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430",
- "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"
- ],
- "markers": "python_version >= '3.9'",
- "version": "==3.0.2"
- },
- "mergedeep": {
- "hashes": [
- "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8",
- "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"
- ],
- "markers": "python_version >= '3.6'",
- "version": "==1.3.4"
- },
- "mkdocs": {
- "hashes": [
- "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2",
- "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==1.6.1"
- },
- "mkdocs-get-deps": {
- "hashes": [
- "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c",
- "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==0.2.0"
- },
- "mkdocs-glightbox": {
- "hashes": [
- "sha256:392b34207bf95991071a16d5f8916d1d2f2cd5d5bb59ae2997485ccd778c70d9",
- "sha256:e0107beee75d3eb7380ac06ea2d6eac94c999eaa49f8c3cbab0e7be2ac006ccf"
- ],
- "index": "pypi",
- "version": "==0.4.0"
- },
- "mkdocs-material": {
- "hashes": [
- "sha256:1125622067e26940806701219303b27c0933e04533560725d97ec26fd16a39cf",
- "sha256:c87f7d1c39ce6326da5e10e232aed51bae46252e646755900f4b0fc9192fa832"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.8'",
- "version": "==9.6.3"
- },
- "mkdocs-material-extensions": {
- "hashes": [
- "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443",
- "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==1.3.1"
- },
- "nodeenv": {
- "hashes": [
- "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f",
- "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"
- ],
- "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'",
- "version": "==1.9.1"
- },
- "numpy": {
- "hashes": [
- "sha256:02935e2c3c0c6cbe9c7955a8efa8908dd4221d7755644c59d1bba28b94fd334f",
- "sha256:0349b025e15ea9d05c3d63f9657707a4e1d471128a3b1d876c095f328f8ff7f0",
- "sha256:09d6a2032faf25e8d0cadde7fd6145118ac55d2740132c1d845f98721b5ebcfd",
- "sha256:0bc61b307655d1a7f9f4b043628b9f2b721e80839914ede634e3d485913e1fb2",
- "sha256:0eec19f8af947a61e968d5429f0bd92fec46d92b0008d0a6685b40d6adf8a4f4",
- "sha256:106397dbbb1896f99e044efc90360d098b3335060375c26aa89c0d8a97c5f648",
- "sha256:128c41c085cab8a85dc29e66ed88c05613dccf6bc28b3866cd16050a2f5448be",
- "sha256:149d1113ac15005652e8d0d3f6fd599360e1a708a4f98e43c9c77834a28238cb",
- "sha256:159ff6ee4c4a36a23fe01b7c3d07bd8c14cc433d9720f977fcd52c13c0098160",
- "sha256:22ea3bb552ade325530e72a0c557cdf2dea8914d3a5e1fecf58fa5dbcc6f43cd",
- "sha256:23ae9f0c2d889b7b2d88a3791f6c09e2ef827c2446f1c4a3e3e76328ee4afd9a",
- "sha256:250c16b277e3b809ac20d1f590716597481061b514223c7badb7a0f9993c7f84",
- "sha256:2ec6c689c61df613b783aeb21f945c4cbe6c51c28cb70aae8430577ab39f163e",
- "sha256:2ffbb1acd69fdf8e89dd60ef6182ca90a743620957afb7066385a7bbe88dc748",
- "sha256:3074634ea4d6df66be04f6728ee1d173cfded75d002c75fac79503a880bf3825",
- "sha256:356ca982c188acbfa6af0d694284d8cf20e95b1c3d0aefa8929376fea9146f60",
- "sha256:3fbe72d347fbc59f94124125e73fc4976a06927ebc503ec5afbfb35f193cd957",
- "sha256:40c7ff5da22cd391944a28c6a9c638a5eef77fcf71d6e3a79e1d9d9e82752715",
- "sha256:41184c416143defa34cc8eb9d070b0a5ba4f13a0fa96a709e20584638254b317",
- "sha256:451e854cfae0febe723077bd0cf0a4302a5d84ff25f0bfece8f29206c7bed02e",
- "sha256:4525b88c11906d5ab1b0ec1f290996c0020dd318af8b49acaa46f198b1ffc283",
- "sha256:463247edcee4a5537841d5350bc87fe8e92d7dd0e8c71c995d2c6eecb8208278",
- "sha256:4dbd80e453bd34bd003b16bd802fac70ad76bd463f81f0c518d1245b1c55e3d9",
- "sha256:57b4012e04cc12b78590a334907e01b3a85efb2107df2b8733ff1ed05fce71de",
- "sha256:5a8c863ceacae696aff37d1fd636121f1a512117652e5dfb86031c8d84836369",
- "sha256:5acea83b801e98541619af398cc0109ff48016955cc0818f478ee9ef1c5c3dcb",
- "sha256:642199e98af1bd2b6aeb8ecf726972d238c9877b0f6e8221ee5ab945ec8a2189",
- "sha256:64bd6e1762cd7f0986a740fee4dff927b9ec2c5e4d9a28d056eb17d332158014",
- "sha256:6d9fc9d812c81e6168b6d405bf00b8d6739a7f72ef22a9214c4241e0dc70b323",
- "sha256:7079129b64cb78bdc8d611d1fd7e8002c0a2565da6a47c4df8062349fee90e3e",
- "sha256:7dca87ca328f5ea7dafc907c5ec100d187911f94825f8700caac0b3f4c384b49",
- "sha256:860fd59990c37c3ef913c3ae390b3929d005243acca1a86facb0773e2d8d9e50",
- "sha256:8e6da5cffbbe571f93588f562ed130ea63ee206d12851b60819512dd3e1ba50d",
- "sha256:8ec0636d3f7d68520afc6ac2dc4b8341ddb725039de042faf0e311599f54eb37",
- "sha256:9491100aba630910489c1d0158034e1c9a6546f0b1340f716d522dc103788e39",
- "sha256:97b974d3ba0fb4612b77ed35d7627490e8e3dff56ab41454d9e8b23448940576",
- "sha256:995f9e8181723852ca458e22de5d9b7d3ba4da3f11cc1cb113f093b271d7965a",
- "sha256:9dd47ff0cb2a656ad69c38da850df3454da88ee9a6fde0ba79acceee0e79daba",
- "sha256:9fad446ad0bc886855ddf5909cbf8cb5d0faa637aaa6277fb4b19ade134ab3c7",
- "sha256:a972cec723e0563aa0823ee2ab1df0cb196ed0778f173b381c871a03719d4826",
- "sha256:ac9bea18d6d58a995fac1b2cb4488e17eceeac413af014b1dd26170b766d8467",
- "sha256:b0531f0b0e07643eb089df4c509d30d72c9ef40defa53e41363eca8a8cc61495",
- "sha256:b208cfd4f5fe34e1535c08983a1a6803fdbc7a1e86cf13dd0c61de0b51a0aadc",
- "sha256:b3482cb7b3325faa5f6bc179649406058253d91ceda359c104dac0ad320e1391",
- "sha256:b6fb9c32a91ec32a689ec6410def76443e3c750e7cfc3fb2206b985ffb2b85f0",
- "sha256:b78ea78450fd96a498f50ee096f69c75379af5138f7881a51355ab0e11286c97",
- "sha256:bd249bc894af67cbd8bad2c22e7cbcd46cf87ddfca1f1289d1e7e54868cc785c",
- "sha256:c7d1fd447e33ee20c1f33f2c8e6634211124a9aabde3c617687d8b739aa69eac",
- "sha256:d0bbe7dd86dca64854f4b6ce2ea5c60b51e36dfd597300057cf473d3615f2369",
- "sha256:d6d6a0910c3b4368d89dde073e630882cdb266755565155bc33520283b2d9df8",
- "sha256:da1eeb460ecce8d5b8608826595c777728cdf28ce7b5a5a8c8ac8d949beadcf2",
- "sha256:e0c8854b09bc4de7b041148d8550d3bd712b5c21ff6a8ed308085f190235d7ff",
- "sha256:e0d4142eb40ca6f94539e4db929410f2a46052a0fe7a2c1c59f6179c39938d2a",
- "sha256:e9e82dcb3f2ebbc8cb5ce1102d5f1c5ed236bf8a11730fb45ba82e2841ec21df",
- "sha256:ed6906f61834d687738d25988ae117683705636936cc605be0bb208b23df4d8f"
- ],
- "markers": "python_version >= '3.10'",
- "version": "==2.2.2"
- },
- "packaging": {
- "hashes": [
- "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759",
- "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==24.2"
- },
- "paginate": {
- "hashes": [
- "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945",
- "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591"
- ],
- "version": "==0.5.7"
- },
- "pathspec": {
- "hashes": [
- "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08",
- "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==0.12.1"
- },
- "pillow": {
- "hashes": [
- "sha256:015c6e863faa4779251436db398ae75051469f7c903b043a48f078e437656f83",
- "sha256:0a2f91f8a8b367e7a57c6e91cd25af510168091fb89ec5146003e424e1558a96",
- "sha256:11633d58b6ee5733bde153a8dafd25e505ea3d32e261accd388827ee987baf65",
- "sha256:2062ffb1d36544d42fcaa277b069c88b01bb7298f4efa06731a7fd6cc290b81a",
- "sha256:31eba6bbdd27dde97b0174ddf0297d7a9c3a507a8a1480e1e60ef914fe23d352",
- "sha256:3362c6ca227e65c54bf71a5f88b3d4565ff1bcbc63ae72c34b07bbb1cc59a43f",
- "sha256:368da70808b36d73b4b390a8ffac11069f8a5c85f29eff1f1b01bcf3ef5b2a20",
- "sha256:36ba10b9cb413e7c7dfa3e189aba252deee0602c86c309799da5a74009ac7a1c",
- "sha256:3764d53e09cdedd91bee65c2527815d315c6b90d7b8b79759cc48d7bf5d4f114",
- "sha256:3a5fe20a7b66e8135d7fd617b13272626a28278d0e578c98720d9ba4b2439d49",
- "sha256:3cdcdb0b896e981678eee140d882b70092dac83ac1cdf6b3a60e2216a73f2b91",
- "sha256:4637b88343166249fe8aa94e7c4a62a180c4b3898283bb5d3d2fd5fe10d8e4e0",
- "sha256:4db853948ce4e718f2fc775b75c37ba2efb6aaea41a1a5fc57f0af59eee774b2",
- "sha256:4dd43a78897793f60766563969442020e90eb7847463eca901e41ba186a7d4a5",
- "sha256:54251ef02a2309b5eec99d151ebf5c9904b77976c8abdcbce7891ed22df53884",
- "sha256:54ce1c9a16a9561b6d6d8cb30089ab1e5eb66918cb47d457bd996ef34182922e",
- "sha256:593c5fd6be85da83656b93ffcccc2312d2d149d251e98588b14fbc288fd8909c",
- "sha256:5bb94705aea800051a743aa4874bb1397d4695fb0583ba5e425ee0328757f196",
- "sha256:67cd427c68926108778a9005f2a04adbd5e67c442ed21d95389fe1d595458756",
- "sha256:70ca5ef3b3b1c4a0812b5c63c57c23b63e53bc38e758b37a951e5bc466449861",
- "sha256:73ddde795ee9b06257dac5ad42fcb07f3b9b813f8c1f7f870f402f4dc54b5269",
- "sha256:758e9d4ef15d3560214cddbc97b8ef3ef86ce04d62ddac17ad39ba87e89bd3b1",
- "sha256:7d33d2fae0e8b170b6a6c57400e077412240f6f5bb2a342cf1ee512a787942bb",
- "sha256:7fdadc077553621911f27ce206ffcbec7d3f8d7b50e0da39f10997e8e2bb7f6a",
- "sha256:8000376f139d4d38d6851eb149b321a52bb8893a88dae8ee7d95840431977081",
- "sha256:837060a8599b8f5d402e97197d4924f05a2e0d68756998345c829c33186217b1",
- "sha256:89dbdb3e6e9594d512780a5a1c42801879628b38e3efc7038094430844e271d8",
- "sha256:8c730dc3a83e5ac137fbc92dfcfe1511ce3b2b5d7578315b63dbbb76f7f51d90",
- "sha256:8e275ee4cb11c262bd108ab2081f750db2a1c0b8c12c1897f27b160c8bd57bbc",
- "sha256:9044b5e4f7083f209c4e35aa5dd54b1dd5b112b108648f5c902ad586d4f945c5",
- "sha256:93a18841d09bcdd774dcdc308e4537e1f867b3dec059c131fde0327899734aa1",
- "sha256:9409c080586d1f683df3f184f20e36fb647f2e0bc3988094d4fd8c9f4eb1b3b3",
- "sha256:96f82000e12f23e4f29346e42702b6ed9a2f2fea34a740dd5ffffcc8c539eb35",
- "sha256:9aa9aeddeed452b2f616ff5507459e7bab436916ccb10961c4a382cd3e03f47f",
- "sha256:9ee85f0696a17dd28fbcfceb59f9510aa71934b483d1f5601d1030c3c8304f3c",
- "sha256:a07dba04c5e22824816b2615ad7a7484432d7f540e6fa86af60d2de57b0fcee2",
- "sha256:a3cd561ded2cf2bbae44d4605837221b987c216cff94f49dfeed63488bb228d2",
- "sha256:a697cd8ba0383bba3d2d3ada02b34ed268cb548b369943cd349007730c92bddf",
- "sha256:a76da0a31da6fcae4210aa94fd779c65c75786bc9af06289cd1c184451ef7a65",
- "sha256:a85b653980faad27e88b141348707ceeef8a1186f75ecc600c395dcac19f385b",
- "sha256:a8d65b38173085f24bc07f8b6c505cbb7418009fa1a1fcb111b1f4961814a442",
- "sha256:aa8dd43daa836b9a8128dbe7d923423e5ad86f50a7a14dc688194b7be5c0dea2",
- "sha256:ab8a209b8485d3db694fa97a896d96dd6533d63c22829043fd9de627060beade",
- "sha256:abc56501c3fd148d60659aae0af6ddc149660469082859fa7b066a298bde9482",
- "sha256:ad5db5781c774ab9a9b2c4302bbf0c1014960a0a7be63278d13ae6fdf88126fe",
- "sha256:ae98e14432d458fc3de11a77ccb3ae65ddce70f730e7c76140653048c71bfcbc",
- "sha256:b20be51b37a75cc54c2c55def3fa2c65bb94ba859dde241cd0a4fd302de5ae0a",
- "sha256:b523466b1a31d0dcef7c5be1f20b942919b62fd6e9a9be199d035509cbefc0ec",
- "sha256:b5d658fbd9f0d6eea113aea286b21d3cd4d3fd978157cbf2447a6035916506d3",
- "sha256:b6123aa4a59d75f06e9dd3dac5bf8bc9aa383121bb3dd9a7a612e05eabc9961a",
- "sha256:bd165131fd51697e22421d0e467997ad31621b74bfc0b75956608cb2906dda07",
- "sha256:bf902d7413c82a1bfa08b06a070876132a5ae6b2388e2712aab3a7cbc02205c6",
- "sha256:c12fc111ef090845de2bb15009372175d76ac99969bdf31e2ce9b42e4b8cd88f",
- "sha256:c1eec9d950b6fe688edee07138993e54ee4ae634c51443cfb7c1e7613322718e",
- "sha256:c640e5a06869c75994624551f45e5506e4256562ead981cce820d5ab39ae2192",
- "sha256:cc1331b6d5a6e144aeb5e626f4375f5b7ae9934ba620c0ac6b3e43d5e683a0f0",
- "sha256:cfd5cd998c2e36a862d0e27b2df63237e67273f2fc78f47445b14e73a810e7e6",
- "sha256:d3d8da4a631471dfaf94c10c85f5277b1f8e42ac42bade1ac67da4b4a7359b73",
- "sha256:d44ff19eea13ae4acdaaab0179fa68c0c6f2f45d66a4d8ec1eda7d6cecbcc15f",
- "sha256:dd0052e9db3474df30433f83a71b9b23bd9e4ef1de13d92df21a52c0303b8ab6",
- "sha256:dd0e081319328928531df7a0e63621caf67652c8464303fd102141b785ef9547",
- "sha256:dda60aa465b861324e65a78c9f5cf0f4bc713e4309f83bc387be158b077963d9",
- "sha256:e06695e0326d05b06833b40b7ef477e475d0b1ba3a6d27da1bb48c23209bf457",
- "sha256:e1abe69aca89514737465752b4bcaf8016de61b3be1397a8fc260ba33321b3a8",
- "sha256:e267b0ed063341f3e60acd25c05200df4193e15a4a5807075cd71225a2386e26",
- "sha256:e5449ca63da169a2e6068dd0e2fcc8d91f9558aba89ff6d02121ca8ab11e79e5",
- "sha256:e63e4e5081de46517099dc30abe418122f54531a6ae2ebc8680bcd7096860eab",
- "sha256:f189805c8be5ca5add39e6f899e6ce2ed824e65fb45f3c28cb2841911da19070",
- "sha256:f7955ecf5609dee9442cbface754f2c6e541d9e6eda87fad7f7a989b0bdb9d71",
- "sha256:f86d3a7a9af5d826744fabf4afd15b9dfef44fe69a98541f666f66fbb8d3fef9",
- "sha256:fbd43429d0d7ed6533b25fc993861b8fd512c42d04514a0dd6337fb3ccf22761"
- ],
- "markers": "python_version >= '3.9'",
- "version": "==11.1.0"
- },
- "platformdirs": {
- "hashes": [
- "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907",
- "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==4.3.6"
- },
- "pluggy": {
- "hashes": [
- "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1",
- "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==1.5.0"
- },
- "pre-commit": {
- "hashes": [
- "sha256:ae3f018575a588e30dfddfab9a05448bfbd6b73d78709617b5a2b853549716d4",
- "sha256:d29e7cb346295bcc1cc75fc3e92e343495e3ea0196c9ec6ba53f49f10ab6ae7b"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.9'",
- "version": "==4.1.0"
- },
- "pyasn1": {
- "hashes": [
- "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629",
- "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==0.6.1"
- },
- "pyasn1-modules": {
- "hashes": [
- "sha256:49bfa96b45a292b711e986f222502c1c9a5e1f4e568fc30e2574a6c7d07838fd",
- "sha256:c28e2dbf9c06ad61c71a075c7e0f9fd0f1b0bb2d2ad4377f240d33ac2ab60a7c"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==0.4.1"
- },
- "pycparser": {
- "hashes": [
- "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6",
- "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==2.22"
- },
- "pygments": {
- "hashes": [
- "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f",
- "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==2.19.1"
- },
- "pymdown-extensions": {
- "hashes": [
- "sha256:05e0bee73d64b9c71a4ae17c72abc2f700e8bc8403755a00580b49a4e9f189e9",
- "sha256:41e576ce3f5d650be59e900e4ceff231e0aed2a88cf30acaee41e02f063a061b"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==10.14.3"
- },
- "pyopenssl": {
- "hashes": [
- "sha256:424c247065e46e76a37411b9ab1782541c23bb658bf003772c3405fbaa128e90",
- "sha256:cd2cef799efa3936bb08e8ccb9433a575722b9dd986023f1cabc4ae64e9dac16"
- ],
- "markers": "python_version >= '3.7'",
- "version": "==25.0.0"
- },
- "pytest": {
- "hashes": [
- "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6",
- "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.8'",
- "version": "==8.3.4"
- },
- "pytest-cov": {
- "hashes": [
- "sha256:eee6f1b9e61008bd34975a4d5bab25801eb31898b032dd55addc93e96fcaaa35",
- "sha256:fde0b595ca248bb8e2d76f020b465f3b107c9632e6a1d1705f17834c89dcadc0"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.9'",
- "version": "==6.0.0"
- },
- "pytest-django": {
- "hashes": [
- "sha256:1091b20ea1491fd04a310fc9aaff4c01b4e8450e3b157687625e16a6b5f3a366",
- "sha256:57c74ef3aa9d89cae5a5d73fbb69a720a62673ade7ff13b9491872409a3f5918"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.8'",
- "version": "==4.10.0"
- },
- "pytest-env": {
- "hashes": [
- "sha256:91209840aa0e43385073ac464a554ad2947cc2fd663a9debf88d03b01e0cc1cf",
- "sha256:ce90cf8772878515c24b31cd97c7fa1f4481cd68d588419fd45f10ecaee6bc30"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.8'",
- "version": "==1.1.5"
- },
- "pytest-httpx": {
- "hashes": [
- "sha256:d619ad5d2e67734abfbb224c3d9025d64795d4b8711116b1a13f72a251ae511f",
- "sha256:ee11a00ffcea94a5cbff47af2114d34c5b231c326902458deed73f9c459fd744"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.9'",
- "version": "==0.35.0"
- },
- "pytest-mock": {
- "hashes": [
- "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f",
- "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.8'",
- "version": "==3.14.0"
- },
- "pytest-rerunfailures": {
- "hashes": [
- "sha256:2d9ac7baf59f4c13ac730b47f6fa80e755d1ba0581da45ce30b72fb3542b4474",
- "sha256:dd150c4795c229ef44320adc9a0c0532c51b78bb7a6843a8c53556b9a611df1a"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.9'",
- "version": "==15.0"
- },
- "pytest-sugar": {
- "hashes": [
- "sha256:6422e83258f5b0c04ce7c632176c7732cab5fdb909cb39cca5c9139f81276c0a",
- "sha256:70ebcd8fc5795dc457ff8b69d266a4e2e8a74ae0c3edc749381c64b5246c8dfd"
- ],
- "index": "pypi",
- "version": "==1.0.0"
- },
- "pytest-xdist": {
- "hashes": [
- "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7",
- "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.8'",
- "version": "==3.6.1"
- },
- "python-dateutil": {
- "hashes": [
- "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3",
- "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"
- ],
- "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
- "version": "==2.9.0.post0"
- },
- "pywavelets": {
- "hashes": [
- "sha256:06786201a91b5e74540f4f3c115c49a29190de2eb424823abbd3a1fd75ea3e28",
- "sha256:1c1aad0b97714e3079a2bfe48e4fb8ccd60778d0427e9ee5e0a9ff922e6c61e4",
- "sha256:24bb282bab09349d9d128ed0536fa50fff5c2147891971a69c2c36155dfeeeac",
- "sha256:2c6b359b55d713ef683e9da1529181b865a80d759881ceb9adc1c5742e4da4d8",
- "sha256:2e1c79784bebeafd3715c1bea6621daa2e2e6ed37b687719322e2078fb35bb70",
- "sha256:31baf4be6940fde72cc85663154360857ac1b93c251822deaf72bb804da95031",
- "sha256:3814d354dd109e244ffaac3d480d29a5202212fe24570c920268237c8d276f95",
- "sha256:3f431c9e2aff1a2240765eff5e804975d0fcc24c82d6f3d4271243f228e5963b",
- "sha256:426ff3799446cb4da1db04c2084e6e58edfe24225596805665fd39c14f53dece",
- "sha256:441ba45c8dff8c6916dbe706958d0d7f91da675695ca0c0d75e483f6f52d0a12",
- "sha256:4b3c2ab669c91e3474fd63294355487b7dd23f0b51d32f811327ddf3546f4f3d",
- "sha256:4b43a4c58707b1e8d941bec7f1d83e67c482278575ff0db3189d5c0dfae23a57",
- "sha256:4dbebcfd55ea8a85b7fc8802d411e75337170422abf6e96019d7e46c394e80e5",
- "sha256:560c39f1ff8cb37f8b8ea4b7b6eb8a14f6926c11f5cf8c09f013a58f895ed5bc",
- "sha256:63f67fa2ee1610445de64f746fb9c1df31980ad13d896ea2331fc3755f49b3ae",
- "sha256:649936baee933e80083788e0adc4d8bc2da7cdd8b10464d3b113475be2cc5308",
- "sha256:7f489380c95013cc8fb3ef338f6d8c1a907125db453cc4dc739e2cca06fcd8b6",
- "sha256:810a23a631da596fef7196ddec49b345b1aab13525bb58547eeebe1769edbbc1",
- "sha256:880a0197e9fa108939af50a95e97c1bf9b7d3e148e0fad92ea60a9ed8c8947c0",
- "sha256:8bfa833d08b60d0bf53a7939fbbf3d98015dd34efe89cbe4e53ced880d085fc1",
- "sha256:8c68e9d072c536bc646e8bdce443bb1826eeb9aa21b2cb2479a43954dea692a3",
- "sha256:8d8abaf7c120b151ef309c9ff57e0a44ba9febf49045056dbc1577526ecec6c8",
- "sha256:a0e1db96dcf3ce08156859df8b359e9ff66fa15061a1b90e70e020bf4cd077a0",
- "sha256:aa0607a9c085b8285bc0d04e33d461a6c80f8c325389221ffb1a45141861138e",
- "sha256:bf327528d10de471b04bb725c4e10677fac5a49e13d41bf0d0b3a1f6d7097abf",
- "sha256:cae701117f5c7244b7c8d48b9e92a0289637cdc02a9c205e8be83361f0c11fae",
- "sha256:d31c36a39110e8fcc7b1a4a11cfed7d22b610c285d3e7f4fe73ec777aa49fa39",
- "sha256:dec23dfe6d5a3f4312b12456b8c546aa90a11c1138e425a885987505f0658ae0",
- "sha256:e10c3fc7f4a796e94da4bca9871be2186a7bb7a3b3536a0ca9376d84263140f0",
- "sha256:e39b0e2314e928cb850ee89b9042733a10ea044176a495a54dc84d2c98407a51",
- "sha256:e62c8fb52ab0e8ff212fff9acae681a8f12d68b76c36fe24cc48809d5b6825ba",
- "sha256:e8dd5be4faed994581a8a4b3c0169be20567a9346e523f0b57f903c8f6722bce",
- "sha256:ec5d723c3335ff8aa630fd4b14097077f12cc02893c91cafd60dd7b1730e780f",
- "sha256:f2877fb7b58c94211257dcf364b204d6ed259146fc87d5a90bf9d93c97af6226",
- "sha256:f3800245754840adc143cbc29534a1b8fc4b8cff6e9d403326bd52b7bb5c35aa",
- "sha256:f5c86fcb203c8e61d1f3d4afbfc08d626c64e4e3708207315577264c724632bf",
- "sha256:fa7c68ed1e5bab23b1bafe60ccbcf709b878652d03de59e961baefa5210fcd0a",
- "sha256:fafb5fa126277e1690c3d6329287122fc08e4d25a262ce126e3d81b1f5709308"
- ],
- "markers": "python_version >= '3.10'",
- "version": "==1.8.0"
- },
- "pyyaml": {
- "hashes": [
- "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff",
- "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48",
- "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086",
- "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e",
- "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133",
- "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5",
- "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484",
- "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee",
- "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5",
- "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68",
- "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a",
- "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf",
- "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99",
- "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8",
- "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85",
- "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19",
- "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc",
- "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a",
- "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1",
- "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317",
- "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c",
- "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631",
- "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d",
- "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652",
- "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5",
- "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e",
- "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b",
- "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8",
- "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476",
- "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706",
- "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563",
- "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237",
- "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b",
- "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083",
- "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180",
- "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425",
- "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e",
- "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f",
- "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725",
- "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183",
- "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab",
- "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774",
- "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725",
- "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e",
- "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5",
- "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d",
- "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290",
- "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44",
- "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed",
- "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4",
- "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba",
- "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12",
- "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==6.0.2"
- },
- "pyyaml-env-tag": {
- "hashes": [
- "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb",
- "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"
- ],
- "markers": "python_version >= '3.6'",
- "version": "==0.1"
- },
- "regex": {
- "hashes": [
- "sha256:02a02d2bb04fec86ad61f3ea7f49c015a0681bf76abb9857f945d26159d2968c",
- "sha256:02e28184be537f0e75c1f9b2f8847dc51e08e6e171c6bde130b2687e0c33cf60",
- "sha256:040df6fe1a5504eb0f04f048e6d09cd7c7110fef851d7c567a6b6e09942feb7d",
- "sha256:068376da5a7e4da51968ce4c122a7cd31afaaec4fccc7856c92f63876e57b51d",
- "sha256:06eb1be98df10e81ebaded73fcd51989dcf534e3c753466e4b60c4697a003b67",
- "sha256:072623554418a9911446278f16ecb398fb3b540147a7828c06e2011fa531e773",
- "sha256:086a27a0b4ca227941700e0b31425e7a28ef1ae8e5e05a33826e17e47fbfdba0",
- "sha256:08986dce1339bc932923e7d1232ce9881499a0e02925f7402fb7c982515419ef",
- "sha256:0a86e7eeca091c09e021db8eb72d54751e527fa47b8d5787caf96d9831bd02ad",
- "sha256:0c32f75920cf99fe6b6c539c399a4a128452eaf1af27f39bce8909c9a3fd8cbe",
- "sha256:0d7f453dca13f40a02b79636a339c5b62b670141e63efd511d3f8f73fba162b3",
- "sha256:1062b39a0a2b75a9c694f7a08e7183a80c63c0d62b301418ffd9c35f55aaa114",
- "sha256:13291b39131e2d002a7940fb176e120bec5145f3aeb7621be6534e46251912c4",
- "sha256:149f5008d286636e48cd0b1dd65018548944e495b0265b45e1bffecce1ef7f39",
- "sha256:164d8b7b3b4bcb2068b97428060b2a53be050085ef94eca7f240e7947f1b080e",
- "sha256:167ed4852351d8a750da48712c3930b031f6efdaa0f22fa1933716bfcd6bf4a3",
- "sha256:1c4de13f06a0d54fa0d5ab1b7138bfa0d883220965a29616e3ea61b35d5f5fc7",
- "sha256:202eb32e89f60fc147a41e55cb086db2a3f8cb82f9a9a88440dcfc5d37faae8d",
- "sha256:220902c3c5cc6af55d4fe19ead504de80eb91f786dc102fbd74894b1551f095e",
- "sha256:2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a",
- "sha256:2c89a8cc122b25ce6945f0423dc1352cb9593c68abd19223eebbd4e56612c5b7",
- "sha256:2d548dafee61f06ebdb584080621f3e0c23fff312f0de1afc776e2a2ba99a74f",
- "sha256:2e34b51b650b23ed3354b5a07aab37034d9f923db2a40519139af34f485f77d0",
- "sha256:32f9a4c643baad4efa81d549c2aadefaeba12249b2adc5af541759237eee1c54",
- "sha256:3a51ccc315653ba012774efca4f23d1d2a8a8f278a6072e29c7147eee7da446b",
- "sha256:3cde6e9f2580eb1665965ce9bf17ff4952f34f5b126beb509fee8f4e994f143c",
- "sha256:40291b1b89ca6ad8d3f2b82782cc33807f1406cf68c8d440861da6304d8ffbbd",
- "sha256:41758407fc32d5c3c5de163888068cfee69cb4c2be844e7ac517a52770f9af57",
- "sha256:4181b814e56078e9b00427ca358ec44333765f5ca1b45597ec7446d3a1ef6e34",
- "sha256:4f51f88c126370dcec4908576c5a627220da6c09d0bff31cfa89f2523843316d",
- "sha256:50153825ee016b91549962f970d6a4442fa106832e14c918acd1c8e479916c4f",
- "sha256:5056b185ca113c88e18223183aa1a50e66507769c9640a6ff75859619d73957b",
- "sha256:5071b2093e793357c9d8b2929dfc13ac5f0a6c650559503bb81189d0a3814519",
- "sha256:525eab0b789891ac3be914d36893bdf972d483fe66551f79d3e27146191a37d4",
- "sha256:52fb28f528778f184f870b7cf8f225f5eef0a8f6e3778529bdd40c7b3920796a",
- "sha256:5478c6962ad548b54a591778e93cd7c456a7a29f8eca9c49e4f9a806dcc5d638",
- "sha256:5670bce7b200273eee1840ef307bfa07cda90b38ae56e9a6ebcc9f50da9c469b",
- "sha256:5704e174f8ccab2026bd2f1ab6c510345ae8eac818b613d7d73e785f1310f839",
- "sha256:59dfe1ed21aea057a65c6b586afd2a945de04fc7db3de0a6e3ed5397ad491b07",
- "sha256:5e7e351589da0850c125f1600a4c4ba3c722efefe16b297de54300f08d734fbf",
- "sha256:63b13cfd72e9601125027202cad74995ab26921d8cd935c25f09c630436348ff",
- "sha256:658f90550f38270639e83ce492f27d2c8d2cd63805c65a13a14d36ca126753f0",
- "sha256:684d7a212682996d21ca12ef3c17353c021fe9de6049e19ac8481ec35574a70f",
- "sha256:69ab78f848845569401469da20df3e081e6b5a11cb086de3eed1d48f5ed57c95",
- "sha256:6f44ec28b1f858c98d3036ad5d7d0bfc568bdd7a74f9c24e25f41ef1ebfd81a4",
- "sha256:70b7fa6606c2881c1db9479b0eaa11ed5dfa11c8d60a474ff0e095099f39d98e",
- "sha256:764e71f22ab3b305e7f4c21f1a97e1526a25ebdd22513e251cf376760213da13",
- "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519",
- "sha256:805e6b60c54bf766b251e94526ebad60b7de0c70f70a4e6210ee2891acb70bf2",
- "sha256:8447d2d39b5abe381419319f942de20b7ecd60ce86f16a23b0698f22e1b70008",
- "sha256:86fddba590aad9208e2fa8b43b4c098bb0ec74f15718bb6a704e3c63e2cef3e9",
- "sha256:89d75e7293d2b3e674db7d4d9b1bee7f8f3d1609428e293771d1a962617150cc",
- "sha256:93c0b12d3d3bc25af4ebbf38f9ee780a487e8bf6954c115b9f015822d3bb8e48",
- "sha256:94d87b689cdd831934fa3ce16cc15cd65748e6d689f5d2b8f4f4df2065c9fa20",
- "sha256:9714398225f299aa85267fd222f7142fcb5c769e73d7733344efc46f2ef5cf89",
- "sha256:982e6d21414e78e1f51cf595d7f321dcd14de1f2881c5dc6a6e23bbbbd68435e",
- "sha256:997d6a487ff00807ba810e0f8332c18b4eb8d29463cfb7c820dc4b6e7562d0cf",
- "sha256:a03e02f48cd1abbd9f3b7e3586d97c8f7a9721c436f51a5245b3b9483044480b",
- "sha256:a36fdf2af13c2b14738f6e973aba563623cb77d753bbbd8d414d18bfaa3105dd",
- "sha256:a6ba92c0bcdf96cbf43a12c717eae4bc98325ca3730f6b130ffa2e3c3c723d84",
- "sha256:a7c2155f790e2fb448faed6dd241386719802296ec588a8b9051c1f5c481bc29",
- "sha256:a93c194e2df18f7d264092dc8539b8ffb86b45b899ab976aa15d48214138e81b",
- "sha256:abfa5080c374a76a251ba60683242bc17eeb2c9818d0d30117b4486be10c59d3",
- "sha256:ac10f2c4184420d881a3475fb2c6f4d95d53a8d50209a2500723d831036f7c45",
- "sha256:ad182d02e40de7459b73155deb8996bbd8e96852267879396fb274e8700190e3",
- "sha256:b2837718570f95dd41675328e111345f9b7095d821bac435aac173ac80b19983",
- "sha256:b489578720afb782f6ccf2840920f3a32e31ba28a4b162e13900c3e6bd3f930e",
- "sha256:b583904576650166b3d920d2bcce13971f6f9e9a396c673187f49811b2769dc7",
- "sha256:b85c2530be953a890eaffde05485238f07029600e8f098cdf1848d414a8b45e4",
- "sha256:b97c1e0bd37c5cd7902e65f410779d39eeda155800b65fc4d04cc432efa9bc6e",
- "sha256:ba9b72e5643641b7d41fa1f6d5abda2c9a263ae835b917348fc3c928182ad467",
- "sha256:bb26437975da7dc36b7efad18aa9dd4ea569d2357ae6b783bf1118dabd9ea577",
- "sha256:bb8f74f2f10dbf13a0be8de623ba4f9491faf58c24064f32b65679b021ed0001",
- "sha256:bde01f35767c4a7899b7eb6e823b125a64de314a8ee9791367c9a34d56af18d0",
- "sha256:bec9931dfb61ddd8ef2ebc05646293812cb6b16b60cf7c9511a832b6f1854b55",
- "sha256:c36f9b6f5f8649bb251a5f3f66564438977b7ef8386a52460ae77e6070d309d9",
- "sha256:cdf58d0e516ee426a48f7b2c03a332a4114420716d55769ff7108c37a09951bf",
- "sha256:d1cee317bfc014c2419a76bcc87f071405e3966da434e03e13beb45f8aced1a6",
- "sha256:d22326fcdef5e08c154280b71163ced384b428343ae16a5ab2b3354aed12436e",
- "sha256:d3660c82f209655a06b587d55e723f0b813d3a7db2e32e5e7dc64ac2a9e86fde",
- "sha256:da8f5fc57d1933de22a9e23eec290a0d8a5927a5370d24bda9a6abe50683fe62",
- "sha256:df951c5f4a1b1910f1a99ff42c473ff60f8225baa1cdd3539fe2819d9543e9df",
- "sha256:e5364a4502efca094731680e80009632ad6624084aff9a23ce8c8c6820de3e51",
- "sha256:ea1bfda2f7162605f6e8178223576856b3d791109f15ea99a9f95c16a7636fb5",
- "sha256:f02f93b92358ee3f78660e43b4b0091229260c5d5c408d17d60bf26b6c900e86",
- "sha256:f056bf21105c2515c32372bbc057f43eb02aae2fda61052e2f7622c801f0b4e2",
- "sha256:f1ac758ef6aebfc8943560194e9fd0fa18bcb34d89fd8bd2af18183afd8da3a2",
- "sha256:f2a19f302cd1ce5dd01a9099aaa19cae6173306d1302a43b627f62e21cf18ac0",
- "sha256:f654882311409afb1d780b940234208a252322c24a93b442ca714d119e68086c",
- "sha256:f65557897fc977a44ab205ea871b690adaef6b9da6afda4790a2484b04293a5f",
- "sha256:f9d1e379028e0fc2ae3654bac3cbbef81bf3fd571272a42d56c24007979bafb6",
- "sha256:fdabbfc59f2c6edba2a6622c647b716e34e8e3867e0ab975412c5c2f79b82da2",
- "sha256:fdd6028445d2460f33136c55eeb1f601ab06d74cb3347132e1c24250187500d9",
- "sha256:ff590880083d60acc0433f9c3f713c51f7ac6ebb9adf889c79a261ecf541aa91"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==2024.11.6"
- },
- "requests": {
- "hashes": [
- "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760",
- "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==2.32.3"
- },
- "ruff": {
- "hashes": [
- "sha256:03482d5c09d90d4ee3f40d97578423698ad895c87314c4de39ed2af945633caa",
- "sha256:0e2bb706a2be7ddfea4a4af918562fdc1bcb16df255e5fa595bbd800ce322a5a",
- "sha256:194d8402bceef1b31164909540a597e0d913c0e4952015a5b40e28c146121b5d",
- "sha256:19f505b643228b417c1111a2a536424ddde0db4ef9023b9e04a46ed8a1cb4656",
- "sha256:1de4367cca3dac99bcbd15c161404e849bb0bfd543664db39232648dc00112dc",
- "sha256:2f218f356dd2d995839f1941322ff021c72a492c470f0b26a34f844c29cdf5ba",
- "sha256:4a091729086dffa4bd070aa5dab7e39cc6b9d62eb2bef8f3d91172d30d599666",
- "sha256:589d1d9f25b5754ff230dce914a174a7c951a85a4e9270613a2b74231fdac2f5",
- "sha256:5dc1edd1775270e6aa2386119aea692039781429f0be1e0949ea5884e011aa8e",
- "sha256:5e2d9126161d0357e5c8f30b0bd6168d2c3872372f14481136d13de9937f79b6",
- "sha256:68660eab1a8e65babb5229a1f97b46e3120923757a68b5413d8561f8a85d4897",
- "sha256:81761592f72b620ec8fa1068a6fd00e98a5ebee342a3642efd84454f3031dca9",
- "sha256:ac3ee4d7c2c92ddfdaedf0bf31b2b176fa7aa8950efc454628d477394d35638b",
- "sha256:b109c0ad2ececf42e75fa99dc4043ff72a357436bb171900714a9ea581ddef83",
- "sha256:b908ff4df65dad7b251c9968a2e4560836d8f5487c2f0cc238321ed951ea0504",
- "sha256:c4cae6c4cc7b9b4017c71114115db0445b00a16de3bcde0946273e8392856f08",
- "sha256:d1bbc6808bf7b15796cef0815e1dfb796fbd383e7dbd4334709642649625e7c5",
- "sha256:dc61dd5131742e21103fbbdcad683a8813be0e3c204472d520d9a5021ca8b217"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.7'",
- "version": "==0.9.6"
- },
- "scipy": {
- "hashes": [
- "sha256:033a75ddad1463970c96a88063a1df87ccfddd526437136b6ee81ff0312ebdf6",
- "sha256:0458839c9f873062db69a03de9a9765ae2e694352c76a16be44f93ea45c28d2b",
- "sha256:070d10654f0cb6abd295bc96c12656f948e623ec5f9a4eab0ddb1466c000716e",
- "sha256:09c52320c42d7f5c7748b69e9f0389266fd4f82cf34c38485c14ee976cb8cb04",
- "sha256:0ac102ce99934b162914b1e4a6b94ca7da0f4058b6d6fd65b0cef330c0f3346f",
- "sha256:0fb57b30f0017d4afa5fe5f5b150b8f807618819287c21cbe51130de7ccdaed2",
- "sha256:100193bb72fbff37dbd0bf14322314fc7cbe08b7ff3137f11a34d06dc0ee6b85",
- "sha256:14eaa373c89eaf553be73c3affb11ec6c37493b7eaaf31cf9ac5dffae700c2e0",
- "sha256:2114a08daec64980e4b4cbdf5bee90935af66d750146b1d2feb0d3ac30613692",
- "sha256:21e10b1dd56ce92fba3e786007322542361984f8463c6d37f6f25935a5a6ef52",
- "sha256:2722a021a7929d21168830790202a75dbb20b468a8133c74a2c0230c72626b6c",
- "sha256:395be70220d1189756068b3173853029a013d8c8dd5fd3d1361d505b2aa58fa7",
- "sha256:3fe1d95944f9cf6ba77aa28b82dd6bb2a5b52f2026beb39ecf05304b8392864b",
- "sha256:491d57fe89927fa1aafbe260f4cfa5ffa20ab9f1435025045a5315006a91b8f5",
- "sha256:4b17d4220df99bacb63065c76b0d1126d82bbf00167d1730019d2a30d6ae01ea",
- "sha256:4c9d8fc81d6a3b6844235e6fd175ee1d4c060163905a2becce8e74cb0d7554ce",
- "sha256:55cc79ce4085c702ac31e49b1e69b27ef41111f22beafb9b49fea67142b696c4",
- "sha256:5b190b935e7db569960b48840e5bef71dc513314cc4e79a1b7d14664f57fd4ff",
- "sha256:5bd8d27d44e2c13d0c1124e6a556454f52cd3f704742985f6b09e75e163d20d2",
- "sha256:5dff14e75cdbcf07cdaa1c7707db6017d130f0af9ac41f6ce443a93318d6c6e0",
- "sha256:5eb0ca35d4b08e95da99a9f9c400dc9f6c21c424298a0ba876fdc69c7afacedf",
- "sha256:63b9b6cd0333d0eb1a49de6f834e8aeaefe438df8f6372352084535ad095219e",
- "sha256:667f950bf8b7c3a23b4199db24cb9bf7512e27e86d0e3813f015b74ec2c6e3df",
- "sha256:6b3e71893c6687fc5e29208d518900c24ea372a862854c9888368c0b267387ab",
- "sha256:71ba9a76c2390eca6e359be81a3e879614af3a71dfdabb96d1d7ab33da6f2364",
- "sha256:74bb864ff7640dea310a1377d8567dc2cb7599c26a79ca852fc184cc851954ac",
- "sha256:82add84e8a9fb12af5c2c1a3a3f1cb51849d27a580cb9e6bd66226195142be6e",
- "sha256:837299eec3d19b7e042923448d17d95a86e43941104d33f00da7e31a0f715d3c",
- "sha256:900f3fa3db87257510f011c292a5779eb627043dd89731b9c461cd16ef76ab3d",
- "sha256:9f151e9fb60fbf8e52426132f473221a49362091ce7a5e72f8aa41f8e0da4f25",
- "sha256:af0b61c1de46d0565b4b39c6417373304c1d4f5220004058bdad3061c9fa8a95",
- "sha256:bc7136626261ac1ed988dca56cfc4ab5180f75e0ee52e58f1e6aa74b5f3eacd5",
- "sha256:be3deeb32844c27599347faa077b359584ba96664c5c79d71a354b80a0ad0ce0",
- "sha256:c09aa9d90f3500ea4c9b393ee96f96b0ccb27f2f350d09a47f533293c78ea776",
- "sha256:c352c1b6d7cac452534517e022f8f7b8d139cd9f27e6fbd9f3cbd0bfd39f5bef",
- "sha256:c64ded12dcab08afff9e805a67ff4480f5e69993310e093434b10e85dc9d43e1",
- "sha256:cdde8414154054763b42b74fe8ce89d7f3d17a7ac5dd77204f0e142cdc9239e9",
- "sha256:ce3a000cd28b4430426db2ca44d96636f701ed12e2b3ca1f2b1dd7abdd84b39a",
- "sha256:f735bc41bd1c792c96bc426dece66c8723283695f02df61dcc4d0a707a42fc54",
- "sha256:f82fcf4e5b377f819542fbc8541f7b5fbcf1c0017d0df0bc22c781bf60abc4d8"
- ],
- "markers": "python_version >= '3.10'",
- "version": "==1.15.1"
- },
- "service-identity": {
- "hashes": [
- "sha256:6b047fbd8a84fd0bb0d55ebce4031e400562b9196e1e0d3e0fe2b8a59f6d4a85",
- "sha256:b8683ba13f0d39c6cd5d625d2c5f65421d6d707b013b375c355751557cbe8e09"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==24.2.0"
- },
- "setuptools": {
- "hashes": [
- "sha256:c5afc8f407c626b8313a86e10311dd3f661c6cd9c09d4bf8c15c0e11f9f2b0e6",
- "sha256:e3982f444617239225d675215d51f6ba05f845d4eec313da4418fdbb56fb27e3"
- ],
- "markers": "python_version >= '3.9'",
- "version": "==75.8.0"
- },
- "six": {
- "hashes": [
- "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274",
- "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"
- ],
- "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
- "version": "==1.17.0"
- },
- "sniffio": {
- "hashes": [
- "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2",
- "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"
- ],
- "markers": "python_version >= '3.7'",
- "version": "==1.3.1"
- },
- "termcolor": {
- "hashes": [
- "sha256:37b17b5fc1e604945c2642c872a3764b5d547a48009871aea3edd3afa180afb8",
- "sha256:998d8d27da6d48442e8e1f016119076b690d962507531df4890fcd2db2ef8a6f"
- ],
- "markers": "python_version >= '3.9'",
- "version": "==2.5.0"
- },
- "tomli": {
- "hashes": [
- "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6",
- "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd",
- "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c",
- "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b",
- "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8",
- "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6",
- "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77",
- "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff",
- "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea",
- "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192",
- "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249",
- "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee",
- "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4",
- "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98",
- "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8",
- "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4",
- "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281",
- "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744",
- "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69",
- "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13",
- "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140",
- "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e",
- "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e",
- "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc",
- "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff",
- "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec",
- "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2",
- "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222",
- "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106",
- "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272",
- "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a",
- "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"
- ],
- "markers": "python_version < '3.11'",
- "version": "==2.2.1"
- },
- "twisted": {
- "extras": [
- "tls"
- ],
- "hashes": [
- "sha256:695d0556d5ec579dcc464d2856b634880ed1319f45b10d19043f2b57eb0115b5",
- "sha256:fe403076c71f04d5d2d789a755b687c5637ec3bcd3b2b8252d76f2ba65f54261"
- ],
- "markers": "python_full_version >= '3.8.0'",
- "version": "==24.11.0"
- },
- "txaio": {
- "hashes": [
- "sha256:aaea42f8aad50e0ecfb976130ada140797e9dcb85fad2cf72b0f37f8cefcb490",
- "sha256:f9a9216e976e5e3246dfd112ad7ad55ca915606b60b84a757ac769bd404ff704"
- ],
- "markers": "python_version >= '3.7'",
- "version": "==23.1.1"
- },
- "typing-extensions": {
- "hashes": [
- "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d",
- "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==4.12.2"
- },
- "urllib3": {
- "hashes": [
- "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df",
- "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"
- ],
- "markers": "python_version >= '3.9'",
- "version": "==2.3.0"
- },
- "virtualenv": {
- "hashes": [
- "sha256:4e4cb403c0b0da39e13b46b1b2476e505cb0046b25f242bee80f62bf990b2779",
- "sha256:b8b8970138d32fb606192cb97f6cd4bb644fa486be9308fb9b63f81091b5dc35"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==20.29.1"
- },
- "watchdog": {
- "hashes": [
- "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a",
- "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2",
- "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f",
- "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c",
- "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c",
- "sha256:6eb11feb5a0d452ee41f824e271ca311a09e250441c262ca2fd7ebcf2461a06c",
- "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0",
- "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13",
- "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134",
- "sha256:7a0e56874cfbc4b9b05c60c8a1926fedf56324bb08cfbc188969777940aef3aa",
- "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e",
- "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379",
- "sha256:90c8e78f3b94014f7aaae121e6b909674df5b46ec24d6bebc45c44c56729af2a",
- "sha256:9513f27a1a582d9808cf21a07dae516f0fab1cf2d7683a742c498b93eedabb11",
- "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282",
- "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b",
- "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f",
- "sha256:afd0fe1b2270917c5e23c2a65ce50c2a4abb63daafb0d419fde368e272a76b7c",
- "sha256:bc64ab3bdb6a04d69d4023b29422170b74681784ffb9463ed4870cf2f3e66112",
- "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948",
- "sha256:c7ac31a19f4545dd92fc25d200694098f42c9a8e391bc00bdd362c5736dbf881",
- "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860",
- "sha256:c897ac1b55c5a1461e16dae288d22bb2e412ba9807df8397a635d88f671d36c3",
- "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680",
- "sha256:d1cdb490583ebd691c012b3d6dae011000fe42edb7a82ece80965b42abd61f26",
- "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26",
- "sha256:e6439e374fc012255b4ec786ae3c4bc838cd7309a540e5fe0952d03687d8804e",
- "sha256:e6f0e77c9417e7cd62af82529b10563db3423625c5fce018430b249bf977f9e8",
- "sha256:e7631a77ffb1f7d2eefa4445ebbee491c720a5661ddf6df3498ebecae5ed375c",
- "sha256:ef810fbf7b781a5a593894e4f439773830bdecb885e6880d957d5b9382a960d2"
- ],
- "markers": "python_version >= '3.9'",
- "version": "==6.0.0"
- },
- "zope-interface": {
- "hashes": [
- "sha256:033b3923b63474800b04cba480b70f6e6243a62208071fc148354f3f89cc01b7",
- "sha256:05b910a5afe03256b58ab2ba6288960a2892dfeef01336dc4be6f1b9ed02ab0a",
- "sha256:086ee2f51eaef1e4a52bd7d3111a0404081dadae87f84c0ad4ce2649d4f708b7",
- "sha256:0ef9e2f865721553c6f22a9ff97da0f0216c074bd02b25cf0d3af60ea4d6931d",
- "sha256:1090c60116b3da3bfdd0c03406e2f14a1ff53e5771aebe33fec1edc0a350175d",
- "sha256:144964649eba4c5e4410bb0ee290d338e78f179cdbfd15813de1a664e7649b3b",
- "sha256:15398c000c094b8855d7d74f4fdc9e73aa02d4d0d5c775acdef98cdb1119768d",
- "sha256:1909f52a00c8c3dcab6c4fad5d13de2285a4b3c7be063b239b8dc15ddfb73bd2",
- "sha256:21328fcc9d5b80768bf051faa35ab98fb979080c18e6f84ab3f27ce703bce465",
- "sha256:224b7b0314f919e751f2bca17d15aad00ddbb1eadf1cb0190fa8175edb7ede62",
- "sha256:25e6a61dcb184453bb00eafa733169ab6d903e46f5c2ace4ad275386f9ab327a",
- "sha256:27f926f0dcb058211a3bb3e0e501c69759613b17a553788b2caeb991bed3b61d",
- "sha256:29caad142a2355ce7cfea48725aa8bcf0067e2b5cc63fcf5cd9f97ad12d6afb5",
- "sha256:2ad9913fd858274db8dd867012ebe544ef18d218f6f7d1e3c3e6d98000f14b75",
- "sha256:31d06db13a30303c08d61d5fb32154be51dfcbdb8438d2374ae27b4e069aac40",
- "sha256:3e0350b51e88658d5ad126c6a57502b19d5f559f6cb0a628e3dc90442b53dd98",
- "sha256:3f6771d1647b1fc543d37640b45c06b34832a943c80d1db214a37c31161a93f1",
- "sha256:4893395d5dd2ba655c38ceb13014fd65667740f09fa5bb01caa1e6284e48c0cd",
- "sha256:52e446f9955195440e787596dccd1411f543743c359eeb26e9b2c02b077b0519",
- "sha256:550f1c6588ecc368c9ce13c44a49b8d6b6f3ca7588873c679bd8fd88a1b557b6",
- "sha256:72cd1790b48c16db85d51fbbd12d20949d7339ad84fd971427cf00d990c1f137",
- "sha256:7bd449c306ba006c65799ea7912adbbfed071089461a19091a228998b82b1fdb",
- "sha256:7dc5016e0133c1a1ec212fc87a4f7e7e562054549a99c73c8896fa3a9e80cbc7",
- "sha256:802176a9f99bd8cc276dcd3b8512808716492f6f557c11196d42e26c01a69a4c",
- "sha256:80ecf2451596f19fd607bb09953f426588fc1e79e93f5968ecf3367550396b22",
- "sha256:8b49f1a3d1ee4cdaf5b32d2e738362c7f5e40ac8b46dd7d1a65e82a4872728fe",
- "sha256:8e7da17f53e25d1a3bde5da4601e026adc9e8071f9f6f936d0fe3fe84ace6d54",
- "sha256:a102424e28c6b47c67923a1f337ede4a4c2bba3965b01cf707978a801fc7442c",
- "sha256:a19a6cc9c6ce4b1e7e3d319a473cf0ee989cbbe2b39201d7c19e214d2dfb80c7",
- "sha256:a71a5b541078d0ebe373a81a3b7e71432c61d12e660f1d67896ca62d9628045b",
- "sha256:baf95683cde5bc7d0e12d8e7588a3eb754d7c4fa714548adcd96bdf90169f021",
- "sha256:cab15ff4832580aa440dc9790b8a6128abd0b88b7ee4dd56abacbc52f212209d",
- "sha256:ce290e62229964715f1011c3dbeab7a4a1e4971fd6f31324c4519464473ef9f2",
- "sha256:d3a8ffec2a50d8ec470143ea3d15c0c52d73df882eef92de7537e8ce13475e8a",
- "sha256:e204937f67b28d2dca73ca936d3039a144a081fc47a07598d44854ea2a106239",
- "sha256:eb23f58a446a7f09db85eda09521a498e109f137b85fb278edb2e34841055398",
- "sha256:f6dd02ec01f4468da0f234da9d9c8545c5412fef80bc590cc51d8dd084138a89"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==7.2"
- }
- },
- "typing-dev": {
- "asgiref": {
- "hashes": [
- "sha256:3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47",
- "sha256:c343bd80a0bec947a9860adb4c432ffa7db769836c64238fc34bdc3fec84d590"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==3.8.1"
- },
- "celery-types": {
- "hashes": [
- "sha256:0ecad2fa5a6eded0a1f919e5e1e381cc2ff0635fe4b21db53b4661b6876d5b30",
- "sha256:79a66637d1d6af5992d1dc80259d9538869941325e966006f1e795220519b9ac"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.9' and python_version < '4.0'",
- "version": "==0.22.0"
- },
- "certifi": {
- "hashes": [
- "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56",
- "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"
- ],
- "markers": "python_version >= '3.6'",
- "version": "==2024.12.14"
- },
- "cffi": {
- "hashes": [
- "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8",
- "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2",
- "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1",
- "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15",
- "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36",
- "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824",
- "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8",
- "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36",
- "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17",
- "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf",
- "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc",
- "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3",
- "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed",
- "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702",
- "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1",
- "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8",
- "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903",
- "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6",
- "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d",
- "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b",
- "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e",
- "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be",
- "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c",
- "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683",
- "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9",
- "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c",
- "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8",
- "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1",
- "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4",
- "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655",
- "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67",
- "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595",
- "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0",
- "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65",
- "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41",
- "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6",
- "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401",
- "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6",
- "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3",
- "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16",
- "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93",
- "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e",
- "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4",
- "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964",
- "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c",
- "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576",
- "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0",
- "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3",
- "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662",
- "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3",
- "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff",
- "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5",
- "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd",
- "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f",
- "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5",
- "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14",
- "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d",
- "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9",
- "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7",
- "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382",
- "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a",
- "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e",
- "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a",
- "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4",
- "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99",
- "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87",
- "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==1.17.1"
- },
- "charset-normalizer": {
- "hashes": [
- "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537",
- "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa",
- "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a",
- "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294",
- "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b",
- "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd",
- "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601",
- "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd",
- "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4",
- "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d",
- "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2",
- "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313",
- "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd",
- "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa",
- "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8",
- "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1",
- "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2",
- "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496",
- "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d",
- "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b",
- "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e",
- "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a",
- "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4",
- "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca",
- "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78",
- "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408",
- "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5",
- "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3",
- "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f",
- "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a",
- "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765",
- "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6",
- "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146",
- "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6",
- "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9",
- "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd",
- "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c",
- "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f",
- "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545",
- "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176",
- "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770",
- "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824",
- "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f",
- "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf",
- "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487",
- "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d",
- "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd",
- "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b",
- "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534",
- "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f",
- "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b",
- "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9",
- "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd",
- "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125",
- "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9",
- "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de",
- "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11",
- "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d",
- "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35",
- "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f",
- "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda",
- "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7",
- "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a",
- "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971",
- "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8",
- "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41",
- "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d",
- "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f",
- "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757",
- "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a",
- "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886",
- "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77",
- "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76",
- "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247",
- "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85",
- "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb",
- "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7",
- "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e",
- "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6",
- "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037",
- "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1",
- "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e",
- "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807",
- "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407",
- "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c",
- "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12",
- "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3",
- "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089",
- "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd",
- "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e",
- "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00",
- "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616"
- ],
- "markers": "python_version >= '3.7'",
- "version": "==3.4.1"
- },
- "cryptography": {
- "hashes": [
- "sha256:1923cb251c04be85eec9fda837661c67c1049063305d6be5721643c22dd4e2b7",
- "sha256:37d76e6863da3774cd9db5b409a9ecfd2c71c981c38788d3fcfaf177f447b731",
- "sha256:3c672a53c0fb4725a29c303be906d3c1fa99c32f58abe008a82705f9ee96f40b",
- "sha256:404fdc66ee5f83a1388be54300ae978b2efd538018de18556dde92575e05defc",
- "sha256:4ac4c9f37eba52cb6fbeaf5b59c152ea976726b865bd4cf87883a7e7006cc543",
- "sha256:62901fb618f74d7d81bf408c8719e9ec14d863086efe4185afd07c352aee1d2c",
- "sha256:660cb7312a08bc38be15b696462fa7cc7cd85c3ed9c576e81f4dc4d8b2b31591",
- "sha256:708ee5f1bafe76d041b53a4f95eb28cdeb8d18da17e597d46d7833ee59b97ede",
- "sha256:761817a3377ef15ac23cd7834715081791d4ec77f9297ee694ca1ee9c2c7e5eb",
- "sha256:831c3c4d0774e488fdc83a1923b49b9957d33287de923d58ebd3cec47a0ae43f",
- "sha256:84111ad4ff3f6253820e6d3e58be2cc2a00adb29335d4cacb5ab4d4d34f2a123",
- "sha256:8b3e6eae66cf54701ee7d9c83c30ac0a1e3fa17be486033000f2a73a12ab507c",
- "sha256:9e6fc8a08e116fb7c7dd1f040074c9d7b51d74a8ea40d4df2fc7aa08b76b9e6c",
- "sha256:a01956ddfa0a6790d594f5b34fc1bfa6098aca434696a03cfdbe469b8ed79285",
- "sha256:abc998e0c0eee3c8a1904221d3f67dcfa76422b23620173e28c11d3e626c21bd",
- "sha256:b15492a11f9e1b62ba9d73c210e2416724633167de94607ec6069ef724fad092",
- "sha256:be4ce505894d15d5c5037167ffb7f0ae90b7be6f2a98f9a5c3442395501c32fa",
- "sha256:c5eb858beed7835e5ad1faba59e865109f3e52b3783b9ac21e7e47dc5554e289",
- "sha256:cd4e834f340b4293430701e772ec543b0fbe6c2dea510a5286fe0acabe153a02",
- "sha256:d2436114e46b36d00f8b72ff57e598978b37399d2786fd39793c36c6d5cb1c64",
- "sha256:eb33480f1bad5b78233b0ad3e1b0be21e8ef1da745d8d2aecbb20671658b9053",
- "sha256:eca27345e1214d1b9f9490d200f9db5a874479be914199194e746c893788d417",
- "sha256:ed3534eb1090483c96178fcb0f8893719d96d5274dfde98aa6add34614e97c8e",
- "sha256:f3f6fdfa89ee2d9d496e2c087cebef9d4fcbb0ad63c40e821b39f74bf48d9c5e",
- "sha256:f53c2c87e0fb4b0c00fa9571082a057e37690a8f12233306161c8f4b819960b7",
- "sha256:f5e7cb1e5e56ca0933b4873c0220a78b773b24d40d186b6738080b73d3d0a756",
- "sha256:f677e1268c4e23420c3acade68fac427fffcb8d19d7df95ed7ad17cdef8404f4"
- ],
- "markers": "python_version >= '3.7' and python_full_version not in '3.9.0, 3.9.1'",
- "version": "==44.0.0"
- },
- "django": {
- "hashes": [
- "sha256:19bbca786df50b9eca23cee79d495facf55c8f5c54c529d9bf1fe7b5ea086af3",
- "sha256:c46eb936111fffe6ec4bc9930035524a8be98ec2f74d8a0ff351226a3e52f459"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.10'",
- "version": "==5.1.5"
- },
- "django-filter-stubs": {
- "hashes": [
- "sha256:8b03ef8c304024672c3ebc99b72b59fb6f9d6c1a2b3b16a5100bf11a1577bc8b",
- "sha256:b683e8ddb92a1e1456a53dc299963ae4a5768f8d3cc3318dbef06c4b7d943336"
- ],
- "index": "pypi",
- "version": "==0.1.3"
- },
- "django-stubs": {
- "extras": [
- "compatible-mypy"
- ],
- "hashes": [
- "sha256:04ddc778faded6fb48468a8da9e98b8d12b9ba983faa648d37a73ebde0f024da",
- "sha256:a0fcb3659bab46a6d835cc2d9bff3fc29c36ccea41a10e8b1930427bc0f9f0df"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==5.1.2"
- },
- "django-stubs-ext": {
- "hashes": [
- "sha256:421c0c3025a68e3ab8e16f065fad9ba93335ecefe2dd92a0cff97a665680266c",
- "sha256:6c559214538d6a26f631ca638ddc3251a0a891d607de8ce01d23d3201ad8ad6c"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==5.1.2"
- },
- "djangorestframework-stubs": {
- "extras": [
- "compatible-mypy"
- ],
- "hashes": [
- "sha256:0e72f1e8507bdb2acd99b304520494ea5d45bccba51a4877140cb65fd461adf0",
- "sha256:3df129845acac6c1b097bc7e5b360d53e32a02029d60b4f972dfbd3e2508f236"
- ],
- "markers": "python_version >= '3.9'",
- "version": "==3.15.2"
- },
- "idna": {
- "hashes": [
- "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9",
- "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"
- ],
- "markers": "python_version >= '3.6'",
- "version": "==3.10"
- },
- "mypy": {
- "hashes": [
- "sha256:0246bcb1b5de7f08f2826451abd947bf656945209b140d16ed317f65a17dc7dc",
- "sha256:0291a61b6fbf3e6673e3405cfcc0e7650bebc7939659fdca2702958038bd835e",
- "sha256:0730d1c6a2739d4511dc4253f8274cdd140c55c32dfb0a4cf8b7a43f40abfa6f",
- "sha256:07de989f89786f62b937851295ed62e51774722e5444a27cecca993fc3f9cd74",
- "sha256:100fac22ce82925f676a734af0db922ecfea991e1d7ec0ceb1e115ebe501301a",
- "sha256:164f28cb9d6367439031f4c81e84d3ccaa1e19232d9d05d37cb0bd880d3f93c2",
- "sha256:20c7ee0bc0d5a9595c46f38beb04201f2620065a93755704e141fcac9f59db2b",
- "sha256:3790ded76f0b34bc9c8ba4def8f919dd6a46db0f5a6610fb994fe8efdd447f73",
- "sha256:39bb21c69a5d6342f4ce526e4584bc5c197fd20a60d14a8624d8743fffb9472e",
- "sha256:3ddb5b9bf82e05cc9a627e84707b528e5c7caaa1c55c69e175abb15a761cec2d",
- "sha256:3e38b980e5681f28f033f3be86b099a247b13c491f14bb8b1e1e134d23bb599d",
- "sha256:4bde84334fbe19bad704b3f5b78c4abd35ff1026f8ba72b29de70dda0916beb6",
- "sha256:51f869f4b6b538229c1d1bcc1dd7d119817206e2bc54e8e374b3dfa202defcca",
- "sha256:581665e6f3a8a9078f28d5502f4c334c0c8d802ef55ea0e7276a6e409bc0d82d",
- "sha256:5c7051a3461ae84dfb5dd15eff5094640c61c5f22257c8b766794e6dd85e72d5",
- "sha256:5d5092efb8516d08440e36626f0153b5006d4088c1d663d88bf79625af3d1d62",
- "sha256:6607e0f1dd1fb7f0aca14d936d13fd19eba5e17e1cd2a14f808fa5f8f6d8f60a",
- "sha256:7029881ec6ffb8bc233a4fa364736789582c738217b133f1b55967115288a2bc",
- "sha256:7b2353a44d2179846a096e25691d54d59904559f4232519d420d64da6828a3a7",
- "sha256:7bcb0bb7f42a978bb323a7c88f1081d1b5dee77ca86f4100735a6f541299d8fb",
- "sha256:7bfd8836970d33c2105562650656b6846149374dc8ed77d98424b40b09340ba7",
- "sha256:7f5b7deae912cf8b77e990b9280f170381fdfbddf61b4ef80927edd813163732",
- "sha256:8a21be69bd26fa81b1f80a61ee7ab05b076c674d9b18fb56239d72e21d9f4c80",
- "sha256:9c250883f9fd81d212e0952c92dbfcc96fc237f4b7c92f56ac81fd48460b3e5a",
- "sha256:9f73dba9ec77acb86457a8fc04b5239822df0c14a082564737833d2963677dbc",
- "sha256:a0affb3a79a256b4183ba09811e3577c5163ed06685e4d4b46429a271ba174d2",
- "sha256:a4c1bfcdbce96ff5d96fc9b08e3831acb30dc44ab02671eca5953eadad07d6d0",
- "sha256:a6789be98a2017c912ae6ccb77ea553bbaf13d27605d2ca20a76dfbced631b24",
- "sha256:a7b44178c9760ce1a43f544e595d35ed61ac2c3de306599fa59b38a6048e1aa7",
- "sha256:bde31fc887c213e223bbfc34328070996061b0833b0a4cfec53745ed61f3519b",
- "sha256:c5fc54dbb712ff5e5a0fca797e6e0aa25726c7e72c6a5850cfd2adbc1eb0a372",
- "sha256:de2904956dac40ced10931ac967ae63c5089bd498542194b436eb097a9f77bc8"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.8'",
- "version": "==1.13.0"
- },
- "mypy-extensions": {
- "hashes": [
- "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d",
- "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"
- ],
- "markers": "python_version >= '3.5'",
- "version": "==1.0.0"
- },
- "pycparser": {
- "hashes": [
- "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6",
- "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==2.22"
- },
- "requests": {
- "hashes": [
- "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760",
- "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==2.32.3"
- },
- "sqlparse": {
- "hashes": [
- "sha256:09f67787f56a0b16ecdbde1bfc7f5d9c3371ca683cfeaa8e6ff60b4807ec9272",
- "sha256:cf2196ed3418f3ba5de6af7e82c694a9fbdbfecccdfc72e281548517081f16ca"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==0.5.3"
- },
- "tomli": {
- "hashes": [
- "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6",
- "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd",
- "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c",
- "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b",
- "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8",
- "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6",
- "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77",
- "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff",
- "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea",
- "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192",
- "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249",
- "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee",
- "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4",
- "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98",
- "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8",
- "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4",
- "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281",
- "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744",
- "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69",
- "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13",
- "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140",
- "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e",
- "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e",
- "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc",
- "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff",
- "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec",
- "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2",
- "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222",
- "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106",
- "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272",
- "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a",
- "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==2.2.1"
- },
- "types-bleach": {
- "hashes": [
- "sha256:c6e58b3646665ca7c6b29890375390f4569e84f0cf5c171e0fe1ddb71a7be86a",
- "sha256:dac5fe9015173514da3ac810c1a935619a3ccbcc5d66c4cbf4707eac00539057"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.8'",
- "version": "==6.2.0.20241123"
- },
- "types-cffi": {
- "hashes": [
- "sha256:1c96649618f4b6145f58231acb976e0b448be6b847f7ab733dabe62dfbff6591",
- "sha256:e5b76b4211d7a9185f6ab8d06a106d56c7eb80af7cdb8bfcb4186ade10fb112f"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==1.16.0.20241221"
- },
- "types-colorama": {
- "hashes": [
- "sha256:6391de60ddc0db3f147e31ecb230006a6823e81e380862ffca1e4695c13a0b8e",
- "sha256:a28e7f98d17d2b14fb9565d32388e419f4108f557a7d939a66319969b2b99c7a"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.8'",
- "version": "==0.4.15.20240311"
- },
- "types-dateparser": {
- "hashes": [
- "sha256:8f813ddf5ef41b32cabe6167138ae833ada10c22811e42220a1e38a0be7adbdc",
- "sha256:bf3695ddfbadfdfc875064895a51d926fd80b04da1a44364c6c1a9703db7b194"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.8'",
- "version": "==1.2.0.20240420"
- },
- "types-docutils": {
- "hashes": [
- "sha256:4dd059805b83ac6ec5a223699195c4e9eeb0446a4f7f2aeff1759a4a7cc17473",
- "sha256:e0409204009639e9b0bf4521eeabe58b5e574ce9c0db08421c2ac26c32be0039"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==0.21.0.20241128"
- },
- "types-html5lib": {
- "hashes": [
- "sha256:3f1e064d9ed2c289001ae6392c84c93833abb0816165c6ff0abfc304a779f403",
- "sha256:98042555ff78d9e3a51c77c918b1041acbb7eb6c405408d8a9e150ff5beccafa"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==1.1.11.20241018"
- },
- "types-markdown": {
- "hashes": [
- "sha256:ecca2b25cd23163fd28ed5ba34d183d731da03e8a5ed3a20b60daded304c5410",
- "sha256:f96146c367ea9c82bfe9903559d72706555cc2a1a3474c58ebba03b418ab18da"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.8'",
- "version": "==3.7.0.20241204"
- },
- "types-pillow": {
- "hashes": [
- "sha256:559fb52a2ef991c326e4a0d20accb3bb63a7ba8d40eb493e0ecb0310ba52f0d3",
- "sha256:d9dab025aba07aeb12fd50a6799d4eac52a9603488eca09d7662543983f16c5d"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.8'",
- "version": "==10.2.0.20240822"
- },
- "types-pygments": {
- "hashes": [
- "sha256:34a555ed327f249daed18c6309e6e62770cdb8b9c321029ba7fd852d10b16f10",
- "sha256:94de72c7f09b956c518f566e056812c698272a7a03a9cd81f0065576c6bd3219"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.8'",
- "version": "==2.19.0.20250107"
- },
- "types-pyopenssl": {
- "hashes": [
- "sha256:47913b4678a01d879f503a12044468221ed8576263c1540dcb0484ca21b08c39",
- "sha256:6a7a5d2ec042537934cfb4c9d4deb0e16c4c6250b09358df1f083682fe6fda54"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==24.1.0.20240722"
- },
- "types-python-dateutil": {
- "hashes": [
- "sha256:18f493414c26ffba692a72369fea7a154c502646301ebfe3d56a04b3767284cb",
- "sha256:e248a4bc70a486d3e3ec84d0dc30eec3a5f979d6e7ee4123ae043eedbb987f53"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.8'",
- "version": "==2.9.0.20241206"
- },
- "types-pyyaml": {
- "hashes": [
- "sha256:7f07622dbd34bb9c8b264fe860a17e0efcad00d50b5f27e93984909d9363498c",
- "sha256:fa4d32565219b68e6dee5f67534c722e53c00d1cfc09c435ef04d7353e1e96e6"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==6.0.12.20241230"
- },
- "types-redis": {
- "hashes": [
- "sha256:5f17d2b3f9091ab75384153bfa276619ffa1cf6a38da60e10d5e6749cc5b902e",
- "sha256:ef5da68cb827e5f606c8f9c0b49eeee4c2669d6d97122f301d3a55dc6a63f6ed"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.8'",
- "version": "==4.6.0.20241004"
- },
- "types-requests": {
- "hashes": [
- "sha256:0d9cad2f27515d0e3e3da7134a1b6f28fb97129d86b867f24d9c726452634d95",
- "sha256:4195d62d6d3e043a4eaaf08ff8a62184584d2e8684e9d2aa178c7915a7da3747"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==2.32.0.20241016"
- },
- "types-setuptools": {
- "hashes": [
- "sha256:96f7ec8bbd6e0a54ea180d66ad68ad7a1d7954e7281a710ea2de75e355545271",
- "sha256:a9f12980bbf9bcdc23ecd80755789085bad6bfce4060c2275bc2b4ca9f2bc480"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.8'",
- "version": "==75.8.0.20250110"
- },
- "types-tqdm": {
- "hashes": [
- "sha256:a1f1c9cda5c2d8482d2c73957a5398bfdedda10f6bc7b3b4e812d5c910486d29",
- "sha256:e56046631056922385abe89aeb18af5611f471eadd7918a0ad7f34d84cd4c8cc"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.8'",
- "version": "==4.67.0.20241221"
- },
- "typing-extensions": {
- "hashes": [
- "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d",
- "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==4.12.2"
- },
- "urllib3": {
- "hashes": [
- "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df",
- "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"
- ],
- "markers": "python_version >= '3.9'",
- "version": "==2.3.0"
- }
- }
-}
diff --git a/README.md b/README.md
index 8ebfddff2..5cfdc986d 100644
--- a/README.md
+++ b/README.md
@@ -83,7 +83,7 @@ People interested in continuing the work on paperless-ngx are encouraged to reac
## Translation
-Paperless-ngx is available in many languages that are coordinated on Crowdin. If you want to help out by translating paperless-ngx into your language, please head over to https://crwd.in/paperless-ngx, and thank you! More details can be found in [CONTRIBUTING.md](https://github.com/paperless-ngx/paperless-ngx/blob/main/CONTRIBUTING.md#translating-paperless-ngx).
+Paperless-ngx is available in many languages that are coordinated on Crowdin. If you want to help out by translating paperless-ngx into your language, please head over to https://crowdin.com/project/paperless-ngx, and thank you! More details can be found in [CONTRIBUTING.md](https://github.com/paperless-ngx/paperless-ngx/blob/main/CONTRIBUTING.md#translating-paperless-ngx).
## Feature Requests
diff --git a/docker/compose/docker-compose.ci-test.yml b/docker/compose/docker-compose.ci-test.yml
index d67aa9f61..9eb1afe19 100644
--- a/docker/compose/docker-compose.ci-test.yml
+++ b/docker/compose/docker-compose.ci-test.yml
@@ -1,11 +1,10 @@
-# Docker Compose file for running paperless testing with actual gotenberg
+# Docker Compose file for running paperless testing with actual Gotenberg
# and Tika containers for a more end to end test of the Tika related functionality
# Can be used locally or by the CI to start the necessary containers with the
# correct networking for the tests
-
services:
gotenberg:
- image: docker.io/gotenberg/gotenberg:8.7
+ image: docker.io/gotenberg/gotenberg:8.20
hostname: gotenberg
container_name: gotenberg
network_mode: host
diff --git a/docker/compose/docker-compose.env b/docker/compose/docker-compose.env
index 7563ec069..75eeeed09 100644
--- a/docker/compose/docker-compose.env
+++ b/docker/compose/docker-compose.env
@@ -32,6 +32,6 @@
# Note that this is different from PAPERLESS_OCR_LANGUAGE (default=eng), which defines
# the language used for OCR.
# The container installs English, German, Italian, Spanish and French by default.
-# See https://packages.debian.org/search?keywords=tesseract-ocr-&searchon=names&suite=buster
+# See https://packages.debian.org/search?keywords=tesseract-ocr-&searchon=names
# for available languages.
#PAPERLESS_OCR_LANGUAGES=tur ces
diff --git a/docker/compose/docker-compose.mariadb-tika.yml b/docker/compose/docker-compose.mariadb-tika.yml
index b451ce9e8..b4522c26b 100644
--- a/docker/compose/docker-compose.mariadb-tika.yml
+++ b/docker/compose/docker-compose.mariadb-tika.yml
@@ -16,27 +16,24 @@
# - Instead of SQLite (default), MariaDB is used as the database server.
# - Apache Tika and Gotenberg servers are started with paperless and paperless
# is configured to use these services. These provide support for consuming
-# Office documents (Word, Excel, Power Point and their LibreOffice counter-
-# parts.
+# Office documents (Word, Excel, PowerPoint and their LibreOffice counter-
+# parts).
#
# To install and update paperless with this file, do the following:
#
# - Copy this file as 'docker-compose.yml' and the files 'docker-compose.env'
# and '.env' into a folder.
# - Run 'docker compose pull'.
-# - Run 'docker compose run --rm webserver createsuperuser' to create a user.
# - Run 'docker compose up -d'.
#
# For more extensive installation and update instructions, refer to the
# documentation.
-
services:
broker:
- image: docker.io/library/redis:7
+ image: docker.io/library/redis:8
restart: unless-stopped
volumes:
- redisdata:/data
-
db:
image: docker.io/library/mariadb:11
restart: unless-stopped
@@ -48,7 +45,6 @@ services:
MARIADB_USER: paperless
MARIADB_PASSWORD: paperless
MARIADB_ROOT_PASSWORD: paperless
-
webserver:
image: ghcr.io/paperless-ngx/paperless-ngx:latest
restart: unless-stopped
@@ -75,9 +71,8 @@ services:
PAPERLESS_TIKA_ENABLED: 1
PAPERLESS_TIKA_GOTENBERG_ENDPOINT: http://gotenberg:3000
PAPERLESS_TIKA_ENDPOINT: http://tika:9998
-
gotenberg:
- image: docker.io/gotenberg/gotenberg:8.7
+ image: docker.io/gotenberg/gotenberg:8.20
restart: unless-stopped
# The gotenberg chromium route is used to convert .eml files. We do not
# want to allow external content like tracking pixels or even javascript.
@@ -85,11 +80,9 @@ services:
- "gotenberg"
- "--chromium-disable-javascript=true"
- "--chromium-allow-list=file:///tmp/.*"
-
tika:
image: docker.io/apache/tika:latest
restart: unless-stopped
-
volumes:
data:
media:
diff --git a/docker/compose/docker-compose.mariadb.yml b/docker/compose/docker-compose.mariadb.yml
index 0b7a0fd3e..b33e7e889 100644
--- a/docker/compose/docker-compose.mariadb.yml
+++ b/docker/compose/docker-compose.mariadb.yml
@@ -20,19 +20,16 @@
# - Copy this file as 'docker-compose.yml' and the files 'docker-compose.env'
# and '.env' into a folder.
# - Run 'docker compose pull'.
-# - Run 'docker compose run --rm webserver createsuperuser' to create a user.
# - Run 'docker compose up -d'.
#
# For more extensive installation and update instructions, refer to the
# documentation.
-
services:
broker:
- image: docker.io/library/redis:7
+ image: docker.io/library/redis:8
restart: unless-stopped
volumes:
- redisdata:/data
-
db:
image: docker.io/library/mariadb:11
restart: unless-stopped
@@ -44,7 +41,6 @@ services:
MARIADB_USER: paperless
MARIADB_PASSWORD: paperless
MARIADB_ROOT_PASSWORD: paperless
-
webserver:
image: ghcr.io/paperless-ngx/paperless-ngx:latest
restart: unless-stopped
@@ -66,7 +62,6 @@ services:
PAPERLESS_DBUSER: paperless # only needed if non-default username
PAPERLESS_DBPASS: paperless # only needed if non-default password
PAPERLESS_DBPORT: 3306
-
volumes:
data:
media:
diff --git a/docker/compose/docker-compose.portainer.yml b/docker/compose/docker-compose.portainer.yml
index 588a93c84..e0196e7d2 100644
--- a/docker/compose/docker-compose.portainer.yml
+++ b/docker/compose/docker-compose.portainer.yml
@@ -22,23 +22,17 @@
# - Upload 'docker-compose.env' by clicking on 'Load variables from .env file'
# - Modify the environment variables as needed
# - Click 'Deploy the stack' and wait for it to be deployed
-# - Open the list of containers, select paperless_webserver_1
-# - Click 'Console' and then 'Connect' to open the command line inside the container
-# - Run 'python3 manage.py createsuperuser' to create a user
-# - Exit the console
#
# For more extensive installation and update instructions, refer to the
# documentation.
-
services:
broker:
- image: docker.io/library/redis:7
+ image: docker.io/library/redis:8
restart: unless-stopped
volumes:
- redisdata:/data
-
db:
- image: docker.io/library/postgres:16
+ image: docker.io/library/postgres:17
restart: unless-stopped
volumes:
- pgdata:/var/lib/postgresql/data
@@ -46,7 +40,6 @@ services:
POSTGRES_DB: paperless
POSTGRES_USER: paperless
POSTGRES_PASSWORD: paperless
-
webserver:
image: ghcr.io/paperless-ngx/paperless-ngx:latest
restart: unless-stopped
@@ -65,7 +58,6 @@ services:
PAPERLESS_DBHOST: db
env_file:
- stack.env
-
volumes:
data:
media:
diff --git a/docker/compose/docker-compose.postgres-tika.yml b/docker/compose/docker-compose.postgres-tika.yml
index e168dfadc..818e1b130 100644
--- a/docker/compose/docker-compose.postgres-tika.yml
+++ b/docker/compose/docker-compose.postgres-tika.yml
@@ -16,29 +16,26 @@
# - Instead of SQLite (default), PostgreSQL is used as the database server.
# - Apache Tika and Gotenberg servers are started with paperless and paperless
# is configured to use these services. These provide support for consuming
-# Office documents (Word, Excel, Power Point and their LibreOffice counter-
-# parts.
+# Office documents (Word, Excel, PowerPoint and their LibreOffice counter-
+# parts).
#
# To install and update paperless with this file, do the following:
#
# - Copy this file as 'docker-compose.yml' and the files 'docker-compose.env'
# and '.env' into a folder.
# - Run 'docker compose pull'.
-# - Run 'docker compose run --rm webserver createsuperuser' to create a user.
# - Run 'docker compose up -d'.
#
# For more extensive installation and update instructions, refer to the
# documentation.
-
services:
broker:
- image: docker.io/library/redis:7
+ image: docker.io/library/redis:8
restart: unless-stopped
volumes:
- redisdata:/data
-
db:
- image: docker.io/library/postgres:16
+ image: docker.io/library/postgres:17
restart: unless-stopped
volumes:
- pgdata:/var/lib/postgresql/data
@@ -46,7 +43,6 @@ services:
POSTGRES_DB: paperless
POSTGRES_USER: paperless
POSTGRES_PASSWORD: paperless
-
webserver:
image: ghcr.io/paperless-ngx/paperless-ngx:latest
restart: unless-stopped
@@ -69,22 +65,18 @@ services:
PAPERLESS_TIKA_ENABLED: 1
PAPERLESS_TIKA_GOTENBERG_ENDPOINT: http://gotenberg:3000
PAPERLESS_TIKA_ENDPOINT: http://tika:9998
-
gotenberg:
- image: docker.io/gotenberg/gotenberg:8.7
+ image: docker.io/gotenberg/gotenberg:8.20
restart: unless-stopped
-
# The gotenberg chromium route is used to convert .eml files. We do not
# want to allow external content like tracking pixels or even javascript.
command:
- "gotenberg"
- "--chromium-disable-javascript=true"
- "--chromium-allow-list=file:///tmp/.*"
-
tika:
image: docker.io/apache/tika:latest
restart: unless-stopped
-
volumes:
data:
media:
diff --git a/docker/compose/docker-compose.postgres.yml b/docker/compose/docker-compose.postgres.yml
index f0af4e8da..e04c92bf0 100644
--- a/docker/compose/docker-compose.postgres.yml
+++ b/docker/compose/docker-compose.postgres.yml
@@ -20,21 +20,18 @@
# - Copy this file as 'docker-compose.yml' and the files 'docker-compose.env'
# and '.env' into a folder.
# - Run 'docker compose pull'.
-# - Run 'docker compose run --rm webserver createsuperuser' to create a user.
# - Run 'docker compose up -d'.
#
# For more extensive installation and update instructions, refer to the
# documentation.
-
services:
broker:
- image: docker.io/library/redis:7
+ image: docker.io/library/redis:8
restart: unless-stopped
volumes:
- redisdata:/data
-
db:
- image: docker.io/library/postgres:16
+ image: docker.io/library/postgres:17
restart: unless-stopped
volumes:
- pgdata:/var/lib/postgresql/data
@@ -42,7 +39,6 @@ services:
POSTGRES_DB: paperless
POSTGRES_USER: paperless
POSTGRES_PASSWORD: paperless
-
webserver:
image: ghcr.io/paperless-ngx/paperless-ngx:latest
restart: unless-stopped
@@ -60,7 +56,6 @@ services:
environment:
PAPERLESS_REDIS: redis://broker:6379
PAPERLESS_DBHOST: db
-
volumes:
data:
media:
diff --git a/docker/compose/docker-compose.sqlite-tika.yml b/docker/compose/docker-compose.sqlite-tika.yml
index abfb64cdf..86a6f5031 100644
--- a/docker/compose/docker-compose.sqlite-tika.yml
+++ b/docker/compose/docker-compose.sqlite-tika.yml
@@ -16,27 +16,24 @@
#
# - Apache Tika and Gotenberg servers are started with paperless and paperless
# is configured to use these services. These provide support for consuming
-# Office documents (Word, Excel, Power Point and their LibreOffice counter-
-# parts.
+# Office documents (Word, Excel, PowerPoint and their LibreOffice counter-
+# parts).
#
# To install and update paperless with this file, do the following:
#
# - Copy this file as 'docker-compose.yml' and the files 'docker-compose.env'
# and '.env' into a folder.
# - Run 'docker compose pull'.
-# - Run 'docker compose run --rm webserver createsuperuser' to create a user.
# - Run 'docker compose up -d'.
#
# For more extensive installation and update instructions, refer to the
# documentation.
-
services:
broker:
- image: docker.io/library/redis:7
+ image: docker.io/library/redis:8
restart: unless-stopped
volumes:
- redisdata:/data
-
webserver:
image: ghcr.io/paperless-ngx/paperless-ngx:latest
restart: unless-stopped
@@ -57,22 +54,18 @@ services:
PAPERLESS_TIKA_ENABLED: 1
PAPERLESS_TIKA_GOTENBERG_ENDPOINT: http://gotenberg:3000
PAPERLESS_TIKA_ENDPOINT: http://tika:9998
-
gotenberg:
- image: docker.io/gotenberg/gotenberg:8.7
+ image: docker.io/gotenberg/gotenberg:8.20
restart: unless-stopped
-
# The gotenberg chromium route is used to convert .eml files. We do not
# want to allow external content like tracking pixels or even javascript.
command:
- "gotenberg"
- "--chromium-disable-javascript=true"
- "--chromium-allow-list=file:///tmp/.*"
-
tika:
image: docker.io/apache/tika:latest
restart: unless-stopped
-
volumes:
data:
media:
diff --git a/docker/compose/docker-compose.sqlite.yml b/docker/compose/docker-compose.sqlite.yml
index 1ca5fe86b..362fbc9d9 100644
--- a/docker/compose/docker-compose.sqlite.yml
+++ b/docker/compose/docker-compose.sqlite.yml
@@ -17,19 +17,16 @@
# - Copy this file as 'docker-compose.yml' and the files 'docker-compose.env'
# and '.env' into a folder.
# - Run 'docker compose pull'.
-# - Run 'docker compose run --rm webserver createsuperuser' to create a user.
# - Run 'docker compose up -d'.
#
# For more extensive installation and update instructions, refer to the
# documentation.
-
services:
broker:
- image: docker.io/library/redis:7
+ image: docker.io/library/redis:8
restart: unless-stopped
volumes:
- redisdata:/data
-
webserver:
image: ghcr.io/paperless-ngx/paperless-ngx:latest
restart: unless-stopped
@@ -45,7 +42,6 @@ services:
env_file: docker-compose.env
environment:
PAPERLESS_REDIS: redis://broker:6379
-
volumes:
data:
media:
diff --git a/docker/docker-entrypoint.sh b/docker/docker-entrypoint.sh
deleted file mode 100755
index b8687dc56..000000000
--- a/docker/docker-entrypoint.sh
+++ /dev/null
@@ -1,179 +0,0 @@
-#!/usr/bin/env bash
-
-set -e
-
-# Source: https://github.com/sameersbn/docker-gitlab/
-map_uidgid() {
- local -r usermap_original_uid=$(id -u paperless)
- local -r usermap_original_gid=$(id -g paperless)
- local -r usermap_new_uid=${USERMAP_UID:-$usermap_original_uid}
- local -r usermap_new_gid=${USERMAP_GID:-${usermap_original_gid:-$usermap_new_uid}}
- if [[ ${usermap_new_uid} != "${usermap_original_uid}" || ${usermap_new_gid} != "${usermap_original_gid}" ]]; then
- echo "Mapping UID and GID for paperless:paperless to $usermap_new_uid:$usermap_new_gid"
- usermod --non-unique --uid "${usermap_new_uid}" paperless
- groupmod --non-unique --gid "${usermap_new_gid}" paperless
- fi
-}
-
-map_folders() {
- # Export these so they can be used in docker-prepare.sh
- export DATA_DIR="${PAPERLESS_DATA_DIR:-/usr/src/paperless/data}"
- export MEDIA_ROOT_DIR="${PAPERLESS_MEDIA_ROOT:-/usr/src/paperless/media}"
- export CONSUME_DIR="${PAPERLESS_CONSUMPTION_DIR:-/usr/src/paperless/consume}"
-}
-
-custom_container_init() {
- # Mostly borrowed from the LinuxServer.io base image
- # https://github.com/linuxserver/docker-baseimage-ubuntu/tree/bionic/root/etc/cont-init.d
- local -r custom_script_dir="/custom-cont-init.d"
- # Tamper checking.
- # Don't run files which are owned by anyone except root
- # Don't run files which are writeable by others
- if [ -d "${custom_script_dir}" ]; then
- if [ -n "$(/usr/bin/find "${custom_script_dir}" -maxdepth 1 ! -user root)" ]; then
- echo "**** Potential tampering with custom scripts detected ****"
- echo "**** The folder '${custom_script_dir}' must be owned by root ****"
- return 0
- fi
- if [ -n "$(/usr/bin/find "${custom_script_dir}" -maxdepth 1 -perm -o+w)" ]; then
- echo "**** The folder '${custom_script_dir}' or some of contents have write permissions for others, which is a security risk. ****"
- echo "**** Please review the permissions and their contents to make sure they are owned by root, and can only be modified by root. ****"
- return 0
- fi
-
- # Make sure custom init directory has files in it
- if [ -n "$(/bin/ls --almost-all "${custom_script_dir}" 2>/dev/null)" ]; then
- echo "[custom-init] files found in ${custom_script_dir} executing"
- # Loop over files in the directory
- for SCRIPT in "${custom_script_dir}"/*; do
- NAME="$(basename "${SCRIPT}")"
- if [ -f "${SCRIPT}" ]; then
- echo "[custom-init] ${NAME}: executing..."
- /bin/bash "${SCRIPT}"
- echo "[custom-init] ${NAME}: exited $?"
- elif [ ! -f "${SCRIPT}" ]; then
- echo "[custom-init] ${NAME}: is not a file"
- fi
- done
- else
- echo "[custom-init] no custom files found exiting..."
- fi
-
- fi
-}
-
-initialize() {
-
- # Setup environment from secrets before anything else
- # Check for a version of this var with _FILE appended
- # and convert the contents to the env var value
- # Source it so export is persistent
- # shellcheck disable=SC1091
- source /sbin/env-from-file.sh
-
- # Change the user and group IDs if needed
- map_uidgid
-
- # Check for overrides of certain folders
- map_folders
-
- local -r export_dir="/usr/src/paperless/export"
-
- for dir in \
- "${export_dir}" \
- "${DATA_DIR}" "${DATA_DIR}/index" \
- "${MEDIA_ROOT_DIR}" "${MEDIA_ROOT_DIR}/documents" "${MEDIA_ROOT_DIR}/documents/originals" "${MEDIA_ROOT_DIR}/documents/thumbnails" \
- "${CONSUME_DIR}"; do
- if [[ ! -d "${dir}" ]]; then
- echo "Creating directory ${dir}"
- mkdir --parents --verbose "${dir}"
- fi
- done
-
- local -r tmp_dir="${PAPERLESS_SCRATCH_DIR:=/tmp/paperless}"
- echo "Creating directory scratch directory ${tmp_dir}"
- mkdir --parents --verbose "${tmp_dir}"
-
- set +e
- echo "Adjusting permissions of paperless files. This may take a while."
- chown -R paperless:paperless "${tmp_dir}"
- for dir in \
- "${export_dir}" \
- "${DATA_DIR}" \
- "${MEDIA_ROOT_DIR}" \
- "${CONSUME_DIR}"; do
- find "${dir}" -not \( -user paperless -and -group paperless \) -exec chown --changes paperless:paperless {} +
- done
- set -e
-
- "${gosu_cmd[@]}" /sbin/docker-prepare.sh
-
- # Leave this last thing
- custom_container_init
-
-}
-
-install_languages() {
- echo "Installing languages..."
-
- read -ra langs <<<"$1"
-
- # Check that it is not empty
- if [ ${#langs[@]} -eq 0 ]; then
- return
- fi
-
- # Build list of packages to install
- to_install=()
- for lang in "${langs[@]}"; do
- pkg="tesseract-ocr-$lang"
-
- if dpkg --status "$pkg" &>/dev/null; then
- echo "Package $pkg already installed!"
- continue
- else
- to_install+=("$pkg")
- fi
- done
-
- # Use apt only when we install packages
- if [ ${#to_install[@]} -gt 0 ]; then
- apt-get update
-
- for pkg in "${to_install[@]}"; do
-
- if ! apt-cache show "$pkg" &>/dev/null; then
- echo "Skipped $pkg: Package not found! :("
- continue
- fi
-
- echo "Installing package $pkg..."
- if ! apt-get --assume-yes install "$pkg" &>/dev/null; then
- echo "Could not install $pkg"
- exit 1
- fi
- done
- fi
-}
-
-echo "Paperless-ngx docker container starting..."
-
-gosu_cmd=(gosu paperless)
-if [ "$(id --user)" == "$(id --user paperless)" ]; then
- gosu_cmd=()
-fi
-
-# Install additional languages if specified
-if [[ -n "$PAPERLESS_OCR_LANGUAGES" ]]; then
- install_languages "$PAPERLESS_OCR_LANGUAGES"
-fi
-
-initialize
-
-if [[ "$1" != "/"* ]]; then
- echo Executing management command "$@"
- exec "${gosu_cmd[@]}" python3 manage.py "$@"
-else
- echo Executing "$@"
- exec "$@"
-fi
diff --git a/docker/install_management_commands.sh b/docker/install_management_commands.sh
index c7c65bfbb..17dae68a2 100755
--- a/docker/install_management_commands.sh
+++ b/docker/install_management_commands.sh
@@ -18,9 +18,10 @@ for command in decrypt_documents \
document_fuzzy_match \
manage_superuser \
convert_mariadb_uuid \
- prune_audit_logs;
+ prune_audit_logs \
+ createsuperuser;
do
echo "installing $command..."
sed "s/management_command/$command/g" management_script.sh >"$PWD/rootfs/usr/local/bin/$command"
- chmod +x "$PWD/rootfs/usr/local/bin/$command"
+ chmod u=rwx,g=rwx,o=rx "$PWD/rootfs/usr/local/bin/$command"
done
diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/init-env-file/run b/docker/rootfs/etc/s6-overlay/s6-rc.d/init-env-file/run
index 08b7635f8..d2c118ddb 100755
--- a/docker/rootfs/etc/s6-overlay/s6-rc.d/init-env-file/run
+++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/init-env-file/run
@@ -9,7 +9,7 @@ if find /run/s6/container_environment/*"_FILE" -maxdepth 1 > /dev/null 2>&1; the
for FILENAME in /run/s6/container_environment/*; do
if [[ "${FILENAME##*/}" == PAPERLESS_*_FILE ]]; then
# This should have been named different..
- if [[ ${FILENAME} == "PAPERLESS_OCR_SKIP_ARCHIVE_FILE" || ${FILENAME} == "PAPERLESS_MODEL_FILE" ]]; then
+ if [[ "${FILENAME##*/}" == "PAPERLESS_OCR_SKIP_ARCHIVE_FILE" || "${FILENAME##*/}" == "PAPERLESS_MODEL_FILE" ]]; then
continue
fi
SECRETFILE=$(cat "${FILENAME}")
@@ -17,6 +17,9 @@ if find /run/s6/container_environment/*"_FILE" -maxdepth 1 > /dev/null 2>&1; the
if [[ -f ${SECRETFILE} ]]; then
# Trim off trailing _FILE
FILESTRIP=${FILENAME//_FILE/}
+ if [[ $(tail -n1 "${SECRETFILE}" | wc -l) != 0 ]]; then
+ echo "${log_prefix} Your secret: ${FILENAME##*/} contains a trailing newline and may not work as expected"
+ fi
# Set environment variable
cat "${SECRETFILE}" > "${FILESTRIP}"
echo "${log_prefix} ${FILESTRIP##*/} set from ${FILENAME##*/}"
diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/init-folders/run b/docker/rootfs/etc/s6-overlay/s6-rc.d/init-folders/run
index 5f731ceae..9f7d58212 100755
--- a/docker/rootfs/etc/s6-overlay/s6-rc.d/init-folders/run
+++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/init-folders/run
@@ -9,25 +9,57 @@ declare -r media_root_dir="${PAPERLESS_MEDIA_ROOT:-/usr/src/paperless/media}"
declare -r consume_dir="${PAPERLESS_CONSUMPTION_DIR:-/usr/src/paperless/consume}"
declare -r tmp_dir="${PAPERLESS_SCRATCH_DIR:=/tmp/paperless}"
-echo "${log_prefix} Checking for folder existence"
+declare -r main_dirs=(
+ "${export_dir}"
+ "${data_dir}"
+ "${media_root_dir}"
+ "${consume_dir}"
+ "${tmp_dir}"
+)
-for dir in \
- "${export_dir}" \
- "${data_dir}" "${data_dir}/index" \
- "${media_root_dir}" "${media_root_dir}/documents" "${media_root_dir}/documents/originals" "${media_root_dir}/documents/thumbnails" \
- "${consume_dir}" \
- "${tmp_dir}"; do
- if [[ ! -d "${dir}" ]]; then
- mkdir --parents --verbose "${dir}"
- fi
-done
+declare -r extra_dirs=(
+ "${main_dirs[@]}"
+ "${data_dir}/index"
+ "${media_root_dir}/documents"
+ "${media_root_dir}/documents/originals"
+ "${media_root_dir}/documents/thumbnails"
+)
-echo "${log_prefix} Adjusting file and folder permissions"
-for dir in \
- "${export_dir}" \
- "${data_dir}" \
- "${media_root_dir}" \
- "${consume_dir}" \
- "${tmp_dir}"; do
- find "${dir}" -not \( -user paperless -and -group paperless \) -exec chown --changes paperless:paperless {} +
-done
+if [[ -n "${USER_IS_NON_ROOT}" ]]; then
+ # Non-root mode: Create directories as current user, warn about permission issues
+ echo "${log_prefix} Running in non-root mode, checking directories"
+ current_uid=$(id --user)
+ current_gid=$(id --group)
+
+ for dir in "${extra_dirs[@]}"; do
+ if [[ ! -d "${dir}" ]]; then
+ mkdir --parents --verbose "${dir}" || echo "${log_prefix} WARNING: Could not create ${dir} - permission denied"
+ fi
+ # Check permissions on existing directories too
+ if [[ -d "${dir}" && ! -w "${dir}" ]]; then
+ echo "${log_prefix} WARNING: No write permission to ${dir}"
+ fi
+ done
+
+ # Warn about ownership issues
+ for dir in "${main_dirs[@]}"; do
+ if [[ -d "${dir}" ]]; then
+ find "${dir}" -not \( -user ${current_uid} -and -group ${current_gid} \) -exec echo "${log_prefix} WARNING: Permission issue on {}: not owned by current user (${current_uid}:${current_gid})" \; 2>/dev/null || echo "${log_prefix} WARNING: Cannot check permissions on ${dir}"
+ fi
+ done
+else
+ # Root mode: Create and fix permissions as needed
+ echo "${log_prefix} Running with root privileges, adjusting directories and permissions"
+
+ # First create directories
+ for dir in "${extra_dirs[@]}"; do
+ if [[ ! -d "${dir}" ]]; then
+ mkdir --parents --verbose "${dir}"
+ fi
+ done
+
+ # Then fix permissions on all directories
+ for dir in "${main_dirs[@]}"; do
+ find "${dir}" -not \( -user paperless -and -group paperless \) -exec chown --changes paperless:paperless {} +
+ done
+fi
diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/init-migrations/run b/docker/rootfs/etc/s6-overlay/s6-rc.d/init-migrations/run
index db0dc26d3..5d9b45740 100755
--- a/docker/rootfs/etc/s6-overlay/s6-rc.d/init-migrations/run
+++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/init-migrations/run
@@ -1,20 +1,18 @@
#!/command/with-contenv /usr/bin/bash
# shellcheck shell=bash
declare -r log_prefix="[init-migrations]"
+
declare -r data_dir="${PAPERLESS_DATA_DIR:-/usr/src/paperless/data}"
-(
- # flock is in place to prevent multiple containers from doing migrations
- # simultaneously. This also ensures that the db is ready when the command
- # of the current container starts.
- flock 200
- echo "${log_prefix} Apply database migrations..."
- cd "${PAPERLESS_SRC_DIR}"
+echo "${log_prefix} Apply database migrations..."
- if [[ -n "${USER_IS_NON_ROOT}" ]]; then
- exec python3 manage.py migrate --skip-checks --no-input
- else
- exec s6-setuidgid paperless python3 manage.py migrate --skip-checks --no-input
- fi
+cd "${PAPERLESS_SRC_DIR}"
-) 200>"${data_dir}/migration_lock"
+# The whole migrate, with flock, needs to run as the right user
+if [[ -n "${USER_IS_NON_ROOT}" ]]; then
+ exec s6-setlock -n "${data_dir}/migration_lock" python3 manage.py migrate --skip-checks --no-input
+else
+ exec s6-setuidgid paperless \
+ s6-setlock -n "${data_dir}/migration_lock" \
+ python3 manage.py migrate --skip-checks --no-input
+fi
diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/init-start/run b/docker/rootfs/etc/s6-overlay/s6-rc.d/init-start/run
index b6a26fae7..9e5667191 100755
--- a/docker/rootfs/etc/s6-overlay/s6-rc.d/init-start/run
+++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/init-start/run
@@ -11,9 +11,10 @@ printf "/usr/src/paperless/src" > /var/run/s6/container_environment/PAPERLESS_SR
echo $(date +%s) > /var/run/s6/container_environment/PAPERLESS_START_TIME_S
# Check if we're starting as a non-root user
-if [ $(id -u) == $(id -u paperless) ]; then
+if [ "$(id --user)" != "0" ]; then
printf "true" > /var/run/s6/container_environment/USER_IS_NON_ROOT
- echo "${log_prefix} paperless-ngx docker container running under a user"
+ echo "${log_prefix} paperless-ngx docker container running under a user ($(id --user):$(id --group))"
else
- echo "${log_prefix} paperless-ngx docker container starting init as root"
+ printf "/usr/src/paperless" > /var/run/s6/container_environment/HOME
+ echo "${log_prefix} paperless-ngx docker container starting init as root"
fi
diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-consumer/run b/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-consumer/run
index 3e1c0472b..209803d41 100755
--- a/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-consumer/run
+++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-consumer/run
@@ -1,10 +1,18 @@
#!/command/with-contenv /usr/bin/bash
# shellcheck shell=bash
-cd ${PAPERLESS_SRC_DIR}
-if [[ -n "${USER_IS_NON_ROOT}" ]]; then
- exec python3 manage.py document_consumer
+if [[ -n "${PAPERLESS_CONSUMER_DISABLE}" ]]; then
+ echo "[svc-consumer] Consumer is disabled, exiting"
+ # https://skarnet.org/software/s6/s6-svc.html
+ s6-svc -Od .
+
else
- exec s6-setuidgid paperless python3 manage.py document_consumer
+ cd ${PAPERLESS_SRC_DIR}
+
+ if [[ -n "${USER_IS_NON_ROOT}" ]]; then
+ exec python3 manage.py document_consumer
+ else
+ exec s6-setuidgid paperless python3 manage.py document_consumer
+ fi
fi
diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-webserver/run b/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-webserver/run
index 423b17531..841dad204 100755
--- a/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-webserver/run
+++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-webserver/run
@@ -3,8 +3,18 @@
cd ${PAPERLESS_SRC_DIR}
-if [[ -n "${USER_IS_NON_ROOT}" ]]; then
- exec /usr/local/bin/gunicorn -c /usr/src/paperless/gunicorn.conf.py paperless.asgi:application
-else
- exec s6-setuidgid paperless /usr/local/bin/gunicorn -c /usr/src/paperless/gunicorn.conf.py paperless.asgi:application
+# Translate between things, preferring GRANIAN_
+export GRANIAN_HOST=${GRANIAN_HOST:-${PAPERLESS_BIND_ADDR:-"::"}}
+export GRANIAN_PORT=${GRANIAN_PORT:-${PAPERLESS_PORT:-8000}}
+export GRANIAN_WORKERS=${GRANIAN_WORKERS:-${PAPERLESS_WEBSERVER_WORKERS:-1}}
+
+# Only set GRANIAN_URL_PATH_PREFIX if PAPERLESS_FORCE_SCRIPT_NAME is set
+if [[ -n "${PAPERLESS_FORCE_SCRIPT_NAME}" ]]; then
+ export GRANIAN_URL_PATH_PREFIX=${PAPERLESS_FORCE_SCRIPT_NAME}
+fi
+
+if [[ -n "${USER_IS_NON_ROOT}" ]]; then
+ exec granian --interface asginl --ws --loop uvloop "paperless.asgi:application"
+else
+ exec s6-setuidgid paperless granian --interface asginl --ws --loop uvloop "paperless.asgi:application"
fi
diff --git a/docker/rootfs/usr/local/bin/createsuperuser b/docker/rootfs/usr/local/bin/createsuperuser
new file mode 100755
index 000000000..f931952ba
--- /dev/null
+++ b/docker/rootfs/usr/local/bin/createsuperuser
@@ -0,0 +1,14 @@
+#!/command/with-contenv /usr/bin/bash
+# shellcheck shell=bash
+
+set -e
+
+cd "${PAPERLESS_SRC_DIR}"
+
+if [[ $(id -u) == 0 ]]; then
+ s6-setuidgid paperless python3 manage.py createsuperuser "$@"
+elif [[ $(id -un) == "paperless" ]]; then
+ python3 manage.py createsuperuser "$@"
+else
+ echo "Unknown user."
+fi
diff --git a/docs/administration.md b/docs/administration.md
index 8e646b326..3fe8bc19a 100644
--- a/docs/administration.md
+++ b/docs/administration.md
@@ -179,10 +179,14 @@ following:
### Database Upgrades
-In general, paperless does not require a specific version of PostgreSQL or MariaDB and it is
+Paperless-ngx is compatible with Django-supported versions of PostgreSQL and MariaDB and it is generally
safe to update them to newer versions. However, you should always take a backup and follow
the instructions from your database's documentation for how to upgrade between major versions.
+!!! note
+
+ As of Paperless-ngx v2.18, the minimum supported version of PostgreSQL is 14.
+
For PostgreSQL, refer to [Upgrading a PostgreSQL Cluster](https://www.postgresql.org/docs/current/upgrading.html).
For MariaDB, refer to [Upgrading MariaDB](https://mariadb.com/kb/en/upgrading/)
@@ -306,7 +310,7 @@ in dedicated folders according to their nature: `archive`, `originals`,
If `-sm` or `--split-manifest` is provided, information about document
will be placed in individual json files, instead of a single JSON file. The main
manifest.json will still contain application wide information (e.g. tags, correspondent,
-documenttype, etc)
+document type, etc)
If `-z` or `--zip` is provided, the export will be a zip file
in the target directory, named according to the current local date or the
@@ -333,7 +337,7 @@ must be provided to import. If this value is lost, the export cannot be imported
The document importer takes the export produced by the [Document
exporter](#exporter) and imports it into paperless.
-The importer works just like the exporter. You point it at a directory,
+The importer works just like the exporter. You point it at a directory or the generated .zip file,
and the script does the rest of the work:
```shell
@@ -351,9 +355,6 @@ When you use the provided docker compose script, put the export inside
the `export` folder in your paperless source directory. Specify
`../export` as the `source`.
-Note that .zip files (as can be generated from the exporter) are not supported. You must unzip them into
-the target directory first.
-
!!! note
Importing from a previous version of Paperless may work, but for best
@@ -460,6 +461,22 @@ of the index and usually makes queries faster and also ensures that the
autocompletion works properly. This command is regularly invoked by the
task scheduler.
+### Clearing the database read cache
+
+If the database read cache is enabled, **you must run this command** after making any changes to the database outside the application context.
+This includes operations such as restoring a database backup or executing SQL statements like UPDATE, INSERT, DELETE, ALTER, CREATE, or DROP.
+
+Failing to invalidate the cache after such modifications can lead to stale data being served from the cache, and **may cause data corruption** or inconsistent behavior in the application.
+
+Use the following management command to clear the cache:
+
+```
+invalidate_cachalot
+```
+
+!!! info
+The database read cache is based on Django-Cachalot. You can refer to their [documentation](https://django-cachalot.readthedocs.io/en/latest/quickstart.html#manage-py-command).
+
### Managing filenames {#renamer}
If you use paperless' feature to
@@ -565,19 +582,15 @@ document.
### Managing encryption {#encryption}
-Documents can be stored in Paperless using GnuPG encryption.
-
!!! warning
- Encryption is deprecated since [paperless-ng 0.9](changelog.md#paperless-ng-090) and doesn't really
- provide any additional security, since you have to store the passphrase
- in a configuration file on the same system as the encrypted documents
- for paperless to work. Furthermore, the entire text content of the
- documents is stored plain in the database, even if your documents are
- encrypted. Filenames are not encrypted as well.
-
- Also, the web server provides transparent access to your encrypted
- documents.
+ Encryption was removed in [paperless-ng 0.9](changelog.md#paperless-ng-090)
+ because it did not really provide any additional security, the passphrase
+ was stored in a configuration file on the same system as the documents.
+ Furthermore, the entire text content of the documents is stored plain in
+ the database, even if your documents are encrypted. Filenames are not
+ encrypted as well. Finally, the web server provides transparent access to
+ your encrypted documents.
Consider running paperless on an encrypted filesystem instead, which
will then at least provide security against physical hardware theft.
@@ -633,3 +646,11 @@ entries created prior to this are not removed. This command allows you to prune
```shell
prune_audit_logs
```
+
+### Create superuser {#create-superuser}
+
+If you need to create a superuser, use the following command:
+
+```shell
+createsuperuser
+```
diff --git a/docs/advanced_usage.md b/docs/advanced_usage.md
index f7b31c919..378ad424a 100644
--- a/docs/advanced_usage.md
+++ b/docs/advanced_usage.md
@@ -179,6 +179,7 @@ variables:
| ---------------------------- | ---------------------------------------------- |
| `DOCUMENT_ID` | Database primary key of the document |
| `DOCUMENT_FILE_NAME` | Formatted filename, not including paths |
+| `DOCUMENT_TYPE` | The document type (if any) |
| `DOCUMENT_CREATED` | Date & time when document created |
| `DOCUMENT_MODIFIED` | Date & time when document was last modified |
| `DOCUMENT_ADDED` | Date & time when document was added |
@@ -433,6 +434,133 @@ provided. The template is provided as a string, potentially multiline, and rende
In addition, the entire Document instance is available to be utilized in a more advanced way, as well as some variables which only make sense to be accessed
with more complex logic.
+#### Custom Jinja2 Filters
+
+##### Custom Field Access
+
+The `get_cf_value` filter retrieves a value from custom field data with optional default fallback.
+
+###### Syntax
+
+```jinja2
+{{ custom_fields | get_cf_value('field_name') }}
+{{ custom_fields | get_cf_value('field_name', 'default_value') }}
+```
+
+###### Parameters
+
+- `custom_fields`: This _must_ be the provided custom field data
+- `name` (str): Name of the custom field to retrieve
+- `default` (str, optional): Default value to return if field is not found or has no value
+
+###### Returns
+
+- `str | None`: The field value, default value, or `None` if neither exists
+
+###### Examples
+
+```jinja2
+
+{{ custom_fields | get_cf_value('department') }}
+
+
+{{ custom_fields | get_cf_value('phone', 'Not provided') }}
+```
+
+##### Datetime Formatting
+
+The `datetime` filter formats a datetime string or datetime object using Python's strftime formatting.
+
+###### Syntax
+
+```jinja2
+{{ datetime_value | datetime('%Y-%m-%d %H:%M:%S') }}
+```
+
+###### Parameters
+
+- `value` (str | datetime): Date/time value to format (strings will be parsed automatically)
+- `format` (str): Python strftime format string
+
+###### Returns
+
+- `str`: Formatted datetime string
+
+###### Examples
+
+```jinja2
+
+{{ created | datetime('%B %d, %Y at %I:%M %p') }}
+
+
+
+{{ custom_fields | get_cf_value('Date Field') | datetime('%A, %B %d, %Y') }}
+
+```
+
+See the [strftime format code documentation](https://docs.python.org/3.13/library/datetime.html#strftime-and-strptime-format-codes)
+for the possible codes and their meanings.
+
+##### Date Localization
+
+The `localize_date` filter formats a date or datetime object into a localized string using Babel internationalization.
+This takes into account the provided locale for translation. Since this must be used on a date or datetime object,
+you must access the field directly, i.e. `document.created`.
+
+###### Syntax
+
+```jinja2
+{{ date_value | localize_date('medium', 'en_US') }}
+{{ datetime_value | localize_date('short', 'fr_FR') }}
+```
+
+###### Parameters
+
+- `value` (date | datetime): Date or datetime object to format (datetime should be timezone-aware)
+- `format` (str): Format type - either a Babel preset ('short', 'medium', 'long', 'full') or custom pattern
+- `locale` (str): Locale code for localization (e.g., 'en_US', 'fr_FR', 'de_DE')
+
+###### Returns
+
+- `str`: Localized, formatted date string
+
+###### Examples
+
+```jinja2
+
+{{ document.created | localize_date('short', 'en_US') }}
+
+
+{{ document.created | localize_date('medium', 'en_US') }}
+
+
+{{ document.created | localize_date('long', 'en_US') }}
+
+
+{{ document.created | localize_date('full', 'en_US') }}
+
+
+
+{{ document.created | localize_date('medium', 'fr_FR') }}
+
+
+{{ document.created | localize_date('medium', 'de_DE') }}
+
+
+
+{{ document.created | localize_date('dd/MM/yyyy', 'en_GB') }}
+
+```
+
+See the [supported format codes](https://unicode.org/reports/tr35/tr35-dates.html#Date_Format_Patterns) for more options.
+
+### Format Presets
+
+- **short**: Abbreviated format (e.g., "1/15/24")
+- **medium**: Medium-length format (e.g., "Jan 15, 2024")
+- **long**: Long format with full month name (e.g., "January 15, 2024")
+- **full**: Full format including day of week (e.g., "Monday, January 15, 2024")
+
#### Additional Variables
- `{{ tag_name_list }}`: A list of tag names applied to the document, ordered by the tag name. Note this is a list, not a single string
@@ -509,6 +637,12 @@ Invoice_{{ custom_fields|get_cf_value("Select Field") }}_{{ custom_fields|get_cf
This will create a path like `invoices/2022/01/01/Invoice_OptionTwo_20220101.pdf` if the custom field "Date Field" is set to January 1, 2022 and "Select Field" is set to `OptionTwo`.
+You can also use a custom `slugify` filter to slufigy text:
+
+```jinja
+{{ title | slugify }}
+```
+
## Automatic recovery of invalid PDFs {#pdf-recovery}
Paperless will attempt to "clean" certain invalid PDFs with `qpdf` before processing if, for example, the mime_type
diff --git a/docs/api.md b/docs/api.md
index 9c28476c4..cd3e462da 100644
--- a/docs/api.md
+++ b/docs/api.md
@@ -132,7 +132,7 @@ use cases:
5. Documents with a custom field "address" (text) that is empty:
- `?custom_field_query=["OR", ["address", "isnull", true], ["address", "exact", ""]]`
+ `?custom_field_query=["OR", [["address", "isnull", true], ["address", "exact", ""]]]`
6. Documents that don't have a field called "foo":
@@ -270,7 +270,7 @@ The following methods are supported:
- `remove_tag`
- Requires `parameters`: `{ "tag": TAG_ID }`
- `modify_tags`
- - Requires `parameters`: `{ "add_tags": [LIST_OF_TAG_IDS] }` and / or `{ "remove_tags": [LIST_OF_TAG_IDS] }`
+ - Requires `parameters`: `{ "add_tags": [LIST_OF_TAG_IDS] }` and `{ "remove_tags": [LIST_OF_TAG_IDS] }`
- `delete`
- No `parameters` required
- `reprocess`
@@ -282,6 +282,18 @@ The following methods are supported:
- `"merge": true or false` (defaults to false)
- The `merge` flag determines if the supplied permissions will overwrite all existing permissions (including
removing them) or be merged with existing permissions.
+- `edit_pdf`
+ - Requires `parameters`:
+ - `"doc_ids": [DOCUMENT_ID]` A list of a single document ID to edit.
+ - `"operations": [OPERATION, ...]` A list of operations to perform on the documents. Each operation is a dictionary
+ with the following keys:
+ - `"page": PAGE_NUMBER` The page number to edit (1-based).
+ - `"rotate": DEGREES` Optional rotation in degrees (90, 180, 270).
+ - `"doc": OUTPUT_DOCUMENT_INDEX` Optional index of the output document for split operations.
+ - Optional `parameters`:
+ - `"delete_original": true` to delete the original documents after editing.
+ - `"update_document": true` to update the existing document with the edited PDF.
+ - `"include_metadata": true` to copy metadata from the original document to the edited document.
- `merge`
- No additional `parameters` required.
- The ordering of the merged document is determined by the list of IDs.
@@ -413,3 +425,14 @@ Initial API version.
list of strings. When creating or updating a custom field value of a
document for a select type custom field, the value should be the `id` of
the option whereas previously was the index of the option.
+
+#### Version 8
+
+- The user field of document notes now returns a simplified user object
+ rather than just the user ID.
+
+#### Version 9
+
+- The document `created` field is now a date, not a datetime. The
+ `created_date` field is considered deprecated and will be removed in a
+ future version.
diff --git a/docs/changelog.md b/docs/changelog.md
index 56316942c..5fd1b5f3f 100644
--- a/docs/changelog.md
+++ b/docs/changelog.md
@@ -1,5 +1,723 @@
# Changelog
+## paperless-ngx 2.18.1
+
+### Features / Enhancements
+
+- Tweak: fix some button consistency [@shamoon](https://github.com/shamoon) ([#10593](https://github.com/paperless-ngx/paperless-ngx/pull/10593))
+- Fixhancement: mobile layout improvements for pdf editor [@shamoon](https://github.com/shamoon) ([#10588](https://github.com/paperless-ngx/paperless-ngx/pull/10588))
+
+### Bug Fixes
+
+- Fix: fix app logo validation with no file [@shamoon](https://github.com/shamoon) ([#10599](https://github.com/paperless-ngx/paperless-ngx/pull/10599))
+
+### Documentation
+
+- Documentation: fix filters docs [@shamoon](https://github.com/shamoon) ([#10600](https://github.com/paperless-ngx/paperless-ngx/pull/10600))
+
+### All App Changes
+
+
+4 changes
+
+- Fix: fix app logo validation with no file [@shamoon](https://github.com/shamoon) ([#10599](https://github.com/paperless-ngx/paperless-ngx/pull/10599))
+- Tweak: fix some button consistency [@shamoon](https://github.com/shamoon) ([#10593](https://github.com/paperless-ngx/paperless-ngx/pull/10593))
+- Development: restore version tag display [@shamoon](https://github.com/shamoon) ([#10592](https://github.com/paperless-ngx/paperless-ngx/pull/10592))
+- Fixhancement: mobile layout improvements for pdf editor [@shamoon](https://github.com/shamoon) ([#10588](https://github.com/paperless-ngx/paperless-ngx/pull/10588))
+
+
+## paperless-ngx 2.18.0
+
+### Notable Changes
+
+- Feature: PDF editor [@shamoon](https://github.com/shamoon) ([#10318](https://github.com/paperless-ngx/paperless-ngx/pull/10318))
+
+### Features / Enhancements
+
+- Feature: Add filter to localize dates for filepath templating [@stumpylog](https://github.com/stumpylog) ([#10559](https://github.com/paperless-ngx/paperless-ngx/pull/10559))
+- Feature: PDF editor [@shamoon](https://github.com/shamoon) ([#10318](https://github.com/paperless-ngx/paperless-ngx/pull/10318))
+- Enhancement: support webhook restrictions [@shamoon](https://github.com/shamoon) ([#10555](https://github.com/paperless-ngx/paperless-ngx/pull/10555))
+- Performance: Classifier performance optimizations [@Merinorus](https://github.com/Merinorus) ([#10363](https://github.com/paperless-ngx/paperless-ngx/pull/10363))
+- Performance: add setting to enable DB connection pooling for PostgreSQL [@Merinorus](https://github.com/Merinorus) ([#10354](https://github.com/paperless-ngx/paperless-ngx/pull/10354))
+- Fixhancement: improve text thumbnail generation for large files [@shamoon](https://github.com/shamoon) ([#10483](https://github.com/paperless-ngx/paperless-ngx/pull/10483))
+- Enhancement: disable auto spellcheck on filtering dropdowns [@TheDodger](https://github.com/TheDodger) ([#10487](https://github.com/paperless-ngx/paperless-ngx/pull/10487))
+- Enhancement: display saved view counts [@shamoon](https://github.com/shamoon) ([#10246](https://github.com/paperless-ngx/paperless-ngx/pull/10246))
+- Fixhancement: add missing exact operator for boolean CF queries [@shamoon](https://github.com/shamoon) ([#10402](https://github.com/paperless-ngx/paperless-ngx/pull/10402))
+- Feature: add Vietnamese translation [@shamoon](https://github.com/shamoon) ([#10352](https://github.com/paperless-ngx/paperless-ngx/pull/10352))
+- Performance: Add support for configuring date parser languages [@Merinorus](https://github.com/Merinorus) ([#10181](https://github.com/paperless-ngx/paperless-ngx/pull/10181))
+- Enhancement: Add a database caching for improved performance [@Merinorus](https://github.com/Merinorus) ([#9784](https://github.com/paperless-ngx/paperless-ngx/pull/9784))
+
+### Bug Fixes
+
+- Fix: include ignore for config logos in sanity checker [@shamoon](https://github.com/shamoon) ([#10473](https://github.com/paperless-ngx/paperless-ngx/pull/10473))
+- Fix: track and restore changed document fields from session storage [@shamoon](https://github.com/shamoon) ([#10468](https://github.com/paperless-ngx/paperless-ngx/pull/10468))
+- Fix: Make some natural keyword date searches timezone-aware [@shamoon](https://github.com/shamoon) ([#10416](https://github.com/paperless-ngx/paperless-ngx/pull/10416))
+- Fixhancement: follow redirects in curl health check [@V0idC0de](https://github.com/V0idC0de) ([#10415](https://github.com/paperless-ngx/paperless-ngx/pull/10415))
+- Fix: dont use translated verbose_name for getting object perms [@shamoon](https://github.com/shamoon) ([#10399](https://github.com/paperless-ngx/paperless-ngx/pull/10399))
+- Fix: fix date format for 'today' in DateComponent [@shamoon](https://github.com/shamoon) ([#10369](https://github.com/paperless-ngx/paperless-ngx/pull/10369))
+- Fix: default to empty permissions for group creation [@shamoon](https://github.com/shamoon) ([#10337](https://github.com/paperless-ngx/paperless-ngx/pull/10337))
+- Fix: correct api created coercion with timezone [@shamoon](https://github.com/shamoon) ([#10287](https://github.com/paperless-ngx/paperless-ngx/pull/10287))
+- Fix: reset search query for preview on reset filter [@shamoon](https://github.com/shamoon) ([#10279](https://github.com/paperless-ngx/paperless-ngx/pull/10279))
+- Chore: reject absurd max age values [@shamoon](https://github.com/shamoon) ([#10243](https://github.com/paperless-ngx/paperless-ngx/pull/10243))
+- Chore: add tasks task_id param to openapi spec [@shamoon](https://github.com/shamoon) ([#10469](https://github.com/paperless-ngx/paperless-ngx/pull/10469))
+- Chore: include advanced search query param in API spec [@shamoon](https://github.com/shamoon) ([#10449](https://github.com/paperless-ngx/paperless-ngx/pull/10449))
+
+### Security
+
+- Address XSS vulnerability GHSA-6p53-hqqw-8j62
+
+### Maintenance
+
+- docker(deps): Bump astral-sh/uv from 0.8.4-python3.12-bookworm-slim to 0.8.8-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#10564](https://github.com/paperless-ngx/paperless-ngx/pull/10564))
+- docker(deps): Bump astral-sh/uv from 0.7.9-python3.12-bookworm-slim to 0.7.19-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#10343](https://github.com/paperless-ngx/paperless-ngx/pull/10343))
+- Chore(deps): Bump the small-changes group across 1 directory with 7 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10347](https://github.com/paperless-ngx/paperless-ngx/pull/10347))
+- Chore(deps-dev): Bump @types/node from 22.15.29 to 24.0.10 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10306](https://github.com/paperless-ngx/paperless-ngx/pull/10306))
+- Chore(deps): Bump the small-changes group across 1 directory with 8 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10481](https://github.com/paperless-ngx/paperless-ngx/pull/10481))
+- docker(deps): bump astral-sh/uv from 0.7.19-python3.12-bookworm-slim to 0.8.3-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#10465](https://github.com/paperless-ngx/paperless-ngx/pull/10465))
+- Chore: switch from os.path to pathlib.Path [@gothicVI](https://github.com/gothicVI) ([#10397](https://github.com/paperless-ngx/paperless-ngx/pull/10397))
+- Chore(deps): Bump the small-changes group with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10528](https://github.com/paperless-ngx/paperless-ngx/pull/10528))
+- Chore(deps): Bump the django group across 1 directory with 9 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10538](https://github.com/paperless-ngx/paperless-ngx/pull/10538))
+- Chore(deps): Bump stefanzweifel/git-auto-commit-action from 5 to 6 in the actions group @[dependabot[bot]](https://github.com/apps/dependabot) ([#10302](https://github.com/paperless-ngx/paperless-ngx/pull/10302))
+
+### Dependencies
+
+
+23 changes
+
+- chore: Small targeted upgrades to dependencies [@stumpylog](https://github.com/stumpylog) ([#10561](https://github.com/paperless-ngx/paperless-ngx/pull/10561))
+- docker(deps): Bump astral-sh/uv from 0.8.4-python3.12-bookworm-slim to 0.8.8-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#10564](https://github.com/paperless-ngx/paperless-ngx/pull/10564))
+- Chore(deps): Bump the django group across 1 directory with 9 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10538](https://github.com/paperless-ngx/paperless-ngx/pull/10538))
+- Chore(deps): Bump the small-changes group with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10528](https://github.com/paperless-ngx/paperless-ngx/pull/10528))
+- Chore(deps-dev): Bump the frontend-jest-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10497](https://github.com/paperless-ngx/paperless-ngx/pull/10497))
+- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10498](https://github.com/paperless-ngx/paperless-ngx/pull/10498))
+- Chore(deps-dev): Bump @playwright/test from 1.53.2 to 1.54.2 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10499](https://github.com/paperless-ngx/paperless-ngx/pull/10499))
+- Chore(deps-dev): Bump webpack from 5.99.9 to 5.101.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10501](https://github.com/paperless-ngx/paperless-ngx/pull/10501))
+- Chore(deps-dev): Bump prettier-plugin-organize-imports from 4.1.0 to 4.2.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10500](https://github.com/paperless-ngx/paperless-ngx/pull/10500))
+- Chore(deps-dev): Bump @types/node from 24.0.10 to 24.1.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10502](https://github.com/paperless-ngx/paperless-ngx/pull/10502))
+- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 16 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10496](https://github.com/paperless-ngx/paperless-ngx/pull/10496))
+- Chore(deps): Bump the small-changes group across 1 directory with 8 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10481](https://github.com/paperless-ngx/paperless-ngx/pull/10481))
+- docker(deps): bump astral-sh/uv from 0.7.19-python3.12-bookworm-slim to 0.8.3-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#10465](https://github.com/paperless-ngx/paperless-ngx/pull/10465))
+- docker(deps): Bump astral-sh/uv from 0.7.9-python3.12-bookworm-slim to 0.7.19-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#10343](https://github.com/paperless-ngx/paperless-ngx/pull/10343))
+- Chore(deps): Bump the small-changes group across 1 directory with 7 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10347](https://github.com/paperless-ngx/paperless-ngx/pull/10347))
+- Chore(deps): Bump stefanzweifel/git-auto-commit-action from 5 to 6 in the actions group @[dependabot[bot]](https://github.com/apps/dependabot) ([#10302](https://github.com/paperless-ngx/paperless-ngx/pull/10302))
+- Chore(deps-dev): Bump the frontend-eslint-dependencies group across 1 directory with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10311](https://github.com/paperless-ngx/paperless-ngx/pull/10311))
+- Chore(deps-dev): Bump @types/node from 22.15.29 to 24.0.10 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10306](https://github.com/paperless-ngx/paperless-ngx/pull/10306))
+- Chore(deps): Bump bootstrap from 5.3.6 to 5.3.7 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10308](https://github.com/paperless-ngx/paperless-ngx/pull/10308))
+- Chore(deps-dev): Bump webpack from 5.98.0 to 5.99.9 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10309](https://github.com/paperless-ngx/paperless-ngx/pull/10309))
+- Chore(deps-dev): Bump @playwright/test from 1.51.1 to 1.53.2 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10307](https://github.com/paperless-ngx/paperless-ngx/pull/10307))
+- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 13 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10303](https://github.com/paperless-ngx/paperless-ngx/pull/10303))
+- Chore: update to Angular 20 [@shamoon](https://github.com/shamoon) ([#10273](https://github.com/paperless-ngx/paperless-ngx/pull/10273))
+
+
+### All App Changes
+
+
+44 changes
+
+- chore: Small targeted upgrades to dependencies [@stumpylog](https://github.com/stumpylog) ([#10561](https://github.com/paperless-ngx/paperless-ngx/pull/10561))
+- Feature: Add filter to localize dates for filepath templating [@stumpylog](https://github.com/stumpylog) ([#10559](https://github.com/paperless-ngx/paperless-ngx/pull/10559))
+- Chore: Removes duplication and spread out config for codespell [@stumpylog](https://github.com/stumpylog) ([#10560](https://github.com/paperless-ngx/paperless-ngx/pull/10560))
+- Chore(deps): Bump the django group across 1 directory with 9 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10538](https://github.com/paperless-ngx/paperless-ngx/pull/10538))
+- Feature: PDF editor [@shamoon](https://github.com/shamoon) ([#10318](https://github.com/paperless-ngx/paperless-ngx/pull/10318))
+- Enhancement: support webhook restrictions [@shamoon](https://github.com/shamoon) ([#10555](https://github.com/paperless-ngx/paperless-ngx/pull/10555))
+- Performance: Classifier performance optimizations [@Merinorus](https://github.com/Merinorus) ([#10363](https://github.com/paperless-ngx/paperless-ngx/pull/10363))
+- Chore: switch from os.path to pathlib.Path [@gothicVI](https://github.com/gothicVI) ([#10397](https://github.com/paperless-ngx/paperless-ngx/pull/10397))
+- Chore(deps): Bump the small-changes group with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10528](https://github.com/paperless-ngx/paperless-ngx/pull/10528))
+- Performance: add setting to enable DB connection pooling for PostgreSQL [@Merinorus](https://github.com/Merinorus) ([#10354](https://github.com/paperless-ngx/paperless-ngx/pull/10354))
+- Chore(deps-dev): Bump the frontend-jest-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10497](https://github.com/paperless-ngx/paperless-ngx/pull/10497))
+- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10498](https://github.com/paperless-ngx/paperless-ngx/pull/10498))
+- Chore(deps-dev): Bump @playwright/test from 1.53.2 to 1.54.2 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10499](https://github.com/paperless-ngx/paperless-ngx/pull/10499))
+- Chore(deps-dev): Bump webpack from 5.99.9 to 5.101.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10501](https://github.com/paperless-ngx/paperless-ngx/pull/10501))
+- Chore(deps-dev): Bump prettier-plugin-organize-imports from 4.1.0 to 4.2.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10500](https://github.com/paperless-ngx/paperless-ngx/pull/10500))
+- Chore(deps-dev): Bump @types/node from 24.0.10 to 24.1.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10502](https://github.com/paperless-ngx/paperless-ngx/pull/10502))
+- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 16 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10496](https://github.com/paperless-ngx/paperless-ngx/pull/10496))
+- Fixhancement: improve text thumbnail generation for large files [@shamoon](https://github.com/shamoon) ([#10483](https://github.com/paperless-ngx/paperless-ngx/pull/10483))
+- Enhancement: disable auto spellcheck on filtering dropdowns [@TheDodger](https://github.com/TheDodger) ([#10487](https://github.com/paperless-ngx/paperless-ngx/pull/10487))
+- Chore(deps): Bump the small-changes group across 1 directory with 8 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10481](https://github.com/paperless-ngx/paperless-ngx/pull/10481))
+- Fix: include ignore for config logos in sanity checker [@shamoon](https://github.com/shamoon) ([#10473](https://github.com/paperless-ngx/paperless-ngx/pull/10473))
+- Chore: add tasks task_id param to openapi spec [@shamoon](https://github.com/shamoon) ([#10469](https://github.com/paperless-ngx/paperless-ngx/pull/10469))
+- Fix: track and restore changed document fields from session storage [@shamoon](https://github.com/shamoon) ([#10468](https://github.com/paperless-ngx/paperless-ngx/pull/10468))
+- Chore: include advanced search query param in API spec [@shamoon](https://github.com/shamoon) ([#10449](https://github.com/paperless-ngx/paperless-ngx/pull/10449))
+- Enhancement: display saved view counts [@shamoon](https://github.com/shamoon) ([#10246](https://github.com/paperless-ngx/paperless-ngx/pull/10246))
+- Fix: Make some natural keyword date searches timezone-aware [@shamoon](https://github.com/shamoon) ([#10416](https://github.com/paperless-ngx/paperless-ngx/pull/10416))
+- Fixhancement: add missing exact operator for boolean CF queries [@shamoon](https://github.com/shamoon) ([#10402](https://github.com/paperless-ngx/paperless-ngx/pull/10402))
+- Fix: dont use translated verbose_name for getting object perms [@shamoon](https://github.com/shamoon) ([#10399](https://github.com/paperless-ngx/paperless-ngx/pull/10399))
+- Fix: fix date format for 'today' in DateComponent [@shamoon](https://github.com/shamoon) ([#10369](https://github.com/paperless-ngx/paperless-ngx/pull/10369))
+- Feature: add Vietnamese translation [@shamoon](https://github.com/shamoon) ([#10352](https://github.com/paperless-ngx/paperless-ngx/pull/10352))
+- Chore(deps): Bump the small-changes group across 1 directory with 7 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10347](https://github.com/paperless-ngx/paperless-ngx/pull/10347))
+- Fix: default to empty permissions for group creation [@shamoon](https://github.com/shamoon) ([#10337](https://github.com/paperless-ngx/paperless-ngx/pull/10337))
+- Chore(deps-dev): Bump the frontend-eslint-dependencies group across 1 directory with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10311](https://github.com/paperless-ngx/paperless-ngx/pull/10311))
+- Chore(deps-dev): Bump @types/node from 22.15.29 to 24.0.10 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10306](https://github.com/paperless-ngx/paperless-ngx/pull/10306))
+- Chore(deps): Bump bootstrap from 5.3.6 to 5.3.7 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10308](https://github.com/paperless-ngx/paperless-ngx/pull/10308))
+- Chore(deps-dev): Bump webpack from 5.98.0 to 5.99.9 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10309](https://github.com/paperless-ngx/paperless-ngx/pull/10309))
+- Chore(deps-dev): Bump @playwright/test from 1.51.1 to 1.53.2 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10307](https://github.com/paperless-ngx/paperless-ngx/pull/10307))
+- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 13 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10303](https://github.com/paperless-ngx/paperless-ngx/pull/10303))
+- Performance: Add support for configuring date parser languages [@Merinorus](https://github.com/Merinorus) ([#10181](https://github.com/paperless-ngx/paperless-ngx/pull/10181))
+- Enhancement: Add a database caching for improved performance [@Merinorus](https://github.com/Merinorus) ([#9784](https://github.com/paperless-ngx/paperless-ngx/pull/9784))
+- Fix: correct api created coercion with timezone [@shamoon](https://github.com/shamoon) ([#10287](https://github.com/paperless-ngx/paperless-ngx/pull/10287))
+- Fix: reset search query for preview on reset filter [@shamoon](https://github.com/shamoon) ([#10279](https://github.com/paperless-ngx/paperless-ngx/pull/10279))
+- Chore: update to Angular 20 [@shamoon](https://github.com/shamoon) ([#10273](https://github.com/paperless-ngx/paperless-ngx/pull/10273))
+- Chore: reject absurd max age values [@shamoon](https://github.com/shamoon) ([#10243](https://github.com/paperless-ngx/paperless-ngx/pull/10243))
+
+
+## paperless-ngx 2.17.1
+
+### Bug Fixes
+
+- Fix: correct PAPERLESS_EMPTY_TRASH_DIR to Path [@shamoon](https://github.com/shamoon) ([#10227](https://github.com/paperless-ngx/paperless-ngx/pull/10227))
+
+### All App Changes
+
+- Fix: correct PAPERLESS_EMPTY_TRASH_DIR to Path [@shamoon](https://github.com/shamoon) ([#10227](https://github.com/paperless-ngx/paperless-ngx/pull/10227))
+
+## paperless-ngx 2.17.0
+
+### Breaking Changes
+
+- Fix: restore expected pre-2.16 scheduled workflow offset behavior [@shamoon](https://github.com/shamoon) ([#10218](https://github.com/paperless-ngx/paperless-ngx/pull/10218))
+
+### Features / Enhancements
+
+- QoL: log version at startup, show backend vs frontend mismatch in system status [@shamoon](https://github.com/shamoon) ([#10214](https://github.com/paperless-ngx/paperless-ngx/pull/10214))
+- Feature: add Persian translation [@shamoon](https://github.com/shamoon) ([#10183](https://github.com/paperless-ngx/paperless-ngx/pull/10183))
+- Enhancement: support import of zipped export [@kaerbr](https://github.com/kaerbr) ([#10073](https://github.com/paperless-ngx/paperless-ngx/pull/10073))
+
+### Bug Fixes
+
+- Fix: more api fixes [@shamoon](https://github.com/shamoon) ([#10204](https://github.com/paperless-ngx/paperless-ngx/pull/10204))
+- Fix: restore expected pre-2.16 scheduled workflow offset behavior [@shamoon](https://github.com/shamoon) ([#10218](https://github.com/paperless-ngx/paperless-ngx/pull/10218))
+- Fix: fix some API crashes [@shamoon](https://github.com/shamoon) ([#10196](https://github.com/paperless-ngx/paperless-ngx/pull/10196))
+- Fix: remove duplicate base path in websocket urls [@robertmx](https://github.com/robertmx) ([#10194](https://github.com/paperless-ngx/paperless-ngx/pull/10194))
+- Fix: use hard delete for custom fields with workflow removal [@shamoon](https://github.com/shamoon) ([#10191](https://github.com/paperless-ngx/paperless-ngx/pull/10191))
+- Fix: fix mail account test api schema [@shamoon](https://github.com/shamoon) ([#10164](https://github.com/paperless-ngx/paperless-ngx/pull/10164))
+- Fix: correct api schema for mail_account process [@shamoon](https://github.com/shamoon) ([#10157](https://github.com/paperless-ngx/paperless-ngx/pull/10157))
+- Fix: correct api schema for next_asn [@shamoon](https://github.com/shamoon) ([#10151](https://github.com/paperless-ngx/paperless-ngx/pull/10151))
+- Fix: fix email and notes endpoints api spec [@shamoon](https://github.com/shamoon) ([#10148](https://github.com/paperless-ngx/paperless-ngx/pull/10148))
+
+### Dependencies
+
+- Chore: bump angular/common to 19.12.14 [@shamoon](https://github.com/shamoon) ([#10212](https://github.com/paperless-ngx/paperless-ngx/pull/10212))
+
+### All App Changes
+
+
+14 changes
+
+- QoL: log version at startup, show backend vs frontend mismatch in system status [@shamoon](https://github.com/shamoon) ([#10214](https://github.com/paperless-ngx/paperless-ngx/pull/10214))
+- Fix: more api fixes [@shamoon](https://github.com/shamoon) ([#10204](https://github.com/paperless-ngx/paperless-ngx/pull/10204))
+- Fix: restore expected pre-2.16 scheduled workflow offset behavior [@shamoon](https://github.com/shamoon) ([#10218](https://github.com/paperless-ngx/paperless-ngx/pull/10218))
+- Chore: switch from os.path to pathlib.Path [@gothicVI](https://github.com/gothicVI) ([#9933](https://github.com/paperless-ngx/paperless-ngx/pull/9933))
+- Chore: bump angular/common to 19.12.14 [@shamoon](https://github.com/shamoon) ([#10212](https://github.com/paperless-ngx/paperless-ngx/pull/10212))
+- Fix: fix some API crashes [@shamoon](https://github.com/shamoon) ([#10196](https://github.com/paperless-ngx/paperless-ngx/pull/10196))
+- Fix: remove duplicate base path in websocket urls [@robertmx](https://github.com/robertmx) ([#10194](https://github.com/paperless-ngx/paperless-ngx/pull/10194))
+- Fix: use hard delete for custom fields with workflow removal [@shamoon](https://github.com/shamoon) ([#10191](https://github.com/paperless-ngx/paperless-ngx/pull/10191))
+- Feature: add Persian translation [@shamoon](https://github.com/shamoon) ([#10183](https://github.com/paperless-ngx/paperless-ngx/pull/10183))
+- Enhancement: support import of zipped export [@kaerbr](https://github.com/kaerbr) ([#10073](https://github.com/paperless-ngx/paperless-ngx/pull/10073))
+- Fix: fix mail account test api schema [@shamoon](https://github.com/shamoon) ([#10164](https://github.com/paperless-ngx/paperless-ngx/pull/10164))
+- Fix: correct api schema for mail_account process [@shamoon](https://github.com/shamoon) ([#10157](https://github.com/paperless-ngx/paperless-ngx/pull/10157))
+- Fix: correct api schema for next_asn [@shamoon](https://github.com/shamoon) ([#10151](https://github.com/paperless-ngx/paperless-ngx/pull/10151))
+- Fix: fix email and notes endpoints api spec [@shamoon](https://github.com/shamoon) ([#10148](https://github.com/paperless-ngx/paperless-ngx/pull/10148))
+
+
+## paperless-ngx 2.16.3
+
+### Features / Enhancements
+
+- Performance: pre-filter document list in scheduled workflow checks [@shamoon](https://github.com/shamoon) ([#10031](https://github.com/paperless-ngx/paperless-ngx/pull/10031))
+- Chore: refactor consumer plugin checks to a pre-flight plugin [@shamoon](https://github.com/shamoon) ([#9994](https://github.com/paperless-ngx/paperless-ngx/pull/9994))
+- Enhancement: include DOCUMENT_TYPE to post consume scripts [@matthesrieke](https://github.com/matthesrieke) ([#9977](https://github.com/paperless-ngx/paperless-ngx/pull/9977))
+
+### Bug Fixes
+
+- Fix: handle whoosh query correction errors [@shamoon](https://github.com/shamoon) ([#10121](https://github.com/paperless-ngx/paperless-ngx/pull/10121))
+- Fix: handle favicon with non-default static dir [@shamoon](https://github.com/shamoon) ([#10107](https://github.com/paperless-ngx/paperless-ngx/pull/10107))
+- Fixhancement: cleanup user or group references in settings upon deletion [@shamoon](https://github.com/shamoon) ([#10049](https://github.com/paperless-ngx/paperless-ngx/pull/10049))
+- Fix: Add exception to in [@Freilichtbuehne](https://github.com/Freilichtbuehne) ([#10070](https://github.com/paperless-ngx/paperless-ngx/pull/10070))
+- Fix: include base href when opening global search result in new window [@shamoon](https://github.com/shamoon) ([#10066](https://github.com/paperless-ngx/paperless-ngx/pull/10066))
+
+### Dependencies
+
+
+10 changes
+
+- Chore(deps): Bump the small-changes group across 1 directory with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10085](https://github.com/paperless-ngx/paperless-ngx/pull/10085))
+- Chore(deps): Update granian[uvloop] requirement from ~=2.2.0 to ~=2.3.2 @[dependabot[bot]](https://github.com/apps/dependabot) ([#10055](https://github.com/paperless-ngx/paperless-ngx/pull/10055))
+- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 18 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10099](https://github.com/paperless-ngx/paperless-ngx/pull/10099))
+- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10100](https://github.com/paperless-ngx/paperless-ngx/pull/10100))
+- Chore(deps): Bump bootstrap from 5.3.3 to 5.3.6 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10091](https://github.com/paperless-ngx/paperless-ngx/pull/10091))
+- Chore(deps-dev): Bump @codecov/webpack-plugin from 1.9.0 to 1.9.1 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10090](https://github.com/paperless-ngx/paperless-ngx/pull/10090))
+- Chore(deps-dev): Bump @types/node from 22.15.3 to 22.15.29 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10089](https://github.com/paperless-ngx/paperless-ngx/pull/10089))
+- Chore(deps): Bump zone.js from 0.15.0 to 0.15.1 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10088](https://github.com/paperless-ngx/paperless-ngx/pull/10088))
+- docker(deps): bump astral-sh/uv from 0.7.8-python3.12-bookworm-slim to 0.7.9-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#10084](https://github.com/paperless-ngx/paperless-ngx/pull/10084))
+- docker(deps): Bump astral-sh/uv from 0.6.16-python3.12-bookworm-slim to 0.7.8-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#10056](https://github.com/paperless-ngx/paperless-ngx/pull/10056))
+
+
+### All App Changes
+
+
+16 changes
+
+- Fix: handle whoosh query correction errors [@shamoon](https://github.com/shamoon) ([#10121](https://github.com/paperless-ngx/paperless-ngx/pull/10121))
+- Performance: pre-filter document list in scheduled workflow checks [@shamoon](https://github.com/shamoon) ([#10031](https://github.com/paperless-ngx/paperless-ngx/pull/10031))
+- Chore(deps): Bump the small-changes group across 1 directory with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10085](https://github.com/paperless-ngx/paperless-ngx/pull/10085))
+- Chore: refactor consumer plugin checks to a pre-flight plugin [@shamoon](https://github.com/shamoon) ([#9994](https://github.com/paperless-ngx/paperless-ngx/pull/9994))
+- Chore(deps): Update granian[uvloop] requirement from ~=2.2.0 to ~=2.3.2 @[dependabot[bot]](https://github.com/apps/dependabot) ([#10055](https://github.com/paperless-ngx/paperless-ngx/pull/10055))
+- Fix: handle favicon with non-default static dir [@shamoon](https://github.com/shamoon) ([#10107](https://github.com/paperless-ngx/paperless-ngx/pull/10107))
+- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 18 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10099](https://github.com/paperless-ngx/paperless-ngx/pull/10099))
+- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10100](https://github.com/paperless-ngx/paperless-ngx/pull/10100))
+- Chore(deps): Bump bootstrap from 5.3.3 to 5.3.6 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10091](https://github.com/paperless-ngx/paperless-ngx/pull/10091))
+- Chore(deps-dev): Bump @codecov/webpack-plugin from 1.9.0 to 1.9.1 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10090](https://github.com/paperless-ngx/paperless-ngx/pull/10090))
+- Chore(deps-dev): Bump @types/node from 22.15.3 to 22.15.29 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10089](https://github.com/paperless-ngx/paperless-ngx/pull/10089))
+- Chore(deps): Bump zone.js from 0.15.0 to 0.15.1 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10088](https://github.com/paperless-ngx/paperless-ngx/pull/10088))
+- Fixhancement: cleanup user or group references in settings upon deletion [@shamoon](https://github.com/shamoon) ([#10049](https://github.com/paperless-ngx/paperless-ngx/pull/10049))
+- Enhancement: include DOCUMENT_TYPE to post consume scripts [@matthesrieke](https://github.com/matthesrieke) ([#9977](https://github.com/paperless-ngx/paperless-ngx/pull/9977))
+- Fix: Add exception to in [@Freilichtbuehne](https://github.com/Freilichtbuehne) ([#10070](https://github.com/paperless-ngx/paperless-ngx/pull/10070))
+- Fix: include base href when opening global search result in new window [@shamoon](https://github.com/shamoon) ([#10066](https://github.com/paperless-ngx/paperless-ngx/pull/10066))
+
+
+## paperless-ngx 2.16.2
+
+### Bug Fixes
+
+- Fix: accept datetime for created [@shamoon](https://github.com/shamoon) ([#10021](https://github.com/paperless-ngx/paperless-ngx/pull/10021))
+- Fix: created date fixes in v2.16 [@shamoon](https://github.com/shamoon) ([#10026](https://github.com/paperless-ngx/paperless-ngx/pull/10026))
+- Fix: mark fields for created objects as dirty [@shamoon](https://github.com/shamoon) ([#10022](https://github.com/paperless-ngx/paperless-ngx/pull/10022))
+- Fix: add fallback to copyfile on PermissionError @samuel-kosmann ([#10023](https://github.com/paperless-ngx/paperless-ngx/pull/10023))
+
+### Dependencies
+
+- Chore: warn users about removal of postgres v13 support [@shamoon](https://github.com/shamoon) ([#9980](https://github.com/paperless-ngx/paperless-ngx/pull/9980))
+
+### All App Changes
+
+
+5 changes
+
+- Fix: accept datetime for created [@shamoon](https://github.com/shamoon) ([#10021](https://github.com/paperless-ngx/paperless-ngx/pull/10021))
+- Fix: add fallback to copyfile on PermissionError @samuel-kosmann ([#10023](https://github.com/paperless-ngx/paperless-ngx/pull/10023))
+- Fix: created date fixes in v2.16 [@shamoon](https://github.com/shamoon) ([#10026](https://github.com/paperless-ngx/paperless-ngx/pull/10026))
+- Fix: mark fields for created objects as dirty [@shamoon](https://github.com/shamoon) ([#10022](https://github.com/paperless-ngx/paperless-ngx/pull/10022))
+- Chore: warn users about removal of postgres v13 support [@shamoon](https://github.com/shamoon) ([#9980](https://github.com/paperless-ngx/paperless-ngx/pull/9980))
+
+
+## paperless-ngx 2.16.1
+
+### Bug Fixes
+
+- Fix: fix created date filtering broken in 2.16.0 [@shamoon](https://github.com/shamoon) ([#9976](https://github.com/paperless-ngx/paperless-ngx/pull/9976))
+
+### All App Changes
+
+- Fix: fix created date filtering broken in 2.16.0 [@shamoon](https://github.com/shamoon) ([#9976](https://github.com/paperless-ngx/paperless-ngx/pull/9976))
+
+## paperless-ngx 2.16.0
+
+### Breaking Changes
+
+- [BREAKING] Change: treat created as date not datetime [@shamoon](https://github.com/shamoon) ([#9793](https://github.com/paperless-ngx/paperless-ngx/pull/9793))
+
+### Features
+
+- Enhancement: support negative offset in scheduled workflows [@shamoon](https://github.com/shamoon) ([#9746](https://github.com/paperless-ngx/paperless-ngx/pull/9746))
+- Enhancement: support heic images [@shamoon](https://github.com/shamoon) ([#9771](https://github.com/paperless-ngx/paperless-ngx/pull/9771))
+- Enhancement: use patch instead of put for frontend document changes [@shamoon](https://github.com/shamoon) ([#9744](https://github.com/paperless-ngx/paperless-ngx/pull/9744))
+- Fixhancement: automatically disable email verification if no smtp setup [@shamoon](https://github.com/shamoon) ([#9949](https://github.com/paperless-ngx/paperless-ngx/pull/9949))
+- Fixhancement: better handle removed social apps in profile [@shamoon](https://github.com/shamoon) ([#9876](https://github.com/paperless-ngx/paperless-ngx/pull/9876))
+- Enhancement: add barcode frontend config [@shamoon](https://github.com/shamoon) ([#9742](https://github.com/paperless-ngx/paperless-ngx/pull/9742))
+- Enhancement: support allauth disable unknown account emails [@shamoon](https://github.com/shamoon) ([#9743](https://github.com/paperless-ngx/paperless-ngx/pull/9743))
+- Fixhancement: tag plus button should add tag to doc [@shamoon](https://github.com/shamoon) ([#9762](https://github.com/paperless-ngx/paperless-ngx/pull/9762))
+- Fixhancement: check more permissions for status consumer messages [@shamoon](https://github.com/shamoon) ([#9804](https://github.com/paperless-ngx/paperless-ngx/pull/9804))
+
+### Bug Fixes
+
+- Fix: include subpath in drf-spectacular settings if set [@shamoon](https://github.com/shamoon) ([#9738](https://github.com/paperless-ngx/paperless-ngx/pull/9738))
+- Fix: handle created change with api version increment, use created only on frontend, deprecate created_date [@shamoon](https://github.com/shamoon) ([#9962](https://github.com/paperless-ngx/paperless-ngx/pull/9962))
+- Fix: ignore logo file from sanity checker [@shamoon](https://github.com/shamoon) ([#9946](https://github.com/paperless-ngx/paperless-ngx/pull/9946))
+- Fix: correctly handle empty user for old notes api format, fix frontend API version [@shamoon](https://github.com/shamoon) ([#9846](https://github.com/paperless-ngx/paperless-ngx/pull/9846))
+- Fix: fix single select in filterable dropdowns when editing [@shamoon](https://github.com/shamoon) ([#9834](https://github.com/paperless-ngx/paperless-ngx/pull/9834))
+- Fix: always update classifier task result [@shamoon](https://github.com/shamoon) ([#9817](https://github.com/paperless-ngx/paperless-ngx/pull/9817))
+- Fix: fix zoom increase/decrease buttons in FF [@shamoon](https://github.com/shamoon) ([#9761](https://github.com/paperless-ngx/paperless-ngx/pull/9761))
+
+### Maintenance
+
+- Chore(deps): Bump astral-sh/setup-uv from 5 to 6 in the actions group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9842](https://github.com/paperless-ngx/paperless-ngx/pull/9842))
+- Chore: split ci frontend e2e vs unit tests [@shamoon](https://github.com/shamoon) ([#9851](https://github.com/paperless-ngx/paperless-ngx/pull/9851))
+- Chore: auto-generate translation strings [@shamoon](https://github.com/shamoon) ([#9462](https://github.com/paperless-ngx/paperless-ngx/pull/9462))
+- Chore: add ymlfmt [@shamoon](https://github.com/shamoon) ([#9745](https://github.com/paperless-ngx/paperless-ngx/pull/9745))
+- Chore: replace secretary with GHA [@shamoon](https://github.com/shamoon) ([#9723](https://github.com/paperless-ngx/paperless-ngx/pull/9723))
+- Chore: resolve dynamic import warnings from pdfjs, again [@shamoon](https://github.com/shamoon) ([#9924](https://github.com/paperless-ngx/paperless-ngx/pull/9924))
+- Fix/Chore: replace file drop package [@shamoon](https://github.com/shamoon) ([#9926](https://github.com/paperless-ngx/paperless-ngx/pull/9926))
+
+### Dependencies
+
+
+14 changes
+
+- Chore(deps): Bump the small-changes group across 1 directory with 6 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9921](https://github.com/paperless-ngx/paperless-ngx/pull/9921))
+- docker-compose(deps): Bump library/redis from 7 to 8 in /docker/compose @[dependabot[bot]](https://github.com/apps/dependabot) ([#9879](https://github.com/paperless-ngx/paperless-ngx/pull/9879))
+- Chore(deps): Bump astral-sh/setup-uv from 5 to 6 in the actions group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9842](https://github.com/paperless-ngx/paperless-ngx/pull/9842))
+- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 14 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9848](https://github.com/paperless-ngx/paperless-ngx/pull/9848))
+- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9849](https://github.com/paperless-ngx/paperless-ngx/pull/9849))
+- Chore(deps-dev): Bump @types/node from 22.13.17 to 22.15.3 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9850](https://github.com/paperless-ngx/paperless-ngx/pull/9850))
+- docker(deps): Bump astral-sh/uv from 0.6.14-python3.12-bookworm-slim to 0.6.16-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#9767](https://github.com/paperless-ngx/paperless-ngx/pull/9767))
+- docker-compose(deps): bump gotenberg/gotenberg from 8.19 to 8.20 in /docker/compose @[dependabot[bot]](https://github.com/apps/dependabot) ([#9661](https://github.com/paperless-ngx/paperless-ngx/pull/9661))
+- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 17 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9768](https://github.com/paperless-ngx/paperless-ngx/pull/9768))
+- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9770](https://github.com/paperless-ngx/paperless-ngx/pull/9770))
+- Chore(deps-dev): Bump jest-preset-angular from 14.5.4 to 14.5.5 in /src-ui in the frontend-jest-dependencies group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9769](https://github.com/paperless-ngx/paperless-ngx/pull/9769))
+- Chore(deps): Bump the small-changes group across 1 directory with 6 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9764](https://github.com/paperless-ngx/paperless-ngx/pull/9764))
+- Chore(deps): Bump the django group across 1 directory with 6 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9753](https://github.com/paperless-ngx/paperless-ngx/pull/9753))
+- docker(deps): bump astral-sh/uv from 0.6.13-python3.12-bookworm-slim to 0.6.14-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#9656](https://github.com/paperless-ngx/paperless-ngx/pull/9656))
+
+
+### All App Changes
+
+
+29 changes
+
+- Chore(deps): Bump the small-changes group across 1 directory with 6 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9921](https://github.com/paperless-ngx/paperless-ngx/pull/9921))
+- Fix: handle created change with api version increment, use created only on frontend, deprecate created_date [@shamoon](https://github.com/shamoon) ([#9962](https://github.com/paperless-ngx/paperless-ngx/pull/9962))
+- Fixhancement: automatically disable email verification if no smtp setup [@shamoon](https://github.com/shamoon) ([#9949](https://github.com/paperless-ngx/paperless-ngx/pull/9949))
+- Fix: ignore logo file from sanity checker [@shamoon](https://github.com/shamoon) ([#9946](https://github.com/paperless-ngx/paperless-ngx/pull/9946))
+- [BREAKING] Change: treat created as date not datetime [@shamoon](https://github.com/shamoon) ([#9793](https://github.com/paperless-ngx/paperless-ngx/pull/9793))
+- Fix/Chore: replace file drop package [@shamoon](https://github.com/shamoon) ([#9926](https://github.com/paperless-ngx/paperless-ngx/pull/9926))
+- Chore: resolve dynamic import warnings from pdfjs, again [@shamoon](https://github.com/shamoon) ([#9924](https://github.com/paperless-ngx/paperless-ngx/pull/9924))
+- Enhancement: support negative offset in scheduled workflows [@shamoon](https://github.com/shamoon) ([#9746](https://github.com/paperless-ngx/paperless-ngx/pull/9746))
+- Fixhancement: better handle removed social apps in profile [@shamoon](https://github.com/shamoon) ([#9876](https://github.com/paperless-ngx/paperless-ngx/pull/9876))
+- Enhancement: add barcode frontend config [@shamoon](https://github.com/shamoon) ([#9742](https://github.com/paperless-ngx/paperless-ngx/pull/9742))
+- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 14 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9848](https://github.com/paperless-ngx/paperless-ngx/pull/9848))
+- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9849](https://github.com/paperless-ngx/paperless-ngx/pull/9849))
+- Chore(deps-dev): Bump @types/node from 22.13.17 to 22.15.3 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9850](https://github.com/paperless-ngx/paperless-ngx/pull/9850))
+- Fix: correctly handle empty user for old notes api format, fix frontend API version [@shamoon](https://github.com/shamoon) ([#9846](https://github.com/paperless-ngx/paperless-ngx/pull/9846))
+- Fix: fix single select in filterable dropdowns when editing [@shamoon](https://github.com/shamoon) ([#9834](https://github.com/paperless-ngx/paperless-ngx/pull/9834))
+- Fix: always update classifier task result [@shamoon](https://github.com/shamoon) ([#9817](https://github.com/paperless-ngx/paperless-ngx/pull/9817))
+- Fixhancement: check more permissions for status consumer messages [@shamoon](https://github.com/shamoon) ([#9804](https://github.com/paperless-ngx/paperless-ngx/pull/9804))
+- Enhancement: support heic images [@shamoon](https://github.com/shamoon) ([#9771](https://github.com/paperless-ngx/paperless-ngx/pull/9771))
+- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 17 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9768](https://github.com/paperless-ngx/paperless-ngx/pull/9768))
+- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9770](https://github.com/paperless-ngx/paperless-ngx/pull/9770))
+- Chore(deps-dev): Bump jest-preset-angular from 14.5.4 to 14.5.5 in /src-ui in the frontend-jest-dependencies group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9769](https://github.com/paperless-ngx/paperless-ngx/pull/9769))
+- Enhancement: support allauth disable unknown account emails [@shamoon](https://github.com/shamoon) ([#9743](https://github.com/paperless-ngx/paperless-ngx/pull/9743))
+- Enhancement: use patch instead of put for frontend document changes [@shamoon](https://github.com/shamoon) ([#9744](https://github.com/paperless-ngx/paperless-ngx/pull/9744))
+- Chore(deps): Bump the small-changes group across 1 directory with 6 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9764](https://github.com/paperless-ngx/paperless-ngx/pull/9764))
+- Chore(deps): Bump the django group across 1 directory with 6 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9753](https://github.com/paperless-ngx/paperless-ngx/pull/9753))
+- Fixhancement: tag plus button should add tag to doc [@shamoon](https://github.com/shamoon) ([#9762](https://github.com/paperless-ngx/paperless-ngx/pull/9762))
+- Fix: fix zoom increase/decrease buttons in FF [@shamoon](https://github.com/shamoon) ([#9761](https://github.com/paperless-ngx/paperless-ngx/pull/9761))
+- Chore: switch from os.path to pathlib.Path [@gothicVI](https://github.com/gothicVI) ([#9339](https://github.com/paperless-ngx/paperless-ngx/pull/9339))
+- Fix: include subpath in drf-spectacular settings if set [@shamoon](https://github.com/shamoon) ([#9738](https://github.com/paperless-ngx/paperless-ngx/pull/9738))
+
+
+## paperless-ngx 2.15.3
+
+### Bug Fixes
+
+- Fix: do not try deleting original file that was moved to trash dir [@shamoon](https://github.com/shamoon) ([#9684](https://github.com/paperless-ngx/paperless-ngx/pull/9684))
+- Fix: preserve non-ASCII filenames in document downloads [@shamoon](https://github.com/shamoon) ([#9702](https://github.com/paperless-ngx/paperless-ngx/pull/9702))
+- Fix: fix breaking api change to document notes user field [@shamoon](https://github.com/shamoon) ([#9714](https://github.com/paperless-ngx/paperless-ngx/pull/9714))
+- Fix: another doc link fix [@shamoon](https://github.com/shamoon) ([#9700](https://github.com/paperless-ngx/paperless-ngx/pull/9700))
+- Fix: correctly handle dict data with webhook [@shamoon](https://github.com/shamoon) ([#9674](https://github.com/paperless-ngx/paperless-ngx/pull/9674))
+
+### All App Changes
+
+
+5 changes
+
+- Fix: do not try deleting original file that was moved to trash dir [@shamoon](https://github.com/shamoon) ([#9684](https://github.com/paperless-ngx/paperless-ngx/pull/9684))
+- Fix: preserve non-ASCII filenames in document downloads [@shamoon](https://github.com/shamoon) ([#9702](https://github.com/paperless-ngx/paperless-ngx/pull/9702))
+- Fix: fix breaking api change to document notes user field [@shamoon](https://github.com/shamoon) ([#9714](https://github.com/paperless-ngx/paperless-ngx/pull/9714))
+- Fix: another doc link fix [@shamoon](https://github.com/shamoon) ([#9700](https://github.com/paperless-ngx/paperless-ngx/pull/9700))
+- Fix: correctly handle dict data with webhook [@shamoon](https://github.com/shamoon) ([#9674](https://github.com/paperless-ngx/paperless-ngx/pull/9674))
+
+
+## paperless-ngx 2.15.2
+
+### Bug Fixes
+
+- Fix: Adds better handling during folder checking/creation/permissions for non-root [@stumpylog](https://github.com/stumpylog) ([#9616](https://github.com/paperless-ngx/paperless-ngx/pull/9616))
+- Fix: Explicitly set the HOME environment to resolve issues running as root with database certificates [@stumpylog](https://github.com/stumpylog) ([#9643](https://github.com/paperless-ngx/paperless-ngx/pull/9643))
+- Fix: prevent self-linking when bulk edit doc link [@shamoon](https://github.com/shamoon) ([#9629](https://github.com/paperless-ngx/paperless-ngx/pull/9629))
+
+### Dependencies
+
+- Chore: Bump celery to 5.5.1 [@hannesortmeier](https://github.com/hannesortmeier) ([#9642](https://github.com/paperless-ngx/paperless-ngx/pull/9642))
+
+### All App Changes
+
+
+4 changes
+
+- Tweak: consistently use created date when displaying doc in list [@shamoon](https://github.com/shamoon) ([#9651](https://github.com/paperless-ngx/paperless-ngx/pull/9651))
+- Fix: Adds better handling during folder checking/creation/permissions for non-root [@stumpylog](https://github.com/stumpylog) ([#9616](https://github.com/paperless-ngx/paperless-ngx/pull/9616))
+- Fix: Explicitly set the HOME environment to resolve issues running as root with database certificates [@stumpylog](https://github.com/stumpylog) ([#9643](https://github.com/paperless-ngx/paperless-ngx/pull/9643))
+- Fix: prevent self-linking when bulk edit doc link [@shamoon](https://github.com/shamoon) ([#9629](https://github.com/paperless-ngx/paperless-ngx/pull/9629))
+
+
+## paperless-ngx 2.15.1
+
+### Bug Fixes
+
+- Fix: Run migration lock as the correct user [@stumpylog](https://github.com/stumpylog) ([#9604](https://github.com/paperless-ngx/paperless-ngx/pull/9604))
+- Fix: Adds a warning to the user if their secret file includes a trailing newline [@stumpylog](https://github.com/stumpylog) ([#9601](https://github.com/paperless-ngx/paperless-ngx/pull/9601))
+- Fix: correct download filename in 2.15.0 [@shamoon](https://github.com/shamoon) ([#9599](https://github.com/paperless-ngx/paperless-ngx/pull/9599))
+- Fix: dont exclude matching check for scheduled workflows [@shamoon](https://github.com/shamoon) ([#9594](https://github.com/paperless-ngx/paperless-ngx/pull/9594))
+
+### Maintenance
+
+- docker(deps): Bump astral-sh/uv from 0.6.9-python3.12-bookworm-slim to 0.6.13-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#9573](https://github.com/paperless-ngx/paperless-ngx/pull/9573))
+
+### Dependencies
+
+- docker(deps): Bump astral-sh/uv from 0.6.9-python3.12-bookworm-slim to 0.6.13-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#9573](https://github.com/paperless-ngx/paperless-ngx/pull/9573))
+- Chore: move to whoosh-reloaded, for now [@shamoon](https://github.com/shamoon) ([#9605](https://github.com/paperless-ngx/paperless-ngx/pull/9605))
+
+### All App Changes
+
+
+4 changes
+
+- Fix: Run migration lock as the correct user [@stumpylog](https://github.com/stumpylog) ([#9604](https://github.com/paperless-ngx/paperless-ngx/pull/9604))
+- Fix: Adds a warning to the user if their secret file includes a trailing newline [@stumpylog](https://github.com/stumpylog) ([#9601](https://github.com/paperless-ngx/paperless-ngx/pull/9601))
+- Fix: correct download filename in 2.15.0 [@shamoon](https://github.com/shamoon) ([#9599](https://github.com/paperless-ngx/paperless-ngx/pull/9599))
+- Fix: dont exclude matching check for scheduled workflows [@shamoon](https://github.com/shamoon) ([#9594](https://github.com/paperless-ngx/paperless-ngx/pull/9594))
+
+
+## paperless-ngx 2.15.0
+
+### Features
+
+- Enhancement: allow webUI first account signup [@shamoon](https://github.com/shamoon) ([#9500](https://github.com/paperless-ngx/paperless-ngx/pull/9500))
+- Enhancement: support more 'not assigned' filtering, refactor [@shamoon](https://github.com/shamoon) ([#9429](https://github.com/paperless-ngx/paperless-ngx/pull/9429))
+- Enhancement: reorganize dates dropdown, add more relative options [@shamoon](https://github.com/shamoon) ([#9307](https://github.com/paperless-ngx/paperless-ngx/pull/9307))
+- Enhancement: add switch to allow merging non-PDFs with archive version [@shamoon](https://github.com/shamoon) ([#9305](https://github.com/paperless-ngx/paperless-ngx/pull/9305))
+- Enhancement: support assigning custom field values in workflows [@shamoon](https://github.com/shamoon) ([#9272](https://github.com/paperless-ngx/paperless-ngx/pull/9272))
+- Enhancement: Add slugify filter in templating [@hwaterke](https://github.com/hwaterke) ([#9269](https://github.com/paperless-ngx/paperless-ngx/pull/9269))
+- Feature: Switch webserver to granian [@stumpylog](https://github.com/stumpylog) ([#9218](https://github.com/paperless-ngx/paperless-ngx/pull/9218))
+- Enhancement: relocate and smaller upload widget, dont limit upload list [@shamoon](https://github.com/shamoon) ([#9244](https://github.com/paperless-ngx/paperless-ngx/pull/9244))
+- Enhancement: run tasks from system status, report sanity check, simpler classifier check, styling updates [@shamoon](https://github.com/shamoon) ([#9106](https://github.com/paperless-ngx/paperless-ngx/pull/9106))
+- Enhancement: include celery log in logs view [@shamoon](https://github.com/shamoon) ([#9214](https://github.com/paperless-ngx/paperless-ngx/pull/9214))
+- Enhancement: support default groups for regular and social account signup, syncing on login [@shamoon](https://github.com/shamoon) ([#9039](https://github.com/paperless-ngx/paperless-ngx/pull/9039))
+- Enhancement: allow disabling the filesystem consumer [@shamoon](https://github.com/shamoon) ([#9199](https://github.com/paperless-ngx/paperless-ngx/pull/9199))
+- Feature: email document [@shamoon](https://github.com/shamoon) ([#8950](https://github.com/paperless-ngx/paperless-ngx/pull/8950))
+- Enhancement: webui workflowtrigger source option [@shamoon](https://github.com/shamoon) ([#9170](https://github.com/paperless-ngx/paperless-ngx/pull/9170))
+- Enhancement: use charfield for webhook url, custom validation [@shamoon](https://github.com/shamoon) ([#9128](https://github.com/paperless-ngx/paperless-ngx/pull/9128))
+- Feature: Chinese Traditional translation [@LokiHung](https://github.com/LokiHung) ([#9076](https://github.com/paperless-ngx/paperless-ngx/pull/9076))
+- Enhancement: Use cached sessions for a minor performance improvement [@stumpylog](https://github.com/stumpylog) ([#9074](https://github.com/paperless-ngx/paperless-ngx/pull/9074))
+- Feature: openapi spec, full api browser [@shamoon](https://github.com/shamoon) ([#8948](https://github.com/paperless-ngx/paperless-ngx/pull/8948))
+- Enhancement: filter by file type [@shamoon](https://github.com/shamoon) ([#8946](https://github.com/paperless-ngx/paperless-ngx/pull/8946))
+- Feature: Transition Docker to use s6 overlay [@stumpylog](https://github.com/stumpylog) ([#8886](https://github.com/paperless-ngx/paperless-ngx/pull/8886))
+- Feature: better toast notifications management [@shamoon](https://github.com/shamoon) ([#8980](https://github.com/paperless-ngx/paperless-ngx/pull/8980))
+- Enhancement: date picker and date filter dropdown improvements [@shamoon](https://github.com/shamoon) ([#9033](https://github.com/paperless-ngx/paperless-ngx/pull/9033))
+- Tweak: more accurate classifier last trained time [@shamoon](https://github.com/shamoon) ([#9004](https://github.com/paperless-ngx/paperless-ngx/pull/9004))
+- Enhancement: allow setting default pdf zoom [@shamoon](https://github.com/shamoon) ([#9017](https://github.com/paperless-ngx/paperless-ngx/pull/9017))
+
+### Bug Fixes
+
+- Fix: ensure only matched scheduled workflows are applied [@shamoon](https://github.com/shamoon) ([#9580](https://github.com/paperless-ngx/paperless-ngx/pull/9580))
+- Fix: fix large doc thumb hidden at unexpected screen sizes [@shamoon](https://github.com/shamoon) ([#9559](https://github.com/paperless-ngx/paperless-ngx/pull/9559))
+- Fix: fix potential race condition when creating new cf from doc details [@shamoon](https://github.com/shamoon) ([#9542](https://github.com/paperless-ngx/paperless-ngx/pull/9542))
+- Fix: fix doc link input [@shamoon](https://github.com/shamoon) ([#9533](https://github.com/paperless-ngx/paperless-ngx/pull/9533))
+- Fix: only overwrite existing cf values in workflow if set [@shamoon](https://github.com/shamoon) ([#9459](https://github.com/paperless-ngx/paperless-ngx/pull/9459))
+- Fix: fix auto-close when doc update no longer has permissions [@shamoon](https://github.com/shamoon) ([#9453](https://github.com/paperless-ngx/paperless-ngx/pull/9453))
+- Change: better handle permissions in patch requests [@shamoon](https://github.com/shamoon) ([#9393](https://github.com/paperless-ngx/paperless-ngx/pull/9393))
+- Fix: use correct filename with webhook [@shamoon](https://github.com/shamoon) ([#9392](https://github.com/paperless-ngx/paperless-ngx/pull/9392))
+- Change: sync OIDC groups on first login too [@shamoon](https://github.com/shamoon) ([#9387](https://github.com/paperless-ngx/paperless-ngx/pull/9387))
+- Fix: only parse custom field queries when valid [@shamoon](https://github.com/shamoon) ([#9384](https://github.com/paperless-ngx/paperless-ngx/pull/9384))
+- Fix: Allow setting of other Granian options [@stumpylog](https://github.com/stumpylog) ([#9360](https://github.com/paperless-ngx/paperless-ngx/pull/9360))
+- Fix: Always clean up INotify [@stumpylog](https://github.com/stumpylog) ([#9359](https://github.com/paperless-ngx/paperless-ngx/pull/9359))
+- Fix typo in inactive account template [@ocean90](https://github.com/ocean90) ([#9356](https://github.com/paperless-ngx/paperless-ngx/pull/9356))
+- Fix: fix notes serializing in API document response [@shamoon](https://github.com/shamoon) ([#9336](https://github.com/paperless-ngx/paperless-ngx/pull/9336))
+- Fix: correct all results with whoosh queries [@shamoon](https://github.com/shamoon) ([#9331](https://github.com/paperless-ngx/paperless-ngx/pull/9331))
+- Fix: fix typo in altered migration [@gothicVI](https://github.com/gothicVI) ([#9321](https://github.com/paperless-ngx/paperless-ngx/pull/9321))
+- Fix: add account_inactive template / url [@shamoon](https://github.com/shamoon) ([#9322](https://github.com/paperless-ngx/paperless-ngx/pull/9322))
+- Fix: Switches data to content to upload raw bytes/text content [@stumpylog](https://github.com/stumpylog) ([#9293](https://github.com/paperless-ngx/paperless-ngx/pull/9293))
+- Fix: handle null workflow body and email subject [@shamoon](https://github.com/shamoon) ([#9271](https://github.com/paperless-ngx/paperless-ngx/pull/9271))
+- Fix: cleanup saved view references on custom field deletion, auto-refresh views, show error on saved view save [@shamoon](https://github.com/shamoon) ([#9225](https://github.com/paperless-ngx/paperless-ngx/pull/9225))
+- Fix: revert thumbnail CSS workaround in favor of GPU workaround [@shamoon](https://github.com/shamoon) ([#9219](https://github.com/paperless-ngx/paperless-ngx/pull/9219))
+- Fix: correct split confirm removal [@shamoon](https://github.com/shamoon) ([#9195](https://github.com/paperless-ngx/paperless-ngx/pull/9195))
+- Fix: saved views do not return to default display fields after setting and then removing [@shamoon](https://github.com/shamoon) ([#9168](https://github.com/paperless-ngx/paperless-ngx/pull/9168))
+- Fix: correct logged number of deleted documents on trash empty [@shamoon](https://github.com/shamoon) ([#9148](https://github.com/paperless-ngx/paperless-ngx/pull/9148))
+- Fix: include account confirm email allauth URL [@shamoon](https://github.com/shamoon) ([#9147](https://github.com/paperless-ngx/paperless-ngx/pull/9147))
+- Fix: remove additional scrollbar from popup preview [@shamoon](https://github.com/shamoon) ([#9140](https://github.com/paperless-ngx/paperless-ngx/pull/9140))
+- Fix: wrap selected display fields [@shamoon](https://github.com/shamoon) ([#9139](https://github.com/paperless-ngx/paperless-ngx/pull/9139))
+- Fix: reset documents sort field if user deletes the custom field [@shamoon](https://github.com/shamoon) ([#9127](https://github.com/paperless-ngx/paperless-ngx/pull/9127))
+- Fix: limit document title length in workflows [@shamoon](https://github.com/shamoon) ([#9085](https://github.com/paperless-ngx/paperless-ngx/pull/9085))
+- Fix: include doc link input import in custom fields query dropdown [@shamoon](https://github.com/shamoon) ([#9058](https://github.com/paperless-ngx/paperless-ngx/pull/9058))
+- Fix: deselect and trigger refresh for deleted documents from bulk operations with delete originals [@shamoon](https://github.com/shamoon) ([#8996](https://github.com/paperless-ngx/paperless-ngx/pull/8996))
+- Fix: allow empty email in profile [@shamoon](https://github.com/shamoon) ([#9012](https://github.com/paperless-ngx/paperless-ngx/pull/9012))
+
+### Maintenance
+
+- docker(deps): Bump astral-sh/uv from 0.6.5-python3.12-bookworm-slim to 0.6.9-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#9488](https://github.com/paperless-ngx/paperless-ngx/pull/9488))
+- Chore: Enables dependabot for Dockerfile and our Compose files [@stumpylog](https://github.com/stumpylog) ([#9342](https://github.com/paperless-ngx/paperless-ngx/pull/9342))
+- Chore: ensure codecov upload gets attempted [@shamoon](https://github.com/shamoon) ([#9308](https://github.com/paperless-ngx/paperless-ngx/pull/9308))
+- Chore: Split out some items into extras [@stumpylog](https://github.com/stumpylog) ([#9297](https://github.com/paperless-ngx/paperless-ngx/pull/9297))
+- Chore: Enables Codecov test reporting for the backend [@stumpylog](https://github.com/stumpylog) ([#9295](https://github.com/paperless-ngx/paperless-ngx/pull/9295))
+- Chore: Combine Python settings files [@stumpylog](https://github.com/stumpylog) ([#9292](https://github.com/paperless-ngx/paperless-ngx/pull/9292))
+
+### Dependencies
+
+
+43 changes
+
+- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 20 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9536](https://github.com/paperless-ngx/paperless-ngx/pull/9536))
+- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9538](https://github.com/paperless-ngx/paperless-ngx/pull/9538))
+- Chore(deps-dev): Bump @types/node from 22.13.9 to 22.13.17 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9539](https://github.com/paperless-ngx/paperless-ngx/pull/9539))
+- Chore(deps-dev): Bump jest-preset-angular from 14.5.3 to 14.5.4 in /src-ui in the frontend-jest-dependencies group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9537](https://github.com/paperless-ngx/paperless-ngx/pull/9537))
+- Chore(deps-dev): Bump @playwright/test from 1.50.1 to 1.51.1 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9540](https://github.com/paperless-ngx/paperless-ngx/pull/9540))
+- Chore(deps): Bump django from 5.1.6 to 5.1.7 in the django group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9486](https://github.com/paperless-ngx/paperless-ngx/pull/9486))
+- docker(deps): Bump astral-sh/uv from 0.6.5-python3.12-bookworm-slim to 0.6.9-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#9488](https://github.com/paperless-ngx/paperless-ngx/pull/9488))
+- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9372](https://github.com/paperless-ngx/paperless-ngx/pull/9372))
+- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 20 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9371](https://github.com/paperless-ngx/paperless-ngx/pull/9371))
+- Chore(deps): Update ocrmypdf requirement from ~=16.9.0 to ~=16.10.0 @[dependabot[bot]](https://github.com/apps/dependabot) ([#9348](https://github.com/paperless-ngx/paperless-ngx/pull/9348))
+- Chore(deps): Update drf-spectacular-sidecar requirement from ~=2025.2.1 to ~=2025.3.1 @[dependabot[bot]](https://github.com/apps/dependabot) ([#9347](https://github.com/paperless-ngx/paperless-ngx/pull/9347))
+- Chore(deps): Bump the small-changes group with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9345](https://github.com/paperless-ngx/paperless-ngx/pull/9345))
+- docker-compose(deps): Bump library/postgres from 16 to 17 in /docker/compose @[dependabot[bot]](https://github.com/apps/dependabot) ([#9353](https://github.com/paperless-ngx/paperless-ngx/pull/9353))
+- docker(deps): Bump astral-sh/uv from 0.6.3-python3.12-bookworm-slim to 0.6.5-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#9344](https://github.com/paperless-ngx/paperless-ngx/pull/9344))
+- Chore(deps-dev): Bump the frontend-angular-dependencies group in /src-ui with 5 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9288](https://github.com/paperless-ngx/paperless-ngx/pull/9288))
+- Chore(deps-dev): Bump @types/node from 22.13.8 to 22.13.9 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9290](https://github.com/paperless-ngx/paperless-ngx/pull/9290))
+- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9289](https://github.com/paperless-ngx/paperless-ngx/pull/9289))
+- Chore(deps-dev): Bump @types/node from 22.13.5 to 22.13.8 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9267](https://github.com/paperless-ngx/paperless-ngx/pull/9267))
+- Chore(deps): Bump stumpylog/image-cleaner-action from 0.9.0 to 0.10.0 in the actions group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9252](https://github.com/paperless-ngx/paperless-ngx/pull/9252))
+- Chore(deps-dev): Bump the development group with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9253](https://github.com/paperless-ngx/paperless-ngx/pull/9253))
+- Chore(deps-dev): Bump @codecov/webpack-plugin from 1.8.0 to 1.9.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9260](https://github.com/paperless-ngx/paperless-ngx/pull/9260))
+- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9256](https://github.com/paperless-ngx/paperless-ngx/pull/9256))
+- Chore(deps): Bump uuid from 11.0.5 to 11.1.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9259](https://github.com/paperless-ngx/paperless-ngx/pull/9259))
+- Chore(deps-dev): Bump jest-preset-angular from 14.5.1 to 14.5.3 in /src-ui in the frontend-jest-dependencies group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9255](https://github.com/paperless-ngx/paperless-ngx/pull/9255))
+- Chore(deps): Bump rxjs from 7.8.1 to 7.8.2 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9258](https://github.com/paperless-ngx/paperless-ngx/pull/9258))
+- Chore(deps-dev): Bump @types/node from 22.13.0 to 22.13.5 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9257](https://github.com/paperless-ngx/paperless-ngx/pull/9257))
+- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 22 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9254](https://github.com/paperless-ngx/paperless-ngx/pull/9254))
+- Chore(deps): Bump django-filter from 24.3 to 25.1 in the django group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9143](https://github.com/paperless-ngx/paperless-ngx/pull/9143))
+- Chore(deps-dev): Bump mkdocs-material from 9.6.3 to 9.6.4 in the development group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9142](https://github.com/paperless-ngx/paperless-ngx/pull/9142))
+- Dependencies: Updates to jbig2enc 0.30 [@stumpylog](https://github.com/stumpylog) ([#9092](https://github.com/paperless-ngx/paperless-ngx/pull/9092))
+- Chore(deps): Bump cryptography from 44.0.0 to 44.0.1 @[dependabot[bot]](https://github.com/apps/dependabot) ([#9080](https://github.com/paperless-ngx/paperless-ngx/pull/9080))
+- Chore(deps): Bump the small-changes group with 7 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9064](https://github.com/paperless-ngx/paperless-ngx/pull/9064))
+- Chore(deps-dev): Bump the development group with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9061](https://github.com/paperless-ngx/paperless-ngx/pull/9061))
+- Chore(deps): Bump the django group across 1 directory with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9065](https://github.com/paperless-ngx/paperless-ngx/pull/9065))
+- Chore(deps): Bump drf-spectacular-sidecar from 2024.11.1 to 2025.2.1 in the major-versions group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9063](https://github.com/paperless-ngx/paperless-ngx/pull/9063))
+- Chore(deps-dev): Bump the development group with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9013](https://github.com/paperless-ngx/paperless-ngx/pull/9013))
+- Chore(deps): Bump django-soft-delete from 1.0.16 to 1.0.18 in the django group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9014](https://github.com/paperless-ngx/paperless-ngx/pull/9014))
+- Chore(deps): Bump uuid from 11.0.2 to 11.0.5 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#8992](https://github.com/paperless-ngx/paperless-ngx/pull/8992))
+- Chore(deps-dev): Bump @codecov/webpack-plugin from 1.2.1 to 1.8.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#8991](https://github.com/paperless-ngx/paperless-ngx/pull/8991))
+- Chore(deps-dev): Bump @playwright/test from 1.48.2 to 1.50.1 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#8993](https://github.com/paperless-ngx/paperless-ngx/pull/8993))
+- Chore(deps-dev): Bump @types/node from 22.8.6 to 22.13.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#8989](https://github.com/paperless-ngx/paperless-ngx/pull/8989))
+- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#8988](https://github.com/paperless-ngx/paperless-ngx/pull/8988))
+- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 23 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#8986](https://github.com/paperless-ngx/paperless-ngx/pull/8986))
+
+
+### All App Changes
+
+
+109 changes
+
+- Fix: ensure only matched scheduled workflows are applied [@shamoon](https://github.com/shamoon) ([#9580](https://github.com/paperless-ngx/paperless-ngx/pull/9580))
+- Fix: fix large doc thumb hidden at unexpected screen sizes [@shamoon](https://github.com/shamoon) ([#9559](https://github.com/paperless-ngx/paperless-ngx/pull/9559))
+- Fix: fix potential race condition when creating new cf from doc details [@shamoon](https://github.com/shamoon) ([#9542](https://github.com/paperless-ngx/paperless-ngx/pull/9542))
+- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 20 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9536](https://github.com/paperless-ngx/paperless-ngx/pull/9536))
+- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9538](https://github.com/paperless-ngx/paperless-ngx/pull/9538))
+- Chore(deps-dev): Bump @types/node from 22.13.9 to 22.13.17 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9539](https://github.com/paperless-ngx/paperless-ngx/pull/9539))
+- Chore(deps-dev): Bump jest-preset-angular from 14.5.3 to 14.5.4 in /src-ui in the frontend-jest-dependencies group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9537](https://github.com/paperless-ngx/paperless-ngx/pull/9537))
+- Chore(deps-dev): Bump @playwright/test from 1.50.1 to 1.51.1 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9540](https://github.com/paperless-ngx/paperless-ngx/pull/9540))
+- Fix: fix doc link input [@shamoon](https://github.com/shamoon) ([#9533](https://github.com/paperless-ngx/paperless-ngx/pull/9533))
+- Enhancement: allow webUI first account signup [@shamoon](https://github.com/shamoon) ([#9500](https://github.com/paperless-ngx/paperless-ngx/pull/9500))
+- Fix: fix cf dropdown placement on mobile [@shamoon](https://github.com/shamoon) ([#9508](https://github.com/paperless-ngx/paperless-ngx/pull/9508))
+- Chore(deps): Bump django from 5.1.6 to 5.1.7 in the django group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9486](https://github.com/paperless-ngx/paperless-ngx/pull/9486))
+- Fix: only overwrite existing cf values in workflow if set [@shamoon](https://github.com/shamoon) ([#9459](https://github.com/paperless-ngx/paperless-ngx/pull/9459))
+- Fix: fix auto-close when doc update no longer has permissions [@shamoon](https://github.com/shamoon) ([#9453](https://github.com/paperless-ngx/paperless-ngx/pull/9453))
+- Enhancement: support more 'not assigned' filtering, refactor [@shamoon](https://github.com/shamoon) ([#9429](https://github.com/paperless-ngx/paperless-ngx/pull/9429))
+- Change: better handle permissions in patch requests [@shamoon](https://github.com/shamoon) ([#9393](https://github.com/paperless-ngx/paperless-ngx/pull/9393))
+- Fix: use correct filename with webhook [@shamoon](https://github.com/shamoon) ([#9392](https://github.com/paperless-ngx/paperless-ngx/pull/9392))
+- Change: sync OIDC groups on first login too [@shamoon](https://github.com/shamoon) ([#9387](https://github.com/paperless-ngx/paperless-ngx/pull/9387))
+- Fix: only parse custom field queries when valid [@shamoon](https://github.com/shamoon) ([#9384](https://github.com/paperless-ngx/paperless-ngx/pull/9384))
+- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9372](https://github.com/paperless-ngx/paperless-ngx/pull/9372))
+- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 20 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9371](https://github.com/paperless-ngx/paperless-ngx/pull/9371))
+- Development: change frontend package manager to pnpm [@shamoon](https://github.com/shamoon) ([#9363](https://github.com/paperless-ngx/paperless-ngx/pull/9363))
+- Fix: Allow setting of other Granian options [@stumpylog](https://github.com/stumpylog) ([#9360](https://github.com/paperless-ngx/paperless-ngx/pull/9360))
+- Fix: Always clean up INotify [@stumpylog](https://github.com/stumpylog) ([#9359](https://github.com/paperless-ngx/paperless-ngx/pull/9359))
+- Tweak: add saved views hint to dashboard [@shamoon](https://github.com/shamoon) ([#9362](https://github.com/paperless-ngx/paperless-ngx/pull/9362))
+- Chore(deps): Update ocrmypdf requirement from ~=16.9.0 to ~=16.10.0 @[dependabot[bot]](https://github.com/apps/dependabot) ([#9348](https://github.com/paperless-ngx/paperless-ngx/pull/9348))
+- Chore(deps): Update drf-spectacular-sidecar requirement from ~=2025.2.1 to ~=2025.3.1 @[dependabot[bot]](https://github.com/apps/dependabot) ([#9347](https://github.com/paperless-ngx/paperless-ngx/pull/9347))
+- Chore(deps): Bump the small-changes group with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9345](https://github.com/paperless-ngx/paperless-ngx/pull/9345))
+- Ensure the directories have been overridden and created for this test [@stumpylog](https://github.com/stumpylog) ([#9354](https://github.com/paperless-ngx/paperless-ngx/pull/9354))
+- Fix typo in inactive account template [@ocean90](https://github.com/ocean90) ([#9356](https://github.com/paperless-ngx/paperless-ngx/pull/9356))
+- Fix: fix notes serializing in API document response [@shamoon](https://github.com/shamoon) ([#9336](https://github.com/paperless-ngx/paperless-ngx/pull/9336))
+- Fix: correct all results with whoosh queries [@shamoon](https://github.com/shamoon) ([#9331](https://github.com/paperless-ngx/paperless-ngx/pull/9331))
+- Fix: fix typo in altered migration [@gothicVI](https://github.com/gothicVI) ([#9321](https://github.com/paperless-ngx/paperless-ngx/pull/9321))
+- Fix: add account_inactive template / url [@shamoon](https://github.com/shamoon) ([#9322](https://github.com/paperless-ngx/paperless-ngx/pull/9322))
+- Chore: Switch from os.path to pathlib.Path [@gothicVI](https://github.com/gothicVI) ([#9060](https://github.com/paperless-ngx/paperless-ngx/pull/9060))
+- Enhancement: reorganize dates dropdown, add more relative options [@shamoon](https://github.com/shamoon) ([#9307](https://github.com/paperless-ngx/paperless-ngx/pull/9307))
+- Chore: remove popper preventOverflow fix [@shamoon](https://github.com/shamoon) ([#9306](https://github.com/paperless-ngx/paperless-ngx/pull/9306))
+- Enhancement: add switch to allow merging non-PDFs with archive version [@shamoon](https://github.com/shamoon) ([#9305](https://github.com/paperless-ngx/paperless-ngx/pull/9305))
+- Enhancement: support assigning custom field values in workflows [@shamoon](https://github.com/shamoon) ([#9272](https://github.com/paperless-ngx/paperless-ngx/pull/9272))
+- Chore: add codecov frontend test results [@shamoon](https://github.com/shamoon) ([#9296](https://github.com/paperless-ngx/paperless-ngx/pull/9296))
+- Chore: Removes undocumented FileInfo [@stumpylog](https://github.com/stumpylog) ([#9298](https://github.com/paperless-ngx/paperless-ngx/pull/9298))
+- Chore(deps-dev): Bump the frontend-angular-dependencies group in /src-ui with 5 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9288](https://github.com/paperless-ngx/paperless-ngx/pull/9288))
+- Fix: Switches data to content to upload raw bytes/text content [@stumpylog](https://github.com/stumpylog) ([#9293](https://github.com/paperless-ngx/paperless-ngx/pull/9293))
+- Chore: Removes the unused Log model and LogFilterSet [@stumpylog](https://github.com/stumpylog) ([#9294](https://github.com/paperless-ngx/paperless-ngx/pull/9294))
+- Chore: Combine Python settings files [@stumpylog](https://github.com/stumpylog) ([#9292](https://github.com/paperless-ngx/paperless-ngx/pull/9292))
+- Chore(deps-dev): Bump @types/node from 22.13.8 to 22.13.9 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9290](https://github.com/paperless-ngx/paperless-ngx/pull/9290))
+- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9289](https://github.com/paperless-ngx/paperless-ngx/pull/9289))
+- Chore: Switch from pipenv to uv [@stumpylog](https://github.com/stumpylog) ([#9251](https://github.com/paperless-ngx/paperless-ngx/pull/9251))
+- Enhancement: Add slugify filter in templating [@hwaterke](https://github.com/hwaterke) ([#9269](https://github.com/paperless-ngx/paperless-ngx/pull/9269))
+- Fix: handle null workflow body and email subject [@shamoon](https://github.com/shamoon) ([#9271](https://github.com/paperless-ngx/paperless-ngx/pull/9271))
+- Chore(deps-dev): Bump @types/node from 22.13.5 to 22.13.8 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9267](https://github.com/paperless-ngx/paperless-ngx/pull/9267))
+- Chore(deps-dev): Bump the development group with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9253](https://github.com/paperless-ngx/paperless-ngx/pull/9253))
+- Chore(deps-dev): Bump @codecov/webpack-plugin from 1.8.0 to 1.9.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9260](https://github.com/paperless-ngx/paperless-ngx/pull/9260))
+- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9256](https://github.com/paperless-ngx/paperless-ngx/pull/9256))
+- Chore(deps): Bump uuid from 11.0.5 to 11.1.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9259](https://github.com/paperless-ngx/paperless-ngx/pull/9259))
+- Chore(deps-dev): Bump jest-preset-angular from 14.5.1 to 14.5.3 in /src-ui in the frontend-jest-dependencies group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9255](https://github.com/paperless-ngx/paperless-ngx/pull/9255))
+- Chore(deps): Bump rxjs from 7.8.1 to 7.8.2 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9258](https://github.com/paperless-ngx/paperless-ngx/pull/9258))
+- Chore(deps-dev): Bump @types/node from 22.13.0 to 22.13.5 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9257](https://github.com/paperless-ngx/paperless-ngx/pull/9257))
+- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 22 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9254](https://github.com/paperless-ngx/paperless-ngx/pull/9254))
+- Feature: Switch webserver to granian [@stumpylog](https://github.com/stumpylog) ([#9218](https://github.com/paperless-ngx/paperless-ngx/pull/9218))
+- Enhancement: relocate and smaller upload widget, dont limit upload list [@shamoon](https://github.com/shamoon) ([#9244](https://github.com/paperless-ngx/paperless-ngx/pull/9244))
+- Enhancement: run tasks from system status, report sanity check, simpler classifier check, styling updates [@shamoon](https://github.com/shamoon) ([#9106](https://github.com/paperless-ngx/paperless-ngx/pull/9106))
+- Chore: Switch remote version check to HTTPx [@stumpylog](https://github.com/stumpylog) ([#9232](https://github.com/paperless-ngx/paperless-ngx/pull/9232))
+- Fix: cleanup saved view references on custom field deletion, auto-refresh views, show error on saved view save [@shamoon](https://github.com/shamoon) ([#9225](https://github.com/paperless-ngx/paperless-ngx/pull/9225))
+- Fix: revert thumbnail CSS workaround in favor of GPU workaround [@shamoon](https://github.com/shamoon) ([#9219](https://github.com/paperless-ngx/paperless-ngx/pull/9219))
+- Chore: Reduce imports for a slight memory improvement [@stumpylog](https://github.com/stumpylog) ([#9217](https://github.com/paperless-ngx/paperless-ngx/pull/9217))
+- Enhancement: include celery log in logs view [@shamoon](https://github.com/shamoon) ([#9214](https://github.com/paperless-ngx/paperless-ngx/pull/9214))
+- Enhancement: support default groups for regular and social account signup, syncing on login [@shamoon](https://github.com/shamoon) ([#9039](https://github.com/paperless-ngx/paperless-ngx/pull/9039))
+- Enhancement: allow disabling the filesystem consumer [@shamoon](https://github.com/shamoon) ([#9199](https://github.com/paperless-ngx/paperless-ngx/pull/9199))
+- Fix: correct split confirm removal [@shamoon](https://github.com/shamoon) ([#9195](https://github.com/paperless-ngx/paperless-ngx/pull/9195))
+- Feature: email document [@shamoon](https://github.com/shamoon) ([#8950](https://github.com/paperless-ngx/paperless-ngx/pull/8950))
+- Enhancement: webui workflowtrigger source option [@shamoon](https://github.com/shamoon) ([#9170](https://github.com/paperless-ngx/paperless-ngx/pull/9170))
+- Fix: saved views do not return to default display fields after setting and then removing [@shamoon](https://github.com/shamoon) ([#9168](https://github.com/paperless-ngx/paperless-ngx/pull/9168))
+- Chore(deps): Bump django-filter from 24.3 to 25.1 in the django group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9143](https://github.com/paperless-ngx/paperless-ngx/pull/9143))
+- Chore(deps-dev): Bump mkdocs-material from 9.6.3 to 9.6.4 in the development group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9142](https://github.com/paperless-ngx/paperless-ngx/pull/9142))
+- Fix: correct logged number of deleted documents on trash empty [@shamoon](https://github.com/shamoon) ([#9148](https://github.com/paperless-ngx/paperless-ngx/pull/9148))
+- Fix: include account confirm email allauth URL [@shamoon](https://github.com/shamoon) ([#9147](https://github.com/paperless-ngx/paperless-ngx/pull/9147))
+- Fix: remove additional scrollbar from popup preview [@shamoon](https://github.com/shamoon) ([#9140](https://github.com/paperless-ngx/paperless-ngx/pull/9140))
+- Fix: wrap selected display fields [@shamoon](https://github.com/shamoon) ([#9139](https://github.com/paperless-ngx/paperless-ngx/pull/9139))
+- Enhancement: use charfield for webhook url, custom validation [@shamoon](https://github.com/shamoon) ([#9128](https://github.com/paperless-ngx/paperless-ngx/pull/9128))
+- Fix: reset documents sort field if user deletes the custom field [@shamoon](https://github.com/shamoon) ([#9127](https://github.com/paperless-ngx/paperless-ngx/pull/9127))
+- Chore: more efficient select cf update handler [@shamoon](https://github.com/shamoon) ([#9099](https://github.com/paperless-ngx/paperless-ngx/pull/9099))
+- Fix: limit document title length in workflows [@shamoon](https://github.com/shamoon) ([#9085](https://github.com/paperless-ngx/paperless-ngx/pull/9085))
+- Feature: Chinese Traditional translation [@LokiHung](https://github.com/LokiHung) ([#9076](https://github.com/paperless-ngx/paperless-ngx/pull/9076))
+- Enhancement: Use cached sessions for a minor performance improvement [@stumpylog](https://github.com/stumpylog) ([#9074](https://github.com/paperless-ngx/paperless-ngx/pull/9074))
+- Chore(deps): Bump the small-changes group with 7 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9064](https://github.com/paperless-ngx/paperless-ngx/pull/9064))
+- Chore(deps-dev): Bump the development group with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9061](https://github.com/paperless-ngx/paperless-ngx/pull/9061))
+- Chore(deps): Bump the django group across 1 directory with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9065](https://github.com/paperless-ngx/paperless-ngx/pull/9065))
+- Chore(deps): Bump drf-spectacular-sidecar from 2024.11.1 to 2025.2.1 in the major-versions group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9063](https://github.com/paperless-ngx/paperless-ngx/pull/9063))
+- Feature: openapi spec, full api browser [@shamoon](https://github.com/shamoon) ([#8948](https://github.com/paperless-ngx/paperless-ngx/pull/8948))
+- Fix: include doc link input import in custom fields query dropdown [@shamoon](https://github.com/shamoon) ([#9058](https://github.com/paperless-ngx/paperless-ngx/pull/9058))
+- Enhancement: filter by file type [@shamoon](https://github.com/shamoon) ([#8946](https://github.com/paperless-ngx/paperless-ngx/pull/8946))
+- Enhancement: add layout options for email conversion [@RazielleS](https://github.com/RazielleS) ([#8907](https://github.com/paperless-ngx/paperless-ngx/pull/8907))
+- Chore: Enable ruff FBT [@gothicVI](https://github.com/gothicVI) ([#8645](https://github.com/paperless-ngx/paperless-ngx/pull/8645))
+- Feature: better toast notifications management [@shamoon](https://github.com/shamoon) ([#8980](https://github.com/paperless-ngx/paperless-ngx/pull/8980))
+- Enhancement: date picker and date filter dropdown improvements [@shamoon](https://github.com/shamoon) ([#9033](https://github.com/paperless-ngx/paperless-ngx/pull/9033))
+- Fix: deselect and trigger refresh for deleted documents from bulk operations with delete originals [@shamoon](https://github.com/shamoon) ([#8996](https://github.com/paperless-ngx/paperless-ngx/pull/8996))
+- Tweak: improve date matching regex for dates after numbers [@XstreamGit](https://github.com/XstreamGit) ([#8964](https://github.com/paperless-ngx/paperless-ngx/pull/8964))
+- Tweak: more accurate classifier last trained time [@shamoon](https://github.com/shamoon) ([#9004](https://github.com/paperless-ngx/paperless-ngx/pull/9004))
+- Enhancement: allow setting default pdf zoom [@shamoon](https://github.com/shamoon) ([#9017](https://github.com/paperless-ngx/paperless-ngx/pull/9017))
+- Chore(deps-dev): Bump the development group with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9013](https://github.com/paperless-ngx/paperless-ngx/pull/9013))
+- Chore(deps): Bump django-soft-delete from 1.0.16 to 1.0.18 in the django group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9014](https://github.com/paperless-ngx/paperless-ngx/pull/9014))
+- Fix: allow empty email in profile [@shamoon](https://github.com/shamoon) ([#9012](https://github.com/paperless-ngx/paperless-ngx/pull/9012))
+- Chore(deps): Bump uuid from 11.0.2 to 11.0.5 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#8992](https://github.com/paperless-ngx/paperless-ngx/pull/8992))
+- Chore(deps-dev): Bump @codecov/webpack-plugin from 1.2.1 to 1.8.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#8991](https://github.com/paperless-ngx/paperless-ngx/pull/8991))
+- Chore(deps-dev): Bump @playwright/test from 1.48.2 to 1.50.1 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#8993](https://github.com/paperless-ngx/paperless-ngx/pull/8993))
+- Chore(deps-dev): Bump @types/node from 22.8.6 to 22.13.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#8989](https://github.com/paperless-ngx/paperless-ngx/pull/8989))
+- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#8988](https://github.com/paperless-ngx/paperless-ngx/pull/8988))
+- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 23 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#8986](https://github.com/paperless-ngx/paperless-ngx/pull/8986))
+
+
## paperless-ngx 2.14.7
### Features
@@ -4865,9 +5583,6 @@ This release contains new database migrations.
Paperless will continue to work with WSGI, but you will not get any
status notifications.
- Apache `mod_wsgi` users, see
- [this note](faq.md#how-do-i-get-websocket-support-with-apache-mod_wsgi).
-
- Paperless now offers suggestions for tags, correspondents and types
on the document detail page.
@@ -5449,7 +6164,6 @@ primarily.
a very good job at ocr'ing a document with the default
language. Certain language specifics such as umlauts may not get
picked up properly.
- - `PAPERLESS_DEBUG` defaults to `false`.
- The presence of `PAPERLESS_DBHOST` now determines whether to use
PostgreSQL or SQLite.
- `PAPERLESS_OCR_THREADS` is gone and replaced with
@@ -5670,11 +6384,12 @@ primarily.
who are doing active development on Paperless using the Docker
environment:
[#376](https://github.com/the-paperless-project/paperless/pull/376).
-- You now also have the ability to customise the interface to your
+- ~~You now also have the ability to customise the interface to your
heart's content by creating a file called `overrides.css` and/or
`overrides.js` in the root of your media directory. Thanks to [Mark
McFate](https://github.com/SummittDweller) for this idea:
- [#371](https://github.com/the-paperless-project/paperless/issues/371)
+ [#371](https://github.com/the-paperless-project/paperless/issues/371)~~
+ (Not supported by Paperless-ngx)
### 2.0.0
diff --git a/docs/configuration.md b/docs/configuration.md
index 3724c792d..fdc0097dd 100644
--- a/docs/configuration.md
+++ b/docs/configuration.md
@@ -50,47 +50,48 @@ matcher.
### Database
+By default, Paperless uses **SQLite** with a database stored at `data/db.sqlite3`.
+To switch to **PostgreSQL** or **MariaDB**, set [`PAPERLESS_DBHOST`](#PAPERLESS_DBHOST) and optionally configure other
+database-related environment variables.
+
+#### [`PAPERLESS_DBHOST=`](#PAPERLESS_DBHOST) {#PAPERLESS_DBHOST}
+
+: If unset, Paperless uses **SQLite** by default.
+
+ Set `PAPERLESS_DBHOST` to switch to PostgreSQL or MariaDB instead.
+
#### [`PAPERLESS_DBENGINE=`](#PAPERLESS_DBENGINE) {#PAPERLESS_DBENGINE}
-: Optional, gives the ability to choose Postgres or MariaDB for
-database engine. Available options are `postgresql` and
-`mariadb`.
+: Optional. Specifies the database engine to use when connecting to a remote database.
+Available options are `postgresql` and `mariadb`.
- Default is `postgresql`.
+ Defaults to `postgresql` if `PAPERLESS_DBHOST` is set.
!!! warning
Using MariaDB comes with some caveats. See [MySQL Caveats](advanced_usage.md#mysql-caveats).
-#### [`PAPERLESS_DBHOST=`](#PAPERLESS_DBHOST) {#PAPERLESS_DBHOST}
-
-: By default, sqlite is used as the database backend. This can be
-changed here.
-
- Set PAPERLESS_DBHOST and another database will be used instead of
- sqlite.
-
#### [`PAPERLESS_DBPORT=`](#PAPERLESS_DBPORT) {#PAPERLESS_DBPORT}
-: Adjust port if necessary.
+: Port to use when connecting to PostgreSQL or MariaDB.
- Default is 5432.
+ Default is `5432` for PostgreSQL and `3306` for MariaDB.
#### [`PAPERLESS_DBNAME=`](#PAPERLESS_DBNAME) {#PAPERLESS_DBNAME}
-: Database name in PostgreSQL or MariaDB.
+: Name of the database to connect to when using PostgreSQL or MariaDB.
Defaults to "paperless".
#### [`PAPERLESS_DBUSER=`](#PAPERLESS_DBUSER) {#PAPERLESS_DBUSER}
-: Database user in PostgreSQL or MariaDB.
+: Username for authenticating with the PostgreSQL or MariaDB database.
Defaults to "paperless".
#### [`PAPERLESS_DBPASS=`](#PAPERLESS_DBPASS) {#PAPERLESS_DBPASS}
-: Database password for PostgreSQL or MariaDB.
+: Password for the PostgreSQL or MariaDB database user.
Defaults to "paperless".
@@ -110,20 +111,20 @@ changed here.
#### [`PAPERLESS_DBSSLROOTCERT=`](#PAPERLESS_DBSSLROOTCERT) {#PAPERLESS_DBSSLROOTCERT}
-: SSL root certificate path
+: Path to the SSL root certificate used to verify the database server.
See [the official documentation about
sslmode for PostgreSQL](https://www.postgresql.org/docs/current/libpq-ssl.html).
- Changes path of `root.crt`.
+ Changes the location of `root.crt`.
See [the official documentation about
sslmode for MySQL and MariaDB](https://dev.mysql.com/doc/refman/8.0/en/connection-options.html#option_general_ssl-ca).
- Defaults to unset, using the documented path in the home directory.
+ Defaults to unset, using the standard location in the home directory.
#### [`PAPERLESS_DBSSLCERT=`](#PAPERLESS_DBSSLCERT) {#PAPERLESS_DBSSLCERT}
-: SSL client certificate path
+: Path to the client SSL certificate used when connecting securely.
See [the official documentation about
sslmode for PostgreSQL](https://www.postgresql.org/docs/current/libpq-ssl.html).
@@ -131,13 +132,13 @@ changed here.
See [the official documentation about
sslmode for MySQL and MariaDB](https://dev.mysql.com/doc/refman/8.0/en/connection-options.html#option_general_ssl-cert).
- Changes path of `postgresql.crt`.
+ Changes the location of `postgresql.crt`.
- Defaults to unset, using the documented path in the home directory.
+ Defaults to unset, using the standard location in the home directory.
#### [`PAPERLESS_DBSSLKEY=`](#PAPERLESS_DBSSLKEY) {#PAPERLESS_DBSSLKEY}
-: SSL client key path
+: Path to the client SSL private key used when connecting securely.
See [the official documentation about
sslmode for PostgreSQL](https://www.postgresql.org/docs/current/libpq-ssl.html).
@@ -145,17 +146,70 @@ changed here.
See [the official documentation about
sslmode for MySQL and MariaDB](https://dev.mysql.com/doc/refman/8.0/en/connection-options.html#option_general_ssl-key).
- Changes path of `postgresql.key`.
+ Changes the location of `postgresql.key`.
- Defaults to unset, using the documented path in the home directory.
+ Defaults to unset, using the standard location in the home directory.
#### [`PAPERLESS_DB_TIMEOUT=`](#PAPERLESS_DB_TIMEOUT) {#PAPERLESS_DB_TIMEOUT}
-: Amount of time for a database connection to wait for the database to
-unlock. Mostly applicable for sqlite based installation. Consider changing
-to postgresql if you are having concurrency problems with sqlite.
+: Sets how long a database connection should wait before timing out.
- Defaults to unset, keeping the Django defaults.
+ For SQLite, this sets how long to wait if the database is locked.
+ For PostgreSQL or MariaDB, this sets the connection timeout.
+
+ Defaults to unset, which uses Django’s built-in defaults.
+
+#### [`PAPERLESS_DB_POOLSIZE=`](#PAPERLESS_DB_POOLSIZE) {#PAPERLESS_DB_POOLSIZE}
+
+: Defines the maximum number of database connections to keep in the pool.
+
+ Only applies to PostgreSQL. This setting is ignored for other database engines.
+
+ The value must be greater than or equal to 1 to be used.
+ Defaults to unset, which disables connection pooling.
+
+ !!! note
+
+ A small pool is typically sufficient — for example, a size of 4.
+ Make sure your PostgreSQL server's max_connections setting is large enough to handle:
+ ```(Paperless workers + Celery workers) × pool size + safety margin```
+ For example, with 4 Paperless workers and 2 Celery workers, and a pool size of 4:
+ (4 + 2) × 4 + 10 = 34 connections required.
+
+#### [`PAPERLESS_DB_READ_CACHE_ENABLED=`](#PAPERLESS_DB_READ_CACHE_ENABLED) {#PAPERLESS_DB_READ_CACHE_ENABLED}
+
+: Caches the database read query results into Redis. This can significantly improve application response times by caching database queries, at the cost of slightly increased memory usage.
+
+ Defaults to `false`.
+
+ !!! danger
+
+ **Do not modify the database outside the application while it is running.**
+ This includes actions such as restoring a backup, upgrading the database, or performing manual inserts. All external modifications must be done **only when the application is stopped**.
+ After making any such changes, you **must invalidate the DB read cache** using the `invalidate_cachalot` management command.
+
+#### [`PAPERLESS_READ_CACHE_TTL=`](#PAPERLESS_READ_CACHE_TTL) {#PAPERLESS_READ_CACHE_TTL}
+
+: Specifies how long (in seconds) read data should be cached.
+
+ Allowed values are between `1` (one second) and `31536000` (one year). Defaults to `3600` (one hour).
+
+ !!! warning
+
+ A high TTL increases memory usage over time. Memory may be used until end of TTL, even if the cache is invalidated with the `invalidate_cachalot` command.
+
+In case of an out-of-memory (OOM) situation, Redis may stop accepting new data — including cache entries, scheduled tasks, and documents to consume.
+If your system has limited RAM, consider configuring a dedicated Redis instance for the read cache, with a memory limit and the eviction policy set to `allkeys-lru`.
+For more details, refer to the [Redis eviction policy documentation](https://redis.io/docs/latest/develop/reference/eviction/), and see the `PAPERLESS_READ_CACHE_REDIS_URL` setting to specify a separate Redis broker.
+
+#### [`PAPERLESS_READ_CACHE_REDIS_URL=`](#PAPERLESS_READ_CACHE_REDIS_URL) {#PAPERLESS_READ_CACHE_REDIS_URL}
+
+: Defines the Redis instance used for the read cache.
+
+ Defaults to `None`.
+
+ !!! Note
+ If this value is not set, the same Redis instance used for scheduled tasks will be used for caching as well.
## Optional Services
@@ -200,7 +254,7 @@ and watch out for indentation if editing the YAML file.
### Email Parsing
-#### [`PAPERLESS_EMAIL_PARSE_DEFAULT_LAYOUT=`(#PAPERLESS_EMAIL_PARSE_DEFAULT_LAYOUT) {#PAPERLESS_EMAIL_PARSE_DEFAULT_LAYOUT}
+#### [`PAPERLESS_EMAIL_PARSE_DEFAULT_LAYOUT=`](#PAPERLESS_EMAIL_PARSE_DEFAULT_LAYOUT) {#PAPERLESS_EMAIL_PARSE_DEFAULT_LAYOUT}
: The default layout to use for emails that are consumed as documents. Must be one of the integer choices below. Note that mail
rules can specify this setting, thus this fallback is used for the default selection and for .eml files consumed by other means.
@@ -404,7 +458,7 @@ set this value to /paperless. No trailing slash!
#### [`PAPERLESS_STATIC_URL=`](#PAPERLESS_STATIC_URL) {#PAPERLESS_STATIC_URL}
: Override the STATIC_URL here. Unless you're hosting Paperless off a
-subdomain like /paperless/, you probably don't need to change this.
+specific path like /paperless/, you probably don't need to change this.
If you do change it, be sure to include the trailing slash.
Defaults to "/static/".
@@ -557,6 +611,20 @@ This is for use with self-signed certificates against local IMAP servers.
Settings this value has security implications for the security of your email.
Understand what it does and be sure you need to before setting.
+### Authentication & SSO {#authentication}
+
+#### [`PAPERLESS_ACCOUNT_ALLOW_SIGNUPS=`](#PAPERLESS_ACCOUNT_ALLOW_SIGNUPS) {#PAPERLESS_ACCOUNT_ALLOW_SIGNUPS}
+
+: Allow users to signup for a new Paperless-ngx account.
+
+ Defaults to False
+
+#### [`PAPERLESS_ACCOUNT_DEFAULT_GROUPS=`](#PAPERLESS_ACCOUNT_DEFAULT_GROUPS) {#PAPERLESS_ACCOUNT_DEFAULT_GROUPS}
+
+: A list of group names that users will be added to when they sign up for a new account. Groups listed here must already exist.
+
+ Defaults to None
+
#### [`PAPERLESS_SOCIALACCOUNT_PROVIDERS=`](#PAPERLESS_SOCIALACCOUNT_PROVIDERS) {#PAPERLESS_SOCIALACCOUNT_PROVIDERS}
: This variable is used to setup login and signup via social account providers which are compatible with django-allauth.
@@ -580,12 +648,25 @@ system. See the corresponding
Defaults to True
-#### [`PAPERLESS_ACCOUNT_ALLOW_SIGNUPS=`](#PAPERLESS_ACCOUNT_ALLOW_SIGNUPS) {#PAPERLESS_ACCOUNT_ALLOW_SIGNUPS}
+#### [`PAPERLESS_SOCIAL_ACCOUNT_SYNC_GROUPS=`](#PAPERLESS_SOCIAL_ACCOUNT_SYNC_GROUPS) {#PAPERLESS_SOCIAL_ACCOUNT_SYNC_GROUPS}
-: Allow users to signup for a new Paperless-ngx account.
+: Sync groups from the third party authentication system (e.g. OIDC) to Paperless-ngx. When enabled, users will be added or removed from groups based on their group membership in the third party authentication system. Groups must already exist in Paperless-ngx and have the same name as in the third party authentication system. Groups are updated upon logging in via the third party authentication system, see the corresponding [django-allauth documentation](https://docs.allauth.org/en/dev/socialaccount/signals.html).
+
+: In order to pass groups from the authentication system you will need to update your [PAPERLESS_SOCIALACCOUNT_PROVIDERS](#PAPERLESS_SOCIALACCOUNT_PROVIDERS) setting by adding a top-level "SCOPES" setting which includes "groups", e.g.:
+
+ ```json
+ {"openid_connect":{"SCOPE": ["openid","profile","email","groups"]...
+ ```
Defaults to False
+#### [`PAPERLESS_SOCIAL_ACCOUNT_DEFAULT_GROUPS=`](#PAPERLESS_SOCIAL_ACCOUNT_DEFAULT_GROUPS) {#PAPERLESS_SOCIAL_ACCOUNT_DEFAULT_GROUPS}
+
+: A list of group names that users who signup via social accounts will be added to upon signup. Groups listed here must already exist.
+If both the [PAPERLESS_ACCOUNT_DEFAULT_GROUPS](#PAPERLESS_ACCOUNT_DEFAULT_GROUPS) setting and this setting are used, the user will be added to both sets of groups.
+
+ Defaults to None
+
#### [`PAPERLESS_ACCOUNT_DEFAULT_HTTP_PROTOCOL=`](#PAPERLESS_ACCOUNT_DEFAULT_HTTP_PROTOCOL) {#PAPERLESS_ACCOUNT_DEFAULT_HTTP_PROTOCOL}
: The protocol used when generating URLs, e.g. login callback URLs. See the corresponding
@@ -602,7 +683,13 @@ system. See the corresponding
!!! note
- If you do not have a working email server set up you should set this to 'none'.
+ If you do not have a working email server set up this will be set to 'none'.
+
+#### [`PAPERLESS_ACCOUNT_EMAIL_UNKNOWN_ACCOUNTS=`](#PAPERLESS_ACCOUNT_EMAIL_UNKNOWN_ACCOUNTS) {#PAPERLESS_ACCOUNT_EMAIL_UNKNOWN_ACCOUNTS}
+
+: See the relevant [django-allauth documentation](https://docs.allauth.org/en/latest/account/configuration.html)
+
+ Defaults to True (from allauth)
#### [`PAPERLESS_DISABLE_REGULAR_LOGIN=`](#PAPERLESS_DISABLE_REGULAR_LOGIN) {#PAPERLESS_DISABLE_REGULAR_LOGIN}
@@ -933,6 +1020,22 @@ still perform some basic text pre-processing before matching.
Defaults to 1.
+#### [`PAPERLESS_DATE_PARSER_LANGUAGES=`](#PAPERLESS_DATE_PARSER_LANGUAGES) {#PAPERLESS_DATE_PARSER_LANGUAGES}
+
+Specifies which language Paperless should use when parsing dates from documents.
+
+ This should be a language code supported by the dateparser library,
+ for example: "en", or a combination such as "en+de".
+ Locales are also supported (e.g., "en-AU").
+ Multiple languages can be combined using "+", for example: "en+de" or "en-AU+de".
+ For valid values, refer to the list of supported languages and locales in the [dateparser documentation](https://dateparser.readthedocs.io/en/latest/supported_locales.html).
+
+ Set this to match the languages in which most of your documents are written.
+ If not set, Paperless will attempt to infer the language(s) from the OCR configuration (`PAPERLESS_OCR_LANGUAGE`).
+
+!!! note
+This format differs from the `PAPERLESS_OCR_LANGUAGE` setting, which uses ISO 639-2 codes (3 letters, e.g., "eng+deu" for Tesseract OCR).
+
#### [`PAPERLESS_EMAIL_TASK_CRON=`](#PAPERLESS_EMAIL_TASK_CRON) {#PAPERLESS_EMAIL_TASK_CRON}
: Configures the scheduled email fetching frequency. The value
@@ -1030,6 +1133,11 @@ be used with caution!
## Document Consumption {#consume_config}
+#### [`PAPERLESS_CONSUMER_DISABLE`](#PAPERLESS_CONSUMER_DISABLE) {#PAPERLESS_CONSUMER_DISABLE}
+
+: If set (to anything), this completely disables the directory-based consumer in docker. If you don't plan to consume documents
+via the consumption directory, you can disable the consumer to save resources.
+
#### [`PAPERLESS_CONSUMER_DELETE_DUPLICATES=`](#PAPERLESS_CONSUMER_DELETE_DUPLICATES) {#PAPERLESS_CONSUMER_DELETE_DUPLICATES}
: When the consumer detects a duplicate document, it will not touch
@@ -1174,6 +1282,30 @@ within your documents.
Defaults to false.
+## Workflow webhooks
+
+#### [`PAPERLESS_WEBHOOKS_ALLOWED_SCHEMES=`](#PAPERLESS_WEBHOOKS_ALLOWED_SCHEMES) {#PAPERLESS_WEBHOOKS_ALLOWED_SCHEMES}
+
+: A comma-separated list of allowed schemes for webhooks. This setting
+controls which URL schemes are permitted for webhook URLs.
+
+ Defaults to `http,https`.
+
+#### [`PAPERLESS_WEBHOOKS_ALLOWED_PORTS=`](#PAPERLESS_WEBHOOKS_ALLOWED_PORTS) {#PAPERLESS_WEBHOOKS_ALLOWED_PORTS}
+
+: A comma-separated list of allowed ports for webhooks. This setting
+controls which ports are permitted for webhook URLs. For example, if you
+set this to `80,443`, webhooks will only be sent to URLs that use these
+ports.
+
+ Defaults to empty list, which allows all ports.
+
+#### [`PAPERLESS_WEBHOOKS_ALLOW_INTERNAL_REQUESTS=`](#PAPERLESS_WEBHOOKS_ALLOW_INTERNAL_REQUESTS) {#PAPERLESS_WEBHOOKS_ALLOW_INTERNAL_REQUESTS}
+
+: If set to false, webhooks cannot be sent to internal URLs (e.g., localhost).
+
+ Defaults to true, which allows internal requests.
+
### Polling {#polling}
#### [`PAPERLESS_CONSUMER_POLLING=`](#PAPERLESS_CONSUMER_POLLING) {#PAPERLESS_CONSUMER_POLLING}
@@ -1506,13 +1638,23 @@ increase RAM usage.
Defaults to 1.
+ !!! note
+
+ This option may also be set with `GRANIAN_WORKERS` and
+ this option may be removed in the future
+
#### [`PAPERLESS_BIND_ADDR=`](#PAPERLESS_BIND_ADDR) {#PAPERLESS_BIND_ADDR}
: The IP address the webserver will listen on inside the container.
There are special setups where you may need to configure this value
to restrict the Ip address or interface the webserver listens on.
- Defaults to `[::]`, meaning all interfaces, including IPv6.
+ Defaults to `::`, meaning all interfaces, including IPv6.
+
+ !!! note
+
+ This option may also be set with `GRANIAN_HOST` and
+ this option may be removed in the future
#### [`PAPERLESS_PORT=`](#PAPERLESS_PORT) {#PAPERLESS_PORT}
@@ -1527,6 +1669,11 @@ one pod).
Defaults to 8000.
+ !!! note
+
+ This option may also be set with `GRANIAN_PORT` and
+ this option may be removed in the future
+
#### [`USERMAP_UID=`](#USERMAP_UID) {#USERMAP_UID}
: The ID of the paperless user in the container. Set this to your
@@ -1623,7 +1770,7 @@ started by the container.
## Email sending
-Setting an SMTP server for the backend will allow you to reset your
+Setting an SMTP server for the backend will allow you to use the Email workflow action, send documents from the UI as well as reset your
password. All of these options come from their similarly-named [Django settings](https://docs.djangoproject.com/en/4.2/ref/settings/#email-host)
#### [`PAPERLESS_EMAIL_HOST=`](#PAPERLESS_EMAIL_HOST) {#PAPERLESS_EMAIL_HOST}
diff --git a/docs/development.md b/docs/development.md
index 11223d9f3..c624f97c4 100644
--- a/docs/development.md
+++ b/docs/development.md
@@ -60,7 +60,7 @@ first-time setup.
Every command is executed directly from the root folder of the project unless specified otherwise.
-1. Install prerequisites + pipenv as mentioned in
+1. Install prerequisites + [uv](https://github.com/astral-sh/uv) as mentioned in
[Bare metal route](setup.md#bare_metal).
2. Copy `paperless.conf.example` to `paperless.conf` and enable debug
@@ -75,37 +75,33 @@ first-time setup.
4. Install the Python dependencies:
```bash
- pipenv install --dev
+ $ uv sync --group dev
```
- !!! note
-
- Using a virtual environment is highly recommended. You can spawn one via `pipenv shell`.
-
5. Install pre-commit hooks:
```bash
- pre-commit install
+ $ uv run pre-commit install
```
-6. Apply migrations and create a superuser for your development instance:
+6. Apply migrations and create a superuser (also can be done via the web UI) for your development instance:
```bash
# src/
- python3 manage.py migrate
- python3 manage.py createsuperuser
+ $ uv run manage.py migrate
+ $ uv run manage.py createsuperuser
```
7. You can now either ...
- - install redis or
+ - install Redis or
- - use the included `scripts/start_services.sh` to use docker to fire
- up a redis instance (and some other services such as tika,
- gotenberg and a database server) or
+ - use the included `scripts/start_services.sh` to use Docker to fire
+ up a Redis instance (and some other services such as Tika,
+ Gotenberg and a database server) or
- - spin up a bare redis container
+ - spin up a bare Redis container
```
docker run -d -p 6379:6379 --restart unless-stopped redis:latest
@@ -144,14 +140,14 @@ To build the front end once use this command:
```bash
# src-ui/
-$ npm install
+$ pnpm install
$ ng build --configuration production
```
### Testing
- Run `pytest` in the `src/` directory to execute all tests. This also
- generates a HTML coverage report. When runnings test, `paperless.conf`
+ generates a HTML coverage report. When running tests, `paperless.conf`
is loaded as well. However, the tests rely on the default
configuration. This is not ideal. But for now, make sure no settings
except for DEBUG are overridden when testing.
@@ -164,10 +160,23 @@ $ ng build --configuration production
complicated IF cases. Append `# noqa: E501` to disable this check
for certain lines.
+### Package Management
+
+Paperless uses `uv` to manage packages and virtual environments for both development and production.
+To accomplish some common tasks using `uv`, follow the shortcuts below:
+
+To upgrade all locked packages to the latest allowed versions: `uv lock --upgrade`
+
+To upgrade a single locked package: `uv lock --upgrade-package `
+
+To add a new package: `uv add `
+
+To add a new development package `uv add --dev `
+
## Front end development
The front end is built using AngularJS. In order to get started, you need Node.js (version 14.15+) and
-`npm`.
+`pnpm`.
!!! note
@@ -176,7 +185,7 @@ The front end is built using AngularJS. In order to get started, you need Node.j
1. Install the Angular CLI. You might need sudo privileges to perform this command:
```bash
- npm install -g @angular/cli
+ pnpm install -g @angular/cli
```
2. Make sure that it's on your path.
@@ -184,7 +193,7 @@ The front end is built using AngularJS. In order to get started, you need Node.j
3. Install all necessary modules:
```bash
- npm install
+ pnpm install
```
4. You can launch a development server by running:
@@ -198,7 +207,7 @@ The front end is built using AngularJS. In order to get started, you need Node.j
restart it.
By default, the development server is available on `http://localhost:4200/` and is configured to access the API at
- `http://localhost:8000/api/`, which is the default of the backend. If you enabled `DEBUG` on the back end, several security overrides for allowed hosts, CORS and X-Frame-Options are in place so that the front end behaves exactly as in production.
+ `http://localhost:8000/api/`, which is the default of the backend. If you enabled `DEBUG` on the back end, several security overrides for allowed hosts and CORS are in place so that the front end behaves exactly as in production.
### Testing and code style
@@ -332,27 +341,21 @@ LANGUAGES = [
The documentation is built using material-mkdocs, see their [documentation](https://squidfunk.github.io/mkdocs-material/reference/).
If you want to build the documentation locally, this is how you do it:
-1. Have an active pipenv shell (`pipenv shell`) and install Python dependencies:
+1. Build the documentation
```bash
- pipenv install --dev
- ```
-
-2. Build the documentation
-
- ```bash
- mkdocs build --config-file mkdocs.yml
+ $ uv run mkdocs build --config-file mkdocs.yml
```
_alternatively..._
-3. Serve the documentation. This will spin up a
+2. Serve the documentation. This will spin up a
copy of the documentation at http://127.0.0.1:8000
that will automatically refresh every time you change
something.
```bash
- mkdocs serve
+ $ uv run mkdocs serve
```
## Building the Docker image
diff --git a/docs/faq.md b/docs/faq.md
index 2572dcf29..7db8d9dd7 100644
--- a/docs/faq.md
+++ b/docs/faq.md
@@ -112,27 +112,6 @@ able to run paperless, you're a bit on your own. If you can't run the
docker image, the documentation has instructions for bare metal
installs.
-## _How do I proxy this with NGINX?_
-
-**A:** See [the wiki](https://github.com/paperless-ngx/paperless-ngx/wiki/Using-a-Reverse-Proxy-with-Paperless-ngx#nginx).
-
-## _How do I get WebSocket support with Apache mod_wsgi_?
-
-**A:** `mod_wsgi` by itself does not support ASGI. Paperless will
-continue to work with WSGI, but certain features such as status
-notifications about document consumption won't be available.
-
-If you want to continue using `mod_wsgi`, you will have to run an
-ASGI-enabled web server as well that processes WebSocket connections,
-and configure Apache to redirect WebSocket connections to this server.
-Multiple options for ASGI servers exist:
-
-- `gunicorn` with `uvicorn` as the worker implementation (the default
- of paperless)
-- `daphne` as a standalone server, which is the reference
- implementation for ASGI.
-- `uvicorn` as a standalone server
-
## _What about the Redis licensing change and using one of the open source forks_?
Currently (October 2024), forks of Redis such as Valkey or Redirect are not officially supported by our upstream
diff --git a/docs/index.md b/docs/index.md
index c54171106..c1c06eb2b 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -30,7 +30,7 @@ physical documents into a searchable online archive so you can keep, well, _less
- Utilizes the open-source Tesseract engine to recognize more than 100 languages.
- Documents are saved as PDF/A format which is designed for long term storage, alongside the unaltered originals.
- Uses machine-learning to automatically add tags, correspondents and document types to your documents.
-- Supports PDF documents, images, plain text files, Office documents (Word, Excel, Powerpoint, and LibreOffice equivalents)[^1] and more.
+- Supports PDF documents, images, plain text files, Office documents (Word, Excel, PowerPoint, and LibreOffice equivalents)[^1] and more.
- Paperless stores your documents plain on disk. Filenames and folders are managed by paperless and their format can be configured freely with different configurations assigned to different documents.
- **Beautiful, modern web application** that features:
- Customizable dashboard with statistics.
@@ -197,7 +197,7 @@ People interested in continuing the work on paperless-ngx are encouraged to reac
### Translation
-Paperless-ngx is available in many languages that are coordinated on [Crowdin](https://crwd.in/paperless-ngx). If you want to help out by translating paperless-ngx into your language, please head over to the [Paperless-ngx project at Crowdin](https://crwd.in/paperless-ngx), and thank you!
+Paperless-ngx is available in many languages that are coordinated on [Crowdin](https://crowdin.com/project/paperless-ngx). If you want to help out by translating paperless-ngx into your language, please head over to the [Paperless-ngx project at Crowdin](https://crowdin.com/project/paperless-ngx), and thank you!
## Scanners & Software
diff --git a/docs/setup.md b/docs/setup.md
index f2b82d070..f239e5429 100644
--- a/docs/setup.md
+++ b/docs/setup.md
@@ -131,26 +131,11 @@ account. The script essentially automatically performs the steps described in [D
by default but you can change the image to pull from Docker Hub by changing the `image`
line to `image: paperlessngx/paperless-ngx:latest`.
-6. To be able to login, you will need a "superuser". To create it,
- execute the following command:
+6. Run `docker compose up -d`. This will create and start the necessary containers.
- ```shell-session
- docker compose run --rm webserver createsuperuser
- ```
-
- or using docker exec from within the container:
-
- ```shell-session
- python3 manage.py createsuperuser
- ```
-
- This will guide you through the superuser setup.
-
-7. Run `docker compose up -d`. This will create and start the necessary containers.
-
-8. Congratulations! Your Paperless-ngx instance should now be accessible at `http://127.0.0.1:8000`
- (or similar, depending on your configuration). Use the superuser credentials you have
- created in the previous step to login.
+7. Congratulations! Your Paperless-ngx instance should now be accessible at `http://127.0.0.1:8000`
+ (or similar, depending on your configuration). When you first access the web interface, you will be
+ prompted to create a superuser account.
### Build the Docker image yourself {#docker_build}
@@ -380,16 +365,21 @@ are released, dependency support is confirmed, etc.
dependencies. This is an alternative to the above and may require adjusting
the example scripts to utilize the virtual environment paths
-9. Go to `/opt/paperless/src`, and execute the following commands:
+ !!! tip
+
+ If you use modern Python tooling, such as `uv`, installation will not include
+ dependencies for Postgres or Mariadb. You can select those extras with `--extra `
+ or all with `--all-extras`
+
+9. Go to `/opt/paperless/src`, and execute the following command:
```bash
# This creates the database schema.
sudo -Hu paperless python3 manage.py migrate
-
- # This creates your first paperless user
- sudo -Hu paperless python3 manage.py createsuperuser
```
+ When you first access the web interface you will be prompted to create a superuser account.
+
10. Optional: Test that paperless is working by executing
```bash
@@ -426,31 +416,20 @@ are released, dependency support is confirmed, etc.
!!! note
- The `socket` script enables `gunicorn` to run on port 80 without
+ The `socket` script enables `granian` to run on port 80 without
root privileges. For this you need to uncomment the
`Require=paperless-webserver.socket` in the `webserver` script
- and configure `gunicorn` to listen on port 80 (see
- `paperless/gunicorn.conf.py`).
-
- You may need to adjust the path to the `gunicorn` executable. This
- will be installed as part of the python dependencies, and is either
- located in the `bin` folder of your virtual environment, or in
- `~/.local/bin/` if no virtual environment is used.
+ and configure `granian` to listen on port 80 (set `GRANIAN_PORT`).
These services rely on redis and optionally the database server, but
don't need to be started in any particular order. The example files
depend on redis being started. If you use a database server, you
should add additional dependencies.
- !!! warning
+ !!! note
- The included scripts run a `gunicorn` standalone server, which is
- fine for running paperless. It does support SSL, however, the
- documentation of GUnicorn states that you should use a proxy server
- in front of gunicorn instead.
-
- For instructions on how to use nginx for that,
- [see the wiki](https://github.com/paperless-ngx/paperless-ngx/wiki/Using-a-Reverse-Proxy-with-Paperless-ngx#nginx).
+ For instructions on using a reverse proxy,
+ [see the wiki](https://github.com/paperless-ngx/paperless-ngx/wiki/Using-a-Reverse-Proxy-with-Paperless-ngx#).
!!! warning
@@ -466,7 +445,7 @@ are released, dependency support is confirmed, etc.
13. Configure ImageMagick to allow processing of PDF documents. Most
distributions have this disabled by default, since PDF documents can
contain malware. If you don't do this, paperless will fall back to
- ghostscript for certain steps such as thumbnail generation.
+ Ghostscript for certain steps such as thumbnail generation.
Edit `/etc/ImageMagick-6/policy.xml` and adjust
@@ -713,7 +692,10 @@ Paperless runs on Raspberry Pi. However, some things are rather slow on
the Pi and configuring some options in paperless can help improve
performance immensely:
-- Stick with SQLite to save some resources.
+- Stick with SQLite to save some resources. See [troubleshooting](troubleshooting.md#log-reports-creating-paperlesstask-failed)
+ if you encounter issues with SQLite locking.
+- If you do not need the filesystem-based consumer, consider disabling it
+ entirely by setting [`PAPERLESS_CONSUMER_DISABLE`](configuration.md#PAPERLESS_CONSUMER_DISABLE) to `true`.
- Consider setting [`PAPERLESS_OCR_PAGES`](configuration.md#PAPERLESS_OCR_PAGES) to 1, so that paperless will
only OCR the first page of your documents. In most cases, this page
contains enough information to be able to find it.
diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md
index b076baf6b..87348e32e 100644
--- a/docs/troubleshooting.md
+++ b/docs/troubleshooting.md
@@ -130,7 +130,7 @@ command:
- 'gotenberg'
- '--chromium-disable-javascript=true'
- '--chromium-allow-list=file:///tmp/.*'
- - '--api-timeout=60'
+ - '--api-timeout=60s'
```
## Permission denied errors in the consumption directory
@@ -195,34 +195,6 @@ This might have multiple reasons.
is not, you need to compile the front end yourself or download the
release archive instead of cloning the repository.
-2. Check the output of the web server. You might see errors like this:
-
- ```
- [2021-01-25 10:08:04 +0000] [40] [ERROR] Socket error processing request.
- Traceback (most recent call last):
- File "/usr/local/lib/python3.7/site-packages/gunicorn/workers/sync.py", line 134, in handle
- self.handle_request(listener, req, client, addr)
- File "/usr/local/lib/python3.7/site-packages/gunicorn/workers/sync.py", line 190, in handle_request
- util.reraise(*sys.exc_info())
- File "/usr/local/lib/python3.7/site-packages/gunicorn/util.py", line 625, in reraise
- raise value
- File "/usr/local/lib/python3.7/site-packages/gunicorn/workers/sync.py", line 178, in handle_request
- resp.write_file(respiter)
- File "/usr/local/lib/python3.7/site-packages/gunicorn/http/wsgi.py", line 396, in write_file
- if not self.sendfile(respiter):
- File "/usr/local/lib/python3.7/site-packages/gunicorn/http/wsgi.py", line 386, in sendfile
- sent += os.sendfile(sockno, fileno, offset + sent, count)
- OSError: [Errno 22] Invalid argument
- ```
-
- To fix this issue, add
-
- ```
- SENDFILE=0
- ```
-
- to your `docker-compose.env` file.
-
## Error while reading metadata
You might find messages like these in your log files:
@@ -320,14 +292,16 @@ many workers attempting to access the database simultaneously.
Consider changing to the PostgreSQL database if you will be processing
many documents at once often. Otherwise, try tweaking the
[`PAPERLESS_DB_TIMEOUT`](configuration.md#PAPERLESS_DB_TIMEOUT) setting to allow more time for the database to
-unlock. This may have minor performance implications.
+unlock. Additionally, you can change your SQLite database to use ["Write-Ahead Logging"](https://sqlite.org/wal.html).
+These changes may have minor performance implications but can help
+prevent database locking issues.
-## gunicorn fails to start with "is not a valid port number"
+## granian fails to start with "is not a valid port number"
You are likely running using Kubernetes, which automatically creates an
environment variable named `${serviceName}_PORT`. This is
the same environment variable which is used by Paperless to optionally
-change the port gunicorn listens on.
+change the port granian listens on.
To fix this, set [`PAPERLESS_PORT`](configuration.md#PAPERLESS_PORT) again to your desired port, or the
default of 8000.
@@ -361,7 +335,7 @@ You may see errors when deleting documents like:
Data too long for column 'transaction_id' at row 1
```
-This error can occur in installations which have upgraded from a version of Paperless-ngx that used Django 4 (Paperless-ngx versions prior to v2.13.0) with a MariaDB/MySQL database. Due to the backawards-incompatible change in Django 5, the column "documents_document.transaction_id" will need to be re-created, which can be done with a one-time run of the following management command:
+This error can occur in installations which have upgraded from a version of Paperless-ngx that used Django 4 (Paperless-ngx versions prior to v2.13.0) with a MariaDB/MySQL database. Due to the backwards-incompatible change in Django 5, the column "documents_document.transaction_id" will need to be re-created, which can be done with a one-time run of the following management command:
```shell-session
$ python3 manage.py convert_mariadb_uuid
diff --git a/docs/usage.md b/docs/usage.md
index 027aa4e73..9310d9a2f 100644
--- a/docs/usage.md
+++ b/docs/usage.md
@@ -30,6 +30,9 @@ Each document has data fields that you can assign to them:
- A _document type_ is used to demarcate the type of a document such
as letter, bank statement, invoice, contract, etc. It is used to
identify what a document is about.
+- The document _storage path_ is the location where the document files
+ are stored. See [Storage Paths](advanced_usage.md#storage-paths) for
+ more information.
- The _date added_ of a document is the date the document was scanned
into paperless. You cannot and should not change this date.
- The _date created_ of a document is the date the document was
@@ -89,7 +92,7 @@ and more. These areas allow you to view, add, edit, delete and manage permission
for these objects. You can also manage saved views, mail accounts, mail rules,
workflows and more from the management sections.
-## Adding documents to paperless
+## Adding documents to Paperless-ngx
Once you've got Paperless setup, you need to start feeding documents
into it. When adding documents to paperless, it will perform the
@@ -115,7 +118,8 @@ following operations on your documents:
No matter which options you choose, Paperless will always store the
original document that it found in the consumption directory or in the
- mail and will never overwrite that document. Archived versions are
+ mail and will never overwrite that document (except when using certain
+ document actions, which make that clear). Archived versions are
stored alongside the original versions. Any files found in the
consumption directory will stored inside the Paperless-ngx file
structure and will not be retained in the consumption directory.
@@ -159,7 +163,7 @@ process.
Please see [the wiki](https://github.com/paperless-ngx/paperless-ngx/wiki/Related-Projects) for a user-maintained list of related projects and
software (e.g. for mobile devices) that is compatible with Paperless-ngx.
-### Email {#usage-email}
+### Incoming Email {#incoming-mail}
You can tell paperless-ngx to consume documents from your email
accounts. This is a very flexible and powerful feature, if you regularly
@@ -260,6 +264,31 @@ Once setup, navigating to the email settings page in Paperless-ngx will allow yo
You can also submit a document using the REST API, see [POSTing documents](api.md#file-uploads)
for details.
+## Sharing documents from Paperless-ngx
+
+Paperless-ngx supports sharing documents with other users by assigning them [permissions](#object-permissions)
+to the document. Document files can also be shared externally via [share links](#share-links), [email](#email-sharing)
+or using [email](#workflow-action-email) or [webhook](#workflow-action-webhook) actions in workflows.
+
+### Share Links
+
+"Share links" are shareable public links to files and can be created and managed under the 'Send' button on the document detail screen.
+
+- Share links do not require a user to login and thus link directly to a file.
+- Links are unique and are of the form `{paperless-url}/share/{randomly-generated-slug}`.
+- Links can optionally have an expiration time set.
+- After a link expires or is deleted users will be redirected to the regular paperless-ngx login.
+
+!!! tip
+
+ If your paperless-ngx instance is behind a reverse-proxy you may want to create an exception to bypass any authentication layers that are part of your setup in order to make links truly publicly-accessible. Of course, do so with caution.
+
+### Email Sharing {#email-sharing}
+
+Paperless-ngx supports directly sending documents via email. If an email server has been [configured](configuration.md#email-sending)
+the "Send" button on the document detail page will include an "Email" option. You can also share files via email automatically by using
+a [workflow action](#workflow-action-email).
+
## Permissions
Permissions in Paperless-ngx are based around ['global' permissions](#global-permissions) as well as
@@ -312,25 +341,25 @@ Global permissions define what areas of the app and API endpoints users can acce
determine if a user can create, edit, delete or view _any_ documents, but individual documents themselves
still have "object-level" permissions.
-| Type | Details |
-| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
-| AppConfig | _Change_ or higher permissions grants access to the "Application Configuration" area. |
-| Correspondent | Add, edit, delete or view Correspondents. |
-| CustomField | Add, edit, delete or view Custom Fields. |
-| Document | Add, edit, delete or view Documents. |
-| DocumentType | Add, edit, delete or view Document Types. |
-| Group | Add, edit, delete or view Groups. |
-| MailAccount | Add, edit, delete or view Mail Accounts. |
-| MailRule | Add, edit, delete or view Mail Rules. |
-| Note | Add, edit, delete or view Notes. |
-| PaperlessTask | View or dismiss (_Change_) File Tasks. |
-| SavedView | Add, edit, delete or view Saved Views. |
-| ShareLink | Add, delete or view Share Links. |
-| StoragePath | Add, edit, delete or view Storage Paths. |
-| Tag | Add, edit, delete or view Tags. |
-| UISettings | Add, edit, delete or view the UI settings that are used by the web app.
:warning: **Users that will access the web UI must be granted at least _View_ permissions.** |
-| User | Add, edit, delete or view Users. |
-| Workflow | Add, edit, delete or view Workflows.
Note that Workflows are global, in other words all users who can access workflows have access to the same set of them. |
+| Type | Details |
+| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| AppConfig | _Change_ or higher permissions grants access to the "Application Configuration" area. |
+| Correspondent | Add, edit, delete or view Correspondents. |
+| CustomField | Add, edit, delete or view Custom Fields. |
+| Document | Add, edit, delete or view Documents. |
+| DocumentType | Add, edit, delete or view Document Types. |
+| Group | Add, edit, delete or view Groups. |
+| MailAccount | Add, edit, delete or view Mail Accounts. |
+| MailRule | Add, edit, delete or view Mail Rules. |
+| Note | Add, edit, delete or view Notes. |
+| PaperlessTask | View or dismiss (_Change_) File Tasks. |
+| SavedView | Add, edit, delete or view Saved Views. |
+| ShareLink | Add, delete or view Share Links. |
+| StoragePath | Add, edit, delete or view Storage Paths. |
+| Tag | Add, edit, delete or view Tags. |
+| UISettings | Add, edit, delete or view the UI settings that are used by the web app.
:warning: **Users that will access the web UI must be granted at least _View_ permissions.** |
+| User | Add, edit, delete or view Users. |
+| Workflow | Add, edit, delete or view Workflows.
Note that Workflows are global; all users who can access workflows see the same set. Workflows have other permission implications — see [Workflow permissions](#workflow-permissions). |
#### Detailed Explanation of Object Permissions {#object-permissions}
@@ -369,7 +398,7 @@ fields and permissions, which will be merged.
### Workflow Triggers
-#### Types
+#### Types {#workflow-trigger-types}
Currently, there are three events that correspond to workflow trigger 'types':
@@ -381,7 +410,8 @@ Currently, there are three events that correspond to workflow trigger 'types':
3. **Document Updated**: when a document is updated. Similar to 'added' events, triggers can include filtering by content matching,
tags, doc type, or correspondent.
4. **Scheduled**: a scheduled trigger that can be used to run workflows at a specific time. The date used can be either the document
- added, created, updated date or you can specify a (date) custom field. You can also specify a day offset from the date.
+ added, created, updated date or you can specify a (date) custom field. You can also specify a day offset from the date (positive
+ offsets will trigger after the date, negative offsets will trigger before).
The following flow diagram illustrates the three document trigger types:
@@ -429,11 +459,11 @@ Workflows allow you to filter by:
### Workflow Actions
-#### Types
+#### Types {#workflow-action-types}
The following workflow action types are available:
-##### Assignment
+##### Assignment {#workflow-action-assignment}
"Assignment" actions can assign:
@@ -443,7 +473,7 @@ The following workflow action types are available:
- View and / or edit permissions to users or groups
- Custom fields. Note that no value for the field will be set
-##### Removal
+##### Removal {#workflow-action-removal}
"Removal" actions can remove either all of or specific sets of the following:
@@ -452,7 +482,7 @@ The following workflow action types are available:
- View and / or edit permissions
- Custom fields
-##### Email
+##### Email {#workflow-action-email}
"Email" actions can send documents via email. This action requires a mail server to be [configured](configuration.md#email-sending). You can specify:
@@ -460,7 +490,7 @@ The following workflow action types are available:
- The subject and body of the email, which can include placeholders, see [placeholders](usage.md#workflow-placeholders) below
- Whether to include the document as an attachment
-##### Webhook
+##### Webhook {#workflow-action-webhook}
"Webhook" actions send a POST request to a specified URL. You can specify:
@@ -469,6 +499,10 @@ The following workflow action types are available:
- Encoding for the request body, either JSON or form data
- The request headers as key-value pairs
+For security reasons, webhooks can be limited to specific ports and disallowed from connecting to local URLs. See the relevant
+[configuration settings](configuration.md#workflow-webhooks) to change this behavior. If you are allowing non-admins to create workflows,
+you may want to adjust these settings to prevent abuse.
+
#### Workflow placeholders
Some workflow text can include placeholders but the available options differ depending on the type of
@@ -506,7 +540,7 @@ The following placeholders are only available for "added" or "updated" triggers
All users who have application permissions for editing workflows can see the same set
of workflows. In other words, workflows themselves intentionally do not have an owner or permissions.
-Given their potentially far-reaching capabilities, you may want to restrict access to workflows.
+Given their potentially far-reaching capabilities, including changing the permissions of existing documents, you may want to restrict access to workflows.
Upon migration, existing installs will grant access to workflows to users who can add
documents (and superusers who can always access all parts of the app).
@@ -544,27 +578,16 @@ The following custom field types are supported:
- `Document Link`: reference(s) to other document(s) displayed as links, automatically creates a symmetrical link in reverse
- `Select`: a pre-defined list of strings from which the user can choose
-## Share Links
-
-Paperless-ngx added the ability to create shareable links to files in version 2.0. You can find the button for this on the document detail screen.
-
-- Share links do not require a user to login and thus link directly to a file.
-- Links are unique and are of the form `{paperless-url}/share/{randomly-generated-slug}`.
-- Links can optionally have an expiration time set.
-- After a link expires or is deleted users will be redirected to the regular paperless-ngx login.
-
-!!! tip
-
- If your paperless-ngx instance is behind a reverse-proxy you may want to create an exception to bypass any authentication layers that are part of your setup in order to make links truly publicly-accessible. Of course, do so with caution.
-
## PDF Actions
-Paperless-ngx supports four basic editing operations for PDFs (these operations currently cannot be performed on non-PDF files):
+Paperless-ngx supports basic editing operations for PDFs (these operations currently cannot be performed on non-PDF files). When viewing an individual document you can
+open the 'PDF Editor' to use a simple UI for re-arranging, rotating, deleting pages and splitting documents.
- Merging documents: available when selecting multiple documents for 'bulk editing'.
-- Rotating documents: available when selecting multiple documents for 'bulk editing' and from an individual document's details page.
-- Splitting documents: available from an individual document's details page.
-- Deleting pages: available from an individual document's details page.
+- Rotating documents: available when selecting multiple documents for 'bulk editing' and via the pdf editor on an individual document's details page.
+- Splitting documents: via the pdf editor on an individual document's details page.
+- Deleting pages: via the pdf editor on an individual document's details page.
+- Re-arranging pages: via the pdf editor on an individual document's details page.
!!! important
@@ -837,7 +860,7 @@ Paperless-ngx consists of the following components:
```shell-session
cd /path/to/paperless/src/
- gunicorn -c ../gunicorn.conf.py paperless.wsgi
+ granian --interface asginl --ws "paperless.asgi:application"
```
or by any other means such as Apache `mod_wsgi`.
diff --git a/gunicorn.conf.py b/gunicorn.conf.py
deleted file mode 100644
index 0e3878f8b..000000000
--- a/gunicorn.conf.py
+++ /dev/null
@@ -1,49 +0,0 @@
-import os
-
-# See https://docs.gunicorn.org/en/stable/settings.html for
-# explanations of settings
-
-bind = f"{os.getenv('PAPERLESS_BIND_ADDR', '[::]')}:{os.getenv('PAPERLESS_PORT', 8000)}"
-
-workers = int(os.getenv("PAPERLESS_WEBSERVER_WORKERS", 1))
-worker_class = "paperless.workers.ConfigurableWorker"
-timeout = 120
-preload_app = True
-
-# https://docs.gunicorn.org/en/stable/faq.html#blocking-os-fchmod
-worker_tmp_dir = "/dev/shm"
-
-
-def pre_fork(server, worker):
- pass
-
-
-def pre_exec(server):
- server.log.info("Forked child, re-executing.")
-
-
-def when_ready(server):
- server.log.info("Server is ready. Spawning workers")
-
-
-def worker_int(worker):
- worker.log.info("worker received INT or QUIT signal")
-
- ## get traceback info
- import sys
- import threading
- import traceback
-
- id2name = {th.ident: th.name for th in threading.enumerate()}
- code = []
- for threadId, stack in sys._current_frames().items():
- code.append(f"\n# Thread: {id2name.get(threadId, '')}({threadId})")
- for filename, lineno, name, line in traceback.extract_stack(stack):
- code.append(f'File: "{filename}", line {lineno}, in {name}')
- if line:
- code.append(f" {line.strip()}")
- worker.log.debug("\n".join(code))
-
-
-def worker_abort(worker):
- worker.log.info("worker received SIGABRT signal")
diff --git a/install-paperless-ngx.sh b/install-paperless-ngx.sh
index 3977cece9..648196030 100755
--- a/install-paperless-ngx.sh
+++ b/install-paperless-ngx.sh
@@ -52,12 +52,12 @@ if ! command -v wget &> /dev/null ; then
fi
if ! command -v docker &> /dev/null ; then
- echo "docker executable not found. Is docker installed?"
+ echo "docker executable not found. Is Docker installed?"
exit 1
fi
if ! docker compose &> /dev/null ; then
- echo "docker compose plugin not found. Is docker compose installed?"
+ echo "docker compose plugin not found. Is Docker Compose installed?"
exit 1
fi
@@ -66,7 +66,7 @@ fi
if ! docker stats --no-stream &> /dev/null ; then
echo ""
echo "WARN: It look like the current user does not have Docker permissions."
- echo "WARN: Use 'sudo usermod -aG docker $USER' to assign Docker permissions to the user (may require restarting shell)."
+ echo "WARN: Use 'sudo usermod -aG docker $USER' to assign Docker permissions to the user (may require restarting the shell)."
echo ""
sleep 3
fi
@@ -135,7 +135,7 @@ DATABASE_BACKEND=$ask_result
echo ""
echo "Paperless is able to use Apache Tika to support Office documents such as"
-echo "Word, Excel, Powerpoint, and Libreoffice equivalents. This feature"
+echo "Word, Excel, PowerPoint, and LibreOffice equivalents. This feature"
echo "requires more resources due to the required services."
echo ""
@@ -157,7 +157,7 @@ echo ""
echo "Specify the user id and group id you wish to run paperless as."
echo "Paperless will also change ownership on the data, media and consume"
echo "folder to the specified values, so it's a good idea to supply the user id"
-echo "and group id of your unix user account."
+echo "and group id of your Unix user account."
echo "If unsure, leave default."
echo ""
@@ -212,7 +212,7 @@ if [[ "$DATABASE_BACKEND" == "sqlite" ]] ; then
echo -n "SQLite database, the "
fi
echo "search index and other data."
-echo "As with the media folder, leave empty to have this managed by docker."
+echo "As with the media folder, leave empty to have this managed by Docker."
echo ""
echo "CAUTION: If specified, you must specify an absolute path starting with /"
echo "or a relative path starting with ./ here."
@@ -224,7 +224,7 @@ DATA_FOLDER=$ask_result
if [[ "$DATABASE_BACKEND" == "postgres" || "$DATABASE_BACKEND" == "mariadb" ]] ; then
echo ""
echo "The database folder, where your database stores its data."
- echo "Leave empty to have this managed by docker."
+ echo "Leave empty to have this managed by Docker."
echo ""
echo "CAUTION: If specified, you must specify an absolute path starting with /"
echo "or a relative path starting with ./ here."
@@ -276,18 +276,18 @@ echo ""
echo "Target folder: $TARGET_FOLDER"
echo "Consume folder: $CONSUME_FOLDER"
if [[ -z $MEDIA_FOLDER ]] ; then
- echo "Media folder: Managed by docker"
+ echo "Media folder: Managed by Docker"
else
echo "Media folder: $MEDIA_FOLDER"
fi
if [[ -z $DATA_FOLDER ]] ; then
- echo "Data folder: Managed by docker"
+ echo "Data folder: Managed by Docker"
else
echo "Data folder: $DATA_FOLDER"
fi
if [[ "$DATABASE_BACKEND" == "postgres" || "$DATABASE_BACKEND" == "mariadb" ]] ; then
if [[ -z $DATABASE_FOLDER ]] ; then
- echo "Database folder: Managed by docker"
+ echo "Database folder: Managed by Docker"
else
echo "Database folder: $DATABASE_FOLDER"
fi
diff --git a/mkdocs.yml b/mkdocs.yml
index fcaedaaee..05826f25f 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -11,14 +11,12 @@ theme:
toggle:
icon: material/brightness-auto
name: Switch to light mode
-
# Palette toggle for light mode
- media: "(prefers-color-scheme: light)"
scheme: default
toggle:
icon: material/brightness-7
name: Switch to dark mode
-
# Palette toggle for dark mode
- media: "(prefers-color-scheme: dark)"
scheme: slate
@@ -49,6 +47,7 @@ markdown_extensions:
- pymdownx.superfences
- pymdownx.inlinehilite
- pymdownx.snippets
+ - pymdownx.tilde
- footnotes
- pymdownx.superfences:
custom_fences:
@@ -60,17 +59,17 @@ markdown_extensions:
emoji_generator: !!python/name:material.extensions.emoji.to_svg
strict: true
nav:
- - index.md
- - setup.md
- - 'Basic Usage': usage.md
- - configuration.md
- - administration.md
- - advanced_usage.md
- - 'REST API': api.md
- - development.md
- - 'FAQs': faq.md
- - troubleshooting.md
- - changelog.md
+ - index.md
+ - setup.md
+ - 'Basic Usage': usage.md
+ - configuration.md
+ - administration.md
+ - advanced_usage.md
+ - 'REST API': api.md
+ - development.md
+ - 'FAQs': faq.md
+ - troubleshooting.md
+ - changelog.md
copyright: Copyright © 2016 - 2023 Daniel Quinn, Jonas Winkler, and the Paperless-ngx team
extra:
social:
@@ -83,5 +82,5 @@ extra:
plugins:
- search
- glightbox:
- skip_classes:
- - no-lightbox
+ skip_classes:
+ - no-lightbox
diff --git a/paperless.conf.example b/paperless.conf.example
index 63ee7be22..1ba21f41d 100644
--- a/paperless.conf.example
+++ b/paperless.conf.example
@@ -1,10 +1,6 @@
# Have a look at the docs for documentation.
# https://docs.paperless-ngx.com/configuration/
-# Debug. Only enable this for development.
-
-#PAPERLESS_DEBUG=false
-
# Required services
#PAPERLESS_REDIS=redis://localhost:6379
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 000000000..5a88510de
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,314 @@
+[project]
+name = "paperless-ngx"
+version = "2.18.1"
+description = "A community-supported supercharged document management system: scan, index and archive all your physical documents"
+readme = "README.md"
+requires-python = ">=3.10"
+classifiers = [
+ "Programming Language :: Python :: 3 :: Only",
+ "Programming Language :: Python :: 3.10",
+ "Programming Language :: Python :: 3.11",
+ "Programming Language :: Python :: 3.12",
+ "Programming Language :: Python :: 3.13",
+]
+# TODO: Move certain things to groups and then utilize that further
+# This will allow testing to not install a webserver, mysql, etc
+
+dependencies = [
+ "babel>=2.17",
+ "bleach~=6.2.0",
+ "celery[redis]~=5.5.1",
+ "channels~=4.2",
+ "channels-redis~=4.2",
+ "concurrent-log-handler~=0.9.25",
+ "dateparser~=1.2",
+ # WARNING: django does not use semver.
+ # Only patch versions are guaranteed to not introduce breaking changes.
+ "django~=5.2.5",
+ "django-allauth[socialaccount,mfa]~=65.4.0",
+ "django-auditlog~=3.2.1",
+ "django-cachalot~=2.8.0",
+ "django-celery-results~=2.6.0",
+ "django-compression-middleware~=0.5.0",
+ "django-cors-headers~=4.7.0",
+ "django-extensions~=4.1",
+ "django-filter~=25.1",
+ "django-guardian~=3.0.3",
+ "django-multiselectfield~=1.0.1",
+ "django-soft-delete~=1.0.18",
+ "djangorestframework~=3.16",
+ "djangorestframework-guardian~=0.4.0",
+ "drf-spectacular~=0.28",
+ "drf-spectacular-sidecar~=2025.8.1",
+ "drf-writable-nested~=0.7.1",
+ "filelock~=3.18.0",
+ "flower~=2.0.1",
+ "gotenberg-client~=0.10.0",
+ "httpx-oauth~=0.16",
+ "imap-tools~=1.11.0",
+ "inotifyrecursive~=0.3",
+ "jinja2~=3.1.5",
+ "langdetect~=1.0.9",
+ "nltk~=3.9.1",
+ "ocrmypdf~=16.10.0",
+ "pathvalidate~=3.3.1",
+ "pdf2image~=1.17.0",
+ "psycopg-pool",
+ "python-dateutil~=2.9.0",
+ "python-dotenv~=1.1.0",
+ "python-gnupg~=0.5.4",
+ "python-ipware~=3.0.0",
+ "python-magic~=0.4.27",
+ "pyzbar~=0.1.9",
+ "rapidfuzz~=3.13.0",
+ "redis[hiredis]~=5.2.1",
+ "scikit-learn~=1.7.0",
+ "setproctitle~=1.3.4",
+ "tika-client~=0.10.0",
+ "tqdm~=4.67.1",
+ "watchdog~=6.0",
+ "whitenoise~=6.9",
+ "whoosh-reloaded>=2.7.5",
+ "zxing-cpp~=2.3.0",
+]
+
+optional-dependencies.mariadb = [
+ "mysqlclient~=2.2.7",
+]
+optional-dependencies.postgres = [
+ "psycopg[c,pool]==3.2.9",
+ # Direct dependency for proper resolution of the pre-built wheels
+ "psycopg-c==3.2.9",
+ "psycopg-pool==3.2.6",
+]
+optional-dependencies.webserver = [
+ "granian[uvloop]~=2.4.1",
+]
+
+[dependency-groups]
+
+dev = [
+ { "include-group" = "docs" },
+ { "include-group" = "testing" },
+ { "include-group" = "lint" },
+]
+
+docs = [
+ "mkdocs-glightbox~=0.4.0",
+ "mkdocs-material~=9.6.4",
+]
+
+testing = [
+ "daphne",
+ "factory-boy~=3.3.1",
+ "imagehash",
+ "pytest~=8.4.1",
+ "pytest-cov~=6.2.1",
+ "pytest-django~=4.11.1",
+ "pytest-env",
+ "pytest-httpx",
+ "pytest-mock",
+ "pytest-rerunfailures",
+ "pytest-sugar",
+ "pytest-xdist",
+]
+
+lint = [
+ "pre-commit~=4.3.0",
+ "pre-commit-uv~=4.1.3",
+ "ruff~=0.12.2",
+]
+
+typing = [
+ "celery-types",
+ "django-filter-stubs",
+ "django-stubs[compatible-mypy]",
+ "djangorestframework-stubs[compatible-mypy]",
+ "mypy",
+ "types-bleach",
+ "types-colorama",
+ "types-dateparser",
+ "types-markdown",
+ "types-pygments",
+ "types-python-dateutil",
+ "types-redis",
+ "types-setuptools",
+ "types-tqdm",
+]
+
+[tool.ruff]
+target-version = "py310"
+line-length = 88
+src = [
+ "src",
+]
+respect-gitignore = true
+# https://docs.astral.sh/ruff/settings/
+fix = true
+show-fixes = true
+
+output-format = "grouped"
+# https://docs.astral.sh/ruff/rules/
+lint.extend-select = [
+ "COM", # https://docs.astral.sh/ruff/rules/#flake8-commas-com
+ "DJ", # https://docs.astral.sh/ruff/rules/#flake8-django-dj
+ "EXE", # https://docs.astral.sh/ruff/rules/#flake8-executable-exe
+ "FBT", # https://docs.astral.sh/ruff/rules/#flake8-boolean-trap-fbt
+ "FLY", # https://docs.astral.sh/ruff/rules/#flynt-fly
+ "G201", # https://docs.astral.sh/ruff/rules/#flake8-logging-format-g
+ "I", # https://docs.astral.sh/ruff/rules/#isort-i
+ "ICN", # https://docs.astral.sh/ruff/rules/#flake8-import-conventions-icn
+ "INP", # https://docs.astral.sh/ruff/rules/#flake8-no-pep420-inp
+ "ISC", # https://docs.astral.sh/ruff/rules/#flake8-implicit-str-concat-isc
+ "PIE", # https://docs.astral.sh/ruff/rules/#flake8-pie-pie
+ "PLC", # https://docs.astral.sh/ruff/rules/#pylint-pl
+ "PLE", # https://docs.astral.sh/ruff/rules/#pylint-pl
+ "PTH", # https://docs.astral.sh/ruff/rules/#flake8-use-pathlib-pth
+ "Q", # https://docs.astral.sh/ruff/rules/#flake8-quotes-q
+ "RSE", # https://docs.astral.sh/ruff/rules/#flake8-raise-rse
+ "RUF", # https://docs.astral.sh/ruff/rules/#ruff-specific-rules-ruf
+ "SIM", # https://docs.astral.sh/ruff/rules/#flake8-simplify-sim
+ "T20", # https://docs.astral.sh/ruff/rules/#flake8-print-t20
+ "TC", # https://docs.astral.sh/ruff/rules/#flake8-type-checking-tc
+ "TID", # https://docs.astral.sh/ruff/rules/#flake8-tidy-imports-tid
+ "UP", # https://docs.astral.sh/ruff/rules/#pyupgrade-up
+ "W", # https://docs.astral.sh/ruff/rules/#pycodestyle-e-w
+]
+lint.ignore = [
+ "DJ001",
+ "PLC0415",
+ "RUF012",
+ "SIM105",
+]
+# Migrations
+lint.per-file-ignores."*/migrations/*.py" = [
+ "E501",
+ "SIM",
+ "T201",
+]
+# Testing
+lint.per-file-ignores."*/tests/*.py" = [
+ "E501",
+ "SIM117",
+]
+lint.per-file-ignores.".github/scripts/*.py" = [
+ "E501",
+ "INP001",
+ "SIM117",
+]
+# Docker specific
+lint.per-file-ignores."docker/rootfs/usr/local/bin/wait-for-redis.py" = [
+ "INP001",
+ "T201",
+]
+lint.per-file-ignores."docker/wait-for-redis.py" = [
+ "INP001",
+ "T201",
+]
+lint.per-file-ignores."src/documents/management/commands/document_consumer.py" = [
+ "PTH",
+] # TODO Enable & remove
+lint.per-file-ignores."src/documents/migrations/1012_fix_archive_files.py" = [
+ "PTH",
+] # TODO Enable & remove
+lint.per-file-ignores."src/documents/models.py" = [
+ "SIM115",
+]
+lint.per-file-ignores."src/documents/parsers.py" = [
+ "PTH",
+] # TODO Enable & remove
+lint.per-file-ignores."src/paperless_tesseract/tests/test_parser.py" = [
+ "RUF001",
+]
+lint.isort.force-single-line = true
+
+[tool.codespell]
+write-changes = true
+ignore-words-list = "criterias,afterall,valeu,ureue,equest,ure,assertIn,Oktober"
+skip = "src-ui/src/locale/*,src-ui/pnpm-lock.yaml,src-ui/e2e/*,src/paperless_mail/tests/samples/*,src/documents/tests/samples/*,*.po,*.json"
+
+[tool.pytest.ini_options]
+minversion = "8.0"
+pythonpath = [
+ "src",
+]
+testpaths = [
+ "src/documents/tests/",
+ "src/paperless/tests/",
+ "src/paperless_mail/tests/",
+ "src/paperless_tesseract/tests/",
+ "src/paperless_tika/tests",
+ "src/paperless_text/tests/",
+]
+addopts = [
+ "--pythonwarnings=all",
+ "--cov",
+ "--cov-report=html",
+ "--cov-report=xml",
+ "--numprocesses=auto",
+ "--maxprocesses=16",
+ "--quiet",
+ "--durations=50",
+ "--junitxml=junit.xml",
+ "-o junit_family=legacy",
+]
+norecursedirs = [ "src/locale/", ".venv/", "src-ui/" ]
+
+DJANGO_SETTINGS_MODULE = "paperless.settings"
+
+[tool.pytest_env]
+PAPERLESS_DISABLE_DBHANDLER = "true"
+PAPERLESS_CACHE_BACKEND = "django.core.cache.backends.locmem.LocMemCache"
+
+[tool.coverage.run]
+source = [
+ "src/",
+]
+omit = [
+ "*/tests/*",
+ "manage.py",
+ "paperless/wsgi.py",
+ "paperless/auth.py",
+]
+
+[tool.coverage.report]
+exclude_also = [
+ "if settings.AUDIT_LOG_ENABLED:",
+ "if AUDIT_LOG_ENABLED:",
+ "if TYPE_CHECKING:",
+]
+
+[tool.mypy]
+plugins = [
+ "mypy_django_plugin.main",
+ "mypy_drf_plugin.main",
+ "numpy.typing.mypy_plugin",
+]
+check_untyped_defs = true
+disallow_any_generics = true
+disallow_incomplete_defs = true
+disallow_untyped_defs = true
+warn_redundant_casts = true
+warn_unused_ignores = true
+
+[tool.uv]
+required-version = ">=0.5.14"
+package = false
+environments = [
+ "sys_platform == 'darwin'",
+ "sys_platform == 'linux'",
+]
+
+[tool.uv.sources]
+# Markers are chosen to select these almost exclusively when building the Docker image
+psycopg-c = [
+ { url = "https://github.com/paperless-ngx/builder/releases/download/psycopg-3.2.9/psycopg_c-3.2.9-cp312-cp312-linux_x86_64.whl", marker = "sys_platform == 'linux' and platform_machine == 'x86_64' and python_version == '3.12'" },
+ { url = "https://github.com/paperless-ngx/builder/releases/download/psycopg-3.2.9/psycopg_c-3.2.9-cp312-cp312-linux_aarch64.whl", marker = "sys_platform == 'linux' and platform_machine == 'aarch64' and python_version == '3.12'" },
+]
+zxing-cpp = [
+ { url = "https://github.com/paperless-ngx/builder/releases/download/zxing-2.3.0/zxing_cpp-2.3.0-cp312-cp312-linux_x86_64.whl", marker = "sys_platform == 'linux' and platform_machine == 'x86_64' and python_version == '3.12'" },
+ { url = "https://github.com/paperless-ngx/builder/releases/download/zxing-2.3.0/zxing_cpp-2.3.0-cp312-cp312-linux_aarch64.whl", marker = "sys_platform == 'linux' and platform_machine == 'aarch64' and python_version == '3.12'" },
+]
+
+[tool.django-stubs]
+django_settings_module = "paperless.settings"
diff --git a/scripts/paperless-webserver.service b/scripts/paperless-webserver.service
index 14df6d5d2..9582d2980 100644
--- a/scripts/paperless-webserver.service
+++ b/scripts/paperless-webserver.service
@@ -9,7 +9,21 @@ Requires=redis.service
User=paperless
Group=paperless
WorkingDirectory=/opt/paperless/src
-ExecStart=/opt/paperless/.local/bin/gunicorn -c /opt/paperless/gunicorn.conf.py paperless.asgi:application
+
+Environment=GRANIAN_HOST=::
+Environment=GRANIAN_PORT=8000
+Environment=GRANIAN_WORKERS=1
+
+ExecStart=/bin/sh -c '\
+ # Host: GRANIAN_HOST -> PAPERLESS_BIND_ADDR -> default \
+ [ -n "$PAPERLESS_BIND_ADDR" ] && export GRANIAN_HOST=$PAPERLESS_BIND_ADDR; \
+ # Port: GRANIAN_PORT -> PAPERLESS_PORT -> default \
+ [ -n "$PAPERLESS_PORT" ] && export GRANIAN_PORT=$PAPERLESS_PORT; \
+ # Workers: GRANIAN_WORKERS -> PAPERLESS_WEBSERVER_WORKERS -> default \
+ [ -n "$PAPERLESS_WEBSERVER_WORKERS" ] && export GRANIAN_WORKERS=$PAPERLESS_WEBSERVER_WORKERS; \
+ # URL path prefix: only set if PAPERLESS_FORCE_SCRIPT_NAME exists \
+ [ -n "$PAPERLESS_FORCE_SCRIPT_NAME" ] && export GRANIAN_URL_PATH_PREFIX=$PAPERLESS_FORCE_SCRIPT_NAME; \
+ exec granian --interface asginl --ws "paperless.asgi:application"'
[Install]
WantedBy=multi-user.target
diff --git a/scripts/post-consumption-example.sh b/scripts/post-consumption-example.sh
index 154f9df71..fbcd0b4cf 100755
--- a/scripts/post-consumption-example.sh
+++ b/scripts/post-consumption-example.sh
@@ -6,6 +6,7 @@ A document with an id of ${DOCUMENT_ID} was just consumed. I know the
following additional information about it:
* Generated File Name: ${DOCUMENT_FILE_NAME}
+* Document type: ${DOCUMENT_TYPE}
* Archive Path: ${DOCUMENT_ARCHIVE_PATH}
* Source Path: ${DOCUMENT_SOURCE_PATH}
* Created: ${DOCUMENT_CREATED}
diff --git a/src-ui/.npmrc b/src-ui/.npmrc
new file mode 100644
index 000000000..bf2e7648b
--- /dev/null
+++ b/src-ui/.npmrc
@@ -0,0 +1 @@
+shamefully-hoist=true
diff --git a/src-ui/__mocks__/pdfjs-dist.ts b/src-ui/__mocks__/pdfjs-dist.ts
new file mode 100644
index 000000000..e975a40d4
--- /dev/null
+++ b/src-ui/__mocks__/pdfjs-dist.ts
@@ -0,0 +1,13 @@
+export const getDocument = jest.fn(() => ({
+ promise: Promise.resolve({ numPages: 3 }),
+}))
+
+export const GlobalWorkerOptions = { workerSrc: '' }
+export const VerbosityLevel = { ERRORS: 0 }
+
+globalThis.pdfjsLib = {
+ getDocument,
+ GlobalWorkerOptions,
+ VerbosityLevel,
+ AbortException: class AbortException extends Error {},
+}
diff --git a/src-ui/angular.json b/src-ui/angular.json
index c93770860..b55e441f3 100644
--- a/src-ui/angular.json
+++ b/src-ui/angular.json
@@ -27,6 +27,7 @@
"el-GR": "src/locale/messages.el_GR.xlf",
"en-GB": "src/locale/messages.en_GB.xlf",
"es-ES": "src/locale/messages.es_ES.xlf",
+ "fa-IR": "src/locale/messages.fa_IR.xlf",
"fi-FI": "src/locale/messages.fi_FI.xlf",
"fr-FR": "src/locale/messages.fr_FR.xlf",
"hu-HU": "src/locale/messages.hu_HU.xlf",
@@ -47,7 +48,9 @@
"sv-SE": "src/locale/messages.sv_SE.xlf",
"tr-TR": "src/locale/messages.tr_TR.xlf",
"uk-UA": "src/locale/messages.uk_UA.xlf",
- "zh-CN": "src/locale/messages.zh_CN.xlf"
+ "vi-VN": "src/locale/messages.vi_VN.xlf",
+ "zh-CN": "src/locale/messages.zh_CN.xlf",
+ "zh-TW": "src/locale/messages.zh_TW.xlf"
}
},
"architect": {
@@ -58,10 +61,12 @@
"path": "./extra-webpack.config.ts"
},
"outputPath": "dist/paperless-ui",
+ "main": "src/main.ts",
"outputHashing": "none",
"index": "src/index.html",
- "main": "src/main.ts",
- "polyfills": "src/polyfills.ts",
+ "polyfills": [
+ "src/polyfills.ts"
+ ],
"tsConfig": "tsconfig.app.json",
"localize": true,
"assets": [
@@ -84,12 +89,15 @@
"file-saver",
"utif"
],
- "vendorChunk": true,
"extractLicenses": false,
- "buildOptimizer": false,
"sourceMap": true,
"optimization": false,
- "namedChunks": true
+ "namedChunks": true,
+ "stylePreprocessorOptions": {
+ "includePaths": [
+ "."
+ ]
+ }
},
"configurations": {
"production": {
@@ -105,8 +113,6 @@
"sourceMap": false,
"namedChunks": false,
"extractLicenses": true,
- "vendorChunk": false,
- "buildOptimizer": true,
"budgets": [
{
"type": "initial",
@@ -177,7 +183,8 @@
"schematicCollections": [
"@angular-eslint/schematics"
],
- "analytics": false
+ "analytics": false,
+ "packageManager": "pnpm"
},
"schematics": {
"@angular-eslint/schematics:application": {
@@ -185,6 +192,30 @@
},
"@angular-eslint/schematics:library": {
"setParserOptionsProject": true
+ },
+ "@schematics/angular:component": {
+ "type": "component"
+ },
+ "@schematics/angular:directive": {
+ "type": "directive"
+ },
+ "@schematics/angular:service": {
+ "type": "service"
+ },
+ "@schematics/angular:guard": {
+ "typeSeparator": "."
+ },
+ "@schematics/angular:interceptor": {
+ "typeSeparator": "."
+ },
+ "@schematics/angular:module": {
+ "typeSeparator": "."
+ },
+ "@schematics/angular:pipe": {
+ "typeSeparator": "."
+ },
+ "@schematics/angular:resolver": {
+ "typeSeparator": "."
}
}
}
diff --git a/src-ui/e2e/document-list/document-list.spec.ts b/src-ui/e2e/document-list/document-list.spec.ts
index cd1a4c54e..45857bb09 100644
--- a/src-ui/e2e/document-list/document-list.spec.ts
+++ b/src-ui/e2e/document-list/document-list.spec.ts
@@ -83,10 +83,17 @@ test('date filtering', async ({ page }) => {
await page.routeFromHAR(REQUESTS_HAR3, { notFound: 'fallback' })
await page.goto('/documents')
await page.getByRole('button', { name: 'Dates' }).click()
- await page.getByRole('menuitem', { name: 'Within 3 months' }).first().click()
+ await page.locator('.ng-arrow-wrapper').first().click()
+ await page.getByRole('option', { name: 'Within 3 months' }).click()
await expect(page.locator('pngx-document-list')).toHaveText(/one document/i)
- await page.getByRole('menuitem', { name: 'Within 3 months' }).first().click()
- await page.getByLabel('Datesselected').getByRole('button').first().click()
+ await page
+ .getByRole('menuitem', { name: 'Relative dates' })
+ .locator('span')
+ .first()
+ .click()
+ await page.getByRole('option', { name: 'Within 3 months' }).click()
+ await page.getByLabel('Dates selected').locator('button').first().click()
+ await page.getByLabel('Dates selected').locator('button').first().click()
await page.getByRole('combobox', { name: 'Select month' }).selectOption('12')
await page.getByRole('combobox', { name: 'Select year' }).selectOption('2022')
await page.getByText('11', { exact: true }).click()
diff --git a/src-ui/jest.config.js b/src-ui/jest.config.js
index 78edc0822..aab8eb016 100644
--- a/src-ui/jest.config.js
+++ b/src-ui/jest.config.js
@@ -7,9 +7,20 @@ module.exports = {
'abstract-name-filter-service',
'abstract-paperless-service',
],
- transformIgnorePatterns: [`/node_modules/(?!.*\\.mjs$|lodash-es)`],
+ transformIgnorePatterns: [
+ `/node_modules/.pnpm/(?!.*\\.mjs$|lodash-es|@angular\\+common.*locales)`,
+ ],
moduleNameMapper: {
'^src/(.*)': '/src/$1',
},
workerIdleMemoryLimit: '512MB',
+ reporters: [
+ 'default',
+ [
+ 'jest-junit',
+ {
+ classNameTemplate: '{filepath}/{classname}: {title}',
+ },
+ ],
+ ],
}
diff --git a/src-ui/messages.xlf b/src-ui/messages.xlf
index a578445c5..8001d145b 100644
--- a/src-ui/messages.xlf
+++ b/src-ui/messages.xlf
@@ -5,227 +5,227 @@
Close
- node_modules/src/alert/alert.ts
- 51
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.1.4_@angular+core@20.1.4_@angular+_4264661dcfc97b5bf5cf26958990f623/node_modules/src/alert/alert.ts
+ 50
Slide of
- node_modules/src/carousel/carousel.ts
- 132,136
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.1.4_@angular+core@20.1.4_@angular+_4264661dcfc97b5bf5cf26958990f623/node_modules/src/carousel/carousel.ts
+ 131,135
Currently selected slide number read by screen reader
Previous
- node_modules/src/carousel/carousel.ts
- 148,149
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.1.4_@angular+core@20.1.4_@angular+_4264661dcfc97b5bf5cf26958990f623/node_modules/src/carousel/carousel.ts
+ 157,159
Next
- node_modules/src/carousel/carousel.ts
- 167,170
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.1.4_@angular+core@20.1.4_@angular+_4264661dcfc97b5bf5cf26958990f623/node_modules/src/carousel/carousel.ts
+ 198
Previous month
- node_modules/src/datepicker/datepicker-navigation.ts
- 77,79
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.1.4_@angular+core@20.1.4_@angular+_4264661dcfc97b5bf5cf26958990f623/node_modules/src/datepicker/datepicker-navigation.ts
+ 83,85
- node_modules/src/datepicker/datepicker-navigation.ts
- 97,98
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.1.4_@angular+core@20.1.4_@angular+_4264661dcfc97b5bf5cf26958990f623/node_modules/src/datepicker/datepicker-navigation.ts
+ 112
Next month
- node_modules/src/datepicker/datepicker-navigation.ts
- 102
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.1.4_@angular+core@20.1.4_@angular+_4264661dcfc97b5bf5cf26958990f623/node_modules/src/datepicker/datepicker-navigation.ts
+ 112
- node_modules/src/datepicker/datepicker-navigation.ts
- 102
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.1.4_@angular+core@20.1.4_@angular+_4264661dcfc97b5bf5cf26958990f623/node_modules/src/datepicker/datepicker-navigation.ts
+ 112
HH
- node_modules/src/ngb-config.ts
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.1.4_@angular+core@20.1.4_@angular+_4264661dcfc97b5bf5cf26958990f623/node_modules/src/ngb-config.ts
13
Close
- node_modules/src/ngb-config.ts
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.1.4_@angular+core@20.1.4_@angular+_4264661dcfc97b5bf5cf26958990f623/node_modules/src/ngb-config.ts
13
Select month
- node_modules/src/ngb-config.ts
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.1.4_@angular+core@20.1.4_@angular+_4264661dcfc97b5bf5cf26958990f623/node_modules/src/ngb-config.ts
13
- node_modules/src/ngb-config.ts
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.1.4_@angular+core@20.1.4_@angular+_4264661dcfc97b5bf5cf26958990f623/node_modules/src/ngb-config.ts
13
Hours
- node_modules/src/ngb-config.ts
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.1.4_@angular+core@20.1.4_@angular+_4264661dcfc97b5bf5cf26958990f623/node_modules/src/ngb-config.ts
13
MM
- node_modules/src/ngb-config.ts
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.1.4_@angular+core@20.1.4_@angular+_4264661dcfc97b5bf5cf26958990f623/node_modules/src/ngb-config.ts
13
Select year
- node_modules/src/ngb-config.ts
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.1.4_@angular+core@20.1.4_@angular+_4264661dcfc97b5bf5cf26958990f623/node_modules/src/ngb-config.ts
13
- node_modules/src/ngb-config.ts
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.1.4_@angular+core@20.1.4_@angular+_4264661dcfc97b5bf5cf26958990f623/node_modules/src/ngb-config.ts
13
Minutes
- node_modules/src/ngb-config.ts
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.1.4_@angular+core@20.1.4_@angular+_4264661dcfc97b5bf5cf26958990f623/node_modules/src/ngb-config.ts
13
Increment hours
- node_modules/src/ngb-config.ts
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.1.4_@angular+core@20.1.4_@angular+_4264661dcfc97b5bf5cf26958990f623/node_modules/src/ngb-config.ts
13
Decrement hours
- node_modules/src/ngb-config.ts
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.1.4_@angular+core@20.1.4_@angular+_4264661dcfc97b5bf5cf26958990f623/node_modules/src/ngb-config.ts
13
Increment minutes
- node_modules/src/ngb-config.ts
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.1.4_@angular+core@20.1.4_@angular+_4264661dcfc97b5bf5cf26958990f623/node_modules/src/ngb-config.ts
13
Decrement minutes
- node_modules/src/ngb-config.ts
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.1.4_@angular+core@20.1.4_@angular+_4264661dcfc97b5bf5cf26958990f623/node_modules/src/ngb-config.ts
13
SS
- node_modules/src/ngb-config.ts
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.1.4_@angular+core@20.1.4_@angular+_4264661dcfc97b5bf5cf26958990f623/node_modules/src/ngb-config.ts
13
Seconds
- node_modules/src/ngb-config.ts
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.1.4_@angular+core@20.1.4_@angular+_4264661dcfc97b5bf5cf26958990f623/node_modules/src/ngb-config.ts
13
Increment seconds
- node_modules/src/ngb-config.ts
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.1.4_@angular+core@20.1.4_@angular+_4264661dcfc97b5bf5cf26958990f623/node_modules/src/ngb-config.ts
13
Decrement seconds
- node_modules/src/ngb-config.ts
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.1.4_@angular+core@20.1.4_@angular+_4264661dcfc97b5bf5cf26958990f623/node_modules/src/ngb-config.ts
13
- node_modules/src/ngb-config.ts
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.1.4_@angular+core@20.1.4_@angular+_4264661dcfc97b5bf5cf26958990f623/node_modules/src/ngb-config.ts
13
@@ -233,7 +233,7 @@
- node_modules/src/progressbar/progressbar.ts
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.1.4_@angular+core@20.1.4_@angular+_4264661dcfc97b5bf5cf26958990f623/node_modules/src/progressbar/progressbar.ts
41,42
@@ -260,19 +260,19 @@
src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html
- 43
+ 44
src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html
- 46
+ 47
src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html
- 49
+ 50
src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.html
- 73
+ 58
@@ -324,7 +324,7 @@
src/app/components/document-list/document-list.component.ts
- 193
+ 190
src/app/components/manage/custom-fields/custom-fields.component.html
@@ -332,19 +332,19 @@
src/app/components/manage/management-list/management-list.component.html
- 102
+ 105
src/app/components/manage/management-list/management-list.component.html
- 102
+ 105
src/app/components/manage/management-list/management-list.component.html
- 102
+ 105
src/app/components/manage/management-list/management-list.component.html
- 102
+ 105
@@ -363,11 +363,11 @@
src/app/components/app-frame/app-frame.component.html
- 245
+ 253
src/app/components/app-frame/app-frame.component.html
- 247
+ 255
@@ -385,7 +385,7 @@
src/app/components/document-detail/document-detail.component.html
- 100
+ 109
@@ -534,7 +534,7 @@
src/app/components/document-detail/document-detail.component.html
- 353
+ 362
@@ -545,11 +545,11 @@
src/app/components/admin/settings/settings.component.html
- 364
+ 362
src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html
- 28
+ 26
src/app/components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component.html
@@ -557,7 +557,7 @@
src/app/components/common/edit-dialog/document-type-edit-dialog/document-type-edit-dialog.component.html
- 30
+ 28
src/app/components/common/edit-dialog/group-edit-dialog/group-edit-dialog.component.html
@@ -573,11 +573,11 @@
src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.html
- 79
+ 77
src/app/components/common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component.html
- 31
+ 29
src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html
@@ -593,7 +593,7 @@
src/app/components/document-detail/document-detail.component.html
- 346
+ 355
src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html
@@ -605,7 +605,7 @@
src/app/components/manage/saved-views/saved-views.component.html
- 73
+ 74
@@ -658,11 +658,11 @@
src/app/components/app-frame/app-frame.component.html
- 280
+ 288
src/app/components/app-frame/app-frame.component.html
- 283
+ 291
@@ -715,7 +715,7 @@
src/app/components/common/input/document-link/document-link.component.html
- 59
+ 58
src/app/components/common/permissions-dialog/permissions-dialog.component.html
@@ -735,11 +735,11 @@
src/app/components/dashboard/widgets/widget-frame/widget-frame.component.html
- 14
+ 18
src/app/components/document-detail/document-detail.component.html
- 366
+ 375
src/app/components/document-list/document-list.component.html
@@ -763,19 +763,19 @@
src/app/components/manage/management-list/management-list.component.html
- 51
+ 52
src/app/components/manage/management-list/management-list.component.html
- 51
+ 52
src/app/components/manage/management-list/management-list.component.html
- 51
+ 52
src/app/components/manage/management-list/management-list.component.html
- 51
+ 52
src/app/components/manage/saved-views/saved-views.component.html
@@ -995,11 +995,11 @@
src/app/components/app-frame/app-frame.component.html
- 205
+ 213
src/app/components/app-frame/app-frame.component.html
- 207
+ 215
src/app/components/manage/saved-views/saved-views.component.html
@@ -1013,74 +1013,149 @@
178
+
+ Show document counts in sidebar saved views
+
+ src/app/components/admin/settings/settings.component.html
+ 179
+
+
Document editing
src/app/components/admin/settings/settings.component.html
- 184
+ 185
Use PDF viewer provided by the browser
src/app/components/admin/settings/settings.component.html
- 188
+ 189
This is usually faster for displaying large PDF documents, but it might not work on some browsers.
src/app/components/admin/settings/settings.component.html
- 188
+ 189
-
- Default zoom:
+
+ Default zoom
src/app/components/admin/settings/settings.component.html
- 194
+ 195
Fit width
src/app/components/admin/settings/settings.component.html
- 198
+ 199
Fit page
src/app/components/admin/settings/settings.component.html
- 199
+ 200
Only applies to the Paperless-ngx PDF viewer.
src/app/components/admin/settings/settings.component.html
- 201
+ 202
Automatically remove inbox tag(s) on save
src/app/components/admin/settings/settings.component.html
- 207
+ 208
Show document thumbnail during loading
src/app/components/admin/settings/settings.component.html
- 213
+ 214
+
+
+
+ Global search
+
+ src/app/components/admin/settings/settings.component.html
+ 218
+
+
+ src/app/components/app-frame/global-search/global-search.component.ts
+ 122
+
+
+
+ Do not include advanced search results
+
+ src/app/components/admin/settings/settings.component.html
+ 221
+
+
+
+ Full search links to
+
+ src/app/components/admin/settings/settings.component.html
+ 227
+
+
+
+ Title and content search
+
+ src/app/components/admin/settings/settings.component.html
+ 231
+
+
+
+ Advanced search
+
+ src/app/components/admin/settings/settings.component.html
+ 232
+
+
+ src/app/components/app-frame/global-search/global-search.component.html
+ 24
+
+
+ src/app/components/document-list/filter-editor/filter-editor.component.ts
+ 191
+
+
+
+ Bulk editing
+
+ src/app/components/admin/settings/settings.component.html
+ 237
+
+
+
+ Show confirmation dialogs
+
+ src/app/components/admin/settings/settings.component.html
+ 240
+
+
+
+ Apply on close
+
+ src/app/components/admin/settings/settings.component.html
+ 241
Notes
src/app/components/admin/settings/settings.component.html
- 217
+ 245
src/app/components/document-list/document-list.component.html
@@ -1097,84 +1172,16 @@
Enable notes
-
- src/app/components/admin/settings/settings.component.html
- 220
-
-
-
- Bulk editing
-
- src/app/components/admin/settings/settings.component.html
- 224
-
-
-
- Show confirmation dialogs
-
- src/app/components/admin/settings/settings.component.html
- 227
-
-
-
- Apply on close
-
- src/app/components/admin/settings/settings.component.html
- 228
-
-
-
- Global search
-
- src/app/components/admin/settings/settings.component.html
- 232
-
-
- src/app/components/app-frame/global-search/global-search.component.ts
- 120
-
-
-
- Do not include advanced search results
-
- src/app/components/admin/settings/settings.component.html
- 235
-
-
-
- Full search links to
-
- src/app/components/admin/settings/settings.component.html
- 243
-
-
-
- Title and content search
-
- src/app/components/admin/settings/settings.component.html
- 247
-
-
-
- Advanced search
src/app/components/admin/settings/settings.component.html
248
-
- src/app/components/app-frame/global-search/global-search.component.html
- 24
-
-
- src/app/components/document-list/filter-editor/filter-editor.component.ts
- 173
-
Permissions
src/app/components/admin/settings/settings.component.html
- 262
+ 259
src/app/components/common/edit-dialog/group-edit-dialog/group-edit-dialog.component.html
@@ -1190,15 +1197,15 @@
src/app/components/document-detail/document-detail.component.html
- 322
+ 331
src/app/components/document-list/bulk-editor/bulk-editor.component.html
- 104
+ 97
src/app/components/document-list/filter-editor/filter-editor.component.html
- 105
+ 101
src/app/components/manage/mail/mail.component.html
@@ -1218,47 +1225,47 @@
src/app/components/manage/management-list/management-list.component.html
- 6
+ 7
src/app/components/manage/management-list/management-list.component.html
- 6
+ 7
src/app/components/manage/management-list/management-list.component.html
- 6
+ 7
src/app/components/manage/management-list/management-list.component.html
- 6
+ 7
Default Permissions
src/app/components/admin/settings/settings.component.html
- 265
+ 262
-
- Settings apply to this user account for objects (Tags, Mail Rules, etc.) created via the web UI
+
+ Settings apply to this user account for objects (Tags, Mail Rules, etc. but not documents) created via the web UI.
src/app/components/admin/settings/settings.component.html
- 269,271
+ 266,268
Default Owner
src/app/components/admin/settings/settings.component.html
- 276
+ 273
Objects without an owner can be viewed and edited by all users
src/app/components/admin/settings/settings.component.html
- 280
+ 277
src/app/components/common/input/permissions/permissions-form/permissions-form.component.html
@@ -1269,34 +1276,34 @@
Default View Permissions
src/app/components/admin/settings/settings.component.html
- 285
+ 282
Users:
src/app/components/admin/settings/settings.component.html
- 290
+ 287
src/app/components/admin/settings/settings.component.html
- 317
+ 314
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 200
+ 209
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 219
+ 228
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 286
+ 295
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 305
+ 314
src/app/components/common/input/permissions/permissions-form/permissions-form.component.html
@@ -1311,27 +1318,27 @@
Groups:
src/app/components/admin/settings/settings.component.html
- 300
+ 297
src/app/components/admin/settings/settings.component.html
- 327
+ 324
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 208
+ 217
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 227
+ 236
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 294
+ 303
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 313
+ 322
src/app/components/common/input/permissions/permissions-form/permissions-form.component.html
@@ -1346,22 +1353,22 @@
Default Edit Permissions
src/app/components/admin/settings/settings.component.html
- 312
+ 309
Edit permissions also grant viewing permissions
src/app/components/admin/settings/settings.component.html
- 336
+ 333
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 233
+ 242
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 319
+ 328
src/app/components/common/input/permissions/permissions-form/permissions-form.component.html
@@ -1372,7 +1379,7 @@
Notifications
src/app/components/admin/settings/settings.component.html
- 344
+ 341
src/app/components/app-frame/toasts-dropdown/toasts-dropdown.component.html
@@ -1383,57 +1390,57 @@
Document processing
src/app/components/admin/settings/settings.component.html
- 347
+ 344
Show notifications when new documents are detected
src/app/components/admin/settings/settings.component.html
- 351
+ 348
Show notifications when document processing completes successfully
src/app/components/admin/settings/settings.component.html
- 352
+ 349
Show notifications when document processing fails
src/app/components/admin/settings/settings.component.html
- 353
+ 350
Suppress notifications on dashboard
src/app/components/admin/settings/settings.component.html
- 354
+ 351
This will suppress all messages about document processing status on the dashboard.
src/app/components/admin/settings/settings.component.html
- 354
+ 351
Cancel
src/app/components/admin/settings/settings.component.html
- 365
+ 361
src/app/components/common/confirm-dialog/confirm-dialog.component.ts
- 50
+ 48
src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html
- 27
+ 25
src/app/components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component.html
@@ -1441,7 +1448,7 @@
src/app/components/common/edit-dialog/document-type-edit-dialog/document-type-edit-dialog.component.html
- 29
+ 27
src/app/components/common/edit-dialog/group-edit-dialog/group-edit-dialog.component.html
@@ -1457,11 +1464,11 @@
src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.html
- 78
+ 76
src/app/components/common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component.html
- 30
+ 28
src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html
@@ -1493,75 +1500,75 @@
src/app/components/manage/saved-views/saved-views.component.html
- 74
+ 73
Use system language
src/app/components/admin/settings/settings.component.ts
- 76
+ 78
Use date format of display language
src/app/components/admin/settings/settings.component.ts
- 79
+ 81
Error retrieving users
src/app/components/admin/settings/settings.component.ts
- 217
+ 225
src/app/components/admin/users-groups/users-groups.component.ts
- 59
+ 56
Error retrieving groups
src/app/components/admin/settings/settings.component.ts
- 236
+ 244
src/app/components/admin/users-groups/users-groups.component.ts
- 71
+ 68
Settings were saved successfully.
src/app/components/admin/settings/settings.component.ts
- 532
+ 547
Settings were saved successfully. Reload is required to apply some changes.
src/app/components/admin/settings/settings.component.ts
- 536
+ 551
Reload now
src/app/components/admin/settings/settings.component.ts
- 537
+ 552
An error occurred while saving settings.
src/app/components/admin/settings/settings.component.ts
- 547
+ 562
src/app/components/app-frame/app-frame.component.ts
- 161
+ 167
@@ -1572,11 +1579,11 @@
src/app/components/app-frame/app-frame.component.html
- 268
+ 276
src/app/components/app-frame/app-frame.component.html
- 270
+ 278
@@ -1591,19 +1598,19 @@
src/app/components/manage/management-list/management-list.component.html
- 3
+ 4
src/app/components/manage/management-list/management-list.component.html
- 3
+ 4
src/app/components/manage/management-list/management-list.component.html
- 3
+ 4
src/app/components/manage/management-list/management-list.component.html
- 3
+ 4
@@ -1689,35 +1696,35 @@
src/app/components/manage/management-list/management-list.component.html
- 20
+ 21
src/app/components/manage/management-list/management-list.component.html
- 20
+ 21
src/app/components/manage/management-list/management-list.component.html
- 20
+ 21
src/app/components/manage/management-list/management-list.component.html
- 20
+ 21
src/app/components/manage/management-list/management-list.component.html
- 37
+ 38
src/app/components/manage/management-list/management-list.component.html
- 37
+ 38
src/app/components/manage/management-list/management-list.component.html
- 37
+ 38
src/app/components/manage/management-list/management-list.component.html
- 37
+ 38
src/app/components/manage/workflows/workflows.component.html
@@ -1732,11 +1739,11 @@
src/app/components/common/dates-dropdown/dates-dropdown.component.html
- 11
+ 8
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts
- 83
+ 88
src/app/components/document-list/document-list.component.html
@@ -1793,7 +1800,7 @@
src/app/components/document-list/bulk-editor/bulk-editor.component.html
- 110
+ 103
src/app/components/manage/custom-fields/custom-fields.component.html
@@ -1809,19 +1816,19 @@
src/app/components/manage/management-list/management-list.component.html
- 43
+ 44
src/app/components/manage/management-list/management-list.component.html
- 43
+ 44
src/app/components/manage/management-list/management-list.component.html
- 43
+ 44
src/app/components/manage/management-list/management-list.component.html
- 43
+ 44
src/app/components/manage/saved-views/saved-views.component.html
@@ -1847,7 +1854,7 @@
src/app/components/admin/tasks/tasks.component.ts
- 157
+ 153
@@ -1910,56 +1917,56 @@
Dismiss selected
src/app/components/admin/tasks/tasks.component.ts
- 104
+ 108
Dismiss all
src/app/components/admin/tasks/tasks.component.ts
- 105
+ 109
Confirm Dismiss All
src/app/components/admin/tasks/tasks.component.ts
- 154
+ 150
Dismiss all tasks?
src/app/components/admin/tasks/tasks.component.ts
- 155
+ 151
queued
src/app/components/admin/tasks/tasks.component.ts
- 240
+ 236
started
src/app/components/admin/tasks/tasks.component.ts
- 242
+ 238
completed
src/app/components/admin/tasks/tasks.component.ts
- 244
+ 240
failed
src/app/components/admin/tasks/tasks.component.ts
- 246
+ 242
@@ -1970,11 +1977,11 @@
src/app/components/app-frame/app-frame.component.html
- 228
+ 236
src/app/components/app-frame/app-frame.component.html
- 231
+ 239
@@ -2062,7 +2069,7 @@
src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts
- 88
+ 87
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
@@ -2077,8 +2084,8 @@
19
- src/app/components/common/share-links-dropdown/share-links-dropdown.component.html
- 37
+ src/app/components/common/share-links-dialog/share-links-dialog.component.html
+ 36
src/app/components/document-detail/document-detail.component.html
@@ -2086,7 +2093,7 @@
src/app/components/document-list/bulk-editor/bulk-editor.component.html
- 164
+ 157
src/app/components/manage/custom-fields/custom-fields.component.html
@@ -2114,55 +2121,55 @@
src/app/components/manage/management-list/management-list.component.html
- 9
+ 10
src/app/components/manage/management-list/management-list.component.html
- 9
+ 10
src/app/components/manage/management-list/management-list.component.html
- 9
+ 10
src/app/components/manage/management-list/management-list.component.html
- 9
+ 10
src/app/components/manage/management-list/management-list.component.html
- 84
+ 87
src/app/components/manage/management-list/management-list.component.html
- 84
+ 87
src/app/components/manage/management-list/management-list.component.html
- 84
+ 87
src/app/components/manage/management-list/management-list.component.html
- 84
+ 87
src/app/components/manage/management-list/management-list.component.html
- 96
+ 99
src/app/components/manage/management-list/management-list.component.html
- 96
+ 99
src/app/components/manage/management-list/management-list.component.html
- 96
+ 99
src/app/components/manage/management-list/management-list.component.html
- 96
+ 99
src/app/components/manage/management-list/management-list.component.ts
- 224
+ 225
src/app/components/manage/saved-views/saved-views.component.html
@@ -2196,11 +2203,11 @@
src/app/components/manage/management-list/management-list.component.ts
- 220
+ 221
src/app/components/manage/management-list/management-list.component.ts
- 337
+ 338
@@ -2222,31 +2229,31 @@
src/app/components/admin/users-groups/users-groups.component.ts
- 124
+ 123
src/app/components/admin/users-groups/users-groups.component.ts
- 177
+ 176
src/app/components/manage/custom-fields/custom-fields.component.ts
- 103
+ 104
src/app/components/manage/mail/mail.component.ts
- 195
+ 191
src/app/components/manage/mail/mail.component.ts
- 296
+ 292
src/app/components/manage/management-list/management-list.component.ts
- 339
+ 340
src/app/components/manage/workflows/workflows.component.ts
- 137
+ 133
@@ -2327,11 +2334,11 @@
src/app/components/app-frame/app-frame.component.html
- 259
+ 267
src/app/components/app-frame/app-frame.component.html
- 261
+ 269
@@ -2433,35 +2440,35 @@
src/app/components/manage/management-list/management-list.component.html
- 83
+ 86
src/app/components/manage/management-list/management-list.component.html
- 83
+ 86
src/app/components/manage/management-list/management-list.component.html
- 83
+ 86
src/app/components/manage/management-list/management-list.component.html
- 83
+ 86
src/app/components/manage/management-list/management-list.component.html
- 93
+ 96
src/app/components/manage/management-list/management-list.component.html
- 93
+ 96
src/app/components/manage/management-list/management-list.component.html
- 93
+ 96
src/app/components/manage/management-list/management-list.component.html
- 93
+ 96
src/app/components/manage/workflows/workflows.component.html
@@ -2490,154 +2497,146 @@
Password has been changed, you will be logged out momentarily.
src/app/components/admin/users-groups/users-groups.component.ts
- 97
+ 94
src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts
- 198
+ 195
Saved user "".
src/app/components/admin/users-groups/users-groups.component.ts
- 104
+ 103
Error saving user.
src/app/components/admin/users-groups/users-groups.component.ts
- 114
+ 113
Confirm delete user account
src/app/components/admin/users-groups/users-groups.component.ts
- 122
+ 121
This operation will permanently delete this user account.
src/app/components/admin/users-groups/users-groups.component.ts
- 123
+ 122
Proceed
src/app/components/admin/users-groups/users-groups.component.ts
- 126
+ 125
src/app/components/admin/users-groups/users-groups.component.ts
- 179
+ 178
src/app/components/document-detail/document-detail.component.ts
- 958
+ 998
src/app/components/document-detail/document-detail.component.ts
- 1318
-
-
- src/app/components/document-detail/document-detail.component.ts
- 1357
-
-
- src/app/components/document-detail/document-detail.component.ts
- 1398
+ 1360
src/app/components/document-list/bulk-editor/bulk-editor.component.ts
- 796
+ 793
src/app/components/document-list/bulk-editor/bulk-editor.component.ts
- 829
+ 826
src/app/components/document-list/bulk-editor/bulk-editor.component.ts
- 848
+ 845
src/app/components/manage/custom-fields/custom-fields.component.ts
- 105
+ 106
src/app/components/manage/mail/mail.component.ts
- 197
+ 193
src/app/components/manage/mail/mail.component.ts
- 298
+ 294
src/app/components/manage/management-list/management-list.component.ts
- 341
+ 342
src/app/components/manage/workflows/workflows.component.ts
- 139
+ 135
Deleted user ""
src/app/components/admin/users-groups/users-groups.component.ts
- 132
+ 131
Error deleting user "".
src/app/components/admin/users-groups/users-groups.component.ts
- 139
+ 138
Saved group "".
src/app/components/admin/users-groups/users-groups.component.ts
- 159
+ 158
Error saving group.
src/app/components/admin/users-groups/users-groups.component.ts
- 167
+ 166
Confirm delete user group
src/app/components/admin/users-groups/users-groups.component.ts
- 175
+ 174
This operation will permanently delete this user group.
src/app/components/admin/users-groups/users-groups.component.ts
- 176
+ 175
Deleted group ""
src/app/components/admin/users-groups/users-groups.component.ts
- 185
+ 184
Error deleting group "".
src/app/components/admin/users-groups/users-groups.component.ts
- 192
+ 191
@@ -2676,11 +2675,11 @@
src/app/components/app-frame/app-frame.component.html
- 289
+ 297
src/app/components/app-frame/app-frame.component.html
- 292
+ 300
@@ -2698,36 +2697,36 @@
Open documents
src/app/components/app-frame/app-frame.component.html
- 131
+ 139
Close all
src/app/components/app-frame/app-frame.component.html
- 151
+ 159
src/app/components/app-frame/app-frame.component.html
- 153
+ 161
Manage
src/app/components/app-frame/app-frame.component.html
- 162
+ 170
Correspondents
src/app/components/app-frame/app-frame.component.html
- 168
+ 176
src/app/components/app-frame/app-frame.component.html
- 170
+ 178
src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html
@@ -2738,15 +2737,15 @@
Tags
src/app/components/app-frame/app-frame.component.html
- 175
+ 183
src/app/components/app-frame/app-frame.component.html
- 178
+ 186
src/app/components/common/input/tags/tags.component.ts
- 79
+ 80
src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html
@@ -2773,11 +2772,11 @@
Document Types
src/app/components/app-frame/app-frame.component.html
- 184
+ 192
src/app/components/app-frame/app-frame.component.html
- 186
+ 194
src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html
@@ -2788,11 +2787,11 @@
Storage Paths
src/app/components/app-frame/app-frame.component.html
- 191
+ 199
src/app/components/app-frame/app-frame.component.html
- 193
+ 201
src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html
@@ -2803,11 +2802,11 @@
Custom Fields
src/app/components/app-frame/app-frame.component.html
- 198
+ 206
src/app/components/app-frame/app-frame.component.html
- 200
+ 208
src/app/components/common/custom-fields-dropdown/custom-fields-dropdown.component.html
@@ -2822,11 +2821,11 @@
Workflows
src/app/components/app-frame/app-frame.component.html
- 214
+ 222
src/app/components/app-frame/app-frame.component.html
- 216
+ 224
src/app/components/manage/workflows/workflows.component.html
@@ -2837,92 +2836,92 @@
Mail
src/app/components/app-frame/app-frame.component.html
- 221
+ 229
src/app/components/app-frame/app-frame.component.html
- 224
+ 232
Administration
src/app/components/app-frame/app-frame.component.html
- 239
+ 247
Configuration
src/app/components/app-frame/app-frame.component.html
- 252
+ 260
src/app/components/app-frame/app-frame.component.html
- 254
+ 262
GitHub
src/app/components/app-frame/app-frame.component.html
- 299
+ 307
is available.
src/app/components/app-frame/app-frame.component.html
- 308,309
+ 316,317
Click to view.
src/app/components/app-frame/app-frame.component.html
- 309
+ 317
Paperless-ngx can automatically check for updates
src/app/components/app-frame/app-frame.component.html
- 313
+ 321
How does this work?
src/app/components/app-frame/app-frame.component.html
- 320,322
+ 328,330
Update available
src/app/components/app-frame/app-frame.component.html
- 333
+ 341
Sidebar views updated
src/app/components/app-frame/app-frame.component.ts
- 245
+ 251
Error updating sidebar views
src/app/components/app-frame/app-frame.component.ts
- 248
+ 254
An error occurred while saving update checking settings.
src/app/components/app-frame/app-frame.component.ts
- 269
+ 275
@@ -2978,7 +2977,7 @@
src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html
- 103
+ 104
src/app/components/document-detail/document-detail.component.html
@@ -2986,7 +2985,7 @@
src/app/components/document-list/bulk-editor/bulk-editor.component.html
- 136
+ 129
src/app/components/document-list/document-card-large/document-card-large.component.html
@@ -3092,22 +3091,22 @@
Successfully updated object.
src/app/components/app-frame/global-search/global-search.component.ts
- 209
+ 211
src/app/components/app-frame/global-search/global-search.component.ts
- 247
+ 249
Error occurred saving object.
src/app/components/app-frame/global-search/global-search.component.ts
- 212
+ 214
src/app/components/app-frame/global-search/global-search.component.ts
- 250
+ 252
@@ -3142,14 +3141,14 @@
Confirmation
src/app/components/common/confirm-dialog/confirm-dialog.component.ts
- 26
+ 24
Confirm
src/app/components/common/confirm-dialog/confirm-dialog.component.ts
- 38
+ 36
src/app/components/common/permissions-dialog/permissions-dialog.component.html
@@ -3157,72 +3156,31 @@
src/app/components/document-detail/document-detail.component.ts
- 911
+ 951
src/app/components/document-list/bulk-editor/bulk-editor.component.ts
- 439
+ 436
src/app/components/document-list/bulk-editor/bulk-editor.component.ts
- 479
+ 476
src/app/components/document-list/bulk-editor/bulk-editor.component.ts
- 517
+ 514
src/app/components/document-list/bulk-editor/bulk-editor.component.ts
- 555
+ 552
src/app/components/document-list/bulk-editor/bulk-editor.component.ts
- 617
+ 614
src/app/components/document-list/bulk-editor/bulk-editor.component.ts
- 750
-
-
-
- Page
-
- src/app/components/common/confirm-dialog/delete-pages-confirm-dialog/delete-pages-confirm-dialog.component.html
- 11
-
-
- src/app/components/common/confirm-dialog/split-confirm-dialog/split-confirm-dialog.component.html
- 11
-
-
- src/app/components/document-detail/document-detail.component.html
- 5
-
-
- src/app/components/document-list/bulk-editor/bulk-editor.component.html
- 11
-
-
-
- of
-
- src/app/components/common/confirm-dialog/delete-pages-confirm-dialog/delete-pages-confirm-dialog.component.html
- 13
-
-
- src/app/components/common/confirm-dialog/split-confirm-dialog/split-confirm-dialog.component.html
- 13
-
-
- src/app/components/document-detail/document-detail.component.html
- 7,8
-
-
-
- Pages to remove
-
- src/app/components/common/confirm-dialog/delete-pages-confirm-dialog/delete-pages-confirm-dialog.component.html
- 16
+ 747
@@ -3246,18 +3204,25 @@
24
+
+ Try to include archive version in merge for non-PDF files
+
+ src/app/components/common/confirm-dialog/merge-confirm-dialog/merge-confirm-dialog.component.html
+ 32
+
+
Delete original documents after successful merge
src/app/components/common/confirm-dialog/merge-confirm-dialog/merge-confirm-dialog.component.html
- 32
+ 36
Note that only PDFs will be included.
src/app/components/common/confirm-dialog/merge-confirm-dialog/merge-confirm-dialog.component.html
- 34
+ 39
@@ -3267,20 +3232,6 @@
25
-
- Add Split
-
- src/app/components/common/confirm-dialog/split-confirm-dialog/split-confirm-dialog.component.html
- 28
-
-
-
- Delete original document after successful split
-
- src/app/components/common/confirm-dialog/split-confirm-dialog/split-confirm-dialog.component.html
- 51
-
-
View
@@ -3318,7 +3269,7 @@
Saved field "".
src/app/components/common/custom-fields-dropdown/custom-fields-dropdown.component.ts
- 126
+ 130
src/app/components/manage/custom-fields/custom-fields.component.ts
@@ -3329,11 +3280,11 @@
Error saving field.
src/app/components/common/custom-fields-dropdown/custom-fields-dropdown.component.ts
- 135
+ 139
src/app/components/manage/custom-fields/custom-fields.component.ts
- 93
+ 94
@@ -3344,7 +3295,7 @@
src/app/components/common/dates-dropdown/dates-dropdown.component.html
- 50
+ 52
src/app/components/common/dates-dropdown/dates-dropdown.component.html
@@ -3352,12 +3303,16 @@
src/app/components/common/dates-dropdown/dates-dropdown.component.html
- 126
+ 128
src/app/components/common/dates-dropdown/dates-dropdown.component.html
152
+
+ src/app/components/common/dates-dropdown/dates-dropdown.component.ts
+ 106
+
src/app/components/common/input/date/date.component.html
21
@@ -3371,7 +3326,7 @@
src/app/components/common/dates-dropdown/dates-dropdown.component.html
- 51
+ 53
src/app/components/common/dates-dropdown/dates-dropdown.component.html
@@ -3379,7 +3334,7 @@
src/app/components/common/dates-dropdown/dates-dropdown.component.html
- 127
+ 129
src/app/components/common/dates-dropdown/dates-dropdown.component.html
@@ -3391,15 +3346,11 @@
src/app/components/document-detail/document-detail.component.html
- 94
-
-
- src/app/components/document-detail/document-detail.component.ts
- 1375
+ 103
src/app/guards/dirty-saved-view.guard.ts
- 37
+ 35
@@ -3502,8 +3453,8 @@
168
-
- now
+
+ Relative dates
src/app/components/common/dates-dropdown/dates-dropdown.component.html
25
@@ -3513,15 +3464,26 @@
101
+
+ now
+
+ src/app/components/common/dates-dropdown/dates-dropdown.component.html
+ 29
+
+
+ src/app/components/common/dates-dropdown/dates-dropdown.component.html
+ 105
+
+
From
src/app/components/common/dates-dropdown/dates-dropdown.component.html
- 42
+ 44
src/app/components/common/dates-dropdown/dates-dropdown.component.html
- 118
+ 120
@@ -3539,11 +3501,11 @@
Added
src/app/components/common/dates-dropdown/dates-dropdown.component.html
- 86
+ 84
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts
- 79
+ 84
src/app/components/document-list/document-list.component.html
@@ -3562,28 +3524,53 @@
Within 1 week
src/app/components/common/dates-dropdown/dates-dropdown.component.ts
- 67
+ 76
Within 1 month
src/app/components/common/dates-dropdown/dates-dropdown.component.ts
- 72
+ 81
Within 3 months
src/app/components/common/dates-dropdown/dates-dropdown.component.ts
- 77
+ 86
Within 1 year
src/app/components/common/dates-dropdown/dates-dropdown.component.ts
- 82
+ 91
+
+
+
+ This year
+
+ src/app/components/common/dates-dropdown/dates-dropdown.component.ts
+ 96
+
+
+
+ This month
+
+ src/app/components/common/dates-dropdown/dates-dropdown.component.ts
+ 101
+
+
+
+ Yesterday
+
+ src/app/components/common/dates-dropdown/dates-dropdown.component.ts
+ 111
+
+
+ src/app/pipes/custom-date.pipe.ts
+ 29
@@ -3628,37 +3615,37 @@
Case insensitive
src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html
- 18
+ 16
src/app/components/common/edit-dialog/document-type-edit-dialog/document-type-edit-dialog.component.html
- 19
+ 17
src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.html
- 69
+ 67
src/app/components/common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component.html
- 21
+ 19
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 163
+ 171
Create new correspondent
src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.ts
- 44
+ 43
Edit correspondent
src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.ts
- 48
+ 47
@@ -3714,56 +3701,56 @@
Create new custom field
src/app/components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component.ts
- 95
+ 93
Edit custom field
src/app/components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component.ts
- 99
+ 97
Create new document type
src/app/components/common/edit-dialog/document-type-edit-dialog/document-type-edit-dialog.component.ts
- 44
+ 43
Edit document type
src/app/components/common/edit-dialog/document-type-edit-dialog/document-type-edit-dialog.component.ts
- 48
+ 47
Create new item
src/app/components/common/edit-dialog/edit-dialog.component.ts
- 116
+ 121
Edit item
src/app/components/common/edit-dialog/edit-dialog.component.ts
- 120
+ 125
Create new user group
src/app/components/common/edit-dialog/group-edit-dialog/group-edit-dialog.component.ts
- 39
+ 36
Edit user group
src/app/components/common/edit-dialog/group-edit-dialog/group-edit-dialog.component.ts
- 43
+ 40
@@ -3834,49 +3821,49 @@
No encryption
src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.ts
- 24
+ 20
SSL
src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.ts
- 25
+ 21
STARTTLS
src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.ts
- 26
+ 22
Create new mail account
src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.ts
- 60
+ 54
Edit mail account
src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.ts
- 64
+ 58
Successfully connected to the mail server
src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.ts
- 109
+ 103
Unable to connect to the mail server
src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.ts
- 110
+ 104
@@ -4068,7 +4055,7 @@
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 188
+ 196
@@ -4086,7 +4073,7 @@
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 189
+ 197
@@ -4099,6 +4086,18 @@
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
111
+
+ src/app/components/common/system-status-dialog/system-status-dialog.component.html
+ 186
+
+
+ src/app/components/common/system-status-dialog/system-status-dialog.component.html
+ 220
+
+
+ src/app/components/common/system-status-dialog/system-status-dialog.component.html
+ 254
+
src/app/components/common/toast/toast.component.html
30
@@ -4108,158 +4107,158 @@
Only process attachments
src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts
- 39
+ 38
src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts
- 50
+ 49
Process all files, including 'inline' attachments
src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts
- 43
+ 42
Process message as .eml
src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts
- 54
+ 53
Process message as .eml and attachments separately
src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts
- 58
+ 57
System default
src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts
- 65
+ 64
Text, then HTML
src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts
- 69
+ 68
HTML, then text
src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts
- 73
+ 72
HTML only
src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts
- 77
+ 76
Text only
src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts
- 81
+ 80
Move to specified folder
src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts
- 92
+ 91
Mark as read, don't process read mails
src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts
- 96
+ 95
Flag the mail, don't process flagged mails
src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts
- 100
+ 99
Tag the mail with specified tag, don't process tagged mails
src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts
- 104
+ 103
Use subject as title
src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts
- 111
+ 110
Use attachment filename as title
src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts
- 115
+ 114
Do not assign title from this rule
src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts
- 119
+ 118
Do not assign a correspondent
src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts
- 126
+ 125
Use mail address
src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts
- 130
+ 129
Use name (or mail address if not available)
src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts
- 134
+ 133
Use correspondent selected below
src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts
- 138
+ 137
Create new mail rule
src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts
- 190
+ 191
Edit mail rule
src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts
- 194
+ 195
@@ -4270,7 +4269,7 @@
src/app/components/manage/storage-path-list/storage-path-list.component.ts
- 66
+ 50
@@ -4288,7 +4287,7 @@
src/app/components/document-detail/document-detail.component.html
- 288
+ 297
@@ -4320,21 +4319,21 @@
src/app/components/common/input/document-link/document-link.component.ts
- 63
+ 72
Create new storage path
src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.ts
- 83
+ 82
Edit storage path
src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.ts
- 87
+ 86
@@ -4345,7 +4344,7 @@
src/app/components/manage/tag-list/tag-list.component.ts
- 66
+ 50
@@ -4366,14 +4365,14 @@
Create new tag
src/app/components/common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component.ts
- 49
+ 46
Edit tag
src/app/components/common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component.ts
- 53
+ 50
@@ -4384,12 +4383,16 @@
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts
- 125
+ 130
src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html
10
+
+ src/app/components/document-detail/document-detail.component.html
+ 88
+
First name
@@ -4486,32 +4489,32 @@
Create new user account
src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.ts
- 71
+ 70
Edit user account
src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.ts
- 75
+ 74
Totp deactivated
src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.ts
- 131
+ 130
Totp deactivation failed
src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.ts
- 134
+ 133
src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.ts
- 139
+ 138
@@ -4582,409 +4585,423 @@
Offset days
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 126
+ 128
+
+
+
+ Positive values will trigger after the date, negative values before.
+
+ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
+ 132
Relative to
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 129
+ 137
Custom field
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 133
+ 141
Custom field to use for date.
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 133
+ 141
Recurring
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 139
+ 147
Trigger is recurring.
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 139
+ 147
Recurring interval days
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 143
+ 151
Repeat the trigger every n days.
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 143
+ 151
Trigger for documents that match all filters specified below.
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 148
+ 156
Filter filename
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 151
+ 159
Apply to documents that match this filename. Wildcards such as *.pdf or *invoice* are allowed. Case insensitive.
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 151
+ 159
Filter sources
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 153
+ 161
Filter path
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 154
+ 162
Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a>
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 154
+ 162
Filter mail rule
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 155
+ 163
Apply to documents consumed via this mail rule.
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 155
+ 163
Content matching algorithm
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 158
+ 166
Content matching pattern
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 160
+ 168
Has any of tags
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 169
+ 177
Has correspondent
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 170
+ 178
Has document type
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 171
+ 179
Action type
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 181
+ 189
Assign title
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 186
+ 194
Can include some placeholders, see <a target='_blank' href='https://docs.paperless-ngx.com/usage/#workflows'>documentation</a>.
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 186
+ 194
Assign tags
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 187
+ 195
Assign storage path
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 190
+ 198
Assign custom fields
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 191
+ 199
Assign owner
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 194
+ 203
Assign view permissions
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 196
+ 205
Assign edit permissions
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 215
+ 224
Remove tags
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 242
+ 251
Remove all
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 243
+ 252
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 249
+ 258
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 255
+ 264
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 261
+ 270
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 267
+ 276
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 274
+ 283
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 280
+ 289
Remove correspondents
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 248
+ 257
Remove document types
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 254
+ 263
Remove storage paths
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 260
+ 269
Remove custom fields
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 266
+ 275
Remove owners
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 273
+ 282
Remove permissions
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 279
+ 288
View permissions
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 282
+ 291
Edit permissions
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 301
+ 310
Email subject
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 329
+ 338
Email body
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 330
+ 339
Email recipients
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 331
+ 340
Attach document
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 332
+ 341
Webhook url
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 340
+ 349
Use parameters for webhook body
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 342
+ 351
Send webhook payload as JSON
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 343
+ 352
Webhook params
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 346
+ 355
Webhook body
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 348
+ 357
Webhook headers
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 350
+ 359
Include document
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
- 351
+ 360
Consume Folder
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts
- 64
+ 65
API Upload
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts
- 68
+ 69
Mail Fetch
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts
- 72
+ 73
+
+
+
+ Web UI
+
+ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts
+ 77
Modified
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts
- 87
+ 92
src/app/data/document.ts
@@ -4995,70 +5012,126 @@
Custom Field
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts
- 91
+ 96
Consumption Started
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts
- 98
+ 103
Document Added
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts
- 102
+ 107
Document Updated
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts
- 106
+ 111
Scheduled
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts
- 110
+ 115
Assignment
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts
- 117
+ 122
Removal
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts
- 121
+ 126
Webhook
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts
- 129
+ 134
Create new workflow
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts
- 225
+ 235
Edit workflow
src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts
- 229
+ 239
+
+
+
+ Email address(es)
+
+ src/app/components/common/email-document-dialog/email-document-dialog.component.html
+ 7
+
+
+
+ Subject
+
+ src/app/components/common/email-document-dialog/email-document-dialog.component.html
+ 11
+
+
+
+ Message
+
+ src/app/components/common/email-document-dialog/email-document-dialog.component.html
+ 15
+
+
+
+ Use archive version
+
+ src/app/components/common/email-document-dialog/email-document-dialog.component.html
+ 23
+
+
+
+ Send email
+
+ src/app/components/common/email-document-dialog/email-document-dialog.component.html
+ 29
+
+
+
+ Email Document
+
+ src/app/components/common/email-document-dialog/email-document-dialog.component.ts
+ 21
+
+
+
+ Email sent
+
+ src/app/components/common/email-document-dialog/email-document-dialog.component.ts
+ 66
+
+
+
+ Error emailing document
+
+ src/app/components/common/email-document-dialog/email-document-dialog.component.ts
+ 70
@@ -5082,24 +5155,24 @@
58
- src/app/components/common/share-links-dropdown/share-links-dropdown.component.html
- 64
+ src/app/components/common/share-links-dialog/share-links-dialog.component.html
+ 65
src/app/components/manage/management-list/management-list.component.html
- 12
+ 13
src/app/components/manage/management-list/management-list.component.html
- 12
+ 13
src/app/components/manage/management-list/management-list.component.html
- 12
+ 13
src/app/components/manage/management-list/management-list.component.html
- 12
+ 13
@@ -5120,7 +5193,7 @@
Not assigned
src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts
- 392
+ 82
Filter drop down element to filter for documents with no correspondent/type/tag assigned
@@ -5128,14 +5201,14 @@
Open filter
src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts
- 513
+ 555
Keyboard shortcuts
src/app/components/common/hotkey-dialog/hotkey-dialog.component.ts
- 22
+ 24
@@ -5215,7 +5288,7 @@
Filter documents with this
src/app/components/common/input/date/date.component.ts
- 123
+ 120
src/app/components/common/input/select/select.component.ts
@@ -5226,18 +5299,18 @@
Remove link
src/app/components/common/input/document-link/document-link.component.html
- 44
+ 43
src/app/components/common/input/document-link/document-link.component.html
- 51
+ 50
Open link
src/app/components/common/input/document-link/document-link.component.html
- 47
+ 46
src/app/components/common/input/url/url.component.html
@@ -5248,14 +5321,14 @@
Not found
src/app/components/common/input/document-link/document-link.component.html
- 52
+ 51
Search for documents
src/app/components/common/input/document-link/document-link.component.ts
- 72
+ 81
@@ -5335,7 +5408,11 @@
src/app/pipes/object-name.pipe.ts
- 43
+ 40
+
+
+ src/app/pipes/object-name.pipe.ts
+ 46
@@ -5384,6 +5461,104 @@
9
+
+ Select all pages
+
+ src/app/components/common/pdf-editor/pdf-editor.component.html
+ 9
+
+
+
+ Deselect all pages
+
+ src/app/components/common/pdf-editor/pdf-editor.component.html
+ 12
+
+
+
+ Rotate selected pages counter-clockwise
+
+ src/app/components/common/pdf-editor/pdf-editor.component.html
+ 17
+
+
+
+ Rotate selected pages clockwise
+
+ src/app/components/common/pdf-editor/pdf-editor.component.html
+ 20
+
+
+
+ Delete selected pages
+
+ src/app/components/common/pdf-editor/pdf-editor.component.html
+ 23
+
+
+
+ Rotate page counter-clockwise
+
+ src/app/components/common/pdf-editor/pdf-editor.component.html
+ 33
+
+
+
+ Rotate page clockwise
+
+ src/app/components/common/pdf-editor/pdf-editor.component.html
+ 36
+
+
+
+ Delete page
+
+ src/app/components/common/pdf-editor/pdf-editor.component.html
+ 41
+
+
+
+ Add / remove document split here
+
+ src/app/components/common/pdf-editor/pdf-editor.component.html
+ 44
+
+
+
+ Split here
+
+ src/app/components/common/pdf-editor/pdf-editor.component.html
+ 70
+
+
+
+ Create new document(s)
+
+ src/app/components/common/pdf-editor/pdf-editor.component.html
+ 82
+
+
+
+ Update existing document
+
+ src/app/components/common/pdf-editor/pdf-editor.component.html
+ 87
+
+
+
+ Copy metadata
+
+ src/app/components/common/pdf-editor/pdf-editor.component.html
+ 94
+
+
+
+ Delete original
+
+ src/app/components/common/pdf-editor/pdf-editor.component.html
+ 98
+
+
Merge with existing permissions
@@ -5469,7 +5644,7 @@
src/app/components/common/system-status-dialog/system-status-dialog.component.html
- 45
+ 56
@@ -5483,7 +5658,7 @@
Inherited from group
src/app/components/common/permissions-select/permissions-select.component.ts
- 75
+ 78
@@ -5497,7 +5672,7 @@
Open preview
src/app/components/common/preview-popup/preview-popup.component.ts
- 48
+ 52
@@ -5543,12 +5718,12 @@
155
- src/app/components/common/share-links-dropdown/share-links-dropdown.component.html
- 29
+ src/app/components/common/share-links-dialog/share-links-dialog.component.html
+ 28
src/app/components/common/system-status-dialog/system-status-dialog.component.html
- 156
+ 272
src/app/components/manage/mail/mail.component.html
@@ -5585,8 +5760,8 @@
162
- src/app/components/common/share-links-dropdown/share-links-dropdown.component.html
- 40
+ src/app/components/common/share-links-dialog/share-links-dialog.component.html
+ 39
@@ -5684,184 +5859,184 @@
Emails must match
src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts
- 146
+ 143
Passwords must match
src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts
- 174
+ 171
Profile updated successfully
src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts
- 195
+ 192
Error saving profile
src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts
- 207
+ 206
Error generating auth token
src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts
- 224
+ 223
Error disconnecting social account
src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts
- 249
+ 248
Error fetching TOTP settings
src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts
- 268
+ 267
TOTP activated successfully
src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts
- 289
+ 288
Error activating TOTP
src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts
- 291
+ 290
src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts
- 297
+ 296
TOTP deactivated successfully
src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts
- 313
+ 312
Error deactivating TOTP
src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts
- 315
+ 314
src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts
- 320
-
-
-
- Share Links
-
- src/app/components/common/share-links-dropdown/share-links-dropdown.component.html
- 4
-
-
- src/app/components/common/share-links-dropdown/share-links-dropdown.component.ts
- 32
+ 319
No existing links
- src/app/components/common/share-links-dropdown/share-links-dropdown.component.html
- 9,11
+ src/app/components/common/share-links-dialog/share-links-dialog.component.html
+ 8,10
Share
- src/app/components/common/share-links-dropdown/share-links-dropdown.component.html
- 33
+ src/app/components/common/share-links-dialog/share-links-dialog.component.html
+ 32
Share archive version
- src/app/components/common/share-links-dropdown/share-links-dropdown.component.html
- 47
+ src/app/components/common/share-links-dialog/share-links-dialog.component.html
+ 48
Expires
- src/app/components/common/share-links-dropdown/share-links-dropdown.component.html
- 51
+ src/app/components/common/share-links-dialog/share-links-dialog.component.html
+ 52
1 day
- src/app/components/common/share-links-dropdown/share-links-dropdown.component.ts
+ src/app/components/common/share-links-dialog/share-links-dialog.component.ts
25
- src/app/components/common/share-links-dropdown/share-links-dropdown.component.ts
- 111
+ src/app/components/common/share-links-dialog/share-links-dialog.component.ts
+ 102
7 days
- src/app/components/common/share-links-dropdown/share-links-dropdown.component.ts
+ src/app/components/common/share-links-dialog/share-links-dialog.component.ts
26
30 days
- src/app/components/common/share-links-dropdown/share-links-dropdown.component.ts
+ src/app/components/common/share-links-dialog/share-links-dialog.component.ts
27
Never
- src/app/components/common/share-links-dropdown/share-links-dropdown.component.ts
+ src/app/components/common/share-links-dialog/share-links-dialog.component.ts
28
+
+ Share Links
+
+ src/app/components/common/share-links-dialog/share-links-dialog.component.ts
+ 32
+
+
+ src/app/components/document-detail/document-detail.component.html
+ 84
+
+
Error retrieving links
- src/app/components/common/share-links-dropdown/share-links-dropdown.component.ts
- 92
+ src/app/components/common/share-links-dialog/share-links-dialog.component.ts
+ 83
days
- src/app/components/common/share-links-dropdown/share-links-dropdown.component.ts
- 111
+ src/app/components/common/share-links-dialog/share-links-dialog.component.ts
+ 102
Error deleting link
- src/app/components/common/share-links-dropdown/share-links-dropdown.component.ts
- 140
+ src/app/components/common/share-links-dialog/share-links-dialog.component.ts
+ 131
Error creating link
- src/app/components/common/share-links-dropdown/share-links-dropdown.component.ts
- 168
+ src/app/components/common/share-links-dialog/share-links-dialog.component.ts
+ 159
@@ -5882,49 +6057,49 @@
Install Type
src/app/components/common/system-status-dialog/system-status-dialog.component.html
- 24
+ 35
Server OS
src/app/components/common/system-status-dialog/system-status-dialog.component.html
- 26
+ 37
Media Storage
src/app/components/common/system-status-dialog/system-status-dialog.component.html
- 28
+ 39
available
src/app/components/common/system-status-dialog/system-status-dialog.component.html
- 31
+ 42
total
src/app/components/common/system-status-dialog/system-status-dialog.component.html
- 31
+ 42
Database
src/app/components/common/system-status-dialog/system-status-dialog.component.html
- 41
+ 52
Status
src/app/components/common/system-status-dialog/system-status-dialog.component.html
- 47
+ 58
src/app/components/common/toast/toast.component.html
@@ -5943,77 +6118,113 @@
Migration Status
src/app/components/common/system-status-dialog/system-status-dialog.component.html
- 56
+ 76
Up to date
src/app/components/common/system-status-dialog/system-status-dialog.component.html
- 59
+ 80
Latest Migration
src/app/components/common/system-status-dialog/system-status-dialog.component.html
- 64
+ 85
Pending Migrations
src/app/components/common/system-status-dialog/system-status-dialog.component.html
- 66
+ 87
-
- Tasks
+
+ Tasks Queue
src/app/components/common/system-status-dialog/system-status-dialog.component.html
- 83
+ 105
Redis Status
src/app/components/common/system-status-dialog/system-status-dialog.component.html
- 87
+ 109
Celery Status
src/app/components/common/system-status-dialog/system-status-dialog.component.html
- 96
+ 127
+
+
+
+ Health
+
+ src/app/components/common/system-status-dialog/system-status-dialog.component.html
+ 153
Search Index
src/app/components/common/system-status-dialog/system-status-dialog.component.html
- 105
+ 157
+
+
+
+ Run Task
+
+ src/app/components/common/system-status-dialog/system-status-dialog.component.html
+ 177
+
+
+ src/app/components/common/system-status-dialog/system-status-dialog.component.html
+ 211
+
+
+ src/app/components/common/system-status-dialog/system-status-dialog.component.html
+ 245
Last Updated
src/app/components/common/system-status-dialog/system-status-dialog.component.html
- 119
+ 184
Classifier
src/app/components/common/system-status-dialog/system-status-dialog.component.html
- 121
+ 189
Last Trained
src/app/components/common/system-status-dialog/system-status-dialog.component.html
- 139
+ 218
+
+
+
+ Sanity Checker
+
+ src/app/components/common/system-status-dialog/system-status-dialog.component.html
+ 223
+
+
+
+ Last Run
+
+ src/app/components/common/system-status-dialog/system-status-dialog.component.html
+ 252
@@ -6023,50 +6234,53 @@
43
+
+ Hint: saved views can be created from the documents list
+
+ src/app/components/dashboard/dashboard.component.html
+ 42
+
+
Hello , welcome to
src/app/components/dashboard/dashboard.component.ts
- 57
+ 61
Welcome to
src/app/components/dashboard/dashboard.component.ts
- 59
+ 63
Dashboard updated
src/app/components/dashboard/dashboard.component.ts
- 90
+ 94
Error updating dashboard
src/app/components/dashboard/dashboard.component.ts
- 93
+ 97
Show all
src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html
- 9
-
-
- src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.html
- 39
+ 10
Filter by correspondent
src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html
- 53
+ 54
src/app/components/document-list/document-card-large/document-card-large.component.html
@@ -6081,7 +6295,7 @@
Filter by document type
src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html
- 63
+ 64
src/app/components/document-list/document-card-large/document-card-large.component.html
@@ -6096,7 +6310,7 @@
Filter by storage path
src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html
- 68
+ 69
src/app/components/document-list/document-card-large/document-card-large.component.html
@@ -6111,14 +6325,14 @@
Filter by owner
src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html
- 73
+ 74
Yes
src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html
- 83
+ 84
src/app/components/document-list/document-list.component.html
@@ -6129,7 +6343,7 @@
No
src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html
- 83
+ 84
src/app/components/document-list/document-list.component.html
@@ -6140,7 +6354,7 @@
No documents
src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html
- 148
+ 149
@@ -6196,76 +6410,61 @@
Other
src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.ts
- 83
+ 79
-
- Upload new documents
+
+ Upload documents
src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.html
- 1
+ 6
-
- Drop documents anywhere or
+
+ or drop files anywhere
src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.html
- 4
-
-
-
- Browse files
-
- src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.html
- 5
+ 7
Dismiss completed
src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.html
- 20
+ 23
This button dismisses all status messages about processed documents on the dashboard (failed and successful)
-
- {VAR_PLURAL, plural, =1 {One more document} other { more documents}}
-
- src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.html
- 37
-
- This is shown as a summary line when there are more than 5 document in the processing pipeline.
-
Processing:
src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.ts
- 67
+ 57
Failed:
src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.ts
- 70
+ 60
Added:
src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.ts
- 73
+ 63
,
src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.ts
- 76
+ 66
src/app/components/document-list/bulk-editor/bulk-editor.component.ts
- 384
+ 381
this string is used to separate processing, failed and added on the file upload widget
@@ -6311,6 +6510,24 @@
1
+
+ Page
+
+ src/app/components/document-detail/document-detail.component.html
+ 5
+
+
+ src/app/components/document-list/bulk-editor/bulk-editor.component.html
+ 11
+
+
+
+ of
+
+ src/app/components/document-detail/document-detail.component.html
+ 7,8
+
+
-
@@ -6340,7 +6557,7 @@
src/app/components/document-list/bulk-editor/bulk-editor.component.html
- 114
+ 107
@@ -6354,50 +6571,43 @@
69
-
- Split
+
+ PDF Editor
src/app/components/document-detail/document-detail.component.html
62
-
-
- Rotate
- src/app/components/document-detail/document-detail.component.html
- 66
-
-
- src/app/components/document-list/bulk-editor/bulk-editor.component.html
- 117
+ src/app/components/document-detail/document-detail.component.ts
+ 1359
-
- Delete page(s)
+
+ Send
src/app/components/document-detail/document-detail.component.html
- 70
+ 80
Previous
src/app/components/document-detail/document-detail.component.html
- 97
+ 106
Details
src/app/components/document-detail/document-detail.component.html
- 110
+ 119
Title
src/app/components/document-detail/document-detail.component.html
- 113
+ 122
src/app/components/document-list/document-list.component.html
@@ -6405,7 +6615,7 @@
src/app/components/document-list/filter-editor/filter-editor.component.ts
- 160
+ 178
src/app/data/document.ts
@@ -6420,25 +6630,25 @@
Archive serial number
src/app/components/document-detail/document-detail.component.html
- 114
+ 123
Date created
src/app/components/document-detail/document-detail.component.html
- 115
+ 124
Correspondent
src/app/components/document-detail/document-detail.component.html
- 117
+ 126
src/app/components/document-list/bulk-editor/bulk-editor.component.html
- 37
+ 35
src/app/components/document-list/document-list.component.html
@@ -6446,7 +6656,7 @@
src/app/components/document-list/filter-editor/filter-editor.component.html
- 52
+ 50
src/app/data/document.ts
@@ -6461,11 +6671,11 @@
Document type
src/app/components/document-detail/document-detail.component.html
- 119
+ 128
src/app/components/document-list/bulk-editor/bulk-editor.component.html
- 52
+ 49
src/app/components/document-list/document-list.component.html
@@ -6473,7 +6683,7 @@
src/app/components/document-list/filter-editor/filter-editor.component.html
- 64
+ 61
src/app/data/document.ts
@@ -6488,11 +6698,11 @@
Storage path
src/app/components/document-detail/document-detail.component.html
- 121
+ 130
src/app/components/document-list/bulk-editor/bulk-editor.component.html
- 67
+ 63
src/app/components/document-list/document-list.component.html
@@ -6500,7 +6710,7 @@
src/app/components/document-list/filter-editor/filter-editor.component.html
- 76
+ 72
src/app/data/document.ts
@@ -6511,7 +6721,7 @@
Default
src/app/components/document-detail/document-detail.component.html
- 122
+ 131
src/app/components/manage/saved-views/saved-views.component.html
@@ -6522,14 +6732,14 @@
Content
src/app/components/document-detail/document-detail.component.html
- 218
+ 227
Metadata
src/app/components/document-detail/document-detail.component.html
- 227
+ 236
src/app/components/document-detail/metadata-collapse/metadata-collapse.component.ts
@@ -6540,119 +6750,119 @@
Date modified
src/app/components/document-detail/document-detail.component.html
- 234
+ 243
Date added
src/app/components/document-detail/document-detail.component.html
- 238
+ 247
Media filename
src/app/components/document-detail/document-detail.component.html
- 242
+ 251
Original filename
src/app/components/document-detail/document-detail.component.html
- 246
+ 255
Original MD5 checksum
src/app/components/document-detail/document-detail.component.html
- 250
+ 259
Original file size
src/app/components/document-detail/document-detail.component.html
- 254
+ 263
Original mime type
src/app/components/document-detail/document-detail.component.html
- 258
+ 267
Archive MD5 checksum
src/app/components/document-detail/document-detail.component.html
- 263
+ 272
Archive file size
src/app/components/document-detail/document-detail.component.html
- 269
+ 278
Original document metadata
src/app/components/document-detail/document-detail.component.html
- 278
+ 287
Archived document metadata
src/app/components/document-detail/document-detail.component.html
- 281
+ 290
Notes
src/app/components/document-detail/document-detail.component.html
- 300,303
+ 309,312
History
src/app/components/document-detail/document-detail.component.html
- 311
+ 320
Save & next
src/app/components/document-detail/document-detail.component.html
- 348
+ 357
Save & close
src/app/components/document-detail/document-detail.component.html
- 351
+ 360
Document loading...
src/app/components/document-detail/document-detail.component.html
- 361
+ 370
Enter Password
src/app/components/document-detail/document-detail.component.html
- 415
+ 424
@@ -6694,266 +6904,192 @@
Next document
src/app/components/document-detail/document-detail.component.ts
- 546
+ 555
Previous document
src/app/components/document-detail/document-detail.component.ts
- 556
+ 565
Close document
src/app/components/document-detail/document-detail.component.ts
- 564
+ 573
src/app/services/open-documents.service.ts
- 116
+ 130
Save document
src/app/components/document-detail/document-detail.component.ts
- 571
+ 580
Save and close / next
src/app/components/document-detail/document-detail.component.ts
- 580
+ 589
Error retrieving metadata
src/app/components/document-detail/document-detail.component.ts
- 632
+ 641
Error retrieving suggestions.
src/app/components/document-detail/document-detail.component.ts
- 661
+ 670
Document "" saved successfully.
src/app/components/document-detail/document-detail.component.ts
- 813
+ 845
src/app/components/document-detail/document-detail.component.ts
- 829
+ 869
Error saving document ""
src/app/components/document-detail/document-detail.component.ts
- 835
+ 875
Error saving document
src/app/components/document-detail/document-detail.component.ts
- 880
+ 920
Do you really want to move the document "" to the trash?
src/app/components/document-detail/document-detail.component.ts
- 912
+ 952
Documents can be restored prior to permanent deletion.
src/app/components/document-detail/document-detail.component.ts
- 913
+ 953
src/app/components/document-list/bulk-editor/bulk-editor.component.ts
- 752
+ 749
Move to trash
src/app/components/document-detail/document-detail.component.ts
- 915
+ 955
src/app/components/document-list/bulk-editor/bulk-editor.component.ts
- 754
+ 751
Error deleting document
src/app/components/document-detail/document-detail.component.ts
- 934
+ 974
Reprocess confirm
src/app/components/document-detail/document-detail.component.ts
- 954
+ 994
src/app/components/document-list/bulk-editor/bulk-editor.component.ts
- 792
+ 789
This operation will permanently recreate the archive file for this document.
src/app/components/document-detail/document-detail.component.ts
- 955
+ 995
The archive file will be re-generated with the current settings.
src/app/components/document-detail/document-detail.component.ts
- 956
+ 996
Reprocess operation for "" will begin in the background. Close and re-open or reload this document after the operation has completed to see new content.
src/app/components/document-detail/document-detail.component.ts
- 966
+ 1006
Error executing operation
src/app/components/document-detail/document-detail.component.ts
- 977
+ 1017
Error downloading document
src/app/components/document-detail/document-detail.component.ts
- 1024
+ 1066
Page Fit
src/app/components/document-detail/document-detail.component.ts
- 1103
+ 1143
-
- Split confirm
+
+ PDF edit operation for "" will begin in the background.
src/app/components/document-detail/document-detail.component.ts
- 1316
+ 1378
-
- This operation will split the selected document(s) into new documents.
+
+ Error executing PDF edit operation
src/app/components/document-detail/document-detail.component.ts
- 1317
-
-
-
- Split operation for "" will begin in the background.
-
- src/app/components/document-detail/document-detail.component.ts
- 1333
-
-
-
- Error executing split operation
-
- src/app/components/document-detail/document-detail.component.ts
- 1342
-
-
-
- Rotate confirm
-
- src/app/components/document-detail/document-detail.component.ts
- 1355
-
-
- src/app/components/document-list/bulk-editor/bulk-editor.component.ts
- 826
-
-
-
- This operation will permanently rotate the original version of the current document.
-
- src/app/components/document-detail/document-detail.component.ts
- 1356
-
-
-
- Rotation of "" will begin in the background. Close and re-open the document after the operation has completed to see the changes.
-
- src/app/components/document-detail/document-detail.component.ts
- 1372
-
-
-
- Error executing rotate operation
-
- src/app/components/document-detail/document-detail.component.ts
- 1384
-
-
-
- Delete pages confirm
-
- src/app/components/document-detail/document-detail.component.ts
- 1396
-
-
-
- This operation will permanently delete the selected pages from the original document.
-
- src/app/components/document-detail/document-detail.component.ts
- 1397
-
-
-
- Delete pages operation for "" will begin in the background. Close and re-open or reload this document after the operation has completed to see the changes.
-
- src/app/components/document-detail/document-detail.component.ts
- 1412
-
-
-
- Error executing delete pages operation
-
- src/app/components/document-detail/document-detail.component.ts
- 1421
+ 1390
An error occurred loading tiff:
src/app/components/document-detail/document-detail.component.ts
- 1461
+ 1450
src/app/components/document-detail/document-detail.component.ts
- 1465
+ 1454
@@ -6992,122 +7128,129 @@
Filter correspondents
src/app/components/document-list/bulk-editor/bulk-editor.component.html
- 38
+ 36
src/app/components/document-list/filter-editor/filter-editor.component.html
- 53
+ 51
Filter document types
src/app/components/document-list/bulk-editor/bulk-editor.component.html
- 53
+ 50
src/app/components/document-list/filter-editor/filter-editor.component.html
- 65
+ 62
Filter storage paths
src/app/components/document-list/bulk-editor/bulk-editor.component.html
- 68
+ 64
src/app/components/document-list/filter-editor/filter-editor.component.html
- 77
+ 73
Custom fields
src/app/components/document-list/bulk-editor/bulk-editor.component.html
- 82
+ 77
src/app/components/document-list/filter-editor/filter-editor.component.html
- 89
+ 84
src/app/components/document-list/filter-editor/filter-editor.component.ts
- 168
+ 186
Filter custom fields
src/app/components/document-list/bulk-editor/bulk-editor.component.html
- 83
+ 78
Set values
src/app/components/document-list/bulk-editor/bulk-editor.component.html
- 93
+ 86
+
+
+
+ Rotate
+
+ src/app/components/document-list/bulk-editor/bulk-editor.component.html
+ 110
Merge
src/app/components/document-list/bulk-editor/bulk-editor.component.html
- 120
+ 113
Include:
src/app/components/document-list/bulk-editor/bulk-editor.component.html
- 142
+ 135
Archived files
src/app/components/document-list/bulk-editor/bulk-editor.component.html
- 146
+ 139
Original files
src/app/components/document-list/bulk-editor/bulk-editor.component.html
- 150
+ 143
Use formatted filename
src/app/components/document-list/bulk-editor/bulk-editor.component.html
- 155
+ 148
Error executing bulk operation
src/app/components/document-list/bulk-editor/bulk-editor.component.ts
- 288
+ 285
""
src/app/components/document-list/bulk-editor/bulk-editor.component.ts
- 376
+ 373
src/app/components/document-list/bulk-editor/bulk-editor.component.ts
- 382
+ 379
"" and ""
src/app/components/document-list/bulk-editor/bulk-editor.component.ts
- 378
+ 375
This is for messages like 'modify "tag1" and "tag2"'
@@ -7115,7 +7258,7 @@
and ""
src/app/components/document-list/bulk-editor/bulk-editor.component.ts
- 386,388
+ 383,385
this is for messages like 'modify "tag1", "tag2" and "tag3"'
@@ -7123,14 +7266,14 @@
Confirm tags assignment
src/app/components/document-list/bulk-editor/bulk-editor.component.ts
- 403
+ 400
This operation will add the tag "" to selected document(s).
src/app/components/document-list/bulk-editor/bulk-editor.component.ts
- 409
+ 406
@@ -7139,14 +7282,14 @@
)"/> to selected document(s).
src/app/components/document-list/bulk-editor/bulk-editor.component.ts
- 414,416
+ 411,413
This operation will remove the tag "" from selected document(s).
src/app/components/document-list/bulk-editor/bulk-editor.component.ts
- 422
+ 419
@@ -7155,7 +7298,7 @@
)"/> from selected document(s).
src/app/components/document-list/bulk-editor/bulk-editor.component.ts
- 427,429
+ 424,426
@@ -7166,84 +7309,84 @@
)"/> on selected document(s).
src/app/components/document-list/bulk-editor/bulk-editor.component.ts
- 431,435
+ 428,432
Confirm correspondent assignment
src/app/components/document-list/bulk-editor/bulk-editor.component.ts
- 472
+ 469
This operation will assign the correspondent "" to selected document(s).
src/app/components/document-list/bulk-editor/bulk-editor.component.ts
- 474
+ 471
This operation will remove the correspondent from selected document(s).
src/app/components/document-list/bulk-editor/bulk-editor.component.ts
- 476
+ 473
Confirm document type assignment
src/app/components/document-list/bulk-editor/bulk-editor.component.ts
- 510
+ 507
This operation will assign the document type "" to selected document(s).
src/app/components/document-list/bulk-editor/bulk-editor.component.ts
- 512
+ 509
This operation will remove the document type from selected document(s).
src/app/components/document-list/bulk-editor/bulk-editor.component.ts
- 514
+ 511
Confirm storage path assignment
src/app/components/document-list/bulk-editor/bulk-editor.component.ts
- 548
+ 545
This operation will assign the storage path "" to selected document(s).
src/app/components/document-list/bulk-editor/bulk-editor.component.ts
- 550
+ 547
This operation will remove the storage path from selected document(s).
src/app/components/document-list/bulk-editor/bulk-editor.component.ts
- 552
+ 549
Confirm custom field assignment
src/app/components/document-list/bulk-editor/bulk-editor.component.ts
- 581
+ 578
This operation will assign the custom field "" to selected document(s).
src/app/components/document-list/bulk-editor/bulk-editor.component.ts
- 587
+ 584
@@ -7252,14 +7395,14 @@
)"/> to selected document(s).
src/app/components/document-list/bulk-editor/bulk-editor.component.ts
- 592,594
+ 589,591
This operation will remove the custom field "" from selected document(s).
src/app/components/document-list/bulk-editor/bulk-editor.component.ts
- 600
+ 597
@@ -7268,7 +7411,7 @@
)"/> from selected document(s).
src/app/components/document-list/bulk-editor/bulk-editor.component.ts
- 605,607
+ 602,604
@@ -7279,49 +7422,56 @@
)"/> on selected document(s).
src/app/components/document-list/bulk-editor/bulk-editor.component.ts
- 609,613
+ 606,610
Move selected document(s) to the trash?
src/app/components/document-list/bulk-editor/bulk-editor.component.ts
- 751
+ 748
This operation will permanently recreate the archive files for selected document(s).
src/app/components/document-list/bulk-editor/bulk-editor.component.ts
- 793
+ 790
The archive files will be re-generated with the current settings.
src/app/components/document-list/bulk-editor/bulk-editor.component.ts
- 794
+ 791
+
+
+
+ Rotate confirm
+
+ src/app/components/document-list/bulk-editor/bulk-editor.component.ts
+ 823
This operation will permanently rotate the original version of document(s).
src/app/components/document-list/bulk-editor/bulk-editor.component.ts
- 827
+ 824
Merge confirm
src/app/components/document-list/bulk-editor/bulk-editor.component.ts
- 846
+ 843
This operation will merge selected documents into a new document.
src/app/components/document-list/bulk-editor/bulk-editor.component.ts
- 847
+ 844
@@ -7335,14 +7485,14 @@
Custom fields updated.
src/app/components/document-list/bulk-editor/bulk-editor.component.ts
- 885
+ 887
Error updating custom fields.
src/app/components/document-list/bulk-editor/bulk-editor.component.ts
- 894
+ 896
@@ -7386,7 +7536,7 @@
- Created:
+ Created:
src/app/components/document-list/document-card-large/document-card-large.component.html
115,116
@@ -7457,7 +7607,7 @@
src/app/pipes/username.pipe.ts
- 37
+ 35
@@ -7521,7 +7671,7 @@
src/app/components/document-list/document-list.component.ts
- 314
+ 311
@@ -7532,7 +7682,7 @@
src/app/components/document-list/document-list.component.ts
- 307
+ 304
@@ -7610,7 +7760,7 @@
src/app/components/document-list/filter-editor/filter-editor.component.html
- 111
+ 107
@@ -7635,7 +7785,7 @@
src/app/components/document-list/filter-editor/filter-editor.component.ts
- 165
+ 183
src/app/data/document.ts
@@ -7740,7 +7890,7 @@
src/app/data/paperless-config.ts
- 90
+ 91
@@ -7775,203 +7925,216 @@
Reset filters / selection
src/app/components/document-list/document-list.component.ts
- 295
+ 292
Open first [selected] document
src/app/components/document-list/document-list.component.ts
- 323
+ 320
Previous page
src/app/components/document-list/document-list.component.ts
- 339
+ 336
Next page
src/app/components/document-list/document-list.component.ts
- 351
+ 348
View "" saved successfully.
src/app/components/document-list/document-list.component.ts
- 383
+ 381
+
+
+
+ Failed to save view "".
+
+ src/app/components/document-list/document-list.component.ts
+ 387
View "" created successfully.
src/app/components/document-list/document-list.component.ts
- 426
+ 431
Dates
src/app/components/document-list/filter-editor/filter-editor.component.html
- 95
+ 90
Title & content
src/app/components/document-list/filter-editor/filter-editor.component.ts
- 163
+ 181
File type
src/app/components/document-list/filter-editor/filter-editor.component.ts
- 170
+ 188
More like
src/app/components/document-list/filter-editor/filter-editor.component.ts
- 179
+ 197
equals
src/app/components/document-list/filter-editor/filter-editor.component.ts
- 185
+ 203
is empty
src/app/components/document-list/filter-editor/filter-editor.component.ts
- 189
+ 207
is not empty
src/app/components/document-list/filter-editor/filter-editor.component.ts
- 193
+ 211
greater than
src/app/components/document-list/filter-editor/filter-editor.component.ts
- 197
+ 215
less than
src/app/components/document-list/filter-editor/filter-editor.component.ts
- 201
+ 219
- Correspondent:
+ Correspondent:
src/app/components/document-list/filter-editor/filter-editor.component.ts
- 233,235
+ 260,264
Without correspondent
src/app/components/document-list/filter-editor/filter-editor.component.ts
- 237
+ 266
- Document type:
+ Document type:
src/app/components/document-list/filter-editor/filter-editor.component.ts
- 243,245
+ 272,276
Without document type
src/app/components/document-list/filter-editor/filter-editor.component.ts
- 247
+ 278
- Storage path:
+ Storage path:
src/app/components/document-list/filter-editor/filter-editor.component.ts
- 253,255
+ 284,288
Without storage path
src/app/components/document-list/filter-editor/filter-editor.component.ts
- 257
+ 290
- Tag:
+ Tag:
src/app/components/document-list/filter-editor/filter-editor.component.ts
- 261,263
+ 294,296
Without any tag
src/app/components/document-list/filter-editor/filter-editor.component.ts
- 267
+ 300
Custom fields query
src/app/components/document-list/filter-editor/filter-editor.component.ts
- 271
+ 304
Title:
src/app/components/document-list/filter-editor/filter-editor.component.ts
- 274
+ 307
ASN:
src/app/components/document-list/filter-editor/filter-editor.component.ts
- 277
+ 310
Owner:
src/app/components/document-list/filter-editor/filter-editor.component.ts
- 280
+ 313
Owner not in:
src/app/components/document-list/filter-editor/filter-editor.component.ts
- 283
+ 316
Without an owner
src/app/components/document-list/filter-editor/filter-editor.component.ts
- 286
+ 319
@@ -8074,35 +8237,46 @@
Initiating upload...
src/app/components/file-drop/file-drop.component.ts
- 93
+ 137
+
+
+ src/app/components/file-drop/file-drop.component.ts
+ 146
+
+
+
+ Failed to read dropped items:
+
+ src/app/components/file-drop/file-drop.component.ts
+ 142
correspondent
src/app/components/manage/correspondent-list/correspondent-list.component.ts
- 61
+ 46
correspondents
src/app/components/manage/correspondent-list/correspondent-list.component.ts
- 62
+ 47
Last used
src/app/components/manage/correspondent-list/correspondent-list.component.ts
- 67
+ 52
Do you really want to delete the correspondent ""?
src/app/components/manage/correspondent-list/correspondent-list.component.ts
- 93
+ 77
@@ -8134,19 +8308,19 @@
src/app/components/manage/management-list/management-list.component.html
- 86
+ 89
src/app/components/manage/management-list/management-list.component.html
- 86
+ 89
src/app/components/manage/management-list/management-list.component.html
- 86
+ 89
src/app/components/manage/management-list/management-list.component.html
- 86
+ 89
@@ -8160,49 +8334,49 @@
Confirm delete field
src/app/components/manage/custom-fields/custom-fields.component.ts
- 101
+ 102
This operation will permanently delete this field.
src/app/components/manage/custom-fields/custom-fields.component.ts
- 102
+ 103
Deleted field ""
src/app/components/manage/custom-fields/custom-fields.component.ts
- 111
+ 112
Error deleting field "".
src/app/components/manage/custom-fields/custom-fields.component.ts
- 118
+ 121
document type
src/app/components/manage/document-type-list/document-type-list.component.ts
- 58
+ 42
document types
src/app/components/manage/document-type-list/document-type-list.component.ts
- 59
+ 43
Do you really want to delete the document type ""?
src/app/components/manage/document-type-list/document-type-list.component.ts
- 66
+ 48
@@ -8308,248 +8482,248 @@
Error retrieving mail accounts
src/app/components/manage/mail/mail.component.ts
- 108
+ 104
Error retrieving mail rules
src/app/components/manage/mail/mail.component.ts
- 130
+ 126
OAuth2 authentication success
src/app/components/manage/mail/mail.component.ts
- 138
+ 134
OAuth2 authentication failed, see logs for details
src/app/components/manage/mail/mail.component.ts
- 149
+ 145
Saved account "".
src/app/components/manage/mail/mail.component.ts
- 173
+ 169
Error saving account.
src/app/components/manage/mail/mail.component.ts
- 185
+ 181
Confirm delete mail account
src/app/components/manage/mail/mail.component.ts
- 193
+ 189
This operation will permanently delete this mail account.
src/app/components/manage/mail/mail.component.ts
- 194
+ 190
Deleted mail account ""
src/app/components/manage/mail/mail.component.ts
- 204
+ 200
Error deleting mail account "".
src/app/components/manage/mail/mail.component.ts
- 215
+ 211
Processing mail account ""
src/app/components/manage/mail/mail.component.ts
- 227
+ 223
Error processing mail account ""
src/app/components/manage/mail/mail.component.ts
- 232
+ 228
Saved rule "".
src/app/components/manage/mail/mail.component.ts
- 250
+ 246
Error saving rule.
src/app/components/manage/mail/mail.component.ts
- 261
+ 257
Rule "" enabled.
src/app/components/manage/mail/mail.component.ts
- 277
+ 273
Rule "" disabled.
src/app/components/manage/mail/mail.component.ts
- 278
+ 274
Error toggling rule "".
src/app/components/manage/mail/mail.component.ts
- 283
+ 279
Confirm delete mail rule
src/app/components/manage/mail/mail.component.ts
- 294
+ 290
This operation will permanently delete this mail rule.
src/app/components/manage/mail/mail.component.ts
- 295
+ 291
Deleted mail rule ""
src/app/components/manage/mail/mail.component.ts
- 305
+ 301
Error deleting mail rule "".
src/app/components/manage/mail/mail.component.ts
- 316
+ 312
Permissions updated
src/app/components/manage/mail/mail.component.ts
- 340
+ 336
Error updating permissions
src/app/components/manage/mail/mail.component.ts
- 345
+ 341
src/app/components/manage/management-list/management-list.component.ts
- 324
+ 325
Filter by:
src/app/components/manage/management-list/management-list.component.html
- 19
+ 20
src/app/components/manage/management-list/management-list.component.html
- 19
+ 20
src/app/components/manage/management-list/management-list.component.html
- 19
+ 20
src/app/components/manage/management-list/management-list.component.html
- 19
+ 20
Matching
src/app/components/manage/management-list/management-list.component.html
- 38
+ 39
src/app/components/manage/management-list/management-list.component.html
- 38
+ 39
src/app/components/manage/management-list/management-list.component.html
- 38
+ 39
src/app/components/manage/management-list/management-list.component.html
- 38
+ 39
Document count
src/app/components/manage/management-list/management-list.component.html
- 39
+ 40
src/app/components/manage/management-list/management-list.component.html
- 39
+ 40
src/app/components/manage/management-list/management-list.component.html
- 39
+ 40
src/app/components/manage/management-list/management-list.component.html
- 39
+ 40
{VAR_PLURAL, plural, =1 {One } other { total }}
src/app/components/manage/management-list/management-list.component.html
- 118
+ 121
src/app/components/manage/management-list/management-list.component.html
- 118
+ 121
src/app/components/manage/management-list/management-list.component.html
- 118
+ 121
src/app/components/manage/management-list/management-list.component.html
- 118
+ 121
Automatic
src/app/components/manage/management-list/management-list.component.ts
- 116
+ 117
src/app/data/matching-model.ts
@@ -8560,7 +8734,7 @@
None
src/app/components/manage/management-list/management-list.component.ts
- 118
+ 119
src/app/data/matching-model.ts
@@ -8571,70 +8745,70 @@
Successfully created .
src/app/components/manage/management-list/management-list.component.ts
- 177
+ 178
Error occurred while creating .
src/app/components/manage/management-list/management-list.component.ts
- 182
+ 183
Successfully updated "".
src/app/components/manage/management-list/management-list.component.ts
- 197
+ 198
Error occurred while saving .
src/app/components/manage/management-list/management-list.component.ts
- 202
+ 203
Associated documents will not be deleted.
src/app/components/manage/management-list/management-list.component.ts
- 222
+ 223
Error while deleting element
src/app/components/manage/management-list/management-list.component.ts
- 238
+ 239
Permissions updated successfully
src/app/components/manage/management-list/management-list.component.ts
- 317
+ 318
This operation will permanently delete all objects.
src/app/components/manage/management-list/management-list.component.ts
- 338
+ 339
Objects deleted successfully
src/app/components/manage/management-list/management-list.component.ts
- 352
+ 353
Error deleting objects
src/app/components/manage/management-list/management-list.component.ts
- 358
+ 359
@@ -8711,42 +8885,42 @@
storage path
src/app/components/manage/storage-path-list/storage-path-list.component.ts
- 60
+ 44
storage paths
src/app/components/manage/storage-path-list/storage-path-list.component.ts
- 61
+ 45
Do you really want to delete the storage path ""?
src/app/components/manage/storage-path-list/storage-path-list.component.ts
- 78
+ 61
tag
src/app/components/manage/tag-list/tag-list.component.ts
- 60
+ 44
tags
src/app/components/manage/tag-list/tag-list.component.ts
- 61
+ 45
Do you really want to delete the tag ""?
src/app/components/manage/tag-list/tag-list.component.ts
- 77
+ 60
@@ -8774,63 +8948,63 @@
Saved workflow "".
src/app/components/manage/workflows/workflows.component.ts
- 94
+ 90
Error saving workflow.
src/app/components/manage/workflows/workflows.component.ts
- 102
+ 98
Confirm delete workflow
src/app/components/manage/workflows/workflows.component.ts
- 135
+ 131
This operation will permanently delete this workflow.
src/app/components/manage/workflows/workflows.component.ts
- 136
+ 132
Deleted workflow "".
src/app/components/manage/workflows/workflows.component.ts
- 146
+ 142
Error deleting workflow "".
src/app/components/manage/workflows/workflows.component.ts
- 153
+ 149
Enabled workflow ""
src/app/components/manage/workflows/workflows.component.ts
- 166
+ 162
Disabled workflow ""
src/app/components/manage/workflows/workflows.component.ts
- 167
+ 163
Error toggling workflow "".
src/app/components/manage/workflows/workflows.component.ts
- 174
+ 170
@@ -9086,102 +9260,186 @@
51
+
+ Barcode Settings
+
+ src/app/data/paperless-config.ts
+ 52
+
+
Output Type
src/app/data/paperless-config.ts
- 75
+ 76
Language
src/app/data/paperless-config.ts
- 83
+ 84
Mode
src/app/data/paperless-config.ts
- 97
+ 98
Skip Archive File
src/app/data/paperless-config.ts
- 105
+ 106
Image DPI
src/app/data/paperless-config.ts
- 113
+ 114
Clean
src/app/data/paperless-config.ts
- 120
+ 121
Deskew
src/app/data/paperless-config.ts
- 128
+ 129
Rotate Pages
src/app/data/paperless-config.ts
- 135
+ 136
Rotate Pages Threshold
src/app/data/paperless-config.ts
- 142
+ 143
Max Image Pixels
src/app/data/paperless-config.ts
- 149
+ 150
Color Conversion Strategy
src/app/data/paperless-config.ts
- 156
+ 157
OCR Arguments
src/app/data/paperless-config.ts
- 164
+ 165
Application Logo
src/app/data/paperless-config.ts
- 171
+ 172
Application Title
src/app/data/paperless-config.ts
- 178
+ 179
+
+
+
+ Enable Barcodes
+
+ src/app/data/paperless-config.ts
+ 186
+
+
+
+ Enable TIFF Support
+
+ src/app/data/paperless-config.ts
+ 193
+
+
+
+ Barcode String
+
+ src/app/data/paperless-config.ts
+ 200
+
+
+
+ Retain Split Pages
+
+ src/app/data/paperless-config.ts
+ 207
+
+
+
+ Enable ASN
+
+ src/app/data/paperless-config.ts
+ 214
+
+
+
+ ASN Prefix
+
+ src/app/data/paperless-config.ts
+ 221
+
+
+
+ Upscale
+
+ src/app/data/paperless-config.ts
+ 228
+
+
+
+ DPI
+
+ src/app/data/paperless-config.ts
+ 235
+
+
+
+ Max Pages
+
+ src/app/data/paperless-config.ts
+ 242
+
+
+
+ Enable Tag Detection
+
+ src/app/data/paperless-config.ts
+ 249
+
+
+
+ Tag Mapping
+
+ src/app/data/paperless-config.ts
+ 256
@@ -9195,72 +9453,72 @@
Unsaved Changes
src/app/guards/dirty-form.guard.ts
- 17
+ 15
src/app/guards/dirty-saved-view.guard.ts
- 29
+ 27
src/app/services/open-documents.service.ts
- 108
+ 122
src/app/services/open-documents.service.ts
- 135
+ 149
You have unsaved changes.
src/app/guards/dirty-form.guard.ts
- 18
+ 16
src/app/services/open-documents.service.ts
- 136
+ 150
Are you sure you want to leave?
src/app/guards/dirty-form.guard.ts
- 19
+ 17
Leave page
src/app/guards/dirty-form.guard.ts
- 21
+ 19
You have unsaved changes to the saved view
src/app/guards/dirty-saved-view.guard.ts
- 31
+ 29
Are you sure you want to close this saved view?
src/app/guards/dirty-saved-view.guard.ts
- 35
+ 33
Save and close
src/app/guards/dirty-saved-view.guard.ts
- 39
+ 37
You don't have permissions to do that
src/app/guards/permissions.guard.ts
- 36
+ 34
@@ -9305,13 +9563,6 @@
25
-
- Yesterday
-
- src/app/pipes/custom-date.pipe.ts
- 29
-
-
%s days ago
@@ -9351,7 +9602,7 @@
Just now
src/app/pipes/custom-date.pipe.ts
- 72
+ 73
@@ -9365,28 +9616,28 @@
You have unsaved changes to the document
src/app/services/open-documents.service.ts
- 110
+ 124
Are you sure you want to close this document?
src/app/services/open-documents.service.ts
- 114
+ 128
Are you sure you want to close all documents?
src/app/services/open-documents.service.ts
- 137
+ 151
Close documents
src/app/services/open-documents.service.ts
- 139
+ 153
@@ -9536,186 +9787,207 @@
171
+
+ Persian
+
+ src/app/services/settings.service.ts
+ 177
+
+
Polish
src/app/services/settings.service.ts
- 177
+ 183
Portuguese (Brazil)
src/app/services/settings.service.ts
- 183
+ 189
Portuguese
src/app/services/settings.service.ts
- 189
+ 195
Romanian
src/app/services/settings.service.ts
- 195
+ 201
Russian
src/app/services/settings.service.ts
- 201
+ 207
Slovak
src/app/services/settings.service.ts
- 207
+ 213
Slovenian
src/app/services/settings.service.ts
- 213
+ 219
Serbian
src/app/services/settings.service.ts
- 219
+ 225
Swedish
src/app/services/settings.service.ts
- 225
+ 231
Turkish
src/app/services/settings.service.ts
- 231
+ 237
Ukrainian
src/app/services/settings.service.ts
- 237
+ 243
+
+
+
+ Vietnamese
+
+ src/app/services/settings.service.ts
+ 249
Chinese Simplified
src/app/services/settings.service.ts
- 243
+ 255
+
+
+
+ Chinese Traditional
+
+ src/app/services/settings.service.ts
+ 261
ISO 8601
src/app/services/settings.service.ts
- 251
+ 269
Successfully completed one-time migratration of settings to the database!
src/app/services/settings.service.ts
- 584
+ 603
Unable to migrate settings to the database, please try saving manually.
src/app/services/settings.service.ts
- 585
+ 604
You can restart the tour from the settings page.
src/app/services/settings.service.ts
- 661
+ 677
Connecting...
src/app/services/upload-documents.service.ts
- 42
+ 25
Uploading...
src/app/services/upload-documents.service.ts
- 54
+ 37
Upload complete, waiting...
src/app/services/upload-documents.service.ts
- 57
+ 40
HTTP error:
src/app/services/upload-documents.service.ts
- 70
+ 53
Document already exists.
src/app/services/websocket-status.service.ts
- 23
+ 24
Document already exists. Note: existing document is in the trash.
src/app/services/websocket-status.service.ts
- 24
+ 25
Document with ASN already exists.
src/app/services/websocket-status.service.ts
- 25
+ 26
Document with ASN already exists. Note: existing document is in the trash.
src/app/services/websocket-status.service.ts
- 26
+ 27
File not found.
src/app/services/websocket-status.service.ts
- 27
+ 28
Pre-consume script does not exist.
src/app/services/websocket-status.service.ts
- 28
+ 29
Pre-Consume is a term that appears like that in the documentation as well and does not need a specific translation
@@ -9723,7 +9995,7 @@
Error while executing pre-consume script.
src/app/services/websocket-status.service.ts
- 29
+ 30
Pre-Consume is a term that appears like that in the documentation as well and does not need a specific translation
@@ -9731,7 +10003,7 @@
Post-consume script does not exist.
src/app/services/websocket-status.service.ts
- 30
+ 31
Post-Consume is a term that appears like that in the documentation as well and does not need a specific translation
@@ -9739,7 +10011,7 @@
Error while executing post-consume script.
src/app/services/websocket-status.service.ts
- 31
+ 32
Post-Consume is a term that appears like that in the documentation as well and does not need a specific translation
@@ -9747,49 +10019,49 @@
Received new file.
src/app/services/websocket-status.service.ts
- 32
+ 33
File type not supported.
src/app/services/websocket-status.service.ts
- 33
+ 34
Processing document...
src/app/services/websocket-status.service.ts
- 34
+ 35
Generating thumbnail...
src/app/services/websocket-status.service.ts
- 35
+ 36
Retrieving date from document...
src/app/services/websocket-status.service.ts
- 36
+ 37
Saving document...
src/app/services/websocket-status.service.ts
- 37
+ 38
Finished.
src/app/services/websocket-status.service.ts
- 38
+ 39