From a0211155fad34cc35910ff1941ed8af89aa3e8bc Mon Sep 17 00:00:00 2001 From: Aman Nalakath Date: Sun, 19 Jul 2026 22:14:54 +0200 Subject: [PATCH] refactor: solidify startup UX and engine-aware preprocessing - Slim core deps: move ML stack to optional extras (paddle/tables/figures/scientific/full) - Lazy settings proxy with config search paths (env var, cwd, user dir) - New commands: init, demo, setup [basic|full], first-run guard on run/watch - Engine-aware preprocessing: Paddle gets original image (fixes dark mode 0.83->0.95) - Results table shows Skipped count; lazy run-dir creation - kg_ocr marked experimental with extra, Docker defaults with OCR_PIPELINE_CONFIG - 25/25 tests, ruff clean --- Dockerfile | 21 +- README.md | 82 +- config.yaml | 2 + docker/config.docker.yaml | 15 + kg_ocr/__init__.py | 18 +- pyproject.toml | 58 +- src/ocr_pipeline.egg-info/PKG-INFO | 120 +- src/ocr_pipeline.egg-info/SOURCES.txt | 4 +- src/ocr_pipeline.egg-info/requires.txt | 43 +- .../__pycache__/__init__.cpython-313.pyc | Bin 352 -> 381 bytes .../__pycache__/cli.cpython-313.pyc | Bin 8525 -> 16843 bytes .../__pycache__/config.cpython-313.pyc | Bin 12597 -> 18122 bytes .../__pycache__/pipeline.cpython-313.pyc | Bin 10754 -> 9462 bytes .../__pycache__/watch.cpython-313.pyc | Bin 8391 -> 308 bytes src/ocr_pipeline/assets/__init__.py | 0 src/ocr_pipeline/assets/demo_screenshot.png | Bin 0 -> 60953 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 298 -> 327 bytes .../__pycache__/extractor.cpython-313.pyc | Bin 8714 -> 614 bytes .../regex_extractor.cpython-313.pyc | Bin 9030 -> 9304 bytes src/ocr_pipeline/citations/extractor.py | 8 +- src/ocr_pipeline/cli.py | 135 +- src/ocr_pipeline/config.py | 96 +- src/ocr_pipeline/demo.py | 45 + .../__pycache__/__init__.cpython-313.pyc | Bin 513 -> 542 bytes .../__pycache__/figures.cpython-313.pyc | Bin 7886 -> 8605 bytes .../__pycache__/tables.cpython-313.pyc | Bin 10411 -> 10888 bytes src/ocr_pipeline/detectors/figures.py | 16 +- src/ocr_pipeline/detectors/tables.py | 7 +- .../ocr/__pycache__/__init__.cpython-313.pyc | Bin 504 -> 558 bytes .../ocr/__pycache__/engine.cpython-313.pyc | Bin 9585 -> 10150 bytes .../ocr/__pycache__/parallel.cpython-313.pyc | Bin 7536 -> 8492 bytes src/ocr_pipeline/ocr/engine.py | 37 +- src/ocr_pipeline/ocr/parallel.py | 14 +- src/ocr_pipeline/ocr/preprocess.py | 26 +- src/ocr_pipeline/onboarding.py | 64 + .../__pycache__/__init__.cpython-313.pyc | Bin 301 -> 330 bytes .../__pycache__/markdown.cpython-313.pyc | Bin 8471 -> 13638 bytes src/ocr_pipeline/output/markdown.py | 70 +- src/ocr_pipeline/pipeline.py | 58 +- .../__pycache__/__init__.cpython-313.pyc | Bin 536 -> 580 bytes .../__pycache__/chunk.cpython-313.pyc | Bin 3111 -> 3141 bytes .../__pycache__/clean.cpython-313.pyc | Bin 6733 -> 4635 bytes .../__pycache__/entities.cpython-313.pyc | Bin 12067 -> 13232 bytes src/ocr_pipeline/postprocess/clean.py | 4 +- src/ocr_pipeline/postprocess/entities.py | 23 +- src/ocr_pipeline/setup_steps.py | 131 ++ src/ocr_pipeline/utils/__init__.py | 2 - .../__pycache__/__init__.cpython-313.pyc | Bin 579 -> 477 bytes .../utils/__pycache__/db.cpython-313.pyc | Bin 8325 -> 9237 bytes .../utils/__pycache__/logging.cpython-313.pyc | Bin 7154 -> 7183 bytes .../utils/__pycache__/migrate.cpython-313.pyc | Bin 5731 -> 6677 bytes src/ocr_pipeline/utils/db.py | 64 +- .../__pycache__/__init__.cpython-313.pyc | Bin 252 -> 281 bytes .../watch/__pycache__/watcher.cpython-313.pyc | Bin 8336 -> 7792 bytes src/ocr_pipeline/watch/watcher.py | 10 +- tests/conftest.py | 2 +- tests/test_postprocess.py | 7 +- tests/test_startup.py | 116 ++ uv.lock | 1757 +++++++++++++---- 59 files changed, 2426 insertions(+), 629 deletions(-) create mode 100644 docker/config.docker.yaml create mode 100644 src/ocr_pipeline/assets/__init__.py create mode 100644 src/ocr_pipeline/assets/demo_screenshot.png create mode 100644 src/ocr_pipeline/demo.py create mode 100644 src/ocr_pipeline/onboarding.py create mode 100644 src/ocr_pipeline/setup_steps.py create mode 100644 tests/test_startup.py diff --git a/Dockerfile b/Dockerfile index c5a3a22..b4ceb3b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,25 +2,24 @@ FROM python:3.11-slim RUN apt-get update && apt-get install -y --no-install-recommends \ tesseract-ocr \ - libtesseract-dev \ - poppler-utils \ libgl1 \ libglib2.0-0 \ - libsm6 \ - libxext6 \ - libxrender-dev \ - libgomp1 \ && rm -rf /var/lib/apt/lists/* WORKDIR /app COPY pyproject.toml uv.lock ./ -RUN pip install --no-cache-dir uv && uv sync --frozen --no-dev +RUN pip install --no-cache-dir uv && uv sync --frozen --no-dev --no-install-project COPY src ./src -COPY config.yaml ./ +# Optional ML stack: docker build --build-arg EXTRAS="--extra full" . +ARG EXTRAS="" +RUN uv sync --frozen --no-dev ${EXTRAS} -ENV PYTHONPATH=/app/src -ENV OMP_NUM_THREADS=4 +COPY docker/config.docker.yaml ./config.docker.yaml -ENTRYPOINT ["ocr-pipeline"] \ No newline at end of file +ENV PATH="/app/.venv/bin:$PATH" \ + OCR_PIPELINE_CONFIG=/app/config.docker.yaml \ + OMP_NUM_THREADS=4 + +ENTRYPOINT ["ocr-pipeline"] diff --git a/README.md b/README.md index e4c055a..e4c22e4 100644 --- a/README.md +++ b/README.md @@ -11,61 +11,76 @@ Turns scientific screenshots into RAG-ready Markdown, with metadata attached. ## Quick start +The default install is small: Tesseract OCR only, no multi-GB ML downloads. + ```bash -uv sync -pre-commit install - -# Smoke test a small directory with the lightweight OCR path -uv run ocr-pipeline run \ - --input-dir ~/Pictures/test_screenshots \ - --output-dir /tmp/ocr-output \ - --engine tesseract \ - --workers 1 \ - --exclude "*.photoslibrary/*" - -uv run ocr-pipeline watch -uv run ocr-pipeline reprocess ocr_sc.ipynb -uv run ocr-pipeline status +uv sync # install the core pipeline +uv run ocr-pipeline setup # installs Tesseract if missing (asks first) +uv run ocr-pipeline init # write a config for this machine +uv run ocr-pipeline demo # verify everything works on a sample screenshot +uv run ocr-pipeline run # process your screenshots ``` +Config is found in this order: `$OCR_PIPELINE_CONFIG`, `./config.yaml`, then the +per-user config directory (`~/Library/Application Support/ocr-pipeline` on macOS, +`~/.config/ocr-pipeline` on Linux). Running `run` with neither a config nor +`--input-dir` stops with guidance instead of scanning a default directory. + Use `--force` to reprocess files already recorded in the processing database. The `--exclude` option is repeatable and prevents recursive scans from entering bundles such as macOS `.photoslibrary` directories. -### Scientific NER environment +### Optional capabilities -`en_core_sci_lg` is distributed separately from scispaCy and is not installed by -`uv sync`. The compatible scispaCy 0.5.4 release requires spaCy 3.7.x, so install it -in a dedicated Python 3.11 environment rather than mixing it with the main Python -3.13 environment: +Heavy ML features are opt-in extras and degrade gracefully when absent (a warning +is logged and that step is skipped): + +| Extra | Provides | +|-------|----------| +| `paddle` | PaddleOCR engine (`ocr.engine: paddleocr` or `auto`) | +| `scientific` | spaCy/scispaCy NER (`entities.enabled: true`) | +| `tables` | Table Transformer detection | +| `figures` | LayoutParser figure/caption detection (needs a Detectron2 build) | +| `full` | All of the above | ```bash -uv venv --python 3.11 .venv-scispacy -source .venv-scispacy/bin/activate -uv pip install "spacy>=3.7,<3.8" "scispacy==0.5.4" click -uv pip install https://s3-us-west-2.amazonaws.com/ai2-s2-scispacy/releases/v0.5.4/en_core_sci_lg-0.5.4.tar.gz -uv pip install -e . -uv pip install timm - -# Confirm the model and command use this same environment -.venv-scispacy/bin/python -c "import spacy; spacy.load('en_core_sci_lg'); print('scispaCy OK')" -.venv-scispacy/bin/ocr-pipeline run --help +uv run ocr-pipeline setup full # runs: uv sync --extra full + downloads en_core_sci_lg ``` -If the two environments are kept separate, invoke the pipeline with the explicit -`.venv-scispacy/bin/ocr-pipeline` path; `uv run` selects the project's default `.venv`. +`en_core_sci_lg` is distributed separately from scispaCy. The compatible scispaCy +0.5.4 release requires spaCy 3.7.x; if the model install conflicts with your spaCy +version, use a dedicated Python 3.11 environment as described in +`ocr-pipeline setup full --dry-run` output, and enable `entities` only there. + +## kg_ocr (experimental) + +The top-level `kg_ocr` package is a prototype txtai/litellm RAG interface over the +pipeline's output. It is not the supported interface (that is the `ocr-pipeline` +CLI) and its dependencies are not installed by default: + +```bash +uv sync --extra kg +``` ## Docker +The image ships the Tesseract-only core with a ready-made config that reads from +`/data/screenshots` and writes to `/data/output`: + ```bash docker build -t ocr-pipeline . +docker run -v ~/Pictures:/data/screenshots -v "$PWD/ocr-output:/data/output" ocr-pipeline run +docker run -v ~/Pictures:/data/screenshots -v "$PWD/ocr-output:/data/output" ocr-pipeline watch -docker run -v ~/Pictures:/data/screenshots -v ./data:/app/data ocr-pipeline run -docker run -v ~/Pictures:/data/screenshots -v ./data:/app/data ocr-pipeline watch +# ML extras baked in: +docker build --build-arg EXTRAS="--extra full" -t ocr-pipeline:full . ``` ## Config +`ocr-pipeline init` writes a minimal working config; the example below shows every +knob for reference. +
config.yaml @@ -200,6 +215,7 @@ Gene/protein names go through scispaCy's `en_core_sci_lg`. Chemical formulas and ## Models +Model weights are only fetched when the matching extra is installed and enabled. First run downloads what it needs, cached in `~/.cache/ocr_pipeline/`: - PaddleOCR models (~200MB) diff --git a/config.yaml b/config.yaml index bfac240..59d9623 100644 --- a/config.yaml +++ b/config.yaml @@ -1,3 +1,5 @@ +# Full-stack config used for this repo's development. New users: run +# `ocr-pipeline init` to generate a minimal config instead of copying this file. input: paths: - "~/Pictures" diff --git a/docker/config.docker.yaml b/docker/config.docker.yaml new file mode 100644 index 0000000..883936d --- /dev/null +++ b/docker/config.docker.yaml @@ -0,0 +1,15 @@ +# Container defaults: host directories are mounted under /data. +# Selected via OCR_PIPELINE_CONFIG in the image. +input: + paths: + - "/data/screenshots" + +ocr: + engine: "tesseract" + +output: + base_directory: "/data/output" + write_consolidated: true + +watch: + db_path: "/data/output/processed_files.db" diff --git a/kg_ocr/__init__.py b/kg_ocr/__init__.py index 1cb88fb..4cbaba6 100644 --- a/kg_ocr/__init__.py +++ b/kg_ocr/__init__.py @@ -1,5 +1,17 @@ -from .ocr import get_screenshots, extract_text -from .embeddings import create_and_index -from .rag import retrieve, ask_wllm +"""Experimental txtai/litellm RAG interface built on the OCR pipeline. + +This package is a prototype. The supported interface is the `ocr-pipeline` CLI +(src/ocr_pipeline). Extra dependencies are required: `uv sync --extra kg`. +""" + +try: + from .ocr import get_screenshots, extract_text + from .embeddings import create_and_index + from .rag import retrieve, ask_wllm +except ImportError as exc: + raise ImportError( + "kg_ocr is experimental and needs extra dependencies: " + "uv sync --extra kg (or: uv pip install txtai litellm python-dotenv)" + ) from exc __all__ = ["get_screenshots", "extract_text", "create_and_index", "retrieve", "ask_wllm"] diff --git a/pyproject.toml b/pyproject.toml index 528cfd2..5e65f39 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,45 +16,22 @@ dependencies = [ "pyyaml>=6.0.1", "structlog>=24.1.0", "rich>=13.7.0", - "tqdm>=4.66.0", # Image processing - "opencv-python-headless>=4.9.0", + "opencv-python-headless>=4.9.0,<5.0.0", "pillow>=10.2.0", "numpy>=1.26.0,<2.0; python_version < '3.12'", "numpy>=1.26.0; python_version >= '3.12'", - "scikit-image>=0.22.0,<0.23.0; python_version < '3.12'", - "scikit-image>=0.22.0; python_version >= '3.12'", - - # OCR engines - "paddleocr>=2.7.0,<3.0.0", - "paddlepaddle>=2.6.0", "pytesseract>=0.3.10", - # Table detection - "torch>=2.2.0", - "torchvision>=0.17.0", - "transformers>=4.38.0", - "timm>=1.0.0", - "layoutparser>=0.3.0", - - # NLP + # Text processing and notebook migration "langchain-text-splitters>=0.0.2", - "spacy>=3.7.0,<3.8.0; python_version < '3.12'", - "spacy>=3.7.0; python_version >= '3.12'", "nbformat>=5.9.0", - "legacy-cgi>=2.6.2", - - # Database - "sqlite-utils>=3.37.0", # File watching "watchdog>=3.0.0", # Utilities - "python-slugify>=8.0.0", - "xxhash>=3.4.0", - "python-magic>=0.4.27", "platformdirs>=4.2.0", ] @@ -67,16 +44,43 @@ dev = [ "mypy>=1.8.0", "pre-commit>=3.6.0", ] +paddle = [ + "paddleocr>=2.7.0,<3.0.0", + "paddlepaddle>=2.6.0", +] +tables = [ + "torch>=2.2.0", + "torchvision>=0.17.0", + "transformers>=4.38.0", + "timm>=1.0.0", +] +figures = [ + "layoutparser>=0.3.0", + "legacy-cgi>=2.6.2; python_version >= '3.13'", +] +scientific = [ + "spacy>=3.7.0,<3.8.0; python_version < '3.12'", + "spacy>=3.7.0; python_version >= '3.12'", +] +kg = [ + "txtai>=7.4.0", + "litellm>=1.40.0", + "python-dotenv>=1.0.0", +] grobid = [] full = [ - "ocr-pipeline[dev]", + "ocr-pipeline[paddle,tables,figures,scientific]", ] [project.entry-points.console_scripts] ocr-pipeline = "ocr_pipeline.cli:app" [tool.setuptools.packages.find] -where = ["src"] +where = ["src", "."] +include = ["ocr_pipeline*", "kg_ocr*"] + +[tool.setuptools.package-data] +ocr_pipeline = ["assets/*.png"] [tool.uv] dev-dependencies = [ diff --git a/src/ocr_pipeline.egg-info/PKG-INFO b/src/ocr_pipeline.egg-info/PKG-INFO index 5652e9d..ce0cce2 100644 --- a/src/ocr_pipeline.egg-info/PKG-INFO +++ b/src/ocr_pipeline.egg-info/PKG-INFO @@ -4,7 +4,7 @@ Version: 0.1.0 Summary: OCR pipeline for life science screenshots - RAG ready Requires-Python: >=3.11 Description-Content-Type: text/markdown -Requires-Dist: typer[all]>=0.9.0 +Requires-Dist: typer>=0.9.0 Requires-Dist: pydantic>=2.6.0 Requires-Dist: pydantic-settings>=2.2.0 Requires-Dist: pyyaml>=6.0.1 @@ -13,20 +13,11 @@ Requires-Dist: rich>=13.7.0 Requires-Dist: tqdm>=4.66.0 Requires-Dist: opencv-python-headless>=4.9.0 Requires-Dist: pillow>=10.2.0 -Requires-Dist: numpy>=1.26.0 -Requires-Dist: scikit-image>=0.22.0 -Requires-Dist: paddleocr<3.0.0,>=2.7.0 -Requires-Dist: paddlepaddle>=2.6.0 +Requires-Dist: numpy<2.0,>=1.26.0; python_version < "3.12" +Requires-Dist: numpy>=1.26.0; python_version >= "3.12" Requires-Dist: pytesseract>=0.3.10 -Requires-Dist: torch>=2.2.0 -Requires-Dist: torchvision>=0.17.0 -Requires-Dist: transformers>=4.38.0 -Requires-Dist: timm>=1.0.0 -Requires-Dist: layoutparser>=0.3.0 Requires-Dist: langchain-text-splitters>=0.0.2 -Requires-Dist: spacy>=3.7.0 Requires-Dist: nbformat>=5.9.0 -Requires-Dist: legacy-cgi>=2.6.2 Requires-Dist: sqlite-utils>=3.37.0 Requires-Dist: watchdog>=3.0.0 Requires-Dist: python-slugify>=8.0.0 @@ -41,32 +32,92 @@ Requires-Dist: ruff>=0.2.0; extra == "dev" Requires-Dist: mypy>=1.8.0; extra == "dev" Requires-Dist: pre-commit>=3.6.0; extra == "dev" Provides-Extra: grobid +Provides-Extra: paddle +Requires-Dist: paddleocr<3.0.0,>=2.7.0; extra == "paddle" +Requires-Dist: paddlepaddle>=2.6.0; extra == "paddle" +Provides-Extra: scientific +Requires-Dist: spacy<3.8.0,>=3.7.0; python_version < "3.12" and extra == "scientific" +Requires-Dist: spacy>=3.7.0; python_version >= "3.12" and extra == "scientific" +Requires-Dist: scispacy==0.5.4; python_version < "3.12" and extra == "scientific" +Provides-Extra: tables +Requires-Dist: torch>=2.2.0; extra == "tables" +Requires-Dist: torchvision>=0.17.0; extra == "tables" +Requires-Dist: transformers>=4.38.0; extra == "tables" +Requires-Dist: timm>=1.0.0; extra == "tables" +Provides-Extra: figures +Requires-Dist: layoutparser>=0.3.0; extra == "figures" Provides-Extra: full -Requires-Dist: ocr-pipeline[dev]; extra == "full" +Requires-Dist: ocr-pipeline[dev,figures,paddle,scientific,tables]; extra == "full" # OCR Pipeline for Life Science Screenshots Turns scientific screenshots into RAG-ready Markdown, with metadata attached. -- OCR via PaddleOCR, falls back to Tesseract +- Reliable Tesseract OCR by default, with optional PaddleOCR - Preprocessing: deskew, denoise, CLAHE, line removal -- Figure/table detection -- Entity extraction with scispaCy -- Citation matching -- Chunking for embedding +- Optional figure/table detection +- Optional scientific entity extraction with scispaCy +- Citation matching and embedding-ready chunking ## Quick start ```bash -uv sync # or: pip install -e . -pre-commit install +# The default basic profile is lightweight: Tesseract, cleanup, citations, +# chunking, Markdown, and no model downloads. +uv sync +uv run ocr-pipeline doctor -ocr-pipeline run # process screenshots -ocr-pipeline watch # watch a folder -ocr-pipeline reprocess ocr_sc.ipynb # pull screenshots out of a notebook -ocr-pipeline status +# Smoke-test a small directory. +uv run ocr-pipeline run \ + --input-dir ~/Pictures/test_screenshots \ + --output-dir /tmp/ocr-output \ + --workers 1 \ + --exclude "*.photoslibrary/*" ``` +Use `ocr-pipeline doctor` before a first run or after changing environments. It checks the active profile without loading ML models or downloading model weights. + +Use `--force` to reprocess files already recorded in the processing database. The +`--exclude` option is repeatable and prevents recursive scans from entering bundles +such as macOS `.photoslibrary` directories. + +### Capability profiles + +| Profile | What it enables | Intended environment | +| --- | --- | --- | +| `basic` (default) | Tesseract OCR, cleanup, citations, chunks, Markdown | Python 3.11+ | +| `scientific` | Basic + `en_core_sci_lg` entity extraction | **Python 3.11** | +| `full` | Scientific + PaddleOCR + figure/table detection | Platform-specific ML environment | + +Select a profile per run with `--profile`, or set `profile: basic`, `scientific`, or +`full` at the top of `config.yaml`. The profile is an explicit promise: unavailable +optional features are reported by `doctor`; they are not silently initialized on a +basic run. + +```bash +uv run ocr-pipeline doctor --profile scientific +uv run ocr-pipeline setup scientific # prints the safe setup commands +uv run ocr-pipeline run --profile scientific --input-dir ~/Pictures/test_screenshots +``` + +#### Scientific NER environment + +`en_core_sci_lg` is distributed separately from scispaCy. Create a dedicated Python +3.11 environment—do not mix its compiled spaCy stack with a Python 3.13 environment: + +```bash +uv venv --python 3.11 .venv-scientific +uv pip install --python .venv-scientific/bin/python -e '.[scientific]' +uv pip install --python .venv-scientific/bin/python \ + https://s3-us-west-2.amazonaws.com/ai2-s2-scispacy/releases/v0.5.4/en_core_sci_lg-0.5.4.tar.gz + +.venv-scientific/bin/ocr-pipeline doctor --profile scientific +.venv-scientific/bin/ocr-pipeline run --profile scientific --input-dir ~/Pictures/test_screenshots +``` + +Use the explicit `.venv-scientific/bin/ocr-pipeline` path for that environment; +`uv run` always selects the project's default `.venv`. + ## Docker ```bash @@ -86,9 +137,10 @@ input: paths: ["~/Pictures", "/mnt/storage3/aman/screenshots"] patterns: ["SCR-*.png", "*.jpg", "*.jpeg", "*.tiff"] recursive: true + exclude_patterns: ["*.photoslibrary/*"] ocr: - engine: "paddleocr" # paddleocr | tesseract | auto + engine: "tesseract" # paddleocr | tesseract | auto languages: ["en", "latin"] use_gpu: false preprocess: @@ -105,14 +157,14 @@ processing: detectors: figures: - enabled: true + enabled: false confidence_threshold: 0.7 tables: - enabled: true + enabled: false confidence_threshold: 0.7 entities: - enabled: true + enabled: false model: "en_core_sci_lg" citations: @@ -126,6 +178,8 @@ chunking: output: base_directory: "./data/ocr_output" organize_by: "date_run" # date_run | source_dir | flat + write_consolidated: true + consolidated_filename: "all_ocr.md" frontmatter: - source_path - source_hash @@ -134,6 +188,7 @@ output: - ocr_confidence_mean - language - detected_entities + - entity_extraction_backend - has_figures - has_tables - citations_found @@ -200,15 +255,16 @@ Lane 4: BRCA1 KO + pBRCA1-C61G mutant Anti-BRCA1 (1:1000), Anti-β-actin (1:5000) ``` -Files land in `data/ocr_output//run_NNN/`. +Files land in `data/ocr_output//run_NNN/`. Individual chunk files are retained for RAG indexing. Set `output.write_consolidated: true` to also write `all_ocr.md` containing one frontmatter block and all source text grouped by image. ## Life science specifics Gene/protein names go through scispaCy's `en_core_sci_lg`. Chemical formulas and units (µM, ng/mL, kb/Mb/Gb, °C, ×g) get normalized, scientific notation gets cleaned up (`1.5×10⁻³` → `1.5×10^-3`), and gel/blot figures get their captions pulled out separately. Citations are matched by regex for DOI, PMID, arXiv, PMC, and ISBN. -## Models +## Optional models -First run downloads what it needs, cached in `~/.cache/ocr_pipeline/`: +The basic profile downloads no ML models. Advanced profiles download models only when +the corresponding capability is enabled and used, cached in `~/.cache/ocr_pipeline/`: - PaddleOCR models (~200MB) - scispaCy `en_core_sci_lg` (~800MB) @@ -224,7 +280,7 @@ The core pipeline can run with Tesseract alone. PaddleOCR, scientific NER, figur - **Figures:** `layoutparser`'s `Detectron2LayoutModel` requires a Detectron2 build matching your Torch/Python platform. It is intentionally not forced as a universal dependency because no single wheel supports every platform. - **Tables:** the Table Transformer model is downloaded by Transformers on first use; ensure the selected model's optional dependencies (including `timm`, when required by that model revision) are installed in the runtime image. -Use `ocr-pipeline config` to verify effective settings. A missing optional model is logged and produces empty results for that detector instead of failing a complete batch. +Use `ocr-pipeline doctor --profile ` to verify dependencies before processing. Use `ocr-pipeline config` to inspect effective settings. A configured but unavailable optional model is reported as missing by `doctor`; basic runs never attempt to initialize it. ## TODO diff --git a/src/ocr_pipeline.egg-info/SOURCES.txt b/src/ocr_pipeline.egg-info/SOURCES.txt index fcc81e7..ec2ae2b 100644 --- a/src/ocr_pipeline.egg-info/SOURCES.txt +++ b/src/ocr_pipeline.egg-info/SOURCES.txt @@ -4,6 +4,7 @@ setup.py src/ocr_pipeline/__init__.py src/ocr_pipeline/cli.py src/ocr_pipeline/config.py +src/ocr_pipeline/doctor.py src/ocr_pipeline/pipeline.py src/ocr_pipeline/watch.py src/ocr_pipeline.egg-info/PKG-INFO @@ -38,4 +39,5 @@ tests/test_graph.py tests/test_indexer.py tests/test_ocr.py tests/test_output.py -tests/test_postprocess.py \ No newline at end of file +tests/test_postprocess.py +tests/test_profiles.py \ No newline at end of file diff --git a/src/ocr_pipeline.egg-info/requires.txt b/src/ocr_pipeline.egg-info/requires.txt index 6c4cea8..80923ae 100644 --- a/src/ocr_pipeline.egg-info/requires.txt +++ b/src/ocr_pipeline.egg-info/requires.txt @@ -1,4 +1,4 @@ -typer[all]>=0.9.0 +typer>=0.9.0 pydantic>=2.6.0 pydantic-settings>=2.2.0 pyyaml>=6.0.1 @@ -7,20 +7,9 @@ rich>=13.7.0 tqdm>=4.66.0 opencv-python-headless>=4.9.0 pillow>=10.2.0 -numpy>=1.26.0 -scikit-image>=0.22.0 -paddleocr<3.0.0,>=2.7.0 -paddlepaddle>=2.6.0 pytesseract>=0.3.10 -torch>=2.2.0 -torchvision>=0.17.0 -transformers>=4.38.0 -timm>=1.0.0 -layoutparser>=0.3.0 langchain-text-splitters>=0.0.2 -spacy>=3.7.0 nbformat>=5.9.0 -legacy-cgi>=2.6.2 sqlite-utils>=3.37.0 watchdog>=3.0.0 python-slugify>=8.0.0 @@ -28,6 +17,12 @@ xxhash>=3.4.0 python-magic>=0.4.27 platformdirs>=4.2.0 +[:python_version < "3.12"] +numpy<2.0,>=1.26.0 + +[:python_version >= "3.12"] +numpy>=1.26.0 + [dev] pytest>=8.0.0 pytest-cov>=4.1.0 @@ -36,7 +31,29 @@ ruff>=0.2.0 mypy>=1.8.0 pre-commit>=3.6.0 +[figures] +layoutparser>=0.3.0 + [full] -ocr-pipeline[dev] +ocr-pipeline[dev,figures,paddle,scientific,tables] [grobid] + +[paddle] +paddleocr<3.0.0,>=2.7.0 +paddlepaddle>=2.6.0 + +[scientific] + +[scientific:python_version < "3.12"] +spacy<3.8.0,>=3.7.0 +scispacy==0.5.4 + +[scientific:python_version >= "3.12"] +spacy>=3.7.0 + +[tables] +torch>=2.2.0 +torchvision>=0.17.0 +transformers>=4.38.0 +timm>=1.0.0 diff --git a/src/ocr_pipeline/__pycache__/__init__.cpython-313.pyc b/src/ocr_pipeline/__pycache__/__init__.cpython-313.pyc index 055eb8575bf8357482bafe7778fddf215d88530c..e5757a47f633b0cfd25f0978126c1e3ef180e07d 100644 GIT binary patch delta 54 zcmaFB^p}b2GcPX}0}$BV*vQ4iC}*i3TAW%`te=>hn5XZOpIn-onpaY+pPe3`pIoFr InU^sb0K6#>;{X5v delta 25 fcmey%^ni)$GcPX}0}x1D+{nem$S5;ei!m4gSjq+1 diff --git a/src/ocr_pipeline/__pycache__/cli.cpython-313.pyc b/src/ocr_pipeline/__pycache__/cli.cpython-313.pyc index 8df6d4edc861bf6a98b6b463e125dc0d49af1aa4..37d722ceb5ba3873de3945f037b68c71234f4a8d 100644 GIT binary patch literal 16843 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 L09kA^mB0T5jYH87 delta 3493 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 ZqU?MA_`<)sn5#dOaWC(=FC5|||3Bw0aEJf^ delta 6006 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 A>Hq)$ diff --git a/src/ocr_pipeline/__pycache__/pipeline.cpython-313.pyc b/src/ocr_pipeline/__pycache__/pipeline.cpython-313.pyc index 8bdab0860af99f5b8b2f95f6b88c75c99536d7b0..8f390acb1d021a5167a170fc902004c5876dd17e 100644 GIT binary patch literal 9462 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 HY0ZBF;c3C{ literal 10754 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 diff --git a/src/ocr_pipeline/assets/__init__.py b/src/ocr_pipeline/assets/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/ocr_pipeline/assets/demo_screenshot.png b/src/ocr_pipeline/assets/demo_screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..adba3e77cd862677758d483a91122d24753e31d9 GIT binary patch literal 60953 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%0A}V&r{lQxr%wP@56;?a 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⪙{U-i>g1WI*wi-S&}SpH8SxBnIZ~9bblu zm@Bn1l~c%AmxBxg< zJc>!GUt3}mquot&FNO&p5)kNE%+z`1t!`u@i%NqLSp-1i&kw1wL%uba_`S@ROdA|R z^YenLs42bb450zWD|fhj`Gdhj(bU}LR>Wn&2x=gZfSCe^-uDUpRc%6CFf)K-lt))f z6U(MOhRQI!SYfEZw}OQSEs|I9r5jsSE3k7UOF~yDyFD_>LzW}2r(|bR?xDkn@dGE2sQK1;BnHnYmXWnt3Yw&( zq`-sc|4wV*aP{QKaS9WgG)f_8IN*M2Z4FBa0UmJ3JJ4Bo(NY-~4y*mXlMm(L_pv}6 zFjR&HwFnP7j9A|H?y=XCQ$p>!7K~s`hY}^=^m%|75PHPL=@S92lnTFTv{l%T1*%@Q zd3?i1>V5Rj%vFL?zpuALB4D9p_Lo;RHEDP!xPRVYtTOU%D|fO=X&7`3pe>{rKha>~ z5R+62HZVxMeQ7Qi&|PQAAh2J!YltENUrg1&?~j}Z($W-|og@tU=# zQ|-R?bZQoafy?)@$B!RllJtN_1t*mA=U0MhauFZQS}jNT1sjtPW77>p3*I-=BXmTM zl@;hBDM`Wz^2+!#wo_z##zi^*_&gl(n_&HT3z;!Q3Qq^08;R;2FW0sZB41>ov-l(4u+DzfH**3Y8fI5NVkI0HG^x8p*rLJ#-eM%}yJDkuskL>2-l;#MIdh)stK7S;VKu7H>nPfklDk*}yh=Y?eaB~v6No6<+QyO%1(@JU_+j*flmcc9FgEsUVr!2EotXY zv+vDO5pDdO+}yy=R#9K!b3g$wE1nv~lr#7c9o_1jM+WVhq5h4crLm8`Pu~B$wg`AVATfe1c^!4K#1iDXH0wesjf}l>2>0vB zk>rB{A+ocsc+Di?NEjBb@4UzsG!~+v7jWr0k$@H~sIefiRDdd4*zsnNZ`i3i<{fMvw7{ znU~v@MNDwGs@D_QCpeM$vh$Z3m6Kpnc~x$SossGV$vZ5IZ{|&wi%!aO^}gA4?s-u* zmuz>=RwJh@9eIt=uqK8g)*G0N%&a61kJzBEo0VzGUuVkCFjP2GG@)bWKR|lcDZM1k z&dnWqz4$N=b+ybQDM?9To|JPFUvREz7G7S(M7WbjFWcQdDIs3-%gODZW8^Fvx}lK6 zBa-PJMFfu_KRwpXsn4MkwckQY;|PN$mnW>>-EgzzW$?u`T%@BHINF->Am~0m zWM!UexH$k^wl0{TJ6DIy1`Da|0$CDGj#fdc+Mbw3*HwE{{p6=P>|`X*8tMc?<-qiD^dSCojJQYTod1`1 zUR$&qmG9oiP&5E|G+v<}3;^irp{?i$8_p#vEa^M)q?z^)0huK)5IiJKCiCwhvgH?3 zJ{~M)vKlCAf31R8Yb+YR>ob82uA`7hl^P%{@=V43``}!iNpQe-xNXP7VtvNR(fj(9H{<*!vhC zp_{5$&^x&OA(K#|W5Q0bt-E%my-xOi_)r|h^)s_lzY>5iyffVagQgUBA=|-wCnl3A zRiUVxqn>~M8&9o97%rvng`sg?tlU-9K<*K>b}%tAFc3kwj8nGf&fPD&P3g4{0i)dv z^qcO$s3;Y6$!Q6ysE)&rn4e3y($8SXSNZlb3$j&=RNYOQX!~*`-3whGl?2lo)geu{ z_P7uF51fW@SO#)I2s+#pXI1*db;9XDErvNKMSlaK#|rpdaGtTS+&oey)~(LR6SaMg?or!!%1t|lYxe&_06Lm&RUL|o)TTa2`W*W5PPbv zu3-N5$s!6$c4(Nt*ohP0?`%_D6vLyoddjcsYGZ9}xPZAj$_%IiW4;JTRMCfsTzq;1 z=}z6u#R_io9U3_GflCI*@mqA;15L%CT_g+hCLgx%nebCmQVPd`YahZfQ;5SE%4x|Y zUTiVKs2?ZlTBN4cn~Uew2|F>t;+pWQXDC;v)Wm*q7XldobsBPefc1kG2O%MV4K0{U zOe^8e%CjNrA(RQ3D4xL2K*``GO`)BG!AMqOT|pNCCe%Myw+fa(t7SBWigI;CSf;kZ zE3e|Lnx+vu^V7Gni)^`XZgjf-BnW>)Q z^8**-L)*=6!3bsT`mn+HGmZk_aQ#qlBjbUGCofYii-28n+*BhZ`pXW8i=t6olOjQ$8#yOH~el?s1+BX{e+|FWOt@aV>$#If$a zS|YhD{?Jcrll|?z|NDG%%uyXdVpYkPBlvq)vWW18@3gby7Je_*Q{1rhV)CL+Y8joF zxPVYZbUKIio_qxiMUJ_MSrzv(`q9b`M$c7E#M;u?mfA#8BJfN7>FB=#DPKt?)B)7brG{(1q?A?T|3cJsnHMJ4~1UwKXCh2vCDBf=& zRYOpCPG~8zhOmMA*+uMI+rn=-0?jgZ#ahqLvd84rLefkOd99FCXvW!#Vg@<*VJlUpnLbu}%LuaT)AN5Cw~T^Ni4< z>GEl@gH;Y3ve>Suq!bMCB=#AHzZ%AJ8QIrQu6FS`M4%Y6dw&=iar(d7`|hA9^EF-c zjLs;cqhde_jz~_5fCSNTB!gg+v#6keB*{VGj2Q$3gl3SS1GI#uMadZzmC%A@gr-4+ z1_1#jO7uRTb9T?UTf4XJpSx8%b?VgA6lnMN{lfb`>4o}JVrjN|%W)0A3M{zM^_X2) zj{0A^0@&uBEvhaq6L<~iIYrsu_1Z8ssQY=<@N-6-uk2-X|2TMp6az*|XalqYvitV^ zN{Ye4M?RIfl$741xR@B?=*QsBTmd|*CmUr;Ua~E>e>_~f6@bWnal*gU6U|Y~)8k^{ zoA9FoT;~PLb6|iAzN6alvx{Rn^cX1nGBSi!Nx1xTEKAOne8v%uPn0gK1-Gv=>2E$N z*6j`b_m2gZid&*_0N4~uCMzz|sAk=7-|CTK)Or0>RteA|+Yiiyv;b_q5SE3eltYle zXPyvDgr>A%hdg}v%&`Min%xSFOdUbO0NvJa;T5NgTbCDyIT*dHwg>wknsOAWT+jwZ z{p5i?>D@Vv1c|y^EQs|iOFiqne@AD7Ye35!pTymPf6cEKCqBt3Gztg`*7Ff1rejt@ zQj#)ejzXu;7#e{yfXFq&O$%`a6lAEH5Kc4 z;ZWC;v)59Dks1VGx#&Kn5W(Z z(w-%&CzjJd0ifQ*rqdBL@b&eDnhM35#awF|%f0otfL@QK=;mUB?!(cH;o5fUuXm!O zx1oH5Vg$FK69&oYHvYzymv0_s9L{$fGN)-&&3%2}R(--P#H98RwI0lMR5PF^Va@i2 zoUiJVYRGYMohaPlc25(o#}`Arp?}%IA$WHtGg&%9f7>`}MopqAn);smTq&8!An~jtNbH9!h>u6a7YtFs?SS zzI`>}{GaR_U{67NaOlt%7~7;*&^v;ciz-2RDN1*64=Qo!F^ii@-WwODtwd4gXI`g1 z6klhoUgagLO<z;X;1+}y3v=PLOnw;EUK5VYkYC1dhn?c`snG|=!97Q4 zvIS^U{=3bX%k6y0NYKT-Tie-Jo$UTWX5nWmFde`a%E<38fuS9gDhDv}W* z+p}>XgZ8NHLGxXlL`|}E+2cd3;nxBKqq+`nG>-I(W<11`7Y{_b85%Al)Hn!dKy^*f zEHXoIXoRH*3tV*v_@pzfq9i9nAoXkJ)YoaE_9?r=x5qbT+bdw9;Sg9#WZ^3FQF+! z=C}Erq>PN=_>_?me5VU1X`{3xYCt!#U?+3RmL|$1b{X8Vt8Hj75^}+I7d-)ly6Z6p z9n}|xl=>I)b#{*)3Xq~g~gFKH`r|LmL~P95~B+&f$wGQ}iBYHBJf?{tZ& z7dY@G7@B2C)NyN5^ZFI>cxEDT;#Q`nL~1#fC8i4W0M&PKdVNptSUj0L z*P<<@8SDaE9D(qo7XUoF`sHr$yKyd6_O7o`vxjQa+ix{Peu2de*36K!9Y<+Kv;CWf z1}5k(){7RuBqldu)fb$5$J8iD=T=+0?xE{92iq&^^h(`Tx!s!t?}^CE7lWTcLw;9z z?vL(BbAid~>}4zr{X&nJP{pyE{9W`cu!Dmix%gL?r}b2?!57b%yO}l-)4ey_dty8@ zOrFrP<9{GPBvI`KE?Yzl27c%NU}EQ?l|$2Echu75Kz|{r6U7)>A}`!Klc>1x{6HLv z$m*c)#7tEP`>^^#4Mr~om~_n<8BLT)ty3yP{`vzl*&E2S^pIm&T!OaDkn$19_^Ap* z*CC_RC+Y>XVbh-lEr{15RkfVk<)o{r*@duiFlOiw2*uaAbNNo1zP?|@Isx?i1DXIL zfwAle0Sz86=)^RPF|aWjFF!=X@~}agsZF12BZgdyZ%M^nqm`Zq*B(?vHaLSz8wR`s;adE>3j@OFM`j(1fj82MA--N~4UlM4Q zc|J-ejEbK8*5v(E#KsK>N$a2cO9fJ zekiilJL23egW!75t+#mng=J-D5eNy~ybqWsx;p1zu^m?2%6U6fp9XS_jP|?pZwNtZ)rdDFRnyHIzov1?_2TvXIqrKeYX`ZS#h<>p+KWo3yu z|MzQEXWe+)sp5^I8eDlZsC*%3yo}2kB1wXm#qbMexnJIM8`BbZTfZPfZxL+>;jew{sei|I40f1^%oVPX|+2zNttTYJ4KD}gHO zE;3nixz4ajmnb-{#vIbFLW_tIucSEl=R^2E>ChMD>loDRnQ$Sq^q+M77k z4QQbG1dVF2m9dGNs6(|NFUrPUSr+Pu0R`phJe&-e9!1#q1M1Hxb5BNzM>=zz?ZL0;fNHC7 zna15c2swQrI|5_r^IQc>4rOV*51BUS(WMn`r~Ax<>35x{xj8y!mCxyFXcXTl=|(|u zb7OZV3Sz^^T-ykspv(4^sCUdq3c6|`1-Y+ebcjvwP^NZ1DY`{)=mpeC(EYsk3;;Z-ka}Z zH#rwQ5@TCt{V{3#*!%W~t)JJ-AJDjTNAQB$?$byhQ5%g|NtY3|BrdcH*-XUEA4_nM z$;`UIzt8d%veGD%(Mcn}vSb>Fum;3z7y=%?KO* zzQ@J~2B9vmtC8dytB&q|`$zYWC|aM2^YQRF7c8Saw|(~#E&K4m^&U)*m{P9Ez2u(P zbp>yx;CUEp#N+(@xc;uZ@f+o7X)62A!Z$xN<5}e4)g`6(S7p0biSmlrgBk1&MR}eO zb)dN9RONz&U6Hij2I2Ur%hZlPkW zrCDz&33W?F9(;>?zl0FCsl53Ripv&OHyU@EuHll!CG28r>*Vnq=#GY1EJ}xvIEs*G zNfG;ozs(c9#Nqd-GsM&D zD)!Y#=ak+jt_(}2NVv-jBb)h_j@r84-KDgvP%ya%B8o0^I{_|Kh;u8rzjTr#_>gEK zzb?@!VKF`fl>xc>6QR0tYz4=H{#}PYf%%ESxNY2^ufJJfb*;(cZW_@h<-X zt6LTvYn5=;FE|4M1-q*FQ#&pU1cX5L+^0~qbvP>T*fm%yEDZR3R5LSB?>jM6 zy65Mge+EyiUHSP1`&8w@Uw(P+-hf{iJ&TdKVG$9Jp@8O0u)gv|wJcy1YhQMQpF@_g z7S7T{K1q?28R3dR4%;Qr0ssgEn)Adw2;wRI_j8{=XLuwn_t;8Hm_B)bvktU%#?rZi zyP5e8b_}~1e+tUGjybtY^S^dc zF2}8TFQ*=PejKY3pNlArVV;PKGXc?pK_D^^5Hjvt>8~MpZP>?gA!@~n8hcbNj#AMW zgWkNaBZxi%i%K_MT9x+A!{cfq{suKQHAth-R~F6B0QH7uI_&oC&!{A~Y;kSRYRA^b zKP;9Dh%@I>oExJ!d_j96#}*I(5&jwzGid);Q~qZ~>HT+A!35E54ZH^F+xO}?w{C3) zPKUq9JVMK51Uf-tssfeRX@X zN3#|CUn{f(`6gL*AMva<7|{gcWNEY0**!Z~mb)8jg<2aKodCrgKIDwwy3!I61ZX@sc@ihKK*B1(yx)(h1 z{MX;BBAz{a2AoDLbP7PQ#u-y`N46P%MT%ypj<6I#%wj}yiZCLmFZ1@hMX<3I^EBO% zaT7x9%AJ`4St#ew{AlpV3miWl3@#1njYgal0QbR5j6RoH@@PHYyobB{ruEg(pSu(v z9R7*z?-miGj?Z|8KpCP~ySLd7A{jug6D$^@HIY+!Zsd*w&U5MFwC#o_9-7dqLrF4K z%YQe6#^dt+gS+t8u9-NB7L70HYd@O42yTV_)oU@R8)I0r0lA{9l5UCe_(7rQ8}U7f zAOB8i<=6eUrMB?-{z=^Z&tc^L_hY-e-Rk<@jSvGcU1o3MiM*Hdy7;5Q`n@2!amu5e z#Cm*iWl9qPz|*quVqz2}AyP-H31$vGEet-oI7)Vko8n|1KFUOq5Er-$IoAweb3mYn z#UPLR&uK~jGJ#U`B*^SRICm?;?hrtQ!wr2tQE@YG-~t*$j)|J8>H;9ig$3YYh5_yk7Xf~U@P{Hel*nHyNi-1qD^BX( z*ek~l^!(@CvJl^)<@dxYui1WPc9w=QBWN2SSh@m{fDow6dwPjERS>q0z9>}hU6{%3 zDYKmFtm8#x57rx5u{Xh-0-who2Y_pk*X2|ab|TNc#BL3n3&+3kn13;Wn138&1_1#M zy@;SnG`U2t5M5bW>6J4*J8Kjyrl+nxLJYJK-x~~~1;1pL%&snG`4@G0(c>S~<;W%J zcsy&jgaZ)1v}PIznWf{X_4M?_&FJrhBM;>>PG-Bu&uwrF15mo2-B(?G9%oZTVHLy! z!onHAXNM9fmW^IFT7q=J3E;wG<-h)`aO$qwY-~Z)p@M>Pza2o{h4v+wHGaW0x zeqc9qKK~TX6J$m{TaQGomy(PQX~isp^0MP9;|r6a`TrB5Wi^IuHQl_vUCDFRvu2 z!av&y;gtHM7_{3Zy9P0`yyc@*tTKp1Ttz}rbr>rzx?So_<rwE52CMS>k(bt7B}00$OLKHGdPD z_{Wtlmf$zwbx7TTj35+aBB9&Rhb;)UILVy>!vah@GzHySra+iQ>_?Pu5|{E;<_Oo& zcYc++UEt;>4vvP##zIS2iL}CThd>lT~=i{=L?>AhpGdH!r`2tUBHOg(-VWJr;GdjfwS#@K8^<> zkzN+~{TcaqCvXo#@PpmnlR@HFC1EZ3z}FCO4Mn~Gj6HO`JUlCPLJu;G_GAYofWR+u zv4YkIbIL$T%j;djc5Khl*43@-zlp*e3kgFFSMY&AgXYo}XoM>YY|{?ac(^d^XuJJ> zR|MY=kcRI#7UY~o!bjZvX+PL74Ap2&?jU@;Qe-|kVB|HRFT0Y@_fW~VtyDe1QpPLjGM_rY71Zte-Ae&CuYO%;^9$-?j2_*Eo>Ms z6oMdKbFHIDH8IWux+-ONiq1bYs!$LU7k30$Ahe69bcqyd?>Gg_QBM)ZM=)~1%yX56 z^RUGm=apAfP>!|Zhg{|fqs1vK%4hF~ddfsU9`i`Qco&K*tSqbV02hvK(*~#kvx|y~ zppk`_!KE0XTNfzl=@9B^w;8^+*va;OXA2BJb~jMO!WRPN7xrHLOB^w^tv-;4IkIzG z00|}hFq|J5O*uS=|9hFfy!JK)`I3qgZX>Q2MQP@?I(MXjxo(8&jp zisU|BEv>1~PZ~)Cw1uHy*A)*PIG_?LSU46Jf_t$r57G6w@Qz^gJi`pg+#tvk;=aPE zj#;RQ$Ag2=EC78cbTTwDI70ibTowrA%7vl5=n=TM{P2khQ>^X0}HN_>o(0*7?p@)C04h6V)k7 zTT%3a?jwpQ#HS?4j>M^FYnQz4)x|t`FnMJKYj-N?BChSmR+=&GzD_ny28D^+oXJoO zajzT%drgV~{mU#2(Q*Ja233BWV+y3WMzj^2+nC9vO5zRpbckW3j8}vOjn8jf)|95X z{o3<`DB$s?>Sw@(YX12WXE(a`C*~nB8u(_S29nTF0j{EFq5l#JSFiKy%~LWF{1>9v zapV`85~r#keAk#2V|xy4uB}OGb1@9-WeyHKSF*d$)3j*Y#iI8fIJ`2_d) zr95tN?7c8=%r9gQ_6ve!jBxvjoqZa3!R^~bUa<4J=3KX+M}v2MzfzRHqUqxD_zKro zECry=XMV>bIJdq0~i)TNa;w^iJXx z;-TwbVt59mMNrFPCIuH)CT|L;aMPsIMGj8)QrA})ACJ1LfbJ`Au^&ghz}hHjPt_k3 z3jghKrUFNqit+Ub82&ja6QmFXQj??;wb4@)c!$1 zUuVNlKSc%uf)LkJkVjWnw6JVM5|-TCNx(t6!|%zI_{XNgOK? zGoUo>(s7$)Z67C}lh}I@88B)q?p}~I%u>4nk2y(hG50sgTNHO#*zOQ{UOGOzcOu6u zPpvXT!=dczRc>m43D<~hfJRa^K#0Y!Ux@(PaY+H7e^#qED~{5mF&f}$#ZhJ%vDhS% zit4uN_p8uOOXh4~NqpkaJT*qR!irwt6;RgXPg~u4~m<)9nuD@?6Xs|jF{U2X$=QEio z8af3sbR7KwP8Y}EvWSe>m)5@hHwf7Cn<45MH8r?Xt&cq*oGP$SoUX4!!I-dY@|WZp z8lzCce?Fe(15tFx#bVy zv56Qw%3x9mfZGo{vY^vCFW~%Ea87ZT+`z0B#-#@oiL*VU&Bp!YKDbqw&kepe^@8rR zQ6BoEMn9I6)up|1gV`u`UD`}45x_w1@>t`cH)uv@=ze&TmPh z4?`W_mSiFC1E=TLr!~BnaMA<9KnO-#JA%Yci5#XjAE0Fj$Y~>I^p0m!+skAu-r934 z3$mz)2w3FLctn`ZjR8U}@UjW9D;-a75$VI=BiKbiTe`IWEtZCRF$_2Qi|ZR4kJN}l z=s5B`=i$R&7bV4Z!Rdc|r4xN4JT_drcfUiyjgo~x!ce?K1VI$b0HjGh)?q6np-TGX zeT{T^{&B*{=6YWDJh&?n@t!z71$AN!Bck0()yUjjw0Z>CV9&$`uK}W^V67Vb+*X9k zguZ48^c9kDkVlxxB6!4tPgh3-+2IhP(>?+j&b%i1$% zdV?GLgzxYL9oWswcSnSTK$s2l8zJz}*Zt)EJT2P)oA(xnA+P#V1WyR%5HyM{HU|mf zaS!`gM5DvM+6NQkZmLqpxEo?gJYXdmTCq&fm`-Kgt@aR~pto$PxzE{zd`~3#K}swk z6hPXFhc(n#&x>{)>xalASz1{jgeAwp7&`jgK)Is~74D`Lr=nEnBQ9ouxOBgramVow zszC50cP(dTwtZg_bMMIw~ysqWKJq>RPVSPeM;!^S&M7Bl`XZW*Pv27UHyxg z%lFbIarIgv1fg}OlSk>bkRfRDTq|2=RXadz3&$`3i?BH}7WfB?ys3Q{M zZg{v+`lakL`=t}FC*~zH1BSMZY|z?xwGgfETkGMp&3{rkB#d*c$45p$#kD{>*W=A) z@^%CV`M>-0N;Fnut3VL8VZ$>n^ceq*mhr090t#+zMYc#KHJmS-wy{38o_obCbGfQ? zD4_OsN<`(=EX{Wfx`fOEYdTzQ0Q#){kAD>V6HU`*Pu@YOrs|)y({k>Gpy@zYs?W)S z@aXc?At9)i7Rwuw-N6;3*x?2+&$#H%H=6-zm+}^PKYjG^r2kWvKfHz z2i57`M;0drOfW@Q`{+&{9@^X;QKBV1DT5mV0=u%OT&&oPE+;aE4iC`Can=d6Qg>cy z+uPjlfJ5|ZhKqakMB_9K>HITy&V`5((RE4U?7W~ISknsd4KPW-HhQ$PB0pI!FJ;Y7YjmH6RSPk zwxKNWhhX&3(q9mfRAhb(s+`423<}5(Xt81~|6#w3(7*Z-MI-aO5NY z_4l^@pTB&0s`U3obU1^<7&MK)f>fgx8FVkLp8VYAiPFJD=TgVFKR`akD(06~3ysMG z|KbL{If3U0N=b37$JXE5!w8$wYIBkUE@IgM0w52sPUGx;A)$*P^ji*DK{wa-T#^uw zE=1~scSC(~2KU+{%&}BPKN~$k7@Dum1B$4(IS8_&r`_s_l1aT=Xo|S$lV5KhfjRdd zj4NlfxccXxTb>$yr))hSO(6Lw$jTZC;#@2Sn&|kgt@|1`a02K#G}~+ynrfirPTLUw zoysj@@;T~!K-De1?KVXEh>CG77L9An+#Yc=KkmZb_1Dhgb{zGG_)N)9*;P8;>5OF0 zi+wdta>rpv4ox|5;6UvJpMtxJw&-JBpPHnC11$qhAhWw7h}-HR3TBjkqhztr7WiSk-kk_h#ZP>CE%~ld8SO&% zURRV>kg;Cz^6S5`D~%6oy&tHtGf2}TBM=Sna;ahknEoWYf6|{+WkxCIARN$H<9vV? z2$$MP_zv=c&y`iR1pSJG|9}T-m_15Ea|&JsoC(Rvk~!N{fOT|}0_^PxOY<96TKUyP z2+^q)4A>yTGvyylj8;%TOdR&{pA$xDgO*GD{lLI>*#5jd;Q@__jy{)=e}#$!)}oc& zcG^q-_E68)eRrUtE4M)kG-UKsg}ouDsEEl|kow|LPR-7uk*1<~f@mF9yUD@2ix$Qi zO^yeqM8CkqO4J2al7fOmgrPO-nu&FLyX7gv0`Nh2IhJcx|CLwlR%XXuCT3(}6Fo=p z9?B_1??Um7pS^-JlYEB>RUkz6WTS!n$*ar~1o?wzw*`y=_7q|*yi9xs{3FGe3B4W7 z*c|{dPDuFEK#ihSGi^j^_g}cv-jZ6(wHRjtXN}OpVG ze2jVm)%d#3qs_*P!SMQn@jAd;+!rj1-JW}E7U&Xxo~%pOcLYf8Y}2am-&}H`r2uxM zeC${yo)`BOuo(6#|FDsH_TIoaM7Fvj3&2{yUrH{+F8j9(wyf!Pofz@v1)7 bef#l2ENMwY<9r|Sxk!KF G)ldMcsS)o0 delta 23 dcmX@kw2F!AGcPX}0}x1DoXB;GQElRfjN5Ve!+heBH@2TmaQhE}4xe*kfys*q9%36>+0<2ut_Q^yWtZ+FX$AJHGc zk-wBH2gD6nAr4%a(54{f@ZuT!<;{EB-QAo~eg5$J&E15tPhHa&^?z#nh(4EW&XCRd zJUQk?f=Q8LT4b0N0~{1X911pL^W+7`(ITB>?|wa1`fRPRI?%puR5T|Rgf@{*-U-+= z9%Gp1`Ku+3mGjPMWre953pKdwXV#oU5XOnJL|DK^!X~29(PLRo#W6r*+(N{q38MDZ ziWF23DyM-H2nSaxLY;e41rgVte)Z2bhy6Ch1xrL%5v%r{rgCECD$rITRCy==b_F4Z zvJ@3GKvzy*h*R`6$%DX^i>3xaMwiq43#Ys$gLd32v^&qxpP1^<8uHfOd)b-kFOPap z?f$hr+2<762d5ru75`2o4P>qGtnzF3d@^oFQdV9|+1~yyB1~xu%sLo!FzjGN&{34N zQhsDxYFYa*pq_b+vM~)<<6w5P!0aaRX>-wzA791%1ow#7xeWISzNVb>Z^?jXKlg?_ S`N0Uj-(k1b{QU@b=)rHVw#85Y literal 8714 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 None: + """Stop early with guidance instead of scanning a default directory.""" + if input_dir is not None or find_config_file() is not None: + return + console.print("[yellow]No config.yaml found and no --input-dir given.[/yellow]") + console.print("Get started:") + console.print(" [bold]ocr-pipeline init[/bold] create a config for this machine") + console.print(" [bold]ocr-pipeline demo[/bold] try the pipeline on a sample screenshot") + console.print(" [bold]ocr-pipeline run -i DIR[/bold] point at a directory directly") + raise typer.Exit(code=2) + + @app.callback() def callback( config: Path | None = typer.Option(None, "--config", "-c", help="Config file path"), @@ -31,23 +52,92 @@ def callback( setup_logging(log_level, log_file) if config: + if not config.exists(): + console.print(f"[red]Config file not found:[/red] {config}") + raise typer.Exit(code=2) settings.update_from_yaml(config) +@app.command() +def init( + local: bool = typer.Option( + False, "--local", help="Write ./config.yaml instead of the per-user config directory" + ), + input_dir: Path | None = typer.Option( + None, "--input-dir", "-i", help="Screenshots directory to put in the config" + ), + force: bool = typer.Option(False, "--force", help="Overwrite an existing config file"), +): + """Create a minimal config for this machine.""" + target_dir = default_config_location(local) + config_path = target_dir / "config.yaml" + if config_path.exists() and not force: + console.print(f"[yellow]Config already exists:[/yellow] {config_path}") + console.print("Use --force to overwrite it.") + raise typer.Exit(code=1) + + written = write_default_config(target_dir, input_dir) + console.print(f"[green]Config written:[/green] {written}") + + tess = tesseract_path() + if tess: + console.print(f"[green]Tesseract found:[/green] {tess}") + else: + console.print("[yellow]Tesseract not found on PATH.[/yellow]") + console.print(f" Install it with: [bold]{tesseract_install_hint()}[/bold]") + console.print(" or run: [bold]ocr-pipeline setup[/bold]") + + console.print("\nNext steps:") + console.print( + " [bold]ocr-pipeline demo[/bold] verify everything works on a sample screenshot" + ) + console.print(" [bold]ocr-pipeline run[/bold] process your screenshots") + + +@app.command() +def demo(): + """Run the pipeline on a bundled sample screenshot to verify the install.""" + console.print("[green]Running demo on the bundled sample screenshot...[/green]") + result = run_demo() + + table = Table(title="Demo Results") + table.add_column("Metric", style="cyan") + table.add_column("Value", style="green") + table.add_row("Successful", str(result.successful)) + table.add_row("Failed", str(result.failed)) + table.add_row("Chunks Created", str(result.chunks_created)) + console.print(table) + + if result.failed > 0: + for err in result.errors: + console.print(f" [red]{err['path']}: {err['error']}[/red]") + console.print("Something is wrong with the install; run [bold]ocr-pipeline setup[/bold].") + raise typer.Exit(code=1) + + markdown_files = [path for path in result.output_files if path.suffix == ".md"] + if markdown_files: + first = markdown_files[0] + console.print(f"\n[green]Demo output:[/green] {first}") + excerpt = first.read_text(encoding="utf-8")[:1200] + console.print(f"\n[dim]{excerpt}[/dim]") + console.print("\n[green]Install verified.[/green] Run [bold]ocr-pipeline init[/bold] next.") + + @app.command() def run( input_dir: Path | None = typer.Option(None, "--input-dir", "-i", help="Input directory"), output_dir: Path | None = typer.Option(None, "--output-dir", "-o", help="Output directory"), - workers: int | None = typer.Option( - None, "--workers", "-w", help="Number of worker processes" - ), + workers: int | None = typer.Option(None, "--workers", "-w", help="Number of worker processes"), engine: str | None = typer.Option( None, "--engine", "-e", help="OCR engine (paddleocr/tesseract/auto)" ), exclude: list[str] = typer.Option([], "--exclude", help="Glob pattern to exclude; repeatable"), - force: bool = typer.Option(False, "--force", help="Reprocess files already recorded as processed"), + force: bool = typer.Option( + False, "--force", help="Reprocess files already recorded as processed" + ), ): """Run OCR pipeline on all screenshots""" + _ensure_configured(input_dir) if input_dir: settings.input.paths = [str(input_dir)] if output_dir: @@ -55,7 +145,12 @@ def run( if workers: settings.processing.workers = workers if engine: - settings.ocr.engine = engine + if engine not in ("paddleocr", "tesseract", "auto"): + console.print( + f"[red]Unknown engine:[/red] {engine} (choose paddleocr, tesseract, or auto)" + ) + raise typer.Exit(code=2) + settings.ocr.engine = cast(Literal["paddleocr", "tesseract", "auto"], engine) if exclude: settings.input.exclude_patterns = exclude if force: @@ -70,6 +165,7 @@ def run( table.add_row("Total Images", str(result.total_images)) table.add_row("Successful", str(result.successful)) + table.add_row("Skipped (already processed)", str(result.skipped)) table.add_row("Failed", str(result.failed)) table.add_row("Chunks Created", str(result.chunks_created)) table.add_row("Output Files", str(len(result.output_files))) @@ -88,6 +184,7 @@ def run( @app.command() def watch(): """Watch for new screenshots and process automatically""" + _ensure_configured(None) pipeline = OCRPipeline() console.print("[green]Starting watch mode...[/green]") console.print("Press Ctrl+C to stop") @@ -154,9 +251,35 @@ def stats(days: int = typer.Option(30, "--days", "-d", help="Number of days to a console.print(table) +@app.command() +def setup( + target: str = typer.Argument("basic", help="What to set up: basic or full"), + yes: bool = typer.Option(False, "--yes", "-y", help="Run all steps without asking"), + dry_run: bool = typer.Option(False, "--dry-run", help="Print the steps without running them"), +): + """Install system/optional dependencies, executing each step with confirmation.""" + try: + steps = steps_for(target) + except ValueError as exc: + console.print(f"[red]{exc}[/red]") + raise typer.Exit(code=2) from exc + if dry_run: + console.print(f"[cyan]Setup steps for {target} (dry run):[/cyan]") + returncode = run_steps(steps, assume_yes=yes, dry_run=dry_run, console=console) + if returncode != 0: + raise typer.Exit(code=returncode) + if not dry_run: + console.print("[green]Setup complete.[/green]") + + @app.command() def config(): """Show current configuration""" + source = find_config_file() + if source: + console.print(f"[dim]Loaded from: {source}[/dim]") + else: + console.print("[dim]No config.yaml found; using built-in defaults.[/dim]") console.print("[cyan]Current Configuration:[/cyan]") console.print(settings.model_dump_json(indent=2)) diff --git a/src/ocr_pipeline/config.py b/src/ocr_pipeline/config.py index fc11af5..ce27f7e 100644 --- a/src/ocr_pipeline/config.py +++ b/src/ocr_pipeline/config.py @@ -3,7 +3,7 @@ from __future__ import annotations import os import platform from pathlib import Path -from typing import Any, ClassVar, Literal +from typing import Any, ClassVar, Literal, cast import platformdirs import yaml @@ -12,6 +12,8 @@ from pydantic_settings import BaseSettings, SettingsConfigDict APP_NAME = "ocr-pipeline" APP_AUTHOR = "aman" +CONFIG_ENV_VAR = "OCR_PIPELINE_CONFIG" +DEFAULT_CONFIG_FILENAME = "config.yaml" def _get_platform_ignore_patterns() -> list[str]: @@ -60,7 +62,7 @@ class PreprocessConfig(BaseSettings): class OCRConfig(BaseSettings): - engine: Literal["paddleocr", "tesseract", "auto"] = "paddleocr" + engine: Literal["paddleocr", "tesseract", "auto"] = "tesseract" languages: list[str] = Field(default_factory=lambda: ["en", "latin"]) use_gpu: bool = False use_angle_cls: bool = True @@ -81,7 +83,7 @@ class ProcessingConfig(BaseSettings): class DetectorConfig(BaseSettings): - enabled: bool = True + enabled: bool = False model: str = "" confidence_threshold: float = Field(default=0.7, ge=0.0, le=1.0) @@ -108,7 +110,7 @@ class DetectorsConfig(BaseSettings): class EntitiesConfig(BaseSettings): - enabled: bool = True + enabled: bool = False model: str = "en_core_sci_lg" types: list[str] = Field( default_factory=lambda: [ @@ -176,7 +178,9 @@ class WatchConfig(BaseSettings): debounce_seconds: int = Field(default=5, ge=0) ignore_patterns: list[str] = Field(default_factory=_get_platform_ignore_patterns) db_path: str = Field( - default_factory=lambda: str(Path(platformdirs.user_data_dir(APP_NAME, APP_AUTHOR)) / "processed_files.db") + default_factory=lambda: str( + Path(platformdirs.user_data_dir(APP_NAME, APP_AUTHOR)) / "processed_files.db" + ) ) poll_interval: float = Field(default=1.0, gt=0) @@ -189,15 +193,45 @@ class _BaseSettings(BaseSettings): ) -def _load_yaml_config(path: str = "config.yaml") -> dict[str, Any]: - """Load YAML config file if it exists.""" - config_path = Path(path) - if not config_path.is_absolute(): - config_path = Path.cwd() / config_path - if config_path.exists(): - with open(config_path) as f: - return yaml.safe_load(f) or {} - return {} +def user_config_dir() -> Path: + """Per-user config directory for this machine.""" + return Path(platformdirs.user_config_dir(APP_NAME, APP_AUTHOR)) + + +def _candidate_config_paths() -> list[Path]: + """Config file locations in priority order.""" + candidates: list[Path] = [] + env_path = os.environ.get(CONFIG_ENV_VAR) + if env_path: + candidates.append(Path(env_path).expanduser()) + candidates.append(Path.cwd() / DEFAULT_CONFIG_FILENAME) + candidates.append(user_config_dir() / DEFAULT_CONFIG_FILENAME) + return candidates + + +def find_config_file() -> Path | None: + """First config file that exists, or None when nothing is configured.""" + for candidate in _candidate_config_paths(): + if candidate.is_file(): + return candidate + return None + + +def _load_yaml_config(path: str | Path | None = None) -> dict[str, Any]: + """Load YAML config from an explicit path or the standard search paths.""" + if path is not None: + config_path = Path(path) + if not config_path.is_absolute(): + config_path = Path.cwd() / config_path + if config_path.exists(): + with open(config_path) as f: + return yaml.safe_load(f) or {} + return {} + found = find_config_file() + if found is None: + return {} + with open(found) as f: + return yaml.safe_load(f) or {} def _build_settings_from_yaml(yaml_dict: dict[str, Any]) -> dict[str, Any]: @@ -253,7 +287,7 @@ class Settings(_BaseSettings): yaml_models = _build_settings_from_yaml(Settings._yaml_config) super().__init__(**yaml_models, **kwargs) - def update_from_yaml(self, path: str) -> None: + def update_from_yaml(self, path: str | Path) -> None: """Reload settings from a YAML file.""" Settings._yaml_config = _load_yaml_config(path) # Re-initialize with new config @@ -271,4 +305,34 @@ class Settings(_BaseSettings): return Path(self.watch.db_path).expanduser().resolve() -settings = Settings() +class _LazySettings: + """Import-safe handle for the global Settings. + + Instantiating Settings at import time read config.yaml from whatever + directory the process started in, so `import ocr_pipeline` touched the + filesystem and behaved differently depending on the caller's cwd. This + proxy defers all of that until the settings are actually used. + """ + + def __init__(self) -> None: + self._instance: Settings | None = None + + def _get_instance(self) -> Settings: + if self._instance is None: + self._instance = Settings() + return self._instance + + def __getattr__(self, name: str) -> Any: + return getattr(self._get_instance(), name) + + def __setattr__(self, name: str, value: Any) -> None: + if name == "_instance": + object.__setattr__(self, name, value) + else: + setattr(self._get_instance(), name, value) + + def __repr__(self) -> str: + return repr(self._get_instance()) + + +settings: Settings = cast(Settings, _LazySettings()) diff --git a/src/ocr_pipeline/demo.py b/src/ocr_pipeline/demo.py new file mode 100644 index 0000000..1581ce5 --- /dev/null +++ b/src/ocr_pipeline/demo.py @@ -0,0 +1,45 @@ +from __future__ import annotations + +import shutil +import tempfile +from importlib.resources import as_file, files +from pathlib import Path + +from ocr_pipeline.config import settings +from ocr_pipeline.pipeline import OCRPipeline, PipelineResult +from ocr_pipeline.utils.logging import get_logger + +logger = get_logger(__name__) + +DEMO_IMAGE_NAME = "demo_screenshot.png" + + +def demo_image_path() -> Path: + """Copy the bundled sample screenshot into a fresh temp directory.""" + resource = files("ocr_pipeline.assets") / DEMO_IMAGE_NAME + target_dir = Path(tempfile.mkdtemp(prefix="ocr-pipeline-demo-")) + target = target_dir / DEMO_IMAGE_NAME + with as_file(resource) as source: + shutil.copy(source, target) + return target + + +def _apply_demo_settings(work_dir: Path) -> None: + """Hermetic demo: guaranteed-safe engine and features, isolated output and DB.""" + settings.ocr.engine = "tesseract" + settings.entities.enabled = False + settings.detectors.figures.enabled = False + settings.detectors.tables.enabled = False + settings.detectors.captions.enabled = False + settings.processing.skip_existing = False + settings.output.base_directory = str(work_dir / "output") + settings.output.write_consolidated = False + settings.watch.db_path = str(work_dir / "demo_processed.db") + + +def run_demo() -> PipelineResult: + """Run the full pipeline on the bundled sample screenshot.""" + image = demo_image_path() + _apply_demo_settings(image.parent) + logger.info("demo_started", image=str(image)) + return OCRPipeline().process_all([image]) diff --git a/src/ocr_pipeline/detectors/__pycache__/__init__.cpython-313.pyc b/src/ocr_pipeline/detectors/__pycache__/__init__.cpython-313.pyc index e46ddbcb787d797cdc4d182d2e8c3275bd72f414..46d2d801220ea1419b417f43f35855d56538eb0c 100644 GIT binary patch delta 54 zcmZohn5XZOpIn-onpaY+pPe3`pIoFr Ic`;)g0IqToY5)KL delta 25 fcmbQo(#XQ~nU|M~0SF{6ZseN5$f!2?0Am~gP6Y;E diff --git a/src/ocr_pipeline/detectors/__pycache__/figures.cpython-313.pyc b/src/ocr_pipeline/detectors/__pycache__/figures.cpython-313.pyc index 6a8cc21577f7848202c47bf7dc8a8756e0b12468..99075927673ff69c96852f866324fdbd3d162bb6 100644 GIT binary patch delta 2815 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 JXTx4S{4Y<5jYa^4`<}2{bp3R`$ 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 S`wX_9SU9NPJ*sWMsU{p!A)E aossD~1Beh{V6^ze!pY6l$X+A_R004sg*~AF diff --git a/src/ocr_pipeline/ocr/__pycache__/engine.cpython-313.pyc b/src/ocr_pipeline/ocr/__pycache__/engine.cpython-313.pyc index 47a4cd455ccaf2fcd7785b00455f4de57c4f57bf..5af565b152dfcdf786b9fc528cfd63a47066ed72 100644 GIT binary patch delta 3555 zcmZ`+YfK#16~41Gvya)?U0``Eu&@IQhD~fRuFNC2#Ky+16MJzOZ`20d)v!A(V=uFt zJBweX!j)SKr><=4CUVorvHiymZPhe&)mCkz=7FpJs46xnfv%{UAFk9^Rf`|0tN2gP zonZl2=@s+MnS0MYk9*H!x%b@7LGJ^PM?f%sw&loCx&9sRpV|7}_L!k!qg|O$^!7cO z#N>pk=ZyAasdy%V+sQxKUouC@EO(?#_Kt9}uLX9?CD@+wL`sRkPc=qQ3q}r0Q&Kde zs|DYfl1`5*iDPlBDn>@1MG*)2Houq0&%#EM=L5`6@^?PSY$FbPYxx3Kv(&ih%;2S$ zKH)aueZYdZ6JKpL8M5~?17rfIAK53n_QHZu3UCH3RoBgM7hFrhh8gZ-XSKN}!N5{+ zQ2$tjmkN>vUxs91_bLnh7iZP8y_H0Elb`R6Z#8BE>6d=3c ztN4M2r6M^*UH_jU3o)DQ?y*TIg&NRseR0`=lx+y<+=kuZ)irX<hh-9h+U63bR>HLkKhiBI3HY5Ae^ZE;py zZ0*ap_Pys`s5vn6{6jlxeCk&4MsTsAH{Z~^6bLWZhOg~-eaB*Ld%m_Ef_1qevcA6D zyye!&jgiIX-TCI-%PsA|5@9f-lr^ZR+)@#ZXs1)OF7<)O%;5E0w&b z`;Woqe6Z^+FTf@4Ro99@>cyI#hi+6}_W-e;?z<(GSG82mo1wQqA)cgOf4KiKOhEnY8UQJW;?Sg?(2uX9X=X_7z9b7J}pAS8|P_}bk+-y6^xZr1v^%AlUT>wDYFyrf)}Q-iFZ@jL*Wnw)68>}qTRtPHC6+G z!i(_!A`AdwwvKbC^1jW+H{N&F@nw(tw()|+zTfOO-zn>4-n>0m_A!nXhnAAt1az@~HO$eBQpxpw<%z;81T)$~4! zXJ7+Vzt20e|9emus5%O7!ecl9&Y?%Pt;N%!D+zek25V8wgH9k`LnHkNGcv+9nZc}V zt3jBP9WrE04LZslWiT(hWS-L4KEh*%Y{$+N8xaaF2*m+CrRnP5K7uy?MtGKq!fn%Q zE7+}?ZCZtC)5T5-qvYveFcJmQfRICybrv)h3T123+Tw8<*75iP$p$+dG~%KOmK?H` zmvqCf*Pyr35*1@~8+kui<+MEmEl83Dpx{LlqgUlMX_IrRvQA4HiNX z>X7*(icSrAtd)%@v%~c2%n@5lcA10rPSs4WsWEKO*BPDN#Wtm` z3`x-?Z9++@o28U?9QvQ6Dv5DPHBV5=jjPge1#60)leC;PuISLH4QW(0a&3aJmijG* zlvH!-bb_|ZH7=~2kc07`3P}no1^SyK!kLL(a2CBNh#M`z$AHJ+0BGVC z)Abvn%IPJ#Kt-QHDyp3fO5f$aMSmpkkG!>c z!QVA6cCB!ntDCO$UhZA=Z_4{OT|c?t-#RaD{m-&5@BrCd-OFOx#pwCyd~N5i6Yn+r zYHTK&7Y8;9>#(GKEOtF!;bFsPMjhDllbT%~^u9;vuV&w`>gq3NKkza@e^Ac%SKt1P zbbzTay&nTs(|hZbt`Mm)P)&V_u-0h^W^l%{N^Trakrx^}nSYR(M#ZZ5thLKLQ8S%q z=}tR-n@T-T;l}`{OV^vg>VFgX6}o7aQx5-}(zN?-n00+_t)nFYo0k~-1&{?7gkL75 zL!^FgtGG$oDSQNv5db)c?%P;?`@e-UzWZUTgAcEiqtd|H{Z_-cNiKyY<`wczILMqN ze+YM!UV%LYUZ0%Eo+{Y%EdCxTY1(f$%W#s!n*tHD8<~~XRJIfN*LzjLxdU=+GOhOE wIdZ+}yFE^(Wd#8|V3EzeVgu??<%+(Q%}VOs~K0UnJrO-$fE0x-q>7q(eSHUIzs delta 2972 zcmb_edu&tJ89(Pf{J4I_u@gTM96NDBE`*Rk3wvW>ZWbD8FOSs8|y#Q{;3Q>O118fo$oph zDFSJec4Ytjo$q|#d3;a*&7oOz)>G%egU`A8q*4r2zDVPyo55MKH&N8d7@=Hs}LmW;vKn5h@H zcAMiUYp;kZ1~#iqP$Ezv2Se0pa&0umImOh?1yLG>P@=K2YD8)iLK?qDz8T~T! zuVo0xIKUU_zb#(t0Y(-L*|BswMd%)DZ424XII=)uATtQ7mT`4tB%4ZRRV`h_shq%= z^qh6Qzn>AgMFz}@7DvHS&pr#*>JsOsf3Vg~{oNZ{476O!Uda{$JMw`Y3pK$-Z}6J+ zinZWv%X`}ve1XrbFE(y?v+a6Yp>c1%aqnWd?ahJf1BGxjAC7)jtUi2g;L1RuzAInf zb>AiV?9 zDu&G{&c_AC*li4>%}5j3m+>@XoLBS%TxkCx7GS2hsXW)rj55K|D|2aeu5&d@TpV=L zj~yZGq*Ya+PRNwUM%)~i;ugi+z8aW8bnx>CSx^uu678s}p)XhYoi!D;xS<@t^m|pc z?VH%U4q-*qY>(a>x5jNxe{W>%d*ke7mG{b)*pQ5i{BSl$z#v8RkIIomp{ldTWhJA) z7bY^tQUt=C9HH+yJ8_IIJAdRp${4wRmRl@_P1f_$tI|2^?60ez#ZyoSWUib*pccC+ zkV*D?Lej?DwGovN^?1=hQWKLz(+iJmB7507*$40(Ko0;jJ<_j0rhtOdL!fNwm8M*_ z_QMn)%D#GCI*V!_aGcoqz~m9Dm$!6?QdxXIyvYa}y*pP6)_s1jqqE$&?-Cbcg4WuQ4c^$1~Yv z=9rpJ70nZ=Tux7Z@*P+bM$`$Fd>urO13UvvoFO}4ath!Z0H+z`91McNAbrhWji=~U ze?9)e>^puJmjvVLR)~>rGEz1?(R5EW*ejq8FvGq%NW8OXnOn8eD`2Hw=m<0DFd|q% zgi|o#70!%oNM}xdb{OL!$Jv_SACH0^U z{H;CPpWDU18^Jw@e|MM2@HQ_+9sF(E_Nc_q37FAyk{ET&{yxH|CynWSG1Z^Iwa3t_cfsQER1g|u9$ zD+2i$oCLj&d<#G?cjhNn8_3pjO#GZtMKehakEONDiPRHo_EnGuX#Ide4*pu4MGrV$ zj69T_3|fq0Q^}2--f#DpOZQd!UUM*@Uqb(jRbP~n$c$YY z$z$Wki<~x2F45kW{;hjKK)0O?R2#rn0CeFV6Cl7&-6`olxm*h(PT}hNBQ6z23HjRjqWvQv8&~+u%vE-k~q_(la$i$jl(M-rC zJG)FGBdwGMH5?#DVow4Y>7i~fHIN(}I6x97XbZTfUMiMBXe}Hx1$xP;b{*6y&_mzw zN713^0Q=3%oA*2O-rEOL@6Wg%Ih`Vc@pyRo`B(fOxcN+-d1#*y z#6CJDB*XR+$%8*i!L&1j=M`NwJHO*svy=*9!3U;7A^Nc}yfzKXKKS(i0IZ|0dIzd} z_xjwI{K3ESr~f8JYSP~I6IP95bvjd5WB|ON#9O}{VnE(cwwh_(%Of>)Bz^8_J76R1UKxmZ5q7DGA}kD zXKjh$mgXJPlD%yfDo{v_>^N#IcXFKk6rm0jLa9#VXdNdG($kW3NJt%Oi^@V*x~LGPP*4kt?Rtu>E^z-4sA?coxJ{RT^ibyhJf^MorU(=U>N`JcxT{rN3_sqN?sPLB(0(Lm9=8^w_?RC z)+l$;6)RsT86~}tKTj00dI}=9t6ElnDQ{eea^w_fHu=kKiEGB)B@7;bkh}`AkTm`Q)sjr-E>y8{7)*-Ygp&eOXGqkWV{yn-UB53!1V|T zL#~G|Q?Emz(0mZ$gcZeP_m|FQo2)jO*--+bLY zUv<{geUN{h|B?)R-$M*m3SDT zKox($#|o1;859AcZt^sJ%io7zrSJL2!wnTb1-jWuRD-Ohp@CNl2AN_cOvw7R-T;o# z!QMe!z8&v<#0|_cP0Uo&GIOn2HyoLvC;IpAx&)Mq-a=kCQj3alVL9|l=u}Bl$(!^_ z|LEE=#@~oG##XEV2>Y#(5Cc|LB;E#QN@t;6LjU4;Yy6weh;``k2|Q-?KSTgc8O9#v z$tX-0y+);6P#boi2xapbW0^odYla`~F~u~U9&qCW^!UKrp2lrA?xk^~ar%#e0N$X^ Vz^U%NSbUtoX^j2U{s+xOQtN*g@dk;>*9nYKluV92OAQLTl5GsWYY-{zymMeiob(qW!L4@o$v^m*p$tH=`-sL&fxpR3`(P1ur@29d<*qgANDr{ zL!@bAL&`;Jex}+>kHy50`=qi*LxyOpLu%&!yMPO5fYT6Pz`7US7LI6~6MAYPKW`l) zR*5XmTIKR0alB8DWJm4!qHV!n!VFemLTpZw3=K>6P&j<0xL`R->A@QKR@871wnRe| ziYy!)m(n~-AKsEWIv=A-oId4WC|1!Qjmauszk2w0e!9v}{~5`wNA|8By&j4~Vs(6* zPr$EIqZ&+Z1Y4`Y)=T_)u;U#8GV)%2bUpM4Ov!fh$HSrFE_Ag^8A)_ z{aQ?*ggkD5ZTVR|xHjs2590y&QR&4)Ap2fZ+BkOYoyf+}t!QhX`L?ikmX=mF(+0?Rkr^_9Dk2nP>{PGc~}FqtI0{3=@esegz7Np0pccf!ZBE zu`1;C8Df=}PE-i{wjE4J3BFD=;eBvD(TwwJ_Y$`}$tPGSw%5+qEH`qHLidmXkhC`Z zDs*WvyaHod*UAW+bq~jGmS_yS7*Y&rh66PWQl;ELaT?w6@WQ}tf1|MHZqI%pb`w$T zEMeX{PgqBs3{{p&C#>ADeC4I~)Le14@&Z|*cK5J)gQLvMz&))F>ma4h2i@YjWpE34 d04}GR@EQ0nHC4YGD|e65zXgu{jTqgX{slYG9v%Py diff --git a/src/ocr_pipeline/ocr/engine.py b/src/ocr_pipeline/ocr/engine.py index 0560fe8..6d8af89 100644 --- a/src/ocr_pipeline/ocr/engine.py +++ b/src/ocr_pipeline/ocr/engine.py @@ -68,7 +68,7 @@ class OCRResult: class PaddleOCREngine: def __init__(self): - self._ocr = None + self._ocr: Any = None self._initialized = False def _init(self): @@ -104,6 +104,8 @@ class PaddleOCREngine: def process(self, image: np.ndarray) -> OCRResult: self._init() + if self._ocr is None: + raise RuntimeError("PaddleOCR failed to initialize") start = time.time() result = self._ocr.ocr(image, cls=True) @@ -211,24 +213,25 @@ class OCREngine: self.tesseract = TesseractEngine() self.engine_preference = settings.ocr.engine - def process(self, image: np.ndarray) -> OCRResult: - """Process a pre-loaded image array.""" - if self.engine_preference == "paddleocr": - try: - return self.paddle.process(image) - except Exception as e: - logger.warning("paddleocr_failed_fallback", error=str(e)) - return self.tesseract.process(image) + def process(self, original: np.ndarray, preprocessed: np.ndarray | None = None) -> OCRResult: + """Process an image, giving each engine the variant it handles best. - elif self.engine_preference == "tesseract": - return self.tesseract.process(image) + PaddleOCR's detection handles raw screenshots (including dark mode) far + better than the binarized preprocessing derivative, so it receives the + original image. Tesseract benefits from binarization and receives the + preprocessed derivative; it is also the fallback when Paddle fails. + """ + if preprocessed is None: + preprocessed = original - else: - try: - return self.paddle.process(image) - except Exception as e: - logger.warning("paddleocr_failed_fallback", error=str(e)) - return self.tesseract.process(image) + if self.engine_preference == "tesseract": + return self.tesseract.process(preprocessed) + + try: + return self.paddle.process(original) + except Exception as e: + logger.warning("paddleocr_failed_fallback", error=str(e)) + return self.tesseract.process(preprocessed) def process_file(self, image_path: Path) -> OCRResult: """Load and process an image file.""" diff --git a/src/ocr_pipeline/ocr/parallel.py b/src/ocr_pipeline/ocr/parallel.py index 2e5451f..69aef31 100644 --- a/src/ocr_pipeline/ocr/parallel.py +++ b/src/ocr_pipeline/ocr/parallel.py @@ -35,11 +35,13 @@ def _process_single_image(args: tuple[Path, dict]) -> ProcessedImage: try: image_hash = compute_image_hash(path) prep_start = time.time() - image = preprocessor.preprocess(path) + original = preprocessor.load_image(path) + ocr_base = preprocessor.resize_if_needed(original) + preprocessed = preprocessor.preprocess_image(original) preprocessing_time = time.time() - prep_start ocr_start = time.time() - result = ocr_engine.process(image) + result = ocr_engine.process(ocr_base, preprocessed) ocr_time = time.time() - ocr_start return ProcessedImage( @@ -87,7 +89,13 @@ class ParallelProcessor: unique_images = [] seen = set() for img in all_images: - if not img.is_file() or img.suffix.lower() not in (".png", ".jpg", ".jpeg", ".tiff", ".bmp"): + if not img.is_file() or img.suffix.lower() not in ( + ".png", + ".jpg", + ".jpeg", + ".tiff", + ".bmp", + ): continue if any(img.match(pattern) for pattern in settings.input.exclude_patterns): continue diff --git a/src/ocr_pipeline/ocr/preprocess.py b/src/ocr_pipeline/ocr/preprocess.py index fcb9db4..409c90d 100644 --- a/src/ocr_pipeline/ocr/preprocess.py +++ b/src/ocr_pipeline/ocr/preprocess.py @@ -27,7 +27,9 @@ class ImagePreprocessor: if max(height, width) <= self.max_dim: return image scale = self.max_dim / max(height, width) - return cv2.resize(image, (int(width * scale), int(height * scale)), interpolation=cv2.INTER_AREA) + return cv2.resize( + image, (int(width * scale), int(height * scale)), interpolation=cv2.INTER_AREA + ) def deskew(self, image: np.ndarray) -> np.ndarray: if not self.config.deskew: @@ -43,10 +45,16 @@ class ImagePreprocessor: return image height, width = image.shape[:2] matrix = cv2.getRotationMatrix2D((width // 2, height // 2), angle, 1.0) - return cv2.warpAffine(image, matrix, (width, height), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE) + return cv2.warpAffine( + image, matrix, (width, height), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE + ) def denoise(self, image: np.ndarray) -> np.ndarray: - return cv2.fastNlMeansDenoisingColored(image, None, 10, 10, 7, 21) if self.config.denoise else image + return ( + cv2.fastNlMeansDenoisingColored(image, None, 10, 10, 7, 21) + if self.config.denoise + else image + ) def apply_clahe(self, image: np.ndarray) -> np.ndarray: if not self.config.clahe: @@ -61,8 +69,12 @@ class ImagePreprocessor: return image gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) _, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) - horizontal = cv2.morphologyEx(binary, cv2.MORPH_OPEN, cv2.getStructuringElement(cv2.MORPH_RECT, (40, 1))) - vertical = cv2.morphologyEx(binary, cv2.MORPH_OPEN, cv2.getStructuringElement(cv2.MORPH_RECT, (1, 40))) + horizontal = cv2.morphologyEx( + binary, cv2.MORPH_OPEN, cv2.getStructuringElement(cv2.MORPH_RECT, (40, 1)) + ) + vertical = cv2.morphologyEx( + binary, cv2.MORPH_OPEN, cv2.getStructuringElement(cv2.MORPH_RECT, (1, 40)) + ) mask = cv2.bitwise_or(horizontal, vertical) result = image.copy() result[mask > 0] = (255, 255, 255) @@ -72,7 +84,9 @@ class ImagePreprocessor: if not self.config.adaptive_threshold: return image gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) - binary = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2) + binary = cv2.adaptiveThreshold( + gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2 + ) return cv2.cvtColor(binary, cv2.COLOR_GRAY2BGR) def preprocess_image(self, image: np.ndarray) -> np.ndarray: diff --git a/src/ocr_pipeline/onboarding.py b/src/ocr_pipeline/onboarding.py new file mode 100644 index 0000000..53a1248 --- /dev/null +++ b/src/ocr_pipeline/onboarding.py @@ -0,0 +1,64 @@ +from __future__ import annotations + +import platform +import shutil +from pathlib import Path + +import yaml + +from ocr_pipeline.config import DEFAULT_CONFIG_FILENAME, user_config_dir +from ocr_pipeline.utils.logging import get_logger + +logger = get_logger(__name__) + +CONFIG_HEADER = "# ocr-pipeline configuration (generated by `ocr-pipeline init`)\n" + + +def default_screenshots_dir() -> Path: + """The directory where this OS puts screenshots by default.""" + system = platform.system().lower() + if system == "darwin": + return Path.home() / "Desktop" + if system == "windows": + return Path.home() / "Pictures" / "Screenshots" + return Path.home() / "Pictures" + + +def tesseract_path() -> str | None: + """Path to the tesseract executable, or None when it is not on PATH.""" + return shutil.which("tesseract") + + +def tesseract_install_hint() -> str: + """One-line install instruction for the current platform.""" + system = platform.system().lower() + if system == "darwin": + return "brew install tesseract" + if system == "windows": + return "choco install tesseract # or https://github.com/UB-Mannheim/tesseract/wiki" + return "sudo apt-get install tesseract-ocr # or your distro's package manager" + + +def default_config(target_dir: Path, screenshots_dir: Path | None = None) -> dict: + """Minimal config content: safe Tesseract defaults, everything optional off.""" + shots = screenshots_dir or default_screenshots_dir() + return { + "input": {"paths": [str(shots)]}, + "ocr": {"engine": "tesseract"}, + "output": {"write_consolidated": True}, + } + + +def write_default_config(target_dir: Path, screenshots_dir: Path | None = None) -> Path: + """Write a minimal config.yaml into target_dir and return its path.""" + target_dir.mkdir(parents=True, exist_ok=True) + config_path = target_dir / DEFAULT_CONFIG_FILENAME + body = yaml.safe_dump(default_config(target_dir, screenshots_dir), sort_keys=False) + config_path.write_text(CONFIG_HEADER + body, encoding="utf-8") + logger.info("config_written", path=str(config_path)) + return config_path + + +def default_config_location(local: bool) -> Path: + """Where `init` writes config: cwd with --local, else the per-user config dir.""" + return Path.cwd() if local else user_config_dir() diff --git a/src/ocr_pipeline/output/__pycache__/__init__.cpython-313.pyc b/src/ocr_pipeline/output/__pycache__/__init__.cpython-313.pyc index 746936b9e5fc117b7e6364c3be3fdd2e86c62d77..887cbb0276024c53d102a19d5f587c4daef25bb3 100644 GIT binary patch delta 52 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 U@VSbgUo_8YHSDhmhIHQk9|{aSJpcdz literal 8471 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 Ah5!Hn diff --git a/src/ocr_pipeline/output/markdown.py b/src/ocr_pipeline/output/markdown.py index 76fbef2..d6491ba 100644 --- a/src/ocr_pipeline/output/markdown.py +++ b/src/ocr_pipeline/output/markdown.py @@ -44,7 +44,11 @@ class MarkdownWriter: self._written_chunks: list[tuple[dict[str, Any], str]] = [] def start_run(self, timestamp: str, run_number: int) -> Path: - """Allocate one shared output directory for the entire pipeline run.""" + """Allocate one shared output directory for the entire pipeline run. + + The directory itself is created lazily on the first write, so a run + where every image is skipped does not leave an empty run_NNN behind. + """ self._written_chunks = [] dt = datetime.datetime.fromisoformat(timestamp.replace("Z", "+00:00")) if self.organize_by == "date_run": @@ -54,18 +58,20 @@ class MarkdownWriter: else: self._run_dir = None if self._run_dir is not None: - self._run_dir.mkdir(parents=True, exist_ok=True) return self._run_dir return self.base_dir def _get_output_dir(self, metadata: dict[str, Any]) -> Path: if self.organize_by == "source_dir": source_parent = Path(str(metadata.get("source_path", "unknown"))).parent - safe_parent = "_".join(part for part in source_parent.parts if part not in (source_parent.anchor, "/")) + safe_parent = "_".join( + part for part in source_parent.parts if part not in (source_parent.anchor, "/") + ) output_dir = self.base_dir / "by_source" / (safe_parent[:100] or "unknown") output_dir.mkdir(parents=True, exist_ok=True) return output_dir if self._run_dir is not None: + self._run_dir.mkdir(parents=True, exist_ok=True) return self._run_dir timestamp = metadata.get("timestamp") if not isinstance(timestamp, str) or not timestamp: @@ -84,16 +90,24 @@ class MarkdownWriter: ) -> Path: output_dir = self._get_output_dir(metadata) source_path = Path(str(metadata.get("source_path", "unknown"))) - safe_name = "".join(c for c in source_path.stem if c.isalnum() or c in "-_")[:80] or "unknown" + safe_name = ( + "".join(c for c in source_path.stem if c.isalnum() or c in "-_")[:80] or "unknown" + ) source_hash = str(metadata.get("source_hash", ""))[:12] chunk_idx = int(metadata.get("chunk_index", 0)) total_chunks = int(metadata.get("total_chunks", 1)) suffix = f"_{source_hash}" if source_hash else "" - filename = f"{safe_name}{suffix}_chunk_{chunk_idx:03d}.md" if total_chunks > 1 else f"{safe_name}{suffix}.md" + filename = ( + f"{safe_name}{suffix}_chunk_{chunk_idx:03d}.md" + if total_chunks > 1 + else f"{safe_name}{suffix}.md" + ) output_path = output_dir / filename frontmatter = self._build_frontmatter(metadata) - body = self._build_body(content, source_path.name, figures or [], tables or [], entities, citations or []) + body = self._build_body( + content, source_path.name, figures or [], tables or [], entities, citations or [] + ) self._written_chunks.append((dict(metadata), content)) with output_path.open("w", encoding="utf-8") as handle: handle.write("---\n") @@ -112,7 +126,9 @@ class MarkdownWriter: output_dir.mkdir(parents=True, exist_ok=True) grouped: dict[str, list[tuple[dict[str, Any], str]]] = {} for metadata, content in self._written_chunks: - grouped.setdefault(str(metadata.get("source_path", "unknown")), []).append((metadata, content)) + grouped.setdefault(str(metadata.get("source_path", "unknown")), []).append( + (metadata, content) + ) timestamp = datetime.datetime.now(datetime.UTC).isoformat() frontmatter = { @@ -125,7 +141,9 @@ class MarkdownWriter: parts = ["# Consolidated OCR Output", ""] for source_path, chunks in sorted(grouped.items()): parts.extend([f"## Source: {Path(source_path).name}", ""]) - for _metadata, content in sorted(chunks, key=lambda item: int(item[0].get("chunk_index", 0))): + for _metadata, content in sorted( + chunks, key=lambda item: int(item[0].get("chunk_index", 0)) + ): parts.extend([content.strip(), ""]) output_path = output_dir / settings.output.consolidated_filename with output_path.open("w", encoding="utf-8") as handle: @@ -133,7 +151,12 @@ class MarkdownWriter: yaml.safe_dump(frontmatter, handle, sort_keys=False, allow_unicode=True) handle.write("---\n\n") handle.write("\n".join(parts).rstrip() + "\n") - logger.info("consolidated_markdown_written", path=str(output_path), sources=len(grouped), chunks=len(self._written_chunks)) + logger.info( + "consolidated_markdown_written", + path=str(output_path), + sources=len(grouped), + chunks=len(self._written_chunks), + ) return output_path def _build_frontmatter(self, metadata: dict[str, Any]) -> dict[str, Any]: @@ -152,19 +175,38 @@ class MarkdownWriter: if figures: parts.extend(["## Figures Detected", ""]) for index, figure in enumerate(figures, 1): - parts.extend([f"### Figure {index}", f"- **Bounding Box**: {figure.bbox}", f"- **Confidence**: {figure.confidence:.2f}"]) + parts.extend( + [ + f"### Figure {index}", + f"- **Bounding Box**: {figure.bbox}", + f"- **Confidence**: {figure.confidence:.2f}", + ] + ) if figure.caption: parts.append(f"- **Caption**: {figure.caption}") parts.append("") if tables: parts.extend(["## Tables Detected", ""]) for index, table in enumerate(tables, 1): - parts.extend([f"### Table {index}", f"- **Bounding Box**: {table.bbox}", f"- **Confidence**: {table.confidence:.2f}"]) + parts.extend( + [ + f"### Table {index}", + f"- **Bounding Box**: {table.bbox}", + f"- **Confidence**: {table.confidence:.2f}", + ] + ) if table.markdown: parts.extend(["", "#### Table Content (Markdown)", "", table.markdown]) parts.append("") if entities and entities.entities: - parts.extend(["## Detected Entities", "", "| Entity | Type | Context |", "|--------|------|---------|"]) + parts.extend( + [ + "## Detected Entities", + "", + "| Entity | Type | Context |", + "|--------|------|---------|", + ] + ) for entity in entities.entities[:50]: context = entity.context[:80].replace("|", "\\|") if len(entity.context) > 80: @@ -172,7 +214,9 @@ class MarkdownWriter: parts.append(f"| {entity.text} | {entity.label} | {context} |") parts.append("") if citations: - parts.extend(["## Citations Found", "", "| Type | Identifier |", "|------|------------|"]) + parts.extend( + ["## Citations Found", "", "| Type | Identifier |", "|------|------------|"] + ) for citation in citations: parts.append(f"| {citation.type.upper()} | `{citation.identifier}` |") parts.append("") diff --git a/src/ocr_pipeline/pipeline.py b/src/ocr_pipeline/pipeline.py index 6df04b2..a70f49f 100644 --- a/src/ocr_pipeline/pipeline.py +++ b/src/ocr_pipeline/pipeline.py @@ -46,8 +46,10 @@ class OCRPipeline: return [] original_image = self.preprocessor.load_image(image_path) - ocr_image = self.preprocessor.preprocess_image(original_image) - ocr_result = self.engine.process(ocr_image) + # PaddleOCR reads the (size-capped) original; Tesseract the binarized derivative. + ocr_base = self.preprocessor.resize_if_needed(original_image) + preprocessed = self.preprocessor.preprocess_image(original_image) + ocr_result = self.engine.process(ocr_base, preprocessed) cleaned = clean_text(ocr_result.text) chunks = chunk_text(cleaned.text) entities = extract_entities(cleaned.text) @@ -60,16 +62,42 @@ class OCRPipeline: output_files: list[Path] = [] for chunk in chunks: metadata = { - "source_path": str(image_path), "source_hash": image_hash, "timestamp": timestamp, - "ocr_engine": ocr_result.engine, "ocr_confidence_mean": ocr_result.confidence, - "language": ocr_result.language, "entity_extraction_backend": entities.backend, "detected_entities": [entity.text for entity in entities.entities], - "has_figures": bool(figures), "has_tables": bool(tables), - "citations_found": [f"{citation.type}:{citation.identifier}" for citation in citations], - "chunk_index": chunk.chunk_index, "total_chunks": len(chunks), + "source_path": str(image_path), + "source_hash": image_hash, + "timestamp": timestamp, + "ocr_engine": ocr_result.engine, + "ocr_confidence_mean": ocr_result.confidence, + "language": ocr_result.language, + "entity_extraction_backend": entities.backend, + "detected_entities": [entity.text for entity in entities.entities], + "has_figures": bool(figures), + "has_tables": bool(tables), + "citations_found": [ + f"{citation.type}:{citation.identifier}" for citation in citations + ], + "chunk_index": chunk.chunk_index, + "total_chunks": len(chunks), } - output_files.append(self.writer.write_chunk(content=chunk.content, metadata=metadata, figures=figures, tables=tables, entities=entities, citations=citations)) + output_files.append( + self.writer.write_chunk( + content=chunk.content, + metadata=metadata, + figures=figures, + tables=tables, + entities=entities, + citations=citations, + ) + ) - self.db.mark_processed(file_hash=image_hash, path=str(image_path), timestamp=time.time(), engine=ocr_result.engine, confidence=ocr_result.confidence, chunks=len(chunks), run_id=self._run_id) + self.db.mark_processed( + file_hash=image_hash, + path=str(image_path), + timestamp=time.time(), + engine=ocr_result.engine, + confidence=ocr_result.confidence, + chunks=len(chunks), + run_id=self._run_id, + ) return output_files def process_single(self, image_path: Path) -> list[Path]: @@ -108,7 +136,15 @@ class OCRPipeline: if consolidated is not None: result.output_files.append(consolidated) finally: - self.db.complete_run(self._run_id, {"total": result.total_images, "successful": result.successful, "failed": result.failed, "chunks": result.chunks_created}) + self.db.complete_run( + self._run_id, + { + "total": result.total_images, + "successful": result.successful, + "failed": result.failed, + "chunks": result.chunks_created, + }, + ) self._run_id = None return result diff --git a/src/ocr_pipeline/postprocess/__pycache__/__init__.cpython-313.pyc b/src/ocr_pipeline/postprocess/__pycache__/__init__.cpython-313.pyc index 25014c2abd158ab819f0245e6623f1baa8d2d53d..085bb33b024bb3a83da478252282fe1a36e7f3e3 100644 GIT binary patch delta 104 zcmbQia)gEVGcPX}0}#xc7?ZVQBJUk(so>ogSZ` wT%^A_j_DDHq(n|)UV3syVrE`^Noqw&d~rceW=RQ9*W?K935?E@Uvk?40I@9~qv0Q@pGcPX}0}x1DjL!1f$Q!`KsJgkD=@Ey7curzodU8f$W}aS2YDGzWaY0UI SNl9wa}6 diff --git a/src/ocr_pipeline/postprocess/__pycache__/clean.cpython-313.pyc b/src/ocr_pipeline/postprocess/__pycache__/clean.cpython-313.pyc index 914380b302b5ac687d805a3f06fb61b30f20ac31..8c11a7a78a3e4f22de596c4419df418c780abb37 100644 GIT binary patch literal 4635 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 C-g_nh delta 3149 zcmZ`*Yj9J?72drsy{=@*l5P1RTQ-udYhxSRP)wju6NlJ54Dq!RHEenB=os~R* zF@y6ckeOr}vSsoPG@WTDnf^%YPCK3Hq=o*VO()ZOOk$4)I_c0K(V>(4XwSJq zPH55{>APpoo;`PU_SGkV?}p-oF!lbZ8AdH%8MPZT ztuSUQjWLIptcP?eIPI&>GTo&+YRDmpIrVbA%&=U#TXz~(c~a0kyqx}$I{1h57c|7* z7P`S+6o&Yjx^mtnc6gFDP0g#1WOAw8@!>>vCY`(K0bqBA_o@4RD5h>Zn}U$$gM&|;9HvO98DymK&a7%&HSmg?lxmnOTOZ>v|(YAUX9ji znDD>aJ%O~T6s!vnQ0kC~vt$mtdEDVq|MyMQ%AdA*nl}l4k|d2Jg2gnNiNv2EBtyTH zp$bCXjdBDFXtXdbE$VC2x-H5k(NDr;xR(FPQPTr7d|+`6K+6p6qsjZvNjgcsDK?Nv zs+opT^Uu|j5&jeNw|1<9muU{B!6Pqcr{m+t^HO>$KEY)0Ff2905EjA!>yh}eSUQnO z<__kS^i(pLV0kH(nVjPNmR5(r+AxSFvbd%E8OsLWdtksW*~*q}b?{kH%L{_V68xLj zcftBPH(6VGueDyhR_5i?)~RVKOpBGG`CHR>^sqgn~+^&+#s`cS^ z@p5IK{o#=KyO0c>2bd(m+YBas2*!C*&mH!L8aOVim4w~9e+CIuj{l&-!>z3z9 zuDM>&MSk8EtXd6efNfi?n#31vZhp(=>tj8TJ})0g$1{hEbuq^$CSud6=>+=*46%&} zy$G!UStPrk)nWf3fV{>}%5~c&I=?sg{NS=$zo^!~dh)8;&VQx0w%Ga{4j3>R&=6jnu|#l(jW*naG^{a2N*YDNmJ$thGZ2}-ZLi{PmycR_muoM7 z!{t-DVWw8gKX6qmTfk%?e%7{6Il?TKHPsM2g-u*_^<8+GO zu4;D;t^h8ywt=%SClzZiFxZ=pQn>cp7YA<&`4|mP|~r2zI1&Je$j+ zZupH>-0COzTi#B3c;O@OA1EE?uhcY}OS$-OYpVP>m8Af_GIJD@u0xV=cdds$!$Y+P z%z|-5p}4QquHSbI=lTKOm5Pf(o2_~^+t=##S`0F_2x-V-2p~g*jiQim4x)+Rhi|qC z;54}{2y)YHvnmH~*D12^uCqgq(YxQF6>{ah4zpazY9WjTd8V%V)OIk>lPFO z6LmOIoq{fPQeD;+uuNc?J0vDWWnI-Rct4eh#uVMkOmGp|^A*F1Wa3!qHX5HwW8q9lJ+* z=K6>BjP&%)4fYR2y1K{aMjjdIp6k;`cXuuP-PbSdo!$3E+DN>8c5EBuh4(~5k^S0O zTU67wVK3VnX^Xax;S(3|e@FyEBER|FzBdsGDIV`!!0O(dm3CsNb<_fCd&CIv9*h~V>9eo`8 zr&_?=17cZqcgK75HU2?Ib%()d;~mKIymV+Pl>zB|89Q=1l}Tia@5MT> z-CXY6BEJLX65rAJkKODjdXEEWk};)NRYTK^%fp?w#$uB*xfzy-#TZbHuca z+@L+=N1Cx7ezvZqO|fBLA>{*7@*!;1mNxvby4MR$V|)sRq3R4 HhCcomY?h7Q diff --git a/src/ocr_pipeline/postprocess/clean.py b/src/ocr_pipeline/postprocess/clean.py index 31153f3..ecad34a 100644 --- a/src/ocr_pipeline/postprocess/clean.py +++ b/src/ocr_pipeline/postprocess/clean.py @@ -74,4 +74,6 @@ def clean_text(text: str) -> CleanResult: text = re.sub(r"\n{3,}", "\n\n", text).strip() operations.append("normalize_whitespace") logger.debug("text_cleaned", original=original_length, cleaned=len(text), ops=operations) - return CleanResult(text=text, original_length=original_length, cleaned_length=len(text), operations=operations) + return CleanResult( + text=text, original_length=original_length, cleaned_length=len(text), operations=operations + ) diff --git a/src/ocr_pipeline/postprocess/entities.py b/src/ocr_pipeline/postprocess/entities.py index 32f175e..5ee87ff 100644 --- a/src/ocr_pipeline/postprocess/entities.py +++ b/src/ocr_pipeline/postprocess/entities.py @@ -3,8 +3,6 @@ from __future__ import annotations import re from dataclasses import dataclass -import spacy - from ocr_pipeline.config import settings from ocr_pipeline.utils.logging import get_logger @@ -40,7 +38,17 @@ class ScientificEntityRecognizer: if self._initialized: return try: - + import spacy + except ImportError: + spacy = None # type: ignore[assignment] + if spacy is None: + logger.info( + "spacy_not_installed", + hint="Install with: uv sync --extra scientific (regex entities still run)", + ) + self._initialized = True + return + try: self._nlp = spacy.load(settings.entities.model) self._nlp.max_length = 2_000_000 self._initialized = True @@ -48,10 +56,10 @@ class ScientificEntityRecognizer: logger.info("scispacy_model_loaded", model=settings.entities.model) except Exception as e: logger.warning("scispacy_load_failed", error=str(e), model=settings.entities.model) - self._fallback_init() + self._fallback_init(spacy) self._initialized = True - def _fallback_init(self): + def _fallback_init(self, spacy): try: self._nlp = spacy.blank("en") self._nlp.add_pipe("sentencizer") @@ -90,7 +98,9 @@ class ScientificEntityRecognizer: ) entities = ( - self._merge_entities(entities, text) if settings.entities.merge_entities else entities + self._merge_entities(entities, text) + if settings.entities.merge_entities + else entities ) entities = self._deduplicate_entities(entities) @@ -153,7 +163,6 @@ class RegexEntityRecognizer: ], "CHEMICAL": [ r"\b(?:DMSO|PBS|EDTA|Tris|HEPES|SDS|DTT|BME|NaCl|KCl|MgCl2|CaCl2|NaOH|HCl|H2SO4|HNO3|EtOH|MeOH|IPA|DMSO|DMF|DMA|THF|DCM|CHCl3|CH2Cl2|EtOAc|hexane|pentane|acetone|acetonitrile|water|H2O|buffer|media|serum|FBS|BSA|pen/strep|penicillin|streptomycin|trypsin|EDTA|collagenase|dispase|accutase)\b", - ], "CONCENTRATION": [ r"\b\d+(?:\.\d+)?\s*(?:[µumMpnc]?[Mm]|[µumMpnc]?[Mm]/[Ll]|[µumMpnc]?[Mm]\s*[Ll]?|[µumMpnc]?[gG]\s*/\s*[Ll]|[µumMpnc]?[gG]\s*/\s*[mM][lL]|[µumMpnc]?[gG]\s*/\s*[dL]|[µumMpnc]?[gG]\s*/\s*[mM][lL]|[µumMpnc]?[gG]\s*/\s*[dD][lL]|[µumMpnc]?[gG]\s*/\s*100\s*[mM][lL]|[µumMpnc]?[gG]\s*/\s*[kK][gG])\b", diff --git a/src/ocr_pipeline/setup_steps.py b/src/ocr_pipeline/setup_steps.py new file mode 100644 index 0000000..0599b93 --- /dev/null +++ b/src/ocr_pipeline/setup_steps.py @@ -0,0 +1,131 @@ +from __future__ import annotations + +import platform +import shlex +import shutil +import subprocess +import sys +from dataclasses import dataclass + +import typer +from rich.console import Console + +SCISPACY_MODEL_URL = ( + "https://s3-us-west-2.amazonaws.com/ai2-s2-scispacy/releases/v0.5.4/en_core_sci_lg-0.5.4.tar.gz" +) + + +@dataclass(frozen=True) +class SetupStep: + """One installation step. argv=None means the user must do it manually.""" + + label: str + argv: tuple[str, ...] | None = None + note: str | None = None + + +def _tesseract_steps() -> list[SetupStep]: + if shutil.which("tesseract"): + return [] + system = platform.system().lower() + if system == "darwin": + if shutil.which("brew"): + return [SetupStep("Install Tesseract via Homebrew", ("brew", "install", "tesseract"))] + return [ + SetupStep( + "Install Tesseract", + None, + "Install Homebrew first, then run: brew install tesseract", + ) + ] + if system == "windows": + if shutil.which("choco"): + return [ + SetupStep("Install Tesseract via Chocolatey", ("choco", "install", "tesseract")) + ] + return [ + SetupStep( + "Install Tesseract", + None, + "Download the installer from https://github.com/UB-Mannheim/tesseract/wiki", + ) + ] + if shutil.which("apt-get"): + return [ + SetupStep( + "Install Tesseract via apt", ("sudo", "apt-get", "install", "-y", "tesseract-ocr") + ) + ] + return [ + SetupStep( + "Install Tesseract", None, "Install the tesseract-ocr package for your distribution." + ) + ] + + +def steps_for(target: str) -> list[SetupStep]: + if target == "basic": + steps = _tesseract_steps() + steps.append( + SetupStep("Verify the install", None, "Run: ocr-pipeline init && ocr-pipeline demo") + ) + return steps + if target == "full": + steps: list[SetupStep] = [] + if shutil.which("uv"): + steps.append( + SetupStep("Install optional ML dependencies", ("uv", "sync", "--extra", "full")) + ) + steps.append( + SetupStep( + "Download the scispaCy model (en_core_sci_lg)", + ("uv", "pip", "install", SCISPACY_MODEL_URL), + "Requires a scispaCy-compatible spaCy; see the README if this step fails.", + ) + ) + else: + steps.append( + SetupStep( + "Install optional ML dependencies", + (sys.executable, "-m", "pip", "install", "-e", ".[full]"), + ) + ) + steps.append( + SetupStep( + "Download the scispaCy model (en_core_sci_lg)", + (sys.executable, "-m", "pip", "install", SCISPACY_MODEL_URL), + "Requires a scispaCy-compatible spaCy; see the README if this step fails.", + ) + ) + steps.append( + SetupStep( + "Detectron2 for figure detection", + None, + "No universal wheel exists; install a build matching your torch/Python, see README.", + ) + ) + return steps + raise ValueError(f"Unknown setup target: {target}. Choose basic or full.") + + +def run_steps(steps: list[SetupStep], *, assume_yes: bool, dry_run: bool, console: Console) -> int: + """Print and optionally execute each step. Returns the first failing exit code.""" + for index, step in enumerate(steps, 1): + console.print(f"[cyan][{index}/{len(steps)}] {step.label}[/cyan]") + if step.argv is None: + if step.note: + console.print(f" {step.note}") + continue + console.print(f" $ {shlex.join(step.argv)}") + if dry_run: + continue + if step.note: + console.print(f" {step.note}") + if not assume_yes and not typer.confirm("Run this step?", default=True): + console.print(" [dim]skipped[/dim]") + continue + returncode = subprocess.run(list(step.argv)).returncode + if returncode != 0: + console.print(f"[red]Step failed with exit code {returncode}.[/red]") + return returncode + return 0 diff --git a/src/ocr_pipeline/utils/__init__.py b/src/ocr_pipeline/utils/__init__.py index 5bb6f96..5517b70 100644 --- a/src/ocr_pipeline/utils/__init__.py +++ b/src/ocr_pipeline/utils/__init__.py @@ -3,13 +3,11 @@ from __future__ import annotations from .db import Database, ProcessedFile, get_db from .logging import ProgressTracker, create_progress, get_logger, setup_logging - __all__ = [ "setup_logging", "get_logger", "create_progress", "ProgressTracker", - "get_db", "Database", "ProcessedFile", diff --git a/src/ocr_pipeline/utils/__pycache__/__init__.cpython-313.pyc b/src/ocr_pipeline/utils/__pycache__/__init__.cpython-313.pyc index f96efaa961391eabb3a374ce722c2de70356c477..2873bf6e57cc7384b53b0e7098072d36ac025eb7 100644 GIT binary patch delta 182 zcmX@ia+jI+GcPX}0}zO)#Aew{t2eh7PZ5t7ZxOE-UlE@IgFZtr zTOeZ*e>%G+$Han~dgfb#$@#ejr6sBHX_+~x@fnH58Mg#-Gt-L_fkJutC8v28uCX{!10xU@D*}lR%#4hTcNvtPGw5Gr d(7(?RaG4?CK11+DhTu;u+}uo!>_wtLRRCJPMb!WR diff --git a/src/ocr_pipeline/utils/__pycache__/db.cpython-313.pyc b/src/ocr_pipeline/utils/__pycache__/db.cpython-313.pyc index a7dab161bf2b7168b2bb0a03d2df1716a951468a..84af2dc73654a583d5dd35dd5104a26aa115cde3 100644 GIT binary patch literal 9237 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 literal 8325 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 diff --git a/src/ocr_pipeline/utils/__pycache__/logging.cpython-313.pyc b/src/ocr_pipeline/utils/__pycache__/logging.cpython-313.pyc index 722ff0a6494ffe505099ebc611207da7537fc672..0f617958aa7800f66e798113ecedb58f87b5ce0a 100644 GIT binary patch delta 55 zcmexl-fzM6nU|M~0SN4FY~=Ffk+aheElw>e)=$h$%+q(tPcF?(%_}L^&rXlePcG8m J9Kth?9{}H+5)}Xd delta 26 gcmeCT_+-xYnU|M~0SF{6ZshXhVN~2)$TN>00A!{I3IG5A diff --git a/src/ocr_pipeline/utils/__pycache__/migrate.cpython-313.pyc b/src/ocr_pipeline/utils/__pycache__/migrate.cpython-313.pyc index 9c6f94a6f25d849c2d40fc1d81995383e0b637a4..e2c429eb6bd7ac3a49fb814b74f6578e60629382 100644 GIT binary patch delta 2347 zcmZ`)U2Gf25#Htf@Q%MnQGd}dMKhvEOJQV7spz^=6f2e`rL9YvXb?JKFXD-!Odf?j zvWgrR650Tjouaa`P2!gXPSL{YQ;NDMiaZpt<3>fFL=b_6a~!m=i=b~UtO6-epq)L6 zN@^en+_$qcv$M0aGqd*wUmx*2aJwA{zR%t{yVRy^dD_>00<+gq5+(5*n#BYM7;T%g z5t}t~gtJDT@Gx?7!mLO{ONXDc&q_qv*O!S5a$(Lf>m<$qI_nIgv#wFh_Ckobla8d= zftGmUNjj5ui}EI2NvXrnm`c)}lr5$&XN!2Y-ah(BePJCr7~sbbUIBabb7$0+5a^Dr zqeDk2@cY=a2&wG|rNzdgghX#B%>$$R^Q3LaiBO0sb6=(0^|128)|CHO&@p}6)k7cW zr2*B3Pzr}o+I6tMr$K!&CVaH&@vrfXnCP~YZD3!lf_rIuLpNn>=zz;$HzJ%LoYu;L z<$_vXD3Rijy1YzE%OtOswZQ58e7Qn2BaqD#ZN6M0tB;vtRwXNW-IN+a(+<;YX~i(t zlxL@=GpA=xoJl2~PG+WN5)s*y8kSAbST)L8(G&`$6^#%cTr&B^Qc*KS?WMd?HcVT| zFzuTD{X8k@CYRI75stW-nzX#{iOIc`%^B>@0)c=z9!nV-F=A>_)nij7?|h}G>188! zE|)3IlNfc0!8Kn7>|`42GjI~p2Fn%rjn@Fy(S3KzX690+=I*)e4prTun!A7fapJbKtLp69^>=Q3`@TonT)MclsbAE0x??rZ;~U(kPR}R)wksTs@3^{ly=@!b z2jCXk+G)kvtcsa-xN0?)5Wp z$GAW*aYbhzGsV79M0q}r({!AFbXZ5oi2`UEe=~4EEgeu>bt-+>S_qIHqCex~;hW#! zdeH*zL+M~cVn^yQI3uM)4NfA=oSO5bBMnXpH8So?JgLD;dgELG^+I3JrAg^qXY1nv zUO@HTA_`3izZXa=n4?2t91qi+_=kSx0Xf9rQGoq~ShutY+nGcG#^{_q+Qg0lc{Iql zLku3HKelI&9#{ZbKVydhOnzA<<*zVzoc2hEd1j8zOJUqbUzPMG!V<|8p=vZeYh@Od zZT2d@9QQDJqwl;J-R55m5@?3Vf{19^7gb}ikbe_y`UH7`{@L9-VI5p#GL4wR{9;8vS2xdU z9u5x&2g3Btmx{}kvX)uM7qkphCocehh7Ne%#K-6dp5Ni$Twn2a;AY*PvLEy_FLXpM z>7m_9o9&l~wkuuuxAZ+_221qc$^;DyUOMed!R#$xrx%h6()>8uPcXXedvDEhkGJ+) zfc^f?4sCji`5aNpc|DiO7uB2w5n*~nV?t$LSkf~KDma@ZN0|%?5s^iJ2sWF(P+`X^ zXk{(pB2Tl`d|rpvI?a^XRohLjpy}iV`k$t7-xTAr?oUntL}W4x1M7FoS|P7%WR6bx zqbE#PsZxeeS&=fxY0xobfO;YU)&silrk2r5W$ndM=^S|(l-Qoe1^RQpikm3ktj9YK z-R?Y6?L6}9v0CTxjb}dfcJ3-|SDZB^^e(O{k&l(oUtliRl;Bmhs)RpQg8%GBErGo# zeWQ70jn&DG?#a%nuUt-6vawk6HwnL~N!=GvR@PE`XWyjso=k^l7!c_&f-$c(W9-gjT>J;+K|Gm}pFBD4h3X;Z;Z*Wil9;)K{O6 zG?|V}W}(8KtW1WmM}mBpfscWUUTf*aU!&VCu^+Hov1--24=d@cNd2mw*!5sa$BU(G zrJ#+IAAvf{5d+c){e#08-$lWD$a4qDcaZlkYQKwG?;-Es(C}Yn|K(FPxqDsQ6MeXS VZy<<+d$U-;J^xZd*l(51{{V`7Bqaa< delta 1537 zcmZ{kOKcle6hPnec*ehpKe1ywF-gXDK6R7GZDRvz8xr$N8mnrFRSIf+^!hOXYRY7 zH}~FmpD(BG^t*SOnw$il@MivOd(%aCc!k00GRct~&5{YqsDiR3Yhf063t3^p%B-f& zniVG`Chgg6%m#KbYoBm1heD0A6q>oatb`^7hD$J%@1X-X^nfmCUVnBIV# zJ571THbkd*LFztOCB#J(GDeR_A4=yQN|$z}e4-JZ@8f^lhF~2Vp-Z@Xcx3M}!8ujOU`D!4{Kd?urkAG$V(qcsUj1c4J9Z%8-|HAQ2 zj~9ZN58(&sP%%-I3oL}1FrpO@<5!&fTiQTM2n-8mk0IIt+~X_`KHLP%0kpIL3~Q~( z>i@H24==g;+Hl9^K=PEXGCi586t(2Z(rkT+sXD*v>ZL*colEl?lKNUnuj__XtkqO) zj*rT(>>I$Z#PKUsWkFmh0Nn*p8qeq`3-Q}>r!xauH=4g*yC)A(IrUR&Vk?=wJ-3;h z+Ypc{Boe7X%@>+vvhq!)N=KgvHyQDk2ia3k&N{vA*dHU>yYhHbH^FP2L)hNLeRA%b=Df4!Y?vvdh|LzV@Kj0*tXMB; z3x!gpxS&D{(2u={M(>`nsukvorLsE5aK70~h?fBgYBWD`nXOi8Wwov*WR}KgYe}20 zvM10PPuFG$WmRJ*_;j#0nnGXmz~hjd?ML zzLA$&(5iKHrdmD6;MS5O=)Az2Lq+Q0^^n#j2Y!{~n{xcx_|NjdZ?b58||6Mvp&ns!$*MYKIijRaXpf0e{Mv)H6p?yVKsAPczA}y zRJa1#va<|RpFdfwFHVEqY#iEI8G)52q(@O~9<_LgrhVBx2Nx-?*IA@r$!O=N6CT4^ zD9kV6<>_v diff --git a/src/ocr_pipeline/utils/db.py b/src/ocr_pipeline/utils/db.py index a087197..095134e 100644 --- a/src/ocr_pipeline/utils/db.py +++ b/src/ocr_pipeline/utils/db.py @@ -16,6 +16,7 @@ logger = get_logger(__name__) @dataclass(frozen=True) class ProcessedFile: """Legacy value object retained for import compatibility.""" + path: str hash: str timestamp: float @@ -75,38 +76,78 @@ class Database: def is_processed(self, file_hash: str, path: Path | str | None = None) -> bool: with self._conn() as conn: if path is None: - row = conn.execute("SELECT 1 FROM processed_files WHERE hash = ?", (file_hash,)).fetchone() + row = conn.execute( + "SELECT 1 FROM processed_files WHERE hash = ?", (file_hash,) + ).fetchone() else: - row = conn.execute("SELECT 1 FROM processed_files WHERE hash = ? AND path = ?", (file_hash, str(path))).fetchone() + row = conn.execute( + "SELECT 1 FROM processed_files WHERE hash = ? AND path = ?", + (file_hash, str(path)), + ).fetchone() return row is not None def get_processed(self, file_hash: str) -> dict[str, Any] | None: with self._conn() as conn: - row = conn.execute("SELECT * FROM processed_files WHERE hash = ?", (file_hash,)).fetchone() + row = conn.execute( + "SELECT * FROM processed_files WHERE hash = ?", (file_hash,) + ).fetchone() return dict(row) if row else None - def mark_processed(self, *, file_hash: str, path: str, timestamp: float | str, engine: str = "", confidence: float = 0.0, chunks: int = 0, run_id: int | None = None) -> None: + def mark_processed( + self, + *, + file_hash: str, + path: str, + timestamp: float | str, + engine: str = "", + confidence: float = 0.0, + chunks: int = 0, + run_id: int | None = None, + ) -> None: with self._conn() as conn: - conn.execute("""INSERT OR REPLACE INTO processed_files + conn.execute( + """INSERT OR REPLACE INTO processed_files (hash, path, timestamp, ocr_engine, confidence, chunks_created, run_id) - VALUES (?, ?, ?, ?, ?, ?, ?)""", (file_hash, path, str(timestamp), engine, confidence, chunks, run_id)) + VALUES (?, ?, ?, ?, ?, ?, ?)""", + (file_hash, path, str(timestamp), engine, confidence, chunks, run_id), + ) def start_run(self, date: str | None = None) -> tuple[int, int]: date = date or time.strftime("%Y-%m-%d") with self._conn() as conn: - run_number = conn.execute("SELECT COALESCE(MAX(run_number), 0) + 1 FROM runs WHERE date = ?", (date,)).fetchone()[0] - cursor = conn.execute("INSERT INTO runs (date, run_number) VALUES (?, ?)", (date, run_number)) + run_number = conn.execute( + "SELECT COALESCE(MAX(run_number), 0) + 1 FROM runs WHERE date = ?", (date,) + ).fetchone()[0] + cursor = conn.execute( + "INSERT INTO runs (date, run_number) VALUES (?, ?)", (date, run_number) + ) return int(cursor.lastrowid), int(run_number) def complete_run(self, run_id: int, stats: dict[str, int]) -> None: with self._conn() as conn: - conn.execute("""UPDATE runs SET total_images = ?, successful = ?, failed = ?, chunks_created = ?, completed_at = ? WHERE id = ?""", (stats.get("total", 0), stats.get("successful", 0), stats.get("failed", 0), stats.get("chunks", 0), time.time(), run_id)) + conn.execute( + """UPDATE runs SET total_images = ?, successful = ?, failed = ?, chunks_created = ?, completed_at = ? WHERE id = ?""", + ( + stats.get("total", 0), + stats.get("successful", 0), + stats.get("failed", 0), + stats.get("chunks", 0), + time.time(), + run_id, + ), + ) def get_stats(self, days: int = 30) -> dict[str, Any]: cutoff = time.time() - days * 86400 with self._conn() as conn: - files = conn.execute("SELECT COUNT(*) AS total_processed, COALESCE(SUM(chunks_created), 0) AS total_chunks, AVG(confidence) AS avg_confidence FROM processed_files WHERE created_at >= ?", (cutoff,)).fetchone() - runs = conn.execute("SELECT COUNT(*) AS total_runs, MAX(completed_at) AS latest_run FROM runs WHERE started_at >= ?", (cutoff,)).fetchone() + files = conn.execute( + "SELECT COUNT(*) AS total_processed, COALESCE(SUM(chunks_created), 0) AS total_chunks, AVG(confidence) AS avg_confidence FROM processed_files WHERE created_at >= ?", + (cutoff,), + ).fetchone() + runs = conn.execute( + "SELECT COUNT(*) AS total_runs, MAX(completed_at) AS latest_run FROM runs WHERE started_at >= ?", + (cutoff,), + ).fetchone() return {**dict(files), **dict(runs)} @@ -117,5 +158,6 @@ def get_db() -> Database: global _db_instance if _db_instance is None: from ocr_pipeline.config import settings + _db_instance = Database(settings.watch_db_path) return _db_instance diff --git a/src/ocr_pipeline/watch/__pycache__/__init__.cpython-313.pyc b/src/ocr_pipeline/watch/__pycache__/__init__.cpython-313.pyc index 3a38d379404a0f3691bd19dd3ce2a903124a3244..d2338f641840a70d1eaf9d024035cc350f51cb8e 100644 GIT binary patch delta 52 zcmeyvIFpI%GcPX}0}$BVn8>w2&R##XIJKx)KQT8kPv0d!ximL5ucTN%J3T%>xk!KF G>OcUih!M5` delta 23 dcmbQq^oNn_GcPX}0}x1DoXE9+QEB3dKmbe82CD!7 diff --git a/src/ocr_pipeline/watch/__pycache__/watcher.cpython-313.pyc b/src/ocr_pipeline/watch/__pycache__/watcher.cpython-313.pyc index 1a233d527731e0028040aa9fe0f5edccb93dae4e..6bef1e2b5aefb2964b8b0a952e2752540928ce44 100644 GIT binary patch delta 809 zcmX|8-%ry}6u!4zXSa4+_p@7|qp(33;`&6KFi40q1Y=CxvItplj4>cgHqs8G@j(p6 zFk>?GhRB|XZ~9=w)IY!k5+8LKL$fH7_zx&7(I@qm2`A~f-}&y>_I&584gZK*k1Q55 zz~Kr`%)hd~v3?-@LsC-7$%>R&$P}blF}t*oE0h!|KbtOQWl7y9oUB@A z)q*^>^Nu9~VB#jeXhs2|aa+|wqHT99x3gNO^bxlBe>YUzYycIpSJJCGnLEqiZuCV}SL6S(437DY5 zhCb{?4-uqXO$0!^9euU)y4)}pNSr|%p1bb%03<+x8m4C83>YNazzhu0sGFBih95P` z_|=ddZSj|xB8Ia54>|GF>+#B2{mOXkR=%avOL~&gptm3XLASkk;w)DgC=b+_4h^G` z^2i=5)>u*FT+f&%%z@BV6C|zUtmY4D{D2%iJ?cyE)FyaR<5gtuquntl{oCsz?h`fp>Tim_!7#87WPvPTu6wT3aI!iQ% z62w^1+d`h!K=__sb>g%PzR=dDztCH9E2f%OnHt@HK(l+aP@{#7>CbdP-EECQ=L(kB z+3T57b}lD}l~Qr>0Sfu6@FCjvhv5o3^hcN$Dh(U`Bo+K+R{Por2rDQej@m{c3?BkL I%L4w&KcsiNg8%>k delta 1289 zcmZ`&O>7%Q6rR~1d)K?py56-NJN`>jw=7CbdWcF%Qj`)R<)|BJ zkw__OE=X|zIqeAA-YRi{6Ceu-2@X9(LP8+o24Twzh)P_zRc)jqabd>J%DFIy_rCY$ zoA+kkd-Hg5XS(mH)oKBFz1N6e-LQY%_X`CF>;F=+2t7!W;$jTsX|hiix*^?j!MM9? z0T6@Zu!|!DXi4&zid2k>_y|N9Tb!oGA^J@Up}%c2kgA7II4BdXlhbHX9$-jVl$Qrj z$~ed-XbDnnvNqWg?SDEwce1y#P3P%`^Yp$`-C{lx>fgwH5N_9ZmA7Cp;xlg0({awg z5kG>Iax=;rmy3Z&(Aezh<)IiIg;7(O89#bp5X2Q@KQe5fo{pOTC(>|~JI4e;77T*8 z{fLi#bY6A*1V9uN*=aTdGhm7ifDBZ5H0OH3a-9oZ9t{;nLuvG`YtD2HpHl7U2iN>7 zMGW;(A|hC{#nf7%l-DX+LSHYoxpGC%RB{DPj}k@-3)R#qslHAe6(X*o`Tm#SGxS0K z#sY7xnXBd|=WTG_1JPEyxP9^N^ZR0`h4Dglq2&xbnB9BxQbSxmG&8*A&;od=CRBwz zCG>gv%hfMdA6(uN9&&I0b10)F_xaaxBX^ z&w^uJmW+fw9c8<0hOp6Bj(%kG2p33}9>+it*+4xV!`Te0H`{Rq{ULeLJ0>f1-nJ{# z-BzpS*K~4c6}Ii9MeDdjxk56lC03HmyL)}D7cXm4IJCQf>UYV3D7(_|W@a%PB?_jYBe&^0V zQcm5k>?t7n@+pdkeA^G#u_A&eb}_S#}~anF6`d-~g%@A$37hIj#g=)cg8 zN11JLVw3YVIN#m$uiP-Ux|8W|aDF_72Pc%BH<0@P|NY$U99nJ3t~(RACLZ&E4?F=Z zZ_&x8PeHUvEA^i}DwMae-4-t;E2$Mt50@)zr4JGBy$3%=pLxS@8$I;CC^*>!JRFl) a%d?@n!$(2*DeCvnNlOrhp8z5|QU3!Vpc`}m diff --git a/src/ocr_pipeline/watch/watcher.py b/src/ocr_pipeline/watch/watcher.py index c30906c..0b8ccc3 100644 --- a/src/ocr_pipeline/watch/watcher.py +++ b/src/ocr_pipeline/watch/watcher.py @@ -113,7 +113,15 @@ class Watcher: failed += 1 if self.run_id is not None: - self.db.complete_run(self.run_id, {"total": processed + failed, "successful": processed, "failed": failed, "chunks": 0}) + self.db.complete_run( + self.run_id, + { + "total": processed + failed, + "successful": processed, + "failed": failed, + "chunks": 0, + }, + ) logger.info("watcher_stopped", run_id=self.run_id, processed=processed, failed=failed) def _process_file(self, path: Path) -> None: diff --git a/tests/conftest.py b/tests/conftest.py index bc27138..8d9f898 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,4 +1,4 @@ import sys from pathlib import Path -sys.path.insert(0, str(Path(__file__).parent.parent / "src")) \ No newline at end of file +sys.path.insert(0, str(Path(__file__).parent.parent / "src")) diff --git a/tests/test_postprocess.py b/tests/test_postprocess.py index f4ac310..f5955a9 100644 --- a/tests/test_postprocess.py +++ b/tests/test_postprocess.py @@ -1,9 +1,8 @@ import pytest -from pathlib import Path -from ocr_pipeline.postprocess.clean import clean_text, CleanResult -from ocr_pipeline.postprocess.chunk import chunk_text, TextChunk from ocr_pipeline.config import settings +from ocr_pipeline.postprocess.chunk import TextChunk, chunk_text +from ocr_pipeline.postprocess.clean import clean_text class TestTextCleaning: @@ -70,4 +69,4 @@ class TestConfig: if __name__ == "__main__": - pytest.main([__file__, "-v"]) \ No newline at end of file + pytest.main([__file__, "-v"]) diff --git a/tests/test_startup.py b/tests/test_startup.py new file mode 100644 index 0000000..0f9ecc1 --- /dev/null +++ b/tests/test_startup.py @@ -0,0 +1,116 @@ +from __future__ import annotations + +import subprocess +import sys +from pathlib import Path + +from typer.testing import CliRunner + +from ocr_pipeline import config as config_module +from ocr_pipeline.cli import app + +runner = CliRunner() + +SRC_DIR = Path(__file__).parent.parent / "src" + + +def _isolate_config(tmp_path: Path, monkeypatch) -> None: + """Pretend no config exists anywhere.""" + monkeypatch.delenv(config_module.CONFIG_ENV_VAR, raising=False) + monkeypatch.chdir(tmp_path) + monkeypatch.setattr(config_module, "user_config_dir", lambda: tmp_path / "no-such-dir") + + +def test_find_config_file_prefers_env_var(tmp_path: Path, monkeypatch) -> None: + env_cfg = tmp_path / "env.yaml" + env_cfg.write_text("ocr:\n engine: tesseract\n", encoding="utf-8") + cwd_dir = tmp_path / "cwd" + cwd_dir.mkdir() + (cwd_dir / "config.yaml").write_text("{}", encoding="utf-8") + monkeypatch.setenv(config_module.CONFIG_ENV_VAR, str(env_cfg)) + monkeypatch.chdir(cwd_dir) + assert config_module.find_config_file() == env_cfg + + +def test_find_config_file_uses_cwd(tmp_path: Path, monkeypatch) -> None: + monkeypatch.delenv(config_module.CONFIG_ENV_VAR, raising=False) + (tmp_path / "config.yaml").write_text("{}", encoding="utf-8") + monkeypatch.chdir(tmp_path) + assert config_module.find_config_file() == tmp_path / "config.yaml" + + +def test_find_config_file_none_when_unconfigured(tmp_path: Path, monkeypatch) -> None: + _isolate_config(tmp_path, monkeypatch) + assert config_module.find_config_file() is None + + +def test_import_does_not_read_cwd_config(tmp_path: Path) -> None: + (tmp_path / "config.yaml").write_text("{invalid yaml: [", encoding="utf-8") + result = subprocess.run( + [sys.executable, "-c", "import ocr_pipeline.config; print('ok')"], + cwd=tmp_path, + capture_output=True, + text=True, + env={"PYTHONPATH": str(SRC_DIR), "PATH": "/usr/bin:/bin"}, + ) + assert result.returncode == 0 + assert "ok" in result.stdout + + +def test_settings_proxy_delegates() -> None: + from ocr_pipeline.config import settings + + assert settings.ocr.engine in {"tesseract", "paddleocr", "auto"} + assert repr(settings) + + +def test_init_writes_local_config(tmp_path: Path, monkeypatch) -> None: + _isolate_config(tmp_path, monkeypatch) + result = runner.invoke(app, ["init", "--local"]) + assert result.exit_code == 0 + content = (tmp_path / "config.yaml").read_text(encoding="utf-8") + assert "paths:" in content + assert "tesseract" in content + + +def test_init_refuses_to_overwrite(tmp_path: Path, monkeypatch) -> None: + _isolate_config(tmp_path, monkeypatch) + (tmp_path / "config.yaml").write_text("existing: true\n", encoding="utf-8") + result = runner.invoke(app, ["init", "--local"]) + assert result.exit_code == 1 + assert (tmp_path / "config.yaml").read_text(encoding="utf-8") == "existing: true\n" + + +def test_run_guard_without_config_or_input_dir(tmp_path: Path, monkeypatch) -> None: + _isolate_config(tmp_path, monkeypatch) + result = runner.invoke(app, ["run"]) + assert result.exit_code == 2 + assert "ocr-pipeline init" in result.output + assert "ocr-pipeline demo" in result.output + + +def test_watch_guard_without_config(tmp_path: Path, monkeypatch) -> None: + _isolate_config(tmp_path, monkeypatch) + result = runner.invoke(app, ["watch"]) + assert result.exit_code == 2 + + +def test_setup_dry_run_prints_steps_without_executing() -> None: + result = runner.invoke(app, ["setup", "full", "--dry-run"]) + assert result.exit_code == 0 + assert "uv sync" in result.output or "pip install" in result.output + + +def test_setup_rejects_unknown_target() -> None: + result = runner.invoke(app, ["setup", "everything", "--dry-run"]) + assert result.exit_code == 2 + + +def test_demo_image_bundled_and_valid() -> None: + from PIL import Image + + from ocr_pipeline.demo import demo_image_path + + with Image.open(demo_image_path()) as img: + assert img.size[0] >= 800 + assert img.format == "PNG" diff --git a/uv.lock b/uv.lock index ffc0525..973ff02 100644 --- a/uv.lock +++ b/uv.lock @@ -2,20 +2,41 @@ version = 1 requires-python = ">=3.11" resolution-markers = [ "python_full_version >= '3.15' and sys_platform == 'win32'", - "python_full_version >= '3.15' and platform_system == 'Linux' and sys_platform == 'emscripten'", - "python_full_version >= '3.15' and platform_system != 'Linux' and sys_platform == 'emscripten'", - "python_full_version >= '3.15' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.15' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.15' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version >= '3.15' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version >= '3.15' and platform_system == 'Darwin' and sys_platform == 'emscripten'", + "python_full_version >= '3.15' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform == 'emscripten'", + "python_full_version >= '3.15' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.15' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.15' and platform_system == 'Darwin' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.15' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.14.*' and sys_platform == 'win32'", - "python_full_version == '3.14.*' and platform_system == 'Linux' and sys_platform == 'emscripten'", - "python_full_version == '3.14.*' and platform_system != 'Linux' and sys_platform == 'emscripten'", - "python_full_version == '3.14.*' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.14.*' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_system == 'Linux' and sys_platform == 'emscripten'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_system != 'Linux' and sys_platform == 'emscripten'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.14.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.14.*' and platform_system == 'Darwin' and sys_platform == 'emscripten'", + "python_full_version == '3.14.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.14.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and platform_system == 'Darwin' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and platform_system == 'Darwin' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and platform_system == 'Darwin' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and platform_system == 'Darwin' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and platform_system == 'Darwin' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version < '3.12' and sys_platform == 'win32'", "python_full_version < '3.12' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", "python_full_version < '3.12' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", @@ -30,6 +51,146 @@ resolution-markers = [ [manifest] overrides = [{ name = "lxml", specifier = ">=5.3.0" }] +[[package]] +name = "aiohappyeyeballs" +version = "2.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ce/f4/eec0465c2f67b2664688d0240b3212d5196fd89e741df67ddb81f8d35658/aiohappyeyeballs-2.7.1.tar.gz", hash = "sha256:065665c041c42a5938ed220bdcd7230f22527fbec085e1853d2402c8a3615d9d", size = 24757 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/71/43/1947f06babed6b3f1d7f38b0c767f52df66bfb2bc10b468c4a7de9eceff2/aiohappyeyeballs-2.7.1-py3-none-any.whl", hash = "sha256:9243213661e29250eb41368e5daa826fc017156c3b8a11440826b2e3ed376472", size = 15038 }, +] + +[[package]] +name = "aiohttp" +version = "3.14.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohappyeyeballs" }, + { name = "aiosignal" }, + { name = "attrs" }, + { name = "frozenlist" }, + { name = "multidict" }, + { name = "propcache" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, + { name = "yarl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/82/78/8ea7308cac6934de8c74a14f3d5f65d1c89287426688be79538d0e5c013d/aiohttp-3.14.1.tar.gz", hash = "sha256:307f2cff90a764d329e77040603fa032db89c5c24fdad50c4c15334cba744035", size = 7955794 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/dd/bf526e6f0a1120dd6f2df2e97bacfe4d358f13d17a0ff5847301a1375a51/aiohttp-3.14.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:aa00140699487bd435fde4342d85c94cb256b7cd3a5b9c3396c67f19922afda2", size = 765225 }, + { url = "https://files.pythonhosted.org/packages/8f/e1/a2872aa55495a70f61310d411541c6ee23812d9a884e000c716e1bc3edbf/aiohttp-3.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1c1af67559445498b502030c35c59db59966f47041ca9de5b4e707f86bd10b5f", size = 518743 }, + { url = "https://files.pythonhosted.org/packages/5b/e7/c60c7b209e509cc787de3cea0550a518538cfc08003e1c1e14c1c63fff71/aiohttp-3.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d44ec478e713ee7f29b439f7eb8dc2b9d4079e11ae114d2c2ac3d5daf30516c8", size = 514139 }, + { url = "https://files.pythonhosted.org/packages/5b/8d/614ace2f579702c9840ab1e1447fd8509e35b0b904f7196418fa2f57b25d/aiohttp-3.14.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d3b1a184a9a8f548a6b73f1e26b96b052193e4b3175ed7342aaf1151a1f00a04", size = 1784088 }, + { url = "https://files.pythonhosted.org/packages/49/e0/726e90f99542bf292f81a96a12cc4847deb86f3ccf62c6f4014a201f4d33/aiohttp-3.14.1-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5f2504bc0322437c9a1ff6d3333ca56c7477b727c995f036b976ae17b98372c8", size = 1737835 }, + { url = "https://files.pythonhosted.org/packages/0b/4b/d176d5c4db9d33dacf0543102ea59503bc1d528af4cfd0b719949ca49389/aiohttp-3.14.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:73f05ea02013e02512c3bf42714f1208c57168c779cc6fe23516e4543089d0a6", size = 1842801 }, + { url = "https://files.pythonhosted.org/packages/dc/d6/5a99b563690ea0cbed912ae94a2ce33993a5709a651a3a4fe761e7dd973a/aiohttp-3.14.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:797457503c2d426bee06eef808d07b31ede30b65e054444e7de64cad0061b7af", size = 1929992 }, + { url = "https://files.pythonhosted.org/packages/76/7f/a987b14a3859094b3cea3f4825219c3e5536242564af6e3f9c2f6c994eb2/aiohttp-3.14.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b821a1f7dedf7e37450654e620038ac3b2e81e8fa6ea269337e97101978ec730", size = 1786989 }, + { url = "https://files.pythonhosted.org/packages/f1/1a/420e5c85a3e73349372ed22ce0b6af86bfa6ce16a4b20a64a2e94608c781/aiohttp-3.14.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4cd96b5ba05d67ed0cf00b5b405c8cd99586d8e3481e8ee0a831057591af7621", size = 1640129 }, + { url = "https://files.pythonhosted.org/packages/a7/80/18a592ed3be0a402cc03670bd72ee1f8563ddbe1d8d5542dbf868f274136/aiohttp-3.14.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d459b98a932296c6f0e94f87511a0b1b90a8a02c30a50e60a297619cd5a58ee", size = 1756576 }, + { url = "https://files.pythonhosted.org/packages/ec/0b/8b3d5713373858ff71a617daf6e3b0e81ad63e79d09a3cf2f6b6b983939c/aiohttp-3.14.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:764457a7be60825fb770a644852ff717bcbb5042f189f2bd16df61a81b3f6573", size = 1754668 }, + { url = "https://files.pythonhosted.org/packages/9f/49/fd564575cf225821d7ba5a117cb8bc27213d8a7e1811162afb43ae077039/aiohttp-3.14.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f7a16ef45b081454ef844502d87a848876c490c4cb5c650c230f6ec79ed2c1e7", size = 1817019 }, + { url = "https://files.pythonhosted.org/packages/ed/1b/e850c9ae6fc91356552ae668bb6c51e93fa29c8aef13398a10b56678557f/aiohttp-3.14.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:2fbc3ed048b3475b9f0cbcb9978e9d2d3511acd91ead203af26ed9f0056004cf", size = 1631638 }, + { url = "https://files.pythonhosted.org/packages/eb/94/3c337ba72451a89806ace6f75bddc92bafc5b8d53d90115a512858024b63/aiohttp-3.14.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:bedb0cd073cc2dc035e30aeb99444389d3cd2113afe4ef9fcd23d439f5bade85", size = 1835660 }, + { url = "https://files.pythonhosted.org/packages/2b/9c/9c18cf367a0498212d9ba7daf990b504a5e8ae064cda4b504e2647c89c03/aiohttp-3.14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b6feea921016eb3d4e04d65fc4e9ca402d1a3801f562aef94989f54694917af3", size = 1775698 }, + { url = "https://files.pythonhosted.org/packages/b5/63/a251a9d2a6cb45065b2ddc0bde2b3dd10108740a9a42f632c66405a761a2/aiohttp-3.14.1-cp311-cp311-win32.whl", hash = "sha256:313701e488100074ce99850404ee36e741abf6330179fec908a1944ecf570126", size = 458386 }, + { url = "https://files.pythonhosted.org/packages/17/ca/69274c51dcd6e8947d77b2806cf47a4a15f2c846e2cbeb1882547d3da283/aiohttp-3.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:03ab4530fdcb3a543a122ba4b65ac9919da9fe9f78a03d328a6e38ff962f7aa5", size = 483406 }, + { url = "https://files.pythonhosted.org/packages/2c/8a/c25904f77690c3688ec140f87591ef11a0cfe36bf3d5c0f1f38056fb62b3/aiohttp-3.14.1-cp311-cp311-win_arm64.whl", hash = "sha256:486f7d16ed54c39c2cbd7ca71fd8ba2b8bb7860df65bd7b6ed640bab96a38a8b", size = 452987 }, + { url = "https://files.pythonhosted.org/packages/1d/21/151624b51cd92553d95424daf4bf19f19ce9be9002d19253e7e7ce67197b/aiohttp-3.14.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d35143e27778b4bb0fb189562d7f275bff79c62ab8e98459717c0ea617ff2480", size = 757402 }, + { url = "https://files.pythonhosted.org/packages/c2/82/280619e0bd7bf2454987e19282616e84762255dd9c8468f62382e8c191f1/aiohttp-3.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bcfb80a2cc36fba2534e5e5b5264dc7ae6fcd9bf15256da3e53d2f499e6fa29d", size = 512310 }, + { url = "https://files.pythonhosted.org/packages/55/b2/2aac325583aaa1353045f96dffa586d8a34e8322e14a7ba49cffeb103ab4/aiohttp-3.14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:27fd7c91e51729b4f7e1577865fa6d34c9adccbc39aabe9000285b48af9f0ec2", size = 512448 }, + { url = "https://files.pythonhosted.org/packages/8a/72/a60607cb849faa8af8a356c9329ea2eb6f395d49e82cc82ccba1fd8deb8f/aiohttp-3.14.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:64c567bf9eaf664280116a8688f63016e6b32db2505908e2bdaca1b6438142f2", size = 1766854 }, + { url = "https://files.pythonhosted.org/packages/b5/d3/d9fe1c9ec7557ab4d0d82bebaa728c6418f0b93295ec2f4ab015f7710cc7/aiohttp-3.14.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:f5e6ff2bdbb8f4cd3fbe41f99e25bbcd58e3bf9f13d3dd31a11e7917251cc77a", size = 1740884 }, + { url = "https://files.pythonhosted.org/packages/c1/dc/f2cecfaf9337ba3e63f181500814ff502aa3d00d9c7ec93a9d23d10a27b2/aiohttp-3.14.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2f73e01dc37122325caf079982621262f96d74823c179038a82fddfc50359264", size = 1810034 }, + { url = "https://files.pythonhosted.org/packages/66/d7/2ff65c5e65c0d7476daf7e15c032e0805e36811185b9623e3238ad6c763e/aiohttp-3.14.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bb2c0c80d431c0d03f2c7dbf125150fedd4f0de17366a7ca33f7ccb822391842", size = 1904054 }, + { url = "https://files.pythonhosted.org/packages/20/9c/d445818389df371f56d141d881153ba23183c4735a03f7356ffb43f7757d/aiohttp-3.14.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3e6fc1a85fa7194a1a7d19f44e8609180f4a8eb5fa4c7ed8b4355f080fad235c", size = 1790278 }, + { url = "https://files.pythonhosted.org/packages/4d/aa/bf04cb4d865fc6101c2229a294ad744973b72e513fdc5a6b791e6983d72a/aiohttp-3.14.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:686b6c0d3911ec387b444ddf5dc62fb7f7c0a7d5186a7861626496a5ab4aff95", size = 1591795 }, + { url = "https://files.pythonhosted.org/packages/dc/b4/4dac0038960427ba832f6609dfb4ea5437d7fd80c72001b9e48f834f428b/aiohttp-3.14.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c6fa4dc7ad6f8109c70bb1499e589f76b0b792baf39f9b017eb92c8a81d0a199", size = 1728397 }, + { url = "https://files.pythonhosted.org/packages/2b/f9/7cd4e8ad7aa3b75f17d56bb5498dd604a93d4e6eece822ba0568c413fff0/aiohttp-3.14.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:87a5eea1b2a5e21e1ebdbb33ad4165359189327e63fc4e4894693e7f821ac817", size = 1766504 }, + { url = "https://files.pythonhosted.org/packages/f9/df/fc01d9fcad0f73fed3f3d361f1f94f975947b50dff82919f6dc2bf4316cc/aiohttp-3.14.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1c1421eb01d4fd608d88cc8290211d177a58532b55ad94076fb349c5bf467f0a", size = 1777806 }, + { url = "https://files.pythonhosted.org/packages/41/09/47e2d090bddcc8fb4ccb4c314aadc32d7c5d9bb55f50f6ad1c92fc15d501/aiohttp-3.14.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:34b257ec41345c1e8f2df68fa908a7952f5de932723871eb633ecbbff396c9a4", size = 1580707 }, + { url = "https://files.pythonhosted.org/packages/3d/36/f1a4ce904ae0b6930cfe9afc96d0896f7ec1a620c400405d63783bb95a9c/aiohttp-3.14.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:de538791a80e5d862addbc183f70f0158ac9b9bb872bb147f1fd2a683691e087", size = 1798121 }, + { url = "https://files.pythonhosted.org/packages/70/0a/e0075ce9ca0279ee1d4f0c0b85f54fea02ebc83c3007651a72bece658fec/aiohttp-3.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6f71173be42d3241d428f760122febb748de0623f44308a6f120d0dd9ec572e3", size = 1767580 }, + { url = "https://files.pythonhosted.org/packages/3e/61/a0c0a8f327a9c52095cdd8e312391b00d3ed64ab6c72bb5c33d8ec251cf7/aiohttp-3.14.1-cp312-cp312-win32.whl", hash = "sha256:ec8dc383ee57ea3e883477dcca3f11b65d58199f1080acaf4cd6ad9a99698be4", size = 452771 }, + { url = "https://files.pythonhosted.org/packages/df/d9/ea367c75f16ac9c6cdc8febb25e8318fa21a2b1bc8d6514d4b2d890bface/aiohttp-3.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:2aa92c87868cd13674989f9ee83e5f9f7ea4237589b728048e1f0c8f6caa3271", size = 479873 }, + { url = "https://files.pythonhosted.org/packages/03/64/8d96784a7851156db8a4c6c3f6f91042fdf39fb15a4cc38c8b3c14833c45/aiohttp-3.14.1-cp312-cp312-win_arm64.whl", hash = "sha256:2c840c90759922cb5e6dda94596e079a30fb5a5ba548e7e0dc00574703940847", size = 448073 }, + { url = "https://files.pythonhosted.org/packages/bc/97/bd137012dd97e1649162b099135a80e1fd59aaa807b2430fc448d1029aff/aiohttp-3.14.1-cp313-cp313-android_21_arm64_v8a.whl", hash = "sha256:b3a03285a7f9c7b016324574a6d92a1c895da6b978cb8f1deee3ac72bc6da178", size = 506882 }, + { url = "https://files.pythonhosted.org/packages/ef/79/e5cc690e9d922a66887ceeaca53a8ffd5a7b0be3816142b7abc433742d89/aiohttp-3.14.1-cp313-cp313-android_21_x86_64.whl", hash = "sha256:2a73f487ab8ef5abbb24b7aa9b73e98eaba9e9e031804ff2416f02eca315ccaf", size = 515270 }, + { url = "https://files.pythonhosted.org/packages/fe/22/a73ccbf9dbd6e26dda0b24d5fd5db7da92ee3383a79f47677ffb834c5c5b/aiohttp-3.14.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:915fbb7b41b115192259f8c9ae58f3ddc444d2b5579917270211858e606a4afd", size = 485841 }, + { url = "https://files.pythonhosted.org/packages/3b/b9/57ed8eaf596321c2ad747bd480fb1700dbd7177c60dfc9e4c187f629662e/aiohttp-3.14.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:7fb4bdf95b0561a79f259f9d28fbc109728c5ee7f27aff6391f0ca703a329abe", size = 492088 }, + { url = "https://files.pythonhosted.org/packages/78/c0/5ebe5270a7c140d7c6f79dcb018640225f14d406c149e4eec04a7d82fe71/aiohttp-3.14.1-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:1b9748363260121d2927704f5d4fc498150669ca3ae93625986ee89c8f80dcd4", size = 501564 }, + { url = "https://files.pythonhosted.org/packages/75/7f/8cdaa24fc7983865e0915153b96a9ac5bcdd3548d64c5a27d17cecccad2d/aiohttp-3.14.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:86a6dab78b0e43e2897a3bbe15745aa60dc5423ca437b7b0b164c069bf91b876", size = 751998 }, + { url = "https://files.pythonhosted.org/packages/b2/f4/c4227aacfacc5cb0cc2d119b65301d177912a6842cd64e120c47af76064f/aiohttp-3.14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4dfd6e47d3c44c2279907607f73a4240b88c69eb8b90da7e2441a8045dfd21da", size = 510918 }, + { url = "https://files.pythonhosted.org/packages/ab/01/a2d5f96cd4e74424864d30bc0a7e44d0a12dacdcfa91b5b2d1bd3dca6bf3/aiohttp-3.14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:317acd9f8602858dc7d59679812c376c7f0b97bcbbf16e0d6237f54141d8a8a6", size = 508657 }, + { url = "https://files.pythonhosted.org/packages/e8/ed/3c0fb5c500fdd8e7ebc10d1889c04384fffa1a9163eac1356088ca9da1b1/aiohttp-3.14.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bd869c427324e5cb15195793de951295710db28be7d818247f3097b4ab5d4b96", size = 1757907 }, + { url = "https://files.pythonhosted.org/packages/0b/ab/d4c924d9bd5be3050c226612413ce68cb54c70d2c31b661bfc8d9a5b6a70/aiohttp-3.14.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:93b032b5ec3255473c143627d21a69ac74ae12f7f33974cb587c564d11b1066f", size = 1737565 }, + { url = "https://files.pythonhosted.org/packages/19/2a/37326821ff779084020cdc33224d20b19f42f4183a500ff92022a739eda7/aiohttp-3.14.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f234b4deb12f3ad59127e037bc57c40c21e45b45282df7d3a55a0f409f595296", size = 1799018 }, + { url = "https://files.pythonhosted.org/packages/b3/4f/6e947ba73e4ce09070761c05ed3a8ceb7c21f5e46798671d8b2aac0e4626/aiohttp-3.14.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:9af6779bfb46abf124068327abcdf9ce95c9ef8287a3e8da76ccf2d0f16c28fa", size = 1894416 }, + { url = "https://files.pythonhosted.org/packages/9d/6e/dbf1d0625dc711fb2851f4f3c3055c39ed58bae92082d8c627dbe6013736/aiohttp-3.14.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:faccab372e66bc76d5731525e7f1143c922271725b9d38c9f97edcc66266b451", size = 1783881 }, + { url = "https://files.pythonhosted.org/packages/44/c2/5e25098a67268ed369483ae7d1a58bd0a13d03aab860d2a0e4a6eb25b046/aiohttp-3.14.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f380468b09d2a81633ee863b0ec5648d364bd17bb8ecfb8c2f387f7ac1faf42c", size = 1587572 }, + { url = "https://files.pythonhosted.org/packages/2a/bd/cf9cee17e140f942a3de73e658a543aa8fbf35a5fc67a9d2538d52d77f0b/aiohttp-3.14.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:97e704dcd26271f5bda3fa07c3ce0fb76d6d3f8659f4baa1a24442cc9ba177ca", size = 1722137 }, + { url = "https://files.pythonhosted.org/packages/89/6d/5684f8c59045c96f81a18cefbc1fbbd79d25b88f1c622f2a5c5c08fcb632/aiohttp-3.14.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:269b76ac5394092b95bc4a098f4fc6c191c083c3bd12775d1e30e663132f6a09", size = 1755953 }, + { url = "https://files.pythonhosted.org/packages/a8/40/35caf3170f8359760740a7d9aa0fff2e344bef98e1d1186f5a0f6dec17e6/aiohttp-3.14.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5c0b3e614340c889d575451696374c9d17affd54cd607ca0babed8f8c37b9397", size = 1766479 }, + { url = "https://files.pythonhosted.org/packages/6d/a1/b0c61e7a137f0d81de49a82023a6df73c3c16d6fefb0f8e4a93d21639002/aiohttp-3.14.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:5663ee9257cfa1add7253a7da3035a02f31b6600ec48261585e1800a81533080", size = 1580077 }, + { url = "https://files.pythonhosted.org/packages/0b/41/194ea4623693009fcefebef7aef63c141754f153e9cd0d39d3b9e36c175c/aiohttp-3.14.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:603a2c834142172ffddc054067f5ec0ca65d57a0aa98a71bc81952573208e345", size = 1791688 }, + { url = "https://files.pythonhosted.org/packages/ba/45/4de841f005cfe1fd63e2a2fe011262c515e2a62aa6994b15947e7d717ac9/aiohttp-3.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:cb21957bb8aca671c1765e32f58164cf0c50e6bf41c0bbbd16da20732ecaf588", size = 1761094 }, + { url = "https://files.pythonhosted.org/packages/e4/ae/dbce10533d3896d544d5053939ed75b7dc31a1b0973d959b1b5ae21028d6/aiohttp-3.14.1-cp313-cp313-win32.whl", hash = "sha256:e509a55f681e6158c20f70f102f9cf61fb20fbc382272bc6d94b7343f2582780", size = 452662 }, + { url = "https://files.pythonhosted.org/packages/7b/d9/0bf1a19362c32f06229da5e7ddfcec91f93474d6307f7a2d3135e9c674dc/aiohttp-3.14.1-cp313-cp313-win_amd64.whl", hash = "sha256:1ac8531b638959718e18c2207fbfe297819875da46a740b29dfa29beba64355a", size = 479748 }, + { url = "https://files.pythonhosted.org/packages/22/0a/62e7232dc9484fbec112ceb32efb6a624cc7994ec6e2b019286f17c4e8f2/aiohttp-3.14.1-cp313-cp313-win_arm64.whl", hash = "sha256:250d14af67f6b6a1a4a811049b1afa69d61d617fca6bf33149b3ab1a6dbcf7b8", size = 447723 }, + { url = "https://files.pythonhosted.org/packages/c4/a1/5fafa04e1ca91ddb47608699d60649c1c6db3cf41c99e78fc4056f9513db/aiohttp-3.14.1-cp314-cp314-android_24_arm64_v8a.whl", hash = "sha256:7c106c26852ca1c2047c6b80384f17100b4e439af276f21ef3d4e2f450ae7e15", size = 508531 }, + { url = "https://files.pythonhosted.org/packages/fa/2e/bfa02f699d87ffc86d5959270b28f1cb410add3ccaced8ed2e0b8a5238fc/aiohttp-3.14.1-cp314-cp314-android_24_x86_64.whl", hash = "sha256:20205f7f5ade7aaec9f4b500549bbc071b046453aed72f9c06dcab87896a83e8", size = 514718 }, + { url = "https://files.pythonhosted.org/packages/85/a5/9594ad6289eebbc97d167c44213d557807f90e59115caad24de21ad2c3b1/aiohttp-3.14.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:62a759436b29e677181a9e76bab8b8f689a29cb9c535f45f7c48c9c830d3f8c3", size = 487918 }, + { url = "https://files.pythonhosted.org/packages/b4/61/16a32c36c3c49edec122a3dc811f2057df2f94d3b14aa107c8017d981618/aiohttp-3.14.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:2964cbf553df4d7a57348da44d961d871895fc1ee4e8c322b2a95612c7b17fba", size = 494014 }, + { url = "https://files.pythonhosted.org/packages/9b/89/3ebcf96ed99c05bec9c434aaac6963fd3cbab4a786ae739908a144d9ce44/aiohttp-3.14.1-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:237651caadc3a59badd39319c54642b5299e9cc98a3a194310e55d5bb9f5e397", size = 502398 }, + { url = "https://files.pythonhosted.org/packages/fd/3d/b74870a0c2d40c355928cd5b96c7a11fa821b8a40fc41365e64479b151fb/aiohttp-3.14.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:896e12dfdbbab9d8f7e16d2b28c6769a60126fa92095d1ebf9473d02593a2448", size = 758018 }, + { url = "https://files.pythonhosted.org/packages/d3/66/f42f5c984d99e49c6cff5f26f590750f2e2f7ef1fcfb99966ab5be1b632e/aiohttp-3.14.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d03f281ed22579314ba00821ce20115a7c0ac430660b4cc05704a3f818b3e004", size = 512462 }, + { url = "https://files.pythonhosted.org/packages/e9/a7/248e1aebe0c7810b0271e021a0f2a5eb6e78a051885b3c9df49f42a5802d/aiohttp-3.14.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:07eabb979d236335fed927e137a928c9adfb7df3b9ec7aa31726f133a62be983", size = 512824 }, + { url = "https://files.pythonhosted.org/packages/26/97/2aa0e5ba0727dc3bd5aaebb7ccbc510f7dfb7fb961ec87497cd496635ab1/aiohttp-3.14.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4fe1f1087cbadb280b5e1bb054a4f00d1423c74d6626c5e48400d871d34ecefe", size = 1749898 }, + { url = "https://files.pythonhosted.org/packages/00/8d/e97f6c96c891d457c8479d92a514ba194d0412f981d72c70341ee18488ed/aiohttp-3.14.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:367a9314fdc79dab0fac96e216cb41dd73c85bdca85306ce8999118ba7e0f333", size = 1710114 }, + { url = "https://files.pythonhosted.org/packages/6f/e6/aa8d7e863048c8fceb5cd6ce74017311cec3ead07847387e12265fb4444e/aiohttp-3.14.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a24f677ebe83749039e7bdf862ff0bbb16818ae4193d4ef96505e269375bcce0", size = 1802541 }, + { url = "https://files.pythonhosted.org/packages/83/a8/72193137de57fda4ebfae4563182d082c8856e3b6e9871d0b46f028fb369/aiohttp-3.14.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c83afe0ba876be7e943d2e0ba645809ad441575d2840c895c21ee5de93b9377a", size = 1875776 }, + { url = "https://files.pythonhosted.org/packages/a0/18/938441025db6769a3464596b2410af3afde0b21eb2f204c6f766f68af4bd/aiohttp-3.14.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:634e385930fb6d2d479cf3aa66515955863b77a5e3c2b5894ca259a25b308602", size = 1760329 }, + { url = "https://files.pythonhosted.org/packages/60/29/bf2496b4065e76e09fe48015aaffe5ce161d8f089b06ac6982070f653076/aiohttp-3.14.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:eeea07c4397bbc57719c4eed8f9c284874d4f175f9b6d57f7a1546b976d455ca", size = 1587293 }, + { url = "https://files.pythonhosted.org/packages/49/a2/2136674d52123b1354bd05dd5753c318db47dc0c927cc70b27bab3755456/aiohttp-3.14.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:335c0cc3e3545ce98dcb9cfcb836f40c3411f43fa03dab757597d80c89af8a35", size = 1714756 }, + { url = "https://files.pythonhosted.org/packages/a7/b9/e5fd2e6f915503081c0f9b1e8540947037929c70c191da2e4d54b31a21a1/aiohttp-3.14.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:ae6be797afdef264e8a84864a85b196ca06045586481b3df8a967322fd2fa844", size = 1721052 }, + { url = "https://files.pythonhosted.org/packages/63/5a/2833e324a2263e104e31e2e91bc5bbee81bc499afd32203faee048a883f0/aiohttp-3.14.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:8560b4d712474335d08907db7973f71912d3a9a8f1dee992ec06b5d2fe359496", size = 1766888 }, + { url = "https://files.pythonhosted.org/packages/57/fa/dea6511870913162f3b2e8c42a7614eb203a4540b8c2da43e0bfb0548f3c/aiohttp-3.14.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7edd08e0a5deb1e8564a2fcd8f4561014a3f05252334671bbf55ddd47db0e5", size = 1581679 }, + { url = "https://files.pythonhosted.org/packages/14/bd/3cf0d55e71784b33534e9710a67d382d900598b4787fbce6cc7317f8c42a/aiohttp-3.14.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:b6ff7fcee63287ae57b5df3e4f5957ce032122802509246dec1a5bcc55904c95", size = 1782021 }, + { url = "https://files.pythonhosted.org/packages/c1/af/14bb5843eccbe234f4dfb78ab73e549d99727247e62ae5d62cbd22eaf5b0/aiohttp-3.14.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6ffbb2f4ec1ceaff7e07d43922954da26b223d188bf30658e561b98e23089444", size = 1742574 }, + { url = "https://files.pythonhosted.org/packages/f2/1e/fbeb7af9210a67ac0f9c9bec0f8f4568497924e33137a3d5b48e1cf85f3f/aiohttp-3.14.1-cp314-cp314-win32.whl", hash = "sha256:a9875b46d910cff3ea2f5962f9d266b465459fe634e22556ab9bd6fc1192eea0", size = 457773 }, + { url = "https://files.pythonhosted.org/packages/f0/2b/13e8d741a9ec5db7d900c060554cf8352ab85e44e2a4469ebb9d377bda17/aiohttp-3.14.1-cp314-cp314-win_amd64.whl", hash = "sha256:af8b4b81a960eeaf1234971ac3cd0ba5901f3cd42eae42a46b4d089a8b492719", size = 485001 }, + { url = "https://files.pythonhosted.org/packages/df/30/491acfa2c4d6c3ff59c49a14fc1b50be3241e25bbb0c84c09e2da4d11395/aiohttp-3.14.1-cp314-cp314-win_arm64.whl", hash = "sha256:cf4491381b1b57425c315a56a439251b1bdac07b2275f19a8c44bc57744532ec", size = 453809 }, + { url = "https://files.pythonhosted.org/packages/34/e3/19dbe1a1f4cc6230eb9e314de7fe68053b0992f9302b27d12141a0b5db53/aiohttp-3.14.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:819c054312f1af92947e6a55883d1b66feefab11531a7fc45e0fb9b63880b5c2", size = 793320 }, + { url = "https://files.pythonhosted.org/packages/7f/20/1b7182219ba1b108430d6e4dc53d25ae02dcfcf5a045b33af4e8c5167527/aiohttp-3.14.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:10ee9c1753a8f706345b22496c79fbddb5be0599e0823f3738b1534058e25340", size = 529077 }, + { url = "https://files.pythonhosted.org/packages/b9/c8/14ce60ec31a2e5f5274bb17d383a6f7a3aabca31ac04eee05585bbadab16/aiohttp-3.14.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1601cc37baf5750ccacae618ec2daf020769581695550e3b654a911f859c563d", size = 532476 }, + { url = "https://files.pythonhosted.org/packages/7e/02/9ac85e081e53da2e061b02fa7758fe0a12d17b8ce2d1f5e6c7cb76730328/aiohttp-3.14.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4d6e0ac9da31c9c04c84e1c0182ad8d6df35965a85cae29cd71d089621b3ae94", size = 1922347 }, + { url = "https://files.pythonhosted.org/packages/c0/3e/d3ba07a0ab38b5389e10bec4362d21e10a4f667cba2d79ba30837b3a5059/aiohttp-3.14.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:9e8f2d660c350b3d0e259c7a7e3d9b7fc8b41210cbcc3d4a7076ff0a5e5c2fdc", size = 1786465 }, + { url = "https://files.pythonhosted.org/packages/0b/cb/e2ee978a00cfb2df829704a69528b18154eba5939f45bc1efa8f33aee4c5/aiohttp-3.14.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4691802dda97be727f79d86818acaad7eb8e9252626a1d6b519fedbb92d5e251", size = 1909423 }, + { url = "https://files.pythonhosted.org/packages/73/5d/1430334858b1022b58ae50399a918f0bd6fe8fa7fa183598d657ff61e040/aiohttp-3.14.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c389c482a7e9b9dc3ee2701ac46c4125297a3818875b9c305ddb603c04828fd1", size = 2001906 }, + { url = "https://files.pythonhosted.org/packages/66/4e/560c7472d3d198a23aa5c8b19a5115bf6a9b77b7d3e4bb363da320430ad2/aiohttp-3.14.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fc0cacab7ba4e56f0f81c82a98c09bed2f39c940107b03a34b168bdf7597edd3", size = 1877095 }, + { url = "https://files.pythonhosted.org/packages/0d/f1/4745806578d447db4a784a8591e2dae3afdfc2bcb96f8f81271b13df6543/aiohttp-3.14.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:979ed4717f59b8bb12e3963378fa285d93d367e15bcd66c721311826d3c44a6c", size = 1676222 }, + { url = "https://files.pythonhosted.org/packages/6a/c9/48255813cca749a229ef0ab476004ec623728ad79a9c0840616f6c076325/aiohttp-3.14.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:38e1e7daaea81df51c952e18483f323d878499a1e2bfe564790e0f9701d6f203", size = 1842922 }, + { url = "https://files.pythonhosted.org/packages/3d/c0/bbd054e2bee909f529523a5af3891052606af5143c09f5f183ec3b234676/aiohttp-3.14.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:4132e72c608fe9fecb8f409113567605915b83e9bdd3ea56538d2f9cd35002f1", size = 1825035 }, + { url = "https://files.pythonhosted.org/packages/a8/ae/90395d4376deceb74e09ec26b6adf7d2015a6f8802d6d84446af860fef04/aiohttp-3.14.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:eefd9cc9b6d4a2db5f00a26bc3e4f9acf71926a6ec557cd56c9c6f27c290b665", size = 1849512 }, + { url = "https://files.pythonhosted.org/packages/93/bd/fb25f3049957553d4ce0ba6ae480aa2f592a6985497fca590837d16c1be0/aiohttp-3.14.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:b165790117eea512d7f3fb22f1f6dad3d55a7189571993eb015591c1401276d1", size = 1668571 }, + { url = "https://files.pythonhosted.org/packages/3f/22/7f73303d64dd567ff3addca90b556690ed1233a47b8f55d242fb90af3681/aiohttp-3.14.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:ed09c7eb1c391271c2ed0314a51903e72a3acb653d5ccfc264cdf3ef11f8269d", size = 1881159 }, + { url = "https://files.pythonhosted.org/packages/44/be/0474c5a8b5640e1e4aa1923430a91f4151be82e511373fe764189b89aef5/aiohttp-3.14.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:99abd37084b82f5830c635fddd0b4993b9742a66eb746dacf433c8590e8f9e3c", size = 1841409 }, + { url = "https://files.pythonhosted.org/packages/7b/3c/bb4a7cba26956cb3da4553cc2056cf67be5b5ff6e6d8fa4fbdff73bfb7ae/aiohttp-3.14.1-cp314-cp314t-win32.whl", hash = "sha256:47ddf841cdecc810749921d25606dee45857d12d2ad5ddb7b5bd7eab12e4b365", size = 494166 }, + { url = "https://files.pythonhosted.org/packages/8a/84/ec80c2c1f66a952555a9f86df6b33af65108a6febfa0471b69013a12f807/aiohttp-3.14.1-cp314-cp314t-win_amd64.whl", hash = "sha256:5e78b522b7a6e27e0b25d19b247b75039ac4c94f99823e3c9e53ae1603a9f7e9", size = 530255 }, + { url = "https://files.pythonhosted.org/packages/2a/71/6e22be134a4061ada85a92951b842f2657f17d926b727f3f94c56ae963d6/aiohttp-3.14.1-cp314-cp314t-win_arm64.whl", hash = "sha256:90d53f1609c29ccc2193945ef732428382a28f78d0456ae4d3daf0d48b74f0f6", size = 469640 }, +] + +[[package]] +name = "aiosignal" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "frozenlist" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/61/62/06741b579156360248d1ec624842ad0edf697050bbaf7c3e46394e106ad1/aiosignal-1.4.0.tar.gz", hash = "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7", size = 25007 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e", size = 7490 }, +] + [[package]] name = "albucore" version = "0.0.24" @@ -37,8 +198,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, { name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, - { name = "opencv-python-headless", version = "4.11.0.86", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, - { name = "opencv-python-headless", version = "5.0.0.93", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "opencv-python-headless" }, { name = "simsimd" }, { name = "stringzilla" }, ] @@ -55,11 +215,10 @@ dependencies = [ { name = "albucore" }, { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, { name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, - { name = "opencv-python-headless", version = "4.11.0.86", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, - { name = "opencv-python-headless", version = "5.0.0.93", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "opencv-python-headless" }, { name = "pydantic" }, { name = "pyyaml" }, - { name = "scipy", version = "1.17.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, + { name = "scipy", version = "1.10.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, { name = "scipy", version = "1.18.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/f4/f4/85eb56c3217b53bcfc2d12e840a0b18ca60902086321cafa5a730f9c0470/albumentations-2.0.8.tar.gz", hash = "sha256:4da95e658e490de3c34af8fcdffed09e36aa8a4edd06ca9f9e7e3ea0b0b16856", size = 354460 } @@ -199,20 +358,41 @@ version = "1.3.3" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.15' and sys_platform == 'win32'", - "python_full_version >= '3.15' and platform_system == 'Linux' and sys_platform == 'emscripten'", - "python_full_version >= '3.15' and platform_system != 'Linux' and sys_platform == 'emscripten'", - "python_full_version >= '3.15' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.15' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.15' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version >= '3.15' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version >= '3.15' and platform_system == 'Darwin' and sys_platform == 'emscripten'", + "python_full_version >= '3.15' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform == 'emscripten'", + "python_full_version >= '3.15' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.15' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.15' and platform_system == 'Darwin' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.15' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.14.*' and sys_platform == 'win32'", - "python_full_version == '3.14.*' and platform_system == 'Linux' and sys_platform == 'emscripten'", - "python_full_version == '3.14.*' and platform_system != 'Linux' and sys_platform == 'emscripten'", - "python_full_version == '3.14.*' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.14.*' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_system == 'Linux' and sys_platform == 'emscripten'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_system != 'Linux' and sys_platform == 'emscripten'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.14.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.14.*' and platform_system == 'Darwin' and sys_platform == 'emscripten'", + "python_full_version == '3.14.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.14.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and platform_system == 'Darwin' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and platform_system == 'Darwin' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and platform_system == 'Darwin' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and platform_system == 'Darwin' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and platform_system == 'Darwin' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", ] dependencies = [ { name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, @@ -460,18 +640,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fb/e2/79c688af8b210d232694e31e59da9f6ec747bae31c3f5946e4e9b98860d5/click-8.4.2-py3-none-any.whl", hash = "sha256:e6f9f66136c816745b9d65817da91d61d957fb16e02e4dcd0552553c5a197b76", size = 119243 }, ] -[[package]] -name = "click-default-group" -version = "1.2.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "click" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/1d/ce/edb087fb53de63dad3b36408ca30368f438738098e668b78c87f93cd41df/click_default_group-1.2.4.tar.gz", hash = "sha256:eb3f3c99ec0d456ca6cd2a7f08f7d4e91771bef51b01bdd9580cc6450fe1251e", size = 3505 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/1a/aff8bb287a4b1400f69e09a53bd65de96aa5cee5691925b38731c67fc695/click_default_group-1.2.4-py2.py3-none-any.whl", hash = "sha256:9b60486923720e7fc61731bdb32b617039aba820e22e1c88766b1125592eaa5f", size = 4123 }, -] - [[package]] name = "cloudpathlib" version = "0.24.0" @@ -833,6 +1001,28 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277 }, ] +[[package]] +name = "faiss-cpu" +version = "1.14.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, + { name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "packaging" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/b0/48c083d01b7b68c463c1d56507147a9d733f791e1c469a77215a872a9fb5/faiss_cpu-1.14.3-cp310-abi3-macosx_14_0_arm64.whl", hash = "sha256:a9369863290a3f0e033757e4c10577b6ef7431f1cede394dabd0a137e4e2ed45", size = 4768290 }, + { url = "https://files.pythonhosted.org/packages/ab/34/6b04ef5bae3eada6b5a9457d7875cce041c040d53c890815cbd1e9821c65/faiss_cpu-1.14.3-cp310-abi3-macosx_15_0_x86_64.whl", hash = "sha256:f9d0e84d909194f63f027bbd3c1e35e905e48c9345c2db6e6f24da09a6bc5906", size = 6925734 }, + { url = "https://files.pythonhosted.org/packages/7c/8a/b451af4b3c6dd18749ecfb58ccb68503b77e49c9aa4a89d950e9d521e058/faiss_cpu-1.14.3-cp310-abi3-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1d734cfa9ac90b6a5dfed3a27cb706d05f22824703dafc3969b4e2071877a31c", size = 9661210 }, + { url = "https://files.pythonhosted.org/packages/a0/ed/57335bc18c9e18677587bec9bf070c675b29c8e683e13f4def0440731ca0/faiss_cpu-1.14.3-cp310-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8780b526c06e57aad90a8c4655dfba2ff1b3195bd600ff4499752fc45159c9fc", size = 18506292 }, + { url = "https://files.pythonhosted.org/packages/e7/d3/c6ca8c44a63b909e78aa8a69e14501c79c89613e62261d58455ea603d710/faiss_cpu-1.14.3-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:b28ba083e8c02f2c9be03783402537fd3f00d27e68799c44bf88931500ee12ec", size = 11238800 }, + { url = "https://files.pythonhosted.org/packages/93/5f/b405692913a301251749cb175cb3f564ed257fdaa80a22c9a36444d0095d/faiss_cpu-1.14.3-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:cdcb90850cb4b7c27d270839b37bcc0dc8d1fb6a62d1e13053e51ac95061ca25", size = 19237637 }, + { url = "https://files.pythonhosted.org/packages/78/6c/bbf670ad727502102fa90c52f9b47c73753f0adda880d30427ac1d48b37b/faiss_cpu-1.14.3-cp311-cp311-win_amd64.whl", hash = "sha256:f278003d00c30c90cf118b98428bb96f73eba4b9dadac6993c788966d2e983bd", size = 16159350 }, + { url = "https://files.pythonhosted.org/packages/59/aa/bfa53255a6aa6e79b2471bb5af895f662feb02b612e1e0f9efc3d893286e/faiss_cpu-1.14.3-cp312-cp312-win_amd64.whl", hash = "sha256:0a5eb27184123c7ac1060c6b862978eabf0e30c1369ccf8bdb1497d35c06ad3d", size = 16164699 }, + { url = "https://files.pythonhosted.org/packages/1d/c1/2fb14f58ff74d7a7d6fd13084c016d9b144ce0bcdf77f6526cc2e4828278/faiss_cpu-1.14.3-cp313-cp313-win_amd64.whl", hash = "sha256:ea2340f675db59af8db6da4535b541ce6948d68a008989c656c292c7b0c77127", size = 16162836 }, + { url = "https://files.pythonhosted.org/packages/fd/aa/100d3b706b8e2aa561e2673ed7d07c4c7c26f92d938a88d193dd54f90c45/faiss_cpu-1.14.3-cp314-cp314-win_amd64.whl", hash = "sha256:54b0ea832be5bce75ef9abf1297fe4613d760bf7cfe7a963da040cb0314e8f58", size = 16444608 }, +] + [[package]] name = "fastjsonschema" version = "2.21.2" @@ -842,6 +1032,58 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl", hash = "sha256:1c797122d0a86c5cace2e54bf4e819c36223b552017172f32c5c024a6b77e463", size = 24024 }, ] +[[package]] +name = "fastuuid" +version = "0.14.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/7d/d9daedf0f2ebcacd20d599928f8913e9d2aea1d56d2d355a93bfa2b611d7/fastuuid-0.14.0.tar.gz", hash = "sha256:178947fc2f995b38497a74172adee64fdeb8b7ec18f2a5934d037641ba265d26", size = 18232 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/98/f3/12481bda4e5b6d3e698fbf525df4443cc7dce746f246b86b6fcb2fba1844/fastuuid-0.14.0-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:73946cb950c8caf65127d4e9a325e2b6be0442a224fd51ba3b6ac44e1912ce34", size = 516386 }, + { url = "https://files.pythonhosted.org/packages/59/19/2fc58a1446e4d72b655648eb0879b04e88ed6fa70d474efcf550f640f6ec/fastuuid-0.14.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:12ac85024637586a5b69645e7ed986f7535106ed3013640a393a03e461740cb7", size = 264569 }, + { url = "https://files.pythonhosted.org/packages/78/29/3c74756e5b02c40cfcc8b1d8b5bac4edbd532b55917a6bcc9113550e99d1/fastuuid-0.14.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:05a8dde1f395e0c9b4be515b7a521403d1e8349443e7641761af07c7ad1624b1", size = 254366 }, + { url = "https://files.pythonhosted.org/packages/52/96/d761da3fccfa84f0f353ce6e3eb8b7f76b3aa21fd25e1b00a19f9c80a063/fastuuid-0.14.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09378a05020e3e4883dfdab438926f31fea15fd17604908f3d39cbeb22a0b4dc", size = 278978 }, + { url = "https://files.pythonhosted.org/packages/fc/c2/f84c90167cc7765cb82b3ff7808057608b21c14a38531845d933a4637307/fastuuid-0.14.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbb0c4b15d66b435d2538f3827f05e44e2baafcc003dd7d8472dc67807ab8fd8", size = 279692 }, + { url = "https://files.pythonhosted.org/packages/af/7b/4bacd03897b88c12348e7bd77943bac32ccf80ff98100598fcff74f75f2e/fastuuid-0.14.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cd5a7f648d4365b41dbf0e38fe8da4884e57bed4e77c83598e076ac0c93995e7", size = 303384 }, + { url = "https://files.pythonhosted.org/packages/c0/a2/584f2c29641df8bd810d00c1f21d408c12e9ad0c0dafdb8b7b29e5ddf787/fastuuid-0.14.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c0a94245afae4d7af8c43b3159d5e3934c53f47140be0be624b96acd672ceb73", size = 460921 }, + { url = "https://files.pythonhosted.org/packages/24/68/c6b77443bb7764c760e211002c8638c0c7cce11cb584927e723215ba1398/fastuuid-0.14.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:2b29e23c97e77c3a9514d70ce343571e469098ac7f5a269320a0f0b3e193ab36", size = 480575 }, + { url = "https://files.pythonhosted.org/packages/5a/87/93f553111b33f9bb83145be12868c3c475bf8ea87c107063d01377cc0e8e/fastuuid-0.14.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1e690d48f923c253f28151b3a6b4e335f2b06bf669c68a02665bc150b7839e94", size = 452317 }, + { url = "https://files.pythonhosted.org/packages/9e/8c/a04d486ca55b5abb7eaa65b39df8d891b7b1635b22db2163734dc273579a/fastuuid-0.14.0-cp311-cp311-win32.whl", hash = "sha256:a6f46790d59ab38c6aa0e35c681c0484b50dc0acf9e2679c005d61e019313c24", size = 154804 }, + { url = "https://files.pythonhosted.org/packages/9c/b2/2d40bf00820de94b9280366a122cbaa60090c8cf59e89ac3938cf5d75895/fastuuid-0.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:e150eab56c95dc9e3fefc234a0eedb342fac433dacc273cd4d150a5b0871e1fa", size = 156099 }, + { url = "https://files.pythonhosted.org/packages/02/a2/e78fcc5df65467f0d207661b7ef86c5b7ac62eea337c0c0fcedbeee6fb13/fastuuid-0.14.0-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:77e94728324b63660ebf8adb27055e92d2e4611645bf12ed9d88d30486471d0a", size = 510164 }, + { url = "https://files.pythonhosted.org/packages/2b/b3/c846f933f22f581f558ee63f81f29fa924acd971ce903dab1a9b6701816e/fastuuid-0.14.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:caa1f14d2102cb8d353096bc6ef6c13b2c81f347e6ab9d6fbd48b9dea41c153d", size = 261837 }, + { url = "https://files.pythonhosted.org/packages/54/ea/682551030f8c4fa9a769d9825570ad28c0c71e30cf34020b85c1f7ee7382/fastuuid-0.14.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d23ef06f9e67163be38cece704170486715b177f6baae338110983f99a72c070", size = 251370 }, + { url = "https://files.pythonhosted.org/packages/14/dd/5927f0a523d8e6a76b70968e6004966ee7df30322f5fc9b6cdfb0276646a/fastuuid-0.14.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c9ec605ace243b6dbe3bd27ebdd5d33b00d8d1d3f580b39fdd15cd96fd71796", size = 277766 }, + { url = "https://files.pythonhosted.org/packages/16/6e/c0fb547eef61293153348f12e0f75a06abb322664b34a1573a7760501336/fastuuid-0.14.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:808527f2407f58a76c916d6aa15d58692a4a019fdf8d4c32ac7ff303b7d7af09", size = 278105 }, + { url = "https://files.pythonhosted.org/packages/2d/b1/b9c75e03b768f61cf2e84ee193dc18601aeaf89a4684b20f2f0e9f52b62c/fastuuid-0.14.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2fb3c0d7fef6674bbeacdd6dbd386924a7b60b26de849266d1ff6602937675c8", size = 301564 }, + { url = "https://files.pythonhosted.org/packages/fc/fa/f7395fdac07c7a54f18f801744573707321ca0cee082e638e36452355a9d/fastuuid-0.14.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab3f5d36e4393e628a4df337c2c039069344db5f4b9d2a3c9cea48284f1dd741", size = 459659 }, + { url = "https://files.pythonhosted.org/packages/66/49/c9fd06a4a0b1f0f048aacb6599e7d96e5d6bc6fa680ed0d46bf111929d1b/fastuuid-0.14.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:b9a0ca4f03b7e0b01425281ffd44e99d360e15c895f1907ca105854ed85e2057", size = 478430 }, + { url = "https://files.pythonhosted.org/packages/be/9c/909e8c95b494e8e140e8be6165d5fc3f61fdc46198c1554df7b3e1764471/fastuuid-0.14.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3acdf655684cc09e60fb7e4cf524e8f42ea760031945aa8086c7eae2eeeabeb8", size = 450894 }, + { url = "https://files.pythonhosted.org/packages/90/eb/d29d17521976e673c55ef7f210d4cdd72091a9ec6755d0fd4710d9b3c871/fastuuid-0.14.0-cp312-cp312-win32.whl", hash = "sha256:9579618be6280700ae36ac42c3efd157049fe4dd40ca49b021280481c78c3176", size = 154374 }, + { url = "https://files.pythonhosted.org/packages/cc/fc/f5c799a6ea6d877faec0472d0b27c079b47c86b1cdc577720a5386483b36/fastuuid-0.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:d9e4332dc4ba054434a9594cbfaf7823b57993d7d8e7267831c3e059857cf397", size = 156550 }, + { url = "https://files.pythonhosted.org/packages/a5/83/ae12dd39b9a39b55d7f90abb8971f1a5f3c321fd72d5aa83f90dc67fe9ed/fastuuid-0.14.0-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:77a09cb7427e7af74c594e409f7731a0cf887221de2f698e1ca0ebf0f3139021", size = 510720 }, + { url = "https://files.pythonhosted.org/packages/53/b0/a4b03ff5d00f563cc7546b933c28cb3f2a07344b2aec5834e874f7d44143/fastuuid-0.14.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:9bd57289daf7b153bfa3e8013446aa144ce5e8c825e9e366d455155ede5ea2dc", size = 262024 }, + { url = "https://files.pythonhosted.org/packages/9c/6d/64aee0a0f6a58eeabadd582e55d0d7d70258ffdd01d093b30c53d668303b/fastuuid-0.14.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ac60fc860cdf3c3f327374db87ab8e064c86566ca8c49d2e30df15eda1b0c2d5", size = 251679 }, + { url = "https://files.pythonhosted.org/packages/60/f5/a7e9cda8369e4f7919d36552db9b2ae21db7915083bc6336f1b0082c8b2e/fastuuid-0.14.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab32f74bd56565b186f036e33129da77db8be09178cd2f5206a5d4035fb2a23f", size = 277862 }, + { url = "https://files.pythonhosted.org/packages/f0/d3/8ce11827c783affffd5bd4d6378b28eb6cc6d2ddf41474006b8d62e7448e/fastuuid-0.14.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33e678459cf4addaedd9936bbb038e35b3f6b2061330fd8f2f6a1d80414c0f87", size = 278278 }, + { url = "https://files.pythonhosted.org/packages/a2/51/680fb6352d0bbade04036da46264a8001f74b7484e2fd1f4da9e3db1c666/fastuuid-0.14.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1e3cc56742f76cd25ecb98e4b82a25f978ccffba02e4bdce8aba857b6d85d87b", size = 301788 }, + { url = "https://files.pythonhosted.org/packages/fa/7c/2014b5785bd8ebdab04ec857635ebd84d5ee4950186a577db9eff0fb8ff6/fastuuid-0.14.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:cb9a030f609194b679e1660f7e32733b7a0f332d519c5d5a6a0a580991290022", size = 459819 }, + { url = "https://files.pythonhosted.org/packages/01/d2/524d4ceeba9160e7a9bc2ea3e8f4ccf1ad78f3bde34090ca0c51f09a5e91/fastuuid-0.14.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:09098762aad4f8da3a888eb9ae01c84430c907a297b97166b8abc07b640f2995", size = 478546 }, + { url = "https://files.pythonhosted.org/packages/bc/17/354d04951ce114bf4afc78e27a18cfbd6ee319ab1829c2d5fb5e94063ac6/fastuuid-0.14.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:1383fff584fa249b16329a059c68ad45d030d5a4b70fb7c73a08d98fd53bcdab", size = 450921 }, + { url = "https://files.pythonhosted.org/packages/fb/be/d7be8670151d16d88f15bb121c5b66cdb5ea6a0c2a362d0dcf30276ade53/fastuuid-0.14.0-cp313-cp313-win32.whl", hash = "sha256:a0809f8cc5731c066c909047f9a314d5f536c871a7a22e815cc4967c110ac9ad", size = 154559 }, + { url = "https://files.pythonhosted.org/packages/22/1d/5573ef3624ceb7abf4a46073d3554e37191c868abc3aecd5289a72f9810a/fastuuid-0.14.0-cp313-cp313-win_amd64.whl", hash = "sha256:0df14e92e7ad3276327631c9e7cec09e32572ce82089c55cb1bb8df71cf394ed", size = 156539 }, + { url = "https://files.pythonhosted.org/packages/16/c9/8c7660d1fe3862e3f8acabd9be7fc9ad71eb270f1c65cce9a2b7a31329ab/fastuuid-0.14.0-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:b852a870a61cfc26c884af205d502881a2e59cc07076b60ab4a951cc0c94d1ad", size = 510600 }, + { url = "https://files.pythonhosted.org/packages/4c/f4/a989c82f9a90d0ad995aa957b3e572ebef163c5299823b4027986f133dfb/fastuuid-0.14.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:c7502d6f54cd08024c3ea9b3514e2d6f190feb2f46e6dbcd3747882264bb5f7b", size = 262069 }, + { url = "https://files.pythonhosted.org/packages/da/6c/a1a24f73574ac995482b1326cf7ab41301af0fabaa3e37eeb6b3df00e6e2/fastuuid-0.14.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1ca61b592120cf314cfd66e662a5b54a578c5a15b26305e1b8b618a6f22df714", size = 251543 }, + { url = "https://files.pythonhosted.org/packages/1a/20/2a9b59185ba7a6c7b37808431477c2d739fcbdabbf63e00243e37bd6bf49/fastuuid-0.14.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa75b6657ec129d0abded3bec745e6f7ab642e6dba3a5272a68247e85f5f316f", size = 277798 }, + { url = "https://files.pythonhosted.org/packages/ef/33/4105ca574f6ded0af6a797d39add041bcfb468a1255fbbe82fcb6f592da2/fastuuid-0.14.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8a0dfea3972200f72d4c7df02c8ac70bad1bb4c58d7e0ec1e6f341679073a7f", size = 278283 }, + { url = "https://files.pythonhosted.org/packages/fe/8c/fca59f8e21c4deb013f574eae05723737ddb1d2937ce87cb2a5d20992dc3/fastuuid-0.14.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1bf539a7a95f35b419f9ad105d5a8a35036df35fdafae48fb2fd2e5f318f0d75", size = 301627 }, + { url = "https://files.pythonhosted.org/packages/cb/e2/f78c271b909c034d429218f2798ca4e89eeda7983f4257d7865976ddbb6c/fastuuid-0.14.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:9a133bf9cc78fdbd1179cb58a59ad0100aa32d8675508150f3658814aeefeaa4", size = 459778 }, + { url = "https://files.pythonhosted.org/packages/1e/f0/5ff209d865897667a2ff3e7a572267a9ced8f7313919f6d6043aed8b1caa/fastuuid-0.14.0-cp314-cp314-musllinux_1_1_i686.whl", hash = "sha256:f54d5b36c56a2d5e1a31e73b950b28a0d83eb0c37b91d10408875a5a29494bad", size = 478605 }, + { url = "https://files.pythonhosted.org/packages/e0/c8/2ce1c78f983a2c4987ea865d9516dbdfb141a120fd3abb977ae6f02ba7ca/fastuuid-0.14.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:ec27778c6ca3393ef662e2762dba8af13f4ec1aaa32d08d77f71f2a70ae9feb8", size = 450837 }, + { url = "https://files.pythonhosted.org/packages/df/60/dad662ec9a33b4a5fe44f60699258da64172c39bd041da2994422cdc40fe/fastuuid-0.14.0-cp314-cp314-win32.whl", hash = "sha256:e23fc6a83f112de4be0cc1990e5b127c27663ae43f866353166f87df58e73d06", size = 154532 }, + { url = "https://files.pythonhosted.org/packages/1f/f6/da4db31001e854025ffd26bc9ba0740a9cbba2c3259695f7c5834908b336/fastuuid-0.14.0-cp314-cp314-win_amd64.whl", hash = "sha256:df61342889d0f5e7a32f7284e55ef95103f2110fee433c2ae7c2c0956d76ac8a", size = 156457 }, +] + [[package]] name = "filelock" version = "3.31.0" @@ -912,6 +1154,111 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2c/47/c99d5268f354002ce80f8d029cd9d7d872969da1de8b93d32de4dc56d6f4/fonttools-4.63.0-py3-none-any.whl", hash = "sha256:445af2eab030a16b9171ea8bdda7ebf7d96bda2df88ee182a464252f6e05e20d", size = 1164562 }, ] +[[package]] +name = "frozenlist" +version = "1.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2d/f5/c831fac6cc817d26fd54c7eaccd04ef7e0288806943f7cc5bbf69f3ac1f0/frozenlist-1.8.0.tar.gz", hash = "sha256:3ede829ed8d842f6cd48fc7081d7a41001a56f1f38603f9d49bf3020d59a31ad", size = 45875 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bc/03/077f869d540370db12165c0aa51640a873fb661d8b315d1d4d67b284d7ac/frozenlist-1.8.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:09474e9831bc2b2199fad6da3c14c7b0fbdd377cce9d3d77131be28906cb7d84", size = 86912 }, + { url = "https://files.pythonhosted.org/packages/df/b5/7610b6bd13e4ae77b96ba85abea1c8cb249683217ef09ac9e0ae93f25a91/frozenlist-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:17c883ab0ab67200b5f964d2b9ed6b00971917d5d8a92df149dc2c9779208ee9", size = 50046 }, + { url = "https://files.pythonhosted.org/packages/6e/ef/0e8f1fe32f8a53dd26bdd1f9347efe0778b0fddf62789ea683f4cc7d787d/frozenlist-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fa47e444b8ba08fffd1c18e8cdb9a75db1b6a27f17507522834ad13ed5922b93", size = 50119 }, + { url = "https://files.pythonhosted.org/packages/11/b1/71a477adc7c36e5fb628245dfbdea2166feae310757dea848d02bd0689fd/frozenlist-1.8.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2552f44204b744fba866e573be4c1f9048d6a324dfe14475103fd51613eb1d1f", size = 231067 }, + { url = "https://files.pythonhosted.org/packages/45/7e/afe40eca3a2dc19b9904c0f5d7edfe82b5304cb831391edec0ac04af94c2/frozenlist-1.8.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:957e7c38f250991e48a9a73e6423db1bb9dd14e722a10f6b8bb8e16a0f55f695", size = 233160 }, + { url = "https://files.pythonhosted.org/packages/a6/aa/7416eac95603ce428679d273255ffc7c998d4132cfae200103f164b108aa/frozenlist-1.8.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:8585e3bb2cdea02fc88ffa245069c36555557ad3609e83be0ec71f54fd4abb52", size = 228544 }, + { url = "https://files.pythonhosted.org/packages/8b/3d/2a2d1f683d55ac7e3875e4263d28410063e738384d3adc294f5ff3d7105e/frozenlist-1.8.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:edee74874ce20a373d62dc28b0b18b93f645633c2943fd90ee9d898550770581", size = 243797 }, + { url = "https://files.pythonhosted.org/packages/78/1e/2d5565b589e580c296d3bb54da08d206e797d941a83a6fdea42af23be79c/frozenlist-1.8.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c9a63152fe95756b85f31186bddf42e4c02c6321207fd6601a1c89ebac4fe567", size = 247923 }, + { url = "https://files.pythonhosted.org/packages/aa/c3/65872fcf1d326a7f101ad4d86285c403c87be7d832b7470b77f6d2ed5ddc/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b6db2185db9be0a04fecf2f241c70b63b1a242e2805be291855078f2b404dd6b", size = 230886 }, + { url = "https://files.pythonhosted.org/packages/a0/76/ac9ced601d62f6956f03cc794f9e04c81719509f85255abf96e2510f4265/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:f4be2e3d8bc8aabd566f8d5b8ba7ecc09249d74ba3c9ed52e54dc23a293f0b92", size = 245731 }, + { url = "https://files.pythonhosted.org/packages/b9/49/ecccb5f2598daf0b4a1415497eba4c33c1e8ce07495eb07d2860c731b8d5/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c8d1634419f39ea6f5c427ea2f90ca85126b54b50837f31497f3bf38266e853d", size = 241544 }, + { url = "https://files.pythonhosted.org/packages/53/4b/ddf24113323c0bbcc54cb38c8b8916f1da7165e07b8e24a717b4a12cbf10/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:1a7fa382a4a223773ed64242dbe1c9c326ec09457e6b8428efb4118c685c3dfd", size = 241806 }, + { url = "https://files.pythonhosted.org/packages/a7/fb/9b9a084d73c67175484ba2789a59f8eebebd0827d186a8102005ce41e1ba/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:11847b53d722050808926e785df837353bd4d75f1d494377e59b23594d834967", size = 229382 }, + { url = "https://files.pythonhosted.org/packages/95/a3/c8fb25aac55bf5e12dae5c5aa6a98f85d436c1dc658f21c3ac73f9fa95e5/frozenlist-1.8.0-cp311-cp311-win32.whl", hash = "sha256:27c6e8077956cf73eadd514be8fb04d77fc946a7fe9f7fe167648b0b9085cc25", size = 39647 }, + { url = "https://files.pythonhosted.org/packages/0a/f5/603d0d6a02cfd4c8f2a095a54672b3cf967ad688a60fb9faf04fc4887f65/frozenlist-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:ac913f8403b36a2c8610bbfd25b8013488533e71e62b4b4adce9c86c8cea905b", size = 44064 }, + { url = "https://files.pythonhosted.org/packages/5d/16/c2c9ab44e181f043a86f9a8f84d5124b62dbcb3a02c0977ec72b9ac1d3e0/frozenlist-1.8.0-cp311-cp311-win_arm64.whl", hash = "sha256:d4d3214a0f8394edfa3e303136d0575eece0745ff2b47bd2cb2e66dd92d4351a", size = 39937 }, + { url = "https://files.pythonhosted.org/packages/69/29/948b9aa87e75820a38650af445d2ef2b6b8a6fab1a23b6bb9e4ef0be2d59/frozenlist-1.8.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:78f7b9e5d6f2fdb88cdde9440dc147259b62b9d3b019924def9f6478be254ac1", size = 87782 }, + { url = "https://files.pythonhosted.org/packages/64/80/4f6e318ee2a7c0750ed724fa33a4bdf1eacdc5a39a7a24e818a773cd91af/frozenlist-1.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:229bf37d2e4acdaf808fd3f06e854a4a7a3661e871b10dc1f8f1896a3b05f18b", size = 50594 }, + { url = "https://files.pythonhosted.org/packages/2b/94/5c8a2b50a496b11dd519f4a24cb5496cf125681dd99e94c604ccdea9419a/frozenlist-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f833670942247a14eafbb675458b4e61c82e002a148f49e68257b79296e865c4", size = 50448 }, + { url = "https://files.pythonhosted.org/packages/6a/bd/d91c5e39f490a49df14320f4e8c80161cfcce09f1e2cde1edd16a551abb3/frozenlist-1.8.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:494a5952b1c597ba44e0e78113a7266e656b9794eec897b19ead706bd7074383", size = 242411 }, + { url = "https://files.pythonhosted.org/packages/8f/83/f61505a05109ef3293dfb1ff594d13d64a2324ac3482be2cedc2be818256/frozenlist-1.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96f423a119f4777a4a056b66ce11527366a8bb92f54e541ade21f2374433f6d4", size = 243014 }, + { url = "https://files.pythonhosted.org/packages/d8/cb/cb6c7b0f7d4023ddda30cf56b8b17494eb3a79e3fda666bf735f63118b35/frozenlist-1.8.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3462dd9475af2025c31cc61be6652dfa25cbfb56cbbf52f4ccfe029f38decaf8", size = 234909 }, + { url = "https://files.pythonhosted.org/packages/31/c5/cd7a1f3b8b34af009fb17d4123c5a778b44ae2804e3ad6b86204255f9ec5/frozenlist-1.8.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4c800524c9cd9bac5166cd6f55285957fcfc907db323e193f2afcd4d9abd69b", size = 250049 }, + { url = "https://files.pythonhosted.org/packages/c0/01/2f95d3b416c584a1e7f0e1d6d31998c4a795f7544069ee2e0962a4b60740/frozenlist-1.8.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d6a5df73acd3399d893dafc71663ad22534b5aa4f94e8a2fabfe856c3c1b6a52", size = 256485 }, + { url = "https://files.pythonhosted.org/packages/ce/03/024bf7720b3abaebcff6d0793d73c154237b85bdf67b7ed55e5e9596dc9a/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:405e8fe955c2280ce66428b3ca55e12b3c4e9c336fb2103a4937e891c69a4a29", size = 237619 }, + { url = "https://files.pythonhosted.org/packages/69/fa/f8abdfe7d76b731f5d8bd217827cf6764d4f1d9763407e42717b4bed50a0/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:908bd3f6439f2fef9e85031b59fd4f1297af54415fb60e4254a95f75b3cab3f3", size = 250320 }, + { url = "https://files.pythonhosted.org/packages/f5/3c/b051329f718b463b22613e269ad72138cc256c540f78a6de89452803a47d/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:294e487f9ec720bd8ffcebc99d575f7eff3568a08a253d1ee1a0378754b74143", size = 246820 }, + { url = "https://files.pythonhosted.org/packages/0f/ae/58282e8f98e444b3f4dd42448ff36fa38bef29e40d40f330b22e7108f565/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:74c51543498289c0c43656701be6b077f4b265868fa7f8a8859c197006efb608", size = 250518 }, + { url = "https://files.pythonhosted.org/packages/8f/96/007e5944694d66123183845a106547a15944fbbb7154788cbf7272789536/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:776f352e8329135506a1d6bf16ac3f87bc25b28e765949282dcc627af36123aa", size = 239096 }, + { url = "https://files.pythonhosted.org/packages/66/bb/852b9d6db2fa40be96f29c0d1205c306288f0684df8fd26ca1951d461a56/frozenlist-1.8.0-cp312-cp312-win32.whl", hash = "sha256:433403ae80709741ce34038da08511d4a77062aa924baf411ef73d1146e74faf", size = 39985 }, + { url = "https://files.pythonhosted.org/packages/b8/af/38e51a553dd66eb064cdf193841f16f077585d4d28394c2fa6235cb41765/frozenlist-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:34187385b08f866104f0c0617404c8eb08165ab1272e884abc89c112e9c00746", size = 44591 }, + { url = "https://files.pythonhosted.org/packages/a7/06/1dc65480ab147339fecc70797e9c2f69d9cea9cf38934ce08df070fdb9cb/frozenlist-1.8.0-cp312-cp312-win_arm64.whl", hash = "sha256:fe3c58d2f5db5fbd18c2987cba06d51b0529f52bc3a6cdc33d3f4eab725104bd", size = 40102 }, + { url = "https://files.pythonhosted.org/packages/2d/40/0832c31a37d60f60ed79e9dfb5a92e1e2af4f40a16a29abcc7992af9edff/frozenlist-1.8.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8d92f1a84bb12d9e56f818b3a746f3efba93c1b63c8387a73dde655e1e42282a", size = 85717 }, + { url = "https://files.pythonhosted.org/packages/30/ba/b0b3de23f40bc55a7057bd38434e25c34fa48e17f20ee273bbde5e0650f3/frozenlist-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:96153e77a591c8adc2ee805756c61f59fef4cf4073a9275ee86fe8cba41241f7", size = 49651 }, + { url = "https://files.pythonhosted.org/packages/0c/ab/6e5080ee374f875296c4243c381bbdef97a9ac39c6e3ce1d5f7d42cb78d6/frozenlist-1.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f21f00a91358803399890ab167098c131ec2ddd5f8f5fd5fe9c9f2c6fcd91e40", size = 49417 }, + { url = "https://files.pythonhosted.org/packages/d5/4e/e4691508f9477ce67da2015d8c00acd751e6287739123113a9fca6f1604e/frozenlist-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fb30f9626572a76dfe4293c7194a09fb1fe93ba94c7d4f720dfae3b646b45027", size = 234391 }, + { url = "https://files.pythonhosted.org/packages/40/76/c202df58e3acdf12969a7895fd6f3bc016c642e6726aa63bd3025e0fc71c/frozenlist-1.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eaa352d7047a31d87dafcacbabe89df0aa506abb5b1b85a2fb91bc3faa02d822", size = 233048 }, + { url = "https://files.pythonhosted.org/packages/f9/c0/8746afb90f17b73ca5979c7a3958116e105ff796e718575175319b5bb4ce/frozenlist-1.8.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:03ae967b4e297f58f8c774c7eabcce57fe3c2434817d4385c50661845a058121", size = 226549 }, + { url = "https://files.pythonhosted.org/packages/7e/eb/4c7eefc718ff72f9b6c4893291abaae5fbc0c82226a32dcd8ef4f7a5dbef/frozenlist-1.8.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f6292f1de555ffcc675941d65fffffb0a5bcd992905015f85d0592201793e0e5", size = 239833 }, + { url = "https://files.pythonhosted.org/packages/c2/4e/e5c02187cf704224f8b21bee886f3d713ca379535f16893233b9d672ea71/frozenlist-1.8.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29548f9b5b5e3460ce7378144c3010363d8035cea44bc0bf02d57f5a685e084e", size = 245363 }, + { url = "https://files.pythonhosted.org/packages/1f/96/cb85ec608464472e82ad37a17f844889c36100eed57bea094518bf270692/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ec3cc8c5d4084591b4237c0a272cc4f50a5b03396a47d9caaf76f5d7b38a4f11", size = 229314 }, + { url = "https://files.pythonhosted.org/packages/5d/6f/4ae69c550e4cee66b57887daeebe006fe985917c01d0fff9caab9883f6d0/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:517279f58009d0b1f2e7c1b130b377a349405da3f7621ed6bfae50b10adf20c1", size = 243365 }, + { url = "https://files.pythonhosted.org/packages/7a/58/afd56de246cf11780a40a2c28dc7cbabbf06337cc8ddb1c780a2d97e88d8/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:db1e72ede2d0d7ccb213f218df6a078a9c09a7de257c2fe8fcef16d5925230b1", size = 237763 }, + { url = "https://files.pythonhosted.org/packages/cb/36/cdfaf6ed42e2644740d4a10452d8e97fa1c062e2a8006e4b09f1b5fd7d63/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b4dec9482a65c54a5044486847b8a66bf10c9cb4926d42927ec4e8fd5db7fed8", size = 240110 }, + { url = "https://files.pythonhosted.org/packages/03/a8/9ea226fbefad669f11b52e864c55f0bd57d3c8d7eb07e9f2e9a0b39502e1/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:21900c48ae04d13d416f0e1e0c4d81f7931f73a9dfa0b7a8746fb2fe7dd970ed", size = 233717 }, + { url = "https://files.pythonhosted.org/packages/1e/0b/1b5531611e83ba7d13ccc9988967ea1b51186af64c42b7a7af465dcc9568/frozenlist-1.8.0-cp313-cp313-win32.whl", hash = "sha256:8b7b94a067d1c504ee0b16def57ad5738701e4ba10cec90529f13fa03c833496", size = 39628 }, + { url = "https://files.pythonhosted.org/packages/d8/cf/174c91dbc9cc49bc7b7aab74d8b734e974d1faa8f191c74af9b7e80848e6/frozenlist-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:878be833caa6a3821caf85eb39c5ba92d28e85df26d57afb06b35b2efd937231", size = 43882 }, + { url = "https://files.pythonhosted.org/packages/c1/17/502cd212cbfa96eb1388614fe39a3fc9ab87dbbe042b66f97acb57474834/frozenlist-1.8.0-cp313-cp313-win_arm64.whl", hash = "sha256:44389d135b3ff43ba8cc89ff7f51f5a0bb6b63d829c8300f79a2fe4fe61bcc62", size = 39676 }, + { url = "https://files.pythonhosted.org/packages/d2/5c/3bbfaa920dfab09e76946a5d2833a7cbdf7b9b4a91c714666ac4855b88b4/frozenlist-1.8.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:e25ac20a2ef37e91c1b39938b591457666a0fa835c7783c3a8f33ea42870db94", size = 89235 }, + { url = "https://files.pythonhosted.org/packages/d2/d6/f03961ef72166cec1687e84e8925838442b615bd0b8854b54923ce5b7b8a/frozenlist-1.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:07cdca25a91a4386d2e76ad992916a85038a9b97561bf7a3fd12d5d9ce31870c", size = 50742 }, + { url = "https://files.pythonhosted.org/packages/1e/bb/a6d12b7ba4c3337667d0e421f7181c82dda448ce4e7ad7ecd249a16fa806/frozenlist-1.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4e0c11f2cc6717e0a741f84a527c52616140741cd812a50422f83dc31749fb52", size = 51725 }, + { url = "https://files.pythonhosted.org/packages/bc/71/d1fed0ffe2c2ccd70b43714c6cab0f4188f09f8a67a7914a6b46ee30f274/frozenlist-1.8.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b3210649ee28062ea6099cfda39e147fa1bc039583c8ee4481cb7811e2448c51", size = 284533 }, + { url = "https://files.pythonhosted.org/packages/c9/1f/fb1685a7b009d89f9bf78a42d94461bc06581f6e718c39344754a5d9bada/frozenlist-1.8.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:581ef5194c48035a7de2aefc72ac6539823bb71508189e5de01d60c9dcd5fa65", size = 292506 }, + { url = "https://files.pythonhosted.org/packages/e6/3b/b991fe1612703f7e0d05c0cf734c1b77aaf7c7d321df4572e8d36e7048c8/frozenlist-1.8.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3ef2d026f16a2b1866e1d86fc4e1291e1ed8a387b2c333809419a2f8b3a77b82", size = 274161 }, + { url = "https://files.pythonhosted.org/packages/ca/ec/c5c618767bcdf66e88945ec0157d7f6c4a1322f1473392319b7a2501ded7/frozenlist-1.8.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5500ef82073f599ac84d888e3a8c1f77ac831183244bfd7f11eaa0289fb30714", size = 294676 }, + { url = "https://files.pythonhosted.org/packages/7c/ce/3934758637d8f8a88d11f0585d6495ef54b2044ed6ec84492a91fa3b27aa/frozenlist-1.8.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:50066c3997d0091c411a66e710f4e11752251e6d2d73d70d8d5d4c76442a199d", size = 300638 }, + { url = "https://files.pythonhosted.org/packages/fc/4f/a7e4d0d467298f42de4b41cbc7ddaf19d3cfeabaf9ff97c20c6c7ee409f9/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5c1c8e78426e59b3f8005e9b19f6ff46e5845895adbde20ece9218319eca6506", size = 283067 }, + { url = "https://files.pythonhosted.org/packages/dc/48/c7b163063d55a83772b268e6d1affb960771b0e203b632cfe09522d67ea5/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:eefdba20de0d938cec6a89bd4d70f346a03108a19b9df4248d3cf0d88f1b0f51", size = 292101 }, + { url = "https://files.pythonhosted.org/packages/9f/d0/2366d3c4ecdc2fd391e0afa6e11500bfba0ea772764d631bbf82f0136c9d/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:cf253e0e1c3ceb4aaff6df637ce033ff6535fb8c70a764a8f46aafd3d6ab798e", size = 289901 }, + { url = "https://files.pythonhosted.org/packages/b8/94/daff920e82c1b70e3618a2ac39fbc01ae3e2ff6124e80739ce5d71c9b920/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:032efa2674356903cd0261c4317a561a6850f3ac864a63fc1583147fb05a79b0", size = 289395 }, + { url = "https://files.pythonhosted.org/packages/e3/20/bba307ab4235a09fdcd3cc5508dbabd17c4634a1af4b96e0f69bfe551ebd/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6da155091429aeba16851ecb10a9104a108bcd32f6c1642867eadaee401c1c41", size = 283659 }, + { url = "https://files.pythonhosted.org/packages/fd/00/04ca1c3a7a124b6de4f8a9a17cc2fcad138b4608e7a3fc5877804b8715d7/frozenlist-1.8.0-cp313-cp313t-win32.whl", hash = "sha256:0f96534f8bfebc1a394209427d0f8a63d343c9779cda6fc25e8e121b5fd8555b", size = 43492 }, + { url = "https://files.pythonhosted.org/packages/59/5e/c69f733a86a94ab10f68e496dc6b7e8bc078ebb415281d5698313e3af3a1/frozenlist-1.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5d63a068f978fc69421fb0e6eb91a9603187527c86b7cd3f534a5b77a592b888", size = 48034 }, + { url = "https://files.pythonhosted.org/packages/16/6c/be9d79775d8abe79b05fa6d23da99ad6e7763a1d080fbae7290b286093fd/frozenlist-1.8.0-cp313-cp313t-win_arm64.whl", hash = "sha256:bf0a7e10b077bf5fb9380ad3ae8ce20ef919a6ad93b4552896419ac7e1d8e042", size = 41749 }, + { url = "https://files.pythonhosted.org/packages/f1/c8/85da824b7e7b9b6e7f7705b2ecaf9591ba6f79c1177f324c2735e41d36a2/frozenlist-1.8.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:cee686f1f4cadeb2136007ddedd0aaf928ab95216e7691c63e50a8ec066336d0", size = 86127 }, + { url = "https://files.pythonhosted.org/packages/8e/e8/a1185e236ec66c20afd72399522f142c3724c785789255202d27ae992818/frozenlist-1.8.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:119fb2a1bd47307e899c2fac7f28e85b9a543864df47aa7ec9d3c1b4545f096f", size = 49698 }, + { url = "https://files.pythonhosted.org/packages/a1/93/72b1736d68f03fda5fdf0f2180fb6caaae3894f1b854d006ac61ecc727ee/frozenlist-1.8.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4970ece02dbc8c3a92fcc5228e36a3e933a01a999f7094ff7c23fbd2beeaa67c", size = 49749 }, + { url = "https://files.pythonhosted.org/packages/a7/b2/fabede9fafd976b991e9f1b9c8c873ed86f202889b864756f240ce6dd855/frozenlist-1.8.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:cba69cb73723c3f329622e34bdbf5ce1f80c21c290ff04256cff1cd3c2036ed2", size = 231298 }, + { url = "https://files.pythonhosted.org/packages/3a/3b/d9b1e0b0eed36e70477ffb8360c49c85c8ca8ef9700a4e6711f39a6e8b45/frozenlist-1.8.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:778a11b15673f6f1df23d9586f83c4846c471a8af693a22e066508b77d201ec8", size = 232015 }, + { url = "https://files.pythonhosted.org/packages/dc/94/be719d2766c1138148564a3960fc2c06eb688da592bdc25adcf856101be7/frozenlist-1.8.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0325024fe97f94c41c08872db482cf8ac4800d80e79222c6b0b7b162d5b13686", size = 225038 }, + { url = "https://files.pythonhosted.org/packages/e4/09/6712b6c5465f083f52f50cf74167b92d4ea2f50e46a9eea0523d658454ae/frozenlist-1.8.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:97260ff46b207a82a7567b581ab4190bd4dfa09f4db8a8b49d1a958f6aa4940e", size = 240130 }, + { url = "https://files.pythonhosted.org/packages/f8/d4/cd065cdcf21550b54f3ce6a22e143ac9e4836ca42a0de1022da8498eac89/frozenlist-1.8.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:54b2077180eb7f83dd52c40b2750d0a9f175e06a42e3213ce047219de902717a", size = 242845 }, + { url = "https://files.pythonhosted.org/packages/62/c3/f57a5c8c70cd1ead3d5d5f776f89d33110b1addae0ab010ad774d9a44fb9/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2f05983daecab868a31e1da44462873306d3cbfd76d1f0b5b69c473d21dbb128", size = 229131 }, + { url = "https://files.pythonhosted.org/packages/6c/52/232476fe9cb64f0742f3fde2b7d26c1dac18b6d62071c74d4ded55e0ef94/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:33f48f51a446114bc5d251fb2954ab0164d5be02ad3382abcbfe07e2531d650f", size = 240542 }, + { url = "https://files.pythonhosted.org/packages/5f/85/07bf3f5d0fb5414aee5f47d33c6f5c77bfe49aac680bfece33d4fdf6a246/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:154e55ec0655291b5dd1b8731c637ecdb50975a2ae70c606d100750a540082f7", size = 237308 }, + { url = "https://files.pythonhosted.org/packages/11/99/ae3a33d5befd41ac0ca2cc7fd3aa707c9c324de2e89db0e0f45db9a64c26/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:4314debad13beb564b708b4a496020e5306c7333fa9a3ab90374169a20ffab30", size = 238210 }, + { url = "https://files.pythonhosted.org/packages/b2/60/b1d2da22f4970e7a155f0adde9b1435712ece01b3cd45ba63702aea33938/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:073f8bf8becba60aa931eb3bc420b217bb7d5b8f4750e6f8b3be7f3da85d38b7", size = 231972 }, + { url = "https://files.pythonhosted.org/packages/3f/ab/945b2f32de889993b9c9133216c068b7fcf257d8595a0ac420ac8677cab0/frozenlist-1.8.0-cp314-cp314-win32.whl", hash = "sha256:bac9c42ba2ac65ddc115d930c78d24ab8d4f465fd3fc473cdedfccadb9429806", size = 40536 }, + { url = "https://files.pythonhosted.org/packages/59/ad/9caa9b9c836d9ad6f067157a531ac48b7d36499f5036d4141ce78c230b1b/frozenlist-1.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:3e0761f4d1a44f1d1a47996511752cf3dcec5bbdd9cc2b4fe595caf97754b7a0", size = 44330 }, + { url = "https://files.pythonhosted.org/packages/82/13/e6950121764f2676f43534c555249f57030150260aee9dcf7d64efda11dd/frozenlist-1.8.0-cp314-cp314-win_arm64.whl", hash = "sha256:d1eaff1d00c7751b7c6662e9c5ba6eb2c17a2306ba5e2a37f24ddf3cc953402b", size = 40627 }, + { url = "https://files.pythonhosted.org/packages/c0/c7/43200656ecc4e02d3f8bc248df68256cd9572b3f0017f0a0c4e93440ae23/frozenlist-1.8.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:d3bb933317c52d7ea5004a1c442eef86f426886fba134ef8cf4226ea6ee1821d", size = 89238 }, + { url = "https://files.pythonhosted.org/packages/d1/29/55c5f0689b9c0fb765055629f472c0de484dcaf0acee2f7707266ae3583c/frozenlist-1.8.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:8009897cdef112072f93a0efdce29cd819e717fd2f649ee3016efd3cd885a7ed", size = 50738 }, + { url = "https://files.pythonhosted.org/packages/ba/7d/b7282a445956506fa11da8c2db7d276adcbf2b17d8bb8407a47685263f90/frozenlist-1.8.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2c5dcbbc55383e5883246d11fd179782a9d07a986c40f49abe89ddf865913930", size = 51739 }, + { url = "https://files.pythonhosted.org/packages/62/1c/3d8622e60d0b767a5510d1d3cf21065b9db874696a51ea6d7a43180a259c/frozenlist-1.8.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:39ecbc32f1390387d2aa4f5a995e465e9e2f79ba3adcac92d68e3e0afae6657c", size = 284186 }, + { url = "https://files.pythonhosted.org/packages/2d/14/aa36d5f85a89679a85a1d44cd7a6657e0b1c75f61e7cad987b203d2daca8/frozenlist-1.8.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92db2bf818d5cc8d9c1f1fc56b897662e24ea5adb36ad1f1d82875bd64e03c24", size = 292196 }, + { url = "https://files.pythonhosted.org/packages/05/23/6bde59eb55abd407d34f77d39a5126fb7b4f109a3f611d3929f14b700c66/frozenlist-1.8.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2dc43a022e555de94c3b68a4ef0b11c4f747d12c024a520c7101709a2144fb37", size = 273830 }, + { url = "https://files.pythonhosted.org/packages/d2/3f/22cff331bfad7a8afa616289000ba793347fcd7bc275f3b28ecea2a27909/frozenlist-1.8.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cb89a7f2de3602cfed448095bab3f178399646ab7c61454315089787df07733a", size = 294289 }, + { url = "https://files.pythonhosted.org/packages/a4/89/5b057c799de4838b6c69aa82b79705f2027615e01be996d2486a69ca99c4/frozenlist-1.8.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:33139dc858c580ea50e7e60a1b0ea003efa1fd42e6ec7fdbad78fff65fad2fd2", size = 300318 }, + { url = "https://files.pythonhosted.org/packages/30/de/2c22ab3eb2a8af6d69dc799e48455813bab3690c760de58e1bf43b36da3e/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:168c0969a329b416119507ba30b9ea13688fafffac1b7822802537569a1cb0ef", size = 282814 }, + { url = "https://files.pythonhosted.org/packages/59/f7/970141a6a8dbd7f556d94977858cfb36fa9b66e0892c6dd780d2219d8cd8/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:28bd570e8e189d7f7b001966435f9dac6718324b5be2990ac496cf1ea9ddb7fe", size = 291762 }, + { url = "https://files.pythonhosted.org/packages/c1/15/ca1adae83a719f82df9116d66f5bb28bb95557b3951903d39135620ef157/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b2a095d45c5d46e5e79ba1e5b9cb787f541a8dee0433836cea4b96a2c439dcd8", size = 289470 }, + { url = "https://files.pythonhosted.org/packages/ac/83/dca6dc53bf657d371fbc88ddeb21b79891e747189c5de990b9dfff2ccba1/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:eab8145831a0d56ec9c4139b6c3e594c7a83c2c8be25d5bcf2d86136a532287a", size = 289042 }, + { url = "https://files.pythonhosted.org/packages/96/52/abddd34ca99be142f354398700536c5bd315880ed0a213812bc491cff5e4/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:974b28cf63cc99dfb2188d8d222bc6843656188164848c4f679e63dae4b0708e", size = 283148 }, + { url = "https://files.pythonhosted.org/packages/af/d3/76bd4ed4317e7119c2b7f57c3f6934aba26d277acc6309f873341640e21f/frozenlist-1.8.0-cp314-cp314t-win32.whl", hash = "sha256:342c97bf697ac5480c0a7ec73cd700ecfa5a8a40ac923bd035484616efecc2df", size = 44676 }, + { url = "https://files.pythonhosted.org/packages/89/76/c615883b7b521ead2944bb3480398cbb07e12b7b4e4d073d3752eb721558/frozenlist-1.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:06be8f67f39c8b1dc671f5d83aaefd3358ae5cdcf8314552c57e7ed3e6475bdd", size = 49451 }, + { url = "https://files.pythonhosted.org/packages/e0/a3/5982da14e113d07b325230f95060e2169f5311b1017ea8af2a29b374c289/frozenlist-1.8.0-cp314-cp314t-win_arm64.whl", hash = "sha256:102e6314ca4da683dca92e3b1355490fed5f313b768500084fbe6371fddfdb79", size = 42507 }, + { url = "https://files.pythonhosted.org/packages/9a/9a/e35b4a917281c0b8419d4207f4334c8e8c5dbf4f3f5f9ada73958d937dcc/frozenlist-1.8.0-py3-none-any.whl", hash = "sha256:0c18a16eab41e82c295618a77502e17b195883241c563b00f0aa5106fc4eaa0d", size = 13409 }, +] + [[package]] name = "fsspec" version = "2026.6.0" @@ -923,11 +1270,11 @@ wheels = [ [[package]] name = "h11" -version = "0.12.0" +version = "0.16.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bd/e9/72c3dc8f7dd7874812be6a6ec788ba1300bfe31570963a7e788c86280cb9/h11-0.12.0.tar.gz", hash = "sha256:47222cb6067e4a307d535814917cd98fd0a57b6788ce715755fa2b6c28b56042", size = 98121 } +sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250 } wheels = [ - { url = "https://files.pythonhosted.org/packages/60/0f/7a0eeea938eaf61074f29fed9717f2010e8d0e0905d36b38d3275a1e4622/h11-0.12.0-py3-none-any.whl", hash = "sha256:36a3cb8c0a032f56e2da7084577878a035d3b61d104230d4bd49c0c6b555a9c6", size = 54857 }, + { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515 }, ] [[package]] @@ -956,32 +1303,30 @@ wheels = [ [[package]] name = "httpcore" -version = "0.15.0" +version = "1.0.9" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "anyio" }, { name = "certifi" }, { name = "h11" }, - { name = "sniffio" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/42/98/44c3e51a0655eae75adefee028c9bada7427a90f63105e54f5e735946f50/httpcore-0.15.0.tar.gz", hash = "sha256:18b68ab86a3ccf3e7dc0f43598eaddcf472b602aba29f9aa6ab85fe2ada3980b", size = 53669 } +sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ad/b9/260603ca0913072a10a4367c2dca9998706812a8c1f4558eca510f85ae16/httpcore-0.15.0-py3-none-any.whl", hash = "sha256:1105b8b73c025f23ff7c36468e4432226cbb959176eab66864b8e31c4ee27fa6", size = 68449 }, + { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784 }, ] [[package]] name = "httpx" -version = "0.23.0" +version = "0.28.1" source = { registry = "https://pypi.org/simple" } dependencies = [ + { name = "anyio" }, { name = "certifi" }, { name = "httpcore" }, - { name = "rfc3986", extra = ["idna2008"] }, - { name = "sniffio" }, + { name = "idna" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/43/cd/677173d194b4839e5b196709e3819ffca2a4bc58b0538f4ae4be877ad480/httpx-0.23.0.tar.gz", hash = "sha256:f28eac771ec9eb4866d3fb4ab65abd42d38c424739e80c08d8d20570de60b0ef", size = 108102 } +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406 } wheels = [ - { url = "https://files.pythonhosted.org/packages/e9/fd/d8ff4bbf7ade1c9d60b53bf8234b44dcb2a9fcc7ae6933ae80ba38582f3e/httpx-0.23.0-py3-none-any.whl", hash = "sha256:42974f577483e1e932c3cdc3cd2303e883cbfba17fe228b0f63589764d7b9c4b", size = 84847 }, + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517 }, ] [[package]] @@ -1036,6 +1381,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/49/fa/391e437a34e55095173dca5f24070d89cbc233ff85bf1c29c93248c6588d/imageio-2.37.3-py3-none-any.whl", hash = "sha256:46f5bb8522cd421c0f5ae104d8268f569d856b29eb1a13b92829d1970f32c9f0", size = 317646 }, ] +[[package]] +name = "importlib-metadata" +version = "8.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "zipp" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e7/72/c600ae4f68c28fc19f9c31b9403053e5dbb8cace2e6842c7b7c3e4d42fe9/importlib_metadata-8.9.0.tar.gz", hash = "sha256:58850626cef4bd2df100378b0f2aea9724a7b92f10770d547725b047078f99ee", size = 56140 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7d/f9/97f2ca8bb3ec6e4b1d64f983ebe98b9a192faddff67fac3d6303a537e670/importlib_metadata-8.9.0-py3-none-any.whl", hash = "sha256:e0f761b6ea91ced3b0844c14c9d955224d538105921f8e6754c00f6ca79fba7f", size = 27220 }, +] + [[package]] name = "iniconfig" version = "2.3.0" @@ -1068,6 +1425,92 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899 }, ] +[[package]] +name = "jiter" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/1f/10936e16d8860c70698a1aa939a46aa0224813b782bce4e000e637da0b2d/jiter-0.16.0.tar.gz", hash = "sha256:7b24c3492c5f4f84a37946ad9cf504910cf6a782d6a4e0689b6673c5894b4a1c", size = 176431 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4e/3f/fae6cc967d120ec89e31c5418a51176d8278b3087fbb384a9176754f353c/jiter-0.16.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:67fddeda1688f0cce2d2ae83ccf8a80f79936f2d2997d6cc2261f82fdb54a4d3", size = 309289 }, + { url = "https://files.pythonhosted.org/packages/c8/e3/97c6c3562c077f6247d6e6ce5c82562500b6316c0d928e97e106b7a1321a/jiter-0.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c90c0f63df322be920eda6ce622e3083d8906ba267f8220fe7873213b8b4430e", size = 315181 }, + { url = "https://files.pythonhosted.org/packages/7b/89/d8d073f8aa2667e46c6c0873f86fe4a512bba4293cc730f626a076211a62/jiter-0.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64c0203212098470032aabcde9356fc168f377aade3e43def61dfe17e92f2037", size = 340939 }, + { url = "https://files.pythonhosted.org/packages/87/c9/db4fda3ed73fb864139305e935e5b8b38a5a24692a5a9dd356c22f1b9c8d/jiter-0.16.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:12288303c9844e61e1651d02a9a6f6633e47d39f897d6991d1427161ce6b746e", size = 364932 }, + { url = "https://files.pythonhosted.org/packages/a2/74/52b5e86241057f52ddd7c9a580f90effb51f9d06239f6fc612279b91a838/jiter-0.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cf109d010b4b05a105afb3d43be36a21322d345ad3111e13d15f680afef0e5b", size = 461132 }, + { url = "https://files.pythonhosted.org/packages/a9/87/544a700f7447c1f31c5d7833821a4daa5683165c2d5a094fbf5b5800c3dc/jiter-0.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:62c1b7fe1f77925acf5af68b6140b8810fa87dfd4dc0a9c8568ec2fa2a10429c", size = 374857 }, + { url = "https://files.pythonhosted.org/packages/40/cd/0fcc3f7d39183674d5bfa9ec640faaeb506c60be7c8f94625dfba366e37c/jiter-0.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8597d23c87f59294f83bcb6229b9ed1fccee13dbba967b46930d2f1759466fee", size = 347053 }, + { url = "https://files.pythonhosted.org/packages/5c/ae/c7e64e7932ad597fa395b61440b249ada6366716e25c6e08dd2afbd021e6/jiter-0.16.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:3126a5dbad56401989ac769aca0cb56005bfb3e2366eea0ca99d1a91c3c1ee03", size = 356153 }, + { url = "https://files.pythonhosted.org/packages/d4/1c/1c719044f14da814e1a060191ab19b96f3e99207bc5b4bfc6d6be34b3f80/jiter-0.16.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c4b4717bdb35ae456f831a6b08d01880fff399887a6bbc526a583a406e484eea", size = 393956 }, + { url = "https://files.pythonhosted.org/packages/3b/dc/7b2f303a2847207e265503853a2d964a55354cffd62a5f2936c155486798/jiter-0.16.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:adff21bc78edfe086c15eb495b900306076de378dc2337c132401fc39bd79c91", size = 521081 }, + { url = "https://files.pythonhosted.org/packages/c2/5f/501cf6e1e09caeb420195179ffc6f62aca603f1220ec53fd80d0d70b3e56/jiter-0.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dab907db06fc593645e73109acf4581ba5b548897d28b9348dc41ddc8343b2d3", size = 552085 }, + { url = "https://files.pythonhosted.org/packages/79/54/aa5be86520113b79455c3877f3d1f07a348098df4083ba3688e9537e52dd/jiter-0.16.0-cp311-cp311-win32.whl", hash = "sha256:560b2cf3fb03240cd34f27409a238547488708f05b7c3924f571a60422251ec7", size = 206755 }, + { url = "https://files.pythonhosted.org/packages/64/ec/2feb893eb330bd69b413866f4d5daada33c3962f1c6f270c91ca2d87fdf9/jiter-0.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:e431cfc9caf44c1d5459ff77d4e64cbf85fddb6a35dad836a15c6a9ec23087c1", size = 199155 }, + { url = "https://files.pythonhosted.org/packages/b9/9c/ca040d94415048a3666fc237774df8151c96f8d2b661cbe3b184acc95876/jiter-0.16.0-cp311-cp311-win_arm64.whl", hash = "sha256:2a8e9e39cf083016137aa5cadafe3188adc2ba6ba1fbf1e5d18889ad3e9ad056", size = 194403 }, + { url = "https://files.pythonhosted.org/packages/83/2b/52ace16ed031354f0539749a49e4bf33797d82bea5137910835fa4b09793/jiter-0.16.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:67c3bc1760f8c99d805dcab4e644027142a53b1d5d861f18780ebdbd5d40b72a", size = 306943 }, + { url = "https://files.pythonhosted.org/packages/94/2e/34957c2c1b661c252ba9bcc60ae0bddc27e0f7202c6073326a13c5390eec/jiter-0.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5af7780e4a26bd7d0d989592bf9ef12ebf806b74ab709223ecca37c749872ea9", size = 307779 }, + { url = "https://files.pythonhosted.org/packages/88/6c/59bd309cab4460c54cf1079f3eb7fe7af6a4c895c5c957a53378693bad2b/jiter-0.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5bf78d0e05e45cfdd66558893938d59afe3d1b1a824a202039b20e607d25a72", size = 335826 }, + { url = "https://files.pythonhosted.org/packages/3b/8c/f5ef7b65f0df47afa16596969defb281ebb86e96df346d62be6fd853d620/jiter-0.16.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f4444a83f946605990c98f625cdd3d2725bfb818158760c5748c653170a20e0e", size = 362573 }, + { url = "https://files.pythonhosted.org/packages/2b/0b/ace4354da061ee38844a0c27dc2c21eecd27aea119e8da324bea987522d0/jiter-0.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3a23f0e4f957e1be65752d2dfac9a5a06b1917af8dc85deb639c3b9d02e31290", size = 457979 }, + { url = "https://files.pythonhosted.org/packages/55/40/c0253d3772eb9dcd8e6606ee9b2d53ec8e5b814589c47f140aa585f21eaa/jiter-0.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c22a488f7b9218e245a0025a9ba6b100e2e54700831cf4cf16833a27fba3ad01", size = 372302 }, + { url = "https://files.pythonhosted.org/packages/a8/d2/4839422241aa12860ce597b20068727094ba0bc480723c74924ca5bad483/jiter-0.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46add52f4ad47a08bfb1219f3e673da972191489a33016edefdb5ea55bfa8c48", size = 343805 }, + { url = "https://files.pythonhosted.org/packages/e2/59/e196888a05befdda7dbe299b722d56f2f6eec65402bc34c0a3306d595feb/jiter-0.16.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:9c8a956fd72c2cf1e730d01ea080341f13aa0a97a4a33b51abebe725b7ae9ca9", size = 351107 }, + { url = "https://files.pythonhosted.org/packages/ec/74/4cd9e0fca65232136400354b630fbfcd2de634e22ccbb96567725981b548/jiter-0.16.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:561926e0573ffe4a32498420a76d64b16c513e1ab413b9d28158a8764ac701e5", size = 388441 }, + { url = "https://files.pythonhosted.org/packages/d9/8c/554691e48bc711299c0a293dd8a6179e24b2d66a54dc295421fcf64569c0/jiter-0.16.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:44d019fa8cdaf89bf29c71b39e3712143fdd0ac76725c6ef954f9957a5ea8730", size = 516354 }, + { url = "https://files.pythonhosted.org/packages/a4/cb/01e9d69dc2cc6759d4f91e230b34489c4fdb2518992650633f9e20bece89/jiter-0.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0df91907609837f33341b8e6fe73b95991fdaa57caf1a0fbd343dffe826f386f", size = 547880 }, + { url = "https://files.pythonhosted.org/packages/79/70/2953195f1c6ad00f49fa67e13df7e60acb3dd4f387101bc15abccddd905e/jiter-0.16.0-cp312-cp312-win32.whl", hash = "sha256:51d7b836acb0108d7c77df1742332cac2a1fa04a74d6dacec46e7091f0e91274", size = 203473 }, + { url = "https://files.pythonhosted.org/packages/2d/05/2909a8b10699a4d560f8c502b6b2c5f3991b682b1922c1eedda242b225bd/jiter-0.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:1878349266f8ee36ecb1375cc5ba2f115f35fd9f0a1a4119e725e379126647f7", size = 196905 }, + { url = "https://files.pythonhosted.org/packages/e9/a9/6b82bb1c8d7790d602489b967b982a909e5d092875a6c2ade96444c8dfc5/jiter-0.16.0-cp312-cp312-win_arm64.whl", hash = "sha256:2ed5738ae4af18271a51a528b8811b0cbfa4a1858de9d83359e4169855d6a331", size = 190618 }, + { url = "https://files.pythonhosted.org/packages/91/c0/555fc60473d30d66894ba825e63615e3be7524fac23858356afa7a38906c/jiter-0.16.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:41977aa5654023948c2dae2a81cbf9c43343954bef1cd59a154dd15a4d84c195", size = 306203 }, + { url = "https://files.pythonhosted.org/packages/d0/2b/c3eaf16f5d7c9bad66ea32f40a95bd169b29a91217fcc7f081375157e99c/jiter-0.16.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d28bb3c26762358dadf3e5bf0bccd29ae987d65e6988d2e6f49829c76b003c09", size = 306489 }, + { url = "https://files.pythonhosted.org/packages/96/3f/02fdfc6705cad96127d883af5c34e4867f554f29ec7705ec1a46156400a9/jiter-0.16.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0542a7189c26920778658fc8fcf2af8bae05bae9924577f71804acef37996536", size = 335453 }, + { url = "https://files.pythonhosted.org/packages/b2/a6/e4bda5920d4b0d7c5dfb7174ce4a6b2e4d3e11c9162c452ef0eab4cdbdbd/jiter-0.16.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8fb8de1e23a0cb2a7f53c335049c7b72b6db41aa6227cdcc0972a1de5cb39450", size = 361625 }, + { url = "https://files.pythonhosted.org/packages/b7/97/4e6b59b2c6e55cbb3e183595f81ad65dcfb21c915fee5e19e335df21bc55/jiter-0.16.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b72d0b2990ca754a9102779ac98d8597b7cb31678958562214a007f909eab78e", size = 456958 }, + { url = "https://files.pythonhosted.org/packages/15/e0/97e9557686d2f94f4b93786eccb7eed28e9228ad132ea8237f44727314a7/jiter-0.16.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5f91b1c27fc22a57993d5a5cb8a627cb8ed4b10502716fac1ffbfe1d19d84e8", size = 372017 }, + { url = "https://files.pythonhosted.org/packages/0f/94/db768b6938e0df35c86beeba3dfbbb025c9ee5c19e1aa271f2396e50864d/jiter-0.16.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c682bea068a90b764577bdb78a60a4c1d1606daf9cd4c893832a37c7cc9d9026", size = 343320 }, + { url = "https://files.pythonhosted.org/packages/c1/d6/5a59d938244a30735fe62d9433fd325f9021ea29d89780ea4596ea93bc89/jiter-0.16.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:8d031aabecc4f1b6276adfb42e3aabb77c89d468bf616600e8d3a11328929053", size = 350520 }, + { url = "https://files.pythonhosted.org/packages/67/f8/c4a857f49c9af125f6bbcac7e3eee7f7978ed89682833062e2dbf62576b1/jiter-0.16.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:eab2cd170150e70153de16896a1774e3a1dca80154c56b54d7a812c479a7165e", size = 387550 }, + { url = "https://files.pythonhosted.org/packages/8b/d6/5fbc2f7d6b67b754caa61a993a2e626e815dec47ffc2f9e35f01adfebec7/jiter-0.16.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:6edb63a46e65a82c26800a868e49b2cac30dd5a4218b88d74bc2c848c8ad60bb", size = 515424 }, + { url = "https://files.pythonhosted.org/packages/ed/54/284f0164b64a5fed915fea6ba7e9ba9b3d8d37c67d59cf2e3bb99d45cdfe/jiter-0.16.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:659039cc50b5addcc35fcc87ae2c1833b7c0a8e5326ef631a75e4478447bcf84", size = 546981 }, + { url = "https://files.pythonhosted.org/packages/13/c5/2a467585a576594384e1d2c43e1224deaafc085f24e243529cf98beef8e1/jiter-0.16.0-cp313-cp313-win32.whl", hash = "sha256:c9c53be232c2e206ef9cdbad81a48bfa74c3d3f08bcf8124630a8a748aad993e", size = 202853 }, + { url = "https://files.pythonhosted.org/packages/88/6a/de61d04b9eec69c71719968d2f716532a3bc121170c44a39e14979c6be81/jiter-0.16.0-cp313-cp313-win_amd64.whl", hash = "sha256:baad945ed47f163ad833314f8e3288c396118934f94e7bbb9e243ce4b341a4fd", size = 196160 }, + { url = "https://files.pythonhosted.org/packages/19/4b/b390ed59bafb3f31d008d1218578f10327714484b334439947f7e5b11e7f/jiter-0.16.0-cp313-cp313-win_arm64.whl", hash = "sha256:3c1fd2dbe1b0af19e987f03fe66c5f5bd105a2229c1aff4ab14890b24f41d21a", size = 189862 }, + { url = "https://files.pythonhosted.org/packages/a7/89/bc4f1b57d5da938fd344a466396541e586d161320d70bffd929aaafcd8f4/jiter-0.16.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:b2c61484666ad42726029af0c00ef4541f0f3b5cdc550221f56c2343208018ee", size = 308239 }, + { url = "https://files.pythonhosted.org/packages/65/7a/c415453e5213001bf3b411ff65dec3d303b0e76a4a2cfea9768cd4960994/jiter-0.16.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:63efadc657488f45db1c676d81e704cac2abf3fdb892def1faea61db053127e2", size = 308928 }, + { url = "https://files.pythonhosted.org/packages/11/fc/1f4fb7ebf9a724c7741994f4aae18fba1e2f3133df14521a79194952c34a/jiter-0.16.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf0d73f50e7b6935677854f6e8e31d499ca7064dd24734f703e060f5b237d883", size = 336998 }, + { url = "https://files.pythonhosted.org/packages/a0/8d/72cadaac05ccfa7cc3a0a2232862e6c72443ca40cf300ba8b57f9f18b69b/jiter-0.16.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bf3ea07d9bc8e7d03a9fbc051295462e6dbc295b894fd72457c3136e3e43d898", size = 362112 }, + { url = "https://files.pythonhosted.org/packages/58/4a/c4b0d5f651fda90a24ffce9f8d56cde462a2e09d31ae3de3c68cef34c04e/jiter-0.16.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:26798522707abb47d767db536e4148ceac1b14446bf028ee85e579a2e043cfe5", size = 459807 }, + { url = "https://files.pythonhosted.org/packages/80/58/ef77879ea9aa56b50824edc5a445e226422c7a8d211f3fd2a56bcb9493cf/jiter-0.16.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bc837c1b9631be10abfe0191537fe8009838204cec7e44827401ace390ddb567", size = 373181 }, + { url = "https://files.pythonhosted.org/packages/49/2e/ffbc3f254e4d8a66da3062c624a7df4b7c2b2cf9e1fe43cf394b3e104041/jiter-0.16.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49060fd70737fad59d33ba9dcc0d83247dc9e77187de26053a19c16c9f32bd69", size = 344927 }, + { url = "https://files.pythonhosted.org/packages/9a/f6/0be5dc6d64a89f80aa8fec984f94dedb2973e251edcae55841d60786d578/jiter-0.16.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:adbb8edeadd431bc4477879d5d371ece7cb1334486584e0f252656dd7ffada29", size = 352754 }, + { url = "https://files.pythonhosted.org/packages/da/6e/7d31243b3b91cd261dd19e9d3557fc3251a80883d3d8049c86174e7ab7af/jiter-0.16.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:31aaee5b80f672c1dc21272bcfb9cbdcfc1ea04ff50f00ed5af500b80c44fa93", size = 390553 }, + { url = "https://files.pythonhosted.org/packages/25/33/51ae371fde3c88897520f62b4d5f8b27ad7103e2bb10812ff52195609853/jiter-0.16.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:6722bcef4ffc86c835574b1b2fac6b33b9fb4a889c781e67950e891591f3c55a", size = 516900 }, + { url = "https://files.pythonhosted.org/packages/a0/45/6449b3d123ea439ba79507c657288f461d55049e7bcbdc2cf8eb8210f491/jiter-0.16.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:5ab4f50ff971b611d656554ea10b75f80097392c827bc32923c6eeb6386c8b00", size = 548754 }, + { url = "https://files.pythonhosted.org/packages/9b/e7/fd2fb11ae3e2649333da3aa170d04d7b3000bbdc3b270f6513382fdf4e04/jiter-0.16.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:710cc51d4ebdcd3c1f70b232c1db1ea1344a075770422bbd4bede5708335acbe", size = 122381 }, + { url = "https://files.pythonhosted.org/packages/26/80/f0b147a62c315a164ed2168908286ca302310824c218d3aae52b06c0c9a9/jiter-0.16.0-cp314-cp314-win32.whl", hash = "sha256:57b37fc887a32d44798e4d8ebfa7c9683ff3da1d5bf38f08d1bb3573ccb39106", size = 204578 }, + { url = "https://files.pythonhosted.org/packages/5e/e6/4758a14304b4523a6f5adb2419340086aa3593bd4327c2b25b5948a90548/jiter-0.16.0-cp314-cp314-win_amd64.whl", hash = "sha256:cbd18dd5e2df96b580487b5745adf57ef64ad89ba2d9662fc3c19386acce7db8", size = 198154 }, + { url = "https://files.pythonhosted.org/packages/26/be/41fa54a2e7ea41d6c99f1dc5b1f0fd4cb474680304b5d268dd518e81da3a/jiter-0.16.0-cp314-cp314-win_arm64.whl", hash = "sha256:a32d2027a9fa67f109ff245a3252ece3ccc32cc56703e1deab6cc846a59e0585", size = 191458 }, + { url = "https://files.pythonhosted.org/packages/81/6b/59127338b86d9fe4d99418f5a15118bea778103ee0fe9d9dd7e0af174e95/jiter-0.16.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2577196f4474ef3fc4779a088a23b0897bbf86f9ea3679c372d45b8383b43207", size = 316739 }, + { url = "https://files.pythonhosted.org/packages/2d/95/49461034d5388196d3dabf98748935f017b7785d8f3f5349f834bcc4ed0d/jiter-0.16.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:616e89e008a93c01104161c75b4988e58716b01d62307ebfe161e52a56d2a818", size = 340911 }, + { url = "https://files.pythonhosted.org/packages/cd/97/a4369f2fb82cb3dda13b98622f31249b2e014b223fe64ee534413ad72294/jiter-0.16.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0e2e9efbe042210df657bade597f66d6d75723e3d8f45a12ea6d8167ff8bbce3", size = 361747 }, + { url = "https://files.pythonhosted.org/packages/28/51/49b6ed456261646e1906016a6760367a28aacd3c24805e4e5fe64116c1db/jiter-0.16.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f4d9e473a5ce7d27fef8b848df4dc16e283893d3f53b4a585e72c9595f3c284", size = 460225 }, + { url = "https://files.pythonhosted.org/packages/33/b5/5689aff4f66c5b60be63106e591dbfcba2190df97d2c9c7cf052361ddb98/jiter-0.16.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d30a4a1c87713060c8d1cc59a7b6c8fb6b8ef0a6900368014c76c87922a2929", size = 373169 }, + { url = "https://files.pythonhosted.org/packages/a2/96/3ae1b85ee0d6d6cab254fb7f8da018272b932bbf2d69b07e98aa2a96c746/jiter-0.16.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bae96332410f866e5900d809298b1ed82735932986c672495f9701daacd80620", size = 350332 }, + { url = "https://files.pythonhosted.org/packages/15/32/c99d7bafd78986556c95bf60ce84c6cc98786eac56066c12d7f828bb6747/jiter-0.16.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:da3d7ec75dc83bb18bca888b5edfae0656a26849056c59e05a7728badd17e7af", size = 353377 }, + { url = "https://files.pythonhosted.org/packages/0e/4b/f99a8e571287c3dec766bcc18528bbe8e8fb5365522ab5e6d64c93e87066/jiter-0.16.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ee6162b77d49a9939229df666dfa8af3e656b6701b54c4c84966d740e189264e", size = 387746 }, + { url = "https://files.pythonhosted.org/packages/75/69/c78a5b3f71040e34eb5917df26fb7ae9a2174cad1ccbf277512507c53a6e/jiter-0.16.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:63ffdbdae7d4499f4cda14eadc12ddcabef0fc0c081191bdc2247489cb698077", size = 517292 }, + { url = "https://files.pythonhosted.org/packages/c2/f7/095b38eda4c70d03651c403f29a5590f16d12ddc5d544aac9f9cddf72277/jiter-0.16.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:a111256a7193bea0759267b10385e5870949c239ed7b6ddbaaf57573edb38734", size = 549259 }, + { url = "https://files.pythonhosted.org/packages/2e/c5/6a0207d90e5f656d95af98ebd0934f382d37674416f215aeda2ff8063e51/jiter-0.16.0-cp314-cp314t-win32.whl", hash = "sha256:de5ba8763e56b793561f43bed197c9ea55776daa5e9a6b91eed68a909bc9cdbf", size = 206523 }, + { url = "https://files.pythonhosted.org/packages/a5/31/c757d5f30a8980fd945ce7b98be10be9e4ff59c7c42f5fd86804c2e87db8/jiter-0.16.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b8a3f9a6008048fe9def7bf465180564a6e458047d2ce499149cfbe73c3ae9db", size = 200366 }, + { url = "https://files.pythonhosted.org/packages/7c/a2/d88de6d313d734a544a7901353ad5db67cb38dcfcd91713b7979dafc345d/jiter-0.16.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0fa25b09b13075c46f5bc174f2690525a925a4fc2f7c82969a2bbabff22386ce", size = 190516 }, + { url = "https://files.pythonhosted.org/packages/06/d3/8e278946d43eeca2585b4dd0834a887cd71136329b837f3a16ed86a8b4b0/jiter-0.16.0-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:850ccb1d7eedb4200f4014b1c0e8a577de114fc3cd88faad646dcc9bc4bb12ad", size = 304518 }, + { url = "https://files.pythonhosted.org/packages/72/43/28d4ef495028bf0506a413d4db3f4eb3e7288a382e0f065f306a17bbeb5e/jiter-0.16.0-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:e34e97bda77eb63242a410243c071e28ac7e0d8c0948c5ee658498690a4b2f2f", size = 310207 }, + { url = "https://files.pythonhosted.org/packages/e0/ca/c366b1012da1d640de975d9683acd44e4d150d9068845d0ca2610435253f/jiter-0.16.0-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7dc85ea77d4abbae8bad0d3538678aedee75bceec4e2f6c8dfb1c74772e5aa5", size = 342771 }, + { url = "https://files.pythonhosted.org/packages/16/52/50cc4056fc1ae02e7154704e7ecc89df0afb8300222cfe8a52d3f67e4730/jiter-0.16.0-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17ca7fae79f6d99cd9a042b75f917eaada7b895cfc7dd2ee3a16089dcaec7a85", size = 346468 }, + { url = "https://files.pythonhosted.org/packages/98/ab/664fd8c4be028b2bedd3d2ff08769c4ede23d0dbc87a77c62384a0515b5d/jiter-0.16.0-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:f17d61a28b4b3e0e3e2ba98490c70501403b4d196f78732439160e7fd3678127", size = 303106 }, + { url = "https://files.pythonhosted.org/packages/1a/07/421f1d5b65493a76e16027b848aba6a7d28073ae75944fa4289cc914d39f/jiter-0.16.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:96e38eea538c8ddf853a35727c7be0741c76c13f04148ac5c116222f50ece3b3", size = 304658 }, + { url = "https://files.pythonhosted.org/packages/0a/db/bba1155f01a01c3c37a89425d571da751bbedf5c54247b831a04cb971798/jiter-0.16.0-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d284fb8d94d5855d60c44fefcab4bf966f1da6fada73992b01f6f0c9bc0c6702", size = 339719 }, + { url = "https://files.pythonhosted.org/packages/78/f7/18a1afcd64f35314b68c1f23afcd9994d0bc13e65cc77517afff4e83986d/jiter-0.16.0-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64d613743df53199b1aa256a7d328340da6d7078aac7705a7db9d7a791e9cfd2", size = 343885 }, +] + [[package]] name = "jsonpatch" version = "1.33" @@ -1222,7 +1665,7 @@ dependencies = [ { name = "pdfplumber" }, { name = "pillow" }, { name = "pyyaml" }, - { name = "scipy", version = "1.17.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, + { name = "scipy", version = "1.10.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, { name = "scipy", version = "1.18.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/95/16/3ff7629fd684047ad9779394aadc7b612c5ae91e41a27f1bad1469e23f05/layoutparser-0.3.4.tar.gz", hash = "sha256:0dfb2194c36a5ad1075b8310f3cbc280c00306d1758cef127d20283f7ce085ea", size = 19153228 } @@ -1326,6 +1769,36 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5f/5d/3dcec2884ba1b0806d1408612555c38dd5d68e90156b59f75f6e36435c3a/librt-0.13.0-cp314-cp314t-win_arm64.whl", hash = "sha256:2f281549a4c52ac7bb97997f14353f8bd0e53a34ca0dad1c905cfd0b4a58ae99", size = 110771 }, ] +[[package]] +name = "litellm" +version = "1.93.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohttp" }, + { name = "click" }, + { name = "fastuuid" }, + { name = "httpx" }, + { name = "importlib-metadata" }, + { name = "jinja2" }, + { name = "jsonschema" }, + { name = "openai" }, + { name = "pydantic" }, + { name = "python-dotenv" }, + { name = "tiktoken" }, + { name = "tokenizers" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/93/e1/4f05ca4cbb4efb739c9e66a182ecd5c816bc05bf3665ec8e0fb4ab408379/litellm-1.93.0.tar.gz", hash = "sha256:140bf215e264c71601bca9c06d2436c5451bb59e1e195ea23fc2d3d87b6929ec", size = 15948866 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/33/fa/36bbb088d4a70f610518012529f1e81445dc6e3868ed36a5b4f705f8dec0/litellm-1.93.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:952029d422c2cec8117b444d66d6de87ac970ecf0b2e1383b02788ef90ba3603", size = 20167087 }, + { url = "https://files.pythonhosted.org/packages/7d/15/52ee5e4743ad656a4d408ca6fcd8bca844b572b6a8e9776f1232bd7d9d8d/litellm-1.93.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:460001b7c88c5b6675ad482ae3cecba96e21f890604b4febb1a67807ace1c750", size = 20161646 }, + { url = "https://files.pythonhosted.org/packages/be/69/cabe7e747fea4c744752bd7ff8f7f208723151a63a89bb7c2437212523ff/litellm-1.93.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:3daf5c5aceb07f5d68871071e0ecdc678caccebadca9143cc00bb76f5a8c54e8", size = 20164234 }, + { url = "https://files.pythonhosted.org/packages/c5/db/6af798603c6e2cf21ad7f2edf7e95019bd859dda82284b94014d608fcd85/litellm-1.93.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:0784172435de48f66ef7ad89d421604db1ad0db1321ef7f39dbcfe6b20111417", size = 20156724 }, + { url = "https://files.pythonhosted.org/packages/f5/e1/eabe3f13d9c8b853a01377b59e78a295f34c24c36b09e5fc1c60c0167f19/litellm-1.93.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:23b8eea4fb8b3b6ade05e7b6085ec9ca12daffcfb38d033d0bbce9c1d5894da5", size = 20164863 }, + { url = "https://files.pythonhosted.org/packages/64/49/2db5757f7e284eb12618b547cb62dab49687ffaf1d749ca048210e3d0dbd/litellm-1.93.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:98c15e84d32e922a821c105308bf9ddae8700de9ed396530bee2cbb1cacf4cbb", size = 20157288 }, + { url = "https://files.pythonhosted.org/packages/0d/7f/b48d88cb32055b4ba7e51cd67e4ea13a589d4a568d33c3d0dc6994d13b83/litellm-1.93.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:1a476ebc340c070c982eab15b4673fa63a70f5936935f9f20e4d2acb5f35d23b", size = 20165502 }, + { url = "https://files.pythonhosted.org/packages/45/6c/65a7f916326daa151131f1fce5e254d4834127a95d53a18f1c4d238dd5c3/litellm-1.93.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:cd70ccd4ba3ef1a395535c287bce72d30c7d937ecca4290c0db37a00738f7ada", size = 20159007 }, +] + [[package]] name = "lmdb" version = "2.3.0" @@ -1564,6 +2037,186 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c", size = 536198 }, ] +[[package]] +name = "msgpack" +version = "1.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/31/f9/c0a1c127f9049db9155afc316952ea571720dd01833ff5e4d7e8e6352dbb/msgpack-1.2.1.tar.gz", hash = "sha256:04c721c2c7448767e9e3f2520a475663d8ee0f09c31890f6d2bd70fd636a9647", size = 183960 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/6b/e9b1cdc042c4458801d2545ed782a95f3d6ba8e270cce8745b8603c7f748/msgpack-1.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:29a3f6e9667868429d8240dfd063ea5ffdc1321c13d783aa23827a38de0dcb22", size = 82812 }, + { url = "https://files.pythonhosted.org/packages/0c/3a/dd518a1bf78ed1e9ad8afe57307c079a00eafe4b3068932a27ca1ea56b4f/msgpack-1.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:aded5bdf32609dc7987a49bbbd15a8ef096193f96dd8bbeb791de729e650acf5", size = 82739 }, + { url = "https://files.pythonhosted.org/packages/70/e0/7ba9e1542bf0771a27b8b37c1316e3f95ae9d748fd765284655c476ad4ef/msgpack-1.2.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:146ee4e9ce80b365c6d4c47073da9da7bcec473e58194ceee5dd7620ace77e06", size = 414233 }, + { url = "https://files.pythonhosted.org/packages/03/8d/671d81534ea0e2b0e8a121be100020da09eb78861fe3aa8f3ef7dcd3bed1/msgpack-1.2.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a28d076ca7c82b9c8728ad90b7147489449557038bed50e4241eb832395169b4", size = 423843 }, + { url = "https://files.pythonhosted.org/packages/d2/b6/e5c737515ed1f166664b87601b532f58cbb73d8aa6a90b99f7c2c5037e8e/msgpack-1.2.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7d31c0ac0c640f877804c67cb2bc9f4e23dc2db97e96c2e67fa27d38283b41f8", size = 390772 }, + { url = "https://files.pythonhosted.org/packages/a8/46/62ed8c2e87d7021eab19921594d961ef3aa3794eec76c716dc30f3bfd433/msgpack-1.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8ff92d7feeaf5bc26c51495b69e2f99ed97ab79346fb6555f44be7dd2ac6503b", size = 409559 }, + { url = "https://files.pythonhosted.org/packages/70/ff/59aa3887b860bbf43532835e192b1c388a17590d6068ae4f8b2bc74c906e/msgpack-1.2.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:779197a6513bab3c3632265e3d0f7cb3227e62510841a6f34f1eaa37efbb345e", size = 387838 }, + { url = "https://files.pythonhosted.org/packages/09/11/f8563e471093420cf6478cb3271a0175d8402b82d879783d4035d2d03360/msgpack-1.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:67f6dd22fa72a93752643f07889796d62739a13415ee630169a8ce764f86cf9f", size = 421732 }, + { url = "https://files.pythonhosted.org/packages/57/cf/e673683c4c6c90c1022b24c65af4b03eda72b182a1176ef6449069d66acc/msgpack-1.2.1-cp311-cp311-win32.whl", hash = "sha256:91054a783328e0ea7954b8771095705c8d2243b814743fbaadf14552c9c52c5d", size = 64091 }, + { url = "https://files.pythonhosted.org/packages/3f/07/ca212739d179f9083bff2c7c08c24101c3555a334fadc2b876b18768a3ae/msgpack-1.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2eda0b7ebb1283a98d3e4492ac933c8af6aff59fd3df1c3ed024f536af4b1dc8", size = 70462 }, + { url = "https://files.pythonhosted.org/packages/6d/be/6798347b425e26f35db82e69dd83c09716c856a3714e7bffc4c0860fd830/msgpack-1.2.1-cp311-cp311-win_arm64.whl", hash = "sha256:6ee967f7c7e1df2890c671ff2ee51a28ded0efc95da3e507176dee881ce36c66", size = 65059 }, + { url = "https://files.pythonhosted.org/packages/bc/dd/9e8cbd8f5582ca4b590336f2b91ee5662f6a6ca562b565abaf696a0f81ff/msgpack-1.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2ef59c659f289eddf8aa6623823f19fa2f40a4029266889eac7a2505dd210c35", size = 83531 }, + { url = "https://files.pythonhosted.org/packages/50/2e/ebdb85a8da151397a2790363676b7ed7c125924fe618e4c6d8befb0cc62c/msgpack-1.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d3567748a5107cb40cdf66a275430c2f87c07777698f4bfd25c35f44d533258c", size = 82657 }, + { url = "https://files.pythonhosted.org/packages/26/aa/753ad8b007b464e1d8aa0c8e650b9c5f4f725e658fc5ac8a7635c55b7f6e/msgpack-1.2.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:60926b75d00c8e816ef98f3034f484a8bc64242d66839cef4cf7e503142316a0", size = 410634 }, + { url = "https://files.pythonhosted.org/packages/6a/fd/6adabd4f6d5e686f97dd02ce7fce3fe4cf672cbac36b8f67ff4040e8ad8b/msgpack-1.2.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:020e881a764b20d8d7ca1a54fc01b8175519d108e3c3f194fddc200bda95951a", size = 419989 }, + { url = "https://files.pythonhosted.org/packages/5a/cc/85039b7b0eb168aaad7383a23c97e291a11f08351cb45a606ce865e4e3f1/msgpack-1.2.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4202c74688ca06591f78cb18988228bd4cca2cc75d57b60008372892d2f1e6e6", size = 377544 }, + { url = "https://files.pythonhosted.org/packages/ed/bf/35963899493b32030c85fc513b723ae66144ac70c11ebc52e889e16e3d99/msgpack-1.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8b267ce94efb76fbd1b3373511420074ee3187f0f7811bf394531de13294735a", size = 400842 }, + { url = "https://files.pythonhosted.org/packages/a6/df/8e2ac970c8f99264cd9997d1c73df5466bc19da3301d7dc5500862a9b089/msgpack-1.2.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:e4f1d0f8f98ade9634e01fb704a408f9336c0a8f1117b369f5db83dc7551d8b1", size = 374108 }, + { url = "https://files.pythonhosted.org/packages/17/dd/fa8bd265110dfa51c20cb529f9e6d240a16fafe7e645004c6af2d01353ba/msgpack-1.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f02cf17a6ca1abe29b5f980644f7551f94d71f2011509b26d8625ce038f0df64", size = 414939 }, + { url = "https://files.pythonhosted.org/packages/2e/b9/8377a5ad8953fc0437c70cc98d9ae29f27fe5ac5109fbec0812085865735/msgpack-1.2.1-cp312-cp312-win32.whl", hash = "sha256:0c0d9802354507bcba62af19c17918e3eb437cc25e6f50657d511b5856a77aac", size = 64504 }, + { url = "https://files.pythonhosted.org/packages/57/7f/ce1e377df7e62461fefd9eb23bfb93a4a523f40a517b377b8f844d836828/msgpack-1.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:5c24aa15d5963051e1a5c62b12c50cd705992502b5ec1f3bece6046f33c9fc24", size = 71421 }, + { url = "https://files.pythonhosted.org/packages/8f/32/ebfe84c9929f08f188d56c7a2fd913406a9ddad76a634697c1c43b8112e6/msgpack-1.2.1-cp312-cp312-win_arm64.whl", hash = "sha256:4227224aaec8f7fbcbfbd4272319347b2bb4030366502600f8c45588c5187b07", size = 64775 }, + { url = "https://files.pythonhosted.org/packages/b0/ac/dcddcab6f6c20ecb387ca5e980371cdb3f87ff69aeca388be97eebc4c074/msgpack-1.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0a70e3cf2804a300d921bb0940426e35f4e489a23adfb77a808892241db0a064", size = 83151 }, + { url = "https://files.pythonhosted.org/packages/64/71/fbcfa83a1d6a9c6091942d1cfd070962244664b87427a9a49a6897b1b219/msgpack-1.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:491cc39455ca765fad51fb451bf2915eb2cf41192ab5801ce8d67c1d614fe056", size = 82351 }, + { url = "https://files.pythonhosted.org/packages/e3/10/ddf7b06db879e8792d13934ddda09ff20bd2a583fd84c9b59aae9b0e650b/msgpack-1.2.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f310233ef7fb9c14e201c93639fe5f5260b005f56f0b29048e999c30935596cc", size = 407518 }, + { url = "https://files.pythonhosted.org/packages/79/d3/36a46a8ed992b781acbc05928bd5bee3c810cb0c3563bf81a7b0c04a1a76/msgpack-1.2.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:787c9bebb5833e8f6fc8abca3c0597683d8d87f56a8842b6b89c75a5f3176e2d", size = 416405 }, + { url = "https://files.pythonhosted.org/packages/f9/84/e8e9598b557c0ba6ddae901a73780a4c75ac667dddf59414b1e56a42fb34/msgpack-1.2.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:dc871b997a9370d855b7394465f2f350e847a5b806dd38dcc9c989e7d87da155", size = 376257 }, + { url = "https://files.pythonhosted.org/packages/40/16/738fe6d875ad7e2a9429c165322a4ec088f4f273cdfae63d96a89c467961/msgpack-1.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:85f57e960d877f2977f6430896191b04a21f8901b3b4baf2e4604329f4db5402", size = 397469 }, + { url = "https://files.pythonhosted.org/packages/ca/be/6d5952df75a7f24f35833af764c3a6860780364cb3a0030beb8099e1b2b4/msgpack-1.2.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:1233ee2dd0cefba127583de50ea654677277047d238303521db35def3d7b2e7c", size = 372802 }, + { url = "https://files.pythonhosted.org/packages/e1/39/e2ef7dbf0473bcb8dc7c50bf782a892d67414877b63e47fc88eb189ef5e6/msgpack-1.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e3dc2feb0876209d9c38aa56cb1de169bd6c4348f1aa48271f241226590993e6", size = 411273 }, + { url = "https://files.pythonhosted.org/packages/ef/c5/133f4512a56e983a93445c836c9d94d88f3bc2e0980ff4b9e577bd8416ce/msgpack-1.2.1-cp313-cp313-win32.whl", hash = "sha256:6d09badf350af2be9d189184e04e64cf54ad93569ab3d96fca58bd3e84aad707", size = 64471 }, + { url = "https://files.pythonhosted.org/packages/e2/98/577e10b055096a7dd40732358cabaf7180a20c79ed1dcdbb618e4b9deac7/msgpack-1.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:33f14fba63278b714efe6ad07e50ea5f03d91537aa6a1c5f1ceca4cf44013ca9", size = 71274 }, + { url = "https://files.pythonhosted.org/packages/ba/ee/0c0048e7cfbef23c6a94791b8959ab28155232e7956de8a305b5ff588f05/msgpack-1.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:afc5febcd4c99effbc02b528e49d6fd0760b2b7d48c05239e345a5fa6e743d9a", size = 64795 }, + { url = "https://files.pythonhosted.org/packages/77/58/cce442852c6b9e1639c7c8ac8fd9143121cb32dab0f308df4d1426a8eb9c/msgpack-1.2.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:05f340e47e7e47d2da8db9b53e1bb1d294369e9ef45a747441309f6650b8351d", size = 83610 }, + { url = "https://files.pythonhosted.org/packages/60/5c/15b4c7a0182f75ffa90751958ba36a9c01cafee367d49a3edc10ed140b01/msgpack-1.2.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:810b916696c86ef0deb3b74588480224df4c1b071136c34183e4a2a4284d7ac7", size = 83138 }, + { url = "https://files.pythonhosted.org/packages/b8/a6/99e58722feaffc5f2fbcc0c8c0d1451ab9f84097f7af87291b46af2390f4/msgpack-1.2.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ca0dacff965c47afdc3749a8469d7302a8f801d6a28758d55120d75e66ce6889", size = 406090 }, + { url = "https://files.pythonhosted.org/packages/19/03/8c63e8cf52958534ef688625965ab04c269a6cadd8caef16758b380a821a/msgpack-1.2.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e2bf9280bceb5efca998435904b5d3e9fdbcc11d90dc9df30aec7973252b720", size = 412106 }, + { url = "https://files.pythonhosted.org/packages/63/d2/155d9e71b40e41fd934bc0c48b9b2770f22263e1ac20aad8e29fdca7be3f/msgpack-1.2.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:aa6c4be5d1c02a42b066ca6ddb71adf36432868fdcdb6ee87e634e86e0674190", size = 374851 }, + { url = "https://files.pythonhosted.org/packages/98/48/deaf2326262a8d5ea3295ce9649912ecd3f551ba7ec8e33c665d2ba583f3/msgpack-1.2.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec0e675d59150a6269ddc9139087c722292664a37d071a849c05c473350f1f2d", size = 396168 }, + { url = "https://files.pythonhosted.org/packages/10/2a/b4410f906c2ec0008f1608d3ab5143afc3ad3f4e6da0fed3ea2231d0bef4/msgpack-1.2.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:dd3bfe82d53edfe4b7fc9a7ec9761e23a7a5b1dac22264505af428253c29ed24", size = 371959 }, + { url = "https://files.pythonhosted.org/packages/59/86/1edc67270099a528fa2093ea60fe191233cd238e4bd30cfacf7db79fc959/msgpack-1.2.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5ad5467fc3f68b5468e06c5f788d712e9f8ffc8b0cd1bcb160c105c1ee92dae7", size = 408457 }, + { url = "https://files.pythonhosted.org/packages/82/90/8b630fef07d8c5ab457b71ff2c217910c83d333c7a68472c186e87cc504a/msgpack-1.2.1-cp314-cp314-win32.whl", hash = "sha256:98b58bdb89c46190e4609bb36abe17c6d4105ad13f9c5f8f6f64d320f8ced3fb", size = 65942 }, + { url = "https://files.pythonhosted.org/packages/16/f1/467b81e98b24dd3885d7b1857728797b4ffc76a7a7483af4fb321a07de3c/msgpack-1.2.1-cp314-cp314-win_amd64.whl", hash = "sha256:74847557e28ce71bd3c438a447ca90e4b507e997ddbdef8a12a7b283b86c156b", size = 72627 }, + { url = "https://files.pythonhosted.org/packages/a7/1d/5d8c4c89985feb6acefb82a09e501c60392261856d2408d20bfe4f0360b1/msgpack-1.2.1-cp314-cp314-win_arm64.whl", hash = "sha256:b50b727bd652bdc37d950336c848ef20ec54a4cafc38dce19b1cd86ad625d0f7", size = 66908 }, + { url = "https://files.pythonhosted.org/packages/1b/02/ad2afb678b4de94496cd432b581759b756a92c1192d8c767edd6b132efdc/msgpack-1.2.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:8d00f177ca88a77c1cf848d204a38f249751650b601cb6532acc68805d8a8273", size = 86000 }, + { url = "https://files.pythonhosted.org/packages/54/74/0b797484013128837f3b1cbb6cea019277c4de4e377dc512b4d9a0f92940/msgpack-1.2.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5bb9c386f0a329c035ddbab4b72d1028bf9627add8dda41070288563d57ed1b1", size = 86544 }, + { url = "https://files.pythonhosted.org/packages/a9/b4/b774d7eb95561739907fec675582f83203cf41c597a418c2589b4bfb8e9d/msgpack-1.2.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:20466cca18c49c7292a8984bc15d65857b171e7264bdcb5f96baf8be238791fc", size = 427661 }, + { url = "https://files.pythonhosted.org/packages/b2/f9/3243191dc9937e00756c8bc1b0272fed8f23758e43df2a3b46f533e5090f/msgpack-1.2.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:196300e7e5d6e74d50f1607ab9c06c4a1484c383cd22defd727902591f7e8dde", size = 426375 }, + { url = "https://files.pythonhosted.org/packages/23/c7/1693111db9944ba4ad4b67a1e788400d78a0b6af7a6523dc7e4e58f8274b/msgpack-1.2.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:575957e79cd51903a4e8495a242442949641e08f1efd5197b43bebd3ea7682b4", size = 380495 }, + { url = "https://files.pythonhosted.org/packages/3e/2b/92f86956a0c13e8662f7e2ad630c4eb4db07497b967589bd5245e018b2c1/msgpack-1.2.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8c2ed1e48cc0f460bf3c7780e7137ff21a4e18433451916f2442c1b21036cd7d", size = 410897 }, + { url = "https://files.pythonhosted.org/packages/da/ea/1479f72d200313a76fc2f823a79d1e07ed052ab7b8a0280640aa7b95de42/msgpack-1.2.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:5f6277e5f783c36786a145e0247fc189a03f35f84b251646e53592d2bc12b355", size = 378519 }, + { url = "https://files.pythonhosted.org/packages/f5/4d/fa006060ffa1011d32bfae826fe766fe73e02982183601633b7121058ab3/msgpack-1.2.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f9389552ecf4784886345ead0647e4edc96bee37cbab05b75540f542f766c48c", size = 419815 }, + { url = "https://files.pythonhosted.org/packages/2f/e1/aab6c946570496b78e67804721f3d5e2d62a93081b9b37df77764ef56347/msgpack-1.2.1-cp314-cp314t-win32.whl", hash = "sha256:c1c79a604a2969a868a78b6ebd27a887e00c624f14f66b3038e0590cb23332d1", size = 70914 }, + { url = "https://files.pythonhosted.org/packages/13/0a/e608956488a2af014cfe6e3d665e090b8ee42aa14b07f8f95b8880d66b09/msgpack-1.2.1-cp314-cp314t-win_amd64.whl", hash = "sha256:f12038a35fabd52e56a3547bab42401af49a45caa6dd00b34c44de235bc93ee2", size = 77999 }, + { url = "https://files.pythonhosted.org/packages/d2/8a/27e2e57055176e366a46b85d02d68e7a5bcfbdd8474c9706375d965f24d3/msgpack-1.2.1-cp314-cp314t-win_arm64.whl", hash = "sha256:0adcf06ffde0777c0e1a9b771a2b1c4226ba1bbf748c8efcc02fcdeca3299107", size = 71160 }, +] + +[[package]] +name = "multidict" +version = "6.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1a/c2/c2d94cbe6ac1753f3fc980da97b3d930efe1da3af3c9f5125354436c073d/multidict-6.7.1.tar.gz", hash = "sha256:ec6652a1bee61c53a3e5776b6049172c53b6aaba34f18c9ad04f82712bac623d", size = 102010 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/f1/a90635c4f88fb913fbf4ce660b83b7445b7a02615bda034b2f8eb38fd597/multidict-6.7.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7ff981b266af91d7b4b3793ca3382e53229088d193a85dfad6f5f4c27fc73e5d", size = 76626 }, + { url = "https://files.pythonhosted.org/packages/a6/9b/267e64eaf6fc637a15b35f5de31a566634a2740f97d8d094a69d34f524a4/multidict-6.7.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:844c5bca0b5444adb44a623fb0a1310c2f4cd41f402126bb269cd44c9b3f3e1e", size = 44706 }, + { url = "https://files.pythonhosted.org/packages/dd/a4/d45caf2b97b035c57267791ecfaafbd59c68212004b3842830954bb4b02e/multidict-6.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f2a0a924d4c2e9afcd7ec64f9de35fcd96915149b2216e1cb2c10a56df483855", size = 44356 }, + { url = "https://files.pythonhosted.org/packages/fd/d2/0a36c8473f0cbaeadd5db6c8b72d15bbceeec275807772bfcd059bef487d/multidict-6.7.1-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:8be1802715a8e892c784c0197c2ace276ea52702a0ede98b6310c8f255a5afb3", size = 244355 }, + { url = "https://files.pythonhosted.org/packages/5d/16/8c65be997fd7dd311b7d39c7b6e71a0cb449bad093761481eccbbe4b42a2/multidict-6.7.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2e2d2ed645ea29f31c4c7ea1552fcfd7cb7ba656e1eafd4134a6620c9f5fdd9e", size = 246433 }, + { url = "https://files.pythonhosted.org/packages/01/fb/4dbd7e848d2799c6a026ec88ad39cf2b8416aa167fcc903baa55ecaa045c/multidict-6.7.1-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:95922cee9a778659e91db6497596435777bd25ed116701a4c034f8e46544955a", size = 225376 }, + { url = "https://files.pythonhosted.org/packages/b6/8a/4a3a6341eac3830f6053062f8fbc9a9e54407c80755b3f05bc427295c2d0/multidict-6.7.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6b83cabdc375ffaaa15edd97eb7c0c672ad788e2687004990074d7d6c9b140c8", size = 257365 }, + { url = "https://files.pythonhosted.org/packages/f7/a2/dd575a69c1aa206e12d27d0770cdf9b92434b48a9ef0cd0d1afdecaa93c4/multidict-6.7.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:38fb49540705369bab8484db0689d86c0a33a0a9f2c1b197f506b71b4b6c19b0", size = 254747 }, + { url = "https://files.pythonhosted.org/packages/5a/56/21b27c560c13822ed93133f08aa6372c53a8e067f11fbed37b4adcdac922/multidict-6.7.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:439cbebd499f92e9aa6793016a8acaa161dfa749ae86d20960189f5398a19144", size = 246293 }, + { url = "https://files.pythonhosted.org/packages/5a/a4/23466059dc3854763423d0ad6c0f3683a379d97673b1b89ec33826e46728/multidict-6.7.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6d3bc717b6fe763b8be3f2bee2701d3c8eb1b2a8ae9f60910f1b2860c82b6c49", size = 242962 }, + { url = "https://files.pythonhosted.org/packages/1f/67/51dd754a3524d685958001e8fa20a0f5f90a6a856e0a9dcabff69be3dbb7/multidict-6.7.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:619e5a1ac57986dbfec9f0b301d865dddf763696435e2962f6d9cf2fdff2bb71", size = 237360 }, + { url = "https://files.pythonhosted.org/packages/64/3f/036dfc8c174934d4b55d86ff4f978e558b0e585cef70cfc1ad01adc6bf18/multidict-6.7.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0b38ebffd9be37c1170d33bc0f36f4f262e0a09bc1aac1c34c7aa51a7293f0b3", size = 245940 }, + { url = "https://files.pythonhosted.org/packages/3d/20/6214d3c105928ebc353a1c644a6ef1408bc5794fcb4f170bb524a3c16311/multidict-6.7.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:10ae39c9cfe6adedcdb764f5e8411d4a92b055e35573a2eaa88d3323289ef93c", size = 253502 }, + { url = "https://files.pythonhosted.org/packages/b1/e2/c653bc4ae1be70a0f836b82172d643fcf1dade042ba2676ab08ec08bff0f/multidict-6.7.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:25167cc263257660290fba06b9318d2026e3c910be240a146e1f66dd114af2b0", size = 247065 }, + { url = "https://files.pythonhosted.org/packages/c8/11/a854b4154cd3bd8b1fd375e8a8ca9d73be37610c361543d56f764109509b/multidict-6.7.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:128441d052254f42989ef98b7b6a6ecb1e6f708aa962c7984235316db59f50fa", size = 241870 }, + { url = "https://files.pythonhosted.org/packages/13/bf/9676c0392309b5fdae322333d22a829715b570edb9baa8016a517b55b558/multidict-6.7.1-cp311-cp311-win32.whl", hash = "sha256:d62b7f64ffde3b99d06b707a280db04fb3855b55f5a06df387236051d0668f4a", size = 41302 }, + { url = "https://files.pythonhosted.org/packages/c9/68/f16a3a8ba6f7b6dc92a1f19669c0810bd2c43fc5a02da13b1cbf8e253845/multidict-6.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:bdbf9f3b332abd0cdb306e7c2113818ab1e922dc84b8f8fd06ec89ed2a19ab8b", size = 45981 }, + { url = "https://files.pythonhosted.org/packages/ac/ad/9dd5305253fa00cd3c7555dbef69d5bf4133debc53b87ab8d6a44d411665/multidict-6.7.1-cp311-cp311-win_arm64.whl", hash = "sha256:b8c990b037d2fff2f4e33d3f21b9b531c5745b33a49a7d6dbe7a177266af44f6", size = 43159 }, + { url = "https://files.pythonhosted.org/packages/8d/9c/f20e0e2cf80e4b2e4b1c365bf5fe104ee633c751a724246262db8f1a0b13/multidict-6.7.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a90f75c956e32891a4eda3639ce6dd86e87105271f43d43442a3aedf3cddf172", size = 76893 }, + { url = "https://files.pythonhosted.org/packages/fe/cf/18ef143a81610136d3da8193da9d80bfe1cb548a1e2d1c775f26b23d024a/multidict-6.7.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fccb473e87eaa1382689053e4a4618e7ba7b9b9b8d6adf2027ee474597128cd", size = 45456 }, + { url = "https://files.pythonhosted.org/packages/a9/65/1caac9d4cd32e8433908683446eebc953e82d22b03d10d41a5f0fefe991b/multidict-6.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0fa96985700739c4c7853a43c0b3e169360d6855780021bfc6d0f1ce7c123e7", size = 43872 }, + { url = "https://files.pythonhosted.org/packages/cf/3b/d6bd75dc4f3ff7c73766e04e705b00ed6dbbaccf670d9e05a12b006f5a21/multidict-6.7.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cb2a55f408c3043e42b40cc8eecd575afa27b7e0b956dfb190de0f8499a57a53", size = 251018 }, + { url = "https://files.pythonhosted.org/packages/fd/80/c959c5933adedb9ac15152e4067c702a808ea183a8b64cf8f31af8ad3155/multidict-6.7.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb0ce7b2a32d09892b3dd6cc44877a0d02a33241fafca5f25c8b6b62374f8b75", size = 258883 }, + { url = "https://files.pythonhosted.org/packages/86/85/7ed40adafea3d4f1c8b916e3b5cc3a8e07dfcdcb9cd72800f4ed3ca1b387/multidict-6.7.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c3a32d23520ee37bf327d1e1a656fec76a2edd5c038bf43eddfa0572ec49c60b", size = 242413 }, + { url = "https://files.pythonhosted.org/packages/d2/57/b8565ff533e48595503c785f8361ff9a4fde4d67de25c207cd0ba3befd03/multidict-6.7.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9c90fed18bffc0189ba814749fdcc102b536e83a9f738a9003e569acd540a733", size = 268404 }, + { url = "https://files.pythonhosted.org/packages/e0/50/9810c5c29350f7258180dfdcb2e52783a0632862eb334c4896ac717cebcb/multidict-6.7.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:da62917e6076f512daccfbbde27f46fed1c98fee202f0559adec8ee0de67f71a", size = 269456 }, + { url = "https://files.pythonhosted.org/packages/f3/8d/5e5be3ced1d12966fefb5c4ea3b2a5b480afcea36406559442c6e31d4a48/multidict-6.7.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bfde23ef6ed9db7eaee6c37dcec08524cb43903c60b285b172b6c094711b3961", size = 256322 }, + { url = "https://files.pythonhosted.org/packages/31/6e/d8a26d81ac166a5592782d208dd90dfdc0a7a218adaa52b45a672b46c122/multidict-6.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3758692429e4e32f1ba0df23219cd0b4fc0a52f476726fff9337d1a57676a582", size = 253955 }, + { url = "https://files.pythonhosted.org/packages/59/4c/7c672c8aad41534ba619bcd4ade7a0dc87ed6b8b5c06149b85d3dd03f0cd/multidict-6.7.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:398c1478926eca669f2fd6a5856b6de9c0acf23a2cb59a14c0ba5844fa38077e", size = 251254 }, + { url = "https://files.pythonhosted.org/packages/7b/bd/84c24de512cbafbdbc39439f74e967f19570ce7924e3007174a29c348916/multidict-6.7.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c102791b1c4f3ab36ce4101154549105a53dc828f016356b3e3bcae2e3a039d3", size = 252059 }, + { url = "https://files.pythonhosted.org/packages/fa/ba/f5449385510825b73d01c2d4087bf6d2fccc20a2d42ac34df93191d3dd03/multidict-6.7.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a088b62bd733e2ad12c50dad01b7d0166c30287c166e137433d3b410add807a6", size = 263588 }, + { url = "https://files.pythonhosted.org/packages/d7/11/afc7c677f68f75c84a69fe37184f0f82fce13ce4b92f49f3db280b7e92b3/multidict-6.7.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3d51ff4785d58d3f6c91bdbffcb5e1f7ddfda557727043aa20d20ec4f65e324a", size = 259642 }, + { url = "https://files.pythonhosted.org/packages/2b/17/ebb9644da78c4ab36403739e0e6e0e30ebb135b9caf3440825001a0bddcb/multidict-6.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc5907494fccf3e7d3f94f95c91d6336b092b5fc83811720fae5e2765890dfba", size = 251377 }, + { url = "https://files.pythonhosted.org/packages/ca/a4/840f5b97339e27846c46307f2530a2805d9d537d8b8bd416af031cad7fa0/multidict-6.7.1-cp312-cp312-win32.whl", hash = "sha256:28ca5ce2fd9716631133d0e9a9b9a745ad7f60bac2bccafb56aa380fc0b6c511", size = 41887 }, + { url = "https://files.pythonhosted.org/packages/80/31/0b2517913687895f5904325c2069d6a3b78f66cc641a86a2baf75a05dcbb/multidict-6.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcee94dfbd638784645b066074b338bc9cc155d4b4bffa4adce1615c5a426c19", size = 46053 }, + { url = "https://files.pythonhosted.org/packages/0c/5b/aba28e4ee4006ae4c7df8d327d31025d760ffa992ea23812a601d226e682/multidict-6.7.1-cp312-cp312-win_arm64.whl", hash = "sha256:ba0a9fb644d0c1a2194cf7ffb043bd852cea63a57f66fbd33959f7dae18517bf", size = 43307 }, + { url = "https://files.pythonhosted.org/packages/f2/22/929c141d6c0dba87d3e1d38fbdf1ba8baba86b7776469f2bc2d3227a1e67/multidict-6.7.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2b41f5fed0ed563624f1c17630cb9941cf2309d4df00e494b551b5f3e3d67a23", size = 76174 }, + { url = "https://files.pythonhosted.org/packages/c7/75/bc704ae15fee974f8fccd871305e254754167dce5f9e42d88a2def741a1d/multidict-6.7.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:84e61e3af5463c19b67ced91f6c634effb89ef8bfc5ca0267f954451ed4bb6a2", size = 45116 }, + { url = "https://files.pythonhosted.org/packages/79/76/55cd7186f498ed080a18440c9013011eb548f77ae1b297206d030eb1180a/multidict-6.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:935434b9853c7c112eee7ac891bc4cb86455aa631269ae35442cb316790c1445", size = 43524 }, + { url = "https://files.pythonhosted.org/packages/e9/3c/414842ef8d5a1628d68edee29ba0e5bcf235dbfb3ccd3ea303a7fe8c72ff/multidict-6.7.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:432feb25a1cb67fe82a9680b4d65fb542e4635cb3166cd9c01560651ad60f177", size = 249368 }, + { url = "https://files.pythonhosted.org/packages/f6/32/befed7f74c458b4a525e60519fe8d87eef72bb1e99924fa2b0f9d97a221e/multidict-6.7.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e82d14e3c948952a1a85503817e038cba5905a3352de76b9a465075d072fba23", size = 256952 }, + { url = "https://files.pythonhosted.org/packages/03/d6/c878a44ba877f366630c860fdf74bfb203c33778f12b6ac274936853c451/multidict-6.7.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4cfb48c6ea66c83bcaaf7e4dfa7ec1b6bbcf751b7db85a328902796dfde4c060", size = 240317 }, + { url = "https://files.pythonhosted.org/packages/68/49/57421b4d7ad2e9e60e25922b08ceb37e077b90444bde6ead629095327a6f/multidict-6.7.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1d540e51b7e8e170174555edecddbd5538105443754539193e3e1061864d444d", size = 267132 }, + { url = "https://files.pythonhosted.org/packages/b7/fe/ec0edd52ddbcea2a2e89e174f0206444a61440b40f39704e64dc807a70bd/multidict-6.7.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:273d23f4b40f3dce4d6c8a821c741a86dec62cded82e1175ba3d99be128147ed", size = 268140 }, + { url = "https://files.pythonhosted.org/packages/b0/73/6e1b01cbeb458807aa0831742232dbdd1fa92bfa33f52a3f176b4ff3dc11/multidict-6.7.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d624335fd4fa1c08a53f8b4be7676ebde19cd092b3895c421045ca87895b429", size = 254277 }, + { url = "https://files.pythonhosted.org/packages/6a/b2/5fb8c124d7561a4974c342bc8c778b471ebbeb3cc17df696f034a7e9afe7/multidict-6.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:12fad252f8b267cc75b66e8fc51b3079604e8d43a75428ffe193cd9e2195dfd6", size = 252291 }, + { url = "https://files.pythonhosted.org/packages/5a/96/51d4e4e06bcce92577fcd488e22600bd38e4fd59c20cb49434d054903bd2/multidict-6.7.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:03ede2a6ffbe8ef936b92cb4529f27f42be7f56afcdab5ab739cd5f27fb1cbf9", size = 250156 }, + { url = "https://files.pythonhosted.org/packages/db/6b/420e173eec5fba721a50e2a9f89eda89d9c98fded1124f8d5c675f7a0c0f/multidict-6.7.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:90efbcf47dbe33dcf643a1e400d67d59abeac5db07dc3f27d6bdeae497a2198c", size = 249742 }, + { url = "https://files.pythonhosted.org/packages/44/a3/ec5b5bd98f306bc2aa297b8c6f11a46714a56b1e6ef5ebda50a4f5d7c5fb/multidict-6.7.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5c4b9bfc148f5a91be9244d6264c53035c8a0dcd2f51f1c3c6e30e30ebaa1c84", size = 262221 }, + { url = "https://files.pythonhosted.org/packages/cd/f7/e8c0d0da0cd1e28d10e624604e1a36bcc3353aaebdfdc3a43c72bc683a12/multidict-6.7.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:401c5a650f3add2472d1d288c26deebc540f99e2fb83e9525007a74cd2116f1d", size = 258664 }, + { url = "https://files.pythonhosted.org/packages/52/da/151a44e8016dd33feed44f730bd856a66257c1ee7aed4f44b649fb7edeb3/multidict-6.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:97891f3b1b3ffbded884e2916cacf3c6fc87b66bb0dde46f7357404750559f33", size = 249490 }, + { url = "https://files.pythonhosted.org/packages/87/af/a3b86bf9630b732897f6fc3f4c4714b90aa4361983ccbdcd6c0339b21b0c/multidict-6.7.1-cp313-cp313-win32.whl", hash = "sha256:e1c5988359516095535c4301af38d8a8838534158f649c05dd1050222321bcb3", size = 41695 }, + { url = "https://files.pythonhosted.org/packages/b2/35/e994121b0e90e46134673422dd564623f93304614f5d11886b1b3e06f503/multidict-6.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:960c83bf01a95b12b08fd54324a4eb1d5b52c88932b5cba5d6e712bb3ed12eb5", size = 45884 }, + { url = "https://files.pythonhosted.org/packages/ca/61/42d3e5dbf661242a69c97ea363f2d7b46c567da8eadef8890022be6e2ab0/multidict-6.7.1-cp313-cp313-win_arm64.whl", hash = "sha256:563fe25c678aaba333d5399408f5ec3c383ca5b663e7f774dd179a520b8144df", size = 43122 }, + { url = "https://files.pythonhosted.org/packages/6d/b3/e6b21c6c4f314bb956016b0b3ef2162590a529b84cb831c257519e7fde44/multidict-6.7.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:c76c4bec1538375dad9d452d246ca5368ad6e1c9039dadcf007ae59c70619ea1", size = 83175 }, + { url = "https://files.pythonhosted.org/packages/fb/76/23ecd2abfe0957b234f6c960f4ade497f55f2c16aeb684d4ecdbf1c95791/multidict-6.7.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:57b46b24b5d5ebcc978da4ec23a819a9402b4228b8a90d9c656422b4bdd8a963", size = 48460 }, + { url = "https://files.pythonhosted.org/packages/c4/57/a0ed92b23f3a042c36bc4227b72b97eca803f5f1801c1ab77c8a212d455e/multidict-6.7.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e954b24433c768ce78ab7929e84ccf3422e46deb45a4dc9f93438f8217fa2d34", size = 46930 }, + { url = "https://files.pythonhosted.org/packages/b5/66/02ec7ace29162e447f6382c495dc95826bf931d3818799bbef11e8f7df1a/multidict-6.7.1-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3bd231490fa7217cc832528e1cd8752a96f0125ddd2b5749390f7c3ec8721b65", size = 242582 }, + { url = "https://files.pythonhosted.org/packages/58/18/64f5a795e7677670e872673aca234162514696274597b3708b2c0d276cce/multidict-6.7.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:253282d70d67885a15c8a7716f3a73edf2d635793ceda8173b9ecc21f2fb8292", size = 250031 }, + { url = "https://files.pythonhosted.org/packages/c8/ed/e192291dbbe51a8290c5686f482084d31bcd9d09af24f63358c3d42fd284/multidict-6.7.1-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0b4c48648d7649c9335cf1927a8b87fa692de3dcb15faa676c6a6f1f1aabda43", size = 228596 }, + { url = "https://files.pythonhosted.org/packages/1e/7e/3562a15a60cf747397e7f2180b0a11dc0c38d9175a650e75fa1b4d325e15/multidict-6.7.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:98bc624954ec4d2c7cb074b8eefc2b5d0ce7d482e410df446414355d158fe4ca", size = 257492 }, + { url = "https://files.pythonhosted.org/packages/24/02/7d0f9eae92b5249bb50ac1595b295f10e263dd0078ebb55115c31e0eaccd/multidict-6.7.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1b99af4d9eec0b49927b4402bcbb58dea89d3e0db8806a4086117019939ad3dd", size = 255899 }, + { url = "https://files.pythonhosted.org/packages/00/e3/9b60ed9e23e64c73a5cde95269ef1330678e9c6e34dd4eb6b431b85b5a10/multidict-6.7.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6aac4f16b472d5b7dc6f66a0d49dd57b0e0902090be16594dc9ebfd3d17c47e7", size = 247970 }, + { url = "https://files.pythonhosted.org/packages/3e/06/538e58a63ed5cfb0bd4517e346b91da32fde409d839720f664e9a4ae4f9d/multidict-6.7.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:21f830fe223215dffd51f538e78c172ed7c7f60c9b96a2bf05c4848ad49921c3", size = 245060 }, + { url = "https://files.pythonhosted.org/packages/b2/2f/d743a3045a97c895d401e9bd29aaa09b94f5cbdf1bd561609e5a6c431c70/multidict-6.7.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:f5dd81c45b05518b9aa4da4aa74e1c93d715efa234fd3e8a179df611cc85e5f4", size = 235888 }, + { url = "https://files.pythonhosted.org/packages/38/83/5a325cac191ab28b63c52f14f1131f3b0a55ba3b9aa65a6d0bf2a9b921a0/multidict-6.7.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:eb304767bca2bb92fb9c5bd33cedc95baee5bb5f6c88e63706533a1c06ad08c8", size = 243554 }, + { url = "https://files.pythonhosted.org/packages/20/1f/9d2327086bd15da2725ef6aae624208e2ef828ed99892b17f60c344e57ed/multidict-6.7.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:c9035dde0f916702850ef66460bc4239d89d08df4d02023a5926e7446724212c", size = 252341 }, + { url = "https://files.pythonhosted.org/packages/e8/2c/2a1aa0280cf579d0f6eed8ee5211c4f1730bd7e06c636ba2ee6aafda302e/multidict-6.7.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:af959b9beeb66c822380f222f0e0a1889331597e81f1ded7f374f3ecb0fd6c52", size = 246391 }, + { url = "https://files.pythonhosted.org/packages/e5/03/7ca022ffc36c5a3f6e03b179a5ceb829be9da5783e6fe395f347c0794680/multidict-6.7.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:41f2952231456154ee479651491e94118229844dd7226541788be783be2b5108", size = 243422 }, + { url = "https://files.pythonhosted.org/packages/dc/1d/b31650eab6c5778aceed46ba735bd97f7c7d2f54b319fa916c0f96e7805b/multidict-6.7.1-cp313-cp313t-win32.whl", hash = "sha256:df9f19c28adcb40b6aae30bbaa1478c389efd50c28d541d76760199fc1037c32", size = 47770 }, + { url = "https://files.pythonhosted.org/packages/ac/5b/2d2d1d522e51285bd61b1e20df8f47ae1a9d80839db0b24ea783b3832832/multidict-6.7.1-cp313-cp313t-win_amd64.whl", hash = "sha256:d54ecf9f301853f2c5e802da559604b3e95bb7a3b01a9c295c6ee591b9882de8", size = 53109 }, + { url = "https://files.pythonhosted.org/packages/3d/a3/cc409ba012c83ca024a308516703cf339bdc4b696195644a7215a5164a24/multidict-6.7.1-cp313-cp313t-win_arm64.whl", hash = "sha256:5a37ca18e360377cfda1d62f5f382ff41f2b8c4ccb329ed974cc2e1643440118", size = 45573 }, + { url = "https://files.pythonhosted.org/packages/91/cc/db74228a8be41884a567e88a62fd589a913708fcf180d029898c17a9a371/multidict-6.7.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8f333ec9c5eb1b7105e3b84b53141e66ca05a19a605368c55450b6ba208cb9ee", size = 75190 }, + { url = "https://files.pythonhosted.org/packages/d5/22/492f2246bb5b534abd44804292e81eeaf835388901f0c574bac4eeec73c5/multidict-6.7.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:a407f13c188f804c759fc6a9f88286a565c242a76b27626594c133b82883b5c2", size = 44486 }, + { url = "https://files.pythonhosted.org/packages/f1/4f/733c48f270565d78b4544f2baddc2fb2a245e5a8640254b12c36ac7ac68e/multidict-6.7.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0e161ddf326db5577c3a4cc2d8648f81456e8a20d40415541587a71620d7a7d1", size = 43219 }, + { url = "https://files.pythonhosted.org/packages/24/bb/2c0c2287963f4259c85e8bcbba9182ced8d7fca65c780c38e99e61629d11/multidict-6.7.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1e3a8bb24342a8201d178c3b4984c26ba81a577c80d4d525727427460a50c22d", size = 245132 }, + { url = "https://files.pythonhosted.org/packages/a7/f9/44d4b3064c65079d2467888794dea218d1601898ac50222ab8a9a8094460/multidict-6.7.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97231140a50f5d447d3164f994b86a0bed7cd016e2682f8650d6a9158e14fd31", size = 252420 }, + { url = "https://files.pythonhosted.org/packages/8b/13/78f7275e73fa17b24c9a51b0bd9d73ba64bb32d0ed51b02a746eb876abe7/multidict-6.7.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6b10359683bd8806a200fd2909e7c8ca3a7b24ec1d8132e483d58e791d881048", size = 233510 }, + { url = "https://files.pythonhosted.org/packages/4b/25/8167187f62ae3cbd52da7893f58cb036b47ea3fb67138787c76800158982/multidict-6.7.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:283ddac99f7ac25a4acadbf004cb5ae34480bbeb063520f70ce397b281859362", size = 264094 }, + { url = "https://files.pythonhosted.org/packages/a1/e7/69a3a83b7b030cf283fb06ce074a05a02322359783424d7edf0f15fe5022/multidict-6.7.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:538cec1e18c067d0e6103aa9a74f9e832904c957adc260e61cd9d8cf0c3b3d37", size = 260786 }, + { url = "https://files.pythonhosted.org/packages/fe/3b/8ec5074bcfc450fe84273713b4b0a0dd47c0249358f5d82eb8104ffe2520/multidict-6.7.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7eee46ccb30ff48a1e35bb818cc90846c6be2b68240e42a78599166722cea709", size = 248483 }, + { url = "https://files.pythonhosted.org/packages/48/5a/d5a99e3acbca0e29c5d9cba8f92ceb15dce78bab963b308ae692981e3a5d/multidict-6.7.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fa263a02f4f2dd2d11a7b1bb4362aa7cb1049f84a9235d31adf63f30143469a0", size = 248403 }, + { url = "https://files.pythonhosted.org/packages/35/48/e58cd31f6c7d5102f2a4bf89f96b9cf7e00b6c6f3d04ecc44417c00a5a3c/multidict-6.7.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:2e1425e2f99ec5bd36c15a01b690a1a2456209c5deed58f95469ffb46039ccbb", size = 240315 }, + { url = "https://files.pythonhosted.org/packages/94/33/1cd210229559cb90b6786c30676bb0c58249ff42f942765f88793b41fdce/multidict-6.7.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:497394b3239fc6f0e13a78a3e1b61296e72bf1c5f94b4c4eb80b265c37a131cd", size = 245528 }, + { url = "https://files.pythonhosted.org/packages/64/f2/6e1107d226278c876c783056b7db43d800bb64c6131cec9c8dfb6903698e/multidict-6.7.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:233b398c29d3f1b9676b4b6f75c518a06fcb2ea0b925119fb2c1bc35c05e1601", size = 258784 }, + { url = "https://files.pythonhosted.org/packages/4d/c1/11f664f14d525e4a1b5327a82d4de61a1db604ab34c6603bb3c2cc63ad34/multidict-6.7.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:93b1818e4a6e0930454f0f2af7dfce69307ca03cdcfb3739bf4d91241967b6c1", size = 251980 }, + { url = "https://files.pythonhosted.org/packages/e1/9f/75a9ac888121d0c5bbd4ecf4eead45668b1766f6baabfb3b7f66a410e231/multidict-6.7.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f33dc2a3abe9249ea5d8360f969ec7f4142e7ac45ee7014d8f8d5acddf178b7b", size = 243602 }, + { url = "https://files.pythonhosted.org/packages/9a/e7/50bf7b004cc8525d80dbbbedfdc7aed3e4c323810890be4413e589074032/multidict-6.7.1-cp314-cp314-win32.whl", hash = "sha256:3ab8b9d8b75aef9df299595d5388b14530839f6422333357af1339443cff777d", size = 40930 }, + { url = "https://files.pythonhosted.org/packages/e0/bf/52f25716bbe93745595800f36fb17b73711f14da59ed0bb2eba141bc9f0f/multidict-6.7.1-cp314-cp314-win_amd64.whl", hash = "sha256:5e01429a929600e7dab7b166062d9bb54a5eed752384c7384c968c2afab8f50f", size = 45074 }, + { url = "https://files.pythonhosted.org/packages/97/ab/22803b03285fa3a525f48217963da3a65ae40f6a1b6f6cf2768879e208f9/multidict-6.7.1-cp314-cp314-win_arm64.whl", hash = "sha256:4885cb0e817aef5d00a2e8451d4665c1808378dc27c2705f1bf4ef8505c0d2e5", size = 42471 }, + { url = "https://files.pythonhosted.org/packages/e0/6d/f9293baa6146ba9507e360ea0292b6422b016907c393e2f63fc40ab7b7b5/multidict-6.7.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:0458c978acd8e6ea53c81eefaddbbee9c6c5e591f41b3f5e8e194780fe026581", size = 82401 }, + { url = "https://files.pythonhosted.org/packages/7a/68/53b5494738d83558d87c3c71a486504d8373421c3e0dbb6d0db48ad42ee0/multidict-6.7.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:c0abd12629b0af3cf590982c0b413b1e7395cd4ec026f30986818ab95bfaa94a", size = 48143 }, + { url = "https://files.pythonhosted.org/packages/37/e8/5284c53310dcdc99ce5d66563f6e5773531a9b9fe9ec7a615e9bc306b05f/multidict-6.7.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:14525a5f61d7d0c94b368a42cff4c9a4e7ba2d52e2672a7b23d84dc86fb02b0c", size = 46507 }, + { url = "https://files.pythonhosted.org/packages/e4/fc/6800d0e5b3875568b4083ecf5f310dcf91d86d52573160834fb4bfcf5e4f/multidict-6.7.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:17307b22c217b4cf05033dabefe68255a534d637c6c9b0cc8382718f87be4262", size = 239358 }, + { url = "https://files.pythonhosted.org/packages/41/75/4ad0973179361cdf3a113905e6e088173198349131be2b390f9fa4da5fc6/multidict-6.7.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a7e590ff876a3eaf1c02a4dfe0724b6e69a9e9de6d8f556816f29c496046e59", size = 246884 }, + { url = "https://files.pythonhosted.org/packages/c3/9c/095bb28b5da139bd41fb9a5d5caff412584f377914bd8787c2aa98717130/multidict-6.7.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5fa6a95dfee63893d80a34758cd0e0c118a30b8dcb46372bf75106c591b77889", size = 225878 }, + { url = "https://files.pythonhosted.org/packages/07/d0/c0a72000243756e8f5a277b6b514fa005f2c73d481b7d9e47cd4568aa2e4/multidict-6.7.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a0543217a6a017692aa6ae5cc39adb75e587af0f3a82288b1492eb73dd6cc2a4", size = 253542 }, + { url = "https://files.pythonhosted.org/packages/c0/6b/f69da15289e384ecf2a68837ec8b5ad8c33e973aa18b266f50fe55f24b8c/multidict-6.7.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f99fe611c312b3c1c0ace793f92464d8cd263cc3b26b5721950d977b006b6c4d", size = 252403 }, + { url = "https://files.pythonhosted.org/packages/a2/76/b9669547afa5a1a25cd93eaca91c0da1c095b06b6d2d8ec25b713588d3a1/multidict-6.7.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9004d8386d133b7e6135679424c91b0b854d2d164af6ea3f289f8f2761064609", size = 244889 }, + { url = "https://files.pythonhosted.org/packages/7e/a9/a50d2669e506dad33cfc45b5d574a205587b7b8a5f426f2fbb2e90882588/multidict-6.7.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e628ef0e6859ffd8273c69412a2465c4be4a9517d07261b33334b5ec6f3c7489", size = 241982 }, + { url = "https://files.pythonhosted.org/packages/c5/bb/1609558ad8b456b4827d3c5a5b775c93b87878fd3117ed3db3423dfbce1b/multidict-6.7.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:841189848ba629c3552035a6a7f5bf3b02eb304e9fea7492ca220a8eda6b0e5c", size = 232415 }, + { url = "https://files.pythonhosted.org/packages/d8/59/6f61039d2aa9261871e03ab9dc058a550d240f25859b05b67fd70f80d4b3/multidict-6.7.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:ce1bbd7d780bb5a0da032e095c951f7014d6b0a205f8318308140f1a6aba159e", size = 240337 }, + { url = "https://files.pythonhosted.org/packages/a1/29/fdc6a43c203890dc2ae9249971ecd0c41deaedfe00d25cb6564b2edd99eb/multidict-6.7.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b26684587228afed0d50cf804cc71062cc9c1cdf55051c4c6345d372947b268c", size = 248788 }, + { url = "https://files.pythonhosted.org/packages/a9/14/a153a06101323e4cf086ecee3faadba52ff71633d471f9685c42e3736163/multidict-6.7.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:9f9af11306994335398293f9958071019e3ab95e9a707dc1383a35613f6abcb9", size = 242842 }, + { url = "https://files.pythonhosted.org/packages/41/5f/604ae839e64a4a6efc80db94465348d3b328ee955e37acb24badbcd24d83/multidict-6.7.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b4938326284c4f1224178a560987b6cf8b4d38458b113d9b8c1db1a836e640a2", size = 240237 }, + { url = "https://files.pythonhosted.org/packages/5f/60/c3a5187bf66f6fb546ff4ab8fb5a077cbdd832d7b1908d4365c7f74a1917/multidict-6.7.1-cp314-cp314t-win32.whl", hash = "sha256:98655c737850c064a65e006a3df7c997cd3b220be4ec8fe26215760b9697d4d7", size = 48008 }, + { url = "https://files.pythonhosted.org/packages/0c/f7/addf1087b860ac60e6f382240f64fb99f8bfb532bb06f7c542b83c29ca61/multidict-6.7.1-cp314-cp314t-win_amd64.whl", hash = "sha256:497bde6223c212ba11d462853cfa4f0ae6ef97465033e7dc9940cdb3ab5b48e5", size = 53542 }, + { url = "https://files.pythonhosted.org/packages/4c/81/4629d0aa32302ef7b2ec65c75a728cc5ff4fa410c50096174c1632e70b3e/multidict-6.7.1-cp314-cp314t-win_arm64.whl", hash = "sha256:2bbd113e0d4af5db41d5ebfe9ccaff89de2120578164f86a5d17d5a576d1e5b2", size = 44719 }, + { url = "https://files.pythonhosted.org/packages/81/08/7036c080d7117f28a4af526d794aab6a84463126db031b007717c1a6676e/multidict-6.7.1-py3-none-any.whl", hash = "sha256:55d97cc6dae627efa6a6e548885712d4864b81110ac76fa4e534c03819fa4a56", size = 12319 }, +] + [[package]] name = "murmurhash" version = "1.0.15" @@ -1755,20 +2408,41 @@ version = "2.5.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.15' and sys_platform == 'win32'", - "python_full_version >= '3.15' and platform_system == 'Linux' and sys_platform == 'emscripten'", - "python_full_version >= '3.15' and platform_system != 'Linux' and sys_platform == 'emscripten'", - "python_full_version >= '3.15' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.15' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.15' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version >= '3.15' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version >= '3.15' and platform_system == 'Darwin' and sys_platform == 'emscripten'", + "python_full_version >= '3.15' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform == 'emscripten'", + "python_full_version >= '3.15' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.15' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.15' and platform_system == 'Darwin' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.15' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.14.*' and sys_platform == 'win32'", - "python_full_version == '3.14.*' and platform_system == 'Linux' and sys_platform == 'emscripten'", - "python_full_version == '3.14.*' and platform_system != 'Linux' and sys_platform == 'emscripten'", - "python_full_version == '3.14.*' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.14.*' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_system == 'Linux' and sys_platform == 'emscripten'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_system != 'Linux' and sys_platform == 'emscripten'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.14.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.14.*' and platform_system == 'Darwin' and sys_platform == 'emscripten'", + "python_full_version == '3.14.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.14.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and platform_system == 'Darwin' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and platform_system == 'Darwin' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and platform_system == 'Darwin' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and platform_system == 'Darwin' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and platform_system == 'Darwin' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", ] sdist = { url = "https://files.pythonhosted.org/packages/22/fd/89965aa4ac08c74998539fcbf24fa3540f3e15237fbeb6bcf9c908f4aade/numpy-2.5.1.tar.gz", hash = "sha256:a48a113e6afea91f5608793bafa7ef2ad481fefbda87ec5069f483de61cb9fa3", size = 20755553 } wheels = [ @@ -1975,38 +2649,20 @@ version = "0.1.0" source = { editable = "." } dependencies = [ { name = "langchain-text-splitters" }, - { name = "layoutparser" }, - { name = "legacy-cgi" }, { name = "nbformat" }, { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, { name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, - { name = "opencv-python-headless", version = "4.11.0.86", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, - { name = "opencv-python-headless", version = "5.0.0.93", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, - { name = "paddleocr" }, - { name = "paddlepaddle" }, + { name = "opencv-python-headless" }, { name = "pillow" }, { name = "platformdirs" }, { name = "pydantic" }, { name = "pydantic-settings" }, { name = "pytesseract" }, - { name = "python-magic" }, - { name = "python-slugify" }, { name = "pyyaml" }, { name = "rich" }, - { name = "scikit-image", version = "0.22.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, - { name = "scikit-image", version = "0.26.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, - { name = "spacy", version = "3.7.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, - { name = "spacy", version = "3.8.11", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, - { name = "sqlite-utils" }, { name = "structlog" }, - { name = "timm" }, - { name = "torch" }, - { name = "torchvision" }, - { name = "tqdm" }, - { name = "transformers" }, { name = "typer" }, { name = "watchdog" }, - { name = "xxhash" }, ] [package.optional-dependencies] @@ -2018,13 +2674,40 @@ dev = [ { name = "pytest-mock" }, { name = "ruff" }, ] +figures = [ + { name = "layoutparser" }, + { name = "legacy-cgi", marker = "python_full_version >= '3.13'" }, +] full = [ - { name = "mypy" }, - { name = "pre-commit" }, - { name = "pytest" }, - { name = "pytest-cov" }, - { name = "pytest-mock" }, - { name = "ruff" }, + { name = "layoutparser" }, + { name = "legacy-cgi", marker = "python_full_version >= '3.13'" }, + { name = "paddleocr" }, + { name = "paddlepaddle" }, + { name = "spacy", version = "3.7.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, + { name = "spacy", version = "3.8.11", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "timm" }, + { name = "torch" }, + { name = "torchvision" }, + { name = "transformers" }, +] +kg = [ + { name = "litellm" }, + { name = "python-dotenv" }, + { name = "txtai" }, +] +paddle = [ + { name = "paddleocr" }, + { name = "paddlepaddle" }, +] +scientific = [ + { name = "spacy", version = "3.7.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, + { name = "spacy", version = "3.8.11", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, +] +tables = [ + { name = "timm" }, + { name = "torch" }, + { name = "torchvision" }, + { name = "transformers" }, ] [package.dev-dependencies] @@ -2040,16 +2723,17 @@ dev = [ [package.metadata] requires-dist = [ { name = "langchain-text-splitters", specifier = ">=0.0.2" }, - { name = "layoutparser", specifier = ">=0.3.0" }, - { name = "legacy-cgi", specifier = ">=2.6.2" }, + { name = "layoutparser", marker = "extra == 'figures'", specifier = ">=0.3.0" }, + { name = "legacy-cgi", marker = "python_full_version >= '3.13' and extra == 'figures'", specifier = ">=2.6.2" }, + { name = "litellm", marker = "extra == 'kg'", specifier = ">=1.40.0" }, { name = "mypy", marker = "extra == 'dev'", specifier = ">=1.8.0" }, { name = "nbformat", specifier = ">=5.9.0" }, { name = "numpy", marker = "python_full_version < '3.12'", specifier = ">=1.26.0,<2.0" }, { name = "numpy", marker = "python_full_version >= '3.12'", specifier = ">=1.26.0" }, - { name = "ocr-pipeline", extras = ["dev"], marker = "extra == 'full'" }, - { name = "opencv-python-headless", specifier = ">=4.9.0" }, - { name = "paddleocr", specifier = ">=2.7.0,<3.0.0" }, - { name = "paddlepaddle", specifier = ">=2.6.0" }, + { name = "ocr-pipeline", extras = ["paddle", "tables", "figures", "scientific"], marker = "extra == 'full'" }, + { name = "opencv-python-headless", specifier = ">=4.9.0,<5.0.0" }, + { name = "paddleocr", marker = "extra == 'paddle'", specifier = ">=2.7.0,<3.0.0" }, + { name = "paddlepaddle", marker = "extra == 'paddle'", specifier = ">=2.6.0" }, { name = "pillow", specifier = ">=10.2.0" }, { name = "platformdirs", specifier = ">=4.2.0" }, { name = "pre-commit", marker = "extra == 'dev'", specifier = ">=3.6.0" }, @@ -2059,25 +2743,20 @@ requires-dist = [ { name = "pytest", marker = "extra == 'dev'", specifier = ">=8.0.0" }, { name = "pytest-cov", marker = "extra == 'dev'", specifier = ">=4.1.0" }, { name = "pytest-mock", marker = "extra == 'dev'", specifier = ">=3.12.0" }, - { name = "python-magic", specifier = ">=0.4.27" }, - { name = "python-slugify", specifier = ">=8.0.0" }, + { name = "python-dotenv", marker = "extra == 'kg'", specifier = ">=1.0.0" }, { name = "pyyaml", specifier = ">=6.0.1" }, { name = "rich", specifier = ">=13.7.0" }, { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.2.0" }, - { name = "scikit-image", marker = "python_full_version < '3.12'", specifier = ">=0.22.0,<0.23.0" }, - { name = "scikit-image", marker = "python_full_version >= '3.12'", specifier = ">=0.22.0" }, - { name = "spacy", marker = "python_full_version < '3.12'", specifier = ">=3.7.0,<3.8.0" }, - { name = "spacy", marker = "python_full_version >= '3.12'", specifier = ">=3.7.0" }, - { name = "sqlite-utils", specifier = ">=3.37.0" }, + { name = "spacy", marker = "python_full_version >= '3.12' and extra == 'scientific'", specifier = ">=3.7.0" }, + { name = "spacy", marker = "python_full_version < '3.12' and extra == 'scientific'", specifier = ">=3.7.0,<3.8.0" }, { name = "structlog", specifier = ">=24.1.0" }, - { name = "timm", specifier = ">=1.0.0" }, - { name = "torch", specifier = ">=2.2.0" }, - { name = "torchvision", specifier = ">=0.17.0" }, - { name = "tqdm", specifier = ">=4.66.0" }, - { name = "transformers", specifier = ">=4.38.0" }, + { name = "timm", marker = "extra == 'tables'", specifier = ">=1.0.0" }, + { name = "torch", marker = "extra == 'tables'", specifier = ">=2.2.0" }, + { name = "torchvision", marker = "extra == 'tables'", specifier = ">=0.17.0" }, + { name = "transformers", marker = "extra == 'tables'", specifier = ">=4.38.0" }, + { name = "txtai", marker = "extra == 'kg'", specifier = ">=7.4.0" }, { name = "typer", extras = ["all"], specifier = ">=0.9.0" }, { name = "watchdog", specifier = ">=3.0.0" }, - { name = "xxhash", specifier = ">=3.4.0" }, ] [package.metadata.requires-dev] @@ -2090,6 +2769,25 @@ dev = [ { name = "ruff", specifier = ">=0.2.0" }, ] +[[package]] +name = "openai" +version = "2.46.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "distro" }, + { name = "httpx" }, + { name = "jiter" }, + { name = "pydantic" }, + { name = "sniffio" }, + { name = "tqdm" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/af/ac/f725c4efbda8657d02be684607e5a2e5ce362e4790fdbcbdfb7c15018647/openai-2.46.0.tar.gz", hash = "sha256:0421e0735ac41451cad894af4cddf0435bfbf8cbc538ac0e15b3c062f2ddc06a", size = 1114628 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ea/7b/206238ebcb50b235942b1c66dba4974776f2057402a8d91c399be587d66a/openai-2.46.0-py3-none-any.whl", hash = "sha256:672381db55efb3a1e2610f29304c130cccdd0b319bace4d492b2443cb64c1e7c", size = 1637556 }, +] + [[package]] name = "opencv-contrib-python" version = "4.11.0.86" @@ -2124,20 +2822,41 @@ version = "5.0.0.93" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.15' and sys_platform == 'win32'", - "python_full_version >= '3.15' and platform_system == 'Linux' and sys_platform == 'emscripten'", - "python_full_version >= '3.15' and platform_system != 'Linux' and sys_platform == 'emscripten'", - "python_full_version >= '3.15' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.15' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.15' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version >= '3.15' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version >= '3.15' and platform_system == 'Darwin' and sys_platform == 'emscripten'", + "python_full_version >= '3.15' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform == 'emscripten'", + "python_full_version >= '3.15' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.15' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.15' and platform_system == 'Darwin' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.15' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.14.*' and sys_platform == 'win32'", - "python_full_version == '3.14.*' and platform_system == 'Linux' and sys_platform == 'emscripten'", - "python_full_version == '3.14.*' and platform_system != 'Linux' and sys_platform == 'emscripten'", - "python_full_version == '3.14.*' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.14.*' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_system == 'Linux' and sys_platform == 'emscripten'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_system != 'Linux' and sys_platform == 'emscripten'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.14.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.14.*' and platform_system == 'Darwin' and sys_platform == 'emscripten'", + "python_full_version == '3.14.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.14.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and platform_system == 'Darwin' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and platform_system == 'Darwin' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and platform_system == 'Darwin' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and platform_system == 'Darwin' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and platform_system == 'Darwin' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", ] dependencies = [ { name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, @@ -2188,20 +2907,41 @@ version = "5.0.0.93" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.15' and sys_platform == 'win32'", - "python_full_version >= '3.15' and platform_system == 'Linux' and sys_platform == 'emscripten'", - "python_full_version >= '3.15' and platform_system != 'Linux' and sys_platform == 'emscripten'", - "python_full_version >= '3.15' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.15' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.15' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version >= '3.15' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version >= '3.15' and platform_system == 'Darwin' and sys_platform == 'emscripten'", + "python_full_version >= '3.15' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform == 'emscripten'", + "python_full_version >= '3.15' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.15' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.15' and platform_system == 'Darwin' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.15' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.14.*' and sys_platform == 'win32'", - "python_full_version == '3.14.*' and platform_system == 'Linux' and sys_platform == 'emscripten'", - "python_full_version == '3.14.*' and platform_system != 'Linux' and sys_platform == 'emscripten'", - "python_full_version == '3.14.*' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.14.*' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_system == 'Linux' and sys_platform == 'emscripten'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_system != 'Linux' and sys_platform == 'emscripten'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.14.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.14.*' and platform_system == 'Darwin' and sys_platform == 'emscripten'", + "python_full_version == '3.14.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.14.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and platform_system == 'Darwin' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and platform_system == 'Darwin' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and platform_system == 'Darwin' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and platform_system == 'Darwin' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and platform_system == 'Darwin' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", ] dependencies = [ { name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, @@ -2222,19 +2962,9 @@ wheels = [ name = "opencv-python-headless" version = "4.11.0.86" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.12' and sys_platform == 'win32'", - "python_full_version < '3.12' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", - "python_full_version < '3.12' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", - "python_full_version < '3.12' and platform_system == 'Darwin' and sys_platform == 'emscripten'", - "python_full_version < '3.12' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform == 'emscripten'", - "python_full_version < '3.12' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version < '3.12' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version < '3.12' and platform_system == 'Darwin' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version < '3.12' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", -] dependencies = [ { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, + { name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/36/2f/5b2b3ba52c864848885ba988f24b7f105052f68da9ab0e693cc7c25b0b30/opencv-python-headless-4.11.0.86.tar.gz", hash = "sha256:996eb282ca4b43ec6a3972414de0e2331f5d9cda2b41091a49739c19fb843798", size = 95177929 } wheels = [ @@ -2246,42 +2976,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/86/8a/69176a64335aed183529207ba8bc3d329c2999d852b4f3818027203f50e6/opencv_python_headless-4.11.0.86-cp37-abi3-win_amd64.whl", hash = "sha256:6c304df9caa7a6a5710b91709dd4786bf20a74d57672b3c31f7033cc638174ca", size = 39402386 }, ] -[[package]] -name = "opencv-python-headless" -version = "5.0.0.93" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.15' and sys_platform == 'win32'", - "python_full_version >= '3.15' and platform_system == 'Linux' and sys_platform == 'emscripten'", - "python_full_version >= '3.15' and platform_system != 'Linux' and sys_platform == 'emscripten'", - "python_full_version >= '3.15' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.15' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.14.*' and sys_platform == 'win32'", - "python_full_version == '3.14.*' and platform_system == 'Linux' and sys_platform == 'emscripten'", - "python_full_version == '3.14.*' and platform_system != 'Linux' and sys_platform == 'emscripten'", - "python_full_version == '3.14.*' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.14.*' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_system == 'Linux' and sys_platform == 'emscripten'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_system != 'Linux' and sys_platform == 'emscripten'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", -] -dependencies = [ - { name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/1d/99/76b7c80252aa83c1af16393454aafd125a0287101afe8deb0a6821af0e30/opencv_python_headless-5.0.0.93.tar.gz", hash = "sha256:b82f9831daab90b725c7c1ee1b36cb5732c367096ac76d119e64e14eb70d5f3c", size = 81817738 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/53/7c/8c8097891c509d98cd128493835c95631c80be6a8f37ed9d25716c2e16f1/opencv_python_headless-5.0.0.93-cp37-abi3-macosx_13_0_arm64.whl", hash = "sha256:030ca5e0837a2963ab36ef896baa9767eb8d2b83353fb28af5a521e40dd8756f", size = 48322581 }, - { url = "https://files.pythonhosted.org/packages/90/8c/eab2ad388c3cbab2a350c10c2ef19ce6bd099240afc31789032c996bab52/opencv_python_headless-5.0.0.93-cp37-abi3-macosx_14_0_x86_64.whl", hash = "sha256:1e55af3abfb462eeeabe5c775f12bdb36216d8a93a3583d69e6bd6e1d6ba7d00", size = 34782894 }, - { url = "https://files.pythonhosted.org/packages/ec/78/afca939f40ffe2b2380bfa86f812b2f7d4acc5a27b27dc41b49cad7ce7b4/opencv_python_headless-5.0.0.93-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:10818d91510e05c04568ae12b5cd120779c70c01bf897b001a6221fe430df80f", size = 36521085 }, - { url = "https://files.pythonhosted.org/packages/2b/97/8170e9819764c47e436c130d3ff6cfb73b58f923eae9d3a03d8982b04aec/opencv_python_headless-5.0.0.93-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:09a872a157c1376ab922a69bbf22f9a95bcc7b658a9d8b436a60212b02b2eeb4", size = 56563598 }, - { url = "https://files.pythonhosted.org/packages/3a/98/1a28a7101e31801042b3098871a74b76c61581d328ef40774ff4edb53a56/opencv_python_headless-5.0.0.93-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:840bd717c21e5c11cadadc022a823315ea417f961213d06b4df010e019eb16f4", size = 39648433 }, - { url = "https://files.pythonhosted.org/packages/9b/21/f6ef335f6e65724aa78b8d792b48d40a48c381715f1e62f5a5049e09d07e/opencv_python_headless-5.0.0.93-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:ed709fdf9aa0bd1f2ed8549e71d19449b03a675bb581eb292285f6861953be37", size = 61204038 }, - { url = "https://files.pythonhosted.org/packages/d0/8f/b8756467ea991449a293797f6b3fa80fcfdd29598a0a60d1cd5715b96e61/opencv_python_headless-5.0.0.93-cp37-abi3-win32.whl", hash = "sha256:c6bcd96b185975ea240d22cfdb15a1f6d080cc95264cfbe2621f21bb144d89b9", size = 35411237 }, - { url = "https://files.pythonhosted.org/packages/b8/88/763b967f7efd7226b82c9fae16d560cba049b1f0c036647e65c610fd636e/opencv_python_headless-5.0.0.93-cp37-abi3-win_amd64.whl", hash = "sha256:829717b6a95554f273e49e357cee3b3a2a26b6f4842fbc1bed2b45bdd8f87e0e", size = 43825962 }, -] - [[package]] name = "opt-einsum" version = "3.3.0" @@ -2628,15 +3322,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/36/54/0169bc772ec491108b62f644f8ecf1fe5d8ae5ebafde2ee2142210166903/pillow-12.3.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:04f01d28a6aaff387bf842a13be313df23ba0597a44f1a976c9feb3c6ff4711a", size = 7231786 }, ] -[[package]] -name = "pip" -version = "26.1.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/01/91/47e7d486260f618783899587af63ccf7980fb60245c3e63dd4571c6b57ad/pip-26.1.2.tar.gz", hash = "sha256:f49cd134c61cf2fd75e0ce2676db03e4054504a5a4986d00f8299ae632dc4605", size = 1840799 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5d/95/6b5cb3461ea5673ba0995989746db58eb18b91b54dbf331e72f569540946/pip-26.1.2-py3-none-any.whl", hash = "sha256:382ff9f685ee3bc25864f820aa50505825f10f5458ffff07e30a6d96e5715cab", size = 1813144 }, -] - [[package]] name = "platformdirs" version = "4.10.1" @@ -2735,6 +3420,117 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/22/80/368139067603e590a000122355f9c8576c8ebed4fb0b8849feaa2698489d/preshed-3.0.13-cp314-cp314t-win_arm64.whl", hash = "sha256:b980f3ea9bb74b7f94464bc3d6eb3c9162b6b79b531febd14c6465c24344d2cc", size = 119339 }, ] +[[package]] +name = "propcache" +version = "0.5.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/44/c87281c333769159c50594f22610f77398a47ccbfbbf23074e744e86f87c/propcache-0.5.2.tar.gz", hash = "sha256:01c4fc7480cd0598bb4b57022df55b9ca296da7fc5a8760bd8451a7e63a7d427", size = 50208 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/f1/8a8cc1c2c7e7934ab77e0163414f736fadbc0f5e8dd9673b952355ac175b/propcache-0.5.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:74b70780220e2dd89175ca24b81b68b67c83db499ae611e7f2313cb329801c78", size = 90744 }, + { url = "https://files.pythonhosted.org/packages/c2/f4/651b1225e976bd1a2ba5cfba0c29d096581c2636b437e3a9a7ab6276270a/propcache-0.5.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a4840ab0ae0216d952f4b53dc6d0b992bfc2bedbfe360bdd9b548bc184c08959", size = 52033 }, + { url = "https://files.pythonhosted.org/packages/15/a8/8ede85d6aa1f79fc7dc2f8fd2c8d65920b8272c3892903c8a1affde48cfb/propcache-0.5.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c6844ba6364fb12f403928a82cfd295ab103a2b315c77c747b2dbe4a41894ea7", size = 52754 }, + { url = "https://files.pythonhosted.org/packages/7d/fe/b3551b41bbc2f5b5bb088fc6920567cd43101253e68fbaa261339eb96fe1/propcache-0.5.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2293949b855ce597f2826452d17c2d545fb5622379c4ea6fdf525e9b8e8a2511", size = 57573 }, + { url = "https://files.pythonhosted.org/packages/83/27/ab851ebd1b7172e3e161f5f8d39e315d54a91bea246f01f4d872d3376aef/propcache-0.5.2-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0fd59b5af35f74da48d905dcbad55449ba13be91823cb05a9bd590bbf5b61660", size = 60645 }, + { url = "https://files.pythonhosted.org/packages/95/7d/466b3d18022e9897cbda9c735c493c5bd747d7a4c6f5ea1480b4cec434b6/propcache-0.5.2-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29f9309a2e42b0d273be006fdb4be2d6c39a47f6f57d8fb1cf9f81481df81b66", size = 61563 }, + { url = "https://files.pythonhosted.org/packages/27/1b/16ab7f2cf2041da2f60d156ba64c2484eadf9168075b4ff43c3ef60045af/propcache-0.5.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5aaa2b923c1944ac8febd6609cb373540a5563e7cbcb0fd770f75dace2eb817b", size = 58888 }, + { url = "https://files.pythonhosted.org/packages/0a/67/bb777ffd907633563bf35fd859c4ce97b0512c32f4633cf5d1eb7c33512b/propcache-0.5.2-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:66ea454f095ddf5b6b14f56c064c0941c4788be11e18d2464cf643bf7203ff67", size = 59253 }, + { url = "https://files.pythonhosted.org/packages/b9/42/64f8d90b73fd9cdc1499b48057ff6d9cd2a98a25734c9bb62ecf07e87061/propcache-0.5.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:95f1e3f4760d404b13c9976c0229b2b49a3c8e2c62a9ce92efdd2b11ada75e3f", size = 57558 }, + { url = "https://files.pythonhosted.org/packages/eb/02/dba5bc03c9041f2092ea55a449caf5dfe68352c6654511b29ba0654ddb69/propcache-0.5.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:85341b12b9d55bad0bded24cac341bb34289469e03a11f3f583ea1cc1db0326c", size = 55007 }, + { url = "https://files.pythonhosted.org/packages/14/c0/43f649c7aa2a77a3b100d84e9dea3a483120ecb608bfe36ce49eaff517fe/propcache-0.5.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:26a4dca084132874e639895c3135dfad5eb20bae209f62d1aeb31b03e601c3c0", size = 60355 }, + { url = "https://files.pythonhosted.org/packages/83/c0/435dafd27f1cb4a495381dae60e25883ccfe4020bb72818e8184c1678092/propcache-0.5.2-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:3b199b9b2b3d6a7edf3183ba8a9a137a22b97f7df525feb5ae1eccf026d2a9c6", size = 59057 }, + { url = "https://files.pythonhosted.org/packages/53/ae/6e292df9135d659944e96cb3389258e4a663e5b2b5f6c217ef0ddc8d2f73/propcache-0.5.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e59bc9e66329185b93dab73f210f1a37f81cb40f321501db8017c9aea15dba27", size = 61938 }, + { url = "https://files.pythonhosted.org/packages/0b/42/314ebc50d8159055411fd6b0bda322ff510e4b1f7d2e4927940ad0f6af20/propcache-0.5.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:552ffadf6ad409844bc5919c42a0a83d88314cedddaea0e41e80a8b8fffe881f", size = 59731 }, + { url = "https://files.pythonhosted.org/packages/b8/9b/2da6dee38871c3c8772fabc2758325a5c9077d6d18c597737dc04dd884cd/propcache-0.5.2-cp311-cp311-win32.whl", hash = "sha256:cd416c1de191973c52ff1a12a57446bfc7642797b282d7caf2162d7d1b8aa9a0", size = 38966 }, + { url = "https://files.pythonhosted.org/packages/42/4e/f17363fb58c0afe05b067361cb6d86ed2d29de6506779a27547c4d183075/propcache-0.5.2-cp311-cp311-win_amd64.whl", hash = "sha256:44e488ef40dbb452700b2b1f8188934121f6648f52c295055662d2191959ff82", size = 42135 }, + { url = "https://files.pythonhosted.org/packages/c6/eb/6af6685077d22e8b33358d3c548e3282706a0b3cd85044ffba4e5dd08e3b/propcache-0.5.2-cp311-cp311-win_arm64.whl", hash = "sha256:54adaa85a22078d1e306304a40984dc5be99d599bf3dc0a24dc98f7daeab89ab", size = 38381 }, + { url = "https://files.pythonhosted.org/packages/4a/cb/e27bc2b2737a0bb49962b275efa051e8f1c35a936df7d5139b6b658b7dc9/propcache-0.5.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:806719138ecd720339a12410fb9614ac9b2b2d3a5fdf8235d56981c36f4039ba", size = 95887 }, + { url = "https://files.pythonhosted.org/packages/e6/13/b8ae04c59392f8d11c6cd9fb4011d1dc7c86b81225c770280300e259ffe1/propcache-0.5.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:db2b80ea58eab4f86b2beec3cc8b39e8ff9276ac20e96b7cce43c8ae84cd6b5a", size = 54654 }, + { url = "https://files.pythonhosted.org/packages/2c/7d/49777a3e20b55863d4794384a38acd460c04157b0a00f8602b0d508b8431/propcache-0.5.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e5cbfac9f61484f7e9f3597775500cd3ebe8274e9b050c38f9525c77c97520bf", size = 55190 }, + { url = "https://files.pythonhosted.org/packages/44/c7/085d0cd63062e84044e3f05797749c3f8e3938ff3aeb0eb2f69d43fafc91/propcache-0.5.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5dbc581d2814337da56222fab8dc5f161cd798a434e49bac27930aaef798e144", size = 59995 }, + { url = "https://files.pythonhosted.org/packages/9c/42/32cf8e3009e92b2645cf1e944f701e8ea4e924dffde1ee26db860bcbf7e4/propcache-0.5.2-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:857187f381f88c8e2fa2fe56ab94879d011b883d5a2ee5a1b60a8cd2a06846d9", size = 63422 }, + { url = "https://files.pythonhosted.org/packages/9e/1b/f112433f99fc979431b87a39ef169e3f8df070d99a72792c56d6937ac48b/propcache-0.5.2-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:178b4a2cdaac1818e2bf1c5a99b94383fa73ea5382e032a48dec07dc5668dc42", size = 64342 }, + { url = "https://files.pythonhosted.org/packages/14/15/5574111ae50dd6e879456888c0eadd4c5a869959775854e18e18a6b345f3/propcache-0.5.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6f328175a2cde1f0ff2c4ed8ce968b9dcfb55f3a7153f39e2957ed994da13476", size = 61639 }, + { url = "https://files.pythonhosted.org/packages/cc/da/4d775080b1490c0ae604acda868bd71aabe3a89ed16f2aa4339eb8a283e7/propcache-0.5.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5671d09a36b06d0fd4a3da0fccbcae360e9b1570924171a15e9e0997f0249fba", size = 61588 }, + { url = "https://files.pythonhosted.org/packages/04/ac/f076982cbe2195ee9cf32de5a1e46951d9fb399fc207f390562dd0fd8fb2/propcache-0.5.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:80168e2ebe4d3ec6599d10ad8f520304ae1cad9b6c5a95372aef1b66b7bfb53a", size = 60029 }, + { url = "https://files.pythonhosted.org/packages/70/60/189be62e0dd898dce3b331e1b8c7a543cd3a405ac0c81fe8ee8a9d5d77e1/propcache-0.5.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:45f11346f884bc47444f6e6647131055844134c3175b629f84952e2b5cd62b64", size = 56774 }, + { url = "https://files.pythonhosted.org/packages/ea/9e/93377b9c7939c1ffae98f878dee955efadfd638078bc86dbc21f9d52f651/propcache-0.5.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8e778ebd44ef4f66ed60a0416b06b489687db264a9c0b3620362f26489492913", size = 63532 }, + { url = "https://files.pythonhosted.org/packages/14/f9/590ef6cfb9b8028d516d287812ece32bb0bc5f11fbb9c8bf6b2e6313fec8/propcache-0.5.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:c0cb9ed24c8964e172768d455a38254c2dd8a552905729ce006cad3d3dda59b1", size = 61592 }, + { url = "https://files.pythonhosted.org/packages/b4/5e/70958b3034c297a630bba2f17ca7abc2d5f39a803ad7e370ab79d1ecd022/propcache-0.5.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1d1ad32d9d4355e2be65574fd0bfd3677e7066b009cd5b9b2dee8aa6a6393b33", size = 64788 }, + { url = "https://files.pythonhosted.org/packages/12/fd/77fe5936d8c3086ca9048f7f415f122ed82e53884a9ec193646b42deef06/propcache-0.5.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c80f4ba3e8f00189165999a742ee526ebeccedf6c3f7beb0c7df821e9772435a", size = 62514 }, + { url = "https://files.pythonhosted.org/packages/cf/74/66bd798b5b3be70aa1b391f5cc9d6a0a5532d7fd3b19ec0b213e72e6ad9d/propcache-0.5.2-cp312-cp312-win32.whl", hash = "sha256:8c7972d8f193740d9175f0998ab38717e6cd322d5935c5b0fef8c0d323fd9031", size = 39018 }, + { url = "https://files.pythonhosted.org/packages/61/7c/5c0d34aa3024694d6dcb9271cdbdd08c4e47c1c0ad95ec7e7bc74cdea145/propcache-0.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:d9ee8826a7d47863a08ac44e1a5f611a462eefc3a194b492da242128bec75b42", size = 42322 }, + { url = "https://files.pythonhosted.org/packages/4d/91/875812f1a3feb20ceba818ef39fbe4d92f1081e04ac815c822496d0d038b/propcache-0.5.2-cp312-cp312-win_arm64.whl", hash = "sha256:2800a4a8ead6b28cccd1ec54b59346f0def7922ee1c7598e8499c733cfbb7c84", size = 38172 }, + { url = "https://files.pythonhosted.org/packages/c5/09/f049e45385503fe67db75a6b6186a7b9f0c3930366dc960522c312a825b1/propcache-0.5.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:099aaf4b4d1a02265b92a977edf00b5c4f63b3b17ac6de39b0d637c9cac0188a", size = 94457 }, + { url = "https://files.pythonhosted.org/packages/6b/65/83d1d05655baf63113731bd5a1008435e14f8d1e5a06cbe4ec5b23ad7a31/propcache-0.5.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:68ce1c44c7a813a7f71ea04315a8c7b330b63db99d059a797a4651bb6f69f117", size = 53835 }, + { url = "https://files.pythonhosted.org/packages/a9/12/a6ba6482bb5ea3260c000c9b20881c95fa11c6b30173715668259f844ed7/propcache-0.5.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:fc299c129490f55f254cd90be0deca4764e36e9a7c08b4aa588479a3bbed3098", size = 54545 }, + { url = "https://files.pythonhosted.org/packages/a9/19/7fa086f5764c59ec8a8e157cd93aa8497acc00aba9dcdec56bfffb32602d/propcache-0.5.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a6ae2198be502c10f09b2516e7b5d019816924bc3183a43ce792a7bd6625e6f4", size = 59886 }, + { url = "https://files.pythonhosted.org/packages/a1/e4/5d7663dc8235956c8f5281698a3af1d351d8820341ddd890f59d9a9127f2/propcache-0.5.2-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6041d31504dc1779d700e1edcfb08eea334b357620b06681a4eabb57a74e574e", size = 63261 }, + { url = "https://files.pythonhosted.org/packages/4a/4a/15a03adee24d6350da4292caeac44c34c033d2afe5e87eb370f38854560f/propcache-0.5.2-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f7eabc04151c78a9f4d5bbb5f1faf571e4defeb4b585e0fe95b60ff2dbe4d3d7", size = 64184 }, + { url = "https://files.pythonhosted.org/packages/8b/c6/979176efdaa3d239e36d503d5af63a0a773b36662ed8f52e5b6a6d9fd40e/propcache-0.5.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4db0ba63d693afd40d249bd93f842b5f144f8fcbb83de05660373bcf30517b1d", size = 61534 }, + { url = "https://files.pythonhosted.org/packages/c8/22/63e8cd1bae4c2d2be6493b6b7d10566ddafad88137cfbc99964a1119853c/propcache-0.5.2-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1dbcf7675229b35d31abb6547d8ebc8c27a830ac3f9a794edff6254873ec7c0a", size = 61500 }, + { url = "https://files.pythonhosted.org/packages/60/5a/28e5d9acbac1cc9ccb67045e8c1b943aa8d79fdf39c93bd73cacd68008ea/propcache-0.5.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d310c013aad2c72f1c3f2f8dd3279d460a858c551f97aeb8c63e4693cca7b4d2", size = 59994 }, + { url = "https://files.pythonhosted.org/packages/f3/40/db650677f554a95b9c01a7c9d93d629e93a15562f5deb4573c9ee136fed2/propcache-0.5.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:06187263ddad280d05b4d8a8b3bb7d164cbebd469236544a42e6d9b28ac6a4fa", size = 56884 }, + { url = "https://files.pythonhosted.org/packages/80/45/70b39b89516ff8b96bf732fa6fded8cef20f293cb1508690101c3c07ec51/propcache-0.5.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3115559b8effafd63b142ea5ed53d63a16ea6469cbc63dce4ee194b42db5d853", size = 63464 }, + { url = "https://files.pythonhosted.org/packages/f9/e2/fa59d3a89eac5534293124af4f1d0d0ada091ce4a0ab4610ce03fd2bdd8d/propcache-0.5.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c60462af8e6dc30c35407c7237ea908d777b22862bbee27bc4699c0d8bcdc45a", size = 61588 }, + { url = "https://files.pythonhosted.org/packages/0b/97/efb547a55c4bc7381cfb202d6a2239ac621045277bc1ea5dfd3a7f0516c0/propcache-0.5.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:40314bca9ac559716fe374094fc81c11dcc34b64fd6c585360f5775690505704", size = 64667 }, + { url = "https://files.pythonhosted.org/packages/92/56/f5c7d9b4b7595d5127da38974d791b2153f3d1eae6c674af3583ace92ad3/propcache-0.5.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:cfa21e036ce1e1db2be04ba3b85d2df1bb1702fa01932d984c5464c665228ff4", size = 62463 }, + { url = "https://files.pythonhosted.org/packages/bd/3b/484a3a65fc9f9f60c41dcd17b428bace5389544e2c680994534a20755066/propcache-0.5.2-cp313-cp313-win32.whl", hash = "sha256:f156a3529f38063b6dbaf356e15602a7f95f8055b1295a438433a6386f10463d", size = 38621 }, + { url = "https://files.pythonhosted.org/packages/1c/fd/3f0f10dba4dabad3bf53102be007abf55481067952bde0fdddff439e7c61/propcache-0.5.2-cp313-cp313-win_amd64.whl", hash = "sha256:dfed59d0a5aeb01e242e66ff0300bc4a265a7c05f612d30016f0b60b1017d757", size = 41649 }, + { url = "https://files.pythonhosted.org/packages/90/ec/6ce619cc32bb500a482f811f9cd509368b4e58e638d13f2c68f370d6b475/propcache-0.5.2-cp313-cp313-win_arm64.whl", hash = "sha256:ba338430e87ceb9c8f0cf754de38a9860560261e56c00376debd628698a7364f", size = 37636 }, + { url = "https://files.pythonhosted.org/packages/1b/82/c1d268bbbf2ef981c5bf0fbbe746db617c66e3bcefe431a1aa8943fbe23a/propcache-0.5.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a592f5f3da71c8691c788c13cb6734b6d17663d2e1cb8caddf0673d01ef8847d", size = 98872 }, + { url = "https://files.pythonhosted.org/packages/f4/d4/52c871e73e864e6b34c0e2d58ac1ec5ccd149497ddc7ad2137ae98323a35/propcache-0.5.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:6a997d0489e9668a384fcfd5061b857aa5361de73191cac204d04b889cfbbafa", size = 56257 }, + { url = "https://files.pythonhosted.org/packages/67/f0/9b90ca2a210b3d09bcfcd96ecd0f55545c091535abce2a45de2775cfd357/propcache-0.5.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:10734b5484ea113152ee25a91dccedf81631791805d2c9ccb054958e51842c94", size = 56696 }, + { url = "https://files.pythonhosted.org/packages/9d/0e/6e9d4ba07c8e56e21ddec1e75f12148142b21ca83a51871babce095334f4/propcache-0.5.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cafca7e56c12bb02ae16d283742bef25a61122e9dab2b5b3f2ccbe589ce32164", size = 62378 }, + { url = "https://files.pythonhosted.org/packages/65/19/c10badaa463dde8a27ce884f8ee2ec37e6035b7c9f5ff0c8f74f06f08dac/propcache-0.5.2-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f064f8d2b59177878b7615df1735cd8fe3462ed6be8c7b217d17a276489c2b7f", size = 65283 }, + { url = "https://files.pythonhosted.org/packages/b0/b6/93bea99ca80e19cef6512a8580e5b7857bbe09422d9daa7fd4ef5723306c/propcache-0.5.2-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f78abfa8dfc32376fd1aacf597b2f2fbbe0ea751419aee718af5d4f82537ef8c", size = 66616 }, + { url = "https://files.pythonhosted.org/packages/83/e4/5c7462e50625f051f37fb38b8224f7639f667184bbd34424ec83819bb1b7/propcache-0.5.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f7467da8a9822bf1a55336f877340c5bcbd3c482afc43a99771169f74a26dedc", size = 63773 }, + { url = "https://files.pythonhosted.org/packages/ca/b6/99238894047b13c823be25027e736626cd414a52a5e30d2c3347c2733529/propcache-0.5.2-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a6ddc6ac9e25de626c1f129c1b467d7ecd33ce2237d3fd0c4e429feef0a7ee1f", size = 63664 }, + { url = "https://files.pythonhosted.org/packages/85/1e/a3a1a63116a2b8edb415a8bb9a6f0c34bd03830b1e18e8ce2904e1dc1cf4/propcache-0.5.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2f22cbbac9e26a8e864c0985ff1268d5d939d53d9d9411a9824279097e03a2cb", size = 62643 }, + { url = "https://files.pythonhosted.org/packages/e4/03/893cf147de2fc6543c5eaa07ad833170e7e2a2385725bbebe8c0503723bb/propcache-0.5.2-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:fc76378c62a0f04d0cd82fbb1a2cd2d7e28fcb40d5873f28a6c44e388aaa2751", size = 59595 }, + { url = "https://files.pythonhosted.org/packages/86/3b/04c1a2e12c57766568ba75ba72b3bf2042818d4c1425fab6fc07155c7cff/propcache-0.5.2-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:acd2c8edba48e31e58a363b8cf4e5c7db3b04b3f9e371f601df30d9b0d244836", size = 65711 }, + { url = "https://files.pythonhosted.org/packages/1c/34/80f8d0099f8d6bacc4de1624c85672681c8cd1149ca2da0e38fd120b817f/propcache-0.5.2-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:452b5065457eb9991ec5eb38ff41d6cd4c991c9ac7c531c4d5849ae473a9a13f", size = 64247 }, + { url = "https://files.pythonhosted.org/packages/f3/1a/8b08f3a5f1037e9e370c55883ceeeee0f6dd0416fb2d2d67b8bfc91f2a79/propcache-0.5.2-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:3430bb2bfe1331885c427745a751e774ee679fd4344f80b97bf879815fe8fa55", size = 67102 }, + { url = "https://files.pythonhosted.org/packages/34/68/8bdb7bb7756d76e005490649d10e4a8369e610c74d619f71e1aedf889e9c/propcache-0.5.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cef6cea3922890dd6c9654971001fa797b526c16ab5e1e46c05fd6f877be7568", size = 64964 }, + { url = "https://files.pythonhosted.org/packages/0a/aa/50fb0b5d3968b61a510926ff8b8465f1d6e976b3ab74496d7a4b9fc42515/propcache-0.5.2-cp313-cp313t-win32.whl", hash = "sha256:72d61e16dd78228b58c5d47be830ff3da7e5f139abdf0aef9d86cde1c5cf2191", size = 42546 }, + { url = "https://files.pythonhosted.org/packages/ae/4c/0ddbae64321bd4a95bcbfc19307238016b5b1fee645c84626c8d539e5b74/propcache-0.5.2-cp313-cp313t-win_amd64.whl", hash = "sha256:0958834041a0166d343b8d2cedcd8bcbaeb4fdbe0cf08320c5379f143c3be6e7", size = 46330 }, + { url = "https://files.pythonhosted.org/packages/00/d9/9cddc8efb78d8af264c5ec9f6d10b62f57c515feda8d321595f56010fb23/propcache-0.5.2-cp313-cp313t-win_arm64.whl", hash = "sha256:6de8bd93ddde9b992cf2b2e0d796d501a19026b5b9fd87356d7d0779531a8d96", size = 40521 }, + { url = "https://files.pythonhosted.org/packages/e2/ea/23ee535d90ce8bcc465a3028eb3cc0ce3bd1005f4bb27710b30587de798d/propcache-0.5.2-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:46088abff4cba581dea21ae0467a480526cb25aa5f3c269e909f800328bc3999", size = 94662 }, + { url = "https://files.pythonhosted.org/packages/b5/06/c5a52f419b5d8972f8d46a7577476090d8e3263ff589ce40b5ca4968d5be/propcache-0.5.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fc88b26f08d634f7bc819a7852e5214f5802641ab8d9fd5326892292eee1993e", size = 53928 }, + { url = "https://files.pythonhosted.org/packages/63/b1/4260d67d6bd85e58a66b72d54ce15d5de789b6f3870cc6bedf8ff9667401/propcache-0.5.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:97797ebb098e670a2f92dd66f32897e30d7615b14e7f59711de23e30a9072539", size = 54650 }, + { url = "https://files.pythonhosted.org/packages/70/06/2f46c318e3307cd7a6a7481def374ce838c0fe20084b39dd54b0879d0e99/propcache-0.5.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba57fffe4ac99c5d30076161b5866336d97600769bad35cc68f7774b15298a4e", size = 59912 }, + { url = "https://files.pythonhosted.org/packages/4c/29/fe1aebec2ce57ab985a9c382bded1124431f85078113aa222c5d278430d4/propcache-0.5.2-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:583c19759d9eec1e5b69e2fbef36a7d9c326041be9746cb822d335c8cedc2979", size = 63300 }, + { url = "https://files.pythonhosted.org/packages/b4/18/2334b26768b6c82be8c69e83671b767d5ef426aa09b0cba6c2ea47816774/propcache-0.5.2-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d0326e2e5e1f3163fa306c834e48e8d490e5fae607a097a40c0648109b47ba80", size = 64208 }, + { url = "https://files.pythonhosted.org/packages/2b/76/7f1bfd6afff4c5e38e36a3c6d68eb5f4b7311ea80baf693db78d95b603c4/propcache-0.5.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e00820e192c8dbebcafb383ebbf99030895f09905e7a0eb2e0340a0bcc2bc825", size = 61633 }, + { url = "https://files.pythonhosted.org/packages/c4/46/b3ff8aba2b4953a3e50de2cf72f1b5748b8eca93b15f3dc2c84339084c09/propcache-0.5.2-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c66afea89b1e43725731d2004732a046fe6fe955d51f952c3e95a7314a284a39", size = 61724 }, + { url = "https://files.pythonhosted.org/packages/c5/01/814cfcafbcff954f94c01cf30e097ddc88a076b5440fbcf4570753437d40/propcache-0.5.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d4dc37dec6c6cdad0b57881a5658fd14fbf53e333b1a86cf86559f190e1d9ec4", size = 60069 }, + { url = "https://files.pythonhosted.org/packages/da/68/5c6f7622d510cc666a300687e06fd060c1a43361c0c9b20d284f06d8096a/propcache-0.5.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:5570dbcc97571c15f68068e529c92715a12f8d54030e272d264b377e22bd17a5", size = 57099 }, + { url = "https://files.pythonhosted.org/packages/55/27/9cb0b4c679124085327957d42521c99dba04c88c90c3e55a6f0b633ebccc/propcache-0.5.2-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:f814362777a9f841adddb200ecdf8f5cb1e5a3c4b7a86378edbd6ccb26edd702", size = 63391 }, + { url = "https://files.pythonhosted.org/packages/f0/9d/7258aaa5bdf60fc6f27591eef6fe52768cb0beda7140be477c8b12c9794a/propcache-0.5.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:196913dea116aeb5a2ba95af4ddcb7ea85559ae07d8eee8751688310d09168c3", size = 61626 }, + { url = "https://files.pythonhosted.org/packages/8e/0d/41c602003e8a9b16fe1e7eadf62c7bfba9d5474370b24200bf48b315f45f/propcache-0.5.2-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:6e7b8719005dd1175be4ab1cd25e9b98659a5e0347331506ec6760d2773a7fb5", size = 64781 }, + { url = "https://files.pythonhosted.org/packages/8b/f3/38e66b1856e9bd079deea015bc4a55f7767c0e4db2f7dcf69e7e680ba4ce/propcache-0.5.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:51f96d685ab16e88cab128cd37a52c5da540809c8b879fa047731bfcb4ad35a4", size = 62570 }, + { url = "https://files.pythonhosted.org/packages/95/ca/bbfe9b910ce57dde8bb4876b4520fc02a4e89497c10de26be936758a3aaa/propcache-0.5.2-cp314-cp314-win32.whl", hash = "sha256:cc6fc3cc62e8501d3ed62894425040d2728ecddb1ed072737a5c70bd537aa9f0", size = 39436 }, + { url = "https://files.pythonhosted.org/packages/61/d2/45c9defbaa1ea297035d9d4cce9e8f80daafbf19319c6007f157c6256ea9/propcache-0.5.2-cp314-cp314-win_amd64.whl", hash = "sha256:81e3a30b0bb60caa22033dd0f8a3618d1d67356212514f62c57db75cb0ef410c", size = 42373 }, + { url = "https://files.pythonhosted.org/packages/44/68/9ea5103f41d5217d7d6ec24db90018e23aebec070c3f9a6e54d12b841fd8/propcache-0.5.2-cp314-cp314-win_arm64.whl", hash = "sha256:0d2c9bf8528f135dbb805ce027567e09164f7efa51a2be07458a2c0420f292d0", size = 38554 }, + { url = "https://files.pythonhosted.org/packages/8a/81/fadf555f42d3b762eea8a53950b0489fdc0aa9da5f8ed9e10ce0a4e01b48/propcache-0.5.2-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:4bc8ff1feffc6a61c7002ffe84634c41b822e104990ae009f44a0834430070bb", size = 99395 }, + { url = "https://files.pythonhosted.org/packages/f5/c9/c61e134a686949cf7971af3a390148b1156f7be81c73bc0cd12c873e2d48/propcache-0.5.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:79aa3ff0a9b566633b642fa9caf7e21ed1c13d6feca718187873f199e1514078", size = 56653 }, + { url = "https://files.pythonhosted.org/packages/cb/73/daf935ea7048ddd7ec8eec5345b4a40b619d2d178b3c0a0900796bc3c794/propcache-0.5.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1b31822f4474c4036bae62de9402710051d431a606d6a0f907fec79935a071aa", size = 56914 }, + { url = "https://files.pythonhosted.org/packages/79/9f/aba959b435ea18617edd7cf0a7ad0b9c574b8fc7e3d2cd55fb59cb255d33/propcache-0.5.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:13fef48778b5a2a756523fdb781326b028ca75e32858b04f2cdd19f394564917", size = 62567 }, + { url = "https://files.pythonhosted.org/packages/6c/a1/859942de9a791ff42f6141736f5b37749b8f53e65edfa49638c67dd67e6a/propcache-0.5.2-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8b73ab70f1a3351fbc71f663b3e645af6dd0329100c353081cf69c37433fc6fe", size = 65542 }, + { url = "https://files.pythonhosted.org/packages/b5/61/315bc0fd6c0fc7f80a528b8afd209e5fc4a875ea79571b91b8f50f442907/propcache-0.5.2-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5538d2c13d93e4698af7e092b57bc7298fd35d1d58e656ae18f23ee0d0378e03", size = 66845 }, + { url = "https://files.pythonhosted.org/packages/47/f7/9f8122e3132e8e354ac41975ef8f1099be7d5a16bc7ae562734e993665c0/propcache-0.5.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cd645f03898405cabe694fb8bc35241e3a9c332ec85627584fe3de201452b335", size = 63985 }, + { url = "https://files.pythonhosted.org/packages/c8/54/c317819ec157cbf6f35df9df9657a6f82daf34d5faf15948b2f639c2192e/propcache-0.5.2-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a473b3440261e0c60706e732b2ed2f517857344fc21bf48fdfe211e2d98eb285", size = 63999 }, + { url = "https://files.pythonhosted.org/packages/5a/56/387e3f7dfce0a9233df41fb888aa1c30222cb4bbbf09537c02dd9bd85fe2/propcache-0.5.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7afa37062e6650640e932e4cc9297d81f9f42d9944029cc386b8247dea4da837", size = 62779 }, + { url = "https://files.pythonhosted.org/packages/a1/9c/596784cb5824ed61ee960d3f8655a3f0993e107c6e98ab6c818b7fb92ccb/propcache-0.5.2-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:8a90efd5777e996e42d568db9ac740b944d691e565cbfd31b2f7832f9184b2b8", size = 59796 }, + { url = "https://files.pythonhosted.org/packages/c2/3d/1a6cfa1726a48542c1e8784a0761421476a5b68e09b7f36bf95eb954aaba/propcache-0.5.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:f19bb891234d72535764d703bfed1153cc34f4214d5bd7150aee1eec9e8f4366", size = 66023 }, + { url = "https://files.pythonhosted.org/packages/e4/0e/05fd6990369477076e4e280bcb970de760fddf0161a46e988bc95f7940ec/propcache-0.5.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:32775082acd2d807ee3db715c7770d38767b817870acfa08c29e057f3c4d5b56", size = 64448 }, + { url = "https://files.pythonhosted.org/packages/cd/86/5f8da315a4309c62c10c0b2516b17492d5d3bbe1bb862b96604db67e2a37/propcache-0.5.2-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:9282fb1a3bccd038da9f768b927b24a0c753e466c086b7c4f3c6982851eefb2d", size = 67329 }, + { url = "https://files.pythonhosted.org/packages/da/d3/3368efe79ab21f0cdf86ef49895811c9cc933131d4cde1f28a624e22e712/propcache-0.5.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cc49723e2f60d6b32a0f0b08a3fd6d13203c07f1cd9566cfce0f12a917c967a2", size = 65172 }, + { url = "https://files.pythonhosted.org/packages/d5/07/127e8b0bacfb325396196f9d976a22453049b89b9b2b08477cc3145faa44/propcache-0.5.2-cp314-cp314t-win32.whl", hash = "sha256:2d7aa89ebca5acc98cba9d1472d976e394782f587bad6661003602a619fd1821", size = 43813 }, + { url = "https://files.pythonhosted.org/packages/88/fb/46dad6c0ae49ed230ab1b16c890c2b6314e2403e6c412976f4a72d64a527/propcache-0.5.2-cp314-cp314t-win_amd64.whl", hash = "sha256:d447bb0b3054be5818458fbb171208b1d9ff11eba14e18ca18b90cbb45767370", size = 47764 }, + { url = "https://files.pythonhosted.org/packages/e7/c4/a47d0a63aa309d10d59ede6e9d4cff03a344a79d1f0f4cd0cd74997b53e0/propcache-0.5.2-cp314-cp314t-win_arm64.whl", hash = "sha256:fe67a3d11cd9b4efabfa45c3d00ffba2b26811442a73a581a94b67c2b5faccf6", size = 41140 }, + { url = "https://files.pythonhosted.org/packages/3a/ed/1cdcab6ba3d6ab7feca11fc14f0eeea80755bb53ef4e892079f31b10a25f/propcache-0.5.2-py3-none-any.whl", hash = "sha256:be1ddfcbb376e3de5d2e2db1d58d6d67463e6b4f9f040c000de8e300295465fe", size = 14036 }, +] + [[package]] name = "protobuf" version = "7.35.1" @@ -3067,27 +3863,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl", hash = "sha256:1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a", size = 22101 }, ] -[[package]] -name = "python-magic" -version = "0.4.27" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/da/db/0b3e28ac047452d079d375ec6798bf76a036a08182dbb39ed38116a49130/python-magic-0.4.27.tar.gz", hash = "sha256:c1ba14b08e4a5f5c31a302b7721239695b2f0f058d125bd5ce1ee36b9d9d3c3b", size = 14677 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6c/73/9f872cb81fc5c3bb48f7227872c28975f998f3e7c2b1c16e95e6432bbb90/python_magic-0.4.27-py2.py3-none-any.whl", hash = "sha256:c212960ad306f700aa0d01e5d7a325d20548ff97eb9920dcd29513174f0294d3", size = 13840 }, -] - -[[package]] -name = "python-slugify" -version = "8.0.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "text-unidecode" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/87/c7/5e1547c44e31da50a460df93af11a535ace568ef89d7a811069ead340c4a/python-slugify-8.0.4.tar.gz", hash = "sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856", size = 10921 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a4/62/02da182e544a51a5c3ccf4b03ab79df279f9c60c5e82d5e8bec7ca26ac11/python_slugify-8.0.4-py2.py3-none-any.whl", hash = "sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8", size = 10051 }, -] - [[package]] name = "pywin32" version = "312" @@ -3389,20 +4164,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06", size = 54481 }, ] -[[package]] -name = "rfc3986" -version = "1.5.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/79/30/5b1b6c28c105629cc12b33bdcbb0b11b5bb1880c6cfbd955f9e792921aa8/rfc3986-1.5.0.tar.gz", hash = "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835", size = 49378 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c4/e5/63ca2c4edf4e00657584608bee1001302bbf8c5f569340b78304f2f446cb/rfc3986-1.5.0-py2.py3-none-any.whl", hash = "sha256:a86d6e1f5b1dc238b218b012df0aa79409667bb209e58da56d0b94704e712a97", size = 31976 }, -] - -[package.optional-dependencies] -idna2008 = [ - { name = "idna" }, -] - [[package]] name = "rich" version = "15.0.0" @@ -3610,7 +4371,7 @@ dependencies = [ { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, { name = "packaging", marker = "python_full_version < '3.12'" }, { name = "pillow", marker = "python_full_version < '3.12'" }, - { name = "scipy", version = "1.17.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, + { name = "scipy", version = "1.10.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, { name = "tifffile", version = "2026.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/65/c1/a49da20845f0f0e1afbb1c2586d406dc0acb84c26ae293bad6d7e7f718bc/scikit_image-0.22.0.tar.gz", hash = "sha256:018d734df1d2da2719087d15f679d19285fce97cd37695103deadfaef2873236", size = 22685018 } @@ -3633,20 +4394,41 @@ version = "0.26.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.15' and sys_platform == 'win32'", - "python_full_version >= '3.15' and platform_system == 'Linux' and sys_platform == 'emscripten'", - "python_full_version >= '3.15' and platform_system != 'Linux' and sys_platform == 'emscripten'", - "python_full_version >= '3.15' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.15' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.15' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version >= '3.15' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version >= '3.15' and platform_system == 'Darwin' and sys_platform == 'emscripten'", + "python_full_version >= '3.15' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform == 'emscripten'", + "python_full_version >= '3.15' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.15' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.15' and platform_system == 'Darwin' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.15' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.14.*' and sys_platform == 'win32'", - "python_full_version == '3.14.*' and platform_system == 'Linux' and sys_platform == 'emscripten'", - "python_full_version == '3.14.*' and platform_system != 'Linux' and sys_platform == 'emscripten'", - "python_full_version == '3.14.*' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.14.*' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_system == 'Linux' and sys_platform == 'emscripten'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_system != 'Linux' and sys_platform == 'emscripten'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.14.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.14.*' and platform_system == 'Darwin' and sys_platform == 'emscripten'", + "python_full_version == '3.14.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.14.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and platform_system == 'Darwin' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and platform_system == 'Darwin' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and platform_system == 'Darwin' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and platform_system == 'Darwin' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and platform_system == 'Darwin' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", ] dependencies = [ { name = "imageio", marker = "python_full_version >= '3.12'" }, @@ -3712,7 +4494,7 @@ wheels = [ [[package]] name = "scipy" -version = "1.17.1" +version = "1.10.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version < '3.12' and sys_platform == 'win32'", @@ -3728,68 +4510,13 @@ resolution-markers = [ dependencies = [ { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7a/97/5a3609c4f8d58b039179648e62dd220f89864f56f7357f5d4f45c29eb2cc/scipy-1.17.1.tar.gz", hash = "sha256:95d8e012d8cb8816c226aef832200b1d45109ed4464303e997c5b13122b297c0", size = 30573822 } +sdist = { url = "https://files.pythonhosted.org/packages/84/a9/2bf119f3f9cff1f376f924e39cfae18dec92a1514784046d185731301281/scipy-1.10.1.tar.gz", hash = "sha256:2cf9dfb80a7b4589ba4c40ce7588986d6d5cebc5457cad2c2880f6bc2d42f3a5", size = 42407997 } wheels = [ - { url = "https://files.pythonhosted.org/packages/df/75/b4ce781849931fef6fd529afa6b63711d5a733065722d0c3e2724af9e40a/scipy-1.17.1-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:1f95b894f13729334fb990162e911c9e5dc1ab390c58aa6cbecb389c5b5e28ec", size = 31613675 }, - { url = "https://files.pythonhosted.org/packages/f7/58/bccc2861b305abdd1b8663d6130c0b3d7cc22e8d86663edbc8401bfd40d4/scipy-1.17.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:e18f12c6b0bc5a592ed23d3f7b891f68fd7f8241d69b7883769eb5d5dfb52696", size = 28162057 }, - { url = "https://files.pythonhosted.org/packages/6d/ee/18146b7757ed4976276b9c9819108adbc73c5aad636e5353e20746b73069/scipy-1.17.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:a3472cfbca0a54177d0faa68f697d8ba4c80bbdc19908c3465556d9f7efce9ee", size = 20334032 }, - { url = "https://files.pythonhosted.org/packages/ec/e6/cef1cf3557f0c54954198554a10016b6a03b2ec9e22a4e1df734936bd99c/scipy-1.17.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:766e0dc5a616d026a3a1cffa379af959671729083882f50307e18175797b3dfd", size = 22709533 }, - { url = "https://files.pythonhosted.org/packages/4d/60/8804678875fc59362b0fb759ab3ecce1f09c10a735680318ac30da8cd76b/scipy-1.17.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:744b2bf3640d907b79f3fd7874efe432d1cf171ee721243e350f55234b4cec4c", size = 33062057 }, - { url = "https://files.pythonhosted.org/packages/09/7d/af933f0f6e0767995b4e2d705a0665e454d1c19402aa7e895de3951ebb04/scipy-1.17.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43af8d1f3bea642559019edfe64e9b11192a8978efbd1539d7bc2aaa23d92de4", size = 35349300 }, - { url = "https://files.pythonhosted.org/packages/b4/3d/7ccbbdcbb54c8fdc20d3b6930137c782a163fa626f0aef920349873421ba/scipy-1.17.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cd96a1898c0a47be4520327e01f874acfd61fb48a9420f8aa9f6483412ffa444", size = 35127333 }, - { url = "https://files.pythonhosted.org/packages/e8/19/f926cb11c42b15ba08e3a71e376d816ac08614f769b4f47e06c3580c836a/scipy-1.17.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4eb6c25dd62ee8d5edf68a8e1c171dd71c292fdae95d8aeb3dd7d7de4c364082", size = 37741314 }, - { url = "https://files.pythonhosted.org/packages/95/da/0d1df507cf574b3f224ccc3d45244c9a1d732c81dcb26b1e8a766ae271a8/scipy-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:d30e57c72013c2a4fe441c2fcb8e77b14e152ad48b5464858e07e2ad9fbfceff", size = 36607512 }, - { url = "https://files.pythonhosted.org/packages/68/7f/bdd79ceaad24b671543ffe0ef61ed8e659440eb683b66f033454dcee90eb/scipy-1.17.1-cp311-cp311-win_arm64.whl", hash = "sha256:9ecb4efb1cd6e8c4afea0daa91a87fbddbce1b99d2895d151596716c0b2e859d", size = 24599248 }, - { url = "https://files.pythonhosted.org/packages/35/48/b992b488d6f299dbe3f11a20b24d3dda3d46f1a635ede1c46b5b17a7b163/scipy-1.17.1-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:35c3a56d2ef83efc372eaec584314bd0ef2e2f0d2adb21c55e6ad5b344c0dcb8", size = 31610954 }, - { url = "https://files.pythonhosted.org/packages/b2/02/cf107b01494c19dc100f1d0b7ac3cc08666e96ba2d64db7626066cee895e/scipy-1.17.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:fcb310ddb270a06114bb64bbe53c94926b943f5b7f0842194d585c65eb4edd76", size = 28172662 }, - { url = "https://files.pythonhosted.org/packages/cf/a9/599c28631bad314d219cf9ffd40e985b24d603fc8a2f4ccc5ae8419a535b/scipy-1.17.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:cc90d2e9c7e5c7f1a482c9875007c095c3194b1cfedca3c2f3291cdc2bc7c086", size = 20344366 }, - { url = "https://files.pythonhosted.org/packages/35/f5/906eda513271c8deb5af284e5ef0206d17a96239af79f9fa0aebfe0e36b4/scipy-1.17.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:c80be5ede8f3f8eded4eff73cc99a25c388ce98e555b17d31da05287015ffa5b", size = 22704017 }, - { url = "https://files.pythonhosted.org/packages/da/34/16f10e3042d2f1d6b66e0428308ab52224b6a23049cb2f5c1756f713815f/scipy-1.17.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e19ebea31758fac5893a2ac360fedd00116cbb7628e650842a6691ba7ca28a21", size = 32927842 }, - { url = "https://files.pythonhosted.org/packages/01/8e/1e35281b8ab6d5d72ebe9911edcdffa3f36b04ed9d51dec6dd140396e220/scipy-1.17.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:02ae3b274fde71c5e92ac4d54bc06c42d80e399fec704383dcd99b301df37458", size = 35235890 }, - { url = "https://files.pythonhosted.org/packages/c5/5c/9d7f4c88bea6e0d5a4f1bc0506a53a00e9fcb198de372bfe4d3652cef482/scipy-1.17.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8a604bae87c6195d8b1045eddece0514d041604b14f2727bbc2b3020172045eb", size = 35003557 }, - { url = "https://files.pythonhosted.org/packages/65/94/7698add8f276dbab7a9de9fb6b0e02fc13ee61d51c7c3f85ac28b65e1239/scipy-1.17.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f590cd684941912d10becc07325a3eeb77886fe981415660d9265c4c418d0bea", size = 37625856 }, - { url = "https://files.pythonhosted.org/packages/a2/84/dc08d77fbf3d87d3ee27f6a0c6dcce1de5829a64f2eae85a0ecc1f0daa73/scipy-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:41b71f4a3a4cab9d366cd9065b288efc4d4f3c0b37a91a8e0947fb5bd7f31d87", size = 36549682 }, - { url = "https://files.pythonhosted.org/packages/bc/98/fe9ae9ffb3b54b62559f52dedaebe204b408db8109a8c66fdd04869e6424/scipy-1.17.1-cp312-cp312-win_arm64.whl", hash = "sha256:f4115102802df98b2b0db3cce5cb9b92572633a1197c77b7553e5203f284a5b3", size = 24547340 }, - { url = "https://files.pythonhosted.org/packages/76/27/07ee1b57b65e92645f219b37148a7e7928b82e2b5dbeccecb4dff7c64f0b/scipy-1.17.1-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:5e3c5c011904115f88a39308379c17f91546f77c1667cea98739fe0fccea804c", size = 31590199 }, - { url = "https://files.pythonhosted.org/packages/ec/ae/db19f8ab842e9b724bf5dbb7db29302a91f1e55bc4d04b1025d6d605a2c5/scipy-1.17.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:6fac755ca3d2c3edcb22f479fceaa241704111414831ddd3bc6056e18516892f", size = 28154001 }, - { url = "https://files.pythonhosted.org/packages/5b/58/3ce96251560107b381cbd6e8413c483bbb1228a6b919fa8652b0d4090e7f/scipy-1.17.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:7ff200bf9d24f2e4d5dc6ee8c3ac64d739d3a89e2326ba68aaf6c4a2b838fd7d", size = 20325719 }, - { url = "https://files.pythonhosted.org/packages/b2/83/15087d945e0e4d48ce2377498abf5ad171ae013232ae31d06f336e64c999/scipy-1.17.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:4b400bdc6f79fa02a4d86640310dde87a21fba0c979efff5248908c6f15fad1b", size = 22683595 }, - { url = "https://files.pythonhosted.org/packages/b4/e0/e58fbde4a1a594c8be8114eb4aac1a55bcd6587047efc18a61eb1f5c0d30/scipy-1.17.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2b64ca7d4aee0102a97f3ba22124052b4bd2152522355073580bf4845e2550b6", size = 32896429 }, - { url = "https://files.pythonhosted.org/packages/f5/5f/f17563f28ff03c7b6799c50d01d5d856a1d55f2676f537ca8d28c7f627cd/scipy-1.17.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:581b2264fc0aa555f3f435a5944da7504ea3a065d7029ad60e7c3d1ae09c5464", size = 35203952 }, - { url = "https://files.pythonhosted.org/packages/8d/a5/9afd17de24f657fdfe4df9a3f1ea049b39aef7c06000c13db1530d81ccca/scipy-1.17.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:beeda3d4ae615106d7094f7e7cef6218392e4465cc95d25f900bebabfded0950", size = 34979063 }, - { url = "https://files.pythonhosted.org/packages/8b/13/88b1d2384b424bf7c924f2038c1c409f8d88bb2a8d49d097861dd64a57b2/scipy-1.17.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6609bc224e9568f65064cfa72edc0f24ee6655b47575954ec6339534b2798369", size = 37598449 }, - { url = "https://files.pythonhosted.org/packages/35/e5/d6d0e51fc888f692a35134336866341c08655d92614f492c6860dc45bb2c/scipy-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:37425bc9175607b0268f493d79a292c39f9d001a357bebb6b88fdfaff13f6448", size = 36510943 }, - { url = "https://files.pythonhosted.org/packages/2a/fd/3be73c564e2a01e690e19cc618811540ba5354c67c8680dce3281123fb79/scipy-1.17.1-cp313-cp313-win_arm64.whl", hash = "sha256:5cf36e801231b6a2059bf354720274b7558746f3b1a4efb43fcf557ccd484a87", size = 24545621 }, - { url = "https://files.pythonhosted.org/packages/6f/6b/17787db8b8114933a66f9dcc479a8272e4b4da75fe03b0c282f7b0ade8cd/scipy-1.17.1-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:d59c30000a16d8edc7e64152e30220bfbd724c9bbb08368c054e24c651314f0a", size = 31936708 }, - { url = "https://files.pythonhosted.org/packages/38/2e/524405c2b6392765ab1e2b722a41d5da33dc5c7b7278184a8ad29b6cb206/scipy-1.17.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:010f4333c96c9bb1a4516269e33cb5917b08ef2166d5556ca2fd9f082a9e6ea0", size = 28570135 }, - { url = "https://files.pythonhosted.org/packages/fd/c3/5bd7199f4ea8556c0c8e39f04ccb014ac37d1468e6cfa6a95c6b3562b76e/scipy-1.17.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:2ceb2d3e01c5f1d83c4189737a42d9cb2fc38a6eeed225e7515eef71ad301dce", size = 20741977 }, - { url = "https://files.pythonhosted.org/packages/d9/b8/8ccd9b766ad14c78386599708eb745f6b44f08400a5fd0ade7cf89b6fc93/scipy-1.17.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:844e165636711ef41f80b4103ed234181646b98a53c8f05da12ca5ca289134f6", size = 23029601 }, - { url = "https://files.pythonhosted.org/packages/6d/a0/3cb6f4d2fb3e17428ad2880333cac878909ad1a89f678527b5328b93c1d4/scipy-1.17.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:158dd96d2207e21c966063e1635b1063cd7787b627b6f07305315dd73d9c679e", size = 33019667 }, - { url = "https://files.pythonhosted.org/packages/f3/c3/2d834a5ac7bf3a0c806ad1508efc02dda3c8c61472a56132d7894c312dea/scipy-1.17.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:74cbb80d93260fe2ffa334efa24cb8f2f0f622a9b9febf8b483c0b865bfb3475", size = 35264159 }, - { url = "https://files.pythonhosted.org/packages/4d/77/d3ed4becfdbd217c52062fafe35a72388d1bd82c2d0ba5ca19d6fcc93e11/scipy-1.17.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:dbc12c9f3d185f5c737d801da555fb74b3dcfa1a50b66a1a93e09190f41fab50", size = 35102771 }, - { url = "https://files.pythonhosted.org/packages/bd/12/d19da97efde68ca1ee5538bb261d5d2c062f0c055575128f11a2730e3ac1/scipy-1.17.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:94055a11dfebe37c656e70317e1996dc197e1a15bbcc351bcdd4610e128fe1ca", size = 37665910 }, - { url = "https://files.pythonhosted.org/packages/06/1c/1172a88d507a4baaf72c5a09bb6c018fe2ae0ab622e5830b703a46cc9e44/scipy-1.17.1-cp313-cp313t-win_amd64.whl", hash = "sha256:e30bdeaa5deed6bc27b4cc490823cd0347d7dae09119b8803ae576ea0ce52e4c", size = 36562980 }, - { url = "https://files.pythonhosted.org/packages/70/b0/eb757336e5a76dfa7911f63252e3b7d1de00935d7705cf772db5b45ec238/scipy-1.17.1-cp313-cp313t-win_arm64.whl", hash = "sha256:a720477885a9d2411f94a93d16f9d89bad0f28ca23c3f8daa521e2dcc3f44d49", size = 24856543 }, - { url = "https://files.pythonhosted.org/packages/cf/83/333afb452af6f0fd70414dc04f898647ee1423979ce02efa75c3b0f2c28e/scipy-1.17.1-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:a48a72c77a310327f6a3a920092fa2b8fd03d7deaa60f093038f22d98e096717", size = 31584510 }, - { url = "https://files.pythonhosted.org/packages/ed/a6/d05a85fd51daeb2e4ea71d102f15b34fedca8e931af02594193ae4fd25f7/scipy-1.17.1-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:45abad819184f07240d8a696117a7aacd39787af9e0b719d00285549ed19a1e9", size = 28170131 }, - { url = "https://files.pythonhosted.org/packages/db/7b/8624a203326675d7746a254083a187398090a179335b2e4a20e2ddc46e83/scipy-1.17.1-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:3fd1fcdab3ea951b610dc4cef356d416d5802991e7e32b5254828d342f7b7e0b", size = 20342032 }, - { url = "https://files.pythonhosted.org/packages/c9/35/2c342897c00775d688d8ff3987aced3426858fd89d5a0e26e020b660b301/scipy-1.17.1-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:7bdf2da170b67fdf10bca777614b1c7d96ae3ca5794fd9587dce41eb2966e866", size = 22678766 }, - { url = "https://files.pythonhosted.org/packages/ef/f2/7cdb8eb308a1a6ae1e19f945913c82c23c0c442a462a46480ce487fdc0ac/scipy-1.17.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:adb2642e060a6549c343603a3851ba76ef0b74cc8c079a9a58121c7ec9fe2350", size = 32957007 }, - { url = "https://files.pythonhosted.org/packages/0b/2e/7eea398450457ecb54e18e9d10110993fa65561c4f3add5e8eccd2b9cd41/scipy-1.17.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eee2cfda04c00a857206a4330f0c5e3e56535494e30ca445eb19ec624ae75118", size = 35221333 }, - { url = "https://files.pythonhosted.org/packages/d9/77/5b8509d03b77f093a0d52e606d3c4f79e8b06d1d38c441dacb1e26cacf46/scipy-1.17.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d2650c1fb97e184d12d8ba010493ee7b322864f7d3d00d3f9bb97d9c21de4068", size = 35042066 }, - { url = "https://files.pythonhosted.org/packages/f9/df/18f80fb99df40b4070328d5ae5c596f2f00fffb50167e31439e932f29e7d/scipy-1.17.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:08b900519463543aa604a06bec02461558a6e1cef8fdbb8098f77a48a83c8118", size = 37612763 }, - { url = "https://files.pythonhosted.org/packages/4b/39/f0e8ea762a764a9dc52aa7dabcfad51a354819de1f0d4652b6a1122424d6/scipy-1.17.1-cp314-cp314-win_amd64.whl", hash = "sha256:3877ac408e14da24a6196de0ddcace62092bfc12a83823e92e49e40747e52c19", size = 37290984 }, - { url = "https://files.pythonhosted.org/packages/7c/56/fe201e3b0f93d1a8bcf75d3379affd228a63d7e2d80ab45467a74b494947/scipy-1.17.1-cp314-cp314-win_arm64.whl", hash = "sha256:f8885db0bc2bffa59d5c1b72fad7a6a92d3e80e7257f967dd81abb553a90d293", size = 25192877 }, - { url = "https://files.pythonhosted.org/packages/96/ad/f8c414e121f82e02d76f310f16db9899c4fcde36710329502a6b2a3c0392/scipy-1.17.1-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:1cc682cea2ae55524432f3cdff9e9a3be743d52a7443d0cba9017c23c87ae2f6", size = 31949750 }, - { url = "https://files.pythonhosted.org/packages/7c/b0/c741e8865d61b67c81e255f4f0a832846c064e426636cd7de84e74d209be/scipy-1.17.1-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:2040ad4d1795a0ae89bfc7e8429677f365d45aa9fd5e4587cf1ea737f927b4a1", size = 28585858 }, - { url = "https://files.pythonhosted.org/packages/ed/1b/3985219c6177866628fa7c2595bfd23f193ceebbe472c98a08824b9466ff/scipy-1.17.1-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:131f5aaea57602008f9822e2115029b55d4b5f7c070287699fe45c661d051e39", size = 20757723 }, - { url = "https://files.pythonhosted.org/packages/c0/19/2a04aa25050d656d6f7b9e7b685cc83d6957fb101665bfd9369ca6534563/scipy-1.17.1-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:9cdc1a2fcfd5c52cfb3045feb399f7b3ce822abdde3a193a6b9a60b3cb5854ca", size = 23043098 }, - { url = "https://files.pythonhosted.org/packages/86/f1/3383beb9b5d0dbddd030335bf8a8b32d4317185efe495374f134d8be6cce/scipy-1.17.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e3dcd57ab780c741fde8dc68619de988b966db759a3c3152e8e9142c26295ad", size = 33030397 }, - { url = "https://files.pythonhosted.org/packages/41/68/8f21e8a65a5a03f25a79165ec9d2b28c00e66dc80546cf5eb803aeeff35b/scipy-1.17.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a9956e4d4f4a301ebf6cde39850333a6b6110799d470dbbb1e25326ac447f52a", size = 35281163 }, - { url = "https://files.pythonhosted.org/packages/84/8d/c8a5e19479554007a5632ed7529e665c315ae7492b4f946b0deb39870e39/scipy-1.17.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:a4328d245944d09fd639771de275701ccadf5f781ba0ff092ad141e017eccda4", size = 35116291 }, - { url = "https://files.pythonhosted.org/packages/52/52/e57eceff0e342a1f50e274264ed47497b59e6a4e3118808ee58ddda7b74a/scipy-1.17.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a77cbd07b940d326d39a1d1b37817e2ee4d79cb30e7338f3d0cddffae70fcaa2", size = 37682317 }, - { url = "https://files.pythonhosted.org/packages/11/2f/b29eafe4a3fbc3d6de9662b36e028d5f039e72d345e05c250e121a230dd4/scipy-1.17.1-cp314-cp314t-win_amd64.whl", hash = "sha256:eb092099205ef62cd1782b006658db09e2fed75bffcae7cc0d44052d8aa0f484", size = 37345327 }, - { url = "https://files.pythonhosted.org/packages/07/39/338d9219c4e87f3e708f18857ecd24d22a0c3094752393319553096b98af/scipy-1.17.1-cp314-cp314t-win_arm64.whl", hash = "sha256:200e1050faffacc162be6a486a984a0497866ec54149a01270adc8a59b7c7d21", size = 25489165 }, + { url = "https://files.pythonhosted.org/packages/e7/53/053cd3669be0d474deae8fe5f757bff4c4f480b8a410231e0631c068873d/scipy-1.10.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0f1564ea217e82c1bbe75ddf7285ba0709ecd503f048cb1236ae9995f64217bd", size = 35003170 }, + { url = "https://files.pythonhosted.org/packages/0d/3e/d05b9de83677195886fb79844fcca19609a538db63b1790fa373155bc3cf/scipy-1.10.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:d925fa1c81b772882aa55bcc10bf88324dadb66ff85d548c71515f6689c6dac5", size = 28717513 }, + { url = "https://files.pythonhosted.org/packages/a5/3d/b69746c50e44893da57a68457da3d7e5bb75f6a37fbace3769b70d017488/scipy-1.10.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaea0a6be54462ec027de54fca511540980d1e9eea68b2d5c1dbfe084797be35", size = 30687257 }, + { url = "https://files.pythonhosted.org/packages/21/cd/fe2d4af234b80dc08c911ce63fdaee5badcdde3e9bcd9a68884580652ef0/scipy-1.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15a35c4242ec5f292c3dd364a7c71a61be87a3d4ddcc693372813c0b73c9af1d", size = 34124096 }, + { url = "https://files.pythonhosted.org/packages/65/76/903324159e4a3566e518c558aeb21571d642f781d842d8dd0fd9c6b0645a/scipy-1.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:43b8e0bcb877faf0abfb613d51026cd5cc78918e9530e375727bf0625c82788f", size = 42238704 }, ] [[package]] @@ -3798,20 +4525,41 @@ version = "1.18.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.15' and sys_platform == 'win32'", - "python_full_version >= '3.15' and platform_system == 'Linux' and sys_platform == 'emscripten'", - "python_full_version >= '3.15' and platform_system != 'Linux' and sys_platform == 'emscripten'", - "python_full_version >= '3.15' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.15' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.15' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version >= '3.15' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version >= '3.15' and platform_system == 'Darwin' and sys_platform == 'emscripten'", + "python_full_version >= '3.15' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform == 'emscripten'", + "python_full_version >= '3.15' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.15' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.15' and platform_system == 'Darwin' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.15' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.14.*' and sys_platform == 'win32'", - "python_full_version == '3.14.*' and platform_system == 'Linux' and sys_platform == 'emscripten'", - "python_full_version == '3.14.*' and platform_system != 'Linux' and sys_platform == 'emscripten'", - "python_full_version == '3.14.*' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.14.*' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_system == 'Linux' and sys_platform == 'emscripten'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_system != 'Linux' and sys_platform == 'emscripten'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.14.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.14.*' and platform_system == 'Darwin' and sys_platform == 'emscripten'", + "python_full_version == '3.14.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.14.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and platform_system == 'Darwin' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and platform_system == 'Darwin' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and platform_system == 'Darwin' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and platform_system == 'Darwin' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and platform_system == 'Darwin' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", ] dependencies = [ { name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, @@ -4095,20 +4843,41 @@ version = "3.8.11" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.15' and sys_platform == 'win32'", - "python_full_version >= '3.15' and platform_system == 'Linux' and sys_platform == 'emscripten'", - "python_full_version >= '3.15' and platform_system != 'Linux' and sys_platform == 'emscripten'", - "python_full_version >= '3.15' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.15' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.15' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version >= '3.15' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version >= '3.15' and platform_system == 'Darwin' and sys_platform == 'emscripten'", + "python_full_version >= '3.15' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform == 'emscripten'", + "python_full_version >= '3.15' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.15' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.15' and platform_system == 'Darwin' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.15' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.14.*' and sys_platform == 'win32'", - "python_full_version == '3.14.*' and platform_system == 'Linux' and sys_platform == 'emscripten'", - "python_full_version == '3.14.*' and platform_system != 'Linux' and sys_platform == 'emscripten'", - "python_full_version == '3.14.*' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.14.*' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_system == 'Linux' and sys_platform == 'emscripten'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_system != 'Linux' and sys_platform == 'emscripten'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.14.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.14.*' and platform_system == 'Darwin' and sys_platform == 'emscripten'", + "python_full_version == '3.14.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.14.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and platform_system == 'Darwin' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and platform_system == 'Darwin' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and platform_system == 'Darwin' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and platform_system == 'Darwin' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and platform_system == 'Darwin' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", ] dependencies = [ { name = "catalogue", marker = "python_full_version >= '3.12'" }, @@ -4184,33 +4953,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/33/78/d1a1a026ef3af911159398c939b1509d5c36fe524c7b644f34a5146c4e16/spacy_loggers-1.0.5-py3-none-any.whl", hash = "sha256:196284c9c446cc0cdb944005384270d775fdeaf4f494d8e269466cfa497ef645", size = 22343 }, ] -[[package]] -name = "sqlite-fts4" -version = "1.0.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c2/6d/9dad6c3b433ab8912ace969c66abd595f8e0a2ccccdb73602b1291dbda29/sqlite-fts4-1.0.3.tar.gz", hash = "sha256:78b05eeaf6680e9dbed8986bde011e9c086a06cb0c931b3cf7da94c214e8930c", size = 9718 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/51/29/0096e8b1811aaa78cfb296996f621f41120c21c2f5cd448ae1d54979d9fc/sqlite_fts4-1.0.3-py3-none-any.whl", hash = "sha256:0359edd8dea6fd73c848989e1e2b1f31a50fe5f9d7272299ff0e8dbaa62d035f", size = 9972 }, -] - -[[package]] -name = "sqlite-utils" -version = "4.1.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "click" }, - { name = "click-default-group" }, - { name = "pip" }, - { name = "pluggy" }, - { name = "python-dateutil" }, - { name = "sqlite-fts4" }, - { name = "tabulate" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/83/c1/fa8563039ec30b5cc6a532271e8cf90da37e4c649a3ad80b49fb6a39023e/sqlite_utils-4.1.1.tar.gz", hash = "sha256:cf97e620b3940cd541cae9117cc24af961a6da426189fdb662f20f1950ba1f49", size = 289827 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2b/3a/273fb49a326d0fc11d043574e0ea2ff2fb20e32a0e8f74147bad39ea9877/sqlite_utils-4.1.1-py3-none-any.whl", hash = "sha256:b52fd3d58b2778aacb35a074323aac49a924a323f98ee74027e590b08d1e6f32", size = 89319 }, -] - [[package]] name = "srsly" version = "2.5.3" @@ -4353,15 +5095,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl", hash = "sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5", size = 6299353 }, ] -[[package]] -name = "tabulate" -version = "0.10.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/46/58/8c37dea7bbf769b20d58e7ace7e5edfe65b849442b00ffcdd56be88697c6/tabulate-0.10.0.tar.gz", hash = "sha256:e2cfde8f79420f6deeffdeda9aaec3b6bc5abce947655d17ac662b126e48a60d", size = 91754 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/99/55/db07de81b5c630da5cbf5c7df646580ca26dfaefa593667fc6f2fe016d2e/tabulate-0.10.0-py3-none-any.whl", hash = "sha256:f0b0622e567335c8fabaaa659f1b33bcb6ddfe2e496071b743aa113f8774f2d3", size = 39814 }, -] - [[package]] name = "tenacity" version = "9.1.4" @@ -4380,15 +5113,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/33/d1/8bb87d21e9aeb323cc03034f5eaf2c8f69841e40e4853c2627edf8111ed3/termcolor-3.3.0-py3-none-any.whl", hash = "sha256:cf642efadaf0a8ebbbf4bc7a31cec2f9b5f21a9f726f4ccbb08192c9c26f43a5", size = 7734 }, ] -[[package]] -name = "text-unidecode" -version = "1.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ab/e2/e9a00f0ccb71718418230718b3d900e71a5d16e701a3dae079a21e9cd8f8/text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93", size = 76885 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a6/a5/c0b6468d3824fe3fde30dbb5e1f687b291608f9473681bbf7dabbf5a87d7/text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8", size = 78154 }, -] - [[package]] name = "thinc" version = "8.2.5" @@ -4438,20 +5162,41 @@ version = "8.3.11" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.15' and sys_platform == 'win32'", - "python_full_version >= '3.15' and platform_system == 'Linux' and sys_platform == 'emscripten'", - "python_full_version >= '3.15' and platform_system != 'Linux' and sys_platform == 'emscripten'", - "python_full_version >= '3.15' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.15' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.15' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version >= '3.15' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version >= '3.15' and platform_system == 'Darwin' and sys_platform == 'emscripten'", + "python_full_version >= '3.15' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform == 'emscripten'", + "python_full_version >= '3.15' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.15' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.15' and platform_system == 'Darwin' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.15' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.14.*' and sys_platform == 'win32'", - "python_full_version == '3.14.*' and platform_system == 'Linux' and sys_platform == 'emscripten'", - "python_full_version == '3.14.*' and platform_system != 'Linux' and sys_platform == 'emscripten'", - "python_full_version == '3.14.*' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.14.*' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_system == 'Linux' and sys_platform == 'emscripten'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_system != 'Linux' and sys_platform == 'emscripten'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.14.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.14.*' and platform_system == 'Darwin' and sys_platform == 'emscripten'", + "python_full_version == '3.14.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.14.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and platform_system == 'Darwin' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and platform_system == 'Darwin' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and platform_system == 'Darwin' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and platform_system == 'Darwin' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and platform_system == 'Darwin' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", ] dependencies = [ { name = "blis", version = "1.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, @@ -4532,20 +5277,41 @@ version = "2026.7.14" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.15' and sys_platform == 'win32'", - "python_full_version >= '3.15' and platform_system == 'Linux' and sys_platform == 'emscripten'", - "python_full_version >= '3.15' and platform_system != 'Linux' and sys_platform == 'emscripten'", - "python_full_version >= '3.15' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.15' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.15' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version >= '3.15' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version >= '3.15' and platform_system == 'Darwin' and sys_platform == 'emscripten'", + "python_full_version >= '3.15' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform == 'emscripten'", + "python_full_version >= '3.15' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.15' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.15' and platform_system == 'Darwin' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.15' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.14.*' and sys_platform == 'win32'", - "python_full_version == '3.14.*' and platform_system == 'Linux' and sys_platform == 'emscripten'", - "python_full_version == '3.14.*' and platform_system != 'Linux' and sys_platform == 'emscripten'", - "python_full_version == '3.14.*' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.14.*' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_system == 'Linux' and sys_platform == 'emscripten'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_system != 'Linux' and sys_platform == 'emscripten'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.14.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.14.*' and platform_system == 'Darwin' and sys_platform == 'emscripten'", + "python_full_version == '3.14.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.14.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and platform_system == 'Darwin' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and platform_system == 'Darwin' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and platform_system == 'Darwin' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and platform_machine != 'aarch64' and platform_system == 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and platform_system == 'Darwin' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and platform_system == 'Darwin' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform != 'emscripten' and sys_platform != 'win32'", ] dependencies = [ { name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, @@ -4555,6 +5321,60 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c8/e8/d381de4a3cc4e3682cba0338f43250893508aad0b310af1d0635f7b04413/tifffile-2026.7.14-py3-none-any.whl", hash = "sha256:4eb20372e76edf2c9fed922b1e3a0a0567be3560bd2008336115763bb1f3c034", size = 270614 }, ] +[[package]] +name = "tiktoken" +version = "0.13.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "regex" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e4/e5/5f3cb2159769d0f4324c0e9e87f9de3c4b1cd45848a96b2eb3566ad5ca77/tiktoken-0.13.0.tar.gz", hash = "sha256:c9435714c3a84c2319499de9a300c0e604449dd0799ff246458b3bb6a7f433c1", size = 38986 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1a/4c/1bc81f4cd53e827c4ee67ca951b5935724716049452d8dfa09b8b82372bb/tiktoken-0.13.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:7bfe1849caa65d1e1d9871817170ec497bbb7984e182012e1bdce72f66608cdb", size = 1036353 }, + { url = "https://files.pythonhosted.org/packages/75/91/10b9c7076bc02c246c853201fdbbe300a4b8c5ed7b84c25f7403f4e32655/tiktoken-0.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:91c180fe255bd5a86d8316210d2833a1d4d33d026cd86a67812f4773743c8d26", size = 984644 }, + { url = "https://files.pythonhosted.org/packages/4e/e4/fceae98015fab47fcd49b8bd7f46145bcd187a47e0add1e5378ed67ef980/tiktoken-0.13.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:059c8ecf554eb5b41e6e054ba467b871b03277d267dee7244380aca4359747d4", size = 1119261 }, + { url = "https://files.pythonhosted.org/packages/f9/39/fe42ad00de01a8c4a49ad8649a2c8a316835a9cad5961b11d21eac0020a5/tiktoken-0.13.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:36217497eaffc158607a3b26f065300db2aefd43b115263f3b9688ce38146173", size = 1138253 }, + { url = "https://files.pythonhosted.org/packages/03/c4/ccee1ecccca107e9a16efcecdeeb964c325305038554d466ece65b42338f/tiktoken-0.13.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:303f7d91b4fce3baddbcde05c139091d4caa5026ac7214c1dc7ff7a71ee429ff", size = 1185747 }, + { url = "https://files.pythonhosted.org/packages/9d/03/cd0cba295522b91eb55c6b2704f1df895f8226cfe60ab10d4d51d0cc9e69/tiktoken-0.13.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5d48843bee149630eb735a99e1f4a85b47308d21868ea63163f6e87768d3cfed", size = 1241265 }, + { url = "https://files.pythonhosted.org/packages/7e/25/a10efd564402d82c2ff50d12057353ace447aa8007deceaa48641f63d35c/tiktoken-0.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:fc1c44cd37b43fc46bae593129164f4f281e82ea116b57a85aa81bda57eafc94", size = 876509 }, + { url = "https://files.pythonhosted.org/packages/85/8e/144bde4e01df66b34bb865557c7cd754ed08b036217ebd79c9db5e9048a9/tiktoken-0.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:32ac870a806cfb260a02d0cb70426aef02e038297f8ad50df5040bb5af360791", size = 1034888 }, + { url = "https://files.pythonhosted.org/packages/36/18/d4ac9d20956cdebca04841316660ed584c2fecdc2b81722a28bc7ad3b1e4/tiktoken-0.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4d9980f11429ed2d737c463bb1fb78cf330caa026adf002f714aced7849a687b", size = 982970 }, + { url = "https://files.pythonhosted.org/packages/74/ed/6bb8d05b9f731f749fee5c6f5ca63e981143c826a5985877330507bd13b7/tiktoken-0.13.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:3f277ebea5edd7b8bf03c6f9431e1d67d517530115572b2dc1d465326e8f88c7", size = 1115741 }, + { url = "https://files.pythonhosted.org/packages/34/de/2ca96b07a82d972b74fe4b46de055b79c904e45c7eab699354a0bfa697dc/tiktoken-0.13.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:a116178fa7e1b4065bff05214360373a65cac22f965be7b3f73d00a0dbfe7649", size = 1136523 }, + { url = "https://files.pythonhosted.org/packages/ee/dc/9dafec002c2d4424378563cf4cf5c7fb93631d2a55013c8b87554ee4012c/tiktoken-0.13.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2c397ddda233208345b01bd30f2fca79ff730e55731d0108a603f9bc57f6af3b", size = 1181954 }, + { url = "https://files.pythonhosted.org/packages/a1/d0/1f8578c45b2f24759b46f0b50d31878c63c73e6bf0f2227e10ec5c5408dc/tiktoken-0.13.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:95097e4f89b06403976e498abf61a0ee73a7497e73fb599cb211d8197a054d91", size = 1240069 }, + { url = "https://files.pythonhosted.org/packages/aa/90/28d7f154888610aa9237e541986beb62b479df29d193a5a0617dbb1514d0/tiktoken-0.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:8f2d16e7a7c783ad81f36e457d046d1f1c8af70b22aec8a13238efe531977c41", size = 874748 }, + { url = "https://files.pythonhosted.org/packages/9c/83/b096c859c2a47c11731bf2f5885f4028b809dfe2396582883eed9cae372f/tiktoken-0.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5df5d1507bd245f1ccad4a074698240021239e455eb0bb4ced4e3d7181872154", size = 1034228 }, + { url = "https://files.pythonhosted.org/packages/53/61/c68e123b6d753e3fc2751e9b18e732c9d8bf1e1926762e736eee935d931c/tiktoken-0.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8fe806a50664e83a6ffd56cbd1e4f5dcc6cd32a3e7538f70dc38b1a271384545", size = 982978 }, + { url = "https://files.pythonhosted.org/packages/ef/8b/96cc178cc584e65d363134500f297790b06cd48cdeb1e8fcf7bbe60f4715/tiktoken-0.13.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:125bc05005e747f993a83dc67934249932d6e4209854452cd4c0b1d53fba3ba2", size = 1116355 }, + { url = "https://files.pythonhosted.org/packages/86/f5/bab735d2c72ea55404b295d02d092644eb5f7cc6205e34d35eb9abfb9ab2/tiktoken-0.13.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:5e6358911cab4adee6712da27d65573496a4f68cf8a2b5fca6a4ad10fc5748cf", size = 1135772 }, + { url = "https://files.pythonhosted.org/packages/4e/b9/6de04ebdf904edfaad87788011b3735087a0c9ea671b9027e1e4e965e8c8/tiktoken-0.13.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:975cbd78d085d75d26b59660e262736dcaed1e35f8f142cd6291025c01d25486", size = 1182415 }, + { url = "https://files.pythonhosted.org/packages/0d/9c/470a05f3b1caf038f44880e334d47ab674e0c80d514c66b375d14d5afa10/tiktoken-0.13.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:75ab9bc99fa020a4c283424590ecd7f3afd70c1c281cb3fa3192a6c3af9f9615", size = 1239879 }, + { url = "https://files.pythonhosted.org/packages/42/a6/c1936d16055436cb32e6c6128d68629622e00f4768562f55653752d34768/tiktoken-0.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:6b1615f0ff71953d19729ceb18865429c185b0a23c5353f1bbca34a394bf60f7", size = 874829 }, + { url = "https://files.pythonhosted.org/packages/d6/07/acb5992c3772b5a36284f742cfb7a5895aa4471d1848ac31464ad50d7fdf/tiktoken-0.13.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:6eb4a5bfbc6426938026b1a334e898ac53541360d62d8c689870160cc80abd67", size = 1033600 }, + { url = "https://files.pythonhosted.org/packages/14/e9/742e9aec30f59b9f161f7ff7cd072e02ea836c9e1c0854a8076dfcd40d5c/tiktoken-0.13.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:43cee3e5400573b2046fbf092cc7a5bc30164f9e4c95ce20714da929df48737a", size = 982516 }, + { url = "https://files.pythonhosted.org/packages/72/74/ca1541b053e7648254d2e4b42a253e1bb4359f2c91a0a8d49228c794e1a0/tiktoken-0.13.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:7de52e3f566d19b3b11bd37eea552c6c305ad74081f736882bd44d148ed4c48d", size = 1115518 }, + { url = "https://files.pythonhosted.org/packages/46/e3/93825eaf5a4a504795b787e5d5dea07fbeb3dabf97aa7b450be8bde59c89/tiktoken-0.13.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:51384448aa508e4df84c0f7c1dc3211c7f7b8096325660ee5fc82f3e11b381ce", size = 1136867 }, + { url = "https://files.pythonhosted.org/packages/8c/46/002b68de6827091d5ae90b048f326e8aad8d953520950e5ce1508879414f/tiktoken-0.13.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e28157350f7ebf35008dd8e9e0fdb621f976e4230c881099c85e8cf07eaa50e2", size = 1181826 }, + { url = "https://files.pythonhosted.org/packages/db/c6/d393e3185a276505182f7abd93fe714f3c444a2be9180798fa052347504e/tiktoken-0.13.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:165cf1820ea4a354985c2490a5205d4cc74661c934aca79dd0368232fff94e0f", size = 1239489 }, + { url = "https://files.pythonhosted.org/packages/b7/4d/bc07d1f1635d4897a202acc0ae11c2886eaa7325c359ba4741b47bf8e225/tiktoken-0.13.0-cp313-cp313t-win_amd64.whl", hash = "sha256:6c43a675ca14f6f2749ba7f12075d37456015a24b859f2517b9beb4ef30807ec", size = 873820 }, + { url = "https://files.pythonhosted.org/packages/8c/93/0dd6adca026a616c3a92974566b43381eea4b475ce1f36c062b8271a9ac5/tiktoken-0.13.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaaaef47c2406277181d2086484c317bf7fc433e2d5d03ff94f56b0dcec87471", size = 1034977 }, + { url = "https://files.pythonhosted.org/packages/d9/77/5ec6e6bc5b30bed6d93f7f2162d8f6b32437b3ba27cb527cfe004f6109c9/tiktoken-0.13.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ca8b310bd93b3772cb1b7922d915446864860f562bdfe4825c63a0aed3fb28cd", size = 983635 }, + { url = "https://files.pythonhosted.org/packages/94/b0/c8ae9aff00d625c50659b4513e707a0462c4bf5d4d6cc1b802103225c02e/tiktoken-0.13.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:32e0c12305105002c047b3bb1070b0dd9a73b0cb3b2856a8972b810e7a4f5881", size = 1116036 }, + { url = "https://files.pythonhosted.org/packages/1b/ac/6a5dddd1d0a6018ecb389bd0353e6b4a515eb4d2286611bd0ace1937b9e1/tiktoken-0.13.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:5ba5fd62507a932d1241346179e3b39bc7bf7408f03c272652d93b3bedf5db24", size = 1135544 }, + { url = "https://files.pythonhosted.org/packages/f4/b8/585032b4384b2f7dcdaddcb52865c83a701a420d09e3c2b4a2be1c450c57/tiktoken-0.13.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d108bc2d470fc53c8ecd24f2c0fd2b5f98c33e87cdb6aa2e9b8c5dced703d273", size = 1182217 }, + { url = "https://files.pythonhosted.org/packages/cd/b6/993ff1ded3958215fd341a847b8e5ffeb5de473f435296870d314fc91ac4/tiktoken-0.13.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:cb99cb5127449f58d0a2d5f5ccfb390d8dbdfd919c221246caaee29d8725ed51", size = 1239404 }, + { url = "https://files.pythonhosted.org/packages/dd/3d/fef7e06e3b33e7538db0ced734cf9fe23b6832d2ac4990c119c377aec55e/tiktoken-0.13.0-cp314-cp314-win_amd64.whl", hash = "sha256:115c4f26ffa11caac8b54eea35c2ad38c612c20a48d35dd15d70a02ac6f51f58", size = 918686 }, + { url = "https://files.pythonhosted.org/packages/c1/82/a7fc44582bc32ab00de988a2299bf77c077f59068b233109e34b7d6ca7e6/tiktoken-0.13.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:472527e9132952f2fbf77cd290658bacf003d4d5a3fabc18e5fbd407cbae4d9b", size = 1034454 }, + { url = "https://files.pythonhosted.org/packages/37/d0/24d8a890c14f432a05cea669c17bebeaa99f96a7c79523b590f564246411/tiktoken-0.13.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:4e2f67d27c9626cdd25fe33d9313c5cdb3d8d82da646b68d6eb8e7e9c20e6448", size = 982976 }, + { url = "https://files.pythonhosted.org/packages/49/b7/2ab43f62788a9266187a9bfc1d3af99ad83e5eaa25fbef168a69cd5ad14f/tiktoken-0.13.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:2b920b35805cd64585a37c3dc7ce65fba4d2d36016be01e1d7942482ca29093a", size = 1115526 }, + { url = "https://files.pythonhosted.org/packages/64/39/1494321ed323ce7a14d88e3cd6cb9058625977df1c6961ddc492bd10a9f3/tiktoken-0.13.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:493af3aa28a4aaf2e3d2600a2ee717252c9bf5ab38fff94eb5a02db5ab77e5ad", size = 1136466 }, + { url = "https://files.pythonhosted.org/packages/96/d9/dfd086aa2d918c563a140720e0ce296cada1634efd2783d5cf51e05f984e/tiktoken-0.13.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:6644c9c2b5cf3916f5a3641d7d12fdb3f006a7b3d9ff6acdaec44e29ab1ff91e", size = 1181863 }, + { url = "https://files.pythonhosted.org/packages/2f/68/a18b4f307086954fdae32714cb4f85562e34f9d34ab206e61f1816aa6018/tiktoken-0.13.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5cb65b60b9408563676d874a3a4ee573370066f0dc4e29d84e82e989c6517424", size = 1239218 }, + { url = "https://files.pythonhosted.org/packages/16/5b/f2aa703a4fc5d2dff73460a7d46cc2f3f44aa0f3dd8eeb20d2a0ecf68862/tiktoken-0.13.0-cp314-cp314t-win_amd64.whl", hash = "sha256:85b78cc3a2c3d48723ca751fa981f1fedccd54194ca0471b957364353a898b07", size = 918110 }, +] + [[package]] name = "timm" version = "1.0.28" @@ -4786,6 +5606,27 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f0/ac/229b7d4589d2e5937310e72c6d46e89599d16a4a12b479ffa1499fee8eb8/triton-3.7.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:10ba85fa2cca4a2fbdeb36bf1cb082f2c252bda55bf9fccd74f65ec5bc647e68", size = 197824404 }, ] +[[package]] +name = "txtai" +version = "9.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "faiss-cpu" }, + { name = "huggingface-hub" }, + { name = "msgpack" }, + { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, + { name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "pyyaml" }, + { name = "regex" }, + { name = "safetensors" }, + { name = "torch" }, + { name = "transformers" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4d/56/ca8185030a741fb7f884a70c5be25d8ba666543a8fd2cf6422c104a62af8/txtai-9.11.0.tar.gz", hash = "sha256:2f463aa98e1bb70c14be5767ca137fb9808b0c07e02778875ec62693d9a57c35", size = 238849 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/2c/2396a30770514583393df1abe00824d13eeb37b27b31ab9e98cdede13715/txtai-9.11.0-py3-none-any.whl", hash = "sha256:bc6193e167da0899873e652b97c1c2a9d0bdaffb3dd908fbb372a106bc8473b1", size = 324452 }, +] + [[package]] name = "typer" version = "0.27.0" @@ -5326,6 +6167,114 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6b/57/5c6e0908a47f61dca96d01c8ee6fce01ed1050611eb779083ba8758fed81/xxhash-3.8.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:345b07b78e2bf583d71682aa34ae5b5fab575f7a1cb31e10263ebbc6f89f8c42", size = 32869 }, ] +[[package]] +name = "yarl" +version = "1.24.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "multidict" }, + { name = "propcache" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/79/12/1e8f37460ea0f7eb59c221fdaf0ed75e7ac43e97f8093b9c6f411df50a78/yarl-1.24.2.tar.gz", hash = "sha256:9ac374123c6fd7abf64d1fec93962b0bd4ee2c19751755a762a72dd96c0378f8", size = 210798 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/c5/1ce244152ff2839645e7cae92f90e7bafcb2c52bea7ff586ac714f14f5df/yarl-1.24.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:36348bebb147b83818b9d7e673ea4debc75970afc6ffdc7e3975ad05ce5a58c1", size = 128971 }, + { url = "https://files.pythonhosted.org/packages/87/5a/00f36967203ed89cb3acd2c8ed526cc3fed9418eb70ce128160a911c8499/yarl-1.24.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1a97e42c8a2233f2f279ecadd9e4a037bcb5d813b78435e8eedd4db5a9e9708c", size = 91507 }, + { url = "https://files.pythonhosted.org/packages/31/d0/1fb0c1cd27288f39f6974da4318c32768d72c9890984541fdf1e2e32a51d/yarl-1.24.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8d027d56f1035e339d1001ac33eceab5b2ec8e42e449787bb75e289fb9a5cd1d", size = 91343 }, + { url = "https://files.pythonhosted.org/packages/03/ce/d4a646508bed2f8dec6435b40166fe9308dd191262033d3f307b2bbcaecd/yarl-1.24.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a6377060e7927187a42b7eb202090cbe2b34933a4eeaf90e3bd9e33432e5cae", size = 105704 }, + { url = "https://files.pythonhosted.org/packages/4b/07/b3278e82d8bc41485bcf6d856cd0433262593de615b1d3dc43bd3f5bead4/yarl-1.24.2-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:17076578bce0049a5ce57d14ad1bded391b68a3b213e9b81b0097b090244999a", size = 97281 }, + { url = "https://files.pythonhosted.org/packages/17/5b/4cee6e7c92e487bebe7afc797da0aa54a248ab4e776a68fe369ec29665a5/yarl-1.24.2-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:50713f1d4d6be6375bb178bb43d140ee1acb8abe589cd723320b7925a275be1e", size = 114020 }, + { url = "https://files.pythonhosted.org/packages/5c/82/111076571545a7d4f9cca3fbd5c6f40615af58642be09f12328f48022468/yarl-1.24.2-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:34263e2fa8fb5bb63a0d97706cda38edbad62fddb58c7f12d6acbc092812aa50", size = 111450 }, + { url = "https://files.pythonhosted.org/packages/b6/ec/08f671f69a444d704aeecebf92af659b67b97a869942411d0a578b08c334/yarl-1.24.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:49016d82f032b1bd1e10b01078a7d29ae71bf468eeae0ea22df8bab691e60003", size = 106384 }, + { url = "https://files.pythonhosted.org/packages/e5/86/ce41e7a7a199340b2330d52b60f25c4074b6636dd0e60b1a80d31a9db042/yarl-1.24.2-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3f6d2c216318f8f32038ca3f72501ba08536f0fd18a36e858836b121b2deed9f", size = 106153 }, + { url = "https://files.pythonhosted.org/packages/c4/5d/31be8a729531ab3e55ac3e7e5c800be8c89ea98947f418b2f6ea259fb6ee/yarl-1.24.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:08d3a33218e0c64393e7610284e770409a9c31c429b078bcb24096ed0a783b8f", size = 105322 }, + { url = "https://files.pythonhosted.org/packages/47/9b/b57afb22b386ae87ac9940f09878b98d8c333f89113e6fc96fcf4ca9eb64/yarl-1.24.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:5d699376c4ca3cba49bbfae3a05b5b70ded572937171ce1e0b8d87118e2ba294", size = 99057 }, + { url = "https://files.pythonhosted.org/packages/a3/4f/06348c27c8389256c313e8a57d796808fc0264c915dd5e7cfd3c0e314dc7/yarl-1.24.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a1cab588b4fa14bea2e55ebea27478adfb05372f47573738e1acc4a36c0b05d2", size = 113502 }, + { url = "https://files.pythonhosted.org/packages/5f/1c/284f307b298e4a17b7943b07d9d7ecc4151537f8d137ba51f3bb6c31ca20/yarl-1.24.2-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:ec87ccc31bd21db7ad009d8572c127c1000f268517618a4cc09adba3c2a7f21c", size = 105253 }, + { url = "https://files.pythonhosted.org/packages/c8/bf/0de123bec8619e45c80cbded9085f61b5b4a9eddb8abe6d25d28ee1ec866/yarl-1.24.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:d1dd47a22843b212baa8d74f37796815d43bd046b42a0f41e9da433386c3136b", size = 111345 }, + { url = "https://files.pythonhosted.org/packages/90/af/0248eb065e51129d2a9b2436cd1b5c772c19a6b04e5b6a186955671e3319/yarl-1.24.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7b54b9c67c2b06bd7b9a77253d242124b9c95d2c02def5a1144001ee547dd9d5", size = 106558 }, + { url = "https://files.pythonhosted.org/packages/21/3c/f960d7a65ef97d8ba9b424fb5128796a4bc710fc6df2ddbbd7dfdc3bbd20/yarl-1.24.2-cp311-cp311-win_amd64.whl", hash = "sha256:f8fdbcff8b2c7c9284e60c196f693588598ddcee31e11c18e14949ce44519d45", size = 92808 }, + { url = "https://files.pythonhosted.org/packages/03/1a/49fb03750e4de4d2284cd5b885a383133c34eef45bd59631b2bb8b7e81e8/yarl-1.24.2-cp311-cp311-win_arm64.whl", hash = "sha256:b32c37a7a337e90822c45797bf3d79d60875cfcccd3ecc80e9f453d87026c122", size = 87610 }, + { url = "https://files.pythonhosted.org/packages/f0/da/866bcb01076ba49d2b42b309867bed3826421f1c479655eb7a607b44f20b/yarl-1.24.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b975866c184564c827e0877380f0dae57dcca7e52782128381b72feff6dfceb8", size = 129957 }, + { url = "https://files.pythonhosted.org/packages/bf/1d/fcefb70922ea2268a8971d8e5874d9a8218644200fb8465f1dcad55e6851/yarl-1.24.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3b075301a2836a0e297b1b658cb6d6135df535d62efefdd60366bd589c2c82f2", size = 92164 }, + { url = "https://files.pythonhosted.org/packages/29/b6/170e2b8d4e3bc30e6bfdcca53556537f5bf595e938632dfcb059311f3ff6/yarl-1.24.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8ae44649b00947634ab0dab2a374a638f52923a6e67083f2c156cd5cbd1a881d", size = 91688 }, + { url = "https://files.pythonhosted.org/packages/fe/a5/c9f655d5553ea0b99fdac9d6a99ad3f9b3e73b8e5758bb46f58c9831f74c/yarl-1.24.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:507cc19f0b45454e2d6dcd62ff7d062b9f77a2812404e62dbdaec05b50faa035", size = 102902 }, + { url = "https://files.pythonhosted.org/packages/5d/bc/6b9664d815d79af4ee553337f9d606c56bbf269186ada9172de45f1b5f60/yarl-1.24.2-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c4c17bad5a530912d2111825d3f05e89bab2dd376aaa8cbc77e449e6db63e576", size = 97931 }, + { url = "https://files.pythonhosted.org/packages/98/ec/32ba48acae30fecd60928f5791188b80a9d6ee3840507ffda29fecd37b71/yarl-1.24.2-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f5f0cbb112838a4a293985b6ed73948a547dadcc1ba6d2089938e7abdedceef8", size = 111030 }, + { url = "https://files.pythonhosted.org/packages/82/5a/6f4cd081e5f4934d2ae3a8ef4abe3afacc010d26f0035ee91b35cd7d7c37/yarl-1.24.2-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5ec8356b8a6afcf81fc7aeeef13b1ff7a49dec00f313394bbb9e83830d32ccd7", size = 110392 }, + { url = "https://files.pythonhosted.org/packages/7a/da/323a01c349bd5fb01bb6652e314d9bb218cee630a736bdb810ad50e4013f/yarl-1.24.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7e7ebcdef69dec6c6451e616f32b622a6d4a2e92b445c992f7c8e5274a6bbc4c", size = 105612 }, + { url = "https://files.pythonhosted.org/packages/7c/80/264ab684f181e1a876389374519ff05d10248725535ae2ac4e8ac4e563d6/yarl-1.24.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:47a55d6cf6db2f401017a9e96e5288844e5051911fb4e0c8311a3980f5e59a7d", size = 104487 }, + { url = "https://files.pythonhosted.org/packages/41/07/efabe5df87e96d7ad5959760b888344be48cd6884db127b407c6b5503adc/yarl-1.24.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3065657c80a2321225e804048597ad55658a7e76b32d6f5ee4074d04c50401db", size = 102333 }, + { url = "https://files.pythonhosted.org/packages/44/0c/bcf7c42603e1009295f586d8890f2ba032c8b53310e815adf0a202c73d9f/yarl-1.24.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:cb84b80d88e19ede158619b80813968713d8d008b0e2497a576e6a0557d50712", size = 99025 }, + { url = "https://files.pythonhosted.org/packages/4f/82/84482ab1a57a0f21a08afe6a7004c61d741f8f2ecc3b05c321577c612164/yarl-1.24.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:990de4f680b1c217e77ff0d6aa0029f9eb79889c11fb3e9a3942c7eba29c1996", size = 110507 }, + { url = "https://files.pythonhosted.org/packages/c4/8d/a546ba1dfe1b0f290e05fef145cd07614c0f15df1a707195e512d1e39d1d/yarl-1.24.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:abb8ec0323b80161e3802da3150ef660b41d0e9be2048b76a363d93eee992c2b", size = 103719 }, + { url = "https://files.pythonhosted.org/packages/1a/b6/267f2a09213138473adfce6b8a6e17791d7fee70bd4d9003218e4dec58b0/yarl-1.24.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e7977781f83638a4c73e0f88425563d70173e0dfd90ac006a45c65036293ee3c", size = 110438 }, + { url = "https://files.pythonhosted.org/packages/48/2d/1c8d89c7c5f9cad9fb2902445d94e2ab1d7aa35de029afbb8ae95c42d00f/yarl-1.24.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e30dd55825dc554ec5b66a94953b8eda8745926514c5089dfcacecb9c99b5bd1", size = 105719 }, + { url = "https://files.pythonhosted.org/packages/a7/25/722e3b93bd687009afb2d59a35e13d30ddd8f80571445bb0c4e4ce26ec66/yarl-1.24.2-cp312-cp312-win_amd64.whl", hash = "sha256:7dafe10c12ddd4d120d528c4b5599c953bd7b12845347d507b95451195bb6cad", size = 92901 }, + { url = "https://files.pythonhosted.org/packages/39/47/4486ccfb674c04854a1ef8aa77868b6a6f765feaf69633409d7ca4f02cb8/yarl-1.24.2-cp312-cp312-win_arm64.whl", hash = "sha256:044a09d8401fcf8681977faef6d286b8ade1e2d2e9dceda175d1cfa5ca496f30", size = 87229 }, + { url = "https://files.pythonhosted.org/packages/82/62/fcf0ce677f17e5c471c06311dd25964be38a4c586993632910d2e75278bc/yarl-1.24.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:491ac9141decf49ee8030199e1ee251cdff0e131f25678817ff6aa5f837a3536", size = 128978 }, + { url = "https://files.pythonhosted.org/packages/d3/58/8e63299bb71ed61a834121d9d3fe6c9fcf2a6a5d09754ff4f20f2d20baf5/yarl-1.24.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e89418f65eda18f99030386305bd44d7d504e328a7945db1ead514fbe03a0607", size = 91733 }, + { url = "https://files.pythonhosted.org/packages/c1/24/16748d5dab6daec8b0ed81ccec639a1cded0f18dcc62a4f696b4fe366c37/yarl-1.24.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cdfcce633b4a4bb8281913c57fcafd4b5933fbc19111a5e3930bbd299d6102f1", size = 91113 }, + { url = "https://files.pythonhosted.org/packages/1b/66/b63fff7b71211e866624b21432d5943cbb633eb0c2872d9ee3070648f22c/yarl-1.24.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:863297ddede92ee49024e9a9b11ecb59f310ca85b60d8537f56bed9bbb5b1986", size = 103899 }, + { url = "https://files.pythonhosted.org/packages/9d/ac/ba1974b8533909636f7733fe86cf677e3619527c3c2fa913e0ea89c48757/yarl-1.24.2-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:374423f70754a2c96942ede36a29d37dc6b0cb8f92f8d009ddf3ed78d3da5488", size = 97862 }, + { url = "https://files.pythonhosted.org/packages/1b/a5/123ac993b5c2ba6f554a140305620cb8f150fa543711bbc49be3ec0a65a4/yarl-1.24.2-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:33a29b5d00ccbf3219bb3e351d7875739c19481e030779f48cc46a7a71681a9b", size = 111060 }, + { url = "https://files.pythonhosted.org/packages/23/37/c472d3af3509688392134a88a825276770a187f1daa4de3f6dc0a327a751/yarl-1.24.2-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a9532c57211730c515341af11fef6e9b61d157487272a096d0c04da445642592", size = 110613 }, + { url = "https://files.pythonhosted.org/packages/df/88/09c28dad91e662ccfaa1b78f1c57badde74fc9d0b23e74aef644750ecd73/yarl-1.24.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:91e72cf093fd833483a97ee648e0c053c7c629f51ff4a0e7edd84f806b0c5617", size = 107012 }, + { url = "https://files.pythonhosted.org/packages/07/ab/9d4f69d571a94f4d112fa7e2e007200f5a54d319f58c82ac7b7baa61f5c6/yarl-1.24.2-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b3177bc0a768ef3bacceb4f272632990b7bea352f1b2f1eee9d6d6ff16516f92", size = 105887 }, + { url = "https://files.pythonhosted.org/packages/8e/9a/000b2b66c0d772a499fc531d21dab92dfeb73b640a12eed6ba89f49bb2d0/yarl-1.24.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e196952aacaf3b232e265ff02980b64d483dc0972bd49bcb061171ff22ac203a", size = 103620 }, + { url = "https://files.pythonhosted.org/packages/41/7c/7c1050f73450fbdaa3f0c72017059f00ce5e13366692f3dba25275a1083d/yarl-1.24.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:204e7a61ce99919c0de1bf904ab5d7aa188a129ea8f690a8f76cfb6e2844dc44", size = 100599 }, + { url = "https://files.pythonhosted.org/packages/ec/b1/29e5756b3926705f5f6089bd5b9f50a56eaac550da6e260bf713ead44d04/yarl-1.24.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b156914620f0b9d78dc1adb3751141daee561cfec796088abb89ed49d220f1a", size = 110604 }, + { url = "https://files.pythonhosted.org/packages/a3/4b/8415bc96e9b150cde942fbac9a8182985e58f40ce5c54c34ed015407d3ee/yarl-1.24.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:8372a2b976cf70654b2be6619ab6068acabb35f724c0fda7b277fbf53d66a5cf", size = 105161 }, + { url = "https://files.pythonhosted.org/packages/8b/d4/cde059abfa229553b7298a2eadde2752e723d50aeedaef86ce59da2718ee/yarl-1.24.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:f9a1e9b622ca284143aab5d885848686dcd85453bb1ca9abcdb7503e64dc0056", size = 110619 }, + { url = "https://files.pythonhosted.org/packages/e7/2c/d6a6c9a61549f7b6c7e6dc6937d195bcf069582b47b7200dcd0e7b256acf/yarl-1.24.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:810e19b685c8c3c5862f6a38160a1f4e4c0916c9390024ec347b6157a45a0992", size = 107362 }, + { url = "https://files.pythonhosted.org/packages/92/dd/3ae5fe417e9d1c353a548553326eb9935e76b6b727161563b424cc296df3/yarl-1.24.2-cp313-cp313-win_amd64.whl", hash = "sha256:7d37fb7c38f2b6edab0f845c4f85148d4c44204f52bc127021bd2bc9fdbf1656", size = 92667 }, + { url = "https://files.pythonhosted.org/packages/10/cc/a7beb239f78f27fca1b053c8e8595e4179c02e62249b4687ec218c370c50/yarl-1.24.2-cp313-cp313-win_arm64.whl", hash = "sha256:1e831894be7c2954240e49791fa4b50c05a0dc881de2552cfe3ffd8631c7f461", size = 87069 }, + { url = "https://files.pythonhosted.org/packages/40/0e/e08087695fc12789263821c5dc0f8dc52b5b17efd0887cacf419f8a43ba3/yarl-1.24.2-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:f9312b3c02d9b3d23840f67952913c9c8721d7f1b7db305289faefa878f364c2", size = 129670 }, + { url = "https://files.pythonhosted.org/packages/3a/98/ab4b5ed1b1b5cd973c8a3eb994c3a6aefb6ce6d399e21bb5f0316c33815c/yarl-1.24.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:a4f4d6cd615823bfc7fb7e9b5987c3f41666371d870d51058f77e2680fbe9630", size = 91916 }, + { url = "https://files.pythonhosted.org/packages/ba/b1/5297bb6a7df4782f7605bffc43b31f5044070935fbbcaa6c705a07e6ac65/yarl-1.24.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0c3063e5c0a8e8e62fae6c2596fa01da1561e4cd1da6fec5789f5cf99a8aefd8", size = 91625 }, + { url = "https://files.pythonhosted.org/packages/02/a7/45baabfff76829264e623b185cff0c340d7e11bf3e1cd9ea37e7d17934bd/yarl-1.24.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fecd17873a096036c1c87ab3486f1aef7f269ada7f23f7f856f93b1cc7744f14", size = 104574 }, + { url = "https://files.pythonhosted.org/packages/f3/40/3a5ab144d3d650ca37d4f4b57e56169be8af3ca34c448793e064b30baaed/yarl-1.24.2-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a46d1ab4ba4d32e6dc80daf8a28ce0bd83d08df52fbc32f3e288663427734535", size = 97534 }, + { url = "https://files.pythonhosted.org/packages/9c/b5/5658fef3681fb5776b4513b052bec750009f47b3a592251c705d75375798/yarl-1.24.2-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:73e68edf6dfd5f73f9ca127d84e2a6f9213c65bdffb736bda19524c0564fcd14", size = 111481 }, + { url = "https://files.pythonhosted.org/packages/4c/06/fdcd7dde037f00866dce123ed4ba23dba94beb56fc4cf561668d27be37f2/yarl-1.24.2-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a296ca617f2d25fbceafb962b88750d627e5984e75732c712154d058ae8d79a3", size = 111529 }, + { url = "https://files.pythonhosted.org/packages/c2/53/d81269aaafccea0d33396c03035de997b743f11e648e6e27a0df99c72980/yarl-1.24.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e51b2cf5ec89a8b8470177641ed62a3ba22d74e1e898e06ad53aa77972487208", size = 107338 }, + { url = "https://files.pythonhosted.org/packages/ae/04/23049463f729bd899df203a7960505a75333edd499cda8aa1d5a82b64df5/yarl-1.24.2-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:310fc687f7b2044ec54e372c8cbe923bb88f5c37bded0d3079e5791c2fc3cf50", size = 106147 }, + { url = "https://files.pythonhosted.org/packages/14/18/04a4b5830b43ed5e4c5015b40e9f6241ad91487d71611061b4e111d6ac80/yarl-1.24.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:297a2fe352ecf858b30a98f87948746ec16f001d279f84aebdbd3bd965e2f1bd", size = 104272 }, + { url = "https://files.pythonhosted.org/packages/5a/f7/8cffdf319aee7a7c1dbd07b61d91c3e3fda460c7a93b5f93e445f3806c4c/yarl-1.24.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:2a263e76b97bc42bdcd7c5f4953dec1f7cd62a1112fa7f869e57255229390d67", size = 99962 }, + { url = "https://files.pythonhosted.org/packages/d7/39/b3cce3b7dbef64ac700ad4cea156a207d01bede0f507587616c364b5468e/yarl-1.24.2-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:822519b64cf0b474f1a0aaef1dc621438ea46bb77c94df97a5b4d213a7d8a8b1", size = 111063 }, + { url = "https://files.pythonhosted.org/packages/a1/ea/100818505e7ebf165c7242ff17fdf7d9fee79e27234aeca871c1082920d7/yarl-1.24.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:b6067060d9dc594899ba83e6db6c48c68d1e494a6dab158156ed86977ca7bcb1", size = 105438 }, + { url = "https://files.pythonhosted.org/packages/8f/d2/e075a0b32aa6625087de9e653087df0759fed5de4a435fef594181102a77/yarl-1.24.2-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:0063adad533e57171b79db3943b229d40dfafeeee579767f96541f106bac5f1b", size = 111458 }, + { url = "https://files.pythonhosted.org/packages/e6/5c/ceea7ba98b65c8eb8d947fdc52f9bedfcd43c6a57c9e3c90c17be8f324a3/yarl-1.24.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ee8e3fb34513e8dc082b586ef4910c98335d43a6fab688cd44d4851bacfce3e8", size = 107589 }, + { url = "https://files.pythonhosted.org/packages/fa/d9/5582d57e2b2db9b85eb6663a22efdd78e08805f3f5389566e9fcad254d1b/yarl-1.24.2-cp314-cp314-win_amd64.whl", hash = "sha256:afb00d7fd8e0f285ca29a44cc50df2d622ff2f7a6d933fa641577b5f9d5f3db0", size = 94424 }, + { url = "https://files.pythonhosted.org/packages/92/10/7dc07a0e22806a9280f42a57361395506e800c64e22737cd7b0886feab42/yarl-1.24.2-cp314-cp314-win_arm64.whl", hash = "sha256:68cf6eacd6028ef1142bc4b48376b81566385ca6f9e7dde3b0fa91be08ffcb57", size = 88690 }, + { url = "https://files.pythonhosted.org/packages/9e/13/d5b8e2c8667db955bcb3de233f18798fefe7edf1d7429c2c9d4f9c401114/yarl-1.24.2-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:221ce1dd921ac4f603957f17d7c18c5cc0797fbb52f156941f92e04605d1d67b", size = 136248 }, + { url = "https://files.pythonhosted.org/packages/de/46/a4a97c05c9c9b8fd266bb2a0df12992c7fbd02391eb9640583411b6dab32/yarl-1.24.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:5f3224db28173a00d7afacdee07045cc4673dfab2b15492c7ae10deddbece761", size = 95084 }, + { url = "https://files.pythonhosted.org/packages/95/b2/845cf2074a015e6fe0d0808cf1a2d9e868386c4220d657ebd8302b199043/yarl-1.24.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c557165320d6244ebe3a02431b2a201a20080e02f41f0cfa0ccc47a183765da8", size = 95272 }, + { url = "https://files.pythonhosted.org/packages/fe/16/e69d4aa244aef45235ddfebc0e04036a6829842bc5a6a795aedc6c998d23/yarl-1.24.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:904065e6e85b1fa54d0d87438bd58c14c0bad97aad654ad1077fd9d87e8478ed", size = 101497 }, + { url = "https://files.pythonhosted.org/packages/15/94/c07107715d621076863ee88b3ddf183fa5e9d4aba5769623c9979828410a/yarl-1.24.2-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:8cec2a38d70edc10e0e856ceda886af5327a017ccbde8e1de1bd44d300357543", size = 94002 }, + { url = "https://files.pythonhosted.org/packages/a9/35/fc1bbdd895b5e4010b8fdd037f7ed3aa289d3863e08231b30231ca9a0815/yarl-1.24.2-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e7484b9361ed222ee1ca5b4337aa4cbdcc4618ce5aff57d9ef1582fd95893fc0", size = 106524 }, + { url = "https://files.pythonhosted.org/packages/1f/f2/32b66d0a4ba47c296cf86d03e2c67bff58399fe6d6d84d5205c04c66cc6d/yarl-1.24.2-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:84f9670b89f34db07f81e53aee83e0b938a3412329d51c8f922488be7fcc4024", size = 106165 }, + { url = "https://files.pythonhosted.org/packages/95/47/37cb5ff50c5e825d4d38e81bb04d1b7e96bf960f7ab89f9850b162f3f114/yarl-1.24.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:abb2759733d63a28b4956500a5dd57140f26486c92b2caedfb964ab7d9b79dbf", size = 103010 }, + { url = "https://files.pythonhosted.org/packages/6f/d2/4597912315096f7bb359e46e13bf8b60994fcbb2db29b804c0902ef4eff5/yarl-1.24.2-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:081c2bf54efe03774d0311172bc04fedf9ca01e644d4cd8c805688e527209bdc", size = 101128 }, + { url = "https://files.pythonhosted.org/packages/b9/d5/c8e86e120521e646013d02a8e3b8884392e28494be8f392366e50d208efc/yarl-1.24.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:86746bef442aa479107fe28132e1277237f9c24c2f00b0b0cf22b3ee0904f2bb", size = 101382 }, + { url = "https://files.pythonhosted.org/packages/fa/98/70b229236118f89dbeb739b76f10225bbf53b5497725502594c9a01d699a/yarl-1.24.2-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:2d07d21d0bc4b17558e8de0b02fbfdf1e347d3bb3699edd00bb92e7c57925420", size = 95964 }, + { url = "https://files.pythonhosted.org/packages/87/f8/56c386981e3c8648d279fdef2397ffec577e8320fd5649745e34d54faeb7/yarl-1.24.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:4fb1ac3fc5fecd8ae7453ea237e4d22b49befa70266dfe1629924245c21a0c7f", size = 106204 }, + { url = "https://files.pythonhosted.org/packages/1a/1e/765afe97811ca35933e2a7de70ac57b1997ea2e4ee895719ee7a231fb7e5/yarl-1.24.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:4da31a5512ed1729ca8d8aacde3f7faeb8843cde3165d6bcf7f88f74f17bb8aa", size = 101510 }, + { url = "https://files.pythonhosted.org/packages/ee/78/393913f4b9039e1edd09ae8a9bbb9d539be909a8abf6d8a2084585bed4b7/yarl-1.24.2-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:533ded4dceb5f1f3da7906244f4e82cf46cfd40d84c69a1faf5ac506aa65ecbe", size = 105584 }, + { url = "https://files.pythonhosted.org/packages/78/87/deb17b7049bbe74ea11a713b86f8f27800cc1c8648b0b797243ebb4830ba/yarl-1.24.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:7b3a85525f6e7eeabcfdd372862b21ee1915db1b498a04e8bf0e389b607ff0bd", size = 103410 }, + { url = "https://files.pythonhosted.org/packages/8f/be/f9f7594e23b5b93affff0318e4593c1920331bcaefda326cabcad94296a1/yarl-1.24.2-cp314-cp314t-win_amd64.whl", hash = "sha256:a7624b1ca46ca5d7b864ef0d2f8efe3091454085ee1855b4e992314529972215", size = 102980 }, + { url = "https://files.pythonhosted.org/packages/65/a4/ba80dccd3593ff1f01051a818694d07b58cb8232677ee9a22a5a1f93a9fc/yarl-1.24.2-cp314-cp314t-win_arm64.whl", hash = "sha256:e434a45ce2e7a947f951fc5a8944c8cc080b7e59f9c50ae80fd39107cf88126d", size = 91219 }, + { url = "https://files.pythonhosted.org/packages/fd/4d/4b880086bd0d3e034d25647be1d830afc3e3f610e98c4ab3490af6b1b6d5/yarl-1.24.2-py3-none-any.whl", hash = "sha256:2783d9226db8797636cd6896e4de81feed252d1db72265686c9558d97a4d94b9", size = 53576 }, +] + +[[package]] +name = "zipp" +version = "4.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b9/d8/eab98a517c14134c0b2eb4e2387bc5f457334293ec5d2dd3857ec2966802/zipp-4.1.0.tar.gz", hash = "sha256:4cb57381f544315db7688e976e922a2b18cdb513d21cc194eb42232ba2a3e602", size = 26214 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3a/13/547360d81e6d88d58492968ffda9f9542854f11310ee556fef14260cc886/zipp-4.1.0-py3-none-any.whl", hash = "sha256:25ad4e16390cd314347dd8f1de67a2ac538ae658ed4ab9db16029c07c188e97f", size = 10238 }, +] + [[package]] name = "zstandard" version = "0.25.0"