diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..ad6ef9d
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,21 @@
+root = true
+
+[*]
+charset = utf-8
+end_of_line = lf
+insert_final_newline = true
+trim_trailing_whitespace = true
+indent_style = space
+indent_size = 4
+
+[*.py]
+max_line_length = 100
+
+[*.{yml,yaml}]
+indent_size = 2
+
+[Makefile]
+indent_style = tab
+
+[*.md]
+trim_trailing_whitespace = false
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000..39b76c1
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,26 @@
+name: CI
+
+on:
+ push:
+ branches: [main]
+ pull_request:
+
+jobs:
+ check:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Install uv
+ uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
+ with:
+ enable-cache: true
+
+ - name: Set up Python
+ run: uv python install
+
+ - name: Install dependencies
+ run: make install
+
+ - name: Run checks
+ run: make check
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..50e24bc
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,236 @@
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[codz]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+share/python-wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# PyInstaller
+# Usually these files are written by a python script from a template
+# before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.nox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+*.py.cover
+.hypothesis/
+.pytest_cache/
+cover/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+db.sqlite3-journal
+staticfiles/
+media/
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+.pybuilder/
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# IPython
+profile_default/
+ipython_config.py
+
+# pyenv
+# For a library or package, you might want to ignore these files since the code is
+# intended to run in multiple environments; otherwise, check them in:
+# .python-version
+
+# pipenv
+# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
+# However, in case of collaboration, if having platform-specific dependencies or dependencies
+# having no cross-platform support, pipenv may install dependencies that don't work, or not
+# install all needed dependencies.
+#Pipfile.lock
+
+# UV
+# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
+# This is especially recommended for binary packages to ensure reproducibility, and is more
+# commonly ignored for libraries.
+#uv.lock
+
+# poetry
+# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
+# This is especially recommended for binary packages to ensure reproducibility, and is more
+# commonly ignored for libraries.
+# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
+#poetry.lock
+#poetry.toml
+
+# pdm
+# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
+# pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python.
+# https://pdm-project.org/en/latest/usage/project/#working-with-version-control
+#pdm.lock
+#pdm.toml
+.pdm-python
+.pdm-build/
+
+# pixi
+# Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control.
+#pixi.lock
+# Pixi creates a virtual environment in the .pixi directory, just like venv module creates one
+# in the .venv directory. It is recommended not to include this directory in version control.
+.pixi
+
+# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
+__pypackages__/
+
+# Celery stuff
+celerybeat-schedule
+celerybeat.pid
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.envrc
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+.dmypy.json
+dmypy.json
+
+# Pyre type checker
+.pyre/
+
+# pytype static type analyzer
+.pytype/
+
+# Cython debug symbols
+cython_debug/
+
+# PyCharm
+# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
+# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
+# and can be added to the global gitignore or merged into this file. For a more nuclear
+# option (not recommended) you can uncomment the following to ignore the entire idea folder.
+#.idea/
+
+# Abstra
+# Abstra is an AI-powered process automation framework.
+# Ignore directories containing user credentials, local state, and settings.
+# Learn more at https://abstra.io/docs
+.abstra/
+
+# Visual Studio Code
+# Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
+# that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
+# and can be added to the global gitignore or merged into this file. However, if you prefer,
+# you could uncomment the following to ignore the entire vscode folder
+# .vscode/
+
+# Ruff stuff:
+.ruff_cache/
+
+# PyPI configuration file
+.pypirc
+
+# Cursor
+# Cursor is an AI-powered code editor. `.cursorignore` specifies files/directories to
+# exclude from AI features like autocomplete and code analysis. Recommended for sensitive data
+# refer to https://docs.cursor.com/context/ignore-files
+.cursorignore
+.cursorindexingignore
+
+# Marimo
+marimo/_static/
+marimo/_lsp/
+__marimo__/
+
+# Project-specific
+# Validation output files
+validation_output.txt
+
+# Environment files (contain secrets)
+.env
+.env.*
+!.env.example
+
+# SSH keys (should never be committed)
+*.pem
+*.key
+*_key
+deploy_key*
+
+# macOS
+.DS_Store
+.AppleDouble
+.LSOverride
+
+# Container volumes
+volumes/
+
+.claude
+
+data/
diff --git a/.python-version b/.python-version
new file mode 100644
index 0000000..e4fba21
--- /dev/null
+++ b/.python-version
@@ -0,0 +1 @@
+3.12
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..5dc1869
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "{}"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright 2026 Common Crawl Foundation and contributors
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..40af2c3
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,25 @@
+.PHONY: install sync test lint format format-check check clean
+
+install:
+ uv sync
+
+sync:
+ uv sync
+
+test:
+ uv run pytest
+
+lint:
+ uv run ruff check src tests
+
+format:
+ uv run ruff format src tests
+
+format-check:
+ uv run ruff format --check src tests
+
+check: lint format-check test
+
+clean:
+ rm -rf .pytest_cache .ruff_cache build dist *.egg-info src/*.egg-info
+ find . -type d -name __pycache__ -prune -exec rm -rf {} +
diff --git a/README.md b/README.md
index 288a72b..9d83065 100644
--- a/README.md
+++ b/README.md
@@ -8,4 +8,158 @@ mostly steered using search-engine-style ranking.
This project is currently in a pilot phase.
+## Install
+```bash
+uv sync
+```
+
+The base install supports `ccoa classify-warc`. The Jupyter notebooks in `notebooks` folder
+need an extra:
+
+```bash
+uv sync --extra notebooks
+```
+
+## CLI
+
+```bash
+uv run ccoa --help
+```
+
+### Classify WARC
+
+`ccoa classify-warc` streams WARC files from S3 (or any fsspec URL),
+extracts plain text from each response record with trafilatura, and
+applies a HuggingFace-hosted fasttext classifier. Per-record output is a
+CSV `URL,prediction_score,warc_filename,warc_record_index`; a one-shot score-distribution summary is
+logged at the end and written to a `.summary.csv` file.
+
+```bash
+uv run ccoa classify-warc \
+ --warc-paths 's3://commoncrawl/crawl-data/CC-MAIN-2025-51/segments/1764871645602.73/warc/*.warc.gz' \
+ --shuffle-files --seed 42 --files-limit 8 \
+ --records-per-file-limit 50 \
+ --skip-homepages \
+ --workers 4 \
+ --output data/classified.csv
+```
+
+When a `--warc-paths` value contains glob characters (`*`, `?`, `[`) it
+is expanded via fsspec; matches are de-duplicated and sorted, then
+optionally shuffled with `--seed` and truncated to `--files-limit`.
+Quote the glob pattern in the shell to prevent local expansion.
+`--records-limit` caps the total response records across all selected
+files; `--records-per-file-limit` caps the records taken from each
+individual file. Both default to `0` (unlimited).
+`--skip-homepages` drops site-root URLs (empty/root path, no query, no
+fragment) before extraction — useful when the classifier is meant to
+score actual content pages, not link hubs.
+`--workers N` (default `1`) processes that many WARC files concurrently;
+CSV row order stays deterministic regardless of worker count. Combining
+`--workers > 1` with `--records-limit` is rejected (the global cap
+can't be enforced deterministically across parallel files); use
+`--records-per-file-limit` instead.
+
+`--workers-mode` picks the parallelism strategy when `--workers > 1`:
+`thread` (default) shares one loaded model behind a lock — cheap, but
+calls trafilatura/lxml concurrently and has been observed to hit glibc
+heap-corruption aborts (`corrupted size vs. prev_size`) on adversarial
+HTML. `process` loads a separate model per worker process (~4 GB extra
+RAM each) and fully isolates lxml + fasttext C state — pick this if
+thread mode crashes mid-run.
+
+When `--output` is a file path (not `-`) the command also writes a
+sidecar **summary** to `.summary.` (e.g. `foo.csv` →
+`foo.summary.csv`). It is a two-column `key,value` CSV containing the
+exact CLI args, resolved input count, record counters, score stats
+(min/max/mean/median/percentiles), wall-clock + per-step timings, and
+start/finish timestamps — enough to reproduce the run. To avoid
+clobbering past results, the command fails fast with a non-zero exit
+if either the output **or** the summary file already exists.
+
+The Common Crawl bucket no longer permits anonymous reads. The command
+uses the default AWS credential chain (env / `~/.aws/credentials` /
+instance profile) — any valid IAM identity works; the bucket owner pays
+for requests (it is *not* Requester Pays). Alternatively, use the public
+HTTPS gateway URL
+(`https://data.commoncrawl.org/...`) with no credentials.
+
+The default classifier is
+[`ibm-granite/GneissWeb.Sci_classifier`](https://huggingface.co/ibm-granite/GneissWeb.Sci_classifier)
+(`__label__science`). The first run downloads the ~4 GB model into the
+HuggingFace cache. Override with `--model-repo`, `--model-file`, and
+`--target-label`.
+
+`--output` accepts `-` for stdout, any local path, or any fsspec URL —
+including `s3://bucket/key.csv`. S3 outputs use the same `--anonymous-s3`
+/ `--s3-requester-pays` options as inputs.
+
+### Text extraction cache
+
+Trafilatura is by far the most expensive step in the pipeline. When the
+same WARCs are reprocessed (different model, different label, parameter
+sweeps, retries), pass `--cache-dir` to skip re-extraction:
+
+```bash
+uv run ccoa classify-warc \
+ --warc-paths s3://commoncrawl/crawl-data/CC-MAIN-2025-51/segments/.../foo.warc.gz \
+ --limit 100 \
+ --cache-dir s3://my-bucket/ccoa-cache/ \
+ --output data/classified.csv
+```
+
+One gzipped JSONL file is written per input WARC, keyed by the 0-based
+ordinal of the response record. Empty extractions are cached too
+(negative caching — avoids re-running trafilatura on junk HTML).
+`--cache-dir` may be a local path or any fsspec URI; S3 cache dirs honor
+the same `--anonymous-s3` / `--s3-requester-pays` flags as inputs and
+outputs. Input URIs are mirrored under the cache dir by scheme — e.g.
+`s3://commoncrawl/.../foo.warc.gz` becomes
+`/s3/commoncrawl/.../foo.warc.gz.jsonl.gz`, so a single cache
+dir can safely hold caches for many sources.
+
+### Resuming an interrupted run
+
+If a run crashes or is killed partway through, pass the partial output to
+`--resume-from-output` on the next invocation to skip records already
+classified:
+
+```bash
+uv run ccoa classify-warc \
+ --warc-paths 's3://commoncrawl/crawl-data/CC-MAIN-2025-51/segments/.../*.warc.gz' \
+ --records-per-file-limit 1000 \
+ --resume-from-output data/classified.csv \
+ --output data/classified__resume-2.csv
+```
+
+The resume CSV must include the `warc_filename` and `warc_record_index`
+columns (the current output schema always does). Records matching that
+`(warc_filename, record_index)` pair are skipped on the new run; the
+new `--output` contains only the missing rows. Concatenate the two
+CSVs (drop the second header) to get a complete result.
+
+With `--records-per-file-limit N` the limit is interpreted as the
+**target total** per file (resumed + new). Files already at the target
+are skipped without opening the input stream; for files below the
+target, only `N − resumed` more records are processed. To process an
+additional `M` records on top of a prior run, set the limit to
+`prior_limit + M`.
+
+`--resume-from-output` is also useful with `--workers-mode process`:
+when a worker dies on adversarial HTML the pool drops the suspect file
+and continues; a follow-up resume run will retry the dropped files.
+
+
+## Development
+
+```bash
+make test # pytest
+make lint # ruff check
+make format # ruff format
+make check # lint + format-check + test
+```
+
+## License
+
+Apache 2.0
diff --git a/data/seeds/out_of_scope.csv b/data/seeds/out_of_scope.csv
new file mode 100644
index 0000000..d5778fa
--- /dev/null
+++ b/data/seeds/out_of_scope.csv
@@ -0,0 +1,16 @@
+hostname,reason
+wikipedia.org,dump or API available
+wiktionary.org,dump or API available
+wikidata.org,dump or API available
+wikisource.org,dump or API available
+wikiversity.org,dump or API available
+aclanthology.org,dump or API available
+arxiv.org,dump or API available
+huggingface.co,dump or API available
+pubmed.ncbi.nlm.nih.gov,dump or API available
+pubchem.ncbi.nlm.nih.gov,dump or API available
+sci-hub.se,n/a
+sci-hub.st,n/a
+sci-hub.tw,n/a
+sci-hub.shop,n/a
+drive.google.com,file hosting
\ No newline at end of file
diff --git a/notebooks/README.md b/notebooks/README.md
new file mode 100644
index 0000000..7074918
--- /dev/null
+++ b/notebooks/README.md
@@ -0,0 +1,5 @@
+Install the dependencies for the Jupyter notebooks in this folder:
+
+```bash
+uv sync --extra notebooks
+```
diff --git a/notebooks/compare_classifier_scores.ipynb b/notebooks/compare_classifier_scores.ipynb
new file mode 100644
index 0000000..b3558d2
--- /dev/null
+++ b/notebooks/compare_classifier_scores.ipynb
@@ -0,0 +1,914 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "cell-00-title",
+ "metadata": {},
+ "source": [
+ "# Classifier Score Comparison: Baseline vs Focus Crawl\n",
+ "\n",
+ "This notebook compares `ccoa classify-warc` output for two Common Crawl runs:\n",
+ "\n",
+ "- **CC-MAIN-2024-18** — the baseline crawl\n",
+ "- **CC-SUPPLEMENTAL-2026-22** — the focus crawl (done for Open Athena project)\n",
+ "\n",
+ "The classifier is `ibm-granite/GneissWeb.Sci_classifier` (`__label__science`); higher scores mean the page is more likely to be science content.\n",
+ "\n",
+ "## Research question\n",
+ "\n",
+ "> **Are the classifier scores statistically significantly different in the focus crawl compared to the baseline?**\n",
+ "\n",
+ "We answer it with distribution visualisations, summary statistics, a mix of non-parametric and parametric significance tests, and effect-size measures. The plain p-value alone is not enough — with samples in the millions, statistical significance is almost guaranteed even for tiny differences, so we lean on effect sizes for the substantive answer.\n",
+ "\n",
+ "## Setup\n",
+ "\n",
+ "If you are running this for the first time, install the extra dependencies the notebook needs:\n",
+ "\n",
+ "```bash\n",
+ "uv pip install -e .[notebooks]\n",
+ "```\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "cell-01-imports",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-05-26T10:15:21.594052Z",
+ "iopub.status.busy": "2026-05-26T10:15:21.593943Z",
+ "iopub.status.idle": "2026-05-26T10:15:41.227039Z",
+ "shell.execute_reply": "2026-05-26T10:15:41.226661Z"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Baseline CSV: ../data/gneissweb-science-top-10k/CC-MAIN-2024-18_1m_scores.csv (exists=True)\n",
+ "Focus CSVs: 2 file(s)\n",
+ " - CC-SUPPLEMENTAL-2026-22_1m_scores.csv\n",
+ " - CC-SUPPLEMENTAL-2026-22_1m_scores__resume-2.csv\n"
+ ]
+ }
+ ],
+ "source": [
+ "from __future__ import annotations\n",
+ "\n",
+ "from pathlib import Path\n",
+ "\n",
+ "import matplotlib.pyplot as plt\n",
+ "import numpy as np\n",
+ "import pandas as pd\n",
+ "from scipy import stats\n",
+ "\n",
+ "# Resolve a data/ path that works whether you launched Jupyter from the repo\n",
+ "# root or from inside notebooks/.\n",
+ "DATA_DIR = Path(\"data\") if Path(\"data\").exists() else Path(\"..\") / \"data\"\n",
+ "SCORES_DIR = DATA_DIR / \"gneissweb-science-top-10k\"\n",
+ "\n",
+ "BASELINE_NAME = \"CC-MAIN-2024-18\"\n",
+ "FOCUS_NAME = \"CC-SUPPLEMENTAL-2026-22\"\n",
+ "\n",
+ "BASELINE_CSV = SCORES_DIR / f\"{BASELINE_NAME}_1m_scores.csv\"\n",
+ "\n",
+ "# The focus run can be split across multiple files when --resume-from-output\n",
+ "# was used to recover from a crash; e.g.\n",
+ "# CC-SUPPLEMENTAL-2026-22_1m_scores.csv (first run)\n",
+ "# CC-SUPPLEMENTAL-2026-22_1m_scores__resume-2.csv (resume part)\n",
+ "# We discover all matching parts and concatenate them. `.summary.csv` sidecars\n",
+ "# are filtered out.\n",
+ "FOCUS_CSVS = sorted(\n",
+ " p\n",
+ " for p in SCORES_DIR.glob(f\"{FOCUS_NAME}_1m_scores*.csv\")\n",
+ " if not p.name.endswith(\".summary.csv\")\n",
+ ")\n",
+ "\n",
+ "print(f\"Baseline CSV: {BASELINE_CSV} (exists={BASELINE_CSV.exists()})\")\n",
+ "print(f\"Focus CSVs: {len(FOCUS_CSVS)} file(s)\")\n",
+ "for p in FOCUS_CSVS:\n",
+ " print(f\" - {p.name}\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "cell-02-load-md",
+ "metadata": {},
+ "source": [
+ "## 1. Load the score data\n",
+ "\n",
+ "The output CSV schema is `URL,prediction_score,warc_filename,warc_record_index`; we only need `prediction_score` for distribution analysis.\n",
+ "\n",
+ "The focus crawl can be split across **multiple parts** when `--resume-from-output` was used to recover from a crash (e.g. `…_1m_scores.csv` for the first run plus `…_1m_scores__resume-2.csv` for the continuation). We auto-discover all parts matching `{focus name}_1m_scores*.csv` (filtering out the `.summary.csv` sidecars) and concatenate them into a single distribution.\n",
+ "\n",
+ "If the combined focus dataset still has noticeably fewer records than the baseline (≥ 5 % gap) we flag the comparison as **intermediate** — the numbers will firm up once the missing files are produced.\n",
+ "\n",
+ "When no focus CSV matches at all we fall back to **toy data**: a perturbed copy of the baseline (small upward shift + Gaussian noise, clipped to `[0, 1]`). The toy path lets you run the notebook end-to-end before any real focus output is ready."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "cell-03-load",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-05-26T10:15:41.228341Z",
+ "iopub.status.busy": "2026-05-26T10:15:41.228232Z",
+ "iopub.status.idle": "2026-05-26T10:15:41.973842Z",
+ "shell.execute_reply": "2026-05-26T10:15:41.973414Z"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "CC-MAIN-2024-18: 1,000,000 scores loaded\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "CC-SUPPLEMENTAL-2026-22: 999,774 scores loaded from 2 file(s) (100% of baseline size). Parts → CC-SUPPLEMENTAL-2026-22_1m_scores.csv: 654,774, CC-SUPPLEMENTAL-2026-22_1m_scores__resume-2.csv: 345,000\n"
+ ]
+ }
+ ],
+ "source": [
+ "def load_scores(csv_path: Path) -> pd.Series:\n",
+ " \"\"\"Read the prediction_score column from a classify-warc output CSV.\"\"\"\n",
+ " series = pd.read_csv(csv_path, usecols=[\"prediction_score\"])[\"prediction_score\"]\n",
+ " return series.astype(float)\n",
+ "\n",
+ "\n",
+ "baseline_scores = load_scores(BASELINE_CSV)\n",
+ "print(f\"{BASELINE_NAME}: {len(baseline_scores):,} scores loaded\")\n",
+ "\n",
+ "if FOCUS_CSVS:\n",
+ " parts = [load_scores(p) for p in FOCUS_CSVS]\n",
+ " focus_scores = pd.concat(parts, ignore_index=True)\n",
+ " is_toy = False\n",
+ " ratio = len(focus_scores) / max(len(baseline_scores), 1)\n",
+ " is_partial = ratio < 0.95\n",
+ " per_part = \", \".join(f\"{p.name}: {len(s):,}\" for p, s in zip(FOCUS_CSVS, parts))\n",
+ " print(\n",
+ " f\"{FOCUS_NAME}: {len(focus_scores):,} scores loaded from {len(FOCUS_CSVS)} \"\n",
+ " f\"file(s) ({ratio:.0%} of baseline size). Parts → {per_part}\"\n",
+ " )\n",
+ " if is_partial:\n",
+ " print(\n",
+ " \"NOTE: focus crawl has noticeably fewer records than baseline; treat the \"\n",
+ " \"comparison as INTERMEDIATE — numbers may shift as the run completes.\"\n",
+ " )\n",
+ "else:\n",
+ " rng = np.random.default_rng(42)\n",
+ " noisy = baseline_scores.to_numpy() + 0.05 + rng.normal(0.0, 0.10, size=len(baseline_scores))\n",
+ " focus_scores = pd.Series(np.clip(noisy, 0.0, 1.0), name=\"prediction_score\")\n",
+ " is_toy = True\n",
+ " is_partial = False\n",
+ " print(\n",
+ " f\"{FOCUS_NAME}: TOY DATA — no files matching \"\n",
+ " f\"{FOCUS_NAME}_1m_scores*.csv (excluding summaries); using \"\n",
+ " f\"baseline shifted by +0.05 with N(0, 0.10) noise, clipped to [0, 1].\"\n",
+ " )\n",
+ " print(f\"{FOCUS_NAME}: {len(focus_scores):,} synthetic scores generated.\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "cell-04-stats-md",
+ "metadata": {},
+ "source": [
+ "## 2. Summary statistics\n",
+ "\n",
+ "Numeric overview of both distributions. We focus on:\n",
+ "\n",
+ "- **Central tendency**: mean and median (mean is sensitive to the long tail; median tracks the bulk).\n",
+ "- **Spread**: standard deviation, quartiles, selected percentiles.\n",
+ "- **Shape**: skewness — baseline classifier scores are typically heavily right-skewed (most pages get very low scores and only a small high-confidence tail is real science). A focus crawl should shift the bulk to the right and reduce this skew."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "cell-05-stats",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-05-26T10:15:41.974946Z",
+ "iopub.status.busy": "2026-05-26T10:15:41.974894Z",
+ "iopub.status.idle": "2026-05-26T10:15:42.081238Z",
+ "shell.execute_reply": "2026-05-26T10:15:42.080957Z"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " CC-MAIN-2024-18 \n",
+ " CC-SUPPLEMENTAL-2026-22 \n",
+ " delta (focus - baseline) \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " n \n",
+ " 1000000.000000 \n",
+ " 999774.000000 \n",
+ " -226.000000 \n",
+ " \n",
+ " \n",
+ " mean \n",
+ " 0.142090 \n",
+ " 0.545134 \n",
+ " 0.403044 \n",
+ " \n",
+ " \n",
+ " median \n",
+ " 0.006990 \n",
+ " 0.673718 \n",
+ " 0.666728 \n",
+ " \n",
+ " \n",
+ " std \n",
+ " 0.244609 \n",
+ " 0.435283 \n",
+ " 0.190674 \n",
+ " \n",
+ " \n",
+ " min \n",
+ " 0.000010 \n",
+ " 0.000010 \n",
+ " 0.000000 \n",
+ " \n",
+ " \n",
+ " p10 \n",
+ " 0.000010 \n",
+ " 0.000134 \n",
+ " 0.000124 \n",
+ " \n",
+ " \n",
+ " p25 \n",
+ " 0.000052 \n",
+ " 0.021937 \n",
+ " 0.021885 \n",
+ " \n",
+ " \n",
+ " p75 \n",
+ " 0.179258 \n",
+ " 0.997321 \n",
+ " 0.818064 \n",
+ " \n",
+ " \n",
+ " p90 \n",
+ " 0.544043 \n",
+ " 1.000007 \n",
+ " 0.455964 \n",
+ " \n",
+ " \n",
+ " p95 \n",
+ " 0.731946 \n",
+ " 1.000010 \n",
+ " 0.268064 \n",
+ " \n",
+ " \n",
+ " p99 \n",
+ " 0.988988 \n",
+ " 1.000010 \n",
+ " 0.011022 \n",
+ " \n",
+ " \n",
+ " max \n",
+ " 1.000010 \n",
+ " 1.000010 \n",
+ " 0.000000 \n",
+ " \n",
+ " \n",
+ " skew \n",
+ " 1.888248 \n",
+ " -0.178762 \n",
+ " -2.067011 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " CC-MAIN-2024-18 CC-SUPPLEMENTAL-2026-22 delta (focus - baseline)\n",
+ "n 1000000.000000 999774.000000 -226.000000\n",
+ "mean 0.142090 0.545134 0.403044\n",
+ "median 0.006990 0.673718 0.666728\n",
+ "std 0.244609 0.435283 0.190674\n",
+ "min 0.000010 0.000010 0.000000\n",
+ "p10 0.000010 0.000134 0.000124\n",
+ "p25 0.000052 0.021937 0.021885\n",
+ "p75 0.179258 0.997321 0.818064\n",
+ "p90 0.544043 1.000007 0.455964\n",
+ "p95 0.731946 1.000010 0.268064\n",
+ "p99 0.988988 1.000010 0.011022\n",
+ "max 1.000010 1.000010 0.000000\n",
+ "skew 1.888248 -0.178762 -2.067011"
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "def describe(series: pd.Series, name: str) -> pd.Series:\n",
+ " \"\"\"Return a multi-stat summary for `series`, labelled with `name`.\"\"\"\n",
+ " return pd.Series(\n",
+ " {\n",
+ " \"n\": len(series),\n",
+ " \"mean\": series.mean(),\n",
+ " \"median\": series.median(),\n",
+ " \"std\": series.std(),\n",
+ " \"min\": series.min(),\n",
+ " \"p10\": series.quantile(0.10),\n",
+ " \"p25\": series.quantile(0.25),\n",
+ " \"p75\": series.quantile(0.75),\n",
+ " \"p90\": series.quantile(0.90),\n",
+ " \"p95\": series.quantile(0.95),\n",
+ " \"p99\": series.quantile(0.99),\n",
+ " \"max\": series.max(),\n",
+ " \"skew\": series.skew(),\n",
+ " },\n",
+ " name=name,\n",
+ " )\n",
+ "\n",
+ "\n",
+ "summary = pd.concat(\n",
+ " [describe(baseline_scores, BASELINE_NAME), describe(focus_scores, FOCUS_NAME)], axis=1\n",
+ ")\n",
+ "summary[\"delta (focus - baseline)\"] = summary[FOCUS_NAME] - summary[BASELINE_NAME]\n",
+ "summary.round(6)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "cell-06-hist-md",
+ "metadata": {},
+ "source": [
+ "## 3. Distribution shape\n",
+ "\n",
+ "### 3a. Overlaid histograms (density-normalised)\n",
+ "\n",
+ "We plot **density** instead of raw counts so the two distributions are visually comparable even when the focus crawl has fewer total records than the baseline. Linear y-axis to see the bulk of the distribution; log y-axis to read the long tail of high-confidence scores."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "cell-07-hist",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-05-26T10:15:42.082323Z",
+ "iopub.status.busy": "2026-05-26T10:15:42.082276Z",
+ "iopub.status.idle": "2026-05-26T10:15:42.642052Z",
+ "shell.execute_reply": "2026-05-26T10:15:42.641716Z"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAABW0AAAHqCAYAAAB/bWzAAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjksIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvJkbTWQAAAAlwSFlzAAAPYQAAD2EBqD+naQAAdERJREFUeJzt3QecXFXZOP6TQhJKCgRCiCT03gKhI1IEI/jSUQRfCIjEElCKUpQiRYOAgGIEQaqvdAEVNJQYCEiAUEUCQQRESkIzJAGSkGT+n+f4n/3NbnaT3c2WO7vf7+dzszt37sycuedu5rnPnPucLqVSqZQAAAAAACiEru3dAAAAAAAA/h9JWwAAAACAApG0BQAAAAAoEElbAAAAAIACkbQFAAAAACgQSVsAAAAAgAKRtAUAAAAAKBBJWwAAAACAApG0BQAAAAAoEElbaAWrr756Ovzww+3bZpo1a1YaMGBA+u1vf1uz7oc//GHq0qWL/VzFx+POO++cF5qnKH8D11xzTW7Hq6++WrNu2223TSeeeGKbtgOA6lGUWKSjx8YdTRwzcey0t86wr1vT/fffn/df/GzPvo3YNdoRsWzZySefnLbZZps2bQc0haQtNDJB8fjjj9d7fyShNt544yXej3/6059yQEBKP/vZz1Lv3r3Tl7/8ZbujA3vzzTfzMf/000+3d1NYQieddFIaM2ZMmjp1qn0J0MGJjdue2Lh4fvzjH6c77rijvZvBEjr22GPTM888k/7whz/YlxSSpC20gilTpqQrrriiyUnbM888s9P3xyeffJID06997WupW7duLb6faT/33HNPXiqTtnHMS9o2X1H+BvbZZ5/Up0+f9Mtf/rK9mwJAAYmN2yY2pnWceuqp6eOPP661TtJ2yUT8Gv8vtLeBAwfmOPaCCy5o76ZAvSRtoRX07NkzLbXUUlW1bz/88MNUBHfeeWd655130pe+9KWq389F2adF0aNHj7x0FEXo36L8DXTt2jUdeOCB6brrrkulUqm9mwNAwRTl86raPuebGhvTOrp375569erVYXZvEY7t+P8g/l8ogvjbeuihh9LLL7/c3k2BhUjaQhvU7YpvyGNE4TrrrJM/8Pv3758+/elPp3vvvTffH9vGpcUhSjGUl8oP1hNOOCENHjw4f7itt956+dvAusmR+Ab429/+dlpxxRVzeYG99947vfHGG/m5KksvlOsyTZ48OR1yyCFp+eWXz+0Jf/vb33J71lxzzdzW+Pbxq1/9anrvvfdqvVb5OV588cX0v//7v6lv375ppZVWSqeddlpu17///e+a0XfxHD/96U8bte/iMqPYf2uttVaT93P5cr2//vWv6fjjj8/tWXbZZdN+++2Xg926/vznP6cdd9wxbxP76wtf+EJ67rnnam3T1P1R3z6tKwKC2Paiiy5a6L6HH34433fDDTekpor9fs4556RVV101LbPMMmmXXXZZ6P2UTZ8+PV8OVD6m1l577fSTn/wkLViwYKG6T3GsXX755blPYtutttoqTZo0qdbzxWXxRxxxRH7t2GaVVVbJ/V9Z97Sypm3UtIrnCfG48jEffXjGGWfkQK6+Phs5cmTq169fmj179mLrZt18883pRz/6UW5T9N1nP/vZ9NJLLy20/S233JKGDRuWll566fy3E8dz/N1UimNgueWWS//85z/TnnvumY+Xr3zlK/m+eK2jjz46P8+GG26Yn2e77bZLzz77bL7/V7/6Vd6/0YZ4/5X7JDz44IPpi1/8YhoyZEjed9Enxx133EIjOlri/5qyF154ISdZV1hhhbzdlltuWe9lYXH87Lrrrvk9xX6M46vyGKm0++67p3/9619GTgOwxJ9XYuPmxcbz5s1LZ599dk3MFo/7/ve/n+bMmVNru/gsj9h10KBBNTFjxLCLqz0csWZsEzFeXRGbxfnA17/+9Wb9BcT7jJJzcTzEz9tvv73e7aLtF198cdpoo43ytiuvvHJ+zf/85z+1tot2/s///E9Oxm299dZ524jn4wvmSo2JnerWtI3f4/zs2muvrYlhY7+NHz8+/15f26+//vp838SJExe5H8pxZXl/RD/Gex07duxC2z711FNpjz32yOdbEadGrPvII4/U2qZ8fvTAAw+kb33rW7k2csR0lWX+4nxnp512ysdCxKy33nprvj8eE/VeIw6M88/77ruv1nNH3BfPGffFNrHvIqatG+vWp76atjfeeGOOySPOjve0ySab5FHmTT2HKW8XrxHHZJw7jBgxIq+rz2677ZZ//v73v19su6GtdW/zV4Qq9cEHH6R33313ofXxQb848UE/evTofFlTBA0zZszINXKffPLJnOiIQCMuFY/g4De/+c1CwVEkXyMIOPLII9PQoUPT3Xffnb73ve/lxFJl4i8+mCJRdeihh+aJgeKDNhKRDYkP1QhQ4vKecgI42hBJxUikRYIykjaRsIufEQTULcJ/0EEHpQ022CCde+656a677spJnUgERaIqkj3xIRqTJnz3u9/NSbrPfOYzi9xXkbTcYost0pI45phjctI0kn8RNERgF8HPTTfdVLNN7Of48B4+fHhu40cffZQuvfTSHKRFAFQOIpq6P+rbp3VFwLjDDjvk/RLJuUqxLgKV+oLhxTn99NPz/o+kYixxfH3uc59Lc+fOrbVdvNcIzOL4iWMvkoWx30855ZT01ltv5f1VN8icOXNm3jbe73nnnZf233//vF/Ko2YOOOCAvE9i38e+e/vtt/O+e+211+qdZCCOmbPOOiu3ORKxkTwP22+/fe6DuC/6K/qtLN5HBJHxWo0Z7RDHZIwAjWMv/n6j3ZFoffTRR2sFstG3cWzG3+i0adNycBiJ/zgOIsirPBGK4yXaF4nsCGwrE6+R9Bw1alS+Hc8VJwoxOVeUDIiANk4mog2R9P/LX/5S89hI9kaffPOb38zB7mOPPZYuueSS9Prrr+f7mmJx/9eE6Kc4/j71qU/lyRfiS4v4f2PfffdNv/vd7/KXHOVEfJzExfsubxfHfgTl9YkgO8S+23zzzZvUbgCqj9i4eLFxfP5HIjG+mI0BHxHzRFzw/PPP10okRswXMclee+2VY5uo6Rk/F/WleIj3Gl9ux2Pff//9/L7K/vjHP+a4I+5vqiifFfFdfPkd7Y3BEeXBAHVFPFqO32KwyiuvvJJ+8Ytf5LgtYpDKEd3xZX3siziHirj/qquuyudLEbNEIrSxsVNdcR5R3j7i2BCJ8jj/imRi9G85niqLdbFNfLG/OJFovu2223L8GOcFP//5z/P+ibg6YsVyPBfxcyQ3I96M9x3HWCRiy8nWSvFcMaAlYu/KkbYRn0bMGnOJxHlMnA/F79HeSI5+4xvfyANSzj///LwvY2BOtCnEII44PmP76Ks474rHRxviS4DKWHlx4rzh4IMPzonn+BsJcdxGn37nO99p0jlMnIPFuVTsx2h//D3G8R/HQH0isRt9E69V99wM2l0JWKSrr746Mm+LXDbaaKNaj1lttdVKI0aMqLm92Wablb7whS8s8nVGjRqVn6uuO+64I68/55xzaq0/8MADS126dCm99NJL+fYTTzyRtzv22GNrbXf44Yfn9WeccUbNuvg91h188MELvd5HH3200Lobbrghbz9hwoSFnmPkyJE16+bNm1daddVVc7vOPffcmvX/+c9/SksvvXStfVKfTz75JD/2hBNOWOi+8ustaj+X+2q33XYrLViwoGb9cccdV+rWrVtp+vTp+fbMmTNL/fr1Kx111FG1nm/q1Kmlvn371lrf1P1R3z6tz69+9au8/fPPP1+zbu7cuaUVV1xxsfupPm+//XapR48e+TirfO/f//738+tUPufZZ59dWnbZZUsvvvhirec4+eST83567bXX8u1XXnklP7Z///6l999/v2a73//+93n9H//4x5r+jdvnn3/+Itu400475aVs0qRJ+XHRb3Vtt912pW222abWuttuuy1vP378+EW+Ttwf222wwQalOXPm1Kz/2c9+ltc/++yzNft7wIABpY033rj08ccf12x355135u1OP/30mnWx/2Jd7KO6Yn3Pnj3z/qrbvwMHDizNmDGjZv0pp5yS11duW98xNnr06Py38K9//atJfwON+b/ms5/9bGmTTTYpzZ49u2ZdHDPbb799aZ111qlZF/+XxOs9+uijtY6z+Bup+x7K4hj85je/ucjXB6C6iY2LGRs//fTT+fbXvva1Wtt997vfzev/8pe/1MS73bt3L+277761tvvhD3+4UMxYnylTpuTtLr300lrr995779Lqq69eKw5trKFDh5ZWWWWVmlg93HPPPfl1ItYpe/DBB/O63/72t7UeP3bs2IXWx+Pq9lHEMRGzVe7PxsRO9cVgEUvXt68i1ovXqHwv8bqxzyvPxxoSrxPxVPkcLzzzzDN5/SWXXFKzLvovtvvnP/9Zs+7NN98s9e7du/SZz3xmob/XT3/60/l4rBRxedx3/fXX16x74YUX8rquXbuWHnnkkZr1d99990Jxe30x7MSJE/N211133UKxeWUMH/uusm+/853vlPr06bNQGys19hymfP583nnn1WwTz7vjjjs2eO7xuc99Lp87QNEojwCNFOUL4hvAusumm2662MfGaL34NvQf//hHk/d3TFAWkw7EN8mV4tvz+FyPS/xD+ZKZ+Ba1Uox8bEh881hX5Si6+LY9RhfHt8YhvnGuK75lLot2xmXW0a74Rrvy/cdlM4urExTf2MdjY5TskohvvCtHPcS30PPnz8+X8ITot7g8Jr7NjfdXXqL98a10jGpu7v6ob582VDspRovGt9hlMYI6nr85IxTicqUYiRr9Xfne4xvyumL0ZuyT2M+V7z8uDYr9NGHChIVGjFT2SXlUbLk/Yx9FrdooS1D30rTmOuyww/LokChHUBb7KkYvxDfsjREjMCpr6NZtd4yiiBHB8TdTOXI3Rqevv/76eXRMXTEatj4xKqByRHF5dEOMiiiPRqhcX/m3UHmMxciH6IsYcRx/CzFqpCkW939N/I3FKN84/mL0dLnvY0RLjLCJx5VLQ8T/PXGsxyiSshihUS4LUZ/yMQVAxyc2LlZsHJ/bIUqE1T1nCOW4Zty4cfkqmqacM1Rad911czxTGcNGO+OcJGKEuiOPFydGSMaktDEKMkY8lsUo1xh5WzeGjW3ivsoYNkbORnmAyhg+xOPL8V85jqm735fkPK2hGDbKUZRLDIS4eiz2eWNj/IjJK8thxPlmjKgttzvi9RidHFdJxRV8ZVGeLEbFxgjTGDFc6aijjqp3IrvYbzFStiz2T+yTGJ1aOVp3cTFsXH0a8WSUK4jH1/e3sSjxmIiD65b0as45TPwtRB3iyrg93vuijnExLEUlaQuNFImL+ECouzQmiIpLvSNJGEFO1OaJ0gZRO6gxItEY9aYqEz8hPkjL95d/xqXga6yxRq3t4oOzIXW3LQddcQlK1IeKD+IIbsrbxWVwdcVlKZUikIoEWNQGrbu+sQm9JZ3IqG6byn1Ufv1yUBaXqMX7q1wiAIpEXnP3R337tKHAJC5Ji9IDZRH8xiXr0a6mKh8HUZqhUrS37jEa7z+S/HXfe7meU+X7b8z+jHpScRlTBOuxn+Iyv7hsLi6vb65IFMfzlk8IYl/HRByVJwNR8zZeo7zMmjWrSe0u77MITuuKpG35/rII/uq7TK++1yqfdESSub71lX8LcalbXKoXlxhG4Bx9UU5M13eMLcn/NXGZYPx9Re3puv0f5UQq+z/ef93jqaH9VRbP3dSTNQCqk9i4WLFx+Vygbuwf5b0i7qw8Zwh1t4s4pLEDJyIxGZeSl58rkmmRtIsSbS0Vw9YXc0QMG/s86rLWjWMiDlxcDBviPVbu9yU5T6tPxJBR9qIyqR2/xxfh5X0e76Eyho3zjaa0O2LgKBVQX0wW54hR3zXKGDTmHCVi27qxWxybjYlhY/6FKLdQri8bx3j0RezPpsaw8SVC9EHU6I02RTmxunV8G3sOE8dUJLAjrq4khqUaqWkLbSCSWDFiMIqbR1Lw17/+da5Fe9lll9X6Nr6t1VebMkbgRW2gCFiifm582MUH/+c///l6JyCq7xvb+tY1JuCMYDGChiUdrbm41y+/j6hHFYFsXZGca+7+aKjeZ0MBbwS58fwRJEZN1AhYIuBuTdHuGKEQ9a/qEwFTU/szRvRGEjomTYgRw5EUjPpgMaqzOfVNIzCN+loR5EYwGKMVYtRC5QiFCIgrE6uRdKyccK+5x2FDIhhtqG8aeq3FtSFGBURfRLB+0kkn5UA/asfGaNdI5DY06Vdz/68pP1/U0YuRtfVZ1Bc9ixNBet2TUgBo6udVe+kIsXFbfHkaIzOj9mfEaTHR2f/93//lEcWLSoq1hNjfkbCtTIhWigReU/d7axyLEePHoI+YnyDi16h9HHV3y+K+qD1cFl/WxxVrTWl3UzV0jtLcGDbEyNWrr746nwdErd5I7MbxF8dHU2PY6NcYcR3nETEQJJZ47tiX5X3V1HOYpoi/MTEsRSRpC20kgq64XDuW+CY4AoRIMJWDgYYCrNVWWy1f+h6XMleOto3Z38v3l3/GB1kU46/8pjpG1jXlwyoumYoZVCNRVtZSlwstTiRL41KgeA+tqXy5UQQH5W9m22N/RLAfwWUEnnHJUXxj3pwRCpXHQbSt8jKp+Ca+bqAf7z+OwUW99+aI541L8GKJdsSJzU9/+tMcyDfnpCKCtJhEICY5iH0Uyd/ypBEh1sU3/GWV77sp+2zKlCkLjW6OdeX7W9Ozzz6bXnzxxRyMxvstW9SlYUvyf015H8VkFYvr/3j/9R3rsW/qE4nmKNFRvgoAAJr7eRXExk2LjcvnAvHZXflZHJOsxpeqlecM5XOEytGXcWl7Y5PD0XdRTipisbgKKkbd1p3Itjkx7OJijtgXcV4UE6o2ZaDEkh6LTY1jI2kZZSpuuOGGHKtG3BVXkZVF0rFyIEJTS8PF+UNM8lVfTBbniDHIoO5I2dYQgyqirEXE+5Xl5OJ4a44oaxaDQGKJYzkGs8TkajEYJAYVNPYcJo6pOIeLbStH2zYUw4b4G9tss82a1W5oTcojQBuIIKhSfHjEB09881oWo+tC3Q+5PffcM4/Gq/x2NsQ3wBEsxCUkoTxqLmaqrxSz0DdW+RvVut/iNjcIa474ljZqjbam2FdRF+rHP/5xvpSrrkh0tsX+iEA86urefPPNeRbcGG3bmBrJ9YngJQLC6O/K9tbX1hgxMnHixPxNdl1x/EXNraaIZHPd2YYjqIovGSqP8boaOubL4tiOb7yj9ELMglu3DlgE7JWlSpqatI0RIZG4j5EUle2Mb/Zjtto4GWlt9R1j8fvPfvazVvm/Jt5vzOgbAXDUkGvo2C//3xMjQx577LFa9zc0uuWJJ57IP6MeLwAsyedVEBs3LTaOz+36Yr8LL7ww/yzHNVGHP2LQSy+9tNZ2dc81FicGGkyePDmPQI54prIualPEZezxRX98gV15SX18gR3PXzeGjfOis88+e6Hnifi1OcnCxhyL9Ynjs6HXi/g14tgYuBBxUwzUqBzFGbV2K2PYqMnbFLG/P/e5z+XRwa+++mqtBH2UXvv0pz+dz3VaW7Sj7nlSnItEHy1pP0TiuXxeVO6Lxp7DxN9C/F55jEebGjovjuMuRluLYSkiI22hDcQHcyRK4gM5vsmNwCu+mTz66KNrtil/WMeEY5FULAc/8U3jLrvskn7wgx/kD+X4BjAu3YkP6bgUpTxqNB4fkx5FoBYfelE3KRJdMYqvsZdKxYd7uR5pJDOjvmq8VmuPfK0UIyujbEG0e0kucVnc+4wP8Qg2t9hii7yf4xvrqC0akzREMjAC17bYHzG68uc//3meOCGSk/WJvqt72VRd0f645D1KEkRZgQhWYhKrSEDWvdQngusoxRDbxSX4cexE4f8Y9RnHZRxnTbk8KPoqTgAikIpjPU4Ebr/99hw4LiqAj2M3aqxF0jQSvBH8xojj8qiPSELH46Mv4u8hEtwtKZ4/9nmMqoj9G88fbY6EaUwqFpf9tbYohxD7IfouRqrGMfe73/2u2SVCGvN/TUwcE8F8fEkQk1JEsjvedwTBcRnfM888UzMKJP4W40QjLuOL/rn88svz6IX6ar3FyVXUYGtOOQwAOhexccvHxnGOEKMe47M6ElgR28QXr5EMjQmr4nwixPwD8bkeoyP33nvv/Dkfn/3lmLGx5RUiCdy/f/9c6isSlPHFcF0Rk8T5yOIu64/4NZ4v4pOoZRployLBFldYVc5ZEO/p61//et4+LqWPxGXEczFKN9oRMdyBBx6YWvpYrE9sH6N+Iyke849E/Fo5cVfE+OW21JdkXlLnnHNOjr1in8WI1Ii/40v5SHDGuUtbiHOJODajLELsx4glY5/EcdFUMao5+j2ufouatlECLY6BSOiXR4439hwmzp/jfO7kk0/O66Jtt912W4N1dqPNcYzG3xoUTglYpKuvvjqijNKkSZPqvX+nnXYqbbTRRrXWrbbaaqURI0bU3D7nnHNKW2+9dalfv36lpZdeurT++uuXfvSjH5Xmzp1bs828efNKxxxzTGmllVYqdenSJb9m2cyZM0vHHXdcadCgQaWlllqqtM4665TOP//80oIFC2q97ocfflgaNWpUaYUVVigtt9xypX333bc0ZcqU/FznnntuzXZnnHFGXvfOO+8s9H5ef/310n777Zfb2rdv39IXv/jF0ptvvpm3j8ct7jnifS+77LKN2k/1mTNnTmnFFVcsnX322bXWl19vUfu5ob4aP358Xh8/664fPnx4fp+9evUqrbXWWqXDDz+89Pjjj7fY/miM2C9du3bNr1VX9H0875e//OXFPs/8+fNLZ555ZmmVVVbJx9nOO+9c+vvf/77Qfio/7ymnnFJae+21Sz169Mj7fPvtty9dcMEFNcflK6+8kl87jrW6Kt//u+++m4+7OK6j72M/bbPNNqWbb755oWMglkq///3vSxtuuGGpe/fu+TmjDys99thjef3nPve5UmOV+/uWW26ptb78fuq+xk033VTafPPNSz179sx/O1/5ylcW6ouGjuvyvoj3X99r1d139bVt8uTJpd122y3/zUY/HHXUUaVnnnlmobY25m+gMf/XhH/+85+lww47rDRw4MD8f8qnPvWp0v/8z/+Ubr311lrb/e1vf8t9Fn8fsU38XV555ZW5HfEeK4+9OO5OPfXUevcRAB2H2Li4sfEnn3ySY8E11lgjf74PHjw4x3uzZ8+utV2cd5x22mk5Doh4Yddddy09//zzpf79+5e+8Y1vNPpY+Na3vpXbcP3119d7/7Bhw/JrNMbvfve70gYbbJDjsYgNb7vttrzvItap6/LLL8/PHW3v3bt3aZNNNimdeOKJuV/K4nFf+MIXFnps3Xi0MbFTffv6hRdeKH3mM5/Jj4n76sba0W/LL798jos//vjjUmPVF1eW30/d13jyySfzuUzEkMsss0xpl112KT388MON/ntt6BhsaN/Vbdt//vOf0hFHHJGPz2hDtCX2S9221ncuVrdvIwaNeH/AgAH53GTIkCGlr3/966W33nqryecw4b333isdeuihpT59+uQ+iN+feuqpes8FDjrooNKnP/3phd4vFEGX+Ke9E8dA64lvoWPkW1yeEzWnqkF8Gx2F5+Nb84aK4Hck0T/xzX7UXqrrT3/6U/42OUZAxMjIzibed3zDft111zW73i+tLyagO+SQQ/KlZXGZIwAUldi4fjE6N2qrxgjOuMKvMeKqpCuvvDJNnTo111itFPNxRHwbVwGOGjUqdTZxeX6MwI1Rn7GPKKY4dmOU9I033mikLYWkpi10IJWTMpVFoBQ1geIy/2oRAWBcChUfnh1dXIIVJw+Vk1BVirIJUSKgMyZswxVXXJFri+2///7t3RQWIcpMxGWEErYAFInYuGn7JUSpgMaI+QxiUEiUZ6ubsA0TJkzIpcWiFFNn/UI75gJoKManGOK4j/MspREoKiNtoQM588wz82RAUbMq6hpFbapYRo4cmWscURx///vfc19FPbF33303vfzyy6lXr17t3azC+OMf/5gnn4jZYiMZWJ5EAwCgscTG9YsJcGOJORDiy/GHHnoo3XDDDblGbH2TPFV6++23cw3QqCEaicknn3wyXxXFfz366KO59n9cORj1VWP/ADSXicigA4kZL6MgfQQJMVI1JgX64Q9/2OhLnGg7EeieddZZab311stBsoRtbcccc0yeHCtOJuKECwCgqcTG9dt0003zAI+YsGrGjBk1k5NFaYTFiS/Vo+RaTDwWk+lK2NYWkx3HCOTYL5EYB1gSRtoCAAAAABSImrYAAAAAAAUiaQsAAAAAUCAdvqbtggUL0ptvvpl69+6dunTp0t7NAQBgEUqlUpo5c2YaNGhQ6trV+ILGEO8CAHS8eLfDJ20jYTt48OD2bgYAAE3w73//O6266qr2WSOIdwEAOl682+GTtjHCtrwj+vTp0yYjHd5555200korGR1SpfRhx6Afq58+rH76sPq1Rx/GTObxhXs5hmPxxLs0h/+jq58+rH76sPrpw45hQRvHvI2Ndzt80rZcEiEStm2VtJ09e3Z+LZf0VSd92DHox+qnD6ufPqx+7dmHylo1fV+Jd2kK/0dXP31Y/fRh9dOHHcOCdop5FxfvKhQGAAAAAFAgkrYAAAAAAAUiaQsAAAAAUCAdvqYtAB3L/Pnz0yeffNLezaCRtaGir6I+lDrv1ak1+nCppZZK3bp1a5HnAoCO+vk7d+7c9m4GjSDe7RgWtHDM21LxrqQtAFWhVCqlqVOnpunTp7d3U2hCn0UANHPmTJNKVanW6sN+/fqlgQMHOi4AoI5I1r7yyiv585fiE+92DKVWiHlbIt6VtAWgKpQTtgMGDEjLLLOMZE+VBD/z5s1L3bt3119VqqX7MJ7vo48+Sm+//Xa+vcoqq7RAKwGgY4jPybfeeiuP0Bs8eLArlaqAeLdjKLVgzNuS8a6kLQBVURKhnLDt379/ezeHRhLEVr/W6MOll146/4xANv6mlUoAgP+Kz9xI9gwaNCgPUqD4xLsdQ6mFY96WindNRAZA4ZVr2ApeoWMo/y2rT71kxowZkzbccMO01VZbtUi/AND+AxVCjx49dAVUuZaIdyVtAagaLVlTE2g//pZbxqhRo9LkyZPTpEmTWugZASgCn5NQ/Vri71jSFgAAAACgQCRtAQAAAAAKxERkAFS1i+59sU1f77jd123W46ZOnZp+9KMfpbvuuiu98cYbuSD90KFD07HHHps++9nP5m2eeuqp9OMf/zhNmDAhffDBB3nW4J133jl973vfS+uuW//r3n///WmXXXZJ/fr1y7MN9+rVq+a+uGR66623rimuX9f666+fXnnllfSvf/0rDRw4sNZ98brRvosvvrjm9gMPPJBuuOGG9OUvf7lmu7g/lldffbXB937FFVek3/zmN+nvf/97vj1s2LD8PsttK7fvjDPOyNvGpHM77LBDuvTSS9M666yT74/nP/vss9Nf/vKXvC9jgo7//d//TT/4wQ/qrfv20ksvpc033zwX/Y/nW5TY3+eff3564okn8j68/fbb07777ltrm1mzZqWTTz453XHHHem9995La6yxRvr2t7+dvvGNbyzyuQEAlpR4V7wr3u2cjLQFgFYWCcdIVEbCMZKDzz77bBo7dmxOtkZNynDnnXembbfdNs2ZMyf99re/Tc8//3z6v//7v9S3b9902mmnLfY1evfunZONla688so0ZMiQerd/6KGH0scff5wOPPDAdO211zbqfURC+NRTT21yMf1I9h588MFp/PjxaeLEiTkZ/bnPfS4nr8vOO++89POf/zxddtll6dFHH03LLrtsGj58eJo9e3a+/4UXXkgLFixIv/rVr9Jzzz2XLrroorzt97///YVeL9oXr7fjjjs2qn0ffvhh2myzzfKkTg05/vjjc59Fn0TfRLL96KOPTn/4wx+atC8AADoi8a54l5ZnpC0AtLJvfetbuRD9Y489lpORZRtttFH66le/mj766KN0xBFHpD333LNW4jVGc26zzTaLHSkaRowYka666qqcrAyRkL3xxhvzaNAYoVpXJHQPOeSQtNNOO6XvfOc76aSTTlrsa8RzR5IyRsPGe2qsSHRWFuL/9a9/nX73u9+lcePGpcMOOyyPso3RupEQ3mefffI21113XVp55ZXzyNYY2fv5z38+L2VrrrlmmjJlSh6Ne8EFF9R6vXieGEUcI5gffvjhxbZvjz32yMuixPPEPo4Rx2HkyJE5gRx9uvfeezd6XwAAdETiXfEuLc9IWwBoRe+//34eoRkjaisTtmVR1uDuu+9O7777bjrxxBPrfY7YZnEOPfTQ9OCDD6bXXnst346k6Oqrr5622GKLhbadOXNmuuWWW3J5gd133z2XYojHLk6fPn1yOYKzzjorj05trkhSx2jYFVZYId+OEg1R8mC33Xar2SZGGEfCOkbmNiTaXX6OshjNHO9tUaNmm2P77bfPCesYHRxJ5hg1/OKLL+YRwwAAnZl4d2HiXVqCpC0AtKKorRpJvhj52ZB//OMf+eeitlmcqJEbo0WvueaafDtG3cYo3vrECNyoFRsjfaPma4xkjZG3jR1FEWUSLrzwwma3NUb1Rk3acpI2ErYhRtZWitvl++rbr5dcckn6+te/XrMuas0efvjheR9EgrklxWttuOGGadVVV801xWLUbySGP/OZz7To6wAAVBvx7sLEu7QESVsAaEX1TQDWnG1CJFmXW265vNR3OX8kaSNh+fLLL+cRql/5ylfqfZ5I6MYo27L4PUanxgjcxenZs2ceaRslCWJ0cKUY5VtuXywx2Vhd5557bk4aRxmIyknTmiJGu0bS9Itf/GI66qijatbH71HyoaFEaowmrmxf1A5uStL2kUceyaNtY8Kyn/70p3n09H333des9wDV7vdPvZF+dt8/8uQ49S0AdB7i3drEu7QUNW1bKYj9qNsHKVXU71vSWccBqE4xojXqucZEWg1Zd93/fjbENtttt12D2/3pT3+qmQRs6aWXXuj+SORGrdUjjzwy7bXXXql///4LbTN58uScfIxarJV1bOfPn5+TqZVJ0IZEkjeStuecc04uwVAWo2effvrpmtvLL798rcfFYyKIjUTnpptuWrN+4MCB+ee0adPSKqusUrM+bg8dOrTWc7z55pt5ArcoV3D55ZcvVBohkqrlGrdxAhGTl3Xv3j1vGzV5K9tXd2RvQ6I+cEx4FonmL3zhC3ldtD+eK16rsqwDAEBnI979f8S7tCRJWwBoRVFzdfjw4flS+pgUrG5d25hkLOqirrjiium8886rNRFZ5TZR13a11VZb5GtFcjIm9orn+fOf/1zvNlEGIUai1q35evXVV+f7GpO07dq1axo9enTaf//90ze/+c1ar7/22mvX3I6k6bx58/Lv0aYf/ehHuX7vlltuWev5YsK1SNzGxGTlJO2MGTPSo48+Wuv5Y4RtJGyHDRuW2xvtqBSjiyP5XPb73/8+/eQnP8mTiH3qU5/Kie7K9jVWJMpjqft6UVoiksIAAJ2ZeFe8S+uQtAWAVhYJ0h122CFtvfXWubRAjNKMZOa9996bLr300vT888+nX//61/ly/7333jsndyO5GOUHbr755lx2IEbBNsbZZ5+dvve979U7yjYSj7/5zW9yGzbeeONa933ta1/LdWqfe+65XIZhcWLEaUwU9qtf/WqxI1YjcXrGGWek66+/Po/MLdepLZcpiJHIxx57bB65GyM1Iol72mmn5ZG7++67b03Cduedd86J6xjB8M477yw0UneDDTao9bqPP/54TrTWfa91zZo1K9diK4uJ0WIUbZyADBkyJNfH3WmnnfJ+jcRvtOGBBx5I11133RLV9gUA6CjEu+JdWp6atgDQytZcc8305JNP5lGiJ5xwQk4i7r777nlkaSRtwz777JNHhC611FK5LmtMShaX83/wwQc5mdlYMUlWjNqNRGhdUTogJuvab7/9FrovEp6xNHZCsnIydvbs2Yvd7rLLLktz585NBx54YC5/UF7KZQzCiSeemI455phc3mGrrbbKidSxY8fW1L2NBHckVmOfxWRglc+zpCK5u/nmm+clHH/88fn3008/vWabSJpHu6JOcExIFmUeYuTwN77xjSV+fQCAaifeFe/S8rqUGjv7SZWKyyv79u2bT3pbeibp+sRlklfc/VT6qNtyatpWqejDt99+O8/EXvdSWKqHfuxYfRgJvxj9GCMwmzt5FW2vXB4hyibUl0Sm8/ZhJPsb+ptu69it2kc1xRJlQV588cXCxLvBPA7FJ1aqfvqw4/Xhoj4fKSbxbsdQaoWYtyXiXRkpAACoQqNGjcqTC06aNKm9mwIAQAuTtAUAAAAAKBBJWwAAAACAApG0BQAAAAAoEElbAAAAAIACkbQFAAAAACgQSVsAAAAAgAKRtAUAAAAAKBBJWwAAAACAApG0BQAAAAAoEElbAKrb+NFtuzTT1KlT0zHHHJPWXHPN1LNnzzR48OC01157pXHjxtVs89RTT6UvfvGLaeWVV069evVK66yzTjrqqKPSiy++uMjnvuKKK9Jmm22WlltuudSvX7+0+eabp9Gj/19bDz/88LTvvvsu9Lj7778/denSJU2fPj3fvuaaa/LtWLp27ZpWXXXVdMQRR6S333675jHl+2Pp27dv2mGHHdJf/vKXxb5W2eqrr17rOcrLueeem+9/9dVX8+1u3bqlN954o9Zj33rrrdS9e/d8f2xXuX19yyOPPFLrfX3+85+v9XzxvmN97IfK997QUn7NiRMn5vZ94QtfWOj9ldvz9NNPp8b45JNP0kknnZQ22WSTtOyyy6ZBgwalww47LL355pu1tnv//ffTV77yldSnT5/cx0ceeWSaNWtWrb7cZ5990iqrrJKfZ+jQoem3v/3tQq8X73nUqFF5uzgO11133fSnP/1pke075ZRT0qabbtpg++I9R3vWWGONtPTSS6e11lornXHGGWnu3LmN2gcAwGKId8W74t3UmvFuxONxDhXnU0WKdyVtAaCVxYf8sGHDcnLz/PPPT88++2waO3Zs2mWXXXJAEe6888607bbbpjlz5uTg4/nnn0//93//lxOjp512WoPPfdVVV6Vjjz02ffvb386Jwr/+9a/pxBNPrJXQa4pICkZy9PXXX8/B8Z///Od06KGH1trm6quvztvEa6244orpf/7nf9LLL7/c6Nc466yz8uMrl0hoV/rUpz6Vrrvuulrrrr322ry+Pvfdd99Czxn7vCySvbHN+PHj6338QQcdVOux2223XU6YV66LRHu48sorc3snTJiwUHK1qT766KP05JNP5j6On7fddluaMmVK2nvvvWttFwnb5557Lt177735WInXHjlyZM39Dz/8cE6s/u53v0t/+9vfcrI9gs3YtiyCyt133z0fj7feemt+nejjhvZpuX1xXJ166qkNtu+FF15ICxYsSL/61a9yGy+66KJ02WWXpe9///tLtG8AgOoh3q1NvFtd8e5TTz2VY9cnnniiUPFu91Z9dgAgfetb38qjLx977LH8rXDZRhttlL761a/mQCGCjj333DPd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N9wwbbXVVu3dFAAAWpikLQAAVKFRo0alyZMnp0mTJrV3UwAAaGGStgAAAAAABSJpCwAAAABQIJK2AAAAAAAFImkLAAAAAFAgkrYAAAAAAAUiaQsAAAAAUCCStgAAUIXGjBmTNtxww7TVVlu1d1MAAOhISdtLL700bbrppqlPnz552W677dKf//znmvtnz56dRo0alfr375+WW265dMABB6Rp06a1Z5MBAKAQIk6ePHlymjRpUns3BQCAjpS0XXXVVdO5556bnnjiifT444+nXXfdNe2zzz7pueeey/cfd9xx6Y9//GO65ZZb0gMPPJDefPPNtP/++7dnkwEAAAAAWlX31I722muvWrd/9KMf5dG3jzzySE7oXnnllen666/Pydxw9dVXpw022CDfv+2227ZTqwEAAAAAOkFN2/nz56cbb7wxffjhh7lMQoy+/eSTT9Juu+1Ws83666+fhgwZkiZOnNiubQUAAAAA6JAjbcOzzz6bk7RRvzbq1t5+++15QoWnn3469ejRI/Xr16/W9iuvvHKaOnVqg883Z86cvJTNmDEj/1ywYEFeWlt+jVLpv0tD91No0UelUklfVTn9WP30YfXTh9WvPfpQrAQAAAVI2q633no5QfvBBx+kW2+9NY0YMSLXr22u0aNHpzPPPHOh9e+8805ODLfFiUbP0uyU8rlNl4Xuf/vtt1u9DSx5H8bxGCepXbsWZjA6TaQfq58+rH76sPq1Rx/OnDmzTV4HAACKrN2TtjGadu21186/Dxs2LM9++7Of/SwddNBBae7cuWn69Om1RttOmzYtDRw4sMHnO+WUU9Lxxx9fa6Tt4MGD00orrZT69OnTJic3c7q8mT7qulxKXRZO2g4YMKDV28CS92GXLl3yMSNpW730Y/XTh9VPH1a/9ujDXr16tcnrAABAkbV70rbepOecOTmBu9RSS6Vx48alAw44IN83ZcqU9Nprr+VyCg3p2bNnXuqKE402S8BFsra81NMOii9OUNv0mKFV6Mfqpw+rnz6sfm3dhz57AQCgnZO2MSp2jz32yJOLxaVw119/fbr//vvT3Xffnfr27ZuOPPLIPGp2hRVWyKNkjznmmJyw3XbbbfUdAAAAANAhtWvSNuq7HnbYYemtt97KSdpNN900J2x33333fP9FF12UR1vESNsYfTt8+PD0y1/+sj2bDAAAhTBmzJi8zJ8/v72bAgBAR0raXnnllYutaVYORgEAgP9n1KhReYk5HGIABAAAHYeCnQAAAAAABSJpCwAAAABQIJK2AAAAAAAFImkLAAAAAFAgkrYAAAAAAAUiaQsAAAAAUCCStgAAAAAABSJpCwAAAABQIJK2AAAAAAAFImkLAABVaMyYMWnDDTdMW221VXs3BQCAFiZpCwAAVWjUqFFp8uTJadKkSe3dFAAAWpikLQAAAABAgUjaAgAAAAAUiKQtAAAAAECBSNoCAAAAABSIpC0AAAAAQIFI2gIAAAAAFIikLQAAAABAgUjaAgAAAAAUiKQtAAAAAECBSNoCAAAAABSIpC0AAAAAQIFI2gIAAAAAFEj39m4AAADQdGPGjMnL/PnzC7f7Lrr3xQbvO273ddu0LQAA1chIWwAAqEKjRo1KkydPTpMmTWrvpgAA0MIkbQEAAAAACkTSFgAAAACgQCRtAQAAAAAKRNIWAAAAAKBAJG0BAAAAAApE0hYAAAAAoEAkbQEAAAAACkTSFgAAAACgQCRtAQAAAAAKRNIWAAAAAKDak7bjx49v+ZYAAEALEa8CANDpkraf//zn01prrZXOOeec9O9//7vlWwUAAEtAvAoAQKdL2r7xxhvp6KOPTrfeemtac8010/Dhw9PNN9+c5s6d2/ItBACAJhKvAgDQ6ZK2K664YjruuOPS008/nR599NG07rrrpm9961tp0KBB6dvf/nZ65plnWr6lAADQSOJVAAA69URkW2yxRTrllFPyyNtZs2alq666Kg0bNiztuOOO6bnnnmuZVgIAQDOJVwEA6DRJ208++SSXR9hzzz3Taqutlu6+++70i1/8Ik2bNi299NJLed0Xv/jFlm0tAAA0kngVAIBq1b05DzrmmGPSDTfckEqlUjr00EPTeeedlzbeeOOa+5dddtl0wQUX5HIJAADQ1jpDvDpmzJi8zJ8/v72bAgBQDONHp06dtJ08eXK65JJL0v7775969uzZYB2x8ePHL2n7AACgyTpDvDpq1Ki8zJgxI/Xt27e9mwMAQHuXRzjjjDNy6YO6AfC8efPShAkT8u/du3dPO+20U8u0EgAAmkC8CgBAp0va7rLLLun9999faP0HH3yQ7wMAgPYkXgUAoNMlbaM2WJcuXRZa/9577+X6YAAA0J7EqwAAdJqatlETLETC9vDDD69VHiEmQPjb3/6Wtt9++5ZvJQAANIJ4tRi2fe3yRdx7QRu2BACgEyRtyxMcxMiF3r17p6WXXrrmvh49eqRtt902HXXUUS3fSgAAaATxKgAAnS5pe/XVV+efq6++evrud7+rFAIAAIUiXgUAoNMlbStn4wUAgKISrwIA0CmStltssUUaN25cWn755dPmm29e70RkZU8++WRLtQ8AABpFvAoAQKdL2u6zzz41E4/tu+++rdkmAABoMvEqAACdLmlbeYmZy80AACga8SoAAB1F1+Y86N///nd6/fXXa24/9thj6dhjj02XX355S7YNAACaRbwKAECnm4jskEMOSSNHjkyHHnpomjp1atptt93SxhtvnH7729/m26effnrLtxQAABpJvFpcF937YoP3Hbf7um3aFgCADjXS9u9//3vaeuut8+8333xz2mSTTdLDDz+ck7bXXHNNS7cRAACaRLwKAECnS9p+8sknNZOS3XfffWnvvffOv6+//vrprbfeatkWAgBAE4lXAQDodEnbjTbaKF122WXpwQcfTPfee2/6/Oc/n9e/+eabqX///i3dRgAAaBLxKgAAnS5p+5Of/CT96le/SjvvvHM6+OCD02abbZbX/+EPf6gpmwAAAO1FvAoAQKebiCySte+++26aMWNGWn755WvWx+RkyyyzTEu2DwAAmky8CgBAp0vahm7dutVK2IbVV1+9JdoEAABLTLwKAECnKo8wbdq0dOihh6ZBgwal7t2754C4cgEAgPYkXgUAoNONtD388MPTa6+9lk477bS0yiqrpC5durR8ywAAoJnEqwAAdLqk7UMPPZQefPDBNHTo0JZvEQAALCHxKgAAna48wuDBg1OpVGr51gAAQAsQrwIA0OmSthdffHE6+eST06uvvtryLQIAgCUkXgUAoNOVRzjooIPSRx99lNZaa620zDLLpKWWWqrW/e+//35LtQ8AAJqsM8SrY8aMycv8+fPbuykAABQhaRsjFwAAoKg6Q7w6atSovMyYMSP17du3vZsDAEB7J21HjBjRkm0AAIAWJV4FAKDT1bQN//znP9Opp56aDj744PT222/ndX/+85/Tc88915LtAwCAZhGvAgDQqZK2DzzwQNpkk03So48+mm677bY0a9asvP6ZZ55JZ5xxRku3EQAAmkS8CgBAp0vannzyyemcc85J9957b+rRo0fN+l133TU98sgjLdk+AABoMvEqAACdLmn77LPPpv3222+h9QMGDEjvvvtuS7QLAACaTbwKAECnS9r269cvvfXWWwutf+qpp9KnPvWplmgXAAA0m3gVAIBOl7T98pe/nE466aQ0derU1KVLl7RgwYL017/+NX33u99Nhx12WMu3EgAAmkC8CgBAp0va/vjHP07rr79+Gjx4cJ6EbMMNN0w77rhj2n777dOpp57a8q0EAIAmEK8CAFDNujfnQTH52BVXXJFOP/30XC8sErebb755WmeddVq+hQAA0ETiVQAAOkXS9vjjj1/k/Y888kjN7xdeeOGStQoAAJpIvFr9Lrr3xQbvO273ddu0LQAAVZG0jUnGKj355JNp3rx5ab311su3X3zxxdStW7c0bNiwRr/46NGj02233ZZeeOGFtPTSS+fyCj/5yU9qnjPMnj07nXDCCenGG29Mc+bMScOHD0+//OUv08orr9zo1wEAoONrjXgVAIACGT86dRaNTtqOHz++1kja3r17p2uvvTYtv/zyed1//vOfdMQRR+Tato31wAMPpFGjRqWtttoqB9Tf//730+c+97k0efLktOyyy+ZtjjvuuHTXXXelW265JfXt2zcdffTRaf/9988TnxXVeu/enXrMfT91qffeC9q8PQAAnUFrxKsAAFA1NW1/+tOfpnvuuacmAA7x+znnnJOTrjEytjHGjh1b6/Y111yTBgwYkJ544on0mc98Jn3wwQfpyiuvTNdff33adddd8zZXX3112mCDDXI5hm233bY5zQcAoINrqXiVlrfta5c3eN8jQ0ba5QAAKaWuzdkLM2bMSO+8885C62PdzJkzm71jI0kbVlhhhfwzkreffPJJ2m233Wq2WX/99dOQIUPSxIkTm/06AAB0bK0VrwIAQGFH2u6333750rIYwbD11lvndY8++mj63ve+l0sXNMeCBQvSsccem3bYYYe08cYb53VTp07NM//269ev1rZRzzbuq0/UvY2lMmAvP38srS1eo5RSXhq6n2LLfVgq6asqpx+rnz6sfvqw+rVHH7bUa7VGvAoAAIVO2l522WXpu9/9bjrkkEPySNj8RN27pyOPPDKdf/75zWpI1Lb9+9//nh566KG0JGJyszPPPLPeURUxqVlbnGjM675c/r2+mrZvv/12q7eBJe/DGPUdJ6lduzZrMDoFoB+rnz6sfvqw+rVHH7bUKNjWiFcBAKDQSdtlllkm/fKXv8wB7z//+c+8bq211qqZPKypYnKxO++8M02YMCGtuuqqNesHDhyY5s6dm6ZPn15rtO20adPyffU55ZRT0vHHH19rpO3gwYPTSiutlPr06ZPa4uRmyrxZDU5EFjV7Kbbowy5duuRjRtK2eunH6qcPq58+rH7t0Ye9evVqkedp6XgVAAAKn7Qti6B30003bfbjY9TGMccck26//fZ0//33pzXWWKPW/cOGDUtLLbVUGjduXDrggAPyuilTpqTXXnstbbfddvU+Z8+ePfNSV5xotNXJRpeKpb52UHxxgtqWxwytQz9WP31Y/fRh9WvrPmzp11nSeBUAAKouabukoiTC9ddfn37/+9+n3r1719Sp7du3b1p66aXzz7iELUbOxuRkMVI2kryRsN12223bs+kAAAAAAB0vaXvppZfmnzvvvHOt9VdffXU6/PDD8+8XXXRRHnERI21jgrHhw4fnS90AAAAAADqidk3aRnmExtQ1GzNmTF4AAAAAADo6BTsBAAAAAAqkXUfaAgAANMZF977Y4H3H7b6unQgAdChG2gIAAAAAFIikLQAAAABAgUjaAgAAAAAUiKQtAAAAAECBSNoCAAAAABRI9/ZuAAAAAABANn60HWGkLQAAAABAsRhpCwAAFMK2r13e4H2PDBnZpm0BAGhPkrYAAEBVu+jeFxu877jd123TtgAAtAQTkQEAAAAAFIikLQAAAABAgUjaAgAAAAAUiJq2AADQzu688850wgknpAULFqSTTjopfe1rX2vvJgEAtJ7xo+3dxZC0BQCAdjRv3rx0/PHHp/Hjx6e+ffumYcOGpf322y/1799fvwAAdFKStgAA0I4ee+yxtNFGG6VPfepT+fYee+yR7rnnnnTwwQfrlwrbvnZ5g/vjkSEj7SsAoENR0xYAAJbAhAkT0l577ZUGDRqUunTpku64446FthkzZkxaffXVU69evdI222yTE7Vlb775Zk3CNsTvb7zxhj4BAOjEjLQFAOjsGqopVkopbXhEW7em6nz44Ydps802S1/96lfT/vvvv9D9N910Uy5/cNlll+WE7cUXX5yGDx+epkyZkgYMGNAubQYAoNgkbQEAYAlEOYNYGnLhhRemo446Kh1xxH8T4JG8veuuu9JVV12VTj755DxCt3Jkbfy+9dZbN/h8c+bMyUvZjBkz8s+Y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casWLgBUGXVr29yHH36YNttss/TVr3417b///gvdf9NNN6Xjjz8+XXbZZTlhe/HFF6fhw4enKVOmpAEDBuRthg4dmubNm7fQY++5556cDAYAgEqStp0gqbuohC4AUEASs4Wyxx575KUhF154YTrqqKPSEUcckW9H8vauu+5KV111VTr55JPzuqeffrrF2jNnzpy8lM2YMSP/XLBgQV5aW7xGKaW8UL3Kfagfq5c+rH76sPrpww7Uj6VSm8RRobGvI2nbyTW3fIIRugAAKc2dOzc98cQT6ZRTTqnZHV27dk277bZbmjhxYqvsotGjR6czzzxzofXvvPNOmj17dpucaMzrvlz+vUurvxqteYKqH6ubPqx++rD66cOO04/Tp0/PiduI41rbzJkzG7WdpG0n0NajcJVjAIBGMJq2Q3j33XfT/Pnz08orr1xrfdx+4YUXGv08keR95plncimGVVddNd1yyy1pu+22q3fbSBBHOYbKkbaDBw9OK620UurTp09qi6TtlHmzUo+570vaVrHyCFv9WL30YfXTh9VPH3acfuzXr1+OpdoiaRtzIDSGpG0nt7hauQ256N7mJXsldAHocCRfaQH33Xdfo7ft2bNnXuqKk4y2ONEoj7AtL1Qv/Vj99GH104fVTx92DF26dGmzWKqxryFpS2FG7za3VENzyzg0+HqlUjp4074t3hYAqlgHT8xOfPm9BkcdrLlhmzenqqy44oqpW7duadq0abXWx+2BAwe2W7sAAKhuVZG0HTNmTDr//PPT1KlT88y9l1xySdp6663bu1m08OjdRWnrRPDvn3ojfdTtg/iqJRVBs5LPag8DbZWY3OX/1fJsdx08uUrx9OjRIw0bNiyNGzcu7bvvvjXlA+L20Ucf3d7NAwCgShU+aXvTTTflml0xC+8222yTLr744jR8+PA0ZcqUNGDAgPZuHlWcCG5IjCqa22OFQtX3mnhlw/dt28wyFm1d67jNlUppmfmzCpN8N3kfHToB2VA788wMy6XUfZZrqKlqs2bNSi+99FLN7VdeeSU9/fTTaYUVVkhDhgzJseqIESPSlltumQcWRLwatWmPOOKIdm03AADVq/BJ2wsvvDAdddRRNUFvJG/vuuuudNVVV6WTTz65vZsHHTLZ3ZZJ8s6SfF9U4p1F9+HLBenD9rDdmv2bfDn74h4HNN3jjz+edtlll5rb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WwAAAACAApG0BQAAAAAoEElbgBaw+uqrp4svvrjmdpcuXdIdd9yxRM/ZEs8BAAAtRcwL0Ha6t+FrAXQab731Vlp++eUbte0Pf/jDnJx9+umnm/0cAADQ1sS8AK1H0hbg/zd37tzUo0ePFtkfAwcOLMRzdIZ9DQBA+8RhYt6229dA56M8AtBh7bzzzunoo4/OS9++fdOKK66YTjvttFQqlWou7zr77LPTYYcdlvr06ZNGjhyZ1z/00ENpxx13TEsvvXQaPHhw+va3v50+/PDDmud9++2301577ZXvX2ONNdJvf/vbxZY2eP3119PBBx+cVlhhhbTsssumLbfcMj366KPpmmuuSWeeeWZ65pln8mNiiXX1Pcezzz6bdt111/y6/fv3z+2dNWtWzf2HH3542nfffdMFF1yQVllllbzNqFGj0ieffNKo/fXLX/4yrbPOOqlXr15p5ZVXTgceeGDNfQsWLEjnnXdeWnvttVPPnj3TkCFD0o9+9KMmty0eM2jQoLTeeuvl9f/+97/Tl770pdSvX7+8b/bZZ5/06quvNqq9AACIecW8QEclaQt0aNdee23q3r17euyxx9LPfvazdOGFF6Zf//rXNfdHgnOzzTZLTz31VE7o/vOf/0yf//zn0wEHHJD+9re/pZtuuikncSPxW5mAjGTj+PHj06233pqTnZHIbUgkL3faaaf0xhtvpD/84Q85QXviiSfmROhBBx2UTjjhhLTRRhvly8tiiXV1RdJ4+PDhuVzCpEmT0i233JLuu+++Wu0K0aZ4D/Ez3nskgMtJ4EV5/PHHc3L6rLPOSlOmTEljx45Nn/nMZ2ruP+WUU9K5556b99HkyZPT9ddfnxO7TWnbuHHj8nPfe++96c4778zJ5Hhc796904MPPpj++te/puWWWy7v/xiVAABA44h5xbxAB1QC6KB22mmn0gYbbFBasGBBzbqTTjoprwurrbZaad999631mCOPPLI0cuTIWusefPDBUteuXUsff/xxacqUKTFMt/TYY4/V3P/888/ndRdddFHNurh9++23599/9atflXr37l1677336m3nGWecUdpss80WWl/5HJdffnlp+eWXL82aNavm/rvuuiu3a+rUqfn2iBEj8nuaN29ezTZf/OIXSwcddNBi99Xvfve7Up8+fUozZsxY6L5Y17Nnz9IVV1xR72Mb27aVV165NGfOnJptfvOb35TWW2+9Wv0T9y+99NKlu+++e7FtBgBAzBvEvEBHZKQt0KFtu+22ucxA2XbbbZf+8Y9/pPnz5+fbUaagUoyCjZGpMeKzvMRo0BgV+8orr6Tnn38+j9wdNmxYzWPWX3/9fHl/Q2KCsc033zxf/t9c8boxIjhKK5TtsMMOuV0xerUsRux269at5naUSVjUKOCy3XffPa222mppzTXXTIceemgu+fDRRx/VvPacOXPSZz/72SVq2yabbFKrplfs65deeimPtC3v69hHs2fPzqOFAQBoHDGvmBfoeExEBnRqlYnGcimDr3/967lUQF1Rx/XFF19s8mtEnde2stRSS9W6HQnrSJ4uTiROn3zyyXT//fene+65J51++unphz/8YS530FLtr29fR/K7vprAK620Uou8JgAAYt4yMS9QTYy0BTq0mOyr0iOPPJIn26ocjVppiy22yDVbY8KtukuMEo1RtfPmzUtPPPFEzWNiNOn06dMbbMOmm26aR9u+//779d4fz1se+duQDTbYII9MrZwQLWrAdu3atWZSryUVI4h32223POFY1PONCcH+8pe/5P0ViduoSduSbYt9HaOeBwwYsNC+jonjAABoHDFv44l5gWohaQt0aK+99lo6/vjjc2L1hhtuSJdcckn6zne+0+D2J510Unr44YfzJFqRaI2k4u9///uaSbUiCRkTZcVo3AiOI3n7ta99bZGjUQ8++OA0cODAtO++++Zk5ssvv5x+97vfpYkTJ+b7V1999Vx6IV7v3XffzaUI6vrKV76SevXqlUaMGJH+/ve/54nGjjnmmFzKoDwh2JKIicF+/vOf5zb861//Stddd10eoRvvN1439ktMnhbro3RBJL+vvPLKJWpbPG7FFVdM++yzT56ILPZBjPSNUc6vv/76Er8nAIDOQszbOGJeoJpI2gId2mGHHZY+/vjjtPXWW6dRo0blhO3IkSMXOSr2gQceyGUQdtxxx1yLNkoFDBo0qGabq6++Ot/eaaed0v7775+fL0aLNiRG0kbJgdhmzz33zLVdzz333JrRvgcccEBOBO+yyy65LEAkl+taZpll0t13351H62611VbpwAMPzDVmf/GLX6SWEDV5b7vttrTrrrvmkbOXXXZZbkfUyA2nnXZaOuGEE/K+iPsPOuigmlq5zW1bPG7ChAm57ETsx3jeI488Mte07dOnT4u8LwCAzkDM2zhiXqCadInZyNq7EQCtYeedd05Dhw5NF198sR0MAECHJOYF6JiMtAUAAAAAKBBJW4BOIGrGLrfccg0uAABQ7cS8QEeiPAJAJxB1fd94440G71977bXbtD0AANDSxLxARyJpCwAAAABQIMojAAAAAAAUiKQtAAAAAECBSNoCAAAAABSIpC0AAAAAQIFI2gIAAAAAFIikLQAAAABAgUjaAgAAAAAUiKQtAAAAAEAqjv8PCO7EycDBX1cAAAAASUVORK5CYII=",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "fig, axes = plt.subplots(1, 2, figsize=(14, 5), sharex=True)\n",
+ "bins = np.linspace(0.0, 1.0, 81)\n",
+ "\n",
+ "for ax, log_scale in zip(axes, [False, True]):\n",
+ " ax.hist(baseline_scores, bins=bins, alpha=0.5, label=BASELINE_NAME, color=\"C0\", density=True)\n",
+ " ax.hist(focus_scores, bins=bins, alpha=0.5, label=FOCUS_NAME, color=\"C1\", density=True)\n",
+ " if log_scale:\n",
+ " ax.set_yscale(\"log\")\n",
+ " ax.set_title(\"Histogram (log y, density-normalised)\")\n",
+ " else:\n",
+ " ax.set_title(\"Histogram (linear y, density-normalised)\")\n",
+ " ax.set_xlabel(\"prediction_score\")\n",
+ " ax.set_ylabel(\"density\")\n",
+ " ax.legend()\n",
+ " ax.grid(True, alpha=0.3)\n",
+ "\n",
+ "plt.tight_layout()\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "cell-08-ecdf-md",
+ "metadata": {},
+ "source": [
+ "### 3b. Empirical CDF\n",
+ "\n",
+ "The ECDF makes small distribution-wide shifts very visible: if one curve lies uniformly above the other, that distribution has **lower** scores at every quantile (because for a given score `x`, more of its mass is `≤ x`). Curves that cross indicate the two distributions differ in **shape**, not just location."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "cell-09-ecdf",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-05-26T10:15:42.643283Z",
+ "iopub.status.busy": "2026-05-26T10:15:42.643203Z",
+ "iopub.status.idle": "2026-05-26T10:15:43.228237Z",
+ "shell.execute_reply": "2026-05-26T10:15:43.227857Z"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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DtLs2bNrNLi57rrrXKdFa8phj/n5558r71+2bJnOPPNM9evXz90/YMAAXX/99SouLq71Zy5evFjt27d3bfqb41jfunWrLrzwQvXs2dP9/F122UUPPfTQDl8bAAAACJmQl5+fr1GjRumBBx5o0OOXLl2qI444Qvvvv7++/fZbFxDOOussvfvuu2rrLKCMGzdOH374oe644w798MMPmjZtmttXF1xwgXvMW2+9pd13311FRUV69tlnNX/+fD3zzDNKS0vTtddeu8OfYYHm9ddfr3LbY489pt69e9f6+M8++0zbtm3T8ccfr6eeeqpB78OC55///OdGN8qwIHrCCSdoxowZmjVrlgu4hxxyiFavXl35mNtvv1333nuvC05ffvml2rVrp0mTJlUG1wULFrj1Ch9++GH99NNP+sc//uEee/XVV9f4ebZ99vMsWDbXsX7ZZZe5z8w+E/ts7Pi20Pfmm282al8AAACgjfOFCNuU119/vd7HXH755b7hw4dXuW3KlCm+SZMmNfjn5OTkuJ9l59Vt27bNN2/ePHfemsrLy33FxcXuvKkOO+wwX48ePXxbt26tcd+WLVt8+fn5vi5duvgmT55c6/PtMXWZMWOG22d//vOffQcddFDl7QUFBb60tDTftdde6+6v7rTTTvNdeeWVvv/973++wYMH17h/33339V188cVVrp9++um+zp07+x544IHK2//xj3/4+vTp42uM0tJSX/v27X1PPfWUu277NjMz03fHHXdUPiY7O9uXkJDge/755+t8ndtvv93Xr1+/Wo/Fk08+2ffEE0+4fdAcx7od2zfeeGOV28aOHeu75pprfME4piJBsP6fjkRlZWW+tWvXunOAYwqhiN9TaAvHVE49WSZQWM3JswqNDbELZJUYu71FF1UuLg3KycsDO7Z582ZXAbKKnVWnqrPhhFbt3Lhxoy6//PJaX6MhQw5POeUUffrpp1qxYoW7/uqrr7phlDZ8trq8vDy9/PLLOvnkk3XwwQcrJyfHPXdHUlNTdc011+jGG2901a+msoWwrdrWqVOnyiqwDRkNPH6sgjlx4sR6jx/bbv9r+Fm11N5bQyvQDbXnnnu6qp1VH+2zt6qkDaO1iiQAAABaz+b1q/TVO49r+dzwHDEYVouh25d0m0sWyK7n5ua6YYH+xY8D2dBEO/nZY40Ny7NTILtuX679J2Nh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LS1Ne+21lz788MMd/iy/vn37VnkN/+m2225z9y9btsxdj4mJ0erVq6s8d+3atYqN9YZt2OMCH1/b6Ysvvqjyvg499NAqr2fv2263/RD43us6+X/mrFmz3PYdccQRNd6ff3u+/fZbNURJSYmuuOIK7brrrmrXrp26d++uU089VWvWrKnyuM2bN+ukk05Samqq+4zPPPNMbd26tcpnecwxx6hbt27udUaPHq1nn322xs+z93zBBRe4x9lxOHjwYL3zzjs7tX32nm17+vXrp6SkJA0YMEDXX3+9iouLG7QPAAD1z3tbm7NNXy3brFfnrNJ903/Wla9+r1Me+1IH/P0jDbtumsb/9QMded9nOv3Jr3T16z/ogRm/6PVvVmvmL5u0ZEN+ZcCLj41Wjw5JGt2rgw7epatOnNhbFx84SH+dPEIPnzJOr52/pz69fH8tuOlQ/fCXSfrwD/vpxXP30P0njtVfjh6uC/YfqN+O76X9h2RoRI80V6FjEW2g8ajkRQj7EmxhyL6c33HHHe4Ls315fvfdd90X7gULFuitt97Sr3/9a02aNMl9ObcvyhauXn75ZV177bV68cUXa33txx9/XJdcconuvfde7bvvvioqKtL333+vH3/8sUnbaiFi4cKF7i9u3333nQt59oXettXviSeecIFp48aNuuaaa3TkkUe6n2cBtiFuvPFGF14DtW/fvsr1Hj166N///reuuuqqytueeuopd/uKFStqvOYHH3yg4cOHV7mtc+fOlZctHNpjZsyYof3337/G86dMmVIlBB533HEaMWKE21a/9PR0d/7YY4+5wG7ntm8s+DRVQUGB5s6d6z5jC+pbtmzRxRdfrKOPPlpff/115eMs4FnIff/9992xY5/LOeeco+eee87dP3PmTI0cOdIFMvsjgR1PFsYsiNvnYyx0HXzwwcrIyNArr7zi9uXy5cvdcbkz22fHrx0vDz/8sAYOHOiOBft88/PzdeeddzZ53wBAW5j/lltYqjXZ29xpdcVpbbZXgbPqnN1euoOJbzZizSpqGe0T1S0tUT06JqlbWpIy0xLUtX2iMlITXdXNlgBgfhsQfIS8CHH++ee7X6qzZ8921RA/CyVnnHGG+yJtX9oPP/xwvf7665X3W2Vk4sSJlZW22rz55pv67W9/6yopga/bVLadmZmZ7rKFl4suush9wd+2bZur0hgL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923ZsoUdCt+MGTNq/W7kP4bs3I6p6s8ZPXq0O/7sd9QTTzwRsnsyyv4T7GoiAAAAAKB5MCcPAAAAACIIIQ8AAAAAIgghDwAAAAAiCCEPAAAAACIIIQ8AAAAAIgghDwAAAAAiCCEPAAAAACIIIQ8AAAAAIgghDwAQ0fr27au777678npUVJTeeOONnXrN5ngNAABaSmyLvTIAACFo7dq16tixY4Me+5e//MWFuW+//bbJrwEAQGsj5AEAQl5xcbHi4+Ob5bUyMzND4jXawr4GAAQHwzUBAK1uv/3204UXXuhOaWlp6tKli6699lr5fL7KIZY33XSTTj31VKWmpuqcc85xt3/22Wfae++9lZSUpF69eumiiy5Sfn5+5etmZWXpqKOOcvf369dPzz777A6HWq5atUonnHCCOnXqpHbt2mn8+PH68ssv9eSTT+qGG27Qd999555jJ7utttf44YcfdMABB7if27lzZ7e9W7durbz/tNNO0+TJk3XnnXeqW7du7jEXXHCBSkpKGrS//vnPf2rQoEFKTExU165ddfzxx1feV15erttvv10DBw5UQkKCevfurZtvvrnR22bP6d69u4YMGeJuX7lypX7729+qQ4cObt8cc8wxWrZsWYO2FwAQXIQ8AEBQPPXUU4qNjdXs2bN1zz336K677tK//vWvyvstEI0aNUrffPONC4C//PKLDj30UP3617/W999/rxdffNGFPguKgYHFwsmMGTP0yiuvuHBkwa8uFnb23XdfrV69Wm+++aYLdJdffrkLTlOmTNEf/vAHDR8+3A3PtJPdVp2FzEmTJrnhm1999ZVefvllffDBB1W2y9g22Xuwc3vvFhj9obE+X3/9tQuzN954oxYuXKhp06Zpn332qbz/qquu0m233eb20bx58/Tcc8+5INiYbZs+fbp77ffff19vvfWWC5/2vPbt2+vTTz/V559/rpSUFLf/rdIHAAhxPgAAWtm+++7rGzZsmK+8vLzytiuuuMLdZvr06eObPHlyleeceeaZvnPOOafKbZ9++qkvOjrat23bNt/ChQutDOibPXt25f3z5893t/3jH/+ovM2uv/766+7yww8/7Gvfvr1v06ZNtW7n9ddf7xs1alSN2wNf45FHHvF17NjRt3Xr1sr73377bbdd69atc9enTp3q3lNpaWnlY37zm9/4pkyZssN99eqrr/pSU1N9ubm5Ne6z2xISEnyPPvporc9t6LZ17drVV1RUVPmYp59+2jdkyJAqn4/dn5SU5Hv33Xd3uM0AgOCikgcACIrdd9/dDXv022OPPfTzzz+rrKzMXbdhk4GsymaVL6so+U9WbbKq29KlSzV//nxXGRw3blzlc4YOHeqGG9bFGqqMGTPGDUdsKvu5VnG0oZ5+e+21l9suq475WUUwJiam8roN26yvyuh38MEHq0+fPurfv79OOeUUNwS1oKCg8mcXFRXpwAMP3Klt23XXXavMw7N9vXjxYlfJ8+9r20eFhYWuGgkACG00XgEAhKTAYOIfWnnuuee6oYvV2Ty0RYsWNfpn2Dy11hIXF1flugVcC1s7YkFr7ty5+uijj/Tee+/puuuuc10/bfhlc21/bfvawnJtcxrT09Ob5WcCAFoOlTwAQFBYc5NAX3zxhWsuEljtCjR27Fg358wajFQ/WRXKqnalpaWaM2dO5XOsWpWdnV3nNowcOdJV8zZv3lzr/fa6/spiXYYNG+YqX4ENYGwOW3R0dGUTk51lFcqDDjrINVix+YjWAOXDDz90+8uCns2pa85ts31tVdWMjIwa+9oa5QAAQhshDwAQFCtWrNBll13mgtjzzz+v++67TxdffHGdj7/iiis0c+ZM1zTEgpmFkP/85z+VTUQstFhjEKv2WYC0sHfWWWfVW+2yrpq2HIJ1l7Tws2TJEr366quaNWtWZZdPGwpqP2/jxo1uaGR1J510kut6OXXqVP3444+uscrvf/97N7TS3wBlZ1gjlHvvvddtw/Lly/Xvf//bVQDt/drPtf1izWLsdhtKaWH5scce26lts+dZx1PrqGmNV2wfWCXRqqjWjRQAENoIeQCAoLDlEbZt26YJEya45QQs4PmXSqir6vbxxx+7YZm2jILNpbOhi9b23++JJ55w161j5nHHHedez6pRdbFKnQ2BtMccfvjhbm6adar0VxOtk6cFx/33398NU7QwWl1ycrLeffddVw3cbbfd3PIGNkfu/vvvV3OwOYWvvfaaWwbBKnMPPfSQ2w6b42esq6Z1AbV9YfdbB1D/XL+mbps975NPPnHDYG0/2uueeeaZbk6eLWkBAAhtUdZ9JdgbAQBoe+vkjR49WnfffXewNwUAgIhDJQ8AAAAAIgghDwCAILI5b4HLQlQ/AQDQWAzXBAAgiGxe4urVq+u83zpaAgDQGIQ8AAAAAIggDNcEAAAAgAhCyAMAAACACELIAwAAAIAIQsgDAAAAgAhCyAMAAACACELIAwAAAIAIQsgDAAAAgAhCyAMAAAAARY7/B+OmMyQwaUeKAAAAAElFTkSuQmCC",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "def ecdf(series: pd.Series) -> tuple[np.ndarray, np.ndarray]:\n",
+ " \"\"\"Return sorted scores and their corresponding ECDF probabilities.\"\"\"\n",
+ " x = np.sort(series.to_numpy())\n",
+ " y = np.arange(1, len(x) + 1) / len(x)\n",
+ " return x, y\n",
+ "\n",
+ "\n",
+ "plt.figure(figsize=(9, 5))\n",
+ "for series, name, color in [\n",
+ " (baseline_scores, BASELINE_NAME, \"C0\"),\n",
+ " (focus_scores, FOCUS_NAME, \"C1\"),\n",
+ "]:\n",
+ " x, y = ecdf(series)\n",
+ " plt.plot(x, y, label=name, color=color)\n",
+ "plt.xlabel(\"prediction_score\")\n",
+ "plt.ylabel(\"ECDF P(score ≤ x)\")\n",
+ "plt.title(\"Empirical CDF of classifier scores\")\n",
+ "plt.legend()\n",
+ "plt.grid(True, alpha=0.3)\n",
+ "plt.tight_layout()\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "cell-10-box-md",
+ "metadata": {},
+ "source": [
+ "### 3c. Box + violin\n",
+ "\n",
+ "Box: median, IQR, whiskers at 1.5 × IQR (outliers hidden because there are millions of them). Violin: full kernel-density estimate of the distribution shape."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "cell-11-box",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-05-26T10:15:43.229226Z",
+ "iopub.status.busy": "2026-05-26T10:15:43.229167Z",
+ "iopub.status.idle": "2026-05-26T10:15:43.929555Z",
+ "shell.execute_reply": "2026-05-26T10:15:43.929175Z"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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AADYggATAAAAAAAAYkKACSkpJydHZs2aZf4FkNo4HgBwOo5TAFIBxzr3S7ki3wAAAAAAALAXGUwAAAAAAACICQEmAAAAAAAAxIQAEwAAAAAAAGJCgAkAAAAAAAAxIcCENtatWydnnnmmDB482FTyHzBggBx22GEyf/78lnU+/fRT+b//+z/p3bu35ObmytChQ2X69OmyfPnydvfoO++8I2lpadKtWzepq6sL+t1HH31kfqe3UIYNG2baom1rbfz48XLOOecE3dftPPXUU0HrzZkzRwYNGtThK37ffffJ3nvvbdqot/32208+/PDDoHW0Lv7ll18u22yzjeTl5Zl1VqxY0fL77777Tk488UTZbrvtzO9/8YtfmBnrGhoaQv7Nr7/+Wrp06SJdu3aVzrz33nvmtejbt695ji+88EKbdaqqquSMM86Q/v37m7+/4447yrx58zrdNrz72fO/t0eOHCmFhYXmvfbLX/5Srrvuupbf//GPf5SJEye2+7ndsmWLuf/www+3fFbT09PN+2zatGmyYcOGlsf4f6+34uJi2XPPPeWtt97q9G/56ec0cBv+2/XXX9/yGdP7GRkZsnr16qDHrl27VjIzM83vdb3A9UPd/vvf/wY9rwMPPDBoe/q8dbnuh8Dn3t7N/zcXLlxo2nfIIYe0eX7+9ixevFjC0djYKBdeeKHsvPPOUlBQYD7/U6dOlTVr1gStV1ZWJscee6wUFRWZ11iPQ3o8CHwtjzjiCHPs0u2MGjVKHn/88TZ/T5/z6aefbtbT9+H2228vr7zySkzti/S4CESCfgv9FsBu9Mm2ok8WjD5Z5wgwIYieBIwZM8acDN50003y+eefy2uvvSa/+c1vzAmHevnll2X33XeX+vp6c3KydOlSeeyxx8yJ5GWXXdbpHtVgyt///vegZQ888IBsu+22Idd///33pba2Vo4++mh55JFHwnrF9MT70ksvNQeBSOgJ2OTJk+Xtt982J4h6gn/AAQcEncTeeOON8pe//MUEbT744ANzQjVhwoSWoNmyZcukublZ7rnnHvnf//4nt912m1n34osvbvP3tH369zSoFY7q6moTJJg7d26768yYMcO8Zvqa6GujwTcNOL300ksR7Qt457P34IMPmvfBWWedZYIa//nPf+SCCy4ICj5EQgMYGsj58ccfTeDq1VdflSlTpgSt89BDD5l19G/17NlTDj30UPn222/D/htXXnmleXzgTYNvgfr16yePPvpo0DI9RujyUN58880229R97qeBKV1HP/+hTJo0Keix48aNM8G9wGV6zPAf07S9GhRuHQiKVE1NjXzyySfmNdZ/n3/+efnqq6/k8MMPD1pPg0t6zHnjjTfMe0X/9sknn9zy+wULFsguu+wizz33nHz22WcmMKiBIF3XTwM++++/v3k/Pvvss+bv6Gvc3j4Nt32RHBeBSNBvod8C2I0+WTD6ZD+jTxYGCwhw0EEHWf369bOqqqra7JfNmzdb1dXVVs+ePa2JEyeG3G+6TnvefvttS99yl156qbXffvu1LK+pqbGKi4utyy67zPy+tT/+8Y/WRRddZL366qvW9ttv3+b3++yzj3X22WcH3Z82bZrVo0cPa+7cuS3Lb7vtNmvgwIERvd5NTU1Wly5drEceecTcb25utvr06WPddNNNLets2bLFysnJsZ588sl2t3PjjTda2223XZvlF1xwgXXcccdZDz30kNkHkdB99fe//73N8p122sm68sorg5aNHj3auuSSSyLaPrzz2TviiCPM56gjxx9/vFmvvc+tf/uh3qvXXHONlZ6ebj7Lod6bq1evNsvmzZvX4d/y08+pfl7bs3LlypZjydChQ4N+p8cI/7FE1wtc/9NPP213m/7nNX36dGvXXXdtWa7PWx+r+6GzY49fZWWlVVhYaC1btsyaNGmS2T+h2t9Rezrz4Ycfmm18//335v6XX35p7n/00Uct6+gxMy0tzez/9hx88MHmeOl39913W4MHD7YaGhqibluo9kVyXAQiQb8lGP0WIHb0yX5Gn6xz9MmCkcGEoOEVmjGh2RKaldOaDrl4/fXXZePGjSb7IZRwhnlppsO///1vWbVqlbmvV9M1/XL06NFt1q2srJRnnnlGjjvuOHNVvby83Dw2nAyLSy65xETcNesnlii1Zhl1797d3F+5cqVJmdVhcX6aPbLbbruZjKf2aLv92/DTTBV9bh1lI0Vjjz32MNlKmnWl5/qajaHDpzQTC6n52evTp48ZCvb9999LPOiQJ81OaWpqavf3yu7hUJohs3nzZpPlqPRfva/DCqN1xRVXmOwxzd6J1t/+9jczrHeHHXYwxy7NINsad7OPHlN0mJ3/ddfjj/48duzYlnX0OKXDGDXTMtxjkx47NDNL34s6DHPE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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "fig, axes = plt.subplots(1, 2, figsize=(12, 5))\n",
+ "\n",
+ "data = [baseline_scores, focus_scores]\n",
+ "labels = [BASELINE_NAME, FOCUS_NAME]\n",
+ "\n",
+ "axes[0].boxplot(data, tick_labels=labels, showfliers=False)\n",
+ "axes[0].set_ylabel(\"prediction_score\")\n",
+ "axes[0].set_title(\"Box plot (outliers hidden)\")\n",
+ "axes[0].grid(True, alpha=0.3)\n",
+ "\n",
+ "axes[1].violinplot(data, showmedians=True)\n",
+ "axes[1].set_xticks([1, 2])\n",
+ "axes[1].set_xticklabels(labels)\n",
+ "axes[1].set_ylabel(\"prediction_score\")\n",
+ "axes[1].set_title(\"Violin plot\")\n",
+ "axes[1].grid(True, alpha=0.3)\n",
+ "\n",
+ "plt.tight_layout()\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "cell-12-qq-md",
+ "metadata": {},
+ "source": [
+ "### 3d. Quantile-quantile (Q-Q) plot\n",
+ "\n",
+ "If the two distributions are identical the points lie on `y = x`. Systematic deviation above the line means the focus crawl has higher scores at the matching quantile; deviation below means lower.\n",
+ "\n",
+ "With samples this large we subsample evenly along the quantile axis to keep the plot readable."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "cell-13-qq",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-05-26T10:15:43.930547Z",
+ "iopub.status.busy": "2026-05-26T10:15:43.930496Z",
+ "iopub.status.idle": "2026-05-26T10:15:44.006062Z",
+ "shell.execute_reply": "2026-05-26T10:15:44.005773Z"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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iIiIzMK03XNV8lVhYEqGmJgYOXv2rDrNwERERGZk2pam62Gc8ZUcrq6u0qtXLzl+/LhUq1Yt3Y4LERGRXpm2pWnX9V0sOeCAS5cu2U67u7szMBERkWm5mnkgOBfrTdrWrVtl9uzZ6jcREZHZZTJzyYHaBWprvRm6tWXLFltYcnNz03pziIiINGfalqZGBRtxILgDgalFixasw0RERGTmlqbCOQprvQm6Y7FYVGDatm2bOt+yZUtp2LCh1ptFRESkC6YNTdfCrmm9CbpjH5ieeeYZadCggdabREREpBum7Z7bfm07Z8/FkT17dvW7VatWDExERERxZDL77Dl/P3+tN0U3ateuLb6+vuLj46P1phAREemOaVuaOHvuyRimPXv2SHh4uG2/MDARERElzLShqWnhpqZuZUJgwsK769atk3nz5kl0dLTWm0RERKRrpu2e88vhJ2YOTBs2bJBdu3ap89WrV2ctJiIioqcwbWi6EnZFzChuYHr22WfVWCYiIiJKmmm75wKuBJhu9hwC019//cXARERElAKmDU1mXHsONZh2796tTrdr144tTERERMlg2tBkxtlzlStXFi8vL3nuueekVq1aWm8OERGRoZh2TFNL35ammz2XO3duGTp0qLi7u2u9KURERIZj2pYms4xhQkmB06dP2y5jYCIiIkoZ04amjZc3OvVAcASmNWvWqOKVS5culdDQUK03iYiIyNBMG5qceSA4AtPq1atl//79tkHfOXLk0HqziIiIDM20Y5qcdSA4AtOff/4pBw8eVOc7deokVatW1XqziIiIDM+0oal10dZONxAcgemPP/6QQ4cOiYuLiwpMVapU0XqziIiInIKpu+eczT///MPARERElE5M29K07tI6aR/Y3qlam9ANFxgYKCVKlFA1mYiIiCjtmLqlyRkGgsfExKgfcHV1lY4dOzIwERERpQPThiZnGAiOsLRq1SpZuXKlLTgRERFR+jBtaGpXrJ2hu+YQkn7//Xc5fPiwHD16VK5du6b1JhERETk1045pMvI4cAQmtC4dOXJEzZLr2rWrFClSROvNIiIicmqmbWlafWG1ISuC2wcmjGFCYKpQoYLWm0VEROT0TBuajDgQHIFpxYoVDExEREQaMG33nBEHgl+/fl1OnDihWpi6desm5cqV03qTiIiITMO0oQmByWgDwQsVKiQ9evSQ6Oho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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "qs = np.linspace(0.001, 0.999, 200)\n",
+ "baseline_q = np.quantile(baseline_scores, qs)\n",
+ "focus_q = np.quantile(focus_scores, qs)\n",
+ "\n",
+ "plt.figure(figsize=(6, 6))\n",
+ "plt.plot([0, 1], [0, 1], color=\"grey\", linestyle=\"--\", label=\"y = x (identical)\")\n",
+ "plt.plot(baseline_q, focus_q, marker=\".\", linestyle=\"-\", color=\"C2\", markersize=4)\n",
+ "plt.xlabel(f\"{BASELINE_NAME} quantile\")\n",
+ "plt.ylabel(f\"{FOCUS_NAME} quantile\")\n",
+ "plt.title(\"Q-Q plot of focus vs baseline scores\")\n",
+ "plt.xlim(0, 1)\n",
+ "plt.ylim(0, 1)\n",
+ "plt.legend()\n",
+ "plt.grid(True, alpha=0.3)\n",
+ "plt.tight_layout()\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "cell-14-tests-md",
+ "metadata": {},
+ "source": [
+ "## 4. Significance testing\n",
+ "\n",
+ "Classifier-score distributions are heavily right-skewed and non-normal, so we lead with **non-parametric tests** that make no normality assumption. We complement with Welch's t-test (mean difference, robust to unequal variances) for completeness.\n",
+ "\n",
+ "1. **Kolmogorov–Smirnov (two-sample)** — asks whether the two distributions differ *anywhere* (location, shape, or tail). Sensitive to any distributional difference. Returns the largest vertical gap between the two ECDFs.\n",
+ "2. **Mann–Whitney U / Wilcoxon rank-sum** — asks whether one distribution stochastically dominates the other; under symmetry this is equivalent to comparing medians.\n",
+ "3. **Welch's t-test** — tests difference in **means** without assuming equal variances.\n",
+ "\n",
+ "Caveat: with N in the millions, every test will return a near-zero p-value for almost any real difference. We treat p-values as a sanity check on direction and pair them with effect sizes (next section) for the substantive answer."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "cell-15-tests",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-05-26T10:15:44.007069Z",
+ "iopub.status.busy": "2026-05-26T10:15:44.007022Z",
+ "iopub.status.idle": "2026-05-26T10:15:44.240328Z",
+ "shell.execute_reply": "2026-05-26T10:15:44.239994Z"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " test \n",
+ " statistic \n",
+ " p_value \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " KS (two-sample) \n",
+ " 4.362318e-01 \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " Mann-Whitney U \n",
+ " 7.695199e+11 \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " Welch's t \n",
+ " 8.071416e+02 \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " test statistic p_value\n",
+ "0 KS (two-sample) 4.362318e-01 0.0\n",
+ "1 Mann-Whitney U 7.695199e+11 0.0\n",
+ "2 Welch's t 8.071416e+02 0.0"
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "ks_result = stats.ks_2samp(baseline_scores, focus_scores, method=\"auto\")\n",
+ "mwu_result = stats.mannwhitneyu(focus_scores, baseline_scores, alternative=\"two-sided\")\n",
+ "t_result = stats.ttest_ind(focus_scores, baseline_scores, equal_var=False)\n",
+ "\n",
+ "tests_df = pd.DataFrame(\n",
+ " {\n",
+ " \"test\": [\"KS (two-sample)\", \"Mann-Whitney U\", \"Welch's t\"],\n",
+ " \"statistic\": [ks_result.statistic, mwu_result.statistic, t_result.statistic],\n",
+ " \"p_value\": [ks_result.pvalue, mwu_result.pvalue, t_result.pvalue],\n",
+ " }\n",
+ ")\n",
+ "tests_df"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "cell-16-effect-md",
+ "metadata": {},
+ "source": [
+ "## 5. Direction and effect size\n",
+ "\n",
+ "A p-value tells us **whether** a difference is detectable; effect size tells us **how big** it is.\n",
+ "\n",
+ "- **Mean delta / median delta** — the difference in raw score units.\n",
+ "- **Cohen's d** — standardised mean difference, units of pooled SD. Conventional reading: 0.2 = small, 0.5 = medium, 0.8 = large.\n",
+ "- **Common Language Effect Size (CLES)** — `P(focus > baseline)` if we draw one record from each at random. 0.5 means the distributions are identical; > 0.5 means focus scores tend to be higher. Derived directly from the Mann–Whitney U statistic."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "cell-17-effect",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-05-26T10:15:44.241419Z",
+ "iopub.status.busy": "2026-05-26T10:15:44.241371Z",
+ "iopub.status.idle": "2026-05-26T10:15:44.262566Z",
+ "shell.execute_reply": "2026-05-26T10:15:44.262191Z"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " metric \n",
+ " value \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " mean delta (focus - baseline) \n",
+ " 0.403044 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " median delta (focus - baseline) \n",
+ " 0.666728 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " Cohen's d (focus vs baseline) \n",
+ " 1.141602 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " CLES = P(focus > baseline) \n",
+ " 0.769694 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " metric value\n",
+ "0 mean delta (focus - baseline) 0.403044\n",
+ "1 median delta (focus - baseline) 0.666728\n",
+ "2 Cohen's d (focus vs baseline) 1.141602\n",
+ "3 CLES = P(focus > baseline) 0.769694"
+ ]
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "def cohens_d(a: pd.Series, b: pd.Series) -> float:\n",
+ " \"\"\"Cohen's d for two independent samples (pooled SD denominator).\"\"\"\n",
+ " na, nb = len(a), len(b)\n",
+ " pooled_var = ((na - 1) * a.var(ddof=1) + (nb - 1) * b.var(ddof=1)) / (na + nb - 2)\n",
+ " return float((a.mean() - b.mean()) / np.sqrt(pooled_var))\n",
+ "\n",
+ "\n",
+ "# CLES from Mann-Whitney U: focus is the first arg above, so U_focus / (n_focus * n_baseline)\n",
+ "# is the probability a random focus score exceeds a random baseline score.\n",
+ "cles = float(mwu_result.statistic / (len(focus_scores) * len(baseline_scores)))\n",
+ "\n",
+ "effect_df = pd.DataFrame(\n",
+ " {\n",
+ " \"metric\": [\n",
+ " \"mean delta (focus - baseline)\",\n",
+ " \"median delta (focus - baseline)\",\n",
+ " \"Cohen's d (focus vs baseline)\",\n",
+ " \"CLES = P(focus > baseline)\",\n",
+ " ],\n",
+ " \"value\": [\n",
+ " focus_scores.mean() - baseline_scores.mean(),\n",
+ " focus_scores.median() - baseline_scores.median(),\n",
+ " cohens_d(focus_scores, baseline_scores),\n",
+ " cles,\n",
+ " ],\n",
+ " }\n",
+ ")\n",
+ "effect_df.round(6)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "cell-18-verdict-md",
+ "metadata": {},
+ "source": [
+ "## 6. Conclusion\n",
+ "\n",
+ "The cell below assembles a one-paragraph verdict from the tests above. Read it together with the effect-size table — large samples make tiny differences look statistically significant, but only effect-size measures tell you whether the difference matters in practice. The verdict also names whether the focus column is real, intermediate (partial crawl), or toy data so you don't accidentally trust an early read."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "id": "cell-19-verdict",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-05-26T10:15:44.263522Z",
+ "iopub.status.busy": "2026-05-26T10:15:44.263466Z",
+ "iopub.status.idle": "2026-05-26T10:15:44.283675Z",
+ "shell.execute_reply": "2026-05-26T10:15:44.283399Z"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Comparison: CC-SUPPLEMENTAL-2026-22 vs CC-MAIN-2024-18 [real focus-crawl data]\n",
+ " Direction: focus is higher than baseline\n",
+ " Mean delta: +0.403044\n",
+ " Median delta: +0.666728\n",
+ " Cohen's d: +1.142\n",
+ " CLES: 0.770 (P(focus > baseline))\n",
+ " KS p: 0.000e+00\n",
+ " MWU p: 0.000e+00\n",
+ " Welch's t p: 0.000e+00\n",
+ " Verdict: STATISTICALLY SIGNIFICANT under all three tests\n"
+ ]
+ }
+ ],
+ "source": [
+ "ALPHA = 0.01 # conservative bar given large N\n",
+ "mean_delta = focus_scores.mean() - baseline_scores.mean()\n",
+ "direction = \"higher\" if mean_delta > 0 else (\"lower\" if mean_delta < 0 else \"unchanged\")\n",
+ "all_significant = all(p < ALPHA for p in [ks_result.pvalue, mwu_result.pvalue, t_result.pvalue])\n",
+ "verdict = (\n",
+ " \"STATISTICALLY SIGNIFICANT under all three tests\"\n",
+ " if all_significant\n",
+ " else f\"NOT all tests significant at alpha={ALPHA}\"\n",
+ ")\n",
+ "if is_toy:\n",
+ " data_qualifier = \"TOY focus data (baseline + noise)\"\n",
+ "elif is_partial:\n",
+ " data_qualifier = (\n",
+ " f\"INTERMEDIATE real focus-crawl data \"\n",
+ " f\"({len(focus_scores) / len(baseline_scores):.0%} of baseline size)\"\n",
+ " )\n",
+ "else:\n",
+ " data_qualifier = \"real focus-crawl data\"\n",
+ "\n",
+ "print(\n",
+ " f\"Comparison: {FOCUS_NAME} vs {BASELINE_NAME} [{data_qualifier}]\\n\"\n",
+ " f\" Direction: focus is {direction} than baseline\\n\"\n",
+ " f\" Mean delta: {mean_delta:+.6f}\\n\"\n",
+ " f\" Median delta: {focus_scores.median() - baseline_scores.median():+.6f}\\n\"\n",
+ " f\" Cohen's d: {cohens_d(focus_scores, baseline_scores):+.3f}\\n\"\n",
+ " f\" CLES: {cles:.3f} (P(focus > baseline))\\n\"\n",
+ " f\" KS p: {ks_result.pvalue:.3e}\\n\"\n",
+ " f\" MWU p: {mwu_result.pvalue:.3e}\\n\"\n",
+ " f\" Welch's t p: {t_result.pvalue:.3e}\\n\"\n",
+ " f\" Verdict: {verdict}\"\n",
+ ")"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.12.13"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 0000000..43fb291
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,81 @@
+[project]
+name = "ccoa"
+version = "0.1.0"
+description = "CLI tools for the Open Athena crawl."
+readme = "README.md"
+requires-python = ">=3.12"
+authors = [{ name = "Common Crawl Foundation" }]
+license = { text = "Apache 2.0" }
+dependencies = [
+ "warcio[s3]>=1.7",
+ "trafilatura>=1.8.0,<1.12.0",
+ "fasttext-numpy2-wheel",
+ "huggingface-hub>=0.24",
+ "fsspec>=2024.0",
+ "pandas",
+]
+
+[project.optional-dependencies]
+notebooks = ["jupyter", "matplotlib", "scipy", "nbconvert"]
+# Required for reading/writing `s3://...` URIs (WARC inputs, classify-warc
+# output, extraction cache, resume-from-output).
+s3 = ["s3fs"]
+# Convenience: install every optional dependency at once.
+all = [
+ "ccoa[notebooks]",
+ "ccoa[s3]",
+]
+
+[project.scripts]
+ccoa = "ccoa.cli:main"
+
+[build-system]
+requires = ["hatchling"]
+build-backend = "hatchling.build"
+
+[tool.hatch.build.targets.wheel]
+packages = ["src/ccoa"]
+
+[dependency-groups]
+dev = [
+ "pytest>=8",
+ "ruff>=0.6",
+]
+
+[tool.ruff]
+line-length = 100
+src = ["src", "tests"]
+
+[tool.ruff.lint]
+select = [
+ "E", # pycodestyle errors
+ "W", # pycodestyle warnings
+ "F", # pyflakes
+ "I", # isort
+ "B", # flake8-bugbear
+ "UP", # pyupgrade
+ "D101", # missing docstring in public class
+ "D102", # missing docstring in public method
+ "D103", # missing docstring in public function
+ "D106", # missing docstring in public nested class
+ "D107", # missing docstring in __init__
+ "D200", # one-line docstring should fit on one line with quotes
+ "D205", # 1 blank line required between summary line and description
+ "D210", # no whitespace surrounding docstring text
+ "D212", # multi-line docstring summary should start at the first line
+ "D300", # use triple double quotes
+ "D403", # first word of the first line should be capitalised
+ "D415", # first line should end with a period, question mark, or exclamation point
+ "D419", # docstring is empty
+]
+ignore = ["E501"] # line length handled by formatter
+
+[tool.ruff.lint.pydocstyle]
+convention = "google"
+
+[tool.pytest.ini_options]
+testpaths = ["tests"]
+addopts = "-ra"
+markers = [
+ "real_model: end-to-end test that downloads a real fasttext model from HuggingFace; skipped unless --run-real is passed (e.g. `uv run pytest --run-real`).",
+]
diff --git a/src/ccoa/__init__.py b/src/ccoa/__init__.py
new file mode 100644
index 0000000..d46eb39
--- /dev/null
+++ b/src/ccoa/__init__.py
@@ -0,0 +1,3 @@
+"""CCOA CLI tools."""
+
+__version__ = "0.1.0"
diff --git a/src/ccoa/__main__.py b/src/ccoa/__main__.py
new file mode 100644
index 0000000..966e449
--- /dev/null
+++ b/src/ccoa/__main__.py
@@ -0,0 +1,6 @@
+"""Allow running as `python -m ccoa`."""
+
+from ccoa.cli import main
+
+if __name__ == "__main__":
+ main()
diff --git a/src/ccoa/classifier/__init__.py b/src/ccoa/classifier/__init__.py
new file mode 100644
index 0000000..d222f7d
--- /dev/null
+++ b/src/ccoa/classifier/__init__.py
@@ -0,0 +1 @@
+"""Text classifiers (currently: fasttext models hosted on HuggingFace Hub)."""
diff --git a/src/ccoa/classifier/fasttext.py b/src/ccoa/classifier/fasttext.py
new file mode 100644
index 0000000..bc22c28
--- /dev/null
+++ b/src/ccoa/classifier/fasttext.py
@@ -0,0 +1,52 @@
+"""Load and apply a HuggingFace-hosted fasttext classifier to a text snippet."""
+
+from __future__ import annotations
+
+import fasttext as _fasttext
+from huggingface_hub import hf_hub_download
+
+DEFAULT_MODEL_REPO = "ibm-granite/GneissWeb.Sci_classifier"
+DEFAULT_MODEL_FILE = "fasttext_science.bin"
+DEFAULT_TARGET_LABEL = "__label__science"
+
+FASTTEXT_MAX_INPUT_CHARS = 100_000
+
+
+def load_classifier(
+ model_repo: str = DEFAULT_MODEL_REPO,
+ model_file: str = DEFAULT_MODEL_FILE,
+):
+ """Download (cached) the model file from HuggingFace Hub and load it."""
+ path = hf_hub_download(repo_id=model_repo, filename=model_file)
+ return _fasttext.load_model(path)
+
+
+def clean_for_fasttext(text: str, max_len: int = FASTTEXT_MAX_INPUT_CHARS) -> str:
+ """Normalise text into a single safe line that fasttext's C buffer accepts.
+
+ - Replaces `\\n` / `\\r` with spaces (fasttext's `predict` rejects newlines).
+ - Strips NUL bytes (`\\x00`) — some fasttext builds segfault on them.
+ - Clamps length to `max_len` characters. Web pages often run into millions
+ of characters of boilerplate; the classifier signal saturates long before
+ that and overly long inputs have been blamed for heap-corruption aborts.
+ """
+ cleaned = text.replace("\n", " ").replace("\r", " ").replace("\x00", "")
+ if len(cleaned) > max_len:
+ cleaned = cleaned[:max_len]
+ return cleaned
+
+
+def predict_target(model, text: str, target_label: str) -> float:
+ """Return the probability the model assigns to `target_label`.
+
+ Cleans the input via `clean_for_fasttext` (strip newlines + NULs, clamp
+ length), then asks the model for probabilities over all labels and
+ returns the probability of `target_label` (0.0 if the model emits no
+ such label).
+ """
+ cleaned = clean_for_fasttext(text)
+ labels, probs = model.predict(cleaned, k=-1)
+ for lbl, prob in zip(labels, probs, strict=False):
+ if lbl == target_label:
+ return float(prob)
+ return 0.0
diff --git a/src/ccoa/cli.py b/src/ccoa/cli.py
new file mode 100644
index 0000000..1ff57d2
--- /dev/null
+++ b/src/ccoa/cli.py
@@ -0,0 +1,42 @@
+"""Unified CLI for ccoa."""
+
+from __future__ import annotations
+
+import argparse
+import logging
+import sys
+
+from ccoa.commands.classify_warc import ClassifyWarcCommand
+
+LOG_LEVELS = ["debug", "info", "warning", "error", "critical"]
+
+
+def main(argv: list[str] | None = None) -> int:
+ """Build the argparse parser, dispatch to the chosen subcommand, return its exit code."""
+ parser = argparse.ArgumentParser(prog="ccoa", description="CC-Open-Athena CLI tools.")
+ parser.add_argument(
+ "--log-level",
+ choices=LOG_LEVELS,
+ default="info",
+ help="Logging verbosity (default: info).",
+ )
+ subparsers = parser.add_subparsers(dest="command", required=True)
+
+ commands = [ClassifyWarcCommand()]
+ command_map: dict[str, object] = {}
+ for cmd in commands:
+ sub = subparsers.add_parser(cmd.name, help=cmd.help, description=cmd.help)
+ cmd.add_arguments(sub)
+ command_map[cmd.name] = cmd
+
+ args = parser.parse_args(argv)
+ logging.basicConfig(
+ level=getattr(logging, args.log_level.upper()),
+ format="%(asctime)s %(levelname)s %(name)s: %(message)s",
+ datefmt="%Y-%m-%d %H:%M:%S",
+ )
+ return command_map[args.command].run(args)
+
+
+if __name__ == "__main__":
+ sys.exit(main())
diff --git a/src/ccoa/commands/__init__.py b/src/ccoa/commands/__init__.py
new file mode 100644
index 0000000..d9d1bf1
--- /dev/null
+++ b/src/ccoa/commands/__init__.py
@@ -0,0 +1,21 @@
+"""CLI commands for ccoa."""
+
+from __future__ import annotations
+
+import abc
+import argparse
+
+
+class BaseCommand(abc.ABC):
+ """Base class for all CLI subcommands."""
+
+ name: str
+ help: str
+
+ @abc.abstractmethod
+ def add_arguments(self, parser: argparse.ArgumentParser) -> None:
+ """Add command-specific arguments to the subparser."""
+
+ @abc.abstractmethod
+ def run(self, args: argparse.Namespace) -> int:
+ """Execute the command. Returns 0 on success, non-zero on failure."""
diff --git a/src/ccoa/commands/classify_warc.py b/src/ccoa/commands/classify_warc.py
new file mode 100644
index 0000000..2e67d0e
--- /dev/null
+++ b/src/ccoa/commands/classify_warc.py
@@ -0,0 +1,787 @@
+"""Classify WARC response records with a fasttext model.
+
+Streams one or more WARC files from S3 (or any fsspec URL), extracts
+plain text from each `response` record with trafilatura, and applies
+a HuggingFace-hosted fasttext classifier. Per-record output is a CSV
+`URL,prediction_score,warc_filename,warc_record_index` written to
+stdout, a local path, or an `s3://` URL (anything `fsspec.open`
+understands); a one-shot summary of the score distribution is logged
+at the end and written to a `.summary.csv` sidecar.
+
+Example:
+ ```bash
+ uv run ccoa classify-warc \\
+ --warc-paths 's3://commoncrawl/crawl-data/CC-MAIN-2025-51/segments/.../*.warc.gz' \\
+ --shuffle-files --files-limit 8 \\
+ --records-per-file-limit 50 \\
+ --workers 4 \\
+ --output data/classified.csv
+ ```
+
+The default model (`ibm-granite/GneissWeb.Sci_classifier`) is ~4 GB;
+the first run will download it into the HuggingFace cache.
+"""
+
+from __future__ import annotations
+
+import argparse
+import csv
+import datetime as _dt
+import logging
+import sys
+import threading
+import time
+from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor
+from concurrent.futures.process import BrokenProcessPool
+from dataclasses import dataclass
+
+import fsspec
+
+from ccoa.classifier.fasttext import (
+ DEFAULT_MODEL_FILE,
+ DEFAULT_MODEL_REPO,
+ DEFAULT_TARGET_LABEL,
+ load_classifier,
+ predict_target,
+)
+from ccoa.commands import BaseCommand
+from ccoa.extraction.cache import (
+ cache_path_for_warc,
+ load_extraction_cache,
+ save_extraction_cache,
+)
+from ccoa.extraction.text import TrafilaturaLogCounter, extract_text
+from ccoa.utils.fs.paths import (
+ open_output_sink,
+ output_exists,
+ resolve_warc_paths,
+ s3_storage_options,
+ summary_path_for,
+)
+from ccoa.utils.reporting.summary import (
+ format_duration,
+ log_summary,
+ log_timing,
+ write_run_summary,
+)
+from ccoa.utils.warc.reader import iter_response_records
+from ccoa.utils.warc.urls import is_homepage_url
+
+logger = logging.getLogger(__name__)
+
+
+_WORKER_MODEL: object = None
+_WORKER_LOCK = threading.Lock()
+
+
+def load_resume_skipset(
+ path: str,
+ storage_options: dict[str, object],
+) -> dict[str, frozenset[int]]:
+ """Build `{warc_filename: frozenset(record_indices)}` from a prior output CSV.
+
+ Used by `--resume-from-output` to skip records already classified. The
+ input must have `warc_filename` and `warc_record_index` columns (which
+ the current output schema always emits); a `ValueError` is raised
+ otherwise to flag stale outputs from the pre-resume schema.
+ """
+ required = {"warc_filename", "warc_record_index"}
+ buckets: dict[str, set[int]] = {}
+ with fsspec.open(path, "r", encoding="utf-8", **storage_options) as fh:
+ reader = csv.DictReader(fh)
+ fields = set(reader.fieldnames or [])
+ if not required.issubset(fields):
+ missing = required - fields
+ raise ValueError(
+ f"{path} is missing required columns for --resume-from-output: "
+ f"need {sorted(required)}, missing {sorted(missing)} "
+ f"(found {sorted(fields)})."
+ )
+ for row in reader:
+ warc = row["warc_filename"]
+ try:
+ idx = int(row["warc_record_index"])
+ except (TypeError, ValueError):
+ continue
+ buckets.setdefault(warc, set()).add(idx)
+ return {warc: frozenset(idxs) for warc, idxs in buckets.items()}
+
+
+@dataclass
+class FileResult:
+ """Aggregated per-file outcome returned by `process_one_file`.
+
+ Each entry in `rows` is `(url, score, warc_filename, warc_record_index)`,
+ matching the output CSV schema.
+ """
+
+ uri: str
+ rows: list[tuple[str, float, str, int]]
+ processed: int
+ skipped_empty: int
+ skipped_homepage: int
+ skipped_resume: int
+ extract_errors: int
+ cache_hits: int
+ cache_misses: int
+ t_extract: float
+ t_predict: float
+
+
+def process_one_file(
+ uri: str,
+ model,
+ model_lock: threading.Lock,
+ args: argparse.Namespace,
+ skip_indices: frozenset[int] = frozenset(),
+) -> FileResult:
+ """Stream one WARC, classify each response record, return its `FileResult`.
+
+ Owns its own fsspec input stream, its own per-WARC cache load/save
+ (when `--cache-dir` is set), and its own `--records-per-file-limit`
+ counter. Calls `predict_target` under `model_lock` since fasttext
+ makes no thread-safety guarantees; the lock cost is sub-ms
+ compared to the per-record extract cost.
+ """
+ rows: list[tuple[str, float, str, int]] = []
+ processed = 0
+ skipped_empty = 0
+ skipped_homepage = 0
+ skipped_resume = 0
+ extract_errors = 0
+ cache_hits = 0
+ cache_misses = 0
+ t_extract = 0.0
+ t_predict = 0.0
+ per_file_limit = args.records_per_file_limit
+ progress_every = getattr(args, "progress_every", 0) or 0
+
+ # Resume target semantics: --records-per-file-limit names the desired
+ # total in the final output (resumed + new). Subtract the skip-set size
+ # so we only process the remainder; skip the whole file when the target
+ # is already met (no S3 stream, no cache load, no extract).
+ if per_file_limit and skip_indices:
+ remaining = per_file_limit - len(skip_indices)
+ if remaining <= 0:
+ logger.info(
+ "Skipping %s — already at --records-per-file-limit (%d resumed).",
+ uri,
+ len(skip_indices),
+ )
+ return FileResult(
+ uri=uri,
+ rows=[],
+ processed=0,
+ skipped_empty=0,
+ skipped_homepage=0,
+ skipped_resume=len(skip_indices),
+ extract_errors=0,
+ cache_hits=0,
+ cache_misses=0,
+ t_extract=0.0,
+ t_predict=0.0,
+ )
+ per_file_limit = remaining
+
+ logger.info("Opening %s", uri)
+
+ input_storage_options = s3_storage_options(uri, args.anonymous_s3, args.s3_requester_pays)
+ cache_uri: str | None = None
+ cache_storage_options: dict[str, object] = {}
+ cache: dict[int, str] = {}
+ cache_dirty = False
+ if args.cache_dir:
+ cache_uri = cache_path_for_warc(uri, args.cache_dir)
+ cache_storage_options = s3_storage_options(
+ cache_uri, args.anonymous_s3, args.s3_requester_pays
+ )
+ cache = load_extraction_cache(cache_uri, cache_storage_options)
+ logger.info(
+ "Cache for %s: %s (%d entries preloaded)",
+ uri,
+ cache_uri,
+ len(cache),
+ )
+
+ try:
+ with fsspec.open(uri, "rb", **input_storage_options) as stream:
+ for record_index, record in enumerate(iter_response_records(stream)):
+ if record_index in skip_indices:
+ skipped_resume += 1
+ continue
+ url = record.rec_headers.get_header("WARC-Target-URI") or ""
+ if args.skip_homepages and is_homepage_url(url):
+ skipped_homepage += 1
+ continue
+
+ if record_index in cache:
+ text = cache[record_index]
+ cache_hits += 1
+ else:
+ html = record.content_stream().read()
+ t0 = time.perf_counter()
+ try:
+ text = extract_text(html)
+ except Exception as exc:
+ t_extract += time.perf_counter() - t0
+ extract_errors += 1
+ logger.debug(
+ "extract_text failed for %s record %d: %s: %s",
+ uri,
+ record_index,
+ type(exc).__name__,
+ exc,
+ )
+ continue
+ t_extract += time.perf_counter() - t0
+ cache_misses += 1
+ if args.cache_dir:
+ cache[record_index] = text
+ cache_dirty = True
+
+ cleaned = text.strip()
+ if not cleaned:
+ skipped_empty += 1
+ continue
+
+ t0 = time.perf_counter()
+ with model_lock:
+ score = predict_target(model, cleaned, args.target_label)
+ t_predict += time.perf_counter() - t0
+
+ rows.append((url, score, uri, record_index))
+ processed += 1
+
+ if progress_every and processed % progress_every == 0:
+ logger.info(
+ " %s: processed=%d cache_hits=%d cache_misses=%d "
+ "skipped_empty=%d skipped_homepage=%d",
+ uri,
+ processed,
+ cache_hits,
+ cache_misses,
+ skipped_empty,
+ skipped_homepage,
+ )
+
+ if per_file_limit and processed >= per_file_limit:
+ logger.info(
+ "Reached --records-per-file-limit %d for %s; moving to next file.",
+ per_file_limit,
+ uri,
+ )
+ break
+ finally:
+ if cache_uri is not None and cache_dirty:
+ save_extraction_cache(cache_uri, cache, cache_storage_options)
+ logger.info("Wrote cache %s (%d entries)", cache_uri, len(cache))
+ elif cache_uri is not None:
+ logger.info("Cache %s already complete; no write needed.", cache_uri)
+
+ return FileResult(
+ uri=uri,
+ rows=rows,
+ processed=processed,
+ skipped_empty=skipped_empty,
+ skipped_homepage=skipped_homepage,
+ skipped_resume=skipped_resume,
+ extract_errors=extract_errors,
+ cache_hits=cache_hits,
+ cache_misses=cache_misses,
+ t_extract=t_extract,
+ t_predict=t_predict,
+ )
+
+
+def _process_pool_initializer(model_repo: str, model_file: str) -> None:
+ """Per-worker setup for `ProcessPoolExecutor`: load the model once.
+
+ Also silences trafilatura's chatty per-page WARN/ERROR logs in this
+ worker. Each worker process has its own lxml + fasttext state, so a
+ heap-corruption abort here cannot tear down the parent or its peers.
+ """
+ global _WORKER_MODEL # noqa: PLW0603
+ _WORKER_MODEL = load_classifier(model_repo, model_file)
+ logging.getLogger("trafilatura").setLevel(logging.CRITICAL)
+
+
+def _process_pool_worker(
+ payload: tuple[str, argparse.Namespace, frozenset[int]],
+) -> FileResult:
+ """Top-level pickleable adapter that runs `process_one_file` in a worker."""
+ uri, args, skip_indices = payload
+ return process_one_file(uri, _WORKER_MODEL, _WORKER_LOCK, args, skip_indices)
+
+
+class ClassifyWarcCommand(BaseCommand):
+ """Classify WARC response records with a fasttext model."""
+
+ name = "classify-warc"
+ help = "Classify WARC response records with a HuggingFace-hosted fasttext model."
+
+ def add_arguments(self, parser: argparse.ArgumentParser) -> None:
+ """Register CLI flags for the classify-warc subcommand."""
+ parser.add_argument(
+ "--warc-paths",
+ nargs="+",
+ required=True,
+ metavar="URI",
+ help=(
+ "One or more WARC URIs or glob patterns "
+ "(e.g. 's3://commoncrawl/.../*.warc.gz'). Globs are expanded "
+ "via fsspec; quote them in the shell to prevent local expansion."
+ ),
+ )
+ parser.add_argument(
+ "--records-limit",
+ type=int,
+ default=0,
+ help=(
+ "Max number of response records to process across all selected "
+ "files (0 = unlimited)."
+ ),
+ )
+ parser.add_argument(
+ "--records-per-file-limit",
+ type=int,
+ default=0,
+ help=(
+ "Max number of response records per WARC file (0 = unlimited). "
+ "With --resume-from-output this is treated as the target total "
+ "per file (resumed + new); files already at the target are "
+ "skipped entirely. To process an additional N records on top of "
+ "a prior run, set this to `prior_limit + N`."
+ ),
+ )
+ parser.add_argument(
+ "--skip-homepages",
+ action="store_true",
+ help=(
+ "Skip response records whose URL is a site-root homepage "
+ "(empty/root path, no query, no fragment)."
+ ),
+ )
+ parser.add_argument(
+ "--files-limit",
+ type=int,
+ default=0,
+ help=(
+ "Max number of input WARC files after glob expansion and shuffle (0 = unlimited)."
+ ),
+ )
+ parser.add_argument(
+ "--shuffle-files",
+ action="store_true",
+ help="Shuffle the resolved file list (deterministic via --seed) before --files-limit.",
+ )
+ parser.add_argument(
+ "--seed",
+ type=int,
+ default=42,
+ help="Seed for --shuffle-files (default: 42).",
+ )
+ parser.add_argument(
+ "--model-repo",
+ default=DEFAULT_MODEL_REPO,
+ help=f"HuggingFace repo id of the fasttext model (default: {DEFAULT_MODEL_REPO}).",
+ )
+ parser.add_argument(
+ "--model-file",
+ default=DEFAULT_MODEL_FILE,
+ help=f"Filename of the .bin model inside the repo (default: {DEFAULT_MODEL_FILE}).",
+ )
+ parser.add_argument(
+ "--target-label",
+ default=DEFAULT_TARGET_LABEL,
+ help=(
+ "Label whose probability is written as 'prediction_score' "
+ f"(default: {DEFAULT_TARGET_LABEL})."
+ ),
+ )
+ parser.add_argument(
+ "--output",
+ default="-",
+ help=(
+ "Output CSV path. Use '-' for stdout, a local path, or any fsspec URL "
+ "(e.g. s3://bucket/key.csv). S3 outputs use the same --anonymous-s3 / "
+ "--s3-requester-pays options as inputs (default: -)."
+ ),
+ )
+ parser.add_argument(
+ "--cache-dir",
+ default=None,
+ metavar="URI",
+ help=(
+ "Optional cache directory for extracted text (local path or fsspec URI, "
+ "e.g. s3://bucket/prefix). When set, trafilatura output is cached per "
+ "input WARC as gzipped JSONL keyed by record ordinal. Honors "
+ "--anonymous-s3 / --s3-requester-pays for S3 access."
+ ),
+ )
+ parser.add_argument(
+ "--resume-from-output",
+ default=None,
+ metavar="PATH",
+ help=(
+ "Optional path/URI to a prior classify-warc output CSV. Records "
+ "matching `(warc_filename, warc_record_index)` from that file are "
+ "skipped on this run; the new --output gets only the missing rows. "
+ "Concatenate the two CSVs (drop the second header) to get a "
+ "complete result."
+ ),
+ )
+ parser.add_argument(
+ "--workers",
+ type=int,
+ default=1,
+ help=(
+ "Number of WARC files processed concurrently (default: 1). "
+ "Incompatible with --records-limit; use --records-per-file-limit "
+ "for a per-file cap."
+ ),
+ )
+ parser.add_argument(
+ "--workers-mode",
+ choices=["thread", "process"],
+ default="thread",
+ help=(
+ "How to parallelise across files when --workers > 1. 'thread' "
+ "(default) shares one loaded model in this process; cheap, but "
+ "trafilatura/lxml is called concurrently from multiple threads "
+ "and can trigger glibc heap-corruption aborts on adversarial "
+ "HTML. 'process' loads a separate model per worker process "
+ "(~4 GB extra RAM each) and fully isolates lxml + fasttext C "
+ "state — switch to this if you see 'corrupted size vs. "
+ "prev_size' or similar aborts under thread mode. The sidecar "
+ "summary's trafilatura counts are 0 in process mode (workers "
+ "silence the logger locally and don't report counts back)."
+ ),
+ )
+ parser.add_argument(
+ "--max-pool-restarts",
+ type=int,
+ default=10,
+ metavar="N",
+ help=(
+ "In --workers-mode process, restart the pool up to N times when "
+ "a worker dies (BrokenProcessPool). Each restart drops the "
+ "suspected culprit file and continues with the remaining ones "
+ "(re-run with --resume-from-output later to retry the dropped "
+ "files). 0 = unlimited; default 10."
+ ),
+ )
+ parser.add_argument(
+ "--progress-every",
+ type=int,
+ default=1000,
+ metavar="N",
+ help=(
+ "Log a per-file progress heartbeat every N classified records "
+ "(default: 1000; 0 disables). At a typical 1000 docs / 38s "
+ "throughput this is roughly one line per ~40s of CPU work."
+ ),
+ )
+ parser.add_argument(
+ "--anonymous-s3",
+ action="store_true",
+ help="Force anonymous S3 access (only for buckets that allow it; not Common Crawl).",
+ )
+ parser.add_argument(
+ "--s3-requester-pays",
+ action="store_true",
+ help=(
+ "Set RequestPayer=requester for S3 access. Only needed for genuinely "
+ "Requester Pays buckets — Common Crawl is NOT one (it just requires "
+ "signed access, picked up from the default AWS credential chain)."
+ ),
+ )
+
+ def run(self, args: argparse.Namespace) -> int:
+ """Stream the WARCs, classify each response, and write CSV output."""
+ logger.info("Running classify-warc")
+
+ if args.workers > 1 and args.records_limit > 0:
+ logger.error(
+ "--records-limit cannot be combined with --workers > 1; "
+ "use --records-per-file-limit (works in parallel) or set --workers 1."
+ )
+ return 2
+
+ output_storage_options = s3_storage_options(
+ args.output, args.anonymous_s3, args.s3_requester_pays
+ )
+ summary_uri: str | None = None
+ summary_storage_options: dict[str, object] = {}
+ if args.output != "-":
+ summary_uri = summary_path_for(args.output)
+ summary_storage_options = s3_storage_options(
+ summary_uri, args.anonymous_s3, args.s3_requester_pays
+ )
+ for path, opts in (
+ (args.output, output_storage_options),
+ (summary_uri, summary_storage_options),
+ ):
+ if output_exists(path, opts):
+ logger.error(
+ "Output already exists: %s. Refusing to overwrite; "
+ "delete the file(s) or pick a fresh --output path.",
+ path,
+ )
+ return 2
+
+ logger.info("Resolving WARC paths: %s", args.warc_paths)
+
+ resolved = resolve_warc_paths(
+ args.warc_paths,
+ anonymous=args.anonymous_s3,
+ requester_pays=args.s3_requester_pays,
+ shuffle=args.shuffle_files,
+ seed=args.seed,
+ files_limit=args.files_limit,
+ )
+ logger.info(
+ "Resolved %d WARC files (shuffle=%s files_limit=%d)",
+ len(resolved),
+ args.shuffle_files,
+ args.files_limit,
+ )
+ for uri in resolved:
+ logger.debug(" selected %s", uri)
+
+ if not resolved:
+ logger.warning("No WARC files matched --warc-paths; nothing to classify.")
+ log_summary([])
+ return 0
+
+ skip_by_warc: dict[str, frozenset[int]] = {}
+ if args.resume_from_output:
+ resume_storage_options = s3_storage_options(
+ args.resume_from_output, args.anonymous_s3, args.s3_requester_pays
+ )
+ logger.info("Loading resume skip-set from %s", args.resume_from_output)
+ skip_by_warc = load_resume_skipset(args.resume_from_output, resume_storage_options)
+ total_skips = sum(len(v) for v in skip_by_warc.values())
+ logger.info(
+ "Resume skip-set: %d records across %d distinct WARCs.",
+ total_skips,
+ len(skip_by_warc),
+ )
+
+ use_process_pool = args.workers > 1 and args.workers_mode == "process"
+ if use_process_pool:
+ logger.info(
+ "Worker mode 'process'; deferring model load to each of "
+ "%d worker processes (model: %s/%s).",
+ args.workers,
+ args.model_repo,
+ args.model_file,
+ )
+ model = None
+ model_lock = threading.Lock()
+ else:
+ logger.info("Loading model %s/%s", args.model_repo, args.model_file)
+ model = load_classifier(args.model_repo, args.model_file)
+ model_lock = threading.Lock()
+
+ # Silence trafilatura's per-page WARN/ERROR noise (empty / non-HTML /
+ # bad-encoding pages) — these outcomes already land in `skipped_empty`.
+ # Count the suppressed records and report the totals at the end.
+ traf_counter = TrafilaturaLogCounter()
+ traf_logger = logging.getLogger("trafilatura")
+ traf_logger.addHandler(traf_counter)
+ traf_prev_propagate = traf_logger.propagate
+ traf_logger.propagate = False
+
+ scores: list[float] = []
+ processed = 0
+ skipped_empty = 0
+ skipped_homepage = 0
+ skipped_resume_total = 0
+ extract_errors_total = 0
+ files_done = 0
+ files_total = len(resolved)
+ limit = args.records_limit
+ t_extract_total = 0.0
+ t_predict_total = 0.0
+ cache_hits_total = 0
+ cache_misses_total = 0
+
+ logger.info("Writing output to %s (workers=%d)", args.output, args.workers)
+ if summary_uri:
+ logger.info("Summary will be written to %s", summary_uri)
+
+ started_at = _dt.datetime.now(_dt.UTC).isoformat()
+ t_processing_start = time.perf_counter()
+ with open_output_sink(args.output, output_storage_options) as sink:
+ writer = csv.writer(sink)
+ writer.writerow(["URL", "prediction_score", "warc_filename", "warc_record_index"])
+
+ def _aggregate(result: FileResult) -> None:
+ """Write `result` rows to the CSV and fold its counters into the totals."""
+ nonlocal processed, skipped_empty, skipped_homepage
+ nonlocal skipped_resume_total, extract_errors_total
+ nonlocal cache_hits_total, cache_misses_total
+ nonlocal t_extract_total, t_predict_total, files_done
+ for url, score, warc_filename, record_index in result.rows:
+ writer.writerow([url, f"{score:.6f}", warc_filename, record_index])
+ scores.append(score)
+ if sink is sys.stdout:
+ sink.flush()
+ processed += result.processed
+ skipped_empty += result.skipped_empty
+ skipped_homepage += result.skipped_homepage
+ skipped_resume_total += result.skipped_resume
+ extract_errors_total += result.extract_errors
+ cache_hits_total += result.cache_hits
+ cache_misses_total += result.cache_misses
+ t_extract_total += result.t_extract
+ t_predict_total += result.t_predict
+ files_done += 1
+ logger.info(
+ "Finished %s — processed=%d skipped_empty=%d "
+ "skipped_homepage=%d skipped_resume=%d extract_errors=%d",
+ result.uri,
+ processed,
+ skipped_empty,
+ skipped_homepage,
+ skipped_resume_total,
+ extract_errors_total,
+ )
+ elapsed = time.perf_counter() - t_processing_start
+ mean_per_file = elapsed / files_done
+ eta = mean_per_file * (files_total - files_done)
+ logger.info(
+ "progress — files=%d/%d elapsed=%s eta=~%s",
+ files_done,
+ files_total,
+ format_duration(elapsed),
+ format_duration(eta),
+ )
+
+ empty_skip: frozenset[int] = frozenset()
+ if args.workers == 1:
+ for uri in resolved:
+ _aggregate(
+ process_one_file(
+ uri, model, model_lock, args, skip_by_warc.get(uri, empty_skip)
+ )
+ )
+ if limit and processed >= limit:
+ logger.info("Reached --records-limit %d; stopping.", limit)
+ break
+ elif args.workers_mode == "process":
+ remaining_uris = list(resolved)
+ restarts = 0
+ max_restarts = args.max_pool_restarts
+ while remaining_uris:
+ completed_in_pool = 0
+ try:
+ with ProcessPoolExecutor(
+ max_workers=args.workers,
+ initializer=_process_pool_initializer,
+ initargs=(args.model_repo, args.model_file),
+ ) as pool:
+ payloads = [
+ (u, args, skip_by_warc.get(u, empty_skip)) for u in remaining_uris
+ ]
+ for result in pool.map(_process_pool_worker, payloads):
+ _aggregate(result)
+ completed_in_pool += 1
+ break # all remaining_uris finished
+ except BrokenProcessPool:
+ suspect_idx = completed_in_pool
+ if suspect_idx >= len(remaining_uris):
+ logger.error(
+ "Process pool died after consuming all results; "
+ "aborting (cannot identify a culprit to drop)."
+ )
+ raise
+ suspect = remaining_uris[suspect_idx]
+ restarts += 1
+ if max_restarts and restarts > max_restarts:
+ logger.error(
+ "Process pool died %d times (limit %d); aborting. "
+ "Last suspect: %s. Use --resume-from-output to "
+ "continue from the partial output.",
+ restarts,
+ max_restarts,
+ suspect,
+ )
+ raise
+ logger.error(
+ "Process pool worker died after %d files in this pool; "
+ "dropping suspect %s and restarting (restart %d/%s). "
+ "The dropped file will be missing from this output; "
+ "rerun with --resume-from-output to retry it.",
+ completed_in_pool,
+ suspect,
+ restarts,
+ "∞" if max_restarts == 0 else str(max_restarts),
+ )
+ remaining_uris = remaining_uris[suspect_idx + 1 :]
+ else:
+ with ThreadPoolExecutor(max_workers=args.workers) as pool:
+ for result in pool.map(
+ lambda u: process_one_file(
+ u, model, model_lock, args, skip_by_warc.get(u, empty_skip)
+ ),
+ resolved,
+ ):
+ _aggregate(result)
+
+ t_processing = time.perf_counter() - t_processing_start
+
+ logger.info(
+ "Total response records classified: %d "
+ "(skipped %d empty extractions, %d homepages, %d resumed, %d extract errors)",
+ processed,
+ skipped_empty,
+ skipped_homepage,
+ skipped_resume_total,
+ extract_errors_total,
+ )
+ if args.cache_dir:
+ logger.info(
+ "Extraction cache totals — hits=%d misses=%d",
+ cache_hits_total,
+ cache_misses_total,
+ )
+ log_summary(scores)
+ log_timing(processed, t_processing, t_extract_total, t_predict_total)
+
+ if traf_counter.warnings or traf_counter.errors:
+ logger.info(
+ "Suppressed trafilatura logs: warnings=%d errors=%d",
+ traf_counter.warnings,
+ traf_counter.errors,
+ )
+
+ if summary_uri:
+ finished_at = _dt.datetime.now(_dt.UTC).isoformat()
+ write_run_summary(
+ summary_uri,
+ summary_storage_options,
+ args=args,
+ resolved_count=len(resolved),
+ scores=scores,
+ processed=processed,
+ skipped_empty=skipped_empty,
+ skipped_homepage=skipped_homepage,
+ skipped_resume=skipped_resume_total,
+ extract_errors=extract_errors_total,
+ cache_hits=cache_hits_total,
+ cache_misses=cache_misses_total,
+ trafilatura_warnings=traf_counter.warnings,
+ trafilatura_errors=traf_counter.errors,
+ t_processing=t_processing,
+ t_extract_total=t_extract_total,
+ t_predict_total=t_predict_total,
+ started_at=started_at,
+ finished_at=finished_at,
+ )
+ logger.info("Wrote summary %s", summary_uri)
+
+ traf_logger.removeHandler(traf_counter)
+ traf_logger.propagate = traf_prev_propagate
+
+ return 0
diff --git a/src/ccoa/extraction/__init__.py b/src/ccoa/extraction/__init__.py
new file mode 100644
index 0000000..51fb0da
--- /dev/null
+++ b/src/ccoa/extraction/__init__.py
@@ -0,0 +1 @@
+"""Plain-text extraction from WARC HTML payloads, plus per-WARC cache."""
diff --git a/src/ccoa/extraction/cache.py b/src/ccoa/extraction/cache.py
new file mode 100644
index 0000000..6bf139e
--- /dev/null
+++ b/src/ccoa/extraction/cache.py
@@ -0,0 +1,110 @@
+"""Per-WARC text extraction cache.
+
+The `classify-warc` command pays most of its wall-clock cost inside
+`trafilatura.extract`. When the same WARC files are processed more than
+once (different model, different label, parameter sweeps, retries), this
+module lets the extraction step be skipped for previously-seen records.
+
+Cache layout
+------------
+One file per input WARC, gzipped JSONL. Each line is
+`{"index": N, "text": "..."}` where `index` is the 0-based ordinal of the
+response record within the WARC (i.e. the index over the stream that
+`iter_response_records` yields).
+
+Cache files live under a user-supplied `--cache-dir`, which can be a
+local path or any fsspec URI (e.g. ``s3://bucket/prefix``). The input
+URI is mapped to a deterministic path under that directory using
+`cache_path_for_warc`.
+"""
+
+from __future__ import annotations
+
+import gzip
+import json
+import logging
+import posixpath
+
+import fsspec
+
+logger = logging.getLogger(__name__)
+
+
+def cache_path_for_warc(warc_uri: str, cache_dir: str) -> str:
+ """Return the cache file path for `warc_uri` under `cache_dir`.
+
+ The scheme of `warc_uri` is used as the first path segment so caches
+ for different sources never collide (`local/...` vs `s3/bucket/...`).
+ `..` segments are rejected to prevent escaping `cache_dir`.
+ """
+ if "://" in warc_uri:
+ scheme, _, remainder = warc_uri.partition("://")
+ else:
+ scheme, remainder = "local", warc_uri
+
+ if not scheme:
+ raise ValueError(f"Empty scheme in WARC URI: {warc_uri!r}")
+
+ remainder = remainder.replace("\\", "/")
+ parts: list[str] = []
+ for segment in remainder.split("/"):
+ if segment in ("", "."):
+ continue
+ if segment == "..":
+ raise ValueError(
+ f"Parent-directory segment '..' is not allowed in WARC URI: {warc_uri!r}"
+ )
+ parts.append(segment)
+
+ if not parts:
+ raise ValueError(f"WARC URI has no path component: {warc_uri!r}")
+
+ relative = posixpath.join(scheme, *parts) + ".jsonl.gz"
+ return cache_dir.rstrip("/") + "/" + relative
+
+
+def load_extraction_cache(cache_uri: str, storage_options: dict[str, object]) -> dict[int, str]:
+ """Load `{record_index: text}` from a JSONL.gz cache file.
+
+ Returns an empty dict when the file is missing. On any read or parse
+ error, logs a warning and returns an empty dict — a broken cache must
+ not break the pipeline.
+ """
+ try:
+ with fsspec.open(cache_uri, "rb", **storage_options) as raw:
+ with gzip.GzipFile(fileobj=raw, mode="rb") as gz:
+ entries: dict[int, str] = {}
+ for line in gz:
+ obj = json.loads(line)
+ entries[int(obj["index"])] = obj["text"]
+ return entries
+ except FileNotFoundError:
+ return {}
+ except Exception as exc:
+ logger.warning(
+ "Could not read extraction cache %s (%s: %s); treating as empty.",
+ cache_uri,
+ type(exc).__name__,
+ exc,
+ )
+ return {}
+
+
+def save_extraction_cache(
+ cache_uri: str, entries: dict[int, str], storage_options: dict[str, object]
+) -> None:
+ """Write `entries` as gzipped JSONL to `cache_uri`. No-op if empty."""
+ if not entries:
+ return
+
+ with fsspec.open(cache_uri, "wb", **storage_options) as raw:
+ with gzip.GzipFile(fileobj=raw, mode="wb") as gz:
+ for index in sorted(entries):
+ line = (
+ json.dumps(
+ {"index": index, "text": entries[index]},
+ ensure_ascii=False,
+ )
+ + "\n"
+ )
+ gz.write(line.encode("utf-8"))
diff --git a/src/ccoa/extraction/text.py b/src/ccoa/extraction/text.py
new file mode 100644
index 0000000..71a38d9
--- /dev/null
+++ b/src/ccoa/extraction/text.py
@@ -0,0 +1,57 @@
+"""Plain-text extraction from raw HTML using trafilatura."""
+
+from __future__ import annotations
+
+import logging
+
+import trafilatura
+
+
+def extract_text(
+ html: bytes,
+ favour_precision: bool = True,
+ include_images: bool = False,
+ deduplicate: bool = True,
+ **kwargs,
+) -> str:
+ """Extract plain text from raw HTML bytes using trafilatura.
+
+ Settings like FineWeb: https://github.com/huggingface/datatrove/blob/main/src/datatrove/pipeline/extractors/trafilatura.py
+ """
+ text = trafilatura.extract(
+ html,
+ favor_precision=favour_precision,
+ include_comments=False,
+ deduplicate=deduplicate,
+ include_images=include_images,
+ **kwargs,
+ )
+ return text or ""
+
+
+class TrafilaturaLogCounter(logging.Handler):
+ """Counts trafilatura log records by severity instead of letting them propagate.
+
+ Trafilatura is chatty on real Common Crawl content (empty payloads,
+ misdetected encodings, non-HTML mislabelled as HTML). Callers that
+ already treat those outcomes as "skipped" want the per-page log lines
+ suppressed. Attaching an instance of this handler to the
+ `trafilatura` logger with `propagate=False` swallows the records and
+ keeps tallies (`warnings`, `errors`) the caller can report.
+
+ The `logging.Handler` parent class wraps `emit()` in `self.acquire()`
+ / `self.release()`, so the counters are safe under thread pools.
+ """
+
+ def __init__(self) -> None:
+ """Initialise both severity counters to zero."""
+ super().__init__()
+ self.warnings = 0
+ self.errors = 0
+
+ def emit(self, record: logging.LogRecord) -> None:
+ """Increment the matching counter; never re-emit the record."""
+ if record.levelno >= logging.ERROR:
+ self.errors += 1
+ else:
+ self.warnings += 1
diff --git a/src/ccoa/utils/__init__.py b/src/ccoa/utils/__init__.py
new file mode 100644
index 0000000..172e324
--- /dev/null
+++ b/src/ccoa/utils/__init__.py
@@ -0,0 +1 @@
+"""Cross-cutting utilities (fs paths, WARC iteration, reporting helpers)."""
diff --git a/src/ccoa/utils/fs/__init__.py b/src/ccoa/utils/fs/__init__.py
new file mode 100644
index 0000000..ecc793c
--- /dev/null
+++ b/src/ccoa/utils/fs/__init__.py
@@ -0,0 +1 @@
+"""fsspec-backed helpers for resolving inputs, opening outputs, and S3 options."""
diff --git a/src/ccoa/utils/fs/paths.py b/src/ccoa/utils/fs/paths.py
new file mode 100644
index 0000000..b30a36e
--- /dev/null
+++ b/src/ccoa/utils/fs/paths.py
@@ -0,0 +1,112 @@
+"""fsspec path/URI utilities shared by the CLI commands."""
+
+from __future__ import annotations
+
+import contextlib
+import os
+import random
+import sys
+
+import fsspec
+
+
+def s3_storage_options(uri: str, anonymous: bool, requester_pays: bool) -> dict[str, object]:
+ """Build the kwargs to pass to fsspec.open for an `s3://` URI."""
+ if not uri.startswith("s3://"):
+ return {}
+ opts: dict[str, object] = {}
+ if anonymous:
+ opts["anon"] = True
+ if requester_pays:
+ opts["requester_pays"] = True
+ return opts
+
+
+def summary_path_for(output: str) -> str:
+ """Return the sidecar summary path for an output file path or fsspec URL.
+
+ Inserts `.summary` before the last extension. Examples:
+ `foo.csv` -> `foo.summary.csv`
+ `data/out.tsv` -> `data/out.summary.tsv`
+ `s3://bucket/key.csv` -> `s3://bucket/key.summary.csv`
+ `foo` -> `foo.summary`
+ """
+ root, ext = os.path.splitext(output)
+ return f"{root}.summary{ext}"
+
+
+def output_exists(uri: str, storage_options: dict[str, object]) -> bool:
+ """Return True if `uri` already exists (works for local paths and fsspec URLs)."""
+ fs, fs_path = fsspec.url_to_fs(uri, **storage_options)
+ return bool(fs.exists(fs_path))
+
+
+def _is_glob(pattern: str) -> bool:
+ """Return True if `pattern` contains any fsspec glob metacharacter."""
+ return any(ch in pattern for ch in "*?[")
+
+
+def resolve_warc_paths(
+ patterns: list[str],
+ *,
+ anonymous: bool,
+ requester_pays: bool,
+ shuffle: bool,
+ seed: int,
+ files_limit: int,
+) -> list[str]:
+ """Expand glob patterns to a sorted (optionally shuffled, limited) URI list.
+
+ Each pattern is either a literal URI (passes through) or a glob
+ pattern containing `*`, `?`, or `[`. Globs are resolved via
+ `fsspec.url_to_fs` + `fs.glob`, then re-stamped with their scheme
+ via `fs.unstrip_protocol`. The combined matches are de-duplicated
+ and sorted lexicographically; when `shuffle=True` they are then
+ permuted by `random.Random(seed)`; finally `files_limit > 0`
+ truncates to that many URIs.
+ """
+ resolved: list[str] = []
+ for pattern in patterns:
+ if _is_glob(pattern):
+ opts = s3_storage_options(pattern, anonymous, requester_pays)
+ fs, _ = fsspec.url_to_fs(pattern, **opts)
+ has_scheme = "://" in pattern
+ for match in fs.glob(pattern):
+ resolved.append(fs.unstrip_protocol(match) if has_scheme else match)
+ else:
+ resolved.append(pattern)
+
+ seen: set[str] = set()
+ deduped: list[str] = []
+ for uri in resolved:
+ if uri not in seen:
+ seen.add(uri)
+ deduped.append(uri)
+ deduped.sort()
+
+ if shuffle:
+ random.Random(seed).shuffle(deduped)
+ if files_limit > 0:
+ deduped = deduped[:files_limit]
+ return deduped
+
+
+@contextlib.contextmanager
+def open_output_sink(output: str, storage_options: dict[str, object]):
+ """Yield a text-mode file-like for the output.
+
+ `"-"` yields `sys.stdout` without closing it. Any other path is
+ opened via `fsspec.open`, so local paths, `s3://`, and any
+ other fsspec-supported URL all work.
+ """
+ if output == "-":
+ yield sys.stdout
+ return
+ with fsspec.open(
+ output,
+ mode="w",
+ newline="",
+ encoding="utf-8",
+ **storage_options,
+ ) as sink:
+ yield sink
diff --git a/src/ccoa/utils/reporting/__init__.py b/src/ccoa/utils/reporting/__init__.py
new file mode 100644
index 0000000..9d62283
--- /dev/null
+++ b/src/ccoa/utils/reporting/__init__.py
@@ -0,0 +1 @@
+"""Score statistics, run timing, and sidecar-summary CSV writer."""
diff --git a/src/ccoa/utils/reporting/summary.py b/src/ccoa/utils/reporting/summary.py
new file mode 100644
index 0000000..8aafb00
--- /dev/null
+++ b/src/ccoa/utils/reporting/summary.py
@@ -0,0 +1,235 @@
+"""Score statistics, timing helpers, and the sidecar-summary CSV writer."""
+
+from __future__ import annotations
+
+import argparse
+import csv
+import logging
+import shlex
+import statistics
+import sys
+
+import fsspec
+
+logger = logging.getLogger(__name__)
+
+
+def format_seconds(seconds: float) -> str:
+ """Format a duration as `Xs` (>= 1s) or `Yms` (< 1s)."""
+ if seconds >= 1:
+ return f"{seconds:.3f}s"
+ return f"{seconds * 1000:.2f}ms"
+
+
+def format_duration(seconds: float) -> str:
+ """Format a longer duration as h/m/s (e.g. `1h 23m 45s`, `23m 45s`, `45.3s`)."""
+ if seconds < 0:
+ seconds = 0.0
+ if seconds >= 3600:
+ h, rem = divmod(int(seconds), 3600)
+ m, s = divmod(rem, 60)
+ return f"{h}h {m}m {s}s"
+ if seconds >= 60:
+ m, s = divmod(int(seconds), 60)
+ return f"{m}m {s}s"
+ return f"{seconds:.1f}s"
+
+
+def log_timing(
+ processed: int,
+ t_processing: float,
+ t_extract_total: float,
+ t_predict_total: float,
+) -> None:
+ """Log a one-line summary of wall-clock time, throughput, and per-step costs."""
+ if processed == 0:
+ logger.info("runtime — processed=0; no timing data to report.")
+ return
+
+ docs_per_sec = processed / t_processing if t_processing > 0 else float("inf")
+ logger.info(
+ "runtime — processed=%d total=%s throughput=%.2f docs/s mean_per_doc=%s "
+ "extract_total=%s extract_mean=%s predict_total=%s predict_mean=%s",
+ processed,
+ format_seconds(t_processing),
+ docs_per_sec,
+ format_seconds(t_processing / processed),
+ format_seconds(t_extract_total),
+ format_seconds(t_extract_total / processed),
+ format_seconds(t_predict_total),
+ format_seconds(t_predict_total / processed),
+ )
+
+
+def format_score(value: float | str) -> str:
+ """Format a score as a fixed-precision float, passing through `"n/a"`."""
+ if isinstance(value, str):
+ return value
+ return f"{value:.6f}"
+
+
+def compute_score_stats(scores: list[float]) -> dict[str, float | int | str]:
+ """Return summary statistics over `scores`.
+
+ Keys: `count`, `min`, `max`, `mean`, `median`, `stdev`, plus percentiles
+ `p10/p25/p50/p75/p90/p95/p99`. `stdev` and percentiles are the string
+ `"n/a"` when `count < 2`. An empty list returns `{"count": 0}`.
+ """
+ if not scores:
+ return {"count": 0}
+
+ count = len(scores)
+ stats: dict[str, float | int | str] = {
+ "count": count,
+ "min": min(scores),
+ "max": max(scores),
+ "mean": statistics.fmean(scores),
+ "median": statistics.median(scores),
+ }
+ if count >= 2:
+ quantiles = statistics.quantiles(scores, n=100, method="inclusive")
+ stats["stdev"] = statistics.stdev(scores)
+ stats["p10"] = quantiles[9]
+ stats["p25"] = quantiles[24]
+ stats["p50"] = quantiles[49]
+ stats["p75"] = quantiles[74]
+ stats["p90"] = quantiles[89]
+ stats["p95"] = quantiles[94]
+ stats["p99"] = quantiles[98]
+ else:
+ stats["stdev"] = "n/a"
+ for key in ("p10", "p25", "p50", "p75", "p90", "p95", "p99"):
+ stats[key] = "n/a"
+ return stats
+
+
+def log_summary(scores: list[float]) -> None:
+ """Log a one-line summary of the score distribution (count, percentiles, etc.)."""
+ if not scores:
+ logger.warning("No records classified.")
+ return
+
+ stats = compute_score_stats(scores)
+ logger.info(
+ "score stats — count=%d min=%s p10=%s p25=%s p50=%s p75=%s p90=%s p95=%s p99=%s max=%s mean=%s median=%s stdev=%s",
+ stats["count"],
+ format_score(stats["min"]),
+ format_score(stats["p10"]),
+ format_score(stats["p25"]),
+ format_score(stats["p50"]),
+ format_score(stats["p75"]),
+ format_score(stats["p90"]),
+ format_score(stats["p95"]),
+ format_score(stats["p99"]),
+ format_score(stats["max"]),
+ format_score(stats["mean"]),
+ format_score(stats["median"]),
+ format_score(stats["stdev"]),
+ )
+
+
+def write_run_summary(
+ summary_uri: str,
+ storage_options: dict[str, object],
+ *,
+ args: argparse.Namespace,
+ resolved_count: int,
+ scores: list[float],
+ processed: int,
+ skipped_empty: int,
+ skipped_homepage: int,
+ skipped_resume: int,
+ extract_errors: int,
+ cache_hits: int,
+ cache_misses: int,
+ trafilatura_warnings: int,
+ trafilatura_errors: int,
+ t_processing: float,
+ t_extract_total: float,
+ t_predict_total: float,
+ started_at: str,
+ finished_at: str,
+) -> None:
+ """Write a sidecar two-column CSV (`key,value`) capturing inputs + results.
+
+ Sections (by key prefix): `run.*` (cli + timestamps), `arg.*` (every CLI flag),
+ `input.*` (resolved files), `count.*` (record counters), `score.*` (stats from
+ `compute_score_stats`), `time.*` (wall-clock / extract / predict). Designed to
+ be parsed back with `csv.reader` or `pandas.read_csv`.
+ """
+ rows: list[tuple[str, str]] = []
+
+ rows.append(("run.cli", shlex.join(sys.argv)))
+ rows.append(("run.started_at", started_at))
+ rows.append(("run.finished_at", finished_at))
+
+ for key in sorted(vars(args)):
+ rows.append((f"arg.{key}", _format_arg_value(getattr(args, key))))
+
+ rows.append(("input.resolved_count", str(resolved_count)))
+
+ rows.append(("count.processed", str(processed)))
+ rows.append(("count.skipped_empty", str(skipped_empty)))
+ rows.append(("count.skipped_homepage", str(skipped_homepage)))
+ rows.append(("count.skipped_resume", str(skipped_resume)))
+ rows.append(("count.extract_errors", str(extract_errors)))
+ rows.append(("count.cache_hits", str(cache_hits)))
+ rows.append(("count.cache_misses", str(cache_misses)))
+ rows.append(("count.trafilatura_warnings", str(trafilatura_warnings)))
+ rows.append(("count.trafilatura_errors", str(trafilatura_errors)))
+
+ stats = compute_score_stats(scores)
+ for key in (
+ "count",
+ "min",
+ "p10",
+ "p25",
+ "p50",
+ "p75",
+ "p90",
+ "p95",
+ "p99",
+ "max",
+ "mean",
+ "median",
+ "stdev",
+ ):
+ if key in stats:
+ value = stats[key]
+ rows.append((f"score.{key}", format_score(value) if key != "count" else str(value)))
+
+ rows.append(("time.total_seconds", f"{t_processing:.6f}"))
+ rows.append(("time.extract_total_seconds", f"{t_extract_total:.6f}"))
+ rows.append(("time.predict_total_seconds", f"{t_predict_total:.6f}"))
+ if processed > 0:
+ rows.append(
+ (
+ "time.throughput_docs_per_sec",
+ f"{processed / t_processing:.6f}" if t_processing > 0 else "inf",
+ )
+ )
+ rows.append(("time.extract_mean_seconds", f"{t_extract_total / processed:.6f}"))
+ rows.append(("time.predict_mean_seconds", f"{t_predict_total / processed:.6f}"))
+
+ with fsspec.open(
+ summary_uri,
+ mode="w",
+ newline="",
+ encoding="utf-8",
+ **storage_options,
+ ) as sink:
+ writer = csv.writer(sink)
+ writer.writerow(["key", "value"])
+ for key, value in rows:
+ writer.writerow([key, value])
+
+
+def _format_arg_value(value: object) -> str:
+ """Serialise an argparse value for the summary CSV (lists → `;`-joined)."""
+ if value is None:
+ return ""
+ if isinstance(value, bool | int | float):
+ return str(value)
+ if isinstance(value, list | tuple):
+ return ";".join(_format_arg_value(item) for item in value)
+ return str(value)
diff --git a/src/ccoa/utils/warc/__init__.py b/src/ccoa/utils/warc/__init__.py
new file mode 100644
index 0000000..1eb5bce
--- /dev/null
+++ b/src/ccoa/utils/warc/__init__.py
@@ -0,0 +1 @@
+"""WARC streaming helpers (reader + URL-level filters)."""
diff --git a/src/ccoa/utils/warc/reader.py b/src/ccoa/utils/warc/reader.py
new file mode 100644
index 0000000..5e72393
--- /dev/null
+++ b/src/ccoa/utils/warc/reader.py
@@ -0,0 +1,14 @@
+"""Stream WARC files and yield response records."""
+
+from __future__ import annotations
+
+from collections.abc import Iterator
+
+from warcio.archiveiterator import ArchiveIterator
+
+
+def iter_response_records(stream) -> Iterator:
+ """Yield `response` records from a WARC byte stream."""
+ for record in ArchiveIterator(stream):
+ if record.rec_type == "response":
+ yield record
diff --git a/src/ccoa/utils/warc/urls.py b/src/ccoa/utils/warc/urls.py
new file mode 100644
index 0000000..f8f3158
--- /dev/null
+++ b/src/ccoa/utils/warc/urls.py
@@ -0,0 +1,11 @@
+"""URL-level filters for WARC records."""
+
+from __future__ import annotations
+
+from urllib.parse import urlparse
+
+
+def is_homepage_url(url: str) -> bool:
+ """Return True if `url` parses to a site-root URL (no path, no query, no fragment)."""
+ parsed = urlparse(url)
+ return parsed.path in ("", "/") and not parsed.query and not parsed.fragment
diff --git a/tests/__init__.py b/tests/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/tests/conftest.py b/tests/conftest.py
new file mode 100644
index 0000000..38ca36c
--- /dev/null
+++ b/tests/conftest.py
@@ -0,0 +1,31 @@
+"""Shared pytest fixtures + options for the test suite."""
+
+from __future__ import annotations
+
+import pytest
+
+
+def pytest_addoption(parser: pytest.Parser) -> None:
+ """Register the `--run-real` CLI flag that enables `real_model`-marked tests."""
+ parser.addoption(
+ "--run-real",
+ action="store_true",
+ default=False,
+ help=(
+ "Run tests marked `real_model` (downloads a real fasttext model "
+ "from HuggingFace; takes a few minutes on first run)."
+ ),
+ )
+
+
+def pytest_collection_modifyitems(
+ config: pytest.Config,
+ items: list[pytest.Item],
+) -> None:
+ """Skip `real_model`-marked tests unless `--run-real` is passed."""
+ if config.getoption("--run-real"):
+ return
+ skip_real = pytest.mark.skip(reason="needs --run-real to enable the real-model end-to-end test")
+ for item in items:
+ if "real_model" in item.keywords:
+ item.add_marker(skip_real)
diff --git a/tests/test_classify_warc.py b/tests/test_classify_warc.py
new file mode 100644
index 0000000..27f5226
--- /dev/null
+++ b/tests/test_classify_warc.py
@@ -0,0 +1,575 @@
+from __future__ import annotations
+
+import argparse
+import csv
+import gzip
+import logging
+import sys
+
+import pytest
+
+from ccoa.classifier.fasttext import FASTTEXT_MAX_INPUT_CHARS, clean_for_fasttext
+from ccoa.commands.classify_warc import ClassifyWarcCommand, load_resume_skipset
+from ccoa.extraction.cache import (
+ cache_path_for_warc,
+ load_extraction_cache,
+ save_extraction_cache,
+)
+from ccoa.extraction.text import TrafilaturaLogCounter
+from ccoa.utils.fs.paths import open_output_sink, resolve_warc_paths, summary_path_for
+from ccoa.utils.reporting.summary import (
+ compute_score_stats,
+ format_duration,
+ log_summary,
+ log_timing,
+ write_run_summary,
+)
+from ccoa.utils.warc.urls import is_homepage_url
+
+
+def _make_warcs(tmp_path, names):
+ """Create empty files named `names` under `tmp_path` and return their str paths."""
+ paths = []
+ for name in names:
+ p = tmp_path / name
+ p.write_bytes(b"")
+ paths.append(str(p))
+ return paths
+
+
+def test_summary_handles_empty(caplog):
+ """An empty score list logs a single warning and returns cleanly."""
+ caplog.set_level(logging.WARNING, logger="ccoa.utils.reporting.summary")
+ log_summary([])
+ warnings = [r for r in caplog.records if r.levelno == logging.WARNING]
+ assert len(warnings) == 1
+ assert "No records classified" in warnings[0].getMessage()
+
+
+def test_summary_computes_stats(caplog):
+ """A non-empty score list emits an INFO line containing count/min/max/mean."""
+ caplog.set_level(logging.INFO, logger="ccoa.utils.reporting.summary")
+ log_summary([0.1, 0.5, 0.9])
+ messages = [r.getMessage() for r in caplog.records if r.levelno == logging.INFO]
+ assert messages, "expected an INFO summary line"
+ line = "\n".join(messages)
+ assert "count=3" in line
+ assert "min=0.100000" in line
+ assert "max=0.900000" in line
+ assert "mean=0.500000" in line
+
+
+def test_timing_zero_processed(caplog):
+ """With zero processed records, log_timing reports no timing data."""
+ caplog.set_level(logging.INFO, logger="ccoa.utils.reporting.summary")
+ log_timing(processed=0, t_processing=0.0, t_extract_total=0.0, t_predict_total=0.0)
+ messages = [r.getMessage() for r in caplog.records if r.levelno == logging.INFO]
+ assert any("no timing data" in m for m in messages)
+
+
+def test_timing_reports_throughput(caplog):
+ """log_timing emits docs/s, total, and per-step costs in the right format."""
+ caplog.set_level(logging.INFO, logger="ccoa.utils.reporting.summary")
+ log_timing(processed=10, t_processing=2.0, t_extract_total=0.5, t_predict_total=1.0)
+ messages = [r.getMessage() for r in caplog.records if r.levelno == logging.INFO]
+ assert messages
+ line = "\n".join(messages)
+ assert "processed=10" in line
+ assert "throughput=5.00 docs/s" in line
+ assert "extract_total=500.00ms" in line
+ assert "predict_total=1.000s" in line
+
+
+def test_open_output_sink_stdout_does_not_close(capsys):
+ """`-` yields sys.stdout and the context manager must not close it."""
+ with open_output_sink("-", {}) as sink:
+ assert sink is sys.stdout
+ csv.writer(sink).writerow(["a", "b"])
+ captured = capsys.readouterr()
+ assert "a,b" in captured.out
+ assert not sys.stdout.closed
+
+
+def test_open_output_sink_writes_local_file(tmp_path):
+ """A local path goes through fsspec.open and round-trips CSV content."""
+ target = tmp_path / "out.csv"
+ with open_output_sink(str(target), {}) as sink:
+ writer = csv.writer(sink)
+ writer.writerow(["URL", "prediction_score"])
+ writer.writerow(["http://example.com", "0.123456"])
+ assert target.read_text().splitlines() == [
+ "URL,prediction_score",
+ "http://example.com,0.123456",
+ ]
+
+
+def test_resolve_paths_passes_literal_through(tmp_path):
+ """A literal (non-glob) path is returned unchanged, in input order."""
+ target = tmp_path / "only.warc.gz"
+ target.write_bytes(b"")
+ resolved = resolve_warc_paths(
+ [str(target)],
+ anonymous=False,
+ requester_pays=False,
+ shuffle=False,
+ seed=42,
+ files_limit=0,
+ )
+ assert resolved == [str(target)]
+
+
+def test_resolve_paths_globs_and_sorts(tmp_path):
+ """A glob pattern expands and the result is sorted lexicographically."""
+ _make_warcs(tmp_path, ["c.warc.gz", "a.warc.gz", "b.warc.gz"])
+ resolved = resolve_warc_paths(
+ [str(tmp_path / "*.warc.gz")],
+ anonymous=False,
+ requester_pays=False,
+ shuffle=False,
+ seed=42,
+ files_limit=0,
+ )
+ assert resolved == [
+ str(tmp_path / "a.warc.gz"),
+ str(tmp_path / "b.warc.gz"),
+ str(tmp_path / "c.warc.gz"),
+ ]
+
+
+def test_resolve_paths_shuffle_deterministic(tmp_path):
+ """Same seed → same shuffled order; different seed → different order."""
+ _make_warcs(
+ tmp_path,
+ ["a.warc.gz", "b.warc.gz", "c.warc.gz", "d.warc.gz", "e.warc.gz"],
+ )
+ pattern = str(tmp_path / "*.warc.gz")
+
+ def call(seed: int) -> list[str]:
+ return resolve_warc_paths(
+ [pattern],
+ anonymous=False,
+ requester_pays=False,
+ shuffle=True,
+ seed=seed,
+ files_limit=0,
+ )
+
+ first = call(42)
+ second = call(42)
+ other = call(7)
+ assert first == second
+ assert sorted(first) == sorted(other)
+ assert first != other
+
+
+def test_resolve_paths_files_limit_truncates(tmp_path):
+ """`files_limit` keeps only the first N URIs after sort/shuffle."""
+ _make_warcs(
+ tmp_path,
+ ["a.warc.gz", "b.warc.gz", "c.warc.gz", "d.warc.gz", "e.warc.gz"],
+ )
+ resolved = resolve_warc_paths(
+ [str(tmp_path / "*.warc.gz")],
+ anonymous=False,
+ requester_pays=False,
+ shuffle=False,
+ seed=42,
+ files_limit=2,
+ )
+ assert resolved == [
+ str(tmp_path / "a.warc.gz"),
+ str(tmp_path / "b.warc.gz"),
+ ]
+
+
+@pytest.mark.parametrize(
+ ("url", "expected"),
+ [
+ ("http://example.com", True),
+ ("http://example.com/", True),
+ ("https://www.example.com/", True),
+ ("http://example.com/page", False),
+ ("http://example.com/?q=1", False),
+ ("http://example.com/#frag", False),
+ ("http://example.com/index.html", False),
+ ("", True),
+ ],
+)
+def test_is_homepage_url(url: str, expected: bool) -> None:
+ """Site-root URLs (no path/query/fragment) are homepages; everything else is not."""
+ assert is_homepage_url(url) is expected
+
+
+def _default_args(**overrides) -> argparse.Namespace:
+ """Build a complete argparse.Namespace covering every classify-warc flag."""
+ base = {
+ "workers": 1,
+ "records_limit": 0,
+ "warc_paths": [],
+ "records_per_file_limit": 0,
+ "skip_homepages": False,
+ "files_limit": 0,
+ "shuffle_files": False,
+ "seed": 42,
+ "model_repo": "ibm-granite/GneissWeb.Sci_classifier",
+ "model_file": "fasttext_science.bin",
+ "target_label": "__label__science",
+ "output": "-",
+ "cache_dir": None,
+ "anonymous_s3": False,
+ "s3_requester_pays": False,
+ "progress_every": 1000,
+ "workers_mode": "thread",
+ "max_pool_restarts": 10,
+ "resume_from_output": None,
+ }
+ base.update(overrides)
+ return argparse.Namespace(**base)
+
+
+def test_workers_with_records_limit_errors(caplog):
+ """`--workers > 1` combined with `--records-limit > 0` exits early with code 2."""
+ caplog.set_level(logging.ERROR, logger="ccoa.commands.classify_warc")
+ rc = ClassifyWarcCommand().run(_default_args(workers=2, records_limit=10))
+ assert rc == 2
+ errors = [r for r in caplog.records if r.levelno == logging.ERROR]
+ assert errors, "expected an ERROR log line"
+ message = errors[0].getMessage()
+ assert "--records-limit" in message
+ assert "--workers" in message
+
+
+@pytest.mark.parametrize(
+ ("output", "expected"),
+ [
+ ("foo.csv", "foo.summary.csv"),
+ ("data/out.tsv", "data/out.summary.tsv"),
+ ("s3://bucket/key.csv", "s3://bucket/key.summary.csv"),
+ ("path/to/output", "path/to/output.summary"),
+ ],
+)
+def test_summary_path_for(output: str, expected: str) -> None:
+ """`.summary` is inserted before the final extension."""
+ assert summary_path_for(output) == expected
+
+
+def test_run_aborts_when_output_exists(tmp_path, caplog):
+ """A pre-existing --output path causes an early-return rc=2 before any processing."""
+ caplog.set_level(logging.ERROR, logger="ccoa.commands.classify_warc")
+ target = tmp_path / "out.csv"
+ target.write_text("preexisting,data\n")
+ rc = ClassifyWarcCommand().run(_default_args(output=str(target)))
+ assert rc == 2
+ assert any("already exists" in r.getMessage() for r in caplog.records)
+
+
+def test_run_aborts_when_summary_exists(tmp_path, caplog):
+ """A pre-existing summary sidecar path also causes an early-return rc=2."""
+ caplog.set_level(logging.ERROR, logger="ccoa.commands.classify_warc")
+ target = tmp_path / "out.csv"
+ summary = tmp_path / "out.summary.csv"
+ summary.write_text("stale,summary\n")
+ rc = ClassifyWarcCommand().run(_default_args(output=str(target)))
+ assert rc == 2
+ assert not target.exists(), "output should not have been created"
+ assert any("already exists" in r.getMessage() for r in caplog.records)
+
+
+def test_compute_score_stats_empty_and_singleton() -> None:
+ """Empty -> {count: 0}; singleton -> n/a percentiles + stdev."""
+ assert compute_score_stats([]) == {"count": 0}
+ one = compute_score_stats([0.5])
+ assert one["count"] == 1
+ assert one["min"] == one["max"] == one["mean"] == 0.5
+ assert one["stdev"] == "n/a"
+ assert one["p50"] == "n/a"
+
+
+def test_write_run_summary_round_trip(tmp_path):
+ """The sidecar CSV captures args, counters, score stats, and timings as key/value rows."""
+ summary_path = tmp_path / "out.summary.csv"
+ args = _default_args(
+ warc_paths=["s3://bucket/a.warc.gz", "s3://bucket/b.warc.gz"],
+ records_per_file_limit=10,
+ skip_homepages=True,
+ workers=2,
+ )
+ write_run_summary(
+ str(summary_path),
+ {},
+ args=args,
+ resolved_count=2,
+ scores=[0.1, 0.5, 0.9],
+ processed=3,
+ skipped_empty=1,
+ skipped_homepage=2,
+ skipped_resume=11,
+ extract_errors=8,
+ cache_hits=4,
+ cache_misses=5,
+ trafilatura_warnings=17,
+ trafilatura_errors=6,
+ t_processing=1.5,
+ t_extract_total=0.6,
+ t_predict_total=0.3,
+ started_at="2026-05-24T00:00:00+00:00",
+ finished_at="2026-05-24T00:00:01+00:00",
+ )
+ with open(summary_path, newline="", encoding="utf-8") as fh:
+ rows = dict(list(csv.reader(fh))[1:])
+ assert rows["arg.workers"] == "2"
+ assert rows["arg.records_per_file_limit"] == "10"
+ assert rows["arg.skip_homepages"] == "True"
+ assert rows["arg.warc_paths"] == "s3://bucket/a.warc.gz;s3://bucket/b.warc.gz"
+ assert rows["arg.cache_dir"] == ""
+ assert rows["input.resolved_count"] == "2"
+ assert rows["count.processed"] == "3"
+ assert rows["count.skipped_homepage"] == "2"
+ assert rows["count.skipped_resume"] == "11"
+ assert rows["count.extract_errors"] == "8"
+ assert rows["count.cache_hits"] == "4"
+ assert rows["count.trafilatura_warnings"] == "17"
+ assert rows["count.trafilatura_errors"] == "6"
+ assert rows["score.count"] == "3"
+ assert rows["score.min"] == "0.100000"
+ assert rows["score.max"] == "0.900000"
+ assert rows["score.mean"] == "0.500000"
+ assert rows["time.total_seconds"] == "1.500000"
+ assert rows["time.throughput_docs_per_sec"] == "2.000000"
+ assert rows["run.started_at"] == "2026-05-24T00:00:00+00:00"
+ assert rows["run.finished_at"] == "2026-05-24T00:00:01+00:00"
+ assert "run.cli" in rows
+
+
+def test_trafilatura_log_counter():
+ """Counter splits WARNING vs ERROR+ and never re-emits the record."""
+ h = TrafilaturaLogCounter()
+ for level in (logging.WARNING, logging.WARNING, logging.ERROR, logging.CRITICAL):
+ h.handle(logging.LogRecord("trafilatura.core", level, "x.py", 1, "noisy", None, None))
+ assert h.warnings == 2
+ assert h.errors == 2
+
+
+def test_cache_path_for_warc_maps_protocols(tmp_path):
+ """Input URIs of any scheme map to //.jsonl.gz."""
+ cache_dir = "/tmp/cache"
+ assert (
+ cache_path_for_warc("s3://commoncrawl/crawl-data/CC-MAIN/foo.warc.gz", cache_dir)
+ == "/tmp/cache/s3/commoncrawl/crawl-data/CC-MAIN/foo.warc.gz.jsonl.gz"
+ )
+ assert (
+ cache_path_for_warc("/data/foo.warc.gz", cache_dir)
+ == "/tmp/cache/local/data/foo.warc.gz.jsonl.gz"
+ )
+ assert (
+ cache_path_for_warc("data/foo.warc.gz", cache_dir)
+ == "/tmp/cache/local/data/foo.warc.gz.jsonl.gz"
+ )
+ assert (
+ cache_path_for_warc("gs://bucket/x.warc.gz", cache_dir)
+ == "/tmp/cache/gs/bucket/x.warc.gz.jsonl.gz"
+ )
+ # Trailing slash on cache_dir is normalised.
+ assert (
+ cache_path_for_warc("s3://b/k.warc.gz", "/tmp/cache/")
+ == "/tmp/cache/s3/b/k.warc.gz.jsonl.gz"
+ )
+ # S3 cache_dir is preserved verbatim.
+ assert (
+ cache_path_for_warc("s3://b/k.warc.gz", "s3://cache-bucket/prefix")
+ == "s3://cache-bucket/prefix/s3/b/k.warc.gz.jsonl.gz"
+ )
+
+
+def test_cache_path_rejects_parent_traversal():
+ """A `..` segment in the input must be rejected to prevent cache_dir escape."""
+ with pytest.raises(ValueError, match=r"\.\."):
+ cache_path_for_warc("../etc/foo.warc.gz", "/tmp/cache")
+ with pytest.raises(ValueError, match=r"\.\."):
+ cache_path_for_warc("s3://bucket/a/../../foo.warc.gz", "/tmp/cache")
+
+
+def test_cache_roundtrip(tmp_path):
+ """Save → load returns the identical dict, including empties, multi-line, non-ASCII."""
+ target = str(tmp_path / "cache.jsonl.gz")
+ entries = {
+ 0: "hello",
+ 1: "", # negative caching
+ 2: "line one\nline two",
+ 3: "ümlaut and 漢字",
+ }
+ save_extraction_cache(target, entries, {})
+ loaded = load_extraction_cache(target, {})
+ assert loaded == entries
+ # Sanity: keys come back as ints, not strs.
+ assert all(isinstance(k, int) for k in loaded)
+
+
+def test_load_missing_returns_empty_dict(tmp_path):
+ """Loading from a path that does not exist returns {} without raising."""
+ missing = str(tmp_path / "does_not_exist.jsonl.gz")
+ assert load_extraction_cache(missing, {}) == {}
+
+
+def test_load_malformed_returns_empty_and_warns(tmp_path, caplog):
+ """A garbage file is treated as a cache miss and emits a WARNING."""
+ target = tmp_path / "bad.jsonl.gz"
+ target.write_bytes(b"this is not gzipped JSON")
+ caplog.set_level(logging.WARNING, logger="ccoa.extraction.cache")
+ result = load_extraction_cache(str(target), {})
+ assert result == {}
+ warnings = [r for r in caplog.records if r.levelno == logging.WARNING]
+ assert warnings, "expected a WARNING about the broken cache"
+ assert "extraction cache" in warnings[0].getMessage().lower()
+
+
+def test_save_skips_empty_dict(tmp_path):
+ """save_extraction_cache must not create a file when the dict is empty."""
+ target = tmp_path / "should_not_exist.jsonl.gz"
+ save_extraction_cache(str(target), {}, {})
+ assert not target.exists()
+
+
+def test_save_writes_valid_gzip_jsonl(tmp_path):
+ """Verify the on-disk format: gzip(jsonl) with index/text keys, sorted by index."""
+ target = tmp_path / "cache.jsonl.gz"
+ save_extraction_cache(str(target), {2: "c", 0: "a", 1: "b"}, {})
+ with gzip.open(target, "rt", encoding="utf-8") as fh:
+ lines = fh.read().splitlines()
+ assert lines == [
+ '{"index": 0, "text": "a"}',
+ '{"index": 1, "text": "b"}',
+ '{"index": 2, "text": "c"}',
+ ]
+
+
+@pytest.mark.parametrize(
+ ("seconds", "expected"),
+ [
+ (0.0, "0.0s"),
+ (12.3, "12.3s"),
+ (59.9, "59.9s"),
+ (60.0, "1m 0s"),
+ (125.0, "2m 5s"),
+ (3600.0, "1h 0m 0s"),
+ (3725.0, "1h 2m 5s"),
+ (-5.0, "0.0s"),
+ ],
+)
+def test_format_duration(seconds: float, expected: str) -> None:
+ """Sub-minute durations stay as Ns; minutes/hours roll up; negatives clamp to 0."""
+ assert format_duration(seconds) == expected
+
+
+def test_clean_for_fasttext_strips_newlines_and_nuls() -> None:
+ """Newlines become spaces; NULs are deleted; other text passes through."""
+ assert clean_for_fasttext("a\nb\rc\x00d") == "a b cd"
+ assert clean_for_fasttext("hello world") == "hello world"
+
+
+def test_clean_for_fasttext_clamps_length() -> None:
+ """Long inputs are truncated to max_len characters."""
+ big = "x" * (FASTTEXT_MAX_INPUT_CHARS + 50)
+ assert len(clean_for_fasttext(big)) == FASTTEXT_MAX_INPUT_CHARS
+ assert len(clean_for_fasttext(big, max_len=10)) == 10
+
+
+def test_load_resume_skipset_groups_by_warc(tmp_path):
+ """A prior output CSV is grouped into {warc_filename: frozenset(record_indices)}."""
+ csv_path = tmp_path / "prior.csv"
+ csv_path.write_text(
+ "URL,prediction_score,warc_filename,warc_record_index\n"
+ "http://a/,0.1,s3://bucket/a.warc.gz,0\n"
+ "http://a/x,0.2,s3://bucket/a.warc.gz,3\n"
+ "http://b/,0.3,s3://bucket/b.warc.gz,7\n"
+ )
+ skipset = load_resume_skipset(str(csv_path), {})
+ assert skipset == {
+ "s3://bucket/a.warc.gz": frozenset({0, 3}),
+ "s3://bucket/b.warc.gz": frozenset({7}),
+ }
+
+
+def test_load_resume_skipset_rejects_old_schema(tmp_path):
+ """CSV without warc_filename/warc_record_index raises a clear error."""
+ csv_path = tmp_path / "old.csv"
+ csv_path.write_text("URL,prediction_score\nhttp://a/,0.1\n")
+ with pytest.raises(ValueError, match="missing required columns"):
+ load_resume_skipset(str(csv_path), {})
+
+
+def _write_synthetic_warc(warc_path, url: str, body: bytes) -> None:
+ """Write a single-response-record .warc.gz at `warc_path`."""
+ import io
+
+ from warcio.statusandheaders import StatusAndHeaders
+ from warcio.warcwriter import WARCWriter
+
+ with open(warc_path, "wb") as out:
+ writer = WARCWriter(out, gzip=True)
+ http_headers = StatusAndHeaders(
+ "200 OK",
+ [("Content-Type", "text/html"), ("Content-Length", str(len(body)))],
+ protocol="HTTP/1.0",
+ )
+ record = writer.create_warc_record(
+ url,
+ "response",
+ payload=io.BytesIO(body),
+ length=len(body),
+ http_headers=http_headers,
+ )
+ writer.write_record(record)
+
+
+@pytest.mark.real_model
+def test_classify_warc_end_to_end(tmp_path):
+ """End-to-end: synthetic local WARC -> classify-warc -> CSV + summary sidecar.
+
+ Downloads `facebook/fasttext-language-identification` (~131 MB) into the
+ HuggingFace cache on first run. Skipped by default; enable with
+ `uv run pytest --run-real`.
+ """
+ warc_path = tmp_path / "test.warc.gz"
+ html = (
+ b"Test "
+ b"About this Test Page "
+ b"This is an English language test page designed to provide enough text "
+ b"content for trafilatura to extract and for a language identification "
+ b"classifier to score with reasonable confidence. The page discusses nothing "
+ b"in particular but uses common English vocabulary throughout.
"
+ b"The fasttext language identification model should identify this content "
+ b"as English with high probability. Different languages would produce "
+ b"different labels and lower confidence on this same text.
"
+ b""
+ )
+ _write_synthetic_warc(warc_path, "http://example.com/en.html", html)
+
+ output_path = tmp_path / "out.csv"
+ args = _default_args(
+ warc_paths=[str(warc_path)],
+ output=str(output_path),
+ model_repo="facebook/fasttext-language-identification",
+ model_file="model.bin",
+ target_label="__label__eng_Latn",
+ )
+ rc = ClassifyWarcCommand().run(args)
+ assert rc == 0
+
+ with output_path.open(newline="", encoding="utf-8") as fh:
+ rows = list(csv.reader(fh))
+ assert rows[0] == ["URL", "prediction_score", "warc_filename", "warc_record_index"]
+ assert len(rows) == 2, f"expected 1 data row, got {len(rows) - 1}"
+
+ url, score, warc_filename, record_index = rows[1]
+ assert url == "http://example.com/en.html"
+ assert 0.0 <= float(score) <= 1.0
+ assert warc_filename == str(warc_path)
+ assert record_index == "0"
+
+ summary_path = tmp_path / "out.summary.csv"
+ assert summary_path.exists(), "sidecar summary CSV should be written"
+ with summary_path.open(newline="", encoding="utf-8") as fh:
+ summary_rows = dict(list(csv.reader(fh))[1:])
+ assert summary_rows["count.processed"] == "1"
+ assert summary_rows["input.resolved_count"] == "1"
diff --git a/tests/test_extraction_text.py b/tests/test_extraction_text.py
new file mode 100644
index 0000000..c7a4290
--- /dev/null
+++ b/tests/test_extraction_text.py
@@ -0,0 +1,60 @@
+from __future__ import annotations
+
+import logging
+
+from ccoa.extraction.text import TrafilaturaLogCounter, extract_text
+
+# Minimal but syntactically plausible PDF byte stream — enough that lxml
+# definitively rejects it as HTML. Trafilatura's behaviour we care about
+# is "non-HTML payloads don't crash the pipeline".
+_PDF_BYTES = (
+ b"%PDF-1.4\n"
+ b"1 0 obj\n<< /Type /Catalog /Pages 2 0 R >>\nendobj\n"
+ b"2 0 obj\n<< /Type /Pages /Kids [3 0 R] /Count 1 >>\nendobj\n"
+ b"3 0 obj\n<< /Type /Page /Parent 2 0 R /MediaBox [0 0 612 792] >>\nendobj\n"
+ b"xref\n0 4\n0000000000 65535 f \n"
+ b"trailer\n<< /Size 4 /Root 1 0 R >>\nstartxref\n200\n%%EOF\n"
+)
+
+
+def test_extract_text_pdf_returns_empty_string():
+ """PDF payloads must not crash trafilatura; `extract_text` returns ""."""
+ result = extract_text(_PDF_BYTES)
+ assert result == ""
+
+
+def test_extract_text_pdf_is_captured_by_log_counter():
+ """`TrafilaturaLogCounter` catches the rejection records for a PDF payload.
+
+ Proves the pipeline can tally these "noisy non-HTML" records without
+ leaking them to stderr.
+ """
+ counter = TrafilaturaLogCounter()
+ traf_logger = logging.getLogger("trafilatura")
+ traf_logger.addHandler(counter)
+ prev_propagate = traf_logger.propagate
+ traf_logger.propagate = False
+ try:
+ result = extract_text(_PDF_BYTES)
+ finally:
+ traf_logger.removeHandler(counter)
+ traf_logger.propagate = prev_propagate
+
+ assert result == ""
+ # Trafilatura emits both an ERROR ("empty HTML tree") and a WARNING
+ # ("discarding data") on this input; we only require that *something*
+ # was captured, since the exact split is a trafilatura implementation
+ # detail that could change between versions.
+ assert counter.warnings + counter.errors >= 1
+
+
+def test_extract_text_html_returns_text():
+ """Sanity-check the happy path so the PDF assertions aren't vacuous."""
+ html = (
+ b"T "
+ b"Hello world. This sentence exists to give trafilatura "
+ b"enough content to bother extracting.
"
+ b""
+ )
+ result = extract_text(html)
+ assert "Hello world" in result
diff --git a/uv.lock b/uv.lock
new file mode 100644
index 0000000..ed40661
--- /dev/null
+++ b/uv.lock
@@ -0,0 +1,3290 @@
+version = 1
+revision = 3
+requires-python = ">=3.12"
+resolution-markers = [
+ "python_full_version >= '3.14' and sys_platform == 'win32'",
+ "python_full_version >= '3.14' and sys_platform == 'emscripten'",
+ "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'",
+ "python_full_version < '3.14' and sys_platform == 'win32'",
+ "python_full_version < '3.14' and sys_platform == 'emscripten'",
+ "python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'",
+]
+
+[[package]]
+name = "aiobotocore"
+version = "3.7.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "aiohttp" },
+ { name = "aioitertools" },
+ { name = "botocore" },
+ { name = "jmespath" },
+ { name = "multidict" },
+ { name = "python-dateutil" },
+ { name = "wrapt" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/e7/75/42cce839c2ec263ff74b10b650fe36b066fbb124cbee6f247eac0983e1ab/aiobotocore-3.7.0.tar.gz", hash = "sha256:c64d871ed5491a6571948dd48eabd185b46c6c23b64e3afd0c059fc7593ada30", size = 127054, upload-time = "2026-05-09T10:02:52.332Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/90/5f/85535dfb3cfd6442d66d1df1694062c5d6df02f895329e7e120b2a3d2b8b/aiobotocore-3.7.0-py3-none-any.whl", hash = "sha256:680bde7c64679a821a9312641b759d9497f790ba8b2e88c6959e6273ee765b8e", size = 89539, upload-time = "2026-05-09T10:02:50.389Z" },
+]
+
+[[package]]
+name = "aiohappyeyeballs"
+version = "2.6.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/33/c6/61a2d7b7572279226bb2e7f61d7a19ca7c90da0329c93fa0d560cbf288d8/aiohappyeyeballs-2.6.2.tar.gz", hash = "sha256:e202810ee718bd01fc6ef49e8ea53d023d5cb6b581076d7925aa499fa55dbe64", size = 22591, upload-time = "2026-05-20T15:12:24.631Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/5f/fc/a7bf5b6e4e617b45f90f2d9d2a68519c249c81dd4fc2658c7a2a61c4f4b7/aiohappyeyeballs-2.6.2-py3-none-any.whl", hash = "sha256:4708045e2d7a6c6bdf8aafa8ed39649eaf926a4543b54560659129e3365953c4", size = 15062, upload-time = "2026-05-20T15:12:23.328Z" },
+]
+
+[[package]]
+name = "aiohttp"
+version = "3.13.5"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "aiohappyeyeballs" },
+ { name = "aiosignal" },
+ { name = "attrs" },
+ { name = "frozenlist" },
+ { name = "multidict" },
+ { name = "propcache" },
+ { name = "yarl" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/77/9a/152096d4808df8e4268befa55fba462f440f14beab85e8ad9bf990516918/aiohttp-3.13.5.tar.gz", hash = "sha256:9d98cc980ecc96be6eb4c1994ce35d28d8b1f5e5208a23b421187d1209dbb7d1", size = 7858271, upload-time = "2026-03-31T22:01:03.343Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/be/6f/353954c29e7dcce7cf00280a02c75f30e133c00793c7a2ed3776d7b2f426/aiohttp-3.13.5-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:023ecba036ddd840b0b19bf195bfae970083fd7024ce1ac22e9bba90464620e9", size = 748876, upload-time = "2026-03-31T21:57:36.319Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/1b/428a7c64687b3b2e9cd293186695affc0e1e54a445d0361743b231f11066/aiohttp-3.13.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:15c933ad7920b7d9a20de151efcd05a6e38302cbf0e10c9b2acb9a42210a2416", size = 499557, upload-time = "2026-03-31T21:57:38.236Z" },
+ { url = "https://files.pythonhosted.org/packages/29/47/7be41556bfbb6917069d6a6634bb7dd5e163ba445b783a90d40f5ac7e3a7/aiohttp-3.13.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ab2899f9fa2f9f741896ebb6fa07c4c883bfa5c7f2ddd8cf2aafa86fa981b2d2", size = 500258, upload-time = "2026-03-31T21:57:39.923Z" },
+ { url = "https://files.pythonhosted.org/packages/67/84/c9ecc5828cb0b3695856c07c0a6817a99d51e2473400f705275a2b3d9239/aiohttp-3.13.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a60eaa2d440cd4707696b52e40ed3e2b0f73f65be07fd0ef23b6b539c9c0b0b4", size = 1749199, upload-time = "2026-03-31T21:57:41.938Z" },
+ { url = "https://files.pythonhosted.org/packages/f0/d3/3c6d610e66b495657622edb6ae7c7fd31b2e9086b4ec50b47897ad6042a9/aiohttp-3.13.5-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:55b3bdd3292283295774ab585160c4004f4f2f203946997f49aac032c84649e9", size = 1721013, upload-time = "2026-03-31T21:57:43.904Z" },
+ { url = "https://files.pythonhosted.org/packages/49/a0/24409c12217456df0bae7babe3b014e460b0b38a8e60753d6cb339f6556d/aiohttp-3.13.5-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c2b2355dc094e5f7d45a7bb262fe7207aa0460b37a0d87027dcf21b5d890e7d5", size = 1781501, upload-time = "2026-03-31T21:57:46.285Z" },
+ { url = "https://files.pythonhosted.org/packages/98/9d/b65ec649adc5bccc008b0957a9a9c691070aeac4e41cea18559fef49958b/aiohttp-3.13.5-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b38765950832f7d728297689ad78f5f2cf79ff82487131c4d26fe6ceecdc5f8e", size = 1878981, upload-time = "2026-03-31T21:57:48.734Z" },
+ { url = "https://files.pythonhosted.org/packages/57/d8/8d44036d7eb7b6a8ec4c5494ea0c8c8b94fbc0ed3991c1a7adf230df03bf/aiohttp-3.13.5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b18f31b80d5a33661e08c89e202edabf1986e9b49c42b4504371daeaa11b47c1", size = 1767934, upload-time = "2026-03-31T21:57:51.171Z" },
+ { url = "https://files.pythonhosted.org/packages/31/04/d3f8211f273356f158e3464e9e45484d3fb8c4ce5eb2f6fe9405c3273983/aiohttp-3.13.5-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:33add2463dde55c4f2d9635c6ab33ce154e5ecf322bd26d09af95c5f81cfa286", size = 1566671, upload-time = "2026-03-31T21:57:53.326Z" },
+ { url = "https://files.pythonhosted.org/packages/41/db/073e4ebe00b78e2dfcacff734291651729a62953b48933d765dc513bf798/aiohttp-3.13.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:327cc432fdf1356fb4fbc6fe833ad4e9f6aacb71a8acaa5f1855e4b25910e4a9", size = 1705219, upload-time = "2026-03-31T21:57:55.385Z" },
+ { url = "https://files.pythonhosted.org/packages/48/45/7dfba71a2f9fd97b15c95c06819de7eb38113d2cdb6319669195a7d64270/aiohttp-3.13.5-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:7c35b0bf0b48a70b4cb4fc5d7bed9b932532728e124874355de1a0af8ec4bc88", size = 1743049, upload-time = "2026-03-31T21:57:57.341Z" },
+ { url = "https://files.pythonhosted.org/packages/18/71/901db0061e0f717d226386a7f471bb59b19566f2cae5f0d93874b017271f/aiohttp-3.13.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:df23d57718f24badef8656c49743e11a89fd6f5358fa8a7b96e728fda2abf7d3", size = 1749557, upload-time = "2026-03-31T21:57:59.626Z" },
+ { url = "https://files.pythonhosted.org/packages/08/d5/41eebd16066e59cd43728fe74bce953d7402f2b4ddfdfef2c0e9f17ca274/aiohttp-3.13.5-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:02e048037a6501a5ec1f6fc9736135aec6eb8a004ce48838cb951c515f32c80b", size = 1558931, upload-time = "2026-03-31T21:58:01.972Z" },
+ { url = "https://files.pythonhosted.org/packages/30/e6/4a799798bf05740e66c3a1161079bda7a3dd8e22ca392481d7a7f9af82a6/aiohttp-3.13.5-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:31cebae8b26f8a615d2b546fee45d5ffb76852ae6450e2a03f42c9102260d6fe", size = 1774125, upload-time = "2026-03-31T21:58:04.007Z" },
+ { url = "https://files.pythonhosted.org/packages/84/63/7749337c90f92bc2cb18f9560d67aa6258c7060d1397d21529b8004fcf6f/aiohttp-3.13.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:888e78eb5ca55a615d285c3c09a7a91b42e9dd6fc699b166ebd5dee87c9ccf14", size = 1732427, upload-time = "2026-03-31T21:58:06.337Z" },
+ { url = "https://files.pythonhosted.org/packages/98/de/cf2f44ff98d307e72fb97d5f5bbae3bfcb442f0ea9790c0bf5c5c2331404/aiohttp-3.13.5-cp312-cp312-win32.whl", hash = "sha256:8bd3ec6376e68a41f9f95f5ed170e2fcf22d4eb27a1f8cb361d0508f6e0557f3", size = 433534, upload-time = "2026-03-31T21:58:08.712Z" },
+ { url = "https://files.pythonhosted.org/packages/aa/ca/eadf6f9c8fa5e31d40993e3db153fb5ed0b11008ad5d9de98a95045bed84/aiohttp-3.13.5-cp312-cp312-win_amd64.whl", hash = "sha256:110e448e02c729bcebb18c60b9214a87ba33bac4a9fa5e9a5f139938b56c6cb1", size = 460446, upload-time = "2026-03-31T21:58:10.945Z" },
+ { url = "https://files.pythonhosted.org/packages/78/e9/d76bf503005709e390122d34e15256b88f7008e246c4bdbe915cd4f1adce/aiohttp-3.13.5-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a5029cc80718bbd545123cd8fe5d15025eccaaaace5d0eeec6bd556ad6163d61", size = 742930, upload-time = "2026-03-31T21:58:13.155Z" },
+ { url = "https://files.pythonhosted.org/packages/57/00/4b7b70223deaebd9bb85984d01a764b0d7bd6526fcdc73cca83bcbe7243e/aiohttp-3.13.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4bb6bf5811620003614076bdc807ef3b5e38244f9d25ca5fe888eaccea2a9832", size = 496927, upload-time = "2026-03-31T21:58:15.073Z" },
+ { url = "https://files.pythonhosted.org/packages/9c/f5/0fb20fb49f8efdcdce6cd8127604ad2c503e754a8f139f5e02b01626523f/aiohttp-3.13.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a84792f8631bf5a94e52d9cc881c0b824ab42717165a5579c760b830d9392ac9", size = 497141, upload-time = "2026-03-31T21:58:17.009Z" },
+ { url = "https://files.pythonhosted.org/packages/3b/86/b7c870053e36a94e8951b803cb5b909bfbc9b90ca941527f5fcafbf6b0fa/aiohttp-3.13.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:57653eac22c6a4c13eb22ecf4d673d64a12f266e72785ab1c8b8e5940d0e8090", size = 1732476, upload-time = "2026-03-31T21:58:18.925Z" },
+ { url = "https://files.pythonhosted.org/packages/b5/e5/4e161f84f98d80c03a238671b4136e6530453d65262867d989bbe78244d0/aiohttp-3.13.5-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5e5f7debc7a57af53fdf5c5009f9391d9f4c12867049d509bf7bb164a6e295b", size = 1706507, upload-time = "2026-03-31T21:58:21.094Z" },
+ { url = "https://files.pythonhosted.org/packages/d4/56/ea11a9f01518bd5a2a2fcee869d248c4b8a0cfa0bb13401574fa31adf4d4/aiohttp-3.13.5-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c719f65bebcdf6716f10e9eff80d27567f7892d8988c06de12bbbd39307c6e3a", size = 1773465, upload-time = "2026-03-31T21:58:23.159Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/40/333ca27fb74b0383f17c90570c748f7582501507307350a79d9f9f3c6eb1/aiohttp-3.13.5-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d97f93fdae594d886c5a866636397e2bcab146fd7a132fd6bb9ce182224452f8", size = 1873523, upload-time = "2026-03-31T21:58:25.59Z" },
+ { url = "https://files.pythonhosted.org/packages/f0/d2/e2f77eef1acb7111405433c707dc735e63f67a56e176e72e9e7a2cd3f493/aiohttp-3.13.5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3df334e39d4c2f899a914f1dba283c1aadc311790733f705182998c6f7cae665", size = 1754113, upload-time = "2026-03-31T21:58:27.624Z" },
+ { url = "https://files.pythonhosted.org/packages/fb/56/3f653d7f53c89669301ec9e42c95233e2a0c0a6dd051269e6e678db4fdb0/aiohttp-3.13.5-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fe6970addfea9e5e081401bcbadf865d2b6da045472f58af08427e108d618540", size = 1562351, upload-time = "2026-03-31T21:58:29.918Z" },
+ { url = "https://files.pythonhosted.org/packages/ec/a6/9b3e91eb8ae791cce4ee736da02211c85c6f835f1bdfac0594a8a3b7018c/aiohttp-3.13.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7becdf835feff2f4f335d7477f121af787e3504b48b449ff737afb35869ba7bb", size = 1693205, upload-time = "2026-03-31T21:58:32.214Z" },
+ { url = "https://files.pythonhosted.org/packages/98/fc/bfb437a99a2fcebd6b6eaec609571954de2ed424f01c352f4b5504371dd3/aiohttp-3.13.5-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:676e5651705ad5d8a70aeb8eb6936c436d8ebbd56e63436cb7dd9bb36d2a9a46", size = 1730618, upload-time = "2026-03-31T21:58:34.728Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/b6/c8534862126191a034f68153194c389addc285a0f1347d85096d349bbc15/aiohttp-3.13.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:9b16c653d38eb1a611cc898c41e76859ca27f119d25b53c12875fd0474ae31a8", size = 1745185, upload-time = "2026-03-31T21:58:36.909Z" },
+ { url = "https://files.pythonhosted.org/packages/0b/93/4ca8ee2ef5236e2707e0fd5fecb10ce214aee1ff4ab307af9c558bda3b37/aiohttp-3.13.5-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:999802d5fa0389f58decd24b537c54aa63c01c3219ce17d1214cbda3c2b22d2d", size = 1557311, upload-time = "2026-03-31T21:58:39.38Z" },
+ { url = "https://files.pythonhosted.org/packages/57/ae/76177b15f18c5f5d094f19901d284025db28eccc5ae374d1d254181d33f4/aiohttp-3.13.5-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ec707059ee75732b1ba130ed5f9580fe10ff75180c812bc267ded039db5128c6", size = 1773147, upload-time = "2026-03-31T21:58:41.476Z" },
+ { url = "https://files.pythonhosted.org/packages/01/a4/62f05a0a98d88af59d93b7fcac564e5f18f513cb7471696ac286db970d6a/aiohttp-3.13.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2d6d44a5b48132053c2f6cd5c8cb14bc67e99a63594e336b0f2af81e94d5530c", size = 1730356, upload-time = "2026-03-31T21:58:44.049Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/85/fc8601f59dfa8c9523808281f2da571f8b4699685f9809a228adcc90838d/aiohttp-3.13.5-cp313-cp313-win32.whl", hash = "sha256:329f292ed14d38a6c4c435e465f48bebb47479fd676a0411936cc371643225cc", size = 432637, upload-time = "2026-03-31T21:58:46.167Z" },
+ { url = "https://files.pythonhosted.org/packages/c0/1b/ac685a8882896acf0f6b31d689e3792199cfe7aba37969fa91da63a7fa27/aiohttp-3.13.5-cp313-cp313-win_amd64.whl", hash = "sha256:69f571de7500e0557801c0b51f4780482c0ec5fe2ac851af5a92cfce1af1cb83", size = 458896, upload-time = "2026-03-31T21:58:48.119Z" },
+ { url = "https://files.pythonhosted.org/packages/5d/ce/46572759afc859e867a5bc8ec3487315869013f59281ce61764f76d879de/aiohttp-3.13.5-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:eb4639f32fd4a9904ab8fb45bf3383ba71137f3d9d4ba25b3b3f3109977c5b8c", size = 745721, upload-time = "2026-03-31T21:58:50.229Z" },
+ { url = "https://files.pythonhosted.org/packages/13/fe/8a2efd7626dbe6049b2ef8ace18ffda8a4dfcbe1bcff3ac30c0c7575c20b/aiohttp-3.13.5-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:7e5dc4311bd5ac493886c63cbf76ab579dbe4641268e7c74e48e774c74b6f2be", size = 497663, upload-time = "2026-03-31T21:58:52.232Z" },
+ { url = "https://files.pythonhosted.org/packages/9b/91/cc8cc78a111826c54743d88651e1687008133c37e5ee615fee9b57990fac/aiohttp-3.13.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:756c3c304d394977519824449600adaf2be0ccee76d206ee339c5e76b70ded25", size = 499094, upload-time = "2026-03-31T21:58:54.566Z" },
+ { url = "https://files.pythonhosted.org/packages/0a/33/a8362cb15cf16a3af7e86ed11962d5cd7d59b449202dc576cdc731310bde/aiohttp-3.13.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecc26751323224cf8186efcf7fbcbc30f4e1d8c7970659daf25ad995e4032a56", size = 1726701, upload-time = "2026-03-31T21:58:56.864Z" },
+ { url = "https://files.pythonhosted.org/packages/45/0c/c091ac5c3a17114bd76cbf85d674650969ddf93387876cf67f754204bd77/aiohttp-3.13.5-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:10a75acfcf794edf9d8db50e5a7ec5fc818b2a8d3f591ce93bc7b1210df016d2", size = 1683360, upload-time = "2026-03-31T21:58:59.072Z" },
+ { url = "https://files.pythonhosted.org/packages/23/73/bcee1c2b79bc275e964d1446c55c54441a461938e70267c86afaae6fba27/aiohttp-3.13.5-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0f7a18f258d124cd678c5fe072fe4432a4d5232b0657fca7c1847f599233c83a", size = 1773023, upload-time = "2026-03-31T21:59:01.776Z" },
+ { url = "https://files.pythonhosted.org/packages/c7/ef/720e639df03004fee2d869f771799d8c23046dec47d5b81e396c7cda583a/aiohttp-3.13.5-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:df6104c009713d3a89621096f3e3e88cc323fd269dbd7c20afe18535094320be", size = 1853795, upload-time = "2026-03-31T21:59:04.568Z" },
+ { url = "https://files.pythonhosted.org/packages/bd/c9/989f4034fb46841208de7aeeac2c6d8300745ab4f28c42f629ba77c2d916/aiohttp-3.13.5-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:241a94f7de7c0c3b616627aaad530fe2cb620084a8b144d3be7b6ecfe95bae3b", size = 1730405, upload-time = "2026-03-31T21:59:07.221Z" },
+ { url = "https://files.pythonhosted.org/packages/ce/75/ee1fd286ca7dc599d824b5651dad7b3be7ff8d9a7e7b3fe9820d9180f7db/aiohttp-3.13.5-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c974fb66180e58709b6fc402846f13791240d180b74de81d23913abe48e96d94", size = 1558082, upload-time = "2026-03-31T21:59:09.484Z" },
+ { url = "https://files.pythonhosted.org/packages/c3/20/1e9e6650dfc436340116b7aa89ff8cb2bbdf0abc11dfaceaad8f74273a10/aiohttp-3.13.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:6e27ea05d184afac78aabbac667450c75e54e35f62238d44463131bd3f96753d", size = 1692346, upload-time = "2026-03-31T21:59:12.068Z" },
+ { url = "https://files.pythonhosted.org/packages/d8/40/8ebc6658d48ea630ac7903912fe0dd4e262f0e16825aa4c833c56c9f1f56/aiohttp-3.13.5-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:a79a6d399cef33a11b6f004c67bb07741d91f2be01b8d712d52c75711b1e07c7", size = 1698891, upload-time = "2026-03-31T21:59:14.552Z" },
+ { url = "https://files.pythonhosted.org/packages/d8/78/ea0ae5ec8ba7a5c10bdd6e318f1ba5e76fcde17db8275188772afc7917a4/aiohttp-3.13.5-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:c632ce9c0b534fbe25b52c974515ed674937c5b99f549a92127c85f771a78772", size = 1742113, upload-time = "2026-03-31T21:59:17.068Z" },
+ { url = "https://files.pythonhosted.org/packages/8a/66/9d308ed71e3f2491be1acb8769d96c6f0c47d92099f3bc9119cada27b357/aiohttp-3.13.5-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:fceedde51fbd67ee2bcc8c0b33d0126cc8b51ef3bbde2f86662bd6d5a6f10ec5", size = 1553088, upload-time = "2026-03-31T21:59:19.541Z" },
+ { url = "https://files.pythonhosted.org/packages/da/a6/6cc25ed8dfc6e00c90f5c6d126a98e2cf28957ad06fa1036bd34b6f24a2c/aiohttp-3.13.5-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:f92995dfec9420bb69ae629abf422e516923ba79ba4403bc750d94fb4a6c68c1", size = 1757976, upload-time = "2026-03-31T21:59:22.311Z" },
+ { url = "https://files.pythonhosted.org/packages/c1/2b/cce5b0ffe0de99c83e5e36d8f828e4161e415660a9f3e58339d07cce3006/aiohttp-3.13.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:20ae0ff08b1f2c8788d6fb85afcb798654ae6ba0b747575f8562de738078457b", size = 1712444, upload-time = "2026-03-31T21:59:24.635Z" },
+ { url = "https://files.pythonhosted.org/packages/6c/cf/9e1795b4160c58d29421eafd1a69c6ce351e2f7c8d3c6b7e4ca44aea1a5b/aiohttp-3.13.5-cp314-cp314-win32.whl", hash = "sha256:b20df693de16f42b2472a9c485e1c948ee55524786a0a34345511afdd22246f3", size = 438128, upload-time = "2026-03-31T21:59:27.291Z" },
+ { url = "https://files.pythonhosted.org/packages/22/4d/eaedff67fc805aeba4ba746aec891b4b24cebb1a7d078084b6300f79d063/aiohttp-3.13.5-cp314-cp314-win_amd64.whl", hash = "sha256:f85c6f327bf0b8c29da7d93b1cabb6363fb5e4e160a32fa241ed2dce21b73162", size = 464029, upload-time = "2026-03-31T21:59:29.429Z" },
+ { url = "https://files.pythonhosted.org/packages/79/11/c27d9332ee20d68dd164dc12a6ecdef2e2e35ecc97ed6cf0d2442844624b/aiohttp-3.13.5-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:1efb06900858bb618ff5cee184ae2de5828896c448403d51fb633f09e109be0a", size = 778758, upload-time = "2026-03-31T21:59:31.547Z" },
+ { url = "https://files.pythonhosted.org/packages/04/fb/377aead2e0a3ba5f09b7624f702a964bdf4f08b5b6728a9799830c80041e/aiohttp-3.13.5-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:fee86b7c4bd29bdaf0d53d14739b08a106fdda809ca5fe032a15f52fae5fe254", size = 512883, upload-time = "2026-03-31T21:59:34.098Z" },
+ { url = "https://files.pythonhosted.org/packages/bb/a6/aa109a33671f7a5d3bd78b46da9d852797c5e665bfda7d6b373f56bff2ec/aiohttp-3.13.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:20058e23909b9e65f9da62b396b77dfa95965cbe840f8def6e572538b1d32e36", size = 516668, upload-time = "2026-03-31T21:59:36.497Z" },
+ { url = "https://files.pythonhosted.org/packages/79/b3/ca078f9f2fa9563c36fb8ef89053ea2bb146d6f792c5104574d49d8acb63/aiohttp-3.13.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8cf20a8d6868cb15a73cab329ffc07291ba8c22b1b88176026106ae39aa6df0f", size = 1883461, upload-time = "2026-03-31T21:59:38.723Z" },
+ { url = "https://files.pythonhosted.org/packages/b7/e3/a7ad633ca1ca497b852233a3cce6906a56c3225fb6d9217b5e5e60b7419d/aiohttp-3.13.5-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:330f5da04c987f1d5bdb8ae189137c77139f36bd1cb23779ca1a354a4b027800", size = 1747661, upload-time = "2026-03-31T21:59:41.187Z" },
+ { url = "https://files.pythonhosted.org/packages/33/b9/cd6fe579bed34a906d3d783fe60f2fa297ef55b27bb4538438ee49d4dc41/aiohttp-3.13.5-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6f1cbf0c7926d315c3c26c2da41fd2b5d2fe01ac0e157b78caefc51a782196cf", size = 1863800, upload-time = "2026-03-31T21:59:43.84Z" },
+ { url = "https://files.pythonhosted.org/packages/c0/3f/2c1e2f5144cefa889c8afd5cf431994c32f3b29da9961698ff4e3811b79a/aiohttp-3.13.5-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:53fc049ed6390d05423ba33103ded7281fe897cf97878f369a527070bd95795b", size = 1958382, upload-time = "2026-03-31T21:59:46.187Z" },
+ { url = "https://files.pythonhosted.org/packages/66/1d/f31ec3f1013723b3babe3609e7f119c2c2fb6ef33da90061a705ef3e1bc8/aiohttp-3.13.5-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:898703aa2667e3c5ca4c54ca36cd73f58b7a38ef87a5606414799ebce4d3fd3a", size = 1803724, upload-time = "2026-03-31T21:59:48.656Z" },
+ { url = "https://files.pythonhosted.org/packages/0e/b4/57712dfc6f1542f067daa81eb61da282fab3e6f1966fca25db06c4fc62d5/aiohttp-3.13.5-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0494a01ca9584eea1e5fbd6d748e61ecff218c51b576ee1999c23db7066417d8", size = 1640027, upload-time = "2026-03-31T21:59:51.284Z" },
+ { url = "https://files.pythonhosted.org/packages/25/3c/734c878fb43ec083d8e31bf029daae1beafeae582d1b35da234739e82ee7/aiohttp-3.13.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:6cf81fe010b8c17b09495cbd15c1d35afbc8fb405c0c9cf4738e5ae3af1d65be", size = 1806644, upload-time = "2026-03-31T21:59:53.753Z" },
+ { url = "https://files.pythonhosted.org/packages/20/a5/f671e5cbec1c21d044ff3078223f949748f3a7f86b14e34a365d74a5d21f/aiohttp-3.13.5-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:c564dd5f09ddc9d8f2c2d0a301cd30a79a2cc1b46dd1a73bef8f0038863d016b", size = 1791630, upload-time = "2026-03-31T21:59:56.239Z" },
+ { url = "https://files.pythonhosted.org/packages/0b/63/fb8d0ad63a0b8a99be97deac8c04dacf0785721c158bdf23d679a87aa99e/aiohttp-3.13.5-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:2994be9f6e51046c4f864598fd9abeb4fba6e88f0b2152422c9666dcd4aea9c6", size = 1809403, upload-time = "2026-03-31T21:59:59.103Z" },
+ { url = "https://files.pythonhosted.org/packages/59/0c/bfed7f30662fcf12206481c2aac57dedee43fe1c49275e85b3a1e1742294/aiohttp-3.13.5-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:157826e2fa245d2ef46c83ea8a5faf77ca19355d278d425c29fda0beb3318037", size = 1634924, upload-time = "2026-03-31T22:00:02.116Z" },
+ { url = "https://files.pythonhosted.org/packages/17/d6/fd518d668a09fd5a3319ae5e984d4d80b9a4b3df4e21c52f02251ef5a32e/aiohttp-3.13.5-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:a8aca50daa9493e9e13c0f566201a9006f080e7c50e5e90d0b06f53146a54500", size = 1836119, upload-time = "2026-03-31T22:00:04.756Z" },
+ { url = "https://files.pythonhosted.org/packages/78/b7/15fb7a9d52e112a25b621c67b69c167805cb1f2ab8f1708a5c490d1b52fe/aiohttp-3.13.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3b13560160d07e047a93f23aaa30718606493036253d5430887514715b67c9d9", size = 1772072, upload-time = "2026-03-31T22:00:07.494Z" },
+ { url = "https://files.pythonhosted.org/packages/7e/df/57ba7f0c4a553fc2bd8b6321df236870ec6fd64a2a473a8a13d4f733214e/aiohttp-3.13.5-cp314-cp314t-win32.whl", hash = "sha256:9a0f4474b6ea6818b41f82172d799e4b3d29e22c2c520ce4357856fced9af2f8", size = 471819, upload-time = "2026-03-31T22:00:10.277Z" },
+ { url = "https://files.pythonhosted.org/packages/62/29/2f8418269e46454a26171bfdd6a055d74febf32234e474930f2f60a17145/aiohttp-3.13.5-cp314-cp314t-win_amd64.whl", hash = "sha256:18a2f6c1182c51baa1d28d68fea51513cb2a76612f038853c0ad3c145423d3d9", size = 505441, upload-time = "2026-03-31T22:00:12.791Z" },
+]
+
+[[package]]
+name = "aioitertools"
+version = "0.13.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/fd/3c/53c4a17a05fb9ea2313ee1777ff53f5e001aefd5cc85aa2f4c2d982e1e38/aioitertools-0.13.0.tar.gz", hash = "sha256:620bd241acc0bbb9ec819f1ab215866871b4bbd1f73836a55f799200ee86950c", size = 19322, upload-time = "2025-11-06T22:17:07.609Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/10/a1/510b0a7fadc6f43a6ce50152e69dbd86415240835868bb0bd9b5b88b1e06/aioitertools-0.13.0-py3-none-any.whl", hash = "sha256:0be0292b856f08dfac90e31f4739432f4cb6d7520ab9eb73e143f4f2fa5259be", size = 24182, upload-time = "2025-11-06T22:17:06.502Z" },
+]
+
+[[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, upload-time = "2025-07-03T22:54:43.528Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e", size = 7490, upload-time = "2025-07-03T22:54:42.156Z" },
+]
+
+[[package]]
+name = "annotated-doc"
+version = "0.0.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" },
+]
+
+[[package]]
+name = "anyio"
+version = "4.13.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "idna" },
+ { name = "typing-extensions", marker = "python_full_version < '3.13'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/19/14/2c5dd9f512b66549ae92767a9c7b330ae88e1932ca57876909410251fe13/anyio-4.13.0.tar.gz", hash = "sha256:334b70e641fd2221c1505b3890c69882fe4a2df910cba14d97019b90b24439dc", size = 231622, upload-time = "2026-03-24T12:59:09.671Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/da/42/e921fccf5015463e32a3cf6ee7f980a6ed0f395ceeaa45060b61d86486c2/anyio-4.13.0-py3-none-any.whl", hash = "sha256:08b310f9e24a9594186fd75b4f73f4a4152069e3853f1ed8bfbf58369f4ad708", size = 114353, upload-time = "2026-03-24T12:59:08.246Z" },
+]
+
+[[package]]
+name = "appnope"
+version = "0.1.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/35/5d/752690df9ef5b76e169e68d6a129fa6d08a7100ca7f754c89495db3c6019/appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", size = 4170, upload-time = "2024-02-06T09:43:11.258Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321, upload-time = "2024-02-06T09:43:09.663Z" },
+]
+
+[[package]]
+name = "argon2-cffi"
+version = "25.1.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "argon2-cffi-bindings" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/0e/89/ce5af8a7d472a67cc819d5d998aa8c82c5d860608c4db9f46f1162d7dab9/argon2_cffi-25.1.0.tar.gz", hash = "sha256:694ae5cc8a42f4c4e2bf2ca0e64e51e23a040c6a517a85074683d3959e1346c1", size = 45706, upload-time = "2025-06-03T06:55:32.073Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/4f/d3/a8b22fa575b297cd6e3e3b0155c7e25db170edf1c74783d6a31a2490b8d9/argon2_cffi-25.1.0-py3-none-any.whl", hash = "sha256:fdc8b074db390fccb6eb4a3604ae7231f219aa669a2652e0f20e16ba513d5741", size = 14657, upload-time = "2025-06-03T06:55:30.804Z" },
+]
+
+[[package]]
+name = "argon2-cffi-bindings"
+version = "25.1.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "cffi" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/5c/2d/db8af0df73c1cf454f71b2bbe5e356b8c1f8041c979f505b3d3186e520a9/argon2_cffi_bindings-25.1.0.tar.gz", hash = "sha256:b957f3e6ea4d55d820e40ff76f450952807013d361a65d7f28acc0acbf29229d", size = 1783441, upload-time = "2025-07-30T10:02:05.147Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/60/97/3c0a35f46e52108d4707c44b95cfe2afcafc50800b5450c197454569b776/argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:3d3f05610594151994ca9ccb3c771115bdb4daef161976a266f0dd8aa9996b8f", size = 54393, upload-time = "2025-07-30T10:01:40.97Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/f4/98bbd6ee89febd4f212696f13c03ca302b8552e7dbf9c8efa11ea4a388c3/argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:8b8efee945193e667a396cbc7b4fb7d357297d6234d30a489905d96caabde56b", size = 29328, upload-time = "2025-07-30T10:01:41.916Z" },
+ { url = "https://files.pythonhosted.org/packages/43/24/90a01c0ef12ac91a6be05969f29944643bc1e5e461155ae6559befa8f00b/argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3c6702abc36bf3ccba3f802b799505def420a1b7039862014a65db3205967f5a", size = 31269, upload-time = "2025-07-30T10:01:42.716Z" },
+ { url = "https://files.pythonhosted.org/packages/d4/d3/942aa10782b2697eee7af5e12eeff5ebb325ccfb86dd8abda54174e377e4/argon2_cffi_bindings-25.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a1c70058c6ab1e352304ac7e3b52554daadacd8d453c1752e547c76e9c99ac44", size = 86558, upload-time = "2025-07-30T10:01:43.943Z" },
+ { url = "https://files.pythonhosted.org/packages/0d/82/b484f702fec5536e71836fc2dbc8c5267b3f6e78d2d539b4eaa6f0db8bf8/argon2_cffi_bindings-25.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e2fd3bfbff3c5d74fef31a722f729bf93500910db650c925c2d6ef879a7e51cb", size = 92364, upload-time = "2025-07-30T10:01:44.887Z" },
+ { url = "https://files.pythonhosted.org/packages/c9/c1/a606ff83b3f1735f3759ad0f2cd9e038a0ad11a3de3b6c673aa41c24bb7b/argon2_cffi_bindings-25.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c4f9665de60b1b0e99bcd6be4f17d90339698ce954cfd8d9cf4f91c995165a92", size = 85637, upload-time = "2025-07-30T10:01:46.225Z" },
+ { url = "https://files.pythonhosted.org/packages/44/b4/678503f12aceb0262f84fa201f6027ed77d71c5019ae03b399b97caa2f19/argon2_cffi_bindings-25.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ba92837e4a9aa6a508c8d2d7883ed5a8f6c308c89a4790e1e447a220deb79a85", size = 91934, upload-time = "2025-07-30T10:01:47.203Z" },
+ { url = "https://files.pythonhosted.org/packages/f0/c7/f36bd08ef9bd9f0a9cff9428406651f5937ce27b6c5b07b92d41f91ae541/argon2_cffi_bindings-25.1.0-cp314-cp314t-win32.whl", hash = "sha256:84a461d4d84ae1295871329b346a97f68eade8c53b6ed9a7ca2d7467f3c8ff6f", size = 28158, upload-time = "2025-07-30T10:01:48.341Z" },
+ { url = "https://files.pythonhosted.org/packages/b3/80/0106a7448abb24a2c467bf7d527fe5413b7fdfa4ad6d6a96a43a62ef3988/argon2_cffi_bindings-25.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b55aec3565b65f56455eebc9b9f34130440404f27fe21c3b375bf1ea4d8fbae6", size = 32597, upload-time = "2025-07-30T10:01:49.112Z" },
+ { url = "https://files.pythonhosted.org/packages/05/b8/d663c9caea07e9180b2cb662772865230715cbd573ba3b5e81793d580316/argon2_cffi_bindings-25.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:87c33a52407e4c41f3b70a9c2d3f6056d88b10dad7695be708c5021673f55623", size = 28231, upload-time = "2025-07-30T10:01:49.92Z" },
+ { url = "https://files.pythonhosted.org/packages/1d/57/96b8b9f93166147826da5f90376e784a10582dd39a393c99bb62cfcf52f0/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:aecba1723ae35330a008418a91ea6cfcedf6d31e5fbaa056a166462ff066d500", size = 54121, upload-time = "2025-07-30T10:01:50.815Z" },
+ { url = "https://files.pythonhosted.org/packages/0a/08/a9bebdb2e0e602dde230bdde8021b29f71f7841bd54801bcfd514acb5dcf/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2630b6240b495dfab90aebe159ff784d08ea999aa4b0d17efa734055a07d2f44", size = 29177, upload-time = "2025-07-30T10:01:51.681Z" },
+ { url = "https://files.pythonhosted.org/packages/b6/02/d297943bcacf05e4f2a94ab6f462831dc20158614e5d067c35d4e63b9acb/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:7aef0c91e2c0fbca6fc68e7555aa60ef7008a739cbe045541e438373bc54d2b0", size = 31090, upload-time = "2025-07-30T10:01:53.184Z" },
+ { url = "https://files.pythonhosted.org/packages/c1/93/44365f3d75053e53893ec6d733e4a5e3147502663554b4d864587c7828a7/argon2_cffi_bindings-25.1.0-cp39-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e021e87faa76ae0d413b619fe2b65ab9a037f24c60a1e6cc43457ae20de6dc6", size = 81246, upload-time = "2025-07-30T10:01:54.145Z" },
+ { url = "https://files.pythonhosted.org/packages/09/52/94108adfdd6e2ddf58be64f959a0b9c7d4ef2fa71086c38356d22dc501ea/argon2_cffi_bindings-25.1.0-cp39-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d3e924cfc503018a714f94a49a149fdc0b644eaead5d1f089330399134fa028a", size = 87126, upload-time = "2025-07-30T10:01:55.074Z" },
+ { url = "https://files.pythonhosted.org/packages/72/70/7a2993a12b0ffa2a9271259b79cc616e2389ed1a4d93842fac5a1f923ffd/argon2_cffi_bindings-25.1.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c87b72589133f0346a1cb8d5ecca4b933e3c9b64656c9d175270a000e73b288d", size = 80343, upload-time = "2025-07-30T10:01:56.007Z" },
+ { url = "https://files.pythonhosted.org/packages/78/9a/4e5157d893ffc712b74dbd868c7f62365618266982b64accab26bab01edc/argon2_cffi_bindings-25.1.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1db89609c06afa1a214a69a462ea741cf735b29a57530478c06eb81dd403de99", size = 86777, upload-time = "2025-07-30T10:01:56.943Z" },
+ { url = "https://files.pythonhosted.org/packages/74/cd/15777dfde1c29d96de7f18edf4cc94c385646852e7c7b0320aa91ccca583/argon2_cffi_bindings-25.1.0-cp39-abi3-win32.whl", hash = "sha256:473bcb5f82924b1becbb637b63303ec8d10e84c8d241119419897a26116515d2", size = 27180, upload-time = "2025-07-30T10:01:57.759Z" },
+ { url = "https://files.pythonhosted.org/packages/e2/c6/a759ece8f1829d1f162261226fbfd2c6832b3ff7657384045286d2afa384/argon2_cffi_bindings-25.1.0-cp39-abi3-win_amd64.whl", hash = "sha256:a98cd7d17e9f7ce244c0803cad3c23a7d379c301ba618a5fa76a67d116618b98", size = 31715, upload-time = "2025-07-30T10:01:58.56Z" },
+ { url = "https://files.pythonhosted.org/packages/42/b9/f8d6fa329ab25128b7e98fd83a3cb34d9db5b059a9847eddb840a0af45dd/argon2_cffi_bindings-25.1.0-cp39-abi3-win_arm64.whl", hash = "sha256:b0fdbcf513833809c882823f98dc2f931cf659d9a1429616ac3adebb49f5db94", size = 27149, upload-time = "2025-07-30T10:01:59.329Z" },
+]
+
+[[package]]
+name = "arrow"
+version = "1.4.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "python-dateutil" },
+ { name = "tzdata" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/b9/33/032cdc44182491aa708d06a68b62434140d8c50820a087fac7af37703357/arrow-1.4.0.tar.gz", hash = "sha256:ed0cc050e98001b8779e84d461b0098c4ac597e88704a655582b21d116e526d7", size = 152931, upload-time = "2025-10-18T17:46:46.761Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ed/c9/d7977eaacb9df673210491da99e6a247e93df98c715fc43fd136ce1d3d33/arrow-1.4.0-py3-none-any.whl", hash = "sha256:749f0769958ebdc79c173ff0b0670d59051a535fa26e8eba02953dc19eb43205", size = 68797, upload-time = "2025-10-18T17:46:45.663Z" },
+]
+
+[[package]]
+name = "asttokens"
+version = "3.0.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/be/a5/8e3f9b6771b0b408517c82d97aed8f2036509bc247d46114925e32fe33f0/asttokens-3.0.1.tar.gz", hash = "sha256:71a4ee5de0bde6a31d64f6b13f2293ac190344478f081c3d1bccfcf5eacb0cb7", size = 62308, upload-time = "2025-11-15T16:43:48.578Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl", hash = "sha256:15a3ebc0f43c2d0a50eeafea25e19046c68398e487b9f1f5b517f7c0f40f976a", size = 27047, upload-time = "2025-11-15T16:43:16.109Z" },
+]
+
+[[package]]
+name = "async-lru"
+version = "2.3.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/e8/1f/989ecfef8e64109a489fff357450cb73fa73a865a92bd8c272170a6922c2/async_lru-2.3.0.tar.gz", hash = "sha256:89bdb258a0140d7313cf8f4031d816a042202faa61d0ab310a0a538baa1c24b6", size = 16332, upload-time = "2026-03-19T01:04:32.413Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e5/e2/c2e3abf398f80732e58b03be77bde9022550d221dd8781bf586bd4d97cc1/async_lru-2.3.0-py3-none-any.whl", hash = "sha256:eea27b01841909316f2cc739807acea1c623df2be8c5cfad7583286397bb8315", size = 8403, upload-time = "2026-03-19T01:04:30.883Z" },
+]
+
+[[package]]
+name = "attrs"
+version = "26.1.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/9a/8e/82a0fe20a541c03148528be8cac2408564a6c9a0cc7e9171802bc1d26985/attrs-26.1.0.tar.gz", hash = "sha256:d03ceb89cb322a8fd706d4fb91940737b6642aa36998fe130a9bc96c985eff32", size = 952055, upload-time = "2026-03-19T14:22:25.026Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl", hash = "sha256:c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309", size = 67548, upload-time = "2026-03-19T14:22:23.645Z" },
+]
+
+[[package]]
+name = "babel"
+version = "2.18.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/7d/b2/51899539b6ceeeb420d40ed3cd4b7a40519404f9baf3d4ac99dc413a834b/babel-2.18.0.tar.gz", hash = "sha256:b80b99a14bd085fcacfa15c9165f651fbb3406e66cc603abf11c5750937c992d", size = 9959554, upload-time = "2026-02-01T12:30:56.078Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl", hash = "sha256:e2b422b277c2b9a9630c1d7903c2a00d0830c409c59ac8cae9081c92f1aeba35", size = 10196845, upload-time = "2026-02-01T12:30:53.445Z" },
+]
+
+[[package]]
+name = "beautifulsoup4"
+version = "4.14.3"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "soupsieve" },
+ { name = "typing-extensions" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/c3/b0/1c6a16426d389813b48d95e26898aff79abbde42ad353958ad95cc8c9b21/beautifulsoup4-4.14.3.tar.gz", hash = "sha256:6292b1c5186d356bba669ef9f7f051757099565ad9ada5dd630bd9de5fa7fb86", size = 627737, upload-time = "2025-11-30T15:08:26.084Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl", hash = "sha256:0918bfe44902e6ad8d57732ba310582e98da931428d231a5ecb9e7c703a735bb", size = 107721, upload-time = "2025-11-30T15:08:24.087Z" },
+]
+
+[[package]]
+name = "bleach"
+version = "6.3.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "webencodings" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/07/18/3c8523962314be6bf4c8989c79ad9531c825210dd13a8669f6b84336e8bd/bleach-6.3.0.tar.gz", hash = "sha256:6f3b91b1c0a02bb9a78b5a454c92506aa0fdf197e1d5e114d2e00c6f64306d22", size = 203533, upload-time = "2025-10-27T17:57:39.211Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl", hash = "sha256:fe10ec77c93ddf3d13a73b035abaac7a9f5e436513864ccdad516693213c65d6", size = 164437, upload-time = "2025-10-27T17:57:37.538Z" },
+]
+
+[package.optional-dependencies]
+css = [
+ { name = "tinycss2" },
+]
+
+[[package]]
+name = "botocore"
+version = "1.43.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "jmespath" },
+ { name = "python-dateutil" },
+ { name = "urllib3" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/28/79/2f4be1896db3db7ccf44504253a175d56b6bd6b669619edc5147d1aa21ea/botocore-1.43.0.tar.gz", hash = "sha256:e933b31a2d644253e1d029d7d39e99ba41b87e29300534f189744cc438cdf928", size = 15286817, upload-time = "2026-04-29T22:07:31.723Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/bf/4b/afc1fef8a43bafb139f57f73bbd70df82807af5934321e8112ae50668827/botocore-1.43.0-py3-none-any.whl", hash = "sha256:cc5b15eaec3c6eac05d8012cb5ef17ebe891beb88a16ca13c374bfaece1241e6", size = 14970102, upload-time = "2026-04-29T22:07:27Z" },
+]
+
+[[package]]
+name = "ccoa"
+version = "0.1.0"
+source = { editable = "." }
+dependencies = [
+ { name = "fasttext-numpy2-wheel" },
+ { name = "fsspec" },
+ { name = "huggingface-hub" },
+ { name = "pandas" },
+ { name = "trafilatura" },
+ { name = "warcio", extra = ["s3"] },
+]
+
+[package.optional-dependencies]
+all = [
+ { name = "jupyter" },
+ { name = "matplotlib" },
+ { name = "nbconvert" },
+ { name = "s3fs" },
+ { name = "scipy" },
+]
+notebooks = [
+ { name = "jupyter" },
+ { name = "matplotlib" },
+ { name = "nbconvert" },
+ { name = "scipy" },
+]
+s3 = [
+ { name = "s3fs" },
+]
+
+[package.dev-dependencies]
+dev = [
+ { name = "pytest" },
+ { name = "ruff" },
+]
+
+[package.metadata]
+requires-dist = [
+ { name = "ccoa", extras = ["notebooks"], marker = "extra == 'all'" },
+ { name = "ccoa", extras = ["s3"], marker = "extra == 'all'" },
+ { name = "fasttext-numpy2-wheel" },
+ { name = "fsspec", specifier = ">=2024.0" },
+ { name = "huggingface-hub", specifier = ">=0.24" },
+ { name = "jupyter", marker = "extra == 'notebooks'" },
+ { name = "matplotlib", marker = "extra == 'notebooks'" },
+ { name = "nbconvert", marker = "extra == 'notebooks'" },
+ { name = "pandas" },
+ { name = "s3fs", marker = "extra == 's3'" },
+ { name = "scipy", marker = "extra == 'notebooks'" },
+ { name = "trafilatura", specifier = ">=1.8.0,<1.12.0" },
+ { name = "warcio", extras = ["s3"], specifier = ">=1.7" },
+]
+provides-extras = ["notebooks", "s3", "all"]
+
+[package.metadata.requires-dev]
+dev = [
+ { name = "pytest", specifier = ">=8" },
+ { name = "ruff", specifier = ">=0.6" },
+]
+
+[[package]]
+name = "certifi"
+version = "2026.5.20"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f3/ce/ee2ecad540810a79593028e88299baeae54d346cc7a0d94b6199988b89b1/certifi-2026.5.20.tar.gz", hash = "sha256:69dea482ab64caa7b9f6aba1c6bf48bb6a5448d1c0f1b17ab42ad8c763a5344d", size = 135422, upload-time = "2026-05-20T11:46:50.073Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/59/8c/57e832b7af6d7c5abe66eb3fbe3a3a32f4d11ea23a1aa7131371035be991/certifi-2026.5.20-py3-none-any.whl", hash = "sha256:3c52e209ba0a4ad7aebe60436a4ab349c39e1e602e8c134221e546902ad25897", size = 134134, upload-time = "2026-05-20T11:46:48.578Z" },
+]
+
+[[package]]
+name = "cffi"
+version = "2.0.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pycparser", marker = "implementation_name != 'PyPy'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ea/47/4f61023ea636104d4f16ab488e268b93008c3d0bb76893b1b31db1f96802/cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d", size = 185271, upload-time = "2025-09-08T23:22:44.795Z" },
+ { url = "https://files.pythonhosted.org/packages/df/a2/781b623f57358e360d62cdd7a8c681f074a71d445418a776eef0aadb4ab4/cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c", size = 181048, upload-time = "2025-09-08T23:22:45.938Z" },
+ { url = "https://files.pythonhosted.org/packages/ff/df/a4f0fbd47331ceeba3d37c2e51e9dfc9722498becbeec2bd8bc856c9538a/cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe", size = 212529, upload-time = "2025-09-08T23:22:47.349Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", size = 220097, upload-time = "2025-09-08T23:22:48.677Z" },
+ { url = "https://files.pythonhosted.org/packages/c2/95/7a135d52a50dfa7c882ab0ac17e8dc11cec9d55d2c18dda414c051c5e69e/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e", size = 207983, upload-time = "2025-09-08T23:22:50.06Z" },
+ { url = "https://files.pythonhosted.org/packages/3a/c8/15cb9ada8895957ea171c62dc78ff3e99159ee7adb13c0123c001a2546c1/cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037", size = 206519, upload-time = "2025-09-08T23:22:51.364Z" },
+ { url = "https://files.pythonhosted.org/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", size = 219572, upload-time = "2025-09-08T23:22:52.902Z" },
+ { url = "https://files.pythonhosted.org/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", size = 222963, upload-time = "2025-09-08T23:22:54.518Z" },
+ { url = "https://files.pythonhosted.org/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", size = 221361, upload-time = "2025-09-08T23:22:55.867Z" },
+ { url = "https://files.pythonhosted.org/packages/7b/2b/2b6435f76bfeb6bbf055596976da087377ede68df465419d192acf00c437/cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18", size = 172932, upload-time = "2025-09-08T23:22:57.188Z" },
+ { url = "https://files.pythonhosted.org/packages/f8/ed/13bd4418627013bec4ed6e54283b1959cf6db888048c7cf4b4c3b5b36002/cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5", size = 183557, upload-time = "2025-09-08T23:22:58.351Z" },
+ { url = "https://files.pythonhosted.org/packages/95/31/9f7f93ad2f8eff1dbc1c3656d7ca5bfd8fb52c9d786b4dcf19b2d02217fa/cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6", size = 177762, upload-time = "2025-09-08T23:22:59.668Z" },
+ { url = "https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb", size = 185230, upload-time = "2025-09-08T23:23:00.879Z" },
+ { url = "https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca", size = 181043, upload-time = "2025-09-08T23:23:02.231Z" },
+ { url = "https://files.pythonhosted.org/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", size = 212446, upload-time = "2025-09-08T23:23:03.472Z" },
+ { url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101, upload-time = "2025-09-08T23:23:04.792Z" },
+ { url = "https://files.pythonhosted.org/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", size = 207948, upload-time = "2025-09-08T23:23:06.127Z" },
+ { url = "https://files.pythonhosted.org/packages/cb/1e/a5a1bd6f1fb30f22573f76533de12a00bf274abcdc55c8edab639078abb6/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", size = 206422, upload-time = "2025-09-08T23:23:07.753Z" },
+ { url = "https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499, upload-time = "2025-09-08T23:23:09.648Z" },
+ { url = "https://files.pythonhosted.org/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928, upload-time = "2025-09-08T23:23:10.928Z" },
+ { url = "https://files.pythonhosted.org/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302, upload-time = "2025-09-08T23:23:12.42Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/6d/bf9bda840d5f1dfdbf0feca87fbdb64a918a69bca42cfa0ba7b137c48cb8/cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27", size = 172909, upload-time = "2025-09-08T23:23:14.32Z" },
+ { url = "https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75", size = 183402, upload-time = "2025-09-08T23:23:15.535Z" },
+ { url = "https://files.pythonhosted.org/packages/cb/0e/02ceeec9a7d6ee63bb596121c2c8e9b3a9e150936f4fbef6ca1943e6137c/cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91", size = 177780, upload-time = "2025-09-08T23:23:16.761Z" },
+ { url = "https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5", size = 185320, upload-time = "2025-09-08T23:23:18.087Z" },
+ { url = "https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13", size = 181487, upload-time = "2025-09-08T23:23:19.622Z" },
+ { url = "https://files.pythonhosted.org/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", size = 220049, upload-time = "2025-09-08T23:23:20.853Z" },
+ { url = "https://files.pythonhosted.org/packages/b4/89/76799151d9c2d2d1ead63c2429da9ea9d7aac304603de0c6e8764e6e8e70/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c", size = 207793, upload-time = "2025-09-08T23:23:22.08Z" },
+ { url = "https://files.pythonhosted.org/packages/bb/dd/3465b14bb9e24ee24cb88c9e3730f6de63111fffe513492bf8c808a3547e/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef", size = 206300, upload-time = "2025-09-08T23:23:23.314Z" },
+ { url = "https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", size = 219244, upload-time = "2025-09-08T23:23:24.541Z" },
+ { url = "https://files.pythonhosted.org/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", size = 222828, upload-time = "2025-09-08T23:23:26.143Z" },
+ { url = "https://files.pythonhosted.org/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", size = 220926, upload-time = "2025-09-08T23:23:27.873Z" },
+ { url = "https://files.pythonhosted.org/packages/3e/aa/df335faa45b395396fcbc03de2dfcab242cd61a9900e914fe682a59170b1/cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f", size = 175328, upload-time = "2025-09-08T23:23:44.61Z" },
+ { url = "https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25", size = 185650, upload-time = "2025-09-08T23:23:45.848Z" },
+ { url = "https://files.pythonhosted.org/packages/9f/2c/98ece204b9d35a7366b5b2c6539c350313ca13932143e79dc133ba757104/cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad", size = 180687, upload-time = "2025-09-08T23:23:47.105Z" },
+ { url = "https://files.pythonhosted.org/packages/3e/61/c768e4d548bfa607abcda77423448df8c471f25dbe64fb2ef6d555eae006/cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9", size = 188773, upload-time = "2025-09-08T23:23:29.347Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/ea/5f76bce7cf6fcd0ab1a1058b5af899bfbef198bea4d5686da88471ea0336/cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d", size = 185013, upload-time = "2025-09-08T23:23:30.63Z" },
+ { url = "https://files.pythonhosted.org/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", size = 221593, upload-time = "2025-09-08T23:23:31.91Z" },
+ { url = "https://files.pythonhosted.org/packages/e0/0d/eb704606dfe8033e7128df5e90fee946bbcb64a04fcdaa97321309004000/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8", size = 209354, upload-time = "2025-09-08T23:23:33.214Z" },
+ { url = "https://files.pythonhosted.org/packages/d8/19/3c435d727b368ca475fb8742ab97c9cb13a0de600ce86f62eab7fa3eea60/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc", size = 208480, upload-time = "2025-09-08T23:23:34.495Z" },
+ { url = "https://files.pythonhosted.org/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", size = 221584, upload-time = "2025-09-08T23:23:36.096Z" },
+ { url = "https://files.pythonhosted.org/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", size = 224443, upload-time = "2025-09-08T23:23:37.328Z" },
+ { url = "https://files.pythonhosted.org/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437, upload-time = "2025-09-08T23:23:38.945Z" },
+ { url = "https://files.pythonhosted.org/packages/a0/1d/ec1a60bd1a10daa292d3cd6bb0b359a81607154fb8165f3ec95fe003b85c/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e", size = 180487, upload-time = "2025-09-08T23:23:40.423Z" },
+ { url = "https://files.pythonhosted.org/packages/bf/41/4c1168c74fac325c0c8156f04b6749c8b6a8f405bbf91413ba088359f60d/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6", size = 191726, upload-time = "2025-09-08T23:23:41.742Z" },
+ { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload-time = "2025-09-08T23:23:43.004Z" },
+]
+
+[[package]]
+name = "charset-normalizer"
+version = "3.4.7"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/e7/a1/67fe25fac3c7642725500a3f6cfe5821ad557c3abb11c9d20d12c7008d3e/charset_normalizer-3.4.7.tar.gz", hash = "sha256:ae89db9e5f98a11a4bf50407d4363e7b09b31e55bc117b4f7d80aab97ba009e5", size = 144271, upload-time = "2026-04-02T09:28:39.342Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/0c/eb/4fc8d0a7110eb5fc9cc161723a34a8a6c200ce3b4fbf681bc86feee22308/charset_normalizer-3.4.7-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:eca9705049ad3c7345d574e3510665cb2cf844c2f2dcfe675332677f081cbd46", size = 311328, upload-time = "2026-04-02T09:26:24.331Z" },
+ { url = "https://files.pythonhosted.org/packages/f8/e3/0fadc706008ac9d7b9b5be6dc767c05f9d3e5df51744ce4cc9605de7b9f4/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6178f72c5508bfc5fd446a5905e698c6212932f25bcdd4b47a757a50605a90e2", size = 208061, upload-time = "2026-04-02T09:26:25.568Z" },
+ { url = "https://files.pythonhosted.org/packages/42/f0/3dd1045c47f4a4604df85ec18ad093912ae1344ac706993aff91d38773a2/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e1421b502d83040e6d7fb2fb18dff63957f720da3d77b2fbd3187ceb63755d7b", size = 229031, upload-time = "2026-04-02T09:26:26.865Z" },
+ { url = "https://files.pythonhosted.org/packages/dc/67/675a46eb016118a2fbde5a277a5d15f4f69d5f3f5f338e5ee2f8948fcf43/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:edac0f1ab77644605be2cbba52e6b7f630731fc42b34cb0f634be1a6eface56a", size = 225239, upload-time = "2026-04-02T09:26:28.044Z" },
+ { url = "https://files.pythonhosted.org/packages/4b/f8/d0118a2f5f23b02cd166fa385c60f9b0d4f9194f574e2b31cef350ad7223/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5649fd1c7bade02f320a462fdefd0b4bd3ce036065836d4f42e0de958038e116", size = 216589, upload-time = "2026-04-02T09:26:29.239Z" },
+ { url = "https://files.pythonhosted.org/packages/b1/f1/6d2b0b261b6c4ceef0fcb0d17a01cc5bc53586c2d4796fa04b5c540bc13d/charset_normalizer-3.4.7-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:203104ed3e428044fd943bc4bf45fa73c0730391f9621e37fe39ecf477b128cb", size = 202733, upload-time = "2026-04-02T09:26:30.5Z" },
+ { url = "https://files.pythonhosted.org/packages/6f/c0/7b1f943f7e87cc3db9626ba17807d042c38645f0a1d4415c7a14afb5591f/charset_normalizer-3.4.7-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:298930cec56029e05497a76988377cbd7457ba864beeea92ad7e844fe74cd1f1", size = 212652, upload-time = "2026-04-02T09:26:31.709Z" },
+ { url = "https://files.pythonhosted.org/packages/38/dd/5a9ab159fe45c6e72079398f277b7d2b523e7f716acc489726115a910097/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:708838739abf24b2ceb208d0e22403dd018faeef86ddac04319a62ae884c4f15", size = 211229, upload-time = "2026-04-02T09:26:33.282Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/ff/531a1cad5ca855d1c1a8b69cb71abfd6d85c0291580146fda7c82857caa1/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:0f7eb884681e3938906ed0434f20c63046eacd0111c4ba96f27b76084cd679f5", size = 203552, upload-time = "2026-04-02T09:26:34.845Z" },
+ { url = "https://files.pythonhosted.org/packages/c1/4c/a5fb52d528a8ca41f7598cb619409ece30a169fbdf9cdce592e53b46c3a6/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4dc1e73c36828f982bfe79fadf5919923f8a6f4df2860804db9a98c48824ce8d", size = 230806, upload-time = "2026-04-02T09:26:36.152Z" },
+ { url = "https://files.pythonhosted.org/packages/59/7a/071feed8124111a32b316b33ae4de83d36923039ef8cf48120266844285b/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:aed52fea0513bac0ccde438c188c8a471c4e0f457c2dd20cdbf6ea7a450046c7", size = 212316, upload-time = "2026-04-02T09:26:37.672Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/35/f7dba3994312d7ba508e041eaac39a36b120f32d4c8662b8814dab876431/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:fea24543955a6a729c45a73fe90e08c743f0b3334bbf3201e6c4bc1b0c7fa464", size = 227274, upload-time = "2026-04-02T09:26:38.93Z" },
+ { url = "https://files.pythonhosted.org/packages/8a/2d/a572df5c9204ab7688ec1edc895a73ebded3b023bb07364710b05dd1c9be/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bb6d88045545b26da47aa879dd4a89a71d1dce0f0e549b1abcb31dfe4a8eac49", size = 218468, upload-time = "2026-04-02T09:26:40.17Z" },
+ { url = "https://files.pythonhosted.org/packages/86/eb/890922a8b03a568ca2f336c36585a4713c55d4d67bf0f0c78924be6315ca/charset_normalizer-3.4.7-cp312-cp312-win32.whl", hash = "sha256:2257141f39fe65a3fdf38aeccae4b953e5f3b3324f4ff0daf9f15b8518666a2c", size = 148460, upload-time = "2026-04-02T09:26:41.416Z" },
+ { url = "https://files.pythonhosted.org/packages/35/d9/0e7dffa06c5ab081f75b1b786f0aefc88365825dfcd0ac544bdb7b2b6853/charset_normalizer-3.4.7-cp312-cp312-win_amd64.whl", hash = "sha256:5ed6ab538499c8644b8a3e18debabcd7ce684f3fa91cf867521a7a0279cab2d6", size = 159330, upload-time = "2026-04-02T09:26:42.554Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/5d/481bcc2a7c88ea6b0878c299547843b2521ccbc40980cb406267088bc701/charset_normalizer-3.4.7-cp312-cp312-win_arm64.whl", hash = "sha256:56be790f86bfb2c98fb742ce566dfb4816e5a83384616ab59c49e0604d49c51d", size = 147828, upload-time = "2026-04-02T09:26:44.075Z" },
+ { url = "https://files.pythonhosted.org/packages/c1/3b/66777e39d3ae1ddc77ee606be4ec6d8cbd4c801f65e5a1b6f2b11b8346dd/charset_normalizer-3.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f496c9c3cc02230093d8330875c4c3cdfc3b73612a5fd921c65d39cbcef08063", size = 309627, upload-time = "2026-04-02T09:26:45.198Z" },
+ { url = "https://files.pythonhosted.org/packages/2e/4e/b7f84e617b4854ade48a1b7915c8ccfadeba444d2a18c291f696e37f0d3b/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ea948db76d31190bf08bd371623927ee1339d5f2a0b4b1b4a4439a65298703c", size = 207008, upload-time = "2026-04-02T09:26:46.824Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/bb/ec73c0257c9e11b268f018f068f5d00aa0ef8c8b09f7753ebd5f2880e248/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a277ab8928b9f299723bc1a2dabb1265911b1a76341f90a510368ca44ad9ab66", size = 228303, upload-time = "2026-04-02T09:26:48.397Z" },
+ { url = "https://files.pythonhosted.org/packages/85/fb/32d1f5033484494619f701e719429c69b766bfc4dbc61aa9e9c8c166528b/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3bec022aec2c514d9cf199522a802bd007cd588ab17ab2525f20f9c34d067c18", size = 224282, upload-time = "2026-04-02T09:26:49.684Z" },
+ { url = "https://files.pythonhosted.org/packages/fa/07/330e3a0dda4c404d6da83b327270906e9654a24f6c546dc886a0eb0ffb23/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e044c39e41b92c845bc815e5ae4230804e8e7bc29e399b0437d64222d92809dd", size = 215595, upload-time = "2026-04-02T09:26:50.915Z" },
+ { url = "https://files.pythonhosted.org/packages/e3/7c/fc890655786e423f02556e0216d4b8c6bcb6bdfa890160dc66bf52dee468/charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:f495a1652cf3fbab2eb0639776dad966c2fb874d79d87ca07f9d5f059b8bd215", size = 201986, upload-time = "2026-04-02T09:26:52.197Z" },
+ { url = "https://files.pythonhosted.org/packages/d8/97/bfb18b3db2aed3b90cf54dc292ad79fdd5ad65c4eae454099475cbeadd0d/charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e712b419df8ba5e42b226c510472b37bd57b38e897d3eca5e8cfd410a29fa859", size = 211711, upload-time = "2026-04-02T09:26:53.49Z" },
+ { url = "https://files.pythonhosted.org/packages/6f/a5/a581c13798546a7fd557c82614a5c65a13df2157e9ad6373166d2a3e645d/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7804338df6fcc08105c7745f1502ba68d900f45fd770d5bdd5288ddccb8a42d8", size = 210036, upload-time = "2026-04-02T09:26:54.975Z" },
+ { url = "https://files.pythonhosted.org/packages/8c/bf/b3ab5bcb478e4193d517644b0fb2bf5497fbceeaa7a1bc0f4d5b50953861/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:481551899c856c704d58119b5025793fa6730adda3571971af568f66d2424bb5", size = 202998, upload-time = "2026-04-02T09:26:56.303Z" },
+ { url = "https://files.pythonhosted.org/packages/e7/4e/23efd79b65d314fa320ec6017b4b5834d5c12a58ba4610aa353af2e2f577/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f59099f9b66f0d7145115e6f80dd8b1d847176df89b234a5a6b3f00437aa0832", size = 230056, upload-time = "2026-04-02T09:26:57.554Z" },
+ { url = "https://files.pythonhosted.org/packages/b9/9f/1e1941bc3f0e01df116e68dc37a55c4d249df5e6fa77f008841aef68264f/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:f59ad4c0e8f6bba240a9bb85504faa1ab438237199d4cce5f622761507b8f6a6", size = 211537, upload-time = "2026-04-02T09:26:58.843Z" },
+ { url = "https://files.pythonhosted.org/packages/80/0f/088cbb3020d44428964a6c97fe1edfb1b9550396bf6d278330281e8b709c/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:3dedcc22d73ec993f42055eff4fcfed9318d1eeb9a6606c55892a26964964e48", size = 226176, upload-time = "2026-04-02T09:27:00.437Z" },
+ { url = "https://files.pythonhosted.org/packages/6a/9f/130394f9bbe06f4f63e22641d32fc9b202b7e251c9aef4db044324dac493/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:64f02c6841d7d83f832cd97ccf8eb8a906d06eb95d5276069175c696b024b60a", size = 217723, upload-time = "2026-04-02T09:27:02.021Z" },
+ { url = "https://files.pythonhosted.org/packages/73/55/c469897448a06e49f8fa03f6caae97074fde823f432a98f979cc42b90e69/charset_normalizer-3.4.7-cp313-cp313-win32.whl", hash = "sha256:4042d5c8f957e15221d423ba781e85d553722fc4113f523f2feb7b188cc34c5e", size = 148085, upload-time = "2026-04-02T09:27:03.192Z" },
+ { url = "https://files.pythonhosted.org/packages/5d/78/1b74c5bbb3f99b77a1715c91b3e0b5bdb6fe302d95ace4f5b1bec37b0167/charset_normalizer-3.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:3946fa46a0cf3e4c8cb1cc52f56bb536310d34f25f01ca9b6c16afa767dab110", size = 158819, upload-time = "2026-04-02T09:27:04.454Z" },
+ { url = "https://files.pythonhosted.org/packages/68/86/46bd42279d323deb8687c4a5a811fd548cb7d1de10cf6535d099877a9a9f/charset_normalizer-3.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:80d04837f55fc81da168b98de4f4b797ef007fc8a79ab71c6ec9bc4dd662b15b", size = 147915, upload-time = "2026-04-02T09:27:05.971Z" },
+ { url = "https://files.pythonhosted.org/packages/97/c8/c67cb8c70e19ef1960b97b22ed2a1567711de46c4ddf19799923adc836c2/charset_normalizer-3.4.7-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:c36c333c39be2dbca264d7803333c896ab8fa7d4d6f0ab7edb7dfd7aea6e98c0", size = 309234, upload-time = "2026-04-02T09:27:07.194Z" },
+ { url = "https://files.pythonhosted.org/packages/99/85/c091fdee33f20de70d6c8b522743b6f831a2f1cd3ff86de4c6a827c48a76/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c2aed2e5e41f24ea8ef1590b8e848a79b56f3a5564a65ceec43c9d692dc7d8a", size = 208042, upload-time = "2026-04-02T09:27:08.749Z" },
+ { url = "https://files.pythonhosted.org/packages/87/1c/ab2ce611b984d2fd5d86a5a8a19c1ae26acac6bad967da4967562c75114d/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:54523e136b8948060c0fa0bc7b1b50c32c186f2fceee897a495406bb6e311d2b", size = 228706, upload-time = "2026-04-02T09:27:09.951Z" },
+ { url = "https://files.pythonhosted.org/packages/a8/29/2b1d2cb00bf085f59d29eb773ce58ec2d325430f8c216804a0a5cd83cbca/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:715479b9a2802ecac752a3b0efa2b0b60285cf962ee38414211abdfccc233b41", size = 224727, upload-time = "2026-04-02T09:27:11.175Z" },
+ { url = "https://files.pythonhosted.org/packages/47/5c/032c2d5a07fe4d4855fea851209cca2b6f03ebeb6d4e3afdb3358386a684/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bd6c2a1c7573c64738d716488d2cdd3c00e340e4835707d8fdb8dc1a66ef164e", size = 215882, upload-time = "2026-04-02T09:27:12.446Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/c2/356065d5a8b78ed04499cae5f339f091946a6a74f91e03476c33f0ab7100/charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:c45e9440fb78f8ddabcf714b68f936737a121355bf59f3907f4e17721b9d1aae", size = 200860, upload-time = "2026-04-02T09:27:13.721Z" },
+ { url = "https://files.pythonhosted.org/packages/0c/cd/a32a84217ced5039f53b29f460962abb2d4420def55afabe45b1c3c7483d/charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3534e7dcbdcf757da6b85a0bbf5b6868786d5982dd959b065e65481644817a18", size = 211564, upload-time = "2026-04-02T09:27:15.272Z" },
+ { url = "https://files.pythonhosted.org/packages/44/86/58e6f13ce26cc3b8f4a36b94a0f22ae2f00a72534520f4ae6857c4b81f89/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e8ac484bf18ce6975760921bb6148041faa8fef0547200386ea0b52b5d27bf7b", size = 211276, upload-time = "2026-04-02T09:27:16.834Z" },
+ { url = "https://files.pythonhosted.org/packages/8f/fe/d17c32dc72e17e155e06883efa84514ca375f8a528ba2546bee73fc4df81/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:a5fe03b42827c13cdccd08e6c0247b6a6d4b5e3cdc53fd1749f5896adcdc2356", size = 201238, upload-time = "2026-04-02T09:27:18.229Z" },
+ { url = "https://files.pythonhosted.org/packages/6a/29/f33daa50b06525a237451cdb6c69da366c381a3dadcd833fa5676bc468b3/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:2d6eb928e13016cea4f1f21d1e10c1cebd5a421bc57ddf5b1142ae3f86824fab", size = 230189, upload-time = "2026-04-02T09:27:19.445Z" },
+ { url = "https://files.pythonhosted.org/packages/b6/6e/52c84015394a6a0bdcd435210a7e944c5f94ea1055f5cc5d56c5fe368e7b/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e74327fb75de8986940def6e8dee4f127cc9752bee7355bb323cc5b2659b6d46", size = 211352, upload-time = "2026-04-02T09:27:20.79Z" },
+ { url = "https://files.pythonhosted.org/packages/8c/d7/4353be581b373033fb9198bf1da3cf8f09c1082561e8e922aa7b39bf9fe8/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d6038d37043bced98a66e68d3aa2b6a35505dc01328cd65217cefe82f25def44", size = 227024, upload-time = "2026-04-02T09:27:22.063Z" },
+ { url = "https://files.pythonhosted.org/packages/30/45/99d18aa925bd1740098ccd3060e238e21115fffbfdcb8f3ece837d0ace6c/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7579e913a5339fb8fa133f6bbcfd8e6749696206cf05acdbdca71a1b436d8e72", size = 217869, upload-time = "2026-04-02T09:27:23.486Z" },
+ { url = "https://files.pythonhosted.org/packages/5c/05/5ee478aa53f4bb7996482153d4bfe1b89e0f087f0ab6b294fcf92d595873/charset_normalizer-3.4.7-cp314-cp314-win32.whl", hash = "sha256:5b77459df20e08151cd6f8b9ef8ef1f961ef73d85c21a555c7eed5b79410ec10", size = 148541, upload-time = "2026-04-02T09:27:25.146Z" },
+ { url = "https://files.pythonhosted.org/packages/48/77/72dcb0921b2ce86420b2d79d454c7022bf5be40202a2a07906b9f2a35c97/charset_normalizer-3.4.7-cp314-cp314-win_amd64.whl", hash = "sha256:92a0a01ead5e668468e952e4238cccd7c537364eb7d851ab144ab6627dbbe12f", size = 159634, upload-time = "2026-04-02T09:27:26.642Z" },
+ { url = "https://files.pythonhosted.org/packages/c6/a3/c2369911cd72f02386e4e340770f6e158c7980267da16af8f668217abaa0/charset_normalizer-3.4.7-cp314-cp314-win_arm64.whl", hash = "sha256:67f6279d125ca0046a7fd386d01b311c6363844deac3e5b069b514ba3e63c246", size = 148384, upload-time = "2026-04-02T09:27:28.271Z" },
+ { url = "https://files.pythonhosted.org/packages/94/09/7e8a7f73d24dba1f0035fbbf014d2c36828fc1bf9c88f84093e57d315935/charset_normalizer-3.4.7-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:effc3f449787117233702311a1b7d8f59cba9ced946ba727bdc329ec69028e24", size = 330133, upload-time = "2026-04-02T09:27:29.474Z" },
+ { url = "https://files.pythonhosted.org/packages/8d/da/96975ddb11f8e977f706f45cddd8540fd8242f71ecdb5d18a80723dcf62c/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fbccdc05410c9ee21bbf16a35f4c1d16123dcdeb8a1d38f33654fa21d0234f79", size = 216257, upload-time = "2026-04-02T09:27:30.793Z" },
+ { url = "https://files.pythonhosted.org/packages/e5/e8/1d63bf8ef2d388e95c64b2098f45f84758f6d102a087552da1485912637b/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:733784b6d6def852c814bce5f318d25da2ee65dd4839a0718641c696e09a2960", size = 234851, upload-time = "2026-04-02T09:27:32.44Z" },
+ { url = "https://files.pythonhosted.org/packages/9b/40/e5ff04233e70da2681fa43969ad6f66ca5611d7e669be0246c4c7aaf6dc8/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a89c23ef8d2c6b27fd200a42aa4ac72786e7c60d40efdc76e6011260b6e949c4", size = 233393, upload-time = "2026-04-02T09:27:34.03Z" },
+ { url = "https://files.pythonhosted.org/packages/be/c1/06c6c49d5a5450f76899992f1ee40b41d076aee9279b49cf9974d2f313d5/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6c114670c45346afedc0d947faf3c7f701051d2518b943679c8ff88befe14f8e", size = 223251, upload-time = "2026-04-02T09:27:35.369Z" },
+ { url = "https://files.pythonhosted.org/packages/2b/9f/f2ff16fb050946169e3e1f82134d107e5d4ae72647ec8a1b1446c148480f/charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:a180c5e59792af262bf263b21a3c49353f25945d8d9f70628e73de370d55e1e1", size = 206609, upload-time = "2026-04-02T09:27:36.661Z" },
+ { url = "https://files.pythonhosted.org/packages/69/d5/a527c0cd8d64d2eab7459784fb4169a0ac76e5a6fc5237337982fd61347e/charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3c9a494bc5ec77d43cea229c4f6db1e4d8fe7e1bbffa8b6f0f0032430ff8ab44", size = 220014, upload-time = "2026-04-02T09:27:38.019Z" },
+ { url = "https://files.pythonhosted.org/packages/7e/80/8a7b8104a3e203074dc9aa2c613d4b726c0e136bad1cc734594b02867972/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8d828b6667a32a728a1ad1d93957cdf37489c57b97ae6c4de2860fa749b8fc1e", size = 218979, upload-time = "2026-04-02T09:27:39.37Z" },
+ { url = "https://files.pythonhosted.org/packages/02/9a/b759b503d507f375b2b5c153e4d2ee0a75aa215b7f2489cf314f4541f2c0/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:cf1493cd8607bec4d8a7b9b004e699fcf8f9103a9284cc94962cb73d20f9d4a3", size = 209238, upload-time = "2026-04-02T09:27:40.722Z" },
+ { url = "https://files.pythonhosted.org/packages/c2/4e/0f3f5d47b86bdb79256e7290b26ac847a2832d9a4033f7eb2cd4bcf4bb5b/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:0c96c3b819b5c3e9e165495db84d41914d6894d55181d2d108cc1a69bfc9cce0", size = 236110, upload-time = "2026-04-02T09:27:42.33Z" },
+ { url = "https://files.pythonhosted.org/packages/96/23/bce28734eb3ed2c91dcf93abeb8a5cf393a7b2749725030bb630e554fdd8/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:752a45dc4a6934060b3b0dab47e04edc3326575f82be64bc4fc293914566503e", size = 219824, upload-time = "2026-04-02T09:27:43.924Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/6f/6e897c6984cc4d41af319b077f2f600fc8214eb2fe2d6bcb79141b882400/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:8778f0c7a52e56f75d12dae53ae320fae900a8b9b4164b981b9c5ce059cd1fcb", size = 233103, upload-time = "2026-04-02T09:27:45.348Z" },
+ { url = "https://files.pythonhosted.org/packages/76/22/ef7bd0fe480a0ae9b656189ec00744b60933f68b4f42a7bb06589f6f576a/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ce3412fbe1e31eb81ea42f4169ed94861c56e643189e1e75f0041f3fe7020abe", size = 225194, upload-time = "2026-04-02T09:27:46.706Z" },
+ { url = "https://files.pythonhosted.org/packages/c5/a7/0e0ab3e0b5bc1219bd80a6a0d4d72ca74d9250cb2382b7c699c147e06017/charset_normalizer-3.4.7-cp314-cp314t-win32.whl", hash = "sha256:c03a41a8784091e67a39648f70c5f97b5b6a37f216896d44d2cdcb82615339a0", size = 159827, upload-time = "2026-04-02T09:27:48.053Z" },
+ { url = "https://files.pythonhosted.org/packages/7a/1d/29d32e0fb40864b1f878c7f5a0b343ae676c6e2b271a2d55cc3a152391da/charset_normalizer-3.4.7-cp314-cp314t-win_amd64.whl", hash = "sha256:03853ed82eeebbce3c2abfdbc98c96dc205f32a79627688ac9a27370ea61a49c", size = 174168, upload-time = "2026-04-02T09:27:49.795Z" },
+ { url = "https://files.pythonhosted.org/packages/de/32/d92444ad05c7a6e41fb2036749777c163baf7a0301a040cb672d6b2b1ae9/charset_normalizer-3.4.7-cp314-cp314t-win_arm64.whl", hash = "sha256:c35abb8bfff0185efac5878da64c45dafd2b37fb0383add1be155a763c1f083d", size = 153018, upload-time = "2026-04-02T09:27:51.116Z" },
+ { url = "https://files.pythonhosted.org/packages/db/8f/61959034484a4a7c527811f4721e75d02d653a35afb0b6054474d8185d4c/charset_normalizer-3.4.7-py3-none-any.whl", hash = "sha256:3dce51d0f5e7951f8bb4900c257dad282f49190fdbebecd4ba99bcc41fef404d", size = 61958, upload-time = "2026-04-02T09:28:37.794Z" },
+]
+
+[[package]]
+name = "click"
+version = "8.4.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/9b/98/518d8e5081007684232226f475082b30087d0f585e8457db087298259f49/click-8.4.1.tar.gz", hash = "sha256:918b5633eddf6b41c32d4f454bf0de810065c74e3f7dbf8ee5452f8be88d3e96", size = 353007, upload-time = "2026-05-22T04:08:37.769Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c7/0d/67e5b4109ea4a837e80daa87c2c696711955e40449a97e8926672534def2/click-8.4.1-py3-none-any.whl", hash = "sha256:482be17c6991b8c19c5429a1e995d9b0efdbb63172824c41f99965dc0ade8ec2", size = 116639, upload-time = "2026-05-22T04:08:35.26Z" },
+]
+
+[[package]]
+name = "colorama"
+version = "0.4.6"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" },
+]
+
+[[package]]
+name = "comm"
+version = "0.2.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/4c/13/7d740c5849255756bc17888787313b61fd38a0a8304fc4f073dfc46122aa/comm-0.2.3.tar.gz", hash = "sha256:2dc8048c10962d55d7ad693be1e7045d891b7ce8d999c97963a5e3e99c055971", size = 6319, upload-time = "2025-07-25T14:02:04.452Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl", hash = "sha256:c615d91d75f7f04f095b30d1c1711babd43bdc6419c1be9886a85f2f4e489417", size = 7294, upload-time = "2025-07-25T14:02:02.896Z" },
+]
+
+[[package]]
+name = "contourpy"
+version = "1.3.3"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "numpy" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/58/01/1253e6698a07380cd31a736d248a3f2a50a7c88779a1813da27503cadc2a/contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880", size = 13466174, upload-time = "2025-07-26T12:03:12.549Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/be/45/adfee365d9ea3d853550b2e735f9d66366701c65db7855cd07621732ccfc/contourpy-1.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b08a32ea2f8e42cf1d4be3169a98dd4be32bafe4f22b6c4cb4ba810fa9e5d2cb", size = 293419, upload-time = "2025-07-26T12:01:21.16Z" },
+ { url = "https://files.pythonhosted.org/packages/53/3e/405b59cfa13021a56bba395a6b3aca8cec012b45bf177b0eaf7a202cde2c/contourpy-1.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:556dba8fb6f5d8742f2923fe9457dbdd51e1049c4a43fd3986a0b14a1d815fc6", size = 273979, upload-time = "2025-07-26T12:01:22.448Z" },
+ { url = "https://files.pythonhosted.org/packages/d4/1c/a12359b9b2ca3a845e8f7f9ac08bdf776114eb931392fcad91743e2ea17b/contourpy-1.3.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92d9abc807cf7d0e047b95ca5d957cf4792fcd04e920ca70d48add15c1a90ea7", size = 332653, upload-time = "2025-07-26T12:01:24.155Z" },
+ { url = "https://files.pythonhosted.org/packages/63/12/897aeebfb475b7748ea67b61e045accdfcf0d971f8a588b67108ed7f5512/contourpy-1.3.3-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2e8faa0ed68cb29af51edd8e24798bb661eac3bd9f65420c1887b6ca89987c8", size = 379536, upload-time = "2025-07-26T12:01:25.91Z" },
+ { url = "https://files.pythonhosted.org/packages/43/8a/a8c584b82deb248930ce069e71576fc09bd7174bbd35183b7943fb1064fd/contourpy-1.3.3-cp312-cp312-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:626d60935cf668e70a5ce6ff184fd713e9683fb458898e4249b63be9e28286ea", size = 384397, upload-time = "2025-07-26T12:01:27.152Z" },
+ { url = "https://files.pythonhosted.org/packages/cc/8f/ec6289987824b29529d0dfda0d74a07cec60e54b9c92f3c9da4c0ac732de/contourpy-1.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d00e655fcef08aba35ec9610536bfe90267d7ab5ba944f7032549c55a146da1", size = 362601, upload-time = "2025-07-26T12:01:28.808Z" },
+ { url = "https://files.pythonhosted.org/packages/05/0a/a3fe3be3ee2dceb3e615ebb4df97ae6f3828aa915d3e10549ce016302bd1/contourpy-1.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:451e71b5a7d597379ef572de31eeb909a87246974d960049a9848c3bc6c41bf7", size = 1331288, upload-time = "2025-07-26T12:01:31.198Z" },
+ { url = "https://files.pythonhosted.org/packages/33/1d/acad9bd4e97f13f3e2b18a3977fe1b4a37ecf3d38d815333980c6c72e963/contourpy-1.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:459c1f020cd59fcfe6650180678a9993932d80d44ccde1fa1868977438f0b411", size = 1403386, upload-time = "2025-07-26T12:01:33.947Z" },
+ { url = "https://files.pythonhosted.org/packages/cf/8f/5847f44a7fddf859704217a99a23a4f6417b10e5ab1256a179264561540e/contourpy-1.3.3-cp312-cp312-win32.whl", hash = "sha256:023b44101dfe49d7d53932be418477dba359649246075c996866106da069af69", size = 185018, upload-time = "2025-07-26T12:01:35.64Z" },
+ { url = "https://files.pythonhosted.org/packages/19/e8/6026ed58a64563186a9ee3f29f41261fd1828f527dd93d33b60feca63352/contourpy-1.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:8153b8bfc11e1e4d75bcb0bff1db232f9e10b274e0929de9d608027e0d34ff8b", size = 226567, upload-time = "2025-07-26T12:01:36.804Z" },
+ { url = "https://files.pythonhosted.org/packages/d1/e2/f05240d2c39a1ed228d8328a78b6f44cd695f7ef47beb3e684cf93604f86/contourpy-1.3.3-cp312-cp312-win_arm64.whl", hash = "sha256:07ce5ed73ecdc4a03ffe3e1b3e3c1166db35ae7584be76f65dbbe28a7791b0cc", size = 193655, upload-time = "2025-07-26T12:01:37.999Z" },
+ { url = "https://files.pythonhosted.org/packages/68/35/0167aad910bbdb9599272bd96d01a9ec6852f36b9455cf2ca67bd4cc2d23/contourpy-1.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:177fb367556747a686509d6fef71d221a4b198a3905fe824430e5ea0fda54eb5", size = 293257, upload-time = "2025-07-26T12:01:39.367Z" },
+ { url = "https://files.pythonhosted.org/packages/96/e4/7adcd9c8362745b2210728f209bfbcf7d91ba868a2c5f40d8b58f54c509b/contourpy-1.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d002b6f00d73d69333dac9d0b8d5e84d9724ff9ef044fd63c5986e62b7c9e1b1", size = 274034, upload-time = "2025-07-26T12:01:40.645Z" },
+ { url = "https://files.pythonhosted.org/packages/73/23/90e31ceeed1de63058a02cb04b12f2de4b40e3bef5e082a7c18d9c8ae281/contourpy-1.3.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:348ac1f5d4f1d66d3322420f01d42e43122f43616e0f194fc1c9f5d830c5b286", size = 334672, upload-time = "2025-07-26T12:01:41.942Z" },
+ { url = "https://files.pythonhosted.org/packages/ed/93/b43d8acbe67392e659e1d984700e79eb67e2acb2bd7f62012b583a7f1b55/contourpy-1.3.3-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:655456777ff65c2c548b7c454af9c6f33f16c8884f11083244b5819cc214f1b5", size = 381234, upload-time = "2025-07-26T12:01:43.499Z" },
+ { url = "https://files.pythonhosted.org/packages/46/3b/bec82a3ea06f66711520f75a40c8fc0b113b2a75edb36aa633eb11c4f50f/contourpy-1.3.3-cp313-cp313-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:644a6853d15b2512d67881586bd03f462c7ab755db95f16f14d7e238f2852c67", size = 385169, upload-time = "2025-07-26T12:01:45.219Z" },
+ { url = "https://files.pythonhosted.org/packages/4b/32/e0f13a1c5b0f8572d0ec6ae2f6c677b7991fafd95da523159c19eff0696a/contourpy-1.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4debd64f124ca62069f313a9cb86656ff087786016d76927ae2cf37846b006c9", size = 362859, upload-time = "2025-07-26T12:01:46.519Z" },
+ { url = "https://files.pythonhosted.org/packages/33/71/e2a7945b7de4e58af42d708a219f3b2f4cff7386e6b6ab0a0fa0033c49a9/contourpy-1.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a15459b0f4615b00bbd1e91f1b9e19b7e63aea7483d03d804186f278c0af2659", size = 1332062, upload-time = "2025-07-26T12:01:48.964Z" },
+ { url = "https://files.pythonhosted.org/packages/12/fc/4e87ac754220ccc0e807284f88e943d6d43b43843614f0a8afa469801db0/contourpy-1.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ca0fdcd73925568ca027e0b17ab07aad764be4706d0a925b89227e447d9737b7", size = 1403932, upload-time = "2025-07-26T12:01:51.979Z" },
+ { url = "https://files.pythonhosted.org/packages/a6/2e/adc197a37443f934594112222ac1aa7dc9a98faf9c3842884df9a9d8751d/contourpy-1.3.3-cp313-cp313-win32.whl", hash = "sha256:b20c7c9a3bf701366556e1b1984ed2d0cedf999903c51311417cf5f591d8c78d", size = 185024, upload-time = "2025-07-26T12:01:53.245Z" },
+ { url = "https://files.pythonhosted.org/packages/18/0b/0098c214843213759692cc638fce7de5c289200a830e5035d1791d7a2338/contourpy-1.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:1cadd8b8969f060ba45ed7c1b714fe69185812ab43bd6b86a9123fe8f99c3263", size = 226578, upload-time = "2025-07-26T12:01:54.422Z" },
+ { url = "https://files.pythonhosted.org/packages/8a/9a/2f6024a0c5995243cd63afdeb3651c984f0d2bc727fd98066d40e141ad73/contourpy-1.3.3-cp313-cp313-win_arm64.whl", hash = "sha256:fd914713266421b7536de2bfa8181aa8c699432b6763a0ea64195ebe28bff6a9", size = 193524, upload-time = "2025-07-26T12:01:55.73Z" },
+ { url = "https://files.pythonhosted.org/packages/c0/b3/f8a1a86bd3298513f500e5b1f5fd92b69896449f6cab6a146a5d52715479/contourpy-1.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:88df9880d507169449d434c293467418b9f6cbe82edd19284aa0409e7fdb933d", size = 306730, upload-time = "2025-07-26T12:01:57.051Z" },
+ { url = "https://files.pythonhosted.org/packages/3f/11/4780db94ae62fc0c2053909b65dc3246bd7cecfc4f8a20d957ad43aa4ad8/contourpy-1.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d06bb1f751ba5d417047db62bca3c8fde202b8c11fb50742ab3ab962c81e8216", size = 287897, upload-time = "2025-07-26T12:01:58.663Z" },
+ { url = "https://files.pythonhosted.org/packages/ae/15/e59f5f3ffdd6f3d4daa3e47114c53daabcb18574a26c21f03dc9e4e42ff0/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e4e6b05a45525357e382909a4c1600444e2a45b4795163d3b22669285591c1ae", size = 326751, upload-time = "2025-07-26T12:02:00.343Z" },
+ { url = "https://files.pythonhosted.org/packages/0f/81/03b45cfad088e4770b1dcf72ea78d3802d04200009fb364d18a493857210/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ab3074b48c4e2cf1a960e6bbeb7f04566bf36b1861d5c9d4d8ac04b82e38ba20", size = 375486, upload-time = "2025-07-26T12:02:02.128Z" },
+ { url = "https://files.pythonhosted.org/packages/0c/ba/49923366492ffbdd4486e970d421b289a670ae8cf539c1ea9a09822b371a/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c3d53c796f8647d6deb1abe867daeb66dcc8a97e8455efa729516b997b8ed99", size = 388106, upload-time = "2025-07-26T12:02:03.615Z" },
+ { url = "https://files.pythonhosted.org/packages/9f/52/5b00ea89525f8f143651f9f03a0df371d3cbd2fccd21ca9b768c7a6500c2/contourpy-1.3.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50ed930df7289ff2a8d7afeb9603f8289e5704755c7e5c3bbd929c90c817164b", size = 352548, upload-time = "2025-07-26T12:02:05.165Z" },
+ { url = "https://files.pythonhosted.org/packages/32/1d/a209ec1a3a3452d490f6b14dd92e72280c99ae3d1e73da74f8277d4ee08f/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4feffb6537d64b84877da813a5c30f1422ea5739566abf0bd18065ac040e120a", size = 1322297, upload-time = "2025-07-26T12:02:07.379Z" },
+ { url = "https://files.pythonhosted.org/packages/bc/9e/46f0e8ebdd884ca0e8877e46a3f4e633f6c9c8c4f3f6e72be3fe075994aa/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2b7e9480ffe2b0cd2e787e4df64270e3a0440d9db8dc823312e2c940c167df7e", size = 1391023, upload-time = "2025-07-26T12:02:10.171Z" },
+ { url = "https://files.pythonhosted.org/packages/b9/70/f308384a3ae9cd2209e0849f33c913f658d3326900d0ff5d378d6a1422d2/contourpy-1.3.3-cp313-cp313t-win32.whl", hash = "sha256:283edd842a01e3dcd435b1c5116798d661378d83d36d337b8dde1d16a5fc9ba3", size = 196157, upload-time = "2025-07-26T12:02:11.488Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/dd/880f890a6663b84d9e34a6f88cded89d78f0091e0045a284427cb6b18521/contourpy-1.3.3-cp313-cp313t-win_amd64.whl", hash = "sha256:87acf5963fc2b34825e5b6b048f40e3635dd547f590b04d2ab317c2619ef7ae8", size = 240570, upload-time = "2025-07-26T12:02:12.754Z" },
+ { url = "https://files.pythonhosted.org/packages/80/99/2adc7d8ffead633234817ef8e9a87115c8a11927a94478f6bb3d3f4d4f7d/contourpy-1.3.3-cp313-cp313t-win_arm64.whl", hash = "sha256:3c30273eb2a55024ff31ba7d052dde990d7d8e5450f4bbb6e913558b3d6c2301", size = 199713, upload-time = "2025-07-26T12:02:14.4Z" },
+ { url = "https://files.pythonhosted.org/packages/72/8b/4546f3ab60f78c514ffb7d01a0bd743f90de36f0019d1be84d0a708a580a/contourpy-1.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fde6c716d51c04b1c25d0b90364d0be954624a0ee9d60e23e850e8d48353d07a", size = 292189, upload-time = "2025-07-26T12:02:16.095Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/e1/3542a9cb596cadd76fcef413f19c79216e002623158befe6daa03dbfa88c/contourpy-1.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:cbedb772ed74ff5be440fa8eee9bd49f64f6e3fc09436d9c7d8f1c287b121d77", size = 273251, upload-time = "2025-07-26T12:02:17.524Z" },
+ { url = "https://files.pythonhosted.org/packages/b1/71/f93e1e9471d189f79d0ce2497007731c1e6bf9ef6d1d61b911430c3db4e5/contourpy-1.3.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22e9b1bd7a9b1d652cd77388465dc358dafcd2e217d35552424aa4f996f524f5", size = 335810, upload-time = "2025-07-26T12:02:18.9Z" },
+ { url = "https://files.pythonhosted.org/packages/91/f9/e35f4c1c93f9275d4e38681a80506b5510e9327350c51f8d4a5a724d178c/contourpy-1.3.3-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a22738912262aa3e254e4f3cb079a95a67132fc5a063890e224393596902f5a4", size = 382871, upload-time = "2025-07-26T12:02:20.418Z" },
+ { url = "https://files.pythonhosted.org/packages/b5/71/47b512f936f66a0a900d81c396a7e60d73419868fba959c61efed7a8ab46/contourpy-1.3.3-cp314-cp314-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:afe5a512f31ee6bd7d0dda52ec9864c984ca3d66664444f2d72e0dc4eb832e36", size = 386264, upload-time = "2025-07-26T12:02:21.916Z" },
+ { url = "https://files.pythonhosted.org/packages/04/5f/9ff93450ba96b09c7c2b3f81c94de31c89f92292f1380261bd7195bea4ea/contourpy-1.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f64836de09927cba6f79dcd00fdd7d5329f3fccc633468507079c829ca4db4e3", size = 363819, upload-time = "2025-07-26T12:02:23.759Z" },
+ { url = "https://files.pythonhosted.org/packages/3e/a6/0b185d4cc480ee494945cde102cb0149ae830b5fa17bf855b95f2e70ad13/contourpy-1.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1fd43c3be4c8e5fd6e4f2baeae35ae18176cf2e5cced681cca908addf1cdd53b", size = 1333650, upload-time = "2025-07-26T12:02:26.181Z" },
+ { url = "https://files.pythonhosted.org/packages/43/d7/afdc95580ca56f30fbcd3060250f66cedbde69b4547028863abd8aa3b47e/contourpy-1.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6afc576f7b33cf00996e5c1102dc2a8f7cc89e39c0b55df93a0b78c1bd992b36", size = 1404833, upload-time = "2025-07-26T12:02:28.782Z" },
+ { url = "https://files.pythonhosted.org/packages/e2/e2/366af18a6d386f41132a48f033cbd2102e9b0cf6345d35ff0826cd984566/contourpy-1.3.3-cp314-cp314-win32.whl", hash = "sha256:66c8a43a4f7b8df8b71ee1840e4211a3c8d93b214b213f590e18a1beca458f7d", size = 189692, upload-time = "2025-07-26T12:02:30.128Z" },
+ { url = "https://files.pythonhosted.org/packages/7d/c2/57f54b03d0f22d4044b8afb9ca0e184f8b1afd57b4f735c2fa70883dc601/contourpy-1.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:cf9022ef053f2694e31d630feaacb21ea24224be1c3ad0520b13d844274614fd", size = 232424, upload-time = "2025-07-26T12:02:31.395Z" },
+ { url = "https://files.pythonhosted.org/packages/18/79/a9416650df9b525737ab521aa181ccc42d56016d2123ddcb7b58e926a42c/contourpy-1.3.3-cp314-cp314-win_arm64.whl", hash = "sha256:95b181891b4c71de4bb404c6621e7e2390745f887f2a026b2d99e92c17892339", size = 198300, upload-time = "2025-07-26T12:02:32.956Z" },
+ { url = "https://files.pythonhosted.org/packages/1f/42/38c159a7d0f2b7b9c04c64ab317042bb6952b713ba875c1681529a2932fe/contourpy-1.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:33c82d0138c0a062380332c861387650c82e4cf1747aaa6938b9b6516762e772", size = 306769, upload-time = "2025-07-26T12:02:34.2Z" },
+ { url = "https://files.pythonhosted.org/packages/c3/6c/26a8205f24bca10974e77460de68d3d7c63e282e23782f1239f226fcae6f/contourpy-1.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ea37e7b45949df430fe649e5de8351c423430046a2af20b1c1961cae3afcda77", size = 287892, upload-time = "2025-07-26T12:02:35.807Z" },
+ { url = "https://files.pythonhosted.org/packages/66/06/8a475c8ab718ebfd7925661747dbb3c3ee9c82ac834ccb3570be49d129f4/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d304906ecc71672e9c89e87c4675dc5c2645e1f4269a5063b99b0bb29f232d13", size = 326748, upload-time = "2025-07-26T12:02:37.193Z" },
+ { url = "https://files.pythonhosted.org/packages/b4/a3/c5ca9f010a44c223f098fccd8b158bb1cb287378a31ac141f04730dc49be/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca658cd1a680a5c9ea96dc61cdbae1e85c8f25849843aa799dfd3cb370ad4fbe", size = 375554, upload-time = "2025-07-26T12:02:38.894Z" },
+ { url = "https://files.pythonhosted.org/packages/80/5b/68bd33ae63fac658a4145088c1e894405e07584a316738710b636c6d0333/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ab2fd90904c503739a75b7c8c5c01160130ba67944a7b77bbf36ef8054576e7f", size = 388118, upload-time = "2025-07-26T12:02:40.642Z" },
+ { url = "https://files.pythonhosted.org/packages/40/52/4c285a6435940ae25d7410a6c36bda5145839bc3f0beb20c707cda18b9d2/contourpy-1.3.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7301b89040075c30e5768810bc96a8e8d78085b47d8be6e4c3f5a0b4ed478a0", size = 352555, upload-time = "2025-07-26T12:02:42.25Z" },
+ { url = "https://files.pythonhosted.org/packages/24/ee/3e81e1dd174f5c7fefe50e85d0892de05ca4e26ef1c9a59c2a57e43b865a/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2a2a8b627d5cc6b7c41a4beff6c5ad5eb848c88255fda4a8745f7e901b32d8e4", size = 1322295, upload-time = "2025-07-26T12:02:44.668Z" },
+ { url = "https://files.pythonhosted.org/packages/3c/b2/6d913d4d04e14379de429057cd169e5e00f6c2af3bb13e1710bcbdb5da12/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:fd6ec6be509c787f1caf6b247f0b1ca598bef13f4ddeaa126b7658215529ba0f", size = 1391027, upload-time = "2025-07-26T12:02:47.09Z" },
+ { url = "https://files.pythonhosted.org/packages/93/8a/68a4ec5c55a2971213d29a9374913f7e9f18581945a7a31d1a39b5d2dfe5/contourpy-1.3.3-cp314-cp314t-win32.whl", hash = "sha256:e74a9a0f5e3fff48fb5a7f2fd2b9b70a3fe014a67522f79b7cca4c0c7e43c9ae", size = 202428, upload-time = "2025-07-26T12:02:48.691Z" },
+ { url = "https://files.pythonhosted.org/packages/fa/96/fd9f641ffedc4fa3ace923af73b9d07e869496c9cc7a459103e6e978992f/contourpy-1.3.3-cp314-cp314t-win_amd64.whl", hash = "sha256:13b68d6a62db8eafaebb8039218921399baf6e47bf85006fd8529f2a08ef33fc", size = 250331, upload-time = "2025-07-26T12:02:50.137Z" },
+ { url = "https://files.pythonhosted.org/packages/ae/8c/469afb6465b853afff216f9528ffda78a915ff880ed58813ba4faf4ba0b6/contourpy-1.3.3-cp314-cp314t-win_arm64.whl", hash = "sha256:b7448cb5a725bb1e35ce88771b86fba35ef418952474492cf7c764059933ff8b", size = 203831, upload-time = "2025-07-26T12:02:51.449Z" },
+]
+
+[[package]]
+name = "courlan"
+version = "1.3.2"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "babel" },
+ { name = "tld" },
+ { name = "urllib3" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/6f/54/6d6ceeff4bed42e7a10d6064d35ee43a810e7b3e8beb4abeae8cff4713ae/courlan-1.3.2.tar.gz", hash = "sha256:0b66f4db3a9c39a6e22dd247c72cfaa57d68ea660e94bb2c84ec7db8712af190", size = 206382, upload-time = "2024-10-29T16:40:20.994Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/8e/ca/6a667ccbe649856dcd3458bab80b016681b274399d6211187c6ab969fc50/courlan-1.3.2-py3-none-any.whl", hash = "sha256:d0dab52cf5b5b1000ee2839fbc2837e93b2514d3cb5bb61ae158a55b7a04c6be", size = 33848, upload-time = "2024-10-29T16:40:18.325Z" },
+]
+
+[[package]]
+name = "cycler"
+version = "0.12.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615, upload-time = "2023-10-07T05:32:18.335Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload-time = "2023-10-07T05:32:16.783Z" },
+]
+
+[[package]]
+name = "dateparser"
+version = "1.4.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "python-dateutil" },
+ { name = "pytz" },
+ { name = "regex" },
+ { name = "tzlocal" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/46/2d/a0ccdb78788064fa0dc901b8524e50615c42be1d78b78d646d0b28d09180/dateparser-1.4.0.tar.gz", hash = "sha256:97a21840d5ecdf7630c584f673338a5afac5dfe84f647baf4d7e8df98f9354a4", size = 321512, upload-time = "2026-03-26T09:56:10.292Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b4/0b/3c3bb7cbe757279e693a0be6049048012f794d01f81099609ecd53b899f0/dateparser-1.4.0-py3-none-any.whl", hash = "sha256:7902b8e85d603494bf70a5a0b1decdddb2270b9c6e6b2bc8a57b93476c0df378", size = 300379, upload-time = "2026-03-26T09:56:08.409Z" },
+]
+
+[[package]]
+name = "debugpy"
+version = "1.8.20"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/e0/b7/cd8080344452e4874aae67c40d8940e2b4d47b01601a8fd9f44786c757c7/debugpy-1.8.20.tar.gz", hash = "sha256:55bc8701714969f1ab89a6d5f2f3d40c36f91b2cbe2f65d98bf8196f6a6a2c33", size = 1645207, upload-time = "2026-01-29T23:03:28.199Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/14/57/7f34f4736bfb6e00f2e4c96351b07805d83c9a7b33d28580ae01374430f7/debugpy-1.8.20-cp312-cp312-macosx_15_0_universal2.whl", hash = "sha256:4ae3135e2089905a916909ef31922b2d733d756f66d87345b3e5e52b7a55f13d", size = 2550686, upload-time = "2026-01-29T23:03:42.023Z" },
+ { url = "https://files.pythonhosted.org/packages/ab/78/b193a3975ca34458f6f0e24aaf5c3e3da72f5401f6054c0dfd004b41726f/debugpy-1.8.20-cp312-cp312-manylinux_2_34_x86_64.whl", hash = "sha256:88f47850a4284b88bd2bfee1f26132147d5d504e4e86c22485dfa44b97e19b4b", size = 4310588, upload-time = "2026-01-29T23:03:43.314Z" },
+ { url = "https://files.pythonhosted.org/packages/c1/55/f14deb95eaf4f30f07ef4b90a8590fc05d9e04df85ee379712f6fb6736d7/debugpy-1.8.20-cp312-cp312-win32.whl", hash = "sha256:4057ac68f892064e5f98209ab582abfee3b543fb55d2e87610ddc133a954d390", size = 5331372, upload-time = "2026-01-29T23:03:45.526Z" },
+ { url = "https://files.pythonhosted.org/packages/a1/39/2bef246368bd42f9bd7cba99844542b74b84dacbdbea0833e610f384fee8/debugpy-1.8.20-cp312-cp312-win_amd64.whl", hash = "sha256:a1a8f851e7cf171330679ef6997e9c579ef6dd33c9098458bd9986a0f4ca52e3", size = 5372835, upload-time = "2026-01-29T23:03:47.245Z" },
+ { url = "https://files.pythonhosted.org/packages/15/e2/fc500524cc6f104a9d049abc85a0a8b3f0d14c0a39b9c140511c61e5b40b/debugpy-1.8.20-cp313-cp313-macosx_15_0_universal2.whl", hash = "sha256:5dff4bb27027821fdfcc9e8f87309a28988231165147c31730128b1c983e282a", size = 2539560, upload-time = "2026-01-29T23:03:48.738Z" },
+ { url = "https://files.pythonhosted.org/packages/90/83/fb33dcea789ed6018f8da20c5a9bc9d82adc65c0c990faed43f7c955da46/debugpy-1.8.20-cp313-cp313-manylinux_2_34_x86_64.whl", hash = "sha256:84562982dd7cf5ebebfdea667ca20a064e096099997b175fe204e86817f64eaf", size = 4293272, upload-time = "2026-01-29T23:03:50.169Z" },
+ { url = "https://files.pythonhosted.org/packages/a6/25/b1e4a01bfb824d79a6af24b99ef291e24189080c93576dfd9b1a2815cd0f/debugpy-1.8.20-cp313-cp313-win32.whl", hash = "sha256:da11dea6447b2cadbf8ce2bec59ecea87cc18d2c574980f643f2d2dfe4862393", size = 5331208, upload-time = "2026-01-29T23:03:51.547Z" },
+ { url = "https://files.pythonhosted.org/packages/13/f7/a0b368ce54ffff9e9028c098bd2d28cfc5b54f9f6c186929083d4c60ba58/debugpy-1.8.20-cp313-cp313-win_amd64.whl", hash = "sha256:eb506e45943cab2efb7c6eafdd65b842f3ae779f020c82221f55aca9de135ed7", size = 5372930, upload-time = "2026-01-29T23:03:53.585Z" },
+ { url = "https://files.pythonhosted.org/packages/33/2e/f6cb9a8a13f5058f0a20fe09711a7b726232cd5a78c6a7c05b2ec726cff9/debugpy-1.8.20-cp314-cp314-macosx_15_0_universal2.whl", hash = "sha256:9c74df62fc064cd5e5eaca1353a3ef5a5d50da5eb8058fcef63106f7bebe6173", size = 2538066, upload-time = "2026-01-29T23:03:54.999Z" },
+ { url = "https://files.pythonhosted.org/packages/c5/56/6ddca50b53624e1ca3ce1d1e49ff22db46c47ea5fb4c0cc5c9b90a616364/debugpy-1.8.20-cp314-cp314-manylinux_2_34_x86_64.whl", hash = "sha256:077a7447589ee9bc1ff0cdf443566d0ecf540ac8aa7333b775ebcb8ce9f4ecad", size = 4269425, upload-time = "2026-01-29T23:03:56.518Z" },
+ { url = "https://files.pythonhosted.org/packages/c5/d9/d64199c14a0d4c476df46c82470a3ce45c8d183a6796cfb5e66533b3663c/debugpy-1.8.20-cp314-cp314-win32.whl", hash = "sha256:352036a99dd35053b37b7803f748efc456076f929c6a895556932eaf2d23b07f", size = 5331407, upload-time = "2026-01-29T23:03:58.481Z" },
+ { url = "https://files.pythonhosted.org/packages/e0/d9/1f07395b54413432624d61524dfd98c1a7c7827d2abfdb8829ac92638205/debugpy-1.8.20-cp314-cp314-win_amd64.whl", hash = "sha256:a98eec61135465b062846112e5ecf2eebb855305acc1dfbae43b72903b8ab5be", size = 5372521, upload-time = "2026-01-29T23:03:59.864Z" },
+ { url = "https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl", hash = "sha256:5be9bed9ae3be00665a06acaa48f8329d2b9632f15fd09f6a9a8c8d9907e54d7", size = 5337658, upload-time = "2026-01-29T23:04:17.404Z" },
+]
+
+[[package]]
+name = "decorator"
+version = "5.3.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/60/8b/32f9823da46cde7df2087faa08cd98d01b908f8dcab982cdba9c84e85355/decorator-5.3.1.tar.gz", hash = "sha256:4cbcdd55a6efadb9dbea26b858f4fb3264567b52d69ca0d25b721b553f60ea82", size = 58084, upload-time = "2026-05-18T06:03:28.057Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/05/7f/798705f5296a58ca505d600456748d1be48078eac8a7050d8a98bc9edb89/decorator-5.3.1-py3-none-any.whl", hash = "sha256:f47fe6fdbd2edd623ecfe36875d37aba411624e2670dd395dddae1358689bb3c", size = 10365, upload-time = "2026-05-18T06:03:26.517Z" },
+]
+
+[[package]]
+name = "defusedxml"
+version = "0.7.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", size = 75520, upload-time = "2021-03-08T10:59:26.269Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604, upload-time = "2021-03-08T10:59:24.45Z" },
+]
+
+[[package]]
+name = "executing"
+version = "2.2.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/cc/28/c14e053b6762b1044f34a13aab6859bbf40456d37d23aa286ac24cfd9a5d/executing-2.2.1.tar.gz", hash = "sha256:3632cc370565f6648cc328b32435bd120a1e4ebb20c77e3fdde9a13cd1e533c4", size = 1129488, upload-time = "2025-09-01T09:48:10.866Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl", hash = "sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017", size = 28317, upload-time = "2025-09-01T09:48:08.5Z" },
+]
+
+[[package]]
+name = "fastjsonschema"
+version = "2.21.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/20/b5/23b216d9d985a956623b6bd12d4086b60f0059b27799f23016af04a74ea1/fastjsonschema-2.21.2.tar.gz", hash = "sha256:b1eb43748041c880796cd077f1a07c3d94e93ae84bba5ed36800a33554ae05de", size = 374130, upload-time = "2025-08-14T18:49:36.666Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl", hash = "sha256:1c797122d0a86c5cace2e54bf4e819c36223b552017172f32c5c024a6b77e463", size = 24024, upload-time = "2025-08-14T18:49:34.776Z" },
+]
+
+[[package]]
+name = "fasttext-numpy2-wheel"
+version = "0.9.2"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "numpy" },
+ { name = "pybind11" },
+ { name = "setuptools" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/c0/8a/8c72c92cd91146ce9948421f3967bc2775deac5215eb8fa3b0487020881f/fasttext_numpy2_wheel-0.9.2.tar.gz", hash = "sha256:484bb7efb0d07c5b6235c8ab44d5e7ddcde5727a25dbc04d18175f777c1e799c", size = 73494, upload-time = "2024-11-05T13:54:19.159Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f1/6d/752fee6620ad141346573692ee3d27a8dbfaf75211f02ebe73a86634b6c0/fasttext_numpy2_wheel-0.9.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805ad5ec4299a0a896192ffeec7a1f296480fa6741078ef2c8e2f8068fa879a4", size = 607503, upload-time = "2024-11-05T17:16:28.402Z" },
+ { url = "https://files.pythonhosted.org/packages/43/af/4993e0bf993b26f31a1a2739db98dcad758afa21cca729caefbfb4d23c76/fasttext_numpy2_wheel-0.9.2-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:37d085f4b0906732770087f8722b2413199343e01a7f4c31ebec07dfcb971b0b", size = 2992718, upload-time = "2024-11-05T17:44:16.309Z" },
+ { url = "https://files.pythonhosted.org/packages/d9/39/9b0f2038fe45ac92183971d8e52c1317c355d846fb30ff2d7a820ec971e8/fasttext_numpy2_wheel-0.9.2-cp312-cp312-manylinux2014_armv7l.whl", hash = "sha256:3c3de015610b9039acfd1c4cc4a66e88a84b8961384a5d37ef551c3465eb85fb", size = 2744844, upload-time = "2024-11-05T17:44:31.45Z" },
+ { url = "https://files.pythonhosted.org/packages/f2/ae/14b8fd0cd802a75ea33c92157f2893b185549aefcfbd7eff7582fc9657f4/fasttext_numpy2_wheel-0.9.2-cp312-cp312-manylinux2014_ppc64.whl", hash = "sha256:c53acbe99f588d4944c7e0784a4757dace564d1f268d5f154885d34451c66307", size = 3040695, upload-time = "2024-11-05T17:44:36.558Z" },
+ { url = "https://files.pythonhosted.org/packages/dd/93/c485ae800da47f6676c097f223493d895b24d3de35c5f5a80be6fcc173e5/fasttext_numpy2_wheel-0.9.2-cp312-cp312-manylinux2014_ppc64le.whl", hash = "sha256:2528a3466f898bb16cec2e3d9844c5f4b98ea0e7716bb6c023e74c30d13929d3", size = 2919414, upload-time = "2024-11-05T17:44:23.402Z" },
+ { url = "https://files.pythonhosted.org/packages/e9/70/ef326f7eff7e24b274a320c80479fa76860201ef460972c71cefc72f844b/fasttext_numpy2_wheel-0.9.2-cp312-cp312-manylinux2014_s390x.whl", hash = "sha256:a913f7ca57d3f3595d6e1221a2b724b131df2f304433e5ff3ba1fee5731f153a", size = 2955392, upload-time = "2024-11-05T17:44:09.67Z" },
+ { url = "https://files.pythonhosted.org/packages/df/13/f8a21e5aa6c0a3e382c2346322b6d70fe1435c85cd57c8913b56fc72441d/fasttext_numpy2_wheel-0.9.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1d50a174457a11d9317c5eaef007d0971a1baed4b15b8f5c404d69ba7ed2346", size = 4583847, upload-time = "2024-11-05T13:54:19.266Z" },
+ { url = "https://files.pythonhosted.org/packages/d4/9d/a78dfd3e996f5d3c91bcd14a4e249a90da038b99287fda43211281724fdb/fasttext_numpy2_wheel-0.9.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e70c79c9ca670f36fcf639eea87bf44adff4082a966c62053747a7dee0f2898", size = 4686609, upload-time = "2024-11-05T13:54:11.194Z" },
+]
+
+[[package]]
+name = "filelock"
+version = "3.29.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/b5/fe/997687a931ab51049acce6fa1f23e8f01216374ea81374ddee763c493db5/filelock-3.29.0.tar.gz", hash = "sha256:69974355e960702e789734cb4871f884ea6fe50bd8404051a3530bc07809cf90", size = 57571, upload-time = "2026-04-19T15:39:10.068Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/81/47/dd9a212ef6e343a6857485ffe25bba537304f1913bdbed446a23f7f592e1/filelock-3.29.0-py3-none-any.whl", hash = "sha256:96f5f6344709aa1572bbf631c640e4ebeeb519e08da902c39a001882f30ac258", size = 39812, upload-time = "2026-04-19T15:39:08.752Z" },
+]
+
+[[package]]
+name = "fonttools"
+version = "4.63.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/84/69/c97f2c18e0db87d2c7b15da1974dace76ae938f1cfa22e2727a648b7ed43/fonttools-4.63.0.tar.gz", hash = "sha256:caeb583deeb5168e694b65cda8b4ee62abedfa66cf88488734466f2366b9c4e0", size = 3597189, upload-time = "2026-05-14T12:04:30.958Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/08/ef/b3c6b9b5be2f82416d73fe2ed2e96e2793cd80e7510bd6a17ca79cdd88ec/fonttools-4.63.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:37dd23e621e3b0aef1baa70a303b80aaf38449632cfc8fd2a55fb285bbccfc02", size = 2881131, upload-time = "2026-05-14T12:03:13.386Z" },
+ { url = "https://files.pythonhosted.org/packages/44/a0/c815bea63117fa63e4e1c01f8a1110d2112fa003f838e6467094ec2432ce/fonttools-4.63.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a9faff9e0c1f76f9fd55899d2ce785832efebab37eb8ae13995853aef178bef0", size = 2426704, upload-time = "2026-05-14T12:03:15.801Z" },
+ { url = "https://files.pythonhosted.org/packages/44/04/0b91d8e916e92ad1fac9e4624760baf0fd5ff2ead614c2f68fb21373f03f/fonttools-4.63.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef3048ef05dbb552b89817713d9cac912e00d0fde4a3105c00d29e52e10c89af", size = 5044298, upload-time = "2026-05-14T12:03:18.085Z" },
+ { url = "https://files.pythonhosted.org/packages/77/c7/2342da9830e3e9d4870305ca5d2091d2a83284f2953079b7bdd3b5e029d8/fonttools-4.63.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:58dc6bb86a78d782f00f9190ca02c119cf5bbe2807536e361e18d42019f877d8", size = 4999800, upload-time = "2026-05-14T12:03:20.161Z" },
+ { url = "https://files.pythonhosted.org/packages/e6/6d/67fe16c48d7ce050979b33f47e0d28a318f02da030602e944c34f7a16ef3/fonttools-4.63.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ee08ebfa58f6e1aeff5697ab9582105bb620008c1caafb681e4c557e7483027b", size = 4982666, upload-time = "2026-05-14T12:03:22.87Z" },
+ { url = "https://files.pythonhosted.org/packages/f2/00/3bbab338c07c71fa56269953845e92c951a61457bbbb0f1022551ea266d9/fonttools-4.63.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:27fdc65af8da6f88b9c6121c47a464cbe359fcfff7ff6fc2d37a1f395d755b78", size = 5133598, upload-time = "2026-05-14T12:03:25.168Z" },
+ { url = "https://files.pythonhosted.org/packages/62/f2/aa27c7f98db5b064883dadcc5283947e81e034de42e22a33675878d98b54/fonttools-4.63.0-cp312-cp312-win32.whl", hash = "sha256:af2fd1664d00a397d75f806985ddb36282091c2131a73a6485c23b4a34722263", size = 2292575, upload-time = "2026-05-14T12:03:27.496Z" },
+ { url = "https://files.pythonhosted.org/packages/87/36/cccb9bc2a6ab63d1b2980374f0dca72ce95ae267c9b4cfe77455bb70d0d4/fonttools-4.63.0-cp312-cp312-win_amd64.whl", hash = "sha256:59ac449f8cca9b4ffa08d2e7bbadad87ce710d69d1eda5c3c1ce579baa987272", size = 2343211, upload-time = "2026-05-14T12:03:30.057Z" },
+ { url = "https://files.pythonhosted.org/packages/0f/8d/d8fec3dcde2963f8c908fb315e5ff2cd0ac34f82394bbbf73a2aa5145ce3/fonttools-4.63.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:cd7e9857e5e63738b9d9fd707bc1f59c8b09e5177726d23664db393c59bb08bd", size = 2876062, upload-time = "2026-05-14T12:03:32.554Z" },
+ { url = "https://files.pythonhosted.org/packages/ef/71/d935dc54e4ff121bfdd11e08702db63a7e6f25af21d8a3d7b7212df53641/fonttools-4.63.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c2a2a42198b696a6f48fad91709afb55176e66a5e566131219dba372fb7f8c59", size = 2424594, upload-time = "2026-05-14T12:03:34.86Z" },
+ { url = "https://files.pythonhosted.org/packages/8e/40/e76320afa1df918e146155ef239b1719ee266092e96f5423bfd075affba1/fonttools-4.63.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e874792a8212b44583ea02189d9e693906b2f78b261f372f95d6c563210ac1d", size = 5024840, upload-time = "2026-05-14T12:03:36.745Z" },
+ { url = "https://files.pythonhosted.org/packages/ce/36/0b805d8c485f872f65a509cbe3b58a5d0d17bee855333b54a150c79d3061/fonttools-4.63.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:22135da48a348785c5e2d5d2d9d6bec5ed44adacbaeb9db12d9493bf6c6bfa68", size = 4975801, upload-time = "2026-05-14T12:03:38.833Z" },
+ { url = "https://files.pythonhosted.org/packages/c8/26/2cee03d0aa083ab022da5c07aff9ed3f689da1defb81ad6917c9627896da/fonttools-4.63.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ccf41f2efdf56994d22d73bef4ced1052161958169428d06ba9724ea9e9a64be", size = 4965009, upload-time = "2026-05-14T12:03:41.494Z" },
+ { url = "https://files.pythonhosted.org/packages/7e/48/cc4b66d9058c0d0982c833fad10127c4b0e9324606aafa41382295ca4102/fonttools-4.63.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9ced0bd02ac751dd6319b0da88aaef24414e3b0dbc32bb4f24944821a3741a27", size = 5105892, upload-time = "2026-05-14T12:03:43.525Z" },
+ { url = "https://files.pythonhosted.org/packages/d8/1f/a98a30a814b9ddef3a2e706025f90b9e0bc94890e6cb15254bc86547d11a/fonttools-4.63.0-cp313-cp313-win32.whl", hash = "sha256:85be818f5506e8a7753153def2c9550178f0ecae6a47b5e0e8dbb23f7cc90380", size = 2291313, upload-time = "2026-05-14T12:03:45.594Z" },
+ { url = "https://files.pythonhosted.org/packages/92/46/5177b01f3b4abfdd4409f31cca4ab279c9343a26efbe9ec78c97fc612e02/fonttools-4.63.0-cp313-cp313-win_amd64.whl", hash = "sha256:ba04cb5891d4c0c21b6da95eda8d7b090021508a294fff33464fc7d241e0856b", size = 2342299, upload-time = "2026-05-14T12:03:47.414Z" },
+ { url = "https://files.pythonhosted.org/packages/27/d2/23d25e3f247b328be58d04a4c9f894178a0d1eda7d42867cfb388adaf416/fonttools-4.63.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fd1e3094f42d806d3d7c79162fc59e5910fcbe3a7360c385b8da969bc4493745", size = 2875338, upload-time = "2026-05-14T12:03:50.052Z" },
+ { url = "https://files.pythonhosted.org/packages/cd/58/7dfa0c761cb3b2964e2a84c4dc986c926a87de0cb9fb60d5b28ded3f2914/fonttools-4.63.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:6e528da43bc3791085f8cb6141b1d13e459226790240340fcbb4625649238b03", size = 2422661, upload-time = "2026-05-14T12:03:52.154Z" },
+ { url = "https://files.pythonhosted.org/packages/dd/87/64cfa18a7a1621d17b7f4502b2b0ed8a135a90c3db51ea590ee99043e76b/fonttools-4.63.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b2248c5decb223562f7902ff6325077a073f608ee8e33e88ad88db734eb9f49", size = 5010526, upload-time = "2026-05-14T12:03:54.647Z" },
+ { url = "https://files.pythonhosted.org/packages/36/e1/a8933a72c45a87177fbde2696e0d0755c8c9062f8c077a961c6215fa27b1/fonttools-4.63.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:308f957cdeaf8abe4e5f2f124902ef405448af92c90f80e302a3b771c2e6116b", size = 4923946, upload-time = "2026-05-14T12:03:56.984Z" },
+ { url = "https://files.pythonhosted.org/packages/27/60/872e6e233b8c5e8b41413796ff18b7fe479661bd40147e071b450dfad7a1/fonttools-4.63.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:bf00f21eb5fb721dbaf73d1e9da6d02a1af7768f2ebcf9798be98beab8ba90f6", size = 4962489, upload-time = "2026-05-14T12:03:59.443Z" },
+ { url = "https://files.pythonhosted.org/packages/30/c4/83c24f2ec38b90cfda84bf4b1a1f49df80e84a1db4e7ac6e0d41bf23bc39/fonttools-4.63.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c1aaa4b9c75798400ac043ce04d74e7830376c85095a5a6ed7cba2f17a266bf4", size = 5071870, upload-time = "2026-05-14T12:04:02.122Z" },
+ { url = "https://files.pythonhosted.org/packages/de/40/3ae22b60ff1d41ce0bd044b31238cdc72cef99f28b976f1e128ebd618c9b/fonttools-4.63.0-cp314-cp314-win32.whl", hash = "sha256:22693918177bd9ceabec4736d338045f357769416fc6b0b2508eefef75b08616", size = 2295026, upload-time = "2026-05-14T12:04:04.47Z" },
+ { url = "https://files.pythonhosted.org/packages/c3/d4/98078064ccc76b45cb0f6c002452011e93c4bd26f6850344f0951cc1fe89/fonttools-4.63.0-cp314-cp314-win_amd64.whl", hash = "sha256:7d782fac32985914c351556f68ac0855391572bcd87de50e05970d3cd4c96fc5", size = 2347454, upload-time = "2026-05-14T12:04:06.752Z" },
+ { url = "https://files.pythonhosted.org/packages/49/4e/652d1580c5f4e39f7d103b0c793e4773129ad633dce4addd0cf4dfebde02/fonttools-4.63.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:6db5140a60a5d731d21ec076745b40a310607731b0a565b50776393188649001", size = 2958152, upload-time = "2026-05-14T12:04:08.706Z" },
+ { url = "https://files.pythonhosted.org/packages/0e/55/ad864c9a9b219f552eb46b32cd7906c466e5a578ba0c3abfcc0fe7413eb6/fonttools-4.63.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7d76edbff9014094dbf03bd2d074709dfa6ec7aba13d838c937a2b33d2d6a86e", size = 2460809, upload-time = "2026-05-14T12:04:10.783Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/2b/0aa8db70f18cf52e49b4ed5ecec68547f981160bf5ded3b5aed6faa0a6f9/fonttools-4.63.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0eac00b9118c3c2f87d272e45341871c5b3066baa3c86897fa634a7c3fb59096", size = 5148649, upload-time = "2026-05-14T12:04:12.747Z" },
+ { url = "https://files.pythonhosted.org/packages/7f/63/18e4369c25043096f1048e0c9915951adc4f842bd81c6b18155824d6fa99/fonttools-4.63.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:51394295f1a51de8b5f30bdb1e1b9a4231536c7064ef5c6e211eec19fa36036f", size = 4932147, upload-time = "2026-05-14T12:04:14.806Z" },
+ { url = "https://files.pythonhosted.org/packages/a1/3f/67f3eac2ffd8a98446c5022f8ed3864eac878a5ff7af8df4c8286dba16cc/fonttools-4.63.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:9e12f105d2b6342c559c298afb674006bb2893afc7102dcf8a1b55b0486b4e40", size = 5027237, upload-time = "2026-05-14T12:04:17.675Z" },
+ { url = "https://files.pythonhosted.org/packages/1a/ba/4e6214cb38a7b04779e97bb7636de9a5c7f20af7018d03dee0b64c08510a/fonttools-4.63.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:796f27556dbe094c4824f75ca85267e4df776c79036c8441469a4df37038c196", size = 5053933, upload-time = "2026-05-14T12:04:20.818Z" },
+ { url = "https://files.pythonhosted.org/packages/34/3b/214dcc19ee31d3d38fb5ad2755c11ef0514e5dc300bbaf41c0b69f393799/fonttools-4.63.0-cp314-cp314t-win32.whl", hash = "sha256:948428a275741f0b64b113c955425a953314f4b9ab9997f73a72c83e68e569c8", size = 2359326, upload-time = "2026-05-14T12:04:24.22Z" },
+ { url = "https://files.pythonhosted.org/packages/dd/1e/3ff1a9b523058c2eeb6a9d50f5574e2a738200d0d94107d5bc4105e8da3f/fonttools-4.63.0-cp314-cp314t-win_amd64.whl", hash = "sha256:6d4741eb179121cab9eea4cb2393d24492373a260d7945006358c08cfbf45419", size = 2425829, upload-time = "2026-05-14T12:04:26.829Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/47/c99d5268f354002ce80f8d029cd9d7d872969da1de8b93d32de4dc56d6f4/fonttools-4.63.0-py3-none-any.whl", hash = "sha256:445af2eab030a16b9171ea8bdda7ebf7d96bda2df88ee182a464252f6e05e20d", size = 1164562, upload-time = "2026-05-14T12:04:29.092Z" },
+]
+
+[[package]]
+name = "fqdn"
+version = "1.5.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/30/3e/a80a8c077fd798951169626cde3e239adeba7dab75deb3555716415bd9b0/fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f", size = 6015, upload-time = "2021-03-11T07:16:29.08Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014", size = 9121, upload-time = "2021-03-11T07:16:28.351Z" },
+]
+
+[[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, upload-time = "2025-10-06T05:38:17.865Z" }
+wheels = [
+ { 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, upload-time = "2025-10-06T05:36:06.649Z" },
+ { 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, upload-time = "2025-10-06T05:36:07.69Z" },
+ { 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, upload-time = "2025-10-06T05:36:08.78Z" },
+ { 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, upload-time = "2025-10-06T05:36:09.801Z" },
+ { 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, upload-time = "2025-10-06T05:36:11.394Z" },
+ { 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, upload-time = "2025-10-06T05:36:12.598Z" },
+ { 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, upload-time = "2025-10-06T05:36:14.065Z" },
+ { 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, upload-time = "2025-10-06T05:36:15.39Z" },
+ { 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, upload-time = "2025-10-06T05:36:16.558Z" },
+ { 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, upload-time = "2025-10-06T05:36:17.821Z" },
+ { 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, upload-time = "2025-10-06T05:36:19.046Z" },
+ { 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, upload-time = "2025-10-06T05:36:20.763Z" },
+ { 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, upload-time = "2025-10-06T05:36:22.129Z" },
+ { url = "https://files.pythonhosted.org/packages/66/bb/852b9d6db2fa40be96f29c0d1205c306288f0684df8fd26ca1951d461a56/frozenlist-1.8.0-cp312-cp312-win32.whl", hash = "sha256:433403ae80709741ce34038da08511d4a77062aa924baf411ef73d1146e74faf", size = 39985, upload-time = "2025-10-06T05:36:23.661Z" },
+ { url = "https://files.pythonhosted.org/packages/b8/af/38e51a553dd66eb064cdf193841f16f077585d4d28394c2fa6235cb41765/frozenlist-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:34187385b08f866104f0c0617404c8eb08165ab1272e884abc89c112e9c00746", size = 44591, upload-time = "2025-10-06T05:36:24.958Z" },
+ { url = "https://files.pythonhosted.org/packages/a7/06/1dc65480ab147339fecc70797e9c2f69d9cea9cf38934ce08df070fdb9cb/frozenlist-1.8.0-cp312-cp312-win_arm64.whl", hash = "sha256:fe3c58d2f5db5fbd18c2987cba06d51b0529f52bc3a6cdc33d3f4eab725104bd", size = 40102, upload-time = "2025-10-06T05:36:26.333Z" },
+ { 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, upload-time = "2025-10-06T05:36:27.341Z" },
+ { 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, upload-time = "2025-10-06T05:36:28.855Z" },
+ { 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, upload-time = "2025-10-06T05:36:29.877Z" },
+ { 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, upload-time = "2025-10-06T05:36:31.301Z" },
+ { 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, upload-time = "2025-10-06T05:36:32.531Z" },
+ { 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, upload-time = "2025-10-06T05:36:33.706Z" },
+ { 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, upload-time = "2025-10-06T05:36:34.947Z" },
+ { 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, upload-time = "2025-10-06T05:36:36.534Z" },
+ { 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, upload-time = "2025-10-06T05:36:38.582Z" },
+ { 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, upload-time = "2025-10-06T05:36:40.152Z" },
+ { 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, upload-time = "2025-10-06T05:36:41.355Z" },
+ { 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, upload-time = "2025-10-06T05:36:42.716Z" },
+ { 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, upload-time = "2025-10-06T05:36:44.251Z" },
+ { url = "https://files.pythonhosted.org/packages/1e/0b/1b5531611e83ba7d13ccc9988967ea1b51186af64c42b7a7af465dcc9568/frozenlist-1.8.0-cp313-cp313-win32.whl", hash = "sha256:8b7b94a067d1c504ee0b16def57ad5738701e4ba10cec90529f13fa03c833496", size = 39628, upload-time = "2025-10-06T05:36:45.423Z" },
+ { url = "https://files.pythonhosted.org/packages/d8/cf/174c91dbc9cc49bc7b7aab74d8b734e974d1faa8f191c74af9b7e80848e6/frozenlist-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:878be833caa6a3821caf85eb39c5ba92d28e85df26d57afb06b35b2efd937231", size = 43882, upload-time = "2025-10-06T05:36:46.796Z" },
+ { url = "https://files.pythonhosted.org/packages/c1/17/502cd212cbfa96eb1388614fe39a3fc9ab87dbbe042b66f97acb57474834/frozenlist-1.8.0-cp313-cp313-win_arm64.whl", hash = "sha256:44389d135b3ff43ba8cc89ff7f51f5a0bb6b63d829c8300f79a2fe4fe61bcc62", size = 39676, upload-time = "2025-10-06T05:36:47.8Z" },
+ { 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, upload-time = "2025-10-06T05:36:48.78Z" },
+ { 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, upload-time = "2025-10-06T05:36:49.837Z" },
+ { 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, upload-time = "2025-10-06T05:36:50.851Z" },
+ { 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, upload-time = "2025-10-06T05:36:51.898Z" },
+ { 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, upload-time = "2025-10-06T05:36:53.101Z" },
+ { 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, upload-time = "2025-10-06T05:36:54.309Z" },
+ { 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, upload-time = "2025-10-06T05:36:55.566Z" },
+ { 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, upload-time = "2025-10-06T05:36:56.758Z" },
+ { 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, upload-time = "2025-10-06T05:36:57.965Z" },
+ { 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, upload-time = "2025-10-06T05:36:59.237Z" },
+ { 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, upload-time = "2025-10-06T05:37:00.811Z" },
+ { 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, upload-time = "2025-10-06T05:37:02.115Z" },
+ { 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, upload-time = "2025-10-06T05:37:03.711Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/00/04ca1c3a7a124b6de4f8a9a17cc2fcad138b4608e7a3fc5877804b8715d7/frozenlist-1.8.0-cp313-cp313t-win32.whl", hash = "sha256:0f96534f8bfebc1a394209427d0f8a63d343c9779cda6fc25e8e121b5fd8555b", size = 43492, upload-time = "2025-10-06T05:37:04.915Z" },
+ { url = "https://files.pythonhosted.org/packages/59/5e/c69f733a86a94ab10f68e496dc6b7e8bc078ebb415281d5698313e3af3a1/frozenlist-1.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5d63a068f978fc69421fb0e6eb91a9603187527c86b7cd3f534a5b77a592b888", size = 48034, upload-time = "2025-10-06T05:37:06.343Z" },
+ { url = "https://files.pythonhosted.org/packages/16/6c/be9d79775d8abe79b05fa6d23da99ad6e7763a1d080fbae7290b286093fd/frozenlist-1.8.0-cp313-cp313t-win_arm64.whl", hash = "sha256:bf0a7e10b077bf5fb9380ad3ae8ce20ef919a6ad93b4552896419ac7e1d8e042", size = 41749, upload-time = "2025-10-06T05:37:07.431Z" },
+ { 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, upload-time = "2025-10-06T05:37:08.438Z" },
+ { 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, upload-time = "2025-10-06T05:37:09.48Z" },
+ { 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, upload-time = "2025-10-06T05:37:10.569Z" },
+ { 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, upload-time = "2025-10-06T05:37:11.993Z" },
+ { 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, upload-time = "2025-10-06T05:37:13.194Z" },
+ { 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, upload-time = "2025-10-06T05:37:14.577Z" },
+ { 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, upload-time = "2025-10-06T05:37:15.781Z" },
+ { 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, upload-time = "2025-10-06T05:37:17.037Z" },
+ { 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, upload-time = "2025-10-06T05:37:18.221Z" },
+ { 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, upload-time = "2025-10-06T05:37:19.771Z" },
+ { 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, upload-time = "2025-10-06T05:37:20.969Z" },
+ { 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, upload-time = "2025-10-06T05:37:22.252Z" },
+ { 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, upload-time = "2025-10-06T05:37:23.5Z" },
+ { url = "https://files.pythonhosted.org/packages/3f/ab/945b2f32de889993b9c9133216c068b7fcf257d8595a0ac420ac8677cab0/frozenlist-1.8.0-cp314-cp314-win32.whl", hash = "sha256:bac9c42ba2ac65ddc115d930c78d24ab8d4f465fd3fc473cdedfccadb9429806", size = 40536, upload-time = "2025-10-06T05:37:25.581Z" },
+ { url = "https://files.pythonhosted.org/packages/59/ad/9caa9b9c836d9ad6f067157a531ac48b7d36499f5036d4141ce78c230b1b/frozenlist-1.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:3e0761f4d1a44f1d1a47996511752cf3dcec5bbdd9cc2b4fe595caf97754b7a0", size = 44330, upload-time = "2025-10-06T05:37:26.928Z" },
+ { url = "https://files.pythonhosted.org/packages/82/13/e6950121764f2676f43534c555249f57030150260aee9dcf7d64efda11dd/frozenlist-1.8.0-cp314-cp314-win_arm64.whl", hash = "sha256:d1eaff1d00c7751b7c6662e9c5ba6eb2c17a2306ba5e2a37f24ddf3cc953402b", size = 40627, upload-time = "2025-10-06T05:37:28.075Z" },
+ { 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, upload-time = "2025-10-06T05:37:29.373Z" },
+ { 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, upload-time = "2025-10-06T05:37:30.792Z" },
+ { 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, upload-time = "2025-10-06T05:37:32.127Z" },
+ { 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, upload-time = "2025-10-06T05:37:33.21Z" },
+ { 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, upload-time = "2025-10-06T05:37:36.107Z" },
+ { 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, upload-time = "2025-10-06T05:37:37.663Z" },
+ { 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, upload-time = "2025-10-06T05:37:39.261Z" },
+ { 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, upload-time = "2025-10-06T05:37:43.213Z" },
+ { 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, upload-time = "2025-10-06T05:37:45.337Z" },
+ { 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, upload-time = "2025-10-06T05:37:46.657Z" },
+ { 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, upload-time = "2025-10-06T05:37:47.946Z" },
+ { 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, upload-time = "2025-10-06T05:37:49.499Z" },
+ { 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, upload-time = "2025-10-06T05:37:50.745Z" },
+ { url = "https://files.pythonhosted.org/packages/af/d3/76bd4ed4317e7119c2b7f57c3f6934aba26d277acc6309f873341640e21f/frozenlist-1.8.0-cp314-cp314t-win32.whl", hash = "sha256:342c97bf697ac5480c0a7ec73cd700ecfa5a8a40ac923bd035484616efecc2df", size = 44676, upload-time = "2025-10-06T05:37:52.222Z" },
+ { url = "https://files.pythonhosted.org/packages/89/76/c615883b7b521ead2944bb3480398cbb07e12b7b4e4d073d3752eb721558/frozenlist-1.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:06be8f67f39c8b1dc671f5d83aaefd3358ae5cdcf8314552c57e7ed3e6475bdd", size = 49451, upload-time = "2025-10-06T05:37:53.425Z" },
+ { url = "https://files.pythonhosted.org/packages/e0/a3/5982da14e113d07b325230f95060e2169f5311b1017ea8af2a29b374c289/frozenlist-1.8.0-cp314-cp314t-win_arm64.whl", hash = "sha256:102e6314ca4da683dca92e3b1355490fed5f313b768500084fbe6371fddfdb79", size = 42507, upload-time = "2025-10-06T05:37:54.513Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/9a/e35b4a917281c0b8419d4207f4334c8e8c5dbf4f3f5f9ada73958d937dcc/frozenlist-1.8.0-py3-none-any.whl", hash = "sha256:0c18a16eab41e82c295618a77502e17b195883241c563b00f0aa5106fc4eaa0d", size = 13409, upload-time = "2025-10-06T05:38:16.721Z" },
+]
+
+[[package]]
+name = "fsspec"
+version = "2026.4.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d5/8d/1c51c094345df128ca4a990d633fe1a0ff28726c9e6b3c41ba65087bba1d/fsspec-2026.4.0.tar.gz", hash = "sha256:301d8ac70ae90ef3ad05dcf94d6c3754a097f9b5fe4667d2787aa359ec7df7e4", size = 312760, upload-time = "2026-04-29T20:42:38.635Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl", hash = "sha256:11ef7bb35dab8a394fde6e608221d5cf3e8499401c249bebaeaad760a1a8dec2", size = 203402, upload-time = "2026-04-29T20:42:36.842Z" },
+]
+
+[[package]]
+name = "h11"
+version = "0.16.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" },
+]
+
+[[package]]
+name = "hf-xet"
+version = "1.5.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/74/d8/5c06fc76461418326a7decf8367480c35be11a41fd938633929c60a9ec6b/hf_xet-1.5.0.tar.gz", hash = "sha256:e0fb0a34d9f406eed88233e829a67ec016bec5af19e480eac65a233ea289a948", size = 837196, upload-time = "2026-05-06T06:18:15.583Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/68/9b/6912c99070915a4f28119e3c5b52a9abd1eec0ad5cb293b8c967a0c6f5a2/hf_xet-1.5.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:7d70fe2ce97b9db73b9c9b9c81fe3693640aec83416a966c446afea54acfae3c", size = 4023383, upload-time = "2026-05-06T06:17:53.947Z" },
+ { url = "https://files.pythonhosted.org/packages/0f/6d/9563cfde59b5d8128a9c7ec972a087f4c782e4f7bac5a85234edfd5d5e49/hf_xet-1.5.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:73a0dae8c71de3b0633a45c73f4a4a5ed09e94b43441d82981a781d4f12baa42", size = 3792751, upload-time = "2026-05-06T06:17:51.791Z" },
+ { url = "https://files.pythonhosted.org/packages/07/a5/ed5a0cf35b49a0571af5a8f53416dad1877a718c021c9937c3a53cb45781/hf_xet-1.5.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a60290ec57e9b71767fba7c3645ddafdd0759974b540441510c629c6db6db24a", size = 4456058, upload-time = "2026-05-06T06:17:40.735Z" },
+ { url = "https://files.pythonhosted.org/packages/60/fb/3ae8bf2a7a37a4197d0195d7247fd25b3952e15cb8a599e285dfaa6f52b3/hf_xet-1.5.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:e5de0f6deada0dada870bb376a11bcd1f08abf3a968a6d118f33e72d1b1eb480", size = 4250783, upload-time = "2026-05-06T06:17:38.412Z" },
+ { url = "https://files.pythonhosted.org/packages/a2/9b/8bae40d4d91525085137196e84eb0ed49cf65b5e96e5c3ecdadd8bd0fac2/hf_xet-1.5.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c799d49f1a5544a0ef7591c0ee75e0d6b93d6f56dc7a4979f59f7518d2872216", size = 4445594, upload-time = "2026-05-06T06:18:04.219Z" },
+ { url = "https://files.pythonhosted.org/packages/13/59/c74efbbd4e8728172b2cc72a2bc014d2947a4b7bdced932fbd3f5da1a4e5/hf_xet-1.5.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2baea1b0b989e5c152fe81425f7745ddc8901280ba3d97c98d8cdece7b706c60", size = 4663995, upload-time = "2026-05-06T06:18:06.1Z" },
+ { url = "https://files.pythonhosted.org/packages/73/32/8e1e0410af64cda9b139d1dcebdc993a8ff9c8c7c0e2696ae356d75ccc0d/hf_xet-1.5.0-cp313-cp313t-win_amd64.whl", hash = "sha256:526345b3ed45f374f6317349df489167606736c876241ba984105afe7fd4839d", size = 3966608, upload-time = "2026-05-06T06:18:19.74Z" },
+ { url = "https://files.pythonhosted.org/packages/fc/34/a8febc8f4edbea8b3e21b02ebc8b628679b84ba7e45cde624a7736b51500/hf_xet-1.5.0-cp313-cp313t-win_arm64.whl", hash = "sha256:786d28e2eb8315d5035544b9d137b4a842d600c434bb91bf7d0d953cce906ad4", size = 3796946, upload-time = "2026-05-06T06:18:17.568Z" },
+ { url = "https://files.pythonhosted.org/packages/2a/20/8fc8996afe5815fa1a6be8e9e5c02f24500f409d599e905800d498a4e14d/hf_xet-1.5.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:872d5601e6deea30d15865ede55d29eac6daf5a534ab417b99b6ef6b076dd96c", size = 4023495, upload-time = "2026-05-06T06:18:01.94Z" },
+ { url = "https://files.pythonhosted.org/packages/32/6a/93d84463c00cecb561a7508aa6303e35ee2894294eac14245526924415fe/hf_xet-1.5.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:9929561f5abf4581c8ea79587881dfef6b8abb2a0d8a51915936fc2a614f4e73", size = 3792731, upload-time = "2026-05-06T06:18:00.021Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/5a/8ec8e0c863b382d00b3c2e2af6ded6b06371be617144a625903a6d562f4b/hf_xet-1.5.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f7b7bbae318e583a86fb21e5a4a175d6721d628a2874f4bd022d0e660c32a682", size = 4456738, upload-time = "2026-05-06T06:17:49.574Z" },
+ { url = "https://files.pythonhosted.org/packages/c5/ca/f7effa1a67717da2bcc6b6c28f71c6ca648c77acaec4e2c32f40cbe16d85/hf_xet-1.5.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:cf7b2dc6f31a4ea754bb50f74cde482dcf5d366d184076d8530b9872787f3761", size = 4251622, upload-time = "2026-05-06T06:17:47.096Z" },
+ { url = "https://files.pythonhosted.org/packages/65/f2/19247dba3e231cf77dec59ddfb878f00057635ff773d099c9b59d37812c3/hf_xet-1.5.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8dbcbab554c9ef158ef2c991545c3e970ddd8cc7acdcd0a78c5a41095dab4ded", size = 4445667, upload-time = "2026-05-06T06:18:11.983Z" },
+ { url = "https://files.pythonhosted.org/packages/7f/64/6f116801a3bcfb6f59f5c251f48cadc47ea54026441c4a385079286a94fa/hf_xet-1.5.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5906bf7718d3636dc13402914736abe723492cb730f744834f5f5b67d3a12702", size = 4664619, upload-time = "2026-05-06T06:18:13.771Z" },
+ { url = "https://files.pythonhosted.org/packages/5c/e8/069542d37946ed08669b127e1496fa99e78196d71de8d41eda5e9f1b7a58/hf_xet-1.5.0-cp314-cp314t-win_amd64.whl", hash = "sha256:5f3dc2248fc01cc0a00cd392ab497f1ca373fcbc7e3f2da1f452480b384e839e", size = 3966802, upload-time = "2026-05-06T06:18:28.162Z" },
+ { url = "https://files.pythonhosted.org/packages/f9/91/fc6fdec27b14d04e88c386ac0a0129732b53fa23f7c4a78f4b83a039c567/hf_xet-1.5.0-cp314-cp314t-win_arm64.whl", hash = "sha256:b285cea1b5bab46b758772716ba8d6854a1a0310fed1c249d678a8b38601e5a0", size = 3797168, upload-time = "2026-05-06T06:18:26.287Z" },
+ { url = "https://files.pythonhosted.org/packages/3d/fb/69ff198a82cae7eb1a69fb84d93b3a3e4816564d76817fe541ddc96874eb/hf_xet-1.5.0-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:dad0dc84e941b8ba3c860659fe1fdc35c049d47cce293f003287757e971a8f56", size = 4030814, upload-time = "2026-05-06T06:17:57.933Z" },
+ { url = "https://files.pythonhosted.org/packages/9b/ff/edcc2b40162bef3ff78e14ab637e5f3b89243d6aee72f5949d3bb6a5af83/hf_xet-1.5.0-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:fd6e5a9b0fdac4ed03ed45ef79254a655b1aaab514a02202617fbf643f5fdf7a", size = 3798444, upload-time = "2026-05-06T06:17:55.79Z" },
+ { url = "https://files.pythonhosted.org/packages/49/4d/103f76b04310e5e57656696cc184690d20c466af0bca3ca88f8c8ea5d4f3/hf_xet-1.5.0-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3531b1823a0e6d77d80f9ed15ca0e00f0d115094f8ac033d5cae88f4564cc949", size = 4465986, upload-time = "2026-05-06T06:17:44.886Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/a2/546f47f464737b3edbab6f8ddb57f2599b93d2cbb66f06abb475ccb48651/hf_xet-1.5.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:9a0ee58cd18d5ea799f7ed11290bbccbe56bdd8b1d97ca74b9cc49a3945d7a3b", size = 4259865, upload-time = "2026-05-06T06:17:42.639Z" },
+ { url = "https://files.pythonhosted.org/packages/95/7f/1be593c1f28613be2e196473481cd81bfc5910795e30a34e8f744f6cac4f/hf_xet-1.5.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1e60df5a42e9bed8628b6416af2cba4cba57ae9f02de226a06b020d98e1aab18", size = 4459835, upload-time = "2026-05-06T06:18:08.026Z" },
+ { url = "https://files.pythonhosted.org/packages/aa/b2/703569fc881f3284487e68cda7b42179978480da3c438042a6bbbb4a671c/hf_xet-1.5.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:4b35549ce62601b84da4ff9b24d970032ace3d4430f52d91bcbb26c901d6c690", size = 4672414, upload-time = "2026-05-06T06:18:09.864Z" },
+ { url = "https://files.pythonhosted.org/packages/af/37/1b6def445c567286b50aa3b33828158e135b1be44938dde59f11382a500c/hf_xet-1.5.0-cp37-abi3-win_amd64.whl", hash = "sha256:2806c7c17b4d23f8d88f7c4814f838c3b6150773fe339c20af23e1cfaf2797e4", size = 3977238, upload-time = "2026-05-06T06:18:23.621Z" },
+ { url = "https://files.pythonhosted.org/packages/62/94/3b66b148778ee100dcfd69c2ca22b57b41b44d3063ceec934f209e9184ce/hf_xet-1.5.0-cp37-abi3-win_arm64.whl", hash = "sha256:b6c9df403040248c76d808d3e047d64db2d923bae593eb244c41e425cf6cd7be", size = 3806916, upload-time = "2026-05-06T06:18:21.7Z" },
+]
+
+[[package]]
+name = "htmldate"
+version = "1.9.4"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "charset-normalizer" },
+ { name = "dateparser" },
+ { name = "lxml" },
+ { name = "python-dateutil" },
+ { name = "urllib3" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/9d/10/ead9dabc999f353c3aa5d0dc0835b1e355215a5ecb489a7f4ef2ddad5e33/htmldate-1.9.4.tar.gz", hash = "sha256:1129063e02dd0354b74264de71e950c0c3fcee191178321418ccad2074cc8ed0", size = 44690, upload-time = "2025-11-04T17:46:44.983Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a1/bd/adfcdaaad5805c0c5156aeefd64c1e868c05e9c1cd6fd21751f168cd88c7/htmldate-1.9.4-py3-none-any.whl", hash = "sha256:1b94bcc4e08232a5b692159903acf95548b6a7492dddca5bb123d89d6325921c", size = 31558, upload-time = "2025-11-04T17:46:43.258Z" },
+]
+
+[[package]]
+name = "httpcore"
+version = "1.0.9"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "certifi" },
+ { name = "h11" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" },
+]
+
+[[package]]
+name = "httpx"
+version = "0.28.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "anyio" },
+ { name = "certifi" },
+ { name = "httpcore" },
+ { name = "idna" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" },
+]
+
+[[package]]
+name = "huggingface-hub"
+version = "1.16.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "filelock" },
+ { name = "fsspec" },
+ { name = "hf-xet", marker = "platform_machine == 'AMD64' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'arm64' or platform_machine == 'x86_64'" },
+ { name = "httpx" },
+ { name = "packaging" },
+ { name = "pyyaml" },
+ { name = "tqdm" },
+ { name = "typer" },
+ { name = "typing-extensions" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/48/0f/ed994dbade67a54407c28cab96ef845e0e6d25500be56aca6394f8bfc9dd/huggingface_hub-1.16.1.tar.gz", hash = "sha256:7f1dc4c5ec21aed69be630ad0c3378616be16f3de1a47b141c0e812965d9c832", size = 792534, upload-time = "2026-05-21T18:40:00.908Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/49/79/621a7dbb80c70974f73a597275351ebe03ce5bc65cb5f8f4acb5859252bc/huggingface_hub-1.16.1-py3-none-any.whl", hash = "sha256:64340de934b9ce37857ef85a82de72f5629e8a270f9119eabb12bf495eb53c22", size = 668176, upload-time = "2026-05-21T18:39:58.596Z" },
+]
+
+[[package]]
+name = "idna"
+version = "3.16"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/1a/88/bcf9709822fe69d02c2a6a77956c98ce6ea8ca8767a9aadcedc7eb6a2390/idna-3.16.tar.gz", hash = "sha256:d7a6da03db833450fca25d2358ac9ff06cd624577a4aea3a596d5c0f77b8e03d", size = 203770, upload-time = "2026-05-22T00:16:18.781Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/94/16/70255075a9859a0e3adb789b68ceb0e210dec03934245fd98d248226572f/idna-3.16-py3-none-any.whl", hash = "sha256:cc246e3a3f89580c3a951b5ad298ca4638078b2cdd4f115654332b5c26daded5", size = 74165, upload-time = "2026-05-22T00:16:16.698Z" },
+]
+
+[[package]]
+name = "iniconfig"
+version = "2.3.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" },
+]
+
+[[package]]
+name = "ipykernel"
+version = "7.2.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "appnope", marker = "sys_platform == 'darwin'" },
+ { name = "comm" },
+ { name = "debugpy" },
+ { name = "ipython" },
+ { name = "jupyter-client" },
+ { name = "jupyter-core" },
+ { name = "matplotlib-inline" },
+ { name = "nest-asyncio" },
+ { name = "packaging" },
+ { name = "psutil" },
+ { name = "pyzmq" },
+ { name = "tornado" },
+ { name = "traitlets" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/ca/8d/b68b728e2d06b9e0051019640a40a9eb7a88fcd82c2e1b5ce70bef5ff044/ipykernel-7.2.0.tar.gz", hash = "sha256:18ed160b6dee2cbb16e5f3575858bc19d8f1fe6046a9a680c708494ce31d909e", size = 176046, upload-time = "2026-02-06T16:43:27.403Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/82/b9/e73d5d9f405cba7706c539aa8b311b49d4c2f3d698d9c12f815231169c71/ipykernel-7.2.0-py3-none-any.whl", hash = "sha256:3bbd4420d2b3cc105cbdf3756bfc04500b1e52f090a90716851f3916c62e1661", size = 118788, upload-time = "2026-02-06T16:43:25.149Z" },
+]
+
+[[package]]
+name = "ipython"
+version = "9.13.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+ { name = "decorator" },
+ { name = "ipython-pygments-lexers" },
+ { name = "jedi" },
+ { name = "matplotlib-inline" },
+ { name = "pexpect", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" },
+ { name = "prompt-toolkit" },
+ { name = "psutil" },
+ { name = "pygments" },
+ { name = "stack-data" },
+ { name = "traitlets" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/cd/c4/87cda5842cf5c31837c06ddb588e11c3c35d8ece89b7a0108c06b8c9b00a/ipython-9.13.0.tar.gz", hash = "sha256:7e834b6afc99f020e3f05966ced34792f40267d64cb1ea9043886dab0dde5967", size = 4430549, upload-time = "2026-04-24T12:24:55.221Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl", hash = "sha256:57f9d4639e20818d328d287c7b549af3d05f12486ea8f2e7f73e52a36ec4d201", size = 627274, upload-time = "2026-04-24T12:24:53.038Z" },
+]
+
+[[package]]
+name = "ipython-pygments-lexers"
+version = "1.1.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pygments" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393, upload-time = "2025-01-17T11:24:34.505Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074, upload-time = "2025-01-17T11:24:33.271Z" },
+]
+
+[[package]]
+name = "ipywidgets"
+version = "8.1.8"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "comm" },
+ { name = "ipython" },
+ { name = "jupyterlab-widgets" },
+ { name = "traitlets" },
+ { name = "widgetsnbextension" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/4c/ae/c5ce1edc1afe042eadb445e95b0671b03cee61895264357956e61c0d2ac0/ipywidgets-8.1.8.tar.gz", hash = "sha256:61f969306b95f85fba6b6986b7fe45d73124d1d9e3023a8068710d47a22ea668", size = 116739, upload-time = "2025-11-01T21:18:12.393Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl", hash = "sha256:ecaca67aed704a338f88f67b1181b58f821ab5dc89c1f0f5ef99db43c1c2921e", size = 139808, upload-time = "2025-11-01T21:18:10.956Z" },
+]
+
+[[package]]
+name = "isoduration"
+version = "20.11.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "arrow" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/7c/1a/3c8edc664e06e6bd06cce40c6b22da5f1429aa4224d0c590f3be21c91ead/isoduration-20.11.0.tar.gz", hash = "sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9", size = 11649, upload-time = "2020-11-01T11:00:00.312Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042", size = 11321, upload-time = "2020-11-01T10:59:58.02Z" },
+]
+
+[[package]]
+name = "jedi"
+version = "0.20.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "parso" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/46/b7/a3635f6a2d7cf5b5dd98064fc1d5fbbafcb25477bcea204a3a92145d158b/jedi-0.20.0.tar.gz", hash = "sha256:c3f4ccbd276696f4b19c54618d4fb18f9fc24b0aef02acf704b23f487daa1011", size = 3119416, upload-time = "2026-05-01T23:38:47.814Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl", hash = "sha256:7bdd9c2634f56713299976f4cbd59cb3fa92165cc5e05ea811fb253480728b67", size = 4884812, upload-time = "2026-05-01T23:38:43.919Z" },
+]
+
+[[package]]
+name = "jinja2"
+version = "3.1.6"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "markupsafe" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" },
+]
+
+[[package]]
+name = "jmespath"
+version = "1.1.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d3/59/322338183ecda247fb5d1763a6cbe46eff7222eaeebafd9fa65d4bf5cb11/jmespath-1.1.0.tar.gz", hash = "sha256:472c87d80f36026ae83c6ddd0f1d05d4e510134ed462851fd5f754c8c3cbb88d", size = 27377, upload-time = "2026-01-22T16:35:26.279Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/14/2f/967ba146e6d58cf6a652da73885f52fc68001525b4197effc174321d70b4/jmespath-1.1.0-py3-none-any.whl", hash = "sha256:a5663118de4908c91729bea0acadca56526eb2698e83de10cd116ae0f4e97c64", size = 20419, upload-time = "2026-01-22T16:35:24.919Z" },
+]
+
+[[package]]
+name = "json5"
+version = "0.14.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/9c/4b/6f8906aaf67d501e259b0adab4d312945bb7211e8b8d4dcc77c92320edaa/json5-0.14.0.tar.gz", hash = "sha256:b3f492fad9f6cdbced8b7d40b28b9b1c9701c5f561bef0d33b81c2ff433fefcb", size = 52656, upload-time = "2026-03-27T22:50:48.108Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b8/42/cf027b4ac873b076189d935b135397675dac80cb29acb13e1ab86ad6c631/json5-0.14.0-py3-none-any.whl", hash = "sha256:56cf861bab076b1178eb8c92e1311d273a9b9acea2ccc82c276abf839ebaef3a", size = 36271, upload-time = "2026-03-27T22:50:47.073Z" },
+]
+
+[[package]]
+name = "jsonpointer"
+version = "3.1.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/18/c7/af399a2e7a67fd18d63c40c5e62d3af4e67b836a2107468b6a5ea24c4304/jsonpointer-3.1.1.tar.gz", hash = "sha256:0b801c7db33a904024f6004d526dcc53bbb8a4a0f4e32bfd10beadf60adf1900", size = 9068, upload-time = "2026-03-23T22:32:32.458Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9e/6a/a83720e953b1682d2d109d3c2dbb0bc9bf28cc1cbc205be4ef4be5da709d/jsonpointer-3.1.1-py3-none-any.whl", hash = "sha256:8ff8b95779d071ba472cf5bc913028df06031797532f08a7d5b602d8b2a488ca", size = 7659, upload-time = "2026-03-23T22:32:31.568Z" },
+]
+
+[[package]]
+name = "jsonschema"
+version = "4.26.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "attrs" },
+ { name = "jsonschema-specifications" },
+ { name = "referencing" },
+ { name = "rpds-py" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/b3/fc/e067678238fa451312d4c62bf6e6cf5ec56375422aee02f9cb5f909b3047/jsonschema-4.26.0.tar.gz", hash = "sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326", size = 366583, upload-time = "2026-01-07T13:41:07.246Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl", hash = "sha256:d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce", size = 90630, upload-time = "2026-01-07T13:41:05.306Z" },
+]
+
+[package.optional-dependencies]
+format-nongpl = [
+ { name = "fqdn" },
+ { name = "idna" },
+ { name = "isoduration" },
+ { name = "jsonpointer" },
+ { name = "rfc3339-validator" },
+ { name = "rfc3986-validator" },
+ { name = "rfc3987-syntax" },
+ { name = "uri-template" },
+ { name = "webcolors" },
+]
+
+[[package]]
+name = "jsonschema-specifications"
+version = "2025.9.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "referencing" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/19/74/a633ee74eb36c44aa6d1095e7cc5569bebf04342ee146178e2d36600708b/jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d", size = 32855, upload-time = "2025-09-08T01:34:59.186Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe", size = 18437, upload-time = "2025-09-08T01:34:57.871Z" },
+]
+
+[[package]]
+name = "jupyter"
+version = "1.1.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "ipykernel" },
+ { name = "ipywidgets" },
+ { name = "jupyter-console" },
+ { name = "jupyterlab" },
+ { name = "nbconvert" },
+ { name = "notebook" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/58/f3/af28ea964ab8bc1e472dba2e82627d36d470c51f5cd38c37502eeffaa25e/jupyter-1.1.1.tar.gz", hash = "sha256:d55467bceabdea49d7e3624af7e33d59c37fff53ed3a350e1ac957bed731de7a", size = 5714959, upload-time = "2024-08-30T07:15:48.299Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/38/64/285f20a31679bf547b75602702f7800e74dbabae36ef324f716c02804753/jupyter-1.1.1-py2.py3-none-any.whl", hash = "sha256:7a59533c22af65439b24bbe60373a4e95af8f16ac65a6c00820ad378e3f7cc83", size = 2657, upload-time = "2024-08-30T07:15:47.045Z" },
+]
+
+[[package]]
+name = "jupyter-client"
+version = "8.8.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "jupyter-core" },
+ { name = "python-dateutil" },
+ { name = "pyzmq" },
+ { name = "tornado" },
+ { name = "traitlets" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/05/e4/ba649102a3bc3fbca54e7239fb924fd434c766f855693d86de0b1f2bec81/jupyter_client-8.8.0.tar.gz", hash = "sha256:d556811419a4f2d96c869af34e854e3f059b7cc2d6d01a9cd9c85c267691be3e", size = 348020, upload-time = "2026-01-08T13:55:47.938Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl", hash = "sha256:f93a5b99c5e23a507b773d3a1136bd6e16c67883ccdbd9a829b0bbdb98cd7d7a", size = 107371, upload-time = "2026-01-08T13:55:45.562Z" },
+]
+
+[[package]]
+name = "jupyter-console"
+version = "6.6.3"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "ipykernel" },
+ { name = "ipython" },
+ { name = "jupyter-client" },
+ { name = "jupyter-core" },
+ { name = "prompt-toolkit" },
+ { name = "pygments" },
+ { name = "pyzmq" },
+ { name = "traitlets" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/bd/2d/e2fd31e2fc41c14e2bcb6c976ab732597e907523f6b2420305f9fc7fdbdb/jupyter_console-6.6.3.tar.gz", hash = "sha256:566a4bf31c87adbfadf22cdf846e3069b59a71ed5da71d6ba4d8aaad14a53539", size = 34363, upload-time = "2023-03-06T14:13:31.02Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ca/77/71d78d58f15c22db16328a476426f7ac4a60d3a5a7ba3b9627ee2f7903d4/jupyter_console-6.6.3-py3-none-any.whl", hash = "sha256:309d33409fcc92ffdad25f0bcdf9a4a9daa61b6f341177570fdac03de5352485", size = 24510, upload-time = "2023-03-06T14:13:28.229Z" },
+]
+
+[[package]]
+name = "jupyter-core"
+version = "5.9.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "platformdirs" },
+ { name = "traitlets" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/02/49/9d1284d0dc65e2c757b74c6687b6d319b02f822ad039e5c512df9194d9dd/jupyter_core-5.9.1.tar.gz", hash = "sha256:4d09aaff303b9566c3ce657f580bd089ff5c91f5f89cf7d8846c3cdf465b5508", size = 89814, upload-time = "2025-10-16T19:19:18.444Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl", hash = "sha256:ebf87fdc6073d142e114c72c9e29a9d7ca03fad818c5d300ce2adc1fb0743407", size = 29032, upload-time = "2025-10-16T19:19:16.783Z" },
+]
+
+[[package]]
+name = "jupyter-events"
+version = "0.12.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "jsonschema", extra = ["format-nongpl"] },
+ { name = "packaging" },
+ { name = "python-json-logger" },
+ { name = "pyyaml" },
+ { name = "referencing" },
+ { name = "rfc3339-validator" },
+ { name = "rfc3986-validator" },
+ { name = "traitlets" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/18/f8/475c4241b2b75af0deaae453ed003c6c851766dbc44d332d8baf245dc931/jupyter_events-0.12.1.tar.gz", hash = "sha256:faff25f77218335752f35f23c5fe6e4a392a7bd99a5939ccb9b8fbf594636cf3", size = 62854, upload-time = "2026-04-20T23:17:50.66Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/eb/6c/6fcde0c8f616ed360ffd3587f7db9e225a7e62b583a04494d2f069cf64ea/jupyter_events-0.12.1-py3-none-any.whl", hash = "sha256:c366585253f537a627da52fa7ca7410c5b5301fe893f511e7b077c2d93ec8bcf", size = 19512, upload-time = "2026-04-20T23:17:48.927Z" },
+]
+
+[[package]]
+name = "jupyter-lsp"
+version = "2.3.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "jupyter-server" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/36/ff/1e4a61f5170a9a1d978f3ac3872449de6c01fc71eaf89657824c878b1549/jupyter_lsp-2.3.1.tar.gz", hash = "sha256:fdf8a4aa7d85813976d6e29e95e6a2c8f752701f926f2715305249a3829805a6", size = 55677, upload-time = "2026-04-02T08:10:06.749Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/23/e8/9d61dcbd1dce8ef418f06befd4ac084b4720429c26b0b1222bc218685eff/jupyter_lsp-2.3.1-py3-none-any.whl", hash = "sha256:71b954d834e85ff3096400554f2eefaf7fe37053036f9a782b0f7c5e42dadb81", size = 77513, upload-time = "2026-04-02T08:10:01.753Z" },
+]
+
+[[package]]
+name = "jupyter-server"
+version = "2.18.2"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "anyio" },
+ { name = "argon2-cffi" },
+ { name = "jinja2" },
+ { name = "jupyter-client" },
+ { name = "jupyter-core" },
+ { name = "jupyter-events" },
+ { name = "jupyter-server-terminals" },
+ { name = "nbconvert" },
+ { name = "nbformat" },
+ { name = "packaging" },
+ { name = "prometheus-client" },
+ { name = "pywinpty", marker = "os_name == 'nt'" },
+ { name = "pyzmq" },
+ { name = "send2trash" },
+ { name = "terminado" },
+ { name = "tornado" },
+ { name = "traitlets" },
+ { name = "websocket-client" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/ca/15/1eacb0fcb79ef86e8a0a79a708e6ad7435f6f223097dd29a4ce861fabc44/jupyter_server-2.18.2.tar.gz", hash = "sha256:06b4f40d8a7a00bb39d5216859c81374a0e7cfefe6d8a5a7facc5a5c37c679a7", size = 753177, upload-time = "2026-05-06T07:04:36.274Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e2/50/ecf4f70d65bdb7519b28a33d1b2fee8a4b4ba1ae1a92f15d97e877c5de21/jupyter_server-2.18.2-py3-none-any.whl", hash = "sha256:fa5e46539ded65791838035a2b6001f13e54d5f64b8b3752eb1e91fdd641a5b8", size = 391907, upload-time = "2026-05-06T07:04:34.014Z" },
+]
+
+[[package]]
+name = "jupyter-server-terminals"
+version = "0.5.4"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pywinpty", marker = "os_name == 'nt'" },
+ { name = "terminado" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/f4/a7/bcd0a9b0cbba88986fe944aaaf91bfda603e5a50bda8ed15123f381a3b2f/jupyter_server_terminals-0.5.4.tar.gz", hash = "sha256:bbda128ed41d0be9020349f9f1f2a4ab9952a73ed5f5ac9f1419794761fb87f5", size = 31770, upload-time = "2026-01-14T16:53:20.213Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d1/2d/6674563f71c6320841fc300911a55143925112a72a883e2ca71fba4c618d/jupyter_server_terminals-0.5.4-py3-none-any.whl", hash = "sha256:55be353fc74a80bc7f3b20e6be50a55a61cd525626f578dcb66a5708e2007d14", size = 13704, upload-time = "2026-01-14T16:53:18.738Z" },
+]
+
+[[package]]
+name = "jupyterlab"
+version = "4.5.7"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "async-lru" },
+ { name = "httpx" },
+ { name = "ipykernel" },
+ { name = "jinja2" },
+ { name = "jupyter-core" },
+ { name = "jupyter-lsp" },
+ { name = "jupyter-server" },
+ { name = "jupyterlab-server" },
+ { name = "notebook-shim" },
+ { name = "packaging" },
+ { name = "setuptools" },
+ { name = "tornado" },
+ { name = "traitlets" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/2b/22/8440ec827762146e7cdecf04335bd348795899d29dc6ae82238707353a2c/jupyterlab-4.5.7.tar.gz", hash = "sha256:55a9822c4754da305f41e113452c68383e214dcf96de760146af89ce5d5117b0", size = 23992763, upload-time = "2026-04-29T16:43:51.328Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/3d/aa/537b8f7d80e799af19af35fb3ddfc970b951088a13c57dd9387dcfbb7f61/jupyterlab-4.5.7-py3-none-any.whl", hash = "sha256:fba4cb0e2c44a52859669d8c98b45de029d5e515f8407bf8534d2a8fc5f0964d", size = 12450123, upload-time = "2026-04-29T16:43:46.639Z" },
+]
+
+[[package]]
+name = "jupyterlab-pygments"
+version = "0.3.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/90/51/9187be60d989df97f5f0aba133fa54e7300f17616e065d1ada7d7646b6d6/jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d", size = 512900, upload-time = "2023-11-23T09:26:37.44Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780", size = 15884, upload-time = "2023-11-23T09:26:34.325Z" },
+]
+
+[[package]]
+name = "jupyterlab-server"
+version = "2.28.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "babel" },
+ { name = "jinja2" },
+ { name = "json5" },
+ { name = "jsonschema" },
+ { name = "jupyter-server" },
+ { name = "packaging" },
+ { name = "requests" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/d6/2c/90153f189e421e93c4bb4f9e3f59802a1f01abd2ac5cf40b152d7f735232/jupyterlab_server-2.28.0.tar.gz", hash = "sha256:35baa81898b15f93573e2deca50d11ac0ae407ebb688299d3a5213265033712c", size = 76996, upload-time = "2025-10-22T13:59:18.37Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e0/07/a000fe835f76b7e1143242ab1122e6362ef1c03f23f83a045c38859c2ae0/jupyterlab_server-2.28.0-py3-none-any.whl", hash = "sha256:e4355b148fdcf34d312bbbc80f22467d6d20460e8b8736bf235577dd18506968", size = 59830, upload-time = "2025-10-22T13:59:16.767Z" },
+]
+
+[[package]]
+name = "jupyterlab-widgets"
+version = "3.0.16"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/26/2d/ef58fed122b268c69c0aa099da20bc67657cdfb2e222688d5731bd5b971d/jupyterlab_widgets-3.0.16.tar.gz", hash = "sha256:423da05071d55cf27a9e602216d35a3a65a3e41cdf9c5d3b643b814ce38c19e0", size = 897423, upload-time = "2025-11-01T21:11:29.724Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl", hash = "sha256:45fa36d9c6422cf2559198e4db481aa243c7a32d9926b500781c830c80f7ecf8", size = 914926, upload-time = "2025-11-01T21:11:28.008Z" },
+]
+
+[[package]]
+name = "justext"
+version = "3.0.2"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "lxml", extra = ["html-clean"] },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/49/f3/45890c1b314f0d04e19c1c83d534e611513150939a7cf039664d9ab1e649/justext-3.0.2.tar.gz", hash = "sha256:13496a450c44c4cd5b5a75a5efcd9996066d2a189794ea99a49949685a0beb05", size = 828521, upload-time = "2025-02-25T20:21:49.934Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f2/ac/52f4e86d1924a7fc05af3aeb34488570eccc39b4af90530dd6acecdf16b5/justext-3.0.2-py2.py3-none-any.whl", hash = "sha256:62b1c562b15c3c6265e121cc070874243a443bfd53060e869393f09d6b6cc9a7", size = 837940, upload-time = "2025-02-25T20:21:44.179Z" },
+]
+
+[[package]]
+name = "kiwisolver"
+version = "1.5.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d0/67/9c61eccb13f0bdca9307614e782fec49ffdde0f7a2314935d489fa93cd9c/kiwisolver-1.5.0.tar.gz", hash = "sha256:d4193f3d9dc3f6f79aaed0e5637f45d98850ebf01f7ca20e69457f3e8946b66a", size = 103482, upload-time = "2026-03-09T13:15:53.382Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/4d/b2/818b74ebea34dabe6d0c51cb1c572e046730e64844da6ed646d5298c40ce/kiwisolver-1.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:4e9750bc21b886308024f8a54ccb9a2cc38ac9fa813bf4348434e3d54f337ff9", size = 123158, upload-time = "2026-03-09T13:13:23.127Z" },
+ { url = "https://files.pythonhosted.org/packages/bf/d9/405320f8077e8e1c5c4bd6adc45e1e6edf6d727b6da7f2e2533cf58bff71/kiwisolver-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:72ec46b7eba5b395e0a7b63025490d3214c11013f4aacb4f5e8d6c3041829588", size = 66388, upload-time = "2026-03-09T13:13:24.765Z" },
+ { url = "https://files.pythonhosted.org/packages/99/9f/795fedf35634f746151ca8839d05681ceb6287fbed6cc1c9bf235f7887c2/kiwisolver-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ed3a984b31da7481b103f68776f7128a89ef26ed40f4dc41a2223cda7fb24819", size = 64068, upload-time = "2026-03-09T13:13:25.878Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/13/680c54afe3e65767bed7ec1a15571e1a2f1257128733851ade24abcefbcc/kiwisolver-1.5.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bb5136fb5352d3f422df33f0c879a1b0c204004324150cc3b5e3c4f310c9049f", size = 1477934, upload-time = "2026-03-09T13:13:27.166Z" },
+ { url = "https://files.pythonhosted.org/packages/c8/2f/cebfcdb60fd6a9b0f6b47a9337198bcbad6fbe15e68189b7011fd914911f/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2af221f268f5af85e776a73d62b0845fc8baf8ef0abfae79d29c77d0e776aaf", size = 1278537, upload-time = "2026-03-09T13:13:28.707Z" },
+ { url = "https://files.pythonhosted.org/packages/f2/0d/9b782923aada3fafb1d6b84e13121954515c669b18af0c26e7d21f579855/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b0f172dc8ffaccb8522d7c5d899de00133f2f1ca7b0a49b7da98e901de87bf2d", size = 1296685, upload-time = "2026-03-09T13:13:30.528Z" },
+ { url = "https://files.pythonhosted.org/packages/27/70/83241b6634b04fe44e892688d5208332bde130f38e610c0418f9ede47ded/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6ab8ba9152203feec73758dad83af9a0bbe05001eb4639e547207c40cfb52083", size = 1346024, upload-time = "2026-03-09T13:13:32.818Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/db/30ed226fb271ae1a6431fc0fe0edffb2efe23cadb01e798caeb9f2ceae8f/kiwisolver-1.5.0-cp312-cp312-manylinux_2_39_riscv64.whl", hash = "sha256:cdee07c4d7f6d72008d3f73b9bf027f4e11550224c7c50d8df1ae4a37c1402a6", size = 987241, upload-time = "2026-03-09T13:13:34.435Z" },
+ { url = "https://files.pythonhosted.org/packages/ec/bd/c314595208e4c9587652d50959ead9e461995389664e490f4dce7ff0f782/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7c60d3c9b06fb23bd9c6139281ccbdc384297579ae037f08ae90c69f6845c0b1", size = 2227742, upload-time = "2026-03-09T13:13:36.4Z" },
+ { url = "https://files.pythonhosted.org/packages/c1/43/0499cec932d935229b5543d073c2b87c9c22846aab48881e9d8d6e742a2d/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e315e5ec90d88e140f57696ff85b484ff68bb311e36f2c414aa4286293e6dee0", size = 2323966, upload-time = "2026-03-09T13:13:38.204Z" },
+ { url = "https://files.pythonhosted.org/packages/3d/6f/79b0d760907965acfd9d61826a3d41f8f093c538f55cd2633d3f0db269f6/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:1465387ac63576c3e125e5337a6892b9e99e0627d52317f3ca79e6930d889d15", size = 1977417, upload-time = "2026-03-09T13:13:39.966Z" },
+ { url = "https://files.pythonhosted.org/packages/ab/31/01d0537c41cb75a551a438c3c7a80d0c60d60b81f694dac83dd436aec0d0/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:530a3fd64c87cffa844d4b6b9768774763d9caa299e9b75d8eca6a4423b31314", size = 2491238, upload-time = "2026-03-09T13:13:41.698Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/34/8aefdd0be9cfd00a44509251ba864f5caf2991e36772e61c408007e7f417/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1d9daea4ea6b9be74fe2f01f7fbade8d6ffab263e781274cffca0dba9be9eec9", size = 2294947, upload-time = "2026-03-09T13:13:43.343Z" },
+ { url = "https://files.pythonhosted.org/packages/ad/cf/0348374369ca588f8fe9c338fae49fa4e16eeb10ffb3d012f23a54578a9e/kiwisolver-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:f18c2d9782259a6dc132fdc7a63c168cbc74b35284b6d75c673958982a378384", size = 73569, upload-time = "2026-03-09T13:13:45.792Z" },
+ { url = "https://files.pythonhosted.org/packages/28/26/192b26196e2316e2bd29deef67e37cdf9870d9af8e085e521afff0fed526/kiwisolver-1.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:f7c7553b13f69c1b29a5bde08ddc6d9d0c8bfb84f9ed01c30db25944aeb852a7", size = 64997, upload-time = "2026-03-09T13:13:46.878Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/69/024d6711d5ba575aa65d5538042e99964104e97fa153a9f10bc369182bc2/kiwisolver-1.5.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:fd40bb9cd0891c4c3cb1ddf83f8bbfa15731a248fdc8162669405451e2724b09", size = 123166, upload-time = "2026-03-09T13:13:48.032Z" },
+ { url = "https://files.pythonhosted.org/packages/ce/48/adbb40df306f587054a348831220812b9b1d787aff714cfbc8556e38fccd/kiwisolver-1.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c0e1403fd7c26d77c1f03e096dc58a5c726503fa0db0456678b8668f76f521e3", size = 66395, upload-time = "2026-03-09T13:13:49.365Z" },
+ { url = "https://files.pythonhosted.org/packages/a8/3a/d0a972b34e1c63e2409413104216cd1caa02c5a37cb668d1687d466c1c45/kiwisolver-1.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dda366d548e89a90d88a86c692377d18d8bd64b39c1fb2b92cb31370e2896bbd", size = 64065, upload-time = "2026-03-09T13:13:50.562Z" },
+ { url = "https://files.pythonhosted.org/packages/2b/0a/7b98e1e119878a27ba8618ca1e18b14f992ff1eda40f47bccccf4de44121/kiwisolver-1.5.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:332b4f0145c30b5f5ad9374881133e5aa64320428a57c2c2b61e9d891a51c2f3", size = 1477903, upload-time = "2026-03-09T13:13:52.084Z" },
+ { url = "https://files.pythonhosted.org/packages/18/d8/55638d89ffd27799d5cc3d8aa28e12f4ce7a64d67b285114dbedc8ea4136/kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c50b89ffd3e1a911c69a1dd3de7173c0cd10b130f56222e57898683841e4f96", size = 1278751, upload-time = "2026-03-09T13:13:54.673Z" },
+ { url = "https://files.pythonhosted.org/packages/b8/97/b4c8d0d18421ecceba20ad8701358453b88e32414e6f6950b5a4bad54e65/kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4db576bb8c3ef9365f8b40fe0f671644de6736ae2c27a2c62d7d8a1b4329f099", size = 1296793, upload-time = "2026-03-09T13:13:56.287Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/10/f862f94b6389d8957448ec9df59450b81bec4abb318805375c401a1e6892/kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0b85aad90cea8ac6797a53b5d5f2e967334fa4d1149f031c4537569972596cb8", size = 1346041, upload-time = "2026-03-09T13:13:58.269Z" },
+ { url = "https://files.pythonhosted.org/packages/a3/6a/f1650af35821eaf09de398ec0bc2aefc8f211f0cda50204c9f1673741ba9/kiwisolver-1.5.0-cp313-cp313-manylinux_2_39_riscv64.whl", hash = "sha256:d36ca54cb4c6c4686f7cbb7b817f66f5911c12ddb519450bbe86707155028f87", size = 987292, upload-time = "2026-03-09T13:13:59.871Z" },
+ { url = "https://files.pythonhosted.org/packages/de/19/d7fb82984b9238115fe629c915007be608ebd23dc8629703d917dbfaffd4/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:38f4a703656f493b0ad185211ccfca7f0386120f022066b018eb5296d8613e23", size = 2227865, upload-time = "2026-03-09T13:14:01.401Z" },
+ { url = "https://files.pythonhosted.org/packages/7f/b9/46b7f386589fd222dac9e9de9c956ce5bcefe2ee73b4e79891381dda8654/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3ac2360e93cb41be81121755c6462cff3beaa9967188c866e5fce5cf13170859", size = 2324369, upload-time = "2026-03-09T13:14:02.972Z" },
+ { url = "https://files.pythonhosted.org/packages/92/8b/95e237cf3d9c642960153c769ddcbe278f182c8affb20cecc1cc983e7cc5/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c95cab08d1965db3d84a121f1c7ce7479bdd4072c9b3dafd8fecce48a2e6b902", size = 1977989, upload-time = "2026-03-09T13:14:04.503Z" },
+ { url = "https://files.pythonhosted.org/packages/1b/95/980c9df53501892784997820136c01f62bc1865e31b82b9560f980c0e649/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fc20894c3d21194d8041a28b65622d5b86db786da6e3cfe73f0c762951a61167", size = 2491645, upload-time = "2026-03-09T13:14:06.106Z" },
+ { url = "https://files.pythonhosted.org/packages/cb/32/900647fd0840abebe1561792c6b31e6a7c0e278fc3973d30572a965ca14c/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7a32f72973f0f950c1920475d5c5ea3d971b81b6f0ec53b8d0a956cc965f22e0", size = 2295237, upload-time = "2026-03-09T13:14:08.891Z" },
+ { url = "https://files.pythonhosted.org/packages/be/8a/be60e3bbcf513cc5a50f4a3e88e1dcecebb79c1ad607a7222877becaa101/kiwisolver-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bf3acf1419fa93064a4c2189ac0b58e3be7872bf6ee6177b0d4c63dc4cea276", size = 73573, upload-time = "2026-03-09T13:14:12.327Z" },
+ { url = "https://files.pythonhosted.org/packages/4d/d2/64be2e429eb4fca7f7e1c52a91b12663aeaf25de3895e5cca0f47ef2a8d0/kiwisolver-1.5.0-cp313-cp313-win_arm64.whl", hash = "sha256:fa8eb9ecdb7efb0b226acec134e0d709e87a909fa4971a54c0c4f6e88635484c", size = 64998, upload-time = "2026-03-09T13:14:13.469Z" },
+ { url = "https://files.pythonhosted.org/packages/b0/69/ce68dd0c85755ae2de490bf015b62f2cea5f6b14ff00a463f9d0774449ff/kiwisolver-1.5.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:db485b3847d182b908b483b2ed133c66d88d49cacf98fd278fadafe11b4478d1", size = 125700, upload-time = "2026-03-09T13:14:14.636Z" },
+ { url = "https://files.pythonhosted.org/packages/74/aa/937aac021cf9d4349990d47eb319309a51355ed1dbdc9c077cdc9224cb11/kiwisolver-1.5.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:be12f931839a3bdfe28b584db0e640a65a8bcbc24560ae3fdb025a449b3d754e", size = 67537, upload-time = "2026-03-09T13:14:15.808Z" },
+ { url = "https://files.pythonhosted.org/packages/ee/20/3a87fbece2c40ad0f6f0aefa93542559159c5f99831d596050e8afae7a9f/kiwisolver-1.5.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:16b85d37c2cbb3253226d26e64663f755d88a03439a9c47df6246b35defbdfb7", size = 65514, upload-time = "2026-03-09T13:14:18.035Z" },
+ { url = "https://files.pythonhosted.org/packages/f0/7f/f943879cda9007c45e1f7dba216d705c3a18d6b35830e488b6c6a4e7cdf0/kiwisolver-1.5.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4432b835675f0ea7414aab3d37d119f7226d24869b7a829caeab49ebda407b0c", size = 1584848, upload-time = "2026-03-09T13:14:19.745Z" },
+ { url = "https://files.pythonhosted.org/packages/37/f8/4d4f85cc1870c127c88d950913370dd76138482161cd07eabbc450deff01/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b0feb50971481a2cc44d94e88bdb02cdd497618252ae226b8eb1201b957e368", size = 1391542, upload-time = "2026-03-09T13:14:21.54Z" },
+ { url = "https://files.pythonhosted.org/packages/04/0b/65dd2916c84d252b244bd405303220f729e7c17c9d7d33dca6feeff9ffc4/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:56fa888f10d0f367155e76ce849fa1166fc9730d13bd2d65a2aa13b6f5424489", size = 1404447, upload-time = "2026-03-09T13:14:23.205Z" },
+ { url = "https://files.pythonhosted.org/packages/39/5c/2606a373247babce9b1d056c03a04b65f3cf5290a8eac5d7bdead0a17e21/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:940dda65d5e764406b9fb92761cbf462e4e63f712ab60ed98f70552e496f3bf1", size = 1455918, upload-time = "2026-03-09T13:14:24.74Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/d1/c6078b5756670658e9192a2ef11e939c92918833d2745f85cd14a6004bdf/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_39_riscv64.whl", hash = "sha256:89fc958c702ee9a745e4700378f5d23fddbc46ff89e8fdbf5395c24d5c1452a3", size = 1072856, upload-time = "2026-03-09T13:14:26.597Z" },
+ { url = "https://files.pythonhosted.org/packages/cb/c8/7def6ddf16eb2b3741d8b172bdaa9af882b03c78e9b0772975408801fa63/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9027d773c4ff81487181a925945743413f6069634d0b122d0b37684ccf4f1e18", size = 2333580, upload-time = "2026-03-09T13:14:28.237Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/87/2ac1fce0eb1e616fcd3c35caa23e665e9b1948bb984f4764790924594128/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:5b233ea3e165e43e35dba1d2b8ecc21cf070b45b65ae17dd2747d2713d942021", size = 2423018, upload-time = "2026-03-09T13:14:30.018Z" },
+ { url = "https://files.pythonhosted.org/packages/67/13/c6700ccc6cc218716bfcda4935e4b2997039869b4ad8a94f364c5a3b8e63/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:ce9bf03dad3b46408c08649c6fbd6ca28a9fce0eb32fdfffa6775a13103b5310", size = 2062804, upload-time = "2026-03-09T13:14:32.888Z" },
+ { url = "https://files.pythonhosted.org/packages/1b/bd/877056304626943ff0f1f44c08f584300c199b887cb3176cd7e34f1515f1/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:fc4d3f1fb9ca0ae9f97b095963bc6326f1dbfd3779d6679a1e016b9baaa153d3", size = 2597482, upload-time = "2026-03-09T13:14:34.971Z" },
+ { url = "https://files.pythonhosted.org/packages/75/19/c60626c47bf0f8ac5dcf72c6c98e266d714f2fbbfd50cf6dab5ede3aaa50/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f443b4825c50a51ee68585522ab4a1d1257fac65896f282b4c6763337ac9f5d2", size = 2394328, upload-time = "2026-03-09T13:14:36.816Z" },
+ { url = "https://files.pythonhosted.org/packages/47/84/6a6d5e5bb8273756c27b7d810d47f7ef2f1f9b9fd23c9ee9a3f8c75c9cef/kiwisolver-1.5.0-cp313-cp313t-win_arm64.whl", hash = "sha256:893ff3a711d1b515ba9da14ee090519bad4610ed1962fbe298a434e8c5f8db53", size = 68410, upload-time = "2026-03-09T13:14:38.695Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/d7/060f45052f2a01ad5762c8fdecd6d7a752b43400dc29ff75cd47225a40fd/kiwisolver-1.5.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8df31fe574b8b3993cc61764f40941111b25c2d9fea13d3ce24a49907cd2d615", size = 123231, upload-time = "2026-03-09T13:14:41.323Z" },
+ { url = "https://files.pythonhosted.org/packages/c2/a7/78da680eadd06ff35edef6ef68a1ad273bad3e2a0936c9a885103230aece/kiwisolver-1.5.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:1d49a49ac4cbfb7c1375301cd1ec90169dfeae55ff84710d782260ce77a75a02", size = 66489, upload-time = "2026-03-09T13:14:42.534Z" },
+ { url = "https://files.pythonhosted.org/packages/49/b2/97980f3ad4fae37dd7fe31626e2bf75fbf8bdf5d303950ec1fab39a12da8/kiwisolver-1.5.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0cbe94b69b819209a62cb27bdfa5dc2a8977d8de2f89dfd97ba4f53ed3af754e", size = 64063, upload-time = "2026-03-09T13:14:44.759Z" },
+ { url = "https://files.pythonhosted.org/packages/e7/f9/b06c934a6aa8bc91f566bd2a214fd04c30506c2d9e2b6b171953216a65b6/kiwisolver-1.5.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:80aa065ffd378ff784822a6d7c3212f2d5f5e9c3589614b5c228b311fd3063ac", size = 1475913, upload-time = "2026-03-09T13:14:46.247Z" },
+ { url = "https://files.pythonhosted.org/packages/6b/f0/f768ae564a710135630672981231320bc403cf9152b5596ec5289de0f106/kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e7f886f47ab881692f278ae901039a234e4025a68e6dfab514263a0b1c4ae05", size = 1282782, upload-time = "2026-03-09T13:14:48.458Z" },
+ { url = "https://files.pythonhosted.org/packages/e2/9f/1de7aad00697325f05238a5f2eafbd487fb637cc27a558b5367a5f37fb7f/kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5060731cc3ed12ca3a8b57acd4aeca5bbc2f49216dd0bec1650a1acd89486bcd", size = 1300815, upload-time = "2026-03-09T13:14:50.721Z" },
+ { url = "https://files.pythonhosted.org/packages/5a/c2/297f25141d2e468e0ce7f7a7b92e0cf8918143a0cbd3422c1ad627e85a06/kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7a4aa69609f40fce3cbc3f87b2061f042eee32f94b8f11db707b66a26461591a", size = 1347925, upload-time = "2026-03-09T13:14:52.304Z" },
+ { url = "https://files.pythonhosted.org/packages/b9/d3/f4c73a02eb41520c47610207b21afa8cdd18fdbf64ffd94674ae21c4812d/kiwisolver-1.5.0-cp314-cp314-manylinux_2_39_riscv64.whl", hash = "sha256:d168fda2dbff7b9b5f38e693182d792a938c31db4dac3a80a4888de603c99554", size = 991322, upload-time = "2026-03-09T13:14:54.637Z" },
+ { url = "https://files.pythonhosted.org/packages/7b/46/d3f2efef7732fcda98d22bf4ad5d3d71d545167a852ca710a494f4c15343/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:413b820229730d358efd838ecbab79902fe97094565fdc80ddb6b0a18c18a581", size = 2232857, upload-time = "2026-03-09T13:14:56.471Z" },
+ { url = "https://files.pythonhosted.org/packages/3f/ec/2d9756bf2b6d26ae4349b8d3662fb3993f16d80c1f971c179ce862b9dbae/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:5124d1ea754509b09e53738ec185584cc609aae4a3b510aaf4ed6aa047ef9303", size = 2329376, upload-time = "2026-03-09T13:14:58.072Z" },
+ { url = "https://files.pythonhosted.org/packages/8f/9f/876a0a0f2260f1bde92e002b3019a5fabc35e0939c7d945e0fa66185eb20/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e4415a8db000bf49a6dd1c478bf70062eaacff0f462b92b0ba68791a905861f9", size = 1982549, upload-time = "2026-03-09T13:14:59.668Z" },
+ { url = "https://files.pythonhosted.org/packages/6c/4f/ba3624dfac23a64d54ac4179832860cb537c1b0af06024936e82ca4154a0/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d618fd27420381a4f6044faa71f46d8bfd911bd077c555f7138ed88729bfbe79", size = 2494680, upload-time = "2026-03-09T13:15:01.364Z" },
+ { url = "https://files.pythonhosted.org/packages/39/b7/97716b190ab98911b20d10bf92eca469121ec483b8ce0edd314f51bc85af/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5092eb5b1172947f57d6ea7d89b2f29650414e4293c47707eb499ec07a0ac796", size = 2297905, upload-time = "2026-03-09T13:15:03.925Z" },
+ { url = "https://files.pythonhosted.org/packages/a3/36/4e551e8aa55c9188bca9abb5096805edbf7431072b76e2298e34fd3a3008/kiwisolver-1.5.0-cp314-cp314-win_amd64.whl", hash = "sha256:d76e2d8c75051d58177e762164d2e9ab92886534e3a12e795f103524f221dd8e", size = 75086, upload-time = "2026-03-09T13:15:07.775Z" },
+ { url = "https://files.pythonhosted.org/packages/70/15/9b90f7df0e31a003c71649cf66ef61c3c1b862f48c81007fa2383c8bd8d7/kiwisolver-1.5.0-cp314-cp314-win_arm64.whl", hash = "sha256:fa6248cd194edff41d7ea9425ced8ca3a6f838bfb295f6f1d6e6bb694a8518df", size = 66577, upload-time = "2026-03-09T13:15:09.139Z" },
+ { url = "https://files.pythonhosted.org/packages/17/01/7dc8c5443ff42b38e72731643ed7cf1ed9bf01691ae5cdca98501999ed83/kiwisolver-1.5.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:d1ffeb80b5676463d7a7d56acbe8e37a20ce725570e09549fe738e02ca6b7e1e", size = 125794, upload-time = "2026-03-09T13:15:10.525Z" },
+ { url = "https://files.pythonhosted.org/packages/46/8a/b4ebe46ebaac6a303417fab10c2e165c557ddaff558f9699d302b256bc53/kiwisolver-1.5.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:bc4d8e252f532ab46a1de9349e2d27b91fce46736a9eedaa37beaca66f574ed4", size = 67646, upload-time = "2026-03-09T13:15:12.016Z" },
+ { url = "https://files.pythonhosted.org/packages/60/35/10a844afc5f19d6f567359bf4789e26661755a2f36200d5d1ed8ad0126e5/kiwisolver-1.5.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6783e069732715ad0c3ce96dbf21dbc2235ab0593f2baf6338101f70371f4028", size = 65511, upload-time = "2026-03-09T13:15:13.311Z" },
+ { url = "https://files.pythonhosted.org/packages/f8/8a/685b297052dd041dcebce8e8787b58923b6e78acc6115a0dc9189011c44b/kiwisolver-1.5.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e7c4c09a490dc4d4a7f8cbee56c606a320f9dc28cf92a7157a39d1ce7676a657", size = 1584858, upload-time = "2026-03-09T13:15:15.103Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/80/04865e3d4638ac5bddec28908916df4a3075b8c6cc101786a96803188b96/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2a075bd7bd19c70cf67c8badfa36cf7c5d8de3c9ddb8420c51e10d9c50e94920", size = 1392539, upload-time = "2026-03-09T13:15:16.661Z" },
+ { url = "https://files.pythonhosted.org/packages/ba/01/77a19cacc0893fa13fafa46d1bba06fb4dc2360b3292baf4b56d8e067b24/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bdd3e53429ff02aa319ba59dfe4ceeec345bf46cf180ec2cf6fd5b942e7975e9", size = 1405310, upload-time = "2026-03-09T13:15:18.229Z" },
+ { url = "https://files.pythonhosted.org/packages/53/39/bcaf5d0cca50e604cfa9b4e3ae1d64b50ca1ae5b754122396084599ef903/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3cdcb35dc9d807259c981a85531048ede628eabcffb3239adf3d17463518992d", size = 1456244, upload-time = "2026-03-09T13:15:20.444Z" },
+ { url = "https://files.pythonhosted.org/packages/d0/7a/72c187abc6975f6978c3e39b7cf67aeb8b3c0a8f9790aa7fd412855e9e1f/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_39_riscv64.whl", hash = "sha256:70d593af6a6ca332d1df73d519fddb5148edb15cd90d5f0155e3746a6d4fcc65", size = 1073154, upload-time = "2026-03-09T13:15:22.039Z" },
+ { url = "https://files.pythonhosted.org/packages/c7/ca/cf5b25783ebbd59143b4371ed0c8428a278abe68d6d0104b01865b1bbd0f/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:377815a8616074cabbf3f53354e1d040c35815a134e01d7614b7692e4bf8acfa", size = 2334377, upload-time = "2026-03-09T13:15:23.741Z" },
+ { url = "https://files.pythonhosted.org/packages/4a/e5/b1f492adc516796e88751282276745340e2a72dcd0d36cf7173e0daf3210/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:0255a027391d52944eae1dbb5d4cc5903f57092f3674e8e544cdd2622826b3f0", size = 2425288, upload-time = "2026-03-09T13:15:25.789Z" },
+ { url = "https://files.pythonhosted.org/packages/e6/e5/9b21fbe91a61b8f409d74a26498706e97a48008bfcd1864373d32a6ba31c/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:012b1eb16e28718fa782b5e61dc6f2da1f0792ca73bd05d54de6cb9561665fc9", size = 2063158, upload-time = "2026-03-09T13:15:27.63Z" },
+ { url = "https://files.pythonhosted.org/packages/b1/02/83f47986138310f95ea95531f851b2a62227c11cbc3e690ae1374fe49f0f/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:0e3aafb33aed7479377e5e9a82e9d4bf87063741fc99fc7ae48b0f16e32bdd6f", size = 2597260, upload-time = "2026-03-09T13:15:29.421Z" },
+ { url = "https://files.pythonhosted.org/packages/07/18/43a5f24608d8c313dd189cf838c8e68d75b115567c6279de7796197cfb6a/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e7a116ae737f0000343218c4edf5bd45893bfeaff0993c0b215d7124c9f77646", size = 2394403, upload-time = "2026-03-09T13:15:31.517Z" },
+ { url = "https://files.pythonhosted.org/packages/3b/b5/98222136d839b8afabcaa943b09bd05888c2d36355b7e448550211d1fca4/kiwisolver-1.5.0-cp314-cp314t-win_amd64.whl", hash = "sha256:1dd9b0b119a350976a6d781e7278ec7aca0b201e1a9e2d23d9804afecb6ca681", size = 79687, upload-time = "2026-03-09T13:15:33.204Z" },
+ { url = "https://files.pythonhosted.org/packages/99/a2/ca7dc962848040befed12732dff6acae7fb3c4f6fc4272b3f6c9a30b8713/kiwisolver-1.5.0-cp314-cp314t-win_arm64.whl", hash = "sha256:58f812017cd2985c21fbffb4864d59174d4903dd66fa23815e74bbc7a0e2dd57", size = 70032, upload-time = "2026-03-09T13:15:34.411Z" },
+ { url = "https://files.pythonhosted.org/packages/1c/fa/2910df836372d8761bb6eff7d8bdcb1613b5c2e03f260efe7abe34d388a7/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-macosx_10_13_x86_64.whl", hash = "sha256:5ae8e62c147495b01a0f4765c878e9bfdf843412446a247e28df59936e99e797", size = 130262, upload-time = "2026-03-09T13:15:35.629Z" },
+ { url = "https://files.pythonhosted.org/packages/0f/41/c5f71f9f00aabcc71fee8b7475e3f64747282580c2fe748961ba29b18385/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:f6764a4ccab3078db14a632420930f6186058750df066b8ea2a7106df91d3203", size = 138036, upload-time = "2026-03-09T13:15:36.894Z" },
+ { url = "https://files.pythonhosted.org/packages/fa/06/7399a607f434119c6e1fdc8ec89a8d51ccccadf3341dee4ead6bd14caaf5/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c31c13da98624f957b0fb1b5bae5383b2333c2c3f6793d9825dd5ce79b525cb7", size = 194295, upload-time = "2026-03-09T13:15:38.22Z" },
+ { url = "https://files.pythonhosted.org/packages/b5/91/53255615acd2a1eaca307ede3c90eb550bae9c94581f8c00081b6b1c8f44/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-win_amd64.whl", hash = "sha256:1f1489f769582498610e015a8ef2d36f28f505ab3096d0e16b4858a9ec214f57", size = 75987, upload-time = "2026-03-09T13:15:39.65Z" },
+]
+
+[[package]]
+name = "lark"
+version = "1.3.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/da/34/28fff3ab31ccff1fd4f6c7c7b0ceb2b6968d8ea4950663eadcb5720591a0/lark-1.3.1.tar.gz", hash = "sha256:b426a7a6d6d53189d318f2b6236ab5d6429eaf09259f1ca33eb716eed10d2905", size = 382732, upload-time = "2025-10-27T18:25:56.653Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl", hash = "sha256:c629b661023a014c37da873b4ff58a817398d12635d3bbb2c5a03be7fe5d1e12", size = 113151, upload-time = "2025-10-27T18:25:54.882Z" },
+]
+
+[[package]]
+name = "lxml"
+version = "6.1.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/05/3b/aab6728cae887456f409b4d75e8a01856e4f04bd510de38052a47768b680/lxml-6.1.1.tar.gz", hash = "sha256:ba96ae44888e0185281e937633a743ea90d5a196c6000f82565ebb0580012d40", size = 4197430, upload-time = "2026-05-18T19:19:06.424Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/6a/6e/c4add832b6fc1e887125b96f880d7b9b70aae5248718e046b1704bcac4b9/lxml-6.1.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:104c09bda8d2a562824c0e319d0768ce26a779b7601e0931d33b09b53c392ef7", size = 8570821, upload-time = "2026-05-18T19:17:42.068Z" },
+ { url = "https://files.pythonhosted.org/packages/22/00/ff3009c88e65de8011630acf8ab5a09cb2becd2aaf47fba2f3449f6224e9/lxml-6.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:25c6997a9a534e016695a0ba06b2f07945de682731ff01065b6d5a4474179da1", size = 4624252, upload-time = "2026-05-18T19:17:47.897Z" },
+ { url = "https://files.pythonhosted.org/packages/42/95/bb63f0fd62e554fe078e1fb3c8fe9083c14ddc7ad7fa178d10e57e071ac7/lxml-6.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c921ba5c51e4e9f63b8b00267d06566e1f63407408a0496da2d1d0bfc819c7fc", size = 4930746, upload-time = "2026-05-18T19:18:29.637Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/99/0013e8d9b5960f4f041cf0b73e2f80c23eb5205b1f7bfb20203243651359/lxml-6.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:54a7f95e4de5fb94e2f9f4b9055c6ba33bf3d628fd77a1d647c5923caa2cdcdc", size = 5093723, upload-time = "2026-05-18T19:18:34.168Z" },
+ { url = "https://files.pythonhosted.org/packages/29/91/317b332636bfc7bddcff828d41b3307f50043f4b237e40849c333d80fa1a/lxml-6.1.1-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96f2ec43df44b1f76249ee0a615334f9b5b060e1c8bd90e706dad2d14d02f383", size = 5005557, upload-time = "2026-05-18T19:18:39.798Z" },
+ { url = "https://files.pythonhosted.org/packages/42/2f/cc9bf06afe70f9c9093ae60855d9759da9db601ec4080f7473319666ffd7/lxml-6.1.1-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:70ef8a7e102a1508f8121aae5b0867abd663f72c14f0a9c937e6554cb4587b7b", size = 5631036, upload-time = "2026-05-18T19:18:44.858Z" },
+ { url = "https://files.pythonhosted.org/packages/08/f6/af32e23e563971ffb0fb86be52bc5be5c2c118858ffc119bf6a9039b173d/lxml-6.1.1-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ebe6af670449830d6d9b752c256a983291c766a1365ba5d5460048f9e33a7818", size = 5240367, upload-time = "2026-05-18T19:18:49.217Z" },
+ { url = "https://files.pythonhosted.org/packages/78/83/8555d40948b09ce86f1bd0c68a7ac31d07b1929f92cc1b074006c97ef2d2/lxml-6.1.1-cp312-cp312-manylinux_2_28_i686.whl", hash = "sha256:27acc820660aaffa4f7c087f29120e12980f7779d56d8492d263170111284740", size = 5350171, upload-time = "2026-05-18T19:18:52.779Z" },
+ { url = "https://files.pythonhosted.org/packages/63/75/5d92da93729b7bad783689e6496049fa40927b45bec7bf183c981de3ca70/lxml-6.1.1-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:1db753c9115ec7100d073b744d17e25e88a8f90f5c39b2f5dd878149af59671f", size = 4694874, upload-time = "2026-05-18T19:18:55.139Z" },
+ { url = "https://files.pythonhosted.org/packages/c5/b5/3aad415a9a25b822e783f15deeb4dffccf5113030f1afa2222dd929313d9/lxml-6.1.1-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c4f469aebd783bb741c2ecb2a681008fd26bfe5c16a9a72ed5467f834e810df2", size = 5244492, upload-time = "2026-05-18T19:19:01.28Z" },
+ { url = "https://files.pythonhosted.org/packages/f1/a1/5fcf7eb9904b80086aa47dcf0027de07b1bb990afad2e6823144c368ae04/lxml-6.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:766b010012d59470072c1816b5b6c69f1d243e5db36ea5968e94accf430a4635", size = 5048232, upload-time = "2026-05-18T19:18:12.67Z" },
+ { url = "https://files.pythonhosted.org/packages/77/74/1f601b63c7a69fcdf10fa9b148c81da8442204194f6c55509cc485c786b9/lxml-6.1.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:b8d812c6011c08b8111a15e54dd990b8923692d80adf35488bee34026c35accf", size = 4777023, upload-time = "2026-05-18T19:18:15.928Z" },
+ { url = "https://files.pythonhosted.org/packages/a2/b9/7a78f51aec95b1bf780d78e12705a9f6533284f8693dc5c0e6724fa53d3f/lxml-6.1.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:fe0306bd29505a9177aac19f1877174b0e7422c222a59f70b2cd41633448c3dc", size = 5645773, upload-time = "2026-05-18T19:18:23.223Z" },
+ { url = "https://files.pythonhosted.org/packages/a5/6e/98a7b7ad54e4e74fa1f20fff776913980619d0ebe5558232d7da6580bdd8/lxml-6.1.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:5ba186ad207446c65d3bb3d3e0412b032b1d9f595e59861e2354798c5703d955", size = 5233088, upload-time = "2026-05-18T19:18:31.433Z" },
+ { url = "https://files.pythonhosted.org/packages/65/d1/bc0ed2427bf609f2ee10da303a6a226f9c8bce94f945dc29a32ce55de6e4/lxml-6.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aa366a1e55b8ebfe8ca8ddc3cfe75c8ebade181aeb0f661d0cb05986b647f72a", size = 5260995, upload-time = "2026-05-18T19:18:37.091Z" },
+ { url = "https://files.pythonhosted.org/packages/69/8b/6772e1a4b513fc50a8d931f19edde0e13ae6918510a1e13ff67864f3e5ed/lxml-6.1.1-cp312-cp312-win32.whl", hash = "sha256:126c93f7f56f0eda92f6d8c619edc463a4f23d9252f1c9d0405a76f25fa9f11a", size = 3596382, upload-time = "2026-05-18T19:17:18.37Z" },
+ { url = "https://files.pythonhosted.org/packages/1b/89/45198e9624762af2dfd2cb8782598477ceb29f6e59caab560388ae1f4ec1/lxml-6.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:26e6eda8d38c1fcab1090dd196ee87cbd13788e531937610e2589085de074e77", size = 3997255, upload-time = "2026-05-18T19:17:56.781Z" },
+ { url = "https://files.pythonhosted.org/packages/90/a9/7a54b6834088d9ae528a7b780584ba6a39a9457b0ac330479f20ffbc9449/lxml-6.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:6540377fbd53fe1b629172288c464fb18db11ce1fa7dc15891da10aa9dcc3e7f", size = 3659610, upload-time = "2026-05-19T19:22:50.843Z" },
+ { url = "https://files.pythonhosted.org/packages/a5/eb/7e6f37c5584ccbb2ff267f56fd0339016938c1c8684cfefab9b33ffc2f36/lxml-6.1.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:68a9198d0fc122d14bb76837de9aa80cf84caed990b5b237f532ed87d3706736", size = 8559780, upload-time = "2026-05-18T19:17:57.661Z" },
+ { url = "https://files.pythonhosted.org/packages/a1/36/587c2521cf23a2cd6c9c22108aa7528f683a1f195ed7ccd23a4b1786ad36/lxml-6.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7d47866cb32fb503450b6edc9df355d10dc49836af2e89901bd6ac6b0896d9d9", size = 4618006, upload-time = "2026-05-18T19:18:04.452Z" },
+ { url = "https://files.pythonhosted.org/packages/6e/ca/ab7bfe2bf4c972af5e7878262845ead3a24a929a9b04bc11c7c1ece6c82a/lxml-6.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb7c9811bfaa8b1ed5ed319f5d370dfbcaa59d52ea64be2a5a85e18195930354", size = 4924139, upload-time = "2026-05-18T19:19:04.873Z" },
+ { url = "https://files.pythonhosted.org/packages/6b/55/a0c72851dfee5ecc689f949723a73dea457758912542cb955b108eaf0d8f/lxml-6.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:762ff394d5bd56da0cf034a23dcce4e13923f15321a2adfa2ac00201dc6d3fca", size = 5082329, upload-time = "2026-05-18T19:19:09.728Z" },
+ { url = "https://files.pythonhosted.org/packages/f0/b6/0608f7d61a3b96cc67e5648a3d906e31a5082093e10e7be65b3886289938/lxml-6.1.1-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a088f287f7d8275a33c07f2cac6c50b9319309a0200a39e7e75d80c707723099", size = 4993564, upload-time = "2026-05-18T19:19:13.608Z" },
+ { url = "https://files.pythonhosted.org/packages/4c/66/ae227524b066d29d55bf0b453d93d2d793c40218657d643dcbbca13b8faf/lxml-6.1.1-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e902da4b04e6b52e5893900d4b8ab46068f75f3561f01bf1080957f9fd932ed6", size = 5613467, upload-time = "2026-05-18T19:19:16.228Z" },
+ { url = "https://files.pythonhosted.org/packages/a6/76/dbe4a00b50385e40194231dcfe5a12c059de7cf90e89c83407d2b085b719/lxml-6.1.1-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1d4962d4c66bf830a7e59ed6cfc17d148149898a3aefa8ec6e59763e6e3ed085", size = 5228304, upload-time = "2026-05-18T19:19:19.354Z" },
+ { url = "https://files.pythonhosted.org/packages/1c/01/00b1b8442ed2041793336868ba0b9ea4b13d7da7c085c6404c207a63bf79/lxml-6.1.1-cp313-cp313-manylinux_2_28_i686.whl", hash = "sha256:581d4c8ae690a6609e64862dd6b7c2489635c2d13907fc2b20f2bc200ff1d21e", size = 5341607, upload-time = "2026-05-18T19:19:22.297Z" },
+ { url = "https://files.pythonhosted.org/packages/63/36/1ad29931e9a4638bb707869f01d423a6c815f82152138d1a40dfcfde2b95/lxml-6.1.1-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:876e1ff5930ed8bf295ec5ef9a8155e9b6b1876bbf1deed8b3a8069311875a8f", size = 4700168, upload-time = "2026-05-18T19:19:25.133Z" },
+ { url = "https://files.pythonhosted.org/packages/3c/d1/a9536cecf9be18a0dc72d32bead283a2332d1ffebd2dd3ac70ce444686e5/lxml-6.1.1-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9eb9b5a968f6e0f6d640092a567e14529ff8cea2e29d00da6f78a79fa49f013c", size = 5232487, upload-time = "2026-05-18T19:19:28.603Z" },
+ { url = "https://files.pythonhosted.org/packages/0e/77/b4fb1e03bf5d130e879214d3100092e386418807fb74dd0adc4b0a48f351/lxml-6.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:aa49e06d94aba782c6a02eecb7e507969e7e7a41b267f1b359bb35585f295d5b", size = 5044231, upload-time = "2026-05-18T19:18:42.246Z" },
+ { url = "https://files.pythonhosted.org/packages/26/4c/d00daeeb0a5530c4028a9232aa1b93db3ef4ed2158c116ea73c79a9765b3/lxml-6.1.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:70cdfd80589d59e43e18005dd7244e8895e93db8ab6a620b7e23df5445a4e3d2", size = 4769450, upload-time = "2026-05-18T19:18:48.013Z" },
+ { url = "https://files.pythonhosted.org/packages/ed/6a/715a3a8d156ce42f29cf014706f5410c2ff3b02267774110fc23266409fe/lxml-6.1.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:aad9aa39483ed8ec44d6d2e59e5b98a0d80676ef0d92f44bfc374836111f62f5", size = 5635874, upload-time = "2026-05-18T19:18:51.914Z" },
+ { url = "https://files.pythonhosted.org/packages/45/37/0544bc21dde2a88f3a17b504e6fc79c0e01d25a33c2f6079724e9e72b9c7/lxml-6.1.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:d49514be2f28d895c38cf9d2b72d7b9a07d00314519f456c0b50b53cfcf4c785", size = 5223987, upload-time = "2026-05-18T19:18:59.715Z" },
+ { url = "https://files.pythonhosted.org/packages/4d/f8/f6a5e8185bcb28c2befae3d31f8e3df3b811cb0f47746517a81279fcafe1/lxml-6.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:47402e62c52ff5988c1e8c6c63177f5708bccf48e366dea4e3dcf1e645e04947", size = 5250276, upload-time = "2026-05-18T19:19:03.834Z" },
+ { url = "https://files.pythonhosted.org/packages/c7/f2/1a2b9f1b7a49d45495369be7ef9ad05b262930f2eab3e3145706fca8083f/lxml-6.1.1-cp313-cp313-win32.whl", hash = "sha256:3483644525531e1d5762b0c44a8e18b6efba321b6dcf8a8952de10b037618bca", size = 3596903, upload-time = "2026-05-18T19:17:29.863Z" },
+ { url = "https://files.pythonhosted.org/packages/e6/99/f4ffb024f238eec2131aaa09f3278fb6129cf892741bf68e1fc1afb8c100/lxml-6.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:a10bd2fd62e8ce916ececb342f348f190724a098c1faa056fdfb2a22ad5e8660", size = 3995869, upload-time = "2026-05-18T19:18:02.596Z" },
+ { url = "https://files.pythonhosted.org/packages/d1/53/70eb8c5c6037f27448f1e3c54ebede9545a801ae63f0a7254afca4fe8e45/lxml-6.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:424aa57aca0897eb922aef34395bd1289b3b6f04e6bae20ea123c0c7e333cffc", size = 3658490, upload-time = "2026-05-19T19:22:53.846Z" },
+ { url = "https://files.pythonhosted.org/packages/13/e2/2e325795566de01d0d7c3bb57d3c370616b2d07b01214e84eec5d3b10963/lxml-6.1.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:19b7ab10b210b0b3ad7985d9ac4eb66ab09a90b20fe6e2f7ba55d01a234345d0", size = 8577146, upload-time = "2026-05-18T19:18:17.765Z" },
+ { url = "https://files.pythonhosted.org/packages/93/cf/5630b5e4be7d2e6bee8efe83865c925221103cf0221303b104ce134b01e2/lxml-6.1.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c08e5c694306507275f2290073350c4f32e383db15213b2c69e7ff39c1193840", size = 4623866, upload-time = "2026-05-18T19:18:30.669Z" },
+ { url = "https://files.pythonhosted.org/packages/d2/51/3904907c063451cf8d4a5c9fe0cad95fa1f4ec57f4e3884fa0731bd7a305/lxml-6.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:74a9717fd0d82effef5c2854f0d917231d5324b5a3eb7275c43ac9fa32f97a14", size = 4950022, upload-time = "2026-05-18T19:19:31.958Z" },
+ { url = "https://files.pythonhosted.org/packages/94/cd/9c7611a51c37a2830928405817cc5d56a97f64fab83cc3f628748b135749/lxml-6.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:efe0374196335f93b53269acd811b944f2e6bdc88e8894f214bd636455484909", size = 5086695, upload-time = "2026-05-18T19:19:34.764Z" },
+ { url = "https://files.pythonhosted.org/packages/da/d6/24e3b5906abb0b674ff2ae195bc3ce59708df2bcd17cf17703b2d7dd643a/lxml-6.1.1-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ac931cdc9442c1763b8a8f6cd62c0c938737eafc5be75eff88df55fc73bc0d00", size = 5031642, upload-time = "2026-05-18T19:19:37.771Z" },
+ { url = "https://files.pythonhosted.org/packages/2d/db/6ec54f99019838bff54785c51da07f189eb4676861c5f2730962b0d8d665/lxml-6.1.1-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:aee395f5d0927f947758b4ec119fd5fc8ec71f07a1c5c52077b30b04c0fa6955", size = 5647338, upload-time = "2026-05-18T19:19:40.553Z" },
+ { url = "https://files.pythonhosted.org/packages/42/3d/ef4dcfffd22d27a61805d8ed9f7fb888495bc6aa88648fa07c1eaa5586b6/lxml-6.1.1-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9395002973c827b3ed67db77e6ec09f092919a587022174554096a269378fb13", size = 5239528, upload-time = "2026-05-18T19:19:43.657Z" },
+ { url = "https://files.pythonhosted.org/packages/62/bb/37fb3f0dff146bdcfa78eec47879273820b2a0bf350ec236ce14bd0b1c26/lxml-6.1.1-cp314-cp314-manylinux_2_28_i686.whl", hash = "sha256:73bc2086f141224ebddb7fc5c6a36ca58b31b94b561e1dfe8e073e3270fad1e7", size = 5350730, upload-time = "2026-05-18T19:19:46.307Z" },
+ { url = "https://files.pythonhosted.org/packages/90/42/43253f168388df4fae1f38c01df36ddb9bee39e2048167b54cdcbae85ea3/lxml-6.1.1-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:3779def59032b81e44a5f70096ef6bf2082f8d901937dca354474ba09782e245", size = 4697530, upload-time = "2026-05-18T19:19:49.889Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/a8/c5a8504f81bbdfc8e7094c2c850cdb4ed6777fc4d5ddd9e5ab819f3b0d54/lxml-6.1.1-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:86c89b9d55ebf820ad7c90bc533410f0d098054f293351f10603c0c46ff598f5", size = 5250670, upload-time = "2026-05-18T19:19:53.199Z" },
+ { url = "https://files.pythonhosted.org/packages/77/b7/c7e76ab18744d75e21f320ebf9ff9d1ceae2b54dd431ea5a64caf26c9672/lxml-6.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:19607c6bbff2a44cf3fe8250abccd20942d3462473e0a721d01d379ed017e462", size = 5084485, upload-time = "2026-05-18T19:19:08.422Z" },
+ { url = "https://files.pythonhosted.org/packages/31/31/b35c53f8ef7b7c31cacd23d3638652fff7bcd1deb6eedb709ab43b685908/lxml-6.1.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:c6ed5141a5c7507cf3ee76bd363b0d6f801e3321adc35b5d825a23115faa5465", size = 4737635, upload-time = "2026-05-18T19:19:12.321Z" },
+ { url = "https://files.pythonhosted.org/packages/d9/06/31f23c813a7fe8e0cb1b175e915b08c9bf4e86d225b210feadbdbe519667/lxml-6.1.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:62aeb7e85b5d60320b9d77eef2e773994e2c0ce10121b277e0a19804e1654a5a", size = 5670681, upload-time = "2026-05-18T19:19:15.001Z" },
+ { url = "https://files.pythonhosted.org/packages/1a/bc/ce619bccc89b1fd9ad8a8e1330ee3f3beff9f2ff95b712d7bbcdd6e22fc3/lxml-6.1.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:b1b963fd8f5caa68e99dfae060d54de1fe9cba899b8718b44a00cdca53c3e590", size = 5238229, upload-time = "2026-05-18T19:19:18.131Z" },
+ { url = "https://files.pythonhosted.org/packages/2f/5d/b329acbbedc0b619ebc2be6cf7ee9ed07e80892c88d4dfd612c33805789a/lxml-6.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:63876be28efefa04a1df615b46770e82042cce445cfdce55160522f57b231ccb", size = 5264191, upload-time = "2026-05-18T19:19:21.118Z" },
+ { url = "https://files.pythonhosted.org/packages/d6/85/be36fb1425b30db3c3f9df75fe86343ebffb79e6320bd7f588e25bfeac39/lxml-6.1.1-cp314-cp314-win32.whl", hash = "sha256:7f7a92e8583f06b1fd49d01158143b8461cfcd135dcb10ec807270a3051bd603", size = 3657202, upload-time = "2026-05-18T19:17:39.509Z" },
+ { url = "https://files.pythonhosted.org/packages/b8/ce/3cf9a827342269f54d405a6202397de63f07c69cbd6ce7d183a3f0cba1e9/lxml-6.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:b2d444f2e66624d68e9c6b211e28a76e22fff5fcabcfff4deac18b529b7d4137", size = 4064497, upload-time = "2026-05-18T19:18:14.662Z" },
+ { url = "https://files.pythonhosted.org/packages/d9/3e/1a957bde8f0760039e627f94699f82caa782c9d838d86c3d28245ee67212/lxml-6.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:3fd9728a2735fda14f4e8235830c86b539e9661e849665bf926d3f867943b4bf", size = 3741991, upload-time = "2026-05-19T19:22:59.111Z" },
+ { url = "https://files.pythonhosted.org/packages/78/b2/00ed55b3a2efa4658fb795c38d1090ec9b3e8a6c3683d4441fa517f09c3b/lxml-6.1.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:787b2496d0dbe8cd180984e8d29e3a6f76e7ea34db781cb3bd55e4ba1ef8b4ee", size = 8827545, upload-time = "2026-05-18T19:18:41.193Z" },
+ { url = "https://files.pythonhosted.org/packages/c0/73/74573db19baa618d5f266f2407898b087ff6927115b00b71e5fc1b700847/lxml-6.1.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:2c8daa471358dc2d6fcf02165e80ec68f77871a286df95bc5cc3816153b0fd2c", size = 4735736, upload-time = "2026-05-18T19:18:46.761Z" },
+ { url = "https://files.pythonhosted.org/packages/16/02/6f7061f4f95f51e545d48e87647c54791d204a4e881be4156e7a26ba5338/lxml-6.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:acd7d70b64c0aae0c7922cca83d288a16f5f6da523637697872253415269baef", size = 4970291, upload-time = "2026-05-18T19:19:56.215Z" },
+ { url = "https://files.pythonhosted.org/packages/b0/02/55fc057d8283427dea7d6edb102e7a840239c77a64a983d92f62a304c0e9/lxml-6.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4f0dd2f01f9f8a89f565d000e03abcf0a13d692a346c8d22f628d49af098777a", size = 5102822, upload-time = "2026-05-18T19:19:59.223Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/48/8e1cf78d89d66850121d9255a2a24414c98f775da93b90cf976956c24b14/lxml-6.1.1-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b7e8a14c8634bf6f7a568634cb395305a6d964aeb5b7ee32248094bed3a7e2c", size = 5027923, upload-time = "2026-05-18T19:20:01.549Z" },
+ { url = "https://files.pythonhosted.org/packages/ed/00/0632a0647612c8af24d26997b3b961397daa9d5b2581444805933629a4cb/lxml-6.1.1-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:86281fbdd6a8162756f8d603f37e3435bfa38043adb79c6dc6a2dfee065e7525", size = 5595843, upload-time = "2026-05-18T19:20:03.93Z" },
+ { url = "https://files.pythonhosted.org/packages/bc/86/ab008a7dc360711b66858d61c80a5979a70a09f2aa2b05d9698df80b803d/lxml-6.1.1-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c5d7152ec39ca7c402d8fb9bad86140a15b9503bd0c54484e3f1bbe3dd37ceca", size = 5224515, upload-time = "2026-05-18T19:20:06.381Z" },
+ { url = "https://files.pythonhosted.org/packages/75/c6/2702ff375e728e34f56d9a45339a9cf7e4427e917f542225242d63a05afa/lxml-6.1.1-cp314-cp314t-manylinux_2_28_i686.whl", hash = "sha256:88d8cb75b9d82858497a5393e3c63cfbf03035225e4b35a49ed7ccb151e4dc0e", size = 5312511, upload-time = "2026-05-18T19:20:09.308Z" },
+ { url = "https://files.pythonhosted.org/packages/b7/57/a5807c98f87a86f10ef9ffab35516df7c0f0c4b6d5d33e9f608ab9c04a31/lxml-6.1.1-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:f64ec5397ea6a41fc1b4af0380d79b44a755b5531dcaccd9940fb260dca93038", size = 4639206, upload-time = "2026-05-18T19:20:11.704Z" },
+ { url = "https://files.pythonhosted.org/packages/1f/e1/8a0a2c35734812395f4da4eaf33748a7e5705bfb2a58b128da764339d5ec/lxml-6.1.1-cp314-cp314t-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d34bbf07dbc7ca5970671b1512e928991fb5e9d95365636c9b2d8b4f53af405e", size = 5232404, upload-time = "2026-05-18T19:20:14.064Z" },
+ { url = "https://files.pythonhosted.org/packages/c2/e2/0e6a4dd5ad84d01d99aa7bae7cfefd4a760a0e0f8176818241de17d9b6c0/lxml-6.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:17e0e18d4ad8adbd0399291bc44845b69d9dd68439a3cdebdf35ff902ec05072", size = 5083769, upload-time = "2026-05-18T19:19:23.758Z" },
+ { url = "https://files.pythonhosted.org/packages/a0/7e/161f33d463f6ffc1c7679104b65086dea120080d49dde4d238f015aaee2f/lxml-6.1.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:3ab541146f1f6968c462d6c2ac495148e8cdba2f8347700b2141b6ec5a75bf52", size = 4758936, upload-time = "2026-05-18T19:19:27.256Z" },
+ { url = "https://files.pythonhosted.org/packages/f1/fb/2369825e3f6ca99305bf9f7b7085fda91c8b0922a89e54d900974aa3ef85/lxml-6.1.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:2a0217714657e023ef4293500f65aa20fce6164c8fd6b08fa5bd4a859fb14b9b", size = 5620296, upload-time = "2026-05-18T19:19:29.993Z" },
+ { url = "https://files.pythonhosted.org/packages/30/90/d61e383146f74c5ab683947ea14dc7b82778838ab9b95ea73a23b60d0191/lxml-6.1.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:05a82eb6e1530a64f26225b55cbd178113bd0b5af1c2b625f25e5296742c26d2", size = 5228598, upload-time = "2026-05-18T19:19:33.523Z" },
+ { url = "https://files.pythonhosted.org/packages/76/2d/2dafd8149e94b05bb070690efd5bb2680720681e03ff03fc57d2b70a1105/lxml-6.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9e36f163528fc50cbef305f02a5fd66d404edf7049cdaff211dbc2cba5a7013e", size = 5247845, upload-time = "2026-05-18T19:19:36.649Z" },
+ { url = "https://files.pythonhosted.org/packages/ce/68/b30e913340c380ddac9580c6e6230991fc37240ec4f64704833e4f3e2769/lxml-6.1.1-cp314-cp314t-win32.whl", hash = "sha256:649dda677cf3bd6ac9ae14007ba0c824ded8ce5808b53fc7431d9140399118c1", size = 3897345, upload-time = "2026-05-18T19:17:33.562Z" },
+ { url = "https://files.pythonhosted.org/packages/3c/4e/9eb2af5335545f9fbcd7af57bcf87c6025d31eaa31b14ec184a6c8675328/lxml-6.1.1-cp314-cp314t-win_amd64.whl", hash = "sha256:793033d6c5cdf33a573f910d9bea14ef8f5771820411d118da8e1182edb53d5e", size = 4393350, upload-time = "2026-05-18T19:18:10.076Z" },
+ { url = "https://files.pythonhosted.org/packages/7f/2c/0f1e93c636720e8a3eb59af2bfda99d98b55891e1c53bc30c2e0e865f01b/lxml-6.1.1-cp314-cp314t-win_arm64.whl", hash = "sha256:58bb955caba94e467d2a96da17660d2d704e0675894cba21ab8a775b8621fd1c", size = 3817223, upload-time = "2026-05-19T19:22:56.823Z" },
+]
+
+[package.optional-dependencies]
+html-clean = [
+ { name = "lxml-html-clean" },
+]
+
+[[package]]
+name = "lxml-html-clean"
+version = "0.4.5"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "lxml" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/0a/63/195dfdde380a84df309e3bccf4384b034b745dba43426886f7ae623b4fba/lxml_html_clean-0.4.5.tar.gz", hash = "sha256:e2a4c7d5beedd17cd7b484d848a0571e54baa239a4f9df5546e3acba7f990560", size = 24142, upload-time = "2026-05-20T12:17:53.574Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/6a/bd/6e2b76a6c5dee10397db9c929f0c5066766ec1036046f0335b7ca7ca08b8/lxml_html_clean-0.4.5-py3-none-any.whl", hash = "sha256:c76fcadd1e5bfb9b8bafc2200d51e4e78eb0dad67f56881c21dfb6484c7e7746", size = 14573, upload-time = "2026-05-20T12:17:52.215Z" },
+]
+
+[[package]]
+name = "markdown-it-py"
+version = "4.2.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "mdurl" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" },
+]
+
+[[package]]
+name = "markupsafe"
+version = "3.0.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" },
+ { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" },
+ { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" },
+ { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" },
+ { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" },
+ { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" },
+ { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" },
+ { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" },
+ { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" },
+ { url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622, upload-time = "2025-09-27T18:36:41.777Z" },
+ { url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029, upload-time = "2025-09-27T18:36:43.257Z" },
+ { url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374, upload-time = "2025-09-27T18:36:44.508Z" },
+ { url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980, upload-time = "2025-09-27T18:36:45.385Z" },
+ { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990, upload-time = "2025-09-27T18:36:46.916Z" },
+ { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784, upload-time = "2025-09-27T18:36:47.884Z" },
+ { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588, upload-time = "2025-09-27T18:36:48.82Z" },
+ { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041, upload-time = "2025-09-27T18:36:49.797Z" },
+ { url = "https://files.pythonhosted.org/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543, upload-time = "2025-09-27T18:36:51.584Z" },
+ { url = "https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113, upload-time = "2025-09-27T18:36:52.537Z" },
+ { url = "https://files.pythonhosted.org/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911, upload-time = "2025-09-27T18:36:53.513Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658, upload-time = "2025-09-27T18:36:54.819Z" },
+ { url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066, upload-time = "2025-09-27T18:36:55.714Z" },
+ { url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639, upload-time = "2025-09-27T18:36:56.908Z" },
+ { url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569, upload-time = "2025-09-27T18:36:57.913Z" },
+ { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284, upload-time = "2025-09-27T18:36:58.833Z" },
+ { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801, upload-time = "2025-09-27T18:36:59.739Z" },
+ { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769, upload-time = "2025-09-27T18:37:00.719Z" },
+ { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642, upload-time = "2025-09-27T18:37:01.673Z" },
+ { url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612, upload-time = "2025-09-27T18:37:02.639Z" },
+ { url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200, upload-time = "2025-09-27T18:37:03.582Z" },
+ { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973, upload-time = "2025-09-27T18:37:04.929Z" },
+ { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z" },
+ { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z" },
+ { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" },
+ { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" },
+ { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" },
+ { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" },
+ { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" },
+ { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z" },
+ { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z" },
+ { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z" },
+ { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z" },
+ { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z" },
+ { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" },
+ { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" },
+ { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" },
+ { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" },
+ { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" },
+ { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" },
+ { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" },
+ { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" },
+ { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" },
+]
+
+[[package]]
+name = "matplotlib"
+version = "3.10.9"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "contourpy" },
+ { name = "cycler" },
+ { name = "fonttools" },
+ { name = "kiwisolver" },
+ { name = "numpy" },
+ { name = "packaging" },
+ { name = "pillow" },
+ { name = "pyparsing" },
+ { name = "python-dateutil" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/63/1b/4be5be87d43d327a0cf4de1a56e86f7f84c89312452406cf122efe2839e6/matplotlib-3.10.9.tar.gz", hash = "sha256:fd66508e8c6877d98e586654b608a0456db8d7e8a546eb1e2600efd957302358", size = 34811233, upload-time = "2026-04-24T00:14:13.539Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/35/c6/5581e26c72233ebb2a2a6fed2d24fb7c66b4700120b813f51b0555acf0b6/matplotlib-3.10.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f0c3c28d9fbcc1fe7a03be236d73430cf6409c41fb2383a7ac52fe932b072cb1", size = 8319908, upload-time = "2026-04-24T00:12:21.323Z" },
+ { url = "https://files.pythonhosted.org/packages/b7/18/4880dd762e40cd360c1bf06e890c5a97b997e91cb324602b1a19950ad5ce/matplotlib-3.10.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:41cb28c2bd769aa3e98322c6ab09854cbcc52ab69d2759d681bba3e327b2b320", size = 8216016, upload-time = "2026-04-24T00:12:23.4Z" },
+ { url = "https://files.pythonhosted.org/packages/32/91/d024616abdba99e83120e07a20658976f6a343646710760c4a51df126029/matplotlib-3.10.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ae20801130378b82d647ff5047c07316295b68dc054ca6b3c13519d0ea624285", size = 8789336, upload-time = "2026-04-24T00:12:26.096Z" },
+ { url = "https://files.pythonhosted.org/packages/5c/04/030a2f61ef2158f5e4c259487a92ac877732499fb33d871585d89e03c42d/matplotlib-3.10.9-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6c63ebcd8b4b169eb2f5c200552ae6b8be8999a005b6b507ed76fb8d7d674fe2", size = 9604602, upload-time = "2026-04-24T00:12:29.052Z" },
+ { url = "https://files.pythonhosted.org/packages/fc/c2/541e4d09d87bb6b5830fc28b4c887a9a8cf4e1c6cee698a8c05552ae2003/matplotlib-3.10.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d75d11c949914165976c621b2324f9ef162af7ebf4b057ddf95dd1dba7e5edcf", size = 9670966, upload-time = "2026-04-24T00:12:32.131Z" },
+ { url = "https://files.pythonhosted.org/packages/04/a1/4571fc46e7702de8d0c2dc54ad1b2f8e29328dea3ee90831181f7353d93c/matplotlib-3.10.9-cp312-cp312-win_amd64.whl", hash = "sha256:d091f9d758b34aaaaa6331d13574bf01891d903b3dec59bfff458ef7551de5d6", size = 8217462, upload-time = "2026-04-24T00:12:35.226Z" },
+ { url = "https://files.pythonhosted.org/packages/4b/d0/2269edb12aa30c13c8bcc9382892e39943ce1d28aab4ec296e0381798e81/matplotlib-3.10.9-cp312-cp312-win_arm64.whl", hash = "sha256:10cc5ce06d10231c36f40e875f3c7e8050362a4ee8f0ee5d29a6b3277d57bb42", size = 8136688, upload-time = "2026-04-24T00:12:37.442Z" },
+ { url = "https://files.pythonhosted.org/packages/aa/d3/8d4f6afbecb49fc04e060a57c0fce39ea51cc163a6bd87303ccd698e4fa6/matplotlib-3.10.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b580440f1ff81a0e34122051a3dfabb7e4b7f9e380629929bde0eff9af72165f", size = 8320331, upload-time = "2026-04-24T00:12:39.688Z" },
+ { url = "https://files.pythonhosted.org/packages/63/d9/9e14bc7564bf92d5ffa801ae5fac819ce74b925dfb55e3ebde61a3bbad3e/matplotlib-3.10.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b1b745c489cd1a77a0dc1120a05dc87af9798faebc913601feb8c73d89bf2d1e", size = 8216461, upload-time = "2026-04-24T00:12:42.494Z" },
+ { url = "https://files.pythonhosted.org/packages/8a/17/4402d0d14ccf1dfc70932600b68097fbbf9c898a4871d2cbbe79c7801a32/matplotlib-3.10.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8f3bcac1ca5ed000a6f4337d47ba67dfddf37ed6a46c15fd7f014997f7bf865f", size = 8790091, upload-time = "2026-04-24T00:12:44.789Z" },
+ { url = "https://files.pythonhosted.org/packages/3e/0b/322aeec06dd9b91411f92028b37d447342770a24392aa4813e317064dad5/matplotlib-3.10.9-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a8d66a55def891c33147ba3ba9bfcabf0b526a43764c818acbb4525e5ed0838", size = 9605027, upload-time = "2026-04-24T00:12:47.583Z" },
+ { url = "https://files.pythonhosted.org/packages/74/88/5f13482f55e7b00bcfc09838b093c2456e1379978d2a146844aae05350ad/matplotlib-3.10.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d843374407c4017a6403b59c6c81606773d136f3259d5b6da3131bc814542cc2", size = 9671269, upload-time = "2026-04-24T00:12:50.878Z" },
+ { url = "https://files.pythonhosted.org/packages/c5/e0/0840fd2f93da988ec660b8ad1984abe9f25d2aed22a5e394ff1c68c88307/matplotlib-3.10.9-cp313-cp313-win_amd64.whl", hash = "sha256:f4399f64b3e94cd500195490972ae1ee81170df1636fa15364d157d5bdd7b921", size = 8217588, upload-time = "2026-04-24T00:12:53.784Z" },
+ { url = "https://files.pythonhosted.org/packages/47/b9/d706d06dd605c49b9f83a2aed8c13e3e5db70697d7a80b7e3d7915de6b17/matplotlib-3.10.9-cp313-cp313-win_arm64.whl", hash = "sha256:ba7b3b8ef09eab7df0e86e9ae086faa433efbfbdb46afcb3aa16aabf779469a8", size = 8136913, upload-time = "2026-04-24T00:12:56.501Z" },
+ { url = "https://files.pythonhosted.org/packages/9b/45/6e32d96978264c8ca8c4b1010adb955a1a49cfaf314e212bbc8908f04a61/matplotlib-3.10.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:09218df8a93712bd6ea133e83a153c755448cf7868316c531cffcc43f69d1cc9", size = 8368019, upload-time = "2026-04-24T00:12:58.896Z" },
+ { url = "https://files.pythonhosted.org/packages/86/0a/c8e3d3bba245f0f7fc424937f8ff7ef77291a36af3edb97ccd78aa93d84f/matplotlib-3.10.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:82368699727bfb7b0182e1aa13082e3c08e092fa1a25d3e1fd92405bff96f6d4", size = 8264645, upload-time = "2026-04-24T00:13:01.406Z" },
+ { url = "https://files.pythonhosted.org/packages/3d/aa/5bf5a14fe4fed73a4209a155606f8096ff797aad89c6c35179026571133e/matplotlib-3.10.9-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3225f4e1edcb8c86c884ddf79ebe20ecd0a67d30188f279897554ccd8fded4dc", size = 8802194, upload-time = "2026-04-24T00:13:03.702Z" },
+ { url = "https://files.pythonhosted.org/packages/dd/5e/b4be852d6bba6fd15893fadf91ff26ae49cb91aac789e95dde9d342e664f/matplotlib-3.10.9-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:de2445a0c6690d21b7eb6ce071cebad6d40a2e9bdf10d039074a96ba19797b99", size = 9622684, upload-time = "2026-04-24T00:13:06.647Z" },
+ { url = "https://files.pythonhosted.org/packages/4c/3d/ed428c971139112ef730f62770654d609467346d09d4b62617e1afd68a5a/matplotlib-3.10.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:b2b9516251cb89ff618d757daec0e2ed1bf21248013844a853d87ef85ab3081d", size = 9680790, upload-time = "2026-04-24T00:13:10.009Z" },
+ { url = "https://files.pythonhosted.org/packages/e7/09/052e884aaf2b985c63cb79f715f1d5b6a3eaa7de78f6a52b9dbc077d5b53/matplotlib-3.10.9-cp313-cp313t-win_amd64.whl", hash = "sha256:e9fae004b941b23ff2edcf1567a857ed77bafc8086ffa258190462328434faf8", size = 8287571, upload-time = "2026-04-24T00:13:13.087Z" },
+ { url = "https://files.pythonhosted.org/packages/f4/38/ae27288e788c35a4250491422f3db7750366fc8c97d6f36fbdecfc1f5518/matplotlib-3.10.9-cp313-cp313t-win_arm64.whl", hash = "sha256:6b63d9c7c769b88ab81e10dc86e4e0607cf56817b9f9e6cf24b2a5f1693b8e38", size = 8188292, upload-time = "2026-04-24T00:13:15.546Z" },
+ { url = "https://files.pythonhosted.org/packages/d6/e6/3bd8afd04949f02eabc1c17115ea5255e19cacd4d06fc5abdde4eeb0052c/matplotlib-3.10.9-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:172db52c9e683f5d12eaf57f0f54834190e12581fe1cc2a19595a8f5acb4e77d", size = 8321276, upload-time = "2026-04-24T00:13:18.318Z" },
+ { url = "https://files.pythonhosted.org/packages/41/86/86231232fff41c9f8e4a1a7d7a597d349a02527109c3af7d618366122139/matplotlib-3.10.9-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:97e35e8d39ccc85859095e01a53847432ba9a53ddf7986f7a54a11b73d0e143f", size = 8218218, upload-time = "2026-04-24T00:13:20.974Z" },
+ { url = "https://files.pythonhosted.org/packages/85/8f/becc9722cafc64f5d2eb0b7c1bf5f585271c618a45dbd8fabeb021f898b6/matplotlib-3.10.9-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aba1615dabe83188e19d4f75a253c6a08423e04c1425e64039f800050a69de6b", size = 9608145, upload-time = "2026-04-24T00:13:23.228Z" },
+ { url = "https://files.pythonhosted.org/packages/32/5d/f7e914f7d9325abff4057cee62c0fa70263683189f774473cbfb534cd13b/matplotlib-3.10.9-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34cf8167e023ad956c15f36302911d5406bd99a9862c1a8499ea6f7c0e015dc2", size = 9885085, upload-time = "2026-04-24T00:13:25.849Z" },
+ { url = "https://files.pythonhosted.org/packages/a5/fd/fa69f2221534e80cc5772ac2b7d222011a2acafc2ec7216d5dd174c864ae/matplotlib-3.10.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:59476c6d29d612b8e9bb6ce8c5b631be6ba8f9e3a2421f22a02b192c7dd28716", size = 9672358, upload-time = "2026-04-24T00:13:28.906Z" },
+ { url = "https://files.pythonhosted.org/packages/ab/1a/5a4f747a8b271cbb024946d2dd3c913ab5032ba430626f8c3528ada96b4b/matplotlib-3.10.9-cp314-cp314-win_amd64.whl", hash = "sha256:336b9acc64d309063126edcdaca00db9373af3c476bb94388fe9c5a53ad13e6f", size = 8349970, upload-time = "2026-04-24T00:13:31.904Z" },
+ { url = "https://files.pythonhosted.org/packages/64/dc/95d60ecaefe30680a154b52ea96ab4b0dab547f1fd6aa12f5fb655e89cae/matplotlib-3.10.9-cp314-cp314-win_arm64.whl", hash = "sha256:2dc9477819ffd78ad12a20df1d9d6a6bd4fec6aaa9072681465fddca052f1456", size = 8272785, upload-time = "2026-04-24T00:13:34.511Z" },
+ { url = "https://files.pythonhosted.org/packages/70/a0/005d68bc8b8418300ce6591f18586910a8526806e2ab663933d9f20a41e9/matplotlib-3.10.9-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:da4e09638420548f31c354032a6250e473c68e5a4e96899b4844cf39ddea23fe", size = 8367999, upload-time = "2026-04-24T00:13:36.962Z" },
+ { url = "https://files.pythonhosted.org/packages/22/05/1236cc9290be70b2498af20ca348add76e3fffe7f67b477db5133a84f3ea/matplotlib-3.10.9-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:345f6f68ecc8da0ca56fad2ea08fde1a115eda530079eca185d50a7bc3e146c6", size = 8264543, upload-time = "2026-04-24T00:13:39.851Z" },
+ { url = "https://files.pythonhosted.org/packages/cd/c2/071f5a5ff6c5bd63aaaf2f45c811d9bf2ced94bde188d9e1a519e21d0cba/matplotlib-3.10.9-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4edcfbd8565339aa62f1cd4012f7180926fdbe71850f7b0d3c379c175cd6b66c", size = 9622800, upload-time = "2026-04-24T00:13:42.296Z" },
+ { url = "https://files.pythonhosted.org/packages/95/57/da7d1f10a85624b9e7db68e069dd94e58dc41dbf9463c5921632ecbe3661/matplotlib-3.10.9-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6be157fe17fc37cb95ac1d7374cf717ce9259616edec911a78d9d26dae8522d4", size = 9888561, upload-time = "2026-04-24T00:13:45.026Z" },
+ { url = "https://files.pythonhosted.org/packages/67/b2/ef8d6bb59b0edb6c16c968b70f548aa13b54348972def5aa6ac85df67145/matplotlib-3.10.9-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:4e42042d54db34fda4e95a7bd3e5789c2a995d2dad3eb8850232ee534092fbbf", size = 9680884, upload-time = "2026-04-24T00:13:48.066Z" },
+ { url = "https://files.pythonhosted.org/packages/61/1c/d21bfeb9931881ebe96bcfcff27c7ae4b160ae0ec291a714c42641a56d75/matplotlib-3.10.9-cp314-cp314t-win_amd64.whl", hash = "sha256:c27df8b3848f32a83d1767566595e43cfaa4460380974da06f4279a7ec143c39", size = 8432333, upload-time = "2026-04-24T00:13:51.008Z" },
+ { url = "https://files.pythonhosted.org/packages/78/23/92493c3e6e1b635ccfff146f7b99e674808787915420373ac399283764c2/matplotlib-3.10.9-cp314-cp314t-win_arm64.whl", hash = "sha256:a49f1eadc84ca85fd72fa4e89e70e61bf86452df6f971af04b12c60761a0772c", size = 8324785, upload-time = "2026-04-24T00:13:53.633Z" },
+]
+
+[[package]]
+name = "matplotlib-inline"
+version = "0.2.2"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "traitlets" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/bd/c0/9f7c9a46090390368a4d7bcb76bb87a4a36c421e4c0792cdb53486ffac7a/matplotlib_inline-0.2.2.tar.gz", hash = "sha256:72f3fe8fce36b70d4a5b612f899090cd0401deddc4ea90e1572b9f4bfb058c79", size = 8150, upload-time = "2026-05-08T17:33:33.49Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl", hash = "sha256:3c821cf1c209f59fb2d2d64abbf5b23b67bcb2210d663f9918dd851c6da1fcf6", size = 9534, upload-time = "2026-05-08T17:33:32.055Z" },
+]
+
+[[package]]
+name = "mdurl"
+version = "0.1.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" },
+]
+
+[[package]]
+name = "mistune"
+version = "3.2.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/ca/84/620cc3f7e3adf6f5067e10f4dbae71295d8f9e16d5d3f9ef97c40f2f592c/mistune-3.2.1.tar.gz", hash = "sha256:7c8e5501d38bac1582e067e46c8343f17d57ea1aaa735823f3aba1fd59c88a28", size = 98003, upload-time = "2026-05-03T14:33:22.312Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/2a/7f/a946aa4f8752b37102b41e64dca18a1976ac705c3a0d1dfe74d820a02552/mistune-3.2.1-py3-none-any.whl", hash = "sha256:78cdb0ba5e938053ccf63651b352508d2efa9411dc8810bfb05f2dc5140c0048", size = 53749, upload-time = "2026-05-03T14:33:20.551Z" },
+]
+
+[[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, upload-time = "2026-01-26T02:46:45.979Z" }
+wheels = [
+ { 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, upload-time = "2026-01-26T02:43:52.754Z" },
+ { 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, upload-time = "2026-01-26T02:43:53.893Z" },
+ { 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, upload-time = "2026-01-26T02:43:55.041Z" },
+ { 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, upload-time = "2026-01-26T02:43:56.198Z" },
+ { 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, upload-time = "2026-01-26T02:43:57.499Z" },
+ { 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, upload-time = "2026-01-26T02:43:58.755Z" },
+ { 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, upload-time = "2026-01-26T02:44:00.216Z" },
+ { 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, upload-time = "2026-01-26T02:44:02.202Z" },
+ { 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, upload-time = "2026-01-26T02:44:03.56Z" },
+ { 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, upload-time = "2026-01-26T02:44:04.845Z" },
+ { 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, upload-time = "2026-01-26T02:44:06.133Z" },
+ { 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, upload-time = "2026-01-26T02:44:07.518Z" },
+ { 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, upload-time = "2026-01-26T02:44:09.382Z" },
+ { 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, upload-time = "2026-01-26T02:44:10.73Z" },
+ { 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, upload-time = "2026-01-26T02:44:12.042Z" },
+ { url = "https://files.pythonhosted.org/packages/ca/a4/840f5b97339e27846c46307f2530a2805d9d537d8b8bd416af031cad7fa0/multidict-6.7.1-cp312-cp312-win32.whl", hash = "sha256:28ca5ce2fd9716631133d0e9a9b9a745ad7f60bac2bccafb56aa380fc0b6c511", size = 41887, upload-time = "2026-01-26T02:44:14.245Z" },
+ { url = "https://files.pythonhosted.org/packages/80/31/0b2517913687895f5904325c2069d6a3b78f66cc641a86a2baf75a05dcbb/multidict-6.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcee94dfbd638784645b066074b338bc9cc155d4b4bffa4adce1615c5a426c19", size = 46053, upload-time = "2026-01-26T02:44:15.371Z" },
+ { url = "https://files.pythonhosted.org/packages/0c/5b/aba28e4ee4006ae4c7df8d327d31025d760ffa992ea23812a601d226e682/multidict-6.7.1-cp312-cp312-win_arm64.whl", hash = "sha256:ba0a9fb644d0c1a2194cf7ffb043bd852cea63a57f66fbd33959f7dae18517bf", size = 43307, upload-time = "2026-01-26T02:44:16.852Z" },
+ { 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, upload-time = "2026-01-26T02:44:18.509Z" },
+ { 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, upload-time = "2026-01-26T02:44:19.745Z" },
+ { 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, upload-time = "2026-01-26T02:44:21.571Z" },
+ { 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, upload-time = "2026-01-26T02:44:22.803Z" },
+ { 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, upload-time = "2026-01-26T02:44:24.306Z" },
+ { 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, upload-time = "2026-01-26T02:44:25.772Z" },
+ { 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, upload-time = "2026-01-26T02:44:27.648Z" },
+ { 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, upload-time = "2026-01-26T02:44:29.588Z" },
+ { 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, upload-time = "2026-01-26T02:44:30.902Z" },
+ { 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, upload-time = "2026-01-26T02:44:32.31Z" },
+ { 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, upload-time = "2026-01-26T02:44:33.734Z" },
+ { 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, upload-time = "2026-01-26T02:44:35.222Z" },
+ { 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, upload-time = "2026-01-26T02:44:36.604Z" },
+ { 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, upload-time = "2026-01-26T02:44:38.008Z" },
+ { 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, upload-time = "2026-01-26T02:44:39.386Z" },
+ { url = "https://files.pythonhosted.org/packages/87/af/a3b86bf9630b732897f6fc3f4c4714b90aa4361983ccbdcd6c0339b21b0c/multidict-6.7.1-cp313-cp313-win32.whl", hash = "sha256:e1c5988359516095535c4301af38d8a8838534158f649c05dd1050222321bcb3", size = 41695, upload-time = "2026-01-26T02:44:41.318Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/35/e994121b0e90e46134673422dd564623f93304614f5d11886b1b3e06f503/multidict-6.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:960c83bf01a95b12b08fd54324a4eb1d5b52c88932b5cba5d6e712bb3ed12eb5", size = 45884, upload-time = "2026-01-26T02:44:42.488Z" },
+ { url = "https://files.pythonhosted.org/packages/ca/61/42d3e5dbf661242a69c97ea363f2d7b46c567da8eadef8890022be6e2ab0/multidict-6.7.1-cp313-cp313-win_arm64.whl", hash = "sha256:563fe25c678aaba333d5399408f5ec3c383ca5b663e7f774dd179a520b8144df", size = 43122, upload-time = "2026-01-26T02:44:43.664Z" },
+ { 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, upload-time = "2026-01-26T02:44:44.894Z" },
+ { 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, upload-time = "2026-01-26T02:44:46.106Z" },
+ { 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, upload-time = "2026-01-26T02:44:47.278Z" },
+ { 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, upload-time = "2026-01-26T02:44:48.604Z" },
+ { 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, upload-time = "2026-01-26T02:44:50.544Z" },
+ { 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, upload-time = "2026-01-26T02:44:51.951Z" },
+ { 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, upload-time = "2026-01-26T02:44:53.902Z" },
+ { 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, upload-time = "2026-01-26T02:44:55.316Z" },
+ { 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, upload-time = "2026-01-26T02:44:56.783Z" },
+ { 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, upload-time = "2026-01-26T02:44:58.195Z" },
+ { 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, upload-time = "2026-01-26T02:44:59.57Z" },
+ { 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, upload-time = "2026-01-26T02:45:01.054Z" },
+ { 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, upload-time = "2026-01-26T02:45:02.484Z" },
+ { 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, upload-time = "2026-01-26T02:45:03.862Z" },
+ { 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, upload-time = "2026-01-26T02:45:05.296Z" },
+ { url = "https://files.pythonhosted.org/packages/dc/1d/b31650eab6c5778aceed46ba735bd97f7c7d2f54b319fa916c0f96e7805b/multidict-6.7.1-cp313-cp313t-win32.whl", hash = "sha256:df9f19c28adcb40b6aae30bbaa1478c389efd50c28d541d76760199fc1037c32", size = 47770, upload-time = "2026-01-26T02:45:06.754Z" },
+ { url = "https://files.pythonhosted.org/packages/ac/5b/2d2d1d522e51285bd61b1e20df8f47ae1a9d80839db0b24ea783b3832832/multidict-6.7.1-cp313-cp313t-win_amd64.whl", hash = "sha256:d54ecf9f301853f2c5e802da559604b3e95bb7a3b01a9c295c6ee591b9882de8", size = 53109, upload-time = "2026-01-26T02:45:08.044Z" },
+ { url = "https://files.pythonhosted.org/packages/3d/a3/cc409ba012c83ca024a308516703cf339bdc4b696195644a7215a5164a24/multidict-6.7.1-cp313-cp313t-win_arm64.whl", hash = "sha256:5a37ca18e360377cfda1d62f5f382ff41f2b8c4ccb329ed974cc2e1643440118", size = 45573, upload-time = "2026-01-26T02:45:09.349Z" },
+ { 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, upload-time = "2026-01-26T02:45:10.651Z" },
+ { 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, upload-time = "2026-01-26T02:45:11.938Z" },
+ { 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, upload-time = "2026-01-26T02:45:14.346Z" },
+ { 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, upload-time = "2026-01-26T02:45:15.712Z" },
+ { 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, upload-time = "2026-01-26T02:45:17.293Z" },
+ { 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, upload-time = "2026-01-26T02:45:19.356Z" },
+ { 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, upload-time = "2026-01-26T02:45:20.834Z" },
+ { 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, upload-time = "2026-01-26T02:45:22.818Z" },
+ { 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, upload-time = "2026-01-26T02:45:24.368Z" },
+ { 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, upload-time = "2026-01-26T02:45:25.982Z" },
+ { 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, upload-time = "2026-01-26T02:45:27.487Z" },
+ { 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, upload-time = "2026-01-26T02:45:28.991Z" },
+ { 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, upload-time = "2026-01-26T02:45:30.503Z" },
+ { 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, upload-time = "2026-01-26T02:45:32.603Z" },
+ { 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, upload-time = "2026-01-26T02:45:34.043Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/e7/50bf7b004cc8525d80dbbbedfdc7aed3e4c323810890be4413e589074032/multidict-6.7.1-cp314-cp314-win32.whl", hash = "sha256:3ab8b9d8b75aef9df299595d5388b14530839f6422333357af1339443cff777d", size = 40930, upload-time = "2026-01-26T02:45:36.278Z" },
+ { url = "https://files.pythonhosted.org/packages/e0/bf/52f25716bbe93745595800f36fb17b73711f14da59ed0bb2eba141bc9f0f/multidict-6.7.1-cp314-cp314-win_amd64.whl", hash = "sha256:5e01429a929600e7dab7b166062d9bb54a5eed752384c7384c968c2afab8f50f", size = 45074, upload-time = "2026-01-26T02:45:37.546Z" },
+ { url = "https://files.pythonhosted.org/packages/97/ab/22803b03285fa3a525f48217963da3a65ae40f6a1b6f6cf2768879e208f9/multidict-6.7.1-cp314-cp314-win_arm64.whl", hash = "sha256:4885cb0e817aef5d00a2e8451d4665c1808378dc27c2705f1bf4ef8505c0d2e5", size = 42471, upload-time = "2026-01-26T02:45:38.889Z" },
+ { 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, upload-time = "2026-01-26T02:45:40.254Z" },
+ { 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, upload-time = "2026-01-26T02:45:41.635Z" },
+ { 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, upload-time = "2026-01-26T02:45:42.99Z" },
+ { 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, upload-time = "2026-01-26T02:45:44.376Z" },
+ { 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, upload-time = "2026-01-26T02:45:47.167Z" },
+ { 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, upload-time = "2026-01-26T02:45:48.698Z" },
+ { 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, upload-time = "2026-01-26T02:45:50.164Z" },
+ { 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, upload-time = "2026-01-26T02:45:51.779Z" },
+ { 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, upload-time = "2026-01-26T02:45:53.27Z" },
+ { 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, upload-time = "2026-01-26T02:45:54.919Z" },
+ { 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, upload-time = "2026-01-26T02:45:56.981Z" },
+ { 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, upload-time = "2026-01-26T02:45:58.698Z" },
+ { 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, upload-time = "2026-01-26T02:46:00.862Z" },
+ { 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, upload-time = "2026-01-26T02:46:02.824Z" },
+ { 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, upload-time = "2026-01-26T02:46:05.898Z" },
+ { url = "https://files.pythonhosted.org/packages/5f/60/c3a5187bf66f6fb546ff4ab8fb5a077cbdd832d7b1908d4365c7f74a1917/multidict-6.7.1-cp314-cp314t-win32.whl", hash = "sha256:98655c737850c064a65e006a3df7c997cd3b220be4ec8fe26215760b9697d4d7", size = 48008, upload-time = "2026-01-26T02:46:07.468Z" },
+ { url = "https://files.pythonhosted.org/packages/0c/f7/addf1087b860ac60e6f382240f64fb99f8bfb532bb06f7c542b83c29ca61/multidict-6.7.1-cp314-cp314t-win_amd64.whl", hash = "sha256:497bde6223c212ba11d462853cfa4f0ae6ef97465033e7dc9940cdb3ab5b48e5", size = 53542, upload-time = "2026-01-26T02:46:08.809Z" },
+ { url = "https://files.pythonhosted.org/packages/4c/81/4629d0aa32302ef7b2ec65c75a728cc5ff4fa410c50096174c1632e70b3e/multidict-6.7.1-cp314-cp314t-win_arm64.whl", hash = "sha256:2bbd113e0d4af5db41d5ebfe9ccaff89de2120578164f86a5d17d5a576d1e5b2", size = 44719, upload-time = "2026-01-26T02:46:11.146Z" },
+ { url = "https://files.pythonhosted.org/packages/81/08/7036c080d7117f28a4af526d794aab6a84463126db031b007717c1a6676e/multidict-6.7.1-py3-none-any.whl", hash = "sha256:55d97cc6dae627efa6a6e548885712d4864b81110ac76fa4e534c03819fa4a56", size = 12319, upload-time = "2026-01-26T02:46:44.004Z" },
+]
+
+[[package]]
+name = "nbclient"
+version = "0.10.4"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "jupyter-client" },
+ { name = "jupyter-core" },
+ { name = "nbformat" },
+ { name = "traitlets" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/56/91/1c1d5a4b9a9ebba2b4e32b8c852c2975c872aec1fe42ab5e516b2cecd193/nbclient-0.10.4.tar.gz", hash = "sha256:1e54091b16e6da39e297b0ece3e10f6f29f4ac4e8ee515d29f8a7099bd6553c9", size = 62554, upload-time = "2025-12-23T07:45:46.369Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl", hash = "sha256:9162df5a7373d70d606527300a95a975a47c137776cd942e52d9c7e29ff83440", size = 25465, upload-time = "2025-12-23T07:45:44.51Z" },
+]
+
+[[package]]
+name = "nbconvert"
+version = "7.17.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "beautifulsoup4" },
+ { name = "bleach", extra = ["css"] },
+ { name = "defusedxml" },
+ { name = "jinja2" },
+ { name = "jupyter-core" },
+ { name = "jupyterlab-pygments" },
+ { name = "markupsafe" },
+ { name = "mistune" },
+ { name = "nbclient" },
+ { name = "nbformat" },
+ { name = "packaging" },
+ { name = "pandocfilters" },
+ { name = "pygments" },
+ { name = "traitlets" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/01/b1/708e53fe2e429c103c6e6e159106bcf0357ac41aa4c28772bd8402339051/nbconvert-7.17.1.tar.gz", hash = "sha256:34d0d0a7e73ce3cbab6c5aae8f4f468797280b01fd8bd2ca746da8569eddd7d2", size = 865311, upload-time = "2026-04-08T00:44:14.914Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/67/f8/bb0a9d5f46819c821dc1f004aa2cc29b1d91453297dbf5ff20470f00f193/nbconvert-7.17.1-py3-none-any.whl", hash = "sha256:aa85c087b435e7bf1ffd03319f658e285f2b89eccab33bc1ba7025495ab3e7c8", size = 261927, upload-time = "2026-04-08T00:44:12.845Z" },
+]
+
+[[package]]
+name = "nbformat"
+version = "5.10.4"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "fastjsonschema" },
+ { name = "jsonschema" },
+ { name = "jupyter-core" },
+ { name = "traitlets" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/6d/fd/91545e604bc3dad7dca9ed03284086039b294c6b3d75c0d2fa45f9e9caf3/nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a", size = 142749, upload-time = "2024-04-04T11:20:37.371Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b", size = 78454, upload-time = "2024-04-04T11:20:34.895Z" },
+]
+
+[[package]]
+name = "nest-asyncio"
+version = "1.6.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/83/f8/51569ac65d696c8ecbee95938f89d4abf00f47d58d48f6fbabfe8f0baefe/nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", size = 7418, upload-time = "2024-01-21T14:25:19.227Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195, upload-time = "2024-01-21T14:25:17.223Z" },
+]
+
+[[package]]
+name = "notebook"
+version = "7.5.6"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "jupyter-server" },
+ { name = "jupyterlab" },
+ { name = "jupyterlab-server" },
+ { name = "notebook-shim" },
+ { name = "tornado" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/2a/c2/cf59bd2e6f2c8b976b52477e3e53bf6f97bc714ed046a51821afb428eaee/notebook-7.5.6.tar.gz", hash = "sha256:621174aade80108f0020b0f00738000b215f75fa3cd90771ad7aa0f24536a4e1", size = 14170814, upload-time = "2026-04-30T11:46:26.613Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e9/d6/1fd0646b9bbd9efbb0b8ae21b2325fbef515769a5621c03e31d8eb8da587/notebook-7.5.6-py3-none-any.whl", hash = "sha256:4dde3f8fb55fa8fb7946d58c6e869ce9baf46d00fc070664f62604569d0faca0", size = 14581730, upload-time = "2026-04-30T11:46:22.342Z" },
+]
+
+[[package]]
+name = "notebook-shim"
+version = "0.2.4"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "jupyter-server" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/54/d2/92fa3243712b9a3e8bafaf60aac366da1cada3639ca767ff4b5b3654ec28/notebook_shim-0.2.4.tar.gz", hash = "sha256:b4b2cfa1b65d98307ca24361f5b30fe785b53c3fd07b7a47e89acb5e6ac638cb", size = 13167, upload-time = "2024-02-14T23:35:18.353Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl", hash = "sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef", size = 13307, upload-time = "2024-02-14T23:35:16.286Z" },
+]
+
+[[package]]
+name = "numpy"
+version = "2.4.6"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d0/ad/fed0499ce6a338d2a03ebae59cd15093910c8875328855781952abf6c2fe/numpy-2.4.6.tar.gz", hash = "sha256:f3a3570c4a2a16746ac2c31a7c7c7b0c186b95ce902e33db6f28094ed7387dda", size = 20735807, upload-time = "2026-05-18T23:37:14.07Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/95/2a/3d7b5ac8aac24feaf9ad7ed58f45b0bbc06d37e4338ae84c9f2298b570f9/numpy-2.4.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:001fbb8e08d942dd57599e781f2472269ee7f2755fae407b4f67b2f0b17da3f1", size = 16689119, upload-time = "2026-05-18T23:33:54.065Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/12/92c4c131527599e8288d6918e888d88726f84d805d784b771f32408aeaef/numpy-2.4.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ebfb099f8dcf083deef3ac1ca4c1503f387cf76296fcb3816b66f5ecb5f54fdb", size = 14699246, upload-time = "2026-05-18T23:33:57.621Z" },
+ { url = "https://files.pythonhosted.org/packages/ad/fe/c0a6b7b2ca128a8fb228575147073b660656734b8ebe4d76c8fd748dcc79/numpy-2.4.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:3213d622a0283a39a93d188f3cf72b26862df52fbb4ca3697f51705016523d41", size = 5204410, upload-time = "2026-05-18T23:34:00.302Z" },
+ { url = "https://files.pythonhosted.org/packages/f3/d4/9770d14ba719432bb90a421bfd443872ed0f70f7264b64bec12ea363d5fd/numpy-2.4.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:357cc07a6d7b0b182ff02249616a03742827ebb1277546b5c7cd7f7620a45698", size = 6551240, upload-time = "2026-05-18T23:34:02.852Z" },
+ { url = "https://files.pythonhosted.org/packages/c9/c6/50a46a6205feba2343f1d6d17438107c5dc491ed1c736e6ea68689fd906b/numpy-2.4.6-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f9fb9157b4ce2971008323afe46053787b526ef624fea915b261468a8421a0f", size = 15671012, upload-time = "2026-05-18T23:34:05.485Z" },
+ { url = "https://files.pythonhosted.org/packages/99/60/14115e6364fa676c5397c2ad3004e527e9aa487abf5d0706ec81bbd08529/numpy-2.4.6-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:90f9849678c75fe7afa2d348ac842c168b0a4d3d61919687216dfc547976d853", size = 16645538, upload-time = "2026-05-18T23:34:09.265Z" },
+ { url = "https://files.pythonhosted.org/packages/ae/c5/693cbe59e57db94d2231fa519ca3978dc9e19da5a8f088588f5c6e947ff2/numpy-2.4.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c1a2af6c6ef86344a6b0db6b97834208bf598db514f2b155042439b62605601a", size = 17020706, upload-time = "2026-05-18T23:34:13.053Z" },
+ { url = "https://files.pythonhosted.org/packages/ef/fc/85b7c4eff9b4966ade25c2273cf7e7012e92366c032058653934b37de044/numpy-2.4.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e5805d5a22fd19c8ccff10a9561f9df94436b0545619ea579db2d3c35294bce2", size = 18368541, upload-time = "2026-05-18T23:34:17.024Z" },
+ { url = "https://files.pythonhosted.org/packages/f6/81/e1b27545deedce7f4a0b348618c6b62d74e36a4dc9ccd42f3eb2f85eee32/numpy-2.4.6-cp312-cp312-win32.whl", hash = "sha256:e3eeb0aabd6bd5ce64faae67e9935203a6991b4bc2a485a767fbafb2c5125f45", size = 5962825, upload-time = "2026-05-18T23:34:20.3Z" },
+ { url = "https://files.pythonhosted.org/packages/ab/ca/feab00bd44aa5fe1ad2c18f08b4d3bb92e26484b0b1d1443897809ed528c/numpy-2.4.6-cp312-cp312-win_amd64.whl", hash = "sha256:d8e8286dd7cea7895157318d1b91cdacac64c479f3cbc8dce548331728484751", size = 12321687, upload-time = "2026-05-18T23:34:23.095Z" },
+ { url = "https://files.pythonhosted.org/packages/63/cf/5a6d34850a39d1093558564f77ee8e8e0bee5061151b8f05a55711001ec7/numpy-2.4.6-cp312-cp312-win_arm64.whl", hash = "sha256:4081eb135ac24158bd51cdfbef16f1c64df7063b1143f24731387137c092bec8", size = 10221482, upload-time = "2026-05-18T23:34:25.876Z" },
+ { url = "https://files.pythonhosted.org/packages/fb/82/bdab26d7438c6791ca31b7c024ca37c1eab8b726ba236129005cd4a06e45/numpy-2.4.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:511dbaf848decaaaf4b4ca48032619fb3138710c4bf7da7617765edad1ef96b0", size = 16684648, upload-time = "2026-05-18T23:34:29.41Z" },
+ { url = "https://files.pythonhosted.org/packages/1b/30/a80189bcc7f5e4258b3fbc3968d909d1756f54d023299ecc39ad6fdb9ef8/numpy-2.4.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bf162abab1c1a736333192707cef898e735a5ca00f38f27eeedf44b39d9e85eb", size = 14693902, upload-time = "2026-05-18T23:34:33.013Z" },
+ { url = "https://files.pythonhosted.org/packages/97/12/70b5d0d7c15e1ebb8a6a84a8caa1d19e181d84fb58bb6d70aca29099dec1/numpy-2.4.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:043191bfa8eab18c776647b62723ac9dddece59743b13f49b2016094129c2b3f", size = 5198992, upload-time = "2026-05-18T23:34:36.132Z" },
+ { url = "https://files.pythonhosted.org/packages/ba/8c/ebd2a8f8a83541f8d38cc5667e8c2b69cecfd30da6e45693e8158857d44b/numpy-2.4.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:6180d8b35af935aed8ece3a85e0a43f87393ae0ac87c8d2c8bd2c993f7270ef3", size = 6546944, upload-time = "2026-05-18T23:34:38.484Z" },
+ { url = "https://files.pythonhosted.org/packages/bb/c5/7b863a97a91671a0338f4253bd3b5a3d3852f0692dae91711c9f4a10e787/numpy-2.4.6-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72fbe16c6fac95aedf5937fa873445cec2110be35d8a4e9433d7501fd98dae6b", size = 15669392, upload-time = "2026-05-18T23:34:41.257Z" },
+ { url = "https://files.pythonhosted.org/packages/a5/9d/3584b9984ca4c047aea75214ce1a4c4c73d849bd71b604264b7f5653f8a8/numpy-2.4.6-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a7830bab239b79cda9c08c2da014761cafb48da6150e1da17ac06283f43b6089", size = 16633220, upload-time = "2026-05-18T23:34:45.075Z" },
+ { url = "https://files.pythonhosted.org/packages/05/ae/7c67fba23bd98caec7c99261f3a16072ade14813486b0282cb29846de832/numpy-2.4.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ef4aea96ce4d3b074422cb4f2f64e216bf9e213004bb58ecfdf50ea02ea8eb9a", size = 17020800, upload-time = "2026-05-18T23:34:49.065Z" },
+ { url = "https://files.pythonhosted.org/packages/d9/5d/3b6725cb31d983c5e66916f5d36f6d7e5521129e4c4404d64f918292a5b6/numpy-2.4.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dfa20cc6ca228e6b155b11da03825975ce66aea520985dbbddf0f2a5a495c605", size = 18357600, upload-time = "2026-05-18T23:34:52.709Z" },
+ { url = "https://files.pythonhosted.org/packages/f7/da/2ccc6c2fe8898dee01d90c75c5f5f914a23daf99e3e0f59516a08760c8b5/numpy-2.4.6-cp313-cp313-win32.whl", hash = "sha256:56b39e5e0622a09a25bf5baf62f4bcf0cb8a41ae6e2819cf49bbc5a74c083f91", size = 5961134, upload-time = "2026-05-18T23:34:55.618Z" },
+ { url = "https://files.pythonhosted.org/packages/b5/cd/9cc4dc876fb065d5c220aae4d5e14826b2715331bb7618ce1fb07a679d99/numpy-2.4.6-cp313-cp313-win_amd64.whl", hash = "sha256:c4fc99836233ea196540b17ab0983aff60ed07941751930f5f4d05bc3b3b7359", size = 12318598, upload-time = "2026-05-18T23:34:58.928Z" },
+ { url = "https://files.pythonhosted.org/packages/39/1e/c0bcba1f8694116485fe28fd1be698c278fcda4141c5b0e53a2aed8b12a8/numpy-2.4.6-cp313-cp313-win_arm64.whl", hash = "sha256:a7c711e21628b52034bb5ab8d1bce291f752fcc5e92accc615778acee1ff4778", size = 10222272, upload-time = "2026-05-18T23:35:02.167Z" },
+ { url = "https://files.pythonhosted.org/packages/63/6d/cc5619247c8f4204e507f5883528372e4ac4bb189e579fb859a12e480b1f/numpy-2.4.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:112b06a867b235ef466ed3508ddf0238050df9c727cafb5301ac385b899189a1", size = 14821197, upload-time = "2026-05-18T23:35:05.468Z" },
+ { url = "https://files.pythonhosted.org/packages/00/58/f1c39161c87d9e9bed660f1ed4bafc0e403d5ec9650b6dd77aead07d489b/numpy-2.4.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:eaf7fa2de5c0be8ae6ff8e9bea2ccd725e980541244521d8d4b5f3354a27babe", size = 5326287, upload-time = "2026-05-18T23:35:08.693Z" },
+ { url = "https://files.pythonhosted.org/packages/af/57/3917ab0fd97f271a8694513581b8a36c655f111c446852c302f04ccdb6fc/numpy-2.4.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:7265a2f3d436e54ef9f2b52b5c937e6be778781bd97a590319d7348f1c1ca997", size = 6646763, upload-time = "2026-05-18T23:35:11.459Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/0f/037e64c494b67581ae18193d770adef354c41f3f2c8ebf865602d949bf8f/numpy-2.4.6-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f74a575920ab21fe304421a3fc28793d82e299cae9eccb37084e9fc7f3617c20", size = 15728070, upload-time = "2026-05-18T23:35:14.79Z" },
+ { url = "https://files.pythonhosted.org/packages/21/a6/5d2bae9c9542eb4df16dc9c46dc79c186e9bad53805dfa5399a6023c6db0/numpy-2.4.6-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ede83e07a75dd06bc501566c1eca2afc0d61677c1472ac9ad93fdee6e638a48d", size = 16681752, upload-time = "2026-05-18T23:35:18.836Z" },
+ { url = "https://files.pythonhosted.org/packages/92/14/23d1dfb410ae362cd59ce53e936b1513d545eb40db3949ced632e19a459e/numpy-2.4.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:68bb27509ac1b9a3443094260f6326150663b06abe40b73a2f81160623da5b67", size = 17086024, upload-time = "2026-05-18T23:35:22.52Z" },
+ { url = "https://files.pythonhosted.org/packages/4b/6e/23595a2c642cdf3bc567877064bdd7f91c8b0038a4453cf2daf7248eafe9/numpy-2.4.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a0df0043bdb289bde1f62da130d20df23d58b45429f752bc7a8fc5325a225ecd", size = 18403398, upload-time = "2026-05-18T23:35:26.398Z" },
+ { url = "https://files.pythonhosted.org/packages/8a/90/0ac3bc947217e66dec77e7cbc6a1979d1af70b6461b82f620d3bccd5e4c8/numpy-2.4.6-cp313-cp313t-win32.whl", hash = "sha256:29a287e0cf63ff528da061de6b9f64a4618da591ca1046aafc54062e40ca7eab", size = 6084971, upload-time = "2026-05-18T23:35:29.387Z" },
+ { url = "https://files.pythonhosted.org/packages/77/71/5673e351671a1d2bd6063b91b44f70c0affea7d1516fa7a6572941ba4aa1/numpy-2.4.6-cp313-cp313t-win_amd64.whl", hash = "sha256:25c692919ac5a01f170a3bfcd62d745b24fd095c353d50812637d6fcab442e75", size = 12458532, upload-time = "2026-05-18T23:35:32.175Z" },
+ { url = "https://files.pythonhosted.org/packages/3f/88/19d3503c5046e688f049274b27a3ef3d771152fa80d3ba3d01a3dff61abe/numpy-2.4.6-cp313-cp313t-win_arm64.whl", hash = "sha256:1e978ec1e8bd0e0e4de6bb75de9d30cbb74db6b6a2bb727618613703ca0167dd", size = 10291881, upload-time = "2026-05-18T23:35:35.465Z" },
+ { url = "https://files.pythonhosted.org/packages/f8/91/3ab2044d05fd16d343c5ac2e69b127f1b2854040dd20b193257c78028bd3/numpy-2.4.6-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:06ca2f61ec4385a07a6977c55ba998a4466c123642b4a32694d3128fce18c079", size = 16683458, upload-time = "2026-05-18T23:35:38.353Z" },
+ { url = "https://files.pythonhosted.org/packages/8e/62/764ce66fa4147ae6d73071a3abf804ffe606f174618697c571acdf26a7c9/numpy-2.4.6-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:38efbc8de75c7a0fc1ac190162d892787f3f47b57cc291231aafee36b80982b7", size = 14704559, upload-time = "2026-05-18T23:35:42.14Z" },
+ { url = "https://files.pythonhosted.org/packages/60/61/23f27c172f022e04025b7dc2367f4d63c1a398120607ec896228649a6f48/numpy-2.4.6-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:d581b735e177fdcdce6fed8e7e8880a3fb6ee4e3653a3ac6af01c6f4c03effc5", size = 5209716, upload-time = "2026-05-18T23:35:45.377Z" },
+ { url = "https://files.pythonhosted.org/packages/03/71/21cf70dc6ea3e3acb95fc53a265b2fc248b981f0194ceb5b475271b8809d/numpy-2.4.6-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:0a041d3d761dc3c35cc56ce0351506a02bcbc25f7b169f652435141a17db9096", size = 6543947, upload-time = "2026-05-18T23:35:47.926Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/91/64288395ee1799bd2e0b04a305dce9666da90c961e1f3fe982a05ee1c036/numpy-2.4.6-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:40fdc1ae7125e518ea98e53e69a4ebc27e1fd50510c47b7ea130cf21e5e1d42b", size = 15685197, upload-time = "2026-05-18T23:35:50.863Z" },
+ { url = "https://files.pythonhosted.org/packages/f3/eb/ebffaa97dc55502df69584a8f0dcf07f69a3e0b3e2323670a2722db9aa39/numpy-2.4.6-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a2c306dea656c12c68f51f4cea133cbe78ca7435eb28c735eac1d3ebe73be6e8", size = 16638245, upload-time = "2026-05-18T23:35:54.752Z" },
+ { url = "https://files.pythonhosted.org/packages/b8/0b/54f9da33128d7e350fab89c7455902eeae70349ee52bddb448dc4a576f45/numpy-2.4.6-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:33111801a01c12a8a1e3721f0a9232f8cfc8ae2c6b7098167e6f623c6073f402", size = 17036587, upload-time = "2026-05-18T23:35:58.355Z" },
+ { url = "https://files.pythonhosted.org/packages/b6/f0/fdebc1052db1cc37c64beb22072d67cd6d1c71adca1299f53dec2b5e20d3/numpy-2.4.6-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ae506e6902902557576a26ff33eda8695e7ecb3cb36c3b573a0765dee114ebdb", size = 18363226, upload-time = "2026-05-18T23:36:02.845Z" },
+ { url = "https://files.pythonhosted.org/packages/aa/b4/298628d98c72b57e57f7165ae6a481a1deaf6f3c28262a6e4c739c275930/numpy-2.4.6-cp314-cp314-win32.whl", hash = "sha256:aaf159caa35993cb1f56fb9b8e4610d35758e7ca005412eb1daa856a78c9c4b1", size = 6010196, upload-time = "2026-05-18T23:36:05.92Z" },
+ { url = "https://files.pythonhosted.org/packages/df/ac/46de6dda46478f7942f839e094970be2d4a861e005c4b3bf07c92e291a09/numpy-2.4.6-cp314-cp314-win_amd64.whl", hash = "sha256:b507f5c4c1d508876d1819b6bf9a49d365b96320b5d4993426b33a23ca4b8261", size = 12450334, upload-time = "2026-05-18T23:36:09.107Z" },
+ { url = "https://files.pythonhosted.org/packages/78/92/b8b798ac784102c0da830d2257d59358e3d3d90d1e2b3f2575dad976c5cf/numpy-2.4.6-cp314-cp314-win_arm64.whl", hash = "sha256:6f41ae150c4e32db4f3310cdaf64b1593a03dbabe29eec77fc9b50fe64061df6", size = 10495678, upload-time = "2026-05-18T23:36:12.766Z" },
+ { url = "https://files.pythonhosted.org/packages/30/34/ec28d1aa8115971537c01469ab2011ee96827930f0a124de1000cc2a7ed7/numpy-2.4.6-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ece3d2cfe132e7d51f44a832b303895e6f2d499c5e74dfbdb06ee246147a304a", size = 14823672, upload-time = "2026-05-18T23:36:16.473Z" },
+ { url = "https://files.pythonhosted.org/packages/16/bd/f6d1fede4e54e8042a7ff97bb495510f3c220f94bcd9e8b228e87c92cc0d/numpy-2.4.6-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:e3e5193ef5a3dc73bceee50f7fdc2c90dbb76c42df8d8fae3d1067a583df579e", size = 5328731, upload-time = "2026-05-18T23:36:19.767Z" },
+ { url = "https://files.pythonhosted.org/packages/f4/f0/e105b9e2fd728a9910103884decd6951d9dd73896b914a98d9a231de02ee/numpy-2.4.6-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:17f9ade344e7d9b464a084d69bcf18fc691cb1db67c62ed80820bf4926d78f0e", size = 6649805, upload-time = "2026-05-18T23:36:22.266Z" },
+ { url = "https://files.pythonhosted.org/packages/82/dd/1206a7ca6ab15e3f02069707ca96222e202af681bb73756da7527f3cb837/numpy-2.4.6-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9cd5ffd25db4e7ba6a375693b3fc0fc1791ec636c17db3720da19bde7180ec43", size = 15730496, upload-time = "2026-05-18T23:36:25.713Z" },
+ { url = "https://files.pythonhosted.org/packages/51/e7/38d3ea825dcab85a591734decb2f6c67caa7c8367d374df1a1c3842f9b07/numpy-2.4.6-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7d92c3819208a60205a12a245c91ad70cb0a85336659b19b834205573ac8456e", size = 16679616, upload-time = "2026-05-18T23:36:29.652Z" },
+ { url = "https://files.pythonhosted.org/packages/93/b7/caabfdf53edf663e0b4eb74d7d405d83baef09eb5e83bcd32d601d72b93e/numpy-2.4.6-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e85b752a1e912b70eaad4fafbd4d1238007ab221de2009b9a2f5ae7461239895", size = 17085145, upload-time = "2026-05-18T23:36:33.449Z" },
+ { url = "https://files.pythonhosted.org/packages/f9/45/68d7c33a6bcf3e5aa3bdbd57a367e6f615286dfd6482f97e8ffeb734306e/numpy-2.4.6-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:29cb7f67d10b479ff07c17d33e39f78c07f71c40ef30d63c153d340e96cd3fb4", size = 18403813, upload-time = "2026-05-18T23:36:37.369Z" },
+ { url = "https://files.pythonhosted.org/packages/9c/50/0753655aa844c99cd9e018aacf76f130f1bd81d881bb74bc0aef5d73a8ba/numpy-2.4.6-cp314-cp314t-win32.whl", hash = "sha256:260a5d70215b61ab4fadf5c7baacd64821842975eea312125ed3c39a6391b063", size = 6156982, upload-time = "2026-05-18T23:36:40.817Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/d4/7c67becf668f973cb490cec3e98dfd799d866f9c989a54d355672cfa0db6/numpy-2.4.6-cp314-cp314t-win_amd64.whl", hash = "sha256:81a1cca95ed5bb92aa8b10dd2cdc9a0d3853a50fad926c28b5d7e8ea54389627", size = 12638908, upload-time = "2026-05-18T23:36:43.996Z" },
+ { url = "https://files.pythonhosted.org/packages/43/bb/e1c71a4295b1b1d1393d50dbb4f2a36283c6859d9d3892e84f00ec5a91d5/numpy-2.4.6-cp314-cp314t-win_arm64.whl", hash = "sha256:0c9136e14ed34a9e343a31c533d78a9813a69a3148332bce5e9821cb2f996e66", size = 10565867, upload-time = "2026-05-18T23:36:47.114Z" },
+]
+
+[[package]]
+name = "packaging"
+version = "26.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" },
+]
+
+[[package]]
+name = "pandas"
+version = "3.0.3"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "numpy" },
+ { name = "python-dateutil" },
+ { name = "tzdata", marker = "sys_platform == 'emscripten' or sys_platform == 'win32'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/f8/87/4341c6252d1c47b08768c3d25ac487362bf403f0313ddae4a2a26c9b1b4c/pandas-3.0.3.tar.gz", hash = "sha256:696a4a00a2a2a35d4e5deb3fc946641b96c944f02230e4f76137fe35d806c4fc", size = 4651414, upload-time = "2026-05-11T18:54:29.21Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/24/f1/392f8c5bfc16f66a0d2d41561c01627c228fe7ed2a0d056ef11315042570/pandas-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fed2ff7fd9779120e388e285fc029bd5cf9490cdd2e4166a9ee22c0e49a9ab09", size = 10357846, upload-time = "2026-05-11T18:52:36.143Z" },
+ { url = "https://files.pythonhosted.org/packages/cf/3d/b16412745651e855f357e5e66930248688378853a6e2698a214e331fba1f/pandas-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b168fc218fd80a6cbdbdbc1a97ddc7889ed057d7eb45f50d866ceab5f39904c4", size = 9899550, upload-time = "2026-05-11T18:52:38.976Z" },
+ { url = "https://files.pythonhosted.org/packages/31/a8/fa2535168fffcedf67f4f6de28d2dd903a747ca7c8ea6989451aaeb3a92f/pandas-3.0.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0383c72c75cdcca61a9e116e611143902dbfd08bff356829c2f6d1cf40a9ca8c", size = 10412965, upload-time = "2026-05-11T18:52:41.915Z" },
+ { url = "https://files.pythonhosted.org/packages/65/b6/09b01cdbc15224e2850365192d17b7bdebb8bdbd8780ed221fcdf0d9a515/pandas-3.0.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6dc0b3fd2169c9157deed50b4d519553a3655c8c6a96027136d654592be973a9", size = 10894600, upload-time = "2026-05-11T18:52:45.02Z" },
+ { url = "https://files.pythonhosted.org/packages/c9/a4/2eb28f2fccb4ced4a2c79ab2a5dee9ade1ebf44922ebad6fea158c9f95d4/pandas-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7e65d5407dc0b394f509699650e4a2ec01c0514f21850f453fa60f3be79a5dbf", size = 11422824, upload-time = "2026-05-11T18:52:48.058Z" },
+ { url = "https://files.pythonhosted.org/packages/f8/45/830bb57f533a4604b355e07edcb8ea18cf88b5f94e5fca92f27052d7c597/pandas-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f8894dc474d648fe7b6ff0ca9b0bd73950d19952bc1a6534540762c5d79d305c", size = 11950889, upload-time = "2026-05-11T18:52:50.905Z" },
+ { url = "https://files.pythonhosted.org/packages/b9/c5/fc1b368f303087d20e8c9bf3d6ceb186263cfac0ade735cd938538bea839/pandas-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:c7be265b62cef88e253a941e4698604973736dcfe242fdb5198f0f7bc473cdcc", size = 9755463, upload-time = "2026-05-11T18:52:53.386Z" },
+ { url = "https://files.pythonhosted.org/packages/86/bd/fda8f9705b1b09c6ebe14bfc0fa0e4ec8584d54ea673628f157ff55131af/pandas-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:557409bc4178e70ee8d9ddb494798e51ebf6ea59330f6be22c51bab2a7db6c49", size = 9066158, upload-time = "2026-05-11T18:52:56.038Z" },
+ { url = "https://files.pythonhosted.org/packages/c5/90/62d8302883c44308c477e222c3daf7c813a34c8e96985882fbd53d964352/pandas-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:67b3b64c11910cfa29f4e94a14d3bff9ee693b6fc76055e7cad549cee0aec5fa", size = 10331071, upload-time = "2026-05-11T18:52:58.838Z" },
+ { url = "https://files.pythonhosted.org/packages/7f/ae/6a6493c783a101f165e4356953ba3c74d6f77f0042fa7d753da9dfbb640c/pandas-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:39436b377d56d2a2e52d0395bdbee171f01068e99af5250509aceeb929f765c7", size = 9875690, upload-time = "2026-05-11T18:53:01.431Z" },
+ { url = "https://files.pythonhosted.org/packages/62/7c/5df8e9f56c69a2769fbe9382a5ef8f2658c007e376434e1e2cbb57ad895f/pandas-3.0.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4be06d68f9ddcfc645b87534911da79a8fbffc7573c80e0edcf42a5020624d8", size = 10381634, upload-time = "2026-05-11T18:53:04.393Z" },
+ { url = "https://files.pythonhosted.org/packages/99/68/1237369725aa617bb358263d535803e3053fdbc593513ec5ed9c9896b5b6/pandas-3.0.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a4eeb6830daf35a71cc09649bd823e2b542dac246cdee9614c6e4bd65028cd6a", size = 10891243, upload-time = "2026-05-11T18:53:07.643Z" },
+ { url = "https://files.pythonhosted.org/packages/25/93/77d108e8af7222b4a503ebde0e30215b1c2e4f8e53a526431890f22d5586/pandas-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1928e07221f82db493cd4af1e23c1bfca524a19a4699887975bff68f49a72bfb", size = 11388659, upload-time = "2026-05-11T18:53:10.634Z" },
+ { url = "https://files.pythonhosted.org/packages/d0/bd/eff5b4399f332ac386c853f6cd2bd3fa2ca0061b9f36ecd9c4d7c4265649/pandas-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51b1fe551acb77dac643c6fda86084d8d446c10fe64b06a9cc29c4cc8540e7f2", size = 11942880, upload-time = "2026-05-11T18:53:13.536Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/20/559ace4200982c3887d0b86bfd0d856a2143ef8ddab63cc07934951a964c/pandas-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:a82d532a3351d435432cd913edbccaf8b8e01d4dd0e5ced5a8d2e8ecd94c7e44", size = 9757091, upload-time = "2026-05-11T18:53:16.306Z" },
+ { url = "https://files.pythonhosted.org/packages/3a/66/69055a09fe200f29f922a3eeec4804611900b95f52d932ece3393c3c0c19/pandas-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:275c14e0fce14a2ec20eee474aecd305478ea3c1e6f6a9d8fe219a165542717e", size = 9057282, upload-time = "2026-05-11T18:53:18.768Z" },
+ { url = "https://files.pythonhosted.org/packages/57/0e/efe801b0e6811e8e650cd21b7f2608e30f08a7067e2bf6e8752b0d56ee3c/pandas-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:46997386d528eb40376ecd6b033cf4a8a1e5282580f68f43de875b78cba2199d", size = 10767016, upload-time = "2026-05-11T18:53:21.227Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/dc/eb55135a1d5f0f0519f28da1f609a206d2cad1f9c35c32d51e38dd7261ae/pandas-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:261e308dfb22448384b7580cf719d2f998fe2966c92893c3e77d14008af1f066", size = 10420210, upload-time = "2026-05-11T18:53:23.982Z" },
+ { url = "https://files.pythonhosted.org/packages/c6/3e/b1d5d955ce33ffecb407465a60bc32769d74fcf68224b7ae67ae11d4dea4/pandas-3.0.3-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dd1a5d1def6a46002e964510bdc67c368aa0951df5d1d9f8365336f5a1f490cd", size = 10336126, upload-time = "2026-05-11T18:53:26.731Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/76/a01261711ab60a22d71b862f0de20e4c504bf80457270ad8cb42110f6abc/pandas-3.0.3-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d72828c20c6d6e83e1e22a6a3b47b326b71664112fa9705dcbccfd7a39b62085", size = 10728051, upload-time = "2026-05-11T18:53:29.125Z" },
+ { url = "https://files.pythonhosted.org/packages/e9/21/ea191195e587b18cf682e97f433f81b2d0fbe341380e80a3e0d6e4403c8e/pandas-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d26cbe1fcfc12e8fd900e2454163e466b2d3af84f7c75481df7683ffc073d870", size = 11350796, upload-time = "2026-05-11T18:53:32.056Z" },
+ { url = "https://files.pythonhosted.org/packages/64/69/f0eaaf54939f0e8c6768fd06be9af2cef9b36048b96dfb9e1b2c685a807e/pandas-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:3e91cec1879ada0624fc3dc9953c5cbd60208e59c0db28f540c5d6d47502422f", size = 11799741, upload-time = "2026-05-11T18:53:34.985Z" },
+ { url = "https://files.pythonhosted.org/packages/45/a4/865e0e510cae5fc2194de4db28be638952de942571ba9125934fd9c01d47/pandas-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:08d789b41f87e0905880e293cedf6197ce71fe67cc081358b1e148a491b9bd13", size = 10499958, upload-time = "2026-05-11T18:53:37.857Z" },
+ { url = "https://files.pythonhosted.org/packages/86/54/effdcc3c0ff7a08037889200e148ebe94c16c4f653be078c7b3675955df1/pandas-3.0.3-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:3650109c0f22879df8bd6179ab9ee3d7f1d1d4e7e0094a3f0032d9f51e2e64ac", size = 10336065, upload-time = "2026-05-11T18:53:41.099Z" },
+ { url = "https://files.pythonhosted.org/packages/68/10/bf2d6738d72748b961a3751ab89522d58c54efc36a8e1a12161216cd45cf/pandas-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:bab900348131a7db1f69a7309ef141fd5680f1487094193bcbbb61791573bf8f", size = 9926101, upload-time = "2026-05-11T18:53:43.515Z" },
+ { url = "https://files.pythonhosted.org/packages/ae/e9/e35cf11c8a136e757b956f5f0efdcaa50aecde85ea055f1898dfc68262f3/pandas-3.0.3-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba7e08b9ac1d54569cd1e256e3668975ed624d6826f7b68df0342b012007bddb", size = 10457553, upload-time = "2026-05-11T18:53:46.394Z" },
+ { url = "https://files.pythonhosted.org/packages/58/3b/1cdec6772bdbaf7b25dab360c59f03cadf05492dd724c6540af905389b07/pandas-3.0.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d71c63ae4ebdbf70209742096f1fc46a83a0613c99d4b23766cced9ff8cd62a", size = 10914065, upload-time = "2026-05-11T18:53:49.134Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/c2/1ef644445fcd72e3627bceec77e3560636f87ddce4ed841afe76b83b5bf9/pandas-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e3a2ec42c98ffa2565a67e08e218d06d72576d758d90facb7c00805194d8f360", size = 11459188, upload-time = "2026-05-11T18:53:52.527Z" },
+ { url = "https://files.pythonhosted.org/packages/7e/49/4d8d4f42cbc9c4adc7a1870f269c02cbd6cd40d059622c06fb298addcbad/pandas-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:335f62418ed562cfc3c49e9e196375c28b729dcef8543abf4f9438e381bf3c76", size = 11982966, upload-time = "2026-05-11T18:53:55.043Z" },
+ { url = "https://files.pythonhosted.org/packages/38/55/792619469bab9882d8bbd5865d45a72f6478762d04a9af4bf0d08c503e95/pandas-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:3c20a521bbb85902f79f7270c80a59e1b5452d96d170c034f207181870f97ac5", size = 9876755, upload-time = "2026-05-11T18:53:58.067Z" },
+ { url = "https://files.pythonhosted.org/packages/2a/af/33c469653b0ba03b50c3a98192d4c07f0c75c66b263ceb097fce0ee97d31/pandas-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:a2d2dff8a04f3917b55ab3910c32990f8ddf7eceba114947838cefa976a68977", size = 9198658, upload-time = "2026-05-11T18:54:00.733Z" },
+ { url = "https://files.pythonhosted.org/packages/a2/fa/b8c257bd76b8bd060c3a9151c1fca05e9b9c5e3af5d0f549c0356f6d143d/pandas-3.0.3-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:0d589105b3c14645af1738ff279b2995102d8f7a03b0a66dc8d95550eb513e04", size = 10787242, upload-time = "2026-05-11T18:54:03.564Z" },
+ { url = "https://files.pythonhosted.org/packages/54/eb/f19206ffb0bf1919002969aa448b4702c6594845156a6f8050674855aac3/pandas-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:13fc1e853d9e04743d11ba75a985ccbc2a317fe07d8af61e445a6fd24dacd6a6", size = 10436369, upload-time = "2026-05-11T18:54:06.311Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/24/c7c39fb4fe22b71a0c2d78bf0c585c600092d85f94f086d2b3b2f6ca27e2/pandas-3.0.3-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:819959dab7bbd0049c15623fbac4e29a191b9528160a61fb1032242d8ced2d9c", size = 10358306, upload-time = "2026-05-11T18:54:09.085Z" },
+ { url = "https://files.pythonhosted.org/packages/16/ec/dd2a9eb7fa1204df88c0864164e35b228ac581062ac612ba0a67fd812e4c/pandas-3.0.3-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:60ae316d3fd75d1858d450d0db0103ea2be3e7d4a95ec2f064f7e2ae63f7b028", size = 10758394, upload-time = "2026-05-11T18:54:11.956Z" },
+ { url = "https://files.pythonhosted.org/packages/95/6e/00c61ea8e85b4f6d8d35e11852a1a4998fc7fafc91c6a602d1cc9c972d64/pandas-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bd3a518890b400d32f9023722dc9a9a5c969f00b415419a3c06c043f09bb5d7d", size = 11375717, upload-time = "2026-05-11T18:54:14.539Z" },
+ { url = "https://files.pythonhosted.org/packages/31/89/8fc1c268969fac43688d65fd92e67df24bd128d53cb4d2eee534cd307399/pandas-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9c39be2d709d01fa972a0cabc522389fceca4f3969332ba25a7d6c5802cf976a", size = 11828897, upload-time = "2026-05-11T18:54:17.146Z" },
+ { url = "https://files.pythonhosted.org/packages/56/3b/e7d20dea247a3e6dc0bd8a6953854afbedc03951def4e7371e05e7263e25/pandas-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4db8c527972a821cf5286b40ccc57642a39bc62e62022b42f99f8a67fca8c3a1", size = 10900855, upload-time = "2026-05-11T18:54:19.72Z" },
+ { url = "https://files.pythonhosted.org/packages/0f/54/68a0978d1ef8502b8492099beaa6e7a0c1b32e3b5d4f677f5810cb08711c/pandas-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:b2c95f8bfc1ee412bf482605d7bfd30c12d1d26bd59fdd91efeef1d4718decb1", size = 9466464, upload-time = "2026-05-11T18:54:22.754Z" },
+]
+
+[[package]]
+name = "pandocfilters"
+version = "1.5.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/70/6f/3dd4940bbe001c06a65f88e36bad298bc7a0de5036115639926b0c5c0458/pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e", size = 8454, upload-time = "2024-01-18T20:08:13.726Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc", size = 8663, upload-time = "2024-01-18T20:08:11.28Z" },
+]
+
+[[package]]
+name = "parso"
+version = "0.8.7"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/30/4b/90c937815137d43ce71ba043cd3566221e9df6b9c805f24b5d138c9d40a7/parso-0.8.7.tar.gz", hash = "sha256:eaaac4c9fdd5e9e8852dc778d2d7405897ec510f2a298071453e5e3a07914bb1", size = 401824, upload-time = "2026-05-01T23:13:02.138Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl", hash = "sha256:a8926eb2a1b915486941fdbd31e86a4baf88fe8c210f25f2f35ecec5b574ca1c", size = 107025, upload-time = "2026-05-01T23:12:58.867Z" },
+]
+
+[[package]]
+name = "pexpect"
+version = "4.9.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "ptyprocess", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload-time = "2023-11-25T09:07:26.339Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772, upload-time = "2023-11-25T06:56:14.81Z" },
+]
+
+[[package]]
+name = "pillow"
+version = "12.2.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/8c/21/c2bcdd5906101a30244eaffc1b6e6ce71a31bd0742a01eb89e660ebfac2d/pillow-12.2.0.tar.gz", hash = "sha256:a830b1a40919539d07806aa58e1b114df53ddd43213d9c8b75847eee6c0182b5", size = 46987819, upload-time = "2026-04-01T14:46:17.687Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/58/be/7482c8a5ebebbc6470b3eb791812fff7d5e0216c2be3827b30b8bb6603ed/pillow-12.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2d192a155bbcec180f8564f693e6fd9bccff5a7af9b32e2e4bf8c9c69dbad6b5", size = 5308279, upload-time = "2026-04-01T14:43:13.246Z" },
+ { url = "https://files.pythonhosted.org/packages/d8/95/0a351b9289c2b5cbde0bacd4a83ebc44023e835490a727b2a3bd60ddc0f4/pillow-12.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f3f40b3c5a968281fd507d519e444c35f0ff171237f4fdde090dd60699458421", size = 4695490, upload-time = "2026-04-01T14:43:15.584Z" },
+ { url = "https://files.pythonhosted.org/packages/de/af/4e8e6869cbed569d43c416fad3dc4ecb944cb5d9492defaed89ddd6fe871/pillow-12.2.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:03e7e372d5240cc23e9f07deca4d775c0817bffc641b01e9c3af208dbd300987", size = 6284462, upload-time = "2026-04-01T14:43:18.268Z" },
+ { url = "https://files.pythonhosted.org/packages/e9/9e/c05e19657fd57841e476be1ab46c4d501bffbadbafdc31a6d665f8b737b6/pillow-12.2.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b86024e52a1b269467a802258c25521e6d742349d760728092e1bc2d135b4d76", size = 8094744, upload-time = "2026-04-01T14:43:20.716Z" },
+ { url = "https://files.pythonhosted.org/packages/2b/54/1789c455ed10176066b6e7e6da1b01e50e36f94ba584dc68d9eebfe9156d/pillow-12.2.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7371b48c4fa448d20d2714c9a1f775a81155050d383333e0a6c15b1123dda005", size = 6398371, upload-time = "2026-04-01T14:43:23.443Z" },
+ { url = "https://files.pythonhosted.org/packages/43/e3/fdc657359e919462369869f1c9f0e973f353f9a9ee295a39b1fea8ee1a77/pillow-12.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62f5409336adb0663b7caa0da5c7d9e7bdbaae9ce761d34669420c2a801b2780", size = 7087215, upload-time = "2026-04-01T14:43:26.758Z" },
+ { url = "https://files.pythonhosted.org/packages/8b/f8/2f6825e441d5b1959d2ca5adec984210f1ec086435b0ed5f52c19b3b8a6e/pillow-12.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:01afa7cf67f74f09523699b4e88c73fb55c13346d212a59a2db1f86b0a63e8c5", size = 6509783, upload-time = "2026-04-01T14:43:29.56Z" },
+ { url = "https://files.pythonhosted.org/packages/67/f9/029a27095ad20f854f9dba026b3ea6428548316e057e6fc3545409e86651/pillow-12.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc3d34d4a8fbec3e88a79b92e5465e0f9b842b628675850d860b8bd300b159f5", size = 7212112, upload-time = "2026-04-01T14:43:32.091Z" },
+ { url = "https://files.pythonhosted.org/packages/be/42/025cfe05d1be22dbfdb4f264fe9de1ccda83f66e4fc3aac94748e784af04/pillow-12.2.0-cp312-cp312-win32.whl", hash = "sha256:58f62cc0f00fd29e64b29f4fd923ffdb3859c9f9e6105bfc37ba1d08994e8940", size = 6378489, upload-time = "2026-04-01T14:43:34.601Z" },
+ { url = "https://files.pythonhosted.org/packages/5d/7b/25a221d2c761c6a8ae21bfa3874988ff2583e19cf8a27bf2fee358df7942/pillow-12.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:7f84204dee22a783350679a0333981df803dac21a0190d706a50475e361c93f5", size = 7084129, upload-time = "2026-04-01T14:43:37.213Z" },
+ { url = "https://files.pythonhosted.org/packages/10/e1/542a474affab20fd4a0f1836cb234e8493519da6b76899e30bcc5d990b8b/pillow-12.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:af73337013e0b3b46f175e79492d96845b16126ddf79c438d7ea7ff27783a414", size = 2463612, upload-time = "2026-04-01T14:43:39.421Z" },
+ { url = "https://files.pythonhosted.org/packages/4a/01/53d10cf0dbad820a8db274d259a37ba50b88b24768ddccec07355382d5ad/pillow-12.2.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:8297651f5b5679c19968abefd6bb84d95fe30ef712eb1b2d9b2d31ca61267f4c", size = 4100837, upload-time = "2026-04-01T14:43:41.506Z" },
+ { url = "https://files.pythonhosted.org/packages/0f/98/f3a6657ecb698c937f6c76ee564882945f29b79bad496abcba0e84659ec5/pillow-12.2.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:50d8520da2a6ce0af445fa6d648c4273c3eeefbc32d7ce049f22e8b5c3daecc2", size = 4176528, upload-time = "2026-04-01T14:43:43.773Z" },
+ { url = "https://files.pythonhosted.org/packages/69/bc/8986948f05e3ea490b8442ea1c1d4d990b24a7e43d8a51b2c7d8b1dced36/pillow-12.2.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:766cef22385fa1091258ad7e6216792b156dc16d8d3fa607e7545b2b72061f1c", size = 3640401, upload-time = "2026-04-01T14:43:45.87Z" },
+ { url = "https://files.pythonhosted.org/packages/34/46/6c717baadcd62bc8ed51d238d521ab651eaa74838291bda1f86fe1f864c9/pillow-12.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5d2fd0fa6b5d9d1de415060363433f28da8b1526c1c129020435e186794b3795", size = 5308094, upload-time = "2026-04-01T14:43:48.438Z" },
+ { url = "https://files.pythonhosted.org/packages/71/43/905a14a8b17fdb1ccb58d282454490662d2cb89a6bfec26af6d3520da5ec/pillow-12.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56b25336f502b6ed02e889f4ece894a72612fe885889a6e8c4c80239ff6e5f5f", size = 4695402, upload-time = "2026-04-01T14:43:51.292Z" },
+ { url = "https://files.pythonhosted.org/packages/73/dd/42107efcb777b16fa0393317eac58f5b5cf30e8392e266e76e51cff28c3d/pillow-12.2.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f1c943e96e85df3d3478f7b691f229887e143f81fedab9b20205349ab04d73ed", size = 6280005, upload-time = "2026-04-01T14:43:54.242Z" },
+ { url = "https://files.pythonhosted.org/packages/a8/68/b93e09e5e8549019e61acf49f65b1a8530765a7f812c77a7461bca7e4494/pillow-12.2.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:03f6fab9219220f041c74aeaa2939ff0062bd5c364ba9ce037197f4c6d498cd9", size = 8090669, upload-time = "2026-04-01T14:43:57.335Z" },
+ { url = "https://files.pythonhosted.org/packages/4b/6e/3ccb54ce8ec4ddd1accd2d89004308b7b0b21c4ac3d20fa70af4760a4330/pillow-12.2.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5cdfebd752ec52bf5bb4e35d9c64b40826bc5b40a13df7c3cda20a2c03a0f5ed", size = 6395194, upload-time = "2026-04-01T14:43:59.864Z" },
+ { url = "https://files.pythonhosted.org/packages/67/ee/21d4e8536afd1a328f01b359b4d3997b291ffd35a237c877b331c1c3b71c/pillow-12.2.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eedf4b74eda2b5a4b2b2fb4c006d6295df3bf29e459e198c90ea48e130dc75c3", size = 7082423, upload-time = "2026-04-01T14:44:02.74Z" },
+ { url = "https://files.pythonhosted.org/packages/78/5f/e9f86ab0146464e8c133fe85df987ed9e77e08b29d8d35f9f9f4d6f917ba/pillow-12.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:00a2865911330191c0b818c59103b58a5e697cae67042366970a6b6f1b20b7f9", size = 6505667, upload-time = "2026-04-01T14:44:05.381Z" },
+ { url = "https://files.pythonhosted.org/packages/ed/1e/409007f56a2fdce61584fd3acbc2bbc259857d555196cedcadc68c015c82/pillow-12.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1e1757442ed87f4912397c6d35a0db6a7b52592156014706f17658ff58bbf795", size = 7208580, upload-time = "2026-04-01T14:44:08.39Z" },
+ { url = "https://files.pythonhosted.org/packages/23/c4/7349421080b12fb35414607b8871e9534546c128a11965fd4a7002ccfbee/pillow-12.2.0-cp313-cp313-win32.whl", hash = "sha256:144748b3af2d1b358d41286056d0003f47cb339b8c43a9ea42f5fea4d8c66b6e", size = 6375896, upload-time = "2026-04-01T14:44:11.197Z" },
+ { url = "https://files.pythonhosted.org/packages/3f/82/8a3739a5e470b3c6cbb1d21d315800d8e16bff503d1f16b03a4ec3212786/pillow-12.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:390ede346628ccc626e5730107cde16c42d3836b89662a115a921f28440e6a3b", size = 7081266, upload-time = "2026-04-01T14:44:13.947Z" },
+ { url = "https://files.pythonhosted.org/packages/c3/25/f968f618a062574294592f668218f8af564830ccebdd1fa6200f598e65c5/pillow-12.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:8023abc91fba39036dbce14a7d6535632f99c0b857807cbbbf21ecc9f4717f06", size = 2463508, upload-time = "2026-04-01T14:44:16.312Z" },
+ { url = "https://files.pythonhosted.org/packages/4d/a4/b342930964e3cb4dce5038ae34b0eab4653334995336cd486c5a8c25a00c/pillow-12.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:042db20a421b9bafecc4b84a8b6e444686bd9d836c7fd24542db3e7df7baad9b", size = 5309927, upload-time = "2026-04-01T14:44:18.89Z" },
+ { url = "https://files.pythonhosted.org/packages/9f/de/23198e0a65a9cf06123f5435a5d95cea62a635697f8f03d134d3f3a96151/pillow-12.2.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:dd025009355c926a84a612fecf58bb315a3f6814b17ead51a8e48d3823d9087f", size = 4698624, upload-time = "2026-04-01T14:44:21.115Z" },
+ { url = "https://files.pythonhosted.org/packages/01/a6/1265e977f17d93ea37aa28aa81bad4fa597933879fac2520d24e021c8da3/pillow-12.2.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:88ddbc66737e277852913bd1e07c150cc7bb124539f94c4e2df5344494e0a612", size = 6321252, upload-time = "2026-04-01T14:44:23.663Z" },
+ { url = "https://files.pythonhosted.org/packages/3c/83/5982eb4a285967baa70340320be9f88e57665a387e3a53a7f0db8231a0cd/pillow-12.2.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d362d1878f00c142b7e1a16e6e5e780f02be8195123f164edf7eddd911eefe7c", size = 8126550, upload-time = "2026-04-01T14:44:26.772Z" },
+ { url = "https://files.pythonhosted.org/packages/4e/48/6ffc514adce69f6050d0753b1a18fd920fce8cac87620d5a31231b04bfc5/pillow-12.2.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2c727a6d53cb0018aadd8018c2b938376af27914a68a492f59dfcaca650d5eea", size = 6433114, upload-time = "2026-04-01T14:44:29.615Z" },
+ { url = "https://files.pythonhosted.org/packages/36/a3/f9a77144231fb8d40ee27107b4463e205fa4677e2ca2548e14da5cf18dce/pillow-12.2.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:efd8c21c98c5cc60653bcb311bef2ce0401642b7ce9d09e03a7da87c878289d4", size = 7115667, upload-time = "2026-04-01T14:44:32.773Z" },
+ { url = "https://files.pythonhosted.org/packages/c1/fc/ac4ee3041e7d5a565e1c4fd72a113f03b6394cc72ab7089d27608f8aaccb/pillow-12.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9f08483a632889536b8139663db60f6724bfcb443c96f1b18855860d7d5c0fd4", size = 6538966, upload-time = "2026-04-01T14:44:35.252Z" },
+ { url = "https://files.pythonhosted.org/packages/c0/a8/27fb307055087f3668f6d0a8ccb636e7431d56ed0750e07a60547b1e083e/pillow-12.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dac8d77255a37e81a2efcbd1fc05f1c15ee82200e6c240d7e127e25e365c39ea", size = 7238241, upload-time = "2026-04-01T14:44:37.875Z" },
+ { url = "https://files.pythonhosted.org/packages/ad/4b/926ab182c07fccae9fcb120043464e1ff1564775ec8864f21a0ebce6ac25/pillow-12.2.0-cp313-cp313t-win32.whl", hash = "sha256:ee3120ae9dff32f121610bb08e4313be87e03efeadfc6c0d18f89127e24d0c24", size = 6379592, upload-time = "2026-04-01T14:44:40.336Z" },
+ { url = "https://files.pythonhosted.org/packages/c2/c4/f9e476451a098181b30050cc4c9a3556b64c02cf6497ea421ac047e89e4b/pillow-12.2.0-cp313-cp313t-win_amd64.whl", hash = "sha256:325ca0528c6788d2a6c3d40e3568639398137346c3d6e66bb61db96b96511c98", size = 7085542, upload-time = "2026-04-01T14:44:43.251Z" },
+ { url = "https://files.pythonhosted.org/packages/00/a4/285f12aeacbe2d6dc36c407dfbbe9e96d4a80b0fb710a337f6d2ad978c75/pillow-12.2.0-cp313-cp313t-win_arm64.whl", hash = "sha256:2e5a76d03a6c6dcef67edabda7a52494afa4035021a79c8558e14af25313d453", size = 2465765, upload-time = "2026-04-01T14:44:45.996Z" },
+ { url = "https://files.pythonhosted.org/packages/bf/98/4595daa2365416a86cb0d495248a393dfc84e96d62ad080c8546256cb9c0/pillow-12.2.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:3adc9215e8be0448ed6e814966ecf3d9952f0ea40eb14e89a102b87f450660d8", size = 4100848, upload-time = "2026-04-01T14:44:48.48Z" },
+ { url = "https://files.pythonhosted.org/packages/0b/79/40184d464cf89f6663e18dfcf7ca21aae2491fff1a16127681bf1fa9b8cf/pillow-12.2.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:6a9adfc6d24b10f89588096364cc726174118c62130c817c2837c60cf08a392b", size = 4176515, upload-time = "2026-04-01T14:44:51.353Z" },
+ { url = "https://files.pythonhosted.org/packages/b0/63/703f86fd4c422a9cf722833670f4f71418fb116b2853ff7da722ea43f184/pillow-12.2.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:6a6e67ea2e6feda684ed370f9a1c52e7a243631c025ba42149a2cc5934dec295", size = 3640159, upload-time = "2026-04-01T14:44:53.588Z" },
+ { url = "https://files.pythonhosted.org/packages/71/e0/fb22f797187d0be2270f83500aab851536101b254bfa1eae10795709d283/pillow-12.2.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2bb4a8d594eacdfc59d9e5ad972aa8afdd48d584ffd5f13a937a664c3e7db0ed", size = 5312185, upload-time = "2026-04-01T14:44:56.039Z" },
+ { url = "https://files.pythonhosted.org/packages/ba/8c/1a9e46228571de18f8e28f16fabdfc20212a5d019f3e3303452b3f0a580d/pillow-12.2.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:80b2da48193b2f33ed0c32c38140f9d3186583ce7d516526d462645fd98660ae", size = 4695386, upload-time = "2026-04-01T14:44:58.663Z" },
+ { url = "https://files.pythonhosted.org/packages/70/62/98f6b7f0c88b9addd0e87c217ded307b36be024d4ff8869a812b241d1345/pillow-12.2.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22db17c68434de69d8ecfc2fe821569195c0c373b25cccb9cbdacf2c6e53c601", size = 6280384, upload-time = "2026-04-01T14:45:01.5Z" },
+ { url = "https://files.pythonhosted.org/packages/5e/03/688747d2e91cfbe0e64f316cd2e8005698f76ada3130d0194664174fa5de/pillow-12.2.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7b14cc0106cd9aecda615dd6903840a058b4700fcb817687d0ee4fc8b6e389be", size = 8091599, upload-time = "2026-04-01T14:45:04.5Z" },
+ { url = "https://files.pythonhosted.org/packages/f6/35/577e22b936fcdd66537329b33af0b4ccfefaeabd8aec04b266528cddb33c/pillow-12.2.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8cbeb542b2ebc6fcdacabf8aca8c1a97c9b3ad3927d46b8723f9d4f033288a0f", size = 6396021, upload-time = "2026-04-01T14:45:07.117Z" },
+ { url = "https://files.pythonhosted.org/packages/11/8d/d2532ad2a603ca2b93ad9f5135732124e57811d0168155852f37fbce2458/pillow-12.2.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4bfd07bc812fbd20395212969e41931001fd59eb55a60658b0e5710872e95286", size = 7083360, upload-time = "2026-04-01T14:45:09.763Z" },
+ { url = "https://files.pythonhosted.org/packages/5e/26/d325f9f56c7e039034897e7380e9cc202b1e368bfd04d4cbe6a441f02885/pillow-12.2.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9aba9a17b623ef750a4d11b742cbafffeb48a869821252b30ee21b5e91392c50", size = 6507628, upload-time = "2026-04-01T14:45:12.378Z" },
+ { url = "https://files.pythonhosted.org/packages/5f/f7/769d5632ffb0988f1c5e7660b3e731e30f7f8ec4318e94d0a5d674eb65a4/pillow-12.2.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:deede7c263feb25dba4e82ea23058a235dcc2fe1f6021025dc71f2b618e26104", size = 7209321, upload-time = "2026-04-01T14:45:15.122Z" },
+ { url = "https://files.pythonhosted.org/packages/6a/7a/c253e3c645cd47f1aceea6a8bacdba9991bf45bb7dfe927f7c893e89c93c/pillow-12.2.0-cp314-cp314-win32.whl", hash = "sha256:632ff19b2778e43162304d50da0181ce24ac5bb8180122cbe1bf4673428328c7", size = 6479723, upload-time = "2026-04-01T14:45:17.797Z" },
+ { url = "https://files.pythonhosted.org/packages/cd/8b/601e6566b957ca50e28725cb6c355c59c2c8609751efbecd980db44e0349/pillow-12.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:4e6c62e9d237e9b65fac06857d511e90d8461a32adcc1b9065ea0c0fa3a28150", size = 7217400, upload-time = "2026-04-01T14:45:20.529Z" },
+ { url = "https://files.pythonhosted.org/packages/d6/94/220e46c73065c3e2951bb91c11a1fb636c8c9ad427ac3ce7d7f3359b9b2f/pillow-12.2.0-cp314-cp314-win_arm64.whl", hash = "sha256:b1c1fbd8a5a1af3412a0810d060a78b5136ec0836c8a4ef9aa11807f2a22f4e1", size = 2554835, upload-time = "2026-04-01T14:45:23.162Z" },
+ { url = "https://files.pythonhosted.org/packages/b6/ab/1b426a3974cb0e7da5c29ccff4807871d48110933a57207b5a676cccc155/pillow-12.2.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:57850958fe9c751670e49b2cecf6294acc99e562531f4bd317fa5ddee2068463", size = 5314225, upload-time = "2026-04-01T14:45:25.637Z" },
+ { url = "https://files.pythonhosted.org/packages/19/1e/dce46f371be2438eecfee2a1960ee2a243bbe5e961890146d2dee1ff0f12/pillow-12.2.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d5d38f1411c0ed9f97bcb49b7bd59b6b7c314e0e27420e34d99d844b9ce3b6f3", size = 4698541, upload-time = "2026-04-01T14:45:28.355Z" },
+ { url = "https://files.pythonhosted.org/packages/55/c3/7fbecf70adb3a0c33b77a300dc52e424dc22ad8cdc06557a2e49523b703d/pillow-12.2.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5c0a9f29ca8e79f09de89293f82fc9b0270bb4af1d58bc98f540cc4aedf03166", size = 6322251, upload-time = "2026-04-01T14:45:30.924Z" },
+ { url = "https://files.pythonhosted.org/packages/1c/3c/7fbc17cfb7e4fe0ef1642e0abc17fc6c94c9f7a16be41498e12e2ba60408/pillow-12.2.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1610dd6c61621ae1cf811bef44d77e149ce3f7b95afe66a4512f8c59f25d9ebe", size = 8127807, upload-time = "2026-04-01T14:45:33.908Z" },
+ { url = "https://files.pythonhosted.org/packages/ff/c3/a8ae14d6defd2e448493ff512fae903b1e9bd40b72efb6ec55ce0048c8ce/pillow-12.2.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a34329707af4f73cf1782a36cd2289c0368880654a2c11f027bcee9052d35dd", size = 6433935, upload-time = "2026-04-01T14:45:36.623Z" },
+ { url = "https://files.pythonhosted.org/packages/6e/32/2880fb3a074847ac159d8f902cb43278a61e85f681661e7419e6596803ed/pillow-12.2.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e9c4f5b3c546fa3458a29ab22646c1c6c787ea8f5ef51300e5a60300736905e", size = 7116720, upload-time = "2026-04-01T14:45:39.258Z" },
+ { url = "https://files.pythonhosted.org/packages/46/87/495cc9c30e0129501643f24d320076f4cc54f718341df18cc70ec94c44e1/pillow-12.2.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:fb043ee2f06b41473269765c2feae53fc2e2fbf96e5e22ca94fb5ad677856f06", size = 6540498, upload-time = "2026-04-01T14:45:41.879Z" },
+ { url = "https://files.pythonhosted.org/packages/18/53/773f5edca692009d883a72211b60fdaf8871cbef075eaa9d577f0a2f989e/pillow-12.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f278f034eb75b4e8a13a54a876cc4a5ab39173d2cdd93a638e1b467fc545ac43", size = 7239413, upload-time = "2026-04-01T14:45:44.705Z" },
+ { url = "https://files.pythonhosted.org/packages/c9/e4/4b64a97d71b2a83158134abbb2f5bd3f8a2ea691361282f010998f339ec7/pillow-12.2.0-cp314-cp314t-win32.whl", hash = "sha256:6bb77b2dcb06b20f9f4b4a8454caa581cd4dd0643a08bacf821216a16d9c8354", size = 6482084, upload-time = "2026-04-01T14:45:47.568Z" },
+ { url = "https://files.pythonhosted.org/packages/ba/13/306d275efd3a3453f72114b7431c877d10b1154014c1ebbedd067770d629/pillow-12.2.0-cp314-cp314t-win_amd64.whl", hash = "sha256:6562ace0d3fb5f20ed7290f1f929cae41b25ae29528f2af1722966a0a02e2aa1", size = 7225152, upload-time = "2026-04-01T14:45:50.032Z" },
+ { url = "https://files.pythonhosted.org/packages/ff/6e/cf826fae916b8658848d7b9f38d88da6396895c676e8086fc0988073aaf8/pillow-12.2.0-cp314-cp314t-win_arm64.whl", hash = "sha256:aa88ccfe4e32d362816319ed727a004423aab09c5cea43c01a4b435643fa34eb", size = 2556579, upload-time = "2026-04-01T14:45:52.529Z" },
+]
+
+[[package]]
+name = "platformdirs"
+version = "4.9.6"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/9f/4a/0883b8e3802965322523f0b200ecf33d31f10991d0401162f4b23c698b42/platformdirs-4.9.6.tar.gz", hash = "sha256:3bfa75b0ad0db84096ae777218481852c0ebc6c727b3168c1b9e0118e458cf0a", size = 29400, upload-time = "2026-04-09T00:04:10.812Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl", hash = "sha256:e61adb1d5e5cb3441b4b7710bea7e4c12250ca49439228cc1021c00dcfac0917", size = 21348, upload-time = "2026-04-09T00:04:09.463Z" },
+]
+
+[[package]]
+name = "pluggy"
+version = "1.6.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" },
+]
+
+[[package]]
+name = "prometheus-client"
+version = "0.25.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/1b/fb/d9aa83ffe43ce1f19e557c0971d04b90561b0cfd50762aafb01968285553/prometheus_client-0.25.0.tar.gz", hash = "sha256:5e373b75c31afb3c86f1a52fa1ad470c9aace18082d39ec0d2f918d11cc9ba28", size = 86035, upload-time = "2026-04-09T19:53:42.359Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/8d/9b/d4b1e644385499c8346fa9b622a3f030dce14cd6ef8a1871c221a17a67e7/prometheus_client-0.25.0-py3-none-any.whl", hash = "sha256:d5aec89e349a6ec230805d0df882f3807f74fd6c1a2fa86864e3c2279059fed1", size = 64154, upload-time = "2026-04-09T19:53:41.324Z" },
+]
+
+[[package]]
+name = "prompt-toolkit"
+version = "3.0.52"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "wcwidth" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/a1/96/06e01a7b38dce6fe1db213e061a4602dd6032a8a97ef6c1a862537732421/prompt_toolkit-3.0.52.tar.gz", hash = "sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855", size = 434198, upload-time = "2025-08-27T15:24:02.057Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl", hash = "sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955", size = 391431, upload-time = "2025-08-27T15:23:59.498Z" },
+]
+
+[[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, upload-time = "2026-05-08T21:02:12.199Z" }
+wheels = [
+ { 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, upload-time = "2026-05-08T21:00:11.277Z" },
+ { 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, upload-time = "2026-05-08T21:00:12.604Z" },
+ { 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, upload-time = "2026-05-08T21:00:13.935Z" },
+ { 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, upload-time = "2026-05-08T21:00:15.526Z" },
+ { 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, upload-time = "2026-05-08T21:00:16.824Z" },
+ { 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, upload-time = "2026-05-08T21:00:18.362Z" },
+ { 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, upload-time = "2026-05-08T21:00:19.692Z" },
+ { 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, upload-time = "2026-05-08T21:00:21.155Z" },
+ { 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, upload-time = "2026-05-08T21:00:22.713Z" },
+ { 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, upload-time = "2026-05-08T21:00:24.001Z" },
+ { 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, upload-time = "2026-05-08T21:00:25.545Z" },
+ { 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, upload-time = "2026-05-08T21:00:27.186Z" },
+ { 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, upload-time = "2026-05-08T21:00:28.8Z" },
+ { 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, upload-time = "2026-05-08T21:00:30.098Z" },
+ { url = "https://files.pythonhosted.org/packages/cf/74/66bd798b5b3be70aa1b391f5cc9d6a0a5532d7fd3b19ec0b213e72e6ad9d/propcache-0.5.2-cp312-cp312-win32.whl", hash = "sha256:8c7972d8f193740d9175f0998ab38717e6cd322d5935c5b0fef8c0d323fd9031", size = 39018, upload-time = "2026-05-08T21:00:31.622Z" },
+ { url = "https://files.pythonhosted.org/packages/61/7c/5c0d34aa3024694d6dcb9271cdbdd08c4e47c1c0ad95ec7e7bc74cdea145/propcache-0.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:d9ee8826a7d47863a08ac44e1a5f611a462eefc3a194b492da242128bec75b42", size = 42322, upload-time = "2026-05-08T21:00:32.918Z" },
+ { url = "https://files.pythonhosted.org/packages/4d/91/875812f1a3feb20ceba818ef39fbe4d92f1081e04ac815c822496d0d038b/propcache-0.5.2-cp312-cp312-win_arm64.whl", hash = "sha256:2800a4a8ead6b28cccd1ec54b59346f0def7922ee1c7598e8499c733cfbb7c84", size = 38172, upload-time = "2026-05-08T21:00:35.124Z" },
+ { 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, upload-time = "2026-05-08T21:00:36.355Z" },
+ { 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, upload-time = "2026-05-08T21:00:38.072Z" },
+ { 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, upload-time = "2026-05-08T21:00:39.319Z" },
+ { 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, upload-time = "2026-05-08T21:00:40.621Z" },
+ { 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, upload-time = "2026-05-08T21:00:41.775Z" },
+ { 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, upload-time = "2026-05-08T21:00:43.018Z" },
+ { 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, upload-time = "2026-05-08T21:00:44.507Z" },
+ { 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, upload-time = "2026-05-08T21:00:45.796Z" },
+ { 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, upload-time = "2026-05-08T21:00:47.093Z" },
+ { 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, upload-time = "2026-05-08T21:00:48.376Z" },
+ { 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, upload-time = "2026-05-08T21:00:49.954Z" },
+ { 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, upload-time = "2026-05-08T21:00:51.281Z" },
+ { 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, upload-time = "2026-05-08T21:00:52.602Z" },
+ { 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, upload-time = "2026-05-08T21:00:54.303Z" },
+ { url = "https://files.pythonhosted.org/packages/bd/3b/484a3a65fc9f9f60c41dcd17b428bace5389544e2c680994534a20755066/propcache-0.5.2-cp313-cp313-win32.whl", hash = "sha256:f156a3529f38063b6dbaf356e15602a7f95f8055b1295a438433a6386f10463d", size = 38621, upload-time = "2026-05-08T21:00:55.808Z" },
+ { url = "https://files.pythonhosted.org/packages/1c/fd/3f0f10dba4dabad3bf53102be007abf55481067952bde0fdddff439e7c61/propcache-0.5.2-cp313-cp313-win_amd64.whl", hash = "sha256:dfed59d0a5aeb01e242e66ff0300bc4a265a7c05f612d30016f0b60b1017d757", size = 41649, upload-time = "2026-05-08T21:00:57.061Z" },
+ { url = "https://files.pythonhosted.org/packages/90/ec/6ce619cc32bb500a482f811f9cd509368b4e58e638d13f2c68f370d6b475/propcache-0.5.2-cp313-cp313-win_arm64.whl", hash = "sha256:ba338430e87ceb9c8f0cf754de38a9860560261e56c00376debd628698a7364f", size = 37636, upload-time = "2026-05-08T21:00:58.646Z" },
+ { 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, upload-time = "2026-05-08T21:00:59.889Z" },
+ { 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, upload-time = "2026-05-08T21:01:01.195Z" },
+ { 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, upload-time = "2026-05-08T21:01:02.941Z" },
+ { 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, upload-time = "2026-05-08T21:01:04.475Z" },
+ { 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, upload-time = "2026-05-08T21:01:05.959Z" },
+ { 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, upload-time = "2026-05-08T21:01:07.228Z" },
+ { 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, upload-time = "2026-05-08T21:01:08.514Z" },
+ { 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, upload-time = "2026-05-08T21:01:09.874Z" },
+ { 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, upload-time = "2026-05-08T21:01:11.132Z" },
+ { 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, upload-time = "2026-05-08T21:01:12.387Z" },
+ { 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, upload-time = "2026-05-08T21:01:13.676Z" },
+ { 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, upload-time = "2026-05-08T21:01:14.936Z" },
+ { 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, upload-time = "2026-05-08T21:01:16.281Z" },
+ { 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, upload-time = "2026-05-08T21:01:17.57Z" },
+ { url = "https://files.pythonhosted.org/packages/0a/aa/50fb0b5d3968b61a510926ff8b8465f1d6e976b3ab74496d7a4b9fc42515/propcache-0.5.2-cp313-cp313t-win32.whl", hash = "sha256:72d61e16dd78228b58c5d47be830ff3da7e5f139abdf0aef9d86cde1c5cf2191", size = 42546, upload-time = "2026-05-08T21:01:18.946Z" },
+ { url = "https://files.pythonhosted.org/packages/ae/4c/0ddbae64321bd4a95bcbfc19307238016b5b1fee645c84626c8d539e5b74/propcache-0.5.2-cp313-cp313t-win_amd64.whl", hash = "sha256:0958834041a0166d343b8d2cedcd8bcbaeb4fdbe0cf08320c5379f143c3be6e7", size = 46330, upload-time = "2026-05-08T21:01:20.162Z" },
+ { url = "https://files.pythonhosted.org/packages/00/d9/9cddc8efb78d8af264c5ec9f6d10b62f57c515feda8d321595f56010fb23/propcache-0.5.2-cp313-cp313t-win_arm64.whl", hash = "sha256:6de8bd93ddde9b992cf2b2e0d796d501a19026b5b9fd87356d7d0779531a8d96", size = 40521, upload-time = "2026-05-08T21:01:21.399Z" },
+ { 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, upload-time = "2026-05-08T21:01:22.683Z" },
+ { 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, upload-time = "2026-05-08T21:01:23.986Z" },
+ { 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, upload-time = "2026-05-08T21:01:25.305Z" },
+ { 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, upload-time = "2026-05-08T21:01:26.545Z" },
+ { 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, upload-time = "2026-05-08T21:01:27.937Z" },
+ { 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, upload-time = "2026-05-08T21:01:29.484Z" },
+ { 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, upload-time = "2026-05-08T21:01:31.068Z" },
+ { 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, upload-time = "2026-05-08T21:01:32.374Z" },
+ { 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, upload-time = "2026-05-08T21:01:33.67Z" },
+ { 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, upload-time = "2026-05-08T21:01:34.915Z" },
+ { 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, upload-time = "2026-05-08T21:01:36.231Z" },
+ { 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, upload-time = "2026-05-08T21:01:37.545Z" },
+ { 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, upload-time = "2026-05-08T21:01:38.83Z" },
+ { 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, upload-time = "2026-05-08T21:01:40.415Z" },
+ { url = "https://files.pythonhosted.org/packages/95/ca/bbfe9b910ce57dde8bb4876b4520fc02a4e89497c10de26be936758a3aaa/propcache-0.5.2-cp314-cp314-win32.whl", hash = "sha256:cc6fc3cc62e8501d3ed62894425040d2728ecddb1ed072737a5c70bd537aa9f0", size = 39436, upload-time = "2026-05-08T21:01:41.654Z" },
+ { url = "https://files.pythonhosted.org/packages/61/d2/45c9defbaa1ea297035d9d4cce9e8f80daafbf19319c6007f157c6256ea9/propcache-0.5.2-cp314-cp314-win_amd64.whl", hash = "sha256:81e3a30b0bb60caa22033dd0f8a3618d1d67356212514f62c57db75cb0ef410c", size = 42373, upload-time = "2026-05-08T21:01:43.041Z" },
+ { url = "https://files.pythonhosted.org/packages/44/68/9ea5103f41d5217d7d6ec24db90018e23aebec070c3f9a6e54d12b841fd8/propcache-0.5.2-cp314-cp314-win_arm64.whl", hash = "sha256:0d2c9bf8528f135dbb805ce027567e09164f7efa51a2be07458a2c0420f292d0", size = 38554, upload-time = "2026-05-08T21:01:44.336Z" },
+ { 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, upload-time = "2026-05-08T21:01:45.883Z" },
+ { 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, upload-time = "2026-05-08T21:01:47.307Z" },
+ { 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, upload-time = "2026-05-08T21:01:48.573Z" },
+ { 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, upload-time = "2026-05-08T21:01:49.903Z" },
+ { 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, upload-time = "2026-05-08T21:01:51.204Z" },
+ { 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, upload-time = "2026-05-08T21:01:52.539Z" },
+ { 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, upload-time = "2026-05-08T21:01:53.847Z" },
+ { 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, upload-time = "2026-05-08T21:01:55.179Z" },
+ { 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, upload-time = "2026-05-08T21:01:57.489Z" },
+ { 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, upload-time = "2026-05-08T21:01:58.736Z" },
+ { 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, upload-time = "2026-05-08T21:02:00.228Z" },
+ { 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, upload-time = "2026-05-08T21:02:01.888Z" },
+ { 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, upload-time = "2026-05-08T21:02:03.484Z" },
+ { 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, upload-time = "2026-05-08T21:02:04.745Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/07/127e8b0bacfb325396196f9d976a22453049b89b9b2b08477cc3145faa44/propcache-0.5.2-cp314-cp314t-win32.whl", hash = "sha256:2d7aa89ebca5acc98cba9d1472d976e394782f587bad6661003602a619fd1821", size = 43813, upload-time = "2026-05-08T21:02:06.025Z" },
+ { url = "https://files.pythonhosted.org/packages/88/fb/46dad6c0ae49ed230ab1b16c890c2b6314e2403e6c412976f4a72d64a527/propcache-0.5.2-cp314-cp314t-win_amd64.whl", hash = "sha256:d447bb0b3054be5818458fbb171208b1d9ff11eba14e18ca18b90cbb45767370", size = 47764, upload-time = "2026-05-08T21:02:07.353Z" },
+ { url = "https://files.pythonhosted.org/packages/e7/c4/a47d0a63aa309d10d59ede6e9d4cff03a344a79d1f0f4cd0cd74997b53e0/propcache-0.5.2-cp314-cp314t-win_arm64.whl", hash = "sha256:fe67a3d11cd9b4efabfa45c3d00ffba2b26811442a73a581a94b67c2b5faccf6", size = 41140, upload-time = "2026-05-08T21:02:09.065Z" },
+ { url = "https://files.pythonhosted.org/packages/3a/ed/1cdcab6ba3d6ab7feca11fc14f0eeea80755bb53ef4e892079f31b10a25f/propcache-0.5.2-py3-none-any.whl", hash = "sha256:be1ddfcbb376e3de5d2e2db1d58d6d67463e6b4f9f040c000de8e300295465fe", size = 14036, upload-time = "2026-05-08T21:02:10.673Z" },
+]
+
+[[package]]
+name = "psutil"
+version = "7.2.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/aa/c6/d1ddf4abb55e93cebc4f2ed8b5d6dbad109ecb8d63748dd2b20ab5e57ebe/psutil-7.2.2.tar.gz", hash = "sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372", size = 493740, upload-time = "2026-01-28T18:14:54.428Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/51/08/510cbdb69c25a96f4ae523f733cdc963ae654904e8db864c07585ef99875/psutil-7.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2edccc433cbfa046b980b0df0171cd25bcaeb3a68fe9022db0979e7aa74a826b", size = 130595, upload-time = "2026-01-28T18:14:57.293Z" },
+ { url = "https://files.pythonhosted.org/packages/d6/f5/97baea3fe7a5a9af7436301f85490905379b1c6f2dd51fe3ecf24b4c5fbf/psutil-7.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e78c8603dcd9a04c7364f1a3e670cea95d51ee865e4efb3556a3a63adef958ea", size = 131082, upload-time = "2026-01-28T18:14:59.732Z" },
+ { url = "https://files.pythonhosted.org/packages/37/d6/246513fbf9fa174af531f28412297dd05241d97a75911ac8febefa1a53c6/psutil-7.2.2-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1a571f2330c966c62aeda00dd24620425d4b0cc86881c89861fbc04549e5dc63", size = 181476, upload-time = "2026-01-28T18:15:01.884Z" },
+ { url = "https://files.pythonhosted.org/packages/b8/b5/9182c9af3836cca61696dabe4fd1304e17bc56cb62f17439e1154f225dd3/psutil-7.2.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:917e891983ca3c1887b4ef36447b1e0873e70c933afc831c6b6da078ba474312", size = 184062, upload-time = "2026-01-28T18:15:04.436Z" },
+ { url = "https://files.pythonhosted.org/packages/16/ba/0756dca669f5a9300d0cbcbfae9a4c30e446dfc7440ffe43ded5724bfd93/psutil-7.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:ab486563df44c17f5173621c7b198955bd6b613fb87c71c161f827d3fb149a9b", size = 139893, upload-time = "2026-01-28T18:15:06.378Z" },
+ { url = "https://files.pythonhosted.org/packages/1c/61/8fa0e26f33623b49949346de05ec1ddaad02ed8ba64af45f40a147dbfa97/psutil-7.2.2-cp313-cp313t-win_arm64.whl", hash = "sha256:ae0aefdd8796a7737eccea863f80f81e468a1e4cf14d926bd9b6f5f2d5f90ca9", size = 135589, upload-time = "2026-01-28T18:15:08.03Z" },
+ { url = "https://files.pythonhosted.org/packages/81/69/ef179ab5ca24f32acc1dac0c247fd6a13b501fd5534dbae0e05a1c48b66d/psutil-7.2.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:eed63d3b4d62449571547b60578c5b2c4bcccc5387148db46e0c2313dad0ee00", size = 130664, upload-time = "2026-01-28T18:15:09.469Z" },
+ { url = "https://files.pythonhosted.org/packages/7b/64/665248b557a236d3fa9efc378d60d95ef56dd0a490c2cd37dafc7660d4a9/psutil-7.2.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7b6d09433a10592ce39b13d7be5a54fbac1d1228ed29abc880fb23df7cb694c9", size = 131087, upload-time = "2026-01-28T18:15:11.724Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/2e/e6782744700d6759ebce3043dcfa661fb61e2fb752b91cdeae9af12c2178/psutil-7.2.2-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fa4ecf83bcdf6e6c8f4449aff98eefb5d0604bf88cb883d7da3d8d2d909546a", size = 182383, upload-time = "2026-01-28T18:15:13.445Z" },
+ { url = "https://files.pythonhosted.org/packages/57/49/0a41cefd10cb7505cdc04dab3eacf24c0c2cb158a998b8c7b1d27ee2c1f5/psutil-7.2.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e452c464a02e7dc7822a05d25db4cde564444a67e58539a00f929c51eddda0cf", size = 185210, upload-time = "2026-01-28T18:15:16.002Z" },
+ { url = "https://files.pythonhosted.org/packages/dd/2c/ff9bfb544f283ba5f83ba725a3c5fec6d6b10b8f27ac1dc641c473dc390d/psutil-7.2.2-cp314-cp314t-win_amd64.whl", hash = "sha256:c7663d4e37f13e884d13994247449e9f8f574bc4655d509c3b95e9ec9e2b9dc1", size = 141228, upload-time = "2026-01-28T18:15:18.385Z" },
+ { url = "https://files.pythonhosted.org/packages/f2/fc/f8d9c31db14fcec13748d373e668bc3bed94d9077dbc17fb0eebc073233c/psutil-7.2.2-cp314-cp314t-win_arm64.whl", hash = "sha256:11fe5a4f613759764e79c65cf11ebdf26e33d6dd34336f8a337aa2996d71c841", size = 136284, upload-time = "2026-01-28T18:15:19.912Z" },
+ { url = "https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486", size = 129090, upload-time = "2026-01-28T18:15:22.168Z" },
+ { url = "https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979", size = 129859, upload-time = "2026-01-28T18:15:23.795Z" },
+ { url = "https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9", size = 155560, upload-time = "2026-01-28T18:15:25.976Z" },
+ { url = "https://files.pythonhosted.org/packages/63/65/37648c0c158dc222aba51c089eb3bdfa238e621674dc42d48706e639204f/psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0726cecd84f9474419d67252add4ac0cd9811b04d61123054b9fb6f57df6e9e", size = 156997, upload-time = "2026-01-28T18:15:27.794Z" },
+ { url = "https://files.pythonhosted.org/packages/8e/13/125093eadae863ce03c6ffdbae9929430d116a246ef69866dad94da3bfbc/psutil-7.2.2-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd04ef36b4a6d599bbdb225dd1d3f51e00105f6d48a28f006da7f9822f2606d8", size = 148972, upload-time = "2026-01-28T18:15:29.342Z" },
+ { url = "https://files.pythonhosted.org/packages/04/78/0acd37ca84ce3ddffaa92ef0f571e073faa6d8ff1f0559ab1272188ea2be/psutil-7.2.2-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b58fabe35e80b264a4e3bb23e6b96f9e45a3df7fb7eed419ac0e5947c61e47cc", size = 148266, upload-time = "2026-01-28T18:15:31.597Z" },
+ { url = "https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl", hash = "sha256:eb7e81434c8d223ec4a219b5fc1c47d0417b12be7ea866e24fb5ad6e84b3d988", size = 137737, upload-time = "2026-01-28T18:15:33.849Z" },
+ { url = "https://files.pythonhosted.org/packages/8c/c7/7bb2e321574b10df20cbde462a94e2b71d05f9bbda251ef27d104668306a/psutil-7.2.2-cp37-abi3-win_arm64.whl", hash = "sha256:8c233660f575a5a89e6d4cb65d9f938126312bca76d8fe087b947b3a1aaac9ee", size = 134617, upload-time = "2026-01-28T18:15:36.514Z" },
+]
+
+[[package]]
+name = "ptyprocess"
+version = "0.7.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762, upload-time = "2020-12-28T15:15:30.155Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993, upload-time = "2020-12-28T15:15:28.35Z" },
+]
+
+[[package]]
+name = "pure-eval"
+version = "0.2.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752, upload-time = "2024-07-21T12:58:21.801Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842, upload-time = "2024-07-21T12:58:20.04Z" },
+]
+
+[[package]]
+name = "pybind11"
+version = "3.0.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/cc/f0/35145a3c3baffeef55d4b8324caa33abaa8fa56ab345ecd4b2211d09163e/pybind11-3.0.4.tar.gz", hash = "sha256:3286b59c8a774b9ee650169302dd5a4eedc30a8617905a0560dd8ee44775130c", size = 589533, upload-time = "2026-04-19T03:08:15.925Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b3/06/c3a23c9a0263b136c519f033a58d4641e73065fefc7754e9667ec206d992/pybind11-3.0.4-py3-none-any.whl", hash = "sha256:961720ee652da51d531b7b2451a6bd2bc042b0106e6d9baa48ecb7d58034ce63", size = 314166, upload-time = "2026-04-19T03:08:14.091Z" },
+]
+
+[[package]]
+name = "pycparser"
+version = "3.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" },
+]
+
+[[package]]
+name = "pygments"
+version = "2.20.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" },
+]
+
+[[package]]
+name = "pyparsing"
+version = "3.3.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" },
+]
+
+[[package]]
+name = "pytest"
+version = "9.0.3"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+ { name = "iniconfig" },
+ { name = "packaging" },
+ { name = "pluggy" },
+ { name = "pygments" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/7d/0d/549bd94f1a0a402dc8cf64563a117c0f3765662e2e668477624baeec44d5/pytest-9.0.3.tar.gz", hash = "sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c", size = 1572165, upload-time = "2026-04-07T17:16:18.027Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl", hash = "sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9", size = 375249, upload-time = "2026-04-07T17:16:16.13Z" },
+]
+
+[[package]]
+name = "python-dateutil"
+version = "2.9.0.post0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "six" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" },
+]
+
+[[package]]
+name = "python-json-logger"
+version = "4.1.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f7/ff/3cc9165fd44106973cd7ac9facb674a65ed853494592541d339bdc9a30eb/python_json_logger-4.1.0.tar.gz", hash = "sha256:b396b9e3ed782b09ff9d6e4f1683d46c83ad0d35d2e407c09a9ebbf038f88195", size = 17573, upload-time = "2026-03-29T04:39:56.805Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/27/be/0631a861af4d1c875f096c07d34e9a63639560a717130e7a87cbc82b7e3f/python_json_logger-4.1.0-py3-none-any.whl", hash = "sha256:132994765cf75bf44554be9aa49b06ef2345d23661a96720262716438141b6b2", size = 15021, upload-time = "2026-03-29T04:39:55.266Z" },
+]
+
+[[package]]
+name = "pytz"
+version = "2026.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/ff/46/dd499ec9038423421951e4fad73051febaa13d2df82b4064f87af8b8c0c3/pytz-2026.2.tar.gz", hash = "sha256:0e60b47b29f21574376f218fe21abc009894a2321ea16c6754f3cad6eb7cdd6a", size = 320861, upload-time = "2026-05-04T01:35:29.667Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ec/dd/96da98f892250475bdf2328112d7468abdd4acc7b902b6af23f4ed958ea0/pytz-2026.2-py2.py3-none-any.whl", hash = "sha256:04156e608bee23d3792fd45c94ae47fae1036688e75032eea2e3bf0323d1f126", size = 510141, upload-time = "2026-05-04T01:35:27.408Z" },
+]
+
+[[package]]
+name = "pywinpty"
+version = "3.0.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f7/54/37c7370ba91f579235049dc26cd2c5e657d2a943e01820844ffc81f32176/pywinpty-3.0.3.tar.gz", hash = "sha256:523441dc34d231fb361b4b00f8c99d3f16de02f5005fd544a0183112bcc22412", size = 31309, upload-time = "2026-02-04T21:51:09.524Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/7c/d4/aeb5e1784d2c5bff6e189138a9ca91a090117459cea0c30378e1f2db3d54/pywinpty-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:c9081df0e49ffa86d15db4a6ba61530630e48707f987df42c9d3313537e81fc0", size = 2113098, upload-time = "2026-02-04T21:54:37.711Z" },
+ { url = "https://files.pythonhosted.org/packages/b9/53/7278223c493ccfe4883239cf06c823c56460a8010e0fc778eef67858dc14/pywinpty-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:15e79d870e18b678fb8a5a6105fd38496b55697c66e6fc0378236026bc4d59e9", size = 234901, upload-time = "2026-02-04T21:53:31.35Z" },
+ { url = "https://files.pythonhosted.org/packages/e5/cb/58d6ed3fd429c96a90ef01ac9a617af10a6d41469219c25e7dc162abbb71/pywinpty-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9c91dbb026050c77bdcef964e63a4f10f01a639113c4d3658332614544c467ab", size = 2112686, upload-time = "2026-02-04T21:52:03.035Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/50/724ed5c38c504d4e58a88a072776a1e880d970789deaeb2b9f7bd9a5141a/pywinpty-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:fe1f7911805127c94cf51f89ab14096c6f91ffdcacf993d2da6082b2142a2523", size = 234591, upload-time = "2026-02-04T21:52:29.821Z" },
+ { url = "https://files.pythonhosted.org/packages/f7/ad/90a110538696b12b39fd8758a06d70ded899308198ad2305ac68e361126e/pywinpty-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:3f07a6cf1c1d470d284e614733c3d0f726d2c85e78508ea10a403140c3c0c18a", size = 2112360, upload-time = "2026-02-04T21:55:33.397Z" },
+ { url = "https://files.pythonhosted.org/packages/44/0f/7ffa221757a220402bc79fda44044c3f2cc57338d878ab7d622add6f4581/pywinpty-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:15c7c0b6f8e9d87aabbaff76468dabf6e6121332c40fc1d83548d02a9d6a3759", size = 233107, upload-time = "2026-02-04T21:51:45.455Z" },
+ { url = "https://files.pythonhosted.org/packages/28/88/2ff917caff61e55f38bcdb27de06ee30597881b2cae44fbba7627be015c4/pywinpty-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:d4b6b7b0fe0cdcd02e956bd57cfe9f4e5a06514eecf3b5ae174da4f951b58be9", size = 2113282, upload-time = "2026-02-04T21:52:08.188Z" },
+ { url = "https://files.pythonhosted.org/packages/63/32/40a775343ace542cc43ece3f1d1fce454021521ecac41c4c4573081c2336/pywinpty-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:34789d685fc0d547ce0c8a65e5a70e56f77d732fa6e03c8f74fefb8cbb252019", size = 234207, upload-time = "2026-02-04T21:51:58.687Z" },
+ { url = "https://files.pythonhosted.org/packages/8d/54/5d5e52f4cb75028104ca6faf36c10f9692389b1986d34471663b4ebebd6d/pywinpty-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:0c37e224a47a971d1a6e08649a1714dac4f63c11920780977829ed5c8cadead1", size = 2112910, upload-time = "2026-02-04T21:52:30.976Z" },
+ { url = "https://files.pythonhosted.org/packages/0a/44/dcd184824e21d4620b06c7db9fbb15c3ad0a0f1fa2e6de79969fb82647ec/pywinpty-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:c4e9c3dff7d86ba81937438d5819f19f385a39d8f592d4e8af67148ceb4f6ab5", size = 233425, upload-time = "2026-02-04T21:51:56.754Z" },
+]
+
+[[package]]
+name = "pyyaml"
+version = "6.0.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" },
+ { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" },
+ { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" },
+ { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" },
+ { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" },
+ { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" },
+ { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" },
+ { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" },
+ { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" },
+ { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" },
+ { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" },
+ { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" },
+ { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" },
+ { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" },
+ { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" },
+ { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" },
+ { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" },
+ { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" },
+ { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" },
+ { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" },
+ { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" },
+ { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" },
+ { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" },
+ { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" },
+ { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" },
+ { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" },
+ { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" },
+ { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" },
+ { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" },
+ { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" },
+ { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" },
+ { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" },
+ { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" },
+ { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" },
+ { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" },
+ { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" },
+ { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" },
+]
+
+[[package]]
+name = "pyzmq"
+version = "27.1.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "cffi", marker = "implementation_name == 'pypy'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/04/0b/3c9baedbdf613ecaa7aa07027780b8867f57b6293b6ee50de316c9f3222b/pyzmq-27.1.0.tar.gz", hash = "sha256:ac0765e3d44455adb6ddbf4417dcce460fc40a05978c08efdf2948072f6db540", size = 281750, upload-time = "2025-09-08T23:10:18.157Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/92/e7/038aab64a946d535901103da16b953c8c9cc9c961dadcbf3609ed6428d23/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:452631b640340c928fa343801b0d07eb0c3789a5ffa843f6e1a9cee0ba4eb4fc", size = 1306279, upload-time = "2025-09-08T23:08:03.807Z" },
+ { url = "https://files.pythonhosted.org/packages/e8/5e/c3c49fdd0f535ef45eefcc16934648e9e59dace4a37ee88fc53f6cd8e641/pyzmq-27.1.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1c179799b118e554b66da67d88ed66cd37a169f1f23b5d9f0a231b4e8d44a113", size = 895645, upload-time = "2025-09-08T23:08:05.301Z" },
+ { url = "https://files.pythonhosted.org/packages/f8/e5/b0b2504cb4e903a74dcf1ebae157f9e20ebb6ea76095f6cfffea28c42ecd/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3837439b7f99e60312f0c926a6ad437b067356dc2bc2ec96eb395fd0fe804233", size = 652574, upload-time = "2025-09-08T23:08:06.828Z" },
+ { url = "https://files.pythonhosted.org/packages/f8/9b/c108cdb55560eaf253f0cbdb61b29971e9fb34d9c3499b0e96e4e60ed8a5/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43ad9a73e3da1fab5b0e7e13402f0b2fb934ae1c876c51d0afff0e7c052eca31", size = 840995, upload-time = "2025-09-08T23:08:08.396Z" },
+ { url = "https://files.pythonhosted.org/packages/c2/bb/b79798ca177b9eb0825b4c9998c6af8cd2a7f15a6a1a4272c1d1a21d382f/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0de3028d69d4cdc475bfe47a6128eb38d8bc0e8f4d69646adfbcd840facbac28", size = 1642070, upload-time = "2025-09-08T23:08:09.989Z" },
+ { url = "https://files.pythonhosted.org/packages/9c/80/2df2e7977c4ede24c79ae39dcef3899bfc5f34d1ca7a5b24f182c9b7a9ca/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:cf44a7763aea9298c0aa7dbf859f87ed7012de8bda0f3977b6fb1d96745df856", size = 2021121, upload-time = "2025-09-08T23:08:11.907Z" },
+ { url = "https://files.pythonhosted.org/packages/46/bd/2d45ad24f5f5ae7e8d01525eb76786fa7557136555cac7d929880519e33a/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f30f395a9e6fbca195400ce833c731e7b64c3919aa481af4d88c3759e0cb7496", size = 1878550, upload-time = "2025-09-08T23:08:13.513Z" },
+ { url = "https://files.pythonhosted.org/packages/e6/2f/104c0a3c778d7c2ab8190e9db4f62f0b6957b53c9d87db77c284b69f33ea/pyzmq-27.1.0-cp312-abi3-win32.whl", hash = "sha256:250e5436a4ba13885494412b3da5d518cd0d3a278a1ae640e113c073a5f88edd", size = 559184, upload-time = "2025-09-08T23:08:15.163Z" },
+ { url = "https://files.pythonhosted.org/packages/fc/7f/a21b20d577e4100c6a41795842028235998a643b1ad406a6d4163ea8f53e/pyzmq-27.1.0-cp312-abi3-win_amd64.whl", hash = "sha256:9ce490cf1d2ca2ad84733aa1d69ce6855372cb5ce9223802450c9b2a7cba0ccf", size = 619480, upload-time = "2025-09-08T23:08:17.192Z" },
+ { url = "https://files.pythonhosted.org/packages/78/c2/c012beae5f76b72f007a9e91ee9401cb88c51d0f83c6257a03e785c81cc2/pyzmq-27.1.0-cp312-abi3-win_arm64.whl", hash = "sha256:75a2f36223f0d535a0c919e23615fc85a1e23b71f40c7eb43d7b1dedb4d8f15f", size = 552993, upload-time = "2025-09-08T23:08:18.926Z" },
+ { url = "https://files.pythonhosted.org/packages/60/cb/84a13459c51da6cec1b7b1dc1a47e6db6da50b77ad7fd9c145842750a011/pyzmq-27.1.0-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:93ad4b0855a664229559e45c8d23797ceac03183c7b6f5b4428152a6b06684a5", size = 1122436, upload-time = "2025-09-08T23:08:20.801Z" },
+ { url = "https://files.pythonhosted.org/packages/dc/b6/94414759a69a26c3dd674570a81813c46a078767d931a6c70ad29fc585cb/pyzmq-27.1.0-cp313-cp313-android_24_x86_64.whl", hash = "sha256:fbb4f2400bfda24f12f009cba62ad5734148569ff4949b1b6ec3b519444342e6", size = 1156301, upload-time = "2025-09-08T23:08:22.47Z" },
+ { url = "https://files.pythonhosted.org/packages/a5/ad/15906493fd40c316377fd8a8f6b1f93104f97a752667763c9b9c1b71d42d/pyzmq-27.1.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:e343d067f7b151cfe4eb3bb796a7752c9d369eed007b91231e817071d2c2fec7", size = 1341197, upload-time = "2025-09-08T23:08:24.286Z" },
+ { url = "https://files.pythonhosted.org/packages/14/1d/d343f3ce13db53a54cb8946594e567410b2125394dafcc0268d8dda027e0/pyzmq-27.1.0-cp313-cp313t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:08363b2011dec81c354d694bdecaef4770e0ae96b9afea70b3f47b973655cc05", size = 897275, upload-time = "2025-09-08T23:08:26.063Z" },
+ { url = "https://files.pythonhosted.org/packages/69/2d/d83dd6d7ca929a2fc67d2c3005415cdf322af7751d773524809f9e585129/pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d54530c8c8b5b8ddb3318f481297441af102517602b569146185fa10b63f4fa9", size = 660469, upload-time = "2025-09-08T23:08:27.623Z" },
+ { url = "https://files.pythonhosted.org/packages/3e/cd/9822a7af117f4bc0f1952dbe9ef8358eb50a24928efd5edf54210b850259/pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6f3afa12c392f0a44a2414056d730eebc33ec0926aae92b5ad5cf26ebb6cc128", size = 847961, upload-time = "2025-09-08T23:08:29.672Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/12/f003e824a19ed73be15542f172fd0ec4ad0b60cf37436652c93b9df7c585/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c65047adafe573ff023b3187bb93faa583151627bc9c51fc4fb2c561ed689d39", size = 1650282, upload-time = "2025-09-08T23:08:31.349Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/4a/e82d788ed58e9a23995cee70dbc20c9aded3d13a92d30d57ec2291f1e8a3/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:90e6e9441c946a8b0a667356f7078d96411391a3b8f80980315455574177ec97", size = 2024468, upload-time = "2025-09-08T23:08:33.543Z" },
+ { url = "https://files.pythonhosted.org/packages/d9/94/2da0a60841f757481e402b34bf4c8bf57fa54a5466b965de791b1e6f747d/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:add071b2d25f84e8189aaf0882d39a285b42fa3853016ebab234a5e78c7a43db", size = 1885394, upload-time = "2025-09-08T23:08:35.51Z" },
+ { url = "https://files.pythonhosted.org/packages/4f/6f/55c10e2e49ad52d080dc24e37adb215e5b0d64990b57598abc2e3f01725b/pyzmq-27.1.0-cp313-cp313t-win32.whl", hash = "sha256:7ccc0700cfdf7bd487bea8d850ec38f204478681ea02a582a8da8171b7f90a1c", size = 574964, upload-time = "2025-09-08T23:08:37.178Z" },
+ { url = "https://files.pythonhosted.org/packages/87/4d/2534970ba63dd7c522d8ca80fb92777f362c0f321900667c615e2067cb29/pyzmq-27.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:8085a9fba668216b9b4323be338ee5437a235fe275b9d1610e422ccc279733e2", size = 641029, upload-time = "2025-09-08T23:08:40.595Z" },
+ { url = "https://files.pythonhosted.org/packages/f6/fa/f8aea7a28b0641f31d40dea42d7ef003fded31e184ef47db696bc74cd610/pyzmq-27.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:6bb54ca21bcfe361e445256c15eedf083f153811c37be87e0514934d6913061e", size = 561541, upload-time = "2025-09-08T23:08:42.668Z" },
+ { url = "https://files.pythonhosted.org/packages/87/45/19efbb3000956e82d0331bafca5d9ac19ea2857722fa2caacefb6042f39d/pyzmq-27.1.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:ce980af330231615756acd5154f29813d553ea555485ae712c491cd483df6b7a", size = 1341197, upload-time = "2025-09-08T23:08:44.973Z" },
+ { url = "https://files.pythonhosted.org/packages/48/43/d72ccdbf0d73d1343936296665826350cb1e825f92f2db9db3e61c2162a2/pyzmq-27.1.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1779be8c549e54a1c38f805e56d2a2e5c009d26de10921d7d51cfd1c8d4632ea", size = 897175, upload-time = "2025-09-08T23:08:46.601Z" },
+ { url = "https://files.pythonhosted.org/packages/2f/2e/a483f73a10b65a9ef0161e817321d39a770b2acf8bcf3004a28d90d14a94/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7200bb0f03345515df50d99d3db206a0a6bee1955fbb8c453c76f5bf0e08fb96", size = 660427, upload-time = "2025-09-08T23:08:48.187Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/d2/5f36552c2d3e5685abe60dfa56f91169f7a2d99bbaf67c5271022ab40863/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01c0e07d558b06a60773744ea6251f769cd79a41a97d11b8bf4ab8f034b0424d", size = 847929, upload-time = "2025-09-08T23:08:49.76Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/2a/404b331f2b7bf3198e9945f75c4c521f0c6a3a23b51f7a4a401b94a13833/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:80d834abee71f65253c91540445d37c4c561e293ba6e741b992f20a105d69146", size = 1650193, upload-time = "2025-09-08T23:08:51.7Z" },
+ { url = "https://files.pythonhosted.org/packages/1c/0b/f4107e33f62a5acf60e3ded67ed33d79b4ce18de432625ce2fc5093d6388/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:544b4e3b7198dde4a62b8ff6685e9802a9a1ebf47e77478a5eb88eca2a82f2fd", size = 2024388, upload-time = "2025-09-08T23:08:53.393Z" },
+ { url = "https://files.pythonhosted.org/packages/0d/01/add31fe76512642fd6e40e3a3bd21f4b47e242c8ba33efb6809e37076d9b/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cedc4c68178e59a4046f97eca31b148ddcf51e88677de1ef4e78cf06c5376c9a", size = 1885316, upload-time = "2025-09-08T23:08:55.702Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/59/a5f38970f9bf07cee96128de79590bb354917914a9be11272cfc7ff26af0/pyzmq-27.1.0-cp314-cp314t-win32.whl", hash = "sha256:1f0b2a577fd770aa6f053211a55d1c47901f4d537389a034c690291485e5fe92", size = 587472, upload-time = "2025-09-08T23:08:58.18Z" },
+ { url = "https://files.pythonhosted.org/packages/70/d8/78b1bad170f93fcf5e3536e70e8fadac55030002275c9a29e8f5719185de/pyzmq-27.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:19c9468ae0437f8074af379e986c5d3d7d7bfe033506af442e8c879732bedbe0", size = 661401, upload-time = "2025-09-08T23:08:59.802Z" },
+ { url = "https://files.pythonhosted.org/packages/81/d6/4bfbb40c9a0b42fc53c7cf442f6385db70b40f74a783130c5d0a5aa62228/pyzmq-27.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:dc5dbf68a7857b59473f7df42650c621d7e8923fb03fa74a526890f4d33cc4d7", size = 575170, upload-time = "2025-09-08T23:09:01.418Z" },
+]
+
+[[package]]
+name = "referencing"
+version = "0.37.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "attrs" },
+ { name = "rpds-py" },
+ { name = "typing-extensions", marker = "python_full_version < '3.13'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/22/f5/df4e9027acead3ecc63e50fe1e36aca1523e1719559c499951bb4b53188f/referencing-0.37.0.tar.gz", hash = "sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8", size = 78036, upload-time = "2025-10-13T15:30:48.871Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl", hash = "sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231", size = 26766, upload-time = "2025-10-13T15:30:47.625Z" },
+]
+
+[[package]]
+name = "regex"
+version = "2026.5.9"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/dc/0e/49aee608ad09480e7fd276898c99ec6192985fa331abe4eb3a986094490b/regex-2026.5.9.tar.gz", hash = "sha256:a8234aa23ec39894bfe4a3f1b85616a7032481964a13ac6fc9f10de4f6fca270", size = 416074, upload-time = "2026-05-09T23:15:19.37Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/50/9b/6550044bc44e17c84d312c031c2ec42fbdb6a4ec4e29093be3a172d08772/regex-2026.5.9-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:57eeeb05db7979413dec5438f2db21d7ecbba787cde7a711df1a6f6df672aa06", size = 490451, upload-time = "2026-05-09T23:12:34.72Z" },
+ { url = "https://files.pythonhosted.org/packages/1e/95/fc7ba4303b5a0f92446a12ee6778ef2c6c799233f5060042a31bf390cfe9/regex-2026.5.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:398c521292f4c7fb807001dcd54694d3a1fcafc179a36ad9cc56f98df85930b6", size = 292112, upload-time = "2026-05-09T23:12:36.285Z" },
+ { url = "https://files.pythonhosted.org/packages/54/4b/ee27938d1b2c443e89a9a10e00d2d19aa5ee300cd3d61140644e93bb083e/regex-2026.5.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f7a7c26137296beba7784de6eba69c6a93a63ccebc385e4962fe67e267a91225", size = 289599, upload-time = "2026-05-09T23:12:38.089Z" },
+ { url = "https://files.pythonhosted.org/packages/d8/dd/ba103dc19614e25f3880800ca67ce093d6e21b325d72b8383c7bf906e9fa/regex-2026.5.9-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6441cc660d76107934a09c22167200839a0e89604a6297f78a974e66e931d2c0", size = 796732, upload-time = "2026-05-09T23:12:40.062Z" },
+ { url = "https://files.pythonhosted.org/packages/cf/e7/f035b4fd858b050b0080bf302968dc0f59ba34e391872d54936758e6844e/regex-2026.5.9-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:91328f1c23d47595ca3ef0a7557fa129c5a23404b775c770697d2f35b33e0107", size = 865440, upload-time = "2026-05-09T23:12:42.059Z" },
+ { url = "https://files.pythonhosted.org/packages/0a/51/8cd301ecc899aea28124357f729f4272f44de7806fc7ca02490bfbe253e8/regex-2026.5.9-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:93a7860539414dddaefba2b40f8771765ae17949d4c7182b876ce429e11a8309", size = 912329, upload-time = "2026-05-09T23:12:44.373Z" },
+ { url = "https://files.pythonhosted.org/packages/cc/1e/3fbe2fa1e8cebd62f3bb7d3321cff1640aca2e240b51d9bd624aad949260/regex-2026.5.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dd2810d22146b6d838acc5ec15602cb6b47920aa4e33015df3868eedfd20bab8", size = 801239, upload-time = "2026-05-09T23:12:46.268Z" },
+ { url = "https://files.pythonhosted.org/packages/17/2f/6f6008682bf2cf98040a0d3153a8e557b6ab728d7713d045cee4ce544ab8/regex-2026.5.9-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:daff2bdbaf1d23e52fdff7c0b7bc2048b68f978df6a4d107ac981f94caef2e66", size = 777054, upload-time = "2026-05-09T23:12:48.051Z" },
+ { url = "https://files.pythonhosted.org/packages/19/2b/eee0d20a6842ba04df4b8847a920b57ef56853f14ef85405473e586b605a/regex-2026.5.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4eeb011098fcb77af513dcef521a3dbecbf8849b1e38940759d293b7a93f5026", size = 785098, upload-time = "2026-05-09T23:12:49.851Z" },
+ { url = "https://files.pythonhosted.org/packages/4a/98/6fc1e6410feefb92159edaed5041992bfe390e8d26c721865434acbca558/regex-2026.5.9-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ea9c8ecfa1b73c73b626534d6626e5340d429630943672b8480724f44e84b962", size = 860095, upload-time = "2026-05-09T23:12:51.666Z" },
+ { url = "https://files.pythonhosted.org/packages/18/a3/bd855e0f2cb1a978ecf6fa6bb69632dd9c3f6ea3b81cde62fde14c9daec7/regex-2026.5.9-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:cd2846168eb9ee3c513902bc8225409cb1caab31d04728b145171fa1625d9621", size = 765762, upload-time = "2026-05-09T23:12:53.413Z" },
+ { url = "https://files.pythonhosted.org/packages/dc/66/0ae8c092e60b14c79d24f8e0b7f0aea5bfbffdcab00b5483d13404d3c3a5/regex-2026.5.9-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:39617fb0cde9c0e6306dc70e3bfc096f3da793219879f7ae7aa341a69fbdcf6d", size = 852100, upload-time = "2026-05-09T23:12:55.256Z" },
+ { url = "https://files.pythonhosted.org/packages/21/de/8dfde60fc1b21c946a893ba273403b72617edb261370cb1087099a83f088/regex-2026.5.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fd03c4f0e33280d15cae17159b899245d6b7c53d21def19b263b39655061f5ce", size = 789479, upload-time = "2026-05-09T23:12:57.573Z" },
+ { url = "https://files.pythonhosted.org/packages/c3/1c/bdcc98f9a4af4fdd166c74941174619ccff4726d3ce32faa8e9a2ecd38dd/regex-2026.5.9-cp312-cp312-win32.whl", hash = "sha256:164eba9b755ea6f244b0d881196fbc1fac09714e9782c9e2732b813142033c8e", size = 266699, upload-time = "2026-05-09T23:12:59.14Z" },
+ { url = "https://files.pythonhosted.org/packages/78/87/240d36864f9e48ace85f72e79ced97ceb7f27ce87739a947dcb834b4e6bc/regex-2026.5.9-cp312-cp312-win_amd64.whl", hash = "sha256:86f40a5d6444db30a125c9c9177e6b25dad981cbc37451fd838f145e6edac92e", size = 277783, upload-time = "2026-05-09T23:13:00.789Z" },
+ { url = "https://files.pythonhosted.org/packages/4f/b5/7b30f312b0669dff5beebe5b0989dc2d1a312b1a44fab852199c387a5b96/regex-2026.5.9-cp312-cp312-win_arm64.whl", hash = "sha256:96f5f58b54a063d7ea9dca08e1cf57bfe10499c4d579ee672da284f57f5f0070", size = 270513, upload-time = "2026-05-09T23:13:02.426Z" },
+ { url = "https://files.pythonhosted.org/packages/aa/da/797e91ecec6f84135da778ddce78c20e0af5d2a15c26f87a81bc3eadb6db/regex-2026.5.9-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d626b84406444b165fc0ba981604edea39f0588ff1f92baa23fe50799ea9afdb", size = 490303, upload-time = "2026-05-09T23:13:04.382Z" },
+ { url = "https://files.pythonhosted.org/packages/44/da/bf30abaaa737b58f4a4b8c4a03659e02fd92092c822e0197ed9e0daab917/regex-2026.5.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d7bdc0ab8f3dd7e1b4f9ab88634e13374669db86bb3c72e8292f07ae313f539f", size = 292019, upload-time = "2026-05-09T23:13:06.022Z" },
+ { url = "https://files.pythonhosted.org/packages/2d/e7/d0eaf5713828417b9e5648cf81fa9bacd4961f6ab98c380c2034f8716e35/regex-2026.5.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a8820737949116ffff55fe18f9fc644530063ba6ebfcb8314239416e78f1347c", size = 289468, upload-time = "2026-05-09T23:13:08.214Z" },
+ { url = "https://files.pythonhosted.org/packages/d3/9b/b3fdd62b003baa1a9b593cd8c8699c9651c2e80cc21a5c715707983c42d7/regex-2026.5.9-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa0fbdbac82cb3e4450d0ccde7d7a35607f4cb2dd9fba4b8b69bfaf8c9fa6aed", size = 796749, upload-time = "2026-05-09T23:13:10.573Z" },
+ { url = "https://files.pythonhosted.org/packages/d4/30/66ab84588765f5b4b271a9ca09ef7ce2b87caa95176ec3d2ad65d7bc4902/regex-2026.5.9-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:57e8915c7986aa33d25e4d3629cef711cd2863f2961b10409f0c04cb8b7d9020", size = 865445, upload-time = "2026-05-09T23:13:12.523Z" },
+ { url = "https://files.pythonhosted.org/packages/1a/89/f05169e8588aac365f35ffc7f3bc3184f095ef4cfded7cfaa3c7fd5dbd89/regex-2026.5.9-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:508f56a89ba9cb26e4168cbc37dbd60a28d82430a9e18ad1d25fe0883c314ca2", size = 912322, upload-time = "2026-05-09T23:13:14.281Z" },
+ { url = "https://files.pythonhosted.org/packages/30/e1/c93444052cf41581f3c884ab3fb5823daf0992f11cd4388d4275ca610558/regex-2026.5.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b6d189041f15691cfa2b6c4290448ec221244d225b3f5fe9e7771b34ffcdf6e2", size = 801269, upload-time = "2026-05-09T23:13:16.569Z" },
+ { url = "https://files.pythonhosted.org/packages/50/fe/0cf96b882f540e62e8b9956599798203d599c44cf4c77917ca27400ff69b/regex-2026.5.9-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e82db382b44d0111b22601c509c89f64434816c9e0eef9d1989cda8cc6ff1c04", size = 777085, upload-time = "2026-05-09T23:13:18.675Z" },
+ { url = "https://files.pythonhosted.org/packages/23/5c/d78d4924e7fc875557b9e9b768423925fdfaac5549d06da7810019a9bd26/regex-2026.5.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2acfb48634f64996b57f90f39afa692ff362162722581921fe92239a59960f3c", size = 785153, upload-time = "2026-05-09T23:13:20.525Z" },
+ { url = "https://files.pythonhosted.org/packages/bf/e0/5214774090e7b4524dcea3e3c4aa74141d43043f8beb49c1599db1c8b53a/regex-2026.5.9-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:d29eebfc9525db68cad3c97eedd7f754fa265aa5cd0cf4f863b2421e1b48fc9f", size = 860164, upload-time = "2026-05-09T23:13:22.263Z" },
+ { url = "https://files.pythonhosted.org/packages/6e/e1/4a57a83350319b1271f0d7a249b8672513ed928b237a741631270de6caea/regex-2026.5.9-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:debb893095e944091c16e641a6e33c1b0f4cb61ab945ec5afbf53ce7068834d8", size = 765731, upload-time = "2026-05-09T23:13:24.277Z" },
+ { url = "https://files.pythonhosted.org/packages/12/f4/499e74a20c156fc75836ee04a72a38d1a063978f600937f9760467beb1b0/regex-2026.5.9-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d659eee77986549c9ea45b861c7567e44d6287c3dc9a4565478853f7b9fe2ff6", size = 852062, upload-time = "2026-05-09T23:13:26.125Z" },
+ { url = "https://files.pythonhosted.org/packages/5b/92/7eebc0d0a01e78629695f342ba17e0deaff8fb45e79cc0d7b98287da6e3e/regex-2026.5.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2efa205e6d98b24d1f3ab395c11aa15cdf10935bca283d0285e0499c284fba21", size = 789577, upload-time = "2026-05-09T23:13:27.814Z" },
+ { url = "https://files.pythonhosted.org/packages/05/a4/018e71f7d2ad48c1ebe6d3ae0026f9b7cb4802fd15c7cc02fdf724355102/regex-2026.5.9-cp313-cp313-win32.whl", hash = "sha256:f3844f134e834076677dd369976e9f5068679fcb8e50102fdf6b7ac96a3ec127", size = 266691, upload-time = "2026-05-09T23:13:29.549Z" },
+ { url = "https://files.pythonhosted.org/packages/e6/1d/861a93719fb9ee7dbfc3761b3797b7a3e112a5d42c6129459d2d741be9b5/regex-2026.5.9-cp313-cp313-win_amd64.whl", hash = "sha256:3527bb4942d2c14552155406cdedd906567456821848aed1cb4933a391bf5eca", size = 277747, upload-time = "2026-05-09T23:13:31.859Z" },
+ { url = "https://files.pythonhosted.org/packages/d9/c6/0a2436ae4da1ba76e51cb98943c6838a9a721faa40ebe2dce07694ae34e3/regex-2026.5.9-cp313-cp313-win_arm64.whl", hash = "sha256:56a33f191f17d8c417f99945ebdc1e691d3af9605d86ec68c7e54a57e3e17af6", size = 270500, upload-time = "2026-05-09T23:13:33.525Z" },
+ { url = "https://files.pythonhosted.org/packages/e8/e9/d21346f7b60ed58789371358ed66b09d00f832e1bd7c06e55d9da5679882/regex-2026.5.9-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:01f28d868834624c934b8d2e0aa1c8341337e37831f4a012f18a5afcba4cbaf3", size = 494172, upload-time = "2026-05-09T23:13:35.935Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/43/fd1177a2032037c681baecdb3422ee4e1424aec4e4f470ef47793d325274/regex-2026.5.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:48036f6374aaa79eb3b754ec29c61d1c6b1606749d705a13f8854fa2539671f6", size = 293952, upload-time = "2026-05-09T23:13:38.307Z" },
+ { url = "https://files.pythonhosted.org/packages/f2/7d/9fbf919768368d3f8a4f6c692cf2aa61e482b2b81ec6a298ace4cbf02480/regex-2026.5.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b96350aa424e79d4fd6b567b344dcbe2b2d6bfc48dfe7717587e1fa6d43da6ff", size = 292314, upload-time = "2026-05-09T23:13:40.353Z" },
+ { url = "https://files.pythonhosted.org/packages/e2/6c/e41bfeecb589716843e7c4df09ba46ff2a42961457afece19059d85caeef/regex-2026.5.9-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8f3af7a4903c5c04a11a196a5aa75cdd7dd3f8508132f9fb3259d9f5908e3b88", size = 811681, upload-time = "2026-05-09T23:13:42.543Z" },
+ { url = "https://files.pythonhosted.org/packages/87/83/a5c1c525fba0aa656e88ad0face0b1829788ef4c2fb6b26df58aa1151b84/regex-2026.5.9-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7e87577720152d2caae19fe2baaf1f8d5ca12091e9e229f03915c37d1e4b9178", size = 871135, upload-time = "2026-05-09T23:13:44.326Z" },
+ { url = "https://files.pythonhosted.org/packages/18/d4/80882e799e440dd878b0979cbebf8fa4d54624a332c83037c7a701649e3f/regex-2026.5.9-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c8b9b9d294cfea3cd19c718ade7cc93492b2c4991abd9a68d0b3477ae6d8e100", size = 917265, upload-time = "2026-05-09T23:13:47.295Z" },
+ { url = "https://files.pythonhosted.org/packages/ae/ff/8db60211e2286e396aad7dc7725356c502bff0901ea05bd6cdc2e1a042b9/regex-2026.5.9-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:728d8bfd28a8845c8b6bc5dc7ce010453d206396786c0765c2740cb65f37791e", size = 816311, upload-time = "2026-05-09T23:13:49.885Z" },
+ { url = "https://files.pythonhosted.org/packages/4c/47/742ef579c61730f8d268e5cf1f9ce0e37e2ea041ad0f5644724f2378e463/regex-2026.5.9-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7e30b874d341fac767d7df5a0870540541c2c054b80cfaac116e8d367a8a7ff2", size = 785498, upload-time = "2026-05-09T23:13:52.25Z" },
+ { url = "https://files.pythonhosted.org/packages/7f/ab/cb0999802dcb0fb95b1ab005e8d4163d8afdd67efc2cb6b6630ac13f8cb1/regex-2026.5.9-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:fd190e88a895a8901325fad284a3f74ea52b1da8525b76cc811fa9b1edf0ce2b", size = 801348, upload-time = "2026-05-09T23:13:54.127Z" },
+ { url = "https://files.pythonhosted.org/packages/7d/62/8ca59a24c55bc34d166eefaf3717bd77772f329fdbf984d86581e0a3571c/regex-2026.5.9-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:8e76e8161ad00694cfce6767d5dea860c6391ac5b83e5c3a39661e696f11fc7e", size = 866493, upload-time = "2026-05-09T23:13:56.067Z" },
+ { url = "https://files.pythonhosted.org/packages/8d/3d/30f2ae62cef3278bb5bb821f467277a55fb73f01032cf85997e15e8289a8/regex-2026.5.9-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:ddda5340e6c01a293027dd46232fa79eaff1b48058ce7a98f572b6445b088041", size = 772811, upload-time = "2026-05-09T23:13:57.867Z" },
+ { url = "https://files.pythonhosted.org/packages/d8/ae/7d2089bcd78ad0c0161bc684339df50032acb438a7bd3305e7ddb1193cec/regex-2026.5.9-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:205109e96b3cf5adf8f4cd62bedde9487feb282b9497a3535451e5a24cd706a0", size = 856584, upload-time = "2026-05-09T23:13:59.679Z" },
+ { url = "https://files.pythonhosted.org/packages/a9/29/92ff47f75990131ea4f24ba17819e5a9d141e10819807e09addd73409af6/regex-2026.5.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dfbe4579b9f08036aa7d101d1835437a20783574ac66327e6b29b4018a138081", size = 803453, upload-time = "2026-05-09T23:14:01.978Z" },
+ { url = "https://files.pythonhosted.org/packages/04/99/eff29f1037dcab36702c9ee5d6858cf1ce2336ea8ea2987f64245b99ea5e/regex-2026.5.9-cp313-cp313t-win32.whl", hash = "sha256:ed2c9e8068b614c574d8d30e543d617cf5379b0535d46f97ef00e904745a08b5", size = 269951, upload-time = "2026-05-09T23:14:03.661Z" },
+ { url = "https://files.pythonhosted.org/packages/0e/9d/8870b8981d27b22cda77bb26a5ac7ebfa9c7d9e0dea195a834a82380e748/regex-2026.5.9-cp313-cp313t-win_amd64.whl", hash = "sha256:b46b0f094dc1d3b90356c85a0bd2c9bafc4a6a190b9d6f8ddd5a033b6e088ed4", size = 281240, upload-time = "2026-05-09T23:14:05.56Z" },
+ { url = "https://files.pythonhosted.org/packages/72/b1/3379415e8f135c13ac551353397cc4fe97b4978f3cac73c5fcbcded548b8/regex-2026.5.9-cp313-cp313t-win_arm64.whl", hash = "sha256:872acc074bd29ffc9913ecdfedf6ea77502312ca44a4aa0d3779089c6069d8de", size = 272383, upload-time = "2026-05-09T23:14:07.843Z" },
+ { url = "https://files.pythonhosted.org/packages/13/3e/9c3cd292d8808b3645a2ce517e200179b6d0e903f176300bd8b542e14de5/regex-2026.5.9-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:1bd7587a2948b4085195d5a3374eaf4a425dc3e55784c038175355ecf3bbbf8a", size = 490376, upload-time = "2026-05-09T23:14:09.64Z" },
+ { url = "https://files.pythonhosted.org/packages/60/70/d43ee8a2ca0a8b68d167f21658b85520ac0574617c7f320367c5047f7556/regex-2026.5.9-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:dea2e88e1cce4522496cce630e11e67b98b7076620bc4336c3f674bc21a375f4", size = 291964, upload-time = "2026-05-09T23:14:11.424Z" },
+ { url = "https://files.pythonhosted.org/packages/21/91/9d50b433828d8e74196904e168a43abf1e6e88b2a15d47ed742456720c37/regex-2026.5.9-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2099f7e7ff7b6aa3192312650a56e91cc091e49d50b04e4f6f8b6e28b3b27f1c", size = 289682, upload-time = "2026-05-09T23:14:13.123Z" },
+ { url = "https://files.pythonhosted.org/packages/3e/d2/b835e3cafbb9d977736912436259ff551d60919f7d7b3d37d46659c63564/regex-2026.5.9-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecd353045824e4477562a2ac718c25799cdaaa41f7aa925a806a8a3e6848a5b9", size = 796996, upload-time = "2026-05-09T23:14:14.923Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/a6/9f992d00019166b9de01c546dd4549bc679f2a68df11b877740b0760b7c2/regex-2026.5.9-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:65c8c8c37377794bd5b2f3ebe51919042bf17aec802e23c833d89782ed0c78af", size = 866089, upload-time = "2026-05-09T23:14:17.757Z" },
+ { url = "https://files.pythonhosted.org/packages/e0/08/4d32af657e049b19cb62b02e46e38fe1518797bfb2203ee93a510b21b0dc/regex-2026.5.9-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5b73ab8afcf66c622db143d1c6fda4e58e4d537ee4f125229ad47b1ab80f34c0", size = 911530, upload-time = "2026-05-09T23:14:20.353Z" },
+ { url = "https://files.pythonhosted.org/packages/d9/27/2af43dd1dc201d1fecefda64a45f4ad0995855b92724f795a777b402ee69/regex-2026.5.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0de5cf193997384ed2ca6f1cd4f78055b255d93d82d5a8cd6ba0d11c10b167e4", size = 800643, upload-time = "2026-05-09T23:14:22.265Z" },
+ { url = "https://files.pythonhosted.org/packages/a4/dd/23a249047013b5321d4a60c4d2437462086f601b061776a525e5fba2a59f/regex-2026.5.9-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d641a8c9a61618047796d572a39a79b26167b0411d2c3031937b2fe2d081e2cf", size = 777223, upload-time = "2026-05-09T23:14:24.179Z" },
+ { url = "https://files.pythonhosted.org/packages/94/6a/e85ed9538cd19586d0465076a4578a12e093ce776d15f3f8ce92733a8dd6/regex-2026.5.9-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:24b2355ef5cc9aa5b8f07d17704face1c166fdcc2290fa7bd6e6c925655a8346", size = 785760, upload-time = "2026-05-09T23:14:26.065Z" },
+ { url = "https://files.pythonhosted.org/packages/2a/c4/f25473209438638e947c55f9156fd8f236f74169229028cc99116380868e/regex-2026.5.9-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:a24852d3c29ad9e47593593d8a247c44ccc3d0548ef12c822d6ed0810affe676", size = 860891, upload-time = "2026-05-09T23:14:28.17Z" },
+ { url = "https://files.pythonhosted.org/packages/f9/f7/f4f86e3c74419c37370e91f150ae0c2ef7d34b2e0e4cdd5da046a02e4022/regex-2026.5.9-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:916714069da19329ef7de197dcbc77bb3104145c7c2c864dbfbe318f46b88b14", size = 765891, upload-time = "2026-05-09T23:14:30.06Z" },
+ { url = "https://files.pythonhosted.org/packages/26/70/704d8e13765939146b1cd0ef4e2feb71d7929727d2290f026eed10095955/regex-2026.5.9-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:fa411799ca8da32a8d38d020a88faa5b6f91657d284761352940ecf9f7c3bbdd", size = 851380, upload-time = "2026-05-09T23:14:32.123Z" },
+ { url = "https://files.pythonhosted.org/packages/26/29/1a13582a8460038edc38e49f64ceb0dd7c60f5caba77571f4bf6601965d9/regex-2026.5.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:1e6da47d679b7010ef27556b6e0f99771b744936db1792a10ceac6547ae1503e", size = 789350, upload-time = "2026-05-09T23:14:34.799Z" },
+ { url = "https://files.pythonhosted.org/packages/73/56/3dcafe34fc72e271d62ad9a291801e88a1457bb251c132f15fcc2e5aad1a/regex-2026.5.9-cp314-cp314-win32.whl", hash = "sha256:98bd73080e8756255137e1bd3f3f00295bbc5aa383c0e0f973920e9134d7c4ad", size = 272130, upload-time = "2026-05-09T23:14:36.729Z" },
+ { url = "https://files.pythonhosted.org/packages/d0/9c/02eebf0be95efe416c664db7fb8b6b05b7a0b06a7544f2884f2558b0526f/regex-2026.5.9-cp314-cp314-win_amd64.whl", hash = "sha256:ff8d372ac2acdc048d1c19916f27ee61bc5722728458ba6ca5052f2c72d51763", size = 280999, upload-time = "2026-05-09T23:14:39.126Z" },
+ { url = "https://files.pythonhosted.org/packages/70/5a/1dd1abee76cb7a846a0bcf42fdc87e5720c3c33c24f3e37814310a513d9f/regex-2026.5.9-cp314-cp314-win_arm64.whl", hash = "sha256:e1d93bf647916292e8edcec150c07ddf3dc50179ccaf770c04a7f9e452155372", size = 273500, upload-time = "2026-05-09T23:14:41.059Z" },
+ { url = "https://files.pythonhosted.org/packages/86/c1/c5f619b0057a7965cb78ec559c1d7a45ce8c99a35bea95483d64959a93d9/regex-2026.5.9-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:83d0ee4a57d1c87cb549e195ec300b8f0ec3a82eba66d835e4e2ed8634fe4499", size = 494269, upload-time = "2026-05-09T23:14:42.869Z" },
+ { url = "https://files.pythonhosted.org/packages/05/2c/5d01f1aee33de4bbe60c8452945bfc8477ca7c5ae4450f6bfe711036cb36/regex-2026.5.9-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:d3d7eb5c9a7f6df82ed3cfac9beb93882a5cbcb5b8b157b56cb2b3b276574ac1", size = 293954, upload-time = "2026-05-09T23:14:44.822Z" },
+ { url = "https://files.pythonhosted.org/packages/7a/fe/e8988b2ae2108c6ef71bd4aa8d87fbe257976dd0810e826cd75f701c68b6/regex-2026.5.9-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:075160bf16658e16d35233300b8453aac25de4cbea808d22348b6979668e924d", size = 292405, upload-time = "2026-05-09T23:14:47.211Z" },
+ { url = "https://files.pythonhosted.org/packages/79/34/d2b0937faa7859263f7f0a3c6b103a1296306be6952dc173d0154e9a2f49/regex-2026.5.9-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:45375819235558a4ff1c4971dc32881f022613abdb180128f5cb4768c1765a1c", size = 811855, upload-time = "2026-05-09T23:14:49.21Z" },
+ { url = "https://files.pythonhosted.org/packages/80/fe/daf53a47457a8486db66c66c01ceb9c2303eecee3f87197f1e77eb1a736d/regex-2026.5.9-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ead4b163ac30a29574510cd4b3e2e985ac5290c05fc7095557d6a5f403fc31b5", size = 871189, upload-time = "2026-05-09T23:14:51.555Z" },
+ { url = "https://files.pythonhosted.org/packages/1c/75/058fc4470cbfbf57d800aff1a0022b929a3f9fa553ee10a0cdf2070eb31f/regex-2026.5.9-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8c6e4218fbdfbcd4f6c19efca40930d24a621bf4b48cb76bc6640543bd28ef20", size = 917485, upload-time = "2026-05-09T23:14:53.633Z" },
+ { url = "https://files.pythonhosted.org/packages/88/e7/179cfda3a28bc843b5c6cfe7f79f23489c791ed95f151083803660878432/regex-2026.5.9-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6351571c8a42b505eb555c0dc47d740d0fb66977dc142919eea6f4325b7c56a0", size = 816369, upload-time = "2026-05-09T23:14:56.198Z" },
+ { url = "https://files.pythonhosted.org/packages/41/90/6f0cc422071688266d344fca8462d787cba0a2c144acb25721f9a61ec265/regex-2026.5.9-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:002205cafd2a9e78c6290c7d1df277bf3277b3b7a30e0b4bb0dac2e2e3f7cb2d", size = 785869, upload-time = "2026-05-09T23:14:58.602Z" },
+ { url = "https://files.pythonhosted.org/packages/02/67/a31f1760f09c27b251ef39e9beb541f462cf977381d067faa764c2c0e393/regex-2026.5.9-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8abd33fef90b2a9efac5557d6033ca82d1195ed3a15fea5af15ba7b463c6a63b", size = 801427, upload-time = "2026-05-09T23:15:00.642Z" },
+ { url = "https://files.pythonhosted.org/packages/e3/c4/1a80654597b6bc1e1ea0494824c31200e8a956abe290afae9b19a166a148/regex-2026.5.9-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:31037c82eccb44b7ea2e9e221d7c01429430e989a1f4b91ea5a855f6017b509a", size = 866482, upload-time = "2026-05-09T23:15:03.384Z" },
+ { url = "https://files.pythonhosted.org/packages/d1/11/960724e06482c08466ff5611e242e86f80062949cdf6b4b9cc317b9dd93d/regex-2026.5.9-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:5604dfd046dc37eca90250fc3be938b076c8059fa772ac0ed6f499b0f0fb0415", size = 773022, upload-time = "2026-05-09T23:15:05.625Z" },
+ { url = "https://files.pythonhosted.org/packages/50/a8/a9979c3e7918280e93159ebcab5ef1a65116dd4f3bd6091be0eae4a126e8/regex-2026.5.9-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:0e1b1b4e496afbb24f4a62aba855ee4f88f25578927697b340702e48c9ee6bc2", size = 856642, upload-time = "2026-05-09T23:15:07.966Z" },
+ { url = "https://files.pythonhosted.org/packages/fe/d4/a9b732f2f0072c0ab12227483abb24fffcb9f73f8a2b203df0a6d0434735/regex-2026.5.9-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:be3372b9df6ddecff6486d37e19095a7b4973137caf5512407a89f4455361f41", size = 803552, upload-time = "2026-05-09T23:15:10.215Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/fe/1b3113817447a1d4155e4ac76d2e072f42c0bcba2f43fa8a0e756ea2cd91/regex-2026.5.9-cp314-cp314t-win32.whl", hash = "sha256:3ddd90103f9e5c471c49c7852ecc1fe27c7e45eb99e977aefe7caa4e779f4f58", size = 275746, upload-time = "2026-05-09T23:15:12.609Z" },
+ { url = "https://files.pythonhosted.org/packages/92/73/93d42045302636c91f2e5ef588b65b84b01428f28ec77de256b1dfdfbe5c/regex-2026.5.9-cp314-cp314t-win_amd64.whl", hash = "sha256:ca518ed29c46eecba6010b15f1b9a479314d2de409536e71b6a13aa04e3b8a77", size = 285685, upload-time = "2026-05-09T23:15:15.086Z" },
+ { url = "https://files.pythonhosted.org/packages/da/80/35b4c33c804a165a7f55289afda3ea9e3eb6d15800341a2d66455c0f1f30/regex-2026.5.9-cp314-cp314t-win_arm64.whl", hash = "sha256:5e41809d2683fcde7d5a8c87a6567ba1fb1ce0de9f31bff578de00a4b2d76daa", size = 275713, upload-time = "2026-05-09T23:15:16.98Z" },
+]
+
+[[package]]
+name = "requests"
+version = "2.34.2"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "certifi" },
+ { name = "charset-normalizer" },
+ { name = "idna" },
+ { name = "urllib3" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856, upload-time = "2026-05-14T19:25:27.735Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" },
+]
+
+[[package]]
+name = "rfc3339-validator"
+version = "0.1.4"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "six" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/28/ea/a9387748e2d111c3c2b275ba970b735e04e15cdb1eb30693b6b5708c4dbd/rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b", size = 5513, upload-time = "2021-05-12T16:37:54.178Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa", size = 3490, upload-time = "2021-05-12T16:37:52.536Z" },
+]
+
+[[package]]
+name = "rfc3986-validator"
+version = "0.1.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/da/88/f270de456dd7d11dcc808abfa291ecdd3f45ff44e3b549ffa01b126464d0/rfc3986_validator-0.1.1.tar.gz", hash = "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055", size = 6760, upload-time = "2019-10-28T16:00:19.144Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9", size = 4242, upload-time = "2019-10-28T16:00:13.976Z" },
+]
+
+[[package]]
+name = "rfc3987-syntax"
+version = "1.1.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "lark" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/2c/06/37c1a5557acf449e8e406a830a05bf885ac47d33270aec454ef78675008d/rfc3987_syntax-1.1.0.tar.gz", hash = "sha256:717a62cbf33cffdd16dfa3a497d81ce48a660ea691b1ddd7be710c22f00b4a0d", size = 14239, upload-time = "2025-07-18T01:05:05.015Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl", hash = "sha256:6c3d97604e4c5ce9f714898e05401a0445a641cfa276432b0a648c80856f6a3f", size = 8046, upload-time = "2025-07-18T01:05:03.843Z" },
+]
+
+[[package]]
+name = "rich"
+version = "15.0.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "markdown-it-py" },
+ { name = "pygments" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" },
+]
+
+[[package]]
+name = "rpds-py"
+version = "0.30.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/20/af/3f2f423103f1113b36230496629986e0ef7e199d2aa8392452b484b38ced/rpds_py-0.30.0.tar.gz", hash = "sha256:dd8ff7cf90014af0c0f787eea34794ebf6415242ee1d6fa91eaba725cc441e84", size = 69469, upload-time = "2025-11-30T20:24:38.837Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/03/e7/98a2f4ac921d82f33e03f3835f5bf3a4a40aa1bfdc57975e74a97b2b4bdd/rpds_py-0.30.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a161f20d9a43006833cd7068375a94d035714d73a172b681d8881820600abfad", size = 375086, upload-time = "2025-11-30T20:22:17.93Z" },
+ { url = "https://files.pythonhosted.org/packages/4d/a1/bca7fd3d452b272e13335db8d6b0b3ecde0f90ad6f16f3328c6fb150c889/rpds_py-0.30.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6abc8880d9d036ecaafe709079969f56e876fcf107f7a8e9920ba6d5a3878d05", size = 359053, upload-time = "2025-11-30T20:22:19.297Z" },
+ { url = "https://files.pythonhosted.org/packages/65/1c/ae157e83a6357eceff62ba7e52113e3ec4834a84cfe07fa4b0757a7d105f/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca28829ae5f5d569bb62a79512c842a03a12576375d5ece7d2cadf8abe96ec28", size = 390763, upload-time = "2025-11-30T20:22:21.661Z" },
+ { url = "https://files.pythonhosted.org/packages/d4/36/eb2eb8515e2ad24c0bd43c3ee9cd74c33f7ca6430755ccdb240fd3144c44/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1010ed9524c73b94d15919ca4d41d8780980e1765babf85f9a2f90d247153dd", size = 408951, upload-time = "2025-11-30T20:22:23.408Z" },
+ { url = "https://files.pythonhosted.org/packages/d6/65/ad8dc1784a331fabbd740ef6f71ce2198c7ed0890dab595adb9ea2d775a1/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8d1736cfb49381ba528cd5baa46f82fdc65c06e843dab24dd70b63d09121b3f", size = 514622, upload-time = "2025-11-30T20:22:25.16Z" },
+ { url = "https://files.pythonhosted.org/packages/63/8e/0cfa7ae158e15e143fe03993b5bcd743a59f541f5952e1546b1ac1b5fd45/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d948b135c4693daff7bc2dcfc4ec57237a29bd37e60c2fabf5aff2bbacf3e2f1", size = 414492, upload-time = "2025-11-30T20:22:26.505Z" },
+ { url = "https://files.pythonhosted.org/packages/60/1b/6f8f29f3f995c7ffdde46a626ddccd7c63aefc0efae881dc13b6e5d5bb16/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47f236970bccb2233267d89173d3ad2703cd36a0e2a6e92d0560d333871a3d23", size = 394080, upload-time = "2025-11-30T20:22:27.934Z" },
+ { url = "https://files.pythonhosted.org/packages/6d/d5/a266341051a7a3ca2f4b750a3aa4abc986378431fc2da508c5034d081b70/rpds_py-0.30.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:2e6ecb5a5bcacf59c3f912155044479af1d0b6681280048b338b28e364aca1f6", size = 408680, upload-time = "2025-11-30T20:22:29.341Z" },
+ { url = "https://files.pythonhosted.org/packages/10/3b/71b725851df9ab7a7a4e33cf36d241933da66040d195a84781f49c50490c/rpds_py-0.30.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a8fa71a2e078c527c3e9dc9fc5a98c9db40bcc8a92b4e8858e36d329f8684b51", size = 423589, upload-time = "2025-11-30T20:22:31.469Z" },
+ { url = "https://files.pythonhosted.org/packages/00/2b/e59e58c544dc9bd8bd8384ecdb8ea91f6727f0e37a7131baeff8d6f51661/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:73c67f2db7bc334e518d097c6d1e6fed021bbc9b7d678d6cc433478365d1d5f5", size = 573289, upload-time = "2025-11-30T20:22:32.997Z" },
+ { url = "https://files.pythonhosted.org/packages/da/3e/a18e6f5b460893172a7d6a680e86d3b6bc87a54c1f0b03446a3c8c7b588f/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5ba103fb455be00f3b1c2076c9d4264bfcb037c976167a6047ed82f23153f02e", size = 599737, upload-time = "2025-11-30T20:22:34.419Z" },
+ { url = "https://files.pythonhosted.org/packages/5c/e2/714694e4b87b85a18e2c243614974413c60aa107fd815b8cbc42b873d1d7/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7cee9c752c0364588353e627da8a7e808a66873672bcb5f52890c33fd965b394", size = 563120, upload-time = "2025-11-30T20:22:35.903Z" },
+ { url = "https://files.pythonhosted.org/packages/6f/ab/d5d5e3bcedb0a77f4f613706b750e50a5a3ba1c15ccd3665ecc636c968fd/rpds_py-0.30.0-cp312-cp312-win32.whl", hash = "sha256:1ab5b83dbcf55acc8b08fc62b796ef672c457b17dbd7820a11d6c52c06839bdf", size = 223782, upload-time = "2025-11-30T20:22:37.271Z" },
+ { url = "https://files.pythonhosted.org/packages/39/3b/f786af9957306fdc38a74cef405b7b93180f481fb48453a114bb6465744a/rpds_py-0.30.0-cp312-cp312-win_amd64.whl", hash = "sha256:a090322ca841abd453d43456ac34db46e8b05fd9b3b4ac0c78bcde8b089f959b", size = 240463, upload-time = "2025-11-30T20:22:39.021Z" },
+ { url = "https://files.pythonhosted.org/packages/f3/d2/b91dc748126c1559042cfe41990deb92c4ee3e2b415f6b5234969ffaf0cc/rpds_py-0.30.0-cp312-cp312-win_arm64.whl", hash = "sha256:669b1805bd639dd2989b281be2cfd951c6121b65e729d9b843e9639ef1fd555e", size = 230868, upload-time = "2025-11-30T20:22:40.493Z" },
+ { url = "https://files.pythonhosted.org/packages/ed/dc/d61221eb88ff410de3c49143407f6f3147acf2538c86f2ab7ce65ae7d5f9/rpds_py-0.30.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f83424d738204d9770830d35290ff3273fbb02b41f919870479fab14b9d303b2", size = 374887, upload-time = "2025-11-30T20:22:41.812Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/32/55fb50ae104061dbc564ef15cc43c013dc4a9f4527a1f4d99baddf56fe5f/rpds_py-0.30.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e7536cd91353c5273434b4e003cbda89034d67e7710eab8761fd918ec6c69cf8", size = 358904, upload-time = "2025-11-30T20:22:43.479Z" },
+ { url = "https://files.pythonhosted.org/packages/58/70/faed8186300e3b9bdd138d0273109784eea2396c68458ed580f885dfe7ad/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2771c6c15973347f50fece41fc447c054b7ac2ae0502388ce3b6738cd366e3d4", size = 389945, upload-time = "2025-11-30T20:22:44.819Z" },
+ { url = "https://files.pythonhosted.org/packages/bd/a8/073cac3ed2c6387df38f71296d002ab43496a96b92c823e76f46b8af0543/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0a59119fc6e3f460315fe9d08149f8102aa322299deaa5cab5b40092345c2136", size = 407783, upload-time = "2025-11-30T20:22:46.103Z" },
+ { url = "https://files.pythonhosted.org/packages/77/57/5999eb8c58671f1c11eba084115e77a8899d6e694d2a18f69f0ba471ec8b/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76fec018282b4ead0364022e3c54b60bf368b9d926877957a8624b58419169b7", size = 515021, upload-time = "2025-11-30T20:22:47.458Z" },
+ { url = "https://files.pythonhosted.org/packages/e0/af/5ab4833eadc36c0a8ed2bc5c0de0493c04f6c06de223170bd0798ff98ced/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:692bef75a5525db97318e8cd061542b5a79812d711ea03dbc1f6f8dbb0c5f0d2", size = 414589, upload-time = "2025-11-30T20:22:48.872Z" },
+ { url = "https://files.pythonhosted.org/packages/b7/de/f7192e12b21b9e9a68a6d0f249b4af3fdcdff8418be0767a627564afa1f1/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9027da1ce107104c50c81383cae773ef5c24d296dd11c99e2629dbd7967a20c6", size = 394025, upload-time = "2025-11-30T20:22:50.196Z" },
+ { url = "https://files.pythonhosted.org/packages/91/c4/fc70cd0249496493500e7cc2de87504f5aa6509de1e88623431fec76d4b6/rpds_py-0.30.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:9cf69cdda1f5968a30a359aba2f7f9aa648a9ce4b580d6826437f2b291cfc86e", size = 408895, upload-time = "2025-11-30T20:22:51.87Z" },
+ { url = "https://files.pythonhosted.org/packages/58/95/d9275b05ab96556fefff73a385813eb66032e4c99f411d0795372d9abcea/rpds_py-0.30.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a4796a717bf12b9da9d3ad002519a86063dcac8988b030e405704ef7d74d2d9d", size = 422799, upload-time = "2025-11-30T20:22:53.341Z" },
+ { url = "https://files.pythonhosted.org/packages/06/c1/3088fc04b6624eb12a57eb814f0d4997a44b0d208d6cace713033ff1a6ba/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5d4c2aa7c50ad4728a094ebd5eb46c452e9cb7edbfdb18f9e1221f597a73e1e7", size = 572731, upload-time = "2025-11-30T20:22:54.778Z" },
+ { url = "https://files.pythonhosted.org/packages/d8/42/c612a833183b39774e8ac8fecae81263a68b9583ee343db33ab571a7ce55/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ba81a9203d07805435eb06f536d95a266c21e5b2dfbf6517748ca40c98d19e31", size = 599027, upload-time = "2025-11-30T20:22:56.212Z" },
+ { url = "https://files.pythonhosted.org/packages/5f/60/525a50f45b01d70005403ae0e25f43c0384369ad24ffe46e8d9068b50086/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:945dccface01af02675628334f7cf49c2af4c1c904748efc5cf7bbdf0b579f95", size = 563020, upload-time = "2025-11-30T20:22:58.2Z" },
+ { url = "https://files.pythonhosted.org/packages/0b/5d/47c4655e9bcd5ca907148535c10e7d489044243cc9941c16ed7cd53be91d/rpds_py-0.30.0-cp313-cp313-win32.whl", hash = "sha256:b40fb160a2db369a194cb27943582b38f79fc4887291417685f3ad693c5a1d5d", size = 223139, upload-time = "2025-11-30T20:23:00.209Z" },
+ { url = "https://files.pythonhosted.org/packages/f2/e1/485132437d20aa4d3e1d8b3fb5a5e65aa8139f1e097080c2a8443201742c/rpds_py-0.30.0-cp313-cp313-win_amd64.whl", hash = "sha256:806f36b1b605e2d6a72716f321f20036b9489d29c51c91f4dd29a3e3afb73b15", size = 240224, upload-time = "2025-11-30T20:23:02.008Z" },
+ { url = "https://files.pythonhosted.org/packages/24/95/ffd128ed1146a153d928617b0ef673960130be0009c77d8fbf0abe306713/rpds_py-0.30.0-cp313-cp313-win_arm64.whl", hash = "sha256:d96c2086587c7c30d44f31f42eae4eac89b60dabbac18c7669be3700f13c3ce1", size = 230645, upload-time = "2025-11-30T20:23:03.43Z" },
+ { url = "https://files.pythonhosted.org/packages/ff/1b/b10de890a0def2a319a2626334a7f0ae388215eb60914dbac8a3bae54435/rpds_py-0.30.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:eb0b93f2e5c2189ee831ee43f156ed34e2a89a78a66b98cadad955972548be5a", size = 364443, upload-time = "2025-11-30T20:23:04.878Z" },
+ { url = "https://files.pythonhosted.org/packages/0d/bf/27e39f5971dc4f305a4fb9c672ca06f290f7c4e261c568f3dea16a410d47/rpds_py-0.30.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:922e10f31f303c7c920da8981051ff6d8c1a56207dbdf330d9047f6d30b70e5e", size = 353375, upload-time = "2025-11-30T20:23:06.342Z" },
+ { url = "https://files.pythonhosted.org/packages/40/58/442ada3bba6e8e6615fc00483135c14a7538d2ffac30e2d933ccf6852232/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdc62c8286ba9bf7f47befdcea13ea0e26bf294bda99758fd90535cbaf408000", size = 383850, upload-time = "2025-11-30T20:23:07.825Z" },
+ { url = "https://files.pythonhosted.org/packages/14/14/f59b0127409a33c6ef6f5c1ebd5ad8e32d7861c9c7adfa9a624fc3889f6c/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:47f9a91efc418b54fb8190a6b4aa7813a23fb79c51f4bb84e418f5476c38b8db", size = 392812, upload-time = "2025-11-30T20:23:09.228Z" },
+ { url = "https://files.pythonhosted.org/packages/b3/66/e0be3e162ac299b3a22527e8913767d869e6cc75c46bd844aa43fb81ab62/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f3587eb9b17f3789ad50824084fa6f81921bbf9a795826570bda82cb3ed91f2", size = 517841, upload-time = "2025-11-30T20:23:11.186Z" },
+ { url = "https://files.pythonhosted.org/packages/3d/55/fa3b9cf31d0c963ecf1ba777f7cf4b2a2c976795ac430d24a1f43d25a6ba/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39c02563fc592411c2c61d26b6c5fe1e51eaa44a75aa2c8735ca88b0d9599daa", size = 408149, upload-time = "2025-11-30T20:23:12.864Z" },
+ { url = "https://files.pythonhosted.org/packages/60/ca/780cf3b1a32b18c0f05c441958d3758f02544f1d613abf9488cd78876378/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51a1234d8febafdfd33a42d97da7a43f5dcb120c1060e352a3fbc0c6d36e2083", size = 383843, upload-time = "2025-11-30T20:23:14.638Z" },
+ { url = "https://files.pythonhosted.org/packages/82/86/d5f2e04f2aa6247c613da0c1dd87fcd08fa17107e858193566048a1e2f0a/rpds_py-0.30.0-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:eb2c4071ab598733724c08221091e8d80e89064cd472819285a9ab0f24bcedb9", size = 396507, upload-time = "2025-11-30T20:23:16.105Z" },
+ { url = "https://files.pythonhosted.org/packages/4b/9a/453255d2f769fe44e07ea9785c8347edaf867f7026872e76c1ad9f7bed92/rpds_py-0.30.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6bdfdb946967d816e6adf9a3d8201bfad269c67efe6cefd7093ef959683c8de0", size = 414949, upload-time = "2025-11-30T20:23:17.539Z" },
+ { url = "https://files.pythonhosted.org/packages/a3/31/622a86cdc0c45d6df0e9ccb6becdba5074735e7033c20e401a6d9d0e2ca0/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c77afbd5f5250bf27bf516c7c4a016813eb2d3e116139aed0096940c5982da94", size = 565790, upload-time = "2025-11-30T20:23:19.029Z" },
+ { url = "https://files.pythonhosted.org/packages/1c/5d/15bbf0fb4a3f58a3b1c67855ec1efcc4ceaef4e86644665fff03e1b66d8d/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:61046904275472a76c8c90c9ccee9013d70a6d0f73eecefd38c1ae7c39045a08", size = 590217, upload-time = "2025-11-30T20:23:20.885Z" },
+ { url = "https://files.pythonhosted.org/packages/6d/61/21b8c41f68e60c8cc3b2e25644f0e3681926020f11d06ab0b78e3c6bbff1/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c5f36a861bc4b7da6516dbdf302c55313afa09b81931e8280361a4f6c9a2d27", size = 555806, upload-time = "2025-11-30T20:23:22.488Z" },
+ { url = "https://files.pythonhosted.org/packages/f9/39/7e067bb06c31de48de3eb200f9fc7c58982a4d3db44b07e73963e10d3be9/rpds_py-0.30.0-cp313-cp313t-win32.whl", hash = "sha256:3d4a69de7a3e50ffc214ae16d79d8fbb0922972da0356dcf4d0fdca2878559c6", size = 211341, upload-time = "2025-11-30T20:23:24.449Z" },
+ { url = "https://files.pythonhosted.org/packages/0a/4d/222ef0b46443cf4cf46764d9c630f3fe4abaa7245be9417e56e9f52b8f65/rpds_py-0.30.0-cp313-cp313t-win_amd64.whl", hash = "sha256:f14fc5df50a716f7ece6a80b6c78bb35ea2ca47c499e422aa4463455dd96d56d", size = 225768, upload-time = "2025-11-30T20:23:25.908Z" },
+ { url = "https://files.pythonhosted.org/packages/86/81/dad16382ebbd3d0e0328776d8fd7ca94220e4fa0798d1dc5e7da48cb3201/rpds_py-0.30.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:68f19c879420aa08f61203801423f6cd5ac5f0ac4ac82a2368a9fcd6a9a075e0", size = 362099, upload-time = "2025-11-30T20:23:27.316Z" },
+ { url = "https://files.pythonhosted.org/packages/2b/60/19f7884db5d5603edf3c6bce35408f45ad3e97e10007df0e17dd57af18f8/rpds_py-0.30.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ec7c4490c672c1a0389d319b3a9cfcd098dcdc4783991553c332a15acf7249be", size = 353192, upload-time = "2025-11-30T20:23:29.151Z" },
+ { url = "https://files.pythonhosted.org/packages/bf/c4/76eb0e1e72d1a9c4703c69607cec123c29028bff28ce41588792417098ac/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f251c812357a3fed308d684a5079ddfb9d933860fc6de89f2b7ab00da481e65f", size = 384080, upload-time = "2025-11-30T20:23:30.785Z" },
+ { url = "https://files.pythonhosted.org/packages/72/87/87ea665e92f3298d1b26d78814721dc39ed8d2c74b86e83348d6b48a6f31/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac98b175585ecf4c0348fd7b29c3864bda53b805c773cbf7bfdaffc8070c976f", size = 394841, upload-time = "2025-11-30T20:23:32.209Z" },
+ { url = "https://files.pythonhosted.org/packages/77/ad/7783a89ca0587c15dcbf139b4a8364a872a25f861bdb88ed99f9b0dec985/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3e62880792319dbeb7eb866547f2e35973289e7d5696c6e295476448f5b63c87", size = 516670, upload-time = "2025-11-30T20:23:33.742Z" },
+ { url = "https://files.pythonhosted.org/packages/5b/3c/2882bdac942bd2172f3da574eab16f309ae10a3925644e969536553cb4ee/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e7fc54e0900ab35d041b0601431b0a0eb495f0851a0639b6ef90f7741b39a18", size = 408005, upload-time = "2025-11-30T20:23:35.253Z" },
+ { url = "https://files.pythonhosted.org/packages/ce/81/9a91c0111ce1758c92516a3e44776920b579d9a7c09b2b06b642d4de3f0f/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47e77dc9822d3ad616c3d5759ea5631a75e5809d5a28707744ef79d7a1bcfcad", size = 382112, upload-time = "2025-11-30T20:23:36.842Z" },
+ { url = "https://files.pythonhosted.org/packages/cf/8e/1da49d4a107027e5fbc64daeab96a0706361a2918da10cb41769244b805d/rpds_py-0.30.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:b4dc1a6ff022ff85ecafef7979a2c6eb423430e05f1165d6688234e62ba99a07", size = 399049, upload-time = "2025-11-30T20:23:38.343Z" },
+ { url = "https://files.pythonhosted.org/packages/df/5a/7ee239b1aa48a127570ec03becbb29c9d5a9eb092febbd1699d567cae859/rpds_py-0.30.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4559c972db3a360808309e06a74628b95eaccbf961c335c8fe0d590cf587456f", size = 415661, upload-time = "2025-11-30T20:23:40.263Z" },
+ { url = "https://files.pythonhosted.org/packages/70/ea/caa143cf6b772f823bc7929a45da1fa83569ee49b11d18d0ada7f5ee6fd6/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:0ed177ed9bded28f8deb6ab40c183cd1192aa0de40c12f38be4d59cd33cb5c65", size = 565606, upload-time = "2025-11-30T20:23:42.186Z" },
+ { url = "https://files.pythonhosted.org/packages/64/91/ac20ba2d69303f961ad8cf55bf7dbdb4763f627291ba3d0d7d67333cced9/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ad1fa8db769b76ea911cb4e10f049d80bf518c104f15b3edb2371cc65375c46f", size = 591126, upload-time = "2025-11-30T20:23:44.086Z" },
+ { url = "https://files.pythonhosted.org/packages/21/20/7ff5f3c8b00c8a95f75985128c26ba44503fb35b8e0259d812766ea966c7/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:46e83c697b1f1c72b50e5ee5adb4353eef7406fb3f2043d64c33f20ad1c2fc53", size = 553371, upload-time = "2025-11-30T20:23:46.004Z" },
+ { url = "https://files.pythonhosted.org/packages/72/c7/81dadd7b27c8ee391c132a6b192111ca58d866577ce2d9b0ca157552cce0/rpds_py-0.30.0-cp314-cp314-win32.whl", hash = "sha256:ee454b2a007d57363c2dfd5b6ca4a5d7e2c518938f8ed3b706e37e5d470801ed", size = 215298, upload-time = "2025-11-30T20:23:47.696Z" },
+ { url = "https://files.pythonhosted.org/packages/3e/d2/1aaac33287e8cfb07aab2e6b8ac1deca62f6f65411344f1433c55e6f3eb8/rpds_py-0.30.0-cp314-cp314-win_amd64.whl", hash = "sha256:95f0802447ac2d10bcc69f6dc28fe95fdf17940367b21d34e34c737870758950", size = 228604, upload-time = "2025-11-30T20:23:49.501Z" },
+ { url = "https://files.pythonhosted.org/packages/e8/95/ab005315818cc519ad074cb7784dae60d939163108bd2b394e60dc7b5461/rpds_py-0.30.0-cp314-cp314-win_arm64.whl", hash = "sha256:613aa4771c99f03346e54c3f038e4cc574ac09a3ddfb0e8878487335e96dead6", size = 222391, upload-time = "2025-11-30T20:23:50.96Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/68/154fe0194d83b973cdedcdcc88947a2752411165930182ae41d983dcefa6/rpds_py-0.30.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:7e6ecfcb62edfd632e56983964e6884851786443739dbfe3582947e87274f7cb", size = 364868, upload-time = "2025-11-30T20:23:52.494Z" },
+ { url = "https://files.pythonhosted.org/packages/83/69/8bbc8b07ec854d92a8b75668c24d2abcb1719ebf890f5604c61c9369a16f/rpds_py-0.30.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a1d0bc22a7cdc173fedebb73ef81e07faef93692b8c1ad3733b67e31e1b6e1b8", size = 353747, upload-time = "2025-11-30T20:23:54.036Z" },
+ { url = "https://files.pythonhosted.org/packages/ab/00/ba2e50183dbd9abcce9497fa5149c62b4ff3e22d338a30d690f9af970561/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d08f00679177226c4cb8c5265012eea897c8ca3b93f429e546600c971bcbae7", size = 383795, upload-time = "2025-11-30T20:23:55.556Z" },
+ { url = "https://files.pythonhosted.org/packages/05/6f/86f0272b84926bcb0e4c972262f54223e8ecc556b3224d281e6598fc9268/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5965af57d5848192c13534f90f9dd16464f3c37aaf166cc1da1cae1fd5a34898", size = 393330, upload-time = "2025-11-30T20:23:57.033Z" },
+ { url = "https://files.pythonhosted.org/packages/cb/e9/0e02bb2e6dc63d212641da45df2b0bf29699d01715913e0d0f017ee29438/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a4e86e34e9ab6b667c27f3211ca48f73dba7cd3d90f8d5b11be56e5dbc3fb4e", size = 518194, upload-time = "2025-11-30T20:23:58.637Z" },
+ { url = "https://files.pythonhosted.org/packages/ee/ca/be7bca14cf21513bdf9c0606aba17d1f389ea2b6987035eb4f62bd923f25/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d3e6b26f2c785d65cc25ef1e5267ccbe1b069c5c21b8cc724efee290554419", size = 408340, upload-time = "2025-11-30T20:24:00.2Z" },
+ { url = "https://files.pythonhosted.org/packages/c2/c7/736e00ebf39ed81d75544c0da6ef7b0998f8201b369acf842f9a90dc8fce/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:626a7433c34566535b6e56a1b39a7b17ba961e97ce3b80ec62e6f1312c025551", size = 383765, upload-time = "2025-11-30T20:24:01.759Z" },
+ { url = "https://files.pythonhosted.org/packages/4a/3f/da50dfde9956aaf365c4adc9533b100008ed31aea635f2b8d7b627e25b49/rpds_py-0.30.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:acd7eb3f4471577b9b5a41baf02a978e8bdeb08b4b355273994f8b87032000a8", size = 396834, upload-time = "2025-11-30T20:24:03.687Z" },
+ { url = "https://files.pythonhosted.org/packages/4e/00/34bcc2565b6020eab2623349efbdec810676ad571995911f1abdae62a3a0/rpds_py-0.30.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fe5fa731a1fa8a0a56b0977413f8cacac1768dad38d16b3a296712709476fbd5", size = 415470, upload-time = "2025-11-30T20:24:05.232Z" },
+ { url = "https://files.pythonhosted.org/packages/8c/28/882e72b5b3e6f718d5453bd4d0d9cf8df36fddeb4ddbbab17869d5868616/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:74a3243a411126362712ee1524dfc90c650a503502f135d54d1b352bd01f2404", size = 565630, upload-time = "2025-11-30T20:24:06.878Z" },
+ { url = "https://files.pythonhosted.org/packages/3b/97/04a65539c17692de5b85c6e293520fd01317fd878ea1995f0367d4532fb1/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:3e8eeb0544f2eb0d2581774be4c3410356eba189529a6b3e36bbbf9696175856", size = 591148, upload-time = "2025-11-30T20:24:08.445Z" },
+ { url = "https://files.pythonhosted.org/packages/85/70/92482ccffb96f5441aab93e26c4d66489eb599efdcf96fad90c14bbfb976/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:dbd936cde57abfee19ab3213cf9c26be06d60750e60a8e4dd85d1ab12c8b1f40", size = 556030, upload-time = "2025-11-30T20:24:10.956Z" },
+ { url = "https://files.pythonhosted.org/packages/20/53/7c7e784abfa500a2b6b583b147ee4bb5a2b3747a9166bab52fec4b5b5e7d/rpds_py-0.30.0-cp314-cp314t-win32.whl", hash = "sha256:dc824125c72246d924f7f796b4f63c1e9dc810c7d9e2355864b3c3a73d59ade0", size = 211570, upload-time = "2025-11-30T20:24:12.735Z" },
+ { url = "https://files.pythonhosted.org/packages/d0/02/fa464cdfbe6b26e0600b62c528b72d8608f5cc49f96b8d6e38c95d60c676/rpds_py-0.30.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27f4b0e92de5bfbc6f86e43959e6edd1425c33b5e69aab0984a72047f2bcf1e3", size = 226532, upload-time = "2025-11-30T20:24:14.634Z" },
+]
+
+[[package]]
+name = "ruff"
+version = "0.15.14"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/dc/8a/8bce2894573e9dae6ff4d77fe34ad727d79b9e6238ad288c5638990d90f6/ruff-0.15.14.tar.gz", hash = "sha256:48e866b165be4a9bdbf310f7d3c9a07edef2fe8cd63ffeb4e00bb590506ebf9f", size = 4700910, upload-time = "2026-05-21T14:34:55.177Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b9/c8/74a92c6ff9fcfb4f1f947126d3ebee8389276e161ecc85de5bda7cda51bd/ruff-0.15.14-py3-none-linux_armv6l.whl", hash = "sha256:8dd2db9416e487c8d4b01fa7056bb02c4d05969d4f8d17a08c229c2f4ff3c108", size = 10739177, upload-time = "2026-05-21T14:34:37.332Z" },
+ { url = "https://files.pythonhosted.org/packages/45/91/254a35c20acc38a7223c9d2d594af12e794432464f2cdeb52af1dc4a892d/ruff-0.15.14-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:be4ff55af755bd71a00ab3dc6bd7ffc467bd76e0df6881e286c2e3d23e8fb43b", size = 11144969, upload-time = "2026-05-21T14:34:43.978Z" },
+ { url = "https://files.pythonhosted.org/packages/56/9e/d13e40f83b8d0a94430e6778ce1d94a43b38cf2efe63278bdd2b4c65abbf/ruff-0.15.14-py3-none-macosx_11_0_arm64.whl", hash = "sha256:48d5909d7d06276ce7dde6d32bfa4b0d4cb2651145cd8ee4b440722cbc77832f", size = 10478207, upload-time = "2026-05-21T14:34:48.378Z" },
+ { url = "https://files.pythonhosted.org/packages/8d/f1/b15a7839fa4f332f8acec78e20564f26bb2d866e3d21710b877fd0263000/ruff-0.15.14-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca8cbfa94c4f90984a67561978602746d4cd27103568f745fa90eee3f0d4107d", size = 10818459, upload-time = "2026-05-21T14:34:22.318Z" },
+ { url = "https://files.pythonhosted.org/packages/45/33/53d651177f84f94b400a0e27f8824eeada3dddc9d5ee8aeb048f4352a520/ruff-0.15.14-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a6bbc0333f1ab053423bcbf6226477d266ca7cec7738c4c8e3f55647803f3c4", size = 10541800, upload-time = "2026-05-21T14:34:20.209Z" },
+ { url = "https://files.pythonhosted.org/packages/b8/a6/868f87e0bf9786ed24b5d0d0ad8676b8a94fd1912f42cddf9cfc7857818a/ruff-0.15.14-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a24a4f7605d7003a6674d4387651effd939dead3fddd0f36561eb77a9a2e542", size = 11342149, upload-time = "2026-05-21T14:34:46.365Z" },
+ { url = "https://files.pythonhosted.org/packages/a7/8b/38cd5c19faffdcc05a408d2b78edccc69492ab9720eadb49ea15ef80d768/ruff-0.15.14-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:049b5326e53ed80978f2fc041a280603f69dd6b0c95464342a2bb4572d9d9e2f", size = 12212563, upload-time = "2026-05-21T14:34:28.579Z" },
+ { url = "https://files.pythonhosted.org/packages/3e/4d/a3c5b874a556d5731e3e657aaf04311bb76f0a5c3ec220ed43051be6b64b/ruff-0.15.14-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d4ed42e6696c8dfa5f06728e6441993901f548eb92d73bc472cb5a38d1395fbf", size = 11493299, upload-time = "2026-05-21T14:34:41.836Z" },
+ { url = "https://files.pythonhosted.org/packages/1e/c0/56472c251d09858a53e51efbd485b09e1995d8731668b76d52e5dd6ee0f1/ruff-0.15.14-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:715c543cf450c4888251f91c52f1942a800541d9bddd7ac060aa4e6b77ae7cba", size = 11455931, upload-time = "2026-05-21T14:34:57.276Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/4a/e2e7b4d8dbf233d4eace59c75bc3435fa6d8bd3bae82d351d4e4300c0fd1/ruff-0.15.14-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:72ebab6013ec887d439d8b7593737a0a4ffb06d45d209d4e4bf2e92813082d3f", size = 11400794, upload-time = "2026-05-21T14:34:39.773Z" },
+ { url = "https://files.pythonhosted.org/packages/97/c7/83c0539fe34c3e09136204d1e75d6052492364e0b3cb05e9465423f567d7/ruff-0.15.14-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:49072d36abdbe97a8dd7f480afe9c675699c0c495d4c84076e2c1203c4550581", size = 10804759, upload-time = "2026-05-21T14:34:31.045Z" },
+ { url = "https://files.pythonhosted.org/packages/86/a6/18f2bfc095a2ab4a78745644e428205532ce6653a5d0fa8501572891534d/ruff-0.15.14-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:958522aee105068640c2c2ceae08f413ae44d922f52a1374ac13d6a96032fc93", size = 10539517, upload-time = "2026-05-21T14:34:53.064Z" },
+ { url = "https://files.pythonhosted.org/packages/54/3a/5a8b3b69c654d4e4bf1d246ac5b49cbcdac6eaab6905925f8915f31e3b80/ruff-0.15.14-py3-none-musllinux_1_2_i686.whl", hash = "sha256:f3707da619a143a2e8830e2abab8224478d69ace2d28cb6c20543ae97c36bf61", size = 11065169, upload-time = "2026-05-21T14:34:24.484Z" },
+ { url = "https://files.pythonhosted.org/packages/ed/c5/8864e4e7925b836ea354b31d57641ec03830564e281a8b6f061f8c3e0ec1/ruff-0.15.14-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:bb01d645694e3ec0102105d07ef2d53703970407d59c04e59d3ba0b7a1d53553", size = 11560214, upload-time = "2026-05-21T14:34:50.975Z" },
+ { url = "https://files.pythonhosted.org/packages/36/38/012bf76752e1f89ed50b77b99532d90f3a3e287bc7918e1fc0948ac866ac/ruff-0.15.14-py3-none-win32.whl", hash = "sha256:6d0c1ad2a0ab718d39b6d8fd2217981ce4d625cd96a720095f798fb47d8b13e6", size = 10805548, upload-time = "2026-05-21T14:34:33.453Z" },
+ { url = "https://files.pythonhosted.org/packages/d1/b7/4ea2c170f10ad760fff2a5250beb18897719dc8b52b53a24cddbb9dd3f19/ruff-0.15.14-py3-none-win_amd64.whl", hash = "sha256:802342981e056db3851a7836e5b070f8f15f67d4a685ae2a6160939d364b2902", size = 11939523, upload-time = "2026-05-21T14:34:18.077Z" },
+ { url = "https://files.pythonhosted.org/packages/62/d5/bc97ff895ec35cf3925d4bd60f3b39d822f377a446906ec9bcc87405e59b/ruff-0.15.14-py3-none-win_arm64.whl", hash = "sha256:ff47b90a9ef6a40c9e2f3b479c1fb78531adf055b94c1eba0a7ba04b31951826", size = 11208607, upload-time = "2026-05-21T14:34:26.525Z" },
+]
+
+[[package]]
+name = "s3fs"
+version = "2026.4.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "aiobotocore" },
+ { name = "aiohttp" },
+ { name = "fsspec" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/cb/d8/76f3dc1558bdf4494b117a9f7a9cc0a5d9d34edadc9e5d7ceabc5a6a7c37/s3fs-2026.4.0.tar.gz", hash = "sha256:5bdce0abb00b0435ee150807a45fea727451dbc22de4cbc116464f8504ab9d37", size = 85986, upload-time = "2026-04-29T20:52:51.748Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/5d/a4/9d1ea10ebc9e028a289a72fec84da170689549a8102c8aacfcad26bc5035/s3fs-2026.4.0-py3-none-any.whl", hash = "sha256:de0d2a1f33cdf03831fd2382d278c6e4e31fe57c3bf2f703c61f8aec6b703e2a", size = 32392, upload-time = "2026-04-29T20:52:50.295Z" },
+]
+
+[[package]]
+name = "scipy"
+version = "1.17.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "numpy" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/7a/97/5a3609c4f8d58b039179648e62dd220f89864f56f7357f5d4f45c29eb2cc/scipy-1.17.1.tar.gz", hash = "sha256:95d8e012d8cb8816c226aef832200b1d45109ed4464303e997c5b13122b297c0", size = 30573822, upload-time = "2026-02-23T00:26:24.851Z" }
+wheels = [
+ { 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, upload-time = "2026-02-23T00:17:49.855Z" },
+ { 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, upload-time = "2026-02-23T00:18:01.64Z" },
+ { 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, upload-time = "2026-02-23T00:18:12.015Z" },
+ { 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, upload-time = "2026-02-23T00:18:21.502Z" },
+ { 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, upload-time = "2026-02-23T00:18:35.367Z" },
+ { 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, upload-time = "2026-02-23T00:18:49.188Z" },
+ { 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, upload-time = "2026-02-23T00:18:54.74Z" },
+ { 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, upload-time = "2026-02-23T00:19:00.307Z" },
+ { url = "https://files.pythonhosted.org/packages/a2/84/dc08d77fbf3d87d3ee27f6a0c6dcce1de5829a64f2eae85a0ecc1f0daa73/scipy-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:41b71f4a3a4cab9d366cd9065b288efc4d4f3c0b37a91a8e0947fb5bd7f31d87", size = 36549682, upload-time = "2026-02-23T00:19:07.67Z" },
+ { url = "https://files.pythonhosted.org/packages/bc/98/fe9ae9ffb3b54b62559f52dedaebe204b408db8109a8c66fdd04869e6424/scipy-1.17.1-cp312-cp312-win_arm64.whl", hash = "sha256:f4115102802df98b2b0db3cce5cb9b92572633a1197c77b7553e5203f284a5b3", size = 24547340, upload-time = "2026-02-23T00:19:12.024Z" },
+ { 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, upload-time = "2026-02-23T00:19:17.192Z" },
+ { 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, upload-time = "2026-02-23T00:19:22.241Z" },
+ { 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, upload-time = "2026-02-23T00:19:26.329Z" },
+ { 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, upload-time = "2026-02-23T00:19:30.304Z" },
+ { 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, upload-time = "2026-02-23T00:19:35.536Z" },
+ { 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, upload-time = "2026-02-23T00:19:42.259Z" },
+ { 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, upload-time = "2026-02-23T00:19:47.547Z" },
+ { 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, upload-time = "2026-02-23T00:19:53.238Z" },
+ { url = "https://files.pythonhosted.org/packages/35/e5/d6d0e51fc888f692a35134336866341c08655d92614f492c6860dc45bb2c/scipy-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:37425bc9175607b0268f493d79a292c39f9d001a357bebb6b88fdfaff13f6448", size = 36510943, upload-time = "2026-02-23T00:20:50.89Z" },
+ { url = "https://files.pythonhosted.org/packages/2a/fd/3be73c564e2a01e690e19cc618811540ba5354c67c8680dce3281123fb79/scipy-1.17.1-cp313-cp313-win_arm64.whl", hash = "sha256:5cf36e801231b6a2059bf354720274b7558746f3b1a4efb43fcf557ccd484a87", size = 24545621, upload-time = "2026-02-23T00:20:55.871Z" },
+ { 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, upload-time = "2026-02-23T00:19:58.694Z" },
+ { 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, upload-time = "2026-02-23T00:20:03.934Z" },
+ { 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, upload-time = "2026-02-23T00:20:07.935Z" },
+ { 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, upload-time = "2026-02-23T00:20:12.161Z" },
+ { 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, upload-time = "2026-02-23T00:20:17.208Z" },
+ { 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, upload-time = "2026-02-23T00:20:23.087Z" },
+ { 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, upload-time = "2026-02-23T00:20:28.636Z" },
+ { 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, upload-time = "2026-02-23T00:20:34.743Z" },
+ { url = "https://files.pythonhosted.org/packages/06/1c/1172a88d507a4baaf72c5a09bb6c018fe2ae0ab622e5830b703a46cc9e44/scipy-1.17.1-cp313-cp313t-win_amd64.whl", hash = "sha256:e30bdeaa5deed6bc27b4cc490823cd0347d7dae09119b8803ae576ea0ce52e4c", size = 36562980, upload-time = "2026-02-23T00:20:40.575Z" },
+ { url = "https://files.pythonhosted.org/packages/70/b0/eb757336e5a76dfa7911f63252e3b7d1de00935d7705cf772db5b45ec238/scipy-1.17.1-cp313-cp313t-win_arm64.whl", hash = "sha256:a720477885a9d2411f94a93d16f9d89bad0f28ca23c3f8daa521e2dcc3f44d49", size = 24856543, upload-time = "2026-02-23T00:20:45.313Z" },
+ { 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, upload-time = "2026-02-23T00:21:01.015Z" },
+ { 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, upload-time = "2026-02-23T00:21:05.888Z" },
+ { 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, upload-time = "2026-02-23T00:21:09.904Z" },
+ { 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, upload-time = "2026-02-23T00:21:14.313Z" },
+ { 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, upload-time = "2026-02-23T00:21:19.663Z" },
+ { 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, upload-time = "2026-02-23T00:21:25.278Z" },
+ { 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, upload-time = "2026-02-23T00:21:31.358Z" },
+ { 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, upload-time = "2026-02-23T00:21:37.247Z" },
+ { url = "https://files.pythonhosted.org/packages/4b/39/f0e8ea762a764a9dc52aa7dabcfad51a354819de1f0d4652b6a1122424d6/scipy-1.17.1-cp314-cp314-win_amd64.whl", hash = "sha256:3877ac408e14da24a6196de0ddcace62092bfc12a83823e92e49e40747e52c19", size = 37290984, upload-time = "2026-02-23T00:22:35.023Z" },
+ { url = "https://files.pythonhosted.org/packages/7c/56/fe201e3b0f93d1a8bcf75d3379affd228a63d7e2d80ab45467a74b494947/scipy-1.17.1-cp314-cp314-win_arm64.whl", hash = "sha256:f8885db0bc2bffa59d5c1b72fad7a6a92d3e80e7257f967dd81abb553a90d293", size = 25192877, upload-time = "2026-02-23T00:22:39.798Z" },
+ { 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, upload-time = "2026-02-23T00:21:42.289Z" },
+ { 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, upload-time = "2026-02-23T00:21:47.706Z" },
+ { 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, upload-time = "2026-02-23T00:21:52.039Z" },
+ { 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, upload-time = "2026-02-23T00:21:56.185Z" },
+ { 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, upload-time = "2026-02-23T00:22:01.404Z" },
+ { 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, upload-time = "2026-02-23T00:22:07.024Z" },
+ { 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, upload-time = "2026-02-23T00:22:12.585Z" },
+ { 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, upload-time = "2026-02-23T00:22:18.513Z" },
+ { url = "https://files.pythonhosted.org/packages/11/2f/b29eafe4a3fbc3d6de9662b36e028d5f039e72d345e05c250e121a230dd4/scipy-1.17.1-cp314-cp314t-win_amd64.whl", hash = "sha256:eb092099205ef62cd1782b006658db09e2fed75bffcae7cc0d44052d8aa0f484", size = 37345327, upload-time = "2026-02-23T00:22:24.442Z" },
+ { url = "https://files.pythonhosted.org/packages/07/39/338d9219c4e87f3e708f18857ecd24d22a0c3094752393319553096b98af/scipy-1.17.1-cp314-cp314t-win_arm64.whl", hash = "sha256:200e1050faffacc162be6a486a984a0497866ec54149a01270adc8a59b7c7d21", size = 25489165, upload-time = "2026-02-23T00:22:29.563Z" },
+]
+
+[[package]]
+name = "send2trash"
+version = "2.1.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/c5/f0/184b4b5f8d00f2a92cf96eec8967a3d550b52cf94362dad1100df9e48d57/send2trash-2.1.0.tar.gz", hash = "sha256:1c72b39f09457db3c05ce1d19158c2cbef4c32b8bedd02c155e49282b7ea7459", size = 17255, upload-time = "2026-01-14T06:27:36.056Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl", hash = "sha256:0da2f112e6d6bb22de6aa6daa7e144831a4febf2a87261451c4ad849fe9a873c", size = 17610, upload-time = "2026-01-14T06:27:35.218Z" },
+]
+
+[[package]]
+name = "setuptools"
+version = "82.0.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/4f/db/cfac1baf10650ab4d1c111714410d2fbb77ac5a616db26775db562c8fab2/setuptools-82.0.1.tar.gz", hash = "sha256:7d872682c5d01cfde07da7bccc7b65469d3dca203318515ada1de5eda35efbf9", size = 1152316, upload-time = "2026-03-09T12:47:17.221Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9d/76/f789f7a86709c6b087c5a2f52f911838cad707cc613162401badc665acfe/setuptools-82.0.1-py3-none-any.whl", hash = "sha256:a59e362652f08dcd477c78bb6e7bd9d80a7995bc73ce773050228a348ce2e5bb", size = 1006223, upload-time = "2026-03-09T12:47:15.026Z" },
+]
+
+[[package]]
+name = "shellingham"
+version = "1.5.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" },
+]
+
+[[package]]
+name = "six"
+version = "1.17.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" },
+]
+
+[[package]]
+name = "soupsieve"
+version = "2.8.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/47/2c/0a5f6f8ee0d5589e48c7640213ed5175d52cf540a06725b628cc1a45d6ce/soupsieve-2.8.4.tar.gz", hash = "sha256:e121fd02e975c695e4e9e8774a5ee35d74714b59307868dcc5319ad2d9e3328e", size = 121110, upload-time = "2026-05-24T13:55:57.154Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/5e/f5/0c41cb68dcae6b7de4fac4188a3a9589e21fb31df21ea3a2e888db95e6c9/soupsieve-2.8.4-py3-none-any.whl", hash = "sha256:e7e6b0769c8f51ed59acab6e994b00621096cfb1c640a7509295987388fbaf65", size = 37304, upload-time = "2026-05-24T13:55:55.406Z" },
+]
+
+[[package]]
+name = "stack-data"
+version = "0.6.3"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "asttokens" },
+ { name = "executing" },
+ { name = "pure-eval" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707, upload-time = "2023-09-30T13:58:05.479Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521, upload-time = "2023-09-30T13:58:03.53Z" },
+]
+
+[[package]]
+name = "terminado"
+version = "0.18.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "ptyprocess", marker = "os_name != 'nt'" },
+ { name = "pywinpty", marker = "os_name == 'nt'" },
+ { name = "tornado" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/8a/11/965c6fd8e5cc254f1fe142d547387da17a8ebfd75a3455f637c663fb38a0/terminado-0.18.1.tar.gz", hash = "sha256:de09f2c4b85de4765f7714688fff57d3e75bad1f909b589fde880460c753fd2e", size = 32701, upload-time = "2024-03-12T14:34:39.026Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl", hash = "sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0", size = 14154, upload-time = "2024-03-12T14:34:36.569Z" },
+]
+
+[[package]]
+name = "tinycss2"
+version = "1.4.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "webencodings" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/7a/fd/7a5ee21fd08ff70d3d33a5781c255cbe779659bd03278feb98b19ee550f4/tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7", size = 87085, upload-time = "2024-10-24T14:58:29.895Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289", size = 26610, upload-time = "2024-10-24T14:58:28.029Z" },
+]
+
+[[package]]
+name = "tld"
+version = "0.13.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/5c/5d/76b4383ac4e5b5e254e50c09807b3e13820bed6d6c11cd540264988d6802/tld-0.13.2.tar.gz", hash = "sha256:d983fa92b9d717400742fca844e29d5e18271079c7bcfabf66d01b39b4a14345", size = 467175, upload-time = "2026-03-06T23:50:34.498Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9e/90/39a85a4b63c84213e78b3c17d22e1bf45328acf8ebb33ef93be30d0a3911/tld-0.13.2-py2.py3-none-any.whl", hash = "sha256:9b8fdbdb880e7ba65b216a4937f2c94c49a7226723783d5838fc958ac76f4e0c", size = 296743, upload-time = "2026-03-06T23:50:32.465Z" },
+]
+
+[[package]]
+name = "tornado"
+version = "6.5.5"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f8/f1/3173dfa4a18db4a9b03e5d55325559dab51ee653763bb8745a75af491286/tornado-6.5.5.tar.gz", hash = "sha256:192b8f3ea91bd7f1f50c06955416ed76c6b72f96779b962f07f911b91e8d30e9", size = 516006, upload-time = "2026-03-10T21:31:02.067Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/59/8c/77f5097695f4dd8255ecbd08b2a1ed8ba8b953d337804dd7080f199e12bf/tornado-6.5.5-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:487dc9cc380e29f58c7ab88f9e27cdeef04b2140862e5076a66fb6bb68bb1bfa", size = 445983, upload-time = "2026-03-10T21:30:44.28Z" },
+ { url = "https://files.pythonhosted.org/packages/ab/5e/7625b76cd10f98f1516c36ce0346de62061156352353ef2da44e5c21523c/tornado-6.5.5-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:65a7f1d46d4bb41df1ac99f5fcb685fb25c7e61613742d5108b010975a9a6521", size = 444246, upload-time = "2026-03-10T21:30:46.571Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/04/7b5705d5b3c0fab088f434f9c83edac1573830ca49ccf29fb83bf7178eec/tornado-6.5.5-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e74c92e8e65086b338fd56333fb9a68b9f6f2fe7ad532645a290a464bcf46be5", size = 447229, upload-time = "2026-03-10T21:30:48.273Z" },
+ { url = "https://files.pythonhosted.org/packages/34/01/74e034a30ef59afb4097ef8659515e96a39d910b712a89af76f5e4e1f93c/tornado-6.5.5-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:435319e9e340276428bbdb4e7fa732c2d399386d1de5686cb331ec8eee754f07", size = 448192, upload-time = "2026-03-10T21:30:51.22Z" },
+ { url = "https://files.pythonhosted.org/packages/be/00/fe9e02c5a96429fce1a1d15a517f5d8444f9c412e0bb9eadfbe3b0fc55bf/tornado-6.5.5-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3f54aa540bdbfee7b9eb268ead60e7d199de5021facd276819c193c0fb28ea4e", size = 448039, upload-time = "2026-03-10T21:30:53.52Z" },
+ { url = "https://files.pythonhosted.org/packages/82/9e/656ee4cec0398b1d18d0f1eb6372c41c6b889722641d84948351ae19556d/tornado-6.5.5-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:36abed1754faeb80fbd6e64db2758091e1320f6bba74a4cf8c09cd18ccce8aca", size = 447445, upload-time = "2026-03-10T21:30:55.541Z" },
+ { url = "https://files.pythonhosted.org/packages/5a/76/4921c00511f88af86a33de770d64141170f1cfd9c00311aea689949e274e/tornado-6.5.5-cp39-abi3-win32.whl", hash = "sha256:dd3eafaaeec1c7f2f8fdcd5f964e8907ad788fe8a5a32c4426fbbdda621223b7", size = 448582, upload-time = "2026-03-10T21:30:57.142Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/23/f6c6112a04d28eed765e374435fb1a9198f73e1ec4b4024184f21faeb1ad/tornado-6.5.5-cp39-abi3-win_amd64.whl", hash = "sha256:6443a794ba961a9f619b1ae926a2e900ac20c34483eea67be4ed8f1e58d3ef7b", size = 448990, upload-time = "2026-03-10T21:30:58.857Z" },
+ { url = "https://files.pythonhosted.org/packages/b7/c8/876602cbc96469911f0939f703453c1157b0c826ecb05bdd32e023397d4e/tornado-6.5.5-cp39-abi3-win_arm64.whl", hash = "sha256:2c9a876e094109333f888539ddb2de4361743e5d21eece20688e3e351e4990a6", size = 448016, upload-time = "2026-03-10T21:31:00.43Z" },
+]
+
+[[package]]
+name = "tqdm"
+version = "4.67.3"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/09/a9/6ba95a270c6f1fbcd8dac228323f2777d886cb206987444e4bce66338dd4/tqdm-4.67.3.tar.gz", hash = "sha256:7d825f03f89244ef73f1d4ce193cb1774a8179fd96f31d7e1dcde62092b960bb", size = 169598, upload-time = "2026-02-03T17:35:53.048Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/16/e1/3079a9ff9b8e11b846c6ac5c8b5bfb7ff225eee721825310c91b3b50304f/tqdm-4.67.3-py3-none-any.whl", hash = "sha256:ee1e4c0e59148062281c49d80b25b67771a127c85fc9676d3be5f243206826bf", size = 78374, upload-time = "2026-02-03T17:35:50.982Z" },
+]
+
+[[package]]
+name = "trafilatura"
+version = "1.11.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "certifi" },
+ { name = "charset-normalizer" },
+ { name = "courlan" },
+ { name = "htmldate" },
+ { name = "justext" },
+ { name = "lxml" },
+ { name = "urllib3" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/03/9e/ae012a5e563c1e2f948af367518ae2bc4a3ebdaecf9efdb79058c775e653/trafilatura-1.11.0.tar.gz", hash = "sha256:9334ca101c40b2904af5afcee790f0374fabca3ac388811720be65cc768787a2", size = 3882470, upload-time = "2024-06-27T14:04:24.851Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/44/97/f984647661a9fd0a61276795c883e5de26d77596300ee289ca297e336285/trafilatura-1.11.0-py3-none-any.whl", hash = "sha256:20f016be873a2cf3e02b9798f9537d09808559fcc667d42e1c019560ca45dce7", size = 1028543, upload-time = "2024-06-27T14:03:48.753Z" },
+]
+
+[[package]]
+name = "traitlets"
+version = "5.15.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/1b/22/40f55b26baeab80c2d7b3f1db0682f8954e4617fee7d90ce634022ef05c6/traitlets-5.15.0.tar.gz", hash = "sha256:4fead733f81cf1c4c938e06f8ca4633896833c9d89eff878159457f4d4392971", size = 163197, upload-time = "2026-05-06T08:05:58.016Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl", hash = "sha256:fb36a18867a6803deab09f3c5e0fa81bb7b26a5c9e82501c9933f759166eff40", size = 85877, upload-time = "2026-05-06T08:05:55.853Z" },
+]
+
+[[package]]
+name = "typer"
+version = "0.25.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "annotated-doc" },
+ { name = "click" },
+ { name = "rich" },
+ { name = "shellingham" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/e4/51/9aed62104cea109b820bbd6c14245af756112017d309da813ef107d42e7e/typer-0.25.1.tar.gz", hash = "sha256:9616eb8853a09ffeabab1698952f33c6f29ffdbceb4eaeecf571880e8d7664cc", size = 122276, upload-time = "2026-04-30T19:32:16.964Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/3f/f9/2b3ff4e56e5fa7debfaf9eb135d0da96f3e9a1d5b27222223c7296336e5f/typer-0.25.1-py3-none-any.whl", hash = "sha256:75caa44ed46a03fb2dab8808753ffacdbfea88495e74c85a28c5eefcf5f39c89", size = 58409, upload-time = "2026-04-30T19:32:18.271Z" },
+]
+
+[[package]]
+name = "typing-extensions"
+version = "4.15.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" },
+]
+
+[[package]]
+name = "tzdata"
+version = "2026.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/ba/19/1b9b0e29f30c6d35cb345486df41110984ea67ae69dddbc0e8a100999493/tzdata-2026.2.tar.gz", hash = "sha256:9173fde7d80d9018e02a662e168e5a2d04f87c41ea174b139fbef642eda62d10", size = 198254, upload-time = "2026-04-24T15:22:08.651Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ce/e4/dccd7f47c4b64213ac01ef921a1337ee6e30e8c6466046018326977efd95/tzdata-2026.2-py2.py3-none-any.whl", hash = "sha256:bbe9af844f658da81a5f95019480da3a89415801f6cc966806612cc7169bffe7", size = 349321, upload-time = "2026-04-24T15:22:05.876Z" },
+]
+
+[[package]]
+name = "tzlocal"
+version = "5.3.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "tzdata", marker = "sys_platform == 'win32'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/8b/2e/c14812d3d4d9cd1773c6be938f89e5735a1f11a9f184ac3639b93cef35d5/tzlocal-5.3.1.tar.gz", hash = "sha256:cceffc7edecefea1f595541dbd6e990cb1ea3d19bf01b2809f362a03dd7921fd", size = 30761, upload-time = "2025-03-05T21:17:41.549Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c2/14/e2a54fabd4f08cd7af1c07030603c3356b74da07f7cc056e600436edfa17/tzlocal-5.3.1-py3-none-any.whl", hash = "sha256:eb1a66c3ef5847adf7a834f1be0800581b683b5608e74f86ecbcef8ab91bb85d", size = 18026, upload-time = "2025-03-05T21:17:39.857Z" },
+]
+
+[[package]]
+name = "uri-template"
+version = "1.3.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/31/c7/0336f2bd0bcbada6ccef7aaa25e443c118a704f828a0620c6fa0207c1b64/uri-template-1.3.0.tar.gz", hash = "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7", size = 21678, upload-time = "2023-06-21T01:49:05.374Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl", hash = "sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363", size = 11140, upload-time = "2023-06-21T01:49:03.467Z" },
+]
+
+[[package]]
+name = "urllib3"
+version = "2.7.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" },
+]
+
+[[package]]
+name = "warcio"
+version = "1.8.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "six" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/20/78/df7e1c40a3751ea966be84eb6645270831e511f9932740b5251ace028cfa/warcio-1.8.1.tar.gz", hash = "sha256:76f71b22159ca3c043521e10ee8a2478d167672ad1d137c7c15e40b0d5c73ccd", size = 65772, upload-time = "2026-03-31T16:10:32.196Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c5/be/d92c0899bd52c7f82fc0f8caa8fb3c624e6d1006ee208c710060cda216c2/warcio-1.8.1-py2.py3-none-any.whl", hash = "sha256:82345c5914d36cb5e0513210dbf759e3db348bf8d0f7762996ccce3a5ce6e87b", size = 41578, upload-time = "2026-03-31T16:10:31.059Z" },
+]
+
+[package.optional-dependencies]
+s3 = [
+ { name = "aiohttp" },
+ { name = "fsspec" },
+ { name = "requests" },
+ { name = "s3fs" },
+]
+
+[[package]]
+name = "wcwidth"
+version = "0.7.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/2c/ee/afaf0f85a9a18fe47a67f1e4422ed6cf1fe642f0ae0a2f81166231303c52/wcwidth-0.7.0.tar.gz", hash = "sha256:90e3a7ea092341c44b99562e75d09e4d5160fe7a3974c6fb842a101a95e7eed0", size = 182132, upload-time = "2026-05-02T16:04:12.653Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl", hash = "sha256:5d69154c429a82910e241c738cd0e2976fac8a2dd47a1a805f4afed1c0f136f2", size = 110825, upload-time = "2026-05-02T16:04:11.033Z" },
+]
+
+[[package]]
+name = "webcolors"
+version = "25.10.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/1d/7a/eb316761ec35664ea5174709a68bbd3389de60d4a1ebab8808bfc264ed67/webcolors-25.10.0.tar.gz", hash = "sha256:62abae86504f66d0f6364c2a8520de4a0c47b80c03fc3a5f1815fedbef7c19bf", size = 53491, upload-time = "2025-10-31T07:51:03.977Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl", hash = "sha256:032c727334856fc0b968f63daa252a1ac93d33db2f5267756623c210e57a4f1d", size = 14905, upload-time = "2025-10-31T07:51:01.778Z" },
+]
+
+[[package]]
+name = "webencodings"
+version = "0.5.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923", size = 9721, upload-time = "2017-04-05T20:21:34.189Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", size = 11774, upload-time = "2017-04-05T20:21:32.581Z" },
+]
+
+[[package]]
+name = "websocket-client"
+version = "1.9.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/2c/41/aa4bf9664e4cda14c3b39865b12251e8e7d239f4cd0e3cc1b6c2ccde25c1/websocket_client-1.9.0.tar.gz", hash = "sha256:9e813624b6eb619999a97dc7958469217c3176312b3a16a4bd1bc7e08a46ec98", size = 70576, upload-time = "2025-10-07T21:16:36.495Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl", hash = "sha256:af248a825037ef591efbf6ed20cc5faa03d3b47b9e5a2230a529eeee1c1fc3ef", size = 82616, upload-time = "2025-10-07T21:16:34.951Z" },
+]
+
+[[package]]
+name = "widgetsnbextension"
+version = "4.0.15"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/bd/f4/c67440c7fb409a71b7404b7aefcd7569a9c0d6bd071299bf4198ae7a5d95/widgetsnbextension-4.0.15.tar.gz", hash = "sha256:de8610639996f1567952d763a5a41af8af37f2575a41f9852a38f947eb82a3b9", size = 1097402, upload-time = "2025-11-01T21:15:55.178Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl", hash = "sha256:8156704e4346a571d9ce73b84bee86a29906c9abfd7223b7228a28899ccf3366", size = 2196503, upload-time = "2025-11-01T21:15:53.565Z" },
+]
+
+[[package]]
+name = "wrapt"
+version = "2.2.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/2d/9f/06263fcd8ad6c405f05a3905fd7a84dd3176eb5ad46e44bccc0cd16348bb/wrapt-2.2.1.tar.gz", hash = "sha256:6744f504375775d7609c82c8d3d94af1c9a6f05586984536905908ba905277b9", size = 127620, upload-time = "2026-05-22T14:49:43.056Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/89/0c/bfae7b9401583b6d05938cd16dedc43857d96da2f8a3d50d78cc515bf6ff/wrapt-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3ffad790d9d11d8ecf9f17c4bb671a5b4089e4d8b575c46c5129597f41f836b0", size = 81021, upload-time = "2026-05-22T14:48:00.313Z" },
+ { url = "https://files.pythonhosted.org/packages/26/58/80f6a6599f933f4caecc1cb3ee88a04faf81e8b9bddbd6109c688dd63e0f/wrapt-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:628f5220c7a904d5fc78f7075c8d7871433eb6d035c94728a22fdf85f193d2a8", size = 81692, upload-time = "2026-05-22T14:48:01.49Z" },
+ { url = "https://files.pythonhosted.org/packages/17/93/fb357cc7847c58a8ae790be718903afa81a28d23e642c843dc4129e8a0b2/wrapt-2.2.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:61acce4257a9883669703c525447c5b4c392edf0f987ae77ec32668440158f0e", size = 169364, upload-time = "2026-05-22T14:48:02.791Z" },
+ { url = "https://files.pythonhosted.org/packages/aa/0b/76b601ee309a8bd556af0eecb184394c20b3c49aa9c8e085aa1ffacc2568/wrapt-2.2.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:727ab4244622cd6ad2390f322642090c877d2e83a608d2653a7643ae5368d926", size = 171079, upload-time = "2026-05-22T14:48:04.22Z" },
+ { url = "https://files.pythonhosted.org/packages/cd/87/ee3f32d5658e3e26d3e0e457922b47a36dd3bfbdfee7f97bb3e802344a66/wrapt-2.2.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:03df9ebed4c73ab93fa8c07e3d41d818dfca1852b15731a3de59457b27814624", size = 160205, upload-time = "2026-05-22T14:48:05.553Z" },
+ { url = "https://files.pythonhosted.org/packages/b1/d0/ae2fd64277a67f5d7bffcf2d05eea1e476263fb2a072baf0b0129ab85984/wrapt-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0d9ff006f420b2ec8296aa56ade43ea7da3e997e85769f0aafc5e0661aacb710", size = 168922, upload-time = "2026-05-22T14:48:07.132Z" },
+ { url = "https://files.pythonhosted.org/packages/b1/f3/2d541a060c5bbafb9400bca4917e4d78bfd1f239f404782c86831a8f6b29/wrapt-2.2.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:844c858fc3bb7eacc0ba8efa904935d16aac6a4470948ad1e7e55c9f5a2a665f", size = 158388, upload-time = "2026-05-22T14:48:08.629Z" },
+ { url = "https://files.pythonhosted.org/packages/1d/68/8d92c8800c57e93cb116ae9e9d6cbafc34fade5ee9f9107b6f203fb4dc35/wrapt-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:87bacdaf225117a342a20d9c03438d701c02112f6e3f351ce9b7f32354f14797", size = 167682, upload-time = "2026-05-22T14:48:10.042Z" },
+ { url = "https://files.pythonhosted.org/packages/30/72/83ea3790ea352439442349388e29ff07b76e0686265f9088bbb505d1608d/wrapt-2.2.1-cp312-cp312-win32.whl", hash = "sha256:2f8c90c8afde51969487be4e1343ae049b268854877d415c2510baf833775052", size = 77857, upload-time = "2026-05-22T14:48:11.782Z" },
+ { url = "https://files.pythonhosted.org/packages/ef/cb/99450668dd3502d62a54a1c8aa56e44f34cb8c1261b381cfe2e7926c3b75/wrapt-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ce32763ac31ce94fe9aada947e479b1975012bff166da409b4b9e4e376cf7e5", size = 80825, upload-time = "2026-05-22T14:48:13.046Z" },
+ { url = "https://files.pythonhosted.org/packages/e6/3a/87512881be64e743f9ee4c66f4cbe8e884974bef2a5989af71f999653ac7/wrapt-2.2.1-cp312-cp312-win_arm64.whl", hash = "sha256:8d1b4d0e0c2119587a31f5c029abd547e0c81d93b89d394566fe1588659eb579", size = 79087, upload-time = "2026-05-22T14:48:14.323Z" },
+ { url = "https://files.pythonhosted.org/packages/88/d1/a1b08f8f4fac8cbb156fa51cf64ee2c7f7f74f9875ba3cf70b3c58368694/wrapt-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d2beb1c7cab10603aecdc42f8edd6ff013f9a32e4543474e38e6b77ce9975aeb", size = 80831, upload-time = "2026-05-22T14:48:15.598Z" },
+ { url = "https://files.pythonhosted.org/packages/54/ce/57890814991446a845e09b3445ce8b694f27eb0577004f2c2a36a9772ed4/wrapt-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e0cb7e4dd71f4c32e5e84843cd3c4cd65dda034314004bbe1d7f99af2426ab80", size = 81375, upload-time = "2026-05-22T14:48:17.071Z" },
+ { url = "https://files.pythonhosted.org/packages/38/65/08d7a6c76ac4493bdb668205ee9c1de1bd5daca61717c3e9aa49b4c01499/wrapt-2.2.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:95821352042722cd9f1108874579a47989d0a7e12a37d87d2fc4af20fd99ab8a", size = 167417, upload-time = "2026-05-22T14:48:18.303Z" },
+ { url = "https://files.pythonhosted.org/packages/62/ce/f1ccbee7a1bfe5cdc6b3da6bab4b45713d628b9294da32a39f563d648140/wrapt-2.2.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:abd621552ede77c4c69be7fac44ba911225b0c812b6ba604e5964cf98085b474", size = 166948, upload-time = "2026-05-22T14:48:19.768Z" },
+ { url = "https://files.pythonhosted.org/packages/86/2a/f85d48d1cd4869aee6704028d257d740a47c1c467b457ce396b4b5b55d07/wrapt-2.2.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e3677c7146ce694874941ba82b57092cc4875445aadf29d72807351023105143", size = 158148, upload-time = "2026-05-22T14:48:21.96Z" },
+ { url = "https://files.pythonhosted.org/packages/fe/5c/93939ad11d4a12358ab1aab219a2ef5efa5612e0db6b9fc65af8af1a891b/wrapt-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9a5934eaea872e17936b5f45501eba5ab0bce9a74122e172b663d7c28c459c4a", size = 165905, upload-time = "2026-05-22T14:48:23.373Z" },
+ { url = "https://files.pythonhosted.org/packages/e0/22/b8c2aa89862ff58605934d7abf4b70e6a5a1c33df96656f49035ccdf1c8a/wrapt-2.2.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:f5b9daf6b629fce418e0cc3dd0436eac045188fa35deadb7a7f3941d5b8203f9", size = 156712, upload-time = "2026-05-22T14:48:24.767Z" },
+ { url = "https://files.pythonhosted.org/packages/5d/78/bf00a7b02239c12bb02ddcc3c0b971bfcc36e578c5a44f1ccfef5b458545/wrapt-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f53ac9f3ef573326d009ed809beff4efcac6451931c2b8132586da4b9e53ff31", size = 166560, upload-time = "2026-05-22T14:48:26.83Z" },
+ { url = "https://files.pythonhosted.org/packages/fe/93/6390ca9c5b787683cef588d04f57c8d41b9a2323b5597a65f18638c90ef2/wrapt-2.2.1-cp313-cp313-win32.whl", hash = "sha256:1ffa9cfd4bdb581539951b14ae661ff20ed0c3599b3e911a131ee0ec5ac11337", size = 77817, upload-time = "2026-05-22T14:48:28.221Z" },
+ { url = "https://files.pythonhosted.org/packages/97/73/ce10f0e71c0cfaa1a65faadb8efd4852028b3bb9ba28932b8889df769d38/wrapt-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:368eac1e20fd0bb03dd3cc42bf9887154c3861b60989389ccb5fac032617d215", size = 80736, upload-time = "2026-05-22T14:48:30.139Z" },
+ { url = "https://files.pythonhosted.org/packages/c7/4c/89f4a6818fafbbd840330e4fa3873073e1bfc166133a64cac7f8fde7a5e3/wrapt-2.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:c754dafdf5aaf0b401b644a90a30046929a0dd1a536e0ff0ec959a59155d9c7f", size = 79099, upload-time = "2026-05-22T14:48:31.405Z" },
+ { url = "https://files.pythonhosted.org/packages/bf/f2/9a8741c46f8c208ac0a45b25ba170bcb4fb72a2781d5fb97dbd7b6be73cb/wrapt-2.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:ed928d0fda15fc0adc8d13305c8b3c0f2fba5b0669950c9e6d019d9162a3b3e8", size = 82802, upload-time = "2026-05-22T14:48:33.307Z" },
+ { url = "https://files.pythonhosted.org/packages/9c/0d/e9c855716a3705eef1416456bdf062b60620726fdc59428ff670fc3c60dc/wrapt-2.2.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fafb4e739e43544d12cb4abd1605fd4683b6ca6a9ad682b7fd8f4d21973eafa8", size = 83329, upload-time = "2026-05-22T14:48:34.593Z" },
+ { url = "https://files.pythonhosted.org/packages/3b/d6/a88f1c13112b7831adac75cea65d8310e0d696d570c8961844c90a57b865/wrapt-2.2.1-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:74d6a0c31472fe5d814917266b9f46495d7c61ed890af08b468acea92fb89a8d", size = 202937, upload-time = "2026-05-22T14:48:35.859Z" },
+ { url = "https://files.pythonhosted.org/packages/42/65/e29d54aef06a4d898a5b8a25589a0b3769bde454f922fad8f6f89fbfb650/wrapt-2.2.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ab5be648d5a0b86b7438864f8df3c705a65cef35a2fd3e5561e3e203167e0f27", size = 209997, upload-time = "2026-05-22T14:48:38.153Z" },
+ { url = "https://files.pythonhosted.org/packages/2a/91/e4454263516cf0e12640912fbca9a83654e424f0a6ddb79f5cd7ce14bf33/wrapt-2.2.1-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9d8f204c8e3a8bf9ece17e0a83d137fd807440977f8a5e762d59306795011440", size = 194856, upload-time = "2026-05-22T14:48:39.69Z" },
+ { url = "https://files.pythonhosted.org/packages/de/d0/fe0ee202286afdf4a7f77dd29f195703145764d572aec209c5086e57d924/wrapt-2.2.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d047f6498c973874ba08ac3f97c69a2c4b2211c8de6f4c205f75cb1c9522596e", size = 205654, upload-time = "2026-05-22T14:48:43.456Z" },
+ { url = "https://files.pythonhosted.org/packages/23/b6/87d860dfc6460c246af70b1fd5c8b76df77571b42a493459423ded94fd7d/wrapt-2.2.1-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:7a4fdb9326aab4a5a477a1640e5ad786a8495901009d7e7b038371edd23a9d2b", size = 192206, upload-time = "2026-05-22T14:48:44.858Z" },
+ { url = "https://files.pythonhosted.org/packages/df/46/3eea8cde077d985f239a38c0257087b8064fd9ee9b1a99e282d2c86da4ef/wrapt-2.2.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c8cc5094b08abeae52da9c73c8a32003623be691a5193df2f4e3eac3d557c394", size = 198428, upload-time = "2026-05-22T14:48:46.319Z" },
+ { url = "https://files.pythonhosted.org/packages/18/dc/b927ee9c7fc67adc3a5658f246a0d275425eb840ba36e7b702e70f18bde8/wrapt-2.2.1-cp313-cp313t-win32.whl", hash = "sha256:9907a4402ab6db12b7077a0ea5d7a4d028ecb22c8eee2b53527080d347cd1562", size = 79448, upload-time = "2026-05-22T14:48:47.901Z" },
+ { url = "https://files.pythonhosted.org/packages/ec/b3/fd30b473fe498c70e6b9a5f328b8d3fbaf1b8c3c481465f59724bba8eb70/wrapt-2.2.1-cp313-cp313t-win_amd64.whl", hash = "sha256:5590d63f5243251641cf543009b4c9314a79d0598fdb8a8e4cfc918494536c53", size = 83021, upload-time = "2026-05-22T14:48:49.201Z" },
+ { url = "https://files.pythonhosted.org/packages/ee/f3/96c39153a8737a6e9aa85adef254ac4195bea3f2d24efc60472ccc3c9e2e/wrapt-2.2.1-cp313-cp313t-win_arm64.whl", hash = "sha256:c318a64b53d97b841d7b5e637517e50a27be64bc695128422953d4b21710954e", size = 80295, upload-time = "2026-05-22T14:48:50.479Z" },
+ { url = "https://files.pythonhosted.org/packages/0a/a3/11d7f34ebbf3231bc907a3e6d5ee051b14d034c1bc7b65a97d5cc00516df/wrapt-2.2.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:6f56a647e4eaf5f0ca40330fb070f566bdf9f7b0db89a1af20d71c28dcd7a0ab", size = 80879, upload-time = "2026-05-22T14:48:51.802Z" },
+ { url = "https://files.pythonhosted.org/packages/13/3c/b74cfd984cef560b900fb1a727af20352d89e1f06bf2e1114dd3f00f5f5a/wrapt-2.2.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:64b7deeda4b70408e382328d8bbe52a256fe9bc63ae3db86d804608367e5422c", size = 81462, upload-time = "2026-05-22T14:48:53.18Z" },
+ { url = "https://files.pythonhosted.org/packages/15/a3/7c8f704b8dc07dfe0a5d01c2edbfd88317aa8e5e3fa7c743eb7a085ae767/wrapt-2.2.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b9cf53ba90717db2e292401de290776c498d4bbfb0d4a559ca2895db8b9dcb5c", size = 167251, upload-time = "2026-05-22T14:48:54.562Z" },
+ { url = "https://files.pythonhosted.org/packages/80/85/a34d1888d97247da6c2ff6118c3a721c73ed8cc4dd198c00208bb73b6f80/wrapt-2.2.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cf3638274ab9d9b724c9baa0b4c04e132cd6faefb78b4dd3dd1a02a4bdaad41e", size = 166316, upload-time = "2026-05-22T14:48:56.065Z" },
+ { url = "https://files.pythonhosted.org/packages/e9/d7/72ffaeb01eebc704afe3fb99e840480f4bda45f0fa66e3381b6a39251c8f/wrapt-2.2.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:aed9658797d0b45d6c49adcfc6b41f66e6f2d0c6de3ec79e16cf4b1855df240f", size = 157952, upload-time = "2026-05-22T14:48:57.924Z" },
+ { url = "https://files.pythonhosted.org/packages/24/5b/36f5d6b024e4edfdd90b140742d11ebcf7836daf5c9daf326c55c24db412/wrapt-2.2.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1d676ee388bc42a04d56dd7deb5605244dac2e35cc2fadbb43c9fa25bbd93508", size = 166130, upload-time = "2026-05-22T14:48:59.384Z" },
+ { url = "https://files.pythonhosted.org/packages/81/06/9296d9e97bfdef5483dfcc859d57b095b257144b2bc5300ab521e06f4bc7/wrapt-2.2.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e395f7bc31851ef9b612050368cb446e9bc14cd7454b025018980349caf25ae5", size = 156604, upload-time = "2026-05-22T14:49:00.921Z" },
+ { url = "https://files.pythonhosted.org/packages/53/37/16953929ed6776175720e58fc966e779926d8d71e2c7b2273230590ca71f/wrapt-2.2.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5f1845c2a8cc1180ccccfa45785dd06f562730d19ef75be180334254012b6283", size = 166007, upload-time = "2026-05-22T14:49:02.332Z" },
+ { url = "https://files.pythonhosted.org/packages/b9/73/20ee58c0612dae7c31131a7095345812ed2c7b389019e175f68cde34e5b4/wrapt-2.2.1-cp314-cp314-win32.whl", hash = "sha256:436addbc4bb4fc0a88c702577f51195d7d73683a7f3e0e5b253d8404d7847243", size = 78327, upload-time = "2026-05-22T14:49:03.722Z" },
+ { url = "https://files.pythonhosted.org/packages/22/b3/ef7c3295d02e0448a71c639a36a057f46d524d057c9486291a7a3039e65c/wrapt-2.2.1-cp314-cp314-win_amd64.whl", hash = "sha256:50972a1d974ea07725a7f6b1cec5f8759008afd030a0024843ebe7d52de47f2b", size = 81144, upload-time = "2026-05-22T14:49:05.093Z" },
+ { url = "https://files.pythonhosted.org/packages/ac/dc/7bdf336953f99f4ceb0a584bb8870e42c8f26f93ea10c87834dad62f1668/wrapt-2.2.1-cp314-cp314-win_arm64.whl", hash = "sha256:1c9934ea5d92957e3cd0adbc0845539dccfd62710ebe16195a8c66c53954db36", size = 79569, upload-time = "2026-05-22T14:49:06.413Z" },
+ { url = "https://files.pythonhosted.org/packages/6a/6d/6dfae80150ff1919c356d1dd528f049bcdfaae29b4d284bc957e022caef4/wrapt-2.2.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:17de18fc12cea55b8a9587314cb830573e37fb33b247a7515696350863714188", size = 82892, upload-time = "2026-05-22T14:49:07.925Z" },
+ { url = "https://files.pythonhosted.org/packages/82/7b/4e34766a7d7804ffce9e71befe47e9b3225dc350c49c94493c4ab39fd3a5/wrapt-2.2.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a9dec1aca52dddde7df94818310fa2fe79739c8f385b2014c4cb1035f5508199", size = 83333, upload-time = "2026-05-22T14:49:09.257Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/57/0b34db3e8de44ccfece62d7b337abd1631dd810f5adc5f3db571727836b5/wrapt-2.2.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:69f2e9244542cb34dd59c7f073445b9e54ad9f3fce8d93606c368a1b499fc413", size = 202899, upload-time = "2026-05-22T14:49:10.572Z" },
+ { url = "https://files.pythonhosted.org/packages/e5/45/ac0c459f154b99d92789a6cba7ca727185b83513b986f8ec7fe2aacddcbf/wrapt-2.2.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2d83966dc7f4f45e8b97b5933685ac2e6e67fc0e19246ea314bceb9a8970c956", size = 209986, upload-time = "2026-05-22T14:49:12.229Z" },
+ { url = "https://files.pythonhosted.org/packages/b7/e4/77e37ff33ad018fa81ade52c25fa327b80b56f81d734279a63614fcb4cbc/wrapt-2.2.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:78b0aa6bfb7be8deed0ab23e7aa028cc5210c29bc2d32a04d52b50e517a7307e", size = 194893, upload-time = "2026-05-22T14:49:14.139Z" },
+ { url = "https://files.pythonhosted.org/packages/dd/9d/7ea651d1ab032fc5fa222fbec91d0f8a1397f6ae04ebb93fa7219aa921d7/wrapt-2.2.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:05d5cb74d1b232ec8cfa130a8f900708699ff2491d97b8f85a4cdc5996294b85", size = 205636, upload-time = "2026-05-22T14:49:15.714Z" },
+ { url = "https://files.pythonhosted.org/packages/09/af/8e88031a701275b9085c54e64bc88c0b1cd55c77eadd400691c371cd76c4/wrapt-2.2.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f6518b94edb9150452e9aba08027d4cc293433753ec1fbefb4629a21cbc74181", size = 192267, upload-time = "2026-05-22T14:49:17.283Z" },
+ { url = "https://files.pythonhosted.org/packages/bf/a8/e657ca876b06710194f243d81c4b0896ade646e244bdbec2d87c8c56a8bd/wrapt-2.2.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ed55af48b3eb28f43228ca2306788892bcb629eb2b5c4876e2a3659872c2f17a", size = 198378, upload-time = "2026-05-22T14:49:18.785Z" },
+ { url = "https://files.pythonhosted.org/packages/c8/59/822efe4ea722a3961331bfa35b7d90937790d2c20f0616de1997ccc3aebd/wrapt-2.2.1-cp314-cp314t-win32.whl", hash = "sha256:2e08688ab16525897da6589d56d0aebaf417bbe91c2d8e3b96203b1efa596e85", size = 80226, upload-time = "2026-05-22T14:49:20.264Z" },
+ { url = "https://files.pythonhosted.org/packages/ab/31/2a7dc5f6abb2fca0b6e1610e120419f603650aceb4f1d3ac4cae0354e162/wrapt-2.2.1-cp314-cp314t-win_amd64.whl", hash = "sha256:fd0135d34387f5fd087d9be368ea77ea89cf2451dc1cd1c622d35021bcb3ab50", size = 83835, upload-time = "2026-05-22T14:49:21.634Z" },
+ { url = "https://files.pythonhosted.org/packages/9f/c0/782b86e28d1ceebeb74cccea12d2cd3d2ba0bd68e3dec20b1bc5873f6127/wrapt-2.2.1-cp314-cp314t-win_arm64.whl", hash = "sha256:f70db64e8266d7c45d3b735f2e08eeb434b5e03da9a479ae42b2e2e486a21a00", size = 80722, upload-time = "2026-05-22T14:49:23.59Z" },
+ { url = "https://files.pythonhosted.org/packages/53/46/29ac9daf11a86c22a8c38cd9236c62928ccae83f7ceb06bd3b0467cf9d05/wrapt-2.2.1-py3-none-any.whl", hash = "sha256:3aafea2975caef8ca49400640dde02cc7426e798f24870ed01f490bc3cffd32f", size = 61000, upload-time = "2026-05-22T14:49:41.593Z" },
+]
+
+[[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, upload-time = "2026-05-19T21:31:05.599Z" }
+wheels = [
+ { 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, upload-time = "2026-05-19T21:28:51.695Z" },
+ { 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, upload-time = "2026-05-19T21:28:53.242Z" },
+ { 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, upload-time = "2026-05-19T21:28:54.865Z" },
+ { 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, upload-time = "2026-05-19T21:28:56.963Z" },
+ { 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, upload-time = "2026-05-19T21:28:58.56Z" },
+ { 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, upload-time = "2026-05-19T21:29:00.148Z" },
+ { 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, upload-time = "2026-05-19T21:29:02.155Z" },
+ { 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, upload-time = "2026-05-19T21:29:04.247Z" },
+ { 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, upload-time = "2026-05-19T21:29:06.491Z" },
+ { 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, upload-time = "2026-05-19T21:29:08.267Z" },
+ { 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, upload-time = "2026-05-19T21:29:10.682Z" },
+ { 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, upload-time = "2026-05-19T21:29:12.954Z" },
+ { 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, upload-time = "2026-05-19T21:29:14.893Z" },
+ { 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, upload-time = "2026-05-19T21:29:16.485Z" },
+ { 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, upload-time = "2026-05-19T21:29:18.367Z" },
+ { url = "https://files.pythonhosted.org/packages/a7/25/722e3b93bd687009afb2d59a35e13d30ddd8f80571445bb0c4e4ce26ec66/yarl-1.24.2-cp312-cp312-win_amd64.whl", hash = "sha256:7dafe10c12ddd4d120d528c4b5599c953bd7b12845347d507b95451195bb6cad", size = 92901, upload-time = "2026-05-19T21:29:20.014Z" },
+ { url = "https://files.pythonhosted.org/packages/39/47/4486ccfb674c04854a1ef8aa77868b6a6f765feaf69633409d7ca4f02cb8/yarl-1.24.2-cp312-cp312-win_arm64.whl", hash = "sha256:044a09d8401fcf8681977faef6d286b8ade1e2d2e9dceda175d1cfa5ca496f30", size = 87229, upload-time = "2026-05-19T21:29:22.1Z" },
+ { 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, upload-time = "2026-05-19T21:29:23.83Z" },
+ { 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, upload-time = "2026-05-19T21:29:25.375Z" },
+ { 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, upload-time = "2026-05-19T21:29:26.928Z" },
+ { 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, upload-time = "2026-05-19T21:29:28.842Z" },
+ { 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, upload-time = "2026-05-19T21:29:31.086Z" },
+ { 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, upload-time = "2026-05-19T21:29:32.657Z" },
+ { 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, upload-time = "2026-05-19T21:29:34.379Z" },
+ { 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, upload-time = "2026-05-19T21:29:36.216Z" },
+ { 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, upload-time = "2026-05-19T21:29:38.746Z" },
+ { 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, upload-time = "2026-05-19T21:29:40.368Z" },
+ { 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, upload-time = "2026-05-19T21:29:42.66Z" },
+ { 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, upload-time = "2026-05-19T21:29:44.632Z" },
+ { 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, upload-time = "2026-05-19T21:29:46.755Z" },
+ { 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, upload-time = "2026-05-19T21:29:48.972Z" },
+ { 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, upload-time = "2026-05-19T21:29:51Z" },
+ { url = "https://files.pythonhosted.org/packages/92/dd/3ae5fe417e9d1c353a548553326eb9935e76b6b727161563b424cc296df3/yarl-1.24.2-cp313-cp313-win_amd64.whl", hash = "sha256:7d37fb7c38f2b6edab0f845c4f85148d4c44204f52bc127021bd2bc9fdbf1656", size = 92667, upload-time = "2026-05-19T21:29:52.743Z" },
+ { url = "https://files.pythonhosted.org/packages/10/cc/a7beb239f78f27fca1b053c8e8595e4179c02e62249b4687ec218c370c50/yarl-1.24.2-cp313-cp313-win_arm64.whl", hash = "sha256:1e831894be7c2954240e49791fa4b50c05a0dc881de2552cfe3ffd8631c7f461", size = 87069, upload-time = "2026-05-19T21:29:54.442Z" },
+ { 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, upload-time = "2026-05-19T21:29:56.631Z" },
+ { 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, upload-time = "2026-05-19T21:29:58.645Z" },
+ { 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, upload-time = "2026-05-19T21:30:00.412Z" },
+ { 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, upload-time = "2026-05-19T21:30:02.544Z" },
+ { 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, upload-time = "2026-05-19T21:30:04.319Z" },
+ { 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, upload-time = "2026-05-19T21:30:05.988Z" },
+ { 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, upload-time = "2026-05-19T21:30:07.738Z" },
+ { 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, upload-time = "2026-05-19T21:30:09.713Z" },
+ { 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, upload-time = "2026-05-19T21:30:11.365Z" },
+ { 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, upload-time = "2026-05-19T21:30:12.978Z" },
+ { 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, upload-time = "2026-05-19T21:30:15.001Z" },
+ { 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, upload-time = "2026-05-19T21:30:16.683Z" },
+ { 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, upload-time = "2026-05-19T21:30:18.769Z" },
+ { 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, upload-time = "2026-05-19T21:30:21.024Z" },
+ { 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, upload-time = "2026-05-19T21:30:23.412Z" },
+ { url = "https://files.pythonhosted.org/packages/fa/d9/5582d57e2b2db9b85eb6663a22efdd78e08805f3f5389566e9fcad254d1b/yarl-1.24.2-cp314-cp314-win_amd64.whl", hash = "sha256:afb00d7fd8e0f285ca29a44cc50df2d622ff2f7a6d933fa641577b5f9d5f3db0", size = 94424, upload-time = "2026-05-19T21:30:25.425Z" },
+ { url = "https://files.pythonhosted.org/packages/92/10/7dc07a0e22806a9280f42a57361395506e800c64e22737cd7b0886feab42/yarl-1.24.2-cp314-cp314-win_arm64.whl", hash = "sha256:68cf6eacd6028ef1142bc4b48376b81566385ca6f9e7dde3b0fa91be08ffcb57", size = 88690, upload-time = "2026-05-19T21:30:27.623Z" },
+ { 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, upload-time = "2026-05-19T21:30:29.297Z" },
+ { 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, upload-time = "2026-05-19T21:30:31.031Z" },
+ { 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, upload-time = "2026-05-19T21:30:33.062Z" },
+ { 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, upload-time = "2026-05-19T21:30:34.842Z" },
+ { 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, upload-time = "2026-05-19T21:30:37.724Z" },
+ { 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, upload-time = "2026-05-19T21:30:40.196Z" },
+ { 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, upload-time = "2026-05-19T21:30:41.888Z" },
+ { 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, upload-time = "2026-05-19T21:30:43.985Z" },
+ { 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, upload-time = "2026-05-19T21:30:46.291Z" },
+ { 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, upload-time = "2026-05-19T21:30:48.085Z" },
+ { 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, upload-time = "2026-05-19T21:30:49.785Z" },
+ { 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, upload-time = "2026-05-19T21:30:51.862Z" },
+ { 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, upload-time = "2026-05-19T21:30:53.62Z" },
+ { 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, upload-time = "2026-05-19T21:30:55.962Z" },
+ { 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, upload-time = "2026-05-19T21:30:57.962Z" },
+ { url = "https://files.pythonhosted.org/packages/8f/be/f9f7594e23b5b93affff0318e4593c1920331bcaefda326cabcad94296a1/yarl-1.24.2-cp314-cp314t-win_amd64.whl", hash = "sha256:a7624b1ca46ca5d7b864ef0d2f8efe3091454085ee1855b4e992314529972215", size = 102980, upload-time = "2026-05-19T21:30:59.735Z" },
+ { url = "https://files.pythonhosted.org/packages/65/a4/ba80dccd3593ff1f01051a818694d07b58cb8232677ee9a22a5a1f93a9fc/yarl-1.24.2-cp314-cp314t-win_arm64.whl", hash = "sha256:e434a45ce2e7a947f951fc5a8944c8cc080b7e59f9c50ae80fd39107cf88126d", size = 91219, upload-time = "2026-05-19T21:31:01.934Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/4d/4b880086bd0d3e034d25647be1d830afc3e3f610e98c4ab3490af6b1b6d5/yarl-1.24.2-py3-none-any.whl", hash = "sha256:2783d9226db8797636cd6896e4de81feed252d1db72265686c9558d97a4d94b9", size = 53576, upload-time = "2026-05-19T21:31:03.909Z" },
+]