From 2b1d05f02c69b93dd3be343103bc63f7d5782977 Mon Sep 17 00:00:00 2001 From: Eddie Nielsen <“ed”@edcore.dk”> Date: Wed, 25 Mar 2026 11:24:54 +0000 Subject: [PATCH] Make SubFox production-ready with parallel translation and UI controls --- .env | 2 + .env.example | 2 + .gitignore | 0 .venv/bin/Activate.ps1 | 247 + .venv/bin/activate | 69 + .venv/bin/activate.csh | 26 + .venv/bin/activate.fish | 69 + .venv/bin/deep-translator | 6 + .venv/bin/distro | 6 + .venv/bin/dt | 6 + .venv/bin/fastapi | 6 + .venv/bin/httpx | 6 + .venv/bin/normalizer | 6 + .venv/bin/openai | 6 + .venv/bin/pip | 8 + .venv/bin/pip3 | 8 + .venv/bin/pip3.10 | 8 + .venv/bin/python | 1 + .venv/bin/python3 | 1 + .venv/bin/python3.10 | 1 + .venv/bin/tqdm | 6 + .venv/bin/uvicorn | 6 + ...821__mypyc.cpython-310-x86_64-linux-gnu.so | Bin 0 -> 414480 bytes .../typing_extensions.cpython-310.pyc | Bin 0 -> 115608 bytes .../site-packages/_distutils_hack/__init__.py | 132 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 5106 bytes .../__pycache__/override.cpython-310.pyc | Bin 0 -> 231 bytes .../site-packages/_distutils_hack/override.py | 1 + .../annotated_doc-0.0.4.dist-info/INSTALLER | 1 + .../annotated_doc-0.0.4.dist-info/METADATA | 145 + .../annotated_doc-0.0.4.dist-info/RECORD | 11 + .../annotated_doc-0.0.4.dist-info/WHEEL | 4 + .../entry_points.txt | 4 + .../licenses/LICENSE | 21 + .../site-packages/annotated_doc/__init__.py | 3 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 236 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 1618 bytes .../site-packages/annotated_doc/main.py | 36 + .../site-packages/annotated_doc/py.typed | 0 .../annotated_types-0.7.0.dist-info/INSTALLER | 1 + .../annotated_types-0.7.0.dist-info/METADATA | 295 + .../annotated_types-0.7.0.dist-info/RECORD | 10 + .../annotated_types-0.7.0.dist-info/WHEEL | 4 + .../licenses/LICENSE | 21 + .../site-packages/annotated_types/__init__.py | 432 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 14597 bytes .../__pycache__/test_cases.cpython-310.pyc | Bin 0 -> 5637 bytes .../site-packages/annotated_types/py.typed | 0 .../annotated_types/test_cases.py | 151 + .../anyio-4.13.0.dist-info/INSTALLER | 1 + .../anyio-4.13.0.dist-info/METADATA | 105 + .../anyio-4.13.0.dist-info/RECORD | 92 + .../anyio-4.13.0.dist-info/WHEEL | 5 + .../anyio-4.13.0.dist-info/entry_points.txt | 2 + .../anyio-4.13.0.dist-info/licenses/LICENSE | 20 + .../anyio-4.13.0.dist-info/top_level.txt | 1 + .../site-packages/anyio/__init__.py | 111 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 4285 bytes .../__pycache__/from_thread.cpython-310.pyc | Bin 0 -> 18776 bytes .../__pycache__/functools.cpython-310.pyc | Bin 0 -> 11224 bytes .../__pycache__/lowlevel.cpython-310.pyc | Bin 0 -> 6168 bytes .../__pycache__/pytest_plugin.cpython-310.pyc | Bin 0 -> 10941 bytes .../to_interpreter.cpython-310.pyc | Bin 0 -> 7064 bytes .../__pycache__/to_process.cpython-310.pyc | Bin 0 -> 6737 bytes .../__pycache__/to_thread.cpython-310.pyc | Bin 0 -> 2866 bytes .../site-packages/anyio/_backends/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 180 bytes .../__pycache__/_asyncio.cpython-310.pyc | Bin 0 -> 79595 bytes .../__pycache__/_trio.cpython-310.pyc | Bin 0 -> 44762 bytes .../site-packages/anyio/_backends/_asyncio.py | 2996 ++++++ .../site-packages/anyio/_backends/_trio.py | 1343 +++ .../site-packages/anyio/_core/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 176 bytes .../_asyncio_selector_thread.cpython-310.pyc | Bin 0 -> 4106 bytes .../_contextmanagers.cpython-310.pyc | Bin 0 -> 6983 bytes .../__pycache__/_eventloop.cpython-310.pyc | Bin 0 -> 6337 bytes .../__pycache__/_exceptions.cpython-310.pyc | Bin 0 -> 6044 bytes .../_core/__pycache__/_fileio.cpython-310.pyc | Bin 0 -> 27614 bytes .../__pycache__/_resources.cpython-310.pyc | Bin 0 -> 755 bytes .../__pycache__/_signals.cpython-310.pyc | Bin 0 -> 1302 bytes .../__pycache__/_sockets.cpython-310.pyc | Bin 0 -> 29596 bytes .../__pycache__/_streams.cpython-310.pyc | Bin 0 -> 1988 bytes .../__pycache__/_subprocesses.cpython-310.pyc | Bin 0 -> 7510 bytes .../_synchronization.cpython-310.pyc | Bin 0 -> 24581 bytes .../_core/__pycache__/_tasks.cpython-310.pyc | Bin 0 -> 6529 bytes .../__pycache__/_tempfile.cpython-310.pyc | Bin 0 -> 19312 bytes .../__pycache__/_testing.cpython-310.pyc | Bin 0 -> 3133 bytes .../__pycache__/_typedattr.cpython-310.pyc | Bin 0 -> 3315 bytes .../anyio/_core/_asyncio_selector_thread.py | 167 + .../anyio/_core/_contextmanagers.py | 200 + .../site-packages/anyio/_core/_eventloop.py | 234 + .../site-packages/anyio/_core/_exceptions.py | 156 + .../site-packages/anyio/_core/_fileio.py | 799 ++ .../site-packages/anyio/_core/_resources.py | 18 + .../site-packages/anyio/_core/_signals.py | 29 + .../site-packages/anyio/_core/_sockets.py | 1003 ++ .../site-packages/anyio/_core/_streams.py | 52 + .../anyio/_core/_subprocesses.py | 196 + .../anyio/_core/_synchronization.py | 757 ++ .../site-packages/anyio/_core/_tasks.py | 173 + .../site-packages/anyio/_core/_tempfile.py | 613 ++ .../site-packages/anyio/_core/_testing.py | 82 + .../site-packages/anyio/_core/_typedattr.py | 81 + .../site-packages/anyio/abc/__init__.py | 58 + .../abc/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 2165 bytes .../__pycache__/_eventloop.cpython-310.pyc | Bin 0 -> 13695 bytes .../__pycache__/_resources.cpython-310.pyc | Bin 0 -> 1449 bytes .../abc/__pycache__/_sockets.cpython-310.pyc | Bin 0 -> 13322 bytes .../abc/__pycache__/_streams.cpython-310.pyc | Bin 0 -> 8581 bytes .../__pycache__/_subprocesses.cpython-310.pyc | Bin 0 -> 2982 bytes .../abc/__pycache__/_tasks.cpython-310.pyc | Bin 0 -> 4695 bytes .../abc/__pycache__/_testing.cpython-310.pyc | Bin 0 -> 2606 bytes .../site-packages/anyio/abc/_eventloop.py | 409 + .../site-packages/anyio/abc/_resources.py | 33 + .../site-packages/anyio/abc/_sockets.py | 399 + .../site-packages/anyio/abc/_streams.py | 233 + .../site-packages/anyio/abc/_subprocesses.py | 79 + .../site-packages/anyio/abc/_tasks.py | 117 + .../site-packages/anyio/abc/_testing.py | 65 + .../site-packages/anyio/from_thread.py | 578 ++ .../site-packages/anyio/functools.py | 409 + .../site-packages/anyio/lowlevel.py | 196 + .../python3.10/site-packages/anyio/py.typed | 0 .../site-packages/anyio/pytest_plugin.py | 363 + .../site-packages/anyio/streams/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 178 bytes .../__pycache__/buffered.cpython-310.pyc | Bin 0 -> 6476 bytes .../streams/__pycache__/file.cpython-310.pyc | Bin 0 -> 5528 bytes .../__pycache__/memory.cpython-310.pyc | Bin 0 -> 10097 bytes .../__pycache__/stapled.cpython-310.pyc | Bin 0 -> 5409 bytes .../streams/__pycache__/text.cpython-310.pyc | Bin 0 -> 7136 bytes .../streams/__pycache__/tls.cpython-310.pyc | Bin 0 -> 12780 bytes .../site-packages/anyio/streams/buffered.py | 188 + .../site-packages/anyio/streams/file.py | 154 + .../site-packages/anyio/streams/memory.py | 325 + .../site-packages/anyio/streams/stapled.py | 147 + .../site-packages/anyio/streams/text.py | 176 + .../site-packages/anyio/streams/tls.py | 421 + .../site-packages/anyio/to_interpreter.py | 246 + .../site-packages/anyio/to_process.py | 266 + .../site-packages/anyio/to_thread.py | 78 + .../beautifulsoup4-4.14.3.dist-info/INSTALLER | 1 + .../beautifulsoup4-4.14.3.dist-info/METADATA | 123 + .../beautifulsoup4-4.14.3.dist-info/RECORD | 37 + .../beautifulsoup4-4.14.3.dist-info/WHEEL | 4 + .../licenses/AUTHORS | 49 + .../licenses/LICENSE | 31 + .../python3.10/site-packages/bs4/__init__.py | 1174 +++ .../bs4/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 28551 bytes .../__pycache__/_deprecation.cpython-310.pyc | Bin 0 -> 2748 bytes .../bs4/__pycache__/_typing.cpython-310.pyc | Bin 0 -> 3062 bytes .../bs4/__pycache__/_warnings.cpython-310.pyc | Bin 0 -> 5310 bytes .../bs4/__pycache__/css.cpython-310.pyc | Bin 0 -> 12492 bytes .../bs4/__pycache__/dammit.cpython-310.pyc | Bin 0 -> 35455 bytes .../bs4/__pycache__/diagnose.cpython-310.pyc | Bin 0 -> 8593 bytes .../bs4/__pycache__/element.cpython-310.pyc | Bin 0 -> 87029 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 0 -> 1479 bytes .../bs4/__pycache__/filter.cpython-310.pyc | Bin 0 -> 21885 bytes .../bs4/__pycache__/formatter.cpython-310.pyc | Bin 0 -> 8413 bytes .../site-packages/bs4/_deprecation.py | 80 + .../python3.10/site-packages/bs4/_typing.py | 205 + .../python3.10/site-packages/bs4/_warnings.py | 98 + .../site-packages/bs4/builder/__init__.py | 848 ++ .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 22644 bytes .../__pycache__/_html5lib.cpython-310.pyc | Bin 0 -> 15371 bytes .../__pycache__/_htmlparser.cpython-310.pyc | Bin 0 -> 10742 bytes .../builder/__pycache__/_lxml.cpython-310.pyc | Bin 0 -> 12688 bytes .../site-packages/bs4/builder/_html5lib.py | 611 ++ .../site-packages/bs4/builder/_htmlparser.py | 462 + .../site-packages/bs4/builder/_lxml.py | 501 + .venv/lib/python3.10/site-packages/bs4/css.py | 339 + .../python3.10/site-packages/bs4/dammit.py | 1516 +++ .../python3.10/site-packages/bs4/diagnose.py | 268 + .../python3.10/site-packages/bs4/element.py | 3211 ++++++ .../site-packages/bs4/exceptions.py | 28 + .../python3.10/site-packages/bs4/filter.py | 764 ++ .../python3.10/site-packages/bs4/formatter.py | 276 + .../lib/python3.10/site-packages/bs4/py.typed | 0 .../certifi-2026.2.25.dist-info/INSTALLER | 1 + .../certifi-2026.2.25.dist-info/METADATA | 78 + .../certifi-2026.2.25.dist-info/RECORD | 14 + .../certifi-2026.2.25.dist-info/WHEEL | 5 + .../licenses/LICENSE | 20 + .../certifi-2026.2.25.dist-info/top_level.txt | 1 + .../site-packages/certifi/__init__.py | 4 + .../site-packages/certifi/__main__.py | 12 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 285 bytes .../__pycache__/__main__.cpython-310.pyc | Bin 0 -> 423 bytes .../certifi/__pycache__/core.cpython-310.pyc | Bin 0 -> 1398 bytes .../site-packages/certifi/cacert.pem | 4494 +++++++++ .../python3.10/site-packages/certifi/core.py | 83 + .../python3.10/site-packages/certifi/py.typed | 0 .../INSTALLER | 1 + .../METADATA | 798 ++ .../charset_normalizer-3.4.6.dist-info/RECORD | 36 + .../charset_normalizer-3.4.6.dist-info/WHEEL | 7 + .../entry_points.txt | 2 + .../licenses/LICENSE | 21 + .../top_level.txt | 2 + .../charset_normalizer/__init__.py | 48 + .../charset_normalizer/__main__.py | 6 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1627 bytes .../__pycache__/__main__.cpython-310.pyc | Bin 0 -> 316 bytes .../__pycache__/api.cpython-310.pyc | Bin 0 -> 14750 bytes .../__pycache__/cd.cpython-310.pyc | Bin 0 -> 10616 bytes .../__pycache__/constant.cpython-310.pyc | Bin 0 -> 34466 bytes .../__pycache__/legacy.cpython-310.pyc | Bin 0 -> 2268 bytes .../__pycache__/md.cpython-310.pyc | Bin 0 -> 18005 bytes .../__pycache__/models.cpython-310.pyc | Bin 0 -> 12143 bytes .../__pycache__/utils.cpython-310.pyc | Bin 0 -> 10035 bytes .../__pycache__/version.cpython-310.pyc | Bin 0 -> 318 bytes .../site-packages/charset_normalizer/api.py | 974 ++ .../cd.cpython-310-x86_64-linux-gnu.so | Bin 0 -> 15912 bytes .../site-packages/charset_normalizer/cd.py | 454 + .../charset_normalizer/cli/__init__.py | 8 + .../charset_normalizer/cli/__main__.py | 362 + .../cli/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 319 bytes .../cli/__pycache__/__main__.cpython-310.pyc | Bin 0 -> 8753 bytes .../charset_normalizer/constant.py | 2050 ++++ .../charset_normalizer/legacy.py | 79 + .../md.cpython-310-x86_64-linux-gnu.so | Bin 0 -> 15912 bytes .../site-packages/charset_normalizer/md.py | 936 ++ .../charset_normalizer/models.py | 359 + .../site-packages/charset_normalizer/py.typed | 0 .../site-packages/charset_normalizer/utils.py | 422 + .../charset_normalizer/version.py | 8 + .../click-8.3.1.dist-info/INSTALLER | 1 + .../click-8.3.1.dist-info/METADATA | 84 + .../click-8.3.1.dist-info/RECORD | 40 + .../site-packages/click-8.3.1.dist-info/WHEEL | 4 + .../licenses/LICENSE.txt | 28 + .../site-packages/click/__init__.py | 123 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 3652 bytes .../click/__pycache__/_compat.cpython-310.pyc | Bin 0 -> 16027 bytes .../__pycache__/_termui_impl.cpython-310.pyc | Bin 0 -> 18061 bytes .../__pycache__/_textwrap.cpython-310.pyc | Bin 0 -> 1654 bytes .../click/__pycache__/_utils.cpython-310.pyc | Bin 0 -> 903 bytes .../__pycache__/_winconsole.cpython-310.pyc | Bin 0 -> 8267 bytes .../click/__pycache__/core.cpython-310.pyc | Bin 0 -> 98613 bytes .../__pycache__/decorators.cpython-310.pyc | Bin 0 -> 17558 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 0 -> 11024 bytes .../__pycache__/formatting.cpython-310.pyc | Bin 0 -> 9694 bytes .../click/__pycache__/globals.cpython-310.pyc | Bin 0 -> 2474 bytes .../click/__pycache__/parser.cpython-310.pyc | Bin 0 -> 14148 bytes .../shell_completion.cpython-310.pyc | Bin 0 -> 18295 bytes .../click/__pycache__/termui.cpython-310.pyc | Bin 0 -> 29030 bytes .../click/__pycache__/testing.cpython-310.pyc | Bin 0 -> 19205 bytes .../click/__pycache__/types.cpython-310.pyc | Bin 0 -> 37279 bytes .../click/__pycache__/utils.cpython-310.pyc | Bin 0 -> 19101 bytes .../python3.10/site-packages/click/_compat.py | 622 ++ .../site-packages/click/_termui_impl.py | 852 ++ .../site-packages/click/_textwrap.py | 51 + .../python3.10/site-packages/click/_utils.py | 36 + .../site-packages/click/_winconsole.py | 296 + .../python3.10/site-packages/click/core.py | 3415 +++++++ .../site-packages/click/decorators.py | 551 + .../site-packages/click/exceptions.py | 308 + .../site-packages/click/formatting.py | 301 + .../python3.10/site-packages/click/globals.py | 67 + .../python3.10/site-packages/click/parser.py | 532 + .../python3.10/site-packages/click/py.typed | 0 .../site-packages/click/shell_completion.py | 667 ++ .../python3.10/site-packages/click/termui.py | 883 ++ .../python3.10/site-packages/click/testing.py | 577 ++ .../python3.10/site-packages/click/types.py | 1209 +++ .../python3.10/site-packages/click/utils.py | 627 ++ .../INSTALLER | 1 + .../deep_translator-1.11.4.dist-info/LICENSE | 201 + .../deep_translator-1.11.4.dist-info/METADATA | 960 ++ .../deep_translator-1.11.4.dist-info/RECORD | 51 + .../REQUESTED | 0 .../deep_translator-1.11.4.dist-info/WHEEL | 4 + .../entry_points.txt | 4 + .../site-packages/deep_translator/__init__.py | 38 + .../site-packages/deep_translator/__main__.py | 12 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1330 bytes .../__pycache__/__main__.cpython-310.pyc | Bin 0 -> 444 bytes .../__pycache__/baidu.cpython-310.pyc | Bin 0 -> 3508 bytes .../__pycache__/base.cpython-310.pyc | Bin 0 -> 6117 bytes .../__pycache__/chatgpt.cpython-310.pyc | Bin 0 -> 2408 bytes .../__pycache__/cli.cpython-310.pyc | Bin 0 -> 3164 bytes .../__pycache__/constants.cpython-310.pyc | Bin 0 -> 17223 bytes .../__pycache__/deepl.cpython-310.pyc | Bin 0 -> 3236 bytes .../__pycache__/detection.cpython-310.pyc | Bin 0 -> 2903 bytes .../__pycache__/engines.cpython-310.pyc | Bin 0 -> 521 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 0 -> 7387 bytes .../__pycache__/google.cpython-310.pyc | Bin 0 -> 3721 bytes .../__pycache__/libre.cpython-310.pyc | Bin 0 -> 3672 bytes .../__pycache__/linguee.cpython-310.pyc | Bin 0 -> 3593 bytes .../__pycache__/microsoft.cpython-310.pyc | Bin 0 -> 4199 bytes .../__pycache__/mymemory.cpython-310.pyc | Bin 0 -> 3627 bytes .../__pycache__/papago.cpython-310.pyc | Bin 0 -> 3281 bytes .../__pycache__/pons.cpython-310.pyc | Bin 0 -> 3649 bytes .../__pycache__/qcri.cpython-310.pyc | Bin 0 -> 3551 bytes .../__pycache__/validate.cpython-310.pyc | Bin 0 -> 1398 bytes .../__pycache__/yandex.cpython-310.pyc | Bin 0 -> 4434 bytes .../site-packages/deep_translator/baidu.py | 120 + .../site-packages/deep_translator/base.py | 183 + .../site-packages/deep_translator/chatgpt.py | 70 + .../site-packages/deep_translator/cli.py | 102 + .../deep_translator/constants.py | 641 ++ .../site-packages/deep_translator/deepl.py | 111 + .../deep_translator/detection.py | 102 + .../site-packages/deep_translator/engines.py | 8 + .../deep_translator/exceptions.py | 195 + .../site-packages/deep_translator/google.py | 122 + .../site-packages/deep_translator/libre.py | 123 + .../site-packages/deep_translator/linguee.py | 115 + .../deep_translator/microsoft.py | 129 + .../site-packages/deep_translator/mymemory.py | 113 + .../site-packages/deep_translator/papago.py | 101 + .../site-packages/deep_translator/pons.py | 118 + .../site-packages/deep_translator/qcri.py | 119 + .../site-packages/deep_translator/validate.py | 43 + .../site-packages/deep_translator/yandex.py | 158 + .../distro-1.9.0.dist-info/INSTALLER | 1 + .../distro-1.9.0.dist-info/LICENSE | 202 + .../distro-1.9.0.dist-info/METADATA | 184 + .../distro-1.9.0.dist-info/RECORD | 15 + .../distro-1.9.0.dist-info/WHEEL | 5 + .../distro-1.9.0.dist-info/entry_points.txt | 2 + .../distro-1.9.0.dist-info/top_level.txt | 1 + .../site-packages/distro/__init__.py | 54 + .../site-packages/distro/__main__.py | 4 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 896 bytes .../__pycache__/__main__.cpython-310.pyc | Bin 0 -> 250 bytes .../distro/__pycache__/distro.cpython-310.pyc | Bin 0 -> 42133 bytes .../python3.10/site-packages/distro/distro.py | 1403 +++ .../python3.10/site-packages/distro/py.typed | 0 .../site-packages/distutils-precedence.pth | 1 + .../exceptiongroup-1.3.1.dist-info/INSTALLER | 1 + .../exceptiongroup-1.3.1.dist-info/METADATA | 159 + .../exceptiongroup-1.3.1.dist-info/RECORD | 18 + .../exceptiongroup-1.3.1.dist-info/WHEEL | 4 + .../licenses/LICENSE | 73 + .../site-packages/exceptiongroup/__init__.py | 46 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 875 bytes .../__pycache__/_catch.cpython-310.pyc | Bin 0 -> 3260 bytes .../__pycache__/_exceptions.cpython-310.pyc | Bin 0 -> 10213 bytes .../__pycache__/_formatting.cpython-310.pyc | Bin 0 -> 12304 bytes .../__pycache__/_suppress.cpython-310.pyc | Bin 0 -> 1561 bytes .../__pycache__/_version.cpython-310.pyc | Bin 0 -> 662 bytes .../site-packages/exceptiongroup/_catch.py | 138 + .../exceptiongroup/_exceptions.py | 336 + .../exceptiongroup/_formatting.py | 602 ++ .../site-packages/exceptiongroup/_suppress.py | 55 + .../site-packages/exceptiongroup/_version.py | 34 + .../site-packages/exceptiongroup/py.typed | 0 .../fastapi-0.135.2.dist-info/INSTALLER | 1 + .../fastapi-0.135.2.dist-info/METADATA | 623 ++ .../fastapi-0.135.2.dist-info/RECORD | 109 + .../fastapi-0.135.2.dist-info/REQUESTED | 0 .../fastapi-0.135.2.dist-info/WHEEL | 4 + .../entry_points.txt | 5 + .../licenses/LICENSE | 21 + .../fastapi/.agents/skills/fastapi/SKILL.md | 436 + .../skills/fastapi/references/dependencies.md | 142 + .../skills/fastapi/references/other-tools.md | 76 + .../skills/fastapi/references/streaming.md | 105 + .../site-packages/fastapi/__init__.py | 25 + .../site-packages/fastapi/__main__.py | 3 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1061 bytes .../__pycache__/__main__.cpython-310.pyc | Bin 0 -> 220 bytes .../__pycache__/applications.cpython-310.pyc | Bin 0 -> 71418 bytes .../__pycache__/background.cpython-310.pyc | Bin 0 -> 2208 bytes .../fastapi/__pycache__/cli.cpython-310.pyc | Bin 0 -> 548 bytes .../__pycache__/concurrency.cpython-310.pyc | Bin 0 -> 1097 bytes .../datastructures.cpython-310.pyc | Bin 0 -> 5900 bytes .../__pycache__/encoders.cpython-310.pyc | Bin 0 -> 7891 bytes .../exception_handlers.cpython-310.pyc | Bin 0 -> 1507 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 0 -> 8527 bytes .../__pycache__/logger.cpython-310.pyc | Bin 0 -> 229 bytes .../param_functions.cpython-310.pyc | Bin 0 -> 29597 bytes .../__pycache__/params.cpython-310.pyc | Bin 0 -> 14478 bytes .../__pycache__/requests.cpython-310.pyc | Bin 0 -> 259 bytes .../__pycache__/responses.cpython-310.pyc | Bin 0 -> 3762 bytes .../__pycache__/routing.cpython-310.pyc | Bin 0 -> 71060 bytes .../fastapi/__pycache__/sse.cpython-310.pyc | Bin 0 -> 6028 bytes .../__pycache__/staticfiles.cpython-310.pyc | Bin 0 -> 232 bytes .../__pycache__/templating.cpython-310.pyc | Bin 0 -> 234 bytes .../__pycache__/testclient.cpython-310.pyc | Bin 0 -> 229 bytes .../fastapi/__pycache__/types.cpython-310.pyc | Bin 0 -> 635 bytes .../fastapi/__pycache__/utils.cpython-310.pyc | Bin 0 -> 3946 bytes .../__pycache__/websockets.cpython-310.pyc | Bin 0 -> 307 bytes .../site-packages/fastapi/_compat/__init__.py | 40 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1566 bytes .../__pycache__/shared.cpython-310.pyc | Bin 0 -> 5575 bytes .../_compat/__pycache__/v2.cpython-310.pyc | Bin 0 -> 13228 bytes .../site-packages/fastapi/_compat/shared.py | 214 + .../site-packages/fastapi/_compat/v2.py | 480 + .../site-packages/fastapi/applications.py | 4691 +++++++++ .../site-packages/fastapi/background.py | 61 + .../python3.10/site-packages/fastapi/cli.py | 13 + .../site-packages/fastapi/concurrency.py | 41 + .../site-packages/fastapi/datastructures.py | 186 + .../fastapi/dependencies/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 185 bytes .../__pycache__/models.cpython-310.pyc | Bin 0 -> 5088 bytes .../__pycache__/utils.cpython-310.pyc | Bin 0 -> 23121 bytes .../fastapi/dependencies/models.py | 193 + .../fastapi/dependencies/utils.py | 1057 ++ .../site-packages/fastapi/encoders.py | 347 + .../fastapi/exception_handlers.py | 34 + .../site-packages/fastapi/exceptions.py | 256 + .../site-packages/fastapi/logger.py | 3 + .../fastapi/middleware/__init__.py | 1 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 238 bytes .../asyncexitstack.cpython-310.pyc | Bin 0 -> 1101 bytes .../__pycache__/cors.cpython-310.pyc | Bin 0 -> 243 bytes .../__pycache__/gzip.cpython-310.pyc | Bin 0 -> 243 bytes .../__pycache__/httpsredirect.cpython-310.pyc | Bin 0 -> 270 bytes .../__pycache__/trustedhost.cpython-310.pyc | Bin 0 -> 264 bytes .../__pycache__/wsgi.cpython-310.pyc | Bin 0 -> 243 bytes .../fastapi/middleware/asyncexitstack.py | 18 + .../site-packages/fastapi/middleware/cors.py | 1 + .../site-packages/fastapi/middleware/gzip.py | 1 + .../fastapi/middleware/httpsredirect.py | 3 + .../fastapi/middleware/trustedhost.py | 3 + .../site-packages/fastapi/middleware/wsgi.py | 3 + .../site-packages/fastapi/openapi/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 180 bytes .../__pycache__/constants.cpython-310.pyc | Bin 0 -> 338 bytes .../openapi/__pycache__/docs.cpython-310.pyc | Bin 0 -> 11502 bytes .../__pycache__/models.cpython-310.pyc | Bin 0 -> 16163 bytes .../openapi/__pycache__/utils.cpython-310.pyc | Bin 0 -> 13160 bytes .../fastapi/openapi/constants.py | 3 + .../site-packages/fastapi/openapi/docs.py | 389 + .../site-packages/fastapi/openapi/models.py | 435 + .../site-packages/fastapi/openapi/utils.py | 606 ++ .../site-packages/fastapi/param_functions.py | 2460 +++++ .../site-packages/fastapi/params.py | 754 ++ .../python3.10/site-packages/fastapi/py.typed | 0 .../site-packages/fastapi/requests.py | 2 + .../site-packages/fastapi/responses.py | 85 + .../site-packages/fastapi/routing.py | 4956 +++++++++ .../fastapi/security/__init__.py | 15 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 820 bytes .../__pycache__/api_key.cpython-310.pyc | Bin 0 -> 8613 bytes .../security/__pycache__/base.cpython-310.pyc | Bin 0 -> 469 bytes .../security/__pycache__/http.cpython-310.pyc | Bin 0 -> 11481 bytes .../__pycache__/oauth2.cpython-310.pyc | Bin 0 -> 17711 bytes .../open_id_connect_url.cpython-310.pyc | Bin 0 -> 3220 bytes .../__pycache__/utils.cpython-310.pyc | Bin 0 -> 461 bytes .../site-packages/fastapi/security/api_key.py | 320 + .../site-packages/fastapi/security/base.py | 6 + .../site-packages/fastapi/security/http.py | 417 + .../site-packages/fastapi/security/oauth2.py | 693 ++ .../fastapi/security/open_id_connect_url.py | 94 + .../site-packages/fastapi/security/utils.py | 7 + .../python3.10/site-packages/fastapi/sse.py | 222 + .../site-packages/fastapi/staticfiles.py | 1 + .../site-packages/fastapi/templating.py | 1 + .../site-packages/fastapi/testclient.py | 1 + .../python3.10/site-packages/fastapi/types.py | 12 + .../python3.10/site-packages/fastapi/utils.py | 136 + .../site-packages/fastapi/websockets.py | 3 + .../h11-0.16.0.dist-info/INSTALLER | 1 + .../h11-0.16.0.dist-info/METADATA | 202 + .../site-packages/h11-0.16.0.dist-info/RECORD | 29 + .../site-packages/h11-0.16.0.dist-info/WHEEL | 5 + .../h11-0.16.0.dist-info/licenses/LICENSE.txt | 22 + .../h11-0.16.0.dist-info/top_level.txt | 1 + .../python3.10/site-packages/h11/__init__.py | 62 + .../h11/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 997 bytes .../h11/__pycache__/_abnf.cpython-310.pyc | Bin 0 -> 1241 bytes .../__pycache__/_connection.cpython-310.pyc | Bin 0 -> 16203 bytes .../h11/__pycache__/_events.cpython-310.pyc | Bin 0 -> 10081 bytes .../h11/__pycache__/_headers.cpython-310.pyc | Bin 0 -> 5626 bytes .../h11/__pycache__/_readers.cpython-310.pyc | Bin 0 -> 6340 bytes .../_receivebuffer.cpython-310.pyc | Bin 0 -> 3184 bytes .../h11/__pycache__/_state.cpython-310.pyc | Bin 0 -> 5569 bytes .../h11/__pycache__/_util.cpython-310.pyc | Bin 0 -> 3847 bytes .../h11/__pycache__/_version.cpython-310.pyc | Bin 0 -> 190 bytes .../h11/__pycache__/_writers.cpython-310.pyc | Bin 0 -> 4506 bytes .../lib/python3.10/site-packages/h11/_abnf.py | 132 + .../site-packages/h11/_connection.py | 659 ++ .../python3.10/site-packages/h11/_events.py | 369 + .../python3.10/site-packages/h11/_headers.py | 282 + .../python3.10/site-packages/h11/_readers.py | 250 + .../site-packages/h11/_receivebuffer.py | 153 + .../python3.10/site-packages/h11/_state.py | 365 + .../lib/python3.10/site-packages/h11/_util.py | 135 + .../python3.10/site-packages/h11/_version.py | 16 + .../python3.10/site-packages/h11/_writers.py | 145 + .../lib/python3.10/site-packages/h11/py.typed | 1 + .../httpcore-1.0.9.dist-info/INSTALLER | 1 + .../httpcore-1.0.9.dist-info/METADATA | 625 ++ .../httpcore-1.0.9.dist-info/RECORD | 68 + .../httpcore-1.0.9.dist-info/WHEEL | 4 + .../licenses/LICENSE.md | 27 + .../site-packages/httpcore/__init__.py | 141 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 2776 bytes .../httpcore/__pycache__/_api.cpython-310.pyc | Bin 0 -> 3325 bytes .../__pycache__/_exceptions.cpython-310.pyc | Bin 0 -> 2389 bytes .../__pycache__/_models.cpython-310.pyc | Bin 0 -> 16881 bytes .../httpcore/__pycache__/_ssl.cpython-310.pyc | Bin 0 -> 438 bytes .../_synchronization.cpython-310.pyc | Bin 0 -> 9453 bytes .../__pycache__/_trace.cpython-310.pyc | Bin 0 -> 3537 bytes .../__pycache__/_utils.cpython-310.pyc | Bin 0 -> 924 bytes .../python3.10/site-packages/httpcore/_api.py | 94 + .../site-packages/httpcore/_async/__init__.py | 39 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1436 bytes .../__pycache__/connection.cpython-310.pyc | Bin 0 -> 6827 bytes .../connection_pool.cpython-310.pyc | Bin 0 -> 13027 bytes .../_async/__pycache__/http11.cpython-310.pyc | Bin 0 -> 11593 bytes .../_async/__pycache__/http2.cpython-310.pyc | Bin 0 -> 16738 bytes .../__pycache__/http_proxy.cpython-310.pyc | Bin 0 -> 12409 bytes .../__pycache__/interfaces.cpython-310.pyc | Bin 0 -> 4483 bytes .../__pycache__/socks_proxy.cpython-310.pyc | Bin 0 -> 10273 bytes .../httpcore/_async/connection.py | 222 + .../httpcore/_async/connection_pool.py | 420 + .../site-packages/httpcore/_async/http11.py | 379 + .../site-packages/httpcore/_async/http2.py | 592 ++ .../httpcore/_async/http_proxy.py | 367 + .../httpcore/_async/interfaces.py | 137 + .../httpcore/_async/socks_proxy.py | 341 + .../httpcore/_backends/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 183 bytes .../__pycache__/anyio.cpython-310.pyc | Bin 0 -> 4943 bytes .../__pycache__/auto.cpython-310.pyc | Bin 0 -> 1887 bytes .../__pycache__/base.cpython-310.pyc | Bin 0 -> 3933 bytes .../__pycache__/mock.cpython-310.pyc | Bin 0 -> 5673 bytes .../__pycache__/sync.cpython-310.pyc | Bin 0 -> 7031 bytes .../__pycache__/trio.cpython-310.pyc | Bin 0 -> 5266 bytes .../site-packages/httpcore/_backends/anyio.py | 146 + .../site-packages/httpcore/_backends/auto.py | 52 + .../site-packages/httpcore/_backends/base.py | 101 + .../site-packages/httpcore/_backends/mock.py | 143 + .../site-packages/httpcore/_backends/sync.py | 241 + .../site-packages/httpcore/_backends/trio.py | 159 + .../site-packages/httpcore/_exceptions.py | 81 + .../site-packages/httpcore/_models.py | 516 + .../python3.10/site-packages/httpcore/_ssl.py | 9 + .../site-packages/httpcore/_sync/__init__.py | 39 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1390 bytes .../__pycache__/connection.cpython-310.pyc | Bin 0 -> 6513 bytes .../connection_pool.cpython-310.pyc | Bin 0 -> 12711 bytes .../_sync/__pycache__/http11.cpython-310.pyc | Bin 0 -> 11031 bytes .../_sync/__pycache__/http2.cpython-310.pyc | Bin 0 -> 15957 bytes .../__pycache__/http_proxy.cpython-310.pyc | Bin 0 -> 12132 bytes .../__pycache__/interfaces.cpython-310.pyc | Bin 0 -> 4334 bytes .../__pycache__/socks_proxy.cpython-310.pyc | Bin 0 -> 9982 bytes .../httpcore/_sync/connection.py | 222 + .../httpcore/_sync/connection_pool.py | 420 + .../site-packages/httpcore/_sync/http11.py | 379 + .../site-packages/httpcore/_sync/http2.py | 592 ++ .../httpcore/_sync/http_proxy.py | 367 + .../httpcore/_sync/interfaces.py | 137 + .../httpcore/_sync/socks_proxy.py | 341 + .../httpcore/_synchronization.py | 318 + .../site-packages/httpcore/_trace.py | 107 + .../site-packages/httpcore/_utils.py | 37 + .../site-packages/httpcore/py.typed | 0 .../httpx-0.28.1.dist-info/INSTALLER | 1 + .../httpx-0.28.1.dist-info/METADATA | 203 + .../httpx-0.28.1.dist-info/RECORD | 54 + .../httpx-0.28.1.dist-info/WHEEL | 4 + .../httpx-0.28.1.dist-info/entry_points.txt | 2 + .../licenses/LICENSE.md | 12 + .../site-packages/httpx/__init__.py | 105 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1884 bytes .../__pycache__/__version__.cpython-310.pyc | Bin 0 -> 288 bytes .../httpx/__pycache__/_api.cpython-310.pyc | Bin 0 -> 7663 bytes .../httpx/__pycache__/_auth.cpython-310.pyc | Bin 0 -> 10583 bytes .../httpx/__pycache__/_client.cpython-310.pyc | Bin 0 -> 41467 bytes .../httpx/__pycache__/_config.cpython-310.pyc | Bin 0 -> 7109 bytes .../__pycache__/_content.cpython-310.pyc | Bin 0 -> 7314 bytes .../__pycache__/_decoders.cpython-310.pyc | Bin 0 -> 10831 bytes .../__pycache__/_exceptions.cpython-310.pyc | Bin 0 -> 10365 bytes .../httpx/__pycache__/_main.cpython-310.pyc | Bin 0 -> 12426 bytes .../httpx/__pycache__/_models.cpython-310.pyc | Bin 0 -> 39142 bytes .../__pycache__/_multipart.cpython-310.pyc | Bin 0 -> 8980 bytes .../__pycache__/_status_codes.cpython-310.pyc | Bin 0 -> 6313 bytes .../httpx/__pycache__/_types.cpython-310.pyc | Bin 0 -> 2852 bytes .../__pycache__/_urlparse.cpython-310.pyc | Bin 0 -> 11044 bytes .../httpx/__pycache__/_urls.cpython-310.pyc | Bin 0 -> 21837 bytes .../httpx/__pycache__/_utils.cpython-310.pyc | Bin 0 -> 6712 bytes .../site-packages/httpx/__version__.py | 3 + .../python3.10/site-packages/httpx/_api.py | 438 + .../python3.10/site-packages/httpx/_auth.py | 348 + .../python3.10/site-packages/httpx/_client.py | 2019 ++++ .../python3.10/site-packages/httpx/_config.py | 248 + .../site-packages/httpx/_content.py | 240 + .../site-packages/httpx/_decoders.py | 393 + .../site-packages/httpx/_exceptions.py | 379 + .../python3.10/site-packages/httpx/_main.py | 506 + .../python3.10/site-packages/httpx/_models.py | 1277 +++ .../site-packages/httpx/_multipart.py | 300 + .../site-packages/httpx/_status_codes.py | 162 + .../httpx/_transports/__init__.py | 15 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 406 bytes .../__pycache__/asgi.cpython-310.pyc | Bin 0 -> 5175 bytes .../__pycache__/base.cpython-310.pyc | Bin 0 -> 3433 bytes .../__pycache__/default.cpython-310.pyc | Bin 0 -> 10030 bytes .../__pycache__/mock.cpython-310.pyc | Bin 0 -> 1416 bytes .../__pycache__/wsgi.cpython-310.pyc | Bin 0 -> 5230 bytes .../site-packages/httpx/_transports/asgi.py | 187 + .../site-packages/httpx/_transports/base.py | 86 + .../httpx/_transports/default.py | 406 + .../site-packages/httpx/_transports/mock.py | 43 + .../site-packages/httpx/_transports/wsgi.py | 149 + .../python3.10/site-packages/httpx/_types.py | 114 + .../site-packages/httpx/_urlparse.py | 527 + .../python3.10/site-packages/httpx/_urls.py | 641 ++ .../python3.10/site-packages/httpx/_utils.py | 242 + .../python3.10/site-packages/httpx/py.typed | 0 .../idna-3.11.dist-info/INSTALLER | 1 + .../idna-3.11.dist-info/METADATA | 209 + .../site-packages/idna-3.11.dist-info/RECORD | 22 + .../site-packages/idna-3.11.dist-info/WHEEL | 4 + .../idna-3.11.dist-info/licenses/LICENSE.md | 31 + .../python3.10/site-packages/idna/__init__.py | 45 + .../idna/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 833 bytes .../idna/__pycache__/codec.cpython-310.pyc | Bin 0 -> 3254 bytes .../idna/__pycache__/compat.cpython-310.pyc | Bin 0 -> 736 bytes .../idna/__pycache__/core.cpython-310.pyc | Bin 0 -> 9656 bytes .../idna/__pycache__/idnadata.cpython-310.pyc | Bin 0 -> 198632 bytes .../__pycache__/intranges.cpython-310.pyc | Bin 0 -> 1965 bytes .../__pycache__/package_data.cpython-310.pyc | Bin 0 -> 193 bytes .../__pycache__/uts46data.cpython-310.pyc | Bin 0 -> 155201 bytes .../python3.10/site-packages/idna/codec.py | 122 + .../python3.10/site-packages/idna/compat.py | 15 + .../lib/python3.10/site-packages/idna/core.py | 437 + .../python3.10/site-packages/idna/idnadata.py | 4309 ++++++++ .../site-packages/idna/intranges.py | 57 + .../site-packages/idna/package_data.py | 1 + .../python3.10/site-packages/idna/py.typed | 0 .../site-packages/idna/uts46data.py | 8841 +++++++++++++++++ .../jinja2-3.1.6.dist-info/INSTALLER | 1 + .../jinja2-3.1.6.dist-info/METADATA | 84 + .../jinja2-3.1.6.dist-info/RECORD | 58 + .../jinja2-3.1.6.dist-info/REQUESTED | 0 .../jinja2-3.1.6.dist-info/WHEEL | 4 + .../jinja2-3.1.6.dist-info/entry_points.txt | 3 + .../licenses/LICENSE.txt | 28 + .../site-packages/jinja2/__init__.py | 38 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1599 bytes .../__pycache__/_identifier.cpython-310.pyc | Bin 0 -> 2074 bytes .../__pycache__/async_utils.cpython-310.pyc | Bin 0 -> 3451 bytes .../__pycache__/bccache.cpython-310.pyc | Bin 0 -> 13965 bytes .../__pycache__/compiler.cpython-310.pyc | Bin 0 -> 55245 bytes .../__pycache__/constants.cpython-310.pyc | Bin 0 -> 1535 bytes .../jinja2/__pycache__/debug.cpython-310.pyc | Bin 0 -> 3991 bytes .../__pycache__/defaults.cpython-310.pyc | Bin 0 -> 1335 bytes .../__pycache__/environment.cpython-310.pyc | Bin 0 -> 53443 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 0 -> 5534 bytes .../jinja2/__pycache__/ext.cpython-310.pyc | Bin 0 -> 25873 bytes .../__pycache__/filters.cpython-310.pyc | Bin 0 -> 52117 bytes .../__pycache__/idtracking.cpython-310.pyc | Bin 0 -> 11086 bytes .../jinja2/__pycache__/lexer.cpython-310.pyc | Bin 0 -> 20442 bytes .../__pycache__/loaders.cpython-310.pyc | Bin 0 -> 21252 bytes .../jinja2/__pycache__/meta.cpython-310.pyc | Bin 0 -> 3815 bytes .../__pycache__/nativetypes.cpython-310.pyc | Bin 0 -> 5010 bytes .../jinja2/__pycache__/nodes.cpython-310.pyc | Bin 0 -> 40301 bytes .../__pycache__/optimizer.cpython-310.pyc | Bin 0 -> 1955 bytes .../jinja2/__pycache__/parser.cpython-310.pyc | Bin 0 -> 28108 bytes .../__pycache__/runtime.cpython-310.pyc | Bin 0 -> 32353 bytes .../__pycache__/sandbox.cpython-310.pyc | Bin 0 -> 12235 bytes .../jinja2/__pycache__/tests.cpython-310.pyc | Bin 0 -> 6695 bytes .../jinja2/__pycache__/utils.cpython-310.pyc | Bin 0 -> 24822 bytes .../__pycache__/visitor.cpython-310.pyc | Bin 0 -> 3974 bytes .../site-packages/jinja2/_identifier.py | 6 + .../site-packages/jinja2/async_utils.py | 99 + .../site-packages/jinja2/bccache.py | 408 + .../site-packages/jinja2/compiler.py | 1998 ++++ .../site-packages/jinja2/constants.py | 20 + .../python3.10/site-packages/jinja2/debug.py | 191 + .../site-packages/jinja2/defaults.py | 48 + .../site-packages/jinja2/environment.py | 1672 ++++ .../site-packages/jinja2/exceptions.py | 166 + .../python3.10/site-packages/jinja2/ext.py | 870 ++ .../site-packages/jinja2/filters.py | 1873 ++++ .../site-packages/jinja2/idtracking.py | 318 + .../python3.10/site-packages/jinja2/lexer.py | 868 ++ .../site-packages/jinja2/loaders.py | 693 ++ .../python3.10/site-packages/jinja2/meta.py | 112 + .../site-packages/jinja2/nativetypes.py | 130 + .../python3.10/site-packages/jinja2/nodes.py | 1206 +++ .../site-packages/jinja2/optimizer.py | 48 + .../python3.10/site-packages/jinja2/parser.py | 1049 ++ .../python3.10/site-packages/jinja2/py.typed | 0 .../site-packages/jinja2/runtime.py | 1062 ++ .../site-packages/jinja2/sandbox.py | 436 + .../python3.10/site-packages/jinja2/tests.py | 256 + .../python3.10/site-packages/jinja2/utils.py | 766 ++ .../site-packages/jinja2/visitor.py | 92 + .../jiter-0.13.0.dist-info/INSTALLER | 1 + .../jiter-0.13.0.dist-info/METADATA | 145 + .../jiter-0.13.0.dist-info/RECORD | 10 + .../jiter-0.13.0.dist-info/WHEEL | 5 + .../jiter-0.13.0.dist-info/licenses/LICENSE | 21 + .../site-packages/jiter/__init__.py | 5 + .../site-packages/jiter/__init__.pyi | 70 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 258 bytes .../jiter.cpython-310-x86_64-linux-gnu.so | Bin 0 -> 844056 bytes .../python3.10/site-packages/jiter/py.typed | 0 .../markupsafe-3.0.3.dist-info/INSTALLER | 1 + .../markupsafe-3.0.3.dist-info/METADATA | 74 + .../markupsafe-3.0.3.dist-info/RECORD | 14 + .../markupsafe-3.0.3.dist-info/WHEEL | 7 + .../licenses/LICENSE.txt | 28 + .../markupsafe-3.0.3.dist-info/top_level.txt | 1 + .../site-packages/markupsafe/__init__.py | 396 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 15428 bytes .../__pycache__/_native.cpython-310.pyc | Bin 0 -> 409 bytes .../site-packages/markupsafe/_native.py | 8 + .../site-packages/markupsafe/_speedups.c | 200 + .../_speedups.cpython-310-x86_64-linux-gnu.so | Bin 0 -> 35816 bytes .../site-packages/markupsafe/_speedups.pyi | 1 + .../site-packages/markupsafe/py.typed | 0 .../site-packages/multipart/__init__.py | 24 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 945 bytes .../__pycache__/decoders.cpython-310.pyc | Bin 0 -> 216 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 0 -> 220 bytes .../__pycache__/multipart.cpython-310.pyc | Bin 0 -> 218 bytes .../site-packages/multipart/decoders.py | 1 + .../site-packages/multipart/exceptions.py | 1 + .../site-packages/multipart/multipart.py | 1 + .../openai-2.29.0.dist-info/INSTALLER | 1 + .../openai-2.29.0.dist-info/METADATA | 909 ++ .../openai-2.29.0.dist-info/RECORD | 2154 ++++ .../openai-2.29.0.dist-info/REQUESTED | 0 .../openai-2.29.0.dist-info/WHEEL | 4 + .../openai-2.29.0.dist-info/entry_points.txt | 2 + .../openai-2.29.0.dist-info/licenses/LICENSE | 201 + .../site-packages/openai/__init__.py | 396 + .../site-packages/openai/__main__.py | 3 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 9100 bytes .../__pycache__/__main__.cpython-310.pyc | Bin 0 -> 211 bytes .../__pycache__/_base_client.cpython-310.pyc | Bin 0 -> 47159 bytes .../__pycache__/_client.cpython-310.pyc | Bin 0 -> 39024 bytes .../__pycache__/_compat.cpython-310.pyc | Bin 0 -> 6948 bytes .../__pycache__/_constants.cpython-310.pyc | Bin 0 -> 589 bytes .../__pycache__/_exceptions.cpython-310.pyc | Bin 0 -> 5953 bytes .../openai/__pycache__/_files.cpython-310.pyc | Bin 0 -> 4487 bytes .../_legacy_response.cpython-310.pyc | Bin 0 -> 15284 bytes .../__pycache__/_models.cpython-310.pyc | Bin 0 -> 25339 bytes .../_module_client.cpython-310.pyc | Bin 0 -> 7706 bytes .../openai/__pycache__/_qs.cpython-310.pyc | Bin 0 -> 4120 bytes .../__pycache__/_resource.cpython-310.pyc | Bin 0 -> 1508 bytes .../__pycache__/_response.cpython-310.pyc | Bin 0 -> 25523 bytes .../__pycache__/_streaming.cpython-310.pyc | Bin 0 -> 11561 bytes .../openai/__pycache__/_types.cpython-310.pyc | Bin 0 -> 7330 bytes .../__pycache__/_version.cpython-310.pyc | Bin 0 -> 218 bytes .../__pycache__/pagination.cpython-310.pyc | Bin 0 -> 4636 bytes .../__pycache__/version.cpython-310.pyc | Bin 0 -> 266 bytes .../site-packages/openai/_base_client.py | 2163 ++++ .../site-packages/openai/_client.py | 1418 +++ .../site-packages/openai/_compat.py | 238 + .../site-packages/openai/_constants.py | 14 + .../site-packages/openai/_exceptions.py | 161 + .../site-packages/openai/_extras/__init__.py | 3 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 336 bytes .../__pycache__/_common.cpython-310.pyc | Bin 0 -> 734 bytes .../__pycache__/numpy_proxy.cpython-310.pyc | Bin 0 -> 1187 bytes .../__pycache__/pandas_proxy.cpython-310.pyc | Bin 0 -> 1005 bytes .../sounddevice_proxy.cpython-310.pyc | Bin 0 -> 1036 bytes .../site-packages/openai/_extras/_common.py | 21 + .../openai/_extras/numpy_proxy.py | 37 + .../openai/_extras/pandas_proxy.py | 28 + .../openai/_extras/sounddevice_proxy.py | 28 + .../python3.10/site-packages/openai/_files.py | 123 + .../site-packages/openai/_legacy_response.py | 491 + .../site-packages/openai/_models.py | 915 ++ .../site-packages/openai/_module_client.py | 181 + .../python3.10/site-packages/openai/_qs.py | 150 + .../site-packages/openai/_resource.py | 43 + .../site-packages/openai/_response.py | 851 ++ .../site-packages/openai/_streaming.py | 427 + .../python3.10/site-packages/openai/_types.py | 275 + .../site-packages/openai/_utils/__init__.py | 67 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1881 bytes .../__pycache__/_compat.cpython-310.pyc | Bin 0 -> 1843 bytes .../_datetime_parse.cpython-310.pyc | Bin 0 -> 4103 bytes .../_utils/__pycache__/_json.cpython-310.pyc | Bin 0 -> 1361 bytes .../_utils/__pycache__/_logs.cpython-310.pyc | Bin 0 -> 1595 bytes .../_utils/__pycache__/_proxy.cpython-310.pyc | Bin 0 -> 2419 bytes .../__pycache__/_reflection.cpython-310.pyc | Bin 0 -> 1500 bytes .../_resources_proxy.cpython-310.pyc | Bin 0 -> 1038 bytes .../__pycache__/_streams.cpython-310.pyc | Bin 0 -> 614 bytes .../_utils/__pycache__/_sync.cpython-310.pyc | Bin 0 -> 1951 bytes .../__pycache__/_transform.cpython-310.pyc | Bin 0 -> 10279 bytes .../__pycache__/_typing.cpython-310.pyc | Bin 0 -> 4167 bytes .../_utils/__pycache__/_utils.cpython-310.pyc | Bin 0 -> 13671 bytes .../site-packages/openai/_utils/_compat.py | 45 + .../openai/_utils/_datetime_parse.py | 136 + .../site-packages/openai/_utils/_json.py | 35 + .../site-packages/openai/_utils/_logs.py | 42 + .../site-packages/openai/_utils/_proxy.py | 65 + .../openai/_utils/_reflection.py | 45 + .../openai/_utils/_resources_proxy.py | 24 + .../site-packages/openai/_utils/_streams.py | 12 + .../site-packages/openai/_utils/_sync.py | 58 + .../site-packages/openai/_utils/_transform.py | 457 + .../site-packages/openai/_utils/_typing.py | 156 + .../site-packages/openai/_utils/_utils.py | 437 + .../site-packages/openai/_version.py | 4 + .../site-packages/openai/cli/__init__.py | 1 + .../cli/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 208 bytes .../cli/__pycache__/_cli.cpython-310.pyc | Bin 0 -> 5809 bytes .../cli/__pycache__/_errors.cpython-310.pyc | Bin 0 -> 1000 bytes .../cli/__pycache__/_models.cpython-310.pyc | Bin 0 -> 925 bytes .../cli/__pycache__/_progress.cpython-310.pyc | Bin 0 -> 2562 bytes .../cli/__pycache__/_utils.cpython-310.pyc | Bin 0 -> 1466 bytes .../site-packages/openai/cli/_api/__init__.py | 1 + .../_api/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 227 bytes .../_api/__pycache__/_main.cpython-310.pyc | Bin 0 -> 773 bytes .../_api/__pycache__/audio.cpython-310.pyc | Bin 0 -> 3227 bytes .../__pycache__/completions.cpython-310.pyc | Bin 0 -> 5926 bytes .../_api/__pycache__/files.cpython-310.pyc | Bin 0 -> 2774 bytes .../_api/__pycache__/image.cpython-310.pyc | Bin 0 -> 4207 bytes .../_api/__pycache__/models.cpython-310.pyc | Bin 0 -> 1880 bytes .../site-packages/openai/cli/_api/_main.py | 17 + .../site-packages/openai/cli/_api/audio.py | 108 + .../openai/cli/_api/chat/__init__.py | 13 + .../chat/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 615 bytes .../__pycache__/completions.cpython-310.pyc | Bin 0 -> 5198 bytes .../openai/cli/_api/chat/completions.py | 160 + .../openai/cli/_api/completions.py | 173 + .../site-packages/openai/cli/_api/files.py | 80 + .../openai/cli/_api/fine_tuning/__init__.py | 13 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 615 bytes .../__pycache__/jobs.cpython-310.pyc | Bin 0 -> 5263 bytes .../openai/cli/_api/fine_tuning/jobs.py | 170 + .../site-packages/openai/cli/_api/image.py | 139 + .../site-packages/openai/cli/_api/models.py | 45 + .../site-packages/openai/cli/_cli.py | 233 + .../site-packages/openai/cli/_errors.py | 21 + .../site-packages/openai/cli/_models.py | 17 + .../site-packages/openai/cli/_progress.py | 59 + .../openai/cli/_tools/__init__.py | 1 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 229 bytes .../_tools/__pycache__/_main.cpython-310.pyc | Bin 0 -> 782 bytes .../__pycache__/fine_tunes.cpython-310.pyc | Bin 0 -> 1892 bytes .../__pycache__/migrate.cpython-310.pyc | Bin 0 -> 4456 bytes .../site-packages/openai/cli/_tools/_main.py | 17 + .../openai/cli/_tools/fine_tunes.py | 63 + .../openai/cli/_tools/migrate.py | 164 + .../site-packages/openai/cli/_utils.py | 45 + .../site-packages/openai/helpers/__init__.py | 4 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 312 bytes .../local_audio_player.cpython-310.pyc | Bin 0 -> 4788 bytes .../__pycache__/microphone.cpython-310.pyc | Bin 0 -> 3494 bytes .../openai/helpers/local_audio_player.py | 165 + .../openai/helpers/microphone.py | 100 + .../python3.10/site-packages/openai/lib/.keep | 4 + .../site-packages/openai/lib/__init__.py | 2 + .../lib/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 276 bytes .../lib/__pycache__/_old_api.cpython-310.pyc | Bin 0 -> 2357 bytes .../lib/__pycache__/_pydantic.cpython-310.pyc | Bin 0 -> 4540 bytes .../lib/__pycache__/_realtime.cpython-310.pyc | Bin 0 -> 2626 bytes .../lib/__pycache__/_tools.cpython-310.pyc | Bin 0 -> 2391 bytes .../__pycache__/_validators.cpython-310.pyc | Bin 0 -> 29476 bytes .../lib/__pycache__/azure.cpython-310.pyc | Bin 0 -> 16047 bytes .../site-packages/openai/lib/_old_api.py | 72 + .../openai/lib/_parsing/__init__.py | 11 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 481 bytes .../__pycache__/_completions.cpython-310.pyc | Bin 0 -> 7805 bytes .../__pycache__/_responses.cpython-310.pyc | Bin 0 -> 4437 bytes .../openai/lib/_parsing/_completions.py | 288 + .../openai/lib/_parsing/_responses.py | 179 + .../site-packages/openai/lib/_pydantic.py | 155 + .../site-packages/openai/lib/_realtime.py | 92 + .../site-packages/openai/lib/_tools.py | 66 + .../site-packages/openai/lib/_validators.py | 809 ++ .../site-packages/openai/lib/azure.py | 647 ++ .../openai/lib/streaming/__init__.py | 8 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 421 bytes .../__pycache__/_assistants.cpython-310.pyc | Bin 0 -> 28379 bytes .../__pycache__/_deltas.cpython-310.pyc | Bin 0 -> 1537 bytes .../openai/lib/streaming/_assistants.py | 1038 ++ .../openai/lib/streaming/_deltas.py | 64 + .../openai/lib/streaming/chat/__init__.py | 27 + .../chat/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 966 bytes .../__pycache__/_completions.cpython-310.pyc | Bin 0 -> 19596 bytes .../chat/__pycache__/_events.cpython-310.pyc | Bin 0 -> 3385 bytes .../chat/__pycache__/_types.cpython-310.pyc | Bin 0 -> 604 bytes .../openai/lib/streaming/chat/_completions.py | 769 ++ .../openai/lib/streaming/chat/_events.py | 123 + .../openai/lib/streaming/chat/_types.py | 20 + .../lib/streaming/responses/__init__.py | 13 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 539 bytes .../__pycache__/_events.cpython-310.pyc | Bin 0 -> 4288 bytes .../__pycache__/_responses.cpython-310.pyc | Bin 0 -> 11441 bytes .../__pycache__/_types.cpython-310.pyc | Bin 0 -> 430 bytes .../openai/lib/streaming/responses/_events.py | 148 + .../lib/streaming/responses/_responses.py | 372 + .../openai/lib/streaming/responses/_types.py | 10 + .../site-packages/openai/pagination.py | 190 + .../python3.10/site-packages/openai/py.typed | 0 .../openai/resources/__init__.py | 243 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 4428 bytes .../__pycache__/batches.cpython-310.pyc | Bin 0 -> 11076 bytes .../__pycache__/completions.cpython-310.pyc | Bin 0 -> 23066 bytes .../__pycache__/embeddings.cpython-310.pyc | Bin 0 -> 8055 bytes .../__pycache__/files.cpython-310.pyc | Bin 0 -> 14337 bytes .../__pycache__/images.cpython-310.pyc | Bin 0 -> 34593 bytes .../__pycache__/models.cpython-310.pyc | Bin 0 -> 6510 bytes .../__pycache__/moderations.cpython-310.pyc | Bin 0 -> 6034 bytes .../__pycache__/videos.cpython-310.pyc | Bin 0 -> 20807 bytes .../openai/resources/audio/__init__.py | 61 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1255 bytes .../audio/__pycache__/audio.cpython-310.pyc | Bin 0 -> 6240 bytes .../audio/__pycache__/speech.cpython-310.pyc | Bin 0 -> 7179 bytes .../transcriptions.cpython-310.pyc | Bin 0 -> 26611 bytes .../__pycache__/translations.cpython-310.pyc | Bin 0 -> 9175 bytes .../openai/resources/audio/audio.py | 184 + .../openai/resources/audio/speech.py | 263 + .../openai/resources/audio/transcriptions.py | 1009 ++ .../openai/resources/audio/translations.py | 371 + .../site-packages/openai/resources/batches.py | 550 + .../openai/resources/beta/__init__.py | 61 + .../beta/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1191 bytes .../__pycache__/assistants.cpython-310.pyc | Bin 0 -> 22398 bytes .../beta/__pycache__/beta.cpython-310.pyc | Bin 0 -> 6783 bytes .../openai/resources/beta/assistants.py | 1108 +++ .../openai/resources/beta/beta.py | 199 + .../openai/resources/beta/chatkit/__init__.py | 47 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 960 bytes .../__pycache__/chatkit.cpython-310.pyc | Bin 0 -> 5089 bytes .../__pycache__/sessions.cpython-310.pyc | Bin 0 -> 7546 bytes .../__pycache__/threads.cpython-310.pyc | Bin 0 -> 9950 bytes .../openai/resources/beta/chatkit/chatkit.py | 134 + .../openai/resources/beta/chatkit/sessions.py | 305 + .../openai/resources/beta/chatkit/threads.py | 521 + .../resources/beta/realtime/__init__.py | 47 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1067 bytes .../__pycache__/realtime.cpython-310.pyc | Bin 0 -> 32627 bytes .../__pycache__/sessions.cpython-310.pyc | Bin 0 -> 12630 bytes .../transcription_sessions.cpython-310.pyc | Bin 0 -> 8754 bytes .../resources/beta/realtime/realtime.py | 1094 ++ .../resources/beta/realtime/sessions.py | 424 + .../beta/realtime/transcription_sessions.py | 282 + .../openai/resources/beta/threads/__init__.py | 47 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 939 bytes .../__pycache__/messages.cpython-310.pyc | Bin 0 -> 13376 bytes .../__pycache__/threads.cpython-310.pyc | Bin 0 -> 36761 bytes .../openai/resources/beta/threads/messages.py | 722 ++ .../resources/beta/threads/runs/__init__.py | 33 + .../runs/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 677 bytes .../runs/__pycache__/runs.cpython-310.pyc | Bin 0 -> 54530 bytes .../runs/__pycache__/steps.cpython-310.pyc | Bin 0 -> 9311 bytes .../resources/beta/threads/runs/runs.py | 3148 ++++++ .../resources/beta/threads/runs/steps.py | 403 + .../openai/resources/beta/threads/threads.py | 1959 ++++ .../openai/resources/chat/__init__.py | 33 + .../chat/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 706 bytes .../chat/__pycache__/chat.cpython-310.pyc | Bin 0 -> 4114 bytes .../openai/resources/chat/chat.py | 120 + .../resources/chat/completions/__init__.py | 33 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 746 bytes .../__pycache__/completions.cpython-310.pyc | Bin 0 -> 63384 bytes .../__pycache__/messages.cpython-310.pyc | Bin 0 -> 6015 bytes .../resources/chat/completions/completions.py | 3195 ++++++ .../resources/chat/completions/messages.py | 220 + .../openai/resources/completions.py | 1186 +++ .../openai/resources/containers/__init__.py | 33 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 712 bytes .../__pycache__/containers.cpython-310.pyc | Bin 0 -> 11421 bytes .../openai/resources/containers/containers.py | 543 + .../resources/containers/files/__init__.py | 33 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 697 bytes .../files/__pycache__/content.cpython-310.pyc | Bin 0 -> 5042 bytes .../files/__pycache__/files.cpython-310.pyc | Bin 0 -> 11329 bytes .../resources/containers/files/content.py | 173 + .../resources/containers/files/files.py | 547 + .../resources/conversations/__init__.py | 33 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 736 bytes .../__pycache__/conversations.cpython-310.pyc | Bin 0 -> 10629 bytes .../__pycache__/items.cpython-310.pyc | Bin 0 -> 12136 bytes .../openai/resources/conversations/api.md | 42 + .../resources/conversations/conversations.py | 496 + .../openai/resources/conversations/items.py | 561 ++ .../openai/resources/embeddings.py | 306 + .../openai/resources/evals/__init__.py | 33 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 665 bytes .../evals/__pycache__/evals.cpython-310.pyc | Bin 0 -> 13420 bytes .../openai/resources/evals/evals.py | 672 ++ .../openai/resources/evals/runs/__init__.py | 33 + .../runs/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 713 bytes .../__pycache__/output_items.cpython-310.pyc | Bin 0 -> 7635 bytes .../runs/__pycache__/runs.cpython-310.pyc | Bin 0 -> 12220 bytes .../resources/evals/runs/output_items.py | 319 + .../openai/resources/evals/runs/runs.py | 644 ++ .../site-packages/openai/resources/files.py | 788 ++ .../openai/resources/fine_tuning/__init__.py | 61 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1213 bytes .../__pycache__/fine_tuning.cpython-310.pyc | Bin 0 -> 6339 bytes .../resources/fine_tuning/alpha/__init__.py | 33 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 698 bytes .../alpha/__pycache__/alpha.cpython-310.pyc | Bin 0 -> 4048 bytes .../alpha/__pycache__/graders.cpython-310.pyc | Bin 0 -> 6967 bytes .../resources/fine_tuning/alpha/alpha.py | 108 + .../resources/fine_tuning/alpha/graders.py | 286 + .../fine_tuning/checkpoints/__init__.py | 33 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 774 bytes .../__pycache__/checkpoints.cpython-310.pyc | Bin 0 -> 4244 bytes .../__pycache__/permissions.cpython-310.pyc | Bin 0 -> 10491 bytes .../fine_tuning/checkpoints/checkpoints.py | 108 + .../fine_tuning/checkpoints/permissions.py | 576 ++ .../resources/fine_tuning/fine_tuning.py | 172 + .../resources/fine_tuning/jobs/__init__.py | 33 + .../jobs/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 718 bytes .../__pycache__/checkpoints.cpython-310.pyc | Bin 0 -> 5666 bytes .../jobs/__pycache__/jobs.cpython-310.pyc | Bin 0 -> 16983 bytes .../resources/fine_tuning/jobs/checkpoints.py | 203 + .../openai/resources/fine_tuning/jobs/jobs.py | 928 ++ .../site-packages/openai/resources/images.py | 1868 ++++ .../site-packages/openai/resources/models.py | 310 + .../openai/resources/moderations.py | 205 + .../openai/resources/realtime/__init__.py | 47 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 985 bytes .../__pycache__/calls.cpython-310.pyc | Bin 0 -> 16526 bytes .../client_secrets.cpython-310.pyc | Bin 0 -> 6494 bytes .../__pycache__/realtime.cpython-310.pyc | Bin 0 -> 33314 bytes .../openai/resources/realtime/api.md | 137 + .../openai/resources/realtime/calls.py | 782 ++ .../resources/realtime/client_secrets.py | 217 + .../openai/resources/realtime/realtime.py | 1083 ++ .../openai/resources/responses/__init__.py | 47 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1015 bytes .../__pycache__/input_items.cpython-310.pyc | Bin 0 -> 6302 bytes .../__pycache__/input_tokens.cpython-310.pyc | Bin 0 -> 9117 bytes .../__pycache__/responses.cpython-310.pyc | Bin 0 -> 79446 bytes .../openai/resources/responses/api.md | 185 + .../openai/resources/responses/input_items.py | 226 + .../resources/responses/input_tokens.py | 311 + .../openai/resources/responses/responses.py | 4071 ++++++++ .../openai/resources/skills/__init__.py | 47 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 947 bytes .../__pycache__/content.cpython-310.pyc | Bin 0 -> 4867 bytes .../skills/__pycache__/skills.cpython-310.pyc | Bin 0 -> 12407 bytes .../openai/resources/skills/content.py | 167 + .../openai/resources/skills/skills.py | 618 ++ .../resources/skills/versions/__init__.py | 33 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 717 bytes .../__pycache__/content.cpython-310.pyc | Bin 0 -> 5083 bytes .../__pycache__/versions.cpython-310.pyc | Bin 0 -> 10745 bytes .../resources/skills/versions/content.py | 177 + .../resources/skills/versions/versions.py | 544 + .../openai/resources/uploads/__init__.py | 33 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 688 bytes .../uploads/__pycache__/parts.cpython-310.pyc | Bin 0 -> 5995 bytes .../__pycache__/uploads.cpython-310.pyc | Bin 0 -> 14903 bytes .../openai/resources/uploads/parts.py | 209 + .../openai/resources/uploads/uploads.py | 741 ++ .../resources/vector_stores/__init__.py | 47 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1005 bytes .../__pycache__/file_batches.cpython-310.pyc | Bin 0 -> 18098 bytes .../__pycache__/files.cpython-310.pyc | Bin 0 -> 18237 bytes .../__pycache__/vector_stores.cpython-310.pyc | Bin 0 -> 17673 bytes .../resources/vector_stores/file_batches.py | 845 ++ .../openai/resources/vector_stores/files.py | 965 ++ .../resources/vector_stores/vector_stores.py | 875 ++ .../site-packages/openai/resources/videos.py | 1275 +++ .../openai/resources/webhooks/__init__.py | 14 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 550 bytes .../__pycache__/webhooks.cpython-310.pyc | Bin 0 -> 4571 bytes .../openai/resources/webhooks/api.md | 24 + .../openai/resources/webhooks/webhooks.py | 210 + .../site-packages/openai/types/__init__.py | 131 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 7134 bytes .../__pycache__/audio_model.cpython-310.pyc | Bin 0 -> 442 bytes .../audio_response_format.cpython-310.pyc | Bin 0 -> 392 bytes ...le_chunking_strategy_param.cpython-310.pyc | Bin 0 -> 758 bytes .../types/__pycache__/batch.cpython-310.pyc | Bin 0 -> 1853 bytes .../batch_create_params.cpython-310.pyc | Bin 0 -> 1386 bytes .../__pycache__/batch_error.cpython-310.pyc | Bin 0 -> 609 bytes .../batch_list_params.cpython-310.pyc | Bin 0 -> 547 bytes .../batch_request_counts.cpython-310.pyc | Bin 0 -> 580 bytes .../__pycache__/batch_usage.cpython-310.pyc | Bin 0 -> 1248 bytes .../__pycache__/chat_model.cpython-310.pyc | Bin 0 -> 261 bytes .../__pycache__/completion.cpython-310.pyc | Bin 0 -> 1068 bytes .../completion_choice.cpython-310.pyc | Bin 0 -> 1051 bytes .../completion_create_params.cpython-310.pyc | Bin 0 -> 1983 bytes .../completion_usage.cpython-310.pyc | Bin 0 -> 1466 bytes .../container_create_params.cpython-310.pyc | Bin 0 -> 1729 bytes .../container_create_response.cpython-310.pyc | Bin 0 -> 1675 bytes .../container_list_params.cpython-310.pyc | Bin 0 -> 638 bytes .../container_list_response.cpython-310.pyc | Bin 0 -> 1671 bytes ...ontainer_retrieve_response.cpython-310.pyc | Bin 0 -> 1679 bytes .../create_embedding_response.cpython-310.pyc | Bin 0 -> 958 bytes .../__pycache__/deleted_skill.cpython-310.pyc | Bin 0 -> 560 bytes .../__pycache__/embedding.cpython-310.pyc | Bin 0 -> 677 bytes .../embedding_create_params.cpython-310.pyc | Bin 0 -> 986 bytes .../embedding_model.cpython-310.pyc | Bin 0 -> 402 bytes .../eval_create_params.cpython-310.pyc | Bin 0 -> 5794 bytes .../eval_create_response.cpython-310.pyc | Bin 0 -> 3336 bytes ..._custom_data_source_config.cpython-310.pyc | Bin 0 -> 1005 bytes .../eval_delete_response.cpython-310.pyc | Bin 0 -> 500 bytes .../eval_list_params.cpython-310.pyc | Bin 0 -> 669 bytes .../eval_list_response.cpython-310.pyc | Bin 0 -> 3332 bytes .../eval_retrieve_response.cpython-310.pyc | Bin 0 -> 3340 bytes ...letions_data_source_config.cpython-310.pyc | Bin 0 -> 925 bytes .../eval_update_params.cpython-310.pyc | Bin 0 -> 665 bytes .../eval_update_response.cpython-310.pyc | Bin 0 -> 3336 bytes .../file_chunking_strategy.cpython-310.pyc | Bin 0 -> 661 bytes ...le_chunking_strategy_param.cpython-310.pyc | Bin 0 -> 621 bytes .../__pycache__/file_content.cpython-310.pyc | Bin 0 -> 305 bytes .../file_create_params.cpython-310.pyc | Bin 0 -> 1184 bytes .../__pycache__/file_deleted.cpython-310.pyc | Bin 0 -> 549 bytes .../file_list_params.cpython-310.pyc | Bin 0 -> 631 bytes .../__pycache__/file_object.cpython-310.pyc | Bin 0 -> 1010 bytes .../__pycache__/file_purpose.cpython-310.pyc | Bin 0 -> 380 bytes .../types/__pycache__/image.cpython-310.pyc | Bin 0 -> 660 bytes ...ge_create_variation_params.cpython-310.pyc | Bin 0 -> 999 bytes ...image_edit_completed_event.cpython-310.pyc | Bin 0 -> 1639 bytes .../image_edit_params.cpython-310.pyc | Bin 0 -> 1900 bytes ...e_edit_partial_image_event.cpython-310.pyc | Bin 0 -> 971 bytes .../image_edit_stream_event.cpython-310.pyc | Bin 0 -> 633 bytes .../image_gen_completed_event.cpython-310.pyc | Bin 0 -> 1646 bytes ...ge_gen_partial_image_event.cpython-310.pyc | Bin 0 -> 978 bytes .../image_gen_stream_event.cpython-310.pyc | Bin 0 -> 627 bytes .../image_generate_params.cpython-310.pyc | Bin 0 -> 1837 bytes ...mage_input_reference_param.cpython-310.pyc | Bin 0 -> 563 bytes .../__pycache__/image_model.cpython-310.pyc | Bin 0 -> 388 bytes .../images_response.cpython-310.pyc | Bin 0 -> 1946 bytes .../types/__pycache__/model.cpython-310.pyc | Bin 0 -> 652 bytes .../__pycache__/model_deleted.cpython-310.pyc | Bin 0 -> 482 bytes .../__pycache__/moderation.cpython-310.pyc | Bin 0 -> 3124 bytes .../moderation_create_params.cpython-310.pyc | Bin 0 -> 939 bytes ...moderation_create_response.cpython-310.pyc | Bin 0 -> 687 bytes ...tion_image_url_input_param.cpython-310.pyc | Bin 0 -> 958 bytes .../moderation_model.cpython-310.pyc | Bin 0 -> 436 bytes ...on_multi_modal_input_param.cpython-310.pyc | Bin 0 -> 602 bytes ...oderation_text_input_param.cpython-310.pyc | Bin 0 -> 688 bytes ...e_chunking_strategy_object.cpython-310.pyc | Bin 0 -> 745 bytes .../types/__pycache__/skill.cpython-310.pyc | Bin 0 -> 657 bytes .../skill_create_params.cpython-310.pyc | Bin 0 -> 671 bytes .../__pycache__/skill_list.cpython-310.pyc | Bin 0 -> 744 bytes .../skill_list_params.cpython-310.pyc | Bin 0 -> 610 bytes .../skill_update_params.cpython-310.pyc | Bin 0 -> 564 bytes ...tic_file_chunking_strategy.cpython-310.pyc | Bin 0 -> 526 bytes ...e_chunking_strategy_object.cpython-310.pyc | Bin 0 -> 652 bytes ...king_strategy_object_param.cpython-310.pyc | Bin 0 -> 879 bytes ...le_chunking_strategy_param.cpython-310.pyc | Bin 0 -> 636 bytes .../types/__pycache__/upload.cpython-310.pyc | Bin 0 -> 926 bytes .../upload_complete_params.cpython-310.pyc | Bin 0 -> 653 bytes .../upload_create_params.cpython-310.pyc | Bin 0 -> 1192 bytes .../__pycache__/vector_store.cpython-310.pyc | Bin 0 -> 1621 bytes ...vector_store_create_params.cpython-310.pyc | Bin 0 -> 1292 bytes .../vector_store_deleted.cpython-310.pyc | Bin 0 -> 580 bytes .../vector_store_list_params.cpython-310.pyc | Bin 0 -> 645 bytes ...vector_store_search_params.cpython-310.pyc | Bin 0 -> 1366 bytes ...ctor_store_search_response.cpython-310.pyc | Bin 0 -> 976 bytes ...vector_store_update_params.cpython-310.pyc | Bin 0 -> 1083 bytes .../types/__pycache__/video.cpython-310.pyc | Bin 0 -> 1274 bytes ...eo_create_character_params.cpython-310.pyc | Bin 0 -> 659 bytes ..._create_character_response.cpython-310.pyc | Bin 0 -> 601 bytes .../video_create_error.cpython-310.pyc | Bin 0 -> 545 bytes .../video_create_params.cpython-310.pyc | Bin 0 -> 1060 bytes .../video_delete_response.cpython-310.pyc | Bin 0 -> 655 bytes ...eo_download_content_params.cpython-310.pyc | Bin 0 -> 605 bytes .../video_edit_params.cpython-310.pyc | Bin 0 -> 994 bytes .../video_extend_params.cpython-310.pyc | Bin 0 -> 1100 bytes ...deo_get_character_response.cpython-310.pyc | Bin 0 -> 595 bytes .../video_list_params.cpython-310.pyc | Bin 0 -> 610 bytes .../__pycache__/video_model.cpython-310.pyc | Bin 0 -> 456 bytes .../video_model_param.cpython-310.pyc | Bin 0 -> 518 bytes .../video_remix_params.cpython-310.pyc | Bin 0 -> 553 bytes .../__pycache__/video_seconds.cpython-310.pyc | Bin 0 -> 336 bytes .../__pycache__/video_size.cpython-310.pyc | Bin 0 -> 362 bytes ...bsocket_connection_options.cpython-310.pyc | Bin 0 -> 1309 bytes .../openai/types/audio/__init__.py | 23 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1545 bytes .../speech_create_params.cpython-310.pyc | Bin 0 -> 1340 bytes .../__pycache__/speech_model.cpython-310.pyc | Bin 0 -> 392 bytes .../__pycache__/transcription.cpython-310.pyc | Bin 0 -> 2239 bytes ...ranscription_create_params.cpython-310.pyc | Bin 0 -> 2216 bytes ...nscription_create_response.cpython-310.pyc | Bin 0 -> 575 bytes .../transcription_diarized.cpython-310.pyc | Bin 0 -> 2174 bytes ...scription_diarized_segment.cpython-310.pyc | Bin 0 -> 755 bytes .../transcription_include.cpython-310.pyc | Bin 0 -> 356 bytes .../transcription_segment.cpython-310.pyc | Bin 0 -> 743 bytes ...transcription_stream_event.cpython-310.pyc | Bin 0 -> 745 bytes ...scription_text_delta_event.cpython-310.pyc | Bin 0 -> 1324 bytes ...nscription_text_done_event.cpython-310.pyc | Bin 0 -> 2011 bytes ...ription_text_segment_event.cpython-310.pyc | Bin 0 -> 998 bytes .../transcription_verbose.cpython-310.pyc | Bin 0 -> 1294 bytes .../transcription_word.cpython-310.pyc | Bin 0 -> 506 bytes .../__pycache__/translation.cpython-310.pyc | Bin 0 -> 444 bytes .../translation_create_params.cpython-310.pyc | Bin 0 -> 929 bytes ...ranslation_create_response.cpython-310.pyc | Bin 0 -> 493 bytes .../translation_verbose.cpython-310.pyc | Bin 0 -> 702 bytes .../types/audio/speech_create_params.py | 68 + .../openai/types/audio/speech_model.py | 7 + .../openai/types/audio/transcription.py | 81 + .../audio/transcription_create_params.py | 172 + .../audio/transcription_create_response.py | 12 + .../types/audio/transcription_diarized.py | 73 + .../audio/transcription_diarized_segment.py | 34 + .../types/audio/transcription_include.py | 7 + .../types/audio/transcription_segment.py | 49 + .../types/audio/transcription_stream_event.py | 16 + .../audio/transcription_text_delta_event.py | 46 + .../audio/transcription_text_done_event.py | 72 + .../audio/transcription_text_segment_event.py | 31 + .../types/audio/transcription_verbose.py | 44 + .../openai/types/audio/transcription_word.py | 16 + .../openai/types/audio/translation.py | 9 + .../types/audio/translation_create_params.py | 49 + .../audio/translation_create_response.py | 11 + .../openai/types/audio/translation_verbose.py | 22 + .../site-packages/openai/types/audio_model.py | 13 + .../openai/types/audio_response_format.py | 7 + .../auto_file_chunking_strategy_param.py | 17 + .../site-packages/openai/types/batch.py | 104 + .../openai/types/batch_create_params.py | 86 + .../site-packages/openai/types/batch_error.py | 21 + .../openai/types/batch_list_params.py | 24 + .../openai/types/batch_request_counts.py | 18 + .../site-packages/openai/types/batch_usage.py | 45 + .../openai/types/beta/__init__.py | 34 + .../beta/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 2106 bytes .../__pycache__/assistant.cpython-310.pyc | Bin 0 -> 2218 bytes .../assistant_create_params.cpython-310.pyc | Bin 0 -> 3788 bytes .../assistant_deleted.cpython-310.pyc | Bin 0 -> 577 bytes .../assistant_list_params.cpython-310.pyc | Bin 0 -> 645 bytes ...ant_response_format_option.cpython-310.pyc | Bin 0 -> 664 bytes ...sponse_format_option_param.cpython-310.pyc | Bin 0 -> 747 bytes .../assistant_stream_event.cpython-310.pyc | Bin 0 -> 8195 bytes .../assistant_tool.cpython-310.pyc | Bin 0 -> 639 bytes .../assistant_tool_choice.cpython-310.pyc | Bin 0 -> 843 bytes ...stant_tool_choice_function.cpython-310.pyc | Bin 0 -> 480 bytes ...tool_choice_function_param.cpython-310.pyc | Bin 0 -> 590 bytes ...sistant_tool_choice_option.cpython-310.pyc | Bin 0 -> 495 bytes ...t_tool_choice_option_param.cpython-310.pyc | Bin 0 -> 568 bytes ...ssistant_tool_choice_param.cpython-310.pyc | Bin 0 -> 880 bytes .../assistant_tool_param.cpython-310.pyc | Bin 0 -> 625 bytes .../assistant_update_params.cpython-310.pyc | Bin 0 -> 3074 bytes .../chatkit_workflow.cpython-310.pyc | Bin 0 -> 975 bytes .../code_interpreter_tool.cpython-310.pyc | Bin 0 -> 539 bytes ...ode_interpreter_tool_param.cpython-310.pyc | Bin 0 -> 615 bytes .../file_search_tool.cpython-310.pyc | Bin 0 -> 1513 bytes .../file_search_tool_param.cpython-310.pyc | Bin 0 -> 1458 bytes .../__pycache__/function_tool.cpython-310.pyc | Bin 0 -> 605 bytes .../function_tool_param.cpython-310.pyc | Bin 0 -> 723 bytes .../beta/__pycache__/thread.cpython-310.pyc | Bin 0 -> 1842 bytes ...read_create_and_run_params.cpython-310.pyc | Bin 0 -> 6989 bytes .../thread_create_params.cpython-310.pyc | Bin 0 -> 4089 bytes .../thread_deleted.cpython-310.pyc | Bin 0 -> 568 bytes .../thread_update_params.cpython-310.pyc | Bin 0 -> 1633 bytes .../openai/types/beta/assistant.py | 141 + .../types/beta/assistant_create_params.py | 232 + .../openai/types/beta/assistant_deleted.py | 15 + .../types/beta/assistant_list_params.py | 39 + .../beta/assistant_response_format_option.py | 14 + .../assistant_response_format_option_param.py | 16 + .../types/beta/assistant_stream_event.py | 390 + .../openai/types/beta/assistant_tool.py | 15 + .../types/beta/assistant_tool_choice.py | 21 + .../beta/assistant_tool_choice_function.py | 10 + .../assistant_tool_choice_function_param.py | 12 + .../beta/assistant_tool_choice_option.py | 10 + .../assistant_tool_choice_option_param.py | 12 + .../types/beta/assistant_tool_choice_param.py | 21 + .../openai/types/beta/assistant_tool_param.py | 14 + .../types/beta/assistant_update_params.py | 197 + .../openai/types/beta/chat/__init__.py | 3 + .../chat/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 233 bytes .../openai/types/beta/chatkit/__init__.py | 32 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1843 bytes .../__pycache__/chat_session.cpython-310.pyc | Bin 0 -> 1169 bytes ...n_automatic_thread_titling.cpython-310.pyc | Bin 0 -> 573 bytes ...sion_chatkit_configuration.cpython-310.pyc | Bin 0 -> 864 bytes ...hatkit_configuration_param.cpython-310.pyc | Bin 0 -> 1748 bytes ...ession_expires_after_param.cpython-310.pyc | Bin 0 -> 749 bytes .../chat_session_file_upload.cpython-310.pyc | Bin 0 -> 684 bytes .../chat_session_history.cpython-310.pyc | Bin 0 -> 642 bytes .../chat_session_rate_limits.cpython-310.pyc | Bin 0 -> 562 bytes ..._session_rate_limits_param.cpython-310.pyc | Bin 0 -> 640 bytes .../chat_session_status.cpython-310.pyc | Bin 0 -> 378 bytes ...hat_session_workflow_param.cpython-310.pyc | Bin 0 -> 1107 bytes .../chatkit_attachment.cpython-310.pyc | Bin 0 -> 753 bytes ...atkit_response_output_text.cpython-310.pyc | Bin 0 -> 1881 bytes .../chatkit_thread.cpython-310.pyc | Bin 0 -> 1693 bytes ...ead_assistant_message_item.cpython-310.pyc | Bin 0 -> 927 bytes .../chatkit_thread_item_list.cpython-310.pyc | Bin 0 -> 3097 bytes ...t_thread_user_message_item.cpython-310.pyc | Bin 0 -> 2282 bytes .../chatkit_widget_item.cpython-310.pyc | Bin 0 -> 748 bytes .../session_create_params.cpython-310.pyc | Bin 0 -> 1086 bytes .../thread_delete_response.cpython-310.pyc | Bin 0 -> 680 bytes .../thread_list_items_params.cpython-310.pyc | Bin 0 -> 658 bytes .../thread_list_params.cpython-310.pyc | Bin 0 -> 667 bytes .../openai/types/beta/chatkit/chat_session.py | 45 + .../chat_session_automatic_thread_titling.py | 12 + .../chat_session_chatkit_configuration.py | 21 + ...hat_session_chatkit_configuration_param.py | 76 + .../chat_session_expires_after_param.py | 17 + .../beta/chatkit/chat_session_file_upload.py | 20 + .../beta/chatkit/chat_session_history.py | 20 + .../beta/chatkit/chat_session_rate_limits.py | 12 + .../chatkit/chat_session_rate_limits_param.py | 14 + .../types/beta/chatkit/chat_session_status.py | 7 + .../chatkit/chat_session_workflow_param.py | 41 + .../types/beta/chatkit/chatkit_attachment.py | 27 + .../chatkit/chatkit_response_output_text.py | 72 + .../types/beta/chatkit/chatkit_thread.py | 64 + .../chatkit_thread_assistant_message_item.py | 31 + .../beta/chatkit/chatkit_thread_item_list.py | 154 + .../chatkit_thread_user_message_item.py | 87 + .../types/beta/chatkit/chatkit_widget_item.py | 29 + .../beta/chatkit/session_create_params.py | 35 + .../beta/chatkit/thread_delete_response.py | 20 + .../beta/chatkit/thread_list_items_params.py | 27 + .../types/beta/chatkit/thread_list_params.py | 33 + .../openai/types/beta/chatkit_workflow.py | 36 + .../types/beta/code_interpreter_tool.py | 12 + .../types/beta/code_interpreter_tool_param.py | 12 + .../openai/types/beta/file_search_tool.py | 64 + .../types/beta/file_search_tool_param.py | 63 + .../openai/types/beta/function_tool.py | 15 + .../openai/types/beta/function_tool_param.py | 16 + .../openai/types/beta/realtime/__init__.py | 96 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 5940 bytes ...conversation_created_event.cpython-310.pyc | Bin 0 -> 918 bytes .../conversation_item.cpython-310.pyc | Bin 0 -> 1144 bytes .../conversation_item_content.cpython-310.pyc | Bin 0 -> 790 bytes ...rsation_item_content_param.cpython-310.pyc | Bin 0 -> 737 bytes ...ersation_item_create_event.cpython-310.pyc | Bin 0 -> 792 bytes ...on_item_create_event_param.cpython-310.pyc | Bin 0 -> 837 bytes ...rsation_item_created_event.cpython-310.pyc | Bin 0 -> 782 bytes ...ersation_item_delete_event.cpython-310.pyc | Bin 0 -> 682 bytes ...on_item_delete_event_param.cpython-310.pyc | Bin 0 -> 716 bytes ...rsation_item_deleted_event.cpython-310.pyc | Bin 0 -> 628 bytes ...nscription_completed_event.cpython-310.pyc | Bin 0 -> 2096 bytes ..._transcription_delta_event.cpython-310.pyc | Bin 0 -> 1121 bytes ...transcription_failed_event.cpython-310.pyc | Bin 0 -> 1084 bytes .../conversation_item_param.cpython-310.pyc | Bin 0 -> 1105 bytes ...sation_item_retrieve_event.cpython-310.pyc | Bin 0 -> 688 bytes ..._item_retrieve_event_param.cpython-310.pyc | Bin 0 -> 722 bytes ...sation_item_truncate_event.cpython-310.pyc | Bin 0 -> 750 bytes ..._item_truncate_event_param.cpython-310.pyc | Bin 0 -> 794 bytes ...ation_item_truncated_event.cpython-310.pyc | Bin 0 -> 696 bytes ...sation_item_with_reference.cpython-310.pyc | Bin 0 -> 1478 bytes ..._item_with_reference_param.cpython-310.pyc | Bin 0 -> 1344 bytes .../__pycache__/error_event.cpython-310.pyc | Bin 0 -> 896 bytes ..._audio_buffer_append_event.cpython-310.pyc | Bin 0 -> 682 bytes ..._buffer_append_event_param.cpython-310.pyc | Bin 0 -> 716 bytes ...t_audio_buffer_clear_event.cpython-310.pyc | Bin 0 -> 658 bytes ...o_buffer_clear_event_param.cpython-310.pyc | Bin 0 -> 677 bytes ...audio_buffer_cleared_event.cpython-310.pyc | Bin 0 -> 607 bytes ..._audio_buffer_commit_event.cpython-310.pyc | Bin 0 -> 661 bytes ..._buffer_commit_event_param.cpython-310.pyc | Bin 0 -> 680 bytes ...dio_buffer_committed_event.cpython-310.pyc | Bin 0 -> 725 bytes ...uffer_speech_started_event.cpython-310.pyc | Bin 0 -> 685 bytes ...uffer_speech_stopped_event.cpython-310.pyc | Bin 0 -> 683 bytes .../rate_limits_updated_event.cpython-310.pyc | Bin 0 -> 1019 bytes .../realtime_client_event.cpython-310.pyc | Bin 0 -> 1754 bytes ...ealtime_client_event_param.cpython-310.pyc | Bin 0 -> 1812 bytes .../realtime_connect_params.cpython-310.pyc | Bin 0 -> 574 bytes .../realtime_response.cpython-310.pyc | Bin 0 -> 1606 bytes .../realtime_response_status.cpython-310.pyc | Bin 0 -> 1000 bytes .../realtime_response_usage.cpython-310.pyc | Bin 0 -> 1263 bytes .../realtime_server_event.cpython-310.pyc | Bin 0 -> 4386 bytes ...response_audio_delta_event.cpython-310.pyc | Bin 0 -> 723 bytes .../response_audio_done_event.cpython-310.pyc | Bin 0 -> 699 bytes ...dio_transcript_delta_event.cpython-310.pyc | Bin 0 -> 755 bytes ...udio_transcript_done_event.cpython-310.pyc | Bin 0 -> 757 bytes .../response_cancel_event.cpython-310.pyc | Bin 0 -> 673 bytes ...esponse_cancel_event_param.cpython-310.pyc | Bin 0 -> 679 bytes ...e_content_part_added_event.cpython-310.pyc | Bin 0 -> 1094 bytes ...se_content_part_done_event.cpython-310.pyc | Bin 0 -> 1091 bytes .../response_create_event.cpython-310.pyc | Bin 0 -> 2003 bytes ...esponse_create_event_param.cpython-310.pyc | Bin 0 -> 1972 bytes .../response_created_event.cpython-310.pyc | Bin 0 -> 671 bytes .../response_done_event.cpython-310.pyc | Bin 0 -> 662 bytes ...call_arguments_delta_event.cpython-310.pyc | Bin 0 -> 769 bytes ..._call_arguments_done_event.cpython-310.pyc | Bin 0 -> 770 bytes ...se_output_item_added_event.cpython-310.pyc | Bin 0 -> 755 bytes ...nse_output_item_done_event.cpython-310.pyc | Bin 0 -> 752 bytes .../response_text_delta_event.cpython-310.pyc | Bin 0 -> 720 bytes .../response_text_done_event.cpython-310.pyc | Bin 0 -> 716 bytes .../__pycache__/session.cpython-310.pyc | Bin 0 -> 3427 bytes .../session_create_params.cpython-310.pyc | Bin 0 -> 3436 bytes .../session_create_response.cpython-310.pyc | Bin 0 -> 2774 bytes .../session_created_event.cpython-310.pyc | Bin 0 -> 644 bytes .../session_update_event.cpython-310.pyc | Bin 0 -> 4242 bytes ...session_update_event_param.cpython-310.pyc | Bin 0 -> 3767 bytes .../session_updated_event.cpython-310.pyc | Bin 0 -> 644 bytes .../transcription_session.cpython-310.pyc | Bin 0 -> 1722 bytes ...tion_session_create_params.cpython-310.pyc | Bin 0 -> 2231 bytes ...anscription_session_update.cpython-310.pyc | Bin 0 -> 2881 bytes ...ption_session_update_param.cpython-310.pyc | Bin 0 -> 2556 bytes ...tion_session_updated_event.cpython-310.pyc | Bin 0 -> 716 bytes .../realtime/conversation_created_event.py | 27 + .../types/beta/realtime/conversation_item.py | 61 + .../realtime/conversation_item_content.py | 32 + .../conversation_item_content_param.py | 31 + .../conversation_item_create_event.py | 29 + .../conversation_item_create_event_param.py | 29 + .../conversation_item_created_event.py | 27 + .../conversation_item_delete_event.py | 19 + .../conversation_item_delete_event_param.py | 18 + .../conversation_item_deleted_event.py | 18 + ...put_audio_transcription_completed_event.py | 87 + ...m_input_audio_transcription_delta_event.py | 39 + ..._input_audio_transcription_failed_event.py | 39 + .../beta/realtime/conversation_item_param.py | 62 + .../conversation_item_retrieve_event.py | 19 + .../conversation_item_retrieve_event_param.py | 18 + .../conversation_item_truncate_event.py | 32 + .../conversation_item_truncate_event_param.py | 31 + .../conversation_item_truncated_event.py | 24 + .../conversation_item_with_reference.py | 87 + .../conversation_item_with_reference_param.py | 87 + .../openai/types/beta/realtime/error_event.py | 36 + .../input_audio_buffer_append_event.py | 23 + .../input_audio_buffer_append_event_param.py | 22 + .../input_audio_buffer_clear_event.py | 16 + .../input_audio_buffer_clear_event_param.py | 15 + .../input_audio_buffer_cleared_event.py | 15 + .../input_audio_buffer_commit_event.py | 16 + .../input_audio_buffer_commit_event_param.py | 15 + .../input_audio_buffer_committed_event.py | 25 + ...input_audio_buffer_speech_started_event.py | 26 + ...input_audio_buffer_speech_stopped_event.py | 25 + .../realtime/rate_limits_updated_event.py | 33 + .../beta/realtime/realtime_client_event.py | 47 + .../realtime/realtime_client_event_param.py | 44 + .../beta/realtime/realtime_connect_params.py | 11 + .../types/beta/realtime/realtime_response.py | 87 + .../beta/realtime/realtime_response_status.py | 39 + .../beta/realtime/realtime_response_usage.py | 52 + .../beta/realtime/realtime_server_event.py | 133 + .../realtime/response_audio_delta_event.py | 30 + .../realtime/response_audio_done_event.py | 27 + .../response_audio_transcript_delta_event.py | 30 + .../response_audio_transcript_done_event.py | 30 + .../beta/realtime/response_cancel_event.py | 22 + .../realtime/response_cancel_event_param.py | 21 + .../response_content_part_added_event.py | 45 + .../response_content_part_done_event.py | 45 + .../beta/realtime/response_create_event.py | 121 + .../realtime/response_create_event_param.py | 122 + .../beta/realtime/response_created_event.py | 19 + .../beta/realtime/response_done_event.py | 19 + ...nse_function_call_arguments_delta_event.py | 30 + ...onse_function_call_arguments_done_event.py | 30 + .../response_output_item_added_event.py | 25 + .../response_output_item_done_event.py | 25 + .../realtime/response_text_delta_event.py | 30 + .../beta/realtime/response_text_done_event.py | 30 + .../openai/types/beta/realtime/session.py | 279 + .../beta/realtime/session_create_params.py | 298 + .../beta/realtime/session_create_response.py | 196 + .../beta/realtime/session_created_event.py | 19 + .../beta/realtime/session_update_event.py | 312 + .../realtime/session_update_event_param.py | 310 + .../beta/realtime/session_updated_event.py | 19 + .../beta/realtime/transcription_session.py | 100 + .../transcription_session_create_params.py | 173 + .../realtime/transcription_session_update.py | 185 + .../transcription_session_update_param.py | 185 + .../transcription_session_updated_event.py | 24 + .../site-packages/openai/types/beta/thread.py | 71 + .../beta/thread_create_and_run_params.py | 423 + .../openai/types/beta/thread_create_params.py | 196 + .../openai/types/beta/thread_deleted.py | 15 + .../openai/types/beta/thread_update_params.py | 60 + .../openai/types/beta/threads/__init__.py | 46 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 2749 bytes .../__pycache__/annotation.cpython-310.pyc | Bin 0 -> 598 bytes .../annotation_delta.cpython-310.pyc | Bin 0 -> 635 bytes .../file_citation_annotation.cpython-310.pyc | Bin 0 -> 1043 bytes ..._citation_delta_annotation.cpython-310.pyc | Bin 0 -> 1223 bytes .../file_path_annotation.cpython-310.pyc | Bin 0 -> 932 bytes ...file_path_delta_annotation.cpython-310.pyc | Bin 0 -> 1078 bytes .../__pycache__/image_file.cpython-310.pyc | Bin 0 -> 614 bytes .../image_file_content_block.cpython-310.pyc | Bin 0 -> 739 bytes ...e_file_content_block_param.cpython-310.pyc | Bin 0 -> 866 bytes .../image_file_delta.cpython-310.pyc | Bin 0 -> 638 bytes .../image_file_delta_block.cpython-310.pyc | Bin 0 -> 838 bytes .../image_file_param.cpython-310.pyc | Bin 0 -> 635 bytes .../__pycache__/image_url.cpython-310.pyc | Bin 0 -> 608 bytes .../image_url_content_block.cpython-310.pyc | Bin 0 -> 668 bytes ...ge_url_content_block_param.cpython-310.pyc | Bin 0 -> 792 bytes .../image_url_delta.cpython-310.pyc | Bin 0 -> 632 bytes .../image_url_delta_block.cpython-310.pyc | Bin 0 -> 766 bytes .../image_url_param.cpython-310.pyc | Bin 0 -> 629 bytes .../__pycache__/message.cpython-310.pyc | Bin 0 -> 2316 bytes .../message_content.cpython-310.pyc | Bin 0 -> 747 bytes .../message_content_delta.cpython-310.pyc | Bin 0 -> 742 bytes ...message_content_part_param.cpython-310.pyc | Bin 0 -> 671 bytes .../message_create_params.cpython-310.pyc | Bin 0 -> 1592 bytes .../message_deleted.cpython-310.pyc | Bin 0 -> 586 bytes .../__pycache__/message_delta.cpython-310.pyc | Bin 0 -> 807 bytes .../message_delta_event.cpython-310.pyc | Bin 0 -> 761 bytes .../message_list_params.cpython-310.pyc | Bin 0 -> 671 bytes .../message_update_params.cpython-310.pyc | Bin 0 -> 714 bytes .../refusal_content_block.cpython-310.pyc | Bin 0 -> 617 bytes .../refusal_delta_block.cpython-310.pyc | Bin 0 -> 697 bytes ..._action_function_tool_call.cpython-310.pyc | Bin 0 -> 869 bytes .../threads/__pycache__/run.cpython-310.pyc | Bin 0 -> 4200 bytes .../run_create_params.cpython-310.pyc | Bin 0 -> 3861 bytes .../run_list_params.cpython-310.pyc | Bin 0 -> 641 bytes .../__pycache__/run_status.cpython-310.pyc | Bin 0 -> 438 bytes ...submit_tool_outputs_params.cpython-310.pyc | Bin 0 -> 1367 bytes .../run_update_params.cpython-310.pyc | Bin 0 -> 706 bytes .../threads/__pycache__/text.cpython-310.pyc | Bin 0 -> 567 bytes .../text_content_block.cpython-310.pyc | Bin 0 -> 641 bytes .../text_content_block_param.cpython-310.pyc | Bin 0 -> 700 bytes .../__pycache__/text_delta.cpython-310.pyc | Bin 0 -> 639 bytes .../text_delta_block.cpython-310.pyc | Bin 0 -> 734 bytes .../openai/types/beta/threads/annotation.py | 12 + .../types/beta/threads/annotation_delta.py | 14 + .../beta/threads/file_citation_annotation.py | 30 + .../threads/file_citation_delta_annotation.py | 37 + .../beta/threads/file_path_annotation.py | 30 + .../threads/file_path_delta_annotation.py | 34 + .../openai/types/beta/threads/image_file.py | 23 + .../beta/threads/image_file_content_block.py | 19 + .../threads/image_file_content_block_param.py | 20 + .../types/beta/threads/image_file_delta.py | 23 + .../beta/threads/image_file_delta_block.py | 23 + .../types/beta/threads/image_file_param.py | 22 + .../openai/types/beta/threads/image_url.py | 23 + .../beta/threads/image_url_content_block.py | 17 + .../threads/image_url_content_block_param.py | 18 + .../types/beta/threads/image_url_delta.py | 22 + .../beta/threads/image_url_delta_block.py | 21 + .../types/beta/threads/image_url_param.py | 22 + .../openai/types/beta/threads/message.py | 109 + .../types/beta/threads/message_content.py | 18 + .../beta/threads/message_content_delta.py | 17 + .../threads/message_content_part_param.py | 14 + .../beta/threads/message_create_params.py | 55 + .../types/beta/threads/message_deleted.py | 15 + .../types/beta/threads/message_delta.py | 19 + .../types/beta/threads/message_delta_event.py | 24 + .../types/beta/threads/message_list_params.py | 42 + .../beta/threads/message_update_params.py | 24 + .../beta/threads/refusal_content_block.py | 16 + .../types/beta/threads/refusal_delta_block.py | 20 + .../required_action_function_tool_call.py | 38 + .../openai/types/beta/threads/run.py | 273 + .../types/beta/threads/run_create_params.py | 274 + .../types/beta/threads/run_list_params.py | 39 + .../openai/types/beta/threads/run_status.py | 17 + .../threads/run_submit_tool_outputs_params.py | 52 + .../types/beta/threads/run_update_params.py | 24 + .../types/beta/threads/runs/__init__.py | 24 + .../runs/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1530 bytes .../code_interpreter_logs.cpython-310.pyc | Bin 0 -> 729 bytes ...e_interpreter_output_image.cpython-310.pyc | Bin 0 -> 842 bytes ...code_interpreter_tool_call.cpython-310.pyc | Bin 0 -> 1905 bytes ...nterpreter_tool_call_delta.cpython-310.pyc | Bin 0 -> 1475 bytes .../file_search_tool_call.cpython-310.pyc | Bin 0 -> 1867 bytes ...ile_search_tool_call_delta.cpython-310.pyc | Bin 0 -> 685 bytes .../function_tool_call.cpython-310.pyc | Bin 0 -> 916 bytes .../function_tool_call_delta.cpython-310.pyc | Bin 0 -> 1010 bytes ...sage_creation_step_details.cpython-310.pyc | Bin 0 -> 828 bytes .../runs/__pycache__/run_step.cpython-310.pyc | Bin 0 -> 2339 bytes .../run_step_delta.cpython-310.pyc | Bin 0 -> 983 bytes .../run_step_delta_event.cpython-310.pyc | Bin 0 -> 771 bytes ...n_step_delta_message_delta.cpython-310.pyc | Bin 0 -> 902 bytes .../run_step_include.cpython-310.pyc | Bin 0 -> 406 bytes .../step_list_params.cpython-310.pyc | Bin 0 -> 843 bytes .../step_retrieve_params.cpython-310.pyc | Bin 0 -> 732 bytes .../__pycache__/tool_call.cpython-310.pyc | Bin 0 -> 669 bytes .../tool_call_delta.cpython-310.pyc | Bin 0 -> 717 bytes .../tool_call_delta_object.cpython-310.pyc | Bin 0 -> 747 bytes .../tool_calls_step_details.cpython-310.pyc | Bin 0 -> 701 bytes .../threads/runs/code_interpreter_logs.py | 21 + .../runs/code_interpreter_output_image.py | 26 + .../runs/code_interpreter_tool_call.py | 76 + .../runs/code_interpreter_tool_call_delta.py | 48 + .../threads/runs/file_search_tool_call.py | 84 + .../runs/file_search_tool_call_delta.py | 25 + .../beta/threads/runs/function_tool_call.py | 40 + .../threads/runs/function_tool_call_delta.py | 43 + .../runs/message_creation_step_details.py | 21 + .../types/beta/threads/runs/run_step.py | 127 + .../types/beta/threads/runs/run_step_delta.py | 22 + .../beta/threads/runs/run_step_delta_event.py | 24 + .../runs/run_step_delta_message_delta.py | 22 + .../beta/threads/runs/run_step_include.py | 7 + .../beta/threads/runs/step_list_params.py | 56 + .../beta/threads/runs/step_retrieve_params.py | 28 + .../types/beta/threads/runs/tool_call.py | 15 + .../beta/threads/runs/tool_call_delta.py | 16 + .../threads/runs/tool_call_delta_object.py | 23 + .../threads/runs/tool_calls_step_details.py | 23 + .../openai/types/beta/threads/text.py | 15 + .../types/beta/threads/text_content_block.py | 17 + .../beta/threads/text_content_block_param.py | 17 + .../openai/types/beta/threads/text_delta.py | 15 + .../types/beta/threads/text_delta_block.py | 21 + .../openai/types/chat/__init__.py | 102 + .../chat/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 4755 bytes .../chat_completion.cpython-310.pyc | Bin 0 -> 1849 bytes ..._allowed_tool_choice_param.cpython-310.pyc | Bin 0 -> 888 bytes ...letion_allowed_tools_param.cpython-310.pyc | Bin 0 -> 826 bytes ...on_assistant_message_param.cpython-310.pyc | Bin 0 -> 2132 bytes .../chat_completion_audio.cpython-310.pyc | Bin 0 -> 739 bytes ...hat_completion_audio_param.cpython-310.pyc | Bin 0 -> 1269 bytes .../chat_completion_chunk.cpython-310.pyc | Bin 0 -> 3310 bytes ...pletion_content_part_image.cpython-310.pyc | Bin 0 -> 937 bytes ...n_content_part_image_param.cpython-310.pyc | Bin 0 -> 1000 bytes ...ent_part_input_audio_param.cpython-310.pyc | Bin 0 -> 1020 bytes ...pletion_content_part_param.cpython-310.pyc | Bin 0 -> 1443 bytes ...content_part_refusal_param.cpython-310.pyc | Bin 0 -> 672 bytes ...mpletion_content_part_text.cpython-310.pyc | Bin 0 -> 678 bytes ...on_content_part_text_param.cpython-310.pyc | Bin 0 -> 770 bytes ...mpletion_custom_tool_param.cpython-310.pyc | Bin 0 -> 1807 bytes .../chat_completion_deleted.cpython-310.pyc | Bin 0 -> 604 bytes ...on_developer_message_param.cpython-310.pyc | Bin 0 -> 1129 bytes ...function_call_option_param.cpython-310.pyc | Bin 0 -> 730 bytes ...ion_function_message_param.cpython-310.pyc | Bin 0 -> 750 bytes ...t_completion_function_tool.cpython-310.pyc | Bin 0 -> 708 bytes ...letion_function_tool_param.cpython-310.pyc | Bin 0 -> 826 bytes .../chat_completion_message.cpython-310.pyc | Bin 0 -> 1984 bytes ...n_message_custom_tool_call.cpython-310.pyc | Bin 0 -> 906 bytes ...age_custom_tool_call_param.cpython-310.pyc | Bin 0 -> 995 bytes ...message_function_tool_call.cpython-310.pyc | Bin 0 -> 917 bytes ...e_function_tool_call_param.cpython-310.pyc | Bin 0 -> 1010 bytes ...t_completion_message_param.cpython-310.pyc | Bin 0 -> 1027 bytes ...mpletion_message_tool_call.cpython-310.pyc | Bin 0 -> 791 bytes ...on_message_tool_call_param.cpython-310.pyc | Bin 0 -> 552 bytes ...sage_tool_call_union_param.cpython-310.pyc | Bin 0 -> 696 bytes .../chat_completion_modality.cpython-310.pyc | Bin 0 -> 365 bytes ...d_tool_choice_custom_param.cpython-310.pyc | Bin 0 -> 976 bytes ...on_named_tool_choice_param.cpython-310.pyc | Bin 0 -> 968 bytes ...n_prediction_content_param.cpython-310.pyc | Bin 0 -> 1005 bytes ...ompletion_reasoning_effort.cpython-310.pyc | Bin 0 -> 328 bytes .../chat_completion_role.cpython-310.pyc | Bin 0 -> 396 bytes ...t_completion_store_message.cpython-310.pyc | Bin 0 -> 1008 bytes ...etion_stream_options_param.cpython-310.pyc | Bin 0 -> 697 bytes ...etion_system_message_param.cpython-310.pyc | Bin 0 -> 1110 bytes ...t_completion_token_logprob.cpython-310.pyc | Bin 0 -> 902 bytes ...n_tool_choice_option_param.cpython-310.pyc | Bin 0 -> 830 bytes ...pletion_tool_message_param.cpython-310.pyc | Bin 0 -> 908 bytes ...chat_completion_tool_param.cpython-310.pyc | Bin 0 -> 514 bytes ...ompletion_tool_union_param.cpython-310.pyc | Bin 0 -> 620 bytes ...pletion_user_message_param.cpython-310.pyc | Bin 0 -> 991 bytes .../completion_create_params.cpython-310.pyc | Bin 0 -> 5320 bytes .../completion_list_params.cpython-310.pyc | Bin 0 -> 789 bytes .../completion_update_params.cpython-310.pyc | Bin 0 -> 686 bytes .../parsed_chat_completion.cpython-310.pyc | Bin 0 -> 1295 bytes .../parsed_function_tool_call.cpython-310.pyc | Bin 0 -> 807 bytes .../openai/types/chat/chat_completion.py | 95 + ...at_completion_allowed_tool_choice_param.py | 19 + .../chat_completion_allowed_tools_param.py | 34 + ...chat_completion_assistant_message_param.py | 82 + .../types/chat/chat_completion_audio.py | 30 + .../types/chat/chat_completion_audio_param.py | 43 + .../types/chat/chat_completion_chunk.py | 181 + .../chat_completion_content_part_image.py | 29 + ...hat_completion_content_part_image_param.py | 28 + ...mpletion_content_part_input_audio_param.py | 24 + .../chat_completion_content_part_param.py | 45 + ...t_completion_content_part_refusal_param.py | 15 + .../chat/chat_completion_content_part_text.py | 19 + ...chat_completion_content_part_text_param.py | 19 + .../chat/chat_completion_custom_tool_param.py | 68 + .../types/chat/chat_completion_deleted.py | 18 + ...chat_completion_developer_message_param.py | 31 + ...t_completion_function_call_option_param.py | 16 + .../chat_completion_function_message_param.py | 19 + .../chat/chat_completion_function_tool.py | 17 + .../chat_completion_function_tool_param.py | 18 + .../types/chat/chat_completion_message.py | 90 + ...hat_completion_message_custom_tool_call.py | 30 + ...mpletion_message_custom_tool_call_param.py | 30 + ...t_completion_message_function_tool_call.py | 35 + ...letion_message_function_tool_call_param.py | 35 + .../chat/chat_completion_message_param.py | 24 + .../chat/chat_completion_message_tool_call.py | 17 + ...chat_completion_message_tool_call_param.py | 14 + ...ompletion_message_tool_call_union_param.py | 15 + .../types/chat/chat_completion_modality.py | 7 + ...mpletion_named_tool_choice_custom_param.py | 24 + ...chat_completion_named_tool_choice_param.py | 24 + ...hat_completion_prediction_content_param.py | 30 + .../chat/chat_completion_reasoning_effort.py | 7 + .../openai/types/chat/chat_completion_role.py | 7 + .../chat/chat_completion_store_message.py | 25 + .../chat_completion_stream_options_param.py | 33 + .../chat_completion_system_message_param.py | 31 + .../chat/chat_completion_token_logprob.py | 57 + ...hat_completion_tool_choice_option_param.py | 19 + .../chat_completion_tool_message_param.py | 21 + .../types/chat/chat_completion_tool_param.py | 14 + .../chat/chat_completion_tool_union_param.py | 13 + .../chat_completion_user_message_param.py | 30 + .../types/chat/completion_create_params.py | 461 + .../types/chat/completion_list_params.py | 33 + .../types/chat/completion_update_params.py | 22 + .../openai/types/chat/completions/__init__.py | 5 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 306 bytes .../message_list_params.cpython-310.pyc | Bin 0 -> 631 bytes .../chat/completions/message_list_params.py | 21 + .../types/chat/parsed_chat_completion.py | 40 + .../types/chat/parsed_function_tool_call.py | 29 + .../site-packages/openai/types/chat_model.py | 7 + .../site-packages/openai/types/completion.py | 42 + .../openai/types/completion_choice.py | 35 + .../openai/types/completion_create_params.py | 189 + .../openai/types/completion_usage.py | 60 + .../openai/types/container_create_params.py | 51 + .../openai/types/container_create_response.py | 65 + .../openai/types/container_list_params.py | 33 + .../openai/types/container_list_response.py | 65 + .../types/container_retrieve_response.py | 65 + .../openai/types/containers/__init__.py | 9 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 542 bytes .../file_create_params.cpython-310.pyc | Bin 0 -> 606 bytes .../file_create_response.cpython-310.pyc | Bin 0 -> 688 bytes .../file_list_params.cpython-310.pyc | Bin 0 -> 619 bytes .../file_list_response.cpython-310.pyc | Bin 0 -> 684 bytes .../file_retrieve_response.cpython-310.pyc | Bin 0 -> 692 bytes .../types/containers/file_create_params.py | 17 + .../types/containers/file_create_response.py | 30 + .../types/containers/file_list_params.py | 30 + .../types/containers/file_list_response.py | 30 + .../containers/file_retrieve_response.py | 30 + .../openai/types/containers/files/__init__.py | 3 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 240 bytes .../openai/types/conversations/__init__.py | 27 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1694 bytes ...omputer_screenshot_content.cpython-310.pyc | Bin 0 -> 785 bytes .../__pycache__/conversation.cpython-310.pyc | Bin 0 -> 613 bytes ...conversation_create_params.cpython-310.pyc | Bin 0 -> 836 bytes ...versation_deleted_resource.cpython-310.pyc | Bin 0 -> 612 bytes .../conversation_item.cpython-310.pyc | Bin 0 -> 5808 bytes .../conversation_item_list.cpython-310.pyc | Bin 0 -> 800 bytes ...conversation_update_params.cpython-310.pyc | Bin 0 -> 699 bytes .../input_file_content.cpython-310.pyc | Bin 0 -> 318 bytes .../input_file_content_param.cpython-310.pyc | Bin 0 -> 369 bytes .../input_image_content.cpython-310.pyc | Bin 0 -> 322 bytes .../input_image_content_param.cpython-310.pyc | Bin 0 -> 373 bytes .../input_text_content.cpython-310.pyc | Bin 0 -> 318 bytes .../input_text_content_param.cpython-310.pyc | Bin 0 -> 369 bytes .../item_create_params.cpython-310.pyc | Bin 0 -> 857 bytes .../item_list_params.cpython-310.pyc | Bin 0 -> 783 bytes .../item_retrieve_params.cpython-310.pyc | Bin 0 -> 737 bytes .../__pycache__/message.cpython-310.pyc | Bin 0 -> 1881 bytes .../output_text_content.cpython-310.pyc | Bin 0 -> 322 bytes .../output_text_content_param.cpython-310.pyc | Bin 0 -> 373 bytes .../refusal_content.cpython-310.pyc | Bin 0 -> 321 bytes .../refusal_content_param.cpython-310.pyc | Bin 0 -> 372 bytes .../summary_text_content.cpython-310.pyc | Bin 0 -> 614 bytes .../__pycache__/text_content.cpython-310.pyc | Bin 0 -> 564 bytes .../computer_screenshot_content.py | 30 + .../types/conversations/conversation.py | 30 + .../conversation_create_params.py | 29 + .../conversation_deleted_resource.py | 15 + .../types/conversations/conversation_item.py | 252 + .../conversations/conversation_item_list.py | 28 + .../conversation_update_params.py | 22 + .../types/conversations/input_file_content.py | 7 + .../conversations/input_file_content_param.py | 7 + .../conversations/input_image_content.py | 7 + .../input_image_content_param.py | 7 + .../types/conversations/input_text_content.py | 7 + .../conversations/input_text_content_param.py | 7 + .../types/conversations/item_create_params.py | 24 + .../types/conversations/item_list_params.py | 50 + .../conversations/item_retrieve_params.py | 22 + .../openai/types/conversations/message.py | 70 + .../conversations/output_text_content.py | 7 + .../output_text_content_param.py | 7 + .../types/conversations/refusal_content.py | 7 + .../conversations/refusal_content_param.py | 7 + .../conversations/summary_text_content.py | 17 + .../types/conversations/text_content.py | 15 + .../openai/types/create_embedding_response.py | 33 + .../openai/types/deleted_skill.py | 15 + .../site-packages/openai/types/embedding.py | 25 + .../openai/types/embedding_create_params.py | 55 + .../openai/types/embedding_model.py | 7 + .../openai/types/eval_create_params.py | 244 + .../openai/types/eval_create_response.py | 130 + .../types/eval_custom_data_source_config.py | 28 + .../openai/types/eval_delete_response.py | 13 + .../openai/types/eval_list_params.py | 27 + .../openai/types/eval_list_response.py | 130 + .../openai/types/eval_retrieve_response.py | 130 + ...l_stored_completions_data_source_config.py | 34 + .../openai/types/eval_update_params.py | 25 + .../openai/types/eval_update_response.py | 130 + .../openai/types/evals/__init__.py | 22 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1090 bytes ...ompletions_run_data_source.cpython-310.pyc | Bin 0 -> 5530 bytes ...ions_run_data_source_param.cpython-310.pyc | Bin 0 -> 5436 bytes ...eval_jsonl_run_data_source.cpython-310.pyc | Bin 0 -> 1640 bytes ...sonl_run_data_source_param.cpython-310.pyc | Bin 0 -> 1618 bytes .../eval_api_error.cpython-310.pyc | Bin 0 -> 549 bytes .../run_cancel_response.cpython-310.pyc | Bin 0 -> 8314 bytes .../run_create_params.cpython-310.pyc | Bin 0 -> 7257 bytes .../run_create_response.cpython-310.pyc | Bin 0 -> 8314 bytes .../run_delete_response.cpython-310.pyc | Bin 0 -> 591 bytes .../run_list_params.cpython-310.pyc | Bin 0 -> 703 bytes .../run_list_response.cpython-310.pyc | Bin 0 -> 8310 bytes .../run_retrieve_response.cpython-310.pyc | Bin 0 -> 8318 bytes ...create_eval_completions_run_data_source.py | 258 + ..._eval_completions_run_data_source_param.py | 254 + .../create_eval_jsonl_run_data_source.py | 46 + ...create_eval_jsonl_run_data_source_param.py | 51 + .../openai/types/evals/eval_api_error.py | 15 + .../openai/types/evals/run_cancel_response.py | 452 + .../openai/types/evals/run_create_params.py | 371 + .../openai/types/evals/run_create_response.py | 452 + .../openai/types/evals/run_delete_response.py | 15 + .../openai/types/evals/run_list_params.py | 27 + .../openai/types/evals/run_list_response.py | 452 + .../types/evals/run_retrieve_response.py | 452 + .../openai/types/evals/runs/__init__.py | 7 + .../runs/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 459 bytes .../output_item_list_params.cpython-310.pyc | Bin 0 -> 732 bytes .../output_item_list_response.cpython-310.pyc | Bin 0 -> 3020 bytes ...put_item_retrieve_response.cpython-310.pyc | Bin 0 -> 3028 bytes .../evals/runs/output_item_list_params.py | 30 + .../evals/runs/output_item_list_response.py | 144 + .../runs/output_item_retrieve_response.py | 144 + .../openai/types/file_chunking_strategy.py | 14 + .../types/file_chunking_strategy_param.py | 13 + .../openai/types/file_content.py | 7 + .../openai/types/file_create_params.py | 52 + .../openai/types/file_deleted.py | 15 + .../openai/types/file_list_params.py | 33 + .../site-packages/openai/types/file_object.py | 60 + .../openai/types/file_purpose.py | 7 + .../openai/types/fine_tuning/__init__.py | 26 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1634 bytes .../dpo_hyperparameters.cpython-310.pyc | Bin 0 -> 832 bytes .../dpo_hyperparameters_param.cpython-310.pyc | Bin 0 -> 817 bytes .../__pycache__/dpo_method.cpython-310.pyc | Bin 0 -> 651 bytes .../dpo_method_param.cpython-310.pyc | Bin 0 -> 681 bytes .../fine_tuning_job.cpython-310.pyc | Bin 0 -> 2977 bytes .../fine_tuning_job_event.cpython-310.pyc | Bin 0 -> 882 bytes ...ine_tuning_job_integration.cpython-310.pyc | Bin 0 -> 340 bytes ...ning_job_wandb_integration.cpython-310.pyc | Bin 0 -> 994 bytes ...b_wandb_integration_object.cpython-310.pyc | Bin 0 -> 681 bytes .../job_create_params.cpython-310.pyc | Bin 0 -> 3004 bytes .../job_list_events_params.cpython-310.pyc | Bin 0 -> 568 bytes .../job_list_params.cpython-310.pyc | Bin 0 -> 659 bytes ...nforcement_hyperparameters.cpython-310.pyc | Bin 0 -> 1082 bytes ...ment_hyperparameters_param.cpython-310.pyc | Bin 0 -> 995 bytes .../reinforcement_method.cpython-310.pyc | Bin 0 -> 1175 bytes ...reinforcement_method_param.cpython-310.pyc | Bin 0 -> 1290 bytes ...supervised_hyperparameters.cpython-310.pyc | Bin 0 -> 799 bytes ...ised_hyperparameters_param.cpython-310.pyc | Bin 0 -> 807 bytes .../supervised_method.cpython-310.pyc | Bin 0 -> 686 bytes .../supervised_method_param.cpython-310.pyc | Bin 0 -> 716 bytes .../types/fine_tuning/alpha/__init__.py | 8 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 502 bytes .../grader_run_params.cpython-310.pyc | Bin 0 -> 1143 bytes .../grader_run_response.cpython-310.pyc | Bin 0 -> 2093 bytes .../grader_validate_params.cpython-310.pyc | Bin 0 -> 1082 bytes .../grader_validate_response.cpython-310.pyc | Bin 0 -> 993 bytes .../fine_tuning/alpha/grader_run_params.py | 40 + .../fine_tuning/alpha/grader_run_response.py | 67 + .../alpha/grader_validate_params.py | 24 + .../alpha/grader_validate_response.py | 20 + .../types/fine_tuning/checkpoints/__init__.py | 11 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 765 bytes .../permission_create_params.cpython-310.pyc | Bin 0 -> 660 bytes ...permission_create_response.cpython-310.pyc | Bin 0 -> 775 bytes ...permission_delete_response.cpython-310.pyc | Bin 0 -> 627 bytes .../permission_list_params.cpython-310.pyc | Bin 0 -> 682 bytes .../permission_list_response.cpython-310.pyc | Bin 0 -> 771 bytes ...permission_retrieve_params.cpython-310.pyc | Bin 0 -> 690 bytes ...rmission_retrieve_response.cpython-310.pyc | Bin 0 -> 1135 bytes .../checkpoints/permission_create_params.py | 14 + .../checkpoints/permission_create_response.py | 25 + .../checkpoints/permission_delete_response.py | 18 + .../checkpoints/permission_list_params.py | 21 + .../checkpoints/permission_list_response.py | 25 + .../checkpoints/permission_retrieve_params.py | 21 + .../permission_retrieve_response.py | 38 + .../types/fine_tuning/dpo_hyperparameters.py | 38 + .../fine_tuning/dpo_hyperparameters_param.py | 38 + .../openai/types/fine_tuning/dpo_method.py | 15 + .../types/fine_tuning/dpo_method_param.py | 16 + .../types/fine_tuning/fine_tuning_job.py | 176 + .../fine_tuning/fine_tuning_job_event.py | 34 + .../fine_tuning_job_integration.py | 5 + .../fine_tuning_job_wandb_integration.py | 40 + ...ine_tuning_job_wandb_integration_object.py | 21 + .../types/fine_tuning/job_create_params.py | 190 + .../fine_tuning/job_list_events_params.py | 15 + .../types/fine_tuning/job_list_params.py | 23 + .../openai/types/fine_tuning/jobs/__init__.py | 6 + .../jobs/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 386 bytes .../checkpoint_list_params.cpython-310.pyc | Bin 0 -> 574 bytes ...fine_tuning_job_checkpoint.cpython-310.pyc | Bin 0 -> 1454 bytes .../jobs/checkpoint_list_params.py | 15 + .../jobs/fine_tuning_job_checkpoint.py | 53 + .../reinforcement_hyperparameters.py | 45 + .../reinforcement_hyperparameters_param.py | 45 + .../types/fine_tuning/reinforcement_method.py | 26 + .../fine_tuning/reinforcement_method_param.py | 29 + .../fine_tuning/supervised_hyperparameters.py | 31 + .../supervised_hyperparameters_param.py | 31 + .../types/fine_tuning/supervised_method.py | 15 + .../fine_tuning/supervised_method_param.py | 16 + .../openai/types/graders/__init__.py | 18 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1101 bytes .../__pycache__/grader_inputs.cpython-310.pyc | Bin 0 -> 1311 bytes .../grader_inputs_param.cpython-310.pyc | Bin 0 -> 1414 bytes .../label_model_grader.cpython-310.pyc | Bin 0 -> 2417 bytes .../label_model_grader_param.cpython-310.pyc | Bin 0 -> 2559 bytes .../__pycache__/multi_grader.cpython-310.pyc | Bin 0 -> 1121 bytes .../multi_grader_param.cpython-310.pyc | Bin 0 -> 1285 bytes .../__pycache__/python_grader.cpython-310.pyc | Bin 0 -> 724 bytes .../python_grader_param.cpython-310.pyc | Bin 0 -> 758 bytes .../score_model_grader.cpython-310.pyc | Bin 0 -> 2917 bytes .../score_model_grader_param.cpython-310.pyc | Bin 0 -> 2936 bytes .../string_check_grader.cpython-310.pyc | Bin 0 -> 801 bytes .../string_check_grader_param.cpython-310.pyc | Bin 0 -> 908 bytes .../text_similarity_grader.cpython-310.pyc | Bin 0 -> 845 bytes ...xt_similarity_grader_param.cpython-310.pyc | Bin 0 -> 962 bytes .../openai/types/graders/grader_inputs.py | 43 + .../types/graders/grader_inputs_param.py | 53 + .../types/graders/label_model_grader.py | 92 + .../types/graders/label_model_grader_param.py | 99 + .../openai/types/graders/multi_grader.py | 36 + .../types/graders/multi_grader_param.py | 39 + .../openai/types/graders/python_grader.py | 24 + .../types/graders/python_grader_param.py | 23 + .../types/graders/score_model_grader.py | 135 + .../types/graders/score_model_grader_param.py | 141 + .../types/graders/string_check_grader.py | 28 + .../graders/string_check_grader_param.py | 28 + .../types/graders/text_similarity_grader.py | 42 + .../graders/text_similarity_grader_param.py | 44 + .../site-packages/openai/types/image.py | 28 + .../types/image_create_variation_params.py | 48 + .../types/image_edit_completed_event.py | 66 + .../openai/types/image_edit_params.py | 143 + .../types/image_edit_partial_image_event.py | 35 + .../openai/types/image_edit_stream_event.py | 14 + .../openai/types/image_gen_completed_event.py | 66 + .../types/image_gen_partial_image_event.py | 35 + .../openai/types/image_gen_stream_event.py | 14 + .../openai/types/image_generate_params.py | 145 + .../types/image_input_reference_param.py | 14 + .../site-packages/openai/types/image_model.py | 7 + .../openai/types/images_response.py | 79 + .../site-packages/openai/types/model.py | 23 + .../openai/types/model_deleted.py | 13 + .../site-packages/openai/types/moderation.py | 194 + .../openai/types/moderation_create_params.py | 30 + .../types/moderation_create_response.py | 21 + .../types/moderation_image_url_input_param.py | 24 + .../openai/types/moderation_model.py | 9 + .../moderation_multi_modal_input_param.py | 13 + .../types/moderation_text_input_param.py | 17 + .../other_file_chunking_strategy_object.py | 17 + .../openai/types/realtime/__init__.py | 240 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 13541 bytes .../audio_transcription.cpython-310.pyc | Bin 0 -> 818 bytes .../audio_transcription_param.cpython-310.pyc | Bin 0 -> 793 bytes .../call_accept_params.cpython-310.pyc | Bin 0 -> 2112 bytes .../call_create_params.cpython-310.pyc | Bin 0 -> 687 bytes .../call_refer_params.cpython-310.pyc | Bin 0 -> 564 bytes .../call_reject_params.cpython-310.pyc | Bin 0 -> 538 bytes ...lient_secret_create_params.cpython-310.pyc | Bin 0 -> 1493 bytes ...ent_secret_create_response.cpython-310.pyc | Bin 0 -> 1076 bytes ...conversation_created_event.cpython-310.pyc | Bin 0 -> 1047 bytes .../conversation_item.cpython-310.pyc | Bin 0 -> 1339 bytes .../conversation_item_added.cpython-310.pyc | Bin 0 -> 1542 bytes ...ersation_item_create_event.cpython-310.pyc | Bin 0 -> 1256 bytes ...on_item_create_event_param.cpython-310.pyc | Bin 0 -> 1301 bytes ...rsation_item_created_event.cpython-310.pyc | Bin 0 -> 1434 bytes ...ersation_item_delete_event.cpython-310.pyc | Bin 0 -> 977 bytes ...on_item_delete_event_param.cpython-310.pyc | Bin 0 -> 1011 bytes ...rsation_item_deleted_event.cpython-310.pyc | Bin 0 -> 878 bytes .../conversation_item_done.cpython-310.pyc | Bin 0 -> 993 bytes ...nscription_completed_event.cpython-310.pyc | Bin 0 -> 2775 bytes ..._transcription_delta_event.cpython-310.pyc | Bin 0 -> 1100 bytes ...transcription_failed_event.cpython-310.pyc | Bin 0 -> 1373 bytes ...udio_transcription_segment.cpython-310.pyc | Bin 0 -> 923 bytes .../conversation_item_param.cpython-310.pyc | Bin 0 -> 1387 bytes ...sation_item_retrieve_event.cpython-310.pyc | Bin 0 -> 1108 bytes ..._item_retrieve_event_param.cpython-310.pyc | Bin 0 -> 1142 bytes ...sation_item_truncate_event.cpython-310.pyc | Bin 0 -> 1369 bytes ..._item_truncate_event_param.cpython-310.pyc | Bin 0 -> 1413 bytes ...ation_item_truncated_event.cpython-310.pyc | Bin 0 -> 1120 bytes ..._audio_buffer_append_event.cpython-310.pyc | Bin 0 -> 1615 bytes ..._buffer_append_event_param.cpython-310.pyc | Bin 0 -> 1649 bytes ...t_audio_buffer_clear_event.cpython-310.pyc | Bin 0 -> 807 bytes ...o_buffer_clear_event_param.cpython-310.pyc | Bin 0 -> 826 bytes ...audio_buffer_cleared_event.cpython-310.pyc | Bin 0 -> 735 bytes ..._audio_buffer_commit_event.cpython-310.pyc | Bin 0 -> 1240 bytes ..._buffer_commit_event_param.cpython-310.pyc | Bin 0 -> 1259 bytes ...dio_buffer_committed_event.cpython-310.pyc | Bin 0 -> 1023 bytes ..._dtmf_event_received_event.cpython-310.pyc | Bin 0 -> 986 bytes ...uffer_speech_started_event.cpython-310.pyc | Bin 0 -> 1395 bytes ...uffer_speech_stopped_event.cpython-310.pyc | Bin 0 -> 934 bytes ...o_buffer_timeout_triggered.cpython-310.pyc | Bin 0 -> 1759 bytes .../log_prob_properties.cpython-310.pyc | Bin 0 -> 611 bytes .../mcp_list_tools_completed.cpython-310.pyc | Bin 0 -> 683 bytes .../mcp_list_tools_failed.cpython-310.pyc | Bin 0 -> 671 bytes ...mcp_list_tools_in_progress.cpython-310.pyc | Bin 0 -> 689 bytes .../noise_reduction_type.cpython-310.pyc | Bin 0 -> 371 bytes ...t_audio_buffer_clear_event.cpython-310.pyc | Bin 0 -> 1105 bytes ...o_buffer_clear_event_param.cpython-310.pyc | Bin 0 -> 1124 bytes .../rate_limits_updated_event.cpython-310.pyc | Bin 0 -> 1329 bytes .../realtime_audio_config.cpython-310.pyc | Bin 0 -> 781 bytes ...ealtime_audio_config_input.cpython-310.pyc | Bin 0 -> 1548 bytes ...e_audio_config_input_param.cpython-310.pyc | Bin 0 -> 1629 bytes ...altime_audio_config_output.cpython-310.pyc | Bin 0 -> 1130 bytes ..._audio_config_output_param.cpython-310.pyc | Bin 0 -> 1161 bytes ...ealtime_audio_config_param.cpython-310.pyc | Bin 0 -> 809 bytes .../realtime_audio_formats.cpython-310.pyc | Bin 0 -> 1312 bytes ...altime_audio_formats_param.cpython-310.pyc | Bin 0 -> 1203 bytes ...audio_input_turn_detection.cpython-310.pyc | Bin 0 -> 1701 bytes ...input_turn_detection_param.cpython-310.pyc | Bin 0 -> 1570 bytes .../realtime_client_event.cpython-310.pyc | Bin 0 -> 1391 bytes ...ealtime_client_event_param.cpython-310.pyc | Bin 0 -> 1461 bytes .../realtime_connect_params.cpython-310.pyc | Bin 0 -> 559 bytes ...ion_item_assistant_message.cpython-310.pyc | Bin 0 -> 1274 bytes ...em_assistant_message_param.cpython-310.pyc | Bin 0 -> 1288 bytes ...rsation_item_function_call.cpython-310.pyc | Bin 0 -> 933 bytes ..._item_function_call_output.cpython-310.pyc | Bin 0 -> 924 bytes ...function_call_output_param.cpython-310.pyc | Bin 0 -> 948 bytes ...n_item_function_call_param.cpython-310.pyc | Bin 0 -> 944 bytes ...sation_item_system_message.cpython-310.pyc | Bin 0 -> 1584 bytes ..._item_system_message_param.cpython-310.pyc | Bin 0 -> 1624 bytes ...ersation_item_user_message.cpython-310.pyc | Bin 0 -> 1360 bytes ...on_item_user_message_param.cpython-310.pyc | Bin 0 -> 1359 bytes .../realtime_error.cpython-310.pyc | Bin 0 -> 668 bytes .../realtime_error_event.cpython-310.pyc | Bin 0 -> 888 bytes .../realtime_function_tool.cpython-310.pyc | Bin 0 -> 719 bytes ...altime_function_tool_param.cpython-310.pyc | Bin 0 -> 670 bytes ...ltime_mcp_approval_request.cpython-310.pyc | Bin 0 -> 738 bytes ...mcp_approval_request_param.cpython-310.pyc | Bin 0 -> 824 bytes ...time_mcp_approval_response.cpython-310.pyc | Bin 0 -> 802 bytes ...cp_approval_response_param.cpython-310.pyc | Bin 0 -> 895 bytes .../realtime_mcp_list_tools.cpython-310.pyc | Bin 0 -> 1108 bytes ...ltime_mcp_list_tools_param.cpython-310.pyc | Bin 0 -> 1107 bytes ...ealtime_mcp_protocol_error.cpython-310.pyc | Bin 0 -> 595 bytes ...e_mcp_protocol_error_param.cpython-310.pyc | Bin 0 -> 691 bytes .../realtime_mcp_tool_call.cpython-310.pyc | Bin 0 -> 1310 bytes ...altime_mcp_tool_call_param.cpython-310.pyc | Bin 0 -> 1308 bytes ...e_mcp_tool_execution_error.cpython-310.pyc | Bin 0 -> 591 bytes ...tool_execution_error_param.cpython-310.pyc | Bin 0 -> 677 bytes .../realtime_mcphttp_error.cpython-310.pyc | Bin 0 -> 582 bytes ...altime_mcphttp_error_param.cpython-310.pyc | Bin 0 -> 678 bytes .../realtime_response.cpython-310.pyc | Bin 0 -> 2086 bytes ...sponse_create_audio_output.cpython-310.pyc | Bin 0 -> 1359 bytes ..._create_audio_output_param.cpython-310.pyc | Bin 0 -> 1341 bytes ...e_response_create_mcp_tool.cpython-310.pyc | Bin 0 -> 2692 bytes ...onse_create_mcp_tool_param.cpython-310.pyc | Bin 0 -> 2674 bytes ...ime_response_create_params.cpython-310.pyc | Bin 0 -> 1926 bytes ...sponse_create_params_param.cpython-310.pyc | Bin 0 -> 2033 bytes .../realtime_response_status.cpython-310.pyc | Bin 0 -> 1176 bytes .../realtime_response_usage.cpython-310.pyc | Bin 0 -> 1256 bytes ..._usage_input_token_details.cpython-310.pyc | Bin 0 -> 1416 bytes ...usage_output_token_details.cpython-310.pyc | Bin 0 -> 690 bytes .../realtime_server_event.cpython-310.pyc | Bin 0 -> 7017 bytes ...time_session_client_secret.cpython-310.pyc | Bin 0 -> 567 bytes ...ime_session_create_request.cpython-310.pyc | Bin 0 -> 2104 bytes ...ssion_create_request_param.cpython-310.pyc | Bin 0 -> 2203 bytes ...me_session_create_response.cpython-310.pyc | Bin 0 -> 8143 bytes ...ealtime_tool_choice_config.cpython-310.pyc | Bin 0 -> 595 bytes ...e_tool_choice_config_param.cpython-310.pyc | Bin 0 -> 679 bytes .../realtime_tools_config.cpython-310.pyc | Bin 0 -> 446 bytes ...ealtime_tools_config_param.cpython-310.pyc | Bin 0 -> 2870 bytes ...ealtime_tools_config_union.cpython-310.pyc | Bin 0 -> 2907 bytes ...e_tools_config_union_param.cpython-310.pyc | Bin 0 -> 2807 bytes .../realtime_tracing_config.cpython-310.pyc | Bin 0 -> 831 bytes ...ltime_tracing_config_param.cpython-310.pyc | Bin 0 -> 816 bytes ...ranscription_session_audio.cpython-310.pyc | Bin 0 -> 725 bytes ...iption_session_audio_input.cpython-310.pyc | Bin 0 -> 1619 bytes ..._session_audio_input_param.cpython-310.pyc | Bin 0 -> 1720 bytes ...audio_input_turn_detection.cpython-310.pyc | Bin 0 -> 1743 bytes ...input_turn_detection_param.cpython-310.pyc | Bin 0 -> 1612 bytes ...iption_session_audio_param.cpython-310.pyc | Bin 0 -> 755 bytes ...ion_session_create_request.cpython-310.pyc | Bin 0 -> 942 bytes ...ssion_create_request_param.cpython-310.pyc | Bin 0 -> 983 bytes ...on_session_create_response.cpython-310.pyc | Bin 0 -> 2053 bytes ...ion_session_turn_detection.cpython-310.pyc | Bin 0 -> 954 bytes .../realtime_truncation.cpython-310.pyc | Bin 0 -> 504 bytes .../realtime_truncation_param.cpython-310.pyc | Bin 0 -> 577 bytes ...truncation_retention_ratio.cpython-310.pyc | Bin 0 -> 1257 bytes ...tion_retention_ratio_param.cpython-310.pyc | Bin 0 -> 1267 bytes ...response_audio_delta_event.cpython-310.pyc | Bin 0 -> 793 bytes .../response_audio_done_event.cpython-310.pyc | Bin 0 -> 851 bytes ...dio_transcript_delta_event.cpython-310.pyc | Bin 0 -> 849 bytes ...udio_transcript_done_event.cpython-310.pyc | Bin 0 -> 947 bytes .../response_cancel_event.cpython-310.pyc | Bin 0 -> 1071 bytes ...esponse_cancel_event_param.cpython-310.pyc | Bin 0 -> 1077 bytes ...e_content_part_added_event.cpython-310.pyc | Bin 0 -> 1263 bytes ...se_content_part_done_event.cpython-310.pyc | Bin 0 -> 1307 bytes .../response_create_event.cpython-310.pyc | Bin 0 -> 2198 bytes ...esponse_create_event_param.cpython-310.pyc | Bin 0 -> 2215 bytes .../response_created_event.cpython-310.pyc | Bin 0 -> 835 bytes .../response_done_event.cpython-310.pyc | Bin 0 -> 1225 bytes ...call_arguments_delta_event.cpython-310.pyc | Bin 0 -> 851 bytes ..._call_arguments_done_event.cpython-310.pyc | Bin 0 -> 964 bytes ...e_mcp_call_arguments_delta.cpython-310.pyc | Bin 0 -> 893 bytes ...se_mcp_call_arguments_done.cpython-310.pyc | Bin 0 -> 812 bytes ...esponse_mcp_call_completed.cpython-310.pyc | Bin 0 -> 725 bytes .../response_mcp_call_failed.cpython-310.pyc | Bin 0 -> 700 bytes ...ponse_mcp_call_in_progress.cpython-310.pyc | Bin 0 -> 734 bytes ...se_output_item_added_event.cpython-310.pyc | Bin 0 -> 830 bytes ...nse_output_item_done_event.cpython-310.pyc | Bin 0 -> 889 bytes .../response_text_delta_event.cpython-310.pyc | Bin 0 -> 812 bytes .../response_text_done_event.cpython-310.pyc | Bin 0 -> 900 bytes .../session_created_event.cpython-310.pyc | Bin 0 -> 1115 bytes .../session_update_event.cpython-310.pyc | Bin 0 -> 1589 bytes ...session_update_event_param.cpython-310.pyc | Bin 0 -> 1669 bytes .../session_updated_event.cpython-310.pyc | Bin 0 -> 1022 bytes .../types/realtime/audio_transcription.py | 46 + .../realtime/audio_transcription_param.py | 45 + .../types/realtime/call_accept_params.py | 131 + .../types/realtime/call_create_params.py | 17 + .../types/realtime/call_refer_params.py | 15 + .../types/realtime/call_reject_params.py | 15 + .../realtime/client_secret_create_params.py | 54 + .../realtime/client_secret_create_response.py | 28 + .../realtime/conversation_created_event.py | 31 + .../types/realtime/conversation_item.py | 32 + .../types/realtime/conversation_item_added.py | 36 + .../conversation_item_create_event.py | 43 + .../conversation_item_create_event_param.py | 43 + .../conversation_item_created_event.py | 40 + .../conversation_item_delete_event.py | 27 + .../conversation_item_delete_event_param.py | 26 + .../conversation_item_deleted_event.py | 24 + .../types/realtime/conversation_item_done.py | 31 + ...put_audio_transcription_completed_event.py | 98 + ...m_input_audio_transcription_delta_event.py | 40 + ..._input_audio_transcription_failed_event.py | 47 + ..._item_input_audio_transcription_segment.py | 38 + .../types/realtime/conversation_item_param.py | 30 + .../conversation_item_retrieve_event.py | 26 + .../conversation_item_retrieve_event_param.py | 25 + .../conversation_item_truncate_event.py | 47 + .../conversation_item_truncate_event_param.py | 46 + .../conversation_item_truncated_event.py | 33 + .../input_audio_buffer_append_event.py | 40 + .../input_audio_buffer_append_event_param.py | 39 + .../input_audio_buffer_clear_event.py | 22 + .../input_audio_buffer_clear_event_param.py | 21 + .../input_audio_buffer_cleared_event.py | 20 + .../input_audio_buffer_commit_event.py | 22 + .../input_audio_buffer_commit_event_param.py | 21 + .../input_audio_buffer_committed_event.py | 32 + ..._audio_buffer_dtmf_event_received_event.py | 26 + ...input_audio_buffer_speech_started_event.py | 39 + ...input_audio_buffer_speech_stopped_event.py | 31 + .../input_audio_buffer_timeout_triggered.py | 47 + .../types/realtime/log_prob_properties.py | 20 + .../realtime/mcp_list_tools_completed.py | 20 + .../types/realtime/mcp_list_tools_failed.py | 20 + .../realtime/mcp_list_tools_in_progress.py | 20 + .../types/realtime/noise_reduction_type.py | 7 + .../output_audio_buffer_clear_event.py | 25 + .../output_audio_buffer_clear_event_param.py | 24 + .../realtime/rate_limits_updated_event.py | 41 + .../types/realtime/realtime_audio_config.py | 17 + .../realtime/realtime_audio_config_input.py | 70 + .../realtime_audio_config_input_param.py | 72 + .../realtime/realtime_audio_config_output.py | 47 + .../realtime_audio_config_output_param.py | 48 + .../realtime/realtime_audio_config_param.py | 18 + .../types/realtime/realtime_audio_formats.py | 36 + .../realtime/realtime_audio_formats_param.py | 35 + .../realtime_audio_input_turn_detection.py | 115 + ...altime_audio_input_turn_detection_param.py | 112 + .../types/realtime/realtime_client_event.py | 36 + .../realtime/realtime_client_event_param.py | 34 + .../types/realtime/realtime_connect_params.py | 13 + ...ime_conversation_item_assistant_message.py | 60 + ...nversation_item_assistant_message_param.py | 60 + ...ealtime_conversation_item_function_call.py | 43 + ..._conversation_item_function_call_output.py | 39 + ...rsation_item_function_call_output_param.py | 38 + ...e_conversation_item_function_call_param.py | 42 + ...altime_conversation_item_system_message.py | 46 + ..._conversation_item_system_message_param.py | 46 + ...realtime_conversation_item_user_message.py | 71 + ...me_conversation_item_user_message_param.py | 71 + .../openai/types/realtime/realtime_error.py | 26 + .../types/realtime/realtime_error_event.py | 25 + .../types/realtime/realtime_function_tool.py | 25 + .../realtime/realtime_function_tool_param.py | 24 + .../realtime/realtime_mcp_approval_request.py | 26 + .../realtime_mcp_approval_request_param.py | 26 + .../realtime_mcp_approval_response.py | 27 + .../realtime_mcp_approval_response_param.py | 27 + .../types/realtime/realtime_mcp_list_tools.py | 40 + .../realtime/realtime_mcp_list_tools_param.py | 40 + .../realtime/realtime_mcp_protocol_error.py | 15 + .../realtime_mcp_protocol_error_param.py | 15 + .../types/realtime/realtime_mcp_tool_call.py | 45 + .../realtime/realtime_mcp_tool_call_param.py | 42 + .../realtime_mcp_tool_execution_error.py | 13 + ...realtime_mcp_tool_execution_error_param.py | 13 + .../types/realtime/realtime_mcphttp_error.py | 15 + .../realtime/realtime_mcphttp_error_param.py | 15 + .../types/realtime/realtime_response.py | 102 + .../realtime_response_create_audio_output.py | 42 + ...time_response_create_audio_output_param.py | 43 + .../realtime_response_create_mcp_tool.py | 156 + ...realtime_response_create_mcp_tool_param.py | 156 + .../realtime_response_create_params.py | 100 + .../realtime_response_create_params_param.py | 101 + .../realtime/realtime_response_status.py | 46 + .../types/realtime/realtime_response_usage.py | 49 + ...time_response_usage_input_token_details.py | 42 + ...ime_response_usage_output_token_details.py | 17 + .../types/realtime/realtime_server_event.py | 185 + .../realtime_session_client_secret.py | 22 + .../realtime_session_create_request.py | 133 + .../realtime_session_create_request_param.py | 133 + .../realtime_session_create_response.py | 539 + .../realtime/realtime_tool_choice_config.py | 12 + .../realtime_tool_choice_config_param.py | 14 + .../types/realtime/realtime_tools_config.py | 10 + .../realtime/realtime_tools_config_param.py | 164 + .../realtime/realtime_tools_config_union.py | 162 + .../realtime_tools_config_union_param.py | 161 + .../types/realtime/realtime_tracing_config.py | 33 + .../realtime/realtime_tracing_config_param.py | 33 + .../realtime_transcription_session_audio.py | 14 + ...ltime_transcription_session_audio_input.py | 72 + ...transcription_session_audio_input_param.py | 74 + ...tion_session_audio_input_turn_detection.py | 115 + ...ession_audio_input_turn_detection_param.py | 112 + ...ltime_transcription_session_audio_param.py | 15 + ...me_transcription_session_create_request.py | 29 + ...nscription_session_create_request_param.py | 30 + ...e_transcription_session_create_response.py | 74 + ...me_transcription_session_turn_detection.py | 39 + .../types/realtime/realtime_truncation.py | 10 + .../realtime/realtime_truncation_param.py | 12 + .../realtime_truncation_retention_ratio.py | 47 + ...altime_truncation_retention_ratio_param.py | 46 + .../realtime/response_audio_delta_event.py | 32 + .../realtime/response_audio_done_event.py | 33 + .../response_audio_transcript_delta_event.py | 32 + .../response_audio_transcript_done_event.py | 36 + .../types/realtime/response_cancel_event.py | 31 + .../realtime/response_cancel_event_param.py | 30 + .../response_content_part_added_event.py | 52 + .../response_content_part_done_event.py | 52 + .../types/realtime/response_create_event.py | 48 + .../realtime/response_create_event_param.py | 48 + .../types/realtime/response_created_event.py | 25 + .../types/realtime/response_done_event.py | 32 + ...nse_function_call_arguments_delta_event.py | 32 + ...onse_function_call_arguments_done_event.py | 38 + .../response_mcp_call_arguments_delta.py | 33 + .../response_mcp_call_arguments_done.py | 29 + .../realtime/response_mcp_call_completed.py | 23 + .../realtime/response_mcp_call_failed.py | 23 + .../realtime/response_mcp_call_in_progress.py | 23 + .../response_output_item_added_event.py | 27 + .../response_output_item_done_event.py | 31 + .../realtime/response_text_delta_event.py | 32 + .../realtime/response_text_done_event.py | 36 + .../types/realtime/session_created_event.py | 30 + .../types/realtime/session_update_event.py | 43 + .../realtime/session_update_event_param.py | 44 + .../types/realtime/session_updated_event.py | 28 + .../openai/types/responses/__init__.py | 328 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 17846 bytes .../apply_patch_tool.cpython-310.pyc | Bin 0 -> 622 bytes .../apply_patch_tool_param.cpython-310.pyc | Bin 0 -> 698 bytes .../compacted_response.cpython-310.pyc | Bin 0 -> 815 bytes .../computer_action.cpython-310.pyc | Bin 0 -> 2918 bytes .../computer_action_list.cpython-310.pyc | Bin 0 -> 423 bytes ...computer_action_list_param.cpython-310.pyc | Bin 0 -> 3098 bytes .../computer_action_param.cpython-310.pyc | Bin 0 -> 3025 bytes .../__pycache__/computer_tool.cpython-310.pyc | Bin 0 -> 686 bytes .../computer_tool_param.cpython-310.pyc | Bin 0 -> 762 bytes .../computer_use_preview_tool.cpython-310.pyc | Bin 0 -> 855 bytes ...ter_use_preview_tool_param.cpython-310.pyc | Bin 0 -> 964 bytes .../container_auto.cpython-310.pyc | Bin 0 -> 1336 bytes .../container_auto_param.cpython-310.pyc | Bin 0 -> 1377 bytes ...r_network_policy_allowlist.cpython-310.pyc | Bin 0 -> 820 bytes ...ork_policy_allowlist_param.cpython-310.pyc | Bin 0 -> 983 bytes ...er_network_policy_disabled.cpython-310.pyc | Bin 0 -> 559 bytes ...work_policy_disabled_param.cpython-310.pyc | Bin 0 -> 635 bytes ...twork_policy_domain_secret.cpython-310.pyc | Bin 0 -> 543 bytes ...policy_domain_secret_param.cpython-310.pyc | Bin 0 -> 653 bytes .../container_reference.cpython-310.pyc | Bin 0 -> 577 bytes .../container_reference_param.cpython-310.pyc | Bin 0 -> 663 bytes .../__pycache__/custom_tool.cpython-310.pyc | Bin 0 -> 986 bytes .../custom_tool_param.cpython-310.pyc | Bin 0 -> 1001 bytes .../easy_input_message.cpython-310.pyc | Bin 0 -> 1231 bytes .../easy_input_message_param.cpython-310.pyc | Bin 0 -> 1352 bytes .../file_search_tool.cpython-310.pyc | Bin 0 -> 1950 bytes .../file_search_tool_param.cpython-310.pyc | Bin 0 -> 1999 bytes .../function_shell_tool.cpython-310.pyc | Bin 0 -> 1057 bytes .../function_shell_tool_param.cpython-310.pyc | Bin 0 -> 1066 bytes .../__pycache__/function_tool.cpython-310.pyc | Bin 0 -> 975 bytes .../function_tool_param.cpython-310.pyc | Bin 0 -> 1063 bytes .../__pycache__/inline_skill.cpython-310.pyc | Bin 0 -> 662 bytes .../inline_skill_param.cpython-310.pyc | Bin 0 -> 788 bytes .../inline_skill_source.cpython-310.pyc | Bin 0 -> 639 bytes .../inline_skill_source_param.cpython-310.pyc | Bin 0 -> 742 bytes .../input_item_list_params.cpython-310.pyc | Bin 0 -> 780 bytes .../input_token_count_params.cpython-310.pyc | Bin 0 -> 2759 bytes ...input_token_count_response.cpython-310.pyc | Bin 0 -> 587 bytes .../local_environment.cpython-310.pyc | Bin 0 -> 685 bytes .../local_environment_param.cpython-310.pyc | Bin 0 -> 752 bytes .../__pycache__/local_skill.cpython-310.pyc | Bin 0 -> 496 bytes .../local_skill_param.cpython-310.pyc | Bin 0 -> 606 bytes .../namespace_tool.cpython-310.pyc | Bin 0 -> 1337 bytes .../namespace_tool_param.cpython-310.pyc | Bin 0 -> 1356 bytes .../parsed_response.cpython-310.pyc | Bin 0 -> 3624 bytes .../__pycache__/response.cpython-310.pyc | Bin 0 -> 4237 bytes ...onse_apply_patch_tool_call.cpython-310.pyc | Bin 0 -> 1887 bytes ...ply_patch_tool_call_output.cpython-310.pyc | Bin 0 -> 855 bytes ...response_audio_delta_event.cpython-310.pyc | Bin 0 -> 683 bytes .../response_audio_done_event.cpython-310.pyc | Bin 0 -> 651 bytes ...dio_transcript_delta_event.cpython-310.pyc | Bin 0 -> 720 bytes ...udio_transcript_done_event.cpython-310.pyc | Bin 0 -> 691 bytes ...eter_call_code_delta_event.cpython-310.pyc | Bin 0 -> 819 bytes ...reter_call_code_done_event.cpython-310.pyc | Bin 0 -> 810 bytes ...reter_call_completed_event.cpython-310.pyc | Bin 0 -> 776 bytes ...ter_call_in_progress_event.cpython-310.pyc | Bin 0 -> 781 bytes ...er_call_interpreting_event.cpython-310.pyc | Bin 0 -> 809 bytes ...code_interpreter_tool_call.cpython-310.pyc | Bin 0 -> 1606 bytes ...nterpreter_tool_call_param.cpython-310.pyc | Bin 0 -> 1589 bytes .../response_compact_params.cpython-310.pyc | Bin 0 -> 2849 bytes .../response_compaction_item.cpython-310.pyc | Bin 0 -> 840 bytes ...onse_compaction_item_param.cpython-310.pyc | Bin 0 -> 825 bytes ...ompaction_item_param_param.cpython-310.pyc | Bin 0 -> 908 bytes .../response_completed_event.cpython-310.pyc | Bin 0 -> 719 bytes ...esponse_computer_tool_call.cpython-310.pyc | Bin 0 -> 4032 bytes ...uter_tool_call_output_item.cpython-310.pyc | Bin 0 -> 1292 bytes ...ool_call_output_screenshot.cpython-310.pyc | Bin 0 -> 792 bytes ...ll_output_screenshot_param.cpython-310.pyc | Bin 0 -> 798 bytes ...e_computer_tool_call_param.cpython-310.pyc | Bin 0 -> 4080 bytes ...sponse_container_reference.cpython-310.pyc | Bin 0 -> 658 bytes ...e_content_part_added_event.cpython-310.pyc | Bin 0 -> 1400 bytes ...se_content_part_done_event.cpython-310.pyc | Bin 0 -> 1392 bytes ...esponse_conversation_param.cpython-310.pyc | Bin 0 -> 542 bytes ...e_conversation_param_param.cpython-310.pyc | Bin 0 -> 652 bytes .../response_create_params.cpython-310.pyc | Bin 0 -> 4102 bytes .../response_created_event.cpython-310.pyc | Bin 0 -> 721 bytes .../response_custom_tool_call.cpython-310.pyc | Bin 0 -> 795 bytes ...ool_call_input_delta_event.cpython-310.pyc | Bin 0 -> 814 bytes ...tool_call_input_done_event.cpython-310.pyc | Bin 0 -> 795 bytes ...se_custom_tool_call_output.cpython-310.pyc | Bin 0 -> 1225 bytes ...tom_tool_call_output_param.cpython-310.pyc | Bin 0 -> 1248 bytes ...nse_custom_tool_call_param.cpython-310.pyc | Bin 0 -> 816 bytes .../response_error.cpython-310.pyc | Bin 0 -> 1007 bytes .../response_error_event.cpython-310.pyc | Bin 0 -> 752 bytes .../response_failed_event.cpython-310.pyc | Bin 0 -> 713 bytes ...earch_call_completed_event.cpython-310.pyc | Bin 0 -> 770 bytes ...rch_call_in_progress_event.cpython-310.pyc | Bin 0 -> 759 bytes ...earch_call_searching_event.cpython-310.pyc | Bin 0 -> 759 bytes ...onse_file_search_tool_call.cpython-310.pyc | Bin 0 -> 1383 bytes ...ile_search_tool_call_param.cpython-310.pyc | Bin 0 -> 1515 bytes ...esponse_format_text_config.cpython-310.pyc | Bin 0 -> 758 bytes ...e_format_text_config_param.cpython-310.pyc | Bin 0 -> 736 bytes ...at_text_json_schema_config.cpython-310.pyc | Bin 0 -> 1069 bytes ...t_json_schema_config_param.cpython-310.pyc | Bin 0 -> 1060 bytes ...call_arguments_delta_event.cpython-310.pyc | Bin 0 -> 801 bytes ..._call_arguments_done_event.cpython-310.pyc | Bin 0 -> 809 bytes ..._function_call_output_item.cpython-310.pyc | Bin 0 -> 745 bytes ...tion_call_output_item_list.cpython-310.pyc | Bin 0 -> 493 bytes ...all_output_item_list_param.cpython-310.pyc | Bin 0 -> 817 bytes ...ion_call_output_item_param.cpython-310.pyc | Bin 0 -> 731 bytes ..._shell_call_output_content.cpython-310.pyc | Bin 0 -> 1476 bytes ..._call_output_content_param.cpython-310.pyc | Bin 0 -> 1468 bytes ...e_function_shell_tool_call.cpython-310.pyc | Bin 0 -> 1651 bytes ...ion_shell_tool_call_output.cpython-310.pyc | Bin 0 -> 2041 bytes ...esponse_function_tool_call.cpython-310.pyc | Bin 0 -> 989 bytes ...se_function_tool_call_item.cpython-310.pyc | Bin 0 -> 695 bytes ...tion_tool_call_output_item.cpython-310.pyc | Bin 0 -> 1204 bytes ...e_function_tool_call_param.cpython-310.pyc | Bin 0 -> 1006 bytes ...sponse_function_web_search.cpython-310.pyc | Bin 0 -> 2355 bytes ..._function_web_search_param.cpython-310.pyc | Bin 0 -> 2306 bytes ...e_gen_call_completed_event.cpython-310.pyc | Bin 0 -> 810 bytes ..._gen_call_generating_event.cpython-310.pyc | Bin 0 -> 819 bytes ...gen_call_in_progress_event.cpython-310.pyc | Bin 0 -> 773 bytes ...n_call_partial_image_event.cpython-310.pyc | Bin 0 -> 865 bytes ...response_in_progress_event.cpython-310.pyc | Bin 0 -> 721 bytes .../response_includable.cpython-310.pyc | Bin 0 -> 595 bytes .../response_incomplete_event.cpython-310.pyc | Bin 0 -> 742 bytes .../response_input.cpython-310.pyc | Bin 0 -> 419 bytes .../response_input_audio.cpython-310.pyc | Bin 0 -> 810 bytes ...response_input_audio_param.cpython-310.pyc | Bin 0 -> 942 bytes .../response_input_content.cpython-310.pyc | Bin 0 -> 674 bytes ...sponse_input_content_param.cpython-310.pyc | Bin 0 -> 660 bytes .../response_input_file.cpython-310.pyc | Bin 0 -> 774 bytes ...esponse_input_file_content.cpython-310.pyc | Bin 0 -> 789 bytes ...e_input_file_content_param.cpython-310.pyc | Bin 0 -> 818 bytes .../response_input_file_param.cpython-310.pyc | Bin 0 -> 808 bytes .../response_input_image.cpython-310.pyc | Bin 0 -> 846 bytes ...sponse_input_image_content.cpython-310.pyc | Bin 0 -> 873 bytes ..._input_image_content_param.cpython-310.pyc | Bin 0 -> 936 bytes ...response_input_image_param.cpython-310.pyc | Bin 0 -> 922 bytes .../response_input_item.cpython-310.pyc | Bin 0 -> 11219 bytes .../response_input_item_param.cpython-310.pyc | Bin 0 -> 10901 bytes ...input_message_content_list.cpython-310.pyc | Bin 0 -> 464 bytes ...message_content_list_param.cpython-310.pyc | Bin 0 -> 751 bytes ...esponse_input_message_item.cpython-310.pyc | Bin 0 -> 878 bytes .../response_input_param.cpython-310.pyc | Bin 0 -> 10959 bytes .../response_input_text.cpython-310.pyc | Bin 0 -> 602 bytes ...esponse_input_text_content.cpython-310.pyc | Bin 0 -> 617 bytes ...e_input_text_content_param.cpython-310.pyc | Bin 0 -> 703 bytes .../response_input_text_param.cpython-310.pyc | Bin 0 -> 688 bytes .../__pycache__/response_item.cpython-310.pyc | Bin 0 -> 5503 bytes .../response_item_list.cpython-310.pyc | Bin 0 -> 776 bytes ...response_local_environment.cpython-310.pyc | Bin 0 -> 627 bytes ...call_arguments_delta_event.cpython-310.pyc | Bin 0 -> 818 bytes ..._call_arguments_done_event.cpython-310.pyc | Bin 0 -> 787 bytes ...e_mcp_call_completed_event.cpython-310.pyc | Bin 0 -> 744 bytes ...onse_mcp_call_failed_event.cpython-310.pyc | Bin 0 -> 719 bytes ...mcp_call_in_progress_event.cpython-310.pyc | Bin 0 -> 737 bytes ...list_tools_completed_event.cpython-310.pyc | Bin 0 -> 780 bytes ...cp_list_tools_failed_event.cpython-310.pyc | Bin 0 -> 758 bytes ...st_tools_in_progress_event.cpython-310.pyc | Bin 0 -> 806 bytes .../response_output_item.cpython-310.pyc | Bin 0 -> 4717 bytes ...se_output_item_added_event.cpython-310.pyc | Bin 0 -> 788 bytes ...nse_output_item_done_event.cpython-310.pyc | Bin 0 -> 788 bytes .../response_output_message.cpython-310.pyc | Bin 0 -> 1190 bytes ...ponse_output_message_param.cpython-310.pyc | Bin 0 -> 1258 bytes .../response_output_refusal.cpython-310.pyc | Bin 0 -> 600 bytes ...ponse_output_refusal_param.cpython-310.pyc | Bin 0 -> 695 bytes .../response_output_text.cpython-310.pyc | Bin 0 -> 2845 bytes ...ext_annotation_added_event.cpython-310.pyc | Bin 0 -> 869 bytes ...response_output_text_param.cpython-310.pyc | Bin 0 -> 2886 bytes .../response_prompt.cpython-310.pyc | Bin 0 -> 1100 bytes .../response_prompt_param.cpython-310.pyc | Bin 0 -> 1210 bytes .../response_queued_event.cpython-310.pyc | Bin 0 -> 728 bytes .../response_reasoning_item.cpython-310.pyc | Bin 0 -> 1605 bytes ...ponse_reasoning_item_param.cpython-310.pyc | Bin 0 -> 1724 bytes ...g_summary_part_added_event.cpython-310.pyc | Bin 0 -> 1071 bytes ...ng_summary_part_done_event.cpython-310.pyc | Bin 0 -> 1063 bytes ...g_summary_text_delta_event.cpython-310.pyc | Bin 0 -> 823 bytes ...ng_summary_text_done_event.cpython-310.pyc | Bin 0 -> 812 bytes ...reasoning_text_delta_event.cpython-310.pyc | Bin 0 -> 792 bytes ..._reasoning_text_done_event.cpython-310.pyc | Bin 0 -> 781 bytes ...sponse_refusal_delta_event.cpython-310.pyc | Bin 0 -> 767 bytes ...esponse_refusal_done_event.cpython-310.pyc | Bin 0 -> 760 bytes .../response_retrieve_params.cpython-310.pyc | Bin 0 -> 1215 bytes .../response_status.cpython-310.pyc | Bin 0 -> 403 bytes .../response_stream_event.cpython-310.pyc | Bin 0 -> 5815 bytes .../response_text_config.cpython-310.pyc | Bin 0 -> 1039 bytes ...response_text_config_param.cpython-310.pyc | Bin 0 -> 1078 bytes .../response_text_delta_event.cpython-310.pyc | Bin 0 -> 1620 bytes .../response_text_done_event.cpython-310.pyc | Bin 0 -> 1608 bytes .../response_tool_search_call.cpython-310.pyc | Bin 0 -> 837 bytes ...se_tool_search_output_item.cpython-310.pyc | Bin 0 -> 907 bytes ...l_search_output_item_param.cpython-310.pyc | Bin 0 -> 918 bytes ...ch_output_item_param_param.cpython-310.pyc | Bin 0 -> 1005 bytes .../response_usage.cpython-310.pyc | Bin 0 -> 1201 bytes ...earch_call_completed_event.cpython-310.pyc | Bin 0 -> 750 bytes ...rch_call_in_progress_event.cpython-310.pyc | Bin 0 -> 755 bytes ...earch_call_searching_event.cpython-310.pyc | Bin 0 -> 750 bytes .../responses_client_event.cpython-310.pyc | Bin 0 -> 3665 bytes ...sponses_client_event_param.cpython-310.pyc | Bin 0 -> 3779 bytes .../responses_server_event.cpython-310.pyc | Bin 0 -> 5817 bytes .../skill_reference.cpython-310.pyc | Bin 0 -> 641 bytes .../skill_reference_param.cpython-310.pyc | Bin 0 -> 675 bytes .../__pycache__/tool.cpython-310.pyc | Bin 0 -> 6412 bytes .../tool_choice_allowed.cpython-310.pyc | Bin 0 -> 767 bytes .../tool_choice_allowed_param.cpython-310.pyc | Bin 0 -> 868 bytes .../tool_choice_apply_patch.cpython-310.pyc | Bin 0 -> 632 bytes ...l_choice_apply_patch_param.cpython-310.pyc | Bin 0 -> 708 bytes .../tool_choice_custom.cpython-310.pyc | Bin 0 -> 636 bytes .../tool_choice_custom_param.cpython-310.pyc | Bin 0 -> 722 bytes .../tool_choice_function.cpython-310.pyc | Bin 0 -> 639 bytes ...tool_choice_function_param.cpython-310.pyc | Bin 0 -> 725 bytes .../tool_choice_mcp.cpython-310.pyc | Bin 0 -> 738 bytes .../tool_choice_mcp_param.cpython-310.pyc | Bin 0 -> 821 bytes .../tool_choice_options.cpython-310.pyc | Bin 0 -> 369 bytes .../tool_choice_shell.cpython-310.pyc | Bin 0 -> 611 bytes .../tool_choice_shell_param.cpython-310.pyc | Bin 0 -> 687 bytes .../tool_choice_types.cpython-310.pyc | Bin 0 -> 858 bytes .../tool_choice_types_param.cpython-310.pyc | Bin 0 -> 942 bytes .../__pycache__/tool_param.cpython-310.pyc | Bin 0 -> 6378 bytes .../tool_search_tool.cpython-310.pyc | Bin 0 -> 802 bytes .../tool_search_tool_param.cpython-310.pyc | Bin 0 -> 861 bytes .../web_search_preview_tool.cpython-310.pyc | Bin 0 -> 1400 bytes ..._search_preview_tool_param.cpython-310.pyc | Bin 0 -> 1411 bytes .../web_search_tool.cpython-310.pyc | Bin 0 -> 1612 bytes .../web_search_tool_param.cpython-310.pyc | Bin 0 -> 1626 bytes .../types/responses/apply_patch_tool.py | 14 + .../types/responses/apply_patch_tool_param.py | 14 + .../types/responses/compacted_response.py | 33 + .../openai/types/responses/computer_action.py | 181 + .../types/responses/computer_action_list.py | 10 + .../responses/computer_action_list_param.py | 183 + .../types/responses/computer_action_param.py | 180 + .../openai/types/responses/computer_tool.py | 17 + .../types/responses/computer_tool_param.py | 17 + .../responses/computer_use_preview_tool.py | 26 + .../computer_use_preview_tool_param.py | 26 + .../openai/types/responses/container_auto.py | 36 + .../types/responses/container_auto_param.py | 35 + .../container_network_policy_allowlist.py | 20 + ...ontainer_network_policy_allowlist_param.py | 22 + .../container_network_policy_disabled.py | 12 + ...container_network_policy_disabled_param.py | 12 + .../container_network_policy_domain_secret.py | 16 + ...iner_network_policy_domain_secret_param.py | 18 + .../types/responses/container_reference.py | 15 + .../responses/container_reference_param.py | 15 + .../openai/types/responses/custom_tool.py | 31 + .../types/responses/custom_tool_param.py | 31 + .../types/responses/easy_input_message.py | 42 + .../responses/easy_input_message_param.py | 43 + .../types/responses/file_search_tool.py | 69 + .../types/responses/file_search_tool_param.py | 71 + .../types/responses/function_shell_tool.py | 25 + .../responses/function_shell_tool_param.py | 23 + .../openai/types/responses/function_tool.py | 36 + .../types/responses/function_tool_param.py | 36 + .../openai/types/responses/inline_skill.py | 22 + .../types/responses/inline_skill_param.py | 23 + .../types/responses/inline_skill_source.py | 20 + .../responses/inline_skill_source_param.py | 20 + .../types/responses/input_item_list_params.py | 34 + .../responses/input_token_count_params.py | 146 + .../responses/input_token_count_response.py | 13 + .../types/responses/local_environment.py | 17 + .../responses/local_environment_param.py | 18 + .../openai/types/responses/local_skill.py | 16 + .../types/responses/local_skill_param.py | 18 + .../openai/types/responses/namespace_tool.py | 44 + .../types/responses/namespace_tool_param.py | 44 + .../openai/types/responses/parsed_response.py | 110 + .../openai/types/responses/response.py | 321 + .../response_apply_patch_tool_call.py | 84 + .../response_apply_patch_tool_call_output.py | 33 + .../responses/response_audio_delta_event.py | 20 + .../responses/response_audio_done_event.py | 17 + .../response_audio_transcript_delta_event.py | 20 + .../response_audio_transcript_done_event.py | 17 + ..._code_interpreter_call_code_delta_event.py | 29 + ...e_code_interpreter_call_code_done_event.py | 26 + ...e_code_interpreter_call_completed_event.py | 26 + ...code_interpreter_call_in_progress_event.py | 26 + ...ode_interpreter_call_interpreting_event.py | 26 + .../response_code_interpreter_tool_call.py | 61 + ...sponse_code_interpreter_tool_call_param.py | 60 + .../responses/response_compact_params.py | 142 + .../responses/response_compaction_item.py | 26 + .../response_compaction_item_param.py | 23 + .../response_compaction_item_param_param.py | 23 + .../responses/response_completed_event.py | 21 + .../responses/response_computer_tool_call.py | 244 + ...response_computer_tool_call_output_item.py | 49 + ...se_computer_tool_call_output_screenshot.py | 24 + ...puter_tool_call_output_screenshot_param.py | 23 + .../response_computer_tool_call_param.py | 242 + .../responses/response_container_reference.py | 16 + .../response_content_part_added_event.py | 48 + .../response_content_part_done_event.py | 48 + .../responses/response_conversation_param.py | 12 + .../response_conversation_param_param.py | 14 + .../types/responses/response_create_params.py | 349 + .../types/responses/response_created_event.py | 21 + .../responses/response_custom_tool_call.py | 30 + ...onse_custom_tool_call_input_delta_event.py | 26 + ...ponse_custom_tool_call_input_done_event.py | 26 + .../response_custom_tool_call_output.py | 35 + .../response_custom_tool_call_output_param.py | 33 + .../response_custom_tool_call_param.py | 29 + .../openai/types/responses/response_error.py | 36 + .../types/responses/response_error_event.py | 27 + .../types/responses/response_failed_event.py | 21 + ...sponse_file_search_call_completed_event.py | 23 + ...onse_file_search_call_in_progress_event.py | 23 + ...sponse_file_search_call_searching_event.py | 23 + .../response_file_search_tool_call.py | 57 + .../response_file_search_tool_call_param.py | 59 + .../responses/response_format_text_config.py | 16 + .../response_format_text_config_param.py | 16 + ...response_format_text_json_schema_config.py | 49 + ...se_format_text_json_schema_config_param.py | 47 + ...nse_function_call_arguments_delta_event.py | 28 + ...onse_function_call_arguments_done_event.py | 28 + .../response_function_call_output_item.py | 16 + ...response_function_call_output_item_list.py | 10 + ...se_function_call_output_item_list_param.py | 18 + ...esponse_function_call_output_item_param.py | 16 + ...onse_function_shell_call_output_content.py | 42 + ...unction_shell_call_output_content_param.py | 41 + .../response_function_shell_tool_call.py | 59 + ...esponse_function_shell_tool_call_output.py | 88 + .../responses/response_function_tool_call.py | 41 + .../response_function_tool_call_item.py | 16 + ...response_function_tool_call_output_item.py | 40 + .../response_function_tool_call_param.py | 40 + .../responses/response_function_web_search.py | 91 + .../response_function_web_search_param.py | 92 + ...response_image_gen_call_completed_event.py | 25 + ...esponse_image_gen_call_generating_event.py | 25 + ...sponse_image_gen_call_in_progress_event.py | 23 + ...onse_image_gen_call_partial_image_event.py | 32 + .../responses/response_in_progress_event.py | 21 + .../types/responses/response_includable.py | 16 + .../responses/response_incomplete_event.py | 21 + .../openai/types/responses/response_input.py | 10 + .../types/responses/response_input_audio.py | 24 + .../responses/response_input_audio_param.py | 24 + .../types/responses/response_input_content.py | 15 + .../responses/response_input_content_param.py | 14 + .../types/responses/response_input_file.py | 27 + .../responses/response_input_file_content.py | 27 + .../response_input_file_content_param.py | 27 + .../responses/response_input_file_param.py | 27 + .../types/responses/response_input_image.py | 33 + .../responses/response_input_image_content.py | 33 + .../response_input_image_content_param.py | 33 + .../responses/response_input_image_param.py | 33 + .../types/responses/response_input_item.py | 572 ++ .../responses/response_input_item_param.py | 567 ++ .../response_input_message_content_list.py | 10 + ...sponse_input_message_content_list_param.py | 16 + .../responses/response_input_message_item.py | 33 + .../types/responses/response_input_param.py | 570 ++ .../types/responses/response_input_text.py | 17 + .../responses/response_input_text_content.py | 17 + .../response_input_text_content_param.py | 17 + .../responses/response_input_text_param.py | 17 + .../openai/types/responses/response_item.py | 248 + .../types/responses/response_item_list.py | 28 + .../responses/response_local_environment.py | 14 + ...response_mcp_call_arguments_delta_event.py | 31 + .../response_mcp_call_arguments_done_event.py | 26 + .../response_mcp_call_completed_event.py | 23 + .../response_mcp_call_failed_event.py | 23 + .../response_mcp_call_in_progress_event.py | 23 + ...response_mcp_list_tools_completed_event.py | 23 + .../response_mcp_list_tools_failed_event.py | 23 + ...sponse_mcp_list_tools_in_progress_event.py | 25 + .../types/responses/response_output_item.py | 209 + .../response_output_item_added_event.py | 24 + .../response_output_item_done_event.py | 24 + .../responses/response_output_message.py | 44 + .../response_output_message_param.py | 44 + .../responses/response_output_refusal.py | 17 + .../response_output_refusal_param.py | 17 + .../types/responses/response_output_text.py | 131 + ...onse_output_text_annotation_added_event.py | 32 + .../responses/response_output_text_param.py | 129 + .../openai/types/responses/response_prompt.py | 33 + .../types/responses/response_prompt_param.py | 34 + .../types/responses/response_queued_event.py | 21 + .../responses/response_reasoning_item.py | 62 + .../response_reasoning_item_param.py | 62 + ...onse_reasoning_summary_part_added_event.py | 39 + ...ponse_reasoning_summary_part_done_event.py | 39 + ...onse_reasoning_summary_text_delta_event.py | 29 + ...ponse_reasoning_summary_text_done_event.py | 29 + .../response_reasoning_text_delta_event.py | 29 + .../response_reasoning_text_done_event.py | 29 + .../responses/response_refusal_delta_event.py | 29 + .../responses/response_refusal_done_event.py | 29 + .../responses/response_retrieve_params.py | 59 + .../openai/types/responses/response_status.py | 7 + .../types/responses/response_stream_event.py | 120 + .../types/responses/response_text_config.py | 43 + .../responses/response_text_config_param.py | 44 + .../responses/response_text_delta_event.py | 58 + .../responses/response_text_done_event.py | 58 + .../responses/response_tool_search_call.py | 31 + .../response_tool_search_output_item.py | 32 + .../response_tool_search_output_item_param.py | 29 + ...nse_tool_search_output_item_param_param.py | 30 + .../openai/types/responses/response_usage.py | 44 + ...esponse_web_search_call_completed_event.py | 23 + ...ponse_web_search_call_in_progress_event.py | 23 + ...esponse_web_search_call_searching_event.py | 23 + .../types/responses/responses_client_event.py | 326 + .../responses/responses_client_event_param.py | 327 + .../types/responses/responses_server_event.py | 120 + .../openai/types/responses/skill_reference.py | 19 + .../types/responses/skill_reference_param.py | 18 + .../openai/types/responses/tool.py | 330 + .../types/responses/tool_choice_allowed.py | 38 + .../responses/tool_choice_allowed_param.py | 38 + .../responses/tool_choice_apply_patch.py | 14 + .../tool_choice_apply_patch_param.py | 14 + .../types/responses/tool_choice_custom.py | 17 + .../responses/tool_choice_custom_param.py | 17 + .../types/responses/tool_choice_function.py | 17 + .../responses/tool_choice_function_param.py | 17 + .../openai/types/responses/tool_choice_mcp.py | 23 + .../types/responses/tool_choice_mcp_param.py | 23 + .../types/responses/tool_choice_options.py | 7 + .../types/responses/tool_choice_shell.py | 14 + .../responses/tool_choice_shell_param.py | 14 + .../types/responses/tool_choice_types.py | 40 + .../responses/tool_choice_types_param.py | 42 + .../openai/types/responses/tool_param.py | 330 + .../types/responses/tool_search_tool.py | 24 + .../types/responses/tool_search_tool_param.py | 24 + .../responses/web_search_preview_tool.py | 58 + .../web_search_preview_tool_param.py | 58 + .../openai/types/responses/web_search_tool.py | 73 + .../types/responses/web_search_tool_param.py | 75 + .../openai/types/shared/__init__.py | 19 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1189 bytes .../__pycache__/all_models.cpython-310.pyc | Bin 0 -> 719 bytes .../__pycache__/chat_model.cpython-310.pyc | Bin 0 -> 1768 bytes .../comparison_filter.cpython-310.pyc | Bin 0 -> 828 bytes .../compound_filter.cpython-310.pyc | Bin 0 -> 808 bytes .../custom_tool_input_format.cpython-310.pyc | Bin 0 -> 1086 bytes .../__pycache__/error_object.cpython-310.pyc | Bin 0 -> 573 bytes .../function_definition.cpython-310.pyc | Bin 0 -> 703 bytes .../function_parameters.cpython-310.pyc | Bin 0 -> 377 bytes .../__pycache__/metadata.cpython-310.pyc | Bin 0 -> 348 bytes .../__pycache__/reasoning.cpython-310.pyc | Bin 0 -> 900 bytes .../reasoning_effort.cpython-310.pyc | Bin 0 -> 423 bytes ...esponse_format_json_object.cpython-310.pyc | Bin 0 -> 827 bytes ...esponse_format_json_schema.cpython-310.pyc | Bin 0 -> 1302 bytes .../response_format_text.cpython-310.pyc | Bin 0 -> 601 bytes ...sponse_format_text_grammar.cpython-310.pyc | Bin 0 -> 757 bytes ...esponse_format_text_python.cpython-310.pyc | Bin 0 -> 730 bytes .../responses_model.cpython-310.pyc | Bin 0 -> 729 bytes .../openai/types/shared/all_models.py | 29 + .../openai/types/shared/chat_model.py | 86 + .../openai/types/shared/comparison_filter.py | 38 + .../openai/types/shared/compound_filter.py | 24 + .../types/shared/custom_tool_input_format.py | 32 + .../openai/types/shared/error_object.py | 17 + .../types/shared/function_definition.py | 43 + .../types/shared/function_parameters.py | 8 + .../openai/types/shared/metadata.py | 8 + .../openai/types/shared/reasoning.py | 52 + .../openai/types/shared/reasoning_effort.py | 8 + .../shared/response_format_json_object.py | 20 + .../shared/response_format_json_schema.py | 56 + .../types/shared/response_format_text.py | 14 + .../shared/response_format_text_grammar.py | 20 + .../shared/response_format_text_python.py | 18 + .../openai/types/shared/responses_model.py | 29 + .../openai/types/shared_params/__init__.py | 15 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 950 bytes .../__pycache__/chat_model.cpython-310.pyc | Bin 0 -> 1826 bytes .../comparison_filter.cpython-310.pyc | Bin 0 -> 980 bytes .../compound_filter.cpython-310.pyc | Bin 0 -> 903 bytes .../custom_tool_input_format.cpython-310.pyc | Bin 0 -> 1085 bytes .../function_definition.cpython-310.pyc | Bin 0 -> 775 bytes .../function_parameters.cpython-310.pyc | Bin 0 -> 435 bytes .../__pycache__/metadata.cpython-310.pyc | Bin 0 -> 406 bytes .../__pycache__/reasoning.cpython-310.pyc | Bin 0 -> 936 bytes .../reasoning_effort.cpython-310.pyc | Bin 0 -> 481 bytes ...esponse_format_json_object.cpython-310.pyc | Bin 0 -> 899 bytes ...esponse_format_json_schema.cpython-310.pyc | Bin 0 -> 1276 bytes .../response_format_text.cpython-310.pyc | Bin 0 -> 673 bytes .../responses_model.cpython-310.pyc | Bin 0 -> 794 bytes .../openai/types/shared_params/chat_model.py | 88 + .../types/shared_params/comparison_filter.py | 40 + .../types/shared_params/compound_filter.py | 25 + .../shared_params/custom_tool_input_format.py | 31 + .../shared_params/function_definition.py | 45 + .../shared_params/function_parameters.py | 10 + .../openai/types/shared_params/metadata.py | 10 + .../openai/types/shared_params/reasoning.py | 53 + .../types/shared_params/reasoning_effort.py | 10 + .../response_format_json_object.py | 20 + .../response_format_json_schema.py | 54 + .../shared_params/response_format_text.py | 14 + .../types/shared_params/responses_model.py | 31 + .../site-packages/openai/types/skill.py | 30 + .../openai/types/skill_create_params.py | 15 + .../site-packages/openai/types/skill_list.py | 26 + .../openai/types/skill_list_params.py | 21 + .../openai/types/skill_update_params.py | 12 + .../openai/types/skills/__init__.py | 9 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 535 bytes .../deleted_skill_version.cpython-310.pyc | Bin 0 -> 611 bytes .../__pycache__/skill_version.cpython-310.pyc | Bin 0 -> 673 bytes .../skill_version_list.cpython-310.pyc | Bin 0 -> 781 bytes .../version_create_params.cpython-310.pyc | Bin 0 -> 711 bytes .../version_list_params.cpython-310.pyc | Bin 0 -> 621 bytes .../types/skills/deleted_skill_version.py | 18 + .../openai/types/skills/skill_version.py | 30 + .../openai/types/skills/skill_version_list.py | 26 + .../types/skills/version_create_params.py | 18 + .../types/skills/version_list_params.py | 18 + .../openai/types/skills/versions/__init__.py | 3 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 239 bytes .../types/static_file_chunking_strategy.py | 20 + .../static_file_chunking_strategy_object.py | 15 + ...tic_file_chunking_strategy_object_param.py | 18 + .../static_file_chunking_strategy_param.py | 22 + .../site-packages/openai/types/upload.py | 44 + .../openai/types/upload_complete_params.py | 20 + .../openai/types/upload_create_params.py | 57 + .../openai/types/uploads/__init__.py | 6 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 341 bytes .../part_create_params.cpython-310.pyc | Bin 0 -> 610 bytes .../__pycache__/upload_part.cpython-310.pyc | Bin 0 -> 691 bytes .../types/uploads/part_create_params.py | 14 + .../openai/types/uploads/upload_part.py | 23 + .../openai/types/vector_store.py | 88 + .../types/vector_store_create_params.py | 63 + .../openai/types/vector_store_deleted.py | 15 + .../openai/types/vector_store_list_params.py | 39 + .../types/vector_store_search_params.py | 44 + .../types/vector_store_search_response.py | 39 + .../types/vector_store_update_params.py | 41 + .../openai/types/vector_stores/__init__.py | 13 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 824 bytes .../file_batch_create_params.cpython-310.pyc | Bin 0 -> 1167 bytes ...le_batch_list_files_params.cpython-310.pyc | Bin 0 -> 809 bytes .../file_content_response.cpython-310.pyc | Bin 0 -> 567 bytes .../file_create_params.cpython-310.pyc | Bin 0 -> 831 bytes .../file_list_params.cpython-310.pyc | Bin 0 -> 726 bytes .../file_update_params.cpython-310.pyc | Bin 0 -> 724 bytes .../vector_store_file.cpython-310.pyc | Bin 0 -> 1473 bytes .../vector_store_file_batch.cpython-310.pyc | Bin 0 -> 1053 bytes .../vector_store_file_deleted.cpython-310.pyc | Bin 0 -> 608 bytes .../vector_stores/file_batch_create_params.py | 72 + .../file_batch_list_files_params.py | 47 + .../vector_stores/file_content_response.py | 15 + .../types/vector_stores/file_create_params.py | 35 + .../types/vector_stores/file_list_params.py | 45 + .../types/vector_stores/file_update_params.py | 21 + .../types/vector_stores/vector_store_file.py | 74 + .../vector_stores/vector_store_file_batch.py | 56 + .../vector_store_file_deleted.py | 15 + .../site-packages/openai/types/video.py | 58 + .../types/video_create_character_params.py | 17 + .../types/video_create_character_response.py | 18 + .../openai/types/video_create_error.py | 15 + .../openai/types/video_create_params.py | 40 + .../openai/types/video_delete_response.py | 20 + .../types/video_download_content_params.py | 12 + .../openai/types/video_edit_params.py | 28 + .../openai/types/video_extend_params.py | 35 + .../types/video_get_character_response.py | 18 + .../openai/types/video_list_params.py | 21 + .../site-packages/openai/types/video_model.py | 10 + .../openai/types/video_model_param.py | 12 + .../openai/types/video_remix_params.py | 12 + .../openai/types/video_seconds.py | 7 + .../site-packages/openai/types/video_size.py | 7 + .../openai/types/webhooks/__init__.py | 24 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1578 bytes ...ch_cancelled_webhook_event.cpython-310.pyc | Bin 0 -> 987 bytes ...ch_completed_webhook_event.cpython-310.pyc | Bin 0 -> 987 bytes ...atch_expired_webhook_event.cpython-310.pyc | Bin 0 -> 974 bytes ...batch_failed_webhook_event.cpython-310.pyc | Bin 0 -> 970 bytes ...run_canceled_webhook_event.cpython-310.pyc | Bin 0 -> 983 bytes ...l_run_failed_webhook_event.cpython-310.pyc | Bin 0 -> 970 bytes ...un_succeeded_webhook_event.cpython-310.pyc | Bin 0 -> 982 bytes ...ob_cancelled_webhook_event.cpython-310.pyc | Bin 0 -> 1013 bytes ...g_job_failed_webhook_event.cpython-310.pyc | Bin 0 -> 996 bytes ...ob_succeeded_webhook_event.cpython-310.pyc | Bin 0 -> 1008 bytes ...all_incoming_webhook_event.cpython-310.pyc | Bin 0 -> 1321 bytes ...se_cancelled_webhook_event.cpython-310.pyc | Bin 0 -> 998 bytes ...se_completed_webhook_event.cpython-310.pyc | Bin 0 -> 998 bytes ...ponse_failed_webhook_event.cpython-310.pyc | Bin 0 -> 981 bytes ...e_incomplete_webhook_event.cpython-310.pyc | Bin 0 -> 1003 bytes .../unwrap_webhook_event.cpython-310.pyc | Bin 0 -> 1824 bytes .../webhooks/batch_cancelled_webhook_event.py | 34 + .../webhooks/batch_completed_webhook_event.py | 34 + .../webhooks/batch_expired_webhook_event.py | 34 + .../webhooks/batch_failed_webhook_event.py | 34 + .../eval_run_canceled_webhook_event.py | 34 + .../webhooks/eval_run_failed_webhook_event.py | 34 + .../eval_run_succeeded_webhook_event.py | 34 + ...fine_tuning_job_cancelled_webhook_event.py | 34 + .../fine_tuning_job_failed_webhook_event.py | 34 + ...fine_tuning_job_succeeded_webhook_event.py | 34 + .../realtime_call_incoming_webhook_event.py | 47 + .../response_cancelled_webhook_event.py | 34 + .../response_completed_webhook_event.py | 34 + .../webhooks/response_failed_webhook_event.py | 34 + .../response_incomplete_webhook_event.py | 34 + .../types/webhooks/unwrap_webhook_event.py | 44 + .../types/websocket_connection_options.py | 42 + .../site-packages/openai/version.py | 3 + .../pip-26.0.1.dist-info/INSTALLER | 1 + .../pip-26.0.1.dist-info/METADATA | 111 + .../site-packages/pip-26.0.1.dist-info/RECORD | 878 ++ .../pip-26.0.1.dist-info/REQUESTED | 0 .../site-packages/pip-26.0.1.dist-info/WHEEL | 4 + .../pip-26.0.1.dist-info/entry_points.txt | 4 + .../pip-26.0.1.dist-info/licenses/AUTHORS.txt | 860 ++ .../pip-26.0.1.dist-info/licenses/LICENSE.txt | 20 + .../src/pip/_vendor/cachecontrol/LICENSE.txt | 13 + .../licenses/src/pip/_vendor/certifi/LICENSE | 20 + .../pip/_vendor/dependency_groups/LICENSE.txt | 9 + .../src/pip/_vendor/distlib/LICENSE.txt | 284 + .../licenses/src/pip/_vendor/distro/LICENSE | 202 + .../licenses/src/pip/_vendor/idna/LICENSE.md | 31 + .../licenses/src/pip/_vendor/msgpack/COPYING | 14 + .../src/pip/_vendor/packaging/LICENSE | 3 + .../src/pip/_vendor/packaging/LICENSE.APACHE | 177 + .../src/pip/_vendor/packaging/LICENSE.BSD | 23 + .../src/pip/_vendor/pkg_resources/LICENSE | 17 + .../src/pip/_vendor/platformdirs/LICENSE | 21 + .../licenses/src/pip/_vendor/pygments/LICENSE | 25 + .../src/pip/_vendor/pyproject_hooks/LICENSE | 21 + .../licenses/src/pip/_vendor/requests/LICENSE | 175 + .../src/pip/_vendor/resolvelib/LICENSE | 13 + .../licenses/src/pip/_vendor/rich/LICENSE | 19 + .../licenses/src/pip/_vendor/tomli/LICENSE | 21 + .../licenses/src/pip/_vendor/tomli_w/LICENSE | 21 + .../src/pip/_vendor/truststore/LICENSE | 21 + .../src/pip/_vendor/urllib3/LICENSE.txt | 21 + .../python3.10/site-packages/pip/__init__.py | 13 + .../python3.10/site-packages/pip/__main__.py | 24 + .../site-packages/pip/__pip-runner__.py | 50 + .../pip/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 635 bytes .../pip/__pycache__/__main__.cpython-310.pyc | Bin 0 -> 458 bytes .../__pip-runner__.cpython-310.pyc | Bin 0 -> 1622 bytes .../site-packages/pip/_internal/__init__.py | 18 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 697 bytes .../__pycache__/build_env.cpython-310.pyc | Bin 0 -> 18162 bytes .../__pycache__/cache.cpython-310.pyc | Bin 0 -> 9091 bytes .../__pycache__/configuration.cpython-310.pyc | Bin 0 -> 12224 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 0 -> 33844 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 621 bytes .../__pycache__/pyproject.cpython-310.pyc | Bin 0 -> 3122 bytes .../self_outdated_check.cpython-310.pyc | Bin 0 -> 6953 bytes .../__pycache__/wheel_builder.cpython-310.pyc | Bin 0 -> 6798 bytes .../site-packages/pip/_internal/build_env.py | 606 ++ .../site-packages/pip/_internal/cache.py | 291 + .../pip/_internal/cli/__init__.py | 3 + .../cli/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 264 bytes .../autocompletion.cpython-310.pyc | Bin 0 -> 5806 bytes .../__pycache__/base_command.cpython-310.pyc | Bin 0 -> 7067 bytes .../__pycache__/cmdoptions.cpython-310.pyc | Bin 0 -> 27747 bytes .../command_context.cpython-310.pyc | Bin 0 -> 1342 bytes .../__pycache__/index_command.cpython-310.pyc | Bin 0 -> 5635 bytes .../cli/__pycache__/main.cpython-310.pyc | Bin 0 -> 1514 bytes .../__pycache__/main_parser.cpython-310.pyc | Bin 0 -> 3119 bytes .../cli/__pycache__/parser.cpython-310.pyc | Bin 0 -> 12374 bytes .../__pycache__/progress_bars.cpython-310.pyc | Bin 0 -> 4273 bytes .../__pycache__/req_command.cpython-310.pyc | Bin 0 -> 11408 bytes .../cli/__pycache__/spinners.cpython-310.pyc | Bin 0 -> 7689 bytes .../__pycache__/status_codes.cpython-310.pyc | Bin 0 -> 344 bytes .../pip/_internal/cli/autocompletion.py | 184 + .../pip/_internal/cli/base_command.py | 255 + .../pip/_internal/cli/cmdoptions.py | 1267 +++ .../pip/_internal/cli/command_context.py | 28 + .../pip/_internal/cli/index_command.py | 195 + .../site-packages/pip/_internal/cli/main.py | 85 + .../pip/_internal/cli/main_parser.py | 136 + .../site-packages/pip/_internal/cli/parser.py | 358 + .../pip/_internal/cli/progress_bars.py | 153 + .../pip/_internal/cli/req_command.py | 447 + .../pip/_internal/cli/spinners.py | 235 + .../pip/_internal/cli/status_codes.py | 6 + .../pip/_internal/commands/__init__.py | 139 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 3423 bytes .../__pycache__/cache.cpython-310.pyc | Bin 0 -> 7185 bytes .../__pycache__/check.cpython-310.pyc | Bin 0 -> 1929 bytes .../__pycache__/completion.cpython-310.pyc | Bin 0 -> 4577 bytes .../__pycache__/configuration.cpython-310.pyc | Bin 0 -> 9300 bytes .../__pycache__/debug.cpython-310.pyc | Bin 0 -> 7044 bytes .../__pycache__/download.cpython-310.pyc | Bin 0 -> 4103 bytes .../__pycache__/freeze.cpython-310.pyc | Bin 0 -> 2897 bytes .../commands/__pycache__/hash.cpython-310.pyc | Bin 0 -> 2107 bytes .../commands/__pycache__/help.cpython-310.pyc | Bin 0 -> 1268 bytes .../__pycache__/index.cpython-310.pyc | Bin 0 -> 5173 bytes .../__pycache__/inspect.cpython-310.pyc | Bin 0 -> 2935 bytes .../__pycache__/install.cpython-310.pyc | Bin 0 -> 18787 bytes .../commands/__pycache__/list.cpython-310.pyc | Bin 0 -> 11627 bytes .../commands/__pycache__/lock.cpython-310.pyc | Bin 0 -> 4652 bytes .../__pycache__/search.cpython-310.pyc | Bin 0 -> 5637 bytes .../commands/__pycache__/show.cpython-310.pyc | Bin 0 -> 7571 bytes .../__pycache__/uninstall.cpython-310.pyc | Bin 0 -> 3291 bytes .../__pycache__/wheel.cpython-310.pyc | Bin 0 -> 4627 bytes .../pip/_internal/commands/cache.py | 255 + .../pip/_internal/commands/check.py | 66 + .../pip/_internal/commands/completion.py | 136 + .../pip/_internal/commands/configuration.py | 288 + .../pip/_internal/commands/debug.py | 203 + .../pip/_internal/commands/download.py | 146 + .../pip/_internal/commands/freeze.py | 107 + .../pip/_internal/commands/hash.py | 58 + .../pip/_internal/commands/help.py | 40 + .../pip/_internal/commands/index.py | 166 + .../pip/_internal/commands/inspect.py | 92 + .../pip/_internal/commands/install.py | 810 ++ .../pip/_internal/commands/list.py | 398 + .../pip/_internal/commands/lock.py | 175 + .../pip/_internal/commands/search.py | 178 + .../pip/_internal/commands/show.py | 231 + .../pip/_internal/commands/uninstall.py | 113 + .../pip/_internal/commands/wheel.py | 171 + .../pip/_internal/configuration.py | 396 + .../pip/_internal/distributions/__init__.py | 21 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 792 bytes .../__pycache__/base.cpython-310.pyc | Bin 0 -> 2588 bytes .../__pycache__/installed.cpython-310.pyc | Bin 0 -> 1577 bytes .../__pycache__/sdist.cpython-310.pyc | Bin 0 -> 5280 bytes .../__pycache__/wheel.cpython-310.pyc | Bin 0 -> 1942 bytes .../pip/_internal/distributions/base.py | 55 + .../pip/_internal/distributions/installed.py | 33 + .../pip/_internal/distributions/sdist.py | 164 + .../pip/_internal/distributions/wheel.py | 44 + .../site-packages/pip/_internal/exceptions.py | 971 ++ .../pip/_internal/index/__init__.py | 1 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 218 bytes .../__pycache__/collector.cpython-310.pyc | Bin 0 -> 15429 bytes .../package_finder.cpython-310.pyc | Bin 0 -> 32324 bytes .../index/__pycache__/sources.cpython-310.pyc | Bin 0 -> 9064 bytes .../pip/_internal/index/collector.py | 488 + .../pip/_internal/index/package_finder.py | 1125 +++ .../pip/_internal/index/sources.py | 287 + .../pip/_internal/locations/__init__.py | 440 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 10481 bytes .../__pycache__/_distutils.cpython-310.pyc | Bin 0 -> 4551 bytes .../__pycache__/_sysconfig.cpython-310.pyc | Bin 0 -> 6135 bytes .../__pycache__/base.cpython-310.pyc | Bin 0 -> 2424 bytes .../pip/_internal/locations/_distutils.py | 173 + .../pip/_internal/locations/_sysconfig.py | 218 + .../pip/_internal/locations/base.py | 82 + .../site-packages/pip/_internal/main.py | 12 + .../pip/_internal/metadata/__init__.py | 169 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 5643 bytes .../__pycache__/_json.cpython-310.pyc | Bin 0 -> 2302 bytes .../metadata/__pycache__/base.cpython-310.pyc | Bin 0 -> 27212 bytes .../__pycache__/pkg_resources.cpython-310.pyc | Bin 0 -> 11490 bytes .../pip/_internal/metadata/_json.py | 87 + .../pip/_internal/metadata/base.py | 685 ++ .../_internal/metadata/importlib/__init__.py | 6 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 340 bytes .../__pycache__/_compat.cpython-310.pyc | Bin 0 -> 3580 bytes .../__pycache__/_dists.cpython-310.pyc | Bin 0 -> 9337 bytes .../__pycache__/_envs.cpython-310.pyc | Bin 0 -> 5932 bytes .../_internal/metadata/importlib/_compat.py | 87 + .../_internal/metadata/importlib/_dists.py | 229 + .../pip/_internal/metadata/importlib/_envs.py | 143 + .../pip/_internal/metadata/pkg_resources.py | 298 + .../pip/_internal/models/__init__.py | 1 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 252 bytes .../__pycache__/candidate.cpython-310.pyc | Bin 0 -> 1225 bytes .../__pycache__/direct_url.cpython-310.pyc | Bin 0 -> 7594 bytes .../format_control.cpython-310.pyc | Bin 0 -> 2777 bytes .../models/__pycache__/index.cpython-310.pyc | Bin 0 -> 1222 bytes .../installation_report.cpython-310.pyc | Bin 0 -> 1758 bytes .../models/__pycache__/link.cpython-310.pyc | Bin 0 -> 19175 bytes .../release_control.cpython-310.pyc | Bin 0 -> 3289 bytes .../models/__pycache__/scheme.cpython-310.pyc | Bin 0 -> 924 bytes .../__pycache__/search_scope.cpython-310.pyc | Bin 0 -> 3428 bytes .../selection_prefs.cpython-310.pyc | Bin 0 -> 1968 bytes .../__pycache__/target_python.cpython-310.pyc | Bin 0 -> 3808 bytes .../models/__pycache__/wheel.cpython-310.pyc | Bin 0 -> 3953 bytes .../pip/_internal/models/candidate.py | 25 + .../pip/_internal/models/direct_url.py | 227 + .../pip/_internal/models/format_control.py | 78 + .../pip/_internal/models/index.py | 28 + .../_internal/models/installation_report.py | 57 + .../pip/_internal/models/link.py | 617 ++ .../pip/_internal/models/release_control.py | 92 + .../pip/_internal/models/scheme.py | 25 + .../pip/_internal/models/search_scope.py | 126 + .../pip/_internal/models/selection_prefs.py | 56 + .../pip/_internal/models/target_python.py | 122 + .../pip/_internal/models/wheel.py | 80 + .../pip/_internal/network/__init__.py | 1 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 240 bytes .../network/__pycache__/auth.cpython-310.pyc | Bin 0 -> 14750 bytes .../network/__pycache__/cache.cpython-310.pyc | Bin 0 -> 5997 bytes .../__pycache__/download.cpython-310.pyc | Bin 0 -> 10608 bytes .../__pycache__/lazy_wheel.cpython-310.pyc | Bin 0 -> 8626 bytes .../__pycache__/session.cpython-310.pyc | Bin 0 -> 13373 bytes .../network/__pycache__/utils.cpython-310.pyc | Bin 0 -> 1447 bytes .../__pycache__/xmlrpc.cpython-310.pyc | Bin 0 -> 2082 bytes .../pip/_internal/network/auth.py | 568 ++ .../pip/_internal/network/cache.py | 128 + .../pip/_internal/network/download.py | 341 + .../pip/_internal/network/lazy_wheel.py | 215 + .../pip/_internal/network/session.py | 532 + .../pip/_internal/network/utils.py | 98 + .../pip/_internal/network/xmlrpc.py | 61 + .../pip/_internal/operations/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 189 bytes .../__pycache__/check.cpython-310.pyc | Bin 0 -> 4988 bytes .../__pycache__/freeze.cpython-310.pyc | Bin 0 -> 6467 bytes .../__pycache__/prepare.cpython-310.pyc | Bin 0 -> 16288 bytes .../_internal/operations/build/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 195 bytes .../__pycache__/build_tracker.cpython-310.pyc | Bin 0 -> 5121 bytes .../__pycache__/metadata.cpython-310.pyc | Bin 0 -> 1427 bytes .../metadata_editable.cpython-310.pyc | Bin 0 -> 1475 bytes .../build/__pycache__/wheel.cpython-310.pyc | Bin 0 -> 1265 bytes .../wheel_editable.cpython-310.pyc | Bin 0 -> 1489 bytes .../operations/build/build_tracker.py | 140 + .../_internal/operations/build/metadata.py | 38 + .../operations/build/metadata_editable.py | 41 + .../pip/_internal/operations/build/wheel.py | 38 + .../operations/build/wheel_editable.py | 47 + .../pip/_internal/operations/check.py | 175 + .../pip/_internal/operations/freeze.py | 259 + .../_internal/operations/install/__init__.py | 1 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 252 bytes .../install/__pycache__/wheel.cpython-310.pyc | Bin 0 -> 22369 bytes .../pip/_internal/operations/install/wheel.py | 745 ++ .../pip/_internal/operations/prepare.py | 747 ++ .../site-packages/pip/_internal/pyproject.py | 123 + .../pip/_internal/req/__init__.py | 103 + .../req/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 2702 bytes .../__pycache__/constructors.cpython-310.pyc | Bin 0 -> 14673 bytes .../req/__pycache__/pep723.cpython-310.pyc | Bin 0 -> 1861 bytes .../req_dependency_group.cpython-310.pyc | Bin 0 -> 2900 bytes .../req/__pycache__/req_file.cpython-310.pyc | Bin 0 -> 15969 bytes .../__pycache__/req_install.cpython-310.pyc | Bin 0 -> 22885 bytes .../req/__pycache__/req_set.cpython-310.pyc | Bin 0 -> 3854 bytes .../__pycache__/req_uninstall.cpython-310.pyc | Bin 0 -> 19058 bytes .../pip/_internal/req/constructors.py | 568 ++ .../site-packages/pip/_internal/req/pep723.py | 41 + .../pip/_internal/req/req_dependency_group.py | 75 + .../pip/_internal/req/req_file.py | 631 ++ .../pip/_internal/req/req_install.py | 828 ++ .../pip/_internal/req/req_set.py | 81 + .../pip/_internal/req/req_uninstall.py | 639 ++ .../pip/_internal/resolution/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 189 bytes .../__pycache__/base.cpython-310.pyc | Bin 0 -> 1027 bytes .../pip/_internal/resolution/base.py | 20 + .../_internal/resolution/legacy/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 196 bytes .../__pycache__/resolver.cpython-310.pyc | Bin 0 -> 15276 bytes .../_internal/resolution/legacy/resolver.py | 598 ++ .../resolution/resolvelib/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 200 bytes .../__pycache__/base.cpython-310.pyc | Bin 0 -> 6343 bytes .../__pycache__/candidates.cpython-310.pyc | Bin 0 -> 20022 bytes .../__pycache__/factory.cpython-310.pyc | Bin 0 -> 23273 bytes .../found_candidates.cpython-310.pyc | Bin 0 -> 5273 bytes .../__pycache__/provider.cpython-310.pyc | Bin 0 -> 9418 bytes .../__pycache__/reporter.cpython-310.pyc | Bin 0 -> 4478 bytes .../__pycache__/requirements.cpython-310.pyc | Bin 0 -> 10581 bytes .../__pycache__/resolver.cpython-310.pyc | Bin 0 -> 9032 bytes .../_internal/resolution/resolvelib/base.py | 142 + .../resolution/resolvelib/candidates.py | 591 ++ .../resolution/resolvelib/factory.py | 856 ++ .../resolution/resolvelib/found_candidates.py | 166 + .../resolution/resolvelib/provider.py | 285 + .../resolution/resolvelib/reporter.py | 98 + .../resolution/resolvelib/requirements.py | 251 + .../resolution/resolvelib/resolver.py | 332 + .../pip/_internal/self_outdated_check.py | 255 + .../pip/_internal/utils/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 184 bytes .../__pycache__/_jaraco_text.cpython-310.pyc | Bin 0 -> 3839 bytes .../utils/__pycache__/_log.cpython-310.pyc | Bin 0 -> 1512 bytes .../utils/__pycache__/appdirs.cpython-310.pyc | Bin 0 -> 1593 bytes .../utils/__pycache__/compat.cpython-310.pyc | Bin 0 -> 2034 bytes .../compatibility_tags.cpython-310.pyc | Bin 0 -> 4779 bytes .../__pycache__/datetime.cpython-310.pyc | Bin 0 -> 1015 bytes .../__pycache__/deprecation.cpython-310.pyc | Bin 0 -> 3379 bytes .../direct_url_helpers.cpython-310.pyc | Bin 0 -> 2138 bytes .../__pycache__/egg_link.cpython-310.pyc | Bin 0 -> 2428 bytes .../__pycache__/entrypoints.cpython-310.pyc | Bin 0 -> 2734 bytes .../__pycache__/filesystem.cpython-310.pyc | Bin 0 -> 6457 bytes .../__pycache__/filetypes.cpython-310.pyc | Bin 0 -> 904 bytes .../utils/__pycache__/glibc.cpython-310.pyc | Bin 0 -> 1747 bytes .../utils/__pycache__/hashes.cpython-310.pyc | Bin 0 -> 5774 bytes .../utils/__pycache__/logging.cpython-310.pyc | Bin 0 -> 11008 bytes .../utils/__pycache__/misc.cpython-310.pyc | Bin 0 -> 23691 bytes .../__pycache__/packaging.cpython-310.pyc | Bin 0 -> 1523 bytes .../utils/__pycache__/pylock.cpython-310.pyc | Bin 0 -> 2667 bytes .../utils/__pycache__/retry.cpython-310.pyc | Bin 0 -> 1724 bytes .../__pycache__/subprocess.cpython-310.pyc | Bin 0 -> 5949 bytes .../__pycache__/temp_dir.cpython-310.pyc | Bin 0 -> 8635 bytes .../__pycache__/unpacking.cpython-310.pyc | Bin 0 -> 8756 bytes .../utils/__pycache__/urls.cpython-310.pyc | Bin 0 -> 1359 bytes .../__pycache__/virtualenv.cpython-310.pyc | Bin 0 -> 3273 bytes .../utils/__pycache__/wheel.cpython-310.pyc | Bin 0 -> 4351 bytes .../pip/_internal/utils/_jaraco_text.py | 109 + .../site-packages/pip/_internal/utils/_log.py | 38 + .../pip/_internal/utils/appdirs.py | 52 + .../pip/_internal/utils/compat.py | 85 + .../pip/_internal/utils/compatibility_tags.py | 201 + .../pip/_internal/utils/datetime.py | 28 + .../pip/_internal/utils/deprecation.py | 126 + .../pip/_internal/utils/direct_url_helpers.py | 87 + .../pip/_internal/utils/egg_link.py | 81 + .../pip/_internal/utils/entrypoints.py | 88 + .../pip/_internal/utils/filesystem.py | 203 + .../pip/_internal/utils/filetypes.py | 24 + .../pip/_internal/utils/glibc.py | 102 + .../pip/_internal/utils/hashes.py | 150 + .../pip/_internal/utils/logging.py | 396 + .../site-packages/pip/_internal/utils/misc.py | 771 ++ .../pip/_internal/utils/packaging.py | 44 + .../pip/_internal/utils/pylock.py | 116 + .../pip/_internal/utils/retry.py | 45 + .../pip/_internal/utils/subprocess.py | 248 + .../pip/_internal/utils/temp_dir.py | 294 + .../pip/_internal/utils/unpacking.py | 362 + .../site-packages/pip/_internal/utils/urls.py | 55 + .../pip/_internal/utils/virtualenv.py | 105 + .../pip/_internal/utils/wheel.py | 132 + .../pip/_internal/vcs/__init__.py | 15 + .../vcs/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 507 bytes .../vcs/__pycache__/bazaar.cpython-310.pyc | Bin 0 -> 3630 bytes .../vcs/__pycache__/git.cpython-310.pyc | Bin 0 -> 13303 bytes .../vcs/__pycache__/mercurial.cpython-310.pyc | Bin 0 -> 5212 bytes .../__pycache__/subversion.cpython-310.pyc | Bin 0 -> 8630 bytes .../versioncontrol.cpython-310.pyc | Bin 0 -> 21649 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 130 + .../site-packages/pip/_internal/vcs/git.py | 571 ++ .../pip/_internal/vcs/mercurial.py | 186 + .../pip/_internal/vcs/subversion.py | 335 + .../pip/_internal/vcs/versioncontrol.py | 695 ++ .../pip/_internal/wheel_builder.py | 261 + .../site-packages/pip/_vendor/README.rst | 180 + .../site-packages/pip/_vendor/__init__.py | 117 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 3082 bytes .../pip/_vendor/cachecontrol/LICENSE.txt | 13 + .../pip/_vendor/cachecontrol/__init__.py | 32 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 777 bytes .../__pycache__/_cmd.cpython-310.pyc | Bin 0 -> 1824 bytes .../__pycache__/adapter.cpython-310.pyc | Bin 0 -> 4492 bytes .../__pycache__/cache.cpython-310.pyc | Bin 0 -> 3268 bytes .../__pycache__/controller.cpython-310.pyc | Bin 0 -> 10314 bytes .../__pycache__/filewrapper.cpython-310.pyc | Bin 0 -> 3255 bytes .../__pycache__/heuristics.cpython-310.pyc | Bin 0 -> 5389 bytes .../__pycache__/serialize.cpython-310.pyc | Bin 0 -> 3342 bytes .../__pycache__/wrapper.cpython-310.pyc | Bin 0 -> 1459 bytes .../pip/_vendor/cachecontrol/_cmd.py | 70 + .../pip/_vendor/cachecontrol/adapter.py | 167 + .../pip/_vendor/cachecontrol/cache.py | 75 + .../_vendor/cachecontrol/caches/__init__.py | 8 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 418 bytes .../__pycache__/file_cache.cpython-310.pyc | Bin 0 -> 5227 bytes .../__pycache__/redis_cache.cpython-310.pyc | Bin 0 -> 2033 bytes .../_vendor/cachecontrol/caches/file_cache.py | 145 + .../cachecontrol/caches/redis_cache.py | 48 + .../pip/_vendor/cachecontrol/controller.py | 511 + .../pip/_vendor/cachecontrol/filewrapper.py | 121 + .../pip/_vendor/cachecontrol/heuristics.py | 157 + .../pip/_vendor/cachecontrol/py.typed | 0 .../pip/_vendor/cachecontrol/serialize.py | 146 + .../pip/_vendor/cachecontrol/wrapper.py | 43 + .../site-packages/pip/_vendor/certifi/LICENSE | 20 + .../pip/_vendor/certifi/__init__.py | 4 + .../pip/_vendor/certifi/__main__.py | 12 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 297 bytes .../__pycache__/__main__.cpython-310.pyc | Bin 0 -> 447 bytes .../certifi/__pycache__/core.cpython-310.pyc | Bin 0 -> 1422 bytes .../pip/_vendor/certifi/cacert.pem | 4468 +++++++++ .../site-packages/pip/_vendor/certifi/core.py | 83 + .../pip/_vendor/certifi/py.typed | 0 .../pip/_vendor/dependency_groups/LICENSE.txt | 9 + .../pip/_vendor/dependency_groups/__init__.py | 13 + .../pip/_vendor/dependency_groups/__main__.py | 65 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 355 bytes .../__pycache__/__main__.cpython-310.pyc | Bin 0 -> 1714 bytes .../_implementation.cpython-310.pyc | Bin 0 -> 6912 bytes .../_lint_dependency_groups.cpython-310.pyc | Bin 0 -> 1831 bytes .../__pycache__/_pip_wrapper.cpython-310.pyc | Bin 0 -> 2221 bytes .../__pycache__/_toml_compat.cpython-310.pyc | Bin 0 -> 402 bytes .../dependency_groups/_implementation.py | 209 + .../_lint_dependency_groups.py | 59 + .../_vendor/dependency_groups/_pip_wrapper.py | 62 + .../_vendor/dependency_groups/_toml_compat.py | 9 + .../pip/_vendor/dependency_groups/py.typed | 0 .../pip/_vendor/distlib/LICENSE.txt | 284 + .../pip/_vendor/distlib/__init__.py | 33 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1055 bytes .../__pycache__/compat.cpython-310.pyc | Bin 0 -> 31428 bytes .../__pycache__/resources.cpython-310.pyc | Bin 0 -> 11029 bytes .../__pycache__/scripts.cpython-310.pyc | Bin 0 -> 11660 bytes .../distlib/__pycache__/util.cpython-310.pyc | Bin 0 -> 52066 bytes .../pip/_vendor/distlib/compat.py | 1137 +++ .../pip/_vendor/distlib/resources.py | 358 + .../pip/_vendor/distlib/scripts.py | 447 + .../site-packages/pip/_vendor/distlib/t32.exe | Bin 0 -> 97792 bytes .../pip/_vendor/distlib/t64-arm.exe | Bin 0 -> 182784 bytes .../site-packages/pip/_vendor/distlib/t64.exe | Bin 0 -> 108032 bytes .../site-packages/pip/_vendor/distlib/util.py | 1984 ++++ .../site-packages/pip/_vendor/distlib/w32.exe | Bin 0 -> 91648 bytes .../pip/_vendor/distlib/w64-arm.exe | Bin 0 -> 168448 bytes .../site-packages/pip/_vendor/distlib/w64.exe | Bin 0 -> 101888 bytes .../site-packages/pip/_vendor/distro/LICENSE | 202 + .../pip/_vendor/distro/__init__.py | 54 + .../pip/_vendor/distro/__main__.py | 4 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 908 bytes .../__pycache__/__main__.cpython-310.pyc | Bin 0 -> 262 bytes .../distro/__pycache__/distro.cpython-310.pyc | Bin 0 -> 42145 bytes .../pip/_vendor/distro/distro.py | 1403 +++ .../site-packages/pip/_vendor/distro/py.typed | 0 .../site-packages/pip/_vendor/idna/LICENSE.md | 31 + .../pip/_vendor/idna/__init__.py | 45 + .../idna/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 845 bytes .../idna/__pycache__/codec.cpython-310.pyc | Bin 0 -> 3266 bytes .../idna/__pycache__/compat.cpython-310.pyc | Bin 0 -> 748 bytes .../idna/__pycache__/core.cpython-310.pyc | Bin 0 -> 9668 bytes .../idna/__pycache__/idnadata.cpython-310.pyc | Bin 0 -> 198644 bytes .../__pycache__/intranges.cpython-310.pyc | Bin 0 -> 1977 bytes .../__pycache__/package_data.cpython-310.pyc | Bin 0 -> 205 bytes .../__pycache__/uts46data.cpython-310.pyc | Bin 0 -> 155213 bytes .../site-packages/pip/_vendor/idna/codec.py | 122 + .../site-packages/pip/_vendor/idna/compat.py | 15 + .../site-packages/pip/_vendor/idna/core.py | 437 + .../pip/_vendor/idna/idnadata.py | 4309 ++++++++ .../pip/_vendor/idna/intranges.py | 57 + .../pip/_vendor/idna/package_data.py | 1 + .../site-packages/pip/_vendor/idna/py.typed | 0 .../pip/_vendor/idna/uts46data.py | 8841 +++++++++++++++++ .../site-packages/pip/_vendor/msgpack/COPYING | 14 + .../pip/_vendor/msgpack/__init__.py | 55 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1390 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 0 -> 1801 bytes .../msgpack/__pycache__/ext.cpython-310.pyc | Bin 0 -> 6082 bytes .../__pycache__/fallback.cpython-310.pyc | Bin 0 -> 23764 bytes .../pip/_vendor/msgpack/exceptions.py | 48 + .../site-packages/pip/_vendor/msgpack/ext.py | 170 + .../pip/_vendor/msgpack/fallback.py | 929 ++ .../pip/_vendor/packaging/LICENSE | 3 + .../pip/_vendor/packaging/LICENSE.APACHE | 177 + .../pip/_vendor/packaging/LICENSE.BSD | 23 + .../pip/_vendor/packaging/__init__.py | 15 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 516 bytes .../__pycache__/_elffile.cpython-310.pyc | Bin 0 -> 3309 bytes .../__pycache__/_manylinux.cpython-310.pyc | Bin 0 -> 6605 bytes .../__pycache__/_musllinux.cpython-310.pyc | Bin 0 -> 3450 bytes .../__pycache__/_parser.cpython-310.pyc | Bin 0 -> 9457 bytes .../__pycache__/_structures.cpython-310.pyc | Bin 0 -> 2780 bytes .../__pycache__/_tokenizer.cpython-310.pyc | Bin 0 -> 5897 bytes .../__pycache__/markers.cpython-310.pyc | Bin 0 -> 9424 bytes .../__pycache__/metadata.cpython-310.pyc | Bin 0 -> 22077 bytes .../__pycache__/pylock.cpython-310.pyc | Bin 0 -> 18700 bytes .../__pycache__/requirements.cpython-310.pyc | Bin 0 -> 2887 bytes .../__pycache__/specifiers.cpython-310.pyc | Bin 0 -> 32811 bytes .../__pycache__/tags.cpython-310.pyc | Bin 0 -> 16728 bytes .../__pycache__/utils.cpython-310.pyc | Bin 0 -> 4443 bytes .../__pycache__/version.cpython-310.pyc | Bin 0 -> 20062 bytes .../pip/_vendor/packaging/_elffile.py | 108 + .../pip/_vendor/packaging/_manylinux.py | 262 + .../pip/_vendor/packaging/_musllinux.py | 85 + .../pip/_vendor/packaging/_parser.py | 365 + .../pip/_vendor/packaging/_structures.py | 69 + .../pip/_vendor/packaging/_tokenizer.py | 193 + .../_vendor/packaging/licenses/__init__.py | 147 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 2581 bytes .../__pycache__/_spdx.cpython-310.pyc | Bin 0 -> 43557 bytes .../pip/_vendor/packaging/licenses/_spdx.py | 799 ++ .../pip/_vendor/packaging/markers.py | 388 + .../pip/_vendor/packaging/metadata.py | 978 ++ .../pip/_vendor/packaging/py.typed | 0 .../pip/_vendor/packaging/pylock.py | 635 ++ .../pip/_vendor/packaging/requirements.py | 86 + .../pip/_vendor/packaging/specifiers.py | 1068 ++ .../pip/_vendor/packaging/tags.py | 651 ++ .../pip/_vendor/packaging/utils.py | 158 + .../pip/_vendor/packaging/version.py | 792 ++ .../pip/_vendor/pkg_resources/LICENSE | 17 + .../pip/_vendor/pkg_resources/__init__.py | 3676 +++++++ .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 113921 bytes .../pip/_vendor/platformdirs/LICENSE | 21 + .../pip/_vendor/platformdirs/__init__.py | 631 ++ .../pip/_vendor/platformdirs/__main__.py | 55 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 15850 bytes .../__pycache__/__main__.cpython-310.pyc | Bin 0 -> 1396 bytes .../__pycache__/android.cpython-310.pyc | Bin 0 -> 7414 bytes .../__pycache__/api.cpython-310.pyc | Bin 0 -> 10233 bytes .../__pycache__/macos.cpython-310.pyc | Bin 0 -> 6551 bytes .../__pycache__/unix.cpython-310.pyc | Bin 0 -> 10573 bytes .../__pycache__/version.cpython-310.pyc | Bin 0 -> 671 bytes .../__pycache__/windows.cpython-310.pyc | Bin 0 -> 9160 bytes .../pip/_vendor/platformdirs/android.py | 249 + .../pip/_vendor/platformdirs/api.py | 299 + .../pip/_vendor/platformdirs/macos.py | 146 + .../pip/_vendor/platformdirs/py.typed | 0 .../pip/_vendor/platformdirs/unix.py | 272 + .../pip/_vendor/platformdirs/version.py | 34 + .../pip/_vendor/platformdirs/windows.py | 278 + .../pip/_vendor/pygments/LICENSE | 25 + .../pip/_vendor/pygments/__init__.py | 82 + .../pip/_vendor/pygments/__main__.py | 17 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 2928 bytes .../__pycache__/__main__.cpython-310.pyc | Bin 0 -> 581 bytes .../__pycache__/console.cpython-310.pyc | Bin 0 -> 1883 bytes .../__pycache__/filter.cpython-310.pyc | Bin 0 -> 2643 bytes .../__pycache__/formatter.cpython-310.pyc | Bin 0 -> 4094 bytes .../__pycache__/lexer.cpython-310.pyc | Bin 0 -> 26517 bytes .../__pycache__/modeline.cpython-310.pyc | Bin 0 -> 1186 bytes .../__pycache__/plugin.cpython-310.pyc | Bin 0 -> 1942 bytes .../__pycache__/regexopt.cpython-310.pyc | Bin 0 -> 2949 bytes .../__pycache__/scanner.cpython-310.pyc | Bin 0 -> 3551 bytes .../__pycache__/sphinxext.cpython-310.pyc | Bin 0 -> 7760 bytes .../__pycache__/style.cpython-310.pyc | Bin 0 -> 4607 bytes .../__pycache__/token.cpython-310.pyc | Bin 0 -> 4689 bytes .../__pycache__/unistring.cpython-310.pyc | Bin 0 -> 31223 bytes .../pygments/__pycache__/util.cpython-310.pyc | Bin 0 -> 10055 bytes .../pip/_vendor/pygments/console.py | 70 + .../pip/_vendor/pygments/filter.py | 70 + .../pip/_vendor/pygments/filters/__init__.py | 940 ++ .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 29615 bytes .../pip/_vendor/pygments/formatter.py | 129 + .../_vendor/pygments/formatters/__init__.py | 157 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 5012 bytes .../__pycache__/_mapping.cpython-310.pyc | Bin 0 -> 3993 bytes .../_vendor/pygments/formatters/_mapping.py | 23 + .../pip/_vendor/pygments/lexer.py | 963 ++ .../pip/_vendor/pygments/lexers/__init__.py | 362 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 10054 bytes .../__pycache__/_mapping.cpython-310.pyc | Bin 0 -> 66547 bytes .../lexers/__pycache__/python.cpython-310.pyc | Bin 0 -> 30211 bytes .../pip/_vendor/pygments/lexers/_mapping.py | 602 ++ .../pip/_vendor/pygments/lexers/python.py | 1201 +++ .../pip/_vendor/pygments/modeline.py | 43 + .../pip/_vendor/pygments/plugin.py | 72 + .../pip/_vendor/pygments/regexopt.py | 91 + .../pip/_vendor/pygments/scanner.py | 104 + .../pip/_vendor/pygments/sphinxext.py | 247 + .../pip/_vendor/pygments/style.py | 203 + .../pip/_vendor/pygments/styles/__init__.py | 61 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 2055 bytes .../__pycache__/_mapping.cpython-310.pyc | Bin 0 -> 3305 bytes .../pip/_vendor/pygments/styles/_mapping.py | 54 + .../pip/_vendor/pygments/token.py | 214 + .../pip/_vendor/pygments/unistring.py | 153 + .../pip/_vendor/pygments/util.py | 324 + .../pip/_vendor/pyproject_hooks/LICENSE | 21 + .../pip/_vendor/pyproject_hooks/__init__.py | 31 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 693 bytes .../__pycache__/_impl.cpython-310.pyc | Bin 0 -> 14087 bytes .../pip/_vendor/pyproject_hooks/_impl.py | 410 + .../pyproject_hooks/_in_process/__init__.py | 21 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 817 bytes .../__pycache__/_in_process.cpython-310.pyc | Bin 0 -> 10478 bytes .../_in_process/_in_process.py | 389 + .../pip/_vendor/pyproject_hooks/py.typed | 0 .../pip/_vendor/requests/LICENSE | 175 + .../pip/_vendor/requests/__init__.py | 179 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 3865 bytes .../__pycache__/__version__.cpython-310.pyc | Bin 0 -> 543 bytes .../_internal_utils.cpython-310.pyc | Bin 0 -> 1619 bytes .../__pycache__/adapters.cpython-310.pyc | Bin 0 -> 21736 bytes .../requests/__pycache__/api.cpython-310.pyc | Bin 0 -> 6719 bytes .../requests/__pycache__/auth.cpython-310.pyc | Bin 0 -> 8115 bytes .../__pycache__/certs.cpython-310.pyc | Bin 0 -> 632 bytes .../__pycache__/compat.cpython-310.pyc | Bin 0 -> 1704 bytes .../__pycache__/cookies.cpython-310.pyc | Bin 0 -> 18714 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 0 -> 6234 bytes .../requests/__pycache__/help.cpython-310.pyc | Bin 0 -> 2809 bytes .../__pycache__/hooks.cpython-310.pyc | Bin 0 -> 987 bytes .../__pycache__/models.cpython-310.pyc | Bin 0 -> 24376 bytes .../__pycache__/packages.cpython-310.pyc | Bin 0 -> 733 bytes .../__pycache__/sessions.cpython-310.pyc | Bin 0 -> 19725 bytes .../__pycache__/status_codes.cpython-310.pyc | Bin 0 -> 4737 bytes .../__pycache__/structures.cpython-310.pyc | Bin 0 -> 4431 bytes .../__pycache__/utils.cpython-310.pyc | Bin 0 -> 24534 bytes .../pip/_vendor/requests/__version__.py | 14 + .../pip/_vendor/requests/_internal_utils.py | 50 + .../pip/_vendor/requests/adapters.py | 696 ++ .../site-packages/pip/_vendor/requests/api.py | 157 + .../pip/_vendor/requests/auth.py | 314 + .../pip/_vendor/requests/certs.py | 17 + .../pip/_vendor/requests/compat.py | 90 + .../pip/_vendor/requests/cookies.py | 561 ++ .../pip/_vendor/requests/exceptions.py | 151 + .../pip/_vendor/requests/help.py | 127 + .../pip/_vendor/requests/hooks.py | 33 + .../pip/_vendor/requests/models.py | 1039 ++ .../pip/_vendor/requests/packages.py | 25 + .../pip/_vendor/requests/sessions.py | 831 ++ .../pip/_vendor/requests/status_codes.py | 128 + .../pip/_vendor/requests/structures.py | 99 + .../pip/_vendor/requests/utils.py | 1086 ++ .../pip/_vendor/resolvelib/LICENSE | 13 + .../pip/_vendor/resolvelib/__init__.py | 27 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 599 bytes .../__pycache__/providers.cpython-310.pyc | Bin 0 -> 9852 bytes .../__pycache__/reporters.cpython-310.pyc | Bin 0 -> 3269 bytes .../__pycache__/structs.cpython-310.pyc | Bin 0 -> 9220 bytes .../pip/_vendor/resolvelib/providers.py | 196 + .../pip/_vendor/resolvelib/py.typed | 0 .../pip/_vendor/resolvelib/reporters.py | 55 + .../_vendor/resolvelib/resolvers/__init__.py | 27 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 712 bytes .../__pycache__/abstract.cpython-310.pyc | Bin 0 -> 2259 bytes .../__pycache__/criterion.cpython-310.pyc | Bin 0 -> 2827 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 0 -> 3295 bytes .../__pycache__/resolution.cpython-310.pyc | Bin 0 -> 16536 bytes .../_vendor/resolvelib/resolvers/abstract.py | 47 + .../_vendor/resolvelib/resolvers/criterion.py | 48 + .../resolvelib/resolvers/exceptions.py | 57 + .../resolvelib/resolvers/resolution.py | 627 ++ .../pip/_vendor/resolvelib/structs.py | 209 + .../site-packages/pip/_vendor/rich/LICENSE | 19 + .../pip/_vendor/rich/__init__.py | 177 + .../pip/_vendor/rich/__main__.py | 245 + .../rich/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 6106 bytes .../rich/__pycache__/__main__.cpython-310.pyc | Bin 0 -> 6764 bytes .../__pycache__/_cell_widths.cpython-310.pyc | Bin 0 -> 7858 bytes .../__pycache__/_emoji_codes.cpython-310.pyc | Bin 0 -> 360047 bytes .../_emoji_replace.cpython-310.pyc | Bin 0 -> 1187 bytes .../_export_format.cpython-310.pyc | Bin 0 -> 2318 bytes .../__pycache__/_extension.cpython-310.pyc | Bin 0 -> 488 bytes .../rich/__pycache__/_fileno.cpython-310.pyc | Bin 0 -> 781 bytes .../rich/__pycache__/_inspect.cpython-310.pyc | Bin 0 -> 8616 bytes .../__pycache__/_log_render.cpython-310.pyc | Bin 0 -> 2633 bytes .../rich/__pycache__/_loop.cpython-310.pyc | Bin 0 -> 1285 bytes .../__pycache__/_null_file.cpython-310.pyc | Bin 0 -> 3236 bytes .../__pycache__/_palettes.cpython-310.pyc | Bin 0 -> 5090 bytes .../rich/__pycache__/_pick.cpython-310.pyc | Bin 0 -> 633 bytes .../rich/__pycache__/_ratio.cpython-310.pyc | Bin 0 -> 5038 bytes .../__pycache__/_spinners.cpython-310.pyc | Bin 0 -> 12264 bytes .../rich/__pycache__/_stack.cpython-310.pyc | Bin 0 -> 831 bytes .../rich/__pycache__/_timer.cpython-310.pyc | Bin 0 -> 680 bytes .../_win32_console.cpython-310.pyc | Bin 0 -> 18960 bytes .../rich/__pycache__/_windows.cpython-310.pyc | Bin 0 -> 1782 bytes .../_windows_renderer.cpython-310.pyc | Bin 0 -> 2036 bytes .../rich/__pycache__/_wrap.cpython-310.pyc | Bin 0 -> 2466 bytes .../rich/__pycache__/abc.cpython-310.pyc | Bin 0 -> 1307 bytes .../rich/__pycache__/align.cpython-310.pyc | Bin 0 -> 7927 bytes .../rich/__pycache__/ansi.cpython-310.pyc | Bin 0 -> 5988 bytes .../rich/__pycache__/bar.cpython-310.pyc | Bin 0 -> 2976 bytes .../rich/__pycache__/box.cpython-310.pyc | Bin 0 -> 8284 bytes .../rich/__pycache__/cells.cpython-310.pyc | Bin 0 -> 4267 bytes .../rich/__pycache__/color.cpython-310.pyc | Bin 0 -> 17709 bytes .../__pycache__/color_triplet.cpython-310.pyc | Bin 0 -> 1430 bytes .../rich/__pycache__/columns.cpython-310.pyc | Bin 0 -> 6190 bytes .../rich/__pycache__/console.cpython-310.pyc | Bin 0 -> 83774 bytes .../__pycache__/constrain.cpython-310.pyc | Bin 0 -> 1747 bytes .../__pycache__/containers.cpython-310.pyc | Bin 0 -> 6484 bytes .../rich/__pycache__/control.cpython-310.pyc | Bin 0 -> 8038 bytes .../default_styles.cpython-310.pyc | Bin 0 -> 6345 bytes .../rich/__pycache__/diagnose.cpython-310.pyc | Bin 0 -> 1247 bytes .../rich/__pycache__/emoji.cpython-310.pyc | Bin 0 -> 3163 bytes .../rich/__pycache__/errors.cpython-310.pyc | Bin 0 -> 1520 bytes .../__pycache__/file_proxy.cpython-310.pyc | Bin 0 -> 2393 bytes .../rich/__pycache__/filesize.cpython-310.pyc | Bin 0 -> 2611 bytes .../__pycache__/highlighter.cpython-310.pyc | Bin 0 -> 8054 bytes .../rich/__pycache__/json.cpython-310.pyc | Bin 0 -> 4724 bytes .../rich/__pycache__/jupyter.cpython-310.pyc | Bin 0 -> 3992 bytes .../rich/__pycache__/layout.cpython-310.pyc | Bin 0 -> 14640 bytes .../rich/__pycache__/live.cpython-310.pyc | Bin 0 -> 12477 bytes .../__pycache__/live_render.cpython-310.pyc | Bin 0 -> 3283 bytes .../rich/__pycache__/logging.cpython-310.pyc | Bin 0 -> 10321 bytes .../rich/__pycache__/markup.cpython-310.pyc | Bin 0 -> 6149 bytes .../rich/__pycache__/measure.cpython-310.pyc | Bin 0 -> 5069 bytes .../rich/__pycache__/padding.cpython-310.pyc | Bin 0 -> 4418 bytes .../rich/__pycache__/pager.cpython-310.pyc | Bin 0 -> 1469 bytes .../rich/__pycache__/palette.cpython-310.pyc | Bin 0 -> 3701 bytes .../rich/__pycache__/panel.cpython-310.pyc | Bin 0 -> 7904 bytes .../rich/__pycache__/pretty.cpython-310.pyc | Bin 0 -> 27802 bytes .../rich/__pycache__/progress.cpython-310.pyc | Bin 0 -> 55306 bytes .../__pycache__/progress_bar.cpython-310.pyc | Bin 0 -> 6904 bytes .../rich/__pycache__/prompt.cpython-310.pyc | Bin 0 -> 12188 bytes .../rich/__pycache__/protocol.cpython-310.pyc | Bin 0 -> 1345 bytes .../rich/__pycache__/region.cpython-310.pyc | Bin 0 -> 520 bytes .../rich/__pycache__/repr.cpython-310.pyc | Bin 0 -> 4089 bytes .../rich/__pycache__/rule.cpython-310.pyc | Bin 0 -> 3936 bytes .../rich/__pycache__/scope.cpython-310.pyc | Bin 0 -> 2982 bytes .../rich/__pycache__/screen.cpython-310.pyc | Bin 0 -> 1872 bytes .../rich/__pycache__/segment.cpython-310.pyc | Bin 0 -> 21206 bytes .../rich/__pycache__/spinner.cpython-310.pyc | Bin 0 -> 4269 bytes .../rich/__pycache__/status.cpython-310.pyc | Bin 0 -> 4586 bytes .../rich/__pycache__/style.cpython-310.pyc | Bin 0 -> 21366 bytes .../rich/__pycache__/styled.cpython-310.pyc | Bin 0 -> 1756 bytes .../rich/__pycache__/syntax.cpython-310.pyc | Bin 0 -> 27402 bytes .../rich/__pycache__/table.cpython-310.pyc | Bin 0 -> 30134 bytes .../terminal_theme.cpython-310.pyc | Bin 0 -> 3009 bytes .../rich/__pycache__/text.cpython-310.pyc | Bin 0 -> 41772 bytes .../rich/__pycache__/theme.cpython-310.pyc | Bin 0 -> 4825 bytes .../rich/__pycache__/themes.cpython-310.pyc | Bin 0 -> 286 bytes .../__pycache__/traceback.cpython-310.pyc | Bin 0 -> 24411 bytes .../rich/__pycache__/tree.cpython-310.pyc | Bin 0 -> 7634 bytes .../pip/_vendor/rich/_cell_widths.py | 454 + .../pip/_vendor/rich/_emoji_codes.py | 3610 +++++++ .../pip/_vendor/rich/_emoji_replace.py | 32 + .../pip/_vendor/rich/_export_format.py | 76 + .../pip/_vendor/rich/_extension.py | 10 + .../site-packages/pip/_vendor/rich/_fileno.py | 24 + .../pip/_vendor/rich/_inspect.py | 268 + .../pip/_vendor/rich/_log_render.py | 94 + .../site-packages/pip/_vendor/rich/_loop.py | 43 + .../pip/_vendor/rich/_null_file.py | 69 + .../pip/_vendor/rich/_palettes.py | 309 + .../site-packages/pip/_vendor/rich/_pick.py | 17 + .../site-packages/pip/_vendor/rich/_ratio.py | 153 + .../pip/_vendor/rich/_spinners.py | 482 + .../site-packages/pip/_vendor/rich/_stack.py | 16 + .../site-packages/pip/_vendor/rich/_timer.py | 19 + .../pip/_vendor/rich/_win32_console.py | 661 ++ .../pip/_vendor/rich/_windows.py | 71 + .../pip/_vendor/rich/_windows_renderer.py | 56 + .../site-packages/pip/_vendor/rich/_wrap.py | 93 + .../site-packages/pip/_vendor/rich/abc.py | 33 + .../site-packages/pip/_vendor/rich/align.py | 306 + .../site-packages/pip/_vendor/rich/ansi.py | 241 + .../site-packages/pip/_vendor/rich/bar.py | 93 + .../site-packages/pip/_vendor/rich/box.py | 474 + .../site-packages/pip/_vendor/rich/cells.py | 174 + .../site-packages/pip/_vendor/rich/color.py | 621 ++ .../pip/_vendor/rich/color_triplet.py | 38 + .../site-packages/pip/_vendor/rich/columns.py | 187 + .../site-packages/pip/_vendor/rich/console.py | 2680 +++++ .../pip/_vendor/rich/constrain.py | 37 + .../pip/_vendor/rich/containers.py | 167 + .../site-packages/pip/_vendor/rich/control.py | 219 + .../pip/_vendor/rich/default_styles.py | 193 + .../pip/_vendor/rich/diagnose.py | 39 + .../site-packages/pip/_vendor/rich/emoji.py | 91 + .../site-packages/pip/_vendor/rich/errors.py | 34 + .../pip/_vendor/rich/file_proxy.py | 57 + .../pip/_vendor/rich/filesize.py | 88 + .../pip/_vendor/rich/highlighter.py | 232 + .../site-packages/pip/_vendor/rich/json.py | 139 + .../site-packages/pip/_vendor/rich/jupyter.py | 101 + .../site-packages/pip/_vendor/rich/layout.py | 442 + .../site-packages/pip/_vendor/rich/live.py | 400 + .../pip/_vendor/rich/live_render.py | 106 + .../site-packages/pip/_vendor/rich/logging.py | 297 + .../site-packages/pip/_vendor/rich/markup.py | 251 + .../site-packages/pip/_vendor/rich/measure.py | 151 + .../site-packages/pip/_vendor/rich/padding.py | 141 + .../site-packages/pip/_vendor/rich/pager.py | 34 + .../site-packages/pip/_vendor/rich/palette.py | 100 + .../site-packages/pip/_vendor/rich/panel.py | 317 + .../site-packages/pip/_vendor/rich/pretty.py | 1016 ++ .../pip/_vendor/rich/progress.py | 1715 ++++ .../pip/_vendor/rich/progress_bar.py | 223 + .../site-packages/pip/_vendor/rich/prompt.py | 400 + .../pip/_vendor/rich/protocol.py | 42 + .../site-packages/pip/_vendor/rich/py.typed | 0 .../site-packages/pip/_vendor/rich/region.py | 10 + .../site-packages/pip/_vendor/rich/repr.py | 149 + .../site-packages/pip/_vendor/rich/rule.py | 130 + .../site-packages/pip/_vendor/rich/scope.py | 86 + .../site-packages/pip/_vendor/rich/screen.py | 54 + .../site-packages/pip/_vendor/rich/segment.py | 752 ++ .../site-packages/pip/_vendor/rich/spinner.py | 132 + .../site-packages/pip/_vendor/rich/status.py | 131 + .../site-packages/pip/_vendor/rich/style.py | 792 ++ .../site-packages/pip/_vendor/rich/styled.py | 42 + .../site-packages/pip/_vendor/rich/syntax.py | 985 ++ .../site-packages/pip/_vendor/rich/table.py | 1006 ++ .../pip/_vendor/rich/terminal_theme.py | 153 + .../site-packages/pip/_vendor/rich/text.py | 1361 +++ .../site-packages/pip/_vendor/rich/theme.py | 115 + .../site-packages/pip/_vendor/rich/themes.py | 5 + .../pip/_vendor/rich/traceback.py | 899 ++ .../site-packages/pip/_vendor/rich/tree.py | 257 + .../site-packages/pip/_vendor/tomli/LICENSE | 21 + .../pip/_vendor/tomli/__init__.py | 8 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 318 bytes .../tomli/__pycache__/_parser.cpython-310.pyc | Bin 0 -> 18734 bytes .../tomli/__pycache__/_re.cpython-310.pyc | Bin 0 -> 3021 bytes .../tomli/__pycache__/_types.cpython-310.pyc | Bin 0 -> 318 bytes .../pip/_vendor/tomli/_parser.py | 777 ++ .../site-packages/pip/_vendor/tomli/_re.py | 115 + .../site-packages/pip/_vendor/tomli/_types.py | 10 + .../site-packages/pip/_vendor/tomli/py.typed | 1 + .../site-packages/pip/_vendor/tomli_w/LICENSE | 21 + .../pip/_vendor/tomli_w/__init__.py | 4 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 309 bytes .../__pycache__/_writer.cpython-310.pyc | Bin 0 -> 6895 bytes .../pip/_vendor/tomli_w/_writer.py | 229 + .../pip/_vendor/tomli_w/py.typed | 1 + .../pip/_vendor/truststore/LICENSE | 21 + .../pip/_vendor/truststore/__init__.py | 36 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1013 bytes .../__pycache__/_api.cpython-310.pyc | Bin 0 -> 10800 bytes .../__pycache__/_macos.cpython-310.pyc | Bin 0 -> 10087 bytes .../__pycache__/_openssl.cpython-310.pyc | Bin 0 -> 1526 bytes .../_ssl_constants.cpython-310.pyc | Bin 0 -> 789 bytes .../__pycache__/_windows.cpython-310.pyc | Bin 0 -> 10569 bytes .../pip/_vendor/truststore/_api.py | 341 + .../pip/_vendor/truststore/_macos.py | 571 ++ .../pip/_vendor/truststore/_openssl.py | 68 + .../pip/_vendor/truststore/_ssl_constants.py | 31 + .../pip/_vendor/truststore/_windows.py | 567 ++ .../pip/_vendor/truststore/py.typed | 0 .../pip/_vendor/urllib3/LICENSE.txt | 21 + .../pip/_vendor/urllib3/__init__.py | 102 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 2502 bytes .../__pycache__/_collections.cpython-310.pyc | Bin 0 -> 11347 bytes .../__pycache__/_version.cpython-310.pyc | Bin 0 -> 207 bytes .../__pycache__/connection.cpython-310.pyc | Bin 0 -> 13694 bytes .../connectionpool.cpython-310.pyc | Bin 0 -> 25934 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 0 -> 10987 bytes .../__pycache__/fields.cpython-310.pyc | Bin 0 -> 8176 bytes .../__pycache__/filepost.cpython-310.pyc | Bin 0 -> 2743 bytes .../__pycache__/poolmanager.cpython-310.pyc | Bin 0 -> 15153 bytes .../__pycache__/request.cpython-310.pyc | Bin 0 -> 6375 bytes .../__pycache__/response.cpython-310.pyc | Bin 0 -> 22493 bytes .../pip/_vendor/urllib3/_collections.py | 355 + .../pip/_vendor/urllib3/_version.py | 2 + .../pip/_vendor/urllib3/connection.py | 572 ++ .../pip/_vendor/urllib3/connectionpool.py | 1140 +++ .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 192 bytes .../_appengine_environ.cpython-310.pyc | Bin 0 -> 1372 bytes .../__pycache__/appengine.cpython-310.pyc | Bin 0 -> 8189 bytes .../__pycache__/ntlmpool.cpython-310.pyc | Bin 0 -> 3616 bytes .../__pycache__/pyopenssl.cpython-310.pyc | Bin 0 -> 15802 bytes .../securetransport.cpython-310.pyc | Bin 0 -> 21931 bytes .../contrib/__pycache__/socks.cpython-310.pyc | Bin 0 -> 5594 bytes .../urllib3/contrib/_appengine_environ.py | 36 + .../contrib/_securetransport/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 209 bytes .../__pycache__/bindings.cpython-310.pyc | Bin 0 -> 10705 bytes .../__pycache__/low_level.cpython-310.pyc | Bin 0 -> 9092 bytes .../contrib/_securetransport/bindings.py | 519 + .../contrib/_securetransport/low_level.py | 397 + .../pip/_vendor/urllib3/contrib/appengine.py | 314 + .../pip/_vendor/urllib3/contrib/ntlmpool.py | 130 + .../pip/_vendor/urllib3/contrib/pyopenssl.py | 518 + .../urllib3/contrib/securetransport.py | 920 ++ .../pip/_vendor/urllib3/contrib/socks.py | 216 + .../pip/_vendor/urllib3/exceptions.py | 323 + .../pip/_vendor/urllib3/fields.py | 274 + .../pip/_vendor/urllib3/filepost.py | 98 + .../pip/_vendor/urllib3/packages/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 193 bytes .../packages/__pycache__/six.cpython-310.pyc | Bin 0 -> 27647 bytes .../urllib3/packages/backports/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 203 bytes .../__pycache__/makefile.cpython-310.pyc | Bin 0 -> 1303 bytes .../weakref_finalize.cpython-310.pyc | Bin 0 -> 4901 bytes .../urllib3/packages/backports/makefile.py | 51 + .../packages/backports/weakref_finalize.py | 155 + .../pip/_vendor/urllib3/packages/six.py | 1076 ++ .../pip/_vendor/urllib3/poolmanager.py | 540 + .../pip/_vendor/urllib3/request.py | 191 + .../pip/_vendor/urllib3/response.py | 879 ++ .../pip/_vendor/urllib3/util/__init__.py | 49 + .../util/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1102 bytes .../__pycache__/connection.cpython-310.pyc | Bin 0 -> 3430 bytes .../util/__pycache__/proxy.cpython-310.pyc | Bin 0 -> 1335 bytes .../util/__pycache__/queue.cpython-310.pyc | Bin 0 -> 1057 bytes .../util/__pycache__/request.cpython-310.pyc | Bin 0 -> 3364 bytes .../util/__pycache__/response.cpython-310.pyc | Bin 0 -> 2350 bytes .../util/__pycache__/retry.cpython-310.pyc | Bin 0 -> 16177 bytes .../util/__pycache__/ssl_.cpython-310.pyc | Bin 0 -> 11544 bytes .../ssl_match_hostname.cpython-310.pyc | Bin 0 -> 3254 bytes .../__pycache__/ssltransport.cpython-310.pyc | Bin 0 -> 7392 bytes .../util/__pycache__/timeout.cpython-310.pyc | Bin 0 -> 9129 bytes .../util/__pycache__/url.cpython-310.pyc | Bin 0 -> 10706 bytes .../util/__pycache__/wait.cpython-310.pyc | Bin 0 -> 3086 bytes .../pip/_vendor/urllib3/util/connection.py | 149 + .../pip/_vendor/urllib3/util/proxy.py | 57 + .../pip/_vendor/urllib3/util/queue.py | 22 + .../pip/_vendor/urllib3/util/request.py | 137 + .../pip/_vendor/urllib3/util/response.py | 107 + .../pip/_vendor/urllib3/util/retry.py | 622 ++ .../pip/_vendor/urllib3/util/ssl_.py | 504 + .../urllib3/util/ssl_match_hostname.py | 159 + .../pip/_vendor/urllib3/util/ssltransport.py | 221 + .../pip/_vendor/urllib3/util/timeout.py | 271 + .../pip/_vendor/urllib3/util/url.py | 435 + .../pip/_vendor/urllib3/util/wait.py | 152 + .../site-packages/pip/_vendor/vendor.txt | 19 + .../lib/python3.10/site-packages/pip/py.typed | 4 + .../site-packages/pkg_resources/__init__.py | 3303 ++++++ .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 100594 bytes .../pkg_resources/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 186 bytes .../__pycache__/appdirs.cpython-310.pyc | Bin 0 -> 20247 bytes .../__pycache__/pyparsing.cpython-310.pyc | Bin 0 -> 198739 bytes .../pkg_resources/_vendor/appdirs.py | 608 ++ .../_vendor/packaging/__about__.py | 26 + .../_vendor/packaging/__init__.py | 25 + .../__pycache__/__about__.cpython-310.pyc | Bin 0 -> 593 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 449 bytes .../__pycache__/_manylinux.cpython-310.pyc | Bin 0 -> 7303 bytes .../__pycache__/_musllinux.cpython-310.pyc | Bin 0 -> 4615 bytes .../__pycache__/_structures.cpython-310.pyc | Bin 0 -> 2973 bytes .../__pycache__/markers.cpython-310.pyc | Bin 0 -> 9299 bytes .../__pycache__/requirements.cpython-310.pyc | Bin 0 -> 3987 bytes .../__pycache__/specifiers.cpython-310.pyc | Bin 0 -> 22191 bytes .../__pycache__/tags.cpython-310.pyc | Bin 0 -> 12217 bytes .../__pycache__/utils.cpython-310.pyc | Bin 0 -> 3578 bytes .../__pycache__/version.cpython-310.pyc | Bin 0 -> 12928 bytes .../_vendor/packaging/_manylinux.py | 301 + .../_vendor/packaging/_musllinux.py | 136 + .../_vendor/packaging/_structures.py | 67 + .../_vendor/packaging/markers.py | 304 + .../_vendor/packaging/requirements.py | 146 + .../_vendor/packaging/specifiers.py | 828 ++ .../pkg_resources/_vendor/packaging/tags.py | 484 + .../pkg_resources/_vendor/packaging/utils.py | 136 + .../_vendor/packaging/version.py | 504 + .../pkg_resources/_vendor/pyparsing.py | 5742 +++++++++++ .../pkg_resources/extern/__init__.py | 73 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 2894 bytes .../__pycache__/setup.cpython-310.pyc | Bin 0 -> 314 bytes .../data/my-test-package-source/setup.py | 6 + .../pydantic-2.12.5.dist-info/INSTALLER | 1 + .../pydantic-2.12.5.dist-info/METADATA | 1029 ++ .../pydantic-2.12.5.dist-info/RECORD | 217 + .../pydantic-2.12.5.dist-info/WHEEL | 4 + .../licenses/LICENSE | 21 + .../site-packages/pydantic/__init__.py | 456 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 8469 bytes .../__pycache__/_migration.cpython-310.pyc | Bin 0 -> 10262 bytes .../alias_generators.cpython-310.pyc | Bin 0 -> 2181 bytes .../__pycache__/aliases.cpython-310.pyc | Bin 0 -> 5419 bytes .../annotated_handlers.cpython-310.pyc | Bin 0 -> 5213 bytes .../class_validators.cpython-310.pyc | Bin 0 -> 338 bytes .../__pycache__/color.cpython-310.pyc | Bin 0 -> 22229 bytes .../__pycache__/config.cpython-310.pyc | Bin 0 -> 6398 bytes .../__pycache__/dataclasses.cpython-310.pyc | Bin 0 -> 12898 bytes .../datetime_parse.cpython-310.pyc | Bin 0 -> 338 bytes .../__pycache__/decorator.cpython-310.pyc | Bin 0 -> 328 bytes .../__pycache__/env_settings.cpython-310.pyc | Bin 0 -> 334 bytes .../error_wrappers.cpython-310.pyc | Bin 0 -> 338 bytes .../__pycache__/errors.cpython-310.pyc | Bin 0 -> 6674 bytes .../__pycache__/fields.cpython-310.pyc | Bin 0 -> 55319 bytes .../functional_serializers.cpython-310.pyc | Bin 0 -> 14832 bytes .../functional_validators.cpython-310.pyc | Bin 0 -> 28436 bytes .../__pycache__/generics.cpython-310.pyc | Bin 0 -> 326 bytes .../pydantic/__pycache__/json.cpython-310.pyc | Bin 0 -> 318 bytes .../__pycache__/json_schema.cpython-310.pyc | Bin 0 -> 91059 bytes .../pydantic/__pycache__/main.cpython-310.pyc | Bin 0 -> 57568 bytes .../pydantic/__pycache__/mypy.cpython-310.pyc | Bin 0 -> 39397 bytes .../__pycache__/networks.cpython-310.pyc | Bin 0 -> 39889 bytes .../__pycache__/parse.cpython-310.pyc | Bin 0 -> 320 bytes .../__pycache__/root_model.cpython-310.pyc | Bin 0 -> 6414 bytes .../__pycache__/schema.cpython-310.pyc | Bin 0 -> 322 bytes .../__pycache__/tools.cpython-310.pyc | Bin 0 -> 320 bytes .../__pycache__/type_adapter.cpython-310.pyc | Bin 0 -> 29386 bytes .../__pycache__/types.cpython-310.pyc | Bin 0 -> 77862 bytes .../__pycache__/typing.cpython-310.pyc | Bin 0 -> 318 bytes .../__pycache__/utils.cpython-310.pyc | Bin 0 -> 320 bytes .../validate_call_decorator.cpython-310.pyc | Bin 0 -> 4019 bytes .../__pycache__/validators.cpython-310.pyc | Bin 0 -> 330 bytes .../__pycache__/version.cpython-310.pyc | Bin 0 -> 3514 bytes .../__pycache__/warnings.cpython-310.pyc | Bin 0 -> 6029 bytes .../pydantic/_internal/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 183 bytes .../__pycache__/_config.cpython-310.pyc | Bin 0 -> 11680 bytes .../_core_metadata.cpython-310.pyc | Bin 0 -> 3987 bytes .../__pycache__/_core_utils.cpython-310.pyc | Bin 0 -> 5856 bytes .../__pycache__/_dataclasses.cpython-310.pyc | Bin 0 -> 10821 bytes .../__pycache__/_decorators.cpython-310.pyc | Bin 0 -> 28335 bytes .../_decorators_v1.cpython-310.pyc | Bin 0 -> 7318 bytes .../_discriminated_union.cpython-310.pyc | Bin 0 -> 15122 bytes .../_docs_extraction.cpython-310.pyc | Bin 0 -> 3470 bytes .../__pycache__/_fields.cpython-310.pyc | Bin 0 -> 16289 bytes .../__pycache__/_forward_ref.cpython-310.pyc | Bin 0 -> 1178 bytes .../_generate_schema.cpython-310.pyc | Bin 0 -> 81069 bytes .../__pycache__/_generics.cpython-310.pyc | Bin 0 -> 18504 bytes .../__pycache__/_git.cpython-310.pyc | Bin 0 -> 1201 bytes .../__pycache__/_import_utils.cpython-310.pyc | Bin 0 -> 704 bytes .../_internal_dataclass.cpython-310.pyc | Bin 0 -> 287 bytes .../_known_annotated_metadata.cpython-310.pyc | Bin 0 -> 10554 bytes .../__pycache__/_mock_val_ser.cpython-310.pyc | Bin 0 -> 8553 bytes .../_model_construction.cpython-310.pyc | Bin 0 -> 25495 bytes .../_namespace_utils.cpython-310.pyc | Bin 0 -> 10578 bytes .../__pycache__/_repr.cpython-310.pyc | Bin 0 -> 5544 bytes .../_schema_gather.cpython-310.pyc | Bin 0 -> 5470 bytes .../_schema_generation_shared.cpython-310.pyc | Bin 0 -> 5165 bytes .../__pycache__/_serializers.cpython-310.pyc | Bin 0 -> 1300 bytes .../__pycache__/_signature.cpython-310.pyc | Bin 0 -> 4868 bytes .../__pycache__/_typing_extra.cpython-310.pyc | Bin 0 -> 20935 bytes .../__pycache__/_utils.cpython-310.pyc | Bin 0 -> 15703 bytes .../_validate_call.cpython-310.pyc | Bin 0 -> 4369 bytes .../__pycache__/_validators.cpython-310.pyc | Bin 0 -> 15756 bytes .../pydantic/_internal/_config.py | 383 + .../pydantic/_internal/_core_metadata.py | 97 + .../pydantic/_internal/_core_utils.py | 174 + .../pydantic/_internal/_dataclasses.py | 315 + .../pydantic/_internal/_decorators.py | 858 ++ .../pydantic/_internal/_decorators_v1.py | 174 + .../_internal/_discriminated_union.py | 479 + .../pydantic/_internal/_docs_extraction.py | 113 + .../pydantic/_internal/_fields.py | 635 ++ .../pydantic/_internal/_forward_ref.py | 23 + .../pydantic/_internal/_generate_schema.py | 2867 ++++++ .../pydantic/_internal/_generics.py | 543 + .../site-packages/pydantic/_internal/_git.py | 27 + .../pydantic/_internal/_import_utils.py | 20 + .../pydantic/_internal/_internal_dataclass.py | 7 + .../_internal/_known_annotated_metadata.py | 401 + .../pydantic/_internal/_mock_val_ser.py | 228 + .../pydantic/_internal/_model_construction.py | 848 ++ .../pydantic/_internal/_namespace_utils.py | 293 + .../site-packages/pydantic/_internal/_repr.py | 124 + .../pydantic/_internal/_schema_gather.py | 209 + .../_internal/_schema_generation_shared.py | 125 + .../pydantic/_internal/_serializers.py | 53 + .../pydantic/_internal/_signature.py | 188 + .../pydantic/_internal/_typing_extra.py | 760 ++ .../pydantic/_internal/_utils.py | 446 + .../pydantic/_internal/_validate_call.py | 140 + .../pydantic/_internal/_validators.py | 533 + .../site-packages/pydantic/_migration.py | 316 + .../pydantic/alias_generators.py | 62 + .../site-packages/pydantic/aliases.py | 135 + .../pydantic/annotated_handlers.py | 122 + .../pydantic/class_validators.py | 5 + .../site-packages/pydantic/color.py | 604 ++ .../site-packages/pydantic/config.py | 1288 +++ .../site-packages/pydantic/dataclasses.py | 413 + .../site-packages/pydantic/datetime_parse.py | 5 + .../site-packages/pydantic/decorator.py | 5 + .../pydantic/deprecated/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 184 bytes .../class_validators.cpython-310.pyc | Bin 0 -> 9864 bytes .../__pycache__/config.cpython-310.pyc | Bin 0 -> 3116 bytes .../copy_internals.cpython-310.pyc | Bin 0 -> 5052 bytes .../__pycache__/decorator.cpython-310.pyc | Bin 0 -> 8747 bytes .../__pycache__/json.cpython-310.pyc | Bin 0 -> 4271 bytes .../__pycache__/parse.cpython-310.pyc | Bin 0 -> 2249 bytes .../__pycache__/tools.cpython-310.pyc | Bin 0 -> 2695 bytes .../pydantic/deprecated/class_validators.py | 256 + .../pydantic/deprecated/config.py | 72 + .../pydantic/deprecated/copy_internals.py | 224 + .../pydantic/deprecated/decorator.py | 284 + .../site-packages/pydantic/deprecated/json.py | 141 + .../pydantic/deprecated/parse.py | 80 + .../pydantic/deprecated/tools.py | 103 + .../site-packages/pydantic/env_settings.py | 5 + .../site-packages/pydantic/error_wrappers.py | 5 + .../site-packages/pydantic/errors.py | 189 + .../pydantic/experimental/__init__.py | 1 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 295 bytes .../arguments_schema.cpython-310.pyc | Bin 0 -> 2045 bytes .../missing_sentinel.cpython-310.pyc | Bin 0 -> 332 bytes .../__pycache__/pipeline.cpython-310.pyc | Bin 0 -> 23113 bytes .../pydantic/experimental/arguments_schema.py | 44 + .../pydantic/experimental/missing_sentinel.py | 5 + .../pydantic/experimental/pipeline.py | 654 ++ .../site-packages/pydantic/fields.py | 1834 ++++ .../pydantic/functional_serializers.py | 451 + .../pydantic/functional_validators.py | 893 ++ .../site-packages/pydantic/generics.py | 5 + .../python3.10/site-packages/pydantic/json.py | 5 + .../site-packages/pydantic/json_schema.py | 2854 ++++++ .../python3.10/site-packages/pydantic/main.py | 1819 ++++ .../python3.10/site-packages/pydantic/mypy.py | 1374 +++ .../site-packages/pydantic/networks.py | 1331 +++ .../site-packages/pydantic/parse.py | 5 + .../site-packages/pydantic/plugin/__init__.py | 193 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 8494 bytes .../__pycache__/_loader.cpython-310.pyc | Bin 0 -> 1646 bytes .../_schema_validator.cpython-310.pyc | Bin 0 -> 4965 bytes .../site-packages/pydantic/plugin/_loader.py | 58 + .../pydantic/plugin/_schema_validator.py | 140 + .../site-packages/pydantic/py.typed | 0 .../site-packages/pydantic/root_model.py | 155 + .../site-packages/pydantic/schema.py | 5 + .../site-packages/pydantic/tools.py | 5 + .../site-packages/pydantic/type_adapter.py | 795 ++ .../site-packages/pydantic/types.py | 3295 ++++++ .../site-packages/pydantic/typing.py | 5 + .../site-packages/pydantic/utils.py | 5 + .../site-packages/pydantic/v1/__init__.py | 142 + .../v1/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 2386 bytes .../_hypothesis_plugin.cpython-310.pyc | Bin 0 -> 10251 bytes .../annotated_types.cpython-310.pyc | Bin 0 -> 3179 bytes .../class_validators.cpython-310.pyc | Bin 0 -> 13680 bytes .../v1/__pycache__/color.cpython-310.pyc | Bin 0 -> 18101 bytes .../v1/__pycache__/config.cpython-310.pyc | Bin 0 -> 6102 bytes .../__pycache__/dataclasses.cpython-310.pyc | Bin 0 -> 15200 bytes .../datetime_parse.cpython-310.pyc | Bin 0 -> 6634 bytes .../v1/__pycache__/decorator.cpython-310.pyc | Bin 0 -> 8791 bytes .../__pycache__/env_settings.cpython-310.pyc | Bin 0 -> 11919 bytes .../error_wrappers.cpython-310.pyc | Bin 0 -> 5991 bytes .../v1/__pycache__/errors.cpython-310.pyc | Bin 0 -> 22702 bytes .../v1/__pycache__/fields.cpython-310.pyc | Bin 0 -> 34905 bytes .../v1/__pycache__/generics.cpython-310.pyc | Bin 0 -> 11479 bytes .../v1/__pycache__/json.cpython-310.pyc | Bin 0 -> 3644 bytes .../v1/__pycache__/main.cpython-310.pyc | Bin 0 -> 29765 bytes .../v1/__pycache__/mypy.cpython-310.pyc | Bin 0 -> 29214 bytes .../v1/__pycache__/networks.cpython-310.pyc | Bin 0 -> 20245 bytes .../v1/__pycache__/parse.cpython-310.pyc | Bin 0 -> 1778 bytes .../v1/__pycache__/schema.cpython-310.pyc | Bin 0 -> 32718 bytes .../v1/__pycache__/tools.cpython-310.pyc | Bin 0 -> 2812 bytes .../v1/__pycache__/types.cpython-310.pyc | Bin 0 -> 32804 bytes .../v1/__pycache__/typing.cpython-310.pyc | Bin 0 -> 14951 bytes .../v1/__pycache__/utils.cpython-310.pyc | Bin 0 -> 25706 bytes .../v1/__pycache__/validators.cpython-310.pyc | Bin 0 -> 18707 bytes .../v1/__pycache__/version.cpython-310.pyc | Bin 0 -> 1295 bytes .../pydantic/v1/_hypothesis_plugin.py | 391 + .../pydantic/v1/annotated_types.py | 72 + .../pydantic/v1/class_validators.py | 361 + .../site-packages/pydantic/v1/color.py | 494 + .../site-packages/pydantic/v1/config.py | 191 + .../site-packages/pydantic/v1/dataclasses.py | 500 + .../pydantic/v1/datetime_parse.py | 248 + .../site-packages/pydantic/v1/decorator.py | 264 + .../site-packages/pydantic/v1/env_settings.py | 350 + .../pydantic/v1/error_wrappers.py | 161 + .../site-packages/pydantic/v1/errors.py | 646 ++ .../site-packages/pydantic/v1/fields.py | 1253 +++ .../site-packages/pydantic/v1/generics.py | 400 + .../site-packages/pydantic/v1/json.py | 112 + .../site-packages/pydantic/v1/main.py | 1113 +++ .../site-packages/pydantic/v1/mypy.py | 949 ++ .../site-packages/pydantic/v1/networks.py | 747 ++ .../site-packages/pydantic/v1/parse.py | 66 + .../site-packages/pydantic/v1/py.typed | 0 .../site-packages/pydantic/v1/schema.py | 1163 +++ .../site-packages/pydantic/v1/tools.py | 92 + .../site-packages/pydantic/v1/types.py | 1205 +++ .../site-packages/pydantic/v1/typing.py | 614 ++ .../site-packages/pydantic/v1/utils.py | 806 ++ .../site-packages/pydantic/v1/validators.py | 768 ++ .../site-packages/pydantic/v1/version.py | 38 + .../pydantic/validate_call_decorator.py | 116 + .../site-packages/pydantic/validators.py | 5 + .../site-packages/pydantic/version.py | 113 + .../site-packages/pydantic/warnings.py | 122 + .../pydantic_core-2.41.5.dist-info/INSTALLER | 1 + .../pydantic_core-2.41.5.dist-info/METADATA | 180 + .../pydantic_core-2.41.5.dist-info/RECORD | 12 + .../pydantic_core-2.41.5.dist-info/WHEEL | 4 + .../licenses/LICENSE | 21 + .../site-packages/pydantic_core/__init__.py | 171 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 2779 bytes .../__pycache__/core_schema.cpython-310.pyc | Bin 0 -> 134097 bytes ...antic_core.cpython-310-x86_64-linux-gnu.so | Bin 0 -> 4861312 bytes .../pydantic_core/_pydantic_core.pyi | 1046 ++ .../pydantic_core/core_schema.py | 4435 +++++++++ .../site-packages/pydantic_core/py.typed | 0 .../INSTALLER | 1 + .../METADATA | 40 + .../python_multipart-0.0.22.dist-info/RECORD | 23 + .../REQUESTED | 0 .../python_multipart-0.0.22.dist-info/WHEEL | 4 + .../licenses/LICENSE.txt | 14 + .../python_multipart/__init__.py | 25 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 541 bytes .../__pycache__/decoders.cpython-310.pyc | Bin 0 -> 6354 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 0 -> 1551 bytes .../__pycache__/multipart.cpython-310.pyc | Bin 0 -> 49002 bytes .../python_multipart/decoders.py | 185 + .../python_multipart/exceptions.py | 34 + .../python_multipart/multipart.py | 1874 ++++ .../site-packages/python_multipart/py.typed | 0 .../requests-2.32.5.dist-info/INSTALLER | 1 + .../requests-2.32.5.dist-info/METADATA | 133 + .../requests-2.32.5.dist-info/RECORD | 42 + .../requests-2.32.5.dist-info/WHEEL | 5 + .../licenses/LICENSE | 175 + .../requests-2.32.5.dist-info/top_level.txt | 1 + .../site-packages/requests/__init__.py | 184 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 3917 bytes .../__pycache__/__version__.cpython-310.pyc | Bin 0 -> 531 bytes .../_internal_utils.cpython-310.pyc | Bin 0 -> 1607 bytes .../__pycache__/adapters.cpython-310.pyc | Bin 0 -> 21664 bytes .../requests/__pycache__/api.cpython-310.pyc | Bin 0 -> 6707 bytes .../requests/__pycache__/auth.cpython-310.pyc | Bin 0 -> 8103 bytes .../__pycache__/certs.cpython-310.pyc | Bin 0 -> 608 bytes .../__pycache__/compat.cpython-310.pyc | Bin 0 -> 1939 bytes .../__pycache__/cookies.cpython-310.pyc | Bin 0 -> 18702 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 0 -> 6210 bytes .../requests/__pycache__/help.cpython-310.pyc | Bin 0 -> 2830 bytes .../__pycache__/hooks.cpython-310.pyc | Bin 0 -> 975 bytes .../__pycache__/models.cpython-310.pyc | Bin 0 -> 24292 bytes .../__pycache__/packages.cpython-310.pyc | Bin 0 -> 612 bytes .../__pycache__/sessions.cpython-310.pyc | Bin 0 -> 19713 bytes .../__pycache__/status_codes.cpython-310.pyc | Bin 0 -> 4725 bytes .../__pycache__/structures.cpython-310.pyc | Bin 0 -> 4419 bytes .../__pycache__/utils.cpython-310.pyc | Bin 0 -> 24510 bytes .../site-packages/requests/__version__.py | 14 + .../site-packages/requests/_internal_utils.py | 50 + .../site-packages/requests/adapters.py | 696 ++ .../python3.10/site-packages/requests/api.py | 157 + .../python3.10/site-packages/requests/auth.py | 314 + .../site-packages/requests/certs.py | 17 + .../site-packages/requests/compat.py | 106 + .../site-packages/requests/cookies.py | 561 ++ .../site-packages/requests/exceptions.py | 151 + .../python3.10/site-packages/requests/help.py | 134 + .../site-packages/requests/hooks.py | 33 + .../site-packages/requests/models.py | 1039 ++ .../site-packages/requests/packages.py | 23 + .../site-packages/requests/sessions.py | 831 ++ .../site-packages/requests/status_codes.py | 128 + .../site-packages/requests/structures.py | 99 + .../site-packages/requests/utils.py | 1086 ++ .../setuptools-59.6.0.dist-info/INSTALLER | 1 + .../setuptools-59.6.0.dist-info/LICENSE | 19 + .../setuptools-59.6.0.dist-info/METADATA | 125 + .../setuptools-59.6.0.dist-info/RECORD | 298 + .../setuptools-59.6.0.dist-info/REQUESTED | 0 .../setuptools-59.6.0.dist-info/WHEEL | 5 + .../entry_points.txt | 56 + .../setuptools-59.6.0.dist-info/top_level.txt | 4 + .../site-packages/setuptools/__init__.py | 242 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 8590 bytes .../_deprecation_warning.cpython-310.pyc | Bin 0 -> 547 bytes .../__pycache__/_imp.cpython-310.pyc | Bin 0 -> 2073 bytes .../__pycache__/archive_util.cpython-310.pyc | Bin 0 -> 5843 bytes .../__pycache__/build_meta.cpython-310.pyc | Bin 0 -> 9457 bytes .../__pycache__/config.cpython-310.pyc | Bin 0 -> 20926 bytes .../__pycache__/dep_util.cpython-310.pyc | Bin 0 -> 854 bytes .../__pycache__/depends.cpython-310.pyc | Bin 0 -> 5293 bytes .../__pycache__/dist.cpython-310.pyc | Bin 0 -> 36334 bytes .../__pycache__/errors.cpython-310.pyc | Bin 0 -> 1499 bytes .../__pycache__/extension.cpython-310.pyc | Bin 0 -> 1943 bytes .../__pycache__/glob.cpython-310.pyc | Bin 0 -> 3732 bytes .../__pycache__/installer.cpython-310.pyc | Bin 0 -> 2978 bytes .../__pycache__/launch.cpython-310.pyc | Bin 0 -> 904 bytes .../__pycache__/monkey.cpython-310.pyc | Bin 0 -> 4632 bytes .../__pycache__/msvc.cpython-310.pyc | Bin 0 -> 42636 bytes .../__pycache__/namespaces.cpython-310.pyc | Bin 0 -> 3615 bytes .../__pycache__/package_index.cpython-310.pyc | Bin 0 -> 34762 bytes .../__pycache__/py34compat.cpython-310.pyc | Bin 0 -> 479 bytes .../__pycache__/sandbox.cpython-310.pyc | Bin 0 -> 15755 bytes .../__pycache__/unicode_utils.cpython-310.pyc | Bin 0 -> 1109 bytes .../__pycache__/version.cpython-310.pyc | Bin 0 -> 321 bytes .../__pycache__/wheel.cpython-310.pyc | Bin 0 -> 7347 bytes .../windows_support.cpython-310.pyc | Bin 0 -> 1022 bytes .../setuptools/_deprecation_warning.py | 7 + .../setuptools/_distutils/__init__.py | 24 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 555 bytes .../__pycache__/_msvccompiler.cpython-310.pyc | Bin 0 -> 13832 bytes .../__pycache__/archive_util.cpython-310.pyc | Bin 0 -> 6560 bytes .../__pycache__/bcppcompiler.cpython-310.pyc | Bin 0 -> 6547 bytes .../__pycache__/ccompiler.cpython-310.pyc | Bin 0 -> 33304 bytes .../__pycache__/cmd.cpython-310.pyc | Bin 0 -> 13947 bytes .../__pycache__/config.cpython-310.pyc | Bin 0 -> 3586 bytes .../__pycache__/core.cpython-310.pyc | Bin 0 -> 7087 bytes .../cygwinccompiler.cpython-310.pyc | Bin 0 -> 8994 bytes .../__pycache__/debug.cpython-310.pyc | Bin 0 -> 249 bytes .../__pycache__/dep_util.cpython-310.pyc | Bin 0 -> 2770 bytes .../__pycache__/dir_util.cpython-310.pyc | Bin 0 -> 5881 bytes .../__pycache__/dist.cpython-310.pyc | Bin 0 -> 34046 bytes .../__pycache__/errors.cpython-310.pyc | Bin 0 -> 4991 bytes .../__pycache__/extension.cpython-310.pyc | Bin 0 -> 7005 bytes .../__pycache__/fancy_getopt.cpython-310.pyc | Bin 0 -> 10629 bytes .../__pycache__/file_util.cpython-310.pyc | Bin 0 -> 5975 bytes .../__pycache__/filelist.cpython-310.pyc | Bin 0 -> 10821 bytes .../__pycache__/log.cpython-310.pyc | Bin 0 -> 2306 bytes .../__pycache__/msvc9compiler.cpython-310.pyc | Bin 0 -> 17561 bytes .../__pycache__/msvccompiler.cpython-310.pyc | Bin 0 -> 14780 bytes .../__pycache__/py35compat.cpython-310.pyc | Bin 0 -> 625 bytes .../__pycache__/py38compat.cpython-310.pyc | Bin 0 -> 422 bytes .../__pycache__/spawn.cpython-310.pyc | Bin 0 -> 2892 bytes .../__pycache__/sysconfig.cpython-310.pyc | Bin 0 -> 12873 bytes .../__pycache__/text_file.cpython-310.pyc | Bin 0 -> 8468 bytes .../__pycache__/unixccompiler.cpython-310.pyc | Bin 0 -> 6800 bytes .../__pycache__/util.cpython-310.pyc | Bin 0 -> 14741 bytes .../__pycache__/version.cpython-310.pyc | Bin 0 -> 7842 bytes .../versionpredicate.cpython-310.pyc | Bin 0 -> 5335 bytes .../setuptools/_distutils/_msvccompiler.py | 561 ++ .../setuptools/_distutils/archive_util.py | 256 + .../setuptools/_distutils/bcppcompiler.py | 393 + .../setuptools/_distutils/ccompiler.py | 1123 +++ .../setuptools/_distutils/cmd.py | 403 + .../setuptools/_distutils/command/__init__.py | 31 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 528 bytes .../command/__pycache__/bdist.cpython-310.pyc | Bin 0 -> 3662 bytes .../__pycache__/bdist_dumb.cpython-310.pyc | Bin 0 -> 3641 bytes .../__pycache__/bdist_msi.cpython-310.pyc | Bin 0 -> 19717 bytes .../__pycache__/bdist_rpm.cpython-310.pyc | Bin 0 -> 12285 bytes .../__pycache__/bdist_wininst.cpython-310.pyc | Bin 0 -> 8628 bytes .../command/__pycache__/build.cpython-310.pyc | Bin 0 -> 3890 bytes .../__pycache__/build_clib.cpython-310.pyc | Bin 0 -> 4867 bytes .../__pycache__/build_ext.cpython-310.pyc | Bin 0 -> 16215 bytes .../__pycache__/build_py.cpython-310.pyc | Bin 0 -> 9886 bytes .../__pycache__/build_scripts.cpython-310.pyc | Bin 0 -> 4009 bytes .../command/__pycache__/check.cpython-310.pyc | Bin 0 -> 5006 bytes .../command/__pycache__/clean.cpython-310.pyc | Bin 0 -> 2145 bytes .../__pycache__/config.cpython-310.pyc | Bin 0 -> 10327 bytes .../__pycache__/install.cpython-310.pyc | Bin 0 -> 15265 bytes .../__pycache__/install_data.cpython-310.pyc | Bin 0 -> 2344 bytes .../install_egg_info.cpython-310.pyc | Bin 0 -> 3309 bytes .../install_headers.cpython-310.pyc | Bin 0 -> 1767 bytes .../__pycache__/install_lib.cpython-310.pyc | Bin 0 -> 5169 bytes .../install_scripts.cpython-310.pyc | Bin 0 -> 2196 bytes .../__pycache__/py37compat.cpython-310.pyc | Bin 0 -> 1037 bytes .../__pycache__/register.cpython-310.pyc | Bin 0 -> 8680 bytes .../command/__pycache__/sdist.cpython-310.pyc | Bin 0 -> 14496 bytes .../__pycache__/upload.cpython-310.pyc | Bin 0 -> 5372 bytes .../setuptools/_distutils/command/bdist.py | 143 + .../_distutils/command/bdist_dumb.py | 123 + .../_distutils/command/bdist_msi.py | 749 ++ .../_distutils/command/bdist_rpm.py | 579 ++ .../_distutils/command/bdist_wininst.py | 377 + .../setuptools/_distutils/command/build.py | 157 + .../_distutils/command/build_clib.py | 209 + .../_distutils/command/build_ext.py | 755 ++ .../setuptools/_distutils/command/build_py.py | 392 + .../_distutils/command/build_scripts.py | 152 + .../setuptools/_distutils/command/check.py | 148 + .../setuptools/_distutils/command/clean.py | 76 + .../setuptools/_distutils/command/config.py | 344 + .../setuptools/_distutils/command/install.py | 721 ++ .../_distutils/command/install_data.py | 79 + .../_distutils/command/install_egg_info.py | 84 + .../_distutils/command/install_headers.py | 47 + .../_distutils/command/install_lib.py | 217 + .../_distutils/command/install_scripts.py | 60 + .../_distutils/command/py37compat.py | 30 + .../setuptools/_distutils/command/register.py | 304 + .../setuptools/_distutils/command/sdist.py | 494 + .../setuptools/_distutils/command/upload.py | 214 + .../setuptools/_distutils/config.py | 130 + .../setuptools/_distutils/core.py | 249 + .../setuptools/_distutils/cygwinccompiler.py | 425 + .../setuptools/_distutils/debug.py | 5 + .../setuptools/_distutils/dep_util.py | 92 + .../setuptools/_distutils/dir_util.py | 210 + .../setuptools/_distutils/dist.py | 1257 +++ .../setuptools/_distutils/errors.py | 97 + .../setuptools/_distutils/extension.py | 240 + .../setuptools/_distutils/fancy_getopt.py | 457 + .../setuptools/_distutils/file_util.py | 238 + .../setuptools/_distutils/filelist.py | 355 + .../setuptools/_distutils/log.py | 77 + .../setuptools/_distutils/msvc9compiler.py | 788 ++ .../setuptools/_distutils/msvccompiler.py | 643 ++ .../setuptools/_distutils/py35compat.py | 19 + .../setuptools/_distutils/py38compat.py | 7 + .../setuptools/_distutils/spawn.py | 106 + .../setuptools/_distutils/sysconfig.py | 601 ++ .../setuptools/_distutils/text_file.py | 286 + .../setuptools/_distutils/unixccompiler.py | 325 + .../setuptools/_distutils/util.py | 548 + .../setuptools/_distutils/version.py | 363 + .../setuptools/_distutils/versionpredicate.py | 169 + .../site-packages/setuptools/_imp.py | 82 + .../setuptools/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 183 bytes .../__pycache__/ordered_set.cpython-310.pyc | Bin 0 -> 16319 bytes .../__pycache__/pyparsing.cpython-310.pyc | Bin 0 -> 198736 bytes .../_vendor/more_itertools/__init__.py | 4 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 264 bytes .../__pycache__/more.cpython-310.pyc | Bin 0 -> 109982 bytes .../__pycache__/recipes.cpython-310.pyc | Bin 0 -> 17964 bytes .../setuptools/_vendor/more_itertools/more.py | 3825 +++++++ .../_vendor/more_itertools/recipes.py | 620 ++ .../setuptools/_vendor/ordered_set.py | 488 + .../setuptools/_vendor/packaging/__about__.py | 26 + .../setuptools/_vendor/packaging/__init__.py | 25 + .../__pycache__/__about__.cpython-310.pyc | Bin 0 -> 590 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 446 bytes .../__pycache__/_manylinux.cpython-310.pyc | Bin 0 -> 7300 bytes .../__pycache__/_musllinux.cpython-310.pyc | Bin 0 -> 4612 bytes .../__pycache__/_structures.cpython-310.pyc | Bin 0 -> 2970 bytes .../__pycache__/markers.cpython-310.pyc | Bin 0 -> 9293 bytes .../__pycache__/requirements.cpython-310.pyc | Bin 0 -> 3981 bytes .../__pycache__/specifiers.cpython-310.pyc | Bin 0 -> 22188 bytes .../__pycache__/tags.cpython-310.pyc | Bin 0 -> 12214 bytes .../__pycache__/utils.cpython-310.pyc | Bin 0 -> 3575 bytes .../__pycache__/version.cpython-310.pyc | Bin 0 -> 12925 bytes .../_vendor/packaging/_manylinux.py | 301 + .../_vendor/packaging/_musllinux.py | 136 + .../_vendor/packaging/_structures.py | 67 + .../setuptools/_vendor/packaging/markers.py | 304 + .../_vendor/packaging/requirements.py | 146 + .../_vendor/packaging/specifiers.py | 828 ++ .../setuptools/_vendor/packaging/tags.py | 484 + .../setuptools/_vendor/packaging/utils.py | 136 + .../setuptools/_vendor/packaging/version.py | 504 + .../setuptools/_vendor/pyparsing.py | 5742 +++++++++++ .../site-packages/setuptools/archive_util.py | 205 + .../site-packages/setuptools/build_meta.py | 290 + .../site-packages/setuptools/cli-32.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/cli-64.exe | Bin 0 -> 74752 bytes .../site-packages/setuptools/cli-arm64.exe | Bin 0 -> 137216 bytes .../site-packages/setuptools/cli.exe | Bin 0 -> 65536 bytes .../setuptools/command/__init__.py | 8 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 372 bytes .../command/__pycache__/alias.cpython-310.pyc | Bin 0 -> 2374 bytes .../__pycache__/bdist_egg.cpython-310.pyc | Bin 0 -> 13100 bytes .../__pycache__/bdist_rpm.cpython-310.pyc | Bin 0 -> 1587 bytes .../__pycache__/build_clib.cpython-310.pyc | Bin 0 -> 2461 bytes .../__pycache__/build_ext.cpython-310.pyc | Bin 0 -> 9890 bytes .../__pycache__/build_py.cpython-310.pyc | Bin 0 -> 8263 bytes .../__pycache__/develop.cpython-310.pyc | Bin 0 -> 6150 bytes .../__pycache__/dist_info.cpython-310.pyc | Bin 0 -> 1392 bytes .../__pycache__/easy_install.cpython-310.pyc | Bin 0 -> 65169 bytes .../__pycache__/egg_info.cpython-310.pyc | Bin 0 -> 22748 bytes .../__pycache__/install.cpython-310.pyc | Bin 0 -> 4198 bytes .../install_egg_info.cpython-310.pyc | Bin 0 -> 2923 bytes .../__pycache__/install_lib.cpython-310.pyc | Bin 0 -> 5138 bytes .../install_scripts.cpython-310.pyc | Bin 0 -> 2427 bytes .../__pycache__/py36compat.cpython-310.pyc | Bin 0 -> 4534 bytes .../__pycache__/register.cpython-310.pyc | Bin 0 -> 838 bytes .../__pycache__/rotate.cpython-310.pyc | Bin 0 -> 2505 bytes .../__pycache__/saveopts.cpython-310.pyc | Bin 0 -> 924 bytes .../command/__pycache__/sdist.cpython-310.pyc | Bin 0 -> 6953 bytes .../__pycache__/setopt.cpython-310.pyc | Bin 0 -> 4686 bytes .../command/__pycache__/test.cpython-310.pyc | Bin 0 -> 8130 bytes .../__pycache__/upload.cpython-310.pyc | Bin 0 -> 811 bytes .../__pycache__/upload_docs.cpython-310.pyc | Bin 0 -> 6180 bytes .../site-packages/setuptools/command/alias.py | 78 + .../setuptools/command/bdist_egg.py | 456 + .../setuptools/command/bdist_rpm.py | 40 + .../setuptools/command/build_clib.py | 101 + .../setuptools/command/build_ext.py | 328 + .../setuptools/command/build_py.py | 242 + .../setuptools/command/develop.py | 193 + .../setuptools/command/dist_info.py | 36 + .../setuptools/command/easy_install.py | 2354 +++++ .../setuptools/command/egg_info.py | 755 ++ .../setuptools/command/install.py | 132 + .../setuptools/command/install_egg_info.py | 82 + .../setuptools/command/install_lib.py | 148 + .../setuptools/command/install_scripts.py | 69 + .../setuptools/command/launcher manifest.xml | 15 + .../setuptools/command/py36compat.py | 134 + .../setuptools/command/register.py | 18 + .../setuptools/command/rotate.py | 64 + .../setuptools/command/saveopts.py | 22 + .../site-packages/setuptools/command/sdist.py | 196 + .../setuptools/command/setopt.py | 149 + .../site-packages/setuptools/command/test.py | 252 + .../setuptools/command/upload.py | 17 + .../setuptools/command/upload_docs.py | 202 + .../site-packages/setuptools/config.py | 751 ++ .../site-packages/setuptools/dep_util.py | 25 + .../site-packages/setuptools/depends.py | 176 + .../site-packages/setuptools/dist.py | 1156 +++ .../site-packages/setuptools/errors.py | 40 + .../site-packages/setuptools/extension.py | 55 + .../setuptools/extern/__init__.py | 73 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 2933 bytes .../site-packages/setuptools/glob.py | 167 + .../site-packages/setuptools/gui-32.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/gui-64.exe | Bin 0 -> 75264 bytes .../site-packages/setuptools/gui-arm64.exe | Bin 0 -> 137728 bytes .../site-packages/setuptools/gui.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/installer.py | 104 + .../site-packages/setuptools/launch.py | 36 + .../site-packages/setuptools/monkey.py | 177 + .../site-packages/setuptools/msvc.py | 1805 ++++ .../site-packages/setuptools/namespaces.py | 107 + .../site-packages/setuptools/package_index.py | 1176 +++ .../site-packages/setuptools/py34compat.py | 13 + .../site-packages/setuptools/sandbox.py | 530 + .../setuptools/script (dev).tmpl | 6 + .../site-packages/setuptools/script.tmpl | 3 + .../site-packages/setuptools/unicode_utils.py | 42 + .../site-packages/setuptools/version.py | 6 + .../site-packages/setuptools/wheel.py | 213 + .../setuptools/windows_support.py | 29 + .../sniffio-1.3.1.dist-info/INSTALLER | 1 + .../sniffio-1.3.1.dist-info/LICENSE | 3 + .../sniffio-1.3.1.dist-info/LICENSE.APACHE2 | 202 + .../sniffio-1.3.1.dist-info/LICENSE.MIT | 20 + .../sniffio-1.3.1.dist-info/METADATA | 104 + .../sniffio-1.3.1.dist-info/RECORD | 19 + .../sniffio-1.3.1.dist-info/WHEEL | 5 + .../sniffio-1.3.1.dist-info/top_level.txt | 1 + .../site-packages/sniffio/__init__.py | 17 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 429 bytes .../sniffio/__pycache__/_impl.cpython-310.pyc | Bin 0 -> 2672 bytes .../__pycache__/_version.cpython-310.pyc | Bin 0 -> 193 bytes .../python3.10/site-packages/sniffio/_impl.py | 95 + .../site-packages/sniffio/_tests/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 179 bytes .../__pycache__/test_sniffio.cpython-310.pyc | Bin 0 -> 2123 bytes .../sniffio/_tests/test_sniffio.py | 84 + .../site-packages/sniffio/_version.py | 3 + .../python3.10/site-packages/sniffio/py.typed | 0 .../soupsieve-2.8.3.dist-info/INSTALLER | 1 + .../soupsieve-2.8.3.dist-info/METADATA | 115 + .../soupsieve-2.8.3.dist-info/RECORD | 20 + .../soupsieve-2.8.3.dist-info/WHEEL | 4 + .../licenses/LICENSE.md | 21 + .../site-packages/soupsieve/__init__.py | 168 + .../site-packages/soupsieve/__meta__.py | 197 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 4467 bytes .../__pycache__/__meta__.cpython-310.pyc | Bin 0 -> 6012 bytes .../__pycache__/css_match.cpython-310.pyc | Bin 0 -> 38760 bytes .../__pycache__/css_parser.cpython-310.pyc | Bin 0 -> 29114 bytes .../__pycache__/css_types.cpython-310.pyc | Bin 0 -> 12596 bytes .../__pycache__/pretty.cpython-310.pyc | Bin 0 -> 3941 bytes .../__pycache__/util.cpython-310.pyc | Bin 0 -> 3432 bytes .../site-packages/soupsieve/css_match.py | 1654 +++ .../site-packages/soupsieve/css_parser.py | 1318 +++ .../site-packages/soupsieve/css_types.py | 407 + .../site-packages/soupsieve/pretty.py | 148 + .../site-packages/soupsieve/py.typed | 0 .../site-packages/soupsieve/util.py | 117 + .../starlette-1.0.0.dist-info/INSTALLER | 1 + .../starlette-1.0.0.dist-info/METADATA | 177 + .../starlette-1.0.0.dist-info/RECORD | 74 + .../starlette-1.0.0.dist-info/WHEEL | 4 + .../licenses/LICENSE.md | 27 + .../site-packages/starlette/__init__.py | 1 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 195 bytes .../_exception_handler.cpython-310.pyc | Bin 0 -> 2377 bytes .../__pycache__/_utils.cpython-310.pyc | Bin 0 -> 3863 bytes .../__pycache__/applications.cpython-310.pyc | Bin 0 -> 5934 bytes .../authentication.cpython-310.pyc | Bin 0 -> 5714 bytes .../__pycache__/background.cpython-310.pyc | Bin 0 -> 1980 bytes .../__pycache__/concurrency.cpython-310.pyc | Bin 0 -> 2240 bytes .../__pycache__/config.cpython-310.pyc | Bin 0 -> 5218 bytes .../__pycache__/convertors.cpython-310.pyc | Bin 0 -> 3832 bytes .../datastructures.cpython-310.pyc | Bin 0 -> 28814 bytes .../__pycache__/endpoints.cpython-310.pyc | Bin 0 -> 5254 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 0 -> 1849 bytes .../__pycache__/formparsers.cpython-310.pyc | Bin 0 -> 8607 bytes .../__pycache__/requests.cpython-310.pyc | Bin 0 -> 11372 bytes .../__pycache__/responses.cpython-310.pyc | Bin 0 -> 18926 bytes .../__pycache__/routing.cpython-310.pyc | Bin 0 -> 23956 bytes .../__pycache__/schemas.cpython-310.pyc | Bin 0 -> 5084 bytes .../__pycache__/staticfiles.cpython-310.pyc | Bin 0 -> 7322 bytes .../__pycache__/status.cpython-310.pyc | Bin 0 -> 4558 bytes .../__pycache__/templating.cpython-310.pyc | Bin 0 -> 5464 bytes .../__pycache__/testclient.cpython-310.pyc | Bin 0 -> 20147 bytes .../__pycache__/types.cpython-310.pyc | Bin 0 -> 1024 bytes .../__pycache__/websockets.cpython-310.pyc | Bin 0 -> 7573 bytes .../starlette/_exception_handler.py | 65 + .../site-packages/starlette/_utils.py | 105 + .../site-packages/starlette/applications.py | 118 + .../site-packages/starlette/authentication.py | 142 + .../site-packages/starlette/background.py | 36 + .../site-packages/starlette/concurrency.py | 57 + .../site-packages/starlette/config.py | 140 + .../site-packages/starlette/convertors.py | 89 + .../site-packages/starlette/datastructures.py | 706 ++ .../site-packages/starlette/endpoints.py | 123 + .../site-packages/starlette/exceptions.py | 33 + .../site-packages/starlette/formparsers.py | 276 + .../starlette/middleware/__init__.py | 37 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 2169 bytes .../authentication.cpython-310.pyc | Bin 0 -> 2162 bytes .../__pycache__/base.cpython-310.pyc | Bin 0 -> 7570 bytes .../__pycache__/cors.cpython-310.pyc | Bin 0 -> 5333 bytes .../__pycache__/errors.cpython-310.pyc | Bin 0 -> 7608 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 0 -> 2955 bytes .../__pycache__/gzip.cpython-310.pyc | Bin 0 -> 4991 bytes .../__pycache__/httpsredirect.cpython-310.pyc | Bin 0 -> 1300 bytes .../__pycache__/sessions.cpython-310.pyc | Bin 0 -> 4967 bytes .../__pycache__/trustedhost.cpython-310.pyc | Bin 0 -> 2131 bytes .../__pycache__/wsgi.cpython-310.pyc | Bin 0 -> 5407 bytes .../starlette/middleware/authentication.py | 52 + .../starlette/middleware/base.py | 244 + .../starlette/middleware/cors.py | 179 + .../starlette/middleware/errors.py | 259 + .../starlette/middleware/exceptions.py | 73 + .../starlette/middleware/gzip.py | 145 + .../starlette/middleware/httpsredirect.py | 19 + .../starlette/middleware/sessions.py | 125 + .../starlette/middleware/trustedhost.py | 60 + .../starlette/middleware/wsgi.py | 154 + .../site-packages/starlette/py.typed | 0 .../site-packages/starlette/requests.py | 337 + .../site-packages/starlette/responses.py | 568 ++ .../site-packages/starlette/routing.py | 747 ++ .../site-packages/starlette/schemas.py | 148 + .../site-packages/starlette/staticfiles.py | 220 + .../site-packages/starlette/status.py | 209 + .../site-packages/starlette/templating.py | 156 + .../site-packages/starlette/testclient.py | 739 ++ .../site-packages/starlette/types.py | 26 + .../site-packages/starlette/websockets.py | 196 + .../tqdm-4.67.3.dist-info/INSTALLER | 1 + .../tqdm-4.67.3.dist-info/METADATA | 1595 +++ .../tqdm-4.67.3.dist-info/RECORD | 72 + .../site-packages/tqdm-4.67.3.dist-info/WHEEL | 5 + .../tqdm-4.67.3.dist-info/entry_points.txt | 2 + .../tqdm-4.67.3.dist-info/licenses/LICENCE | 49 + .../tqdm-4.67.3.dist-info/top_level.txt | 1 + .../python3.10/site-packages/tqdm/__init__.py | 38 + .../python3.10/site-packages/tqdm/__main__.py | 3 + .../tqdm/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1486 bytes .../tqdm/__pycache__/__main__.cpython-310.pyc | Bin 0 -> 209 bytes .../tqdm/__pycache__/_main.cpython-310.pyc | Bin 0 -> 443 bytes .../tqdm/__pycache__/_monitor.cpython-310.pyc | Bin 0 -> 2804 bytes .../tqdm/__pycache__/_tqdm.cpython-310.pyc | Bin 0 -> 438 bytes .../__pycache__/_tqdm_gui.cpython-310.pyc | Bin 0 -> 451 bytes .../_tqdm_notebook.cpython-310.pyc | Bin 0 -> 471 bytes .../__pycache__/_tqdm_pandas.cpython-310.pyc | Bin 0 -> 959 bytes .../tqdm/__pycache__/_utils.cpython-310.pyc | Bin 0 -> 824 bytes .../tqdm/__pycache__/asyncio.cpython-310.pyc | Bin 0 -> 3363 bytes .../tqdm/__pycache__/auto.cpython-310.pyc | Bin 0 -> 1117 bytes .../__pycache__/autonotebook.cpython-310.pyc | Bin 0 -> 1005 bytes .../tqdm/__pycache__/cli.cpython-310.pyc | Bin 0 -> 9168 bytes .../tqdm/__pycache__/dask.cpython-310.pyc | Bin 0 -> 2060 bytes .../tqdm/__pycache__/gui.cpython-310.pyc | Bin 0 -> 4351 bytes .../tqdm/__pycache__/keras.cpython-310.pyc | Bin 0 -> 4932 bytes .../tqdm/__pycache__/notebook.cpython-310.pyc | Bin 0 -> 7368 bytes .../tqdm/__pycache__/rich.cpython-310.pyc | Bin 0 -> 5056 bytes .../tqdm/__pycache__/std.cpython-310.pyc | Bin 0 -> 45582 bytes .../tqdm/__pycache__/tk.cpython-310.pyc | Bin 0 -> 6159 bytes .../tqdm/__pycache__/utils.cpython-310.pyc | Bin 0 -> 13764 bytes .../tqdm/__pycache__/version.cpython-310.pyc | Bin 0 -> 489 bytes .../python3.10/site-packages/tqdm/_main.py | 9 + .../python3.10/site-packages/tqdm/_monitor.py | 95 + .../python3.10/site-packages/tqdm/_tqdm.py | 9 + .../site-packages/tqdm/_tqdm_gui.py | 9 + .../site-packages/tqdm/_tqdm_notebook.py | 9 + .../site-packages/tqdm/_tqdm_pandas.py | 24 + .../python3.10/site-packages/tqdm/_utils.py | 11 + .../python3.10/site-packages/tqdm/asyncio.py | 93 + .../lib/python3.10/site-packages/tqdm/auto.py | 40 + .../site-packages/tqdm/autonotebook.py | 29 + .../lib/python3.10/site-packages/tqdm/cli.py | 324 + .../site-packages/tqdm/completion.sh | 19 + .../site-packages/tqdm/contrib/__init__.py | 91 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 2994 bytes .../contrib/__pycache__/bells.cpython-310.pyc | Bin 0 -> 1035 bytes .../__pycache__/concurrent.cpython-310.pyc | Bin 0 -> 3629 bytes .../__pycache__/discord.cpython-310.pyc | Bin 0 -> 5491 bytes .../__pycache__/itertools.cpython-310.pyc | Bin 0 -> 959 bytes .../__pycache__/logging.cpython-310.pyc | Bin 0 -> 3898 bytes .../contrib/__pycache__/slack.cpython-310.pyc | Bin 0 -> 4323 bytes .../__pycache__/telegram.cpython-310.pyc | Bin 0 -> 5277 bytes .../__pycache__/utils_worker.cpython-310.pyc | Bin 0 -> 1473 bytes .../site-packages/tqdm/contrib/bells.py | 26 + .../site-packages/tqdm/contrib/concurrent.py | 105 + .../site-packages/tqdm/contrib/discord.py | 156 + .../site-packages/tqdm/contrib/itertools.py | 35 + .../site-packages/tqdm/contrib/logging.py | 126 + .../site-packages/tqdm/contrib/slack.py | 120 + .../site-packages/tqdm/contrib/telegram.py | 153 + .../tqdm/contrib/utils_worker.py | 38 + .../lib/python3.10/site-packages/tqdm/dask.py | 44 + .../lib/python3.10/site-packages/tqdm/gui.py | 179 + .../python3.10/site-packages/tqdm/keras.py | 122 + .../python3.10/site-packages/tqdm/notebook.py | 315 + .../lib/python3.10/site-packages/tqdm/rich.py | 151 + .../lib/python3.10/site-packages/tqdm/std.py | 1524 +++ .venv/lib/python3.10/site-packages/tqdm/tk.py | 196 + .../lib/python3.10/site-packages/tqdm/tqdm.1 | 243 + .../python3.10/site-packages/tqdm/utils.py | 399 + .../python3.10/site-packages/tqdm/version.py | 10 + .../INSTALLER | 1 + .../METADATA | 72 + .../typing_extensions-4.15.0.dist-info/RECORD | 7 + .../typing_extensions-4.15.0.dist-info/WHEEL | 4 + .../licenses/LICENSE | 279 + .../site-packages/typing_extensions.py | 4317 ++++++++ .../INSTALLER | 1 + .../METADATA | 49 + .../typing_inspection-0.4.2.dist-info/RECORD | 13 + .../typing_inspection-0.4.2.dist-info/WHEEL | 4 + .../licenses/LICENSE | 21 + .../typing_inspection/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 182 bytes .../__pycache__/introspection.cpython-310.pyc | Bin 0 -> 13101 bytes .../typing_objects.cpython-310.pyc | Bin 0 -> 12246 bytes .../typing_inspection/introspection.py | 587 ++ .../site-packages/typing_inspection/py.typed | 0 .../typing_inspection/typing_objects.py | 607 ++ .../typing_inspection/typing_objects.pyi | 417 + .../urllib3-2.6.3.dist-info/INSTALLER | 1 + .../urllib3-2.6.3.dist-info/METADATA | 164 + .../urllib3-2.6.3.dist-info/RECORD | 79 + .../urllib3-2.6.3.dist-info/WHEEL | 4 + .../licenses/LICENSE.txt | 21 + .../site-packages/urllib3/__init__.py | 211 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 6107 bytes .../_base_connection.cpython-310.pyc | Bin 0 -> 5680 bytes .../__pycache__/_collections.cpython-310.pyc | Bin 0 -> 16399 bytes .../_request_methods.cpython-310.pyc | Bin 0 -> 9089 bytes .../__pycache__/_version.cpython-310.pyc | Bin 0 -> 655 bytes .../__pycache__/connection.cpython-310.pyc | Bin 0 -> 25669 bytes .../connectionpool.cpython-310.pyc | Bin 0 -> 29212 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 0 -> 13829 bytes .../__pycache__/fields.cpython-310.pyc | Bin 0 -> 9711 bytes .../__pycache__/filepost.cpython-310.pyc | Bin 0 -> 2345 bytes .../__pycache__/poolmanager.cpython-310.pyc | Bin 0 -> 18299 bytes .../__pycache__/response.cpython-310.pyc | Bin 0 -> 37049 bytes .../site-packages/urllib3/_base_connection.py | 165 + .../site-packages/urllib3/_collections.py | 487 + .../site-packages/urllib3/_request_methods.py | 278 + .../site-packages/urllib3/_version.py | 34 + .../site-packages/urllib3/connection.py | 1099 ++ .../site-packages/urllib3/connectionpool.py | 1178 +++ .../site-packages/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 180 bytes .../__pycache__/pyopenssl.cpython-310.pyc | Bin 0 -> 17860 bytes .../contrib/__pycache__/socks.cpython-310.pyc | Bin 0 -> 6141 bytes .../urllib3/contrib/emscripten/__init__.py | 17 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 754 bytes .../__pycache__/connection.cpython-310.pyc | Bin 0 -> 7673 bytes .../__pycache__/fetch.cpython-310.pyc | Bin 0 -> 18947 bytes .../__pycache__/request.cpython-310.pyc | Bin 0 -> 1235 bytes .../__pycache__/response.cpython-310.pyc | Bin 0 -> 8067 bytes .../urllib3/contrib/emscripten/connection.py | 260 + .../emscripten/emscripten_fetch_worker.js | 110 + .../urllib3/contrib/emscripten/fetch.py | 726 ++ .../urllib3/contrib/emscripten/request.py | 22 + .../urllib3/contrib/emscripten/response.py | 277 + .../urllib3/contrib/pyopenssl.py | 564 ++ .../site-packages/urllib3/contrib/socks.py | 228 + .../site-packages/urllib3/exceptions.py | 335 + .../site-packages/urllib3/fields.py | 341 + .../site-packages/urllib3/filepost.py | 89 + .../site-packages/urllib3/http2/__init__.py | 53 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1417 bytes .../__pycache__/connection.cpython-310.pyc | Bin 0 -> 10900 bytes .../http2/__pycache__/probe.cpython-310.pyc | Bin 0 -> 2551 bytes .../site-packages/urllib3/http2/connection.py | 356 + .../site-packages/urllib3/http2/probe.py | 87 + .../site-packages/urllib3/poolmanager.py | 651 ++ .../python3.10/site-packages/urllib3/py.typed | 2 + .../site-packages/urllib3/response.py | 1480 +++ .../site-packages/urllib3/util/__init__.py | 42 + .../util/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 960 bytes .../__pycache__/connection.cpython-310.pyc | Bin 0 -> 3475 bytes .../util/__pycache__/proxy.cpython-310.pyc | Bin 0 -> 1090 bytes .../util/__pycache__/request.cpython-310.pyc | Bin 0 -> 6493 bytes .../util/__pycache__/response.cpython-310.pyc | Bin 0 -> 2346 bytes .../util/__pycache__/retry.cpython-310.pyc | Bin 0 -> 16176 bytes .../util/__pycache__/ssl_.cpython-310.pyc | Bin 0 -> 12870 bytes .../ssl_match_hostname.cpython-310.pyc | Bin 0 -> 3715 bytes .../__pycache__/ssltransport.cpython-310.pyc | Bin 0 -> 9429 bytes .../util/__pycache__/timeout.cpython-310.pyc | Bin 0 -> 9611 bytes .../util/__pycache__/url.cpython-310.pyc | Bin 0 -> 11249 bytes .../util/__pycache__/util.cpython-310.pyc | Bin 0 -> 1220 bytes .../util/__pycache__/wait.cpython-310.pyc | Bin 0 -> 2399 bytes .../site-packages/urllib3/util/connection.py | 137 + .../site-packages/urllib3/util/proxy.py | 43 + .../site-packages/urllib3/util/request.py | 263 + .../site-packages/urllib3/util/response.py | 101 + .../site-packages/urllib3/util/retry.py | 549 + .../site-packages/urllib3/util/ssl_.py | 527 + .../urllib3/util/ssl_match_hostname.py | 159 + .../urllib3/util/ssltransport.py | 271 + .../site-packages/urllib3/util/timeout.py | 275 + .../site-packages/urllib3/util/url.py | 469 + .../site-packages/urllib3/util/util.py | 42 + .../site-packages/urllib3/util/wait.py | 124 + .../uvicorn-0.42.0.dist-info/INSTALLER | 1 + .../uvicorn-0.42.0.dist-info/METADATA | 191 + .../uvicorn-0.42.0.dist-info/RECORD | 89 + .../uvicorn-0.42.0.dist-info/REQUESTED | 0 .../uvicorn-0.42.0.dist-info/WHEEL | 4 + .../uvicorn-0.42.0.dist-info/entry_points.txt | 2 + .../licenses/LICENSE.md | 27 + .../site-packages/uvicorn/__init__.py | 5 + .../site-packages/uvicorn/__main__.py | 4 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 357 bytes .../__pycache__/__main__.cpython-310.pyc | Bin 0 -> 243 bytes .../__pycache__/_compat.cpython-310.pyc | Bin 0 -> 2273 bytes .../__pycache__/_subprocess.cpython-310.pyc | Bin 0 -> 2412 bytes .../__pycache__/_types.cpython-310.pyc | Bin 0 -> 9085 bytes .../__pycache__/config.cpython-310.pyc | Bin 0 -> 15411 bytes .../__pycache__/importer.cpython-310.pyc | Bin 0 -> 1198 bytes .../__pycache__/logging.cpython-310.pyc | Bin 0 -> 5124 bytes .../uvicorn/__pycache__/main.cpython-310.pyc | Bin 0 -> 14617 bytes .../__pycache__/server.cpython-310.pyc | Bin 0 -> 9470 bytes .../__pycache__/workers.cpython-310.pyc | Bin 0 -> 3855 bytes .../site-packages/uvicorn/_compat.py | 91 + .../site-packages/uvicorn/_subprocess.py | 84 + .../site-packages/uvicorn/_types.py | 274 + .../site-packages/uvicorn/config.py | 551 + .../site-packages/uvicorn/importer.py | 34 + .../uvicorn/lifespan/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 181 bytes .../lifespan/__pycache__/off.cpython-310.pyc | Bin 0 -> 919 bytes .../lifespan/__pycache__/on.cpython-310.pyc | Bin 0 -> 4094 bytes .../site-packages/uvicorn/lifespan/off.py | 17 + .../site-packages/uvicorn/lifespan/on.py | 137 + .../site-packages/uvicorn/logging.py | 117 + .../site-packages/uvicorn/loops/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 178 bytes .../loops/__pycache__/asyncio.cpython-310.pyc | Bin 0 -> 611 bytes .../loops/__pycache__/auto.cpython-310.pyc | Bin 0 -> 744 bytes .../loops/__pycache__/uvloop.cpython-310.pyc | Bin 0 -> 544 bytes .../site-packages/uvicorn/loops/asyncio.py | 11 + .../site-packages/uvicorn/loops/auto.py | 17 + .../site-packages/uvicorn/loops/uvloop.py | 10 + .../python3.10/site-packages/uvicorn/main.py | 630 ++ .../uvicorn/middleware/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 183 bytes .../__pycache__/asgi2.cpython-310.pyc | Bin 0 -> 904 bytes .../message_logger.cpython-310.pyc | Bin 0 -> 3009 bytes .../__pycache__/proxy_headers.cpython-310.pyc | Bin 0 -> 4221 bytes .../__pycache__/wsgi.cpython-310.pyc | Bin 0 -> 6016 bytes .../site-packages/uvicorn/middleware/asgi2.py | 15 + .../uvicorn/middleware/message_logger.py | 87 + .../uvicorn/middleware/proxy_headers.py | 142 + .../site-packages/uvicorn/middleware/wsgi.py | 199 + .../uvicorn/protocols/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 182 bytes .../__pycache__/utils.cpython-310.pyc | Bin 0 -> 2082 bytes .../uvicorn/protocols/http/__init__.py | 0 .../http/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 187 bytes .../http/__pycache__/auto.cpython-310.pyc | Bin 0 -> 548 bytes .../__pycache__/flow_control.cpython-310.pyc | Bin 0 -> 2066 bytes .../http/__pycache__/h11_impl.cpython-310.pyc | Bin 0 -> 14861 bytes .../httptools_impl.cpython-310.pyc | Bin 0 -> 16450 bytes .../uvicorn/protocols/http/auto.py | 15 + .../uvicorn/protocols/http/flow_control.py | 54 + .../uvicorn/protocols/http/h11_impl.py | 550 + .../uvicorn/protocols/http/httptools_impl.py | 577 ++ .../site-packages/uvicorn/protocols/utils.py | 62 + .../uvicorn/protocols/websockets/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 193 bytes .../__pycache__/auto.cpython-310.pyc | Bin 0 -> 700 bytes .../websockets_impl.cpython-310.pyc | Bin 0 -> 12243 bytes .../websockets_sansio_impl.cpython-310.pyc | Bin 0 -> 12813 bytes .../__pycache__/wsproto_impl.cpython-310.pyc | Bin 0 -> 11241 bytes .../uvicorn/protocols/websockets/auto.py | 21 + .../protocols/websockets/websockets_impl.py | 384 + .../websockets/websockets_sansio_impl.py | 417 + .../protocols/websockets/wsproto_impl.py | 375 + .../python3.10/site-packages/uvicorn/py.typed | 1 + .../site-packages/uvicorn/server.py | 346 + .../uvicorn/supervisors/__init__.py | 16 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 691 bytes .../__pycache__/basereload.cpython-310.pyc | Bin 0 -> 4308 bytes .../__pycache__/multiprocess.cpython-310.pyc | Bin 0 -> 7916 bytes .../__pycache__/statreload.cpython-310.pyc | Bin 0 -> 2051 bytes .../watchfilesreload.cpython-310.pyc | Bin 0 -> 3212 bytes .../uvicorn/supervisors/basereload.py | 125 + .../uvicorn/supervisors/multiprocess.py | 223 + .../uvicorn/supervisors/statreload.py | 52 + .../uvicorn/supervisors/watchfilesreload.py | 86 + .../site-packages/uvicorn/workers.py | 111 + .venv/lib64 | 1 + .venv/pyvenv.cfg | 3 + .venvcd/bin/python | 1 + .venvcd/bin/python3 | 1 + .venvcd/bin/python3.10 | 1 + .../site-packages/_distutils_hack/__init__.py | 132 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 5108 bytes .../__pycache__/override.cpython-310.pyc | Bin 0 -> 233 bytes .../site-packages/_distutils_hack/override.py | 1 + .../site-packages/distutils-precedence.pth | 1 + .../pip-22.0.2.dist-info/LICENSE.txt | 20 + .../pip-22.0.2.dist-info/METADATA | 92 + .../site-packages/pip-22.0.2.dist-info/RECORD | 520 + .../site-packages/pip-22.0.2.dist-info/WHEEL | 5 + .../pip-22.0.2.dist-info/entry_points.txt | 5 + .../pip-22.0.2.dist-info/top_level.txt | 1 + .../python3.10/site-packages/pip/__init__.py | 13 + .../python3.10/site-packages/pip/__main__.py | 31 + .../pip/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 626 bytes .../pip/__pycache__/__main__.cpython-310.pyc | Bin 0 -> 588 bytes .../site-packages/pip/_internal/__init__.py | 19 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 747 bytes .../__pycache__/build_env.cpython-310.pyc | Bin 0 -> 9591 bytes .../__pycache__/cache.cpython-310.pyc | Bin 0 -> 8374 bytes .../__pycache__/configuration.cpython-310.pyc | Bin 0 -> 11120 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 0 -> 23117 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 612 bytes .../__pycache__/pyproject.cpython-310.pyc | Bin 0 -> 3531 bytes .../self_outdated_check.cpython-310.pyc | Bin 0 -> 4571 bytes .../__pycache__/wheel_builder.cpython-310.pyc | Bin 0 -> 9133 bytes .../site-packages/pip/_internal/build_env.py | 296 + .../site-packages/pip/_internal/cache.py | 264 + .../pip/_internal/cli/__init__.py | 4 + .../cli/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 267 bytes .../autocompletion.cpython-310.pyc | Bin 0 -> 5300 bytes .../__pycache__/base_command.cpython-310.pyc | Bin 0 -> 6243 bytes .../__pycache__/cmdoptions.cpython-310.pyc | Bin 0 -> 22542 bytes .../command_context.cpython-310.pyc | Bin 0 -> 1301 bytes .../cli/__pycache__/main.cpython-310.pyc | Bin 0 -> 1365 bytes .../__pycache__/main_parser.cpython-310.pyc | Bin 0 -> 2151 bytes .../cli/__pycache__/parser.cpython-310.pyc | Bin 0 -> 9938 bytes .../__pycache__/progress_bars.cpython-310.pyc | Bin 0 -> 9227 bytes .../__pycache__/req_command.cpython-310.pyc | Bin 0 -> 13528 bytes .../cli/__pycache__/spinners.cpython-310.pyc | Bin 0 -> 4941 bytes .../__pycache__/status_codes.cpython-310.pyc | Bin 0 -> 346 bytes .../pip/_internal/cli/autocompletion.py | 171 + .../pip/_internal/cli/base_command.py | 220 + .../pip/_internal/cli/cmdoptions.py | 1018 ++ .../pip/_internal/cli/command_context.py | 27 + .../site-packages/pip/_internal/cli/main.py | 70 + .../pip/_internal/cli/main_parser.py | 87 + .../site-packages/pip/_internal/cli/parser.py | 292 + .../pip/_internal/cli/progress_bars.py | 321 + .../pip/_internal/cli/req_command.py | 506 + .../pip/_internal/cli/spinners.py | 157 + .../pip/_internal/cli/status_codes.py | 6 + .../pip/_internal/commands/__init__.py | 127 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 3130 bytes .../__pycache__/cache.cpython-310.pyc | Bin 0 -> 6171 bytes .../__pycache__/check.cpython-310.pyc | Bin 0 -> 1564 bytes .../__pycache__/completion.cpython-310.pyc | Bin 0 -> 3131 bytes .../__pycache__/configuration.cpython-310.pyc | Bin 0 -> 8313 bytes .../__pycache__/debug.cpython-310.pyc | Bin 0 -> 6668 bytes .../__pycache__/download.cpython-310.pyc | Bin 0 -> 3978 bytes .../__pycache__/freeze.cpython-310.pyc | Bin 0 -> 2644 bytes .../commands/__pycache__/hash.cpython-310.pyc | Bin 0 -> 2143 bytes .../commands/__pycache__/help.cpython-310.pyc | Bin 0 -> 1304 bytes .../__pycache__/index.cpython-310.pyc | Bin 0 -> 4627 bytes .../__pycache__/install.cpython-310.pyc | Bin 0 -> 17786 bytes .../commands/__pycache__/list.cpython-310.pyc | Bin 0 -> 10353 bytes .../__pycache__/search.cpython-310.pyc | Bin 0 -> 5357 bytes .../commands/__pycache__/show.cpython-310.pyc | Bin 0 -> 6110 bytes .../__pycache__/uninstall.cpython-310.pyc | Bin 0 -> 3101 bytes .../__pycache__/wheel.cpython-310.pyc | Bin 0 -> 4833 bytes .../pip/_internal/commands/cache.py | 223 + .../pip/_internal/commands/check.py | 53 + .../pip/_internal/commands/completion.py | 96 + .../pip/_internal/commands/configuration.py | 266 + .../pip/_internal/commands/debug.py | 202 + .../pip/_internal/commands/download.py | 140 + .../pip/_internal/commands/freeze.py | 97 + .../pip/_internal/commands/hash.py | 59 + .../pip/_internal/commands/help.py | 41 + .../pip/_internal/commands/index.py | 139 + .../pip/_internal/commands/install.py | 771 ++ .../pip/_internal/commands/list.py | 363 + .../pip/_internal/commands/search.py | 174 + .../pip/_internal/commands/show.py | 178 + .../pip/_internal/commands/uninstall.py | 105 + .../pip/_internal/commands/wheel.py | 178 + .../pip/_internal/configuration.py | 366 + .../pip/_internal/distributions/__init__.py | 21 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 794 bytes .../__pycache__/base.cpython-310.pyc | Bin 0 -> 1851 bytes .../__pycache__/installed.cpython-310.pyc | Bin 0 -> 1228 bytes .../__pycache__/sdist.cpython-310.pyc | Bin 0 -> 4440 bytes .../__pycache__/wheel.cpython-310.pyc | Bin 0 -> 1595 bytes .../pip/_internal/distributions/base.py | 36 + .../pip/_internal/distributions/installed.py | 20 + .../pip/_internal/distributions/sdist.py | 127 + .../pip/_internal/distributions/wheel.py | 31 + .../site-packages/pip/_internal/exceptions.py | 658 ++ .../pip/_internal/index/__init__.py | 2 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 221 bytes .../__pycache__/collector.cpython-310.pyc | Bin 0 -> 19300 bytes .../package_finder.cpython-310.pyc | Bin 0 -> 28109 bytes .../index/__pycache__/sources.cpython-310.pyc | Bin 0 -> 7114 bytes .../pip/_internal/index/collector.py | 648 ++ .../pip/_internal/index/package_finder.py | 1004 ++ .../pip/_internal/index/sources.py | 224 + .../pip/_internal/locations/__init__.py | 520 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 12381 bytes .../__pycache__/_distutils.cpython-310.pyc | Bin 0 -> 4649 bytes .../__pycache__/_sysconfig.cpython-310.pyc | Bin 0 -> 6232 bytes .../__pycache__/base.cpython-310.pyc | Bin 0 -> 1531 bytes .../pip/_internal/locations/_distutils.py | 169 + .../pip/_internal/locations/_sysconfig.py | 219 + .../pip/_internal/locations/base.py | 52 + .../site-packages/pip/_internal/main.py | 12 + .../pip/_internal/metadata/__init__.py | 62 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 2287 bytes .../metadata/__pycache__/base.cpython-310.pyc | Bin 0 -> 20841 bytes .../__pycache__/pkg_resources.cpython-310.pyc | Bin 0 -> 9857 bytes .../pip/_internal/metadata/base.py | 546 + .../pip/_internal/metadata/pkg_resources.py | 256 + .../pip/_internal/models/__init__.py | 2 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 255 bytes .../__pycache__/candidate.cpython-310.pyc | Bin 0 -> 1407 bytes .../__pycache__/direct_url.cpython-310.pyc | Bin 0 -> 7280 bytes .../format_control.cpython-310.pyc | Bin 0 -> 2732 bytes .../models/__pycache__/index.cpython-310.pyc | Bin 0 -> 1224 bytes .../models/__pycache__/link.cpython-310.pyc | Bin 0 -> 10156 bytes .../models/__pycache__/scheme.cpython-310.pyc | Bin 0 -> 1023 bytes .../__pycache__/search_scope.cpython-310.pyc | Bin 0 -> 3478 bytes .../selection_prefs.cpython-310.pyc | Bin 0 -> 1685 bytes .../__pycache__/target_python.cpython-310.pyc | Bin 0 -> 3436 bytes .../models/__pycache__/wheel.cpython-310.pyc | Bin 0 -> 4352 bytes .../pip/_internal/models/candidate.py | 34 + .../pip/_internal/models/direct_url.py | 220 + .../pip/_internal/models/format_control.py | 80 + .../pip/_internal/models/index.py | 28 + .../pip/_internal/models/link.py | 288 + .../pip/_internal/models/scheme.py | 31 + .../pip/_internal/models/search_scope.py | 129 + .../pip/_internal/models/selection_prefs.py | 51 + .../pip/_internal/models/target_python.py | 110 + .../pip/_internal/models/wheel.py | 89 + .../pip/_internal/network/__init__.py | 2 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 243 bytes .../network/__pycache__/auth.cpython-310.pyc | Bin 0 -> 7511 bytes .../network/__pycache__/cache.cpython-310.pyc | Bin 0 -> 2924 bytes .../__pycache__/download.cpython-310.pyc | Bin 0 -> 5490 bytes .../__pycache__/lazy_wheel.cpython-310.pyc | Bin 0 -> 8398 bytes .../__pycache__/session.cpython-310.pyc | Bin 0 -> 10719 bytes .../network/__pycache__/utils.cpython-310.pyc | Bin 0 -> 1439 bytes .../__pycache__/xmlrpc.cpython-310.pyc | Bin 0 -> 2056 bytes .../pip/_internal/network/auth.py | 323 + .../pip/_internal/network/cache.py | 69 + .../pip/_internal/network/download.py | 185 + .../pip/_internal/network/lazy_wheel.py | 210 + .../pip/_internal/network/session.py | 454 + .../pip/_internal/network/utils.py | 96 + .../pip/_internal/network/xmlrpc.py | 60 + .../pip/_internal/operations/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 191 bytes .../__pycache__/check.cpython-310.pyc | Bin 0 -> 4004 bytes .../__pycache__/freeze.cpython-310.pyc | Bin 0 -> 6189 bytes .../__pycache__/prepare.cpython-310.pyc | Bin 0 -> 14887 bytes .../_internal/operations/build/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 197 bytes .../__pycache__/metadata.cpython-310.pyc | Bin 0 -> 1424 bytes .../metadata_editable.cpython-310.pyc | Bin 0 -> 1458 bytes .../metadata_legacy.cpython-310.pyc | Bin 0 -> 2369 bytes .../build/__pycache__/wheel.cpython-310.pyc | Bin 0 -> 1214 bytes .../wheel_editable.cpython-310.pyc | Bin 0 -> 1438 bytes .../__pycache__/wheel_legacy.cpython-310.pyc | Bin 0 -> 2754 bytes .../_internal/operations/build/metadata.py | 39 + .../operations/build/metadata_editable.py | 41 + .../operations/build/metadata_legacy.py | 74 + .../pip/_internal/operations/build/wheel.py | 37 + .../operations/build/wheel_editable.py | 46 + .../operations/build/wheel_legacy.py | 102 + .../pip/_internal/operations/check.py | 149 + .../pip/_internal/operations/freeze.py | 254 + .../_internal/operations/install/__init__.py | 2 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 255 bytes .../editable_legacy.cpython-310.pyc | Bin 0 -> 1542 bytes .../__pycache__/legacy.cpython-310.pyc | Bin 0 -> 3326 bytes .../install/__pycache__/wheel.cpython-310.pyc | Bin 0 -> 21084 bytes .../operations/install/editable_legacy.py | 47 + .../_internal/operations/install/legacy.py | 120 + .../pip/_internal/operations/install/wheel.py | 738 ++ .../pip/_internal/operations/prepare.py | 642 ++ .../site-packages/pip/_internal/pyproject.py | 168 + .../pip/_internal/req/__init__.py | 94 + .../req/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 2591 bytes .../__pycache__/constructors.cpython-310.pyc | Bin 0 -> 12154 bytes .../req/__pycache__/req_file.cpython-310.pyc | Bin 0 -> 13482 bytes .../__pycache__/req_install.cpython-310.pyc | Bin 0 -> 22171 bytes .../req/__pycache__/req_set.cpython-310.pyc | Bin 0 -> 5831 bytes .../__pycache__/req_tracker.cpython-310.pyc | Bin 0 -> 4299 bytes .../__pycache__/req_uninstall.cpython-310.pyc | Bin 0 -> 18937 bytes .../pip/_internal/req/constructors.py | 490 + .../pip/_internal/req/req_file.py | 536 + .../pip/_internal/req/req_install.py | 858 ++ .../pip/_internal/req/req_set.py | 189 + .../pip/_internal/req/req_tracker.py | 124 + .../pip/_internal/req/req_uninstall.py | 633 ++ .../pip/_internal/resolution/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 191 bytes .../__pycache__/base.cpython-310.pyc | Bin 0 -> 1043 bytes .../pip/_internal/resolution/base.py | 20 + .../_internal/resolution/legacy/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 198 bytes .../__pycache__/resolver.cpython-310.pyc | Bin 0 -> 12285 bytes .../_internal/resolution/legacy/resolver.py | 467 + .../resolution/resolvelib/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 202 bytes .../__pycache__/base.cpython-310.pyc | Bin 0 -> 6445 bytes .../__pycache__/candidates.cpython-310.pyc | Bin 0 -> 18352 bytes .../__pycache__/factory.cpython-310.pyc | Bin 0 -> 19210 bytes .../found_candidates.cpython-310.pyc | Bin 0 -> 4862 bytes .../__pycache__/provider.cpython-310.pyc | Bin 0 -> 7704 bytes .../__pycache__/reporter.cpython-310.pyc | Bin 0 -> 3171 bytes .../__pycache__/requirements.cpython-310.pyc | Bin 0 -> 7460 bytes .../__pycache__/resolver.cpython-310.pyc | Bin 0 -> 8097 bytes .../_internal/resolution/resolvelib/base.py | 141 + .../resolution/resolvelib/candidates.py | 547 + .../resolution/resolvelib/factory.py | 739 ++ .../resolution/resolvelib/found_candidates.py | 155 + .../resolution/resolvelib/provider.py | 248 + .../resolution/resolvelib/reporter.py | 68 + .../resolution/resolvelib/requirements.py | 166 + .../resolution/resolvelib/resolver.py | 292 + .../pip/_internal/self_outdated_check.py | 189 + .../pip/_internal/utils/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 186 bytes .../utils/__pycache__/_log.cpython-310.pyc | Bin 0 -> 1514 bytes .../utils/__pycache__/appdirs.cpython-310.pyc | Bin 0 -> 1612 bytes .../utils/__pycache__/compat.cpython-310.pyc | Bin 0 -> 1502 bytes .../compatibility_tags.cpython-310.pyc | Bin 0 -> 4071 bytes .../__pycache__/datetime.cpython-310.pyc | Bin 0 -> 509 bytes .../__pycache__/deprecation.cpython-310.pyc | Bin 0 -> 3307 bytes .../direct_url_helpers.cpython-310.pyc | Bin 0 -> 2077 bytes .../distutils_args.cpython-310.pyc | Bin 0 -> 1093 bytes .../__pycache__/egg_link.cpython-310.pyc | Bin 0 -> 2142 bytes .../__pycache__/encoding.cpython-310.pyc | Bin 0 -> 1299 bytes .../__pycache__/entrypoints.cpython-310.pyc | Bin 0 -> 1296 bytes .../__pycache__/filesystem.cpython-310.pyc | Bin 0 -> 5154 bytes .../__pycache__/filetypes.cpython-310.pyc | Bin 0 -> 936 bytes .../utils/__pycache__/glibc.cpython-310.pyc | Bin 0 -> 1665 bytes .../utils/__pycache__/hashes.cpython-310.pyc | Bin 0 -> 5188 bytes .../inject_securetransport.cpython-310.pyc | Bin 0 -> 981 bytes .../utils/__pycache__/logging.cpython-310.pyc | Bin 0 -> 9625 bytes .../utils/__pycache__/misc.cpython-310.pyc | Bin 0 -> 19391 bytes .../utils/__pycache__/models.cpython-310.pyc | Bin 0 -> 1982 bytes .../__pycache__/packaging.cpython-310.pyc | Bin 0 -> 2074 bytes .../setuptools_build.cpython-310.pyc | Bin 0 -> 4589 bytes .../__pycache__/subprocess.cpython-310.pyc | Bin 0 -> 5768 bytes .../__pycache__/temp_dir.cpython-310.pyc | Bin 0 -> 7291 bytes .../__pycache__/unpacking.cpython-310.pyc | Bin 0 -> 6646 bytes .../utils/__pycache__/urls.cpython-310.pyc | Bin 0 -> 1579 bytes .../__pycache__/virtualenv.cpython-310.pyc | Bin 0 -> 3282 bytes .../utils/__pycache__/wheel.cpython-310.pyc | Bin 0 -> 4407 bytes .../site-packages/pip/_internal/utils/_log.py | 38 + .../pip/_internal/utils/appdirs.py | 52 + .../pip/_internal/utils/compat.py | 63 + .../pip/_internal/utils/compatibility_tags.py | 165 + .../pip/_internal/utils/datetime.py | 11 + .../pip/_internal/utils/deprecation.py | 120 + .../pip/_internal/utils/direct_url_helpers.py | 87 + .../pip/_internal/utils/distutils_args.py | 42 + .../pip/_internal/utils/egg_link.py | 75 + .../pip/_internal/utils/encoding.py | 36 + .../pip/_internal/utils/entrypoints.py | 27 + .../pip/_internal/utils/filesystem.py | 182 + .../pip/_internal/utils/filetypes.py | 27 + .../pip/_internal/utils/glibc.py | 88 + .../pip/_internal/utils/hashes.py | 144 + .../_internal/utils/inject_securetransport.py | 35 + .../pip/_internal/utils/logging.py | 343 + .../site-packages/pip/_internal/utils/misc.py | 653 ++ .../pip/_internal/utils/models.py | 39 + .../pip/_internal/utils/packaging.py | 57 + .../pip/_internal/utils/setuptools_build.py | 195 + .../pip/_internal/utils/subprocess.py | 260 + .../pip/_internal/utils/temp_dir.py | 246 + .../pip/_internal/utils/unpacking.py | 258 + .../site-packages/pip/_internal/utils/urls.py | 62 + .../pip/_internal/utils/virtualenv.py | 104 + .../pip/_internal/utils/wheel.py | 136 + .../pip/_internal/vcs/__init__.py | 15 + .../vcs/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 509 bytes .../vcs/__pycache__/bazaar.cpython-310.pyc | Bin 0 -> 3336 bytes .../vcs/__pycache__/git.cpython-310.pyc | Bin 0 -> 12539 bytes .../vcs/__pycache__/mercurial.cpython-310.pyc | Bin 0 -> 5055 bytes .../__pycache__/subversion.cpython-310.pyc | Bin 0 -> 8443 bytes .../versioncontrol.cpython-310.pyc | Bin 0 -> 21138 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 101 + .../site-packages/pip/_internal/vcs/git.py | 526 + .../pip/_internal/vcs/mercurial.py | 163 + .../pip/_internal/vcs/subversion.py | 324 + .../pip/_internal/vcs/versioncontrol.py | 705 ++ .../pip/_internal/wheel_builder.py | 377 + .../site-packages/pip/_vendor/__init__.py | 111 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 2909 bytes .../__pycache__/distro.cpython-310.pyc | Bin 0 -> 38227 bytes .../_vendor/__pycache__/six.cpython-310.pyc | Bin 0 -> 27576 bytes .../typing_extensions.cpython-310.pyc | Bin 0 -> 66572 bytes .../pip/_vendor/cachecontrol/__init__.py | 18 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 637 bytes .../__pycache__/_cmd.cpython-310.pyc | Bin 0 -> 1575 bytes .../__pycache__/adapter.cpython-310.pyc | Bin 0 -> 3151 bytes .../__pycache__/cache.cpython-310.pyc | Bin 0 -> 1841 bytes .../__pycache__/compat.cpython-310.pyc | Bin 0 -> 751 bytes .../__pycache__/controller.cpython-310.pyc | Bin 0 -> 8205 bytes .../__pycache__/filewrapper.cpython-310.pyc | Bin 0 -> 2787 bytes .../__pycache__/heuristics.cpython-310.pyc | Bin 0 -> 4711 bytes .../__pycache__/serialize.cpython-310.pyc | Bin 0 -> 4246 bytes .../__pycache__/wrapper.cpython-310.pyc | Bin 0 -> 682 bytes .../pip/_vendor/cachecontrol/_cmd.py | 61 + .../pip/_vendor/cachecontrol/adapter.py | 137 + .../pip/_vendor/cachecontrol/cache.py | 43 + .../_vendor/cachecontrol/caches/__init__.py | 6 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 288 bytes .../__pycache__/file_cache.cpython-310.pyc | Bin 0 -> 3362 bytes .../__pycache__/redis_cache.cpython-310.pyc | Bin 0 -> 1568 bytes .../_vendor/cachecontrol/caches/file_cache.py | 150 + .../cachecontrol/caches/redis_cache.py | 37 + .../pip/_vendor/cachecontrol/compat.py | 32 + .../pip/_vendor/cachecontrol/controller.py | 415 + .../pip/_vendor/cachecontrol/filewrapper.py | 111 + .../pip/_vendor/cachecontrol/heuristics.py | 139 + .../pip/_vendor/cachecontrol/serialize.py | 186 + .../pip/_vendor/cachecontrol/wrapper.py | 33 + .../pip/_vendor/certifi/__init__.py | 3 + .../pip/_vendor/certifi/__main__.py | 12 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 270 bytes .../__pycache__/__main__.cpython-310.pyc | Bin 0 -> 449 bytes .../certifi/__pycache__/core.cpython-310.pyc | Bin 0 -> 1508 bytes .../pip/_vendor/certifi/cacert.pem | 4362 ++++++++ .../site-packages/pip/_vendor/certifi/core.py | 76 + .../pip/_vendor/chardet/__init__.py | 83 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1894 bytes .../__pycache__/big5freq.cpython-310.pyc | Bin 0 -> 27173 bytes .../__pycache__/big5prober.cpython-310.pyc | Bin 0 -> 1124 bytes .../chardistribution.cpython-310.pyc | Bin 0 -> 5734 bytes .../charsetgroupprober.cpython-310.pyc | Bin 0 -> 2223 bytes .../__pycache__/charsetprober.cpython-310.pyc | Bin 0 -> 3477 bytes .../codingstatemachine.cpython-310.pyc | Bin 0 -> 2896 bytes .../__pycache__/compat.cpython-310.pyc | Bin 0 -> 395 bytes .../__pycache__/cp949prober.cpython-310.pyc | Bin 0 -> 1131 bytes .../chardet/__pycache__/enums.cpython-310.pyc | Bin 0 -> 2578 bytes .../__pycache__/escprober.cpython-310.pyc | Bin 0 -> 2625 bytes .../chardet/__pycache__/escsm.cpython-310.pyc | Bin 0 -> 8372 bytes .../__pycache__/eucjpprober.cpython-310.pyc | Bin 0 -> 2427 bytes .../__pycache__/euckrfreq.cpython-310.pyc | Bin 0 -> 12057 bytes .../__pycache__/euckrprober.cpython-310.pyc | Bin 0 -> 1132 bytes .../__pycache__/euctwfreq.cpython-310.pyc | Bin 0 -> 27177 bytes .../__pycache__/euctwprober.cpython-310.pyc | Bin 0 -> 1132 bytes .../__pycache__/gb2312freq.cpython-310.pyc | Bin 0 -> 19101 bytes .../__pycache__/gb2312prober.cpython-310.pyc | Bin 0 -> 1140 bytes .../__pycache__/hebrewprober.cpython-310.pyc | Bin 0 -> 3013 bytes .../__pycache__/jisfreq.cpython-310.pyc | Bin 0 -> 22129 bytes .../__pycache__/jpcntx.cpython-310.pyc | Bin 0 -> 37636 bytes .../langbulgarianmodel.cpython-310.pyc | Bin 0 -> 47917 bytes .../langgreekmodel.cpython-310.pyc | Bin 0 -> 46107 bytes .../langhebrewmodel.cpython-310.pyc | Bin 0 -> 44556 bytes .../langhungarianmodel.cpython-310.pyc | Bin 0 -> 47877 bytes .../langrussianmodel.cpython-310.pyc | Bin 0 -> 61010 bytes .../__pycache__/langthaimodel.cpython-310.pyc | Bin 0 -> 44732 bytes .../langturkishmodel.cpython-310.pyc | Bin 0 -> 44573 bytes .../__pycache__/latin1prober.cpython-310.pyc | Bin 0 -> 4423 bytes .../mbcharsetprober.cpython-310.pyc | Bin 0 -> 2242 bytes .../mbcsgroupprober.cpython-310.pyc | Bin 0 -> 1127 bytes .../__pycache__/mbcssm.cpython-310.pyc | Bin 0 -> 18754 bytes .../sbcharsetprober.cpython-310.pyc | Bin 0 -> 3073 bytes .../sbcsgroupprober.cpython-310.pyc | Bin 0 -> 1696 bytes .../__pycache__/sjisprober.cpython-310.pyc | Bin 0 -> 2465 bytes .../universaldetector.cpython-310.pyc | Bin 0 -> 5819 bytes .../__pycache__/utf8prober.cpython-310.pyc | Bin 0 -> 1976 bytes .../__pycache__/version.cpython-310.pyc | Bin 0 -> 433 bytes .../pip/_vendor/chardet/big5freq.py | 386 + .../pip/_vendor/chardet/big5prober.py | 47 + .../pip/_vendor/chardet/chardistribution.py | 233 + .../pip/_vendor/chardet/charsetgroupprober.py | 107 + .../pip/_vendor/chardet/charsetprober.py | 145 + .../pip/_vendor/chardet/cli/__init__.py | 1 + .../cli/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 190 bytes .../__pycache__/chardetect.cpython-310.pyc | Bin 0 -> 2689 bytes .../pip/_vendor/chardet/cli/chardetect.py | 84 + .../pip/_vendor/chardet/codingstatemachine.py | 88 + .../pip/_vendor/chardet/compat.py | 36 + .../pip/_vendor/chardet/cp949prober.py | 49 + .../pip/_vendor/chardet/enums.py | 76 + .../pip/_vendor/chardet/escprober.py | 101 + .../pip/_vendor/chardet/escsm.py | 246 + .../pip/_vendor/chardet/eucjpprober.py | 92 + .../pip/_vendor/chardet/euckrfreq.py | 195 + .../pip/_vendor/chardet/euckrprober.py | 47 + .../pip/_vendor/chardet/euctwfreq.py | 387 + .../pip/_vendor/chardet/euctwprober.py | 46 + .../pip/_vendor/chardet/gb2312freq.py | 283 + .../pip/_vendor/chardet/gb2312prober.py | 46 + .../pip/_vendor/chardet/hebrewprober.py | 292 + .../pip/_vendor/chardet/jisfreq.py | 325 + .../pip/_vendor/chardet/jpcntx.py | 233 + .../pip/_vendor/chardet/langbulgarianmodel.py | 4650 +++++++++ .../pip/_vendor/chardet/langgreekmodel.py | 4398 ++++++++ .../pip/_vendor/chardet/langhebrewmodel.py | 4383 ++++++++ .../pip/_vendor/chardet/langhungarianmodel.py | 4650 +++++++++ .../pip/_vendor/chardet/langrussianmodel.py | 5718 +++++++++++ .../pip/_vendor/chardet/langthaimodel.py | 4383 ++++++++ .../pip/_vendor/chardet/langturkishmodel.py | 4383 ++++++++ .../pip/_vendor/chardet/latin1prober.py | 145 + .../pip/_vendor/chardet/mbcharsetprober.py | 91 + .../pip/_vendor/chardet/mbcsgroupprober.py | 54 + .../pip/_vendor/chardet/mbcssm.py | 572 ++ .../pip/_vendor/chardet/metadata/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 195 bytes .../__pycache__/languages.cpython-310.pyc | Bin 0 -> 7957 bytes .../pip/_vendor/chardet/metadata/languages.py | 310 + .../pip/_vendor/chardet/sbcharsetprober.py | 145 + .../pip/_vendor/chardet/sbcsgroupprober.py | 83 + .../pip/_vendor/chardet/sjisprober.py | 92 + .../pip/_vendor/chardet/universaldetector.py | 286 + .../pip/_vendor/chardet/utf8prober.py | 82 + .../pip/_vendor/chardet/version.py | 9 + .../pip/_vendor/colorama/__init__.py | 6 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 438 bytes .../colorama/__pycache__/ansi.cpython-310.pyc | Bin 0 -> 2999 bytes .../__pycache__/ansitowin32.cpython-310.pyc | Bin 0 -> 7897 bytes .../__pycache__/initialise.cpython-310.pyc | Bin 0 -> 1685 bytes .../__pycache__/win32.cpython-310.pyc | Bin 0 -> 3945 bytes .../__pycache__/winterm.cpython-310.pyc | Bin 0 -> 4562 bytes .../pip/_vendor/colorama/ansi.py | 102 + .../pip/_vendor/colorama/ansitowin32.py | 258 + .../pip/_vendor/colorama/initialise.py | 80 + .../pip/_vendor/colorama/win32.py | 152 + .../pip/_vendor/colorama/winterm.py | 169 + .../pip/_vendor/distlib/__init__.py | 23 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1057 bytes .../__pycache__/compat.cpython-310.pyc | Bin 0 -> 31403 bytes .../__pycache__/database.cpython-310.pyc | Bin 0 -> 42858 bytes .../distlib/__pycache__/index.cpython-310.pyc | Bin 0 -> 17312 bytes .../__pycache__/locators.cpython-310.pyc | Bin 0 -> 38371 bytes .../__pycache__/manifest.cpython-310.pyc | Bin 0 -> 10225 bytes .../__pycache__/markers.cpython-310.pyc | Bin 0 -> 5029 bytes .../__pycache__/metadata.cpython-310.pyc | Bin 0 -> 26557 bytes .../__pycache__/resources.cpython-310.pyc | Bin 0 -> 11031 bytes .../__pycache__/scripts.cpython-310.pyc | Bin 0 -> 11247 bytes .../distlib/__pycache__/util.cpython-310.pyc | Bin 0 -> 51690 bytes .../__pycache__/version.cpython-310.pyc | Bin 0 -> 20144 bytes .../distlib/__pycache__/wheel.cpython-310.pyc | Bin 0 -> 27304 bytes .../pip/_vendor/distlib/compat.py | 1116 +++ .../pip/_vendor/distlib/database.py | 1345 +++ .../pip/_vendor/distlib/index.py | 509 + .../pip/_vendor/distlib/locators.py | 1300 +++ .../pip/_vendor/distlib/manifest.py | 393 + .../pip/_vendor/distlib/markers.py | 152 + .../pip/_vendor/distlib/metadata.py | 1058 ++ .../pip/_vendor/distlib/resources.py | 358 + .../pip/_vendor/distlib/scripts.py | 429 + .../site-packages/pip/_vendor/distlib/util.py | 1932 ++++ .../pip/_vendor/distlib/version.py | 739 ++ .../pip/_vendor/distlib/wheel.py | 1053 ++ .../site-packages/pip/_vendor/distro.py | 1386 +++ .../pip/_vendor/html5lib/__init__.py | 35 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1297 bytes .../__pycache__/_ihatexml.cpython-310.pyc | Bin 0 -> 13852 bytes .../__pycache__/_inputstream.cpython-310.pyc | Bin 0 -> 21669 bytes .../__pycache__/_tokenizer.cpython-310.pyc | Bin 0 -> 37315 bytes .../__pycache__/_utils.cpython-310.pyc | Bin 0 -> 4791 bytes .../__pycache__/constants.cpython-310.pyc | Bin 0 -> 161256 bytes .../__pycache__/html5parser.cpython-310.pyc | Bin 0 -> 88466 bytes .../__pycache__/serializer.cpython-310.pyc | Bin 0 -> 10732 bytes .../pip/_vendor/html5lib/_ihatexml.py | 289 + .../pip/_vendor/html5lib/_inputstream.py | 918 ++ .../pip/_vendor/html5lib/_tokenizer.py | 1735 ++++ .../pip/_vendor/html5lib/_trie/__init__.py | 5 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 347 bytes .../_trie/__pycache__/_base.cpython-310.pyc | Bin 0 -> 1599 bytes .../_trie/__pycache__/py.cpython-310.pyc | Bin 0 -> 2262 bytes .../pip/_vendor/html5lib/_trie/_base.py | 40 + .../pip/_vendor/html5lib/_trie/py.py | 67 + .../pip/_vendor/html5lib/_utils.py | 159 + .../pip/_vendor/html5lib/constants.py | 2946 ++++++ .../pip/_vendor/html5lib/filters/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 195 bytes .../alphabeticalattributes.cpython-310.pyc | Bin 0 -> 1325 bytes .../filters/__pycache__/base.cpython-310.pyc | Bin 0 -> 865 bytes .../inject_meta_charset.cpython-310.pyc | Bin 0 -> 1863 bytes .../filters/__pycache__/lint.cpython-310.pyc | Bin 0 -> 2571 bytes .../__pycache__/optionaltags.cpython-310.pyc | Bin 0 -> 2722 bytes .../__pycache__/sanitizer.cpython-310.pyc | Bin 0 -> 20019 bytes .../__pycache__/whitespace.cpython-310.pyc | Bin 0 -> 1369 bytes .../filters/alphabeticalattributes.py | 29 + .../pip/_vendor/html5lib/filters/base.py | 12 + .../html5lib/filters/inject_meta_charset.py | 73 + .../pip/_vendor/html5lib/filters/lint.py | 93 + .../_vendor/html5lib/filters/optionaltags.py | 207 + .../pip/_vendor/html5lib/filters/sanitizer.py | 916 ++ .../_vendor/html5lib/filters/whitespace.py | 38 + .../pip/_vendor/html5lib/html5parser.py | 2795 ++++++ .../pip/_vendor/html5lib/serializer.py | 409 + .../_vendor/html5lib/treeadapters/__init__.py | 30 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 936 bytes .../__pycache__/genshi.cpython-310.pyc | Bin 0 -> 1548 bytes .../__pycache__/sax.cpython-310.pyc | Bin 0 -> 1455 bytes .../_vendor/html5lib/treeadapters/genshi.py | 54 + .../pip/_vendor/html5lib/treeadapters/sax.py | 50 + .../_vendor/html5lib/treebuilders/__init__.py | 88 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 3327 bytes .../__pycache__/base.cpython-310.pyc | Bin 0 -> 11318 bytes .../__pycache__/dom.cpython-310.pyc | Bin 0 -> 9405 bytes .../__pycache__/etree.cpython-310.pyc | Bin 0 -> 11707 bytes .../__pycache__/etree_lxml.cpython-310.pyc | Bin 0 -> 13022 bytes .../pip/_vendor/html5lib/treebuilders/base.py | 417 + .../pip/_vendor/html5lib/treebuilders/dom.py | 239 + .../_vendor/html5lib/treebuilders/etree.py | 343 + .../html5lib/treebuilders/etree_lxml.py | 392 + .../_vendor/html5lib/treewalkers/__init__.py | 154 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 3977 bytes .../__pycache__/base.cpython-310.pyc | Bin 0 -> 6938 bytes .../__pycache__/dom.cpython-310.pyc | Bin 0 -> 1709 bytes .../__pycache__/etree.cpython-310.pyc | Bin 0 -> 3467 bytes .../__pycache__/etree_lxml.cpython-310.pyc | Bin 0 -> 6554 bytes .../__pycache__/genshi.cpython-310.pyc | Bin 0 -> 1915 bytes .../pip/_vendor/html5lib/treewalkers/base.py | 252 + .../pip/_vendor/html5lib/treewalkers/dom.py | 43 + .../pip/_vendor/html5lib/treewalkers/etree.py | 131 + .../html5lib/treewalkers/etree_lxml.py | 215 + .../_vendor/html5lib/treewalkers/genshi.py | 69 + .../pip/_vendor/idna/__init__.py | 44 + .../idna/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 842 bytes .../idna/__pycache__/codec.cpython-310.pyc | Bin 0 -> 2813 bytes .../idna/__pycache__/compat.cpython-310.pyc | Bin 0 -> 742 bytes .../idna/__pycache__/core.cpython-310.pyc | Bin 0 -> 9434 bytes .../idna/__pycache__/idnadata.cpython-310.pyc | Bin 0 -> 194319 bytes .../__pycache__/intranges.cpython-310.pyc | Bin 0 -> 1979 bytes .../__pycache__/package_data.cpython-310.pyc | Bin 0 -> 206 bytes .../__pycache__/uts46data.cpython-310.pyc | Bin 0 -> 150941 bytes .../site-packages/pip/_vendor/idna/codec.py | 112 + .../site-packages/pip/_vendor/idna/compat.py | 13 + .../site-packages/pip/_vendor/idna/core.py | 397 + .../pip/_vendor/idna/idnadata.py | 4233 ++++++++ .../pip/_vendor/idna/intranges.py | 54 + .../pip/_vendor/idna/package_data.py | 2 + .../pip/_vendor/idna/uts46data.py | 8512 ++++++++++++++++ .../pip/_vendor/msgpack/__init__.py | 54 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1422 bytes .../__pycache__/_version.cpython-310.pyc | Bin 0 -> 213 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 0 -> 1803 bytes .../msgpack/__pycache__/ext.cpython-310.pyc | Bin 0 -> 6311 bytes .../__pycache__/fallback.cpython-310.pyc | Bin 0 -> 25440 bytes .../pip/_vendor/msgpack/_version.py | 1 + .../pip/_vendor/msgpack/exceptions.py | 48 + .../site-packages/pip/_vendor/msgpack/ext.py | 193 + .../pip/_vendor/msgpack/fallback.py | 1012 ++ .../pip/_vendor/packaging/__about__.py | 26 + .../pip/_vendor/packaging/__init__.py | 25 + .../__pycache__/__about__.cpython-310.pyc | Bin 0 -> 585 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 441 bytes .../__pycache__/_manylinux.cpython-310.pyc | Bin 0 -> 7295 bytes .../__pycache__/_musllinux.cpython-310.pyc | Bin 0 -> 4607 bytes .../__pycache__/_structures.cpython-310.pyc | Bin 0 -> 2700 bytes .../__pycache__/markers.cpython-310.pyc | Bin 0 -> 9282 bytes .../__pycache__/requirements.cpython-310.pyc | Bin 0 -> 3970 bytes .../__pycache__/specifiers.cpython-310.pyc | Bin 0 -> 21522 bytes .../__pycache__/tags.cpython-310.pyc | Bin 0 -> 12185 bytes .../__pycache__/utils.cpython-310.pyc | Bin 0 -> 3570 bytes .../__pycache__/version.cpython-310.pyc | Bin 0 -> 12920 bytes .../pip/_vendor/packaging/_manylinux.py | 301 + .../pip/_vendor/packaging/_musllinux.py | 136 + .../pip/_vendor/packaging/_structures.py | 61 + .../pip/_vendor/packaging/markers.py | 304 + .../pip/_vendor/packaging/requirements.py | 146 + .../pip/_vendor/packaging/specifiers.py | 802 ++ .../pip/_vendor/packaging/tags.py | 487 + .../pip/_vendor/packaging/utils.py | 136 + .../pip/_vendor/packaging/version.py | 504 + .../pip/_vendor/pep517/__init__.py | 6 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 308 bytes .../pep517/__pycache__/build.cpython-310.pyc | Bin 0 -> 3591 bytes .../pep517/__pycache__/check.cpython-310.pyc | Bin 0 -> 4555 bytes .../__pycache__/colorlog.cpython-310.pyc | Bin 0 -> 2959 bytes .../pep517/__pycache__/compat.cpython-310.pyc | Bin 0 -> 1532 bytes .../__pycache__/dirtools.cpython-310.pyc | Bin 0 -> 1350 bytes .../__pycache__/envbuild.cpython-310.pyc | Bin 0 -> 4373 bytes .../pep517/__pycache__/meta.cpython-310.pyc | Bin 0 -> 2955 bytes .../__pycache__/wrappers.cpython-310.pyc | Bin 0 -> 12301 bytes .../site-packages/pip/_vendor/pep517/build.py | 127 + .../site-packages/pip/_vendor/pep517/check.py | 207 + .../pip/_vendor/pep517/colorlog.py | 115 + .../pip/_vendor/pep517/compat.py | 51 + .../pip/_vendor/pep517/dirtools.py | 44 + .../pip/_vendor/pep517/envbuild.py | 171 + .../pip/_vendor/pep517/in_process/__init__.py | 17 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 916 bytes .../__pycache__/_in_process.cpython-310.pyc | Bin 0 -> 10063 bytes .../_vendor/pep517/in_process/_in_process.py | 363 + .../site-packages/pip/_vendor/pep517/meta.py | 92 + .../pip/_vendor/pep517/wrappers.py | 375 + .../pip/_vendor/pkg_resources/__init__.py | 3296 ++++++ .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 99871 bytes .../__pycache__/py31compat.cpython-310.pyc | Bin 0 -> 655 bytes .../pip/_vendor/pkg_resources/py31compat.py | 23 + .../pip/_vendor/platformdirs/__init__.py | 331 + .../pip/_vendor/platformdirs/__main__.py | 46 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 10471 bytes .../__pycache__/__main__.cpython-310.pyc | Bin 0 -> 1231 bytes .../__pycache__/android.cpython-310.pyc | Bin 0 -> 4263 bytes .../__pycache__/api.cpython-310.pyc | Bin 0 -> 5197 bytes .../__pycache__/macos.cpython-310.pyc | Bin 0 -> 3185 bytes .../__pycache__/unix.cpython-310.pyc | Bin 0 -> 6886 bytes .../__pycache__/version.cpython-310.pyc | Bin 0 -> 290 bytes .../__pycache__/windows.cpython-310.pyc | Bin 0 -> 6429 bytes .../pip/_vendor/platformdirs/android.py | 119 + .../pip/_vendor/platformdirs/api.py | 156 + .../pip/_vendor/platformdirs/macos.py | 64 + .../pip/_vendor/platformdirs/unix.py | 181 + .../pip/_vendor/platformdirs/version.py | 4 + .../pip/_vendor/platformdirs/windows.py | 182 + .../pip/_vendor/progress/__init__.py | 189 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 5725 bytes .../progress/__pycache__/bar.cpython-310.pyc | Bin 0 -> 2690 bytes .../__pycache__/colors.cpython-310.pyc | Bin 0 -> 1483 bytes .../__pycache__/counter.cpython-310.pyc | Bin 0 -> 1554 bytes .../__pycache__/spinner.cpython-310.pyc | Bin 0 -> 1384 bytes .../site-packages/pip/_vendor/progress/bar.py | 93 + .../pip/_vendor/progress/colors.py | 79 + .../pip/_vendor/progress/counter.py | 47 + .../pip/_vendor/progress/spinner.py | 45 + .../pip/_vendor/pygments/__init__.py | 83 + .../pip/_vendor/pygments/__main__.py | 17 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 2987 bytes .../__pycache__/__main__.cpython-310.pyc | Bin 0 -> 583 bytes .../__pycache__/cmdline.cpython-310.pyc | Bin 0 -> 15446 bytes .../__pycache__/console.cpython-310.pyc | Bin 0 -> 1878 bytes .../__pycache__/filter.cpython-310.pyc | Bin 0 -> 2649 bytes .../__pycache__/formatter.cpython-310.pyc | Bin 0 -> 3005 bytes .../__pycache__/lexer.cpython-310.pyc | Bin 0 -> 24359 bytes .../__pycache__/modeline.cpython-310.pyc | Bin 0 -> 1187 bytes .../__pycache__/plugin.cpython-310.pyc | Bin 0 -> 2039 bytes .../__pycache__/regexopt.cpython-310.pyc | Bin 0 -> 2951 bytes .../__pycache__/scanner.cpython-310.pyc | Bin 0 -> 3552 bytes .../__pycache__/sphinxext.cpython-310.pyc | Bin 0 -> 4537 bytes .../__pycache__/style.cpython-310.pyc | Bin 0 -> 4574 bytes .../__pycache__/token.cpython-310.pyc | Bin 0 -> 4646 bytes .../__pycache__/unistring.cpython-310.pyc | Bin 0 -> 31200 bytes .../pygments/__pycache__/util.cpython-310.pyc | Bin 0 -> 9157 bytes .../pip/_vendor/pygments/cmdline.py | 663 ++ .../pip/_vendor/pygments/console.py | 70 + .../pip/_vendor/pygments/filter.py | 71 + .../pip/_vendor/pygments/filters/__init__.py | 937 ++ .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 29508 bytes .../pip/_vendor/pygments/formatter.py | 94 + .../_vendor/pygments/formatters/__init__.py | 153 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 4663 bytes .../__pycache__/_mapping.cpython-310.pyc | Bin 0 -> 5530 bytes .../__pycache__/bbcode.cpython-310.pyc | Bin 0 -> 3080 bytes .../__pycache__/groff.cpython-310.pyc | Bin 0 -> 4353 bytes .../__pycache__/html.cpython-310.pyc | Bin 0 -> 29064 bytes .../__pycache__/img.cpython-310.pyc | Bin 0 -> 17492 bytes .../__pycache__/irc.cpython-310.pyc | Bin 0 -> 4583 bytes .../__pycache__/latex.cpython-310.pyc | Bin 0 -> 13489 bytes .../__pycache__/other.cpython-310.pyc | Bin 0 -> 4799 bytes .../__pycache__/pangomarkup.cpython-310.pyc | Bin 0 -> 2099 bytes .../__pycache__/rtf.cpython-310.pyc | Bin 0 -> 4129 bytes .../__pycache__/svg.cpython-310.pyc | Bin 0 -> 6327 bytes .../__pycache__/terminal.cpython-310.pyc | Bin 0 -> 3994 bytes .../__pycache__/terminal256.cpython-310.pyc | Bin 0 -> 9244 bytes .../_vendor/pygments/formatters/_mapping.py | 84 + .../pip/_vendor/pygments/formatters/bbcode.py | 108 + .../pip/_vendor/pygments/formatters/groff.py | 168 + .../pip/_vendor/pygments/formatters/html.py | 983 ++ .../pip/_vendor/pygments/formatters/img.py | 641 ++ .../pip/_vendor/pygments/formatters/irc.py | 179 + .../pip/_vendor/pygments/formatters/latex.py | 511 + .../pip/_vendor/pygments/formatters/other.py | 161 + .../pygments/formatters/pangomarkup.py | 83 + .../pip/_vendor/pygments/formatters/rtf.py | 146 + .../pip/_vendor/pygments/formatters/svg.py | 188 + .../_vendor/pygments/formatters/terminal.py | 127 + .../pygments/formatters/terminal256.py | 338 + .../pip/_vendor/pygments/lexer.py | 879 ++ .../pip/_vendor/pygments/lexers/__init__.py | 341 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 9179 bytes .../__pycache__/_mapping.cpython-310.pyc | Bin 0 -> 58117 bytes .../lexers/__pycache__/python.cpython-310.pyc | Bin 0 -> 29378 bytes .../pip/_vendor/pygments/lexers/_mapping.py | 580 ++ .../pip/_vendor/pygments/lexers/python.py | 1188 +++ .../pip/_vendor/pygments/modeline.py | 43 + .../pip/_vendor/pygments/plugin.py | 69 + .../pip/_vendor/pygments/regexopt.py | 91 + .../pip/_vendor/pygments/scanner.py | 104 + .../pip/_vendor/pygments/sphinxext.py | 155 + .../pip/_vendor/pygments/style.py | 197 + .../pip/_vendor/pygments/styles/__init__.py | 93 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 3215 bytes .../pip/_vendor/pygments/token.py | 212 + .../pip/_vendor/pygments/unistring.py | 153 + .../pip/_vendor/pygments/util.py | 308 + .../pip/_vendor/pyparsing/__init__.py | 328 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 7120 bytes .../__pycache__/actions.cpython-310.pyc | Bin 0 -> 7177 bytes .../__pycache__/common.cpython-310.pyc | Bin 0 -> 10100 bytes .../__pycache__/core.cpython-310.pyc | Bin 0 -> 175230 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 0 -> 9067 bytes .../__pycache__/helpers.cpython-310.pyc | Bin 0 -> 34762 bytes .../__pycache__/results.cpython-310.pyc | Bin 0 -> 24774 bytes .../__pycache__/testing.cpython-310.pyc | Bin 0 -> 12095 bytes .../__pycache__/unicode.cpython-310.pyc | Bin 0 -> 9809 bytes .../__pycache__/util.cpython-310.pyc | Bin 0 -> 8600 bytes .../pip/_vendor/pyparsing/actions.py | 207 + .../pip/_vendor/pyparsing/common.py | 424 + .../pip/_vendor/pyparsing/core.py | 5789 +++++++++++ .../pip/_vendor/pyparsing/diagram/__init__.py | 593 ++ .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 15640 bytes .../pip/_vendor/pyparsing/exceptions.py | 267 + .../pip/_vendor/pyparsing/helpers.py | 1069 ++ .../pip/_vendor/pyparsing/results.py | 760 ++ .../pip/_vendor/pyparsing/testing.py | 331 + .../pip/_vendor/pyparsing/unicode.py | 332 + .../pip/_vendor/pyparsing/util.py | 235 + .../pip/_vendor/requests/__init__.py | 154 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 4033 bytes .../__pycache__/__version__.cpython-310.pyc | Bin 0 -> 550 bytes .../_internal_utils.cpython-310.pyc | Bin 0 -> 1302 bytes .../__pycache__/adapters.cpython-310.pyc | Bin 0 -> 17038 bytes .../requests/__pycache__/api.cpython-310.pyc | Bin 0 -> 6649 bytes .../requests/__pycache__/auth.cpython-310.pyc | Bin 0 -> 8092 bytes .../__pycache__/certs.cpython-310.pyc | Bin 0 -> 634 bytes .../__pycache__/compat.cpython-310.pyc | Bin 0 -> 1669 bytes .../__pycache__/cookies.cpython-310.pyc | Bin 0 -> 18682 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 0 -> 5243 bytes .../requests/__pycache__/help.cpython-310.pyc | Bin 0 -> 2902 bytes .../__pycache__/hooks.cpython-310.pyc | Bin 0 -> 989 bytes .../__pycache__/models.cpython-310.pyc | Bin 0 -> 24308 bytes .../__pycache__/packages.cpython-310.pyc | Bin 0 -> 503 bytes .../__pycache__/sessions.cpython-310.pyc | Bin 0 -> 19636 bytes .../__pycache__/status_codes.cpython-310.pyc | Bin 0 -> 4666 bytes .../__pycache__/structures.cpython-310.pyc | Bin 0 -> 4448 bytes .../__pycache__/utils.cpython-310.pyc | Bin 0 -> 24310 bytes .../pip/_vendor/requests/__version__.py | 14 + .../pip/_vendor/requests/_internal_utils.py | 42 + .../pip/_vendor/requests/adapters.py | 538 + .../site-packages/pip/_vendor/requests/api.py | 159 + .../pip/_vendor/requests/auth.py | 305 + .../pip/_vendor/requests/certs.py | 18 + .../pip/_vendor/requests/compat.py | 77 + .../pip/_vendor/requests/cookies.py | 549 + .../pip/_vendor/requests/exceptions.py | 133 + .../pip/_vendor/requests/help.py | 132 + .../pip/_vendor/requests/hooks.py | 34 + .../pip/_vendor/requests/models.py | 973 ++ .../pip/_vendor/requests/packages.py | 16 + .../pip/_vendor/requests/sessions.py | 773 ++ .../pip/_vendor/requests/status_codes.py | 123 + .../pip/_vendor/requests/structures.py | 105 + .../pip/_vendor/requests/utils.py | 1054 ++ .../pip/_vendor/resolvelib/__init__.py | 26 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 601 bytes .../__pycache__/providers.cpython-310.pyc | Bin 0 -> 6652 bytes .../__pycache__/reporters.cpython-310.pyc | Bin 0 -> 2572 bytes .../__pycache__/resolvers.cpython-310.pyc | Bin 0 -> 15125 bytes .../__pycache__/structs.cpython-310.pyc | Bin 0 -> 7158 bytes .../pip/_vendor/resolvelib/compat/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 196 bytes .../collections_abc.cpython-310.pyc | Bin 0 -> 372 bytes .../resolvelib/compat/collections_abc.py | 6 + .../pip/_vendor/resolvelib/providers.py | 133 + .../pip/_vendor/resolvelib/reporters.py | 43 + .../pip/_vendor/resolvelib/resolvers.py | 482 + .../pip/_vendor/resolvelib/structs.py | 165 + .../pip/_vendor/rich/__init__.py | 172 + .../pip/_vendor/rich/__main__.py | 280 + .../rich/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 5886 bytes .../rich/__pycache__/__main__.cpython-310.pyc | Bin 0 -> 7320 bytes .../__pycache__/_cell_widths.cpython-310.pyc | Bin 0 -> 7809 bytes .../__pycache__/_emoji_codes.cpython-310.pyc | Bin 0 -> 360049 bytes .../_emoji_replace.cpython-310.pyc | Bin 0 -> 1189 bytes .../__pycache__/_extension.cpython-310.pyc | Bin 0 -> 490 bytes .../rich/__pycache__/_inspect.cpython-310.pyc | Bin 0 -> 6607 bytes .../__pycache__/_log_render.cpython-310.pyc | Bin 0 -> 2635 bytes .../rich/__pycache__/_loop.cpython-310.pyc | Bin 0 -> 1287 bytes .../__pycache__/_lru_cache.cpython-310.pyc | Bin 0 -> 1570 bytes .../__pycache__/_palettes.cpython-310.pyc | Bin 0 -> 5092 bytes .../rich/__pycache__/_pick.cpython-310.pyc | Bin 0 -> 635 bytes .../rich/__pycache__/_ratio.cpython-310.pyc | Bin 0 -> 5152 bytes .../__pycache__/_spinners.cpython-310.pyc | Bin 0 -> 15208 bytes .../rich/__pycache__/_stack.cpython-310.pyc | Bin 0 -> 833 bytes .../rich/__pycache__/_timer.cpython-310.pyc | Bin 0 -> 682 bytes .../rich/__pycache__/_windows.cpython-310.pyc | Bin 0 -> 1873 bytes .../rich/__pycache__/_wrap.cpython-310.pyc | Bin 0 -> 1511 bytes .../rich/__pycache__/abc.cpython-310.pyc | Bin 0 -> 1309 bytes .../rich/__pycache__/align.cpython-310.pyc | Bin 0 -> 7963 bytes .../rich/__pycache__/ansi.cpython-310.pyc | Bin 0 -> 6012 bytes .../rich/__pycache__/bar.cpython-310.pyc | Bin 0 -> 2978 bytes .../rich/__pycache__/box.cpython-310.pyc | Bin 0 -> 7752 bytes .../rich/__pycache__/cells.cpython-310.pyc | Bin 0 -> 3494 bytes .../rich/__pycache__/color.cpython-310.pyc | Bin 0 -> 16750 bytes .../__pycache__/color_triplet.cpython-310.pyc | Bin 0 -> 1432 bytes .../rich/__pycache__/columns.cpython-310.pyc | Bin 0 -> 6192 bytes .../rich/__pycache__/console.cpython-310.pyc | Bin 0 -> 70437 bytes .../__pycache__/constrain.cpython-310.pyc | Bin 0 -> 1749 bytes .../__pycache__/containers.cpython-310.pyc | Bin 0 -> 6481 bytes .../rich/__pycache__/control.cpython-310.pyc | Bin 0 -> 6824 bytes .../default_styles.cpython-310.pyc | Bin 0 -> 6024 bytes .../rich/__pycache__/diagnose.cpython-310.pyc | Bin 0 -> 350 bytes .../rich/__pycache__/emoji.cpython-310.pyc | Bin 0 -> 3262 bytes .../rich/__pycache__/errors.cpython-310.pyc | Bin 0 -> 1522 bytes .../__pycache__/file_proxy.cpython-310.pyc | Bin 0 -> 2259 bytes .../rich/__pycache__/filesize.cpython-310.pyc | Bin 0 -> 2611 bytes .../__pycache__/highlighter.cpython-310.pyc | Bin 0 -> 5338 bytes .../rich/__pycache__/json.cpython-310.pyc | Bin 0 -> 4742 bytes .../rich/__pycache__/jupyter.cpython-310.pyc | Bin 0 -> 3821 bytes .../rich/__pycache__/layout.cpython-310.pyc | Bin 0 -> 14673 bytes .../rich/__pycache__/live.cpython-310.pyc | Bin 0 -> 11563 bytes .../__pycache__/live_render.cpython-310.pyc | Bin 0 -> 3397 bytes .../rich/__pycache__/logging.cpython-310.pyc | Bin 0 -> 9289 bytes .../rich/__pycache__/markup.cpython-310.pyc | Bin 0 -> 5908 bytes .../rich/__pycache__/measure.cpython-310.pyc | Bin 0 -> 5053 bytes .../rich/__pycache__/padding.cpython-310.pyc | Bin 0 -> 4477 bytes .../rich/__pycache__/pager.cpython-310.pyc | Bin 0 -> 1490 bytes .../rich/__pycache__/palette.cpython-310.pyc | Bin 0 -> 3703 bytes .../rich/__pycache__/panel.cpython-310.pyc | Bin 0 -> 6386 bytes .../rich/__pycache__/pretty.cpython-310.pyc | Bin 0 -> 25098 bytes .../rich/__pycache__/progress.cpython-310.pyc | Bin 0 -> 33326 bytes .../__pycache__/progress_bar.cpython-310.pyc | Bin 0 -> 6702 bytes .../rich/__pycache__/prompt.cpython-310.pyc | Bin 0 -> 11294 bytes .../rich/__pycache__/protocol.cpython-310.pyc | Bin 0 -> 1366 bytes .../rich/__pycache__/region.cpython-310.pyc | Bin 0 -> 522 bytes .../rich/__pycache__/repr.cpython-310.pyc | Bin 0 -> 4035 bytes .../rich/__pycache__/rule.cpython-310.pyc | Bin 0 -> 3732 bytes .../rich/__pycache__/scope.cpython-310.pyc | Bin 0 -> 2983 bytes .../rich/__pycache__/screen.cpython-310.pyc | Bin 0 -> 1874 bytes .../rich/__pycache__/segment.cpython-310.pyc | Bin 0 -> 20564 bytes .../rich/__pycache__/spinner.cpython-310.pyc | Bin 0 -> 4394 bytes .../rich/__pycache__/status.cpython-310.pyc | Bin 0 -> 4588 bytes .../rich/__pycache__/style.cpython-310.pyc | Bin 0 -> 20517 bytes .../rich/__pycache__/styled.cpython-310.pyc | Bin 0 -> 1758 bytes .../rich/__pycache__/syntax.cpython-310.pyc | Bin 0 -> 19031 bytes .../rich/__pycache__/table.cpython-310.pyc | Bin 0 -> 26969 bytes .../rich/__pycache__/tabulate.cpython-310.pyc | Bin 0 -> 1751 bytes .../terminal_theme.cpython-310.pyc | Bin 0 -> 1715 bytes .../rich/__pycache__/text.cpython-310.pyc | Bin 0 -> 39279 bytes .../rich/__pycache__/theme.cpython-310.pyc | Bin 0 -> 4695 bytes .../rich/__pycache__/themes.cpython-310.pyc | Bin 0 -> 288 bytes .../__pycache__/traceback.cpython-310.pyc | Bin 0 -> 19532 bytes .../rich/__pycache__/tree.cpython-310.pyc | Bin 0 -> 7312 bytes .../pip/_vendor/rich/_cell_widths.py | 451 + .../pip/_vendor/rich/_emoji_codes.py | 3610 +++++++ .../pip/_vendor/rich/_emoji_replace.py | 32 + .../pip/_vendor/rich/_extension.py | 10 + .../pip/_vendor/rich/_inspect.py | 210 + .../pip/_vendor/rich/_log_render.py | 94 + .../site-packages/pip/_vendor/rich/_loop.py | 43 + .../pip/_vendor/rich/_lru_cache.py | 34 + .../pip/_vendor/rich/_palettes.py | 309 + .../site-packages/pip/_vendor/rich/_pick.py | 17 + .../site-packages/pip/_vendor/rich/_ratio.py | 160 + .../pip/_vendor/rich/_spinners.py | 848 ++ .../site-packages/pip/_vendor/rich/_stack.py | 16 + .../site-packages/pip/_vendor/rich/_timer.py | 19 + .../pip/_vendor/rich/_windows.py | 72 + .../site-packages/pip/_vendor/rich/_wrap.py | 55 + .../site-packages/pip/_vendor/rich/abc.py | 33 + .../site-packages/pip/_vendor/rich/align.py | 312 + .../site-packages/pip/_vendor/rich/ansi.py | 228 + .../site-packages/pip/_vendor/rich/bar.py | 94 + .../site-packages/pip/_vendor/rich/box.py | 483 + .../site-packages/pip/_vendor/rich/cells.py | 147 + .../site-packages/pip/_vendor/rich/color.py | 581 ++ .../pip/_vendor/rich/color_triplet.py | 38 + .../site-packages/pip/_vendor/rich/columns.py | 187 + .../site-packages/pip/_vendor/rich/console.py | 2211 +++++ .../pip/_vendor/rich/constrain.py | 37 + .../pip/_vendor/rich/containers.py | 167 + .../site-packages/pip/_vendor/rich/control.py | 175 + .../pip/_vendor/rich/default_styles.py | 183 + .../pip/_vendor/rich/diagnose.py | 6 + .../site-packages/pip/_vendor/rich/emoji.py | 96 + .../site-packages/pip/_vendor/rich/errors.py | 34 + .../pip/_vendor/rich/file_proxy.py | 54 + .../pip/_vendor/rich/filesize.py | 89 + .../pip/_vendor/rich/highlighter.py | 147 + .../site-packages/pip/_vendor/rich/json.py | 140 + .../site-packages/pip/_vendor/rich/jupyter.py | 92 + .../site-packages/pip/_vendor/rich/layout.py | 444 + .../site-packages/pip/_vendor/rich/live.py | 365 + .../pip/_vendor/rich/live_render.py | 113 + .../site-packages/pip/_vendor/rich/logging.py | 268 + .../site-packages/pip/_vendor/rich/markup.py | 244 + .../site-packages/pip/_vendor/rich/measure.py | 149 + .../site-packages/pip/_vendor/rich/padding.py | 141 + .../site-packages/pip/_vendor/rich/pager.py | 34 + .../site-packages/pip/_vendor/rich/palette.py | 100 + .../site-packages/pip/_vendor/rich/panel.py | 250 + .../site-packages/pip/_vendor/rich/pretty.py | 903 ++ .../pip/_vendor/rich/progress.py | 1036 ++ .../pip/_vendor/rich/progress_bar.py | 216 + .../site-packages/pip/_vendor/rich/prompt.py | 376 + .../pip/_vendor/rich/protocol.py | 42 + .../site-packages/pip/_vendor/rich/region.py | 10 + .../site-packages/pip/_vendor/rich/repr.py | 151 + .../site-packages/pip/_vendor/rich/rule.py | 115 + .../site-packages/pip/_vendor/rich/scope.py | 86 + .../site-packages/pip/_vendor/rich/screen.py | 54 + .../site-packages/pip/_vendor/rich/segment.py | 720 ++ .../site-packages/pip/_vendor/rich/spinner.py | 134 + .../site-packages/pip/_vendor/rich/status.py | 132 + .../site-packages/pip/_vendor/rich/style.py | 785 ++ .../site-packages/pip/_vendor/rich/styled.py | 42 + .../site-packages/pip/_vendor/rich/syntax.py | 735 ++ .../site-packages/pip/_vendor/rich/table.py | 968 ++ .../pip/_vendor/rich/tabulate.py | 51 + .../pip/_vendor/rich/terminal_theme.py | 55 + .../site-packages/pip/_vendor/rich/text.py | 1282 +++ .../site-packages/pip/_vendor/rich/theme.py | 112 + .../site-packages/pip/_vendor/rich/themes.py | 5 + .../pip/_vendor/rich/traceback.py | 678 ++ .../site-packages/pip/_vendor/rich/tree.py | 249 + .../site-packages/pip/_vendor/six.py | 998 ++ .../pip/_vendor/tenacity/__init__.py | 517 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 16369 bytes .../__pycache__/_asyncio.cpython-310.pyc | Bin 0 -> 2609 bytes .../__pycache__/_utils.cpython-310.pyc | Bin 0 -> 1222 bytes .../__pycache__/after.cpython-310.pyc | Bin 0 -> 1226 bytes .../__pycache__/before.cpython-310.pyc | Bin 0 -> 1104 bytes .../__pycache__/before_sleep.cpython-310.pyc | Bin 0 -> 1406 bytes .../tenacity/__pycache__/nap.cpython-310.pyc | Bin 0 -> 1194 bytes .../__pycache__/retry.cpython-310.pyc | Bin 0 -> 8424 bytes .../tenacity/__pycache__/stop.cpython-310.pyc | Bin 0 -> 4012 bytes .../__pycache__/tornadoweb.cpython-310.pyc | Bin 0 -> 1759 bytes .../tenacity/__pycache__/wait.cpython-310.pyc | Bin 0 -> 7956 bytes .../pip/_vendor/tenacity/_asyncio.py | 92 + .../pip/_vendor/tenacity/_utils.py | 68 + .../pip/_vendor/tenacity/after.py | 46 + .../pip/_vendor/tenacity/before.py | 41 + .../pip/_vendor/tenacity/before_sleep.py | 58 + .../site-packages/pip/_vendor/tenacity/nap.py | 43 + .../pip/_vendor/tenacity/retry.py | 213 + .../pip/_vendor/tenacity/stop.py | 96 + .../pip/_vendor/tenacity/tornadoweb.py | 59 + .../pip/_vendor/tenacity/wait.py | 191 + .../pip/_vendor/tomli/__init__.py | 6 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 374 bytes .../tomli/__pycache__/_parser.cpython-310.pyc | Bin 0 -> 16328 bytes .../tomli/__pycache__/_re.cpython-310.pyc | Bin 0 -> 2418 bytes .../pip/_vendor/tomli/_parser.py | 703 ++ .../site-packages/pip/_vendor/tomli/_re.py | 83 + .../pip/_vendor/typing_extensions.py | 2296 +++++ .../pip/_vendor/urllib3/__init__.py | 85 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 2184 bytes .../__pycache__/_collections.cpython-310.pyc | Bin 0 -> 11349 bytes .../__pycache__/_version.cpython-310.pyc | Bin 0 -> 208 bytes .../__pycache__/connection.cpython-310.pyc | Bin 0 -> 13631 bytes .../connectionpool.cpython-310.pyc | Bin 0 -> 25473 bytes .../pip/_vendor/urllib3/_collections.py | 355 + .../pip/_vendor/urllib3/_version.py | 2 + .../pip/_vendor/urllib3/connection.py | 569 ++ .../pip/_vendor/urllib3/connectionpool.py | 1113 +++ .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 194 bytes .../_appengine_environ.cpython-310.pyc | Bin 0 -> 1374 bytes .../__pycache__/appengine.cpython-310.pyc | Bin 0 -> 8190 bytes .../__pycache__/ntlmpool.cpython-310.pyc | Bin 0 -> 3629 bytes .../urllib3/contrib/_appengine_environ.py | 36 + .../contrib/_securetransport/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 211 bytes .../__pycache__/bindings.cpython-310.pyc | Bin 0 -> 10707 bytes .../__pycache__/low_level.cpython-310.pyc | Bin 0 -> 9094 bytes .../contrib/_securetransport/bindings.py | 519 + .../contrib/_securetransport/low_level.py | 397 + .../pip/_vendor/urllib3/contrib/appengine.py | 314 + .../pip/_vendor/urllib3/contrib/ntlmpool.py | 130 + .../pip/_vendor/urllib3/contrib/pyopenssl.py | 511 + .../urllib3/contrib/securetransport.py | 922 ++ .../pip/_vendor/urllib3/contrib/socks.py | 216 + .../pip/_vendor/urllib3/exceptions.py | 323 + .../pip/_vendor/urllib3/fields.py | 274 + .../pip/_vendor/urllib3/filepost.py | 98 + .../pip/_vendor/urllib3/packages/__init__.py | 0 .../urllib3/packages/backports/__init__.py | 0 .../urllib3/packages/backports/makefile.py | 51 + .../pip/_vendor/urllib3/packages/six.py | 1077 ++ .../pip/_vendor/urllib3/poolmanager.py | 555 ++ .../pip/_vendor/urllib3/request.py | 170 + .../pip/_vendor/urllib3/response.py | 821 ++ .../pip/_vendor/urllib3/util/__init__.py | 49 + .../pip/_vendor/urllib3/util/connection.py | 149 + .../pip/_vendor/urllib3/util/proxy.py | 57 + .../pip/_vendor/urllib3/util/queue.py | 22 + .../pip/_vendor/urllib3/util/request.py | 143 + .../pip/_vendor/urllib3/util/response.py | 107 + .../pip/_vendor/urllib3/util/retry.py | 622 ++ .../pip/_vendor/urllib3/util/ssl_.py | 495 + .../urllib3/util/ssl_match_hostname.py | 161 + .../pip/_vendor/urllib3/util/ssltransport.py | 221 + .../pip/_vendor/urllib3/util/timeout.py | 268 + .../pip/_vendor/urllib3/util/url.py | 432 + .../pip/_vendor/urllib3/util/wait.py | 153 + .../site-packages/pip/_vendor/vendor.txt | 25 + .../pip/_vendor/webencodings/__init__.py | 342 + .../pip/_vendor/webencodings/labels.py | 231 + .../pip/_vendor/webencodings/mklabels.py | 59 + .../pip/_vendor/webencodings/tests.py | 153 + .../_vendor/webencodings/x_user_defined.py | 325 + .../lib/python3.10/site-packages/pip/py.typed | 4 + .../site-packages/pkg_resources/__init__.py | 3303 ++++++ .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 100596 bytes .../pkg_resources/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 188 bytes .../__pycache__/appdirs.cpython-310.pyc | Bin 0 -> 20249 bytes .../__pycache__/pyparsing.cpython-310.pyc | Bin 0 -> 198741 bytes .../pkg_resources/_vendor/appdirs.py | 608 ++ .../_vendor/packaging/__about__.py | 26 + .../_vendor/packaging/__init__.py | 25 + .../__pycache__/__about__.cpython-310.pyc | Bin 0 -> 595 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 451 bytes .../__pycache__/_manylinux.cpython-310.pyc | Bin 0 -> 7305 bytes .../__pycache__/_musllinux.cpython-310.pyc | Bin 0 -> 4617 bytes .../__pycache__/_structures.cpython-310.pyc | Bin 0 -> 2975 bytes .../__pycache__/markers.cpython-310.pyc | Bin 0 -> 9301 bytes .../__pycache__/requirements.cpython-310.pyc | Bin 0 -> 3989 bytes .../__pycache__/specifiers.cpython-310.pyc | Bin 0 -> 22193 bytes .../__pycache__/tags.cpython-310.pyc | Bin 0 -> 12219 bytes .../__pycache__/utils.cpython-310.pyc | Bin 0 -> 3580 bytes .../__pycache__/version.cpython-310.pyc | Bin 0 -> 12930 bytes .../_vendor/packaging/_manylinux.py | 301 + .../_vendor/packaging/_musllinux.py | 136 + .../_vendor/packaging/_structures.py | 67 + .../_vendor/packaging/markers.py | 304 + .../_vendor/packaging/requirements.py | 146 + .../_vendor/packaging/specifiers.py | 828 ++ .../pkg_resources/_vendor/packaging/tags.py | 484 + .../pkg_resources/_vendor/packaging/utils.py | 136 + .../_vendor/packaging/version.py | 504 + .../pkg_resources/_vendor/pyparsing.py | 5742 +++++++++++ .../pkg_resources/extern/__init__.py | 73 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 2896 bytes .../__pycache__/setup.cpython-310.pyc | Bin 0 -> 316 bytes .../data/my-test-package-source/setup.py | 6 + .../setuptools-59.6.0.dist-info/INSTALLER | 1 + .../setuptools-59.6.0.dist-info/LICENSE | 19 + .../setuptools-59.6.0.dist-info/METADATA | 125 + .../setuptools-59.6.0.dist-info/RECORD | 298 + .../setuptools-59.6.0.dist-info/REQUESTED | 0 .../setuptools-59.6.0.dist-info/WHEEL | 5 + .../entry_points.txt | 56 + .../setuptools-59.6.0.dist-info/top_level.txt | 4 + .../site-packages/setuptools/__init__.py | 242 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 8592 bytes .../_deprecation_warning.cpython-310.pyc | Bin 0 -> 549 bytes .../__pycache__/_imp.cpython-310.pyc | Bin 0 -> 2075 bytes .../__pycache__/archive_util.cpython-310.pyc | Bin 0 -> 5845 bytes .../__pycache__/build_meta.cpython-310.pyc | Bin 0 -> 9459 bytes .../__pycache__/config.cpython-310.pyc | Bin 0 -> 20928 bytes .../__pycache__/dep_util.cpython-310.pyc | Bin 0 -> 856 bytes .../__pycache__/depends.cpython-310.pyc | Bin 0 -> 5295 bytes .../__pycache__/dist.cpython-310.pyc | Bin 0 -> 36336 bytes .../__pycache__/errors.cpython-310.pyc | Bin 0 -> 1501 bytes .../__pycache__/extension.cpython-310.pyc | Bin 0 -> 1945 bytes .../__pycache__/glob.cpython-310.pyc | Bin 0 -> 3734 bytes .../__pycache__/installer.cpython-310.pyc | Bin 0 -> 2980 bytes .../__pycache__/launch.cpython-310.pyc | Bin 0 -> 906 bytes .../__pycache__/monkey.cpython-310.pyc | Bin 0 -> 4634 bytes .../__pycache__/msvc.cpython-310.pyc | Bin 0 -> 42638 bytes .../__pycache__/namespaces.cpython-310.pyc | Bin 0 -> 3617 bytes .../__pycache__/package_index.cpython-310.pyc | Bin 0 -> 34764 bytes .../__pycache__/py34compat.cpython-310.pyc | Bin 0 -> 481 bytes .../__pycache__/sandbox.cpython-310.pyc | Bin 0 -> 15757 bytes .../__pycache__/unicode_utils.cpython-310.pyc | Bin 0 -> 1111 bytes .../__pycache__/version.cpython-310.pyc | Bin 0 -> 323 bytes .../__pycache__/wheel.cpython-310.pyc | Bin 0 -> 7349 bytes .../windows_support.cpython-310.pyc | Bin 0 -> 1024 bytes .../setuptools/_deprecation_warning.py | 7 + .../setuptools/_distutils/__init__.py | 24 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 557 bytes .../__pycache__/_msvccompiler.cpython-310.pyc | Bin 0 -> 13834 bytes .../__pycache__/archive_util.cpython-310.pyc | Bin 0 -> 6562 bytes .../__pycache__/bcppcompiler.cpython-310.pyc | Bin 0 -> 6549 bytes .../__pycache__/ccompiler.cpython-310.pyc | Bin 0 -> 33306 bytes .../__pycache__/cmd.cpython-310.pyc | Bin 0 -> 13949 bytes .../__pycache__/config.cpython-310.pyc | Bin 0 -> 3588 bytes .../__pycache__/core.cpython-310.pyc | Bin 0 -> 7089 bytes .../cygwinccompiler.cpython-310.pyc | Bin 0 -> 8996 bytes .../__pycache__/debug.cpython-310.pyc | Bin 0 -> 251 bytes .../__pycache__/dep_util.cpython-310.pyc | Bin 0 -> 2772 bytes .../__pycache__/dir_util.cpython-310.pyc | Bin 0 -> 5883 bytes .../__pycache__/dist.cpython-310.pyc | Bin 0 -> 34048 bytes .../__pycache__/errors.cpython-310.pyc | Bin 0 -> 4993 bytes .../__pycache__/extension.cpython-310.pyc | Bin 0 -> 7007 bytes .../__pycache__/fancy_getopt.cpython-310.pyc | Bin 0 -> 10631 bytes .../__pycache__/file_util.cpython-310.pyc | Bin 0 -> 5977 bytes .../__pycache__/filelist.cpython-310.pyc | Bin 0 -> 10823 bytes .../__pycache__/log.cpython-310.pyc | Bin 0 -> 2308 bytes .../__pycache__/msvc9compiler.cpython-310.pyc | Bin 0 -> 17563 bytes .../__pycache__/msvccompiler.cpython-310.pyc | Bin 0 -> 14782 bytes .../__pycache__/py35compat.cpython-310.pyc | Bin 0 -> 627 bytes .../__pycache__/py38compat.cpython-310.pyc | Bin 0 -> 424 bytes .../__pycache__/spawn.cpython-310.pyc | Bin 0 -> 2894 bytes .../__pycache__/sysconfig.cpython-310.pyc | Bin 0 -> 12875 bytes .../__pycache__/text_file.cpython-310.pyc | Bin 0 -> 8470 bytes .../__pycache__/unixccompiler.cpython-310.pyc | Bin 0 -> 6802 bytes .../__pycache__/util.cpython-310.pyc | Bin 0 -> 14743 bytes .../__pycache__/version.cpython-310.pyc | Bin 0 -> 7844 bytes .../versionpredicate.cpython-310.pyc | Bin 0 -> 5337 bytes .../setuptools/_distutils/_msvccompiler.py | 561 ++ .../setuptools/_distutils/archive_util.py | 256 + .../setuptools/_distutils/bcppcompiler.py | 393 + .../setuptools/_distutils/ccompiler.py | 1123 +++ .../setuptools/_distutils/cmd.py | 403 + .../setuptools/_distutils/command/__init__.py | 31 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 530 bytes .../command/__pycache__/bdist.cpython-310.pyc | Bin 0 -> 3664 bytes .../__pycache__/bdist_dumb.cpython-310.pyc | Bin 0 -> 3643 bytes .../__pycache__/bdist_msi.cpython-310.pyc | Bin 0 -> 19719 bytes .../__pycache__/bdist_rpm.cpython-310.pyc | Bin 0 -> 12287 bytes .../__pycache__/bdist_wininst.cpython-310.pyc | Bin 0 -> 8630 bytes .../command/__pycache__/build.cpython-310.pyc | Bin 0 -> 3892 bytes .../__pycache__/build_clib.cpython-310.pyc | Bin 0 -> 4869 bytes .../__pycache__/build_ext.cpython-310.pyc | Bin 0 -> 16217 bytes .../__pycache__/build_py.cpython-310.pyc | Bin 0 -> 9888 bytes .../__pycache__/build_scripts.cpython-310.pyc | Bin 0 -> 4011 bytes .../command/__pycache__/check.cpython-310.pyc | Bin 0 -> 5008 bytes .../command/__pycache__/clean.cpython-310.pyc | Bin 0 -> 2147 bytes .../__pycache__/config.cpython-310.pyc | Bin 0 -> 10329 bytes .../__pycache__/install.cpython-310.pyc | Bin 0 -> 15267 bytes .../__pycache__/install_data.cpython-310.pyc | Bin 0 -> 2346 bytes .../install_egg_info.cpython-310.pyc | Bin 0 -> 3311 bytes .../install_headers.cpython-310.pyc | Bin 0 -> 1769 bytes .../__pycache__/install_lib.cpython-310.pyc | Bin 0 -> 5171 bytes .../install_scripts.cpython-310.pyc | Bin 0 -> 2198 bytes .../__pycache__/py37compat.cpython-310.pyc | Bin 0 -> 1039 bytes .../__pycache__/register.cpython-310.pyc | Bin 0 -> 8682 bytes .../command/__pycache__/sdist.cpython-310.pyc | Bin 0 -> 14498 bytes .../__pycache__/upload.cpython-310.pyc | Bin 0 -> 5374 bytes .../setuptools/_distutils/command/bdist.py | 143 + .../_distutils/command/bdist_dumb.py | 123 + .../_distutils/command/bdist_msi.py | 749 ++ .../_distutils/command/bdist_rpm.py | 579 ++ .../_distutils/command/bdist_wininst.py | 377 + .../setuptools/_distutils/command/build.py | 157 + .../_distutils/command/build_clib.py | 209 + .../_distutils/command/build_ext.py | 755 ++ .../setuptools/_distutils/command/build_py.py | 392 + .../_distutils/command/build_scripts.py | 152 + .../setuptools/_distutils/command/check.py | 148 + .../setuptools/_distutils/command/clean.py | 76 + .../setuptools/_distutils/command/config.py | 344 + .../setuptools/_distutils/command/install.py | 721 ++ .../_distutils/command/install_data.py | 79 + .../_distutils/command/install_egg_info.py | 84 + .../_distutils/command/install_headers.py | 47 + .../_distutils/command/install_lib.py | 217 + .../_distutils/command/install_scripts.py | 60 + .../_distutils/command/py37compat.py | 30 + .../setuptools/_distutils/command/register.py | 304 + .../setuptools/_distutils/command/sdist.py | 494 + .../setuptools/_distutils/command/upload.py | 214 + .../setuptools/_distutils/config.py | 130 + .../setuptools/_distutils/core.py | 249 + .../setuptools/_distutils/cygwinccompiler.py | 425 + .../setuptools/_distutils/debug.py | 5 + .../setuptools/_distutils/dep_util.py | 92 + .../setuptools/_distutils/dir_util.py | 210 + .../setuptools/_distutils/dist.py | 1257 +++ .../setuptools/_distutils/errors.py | 97 + .../setuptools/_distutils/extension.py | 240 + .../setuptools/_distutils/fancy_getopt.py | 457 + .../setuptools/_distutils/file_util.py | 238 + .../setuptools/_distutils/filelist.py | 355 + .../setuptools/_distutils/log.py | 77 + .../setuptools/_distutils/msvc9compiler.py | 788 ++ .../setuptools/_distutils/msvccompiler.py | 643 ++ .../setuptools/_distutils/py35compat.py | 19 + .../setuptools/_distutils/py38compat.py | 7 + .../setuptools/_distutils/spawn.py | 106 + .../setuptools/_distutils/sysconfig.py | 601 ++ .../setuptools/_distutils/text_file.py | 286 + .../setuptools/_distutils/unixccompiler.py | 325 + .../setuptools/_distutils/util.py | 548 + .../setuptools/_distutils/version.py | 363 + .../setuptools/_distutils/versionpredicate.py | 169 + .../site-packages/setuptools/_imp.py | 82 + .../setuptools/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 185 bytes .../__pycache__/ordered_set.cpython-310.pyc | Bin 0 -> 16321 bytes .../__pycache__/pyparsing.cpython-310.pyc | Bin 0 -> 198738 bytes .../_vendor/more_itertools/__init__.py | 4 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 266 bytes .../__pycache__/more.cpython-310.pyc | Bin 0 -> 109984 bytes .../__pycache__/recipes.cpython-310.pyc | Bin 0 -> 17966 bytes .../setuptools/_vendor/more_itertools/more.py | 3825 +++++++ .../_vendor/more_itertools/recipes.py | 620 ++ .../setuptools/_vendor/ordered_set.py | 488 + .../setuptools/_vendor/packaging/__about__.py | 26 + .../setuptools/_vendor/packaging/__init__.py | 25 + .../__pycache__/__about__.cpython-310.pyc | Bin 0 -> 592 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 448 bytes .../__pycache__/_manylinux.cpython-310.pyc | Bin 0 -> 7302 bytes .../__pycache__/_musllinux.cpython-310.pyc | Bin 0 -> 4614 bytes .../__pycache__/_structures.cpython-310.pyc | Bin 0 -> 2972 bytes .../__pycache__/markers.cpython-310.pyc | Bin 0 -> 9295 bytes .../__pycache__/requirements.cpython-310.pyc | Bin 0 -> 3983 bytes .../__pycache__/specifiers.cpython-310.pyc | Bin 0 -> 22190 bytes .../__pycache__/tags.cpython-310.pyc | Bin 0 -> 12216 bytes .../__pycache__/utils.cpython-310.pyc | Bin 0 -> 3577 bytes .../__pycache__/version.cpython-310.pyc | Bin 0 -> 12927 bytes .../_vendor/packaging/_manylinux.py | 301 + .../_vendor/packaging/_musllinux.py | 136 + .../_vendor/packaging/_structures.py | 67 + .../setuptools/_vendor/packaging/markers.py | 304 + .../_vendor/packaging/requirements.py | 146 + .../_vendor/packaging/specifiers.py | 828 ++ .../setuptools/_vendor/packaging/tags.py | 484 + .../setuptools/_vendor/packaging/utils.py | 136 + .../setuptools/_vendor/packaging/version.py | 504 + .../setuptools/_vendor/pyparsing.py | 5742 +++++++++++ .../site-packages/setuptools/archive_util.py | 205 + .../site-packages/setuptools/build_meta.py | 290 + .../site-packages/setuptools/cli-32.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/cli-64.exe | Bin 0 -> 74752 bytes .../site-packages/setuptools/cli-arm64.exe | Bin 0 -> 137216 bytes .../site-packages/setuptools/cli.exe | Bin 0 -> 65536 bytes .../setuptools/command/__init__.py | 8 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 374 bytes .../command/__pycache__/alias.cpython-310.pyc | Bin 0 -> 2376 bytes .../__pycache__/bdist_egg.cpython-310.pyc | Bin 0 -> 13102 bytes .../__pycache__/bdist_rpm.cpython-310.pyc | Bin 0 -> 1589 bytes .../__pycache__/build_clib.cpython-310.pyc | Bin 0 -> 2463 bytes .../__pycache__/build_ext.cpython-310.pyc | Bin 0 -> 9892 bytes .../__pycache__/build_py.cpython-310.pyc | Bin 0 -> 8265 bytes .../__pycache__/develop.cpython-310.pyc | Bin 0 -> 6152 bytes .../__pycache__/dist_info.cpython-310.pyc | Bin 0 -> 1394 bytes .../__pycache__/easy_install.cpython-310.pyc | Bin 0 -> 65171 bytes .../__pycache__/egg_info.cpython-310.pyc | Bin 0 -> 22750 bytes .../__pycache__/install.cpython-310.pyc | Bin 0 -> 4200 bytes .../install_egg_info.cpython-310.pyc | Bin 0 -> 2925 bytes .../__pycache__/install_lib.cpython-310.pyc | Bin 0 -> 5140 bytes .../install_scripts.cpython-310.pyc | Bin 0 -> 2429 bytes .../__pycache__/py36compat.cpython-310.pyc | Bin 0 -> 4536 bytes .../__pycache__/register.cpython-310.pyc | Bin 0 -> 840 bytes .../__pycache__/rotate.cpython-310.pyc | Bin 0 -> 2507 bytes .../__pycache__/saveopts.cpython-310.pyc | Bin 0 -> 926 bytes .../command/__pycache__/sdist.cpython-310.pyc | Bin 0 -> 6955 bytes .../__pycache__/setopt.cpython-310.pyc | Bin 0 -> 4688 bytes .../command/__pycache__/test.cpython-310.pyc | Bin 0 -> 8132 bytes .../__pycache__/upload.cpython-310.pyc | Bin 0 -> 813 bytes .../__pycache__/upload_docs.cpython-310.pyc | Bin 0 -> 6182 bytes .../site-packages/setuptools/command/alias.py | 78 + .../setuptools/command/bdist_egg.py | 456 + .../setuptools/command/bdist_rpm.py | 40 + .../setuptools/command/build_clib.py | 101 + .../setuptools/command/build_ext.py | 328 + .../setuptools/command/build_py.py | 242 + .../setuptools/command/develop.py | 193 + .../setuptools/command/dist_info.py | 36 + .../setuptools/command/easy_install.py | 2354 +++++ .../setuptools/command/egg_info.py | 755 ++ .../setuptools/command/install.py | 132 + .../setuptools/command/install_egg_info.py | 82 + .../setuptools/command/install_lib.py | 148 + .../setuptools/command/install_scripts.py | 69 + .../setuptools/command/launcher manifest.xml | 15 + .../setuptools/command/py36compat.py | 134 + .../setuptools/command/register.py | 18 + .../setuptools/command/rotate.py | 64 + .../setuptools/command/saveopts.py | 22 + .../site-packages/setuptools/command/sdist.py | 196 + .../setuptools/command/setopt.py | 149 + .../site-packages/setuptools/command/test.py | 252 + .../setuptools/command/upload.py | 17 + .../setuptools/command/upload_docs.py | 202 + .../site-packages/setuptools/config.py | 751 ++ .../site-packages/setuptools/dep_util.py | 25 + .../site-packages/setuptools/depends.py | 176 + .../site-packages/setuptools/dist.py | 1156 +++ .../site-packages/setuptools/errors.py | 40 + .../site-packages/setuptools/extension.py | 55 + .../setuptools/extern/__init__.py | 73 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 2935 bytes .../site-packages/setuptools/glob.py | 167 + .../site-packages/setuptools/gui-32.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/gui-64.exe | Bin 0 -> 75264 bytes .../site-packages/setuptools/gui-arm64.exe | Bin 0 -> 137728 bytes .../site-packages/setuptools/gui.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/installer.py | 104 + .../site-packages/setuptools/launch.py | 36 + .../site-packages/setuptools/monkey.py | 177 + .../site-packages/setuptools/msvc.py | 1805 ++++ .../site-packages/setuptools/namespaces.py | 107 + .../site-packages/setuptools/package_index.py | 1176 +++ .../site-packages/setuptools/py34compat.py | 13 + .../site-packages/setuptools/sandbox.py | 530 + .../setuptools/script (dev).tmpl | 6 + .../site-packages/setuptools/script.tmpl | 3 + .../site-packages/setuptools/unicode_utils.py | 42 + .../site-packages/setuptools/version.py | 6 + .../site-packages/setuptools/wheel.py | 213 + .../setuptools/windows_support.py | 29 + .venvcd/lib64 | 1 + .venvcd/pyvenv.cfg | 3 + Dockerfile | 12 + app/__pycache__/main.cpython-310.pyc | Bin 0 -> 3221 bytes app/__pycache__/srt_parser.cpython-310.pyc | Bin 0 -> 1076 bytes app/app/__init__.py | 0 app/app/main.py | 7 + app/app/services/__init__.py | 0 app/app/translators/__init__.py | 0 app/cache.py | 52 + app/main.py | 157 + app/services/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 142 bytes .../__pycache__/job_store.cpython-310.pyc | Bin 0 -> 150 bytes .../__pycache__/srt_builder.cpython-310.pyc | Bin 0 -> 449 bytes .../__pycache__/srt_parser.cpython-310.pyc | Bin 0 -> 635 bytes .../subtitle_service.cpython-310.pyc | Bin 0 -> 1825 bytes .../__pycache__/translator.cpython-310.pyc | Bin 0 -> 322 bytes app/services/job_store.py | 1 + app/services/srt_builder.py | 10 + app/services/srt_parser.py | 35 + app/services/subtitle_service.py | 193 + app/services/translator.py | 88 + app/srt_parser.py | 41 + app/templates/index.html | 254 + app/translators/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 147 bytes .../__pycache__/base.cpython-310.pyc | Bin 0 -> 688 bytes .../__pycache__/factory.cpython-310.pyc | Bin 0 -> 456 bytes .../__pycache__/fast_engine.cpython-310.pyc | Bin 0 -> 4467 bytes .../__pycache__/smart_engine.cpython-310.pyc | Bin 0 -> 2073 bytes app/translators/base.py | 13 + app/translators/factory.py | 9 + app/translators/fast_engine.py | 151 + app/translators/smart_engine.py | 58 + .../b2bab4fb-c0c8-4075-af90-709c656fc3bd.srt | 5899 +++++++++++ docker-compose.yml | 13 + .../4387cdc8-ebd9-4915-b526-5d4a7322c225.srt | 0 .../71cee33d-7bc1-416c-8422-8af22c180609.srt | 15 + .../80dff354-44c1-4582-8c40-c4fd028206b9.srt | 0 .../81f64999-c81d-4dce-876d-31fb2a4e03af.srt | 5812 +++++++++++ .../b8d32ef9-e430-488f-afb5-faf16ce0793e.srt | 0 .../ce4468e6-4e40-4ede-bd56-317cb704e055.srt | 5785 +++++++++++ .../d971229d-7879-4c67-8aaa-532d8ffc0306.srt | 15 + .../dacd29ee-b044-49bd-b119-4d71e68006c6.srt | 5809 +++++++++++ .../eb0dc107-9104-4c47-983c-adadb7cfa3d4.srt | 15 + requirements.txt | 24 + test_srt.py | 18 + 6046 files changed, 798327 insertions(+) create mode 100644 .env create mode 100644 .env.example create mode 100644 .gitignore create mode 100644 .venv/bin/Activate.ps1 create mode 100644 .venv/bin/activate create mode 100644 .venv/bin/activate.csh create mode 100644 .venv/bin/activate.fish create mode 100755 .venv/bin/deep-translator create mode 100755 .venv/bin/distro create mode 100755 .venv/bin/dt create mode 100755 .venv/bin/fastapi create mode 100755 .venv/bin/httpx create mode 100755 .venv/bin/normalizer create mode 100755 .venv/bin/openai create mode 100755 .venv/bin/pip create mode 100755 .venv/bin/pip3 create mode 100755 .venv/bin/pip3.10 create mode 120000 .venv/bin/python create mode 120000 .venv/bin/python3 create mode 120000 .venv/bin/python3.10 create mode 100755 .venv/bin/tqdm create mode 100755 .venv/bin/uvicorn create mode 100755 .venv/lib/python3.10/site-packages/81d243bd2c585b0f4821__mypyc.cpython-310-x86_64-linux-gnu.so create mode 100644 .venv/lib/python3.10/site-packages/__pycache__/typing_extensions.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/_distutils_hack/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/_distutils_hack/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/_distutils_hack/__pycache__/override.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/_distutils_hack/override.py create mode 100644 .venv/lib/python3.10/site-packages/annotated_doc-0.0.4.dist-info/INSTALLER create mode 100644 .venv/lib/python3.10/site-packages/annotated_doc-0.0.4.dist-info/METADATA create mode 100644 .venv/lib/python3.10/site-packages/annotated_doc-0.0.4.dist-info/RECORD create mode 100644 .venv/lib/python3.10/site-packages/annotated_doc-0.0.4.dist-info/WHEEL create mode 100644 .venv/lib/python3.10/site-packages/annotated_doc-0.0.4.dist-info/entry_points.txt create mode 100644 .venv/lib/python3.10/site-packages/annotated_doc-0.0.4.dist-info/licenses/LICENSE create mode 100644 .venv/lib/python3.10/site-packages/annotated_doc/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/annotated_doc/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/annotated_doc/__pycache__/main.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/annotated_doc/main.py create mode 100644 .venv/lib/python3.10/site-packages/annotated_doc/py.typed create mode 100644 .venv/lib/python3.10/site-packages/annotated_types-0.7.0.dist-info/INSTALLER create mode 100644 .venv/lib/python3.10/site-packages/annotated_types-0.7.0.dist-info/METADATA create mode 100644 .venv/lib/python3.10/site-packages/annotated_types-0.7.0.dist-info/RECORD create mode 100644 .venv/lib/python3.10/site-packages/annotated_types-0.7.0.dist-info/WHEEL create mode 100644 .venv/lib/python3.10/site-packages/annotated_types-0.7.0.dist-info/licenses/LICENSE create mode 100644 .venv/lib/python3.10/site-packages/annotated_types/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/annotated_types/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/annotated_types/__pycache__/test_cases.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/annotated_types/py.typed create mode 100644 .venv/lib/python3.10/site-packages/annotated_types/test_cases.py create mode 100644 .venv/lib/python3.10/site-packages/anyio-4.13.0.dist-info/INSTALLER create mode 100644 .venv/lib/python3.10/site-packages/anyio-4.13.0.dist-info/METADATA create mode 100644 .venv/lib/python3.10/site-packages/anyio-4.13.0.dist-info/RECORD create mode 100644 .venv/lib/python3.10/site-packages/anyio-4.13.0.dist-info/WHEEL create mode 100644 .venv/lib/python3.10/site-packages/anyio-4.13.0.dist-info/entry_points.txt create mode 100644 .venv/lib/python3.10/site-packages/anyio-4.13.0.dist-info/licenses/LICENSE create mode 100644 .venv/lib/python3.10/site-packages/anyio-4.13.0.dist-info/top_level.txt create mode 100644 .venv/lib/python3.10/site-packages/anyio/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/anyio/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/anyio/__pycache__/from_thread.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/anyio/__pycache__/functools.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/anyio/__pycache__/lowlevel.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/anyio/__pycache__/pytest_plugin.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/anyio/__pycache__/to_interpreter.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/anyio/__pycache__/to_process.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/anyio/__pycache__/to_thread.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/anyio/_backends/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/anyio/_backends/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/anyio/_backends/__pycache__/_asyncio.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/anyio/_backends/__pycache__/_trio.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/anyio/_backends/_asyncio.py create mode 100644 .venv/lib/python3.10/site-packages/anyio/_backends/_trio.py create mode 100644 .venv/lib/python3.10/site-packages/anyio/_core/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/anyio/_core/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/anyio/_core/__pycache__/_asyncio_selector_thread.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/anyio/_core/__pycache__/_contextmanagers.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/anyio/_core/__pycache__/_eventloop.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/anyio/_core/__pycache__/_exceptions.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/anyio/_core/__pycache__/_fileio.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/anyio/_core/__pycache__/_resources.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/anyio/_core/__pycache__/_signals.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/anyio/_core/__pycache__/_sockets.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/anyio/_core/__pycache__/_streams.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/anyio/_core/__pycache__/_subprocesses.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/anyio/_core/__pycache__/_synchronization.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/anyio/_core/__pycache__/_tasks.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/anyio/_core/__pycache__/_tempfile.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/anyio/_core/__pycache__/_testing.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/anyio/_core/__pycache__/_typedattr.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/anyio/_core/_asyncio_selector_thread.py create mode 100644 .venv/lib/python3.10/site-packages/anyio/_core/_contextmanagers.py create mode 100644 .venv/lib/python3.10/site-packages/anyio/_core/_eventloop.py create mode 100644 .venv/lib/python3.10/site-packages/anyio/_core/_exceptions.py create mode 100644 .venv/lib/python3.10/site-packages/anyio/_core/_fileio.py create mode 100644 .venv/lib/python3.10/site-packages/anyio/_core/_resources.py create mode 100644 .venv/lib/python3.10/site-packages/anyio/_core/_signals.py create mode 100644 .venv/lib/python3.10/site-packages/anyio/_core/_sockets.py create mode 100644 .venv/lib/python3.10/site-packages/anyio/_core/_streams.py create mode 100644 .venv/lib/python3.10/site-packages/anyio/_core/_subprocesses.py create mode 100644 .venv/lib/python3.10/site-packages/anyio/_core/_synchronization.py create mode 100644 .venv/lib/python3.10/site-packages/anyio/_core/_tasks.py create mode 100644 .venv/lib/python3.10/site-packages/anyio/_core/_tempfile.py create mode 100644 .venv/lib/python3.10/site-packages/anyio/_core/_testing.py create mode 100644 .venv/lib/python3.10/site-packages/anyio/_core/_typedattr.py create mode 100644 .venv/lib/python3.10/site-packages/anyio/abc/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/anyio/abc/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/anyio/abc/__pycache__/_eventloop.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/anyio/abc/__pycache__/_resources.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/anyio/abc/__pycache__/_sockets.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/anyio/abc/__pycache__/_streams.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/anyio/abc/__pycache__/_subprocesses.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/anyio/abc/__pycache__/_tasks.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/anyio/abc/__pycache__/_testing.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/anyio/abc/_eventloop.py create mode 100644 .venv/lib/python3.10/site-packages/anyio/abc/_resources.py create mode 100644 .venv/lib/python3.10/site-packages/anyio/abc/_sockets.py create mode 100644 .venv/lib/python3.10/site-packages/anyio/abc/_streams.py create mode 100644 .venv/lib/python3.10/site-packages/anyio/abc/_subprocesses.py create mode 100644 .venv/lib/python3.10/site-packages/anyio/abc/_tasks.py create mode 100644 .venv/lib/python3.10/site-packages/anyio/abc/_testing.py create mode 100644 .venv/lib/python3.10/site-packages/anyio/from_thread.py create mode 100644 .venv/lib/python3.10/site-packages/anyio/functools.py create mode 100644 .venv/lib/python3.10/site-packages/anyio/lowlevel.py create mode 100644 .venv/lib/python3.10/site-packages/anyio/py.typed create mode 100644 .venv/lib/python3.10/site-packages/anyio/pytest_plugin.py create mode 100644 .venv/lib/python3.10/site-packages/anyio/streams/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/anyio/streams/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/anyio/streams/__pycache__/buffered.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/anyio/streams/__pycache__/file.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/anyio/streams/__pycache__/memory.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/anyio/streams/__pycache__/stapled.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/anyio/streams/__pycache__/text.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/anyio/streams/__pycache__/tls.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/anyio/streams/buffered.py create mode 100644 .venv/lib/python3.10/site-packages/anyio/streams/file.py create mode 100644 .venv/lib/python3.10/site-packages/anyio/streams/memory.py create mode 100644 .venv/lib/python3.10/site-packages/anyio/streams/stapled.py create mode 100644 .venv/lib/python3.10/site-packages/anyio/streams/text.py create mode 100644 .venv/lib/python3.10/site-packages/anyio/streams/tls.py create mode 100644 .venv/lib/python3.10/site-packages/anyio/to_interpreter.py create mode 100644 .venv/lib/python3.10/site-packages/anyio/to_process.py create mode 100644 .venv/lib/python3.10/site-packages/anyio/to_thread.py create mode 100644 .venv/lib/python3.10/site-packages/beautifulsoup4-4.14.3.dist-info/INSTALLER create mode 100644 .venv/lib/python3.10/site-packages/beautifulsoup4-4.14.3.dist-info/METADATA create mode 100644 .venv/lib/python3.10/site-packages/beautifulsoup4-4.14.3.dist-info/RECORD create mode 100644 .venv/lib/python3.10/site-packages/beautifulsoup4-4.14.3.dist-info/WHEEL create mode 100644 .venv/lib/python3.10/site-packages/beautifulsoup4-4.14.3.dist-info/licenses/AUTHORS create mode 100644 .venv/lib/python3.10/site-packages/beautifulsoup4-4.14.3.dist-info/licenses/LICENSE create mode 100644 .venv/lib/python3.10/site-packages/bs4/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/bs4/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/bs4/__pycache__/_deprecation.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/bs4/__pycache__/_typing.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/bs4/__pycache__/_warnings.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/bs4/__pycache__/css.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/bs4/__pycache__/dammit.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/bs4/__pycache__/diagnose.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/bs4/__pycache__/element.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/bs4/__pycache__/exceptions.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/bs4/__pycache__/filter.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/bs4/__pycache__/formatter.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/bs4/_deprecation.py create mode 100644 .venv/lib/python3.10/site-packages/bs4/_typing.py create mode 100644 .venv/lib/python3.10/site-packages/bs4/_warnings.py create mode 100644 .venv/lib/python3.10/site-packages/bs4/builder/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/bs4/builder/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/bs4/builder/__pycache__/_html5lib.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/bs4/builder/__pycache__/_htmlparser.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/bs4/builder/__pycache__/_lxml.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/bs4/builder/_html5lib.py create mode 100644 .venv/lib/python3.10/site-packages/bs4/builder/_htmlparser.py create mode 100644 .venv/lib/python3.10/site-packages/bs4/builder/_lxml.py create mode 100644 .venv/lib/python3.10/site-packages/bs4/css.py create mode 100644 .venv/lib/python3.10/site-packages/bs4/dammit.py create mode 100644 .venv/lib/python3.10/site-packages/bs4/diagnose.py create mode 100644 .venv/lib/python3.10/site-packages/bs4/element.py create mode 100644 .venv/lib/python3.10/site-packages/bs4/exceptions.py create mode 100644 .venv/lib/python3.10/site-packages/bs4/filter.py create mode 100644 .venv/lib/python3.10/site-packages/bs4/formatter.py create mode 100644 .venv/lib/python3.10/site-packages/bs4/py.typed create mode 100644 .venv/lib/python3.10/site-packages/certifi-2026.2.25.dist-info/INSTALLER create mode 100644 .venv/lib/python3.10/site-packages/certifi-2026.2.25.dist-info/METADATA create mode 100644 .venv/lib/python3.10/site-packages/certifi-2026.2.25.dist-info/RECORD create mode 100644 .venv/lib/python3.10/site-packages/certifi-2026.2.25.dist-info/WHEEL create mode 100644 .venv/lib/python3.10/site-packages/certifi-2026.2.25.dist-info/licenses/LICENSE create mode 100644 .venv/lib/python3.10/site-packages/certifi-2026.2.25.dist-info/top_level.txt create mode 100644 .venv/lib/python3.10/site-packages/certifi/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/certifi/__main__.py create mode 100644 .venv/lib/python3.10/site-packages/certifi/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/certifi/__pycache__/__main__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/certifi/__pycache__/core.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/certifi/cacert.pem create mode 100644 .venv/lib/python3.10/site-packages/certifi/core.py create mode 100644 .venv/lib/python3.10/site-packages/certifi/py.typed create mode 100644 .venv/lib/python3.10/site-packages/charset_normalizer-3.4.6.dist-info/INSTALLER create mode 100644 .venv/lib/python3.10/site-packages/charset_normalizer-3.4.6.dist-info/METADATA create mode 100644 .venv/lib/python3.10/site-packages/charset_normalizer-3.4.6.dist-info/RECORD create mode 100644 .venv/lib/python3.10/site-packages/charset_normalizer-3.4.6.dist-info/WHEEL create mode 100644 .venv/lib/python3.10/site-packages/charset_normalizer-3.4.6.dist-info/entry_points.txt create mode 100644 .venv/lib/python3.10/site-packages/charset_normalizer-3.4.6.dist-info/licenses/LICENSE create mode 100644 .venv/lib/python3.10/site-packages/charset_normalizer-3.4.6.dist-info/top_level.txt create mode 100644 .venv/lib/python3.10/site-packages/charset_normalizer/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/charset_normalizer/__main__.py create mode 100644 .venv/lib/python3.10/site-packages/charset_normalizer/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/charset_normalizer/__pycache__/__main__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/charset_normalizer/__pycache__/api.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/charset_normalizer/__pycache__/cd.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/charset_normalizer/__pycache__/constant.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/charset_normalizer/__pycache__/legacy.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/charset_normalizer/__pycache__/md.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/charset_normalizer/__pycache__/models.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/charset_normalizer/__pycache__/utils.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/charset_normalizer/__pycache__/version.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/charset_normalizer/api.py create mode 100755 .venv/lib/python3.10/site-packages/charset_normalizer/cd.cpython-310-x86_64-linux-gnu.so create mode 100644 .venv/lib/python3.10/site-packages/charset_normalizer/cd.py create mode 100644 .venv/lib/python3.10/site-packages/charset_normalizer/cli/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/charset_normalizer/cli/__main__.py create mode 100644 .venv/lib/python3.10/site-packages/charset_normalizer/cli/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/charset_normalizer/cli/__pycache__/__main__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/charset_normalizer/constant.py create mode 100644 .venv/lib/python3.10/site-packages/charset_normalizer/legacy.py create mode 100755 .venv/lib/python3.10/site-packages/charset_normalizer/md.cpython-310-x86_64-linux-gnu.so create mode 100644 .venv/lib/python3.10/site-packages/charset_normalizer/md.py create mode 100644 .venv/lib/python3.10/site-packages/charset_normalizer/models.py create mode 100644 .venv/lib/python3.10/site-packages/charset_normalizer/py.typed create mode 100644 .venv/lib/python3.10/site-packages/charset_normalizer/utils.py create mode 100644 .venv/lib/python3.10/site-packages/charset_normalizer/version.py create mode 100644 .venv/lib/python3.10/site-packages/click-8.3.1.dist-info/INSTALLER create mode 100644 .venv/lib/python3.10/site-packages/click-8.3.1.dist-info/METADATA create mode 100644 .venv/lib/python3.10/site-packages/click-8.3.1.dist-info/RECORD create mode 100644 .venv/lib/python3.10/site-packages/click-8.3.1.dist-info/WHEEL create mode 100644 .venv/lib/python3.10/site-packages/click-8.3.1.dist-info/licenses/LICENSE.txt create mode 100644 .venv/lib/python3.10/site-packages/click/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/click/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/click/__pycache__/_compat.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/click/__pycache__/_termui_impl.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/click/__pycache__/_textwrap.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/click/__pycache__/_utils.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/click/__pycache__/_winconsole.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/click/__pycache__/core.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/click/__pycache__/decorators.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/click/__pycache__/exceptions.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/click/__pycache__/formatting.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/click/__pycache__/globals.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/click/__pycache__/parser.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/click/__pycache__/shell_completion.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/click/__pycache__/termui.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/click/__pycache__/testing.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/click/__pycache__/types.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/click/__pycache__/utils.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/click/_compat.py create mode 100644 .venv/lib/python3.10/site-packages/click/_termui_impl.py create mode 100644 .venv/lib/python3.10/site-packages/click/_textwrap.py create mode 100644 .venv/lib/python3.10/site-packages/click/_utils.py create mode 100644 .venv/lib/python3.10/site-packages/click/_winconsole.py create mode 100644 .venv/lib/python3.10/site-packages/click/core.py create mode 100644 .venv/lib/python3.10/site-packages/click/decorators.py create mode 100644 .venv/lib/python3.10/site-packages/click/exceptions.py create mode 100644 .venv/lib/python3.10/site-packages/click/formatting.py create mode 100644 .venv/lib/python3.10/site-packages/click/globals.py create mode 100644 .venv/lib/python3.10/site-packages/click/parser.py create mode 100644 .venv/lib/python3.10/site-packages/click/py.typed create mode 100644 .venv/lib/python3.10/site-packages/click/shell_completion.py create mode 100644 .venv/lib/python3.10/site-packages/click/termui.py create mode 100644 .venv/lib/python3.10/site-packages/click/testing.py create mode 100644 .venv/lib/python3.10/site-packages/click/types.py create mode 100644 .venv/lib/python3.10/site-packages/click/utils.py create mode 100644 .venv/lib/python3.10/site-packages/deep_translator-1.11.4.dist-info/INSTALLER create mode 100644 .venv/lib/python3.10/site-packages/deep_translator-1.11.4.dist-info/LICENSE create mode 100644 .venv/lib/python3.10/site-packages/deep_translator-1.11.4.dist-info/METADATA create mode 100644 .venv/lib/python3.10/site-packages/deep_translator-1.11.4.dist-info/RECORD create mode 100644 .venv/lib/python3.10/site-packages/deep_translator-1.11.4.dist-info/REQUESTED create mode 100644 .venv/lib/python3.10/site-packages/deep_translator-1.11.4.dist-info/WHEEL create mode 100644 .venv/lib/python3.10/site-packages/deep_translator-1.11.4.dist-info/entry_points.txt create mode 100644 .venv/lib/python3.10/site-packages/deep_translator/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/deep_translator/__main__.py create mode 100644 .venv/lib/python3.10/site-packages/deep_translator/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/deep_translator/__pycache__/__main__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/deep_translator/__pycache__/baidu.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/deep_translator/__pycache__/base.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/deep_translator/__pycache__/chatgpt.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/deep_translator/__pycache__/cli.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/deep_translator/__pycache__/constants.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/deep_translator/__pycache__/deepl.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/deep_translator/__pycache__/detection.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/deep_translator/__pycache__/engines.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/deep_translator/__pycache__/exceptions.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/deep_translator/__pycache__/google.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/deep_translator/__pycache__/libre.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/deep_translator/__pycache__/linguee.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/deep_translator/__pycache__/microsoft.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/deep_translator/__pycache__/mymemory.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/deep_translator/__pycache__/papago.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/deep_translator/__pycache__/pons.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/deep_translator/__pycache__/qcri.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/deep_translator/__pycache__/validate.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/deep_translator/__pycache__/yandex.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/deep_translator/baidu.py create mode 100644 .venv/lib/python3.10/site-packages/deep_translator/base.py create mode 100644 .venv/lib/python3.10/site-packages/deep_translator/chatgpt.py create mode 100644 .venv/lib/python3.10/site-packages/deep_translator/cli.py create mode 100644 .venv/lib/python3.10/site-packages/deep_translator/constants.py create mode 100644 .venv/lib/python3.10/site-packages/deep_translator/deepl.py create mode 100644 .venv/lib/python3.10/site-packages/deep_translator/detection.py create mode 100644 .venv/lib/python3.10/site-packages/deep_translator/engines.py create mode 100644 .venv/lib/python3.10/site-packages/deep_translator/exceptions.py create mode 100644 .venv/lib/python3.10/site-packages/deep_translator/google.py create mode 100644 .venv/lib/python3.10/site-packages/deep_translator/libre.py create mode 100644 .venv/lib/python3.10/site-packages/deep_translator/linguee.py create mode 100644 .venv/lib/python3.10/site-packages/deep_translator/microsoft.py create mode 100644 .venv/lib/python3.10/site-packages/deep_translator/mymemory.py create mode 100644 .venv/lib/python3.10/site-packages/deep_translator/papago.py create mode 100644 .venv/lib/python3.10/site-packages/deep_translator/pons.py create mode 100644 .venv/lib/python3.10/site-packages/deep_translator/qcri.py create mode 100644 .venv/lib/python3.10/site-packages/deep_translator/validate.py create mode 100644 .venv/lib/python3.10/site-packages/deep_translator/yandex.py create mode 100644 .venv/lib/python3.10/site-packages/distro-1.9.0.dist-info/INSTALLER create mode 100644 .venv/lib/python3.10/site-packages/distro-1.9.0.dist-info/LICENSE create mode 100644 .venv/lib/python3.10/site-packages/distro-1.9.0.dist-info/METADATA create mode 100644 .venv/lib/python3.10/site-packages/distro-1.9.0.dist-info/RECORD create mode 100644 .venv/lib/python3.10/site-packages/distro-1.9.0.dist-info/WHEEL create mode 100644 .venv/lib/python3.10/site-packages/distro-1.9.0.dist-info/entry_points.txt create mode 100644 .venv/lib/python3.10/site-packages/distro-1.9.0.dist-info/top_level.txt create mode 100644 .venv/lib/python3.10/site-packages/distro/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/distro/__main__.py create mode 100644 .venv/lib/python3.10/site-packages/distro/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/distro/__pycache__/__main__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/distro/__pycache__/distro.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/distro/distro.py create mode 100644 .venv/lib/python3.10/site-packages/distro/py.typed create mode 100644 .venv/lib/python3.10/site-packages/distutils-precedence.pth create mode 100644 .venv/lib/python3.10/site-packages/exceptiongroup-1.3.1.dist-info/INSTALLER create mode 100644 .venv/lib/python3.10/site-packages/exceptiongroup-1.3.1.dist-info/METADATA create mode 100644 .venv/lib/python3.10/site-packages/exceptiongroup-1.3.1.dist-info/RECORD create mode 100644 .venv/lib/python3.10/site-packages/exceptiongroup-1.3.1.dist-info/WHEEL create mode 100644 .venv/lib/python3.10/site-packages/exceptiongroup-1.3.1.dist-info/licenses/LICENSE create mode 100644 .venv/lib/python3.10/site-packages/exceptiongroup/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/exceptiongroup/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/exceptiongroup/__pycache__/_catch.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/exceptiongroup/__pycache__/_exceptions.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/exceptiongroup/__pycache__/_formatting.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/exceptiongroup/__pycache__/_suppress.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/exceptiongroup/__pycache__/_version.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/exceptiongroup/_catch.py create mode 100644 .venv/lib/python3.10/site-packages/exceptiongroup/_exceptions.py create mode 100644 .venv/lib/python3.10/site-packages/exceptiongroup/_formatting.py create mode 100644 .venv/lib/python3.10/site-packages/exceptiongroup/_suppress.py create mode 100644 .venv/lib/python3.10/site-packages/exceptiongroup/_version.py create mode 100644 .venv/lib/python3.10/site-packages/exceptiongroup/py.typed create mode 100644 .venv/lib/python3.10/site-packages/fastapi-0.135.2.dist-info/INSTALLER create mode 100644 .venv/lib/python3.10/site-packages/fastapi-0.135.2.dist-info/METADATA create mode 100644 .venv/lib/python3.10/site-packages/fastapi-0.135.2.dist-info/RECORD create mode 100644 .venv/lib/python3.10/site-packages/fastapi-0.135.2.dist-info/REQUESTED create mode 100644 .venv/lib/python3.10/site-packages/fastapi-0.135.2.dist-info/WHEEL create mode 100644 .venv/lib/python3.10/site-packages/fastapi-0.135.2.dist-info/entry_points.txt create mode 100644 .venv/lib/python3.10/site-packages/fastapi-0.135.2.dist-info/licenses/LICENSE create mode 100644 .venv/lib/python3.10/site-packages/fastapi/.agents/skills/fastapi/SKILL.md create mode 100644 .venv/lib/python3.10/site-packages/fastapi/.agents/skills/fastapi/references/dependencies.md create mode 100644 .venv/lib/python3.10/site-packages/fastapi/.agents/skills/fastapi/references/other-tools.md create mode 100644 .venv/lib/python3.10/site-packages/fastapi/.agents/skills/fastapi/references/streaming.md create mode 100644 .venv/lib/python3.10/site-packages/fastapi/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/fastapi/__main__.py create mode 100644 .venv/lib/python3.10/site-packages/fastapi/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/fastapi/__pycache__/__main__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/fastapi/__pycache__/applications.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/fastapi/__pycache__/background.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/fastapi/__pycache__/cli.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/fastapi/__pycache__/concurrency.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/fastapi/__pycache__/datastructures.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/fastapi/__pycache__/encoders.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/fastapi/__pycache__/exception_handlers.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/fastapi/__pycache__/exceptions.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/fastapi/__pycache__/logger.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/fastapi/__pycache__/param_functions.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/fastapi/__pycache__/params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/fastapi/__pycache__/requests.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/fastapi/__pycache__/responses.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/fastapi/__pycache__/routing.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/fastapi/__pycache__/sse.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/fastapi/__pycache__/staticfiles.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/fastapi/__pycache__/templating.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/fastapi/__pycache__/testclient.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/fastapi/__pycache__/types.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/fastapi/__pycache__/utils.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/fastapi/__pycache__/websockets.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/fastapi/_compat/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/fastapi/_compat/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/fastapi/_compat/__pycache__/shared.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/fastapi/_compat/__pycache__/v2.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/fastapi/_compat/shared.py create mode 100644 .venv/lib/python3.10/site-packages/fastapi/_compat/v2.py create mode 100644 .venv/lib/python3.10/site-packages/fastapi/applications.py create mode 100644 .venv/lib/python3.10/site-packages/fastapi/background.py create mode 100644 .venv/lib/python3.10/site-packages/fastapi/cli.py create mode 100644 .venv/lib/python3.10/site-packages/fastapi/concurrency.py create mode 100644 .venv/lib/python3.10/site-packages/fastapi/datastructures.py create mode 100644 .venv/lib/python3.10/site-packages/fastapi/dependencies/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/fastapi/dependencies/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/fastapi/dependencies/__pycache__/models.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/fastapi/dependencies/__pycache__/utils.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/fastapi/dependencies/models.py create mode 100644 .venv/lib/python3.10/site-packages/fastapi/dependencies/utils.py create mode 100644 .venv/lib/python3.10/site-packages/fastapi/encoders.py create mode 100644 .venv/lib/python3.10/site-packages/fastapi/exception_handlers.py create mode 100644 .venv/lib/python3.10/site-packages/fastapi/exceptions.py create mode 100644 .venv/lib/python3.10/site-packages/fastapi/logger.py create mode 100644 .venv/lib/python3.10/site-packages/fastapi/middleware/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/fastapi/middleware/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/fastapi/middleware/__pycache__/asyncexitstack.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/fastapi/middleware/__pycache__/cors.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/fastapi/middleware/__pycache__/gzip.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/fastapi/middleware/__pycache__/httpsredirect.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/fastapi/middleware/__pycache__/trustedhost.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/fastapi/middleware/__pycache__/wsgi.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/fastapi/middleware/asyncexitstack.py create mode 100644 .venv/lib/python3.10/site-packages/fastapi/middleware/cors.py create mode 100644 .venv/lib/python3.10/site-packages/fastapi/middleware/gzip.py create mode 100644 .venv/lib/python3.10/site-packages/fastapi/middleware/httpsredirect.py create mode 100644 .venv/lib/python3.10/site-packages/fastapi/middleware/trustedhost.py create mode 100644 .venv/lib/python3.10/site-packages/fastapi/middleware/wsgi.py create mode 100644 .venv/lib/python3.10/site-packages/fastapi/openapi/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/fastapi/openapi/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/fastapi/openapi/__pycache__/constants.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/fastapi/openapi/__pycache__/docs.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/fastapi/openapi/__pycache__/models.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/fastapi/openapi/__pycache__/utils.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/fastapi/openapi/constants.py create mode 100644 .venv/lib/python3.10/site-packages/fastapi/openapi/docs.py create mode 100644 .venv/lib/python3.10/site-packages/fastapi/openapi/models.py create mode 100644 .venv/lib/python3.10/site-packages/fastapi/openapi/utils.py create mode 100644 .venv/lib/python3.10/site-packages/fastapi/param_functions.py create mode 100644 .venv/lib/python3.10/site-packages/fastapi/params.py create mode 100644 .venv/lib/python3.10/site-packages/fastapi/py.typed create mode 100644 .venv/lib/python3.10/site-packages/fastapi/requests.py create mode 100644 .venv/lib/python3.10/site-packages/fastapi/responses.py create mode 100644 .venv/lib/python3.10/site-packages/fastapi/routing.py create mode 100644 .venv/lib/python3.10/site-packages/fastapi/security/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/fastapi/security/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/fastapi/security/__pycache__/api_key.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/fastapi/security/__pycache__/base.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/fastapi/security/__pycache__/http.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/fastapi/security/__pycache__/oauth2.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/fastapi/security/__pycache__/open_id_connect_url.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/fastapi/security/__pycache__/utils.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/fastapi/security/api_key.py create mode 100644 .venv/lib/python3.10/site-packages/fastapi/security/base.py create mode 100644 .venv/lib/python3.10/site-packages/fastapi/security/http.py create mode 100644 .venv/lib/python3.10/site-packages/fastapi/security/oauth2.py create mode 100644 .venv/lib/python3.10/site-packages/fastapi/security/open_id_connect_url.py create mode 100644 .venv/lib/python3.10/site-packages/fastapi/security/utils.py create mode 100644 .venv/lib/python3.10/site-packages/fastapi/sse.py create mode 100644 .venv/lib/python3.10/site-packages/fastapi/staticfiles.py create mode 100644 .venv/lib/python3.10/site-packages/fastapi/templating.py create mode 100644 .venv/lib/python3.10/site-packages/fastapi/testclient.py create mode 100644 .venv/lib/python3.10/site-packages/fastapi/types.py create mode 100644 .venv/lib/python3.10/site-packages/fastapi/utils.py create mode 100644 .venv/lib/python3.10/site-packages/fastapi/websockets.py create mode 100644 .venv/lib/python3.10/site-packages/h11-0.16.0.dist-info/INSTALLER create mode 100644 .venv/lib/python3.10/site-packages/h11-0.16.0.dist-info/METADATA create mode 100644 .venv/lib/python3.10/site-packages/h11-0.16.0.dist-info/RECORD create mode 100644 .venv/lib/python3.10/site-packages/h11-0.16.0.dist-info/WHEEL create mode 100644 .venv/lib/python3.10/site-packages/h11-0.16.0.dist-info/licenses/LICENSE.txt create mode 100644 .venv/lib/python3.10/site-packages/h11-0.16.0.dist-info/top_level.txt create mode 100644 .venv/lib/python3.10/site-packages/h11/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/h11/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/h11/__pycache__/_abnf.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/h11/__pycache__/_connection.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/h11/__pycache__/_events.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/h11/__pycache__/_headers.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/h11/__pycache__/_readers.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/h11/__pycache__/_receivebuffer.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/h11/__pycache__/_state.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/h11/__pycache__/_util.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/h11/__pycache__/_version.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/h11/__pycache__/_writers.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/h11/_abnf.py create mode 100644 .venv/lib/python3.10/site-packages/h11/_connection.py create mode 100644 .venv/lib/python3.10/site-packages/h11/_events.py create mode 100644 .venv/lib/python3.10/site-packages/h11/_headers.py create mode 100644 .venv/lib/python3.10/site-packages/h11/_readers.py create mode 100644 .venv/lib/python3.10/site-packages/h11/_receivebuffer.py create mode 100644 .venv/lib/python3.10/site-packages/h11/_state.py create mode 100644 .venv/lib/python3.10/site-packages/h11/_util.py create mode 100644 .venv/lib/python3.10/site-packages/h11/_version.py create mode 100644 .venv/lib/python3.10/site-packages/h11/_writers.py create mode 100644 .venv/lib/python3.10/site-packages/h11/py.typed create mode 100644 .venv/lib/python3.10/site-packages/httpcore-1.0.9.dist-info/INSTALLER create mode 100644 .venv/lib/python3.10/site-packages/httpcore-1.0.9.dist-info/METADATA create mode 100644 .venv/lib/python3.10/site-packages/httpcore-1.0.9.dist-info/RECORD create mode 100644 .venv/lib/python3.10/site-packages/httpcore-1.0.9.dist-info/WHEEL create mode 100644 .venv/lib/python3.10/site-packages/httpcore-1.0.9.dist-info/licenses/LICENSE.md create mode 100644 .venv/lib/python3.10/site-packages/httpcore/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/httpcore/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpcore/__pycache__/_api.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpcore/__pycache__/_exceptions.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpcore/__pycache__/_models.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpcore/__pycache__/_ssl.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpcore/__pycache__/_synchronization.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpcore/__pycache__/_trace.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpcore/__pycache__/_utils.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_api.py create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_async/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_async/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_async/__pycache__/connection.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_async/__pycache__/connection_pool.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_async/__pycache__/http11.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_async/__pycache__/http2.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_async/__pycache__/http_proxy.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_async/__pycache__/interfaces.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_async/__pycache__/socks_proxy.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_async/connection.py create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_async/connection_pool.py create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_async/http11.py create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_async/http2.py create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_async/http_proxy.py create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_async/interfaces.py create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_async/socks_proxy.py create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_backends/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_backends/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_backends/__pycache__/anyio.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_backends/__pycache__/auto.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_backends/__pycache__/base.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_backends/__pycache__/mock.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_backends/__pycache__/sync.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_backends/__pycache__/trio.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_backends/anyio.py create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_backends/auto.py create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_backends/base.py create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_backends/mock.py create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_backends/sync.py create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_backends/trio.py create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_exceptions.py create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_models.py create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_ssl.py create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_sync/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_sync/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_sync/__pycache__/connection.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_sync/__pycache__/connection_pool.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_sync/__pycache__/http11.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_sync/__pycache__/http2.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_sync/__pycache__/http_proxy.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_sync/__pycache__/interfaces.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_sync/__pycache__/socks_proxy.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_sync/connection.py create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_sync/connection_pool.py create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_sync/http11.py create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_sync/http2.py create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_sync/http_proxy.py create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_sync/interfaces.py create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_sync/socks_proxy.py create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_synchronization.py create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_trace.py create mode 100644 .venv/lib/python3.10/site-packages/httpcore/_utils.py create mode 100644 .venv/lib/python3.10/site-packages/httpcore/py.typed create mode 100644 .venv/lib/python3.10/site-packages/httpx-0.28.1.dist-info/INSTALLER create mode 100644 .venv/lib/python3.10/site-packages/httpx-0.28.1.dist-info/METADATA create mode 100644 .venv/lib/python3.10/site-packages/httpx-0.28.1.dist-info/RECORD create mode 100644 .venv/lib/python3.10/site-packages/httpx-0.28.1.dist-info/WHEEL create mode 100644 .venv/lib/python3.10/site-packages/httpx-0.28.1.dist-info/entry_points.txt create mode 100644 .venv/lib/python3.10/site-packages/httpx-0.28.1.dist-info/licenses/LICENSE.md create mode 100644 .venv/lib/python3.10/site-packages/httpx/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/httpx/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpx/__pycache__/__version__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpx/__pycache__/_api.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpx/__pycache__/_auth.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpx/__pycache__/_client.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpx/__pycache__/_config.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpx/__pycache__/_content.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpx/__pycache__/_decoders.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpx/__pycache__/_exceptions.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpx/__pycache__/_main.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpx/__pycache__/_models.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpx/__pycache__/_multipart.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpx/__pycache__/_status_codes.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpx/__pycache__/_types.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpx/__pycache__/_urlparse.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpx/__pycache__/_urls.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpx/__pycache__/_utils.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpx/__version__.py create mode 100644 .venv/lib/python3.10/site-packages/httpx/_api.py create mode 100644 .venv/lib/python3.10/site-packages/httpx/_auth.py create mode 100644 .venv/lib/python3.10/site-packages/httpx/_client.py create mode 100644 .venv/lib/python3.10/site-packages/httpx/_config.py create mode 100644 .venv/lib/python3.10/site-packages/httpx/_content.py create mode 100644 .venv/lib/python3.10/site-packages/httpx/_decoders.py create mode 100644 .venv/lib/python3.10/site-packages/httpx/_exceptions.py create mode 100644 .venv/lib/python3.10/site-packages/httpx/_main.py create mode 100644 .venv/lib/python3.10/site-packages/httpx/_models.py create mode 100644 .venv/lib/python3.10/site-packages/httpx/_multipart.py create mode 100644 .venv/lib/python3.10/site-packages/httpx/_status_codes.py create mode 100644 .venv/lib/python3.10/site-packages/httpx/_transports/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/httpx/_transports/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpx/_transports/__pycache__/asgi.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpx/_transports/__pycache__/base.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpx/_transports/__pycache__/default.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpx/_transports/__pycache__/mock.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpx/_transports/__pycache__/wsgi.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/httpx/_transports/asgi.py create mode 100644 .venv/lib/python3.10/site-packages/httpx/_transports/base.py create mode 100644 .venv/lib/python3.10/site-packages/httpx/_transports/default.py create mode 100644 .venv/lib/python3.10/site-packages/httpx/_transports/mock.py create mode 100644 .venv/lib/python3.10/site-packages/httpx/_transports/wsgi.py create mode 100644 .venv/lib/python3.10/site-packages/httpx/_types.py create mode 100644 .venv/lib/python3.10/site-packages/httpx/_urlparse.py create mode 100644 .venv/lib/python3.10/site-packages/httpx/_urls.py create mode 100644 .venv/lib/python3.10/site-packages/httpx/_utils.py create mode 100644 .venv/lib/python3.10/site-packages/httpx/py.typed create mode 100644 .venv/lib/python3.10/site-packages/idna-3.11.dist-info/INSTALLER create mode 100644 .venv/lib/python3.10/site-packages/idna-3.11.dist-info/METADATA create mode 100644 .venv/lib/python3.10/site-packages/idna-3.11.dist-info/RECORD create mode 100644 .venv/lib/python3.10/site-packages/idna-3.11.dist-info/WHEEL create mode 100644 .venv/lib/python3.10/site-packages/idna-3.11.dist-info/licenses/LICENSE.md create mode 100644 .venv/lib/python3.10/site-packages/idna/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/idna/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/idna/__pycache__/codec.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/idna/__pycache__/compat.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/idna/__pycache__/core.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/idna/__pycache__/idnadata.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/idna/__pycache__/intranges.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/idna/__pycache__/package_data.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/idna/__pycache__/uts46data.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/idna/codec.py create mode 100644 .venv/lib/python3.10/site-packages/idna/compat.py create mode 100644 .venv/lib/python3.10/site-packages/idna/core.py create mode 100644 .venv/lib/python3.10/site-packages/idna/idnadata.py create mode 100644 .venv/lib/python3.10/site-packages/idna/intranges.py create mode 100644 .venv/lib/python3.10/site-packages/idna/package_data.py create mode 100644 .venv/lib/python3.10/site-packages/idna/py.typed create mode 100644 .venv/lib/python3.10/site-packages/idna/uts46data.py create mode 100644 .venv/lib/python3.10/site-packages/jinja2-3.1.6.dist-info/INSTALLER create mode 100644 .venv/lib/python3.10/site-packages/jinja2-3.1.6.dist-info/METADATA create mode 100644 .venv/lib/python3.10/site-packages/jinja2-3.1.6.dist-info/RECORD create mode 100644 .venv/lib/python3.10/site-packages/jinja2-3.1.6.dist-info/REQUESTED create mode 100644 .venv/lib/python3.10/site-packages/jinja2-3.1.6.dist-info/WHEEL create mode 100644 .venv/lib/python3.10/site-packages/jinja2-3.1.6.dist-info/entry_points.txt create mode 100644 .venv/lib/python3.10/site-packages/jinja2-3.1.6.dist-info/licenses/LICENSE.txt create mode 100644 .venv/lib/python3.10/site-packages/jinja2/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/jinja2/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/jinja2/__pycache__/_identifier.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/jinja2/__pycache__/async_utils.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/jinja2/__pycache__/bccache.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/jinja2/__pycache__/compiler.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/jinja2/__pycache__/constants.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/jinja2/__pycache__/debug.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/jinja2/__pycache__/defaults.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/jinja2/__pycache__/environment.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/jinja2/__pycache__/exceptions.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/jinja2/__pycache__/ext.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/jinja2/__pycache__/filters.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/jinja2/__pycache__/idtracking.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/jinja2/__pycache__/lexer.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/jinja2/__pycache__/loaders.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/jinja2/__pycache__/meta.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/jinja2/__pycache__/nativetypes.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/jinja2/__pycache__/nodes.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/jinja2/__pycache__/optimizer.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/jinja2/__pycache__/parser.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/jinja2/__pycache__/runtime.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/jinja2/__pycache__/sandbox.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/jinja2/__pycache__/tests.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/jinja2/__pycache__/utils.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/jinja2/__pycache__/visitor.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/jinja2/_identifier.py create mode 100644 .venv/lib/python3.10/site-packages/jinja2/async_utils.py create mode 100644 .venv/lib/python3.10/site-packages/jinja2/bccache.py create mode 100644 .venv/lib/python3.10/site-packages/jinja2/compiler.py create mode 100644 .venv/lib/python3.10/site-packages/jinja2/constants.py create mode 100644 .venv/lib/python3.10/site-packages/jinja2/debug.py create mode 100644 .venv/lib/python3.10/site-packages/jinja2/defaults.py create mode 100644 .venv/lib/python3.10/site-packages/jinja2/environment.py create mode 100644 .venv/lib/python3.10/site-packages/jinja2/exceptions.py create mode 100644 .venv/lib/python3.10/site-packages/jinja2/ext.py create mode 100644 .venv/lib/python3.10/site-packages/jinja2/filters.py create mode 100644 .venv/lib/python3.10/site-packages/jinja2/idtracking.py create mode 100644 .venv/lib/python3.10/site-packages/jinja2/lexer.py create mode 100644 .venv/lib/python3.10/site-packages/jinja2/loaders.py create mode 100644 .venv/lib/python3.10/site-packages/jinja2/meta.py create mode 100644 .venv/lib/python3.10/site-packages/jinja2/nativetypes.py create mode 100644 .venv/lib/python3.10/site-packages/jinja2/nodes.py create mode 100644 .venv/lib/python3.10/site-packages/jinja2/optimizer.py create mode 100644 .venv/lib/python3.10/site-packages/jinja2/parser.py create mode 100644 .venv/lib/python3.10/site-packages/jinja2/py.typed create mode 100644 .venv/lib/python3.10/site-packages/jinja2/runtime.py create mode 100644 .venv/lib/python3.10/site-packages/jinja2/sandbox.py create mode 100644 .venv/lib/python3.10/site-packages/jinja2/tests.py create mode 100644 .venv/lib/python3.10/site-packages/jinja2/utils.py create mode 100644 .venv/lib/python3.10/site-packages/jinja2/visitor.py create mode 100644 .venv/lib/python3.10/site-packages/jiter-0.13.0.dist-info/INSTALLER create mode 100644 .venv/lib/python3.10/site-packages/jiter-0.13.0.dist-info/METADATA create mode 100644 .venv/lib/python3.10/site-packages/jiter-0.13.0.dist-info/RECORD create mode 100644 .venv/lib/python3.10/site-packages/jiter-0.13.0.dist-info/WHEEL create mode 100644 .venv/lib/python3.10/site-packages/jiter-0.13.0.dist-info/licenses/LICENSE create mode 100644 .venv/lib/python3.10/site-packages/jiter/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/jiter/__init__.pyi create mode 100644 .venv/lib/python3.10/site-packages/jiter/__pycache__/__init__.cpython-310.pyc create mode 100755 .venv/lib/python3.10/site-packages/jiter/jiter.cpython-310-x86_64-linux-gnu.so create mode 100644 .venv/lib/python3.10/site-packages/jiter/py.typed create mode 100644 .venv/lib/python3.10/site-packages/markupsafe-3.0.3.dist-info/INSTALLER create mode 100644 .venv/lib/python3.10/site-packages/markupsafe-3.0.3.dist-info/METADATA create mode 100644 .venv/lib/python3.10/site-packages/markupsafe-3.0.3.dist-info/RECORD create mode 100644 .venv/lib/python3.10/site-packages/markupsafe-3.0.3.dist-info/WHEEL create mode 100644 .venv/lib/python3.10/site-packages/markupsafe-3.0.3.dist-info/licenses/LICENSE.txt create mode 100644 .venv/lib/python3.10/site-packages/markupsafe-3.0.3.dist-info/top_level.txt create mode 100644 .venv/lib/python3.10/site-packages/markupsafe/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/markupsafe/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/markupsafe/__pycache__/_native.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/markupsafe/_native.py create mode 100644 .venv/lib/python3.10/site-packages/markupsafe/_speedups.c create mode 100755 .venv/lib/python3.10/site-packages/markupsafe/_speedups.cpython-310-x86_64-linux-gnu.so create mode 100644 .venv/lib/python3.10/site-packages/markupsafe/_speedups.pyi create mode 100644 .venv/lib/python3.10/site-packages/markupsafe/py.typed create mode 100644 .venv/lib/python3.10/site-packages/multipart/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/multipart/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/multipart/__pycache__/decoders.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/multipart/__pycache__/exceptions.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/multipart/__pycache__/multipart.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/multipart/decoders.py create mode 100644 .venv/lib/python3.10/site-packages/multipart/exceptions.py create mode 100644 .venv/lib/python3.10/site-packages/multipart/multipart.py create mode 100644 .venv/lib/python3.10/site-packages/openai-2.29.0.dist-info/INSTALLER create mode 100644 .venv/lib/python3.10/site-packages/openai-2.29.0.dist-info/METADATA create mode 100644 .venv/lib/python3.10/site-packages/openai-2.29.0.dist-info/RECORD create mode 100644 .venv/lib/python3.10/site-packages/openai-2.29.0.dist-info/REQUESTED create mode 100644 .venv/lib/python3.10/site-packages/openai-2.29.0.dist-info/WHEEL create mode 100644 .venv/lib/python3.10/site-packages/openai-2.29.0.dist-info/entry_points.txt create mode 100644 .venv/lib/python3.10/site-packages/openai-2.29.0.dist-info/licenses/LICENSE create mode 100644 .venv/lib/python3.10/site-packages/openai/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/__main__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/__pycache__/__main__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/__pycache__/_base_client.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/__pycache__/_client.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/__pycache__/_compat.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/__pycache__/_constants.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/__pycache__/_exceptions.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/__pycache__/_files.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/__pycache__/_legacy_response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/__pycache__/_models.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/__pycache__/_module_client.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/__pycache__/_qs.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/__pycache__/_resource.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/__pycache__/_response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/__pycache__/_streaming.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/__pycache__/_types.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/__pycache__/_version.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/__pycache__/pagination.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/__pycache__/version.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/_base_client.py create mode 100644 .venv/lib/python3.10/site-packages/openai/_client.py create mode 100644 .venv/lib/python3.10/site-packages/openai/_compat.py create mode 100644 .venv/lib/python3.10/site-packages/openai/_constants.py create mode 100644 .venv/lib/python3.10/site-packages/openai/_exceptions.py create mode 100644 .venv/lib/python3.10/site-packages/openai/_extras/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/_extras/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/_extras/__pycache__/_common.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/_extras/__pycache__/numpy_proxy.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/_extras/__pycache__/pandas_proxy.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/_extras/__pycache__/sounddevice_proxy.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/_extras/_common.py create mode 100644 .venv/lib/python3.10/site-packages/openai/_extras/numpy_proxy.py create mode 100644 .venv/lib/python3.10/site-packages/openai/_extras/pandas_proxy.py create mode 100644 .venv/lib/python3.10/site-packages/openai/_extras/sounddevice_proxy.py create mode 100644 .venv/lib/python3.10/site-packages/openai/_files.py create mode 100644 .venv/lib/python3.10/site-packages/openai/_legacy_response.py create mode 100644 .venv/lib/python3.10/site-packages/openai/_models.py create mode 100644 .venv/lib/python3.10/site-packages/openai/_module_client.py create mode 100644 .venv/lib/python3.10/site-packages/openai/_qs.py create mode 100644 .venv/lib/python3.10/site-packages/openai/_resource.py create mode 100644 .venv/lib/python3.10/site-packages/openai/_response.py create mode 100644 .venv/lib/python3.10/site-packages/openai/_streaming.py create mode 100644 .venv/lib/python3.10/site-packages/openai/_types.py create mode 100644 .venv/lib/python3.10/site-packages/openai/_utils/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/_utils/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/_utils/__pycache__/_compat.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/_utils/__pycache__/_datetime_parse.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/_utils/__pycache__/_json.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/_utils/__pycache__/_logs.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/_utils/__pycache__/_proxy.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/_utils/__pycache__/_reflection.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/_utils/__pycache__/_resources_proxy.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/_utils/__pycache__/_streams.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/_utils/__pycache__/_sync.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/_utils/__pycache__/_transform.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/_utils/__pycache__/_typing.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/_utils/__pycache__/_utils.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/_utils/_compat.py create mode 100644 .venv/lib/python3.10/site-packages/openai/_utils/_datetime_parse.py create mode 100644 .venv/lib/python3.10/site-packages/openai/_utils/_json.py create mode 100644 .venv/lib/python3.10/site-packages/openai/_utils/_logs.py create mode 100644 .venv/lib/python3.10/site-packages/openai/_utils/_proxy.py create mode 100644 .venv/lib/python3.10/site-packages/openai/_utils/_reflection.py create mode 100644 .venv/lib/python3.10/site-packages/openai/_utils/_resources_proxy.py create mode 100644 .venv/lib/python3.10/site-packages/openai/_utils/_streams.py create mode 100644 .venv/lib/python3.10/site-packages/openai/_utils/_sync.py create mode 100644 .venv/lib/python3.10/site-packages/openai/_utils/_transform.py create mode 100644 .venv/lib/python3.10/site-packages/openai/_utils/_typing.py create mode 100644 .venv/lib/python3.10/site-packages/openai/_utils/_utils.py create mode 100644 .venv/lib/python3.10/site-packages/openai/_version.py create mode 100644 .venv/lib/python3.10/site-packages/openai/cli/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/cli/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/cli/__pycache__/_cli.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/cli/__pycache__/_errors.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/cli/__pycache__/_models.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/cli/__pycache__/_progress.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/cli/__pycache__/_utils.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/cli/_api/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/cli/_api/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/cli/_api/__pycache__/_main.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/cli/_api/__pycache__/audio.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/cli/_api/__pycache__/completions.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/cli/_api/__pycache__/files.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/cli/_api/__pycache__/image.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/cli/_api/__pycache__/models.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/cli/_api/_main.py create mode 100644 .venv/lib/python3.10/site-packages/openai/cli/_api/audio.py create mode 100644 .venv/lib/python3.10/site-packages/openai/cli/_api/chat/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/cli/_api/chat/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/cli/_api/chat/__pycache__/completions.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/cli/_api/chat/completions.py create mode 100644 .venv/lib/python3.10/site-packages/openai/cli/_api/completions.py create mode 100644 .venv/lib/python3.10/site-packages/openai/cli/_api/files.py create mode 100644 .venv/lib/python3.10/site-packages/openai/cli/_api/fine_tuning/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/cli/_api/fine_tuning/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/cli/_api/fine_tuning/__pycache__/jobs.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/cli/_api/fine_tuning/jobs.py create mode 100644 .venv/lib/python3.10/site-packages/openai/cli/_api/image.py create mode 100644 .venv/lib/python3.10/site-packages/openai/cli/_api/models.py create mode 100644 .venv/lib/python3.10/site-packages/openai/cli/_cli.py create mode 100644 .venv/lib/python3.10/site-packages/openai/cli/_errors.py create mode 100644 .venv/lib/python3.10/site-packages/openai/cli/_models.py create mode 100644 .venv/lib/python3.10/site-packages/openai/cli/_progress.py create mode 100644 .venv/lib/python3.10/site-packages/openai/cli/_tools/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/cli/_tools/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/cli/_tools/__pycache__/_main.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/cli/_tools/__pycache__/fine_tunes.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/cli/_tools/__pycache__/migrate.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/cli/_tools/_main.py create mode 100644 .venv/lib/python3.10/site-packages/openai/cli/_tools/fine_tunes.py create mode 100644 .venv/lib/python3.10/site-packages/openai/cli/_tools/migrate.py create mode 100644 .venv/lib/python3.10/site-packages/openai/cli/_utils.py create mode 100644 .venv/lib/python3.10/site-packages/openai/helpers/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/helpers/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/helpers/__pycache__/local_audio_player.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/helpers/__pycache__/microphone.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/helpers/local_audio_player.py create mode 100644 .venv/lib/python3.10/site-packages/openai/helpers/microphone.py create mode 100644 .venv/lib/python3.10/site-packages/openai/lib/.keep create mode 100644 .venv/lib/python3.10/site-packages/openai/lib/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/lib/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/lib/__pycache__/_old_api.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/lib/__pycache__/_pydantic.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/lib/__pycache__/_realtime.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/lib/__pycache__/_tools.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/lib/__pycache__/_validators.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/lib/__pycache__/azure.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/lib/_old_api.py create mode 100644 .venv/lib/python3.10/site-packages/openai/lib/_parsing/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/lib/_parsing/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/lib/_parsing/__pycache__/_completions.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/lib/_parsing/__pycache__/_responses.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/lib/_parsing/_completions.py create mode 100644 .venv/lib/python3.10/site-packages/openai/lib/_parsing/_responses.py create mode 100644 .venv/lib/python3.10/site-packages/openai/lib/_pydantic.py create mode 100644 .venv/lib/python3.10/site-packages/openai/lib/_realtime.py create mode 100644 .venv/lib/python3.10/site-packages/openai/lib/_tools.py create mode 100644 .venv/lib/python3.10/site-packages/openai/lib/_validators.py create mode 100644 .venv/lib/python3.10/site-packages/openai/lib/azure.py create mode 100644 .venv/lib/python3.10/site-packages/openai/lib/streaming/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/lib/streaming/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/lib/streaming/__pycache__/_assistants.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/lib/streaming/__pycache__/_deltas.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/lib/streaming/_assistants.py create mode 100644 .venv/lib/python3.10/site-packages/openai/lib/streaming/_deltas.py create mode 100644 .venv/lib/python3.10/site-packages/openai/lib/streaming/chat/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/lib/streaming/chat/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/lib/streaming/chat/__pycache__/_completions.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/lib/streaming/chat/__pycache__/_events.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/lib/streaming/chat/__pycache__/_types.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/lib/streaming/chat/_completions.py create mode 100644 .venv/lib/python3.10/site-packages/openai/lib/streaming/chat/_events.py create mode 100644 .venv/lib/python3.10/site-packages/openai/lib/streaming/chat/_types.py create mode 100644 .venv/lib/python3.10/site-packages/openai/lib/streaming/responses/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/lib/streaming/responses/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/lib/streaming/responses/__pycache__/_events.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/lib/streaming/responses/__pycache__/_responses.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/lib/streaming/responses/__pycache__/_types.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/lib/streaming/responses/_events.py create mode 100644 .venv/lib/python3.10/site-packages/openai/lib/streaming/responses/_responses.py create mode 100644 .venv/lib/python3.10/site-packages/openai/lib/streaming/responses/_types.py create mode 100644 .venv/lib/python3.10/site-packages/openai/pagination.py create mode 100644 .venv/lib/python3.10/site-packages/openai/py.typed create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/__pycache__/batches.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/__pycache__/completions.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/__pycache__/embeddings.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/__pycache__/files.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/__pycache__/images.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/__pycache__/models.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/__pycache__/moderations.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/__pycache__/videos.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/audio/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/audio/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/audio/__pycache__/audio.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/audio/__pycache__/speech.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/audio/__pycache__/transcriptions.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/audio/__pycache__/translations.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/audio/audio.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/audio/speech.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/audio/transcriptions.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/audio/translations.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/batches.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/beta/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/beta/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/beta/__pycache__/assistants.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/beta/__pycache__/beta.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/beta/assistants.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/beta/beta.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/beta/chatkit/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/beta/chatkit/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/beta/chatkit/__pycache__/chatkit.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/beta/chatkit/__pycache__/sessions.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/beta/chatkit/__pycache__/threads.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/beta/chatkit/chatkit.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/beta/chatkit/sessions.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/beta/chatkit/threads.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/beta/realtime/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/beta/realtime/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/beta/realtime/__pycache__/realtime.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/beta/realtime/__pycache__/sessions.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/beta/realtime/__pycache__/transcription_sessions.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/beta/realtime/realtime.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/beta/realtime/sessions.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/beta/realtime/transcription_sessions.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/beta/threads/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/beta/threads/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/beta/threads/__pycache__/messages.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/beta/threads/__pycache__/threads.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/beta/threads/messages.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/beta/threads/runs/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/beta/threads/runs/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/beta/threads/runs/__pycache__/runs.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/beta/threads/runs/__pycache__/steps.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/beta/threads/runs/runs.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/beta/threads/runs/steps.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/beta/threads/threads.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/chat/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/chat/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/chat/__pycache__/chat.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/chat/chat.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/chat/completions/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/chat/completions/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/chat/completions/__pycache__/completions.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/chat/completions/__pycache__/messages.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/chat/completions/completions.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/chat/completions/messages.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/completions.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/containers/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/containers/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/containers/__pycache__/containers.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/containers/containers.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/containers/files/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/containers/files/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/containers/files/__pycache__/content.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/containers/files/__pycache__/files.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/containers/files/content.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/containers/files/files.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/conversations/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/conversations/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/conversations/__pycache__/conversations.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/conversations/__pycache__/items.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/conversations/api.md create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/conversations/conversations.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/conversations/items.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/embeddings.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/evals/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/evals/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/evals/__pycache__/evals.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/evals/evals.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/evals/runs/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/evals/runs/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/evals/runs/__pycache__/output_items.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/evals/runs/__pycache__/runs.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/evals/runs/output_items.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/evals/runs/runs.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/files.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/fine_tuning/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/fine_tuning/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/fine_tuning/__pycache__/fine_tuning.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/fine_tuning/alpha/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/fine_tuning/alpha/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/fine_tuning/alpha/__pycache__/alpha.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/fine_tuning/alpha/__pycache__/graders.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/fine_tuning/alpha/alpha.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/fine_tuning/alpha/graders.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/fine_tuning/checkpoints/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/fine_tuning/checkpoints/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/fine_tuning/checkpoints/__pycache__/checkpoints.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/fine_tuning/checkpoints/__pycache__/permissions.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/fine_tuning/checkpoints/checkpoints.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/fine_tuning/checkpoints/permissions.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/fine_tuning/fine_tuning.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/fine_tuning/jobs/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/fine_tuning/jobs/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/fine_tuning/jobs/__pycache__/checkpoints.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/fine_tuning/jobs/__pycache__/jobs.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/fine_tuning/jobs/checkpoints.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/fine_tuning/jobs/jobs.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/images.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/models.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/moderations.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/realtime/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/realtime/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/realtime/__pycache__/calls.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/realtime/__pycache__/client_secrets.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/realtime/__pycache__/realtime.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/realtime/api.md create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/realtime/calls.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/realtime/client_secrets.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/realtime/realtime.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/responses/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/responses/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/responses/__pycache__/input_items.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/responses/__pycache__/input_tokens.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/responses/__pycache__/responses.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/responses/api.md create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/responses/input_items.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/responses/input_tokens.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/responses/responses.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/skills/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/skills/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/skills/__pycache__/content.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/skills/__pycache__/skills.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/skills/content.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/skills/skills.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/skills/versions/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/skills/versions/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/skills/versions/__pycache__/content.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/skills/versions/__pycache__/versions.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/skills/versions/content.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/skills/versions/versions.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/uploads/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/uploads/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/uploads/__pycache__/parts.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/uploads/__pycache__/uploads.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/uploads/parts.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/uploads/uploads.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/vector_stores/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/vector_stores/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/vector_stores/__pycache__/file_batches.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/vector_stores/__pycache__/files.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/vector_stores/__pycache__/vector_stores.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/vector_stores/file_batches.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/vector_stores/files.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/vector_stores/vector_stores.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/videos.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/webhooks/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/webhooks/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/webhooks/__pycache__/webhooks.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/webhooks/api.md create mode 100644 .venv/lib/python3.10/site-packages/openai/resources/webhooks/webhooks.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/audio_model.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/audio_response_format.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/auto_file_chunking_strategy_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/batch.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/batch_create_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/batch_error.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/batch_list_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/batch_request_counts.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/batch_usage.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/chat_model.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/completion.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/completion_choice.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/completion_create_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/completion_usage.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/container_create_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/container_create_response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/container_list_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/container_list_response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/container_retrieve_response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/create_embedding_response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/deleted_skill.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/embedding.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/embedding_create_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/embedding_model.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/eval_create_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/eval_create_response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/eval_custom_data_source_config.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/eval_delete_response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/eval_list_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/eval_list_response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/eval_retrieve_response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/eval_stored_completions_data_source_config.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/eval_update_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/eval_update_response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/file_chunking_strategy.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/file_chunking_strategy_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/file_content.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/file_create_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/file_deleted.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/file_list_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/file_object.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/file_purpose.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/image.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/image_create_variation_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/image_edit_completed_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/image_edit_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/image_edit_partial_image_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/image_edit_stream_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/image_gen_completed_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/image_gen_partial_image_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/image_gen_stream_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/image_generate_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/image_input_reference_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/image_model.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/images_response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/model.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/model_deleted.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/moderation.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/moderation_create_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/moderation_create_response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/moderation_image_url_input_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/moderation_model.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/moderation_multi_modal_input_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/moderation_text_input_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/other_file_chunking_strategy_object.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/skill.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/skill_create_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/skill_list.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/skill_list_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/skill_update_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/static_file_chunking_strategy.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/static_file_chunking_strategy_object.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/static_file_chunking_strategy_object_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/static_file_chunking_strategy_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/upload.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/upload_complete_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/upload_create_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/vector_store.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/vector_store_create_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/vector_store_deleted.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/vector_store_list_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/vector_store_search_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/vector_store_search_response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/vector_store_update_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/video.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/video_create_character_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/video_create_character_response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/video_create_error.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/video_create_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/video_delete_response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/video_download_content_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/video_edit_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/video_extend_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/video_get_character_response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/video_list_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/video_model.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/video_model_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/video_remix_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/video_seconds.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/video_size.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/__pycache__/websocket_connection_options.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/audio/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/audio/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/audio/__pycache__/speech_create_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/audio/__pycache__/speech_model.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/audio/__pycache__/transcription.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/audio/__pycache__/transcription_create_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/audio/__pycache__/transcription_create_response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/audio/__pycache__/transcription_diarized.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/audio/__pycache__/transcription_diarized_segment.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/audio/__pycache__/transcription_include.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/audio/__pycache__/transcription_segment.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/audio/__pycache__/transcription_stream_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/audio/__pycache__/transcription_text_delta_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/audio/__pycache__/transcription_text_done_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/audio/__pycache__/transcription_text_segment_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/audio/__pycache__/transcription_verbose.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/audio/__pycache__/transcription_word.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/audio/__pycache__/translation.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/audio/__pycache__/translation_create_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/audio/__pycache__/translation_create_response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/audio/__pycache__/translation_verbose.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/audio/speech_create_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/audio/speech_model.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/audio/transcription.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/audio/transcription_create_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/audio/transcription_create_response.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/audio/transcription_diarized.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/audio/transcription_diarized_segment.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/audio/transcription_include.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/audio/transcription_segment.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/audio/transcription_stream_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/audio/transcription_text_delta_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/audio/transcription_text_done_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/audio/transcription_text_segment_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/audio/transcription_verbose.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/audio/transcription_word.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/audio/translation.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/audio/translation_create_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/audio/translation_create_response.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/audio/translation_verbose.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/audio_model.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/audio_response_format.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/auto_file_chunking_strategy_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/batch.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/batch_create_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/batch_error.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/batch_list_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/batch_request_counts.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/batch_usage.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/__pycache__/assistant.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/__pycache__/assistant_create_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/__pycache__/assistant_deleted.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/__pycache__/assistant_list_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/__pycache__/assistant_response_format_option.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/__pycache__/assistant_response_format_option_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/__pycache__/assistant_stream_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/__pycache__/assistant_tool.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/__pycache__/assistant_tool_choice.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/__pycache__/assistant_tool_choice_function.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/__pycache__/assistant_tool_choice_function_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/__pycache__/assistant_tool_choice_option.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/__pycache__/assistant_tool_choice_option_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/__pycache__/assistant_tool_choice_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/__pycache__/assistant_tool_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/__pycache__/assistant_update_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/__pycache__/chatkit_workflow.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/__pycache__/code_interpreter_tool.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/__pycache__/code_interpreter_tool_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/__pycache__/file_search_tool.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/__pycache__/file_search_tool_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/__pycache__/function_tool.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/__pycache__/function_tool_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/__pycache__/thread.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/__pycache__/thread_create_and_run_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/__pycache__/thread_create_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/__pycache__/thread_deleted.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/__pycache__/thread_update_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/assistant.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/assistant_create_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/assistant_deleted.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/assistant_list_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/assistant_response_format_option.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/assistant_response_format_option_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/assistant_stream_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/assistant_tool.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/assistant_tool_choice.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/assistant_tool_choice_function.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/assistant_tool_choice_function_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/assistant_tool_choice_option.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/assistant_tool_choice_option_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/assistant_tool_choice_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/assistant_tool_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/assistant_update_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/chat/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/chat/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/chatkit/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/chatkit/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/chatkit/__pycache__/chat_session.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/chatkit/__pycache__/chat_session_automatic_thread_titling.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/chatkit/__pycache__/chat_session_chatkit_configuration.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/chatkit/__pycache__/chat_session_chatkit_configuration_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/chatkit/__pycache__/chat_session_expires_after_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/chatkit/__pycache__/chat_session_file_upload.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/chatkit/__pycache__/chat_session_history.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/chatkit/__pycache__/chat_session_rate_limits.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/chatkit/__pycache__/chat_session_rate_limits_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/chatkit/__pycache__/chat_session_status.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/chatkit/__pycache__/chat_session_workflow_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/chatkit/__pycache__/chatkit_attachment.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/chatkit/__pycache__/chatkit_response_output_text.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/chatkit/__pycache__/chatkit_thread.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/chatkit/__pycache__/chatkit_thread_assistant_message_item.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/chatkit/__pycache__/chatkit_thread_item_list.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/chatkit/__pycache__/chatkit_thread_user_message_item.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/chatkit/__pycache__/chatkit_widget_item.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/chatkit/__pycache__/session_create_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/chatkit/__pycache__/thread_delete_response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/chatkit/__pycache__/thread_list_items_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/chatkit/__pycache__/thread_list_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/chatkit/chat_session.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/chatkit/chat_session_automatic_thread_titling.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/chatkit/chat_session_chatkit_configuration.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/chatkit/chat_session_chatkit_configuration_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/chatkit/chat_session_expires_after_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/chatkit/chat_session_file_upload.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/chatkit/chat_session_history.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/chatkit/chat_session_rate_limits.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/chatkit/chat_session_rate_limits_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/chatkit/chat_session_status.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/chatkit/chat_session_workflow_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/chatkit/chatkit_attachment.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/chatkit/chatkit_response_output_text.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/chatkit/chatkit_thread.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/chatkit/chatkit_thread_assistant_message_item.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/chatkit/chatkit_thread_item_list.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/chatkit/chatkit_thread_user_message_item.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/chatkit/chatkit_widget_item.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/chatkit/session_create_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/chatkit/thread_delete_response.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/chatkit/thread_list_items_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/chatkit/thread_list_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/chatkit_workflow.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/code_interpreter_tool.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/code_interpreter_tool_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/file_search_tool.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/file_search_tool_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/function_tool.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/function_tool_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/conversation_created_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/conversation_item.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/conversation_item_content.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/conversation_item_content_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/conversation_item_create_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/conversation_item_create_event_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/conversation_item_created_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/conversation_item_delete_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/conversation_item_delete_event_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/conversation_item_deleted_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/conversation_item_input_audio_transcription_completed_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/conversation_item_input_audio_transcription_delta_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/conversation_item_input_audio_transcription_failed_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/conversation_item_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/conversation_item_retrieve_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/conversation_item_retrieve_event_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/conversation_item_truncate_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/conversation_item_truncate_event_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/conversation_item_truncated_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/conversation_item_with_reference.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/conversation_item_with_reference_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/error_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/input_audio_buffer_append_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/input_audio_buffer_append_event_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/input_audio_buffer_clear_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/input_audio_buffer_clear_event_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/input_audio_buffer_cleared_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/input_audio_buffer_commit_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/input_audio_buffer_commit_event_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/input_audio_buffer_committed_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/input_audio_buffer_speech_started_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/input_audio_buffer_speech_stopped_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/rate_limits_updated_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/realtime_client_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/realtime_client_event_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/realtime_connect_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/realtime_response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/realtime_response_status.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/realtime_response_usage.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/realtime_server_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/response_audio_delta_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/response_audio_done_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/response_audio_transcript_delta_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/response_audio_transcript_done_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/response_cancel_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/response_cancel_event_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/response_content_part_added_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/response_content_part_done_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/response_create_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/response_create_event_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/response_created_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/response_done_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/response_function_call_arguments_delta_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/response_function_call_arguments_done_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/response_output_item_added_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/response_output_item_done_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/response_text_delta_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/response_text_done_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/session.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/session_create_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/session_create_response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/session_created_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/session_update_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/session_update_event_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/session_updated_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/transcription_session.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/transcription_session_create_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/transcription_session_update.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/transcription_session_update_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/__pycache__/transcription_session_updated_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/conversation_created_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/conversation_item.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/conversation_item_content.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/conversation_item_content_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/conversation_item_create_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/conversation_item_create_event_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/conversation_item_created_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/conversation_item_delete_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/conversation_item_delete_event_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/conversation_item_deleted_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/conversation_item_input_audio_transcription_completed_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/conversation_item_input_audio_transcription_delta_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/conversation_item_input_audio_transcription_failed_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/conversation_item_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/conversation_item_retrieve_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/conversation_item_retrieve_event_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/conversation_item_truncate_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/conversation_item_truncate_event_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/conversation_item_truncated_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/conversation_item_with_reference.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/conversation_item_with_reference_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/error_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/input_audio_buffer_append_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/input_audio_buffer_append_event_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/input_audio_buffer_clear_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/input_audio_buffer_clear_event_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/input_audio_buffer_cleared_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/input_audio_buffer_commit_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/input_audio_buffer_commit_event_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/input_audio_buffer_committed_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/input_audio_buffer_speech_started_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/input_audio_buffer_speech_stopped_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/rate_limits_updated_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/realtime_client_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/realtime_client_event_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/realtime_connect_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/realtime_response.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/realtime_response_status.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/realtime_response_usage.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/realtime_server_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/response_audio_delta_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/response_audio_done_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/response_audio_transcript_delta_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/response_audio_transcript_done_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/response_cancel_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/response_cancel_event_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/response_content_part_added_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/response_content_part_done_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/response_create_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/response_create_event_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/response_created_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/response_done_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/response_function_call_arguments_delta_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/response_function_call_arguments_done_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/response_output_item_added_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/response_output_item_done_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/response_text_delta_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/response_text_done_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/session.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/session_create_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/session_create_response.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/session_created_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/session_update_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/session_update_event_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/session_updated_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/transcription_session.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/transcription_session_create_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/transcription_session_update.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/transcription_session_update_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/realtime/transcription_session_updated_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/thread.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/thread_create_and_run_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/thread_create_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/thread_deleted.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/thread_update_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/__pycache__/annotation.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/__pycache__/annotation_delta.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/__pycache__/file_citation_annotation.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/__pycache__/file_citation_delta_annotation.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/__pycache__/file_path_annotation.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/__pycache__/file_path_delta_annotation.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/__pycache__/image_file.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/__pycache__/image_file_content_block.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/__pycache__/image_file_content_block_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/__pycache__/image_file_delta.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/__pycache__/image_file_delta_block.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/__pycache__/image_file_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/__pycache__/image_url.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/__pycache__/image_url_content_block.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/__pycache__/image_url_content_block_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/__pycache__/image_url_delta.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/__pycache__/image_url_delta_block.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/__pycache__/image_url_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/__pycache__/message.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/__pycache__/message_content.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/__pycache__/message_content_delta.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/__pycache__/message_content_part_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/__pycache__/message_create_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/__pycache__/message_deleted.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/__pycache__/message_delta.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/__pycache__/message_delta_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/__pycache__/message_list_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/__pycache__/message_update_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/__pycache__/refusal_content_block.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/__pycache__/refusal_delta_block.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/__pycache__/required_action_function_tool_call.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/__pycache__/run.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/__pycache__/run_create_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/__pycache__/run_list_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/__pycache__/run_status.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/__pycache__/run_submit_tool_outputs_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/__pycache__/run_update_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/__pycache__/text.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/__pycache__/text_content_block.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/__pycache__/text_content_block_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/__pycache__/text_delta.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/__pycache__/text_delta_block.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/annotation.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/annotation_delta.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/file_citation_annotation.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/file_citation_delta_annotation.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/file_path_annotation.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/file_path_delta_annotation.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/image_file.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/image_file_content_block.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/image_file_content_block_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/image_file_delta.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/image_file_delta_block.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/image_file_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/image_url.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/image_url_content_block.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/image_url_content_block_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/image_url_delta.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/image_url_delta_block.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/image_url_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/message.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/message_content.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/message_content_delta.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/message_content_part_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/message_create_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/message_deleted.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/message_delta.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/message_delta_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/message_list_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/message_update_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/refusal_content_block.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/refusal_delta_block.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/required_action_function_tool_call.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/run.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/run_create_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/run_list_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/run_status.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/run_submit_tool_outputs_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/run_update_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/runs/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/runs/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/runs/__pycache__/code_interpreter_logs.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/runs/__pycache__/code_interpreter_output_image.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/runs/__pycache__/code_interpreter_tool_call.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/runs/__pycache__/code_interpreter_tool_call_delta.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/runs/__pycache__/file_search_tool_call.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/runs/__pycache__/file_search_tool_call_delta.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/runs/__pycache__/function_tool_call.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/runs/__pycache__/function_tool_call_delta.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/runs/__pycache__/message_creation_step_details.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/runs/__pycache__/run_step.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/runs/__pycache__/run_step_delta.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/runs/__pycache__/run_step_delta_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/runs/__pycache__/run_step_delta_message_delta.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/runs/__pycache__/run_step_include.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/runs/__pycache__/step_list_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/runs/__pycache__/step_retrieve_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/runs/__pycache__/tool_call.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/runs/__pycache__/tool_call_delta.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/runs/__pycache__/tool_call_delta_object.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/runs/__pycache__/tool_calls_step_details.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/runs/code_interpreter_logs.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/runs/code_interpreter_output_image.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/runs/code_interpreter_tool_call.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/runs/code_interpreter_tool_call_delta.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/runs/file_search_tool_call.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/runs/file_search_tool_call_delta.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/runs/function_tool_call.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/runs/function_tool_call_delta.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/runs/message_creation_step_details.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/runs/run_step.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/runs/run_step_delta.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/runs/run_step_delta_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/runs/run_step_delta_message_delta.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/runs/run_step_include.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/runs/step_list_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/runs/step_retrieve_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/runs/tool_call.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/runs/tool_call_delta.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/runs/tool_call_delta_object.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/runs/tool_calls_step_details.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/text.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/text_content_block.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/text_content_block_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/text_delta.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/beta/threads/text_delta_block.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__pycache__/chat_completion.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__pycache__/chat_completion_allowed_tool_choice_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__pycache__/chat_completion_allowed_tools_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__pycache__/chat_completion_assistant_message_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__pycache__/chat_completion_audio.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__pycache__/chat_completion_audio_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__pycache__/chat_completion_chunk.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__pycache__/chat_completion_content_part_image.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__pycache__/chat_completion_content_part_image_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__pycache__/chat_completion_content_part_input_audio_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__pycache__/chat_completion_content_part_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__pycache__/chat_completion_content_part_refusal_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__pycache__/chat_completion_content_part_text.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__pycache__/chat_completion_content_part_text_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__pycache__/chat_completion_custom_tool_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__pycache__/chat_completion_deleted.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__pycache__/chat_completion_developer_message_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__pycache__/chat_completion_function_call_option_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__pycache__/chat_completion_function_message_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__pycache__/chat_completion_function_tool.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__pycache__/chat_completion_function_tool_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__pycache__/chat_completion_message.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__pycache__/chat_completion_message_custom_tool_call.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__pycache__/chat_completion_message_custom_tool_call_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__pycache__/chat_completion_message_function_tool_call.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__pycache__/chat_completion_message_function_tool_call_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__pycache__/chat_completion_message_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__pycache__/chat_completion_message_tool_call.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__pycache__/chat_completion_message_tool_call_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__pycache__/chat_completion_message_tool_call_union_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__pycache__/chat_completion_modality.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__pycache__/chat_completion_named_tool_choice_custom_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__pycache__/chat_completion_named_tool_choice_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__pycache__/chat_completion_prediction_content_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__pycache__/chat_completion_reasoning_effort.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__pycache__/chat_completion_role.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__pycache__/chat_completion_store_message.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__pycache__/chat_completion_stream_options_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__pycache__/chat_completion_system_message_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__pycache__/chat_completion_token_logprob.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__pycache__/chat_completion_tool_choice_option_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__pycache__/chat_completion_tool_message_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__pycache__/chat_completion_tool_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__pycache__/chat_completion_tool_union_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__pycache__/chat_completion_user_message_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__pycache__/completion_create_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__pycache__/completion_list_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__pycache__/completion_update_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__pycache__/parsed_chat_completion.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/__pycache__/parsed_function_tool_call.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/chat_completion.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/chat_completion_allowed_tool_choice_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/chat_completion_allowed_tools_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/chat_completion_assistant_message_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/chat_completion_audio.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/chat_completion_audio_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/chat_completion_chunk.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/chat_completion_content_part_image.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/chat_completion_content_part_image_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/chat_completion_content_part_input_audio_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/chat_completion_content_part_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/chat_completion_content_part_refusal_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/chat_completion_content_part_text.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/chat_completion_content_part_text_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/chat_completion_custom_tool_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/chat_completion_deleted.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/chat_completion_developer_message_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/chat_completion_function_call_option_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/chat_completion_function_message_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/chat_completion_function_tool.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/chat_completion_function_tool_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/chat_completion_message.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/chat_completion_message_custom_tool_call.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/chat_completion_message_custom_tool_call_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/chat_completion_message_function_tool_call.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/chat_completion_message_function_tool_call_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/chat_completion_message_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/chat_completion_message_tool_call.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/chat_completion_message_tool_call_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/chat_completion_message_tool_call_union_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/chat_completion_modality.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/chat_completion_named_tool_choice_custom_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/chat_completion_named_tool_choice_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/chat_completion_prediction_content_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/chat_completion_reasoning_effort.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/chat_completion_role.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/chat_completion_store_message.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/chat_completion_stream_options_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/chat_completion_system_message_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/chat_completion_token_logprob.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/chat_completion_tool_choice_option_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/chat_completion_tool_message_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/chat_completion_tool_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/chat_completion_tool_union_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/chat_completion_user_message_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/completion_create_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/completion_list_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/completion_update_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/completions/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/completions/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/completions/__pycache__/message_list_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/completions/message_list_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/parsed_chat_completion.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat/parsed_function_tool_call.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/chat_model.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/completion.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/completion_choice.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/completion_create_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/completion_usage.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/container_create_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/container_create_response.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/container_list_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/container_list_response.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/container_retrieve_response.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/containers/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/containers/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/containers/__pycache__/file_create_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/containers/__pycache__/file_create_response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/containers/__pycache__/file_list_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/containers/__pycache__/file_list_response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/containers/__pycache__/file_retrieve_response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/containers/file_create_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/containers/file_create_response.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/containers/file_list_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/containers/file_list_response.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/containers/file_retrieve_response.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/containers/files/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/containers/files/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/conversations/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/conversations/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/conversations/__pycache__/computer_screenshot_content.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/conversations/__pycache__/conversation.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/conversations/__pycache__/conversation_create_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/conversations/__pycache__/conversation_deleted_resource.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/conversations/__pycache__/conversation_item.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/conversations/__pycache__/conversation_item_list.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/conversations/__pycache__/conversation_update_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/conversations/__pycache__/input_file_content.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/conversations/__pycache__/input_file_content_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/conversations/__pycache__/input_image_content.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/conversations/__pycache__/input_image_content_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/conversations/__pycache__/input_text_content.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/conversations/__pycache__/input_text_content_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/conversations/__pycache__/item_create_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/conversations/__pycache__/item_list_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/conversations/__pycache__/item_retrieve_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/conversations/__pycache__/message.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/conversations/__pycache__/output_text_content.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/conversations/__pycache__/output_text_content_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/conversations/__pycache__/refusal_content.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/conversations/__pycache__/refusal_content_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/conversations/__pycache__/summary_text_content.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/conversations/__pycache__/text_content.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/conversations/computer_screenshot_content.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/conversations/conversation.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/conversations/conversation_create_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/conversations/conversation_deleted_resource.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/conversations/conversation_item.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/conversations/conversation_item_list.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/conversations/conversation_update_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/conversations/input_file_content.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/conversations/input_file_content_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/conversations/input_image_content.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/conversations/input_image_content_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/conversations/input_text_content.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/conversations/input_text_content_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/conversations/item_create_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/conversations/item_list_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/conversations/item_retrieve_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/conversations/message.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/conversations/output_text_content.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/conversations/output_text_content_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/conversations/refusal_content.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/conversations/refusal_content_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/conversations/summary_text_content.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/conversations/text_content.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/create_embedding_response.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/deleted_skill.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/embedding.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/embedding_create_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/embedding_model.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/eval_create_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/eval_create_response.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/eval_custom_data_source_config.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/eval_delete_response.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/eval_list_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/eval_list_response.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/eval_retrieve_response.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/eval_stored_completions_data_source_config.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/eval_update_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/eval_update_response.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/evals/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/evals/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/evals/__pycache__/create_eval_completions_run_data_source.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/evals/__pycache__/create_eval_completions_run_data_source_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/evals/__pycache__/create_eval_jsonl_run_data_source.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/evals/__pycache__/create_eval_jsonl_run_data_source_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/evals/__pycache__/eval_api_error.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/evals/__pycache__/run_cancel_response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/evals/__pycache__/run_create_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/evals/__pycache__/run_create_response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/evals/__pycache__/run_delete_response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/evals/__pycache__/run_list_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/evals/__pycache__/run_list_response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/evals/__pycache__/run_retrieve_response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/evals/create_eval_completions_run_data_source.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/evals/create_eval_completions_run_data_source_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/evals/create_eval_jsonl_run_data_source.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/evals/create_eval_jsonl_run_data_source_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/evals/eval_api_error.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/evals/run_cancel_response.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/evals/run_create_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/evals/run_create_response.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/evals/run_delete_response.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/evals/run_list_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/evals/run_list_response.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/evals/run_retrieve_response.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/evals/runs/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/evals/runs/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/evals/runs/__pycache__/output_item_list_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/evals/runs/__pycache__/output_item_list_response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/evals/runs/__pycache__/output_item_retrieve_response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/evals/runs/output_item_list_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/evals/runs/output_item_list_response.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/evals/runs/output_item_retrieve_response.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/file_chunking_strategy.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/file_chunking_strategy_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/file_content.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/file_create_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/file_deleted.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/file_list_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/file_object.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/file_purpose.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/__pycache__/dpo_hyperparameters.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/__pycache__/dpo_hyperparameters_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/__pycache__/dpo_method.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/__pycache__/dpo_method_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/__pycache__/fine_tuning_job.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/__pycache__/fine_tuning_job_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/__pycache__/fine_tuning_job_integration.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/__pycache__/fine_tuning_job_wandb_integration.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/__pycache__/fine_tuning_job_wandb_integration_object.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/__pycache__/job_create_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/__pycache__/job_list_events_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/__pycache__/job_list_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/__pycache__/reinforcement_hyperparameters.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/__pycache__/reinforcement_hyperparameters_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/__pycache__/reinforcement_method.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/__pycache__/reinforcement_method_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/__pycache__/supervised_hyperparameters.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/__pycache__/supervised_hyperparameters_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/__pycache__/supervised_method.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/__pycache__/supervised_method_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/alpha/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/alpha/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/alpha/__pycache__/grader_run_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/alpha/__pycache__/grader_run_response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/alpha/__pycache__/grader_validate_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/alpha/__pycache__/grader_validate_response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/alpha/grader_run_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/alpha/grader_run_response.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/alpha/grader_validate_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/alpha/grader_validate_response.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/checkpoints/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/checkpoints/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/checkpoints/__pycache__/permission_create_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/checkpoints/__pycache__/permission_create_response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/checkpoints/__pycache__/permission_delete_response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/checkpoints/__pycache__/permission_list_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/checkpoints/__pycache__/permission_list_response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/checkpoints/__pycache__/permission_retrieve_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/checkpoints/__pycache__/permission_retrieve_response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/checkpoints/permission_create_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/checkpoints/permission_create_response.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/checkpoints/permission_delete_response.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/checkpoints/permission_list_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/checkpoints/permission_list_response.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/checkpoints/permission_retrieve_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/checkpoints/permission_retrieve_response.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/dpo_hyperparameters.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/dpo_hyperparameters_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/dpo_method.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/dpo_method_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/fine_tuning_job.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/fine_tuning_job_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/fine_tuning_job_integration.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/fine_tuning_job_wandb_integration.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/fine_tuning_job_wandb_integration_object.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/job_create_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/job_list_events_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/job_list_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/jobs/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/jobs/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/jobs/__pycache__/checkpoint_list_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/jobs/__pycache__/fine_tuning_job_checkpoint.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/jobs/checkpoint_list_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/jobs/fine_tuning_job_checkpoint.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/reinforcement_hyperparameters.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/reinforcement_hyperparameters_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/reinforcement_method.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/reinforcement_method_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/supervised_hyperparameters.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/supervised_hyperparameters_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/supervised_method.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/fine_tuning/supervised_method_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/graders/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/graders/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/graders/__pycache__/grader_inputs.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/graders/__pycache__/grader_inputs_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/graders/__pycache__/label_model_grader.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/graders/__pycache__/label_model_grader_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/graders/__pycache__/multi_grader.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/graders/__pycache__/multi_grader_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/graders/__pycache__/python_grader.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/graders/__pycache__/python_grader_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/graders/__pycache__/score_model_grader.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/graders/__pycache__/score_model_grader_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/graders/__pycache__/string_check_grader.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/graders/__pycache__/string_check_grader_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/graders/__pycache__/text_similarity_grader.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/graders/__pycache__/text_similarity_grader_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/graders/grader_inputs.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/graders/grader_inputs_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/graders/label_model_grader.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/graders/label_model_grader_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/graders/multi_grader.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/graders/multi_grader_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/graders/python_grader.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/graders/python_grader_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/graders/score_model_grader.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/graders/score_model_grader_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/graders/string_check_grader.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/graders/string_check_grader_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/graders/text_similarity_grader.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/graders/text_similarity_grader_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/image.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/image_create_variation_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/image_edit_completed_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/image_edit_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/image_edit_partial_image_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/image_edit_stream_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/image_gen_completed_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/image_gen_partial_image_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/image_gen_stream_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/image_generate_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/image_input_reference_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/image_model.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/images_response.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/model.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/model_deleted.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/moderation.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/moderation_create_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/moderation_create_response.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/moderation_image_url_input_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/moderation_model.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/moderation_multi_modal_input_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/moderation_text_input_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/other_file_chunking_strategy_object.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/audio_transcription.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/audio_transcription_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/call_accept_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/call_create_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/call_refer_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/call_reject_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/client_secret_create_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/client_secret_create_response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/conversation_created_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/conversation_item.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/conversation_item_added.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/conversation_item_create_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/conversation_item_create_event_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/conversation_item_created_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/conversation_item_delete_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/conversation_item_delete_event_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/conversation_item_deleted_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/conversation_item_done.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/conversation_item_input_audio_transcription_completed_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/conversation_item_input_audio_transcription_delta_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/conversation_item_input_audio_transcription_failed_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/conversation_item_input_audio_transcription_segment.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/conversation_item_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/conversation_item_retrieve_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/conversation_item_retrieve_event_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/conversation_item_truncate_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/conversation_item_truncate_event_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/conversation_item_truncated_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/input_audio_buffer_append_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/input_audio_buffer_append_event_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/input_audio_buffer_clear_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/input_audio_buffer_clear_event_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/input_audio_buffer_cleared_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/input_audio_buffer_commit_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/input_audio_buffer_commit_event_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/input_audio_buffer_committed_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/input_audio_buffer_dtmf_event_received_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/input_audio_buffer_speech_started_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/input_audio_buffer_speech_stopped_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/input_audio_buffer_timeout_triggered.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/log_prob_properties.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/mcp_list_tools_completed.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/mcp_list_tools_failed.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/mcp_list_tools_in_progress.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/noise_reduction_type.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/output_audio_buffer_clear_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/output_audio_buffer_clear_event_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/rate_limits_updated_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_audio_config.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_audio_config_input.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_audio_config_input_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_audio_config_output.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_audio_config_output_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_audio_config_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_audio_formats.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_audio_formats_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_audio_input_turn_detection.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_audio_input_turn_detection_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_client_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_client_event_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_connect_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_conversation_item_assistant_message.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_conversation_item_assistant_message_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_conversation_item_function_call.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_conversation_item_function_call_output.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_conversation_item_function_call_output_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_conversation_item_function_call_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_conversation_item_system_message.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_conversation_item_system_message_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_conversation_item_user_message.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_conversation_item_user_message_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_error.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_error_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_function_tool.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_function_tool_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_mcp_approval_request.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_mcp_approval_request_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_mcp_approval_response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_mcp_approval_response_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_mcp_list_tools.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_mcp_list_tools_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_mcp_protocol_error.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_mcp_protocol_error_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_mcp_tool_call.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_mcp_tool_call_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_mcp_tool_execution_error.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_mcp_tool_execution_error_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_mcphttp_error.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_mcphttp_error_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_response_create_audio_output.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_response_create_audio_output_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_response_create_mcp_tool.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_response_create_mcp_tool_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_response_create_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_response_create_params_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_response_status.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_response_usage.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_response_usage_input_token_details.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_response_usage_output_token_details.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_server_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_session_client_secret.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_session_create_request.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_session_create_request_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_session_create_response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_tool_choice_config.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_tool_choice_config_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_tools_config.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_tools_config_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_tools_config_union.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_tools_config_union_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_tracing_config.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_tracing_config_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_transcription_session_audio.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_transcription_session_audio_input.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_transcription_session_audio_input_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_transcription_session_audio_input_turn_detection.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_transcription_session_audio_input_turn_detection_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_transcription_session_audio_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_transcription_session_create_request.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_transcription_session_create_request_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_transcription_session_create_response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_transcription_session_turn_detection.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_truncation.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_truncation_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_truncation_retention_ratio.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/realtime_truncation_retention_ratio_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/response_audio_delta_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/response_audio_done_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/response_audio_transcript_delta_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/response_audio_transcript_done_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/response_cancel_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/response_cancel_event_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/response_content_part_added_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/response_content_part_done_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/response_create_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/response_create_event_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/response_created_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/response_done_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/response_function_call_arguments_delta_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/response_function_call_arguments_done_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/response_mcp_call_arguments_delta.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/response_mcp_call_arguments_done.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/response_mcp_call_completed.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/response_mcp_call_failed.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/response_mcp_call_in_progress.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/response_output_item_added_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/response_output_item_done_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/response_text_delta_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/response_text_done_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/session_created_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/session_update_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/session_update_event_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/__pycache__/session_updated_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/audio_transcription.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/audio_transcription_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/call_accept_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/call_create_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/call_refer_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/call_reject_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/client_secret_create_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/client_secret_create_response.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/conversation_created_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/conversation_item.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/conversation_item_added.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/conversation_item_create_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/conversation_item_create_event_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/conversation_item_created_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/conversation_item_delete_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/conversation_item_delete_event_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/conversation_item_deleted_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/conversation_item_done.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/conversation_item_input_audio_transcription_completed_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/conversation_item_input_audio_transcription_delta_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/conversation_item_input_audio_transcription_failed_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/conversation_item_input_audio_transcription_segment.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/conversation_item_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/conversation_item_retrieve_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/conversation_item_retrieve_event_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/conversation_item_truncate_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/conversation_item_truncate_event_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/conversation_item_truncated_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/input_audio_buffer_append_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/input_audio_buffer_append_event_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/input_audio_buffer_clear_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/input_audio_buffer_clear_event_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/input_audio_buffer_cleared_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/input_audio_buffer_commit_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/input_audio_buffer_commit_event_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/input_audio_buffer_committed_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/input_audio_buffer_dtmf_event_received_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/input_audio_buffer_speech_started_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/input_audio_buffer_speech_stopped_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/input_audio_buffer_timeout_triggered.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/log_prob_properties.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/mcp_list_tools_completed.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/mcp_list_tools_failed.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/mcp_list_tools_in_progress.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/noise_reduction_type.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/output_audio_buffer_clear_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/output_audio_buffer_clear_event_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/rate_limits_updated_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_audio_config.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_audio_config_input.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_audio_config_input_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_audio_config_output.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_audio_config_output_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_audio_config_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_audio_formats.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_audio_formats_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_audio_input_turn_detection.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_audio_input_turn_detection_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_client_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_client_event_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_connect_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_conversation_item_assistant_message.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_conversation_item_assistant_message_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_conversation_item_function_call.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_conversation_item_function_call_output.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_conversation_item_function_call_output_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_conversation_item_function_call_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_conversation_item_system_message.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_conversation_item_system_message_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_conversation_item_user_message.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_conversation_item_user_message_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_error.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_error_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_function_tool.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_function_tool_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_mcp_approval_request.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_mcp_approval_request_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_mcp_approval_response.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_mcp_approval_response_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_mcp_list_tools.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_mcp_list_tools_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_mcp_protocol_error.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_mcp_protocol_error_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_mcp_tool_call.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_mcp_tool_call_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_mcp_tool_execution_error.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_mcp_tool_execution_error_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_mcphttp_error.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_mcphttp_error_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_response.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_response_create_audio_output.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_response_create_audio_output_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_response_create_mcp_tool.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_response_create_mcp_tool_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_response_create_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_response_create_params_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_response_status.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_response_usage.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_response_usage_input_token_details.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_response_usage_output_token_details.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_server_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_session_client_secret.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_session_create_request.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_session_create_request_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_session_create_response.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_tool_choice_config.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_tool_choice_config_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_tools_config.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_tools_config_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_tools_config_union.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_tools_config_union_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_tracing_config.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_tracing_config_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_transcription_session_audio.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_transcription_session_audio_input.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_transcription_session_audio_input_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_transcription_session_audio_input_turn_detection.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_transcription_session_audio_input_turn_detection_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_transcription_session_audio_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_transcription_session_create_request.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_transcription_session_create_request_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_transcription_session_create_response.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_transcription_session_turn_detection.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_truncation.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_truncation_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_truncation_retention_ratio.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/realtime_truncation_retention_ratio_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/response_audio_delta_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/response_audio_done_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/response_audio_transcript_delta_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/response_audio_transcript_done_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/response_cancel_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/response_cancel_event_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/response_content_part_added_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/response_content_part_done_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/response_create_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/response_create_event_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/response_created_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/response_done_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/response_function_call_arguments_delta_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/response_function_call_arguments_done_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/response_mcp_call_arguments_delta.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/response_mcp_call_arguments_done.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/response_mcp_call_completed.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/response_mcp_call_failed.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/response_mcp_call_in_progress.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/response_output_item_added_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/response_output_item_done_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/response_text_delta_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/response_text_done_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/session_created_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/session_update_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/session_update_event_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/realtime/session_updated_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/apply_patch_tool.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/apply_patch_tool_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/compacted_response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/computer_action.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/computer_action_list.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/computer_action_list_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/computer_action_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/computer_tool.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/computer_tool_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/computer_use_preview_tool.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/computer_use_preview_tool_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/container_auto.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/container_auto_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/container_network_policy_allowlist.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/container_network_policy_allowlist_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/container_network_policy_disabled.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/container_network_policy_disabled_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/container_network_policy_domain_secret.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/container_network_policy_domain_secret_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/container_reference.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/container_reference_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/custom_tool.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/custom_tool_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/easy_input_message.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/easy_input_message_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/file_search_tool.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/file_search_tool_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/function_shell_tool.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/function_shell_tool_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/function_tool.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/function_tool_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/inline_skill.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/inline_skill_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/inline_skill_source.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/inline_skill_source_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/input_item_list_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/input_token_count_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/input_token_count_response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/local_environment.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/local_environment_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/local_skill.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/local_skill_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/namespace_tool.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/namespace_tool_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/parsed_response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_apply_patch_tool_call.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_apply_patch_tool_call_output.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_audio_delta_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_audio_done_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_audio_transcript_delta_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_audio_transcript_done_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_code_interpreter_call_code_delta_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_code_interpreter_call_code_done_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_code_interpreter_call_completed_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_code_interpreter_call_in_progress_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_code_interpreter_call_interpreting_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_code_interpreter_tool_call.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_code_interpreter_tool_call_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_compact_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_compaction_item.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_compaction_item_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_compaction_item_param_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_completed_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_computer_tool_call.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_computer_tool_call_output_item.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_computer_tool_call_output_screenshot.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_computer_tool_call_output_screenshot_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_computer_tool_call_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_container_reference.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_content_part_added_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_content_part_done_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_conversation_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_conversation_param_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_create_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_created_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_custom_tool_call.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_custom_tool_call_input_delta_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_custom_tool_call_input_done_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_custom_tool_call_output.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_custom_tool_call_output_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_custom_tool_call_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_error.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_error_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_failed_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_file_search_call_completed_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_file_search_call_in_progress_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_file_search_call_searching_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_file_search_tool_call.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_file_search_tool_call_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_format_text_config.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_format_text_config_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_format_text_json_schema_config.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_format_text_json_schema_config_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_function_call_arguments_delta_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_function_call_arguments_done_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_function_call_output_item.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_function_call_output_item_list.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_function_call_output_item_list_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_function_call_output_item_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_function_shell_call_output_content.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_function_shell_call_output_content_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_function_shell_tool_call.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_function_shell_tool_call_output.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_function_tool_call.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_function_tool_call_item.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_function_tool_call_output_item.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_function_tool_call_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_function_web_search.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_function_web_search_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_image_gen_call_completed_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_image_gen_call_generating_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_image_gen_call_in_progress_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_image_gen_call_partial_image_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_in_progress_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_includable.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_incomplete_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_input.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_input_audio.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_input_audio_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_input_content.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_input_content_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_input_file.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_input_file_content.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_input_file_content_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_input_file_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_input_image.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_input_image_content.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_input_image_content_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_input_image_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_input_item.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_input_item_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_input_message_content_list.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_input_message_content_list_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_input_message_item.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_input_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_input_text.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_input_text_content.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_input_text_content_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_input_text_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_item.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_item_list.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_local_environment.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_mcp_call_arguments_delta_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_mcp_call_arguments_done_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_mcp_call_completed_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_mcp_call_failed_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_mcp_call_in_progress_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_mcp_list_tools_completed_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_mcp_list_tools_failed_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_mcp_list_tools_in_progress_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_output_item.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_output_item_added_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_output_item_done_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_output_message.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_output_message_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_output_refusal.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_output_refusal_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_output_text.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_output_text_annotation_added_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_output_text_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_prompt.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_prompt_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_queued_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_reasoning_item.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_reasoning_item_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_reasoning_summary_part_added_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_reasoning_summary_part_done_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_reasoning_summary_text_delta_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_reasoning_summary_text_done_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_reasoning_text_delta_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_reasoning_text_done_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_refusal_delta_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_refusal_done_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_retrieve_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_status.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_stream_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_text_config.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_text_config_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_text_delta_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_text_done_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_tool_search_call.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_tool_search_output_item.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_tool_search_output_item_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_tool_search_output_item_param_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_usage.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_web_search_call_completed_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_web_search_call_in_progress_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/response_web_search_call_searching_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/responses_client_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/responses_client_event_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/responses_server_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/skill_reference.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/skill_reference_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/tool.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/tool_choice_allowed.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/tool_choice_allowed_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/tool_choice_apply_patch.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/tool_choice_apply_patch_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/tool_choice_custom.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/tool_choice_custom_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/tool_choice_function.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/tool_choice_function_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/tool_choice_mcp.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/tool_choice_mcp_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/tool_choice_options.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/tool_choice_shell.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/tool_choice_shell_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/tool_choice_types.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/tool_choice_types_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/tool_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/tool_search_tool.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/tool_search_tool_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/web_search_preview_tool.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/web_search_preview_tool_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/web_search_tool.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/__pycache__/web_search_tool_param.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/apply_patch_tool.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/apply_patch_tool_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/compacted_response.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/computer_action.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/computer_action_list.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/computer_action_list_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/computer_action_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/computer_tool.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/computer_tool_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/computer_use_preview_tool.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/computer_use_preview_tool_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/container_auto.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/container_auto_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/container_network_policy_allowlist.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/container_network_policy_allowlist_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/container_network_policy_disabled.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/container_network_policy_disabled_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/container_network_policy_domain_secret.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/container_network_policy_domain_secret_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/container_reference.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/container_reference_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/custom_tool.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/custom_tool_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/easy_input_message.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/easy_input_message_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/file_search_tool.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/file_search_tool_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/function_shell_tool.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/function_shell_tool_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/function_tool.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/function_tool_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/inline_skill.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/inline_skill_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/inline_skill_source.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/inline_skill_source_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/input_item_list_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/input_token_count_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/input_token_count_response.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/local_environment.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/local_environment_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/local_skill.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/local_skill_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/namespace_tool.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/namespace_tool_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/parsed_response.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_apply_patch_tool_call.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_apply_patch_tool_call_output.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_audio_delta_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_audio_done_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_audio_transcript_delta_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_audio_transcript_done_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_code_interpreter_call_code_delta_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_code_interpreter_call_code_done_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_code_interpreter_call_completed_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_code_interpreter_call_in_progress_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_code_interpreter_call_interpreting_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_code_interpreter_tool_call.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_code_interpreter_tool_call_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_compact_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_compaction_item.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_compaction_item_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_compaction_item_param_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_completed_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_computer_tool_call.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_computer_tool_call_output_item.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_computer_tool_call_output_screenshot.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_computer_tool_call_output_screenshot_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_computer_tool_call_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_container_reference.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_content_part_added_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_content_part_done_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_conversation_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_conversation_param_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_create_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_created_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_custom_tool_call.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_custom_tool_call_input_delta_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_custom_tool_call_input_done_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_custom_tool_call_output.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_custom_tool_call_output_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_custom_tool_call_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_error.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_error_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_failed_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_file_search_call_completed_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_file_search_call_in_progress_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_file_search_call_searching_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_file_search_tool_call.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_file_search_tool_call_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_format_text_config.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_format_text_config_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_format_text_json_schema_config.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_format_text_json_schema_config_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_function_call_arguments_delta_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_function_call_arguments_done_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_function_call_output_item.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_function_call_output_item_list.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_function_call_output_item_list_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_function_call_output_item_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_function_shell_call_output_content.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_function_shell_call_output_content_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_function_shell_tool_call.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_function_shell_tool_call_output.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_function_tool_call.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_function_tool_call_item.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_function_tool_call_output_item.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_function_tool_call_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_function_web_search.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_function_web_search_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_image_gen_call_completed_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_image_gen_call_generating_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_image_gen_call_in_progress_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_image_gen_call_partial_image_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_in_progress_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_includable.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_incomplete_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_input.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_input_audio.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_input_audio_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_input_content.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_input_content_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_input_file.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_input_file_content.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_input_file_content_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_input_file_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_input_image.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_input_image_content.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_input_image_content_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_input_image_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_input_item.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_input_item_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_input_message_content_list.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_input_message_content_list_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_input_message_item.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_input_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_input_text.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_input_text_content.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_input_text_content_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_input_text_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_item.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_item_list.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_local_environment.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_mcp_call_arguments_delta_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_mcp_call_arguments_done_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_mcp_call_completed_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_mcp_call_failed_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_mcp_call_in_progress_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_mcp_list_tools_completed_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_mcp_list_tools_failed_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_mcp_list_tools_in_progress_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_output_item.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_output_item_added_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_output_item_done_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_output_message.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_output_message_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_output_refusal.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_output_refusal_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_output_text.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_output_text_annotation_added_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_output_text_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_prompt.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_prompt_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_queued_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_reasoning_item.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_reasoning_item_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_reasoning_summary_part_added_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_reasoning_summary_part_done_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_reasoning_summary_text_delta_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_reasoning_summary_text_done_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_reasoning_text_delta_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_reasoning_text_done_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_refusal_delta_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_refusal_done_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_retrieve_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_status.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_stream_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_text_config.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_text_config_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_text_delta_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_text_done_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_tool_search_call.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_tool_search_output_item.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_tool_search_output_item_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_tool_search_output_item_param_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_usage.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_web_search_call_completed_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_web_search_call_in_progress_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/response_web_search_call_searching_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/responses_client_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/responses_client_event_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/responses_server_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/skill_reference.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/skill_reference_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/tool.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/tool_choice_allowed.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/tool_choice_allowed_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/tool_choice_apply_patch.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/tool_choice_apply_patch_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/tool_choice_custom.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/tool_choice_custom_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/tool_choice_function.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/tool_choice_function_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/tool_choice_mcp.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/tool_choice_mcp_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/tool_choice_options.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/tool_choice_shell.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/tool_choice_shell_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/tool_choice_types.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/tool_choice_types_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/tool_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/tool_search_tool.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/tool_search_tool_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/web_search_preview_tool.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/web_search_preview_tool_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/web_search_tool.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/responses/web_search_tool_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared/__pycache__/all_models.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared/__pycache__/chat_model.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared/__pycache__/comparison_filter.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared/__pycache__/compound_filter.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared/__pycache__/custom_tool_input_format.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared/__pycache__/error_object.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared/__pycache__/function_definition.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared/__pycache__/function_parameters.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared/__pycache__/metadata.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared/__pycache__/reasoning.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared/__pycache__/reasoning_effort.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared/__pycache__/response_format_json_object.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared/__pycache__/response_format_json_schema.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared/__pycache__/response_format_text.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared/__pycache__/response_format_text_grammar.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared/__pycache__/response_format_text_python.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared/__pycache__/responses_model.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared/all_models.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared/chat_model.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared/comparison_filter.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared/compound_filter.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared/custom_tool_input_format.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared/error_object.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared/function_definition.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared/function_parameters.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared/metadata.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared/reasoning.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared/reasoning_effort.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared/response_format_json_object.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared/response_format_json_schema.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared/response_format_text.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared/response_format_text_grammar.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared/response_format_text_python.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared/responses_model.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared_params/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared_params/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared_params/__pycache__/chat_model.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared_params/__pycache__/comparison_filter.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared_params/__pycache__/compound_filter.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared_params/__pycache__/custom_tool_input_format.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared_params/__pycache__/function_definition.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared_params/__pycache__/function_parameters.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared_params/__pycache__/metadata.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared_params/__pycache__/reasoning.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared_params/__pycache__/reasoning_effort.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared_params/__pycache__/response_format_json_object.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared_params/__pycache__/response_format_json_schema.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared_params/__pycache__/response_format_text.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared_params/__pycache__/responses_model.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared_params/chat_model.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared_params/comparison_filter.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared_params/compound_filter.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared_params/custom_tool_input_format.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared_params/function_definition.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared_params/function_parameters.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared_params/metadata.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared_params/reasoning.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared_params/reasoning_effort.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared_params/response_format_json_object.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared_params/response_format_json_schema.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared_params/response_format_text.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/shared_params/responses_model.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/skill.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/skill_create_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/skill_list.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/skill_list_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/skill_update_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/skills/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/skills/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/skills/__pycache__/deleted_skill_version.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/skills/__pycache__/skill_version.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/skills/__pycache__/skill_version_list.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/skills/__pycache__/version_create_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/skills/__pycache__/version_list_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/skills/deleted_skill_version.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/skills/skill_version.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/skills/skill_version_list.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/skills/version_create_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/skills/version_list_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/skills/versions/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/skills/versions/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/static_file_chunking_strategy.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/static_file_chunking_strategy_object.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/static_file_chunking_strategy_object_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/static_file_chunking_strategy_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/upload.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/upload_complete_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/upload_create_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/uploads/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/uploads/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/uploads/__pycache__/part_create_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/uploads/__pycache__/upload_part.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/uploads/part_create_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/uploads/upload_part.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/vector_store.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/vector_store_create_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/vector_store_deleted.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/vector_store_list_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/vector_store_search_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/vector_store_search_response.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/vector_store_update_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/vector_stores/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/vector_stores/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/vector_stores/__pycache__/file_batch_create_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/vector_stores/__pycache__/file_batch_list_files_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/vector_stores/__pycache__/file_content_response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/vector_stores/__pycache__/file_create_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/vector_stores/__pycache__/file_list_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/vector_stores/__pycache__/file_update_params.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/vector_stores/__pycache__/vector_store_file.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/vector_stores/__pycache__/vector_store_file_batch.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/vector_stores/__pycache__/vector_store_file_deleted.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/vector_stores/file_batch_create_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/vector_stores/file_batch_list_files_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/vector_stores/file_content_response.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/vector_stores/file_create_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/vector_stores/file_list_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/vector_stores/file_update_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/vector_stores/vector_store_file.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/vector_stores/vector_store_file_batch.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/vector_stores/vector_store_file_deleted.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/video.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/video_create_character_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/video_create_character_response.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/video_create_error.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/video_create_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/video_delete_response.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/video_download_content_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/video_edit_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/video_extend_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/video_get_character_response.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/video_list_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/video_model.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/video_model_param.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/video_remix_params.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/video_seconds.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/video_size.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/webhooks/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/webhooks/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/webhooks/__pycache__/batch_cancelled_webhook_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/webhooks/__pycache__/batch_completed_webhook_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/webhooks/__pycache__/batch_expired_webhook_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/webhooks/__pycache__/batch_failed_webhook_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/webhooks/__pycache__/eval_run_canceled_webhook_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/webhooks/__pycache__/eval_run_failed_webhook_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/webhooks/__pycache__/eval_run_succeeded_webhook_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/webhooks/__pycache__/fine_tuning_job_cancelled_webhook_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/webhooks/__pycache__/fine_tuning_job_failed_webhook_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/webhooks/__pycache__/fine_tuning_job_succeeded_webhook_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/webhooks/__pycache__/realtime_call_incoming_webhook_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/webhooks/__pycache__/response_cancelled_webhook_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/webhooks/__pycache__/response_completed_webhook_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/webhooks/__pycache__/response_failed_webhook_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/webhooks/__pycache__/response_incomplete_webhook_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/webhooks/__pycache__/unwrap_webhook_event.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/openai/types/webhooks/batch_cancelled_webhook_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/webhooks/batch_completed_webhook_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/webhooks/batch_expired_webhook_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/webhooks/batch_failed_webhook_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/webhooks/eval_run_canceled_webhook_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/webhooks/eval_run_failed_webhook_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/webhooks/eval_run_succeeded_webhook_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/webhooks/fine_tuning_job_cancelled_webhook_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/webhooks/fine_tuning_job_failed_webhook_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/webhooks/fine_tuning_job_succeeded_webhook_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/webhooks/realtime_call_incoming_webhook_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/webhooks/response_cancelled_webhook_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/webhooks/response_completed_webhook_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/webhooks/response_failed_webhook_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/webhooks/response_incomplete_webhook_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/webhooks/unwrap_webhook_event.py create mode 100644 .venv/lib/python3.10/site-packages/openai/types/websocket_connection_options.py create mode 100644 .venv/lib/python3.10/site-packages/openai/version.py create mode 100644 .venv/lib/python3.10/site-packages/pip-26.0.1.dist-info/INSTALLER create mode 100644 .venv/lib/python3.10/site-packages/pip-26.0.1.dist-info/METADATA create mode 100644 .venv/lib/python3.10/site-packages/pip-26.0.1.dist-info/RECORD create mode 100644 .venv/lib/python3.10/site-packages/pip-26.0.1.dist-info/REQUESTED create mode 100644 .venv/lib/python3.10/site-packages/pip-26.0.1.dist-info/WHEEL create mode 100644 .venv/lib/python3.10/site-packages/pip-26.0.1.dist-info/entry_points.txt create mode 100644 .venv/lib/python3.10/site-packages/pip-26.0.1.dist-info/licenses/AUTHORS.txt create mode 100644 .venv/lib/python3.10/site-packages/pip-26.0.1.dist-info/licenses/LICENSE.txt create mode 100644 .venv/lib/python3.10/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/cachecontrol/LICENSE.txt create mode 100644 .venv/lib/python3.10/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/certifi/LICENSE create mode 100644 .venv/lib/python3.10/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/dependency_groups/LICENSE.txt create mode 100644 .venv/lib/python3.10/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/distlib/LICENSE.txt create mode 100644 .venv/lib/python3.10/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/distro/LICENSE create mode 100644 .venv/lib/python3.10/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/idna/LICENSE.md create mode 100644 .venv/lib/python3.10/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/msgpack/COPYING create mode 100644 .venv/lib/python3.10/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/packaging/LICENSE create mode 100644 .venv/lib/python3.10/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/packaging/LICENSE.APACHE create mode 100644 .venv/lib/python3.10/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/packaging/LICENSE.BSD create mode 100644 .venv/lib/python3.10/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/pkg_resources/LICENSE create mode 100644 .venv/lib/python3.10/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/platformdirs/LICENSE create mode 100644 .venv/lib/python3.10/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/pygments/LICENSE create mode 100644 .venv/lib/python3.10/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/pyproject_hooks/LICENSE create mode 100644 .venv/lib/python3.10/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/requests/LICENSE create mode 100644 .venv/lib/python3.10/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/resolvelib/LICENSE create mode 100644 .venv/lib/python3.10/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/rich/LICENSE create mode 100644 .venv/lib/python3.10/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/tomli/LICENSE create mode 100644 .venv/lib/python3.10/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/tomli_w/LICENSE create mode 100644 .venv/lib/python3.10/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/truststore/LICENSE create mode 100644 .venv/lib/python3.10/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/urllib3/LICENSE.txt create mode 100644 .venv/lib/python3.10/site-packages/pip/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/__main__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/__pip-runner__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/__pycache__/__main__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/__pycache__/__pip-runner__.cpython-310.pyc create mode 100755 .venv/lib/python3.10/site-packages/pip/_internal/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/__pycache__/build_env.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/__pycache__/cache.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/__pycache__/configuration.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/__pycache__/exceptions.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/__pycache__/main.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/__pycache__/pyproject.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/build_env.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cache.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cli/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cli/__pycache__/index_command.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cli/__pycache__/main.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cli/__pycache__/parser.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cli/autocompletion.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cli/base_command.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cli/cmdoptions.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cli/command_context.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cli/index_command.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cli/main.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cli/main_parser.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cli/parser.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cli/progress_bars.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cli/req_command.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cli/spinners.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cli/status_codes.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/cache.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/check.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/completion.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/debug.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/download.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/hash.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/help.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/index.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/install.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/list.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/lock.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/search.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/show.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/cache.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/check.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/completion.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/configuration.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/debug.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/download.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/freeze.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/hash.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/help.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/index.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/inspect.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/install.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/list.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/lock.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/search.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/show.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/uninstall.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/wheel.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/configuration.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/distributions/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/distributions/__pycache__/base.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/distributions/base.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/distributions/installed.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/distributions/sdist.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/distributions/wheel.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/exceptions.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/index/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/index/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/index/__pycache__/collector.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/index/__pycache__/sources.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/index/collector.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/index/package_finder.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/index/sources.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/locations/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/locations/__pycache__/base.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/locations/_distutils.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/locations/_sysconfig.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/locations/base.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/main.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/metadata/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/metadata/__pycache__/base.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/metadata/_json.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/metadata/base.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/metadata/importlib/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/metadata/importlib/__pycache__/_compat.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/metadata/importlib/__pycache__/_envs.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/metadata/importlib/_compat.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/metadata/importlib/_dists.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/metadata/importlib/_envs.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/metadata/pkg_resources.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/models/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/models/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/models/__pycache__/candidate.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/models/__pycache__/format_control.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/models/__pycache__/index.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/models/__pycache__/installation_report.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/models/__pycache__/link.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/models/__pycache__/release_control.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/models/__pycache__/scheme.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/models/__pycache__/target_python.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/models/__pycache__/wheel.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/models/candidate.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/models/direct_url.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/models/format_control.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/models/index.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/models/installation_report.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/models/link.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/models/release_control.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/models/scheme.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/models/search_scope.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/models/selection_prefs.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/models/target_python.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/models/wheel.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/network/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/network/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/network/__pycache__/auth.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/network/__pycache__/cache.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/network/__pycache__/download.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/network/__pycache__/session.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/network/__pycache__/utils.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/network/auth.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/network/cache.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/network/download.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/network/lazy_wheel.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/network/session.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/network/utils.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/network/xmlrpc.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/__pycache__/check.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/build/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/build/__pycache__/build_tracker.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/build/build_tracker.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/build/metadata.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/build/metadata_editable.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/build/wheel.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/build/wheel_editable.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/check.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/freeze.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/install/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/install/wheel.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/prepare.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/pyproject.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/req/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/req/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/req/__pycache__/constructors.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/req/__pycache__/pep723.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/req/__pycache__/req_dependency_group.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/req/__pycache__/req_file.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/req/__pycache__/req_install.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/req/__pycache__/req_set.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/req/constructors.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/req/pep723.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/req/req_dependency_group.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/req/req_file.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/req/req_install.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/req/req_set.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/req/req_uninstall.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/__pycache__/base.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/base.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/legacy/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/legacy/resolver.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/base.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/candidates.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/factory.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/provider.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/reporter.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/requirements.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/resolver.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/self_outdated_check.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/_jaraco_text.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/_log.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/compat.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/logging.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/misc.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/pylock.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/retry.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/urls.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/_jaraco_text.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/_log.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/appdirs.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/compat.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/compatibility_tags.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/datetime.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/deprecation.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/direct_url_helpers.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/egg_link.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/entrypoints.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/filesystem.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/filetypes.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/glibc.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/hashes.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/logging.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/misc.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/packaging.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/pylock.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/retry.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/subprocess.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/temp_dir.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/unpacking.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/urls.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/virtualenv.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/wheel.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/vcs/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/vcs/__pycache__/git.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/vcs/bazaar.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/vcs/git.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/vcs/mercurial.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/vcs/subversion.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/vcs/versioncontrol.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/wheel_builder.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/README.rst create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/LICENSE.txt create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/_cmd.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/adapter.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/cache.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/caches/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/controller.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/filewrapper.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/heuristics.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/py.typed create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/serialize.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/wrapper.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/certifi/LICENSE create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/certifi/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/certifi/__main__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/certifi/cacert.pem create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/certifi/core.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/certifi/py.typed create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/dependency_groups/LICENSE.txt create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/dependency_groups/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/dependency_groups/__main__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/dependency_groups/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/dependency_groups/__pycache__/__main__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/dependency_groups/__pycache__/_implementation.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/dependency_groups/__pycache__/_lint_dependency_groups.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/dependency_groups/__pycache__/_pip_wrapper.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/dependency_groups/__pycache__/_toml_compat.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/dependency_groups/_implementation.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/dependency_groups/_lint_dependency_groups.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/dependency_groups/_pip_wrapper.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/dependency_groups/_toml_compat.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/dependency_groups/py.typed create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/distlib/LICENSE.txt create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/distlib/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/distlib/compat.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/distlib/resources.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/distlib/scripts.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/distlib/t32.exe create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/distlib/t64-arm.exe create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/distlib/t64.exe create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/distlib/util.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/distlib/w32.exe create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/distlib/w64-arm.exe create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/distlib/w64.exe create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/distro/LICENSE create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/distro/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/distro/__main__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/distro/__pycache__/__main__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/distro/__pycache__/distro.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/distro/distro.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/distro/py.typed create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/idna/LICENSE.md create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/idna/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/idna/__pycache__/core.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/idna/codec.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/idna/compat.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/idna/core.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/idna/idnadata.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/idna/intranges.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/idna/package_data.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/idna/py.typed create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/idna/uts46data.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/msgpack/COPYING create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/msgpack/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/msgpack/exceptions.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/msgpack/ext.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/msgpack/fallback.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/packaging/LICENSE create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/packaging/LICENSE.APACHE create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/packaging/LICENSE.BSD create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/packaging/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/packaging/__pycache__/_elffile.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/packaging/__pycache__/_parser.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/packaging/__pycache__/_tokenizer.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/packaging/__pycache__/metadata.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/packaging/__pycache__/pylock.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/packaging/_elffile.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/packaging/_manylinux.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/packaging/_musllinux.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/packaging/_parser.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/packaging/_structures.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/packaging/_tokenizer.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/packaging/licenses/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/packaging/licenses/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/packaging/licenses/__pycache__/_spdx.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/packaging/licenses/_spdx.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/packaging/markers.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/packaging/metadata.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/packaging/py.typed create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/packaging/pylock.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/packaging/requirements.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/packaging/specifiers.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/packaging/tags.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/packaging/utils.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/packaging/version.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pkg_resources/LICENSE create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pkg_resources/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/platformdirs/LICENSE create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/platformdirs/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/platformdirs/__main__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/platformdirs/__pycache__/__main__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/platformdirs/__pycache__/api.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/platformdirs/__pycache__/macos.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/platformdirs/__pycache__/version.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/platformdirs/android.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/platformdirs/api.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/platformdirs/macos.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/platformdirs/py.typed create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/platformdirs/unix.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/platformdirs/version.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/platformdirs/windows.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pygments/LICENSE create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pygments/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pygments/__main__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pygments/__pycache__/__main__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pygments/__pycache__/console.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pygments/__pycache__/filter.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pygments/__pycache__/modeline.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pygments/__pycache__/regexopt.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pygments/__pycache__/sphinxext.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pygments/__pycache__/style.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pygments/__pycache__/token.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pygments/__pycache__/unistring.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pygments/__pycache__/util.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pygments/console.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pygments/filter.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pygments/filters/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pygments/filters/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pygments/formatter.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/_mapping.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pygments/lexer.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pygments/lexers/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pygments/lexers/__pycache__/python.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pygments/lexers/_mapping.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pygments/lexers/python.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pygments/modeline.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pygments/plugin.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pygments/regexopt.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pygments/scanner.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pygments/sphinxext.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pygments/style.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pygments/styles/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pygments/styles/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pygments/styles/__pycache__/_mapping.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pygments/styles/_mapping.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pygments/token.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pygments/unistring.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pygments/util.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/LICENSE create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_impl.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/py.typed create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/requests/LICENSE create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/requests/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/api.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/help.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/models.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/requests/__version__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/requests/_internal_utils.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/requests/adapters.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/requests/api.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/requests/auth.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/requests/certs.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/requests/compat.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/requests/cookies.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/requests/exceptions.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/requests/help.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/requests/hooks.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/requests/models.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/requests/packages.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/requests/sessions.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/requests/status_codes.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/requests/structures.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/requests/utils.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/resolvelib/LICENSE create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/resolvelib/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/resolvelib/__pycache__/reporters.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/resolvelib/providers.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/resolvelib/py.typed create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/resolvelib/reporters.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/resolvelib/resolvers/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/resolvelib/resolvers/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/resolvelib/resolvers/__pycache__/abstract.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/resolvelib/resolvers/__pycache__/criterion.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/resolvelib/resolvers/__pycache__/exceptions.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/resolvelib/resolvers/__pycache__/resolution.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/resolvelib/resolvers/abstract.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/resolvelib/resolvers/criterion.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/resolvelib/resolvers/exceptions.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/resolvelib/resolvers/resolution.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/resolvelib/structs.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/LICENSE create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__main__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_emoji_replace.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_export_format.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_extension.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_fileno.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_loop.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_null_file.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_palettes.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_windows.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_windows_renderer.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_wrap.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/abc.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/align.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/bar.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/box.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/color.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/console.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/constrain.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/control.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/default_styles.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/diagnose.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/file_proxy.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/highlighter.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/json.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/live.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/measure.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/panel.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/progress_bar.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/prompt.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/region.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/repr.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/rule.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/status.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/style.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/styled.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/table.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/terminal_theme.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/text.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/theme.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/traceback.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/_cell_widths.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/_emoji_codes.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/_emoji_replace.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/_export_format.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/_extension.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/_fileno.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/_inspect.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/_log_render.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/_loop.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/_null_file.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/_palettes.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/_pick.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/_ratio.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/_spinners.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/_stack.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/_timer.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/_win32_console.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/_windows.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/_windows_renderer.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/_wrap.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/abc.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/align.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/ansi.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/bar.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/box.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/cells.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/color.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/color_triplet.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/columns.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/console.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/constrain.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/containers.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/control.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/default_styles.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/diagnose.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/emoji.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/errors.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/file_proxy.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/filesize.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/highlighter.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/json.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/jupyter.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/layout.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/live.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/live_render.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/logging.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/markup.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/measure.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/padding.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/pager.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/palette.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/panel.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/pretty.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/progress.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/progress_bar.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/prompt.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/protocol.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/py.typed create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/region.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/repr.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/rule.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/scope.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/screen.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/segment.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/spinner.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/status.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/style.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/styled.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/syntax.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/table.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/terminal_theme.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/text.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/theme.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/themes.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/traceback.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/rich/tree.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/tomli/LICENSE create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/tomli/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/tomli/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/tomli/__pycache__/_parser.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/tomli/__pycache__/_types.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/tomli/_parser.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/tomli/_re.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/tomli/_types.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/tomli/py.typed create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/tomli_w/LICENSE create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/tomli_w/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/tomli_w/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/tomli_w/__pycache__/_writer.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/tomli_w/_writer.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/tomli_w/py.typed create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/truststore/LICENSE create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/truststore/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/truststore/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/truststore/__pycache__/_api.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/truststore/__pycache__/_macos.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/truststore/__pycache__/_openssl.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/truststore/__pycache__/_ssl_constants.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/truststore/__pycache__/_windows.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/truststore/_api.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/truststore/_macos.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/truststore/_openssl.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/truststore/_ssl_constants.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/truststore/_windows.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/truststore/py.typed create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/LICENSE.txt create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/__pycache__/_version.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/_collections.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/_version.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/connection.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/connectionpool.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/appengine.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/securetransport.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/socks.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/exceptions.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/fields.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/filepost.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/packages/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/weakref_finalize.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/packages/backports/weakref_finalize.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/packages/six.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/poolmanager.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/request.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/response.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/__pycache__/proxy.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/connection.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/proxy.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/queue.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/request.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/response.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/retry.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/ssl_.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/ssltransport.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/timeout.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/url.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/wait.py create mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/vendor.txt create mode 100644 .venv/lib/python3.10/site-packages/pip/py.typed create mode 100644 .venv/lib/python3.10/site-packages/pkg_resources/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pkg_resources/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pkg_resources/_vendor/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pkg_resources/_vendor/__pycache__/pyparsing.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pkg_resources/_vendor/appdirs.py create mode 100644 .venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/__about__.py create mode 100644 .venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/__pycache__/_manylinux.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/__pycache__/_musllinux.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/__pycache__/tags.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/_manylinux.py create mode 100644 .venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/_musllinux.py create mode 100644 .venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/_structures.py create mode 100644 .venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/markers.py create mode 100644 .venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/requirements.py create mode 100644 .venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/specifiers.py create mode 100644 .venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/tags.py create mode 100644 .venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/utils.py create mode 100644 .venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/version.py create mode 100644 .venv/lib/python3.10/site-packages/pkg_resources/_vendor/pyparsing.py create mode 100644 .venv/lib/python3.10/site-packages/pkg_resources/extern/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pkg_resources/tests/data/my-test-package-source/__pycache__/setup.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pkg_resources/tests/data/my-test-package-source/setup.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic-2.12.5.dist-info/INSTALLER create mode 100644 .venv/lib/python3.10/site-packages/pydantic-2.12.5.dist-info/METADATA create mode 100644 .venv/lib/python3.10/site-packages/pydantic-2.12.5.dist-info/RECORD create mode 100644 .venv/lib/python3.10/site-packages/pydantic-2.12.5.dist-info/WHEEL create mode 100644 .venv/lib/python3.10/site-packages/pydantic-2.12.5.dist-info/licenses/LICENSE create mode 100644 .venv/lib/python3.10/site-packages/pydantic/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/__pycache__/_migration.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/__pycache__/alias_generators.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/__pycache__/aliases.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/__pycache__/annotated_handlers.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/__pycache__/class_validators.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/__pycache__/color.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/__pycache__/config.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/__pycache__/dataclasses.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/__pycache__/datetime_parse.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/__pycache__/decorator.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/__pycache__/env_settings.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/__pycache__/error_wrappers.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/__pycache__/errors.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/__pycache__/fields.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/__pycache__/functional_serializers.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/__pycache__/functional_validators.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/__pycache__/generics.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/__pycache__/json.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/__pycache__/json_schema.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/__pycache__/main.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/__pycache__/mypy.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/__pycache__/networks.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/__pycache__/parse.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/__pycache__/root_model.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/__pycache__/schema.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/__pycache__/tools.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/__pycache__/type_adapter.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/__pycache__/types.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/__pycache__/typing.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/__pycache__/utils.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/__pycache__/validate_call_decorator.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/__pycache__/validators.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/__pycache__/version.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/__pycache__/warnings.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/__pycache__/_config.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/__pycache__/_core_metadata.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/__pycache__/_core_utils.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/__pycache__/_dataclasses.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/__pycache__/_decorators.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/__pycache__/_decorators_v1.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/__pycache__/_discriminated_union.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/__pycache__/_docs_extraction.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/__pycache__/_fields.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/__pycache__/_forward_ref.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/__pycache__/_generate_schema.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/__pycache__/_generics.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/__pycache__/_git.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/__pycache__/_import_utils.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/__pycache__/_internal_dataclass.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/__pycache__/_known_annotated_metadata.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/__pycache__/_mock_val_ser.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/__pycache__/_model_construction.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/__pycache__/_namespace_utils.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/__pycache__/_repr.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/__pycache__/_schema_gather.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/__pycache__/_schema_generation_shared.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/__pycache__/_serializers.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/__pycache__/_signature.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/__pycache__/_typing_extra.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/__pycache__/_utils.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/__pycache__/_validate_call.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/__pycache__/_validators.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/_config.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/_core_metadata.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/_core_utils.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/_dataclasses.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/_decorators.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/_decorators_v1.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/_discriminated_union.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/_docs_extraction.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/_fields.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/_forward_ref.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/_generate_schema.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/_generics.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/_git.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/_import_utils.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/_internal_dataclass.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/_known_annotated_metadata.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/_mock_val_ser.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/_model_construction.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/_namespace_utils.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/_schema_gather.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/_schema_generation_shared.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/_serializers.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/_signature.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/_typing_extra.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/_utils.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/_validate_call.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_internal/_validators.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/_migration.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/alias_generators.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/aliases.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/annotated_handlers.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/class_validators.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/color.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/config.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/dataclasses.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/datetime_parse.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/decorator.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/deprecated/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/deprecated/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/deprecated/__pycache__/class_validators.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/deprecated/__pycache__/config.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/deprecated/__pycache__/copy_internals.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/deprecated/__pycache__/decorator.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/deprecated/__pycache__/json.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/deprecated/__pycache__/parse.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/deprecated/__pycache__/tools.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/deprecated/class_validators.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/deprecated/config.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/deprecated/copy_internals.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/deprecated/decorator.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/deprecated/json.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/deprecated/parse.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/deprecated/tools.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/env_settings.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/error_wrappers.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/errors.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/experimental/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/experimental/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/experimental/__pycache__/arguments_schema.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/experimental/__pycache__/missing_sentinel.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/experimental/__pycache__/pipeline.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/experimental/arguments_schema.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/experimental/missing_sentinel.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/experimental/pipeline.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/fields.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/functional_serializers.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/functional_validators.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/generics.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/json.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/json_schema.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/main.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/mypy.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/networks.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/parse.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/plugin/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/plugin/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/plugin/__pycache__/_loader.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/plugin/__pycache__/_schema_validator.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/plugin/_loader.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/plugin/_schema_validator.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/py.typed create mode 100644 .venv/lib/python3.10/site-packages/pydantic/root_model.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/schema.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/tools.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/type_adapter.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/types.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/typing.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/utils.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/__pycache__/_hypothesis_plugin.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/__pycache__/annotated_types.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/__pycache__/class_validators.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/__pycache__/color.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/__pycache__/config.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/__pycache__/dataclasses.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/__pycache__/datetime_parse.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/__pycache__/decorator.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/__pycache__/env_settings.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/__pycache__/error_wrappers.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/__pycache__/errors.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/__pycache__/fields.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/__pycache__/generics.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/__pycache__/json.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/__pycache__/main.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/__pycache__/mypy.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/__pycache__/networks.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/__pycache__/parse.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/__pycache__/schema.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/__pycache__/tools.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/__pycache__/types.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/__pycache__/typing.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/__pycache__/utils.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/__pycache__/validators.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/__pycache__/version.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/_hypothesis_plugin.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/annotated_types.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/class_validators.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/color.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/config.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/dataclasses.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/datetime_parse.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/decorator.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/env_settings.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/error_wrappers.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/errors.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/fields.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/generics.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/json.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/main.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/mypy.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/networks.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/parse.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/py.typed create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/schema.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/tools.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/types.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/typing.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/utils.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/validators.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/v1/version.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/validate_call_decorator.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/validators.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/version.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic/warnings.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic_core-2.41.5.dist-info/INSTALLER create mode 100644 .venv/lib/python3.10/site-packages/pydantic_core-2.41.5.dist-info/METADATA create mode 100644 .venv/lib/python3.10/site-packages/pydantic_core-2.41.5.dist-info/RECORD create mode 100644 .venv/lib/python3.10/site-packages/pydantic_core-2.41.5.dist-info/WHEEL create mode 100644 .venv/lib/python3.10/site-packages/pydantic_core-2.41.5.dist-info/licenses/LICENSE create mode 100644 .venv/lib/python3.10/site-packages/pydantic_core/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic_core/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/pydantic_core/__pycache__/core_schema.cpython-310.pyc create mode 100755 .venv/lib/python3.10/site-packages/pydantic_core/_pydantic_core.cpython-310-x86_64-linux-gnu.so create mode 100644 .venv/lib/python3.10/site-packages/pydantic_core/_pydantic_core.pyi create mode 100644 .venv/lib/python3.10/site-packages/pydantic_core/core_schema.py create mode 100644 .venv/lib/python3.10/site-packages/pydantic_core/py.typed create mode 100644 .venv/lib/python3.10/site-packages/python_multipart-0.0.22.dist-info/INSTALLER create mode 100644 .venv/lib/python3.10/site-packages/python_multipart-0.0.22.dist-info/METADATA create mode 100644 .venv/lib/python3.10/site-packages/python_multipart-0.0.22.dist-info/RECORD create mode 100644 .venv/lib/python3.10/site-packages/python_multipart-0.0.22.dist-info/REQUESTED create mode 100644 .venv/lib/python3.10/site-packages/python_multipart-0.0.22.dist-info/WHEEL create mode 100644 .venv/lib/python3.10/site-packages/python_multipart-0.0.22.dist-info/licenses/LICENSE.txt create mode 100644 .venv/lib/python3.10/site-packages/python_multipart/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/python_multipart/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/python_multipart/__pycache__/decoders.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/python_multipart/__pycache__/exceptions.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/python_multipart/__pycache__/multipart.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/python_multipart/decoders.py create mode 100644 .venv/lib/python3.10/site-packages/python_multipart/exceptions.py create mode 100644 .venv/lib/python3.10/site-packages/python_multipart/multipart.py create mode 100644 .venv/lib/python3.10/site-packages/python_multipart/py.typed create mode 100644 .venv/lib/python3.10/site-packages/requests-2.32.5.dist-info/INSTALLER create mode 100644 .venv/lib/python3.10/site-packages/requests-2.32.5.dist-info/METADATA create mode 100644 .venv/lib/python3.10/site-packages/requests-2.32.5.dist-info/RECORD create mode 100644 .venv/lib/python3.10/site-packages/requests-2.32.5.dist-info/WHEEL create mode 100644 .venv/lib/python3.10/site-packages/requests-2.32.5.dist-info/licenses/LICENSE create mode 100644 .venv/lib/python3.10/site-packages/requests-2.32.5.dist-info/top_level.txt create mode 100644 .venv/lib/python3.10/site-packages/requests/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/requests/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/requests/__pycache__/__version__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/requests/__pycache__/_internal_utils.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/requests/__pycache__/adapters.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/requests/__pycache__/api.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/requests/__pycache__/auth.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/requests/__pycache__/certs.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/requests/__pycache__/compat.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/requests/__pycache__/cookies.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/requests/__pycache__/exceptions.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/requests/__pycache__/help.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/requests/__pycache__/hooks.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/requests/__pycache__/models.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/requests/__pycache__/packages.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/requests/__pycache__/sessions.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/requests/__pycache__/status_codes.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/requests/__pycache__/structures.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/requests/__pycache__/utils.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/requests/__version__.py create mode 100644 .venv/lib/python3.10/site-packages/requests/_internal_utils.py create mode 100644 .venv/lib/python3.10/site-packages/requests/adapters.py create mode 100644 .venv/lib/python3.10/site-packages/requests/api.py create mode 100644 .venv/lib/python3.10/site-packages/requests/auth.py create mode 100644 .venv/lib/python3.10/site-packages/requests/certs.py create mode 100644 .venv/lib/python3.10/site-packages/requests/compat.py create mode 100644 .venv/lib/python3.10/site-packages/requests/cookies.py create mode 100644 .venv/lib/python3.10/site-packages/requests/exceptions.py create mode 100644 .venv/lib/python3.10/site-packages/requests/help.py create mode 100644 .venv/lib/python3.10/site-packages/requests/hooks.py create mode 100644 .venv/lib/python3.10/site-packages/requests/models.py create mode 100644 .venv/lib/python3.10/site-packages/requests/packages.py create mode 100644 .venv/lib/python3.10/site-packages/requests/sessions.py create mode 100644 .venv/lib/python3.10/site-packages/requests/status_codes.py create mode 100644 .venv/lib/python3.10/site-packages/requests/structures.py create mode 100644 .venv/lib/python3.10/site-packages/requests/utils.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools-59.6.0.dist-info/INSTALLER create mode 100644 .venv/lib/python3.10/site-packages/setuptools-59.6.0.dist-info/LICENSE create mode 100644 .venv/lib/python3.10/site-packages/setuptools-59.6.0.dist-info/METADATA create mode 100644 .venv/lib/python3.10/site-packages/setuptools-59.6.0.dist-info/RECORD create mode 100644 .venv/lib/python3.10/site-packages/setuptools-59.6.0.dist-info/REQUESTED create mode 100644 .venv/lib/python3.10/site-packages/setuptools-59.6.0.dist-info/WHEEL create mode 100644 .venv/lib/python3.10/site-packages/setuptools-59.6.0.dist-info/entry_points.txt create mode 100644 .venv/lib/python3.10/site-packages/setuptools-59.6.0.dist-info/top_level.txt create mode 100644 .venv/lib/python3.10/site-packages/setuptools/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/__pycache__/_deprecation_warning.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/__pycache__/_imp.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/__pycache__/archive_util.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/__pycache__/build_meta.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/__pycache__/config.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/__pycache__/dep_util.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/__pycache__/depends.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/__pycache__/dist.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/__pycache__/errors.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/__pycache__/extension.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/__pycache__/glob.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/__pycache__/installer.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/__pycache__/launch.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/__pycache__/monkey.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/__pycache__/msvc.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/__pycache__/namespaces.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/__pycache__/package_index.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/__pycache__/py34compat.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/__pycache__/sandbox.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/__pycache__/unicode_utils.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/__pycache__/version.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/__pycache__/wheel.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/__pycache__/windows_support.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_deprecation_warning.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/_msvccompiler.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/archive_util.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/bcppcompiler.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/ccompiler.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/cmd.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/config.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/core.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/cygwinccompiler.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/debug.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/dep_util.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/dir_util.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/dist.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/errors.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/extension.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/fancy_getopt.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/file_util.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/filelist.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/log.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/msvc9compiler.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/msvccompiler.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/py35compat.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/py38compat.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/spawn.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/sysconfig.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/text_file.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/unixccompiler.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/util.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/version.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/versionpredicate.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/_msvccompiler.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/archive_util.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/bcppcompiler.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/ccompiler.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/cmd.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/command/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/bdist.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/bdist_dumb.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/bdist_msi.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/bdist_rpm.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/bdist_wininst.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/build.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/build_clib.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/build_ext.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/build_py.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/build_scripts.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/check.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/clean.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/config.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/install.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/install_data.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/install_egg_info.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/install_headers.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/install_lib.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/install_scripts.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/py37compat.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/register.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/sdist.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/upload.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/command/bdist.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/command/bdist_dumb.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/command/bdist_msi.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/command/bdist_rpm.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/command/bdist_wininst.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/command/build.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/command/build_clib.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/command/build_ext.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/command/build_py.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/command/build_scripts.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/command/check.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/command/clean.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/command/config.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/command/install.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/command/install_data.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/command/install_egg_info.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/command/install_headers.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/command/install_lib.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/command/install_scripts.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/command/py37compat.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/command/register.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/command/sdist.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/command/upload.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/config.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/core.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/cygwinccompiler.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/debug.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/dep_util.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/dir_util.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/dist.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/errors.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/extension.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/fancy_getopt.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/file_util.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/filelist.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/log.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/msvc9compiler.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/msvccompiler.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/py35compat.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/py38compat.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/spawn.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/sysconfig.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/text_file.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/unixccompiler.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/util.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/version.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_distutils/versionpredicate.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_imp.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_vendor/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_vendor/__pycache__/ordered_set.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_vendor/__pycache__/pyparsing.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_vendor/more_itertools/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_vendor/more_itertools/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_vendor/more_itertools/__pycache__/more.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_vendor/more_itertools/__pycache__/recipes.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_vendor/more_itertools/more.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_vendor/more_itertools/recipes.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_vendor/ordered_set.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/__about__.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/__pycache__/_manylinux.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/__pycache__/_musllinux.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/__pycache__/markers.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/__pycache__/requirements.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/__pycache__/tags.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/_manylinux.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/_musllinux.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/_structures.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/markers.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/requirements.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/specifiers.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/tags.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/utils.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/version.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/_vendor/pyparsing.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/archive_util.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/build_meta.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/cli-32.exe create mode 100644 .venv/lib/python3.10/site-packages/setuptools/cli-64.exe create mode 100644 .venv/lib/python3.10/site-packages/setuptools/cli-arm64.exe create mode 100644 .venv/lib/python3.10/site-packages/setuptools/cli.exe create mode 100644 .venv/lib/python3.10/site-packages/setuptools/command/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/command/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/command/__pycache__/alias.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/command/__pycache__/build_clib.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/command/__pycache__/build_ext.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/command/__pycache__/build_py.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/command/__pycache__/develop.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/command/__pycache__/dist_info.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/command/__pycache__/easy_install.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/command/__pycache__/egg_info.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/command/__pycache__/install.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/command/__pycache__/install_lib.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/command/__pycache__/install_scripts.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/command/__pycache__/py36compat.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/command/__pycache__/register.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/command/__pycache__/rotate.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/command/__pycache__/saveopts.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/command/__pycache__/sdist.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/command/__pycache__/setopt.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/command/__pycache__/test.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/command/__pycache__/upload.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/command/__pycache__/upload_docs.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/command/alias.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/command/bdist_egg.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/command/bdist_rpm.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/command/build_clib.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/command/build_ext.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/command/build_py.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/command/develop.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/command/dist_info.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/command/easy_install.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/command/egg_info.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/command/install.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/command/install_egg_info.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/command/install_lib.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/command/install_scripts.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/command/launcher manifest.xml create mode 100644 .venv/lib/python3.10/site-packages/setuptools/command/py36compat.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/command/register.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/command/rotate.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/command/saveopts.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/command/sdist.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/command/setopt.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/command/test.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/command/upload.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/command/upload_docs.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/config.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/dep_util.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/depends.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/dist.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/errors.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/extension.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/extern/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/extern/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/setuptools/glob.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/gui-32.exe create mode 100644 .venv/lib/python3.10/site-packages/setuptools/gui-64.exe create mode 100644 .venv/lib/python3.10/site-packages/setuptools/gui-arm64.exe create mode 100644 .venv/lib/python3.10/site-packages/setuptools/gui.exe create mode 100644 .venv/lib/python3.10/site-packages/setuptools/installer.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/launch.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/monkey.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/msvc.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/namespaces.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/package_index.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/py34compat.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/sandbox.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/script (dev).tmpl create mode 100644 .venv/lib/python3.10/site-packages/setuptools/script.tmpl create mode 100644 .venv/lib/python3.10/site-packages/setuptools/unicode_utils.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/version.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/wheel.py create mode 100644 .venv/lib/python3.10/site-packages/setuptools/windows_support.py create mode 100644 .venv/lib/python3.10/site-packages/sniffio-1.3.1.dist-info/INSTALLER create mode 100644 .venv/lib/python3.10/site-packages/sniffio-1.3.1.dist-info/LICENSE create mode 100644 .venv/lib/python3.10/site-packages/sniffio-1.3.1.dist-info/LICENSE.APACHE2 create mode 100644 .venv/lib/python3.10/site-packages/sniffio-1.3.1.dist-info/LICENSE.MIT create mode 100644 .venv/lib/python3.10/site-packages/sniffio-1.3.1.dist-info/METADATA create mode 100644 .venv/lib/python3.10/site-packages/sniffio-1.3.1.dist-info/RECORD create mode 100644 .venv/lib/python3.10/site-packages/sniffio-1.3.1.dist-info/WHEEL create mode 100644 .venv/lib/python3.10/site-packages/sniffio-1.3.1.dist-info/top_level.txt create mode 100644 .venv/lib/python3.10/site-packages/sniffio/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/sniffio/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/sniffio/__pycache__/_impl.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/sniffio/__pycache__/_version.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/sniffio/_impl.py create mode 100644 .venv/lib/python3.10/site-packages/sniffio/_tests/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/sniffio/_tests/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/sniffio/_tests/__pycache__/test_sniffio.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/sniffio/_tests/test_sniffio.py create mode 100644 .venv/lib/python3.10/site-packages/sniffio/_version.py create mode 100644 .venv/lib/python3.10/site-packages/sniffio/py.typed create mode 100644 .venv/lib/python3.10/site-packages/soupsieve-2.8.3.dist-info/INSTALLER create mode 100644 .venv/lib/python3.10/site-packages/soupsieve-2.8.3.dist-info/METADATA create mode 100644 .venv/lib/python3.10/site-packages/soupsieve-2.8.3.dist-info/RECORD create mode 100644 .venv/lib/python3.10/site-packages/soupsieve-2.8.3.dist-info/WHEEL create mode 100644 .venv/lib/python3.10/site-packages/soupsieve-2.8.3.dist-info/licenses/LICENSE.md create mode 100644 .venv/lib/python3.10/site-packages/soupsieve/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/soupsieve/__meta__.py create mode 100644 .venv/lib/python3.10/site-packages/soupsieve/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/soupsieve/__pycache__/__meta__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/soupsieve/__pycache__/css_match.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/soupsieve/__pycache__/css_parser.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/soupsieve/__pycache__/css_types.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/soupsieve/__pycache__/pretty.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/soupsieve/__pycache__/util.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/soupsieve/css_match.py create mode 100644 .venv/lib/python3.10/site-packages/soupsieve/css_parser.py create mode 100644 .venv/lib/python3.10/site-packages/soupsieve/css_types.py create mode 100644 .venv/lib/python3.10/site-packages/soupsieve/pretty.py create mode 100644 .venv/lib/python3.10/site-packages/soupsieve/py.typed create mode 100644 .venv/lib/python3.10/site-packages/soupsieve/util.py create mode 100644 .venv/lib/python3.10/site-packages/starlette-1.0.0.dist-info/INSTALLER create mode 100644 .venv/lib/python3.10/site-packages/starlette-1.0.0.dist-info/METADATA create mode 100644 .venv/lib/python3.10/site-packages/starlette-1.0.0.dist-info/RECORD create mode 100644 .venv/lib/python3.10/site-packages/starlette-1.0.0.dist-info/WHEEL create mode 100644 .venv/lib/python3.10/site-packages/starlette-1.0.0.dist-info/licenses/LICENSE.md create mode 100644 .venv/lib/python3.10/site-packages/starlette/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/starlette/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/starlette/__pycache__/_exception_handler.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/starlette/__pycache__/_utils.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/starlette/__pycache__/applications.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/starlette/__pycache__/authentication.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/starlette/__pycache__/background.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/starlette/__pycache__/concurrency.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/starlette/__pycache__/config.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/starlette/__pycache__/convertors.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/starlette/__pycache__/datastructures.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/starlette/__pycache__/endpoints.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/starlette/__pycache__/exceptions.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/starlette/__pycache__/formparsers.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/starlette/__pycache__/requests.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/starlette/__pycache__/responses.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/starlette/__pycache__/routing.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/starlette/__pycache__/schemas.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/starlette/__pycache__/staticfiles.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/starlette/__pycache__/status.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/starlette/__pycache__/templating.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/starlette/__pycache__/testclient.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/starlette/__pycache__/types.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/starlette/__pycache__/websockets.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/starlette/_exception_handler.py create mode 100644 .venv/lib/python3.10/site-packages/starlette/_utils.py create mode 100644 .venv/lib/python3.10/site-packages/starlette/applications.py create mode 100644 .venv/lib/python3.10/site-packages/starlette/authentication.py create mode 100644 .venv/lib/python3.10/site-packages/starlette/background.py create mode 100644 .venv/lib/python3.10/site-packages/starlette/concurrency.py create mode 100644 .venv/lib/python3.10/site-packages/starlette/config.py create mode 100644 .venv/lib/python3.10/site-packages/starlette/convertors.py create mode 100644 .venv/lib/python3.10/site-packages/starlette/datastructures.py create mode 100644 .venv/lib/python3.10/site-packages/starlette/endpoints.py create mode 100644 .venv/lib/python3.10/site-packages/starlette/exceptions.py create mode 100644 .venv/lib/python3.10/site-packages/starlette/formparsers.py create mode 100644 .venv/lib/python3.10/site-packages/starlette/middleware/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/starlette/middleware/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/starlette/middleware/__pycache__/authentication.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/starlette/middleware/__pycache__/base.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/starlette/middleware/__pycache__/cors.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/starlette/middleware/__pycache__/errors.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/starlette/middleware/__pycache__/exceptions.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/starlette/middleware/__pycache__/gzip.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/starlette/middleware/__pycache__/httpsredirect.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/starlette/middleware/__pycache__/sessions.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/starlette/middleware/__pycache__/trustedhost.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/starlette/middleware/__pycache__/wsgi.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/starlette/middleware/authentication.py create mode 100644 .venv/lib/python3.10/site-packages/starlette/middleware/base.py create mode 100644 .venv/lib/python3.10/site-packages/starlette/middleware/cors.py create mode 100644 .venv/lib/python3.10/site-packages/starlette/middleware/errors.py create mode 100644 .venv/lib/python3.10/site-packages/starlette/middleware/exceptions.py create mode 100644 .venv/lib/python3.10/site-packages/starlette/middleware/gzip.py create mode 100644 .venv/lib/python3.10/site-packages/starlette/middleware/httpsredirect.py create mode 100644 .venv/lib/python3.10/site-packages/starlette/middleware/sessions.py create mode 100644 .venv/lib/python3.10/site-packages/starlette/middleware/trustedhost.py create mode 100644 .venv/lib/python3.10/site-packages/starlette/middleware/wsgi.py create mode 100644 .venv/lib/python3.10/site-packages/starlette/py.typed create mode 100644 .venv/lib/python3.10/site-packages/starlette/requests.py create mode 100644 .venv/lib/python3.10/site-packages/starlette/responses.py create mode 100644 .venv/lib/python3.10/site-packages/starlette/routing.py create mode 100644 .venv/lib/python3.10/site-packages/starlette/schemas.py create mode 100644 .venv/lib/python3.10/site-packages/starlette/staticfiles.py create mode 100644 .venv/lib/python3.10/site-packages/starlette/status.py create mode 100644 .venv/lib/python3.10/site-packages/starlette/templating.py create mode 100644 .venv/lib/python3.10/site-packages/starlette/testclient.py create mode 100644 .venv/lib/python3.10/site-packages/starlette/types.py create mode 100644 .venv/lib/python3.10/site-packages/starlette/websockets.py create mode 100644 .venv/lib/python3.10/site-packages/tqdm-4.67.3.dist-info/INSTALLER create mode 100644 .venv/lib/python3.10/site-packages/tqdm-4.67.3.dist-info/METADATA create mode 100644 .venv/lib/python3.10/site-packages/tqdm-4.67.3.dist-info/RECORD create mode 100644 .venv/lib/python3.10/site-packages/tqdm-4.67.3.dist-info/WHEEL create mode 100644 .venv/lib/python3.10/site-packages/tqdm-4.67.3.dist-info/entry_points.txt create mode 100644 .venv/lib/python3.10/site-packages/tqdm-4.67.3.dist-info/licenses/LICENCE create mode 100644 .venv/lib/python3.10/site-packages/tqdm-4.67.3.dist-info/top_level.txt create mode 100644 .venv/lib/python3.10/site-packages/tqdm/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/tqdm/__main__.py create mode 100644 .venv/lib/python3.10/site-packages/tqdm/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/tqdm/__pycache__/__main__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/tqdm/__pycache__/_main.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/tqdm/__pycache__/_monitor.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/tqdm/__pycache__/_tqdm.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/tqdm/__pycache__/_tqdm_gui.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/tqdm/__pycache__/_tqdm_notebook.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/tqdm/__pycache__/_tqdm_pandas.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/tqdm/__pycache__/_utils.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/tqdm/__pycache__/asyncio.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/tqdm/__pycache__/auto.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/tqdm/__pycache__/autonotebook.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/tqdm/__pycache__/cli.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/tqdm/__pycache__/dask.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/tqdm/__pycache__/gui.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/tqdm/__pycache__/keras.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/tqdm/__pycache__/notebook.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/tqdm/__pycache__/rich.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/tqdm/__pycache__/std.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/tqdm/__pycache__/tk.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/tqdm/__pycache__/utils.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/tqdm/__pycache__/version.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/tqdm/_main.py create mode 100644 .venv/lib/python3.10/site-packages/tqdm/_monitor.py create mode 100644 .venv/lib/python3.10/site-packages/tqdm/_tqdm.py create mode 100644 .venv/lib/python3.10/site-packages/tqdm/_tqdm_gui.py create mode 100644 .venv/lib/python3.10/site-packages/tqdm/_tqdm_notebook.py create mode 100644 .venv/lib/python3.10/site-packages/tqdm/_tqdm_pandas.py create mode 100644 .venv/lib/python3.10/site-packages/tqdm/_utils.py create mode 100644 .venv/lib/python3.10/site-packages/tqdm/asyncio.py create mode 100644 .venv/lib/python3.10/site-packages/tqdm/auto.py create mode 100644 .venv/lib/python3.10/site-packages/tqdm/autonotebook.py create mode 100644 .venv/lib/python3.10/site-packages/tqdm/cli.py create mode 100755 .venv/lib/python3.10/site-packages/tqdm/completion.sh create mode 100644 .venv/lib/python3.10/site-packages/tqdm/contrib/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/tqdm/contrib/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/tqdm/contrib/__pycache__/bells.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/tqdm/contrib/__pycache__/concurrent.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/tqdm/contrib/__pycache__/discord.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/tqdm/contrib/__pycache__/itertools.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/tqdm/contrib/__pycache__/logging.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/tqdm/contrib/__pycache__/slack.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/tqdm/contrib/__pycache__/telegram.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/tqdm/contrib/__pycache__/utils_worker.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/tqdm/contrib/bells.py create mode 100644 .venv/lib/python3.10/site-packages/tqdm/contrib/concurrent.py create mode 100644 .venv/lib/python3.10/site-packages/tqdm/contrib/discord.py create mode 100644 .venv/lib/python3.10/site-packages/tqdm/contrib/itertools.py create mode 100644 .venv/lib/python3.10/site-packages/tqdm/contrib/logging.py create mode 100644 .venv/lib/python3.10/site-packages/tqdm/contrib/slack.py create mode 100644 .venv/lib/python3.10/site-packages/tqdm/contrib/telegram.py create mode 100644 .venv/lib/python3.10/site-packages/tqdm/contrib/utils_worker.py create mode 100644 .venv/lib/python3.10/site-packages/tqdm/dask.py create mode 100644 .venv/lib/python3.10/site-packages/tqdm/gui.py create mode 100644 .venv/lib/python3.10/site-packages/tqdm/keras.py create mode 100644 .venv/lib/python3.10/site-packages/tqdm/notebook.py create mode 100644 .venv/lib/python3.10/site-packages/tqdm/rich.py create mode 100644 .venv/lib/python3.10/site-packages/tqdm/std.py create mode 100644 .venv/lib/python3.10/site-packages/tqdm/tk.py create mode 100644 .venv/lib/python3.10/site-packages/tqdm/tqdm.1 create mode 100644 .venv/lib/python3.10/site-packages/tqdm/utils.py create mode 100644 .venv/lib/python3.10/site-packages/tqdm/version.py create mode 100644 .venv/lib/python3.10/site-packages/typing_extensions-4.15.0.dist-info/INSTALLER create mode 100644 .venv/lib/python3.10/site-packages/typing_extensions-4.15.0.dist-info/METADATA create mode 100644 .venv/lib/python3.10/site-packages/typing_extensions-4.15.0.dist-info/RECORD create mode 100644 .venv/lib/python3.10/site-packages/typing_extensions-4.15.0.dist-info/WHEEL create mode 100644 .venv/lib/python3.10/site-packages/typing_extensions-4.15.0.dist-info/licenses/LICENSE create mode 100644 .venv/lib/python3.10/site-packages/typing_extensions.py create mode 100644 .venv/lib/python3.10/site-packages/typing_inspection-0.4.2.dist-info/INSTALLER create mode 100644 .venv/lib/python3.10/site-packages/typing_inspection-0.4.2.dist-info/METADATA create mode 100644 .venv/lib/python3.10/site-packages/typing_inspection-0.4.2.dist-info/RECORD create mode 100644 .venv/lib/python3.10/site-packages/typing_inspection-0.4.2.dist-info/WHEEL create mode 100644 .venv/lib/python3.10/site-packages/typing_inspection-0.4.2.dist-info/licenses/LICENSE create mode 100644 .venv/lib/python3.10/site-packages/typing_inspection/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/typing_inspection/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/typing_inspection/__pycache__/introspection.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/typing_inspection/__pycache__/typing_objects.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/typing_inspection/introspection.py create mode 100644 .venv/lib/python3.10/site-packages/typing_inspection/py.typed create mode 100644 .venv/lib/python3.10/site-packages/typing_inspection/typing_objects.py create mode 100644 .venv/lib/python3.10/site-packages/typing_inspection/typing_objects.pyi create mode 100644 .venv/lib/python3.10/site-packages/urllib3-2.6.3.dist-info/INSTALLER create mode 100644 .venv/lib/python3.10/site-packages/urllib3-2.6.3.dist-info/METADATA create mode 100644 .venv/lib/python3.10/site-packages/urllib3-2.6.3.dist-info/RECORD create mode 100644 .venv/lib/python3.10/site-packages/urllib3-2.6.3.dist-info/WHEEL create mode 100644 .venv/lib/python3.10/site-packages/urllib3-2.6.3.dist-info/licenses/LICENSE.txt create mode 100644 .venv/lib/python3.10/site-packages/urllib3/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/urllib3/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/urllib3/__pycache__/_base_connection.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/urllib3/__pycache__/_collections.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/urllib3/__pycache__/_request_methods.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/urllib3/__pycache__/_version.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/urllib3/__pycache__/connection.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/urllib3/__pycache__/connectionpool.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/urllib3/__pycache__/exceptions.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/urllib3/__pycache__/fields.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/urllib3/__pycache__/filepost.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/urllib3/__pycache__/poolmanager.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/urllib3/__pycache__/response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/urllib3/_base_connection.py create mode 100644 .venv/lib/python3.10/site-packages/urllib3/_collections.py create mode 100644 .venv/lib/python3.10/site-packages/urllib3/_request_methods.py create mode 100644 .venv/lib/python3.10/site-packages/urllib3/_version.py create mode 100644 .venv/lib/python3.10/site-packages/urllib3/connection.py create mode 100644 .venv/lib/python3.10/site-packages/urllib3/connectionpool.py create mode 100644 .venv/lib/python3.10/site-packages/urllib3/contrib/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/urllib3/contrib/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/urllib3/contrib/__pycache__/pyopenssl.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/urllib3/contrib/__pycache__/socks.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/urllib3/contrib/emscripten/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/urllib3/contrib/emscripten/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/urllib3/contrib/emscripten/__pycache__/connection.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/urllib3/contrib/emscripten/__pycache__/fetch.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/urllib3/contrib/emscripten/__pycache__/request.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/urllib3/contrib/emscripten/__pycache__/response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/urllib3/contrib/emscripten/connection.py create mode 100644 .venv/lib/python3.10/site-packages/urllib3/contrib/emscripten/emscripten_fetch_worker.js create mode 100644 .venv/lib/python3.10/site-packages/urllib3/contrib/emscripten/fetch.py create mode 100644 .venv/lib/python3.10/site-packages/urllib3/contrib/emscripten/request.py create mode 100644 .venv/lib/python3.10/site-packages/urllib3/contrib/emscripten/response.py create mode 100644 .venv/lib/python3.10/site-packages/urllib3/contrib/pyopenssl.py create mode 100644 .venv/lib/python3.10/site-packages/urllib3/contrib/socks.py create mode 100644 .venv/lib/python3.10/site-packages/urllib3/exceptions.py create mode 100644 .venv/lib/python3.10/site-packages/urllib3/fields.py create mode 100644 .venv/lib/python3.10/site-packages/urllib3/filepost.py create mode 100644 .venv/lib/python3.10/site-packages/urllib3/http2/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/urllib3/http2/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/urllib3/http2/__pycache__/connection.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/urllib3/http2/__pycache__/probe.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/urllib3/http2/connection.py create mode 100644 .venv/lib/python3.10/site-packages/urllib3/http2/probe.py create mode 100644 .venv/lib/python3.10/site-packages/urllib3/poolmanager.py create mode 100644 .venv/lib/python3.10/site-packages/urllib3/py.typed create mode 100644 .venv/lib/python3.10/site-packages/urllib3/response.py create mode 100644 .venv/lib/python3.10/site-packages/urllib3/util/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/urllib3/util/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/urllib3/util/__pycache__/connection.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/urllib3/util/__pycache__/proxy.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/urllib3/util/__pycache__/request.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/urllib3/util/__pycache__/response.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/urllib3/util/__pycache__/retry.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/urllib3/util/__pycache__/ssl_.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/urllib3/util/__pycache__/ssl_match_hostname.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/urllib3/util/__pycache__/ssltransport.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/urllib3/util/__pycache__/timeout.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/urllib3/util/__pycache__/url.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/urllib3/util/__pycache__/util.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/urllib3/util/__pycache__/wait.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/urllib3/util/connection.py create mode 100644 .venv/lib/python3.10/site-packages/urllib3/util/proxy.py create mode 100644 .venv/lib/python3.10/site-packages/urllib3/util/request.py create mode 100644 .venv/lib/python3.10/site-packages/urllib3/util/response.py create mode 100644 .venv/lib/python3.10/site-packages/urllib3/util/retry.py create mode 100644 .venv/lib/python3.10/site-packages/urllib3/util/ssl_.py create mode 100644 .venv/lib/python3.10/site-packages/urllib3/util/ssl_match_hostname.py create mode 100644 .venv/lib/python3.10/site-packages/urllib3/util/ssltransport.py create mode 100644 .venv/lib/python3.10/site-packages/urllib3/util/timeout.py create mode 100644 .venv/lib/python3.10/site-packages/urllib3/util/url.py create mode 100644 .venv/lib/python3.10/site-packages/urllib3/util/util.py create mode 100644 .venv/lib/python3.10/site-packages/urllib3/util/wait.py create mode 100644 .venv/lib/python3.10/site-packages/uvicorn-0.42.0.dist-info/INSTALLER create mode 100644 .venv/lib/python3.10/site-packages/uvicorn-0.42.0.dist-info/METADATA create mode 100644 .venv/lib/python3.10/site-packages/uvicorn-0.42.0.dist-info/RECORD create mode 100644 .venv/lib/python3.10/site-packages/uvicorn-0.42.0.dist-info/REQUESTED create mode 100644 .venv/lib/python3.10/site-packages/uvicorn-0.42.0.dist-info/WHEEL create mode 100644 .venv/lib/python3.10/site-packages/uvicorn-0.42.0.dist-info/entry_points.txt create mode 100644 .venv/lib/python3.10/site-packages/uvicorn-0.42.0.dist-info/licenses/LICENSE.md create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/__main__.py create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/__pycache__/__main__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/__pycache__/_compat.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/__pycache__/_subprocess.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/__pycache__/_types.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/__pycache__/config.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/__pycache__/importer.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/__pycache__/logging.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/__pycache__/main.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/__pycache__/server.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/__pycache__/workers.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/_compat.py create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/_subprocess.py create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/_types.py create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/config.py create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/importer.py create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/lifespan/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/lifespan/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/lifespan/__pycache__/off.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/lifespan/__pycache__/on.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/lifespan/off.py create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/lifespan/on.py create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/logging.py create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/loops/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/loops/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/loops/__pycache__/asyncio.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/loops/__pycache__/auto.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/loops/__pycache__/uvloop.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/loops/asyncio.py create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/loops/auto.py create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/loops/uvloop.py create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/main.py create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/middleware/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/middleware/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/middleware/__pycache__/asgi2.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/middleware/__pycache__/message_logger.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/middleware/__pycache__/proxy_headers.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/middleware/__pycache__/wsgi.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/middleware/asgi2.py create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/middleware/message_logger.py create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/middleware/proxy_headers.py create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/middleware/wsgi.py create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/protocols/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/protocols/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/protocols/__pycache__/utils.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/protocols/http/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/protocols/http/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/protocols/http/__pycache__/auto.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/protocols/http/__pycache__/flow_control.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/protocols/http/__pycache__/h11_impl.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/protocols/http/__pycache__/httptools_impl.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/protocols/http/auto.py create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/protocols/http/flow_control.py create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/protocols/http/h11_impl.py create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/protocols/http/httptools_impl.py create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/protocols/utils.py create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/protocols/websockets/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/protocols/websockets/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/protocols/websockets/__pycache__/auto.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/protocols/websockets/__pycache__/websockets_impl.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/protocols/websockets/__pycache__/websockets_sansio_impl.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/protocols/websockets/__pycache__/wsproto_impl.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/protocols/websockets/auto.py create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/protocols/websockets/websockets_impl.py create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/protocols/websockets/websockets_sansio_impl.py create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/protocols/websockets/wsproto_impl.py create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/py.typed create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/server.py create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/supervisors/__init__.py create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/supervisors/__pycache__/__init__.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/supervisors/__pycache__/basereload.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/supervisors/__pycache__/multiprocess.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/supervisors/__pycache__/statreload.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/supervisors/__pycache__/watchfilesreload.cpython-310.pyc create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/supervisors/basereload.py create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/supervisors/multiprocess.py create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/supervisors/statreload.py create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/supervisors/watchfilesreload.py create mode 100644 .venv/lib/python3.10/site-packages/uvicorn/workers.py create mode 120000 .venv/lib64 create mode 100644 .venv/pyvenv.cfg create mode 120000 .venvcd/bin/python create mode 120000 .venvcd/bin/python3 create mode 120000 .venvcd/bin/python3.10 create mode 100644 .venvcd/lib/python3.10/site-packages/_distutils_hack/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/_distutils_hack/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/_distutils_hack/__pycache__/override.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/_distutils_hack/override.py create mode 100644 .venvcd/lib/python3.10/site-packages/distutils-precedence.pth create mode 100644 .venvcd/lib/python3.10/site-packages/pip-22.0.2.dist-info/LICENSE.txt create mode 100644 .venvcd/lib/python3.10/site-packages/pip-22.0.2.dist-info/METADATA create mode 100644 .venvcd/lib/python3.10/site-packages/pip-22.0.2.dist-info/RECORD create mode 100644 .venvcd/lib/python3.10/site-packages/pip-22.0.2.dist-info/WHEEL create mode 100644 .venvcd/lib/python3.10/site-packages/pip-22.0.2.dist-info/entry_points.txt create mode 100644 .venvcd/lib/python3.10/site-packages/pip-22.0.2.dist-info/top_level.txt create mode 100644 .venvcd/lib/python3.10/site-packages/pip/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/__main__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/__pycache__/__main__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/__pycache__/build_env.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/__pycache__/cache.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/__pycache__/configuration.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/__pycache__/exceptions.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/__pycache__/main.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/__pycache__/pyproject.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/build_env.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/cache.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/cli/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/cli/__pycache__/main.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/cli/__pycache__/parser.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/cli/autocompletion.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/cli/base_command.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/cli/cmdoptions.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/cli/command_context.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/cli/main.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/cli/main_parser.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/cli/parser.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/cli/progress_bars.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/cli/req_command.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/cli/spinners.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/cli/status_codes.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/commands/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/cache.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/check.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/completion.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/debug.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/download.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/hash.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/help.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/index.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/install.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/list.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/search.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/show.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/commands/cache.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/commands/check.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/commands/completion.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/commands/configuration.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/commands/debug.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/commands/download.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/commands/freeze.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/commands/hash.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/commands/help.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/commands/index.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/commands/install.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/commands/list.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/commands/search.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/commands/show.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/commands/uninstall.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/commands/wheel.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/configuration.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/distributions/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/distributions/__pycache__/base.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/distributions/base.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/distributions/installed.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/distributions/sdist.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/distributions/wheel.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/exceptions.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/index/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/index/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/index/__pycache__/collector.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/index/__pycache__/sources.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/index/collector.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/index/package_finder.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/index/sources.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/locations/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/locations/__pycache__/base.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/locations/_distutils.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/locations/_sysconfig.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/locations/base.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/main.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/metadata/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/metadata/__pycache__/base.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/metadata/base.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/metadata/pkg_resources.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/models/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/models/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/models/__pycache__/candidate.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/models/__pycache__/format_control.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/models/__pycache__/index.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/models/__pycache__/link.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/models/__pycache__/scheme.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/models/__pycache__/target_python.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/models/__pycache__/wheel.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/models/candidate.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/models/direct_url.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/models/format_control.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/models/index.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/models/link.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/models/scheme.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/models/search_scope.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/models/selection_prefs.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/models/target_python.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/models/wheel.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/network/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/network/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/network/__pycache__/auth.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/network/__pycache__/cache.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/network/__pycache__/download.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/network/__pycache__/session.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/network/__pycache__/utils.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/network/auth.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/network/cache.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/network/download.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/network/lazy_wheel.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/network/session.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/network/utils.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/network/xmlrpc.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/operations/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/operations/__pycache__/check.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/operations/build/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/operations/build/metadata.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/operations/build/metadata_editable.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/operations/build/metadata_legacy.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/operations/build/wheel.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/operations/build/wheel_editable.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/operations/build/wheel_legacy.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/operations/check.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/operations/freeze.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/operations/install/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/operations/install/__pycache__/legacy.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/operations/install/editable_legacy.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/operations/install/legacy.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/operations/install/wheel.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/operations/prepare.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/pyproject.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/req/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/req/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/req/__pycache__/constructors.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/req/__pycache__/req_file.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/req/__pycache__/req_install.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/req/__pycache__/req_set.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/req/__pycache__/req_tracker.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/req/constructors.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/req/req_file.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/req/req_install.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/req/req_set.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/req/req_tracker.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/req/req_uninstall.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/resolution/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/resolution/__pycache__/base.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/resolution/base.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/resolution/legacy/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/resolution/legacy/resolver.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/base.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/candidates.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/factory.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/provider.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/reporter.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/requirements.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/resolver.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/self_outdated_check.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/_log.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/compat.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/distutils_args.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/inject_securetransport.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/logging.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/misc.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/models.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/urls.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/_log.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/appdirs.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/compat.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/compatibility_tags.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/datetime.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/deprecation.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/direct_url_helpers.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/distutils_args.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/egg_link.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/encoding.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/entrypoints.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/filesystem.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/filetypes.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/glibc.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/hashes.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/inject_securetransport.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/logging.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/misc.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/models.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/packaging.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/setuptools_build.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/subprocess.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/temp_dir.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/unpacking.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/urls.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/virtualenv.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/utils/wheel.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/vcs/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/vcs/__pycache__/git.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/vcs/bazaar.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/vcs/git.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/vcs/mercurial.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/vcs/subversion.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/vcs/versioncontrol.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_internal/wheel_builder.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/__pycache__/distro.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/__pycache__/six.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/cachecontrol/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/cachecontrol/_cmd.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/cachecontrol/adapter.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/cachecontrol/cache.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/cachecontrol/caches/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/cachecontrol/compat.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/cachecontrol/controller.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/cachecontrol/filewrapper.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/cachecontrol/heuristics.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/cachecontrol/serialize.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/cachecontrol/wrapper.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/certifi/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/certifi/__main__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/certifi/cacert.pem create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/certifi/core.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/compat.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/big5freq.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/big5prober.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/chardistribution.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/charsetgroupprober.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/charsetprober.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/cli/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/cli/chardetect.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/codingstatemachine.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/compat.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/cp949prober.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/enums.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/escprober.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/escsm.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/eucjpprober.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/euckrfreq.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/euckrprober.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/euctwfreq.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/euctwprober.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/gb2312freq.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/gb2312prober.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/hebrewprober.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/jisfreq.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/jpcntx.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/langbulgarianmodel.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/langgreekmodel.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/langhebrewmodel.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/langhungarianmodel.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/langrussianmodel.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/langthaimodel.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/langturkishmodel.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/latin1prober.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/mbcharsetprober.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/mbcsgroupprober.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/mbcssm.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/metadata/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/metadata/__pycache__/languages.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/metadata/languages.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/sbcharsetprober.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/sbcsgroupprober.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/sjisprober.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/universaldetector.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/utf8prober.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/chardet/version.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/colorama/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/colorama/ansi.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/colorama/ansitowin32.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/colorama/initialise.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/colorama/win32.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/colorama/winterm.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/distlib/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/distlib/compat.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/distlib/database.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/distlib/index.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/distlib/locators.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/distlib/manifest.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/distlib/markers.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/distlib/metadata.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/distlib/resources.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/distlib/scripts.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/distlib/util.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/distlib/version.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/distlib/wheel.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/distro.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/__pycache__/_inputstream.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/__pycache__/_utils.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/__pycache__/constants.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/__pycache__/html5parser.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/__pycache__/serializer.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/_ihatexml.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/_inputstream.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/_tokenizer.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/_trie/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/_trie/__pycache__/py.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/_trie/_base.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/_trie/py.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/_utils.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/constants.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/filters/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/filters/__pycache__/alphabeticalattributes.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/filters/__pycache__/base.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/filters/__pycache__/lint.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/filters/__pycache__/optionaltags.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/filters/base.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/filters/lint.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/filters/optionaltags.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/filters/sanitizer.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/filters/whitespace.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/html5parser.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/serializer.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/genshi.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/sax.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/treeadapters/sax.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/base.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/dom.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree_lxml.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/treebuilders/base.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/treebuilders/dom.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/treebuilders/etree.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/base.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/dom.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree_lxml.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/genshi.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/treewalkers/base.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/treewalkers/dom.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/treewalkers/etree.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/idna/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/idna/__pycache__/core.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/idna/codec.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/idna/compat.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/idna/core.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/idna/idnadata.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/idna/intranges.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/idna/package_data.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/idna/uts46data.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/msgpack/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/msgpack/__pycache__/_version.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/msgpack/_version.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/msgpack/exceptions.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/msgpack/ext.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/msgpack/fallback.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/packaging/__about__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/packaging/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/packaging/_manylinux.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/packaging/_musllinux.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/packaging/_structures.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/packaging/markers.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/packaging/requirements.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/packaging/specifiers.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/packaging/tags.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/packaging/utils.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/packaging/version.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pep517/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pep517/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pep517/__pycache__/build.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pep517/__pycache__/check.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pep517/__pycache__/colorlog.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pep517/__pycache__/compat.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pep517/__pycache__/dirtools.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pep517/__pycache__/envbuild.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pep517/__pycache__/meta.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pep517/__pycache__/wrappers.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pep517/build.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pep517/check.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pep517/colorlog.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pep517/compat.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pep517/dirtools.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pep517/envbuild.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pep517/in_process/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pep517/in_process/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pep517/in_process/__pycache__/_in_process.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pep517/in_process/_in_process.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pep517/meta.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pep517/wrappers.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pkg_resources/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pkg_resources/py31compat.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/platformdirs/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/platformdirs/__main__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/platformdirs/__pycache__/__main__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/platformdirs/__pycache__/api.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/platformdirs/__pycache__/macos.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/platformdirs/__pycache__/version.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/platformdirs/android.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/platformdirs/api.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/platformdirs/macos.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/platformdirs/unix.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/platformdirs/version.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/platformdirs/windows.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/progress/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/progress/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/progress/__pycache__/bar.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/progress/__pycache__/colors.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/progress/__pycache__/counter.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/progress/__pycache__/spinner.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/progress/bar.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/progress/colors.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/progress/counter.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/progress/spinner.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/__main__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/__pycache__/__main__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/__pycache__/cmdline.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/__pycache__/console.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/__pycache__/filter.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/__pycache__/modeline.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/__pycache__/regexopt.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/__pycache__/sphinxext.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/__pycache__/style.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/__pycache__/token.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/__pycache__/unistring.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/__pycache__/util.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/cmdline.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/console.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/filter.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/filters/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/filters/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/formatter.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/__pycache__/groff.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/__pycache__/html.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/__pycache__/img.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/__pycache__/irc.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/__pycache__/latex.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/__pycache__/other.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/__pycache__/svg.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/_mapping.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/bbcode.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/groff.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/html.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/img.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/irc.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/latex.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/other.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/pangomarkup.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/rtf.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/svg.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/terminal.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/terminal256.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/lexer.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/lexers/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/lexers/__pycache__/python.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/lexers/_mapping.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/lexers/python.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/modeline.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/plugin.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/regexopt.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/scanner.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/sphinxext.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/style.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/styles/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/styles/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/token.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/unistring.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pygments/util.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pyparsing/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pyparsing/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pyparsing/__pycache__/actions.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pyparsing/__pycache__/common.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pyparsing/__pycache__/core.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pyparsing/__pycache__/exceptions.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pyparsing/__pycache__/helpers.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pyparsing/__pycache__/results.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pyparsing/__pycache__/testing.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pyparsing/__pycache__/unicode.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pyparsing/__pycache__/util.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pyparsing/actions.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pyparsing/common.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pyparsing/core.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pyparsing/diagram/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pyparsing/exceptions.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pyparsing/helpers.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pyparsing/results.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pyparsing/testing.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pyparsing/unicode.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/pyparsing/util.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/requests/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/api.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/help.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/models.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/requests/__version__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/requests/_internal_utils.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/requests/adapters.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/requests/api.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/requests/auth.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/requests/certs.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/requests/compat.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/requests/cookies.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/requests/exceptions.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/requests/help.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/requests/hooks.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/requests/models.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/requests/packages.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/requests/sessions.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/requests/status_codes.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/requests/structures.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/requests/utils.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/resolvelib/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/resolvelib/__pycache__/reporters.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/resolvelib/__pycache__/resolvers.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/resolvelib/compat/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/resolvelib/providers.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/resolvelib/reporters.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/resolvelib/resolvers.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/resolvelib/structs.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__main__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_emoji_replace.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_extension.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_loop.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_lru_cache.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_palettes.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_windows.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_wrap.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/abc.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/align.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/bar.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/box.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/color.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/console.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/constrain.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/control.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/default_styles.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/diagnose.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/file_proxy.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/highlighter.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/json.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/live.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/measure.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/panel.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/progress_bar.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/prompt.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/region.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/repr.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/rule.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/status.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/style.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/styled.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/table.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/tabulate.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/terminal_theme.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/text.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/theme.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/traceback.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/_cell_widths.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/_emoji_codes.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/_emoji_replace.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/_extension.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/_inspect.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/_log_render.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/_loop.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/_lru_cache.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/_palettes.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/_pick.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/_ratio.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/_spinners.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/_stack.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/_timer.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/_windows.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/_wrap.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/abc.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/align.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/ansi.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/bar.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/box.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/cells.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/color.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/color_triplet.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/columns.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/console.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/constrain.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/containers.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/control.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/default_styles.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/diagnose.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/emoji.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/errors.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/file_proxy.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/filesize.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/highlighter.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/json.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/jupyter.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/layout.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/live.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/live_render.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/logging.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/markup.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/measure.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/padding.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/pager.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/palette.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/panel.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/pretty.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/progress.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/progress_bar.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/prompt.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/protocol.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/region.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/repr.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/rule.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/scope.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/screen.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/segment.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/spinner.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/status.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/style.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/styled.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/syntax.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/table.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/tabulate.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/terminal_theme.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/text.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/theme.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/themes.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/traceback.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/rich/tree.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/six.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/tenacity/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/tenacity/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/tenacity/__pycache__/_asyncio.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/tenacity/__pycache__/_utils.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/tenacity/__pycache__/after.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/tenacity/__pycache__/before.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/tenacity/__pycache__/before_sleep.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/tenacity/__pycache__/nap.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/tenacity/__pycache__/retry.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/tenacity/__pycache__/stop.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/tenacity/__pycache__/tornadoweb.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/tenacity/__pycache__/wait.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/tenacity/_asyncio.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/tenacity/_utils.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/tenacity/after.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/tenacity/before.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/tenacity/before_sleep.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/tenacity/nap.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/tenacity/retry.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/tenacity/stop.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/tenacity/tornadoweb.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/tenacity/wait.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/tomli/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/tomli/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/tomli/__pycache__/_parser.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/tomli/_parser.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/tomli/_re.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/typing_extensions.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/urllib3/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/urllib3/__pycache__/_version.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/urllib3/_collections.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/urllib3/_version.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/urllib3/connection.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/urllib3/connectionpool.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/appengine.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/securetransport.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/socks.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/urllib3/exceptions.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/urllib3/fields.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/urllib3/filepost.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/urllib3/packages/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/urllib3/packages/six.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/urllib3/poolmanager.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/urllib3/request.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/urllib3/response.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/urllib3/util/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/urllib3/util/connection.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/urllib3/util/proxy.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/urllib3/util/queue.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/urllib3/util/request.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/urllib3/util/response.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/urllib3/util/retry.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/urllib3/util/ssl_.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/urllib3/util/ssltransport.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/urllib3/util/timeout.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/urllib3/util/url.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/urllib3/util/wait.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/vendor.txt create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/webencodings/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/webencodings/labels.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/webencodings/mklabels.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/webencodings/tests.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/_vendor/webencodings/x_user_defined.py create mode 100644 .venvcd/lib/python3.10/site-packages/pip/py.typed create mode 100644 .venvcd/lib/python3.10/site-packages/pkg_resources/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pkg_resources/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pkg_resources/_vendor/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pkg_resources/_vendor/__pycache__/pyparsing.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pkg_resources/_vendor/appdirs.py create mode 100644 .venvcd/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/__about__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/__pycache__/_manylinux.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/__pycache__/_musllinux.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/__pycache__/tags.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/_manylinux.py create mode 100644 .venvcd/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/_musllinux.py create mode 100644 .venvcd/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/_structures.py create mode 100644 .venvcd/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/markers.py create mode 100644 .venvcd/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/requirements.py create mode 100644 .venvcd/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/specifiers.py create mode 100644 .venvcd/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/tags.py create mode 100644 .venvcd/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/utils.py create mode 100644 .venvcd/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/version.py create mode 100644 .venvcd/lib/python3.10/site-packages/pkg_resources/_vendor/pyparsing.py create mode 100644 .venvcd/lib/python3.10/site-packages/pkg_resources/extern/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pkg_resources/tests/data/my-test-package-source/__pycache__/setup.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/pkg_resources/tests/data/my-test-package-source/setup.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools-59.6.0.dist-info/INSTALLER create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools-59.6.0.dist-info/LICENSE create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools-59.6.0.dist-info/METADATA create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools-59.6.0.dist-info/RECORD create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools-59.6.0.dist-info/REQUESTED create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools-59.6.0.dist-info/WHEEL create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools-59.6.0.dist-info/entry_points.txt create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools-59.6.0.dist-info/top_level.txt create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/__pycache__/_deprecation_warning.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/__pycache__/_imp.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/__pycache__/archive_util.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/__pycache__/build_meta.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/__pycache__/config.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/__pycache__/dep_util.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/__pycache__/depends.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/__pycache__/dist.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/__pycache__/errors.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/__pycache__/extension.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/__pycache__/glob.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/__pycache__/installer.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/__pycache__/launch.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/__pycache__/monkey.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/__pycache__/msvc.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/__pycache__/namespaces.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/__pycache__/package_index.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/__pycache__/py34compat.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/__pycache__/sandbox.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/__pycache__/unicode_utils.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/__pycache__/version.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/__pycache__/wheel.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/__pycache__/windows_support.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_deprecation_warning.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/_msvccompiler.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/archive_util.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/bcppcompiler.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/ccompiler.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/cmd.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/config.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/core.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/cygwinccompiler.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/debug.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/dep_util.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/dir_util.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/dist.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/errors.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/extension.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/fancy_getopt.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/file_util.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/filelist.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/log.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/msvc9compiler.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/msvccompiler.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/py35compat.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/py38compat.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/spawn.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/sysconfig.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/text_file.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/unixccompiler.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/util.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/version.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/versionpredicate.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/_msvccompiler.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/archive_util.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/bcppcompiler.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/ccompiler.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/cmd.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/command/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/bdist.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/bdist_dumb.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/bdist_msi.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/bdist_rpm.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/bdist_wininst.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/build.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/build_clib.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/build_ext.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/build_py.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/build_scripts.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/check.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/clean.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/config.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/install.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/install_data.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/install_egg_info.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/install_headers.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/install_lib.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/install_scripts.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/py37compat.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/register.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/sdist.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/upload.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/command/bdist.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/command/bdist_dumb.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/command/bdist_msi.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/command/bdist_rpm.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/command/bdist_wininst.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/command/build.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/command/build_clib.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/command/build_ext.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/command/build_py.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/command/build_scripts.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/command/check.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/command/clean.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/command/config.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/command/install.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/command/install_data.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/command/install_egg_info.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/command/install_headers.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/command/install_lib.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/command/install_scripts.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/command/py37compat.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/command/register.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/command/sdist.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/command/upload.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/config.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/core.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/cygwinccompiler.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/debug.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/dep_util.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/dir_util.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/dist.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/errors.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/extension.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/fancy_getopt.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/file_util.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/filelist.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/log.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/msvc9compiler.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/msvccompiler.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/py35compat.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/py38compat.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/spawn.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/sysconfig.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/text_file.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/unixccompiler.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/util.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/version.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_distutils/versionpredicate.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_imp.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_vendor/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_vendor/__pycache__/ordered_set.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_vendor/__pycache__/pyparsing.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_vendor/more_itertools/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_vendor/more_itertools/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_vendor/more_itertools/__pycache__/more.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_vendor/more_itertools/__pycache__/recipes.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_vendor/more_itertools/more.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_vendor/more_itertools/recipes.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_vendor/ordered_set.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_vendor/packaging/__about__.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_vendor/packaging/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_vendor/packaging/__pycache__/_manylinux.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_vendor/packaging/__pycache__/_musllinux.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_vendor/packaging/__pycache__/markers.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_vendor/packaging/__pycache__/requirements.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_vendor/packaging/__pycache__/tags.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_vendor/packaging/_manylinux.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_vendor/packaging/_musllinux.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_vendor/packaging/_structures.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_vendor/packaging/markers.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_vendor/packaging/requirements.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_vendor/packaging/specifiers.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_vendor/packaging/tags.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_vendor/packaging/utils.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_vendor/packaging/version.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/_vendor/pyparsing.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/archive_util.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/build_meta.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/cli-32.exe create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/cli-64.exe create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/cli-arm64.exe create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/cli.exe create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/command/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/command/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/command/__pycache__/alias.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/command/__pycache__/build_clib.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/command/__pycache__/build_ext.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/command/__pycache__/build_py.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/command/__pycache__/develop.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/command/__pycache__/dist_info.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/command/__pycache__/easy_install.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/command/__pycache__/egg_info.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/command/__pycache__/install.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/command/__pycache__/install_lib.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/command/__pycache__/install_scripts.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/command/__pycache__/py36compat.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/command/__pycache__/register.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/command/__pycache__/rotate.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/command/__pycache__/saveopts.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/command/__pycache__/sdist.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/command/__pycache__/setopt.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/command/__pycache__/test.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/command/__pycache__/upload.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/command/__pycache__/upload_docs.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/command/alias.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/command/bdist_egg.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/command/bdist_rpm.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/command/build_clib.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/command/build_ext.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/command/build_py.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/command/develop.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/command/dist_info.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/command/easy_install.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/command/egg_info.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/command/install.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/command/install_egg_info.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/command/install_lib.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/command/install_scripts.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/command/launcher manifest.xml create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/command/py36compat.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/command/register.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/command/rotate.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/command/saveopts.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/command/sdist.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/command/setopt.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/command/test.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/command/upload.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/command/upload_docs.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/config.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/dep_util.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/depends.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/dist.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/errors.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/extension.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/extern/__init__.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/extern/__pycache__/__init__.cpython-310.pyc create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/glob.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/gui-32.exe create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/gui-64.exe create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/gui-arm64.exe create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/gui.exe create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/installer.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/launch.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/monkey.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/msvc.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/namespaces.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/package_index.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/py34compat.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/sandbox.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/script (dev).tmpl create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/script.tmpl create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/unicode_utils.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/version.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/wheel.py create mode 100644 .venvcd/lib/python3.10/site-packages/setuptools/windows_support.py create mode 120000 .venvcd/lib64 create mode 100644 .venvcd/pyvenv.cfg create mode 100644 Dockerfile create mode 100644 app/__pycache__/main.cpython-310.pyc create mode 100644 app/__pycache__/srt_parser.cpython-310.pyc create mode 100644 app/app/__init__.py create mode 100644 app/app/main.py create mode 100644 app/app/services/__init__.py create mode 100644 app/app/translators/__init__.py create mode 100644 app/cache.py create mode 100644 app/main.py create mode 100644 app/services/__init__.py create mode 100644 app/services/__pycache__/__init__.cpython-310.pyc create mode 100644 app/services/__pycache__/job_store.cpython-310.pyc create mode 100644 app/services/__pycache__/srt_builder.cpython-310.pyc create mode 100644 app/services/__pycache__/srt_parser.cpython-310.pyc create mode 100644 app/services/__pycache__/subtitle_service.cpython-310.pyc create mode 100644 app/services/__pycache__/translator.cpython-310.pyc create mode 100644 app/services/job_store.py create mode 100644 app/services/srt_builder.py create mode 100644 app/services/srt_parser.py create mode 100644 app/services/subtitle_service.py create mode 100644 app/services/translator.py create mode 100644 app/srt_parser.py create mode 100644 app/templates/index.html create mode 100644 app/translators/__init__.py create mode 100644 app/translators/__pycache__/__init__.cpython-310.pyc create mode 100644 app/translators/__pycache__/base.cpython-310.pyc create mode 100644 app/translators/__pycache__/factory.cpython-310.pyc create mode 100644 app/translators/__pycache__/fast_engine.cpython-310.pyc create mode 100644 app/translators/__pycache__/smart_engine.cpython-310.pyc create mode 100644 app/translators/base.py create mode 100644 app/translators/factory.py create mode 100644 app/translators/fast_engine.py create mode 100644 app/translators/smart_engine.py create mode 100644 data/output/b2bab4fb-c0c8-4075-af90-709c656fc3bd.srt create mode 100644 docker-compose.yml create mode 100644 outputs/4387cdc8-ebd9-4915-b526-5d4a7322c225.srt create mode 100644 outputs/71cee33d-7bc1-416c-8422-8af22c180609.srt create mode 100644 outputs/80dff354-44c1-4582-8c40-c4fd028206b9.srt create mode 100644 outputs/81f64999-c81d-4dce-876d-31fb2a4e03af.srt create mode 100644 outputs/b8d32ef9-e430-488f-afb5-faf16ce0793e.srt create mode 100644 outputs/ce4468e6-4e40-4ede-bd56-317cb704e055.srt create mode 100644 outputs/d971229d-7879-4c67-8aaa-532d8ffc0306.srt create mode 100644 outputs/dacd29ee-b044-49bd-b119-4d71e68006c6.srt create mode 100644 outputs/eb0dc107-9104-4c47-983c-adadb7cfa3d4.srt create mode 100644 requirements.txt create mode 100644 test_srt.py diff --git a/.env b/.env new file mode 100644 index 0000000..2cfb031 --- /dev/null +++ b/.env @@ -0,0 +1,2 @@ +OPENAI_API_KEY=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 +OPENAI_MODEL=gpt-4.1-mini diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..60f1c19 --- /dev/null +++ b/.env.example @@ -0,0 +1,2 @@ +OPENAI_API_KEY=put-your-key-here +OPENAI_MODEL=gpt-4.1-mini diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/.venv/bin/Activate.ps1 b/.venv/bin/Activate.ps1 new file mode 100644 index 0000000..b49d77b --- /dev/null +++ b/.venv/bin/Activate.ps1 @@ -0,0 +1,247 @@ +<# +.Synopsis +Activate a Python virtual environment for the current PowerShell session. + +.Description +Pushes the python executable for a virtual environment to the front of the +$Env:PATH environment variable and sets the prompt to signify that you are +in a Python virtual environment. Makes use of the command line switches as +well as the `pyvenv.cfg` file values present in the virtual environment. + +.Parameter VenvDir +Path to the directory that contains the virtual environment to activate. The +default value for this is the parent of the directory that the Activate.ps1 +script is located within. + +.Parameter Prompt +The prompt prefix to display when this virtual environment is activated. By +default, this prompt is the name of the virtual environment folder (VenvDir) +surrounded by parentheses and followed by a single space (ie. '(.venv) '). + +.Example +Activate.ps1 +Activates the Python virtual environment that contains the Activate.ps1 script. + +.Example +Activate.ps1 -Verbose +Activates the Python virtual environment that contains the Activate.ps1 script, +and shows extra information about the activation as it executes. + +.Example +Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv +Activates the Python virtual environment located in the specified location. + +.Example +Activate.ps1 -Prompt "MyPython" +Activates the Python virtual environment that contains the Activate.ps1 script, +and prefixes the current prompt with the specified string (surrounded in +parentheses) while the virtual environment is active. + +.Notes +On Windows, it may be required to enable this Activate.ps1 script by setting the +execution policy for the user. You can do this by issuing the following PowerShell +command: + +PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser + +For more information on Execution Policies: +https://go.microsoft.com/fwlink/?LinkID=135170 + +#> +Param( + [Parameter(Mandatory = $false)] + [String] + $VenvDir, + [Parameter(Mandatory = $false)] + [String] + $Prompt +) + +<# Function declarations --------------------------------------------------- #> + +<# +.Synopsis +Remove all shell session elements added by the Activate script, including the +addition of the virtual environment's Python executable from the beginning of +the PATH variable. + +.Parameter NonDestructive +If present, do not remove this function from the global namespace for the +session. + +#> +function global:deactivate ([switch]$NonDestructive) { + # Revert to original values + + # The prior prompt: + if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) { + Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt + Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT + } + + # The prior PYTHONHOME: + if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) { + Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME + Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME + } + + # The prior PATH: + if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) { + Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH + Remove-Item -Path Env:_OLD_VIRTUAL_PATH + } + + # Just remove the VIRTUAL_ENV altogether: + if (Test-Path -Path Env:VIRTUAL_ENV) { + Remove-Item -Path env:VIRTUAL_ENV + } + + # Just remove VIRTUAL_ENV_PROMPT altogether. + if (Test-Path -Path Env:VIRTUAL_ENV_PROMPT) { + Remove-Item -Path env:VIRTUAL_ENV_PROMPT + } + + # Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether: + if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) { + Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force + } + + # Leave deactivate function in the global namespace if requested: + if (-not $NonDestructive) { + Remove-Item -Path function:deactivate + } +} + +<# +.Description +Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the +given folder, and returns them in a map. + +For each line in the pyvenv.cfg file, if that line can be parsed into exactly +two strings separated by `=` (with any amount of whitespace surrounding the =) +then it is considered a `key = value` line. The left hand string is the key, +the right hand is the value. + +If the value starts with a `'` or a `"` then the first and last character is +stripped from the value before being captured. + +.Parameter ConfigDir +Path to the directory that contains the `pyvenv.cfg` file. +#> +function Get-PyVenvConfig( + [String] + $ConfigDir +) { + Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg" + + # Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue). + $pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue + + # An empty map will be returned if no config file is found. + $pyvenvConfig = @{ } + + if ($pyvenvConfigPath) { + + Write-Verbose "File exists, parse `key = value` lines" + $pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath + + $pyvenvConfigContent | ForEach-Object { + $keyval = $PSItem -split "\s*=\s*", 2 + if ($keyval[0] -and $keyval[1]) { + $val = $keyval[1] + + # Remove extraneous quotations around a string value. + if ("'""".Contains($val.Substring(0, 1))) { + $val = $val.Substring(1, $val.Length - 2) + } + + $pyvenvConfig[$keyval[0]] = $val + Write-Verbose "Adding Key: '$($keyval[0])'='$val'" + } + } + } + return $pyvenvConfig +} + + +<# Begin Activate script --------------------------------------------------- #> + +# Determine the containing directory of this script +$VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition +$VenvExecDir = Get-Item -Path $VenvExecPath + +Write-Verbose "Activation script is located in path: '$VenvExecPath'" +Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)" +Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)" + +# Set values required in priority: CmdLine, ConfigFile, Default +# First, get the location of the virtual environment, it might not be +# VenvExecDir if specified on the command line. +if ($VenvDir) { + Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values" +} +else { + Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir." + $VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/") + Write-Verbose "VenvDir=$VenvDir" +} + +# Next, read the `pyvenv.cfg` file to determine any required value such +# as `prompt`. +$pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir + +# Next, set the prompt from the command line, or the config file, or +# just use the name of the virtual environment folder. +if ($Prompt) { + Write-Verbose "Prompt specified as argument, using '$Prompt'" +} +else { + Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value" + if ($pyvenvCfg -and $pyvenvCfg['prompt']) { + Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'" + $Prompt = $pyvenvCfg['prompt']; + } + else { + Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virtual environment)" + Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'" + $Prompt = Split-Path -Path $venvDir -Leaf + } +} + +Write-Verbose "Prompt = '$Prompt'" +Write-Verbose "VenvDir='$VenvDir'" + +# Deactivate any currently active virtual environment, but leave the +# deactivate function in place. +deactivate -nondestructive + +# Now set the environment variable VIRTUAL_ENV, used by many tools to determine +# that there is an activated venv. +$env:VIRTUAL_ENV = $VenvDir + +if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) { + + Write-Verbose "Setting prompt to '$Prompt'" + + # Set the prompt to include the env name + # Make sure _OLD_VIRTUAL_PROMPT is global + function global:_OLD_VIRTUAL_PROMPT { "" } + Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT + New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt + + function global:prompt { + Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) " + _OLD_VIRTUAL_PROMPT + } + $env:VIRTUAL_ENV_PROMPT = $Prompt +} + +# Clear PYTHONHOME +if (Test-Path -Path Env:PYTHONHOME) { + Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME + Remove-Item -Path Env:PYTHONHOME +} + +# Add the venv to the PATH +Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH +$Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH" diff --git a/.venv/bin/activate b/.venv/bin/activate new file mode 100644 index 0000000..231bd47 --- /dev/null +++ b/.venv/bin/activate @@ -0,0 +1,69 @@ +# This file must be used with "source bin/activate" *from bash* +# you cannot run it directly + +deactivate () { + # reset old environment variables + if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then + PATH="${_OLD_VIRTUAL_PATH:-}" + export PATH + unset _OLD_VIRTUAL_PATH + fi + if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then + PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}" + export PYTHONHOME + unset _OLD_VIRTUAL_PYTHONHOME + fi + + # This should detect bash and zsh, which have a hash command that must + # be called to get it to forget past commands. Without forgetting + # past commands the $PATH changes we made may not be respected + if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then + hash -r 2> /dev/null + fi + + if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then + PS1="${_OLD_VIRTUAL_PS1:-}" + export PS1 + unset _OLD_VIRTUAL_PS1 + fi + + unset VIRTUAL_ENV + unset VIRTUAL_ENV_PROMPT + if [ ! "${1:-}" = "nondestructive" ] ; then + # Self destruct! + unset -f deactivate + fi +} + +# unset irrelevant variables +deactivate nondestructive + +VIRTUAL_ENV=/home/ed/projects/subfox/.venv +export VIRTUAL_ENV + +_OLD_VIRTUAL_PATH="$PATH" +PATH="$VIRTUAL_ENV/"bin":$PATH" +export PATH + +# unset PYTHONHOME if set +# this will fail if PYTHONHOME is set to the empty string (which is bad anyway) +# could use `if (set -u; : $PYTHONHOME) ;` in bash +if [ -n "${PYTHONHOME:-}" ] ; then + _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}" + unset PYTHONHOME +fi + +if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then + _OLD_VIRTUAL_PS1="${PS1:-}" + PS1='(.venv) '"${PS1:-}" + export PS1 + VIRTUAL_ENV_PROMPT='(.venv) ' + export VIRTUAL_ENV_PROMPT +fi + +# This should detect bash and zsh, which have a hash command that must +# be called to get it to forget past commands. Without forgetting +# past commands the $PATH changes we made may not be respected +if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then + hash -r 2> /dev/null +fi diff --git a/.venv/bin/activate.csh b/.venv/bin/activate.csh new file mode 100644 index 0000000..e5af970 --- /dev/null +++ b/.venv/bin/activate.csh @@ -0,0 +1,26 @@ +# This file must be used with "source bin/activate.csh" *from csh*. +# You cannot run it directly. +# Created by Davide Di Blasi . +# Ported to Python 3.3 venv by Andrew Svetlov + +alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; unsetenv VIRTUAL_ENV_PROMPT; test "\!:*" != "nondestructive" && unalias deactivate' + +# Unset irrelevant variables. +deactivate nondestructive + +setenv VIRTUAL_ENV /home/ed/projects/subfox/.venv + +set _OLD_VIRTUAL_PATH="$PATH" +setenv PATH "$VIRTUAL_ENV/"bin":$PATH" + + +set _OLD_VIRTUAL_PROMPT="$prompt" + +if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then + set prompt = '(.venv) '"$prompt" + setenv VIRTUAL_ENV_PROMPT '(.venv) ' +endif + +alias pydoc python -m pydoc + +rehash diff --git a/.venv/bin/activate.fish b/.venv/bin/activate.fish new file mode 100644 index 0000000..7aae682 --- /dev/null +++ b/.venv/bin/activate.fish @@ -0,0 +1,69 @@ +# This file must be used with "source /bin/activate.fish" *from fish* +# (https://fishshell.com/); you cannot run it directly. + +function deactivate -d "Exit virtual environment and return to normal shell environment" + # reset old environment variables + if test -n "$_OLD_VIRTUAL_PATH" + set -gx PATH $_OLD_VIRTUAL_PATH + set -e _OLD_VIRTUAL_PATH + end + if test -n "$_OLD_VIRTUAL_PYTHONHOME" + set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME + set -e _OLD_VIRTUAL_PYTHONHOME + end + + if test -n "$_OLD_FISH_PROMPT_OVERRIDE" + set -e _OLD_FISH_PROMPT_OVERRIDE + # prevents error when using nested fish instances (Issue #93858) + if functions -q _old_fish_prompt + functions -e fish_prompt + functions -c _old_fish_prompt fish_prompt + functions -e _old_fish_prompt + end + end + + set -e VIRTUAL_ENV + set -e VIRTUAL_ENV_PROMPT + if test "$argv[1]" != "nondestructive" + # Self-destruct! + functions -e deactivate + end +end + +# Unset irrelevant variables. +deactivate nondestructive + +set -gx VIRTUAL_ENV /home/ed/projects/subfox/.venv + +set -gx _OLD_VIRTUAL_PATH $PATH +set -gx PATH "$VIRTUAL_ENV/"bin $PATH + +# Unset PYTHONHOME if set. +if set -q PYTHONHOME + set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME + set -e PYTHONHOME +end + +if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" + # fish uses a function instead of an env var to generate the prompt. + + # Save the current fish_prompt function as the function _old_fish_prompt. + functions -c fish_prompt _old_fish_prompt + + # With the original prompt function renamed, we can override with our own. + function fish_prompt + # Save the return status of the last command. + set -l old_status $status + + # Output the venv prompt; color taken from the blue of the Python logo. + printf "%s%s%s" (set_color 4B8BBE) '(.venv) ' (set_color normal) + + # Restore the return status of the previous command. + echo "exit $old_status" | . + # Output the original/"old" prompt. + _old_fish_prompt + end + + set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" + set -gx VIRTUAL_ENV_PROMPT '(.venv) ' +end diff --git a/.venv/bin/deep-translator b/.venv/bin/deep-translator new file mode 100755 index 0000000..4065136 --- /dev/null +++ b/.venv/bin/deep-translator @@ -0,0 +1,6 @@ +#!/home/ed/projects/subfox/.venv/bin/python +import sys +from deep_translator.__main__ import main +if __name__ == '__main__': + sys.argv[0] = sys.argv[0].removesuffix('.exe') + sys.exit(main()) diff --git a/.venv/bin/distro b/.venv/bin/distro new file mode 100755 index 0000000..d23a7d1 --- /dev/null +++ b/.venv/bin/distro @@ -0,0 +1,6 @@ +#!/home/ed/projects/subfox/.venv/bin/python +import sys +from distro.distro import main +if __name__ == '__main__': + sys.argv[0] = sys.argv[0].removesuffix('.exe') + sys.exit(main()) diff --git a/.venv/bin/dt b/.venv/bin/dt new file mode 100755 index 0000000..4065136 --- /dev/null +++ b/.venv/bin/dt @@ -0,0 +1,6 @@ +#!/home/ed/projects/subfox/.venv/bin/python +import sys +from deep_translator.__main__ import main +if __name__ == '__main__': + sys.argv[0] = sys.argv[0].removesuffix('.exe') + sys.exit(main()) diff --git a/.venv/bin/fastapi b/.venv/bin/fastapi new file mode 100755 index 0000000..b1fc66b --- /dev/null +++ b/.venv/bin/fastapi @@ -0,0 +1,6 @@ +#!/home/ed/projects/subfox/.venv/bin/python +import sys +from fastapi.cli import main +if __name__ == '__main__': + sys.argv[0] = sys.argv[0].removesuffix('.exe') + sys.exit(main()) diff --git a/.venv/bin/httpx b/.venv/bin/httpx new file mode 100755 index 0000000..4cf689b --- /dev/null +++ b/.venv/bin/httpx @@ -0,0 +1,6 @@ +#!/home/ed/projects/subfox/.venv/bin/python +import sys +from httpx import main +if __name__ == '__main__': + sys.argv[0] = sys.argv[0].removesuffix('.exe') + sys.exit(main()) diff --git a/.venv/bin/normalizer b/.venv/bin/normalizer new file mode 100755 index 0000000..1ecd013 --- /dev/null +++ b/.venv/bin/normalizer @@ -0,0 +1,6 @@ +#!/home/ed/projects/subfox/.venv/bin/python +import sys +from charset_normalizer.cli import cli_detect +if __name__ == '__main__': + sys.argv[0] = sys.argv[0].removesuffix('.exe') + sys.exit(cli_detect()) diff --git a/.venv/bin/openai b/.venv/bin/openai new file mode 100755 index 0000000..aa49507 --- /dev/null +++ b/.venv/bin/openai @@ -0,0 +1,6 @@ +#!/home/ed/projects/subfox/.venv/bin/python +import sys +from openai.cli import main +if __name__ == '__main__': + sys.argv[0] = sys.argv[0].removesuffix('.exe') + sys.exit(main()) diff --git a/.venv/bin/pip b/.venv/bin/pip new file mode 100755 index 0000000..ace2cc9 --- /dev/null +++ b/.venv/bin/pip @@ -0,0 +1,8 @@ +#!/home/ed/projects/subfox/.venv/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/.venv/bin/pip3 b/.venv/bin/pip3 new file mode 100755 index 0000000..ace2cc9 --- /dev/null +++ b/.venv/bin/pip3 @@ -0,0 +1,8 @@ +#!/home/ed/projects/subfox/.venv/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/.venv/bin/pip3.10 b/.venv/bin/pip3.10 new file mode 100755 index 0000000..ace2cc9 --- /dev/null +++ b/.venv/bin/pip3.10 @@ -0,0 +1,8 @@ +#!/home/ed/projects/subfox/.venv/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/.venv/bin/python b/.venv/bin/python new file mode 120000 index 0000000..b8a0adb --- /dev/null +++ b/.venv/bin/python @@ -0,0 +1 @@ +python3 \ No newline at end of file diff --git a/.venv/bin/python3 b/.venv/bin/python3 new file mode 120000 index 0000000..ae65fda --- /dev/null +++ b/.venv/bin/python3 @@ -0,0 +1 @@ +/usr/bin/python3 \ No newline at end of file diff --git a/.venv/bin/python3.10 b/.venv/bin/python3.10 new file mode 120000 index 0000000..b8a0adb --- /dev/null +++ b/.venv/bin/python3.10 @@ -0,0 +1 @@ +python3 \ No newline at end of file diff --git a/.venv/bin/tqdm b/.venv/bin/tqdm new file mode 100755 index 0000000..a847137 --- /dev/null +++ b/.venv/bin/tqdm @@ -0,0 +1,6 @@ +#!/home/ed/projects/subfox/.venv/bin/python +import sys +from tqdm.cli import main +if __name__ == '__main__': + sys.argv[0] = sys.argv[0].removesuffix('.exe') + sys.exit(main()) diff --git a/.venv/bin/uvicorn b/.venv/bin/uvicorn new file mode 100755 index 0000000..a648be3 --- /dev/null +++ b/.venv/bin/uvicorn @@ -0,0 +1,6 @@ +#!/home/ed/projects/subfox/.venv/bin/python +import sys +from uvicorn.main import main +if __name__ == '__main__': + sys.argv[0] = sys.argv[0].removesuffix('.exe') + sys.exit(main()) diff --git a/.venv/lib/python3.10/site-packages/81d243bd2c585b0f4821__mypyc.cpython-310-x86_64-linux-gnu.so b/.venv/lib/python3.10/site-packages/81d243bd2c585b0f4821__mypyc.cpython-310-x86_64-linux-gnu.so new file mode 100755 index 0000000000000000000000000000000000000000..883c5a243abcca448b84e0f0c1f4745356d09290 GIT binary patch literal 414480 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

6!F>rtku|?r!;<&Vp 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/__pycache__/typing_extensions.cpython-310.pyc b/.venv/lib/python3.10/site-packages/__pycache__/typing_extensions.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b8d724a389a3ab0ff5b7e78521e2d21fa6da199c GIT binary patch literal 115608 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 AdH?_b literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/_distutils_hack/__init__.py b/.venv/lib/python3.10/site-packages/_distutils_hack/__init__.py new file mode 100644 index 0000000..f707416 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/_distutils_hack/__init__.py @@ -0,0 +1,132 @@ +import sys +import os +import re +import importlib +import warnings + + +is_pypy = '__pypy__' in sys.builtin_module_names + + +warnings.filterwarnings('ignore', + r'.+ distutils\b.+ deprecated', + DeprecationWarning) + + +def warn_distutils_present(): + if 'distutils' not in sys.modules: + return + if is_pypy and sys.version_info < (3, 7): + # PyPy for 3.6 unconditionally imports distutils, so bypass the warning + # https://foss.heptapod.net/pypy/pypy/-/blob/be829135bc0d758997b3566062999ee8b23872b4/lib-python/3/site.py#L250 + return + warnings.warn( + "Distutils was imported before Setuptools, but importing Setuptools " + "also replaces the `distutils` module in `sys.modules`. This may lead " + "to undesirable behaviors or errors. To avoid these issues, avoid " + "using distutils directly, ensure that setuptools is installed in the " + "traditional way (e.g. not an editable install), and/or make sure " + "that setuptools is always imported before distutils.") + + +def clear_distutils(): + if 'distutils' not in sys.modules: + return + warnings.warn("Setuptools is replacing distutils.") + mods = [name for name in sys.modules if re.match(r'distutils\b', name)] + for name in mods: + del sys.modules[name] + + +def enabled(): + """ + Allow selection of distutils by environment variable. + """ + which = os.environ.get('SETUPTOOLS_USE_DISTUTILS', 'stdlib') + return which == 'local' + + +def ensure_local_distutils(): + clear_distutils() + + # With the DistutilsMetaFinder in place, + # perform an import to cause distutils to be + # loaded from setuptools._distutils. Ref #2906. + add_shim() + importlib.import_module('distutils') + remove_shim() + + # check that submodules load as expected + core = importlib.import_module('distutils.core') + assert '_distutils' in core.__file__, core.__file__ + + +def do_override(): + """ + Ensure that the local copy of distutils is preferred over stdlib. + + See https://github.com/pypa/setuptools/issues/417#issuecomment-392298401 + for more motivation. + """ + if enabled(): + warn_distutils_present() + ensure_local_distutils() + + +class DistutilsMetaFinder: + def find_spec(self, fullname, path, target=None): + if path is not None: + return + + method_name = 'spec_for_{fullname}'.format(**locals()) + method = getattr(self, method_name, lambda: None) + return method() + + def spec_for_distutils(self): + import importlib.abc + import importlib.util + + class DistutilsLoader(importlib.abc.Loader): + + def create_module(self, spec): + return importlib.import_module('setuptools._distutils') + + def exec_module(self, module): + pass + + return importlib.util.spec_from_loader('distutils', DistutilsLoader()) + + def spec_for_pip(self): + """ + Ensure stdlib distutils when running under pip. + See pypa/pip#8761 for rationale. + """ + if self.pip_imported_during_build(): + return + clear_distutils() + self.spec_for_distutils = lambda: None + + @staticmethod + def pip_imported_during_build(): + """ + Detect if pip is being imported in a build script. Ref #2355. + """ + import traceback + return any( + frame.f_globals['__file__'].endswith('setup.py') + for frame, line in traceback.walk_stack(None) + ) + + +DISTUTILS_FINDER = DistutilsMetaFinder() + + +def add_shim(): + sys.meta_path.insert(0, DISTUTILS_FINDER) + + +def remove_shim(): + try: + sys.meta_path.remove(DISTUTILS_FINDER) + except ValueError: + pass diff --git a/.venv/lib/python3.10/site-packages/_distutils_hack/__pycache__/__init__.cpython-310.pyc b/.venv/lib/python3.10/site-packages/_distutils_hack/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a127e793438c0aada02d1e5d735b1d54cb6605cf GIT binary patch literal 5106 zcmbtYU31&U72O3u2&5!RkrR*8CLJ`+xM35Mw&NsDt0?YRPMX$XI+mPF)TA)TU5b!E zf?j}9#8NY9rI{u#nf4z@GkwWZXZjQRGw|BJghKDY1lii{gTK8rP=;Ut^VLz5yy$PaV(e?e+FNFSUcsZlvVkht-!|5yVM9 z3Bvf32K8i5$)=x3(WH;24-=g`IO8fB!4tN{cet7nY>g#`T14Lz#x_%n`iXT^5auz5 zICx*N>S-}wsA7CWbA2;|#y{YUt&SnMyMF8jonE8>z-`DDK)P!(>GzT-3gcJYMn4(7 z54xLEZ(Ki&BUi~@=r?8TCT;0H%-4J9b|TRar5kkJhw)xq&ARc!s=M9}Vz=Y(xuNuh zn?!EED`Xrfzk%Tm+4gsWNX2fXT&Wc9@I~bMJ5hkaZ5d= z_g-;jH||50r0pkeoC}1{0V+=XFoe8-N5B*1iy#T2t{*}ld+tlJx>O#mkwdn3^rsiQq-TddHT082PZdV5Jb>b_dN zeytVF##^LdQ>JP$cX_I=^`yHhj6E6)ak9fNbAs|&#}SfCMd2ZN~|u2 zQ4?OXf}8R9ilxXWl|#)eHFIdNm<3kE>H}X$r-j{i&}^R;9HVFnQ6c;!NZE3@`Vnr8z5SXh&wlkRMt>C_N8CTQuuwnJ;Eh%+uPMEO?z%Kuoc@T_|yzm&{9CT{*1^ z^db4k;y=I*sY1<;RY3}%bfr_4G5EW--QB6MNwHC{>^7s`-bn($`w$db2-1k75JMJ4t%+&uX>JAZhm-&{_w57(;xz`s$lEZoGNx z=C$j3G9)D=6a@25lmt6Iu`wfBy<%zt=m4bUpHiUq8||R8BJv2L3WU53HN@m@_6*d< zt;gyo=$v2>`Z{>s#x=fyMlz}?P*0SEA4nvCj(uMy{yPEEoT@j8x8s8X6V)-=A#dVlh>E4pl})@8e2WPy(7gRC|BCNhi7{kD z)G$E64$S?+uy8>9EYt@V;+|}J(31E2RzD0WM(v-Gh=@R8@ZSW1R`{CNPit$UGG{sT zI}PEl+^0_{qFHQEJ4d8y3zB&RU^>2K-|Fe%<2Ilnil%lJ0Mi+`xt}BoDbPZEX{F8> zc53zfq@CJ{uP`Q^?MNgq;gLkCopq)#YvUGk0Ph23Ol6~k?6hPo!Y>BTe<$QKxq@^< z!6Uwf29c44?91%Rzhv*SKd}~~B@EyQ^9#0RY?&|w#~syP)(|1)m?9{$6>0m7320_I zVi(PrRC-R#dgy>wIvavk1)u<1inRsP&5@;%1y@2r*LtVoK)`FeC=IY1jWOmRdm~SeH0(KPQeoG6`Y9&5+ zKSwlig6j8>pn78FGxCf%ttcm`pN>(D;o4cuJ0Xtbu7?$w2ha}TI~U$ zp-}3e=D1`mI)f`Y-tRQ`3AZB~5?k)jY%ZE1czMha1;NZLRb?@6$UGD)V5>FQ(rJN; zlu^3Ma?ezKvfGwjSM|G8IqNNka(h89%Nq0@DwLH&r5LAr#T`S-kMZTQpDf6-4qH{U8*&>QL`s zYWOKR=oAKRw7J}9n1ck#%vG=u8q0j({x3WyWGA`vbmgK$m1D^EVWcc>!Egpu^;F3p zkf92L4{}4T$^>2J_7UkmM8We25CP3pG<4wTsD~X-9W{5c z);$293E;o zj|W%37Zx2*D~?*G`QM_3c5>=P+w2f4v< zoU&0Wb471X5DopwMuoIL-l!zzu`&9+VPq+Gw0}yASl;)t+5!7?sgiUt-*kBIyjNen zd;eTmE~X#i)Cp^eE9##CLox0S4I-$6Vg?6bIAD&Nv~*6o+V`3 zKc-KU4<$i&oNy=u#i~fJ%GhfpQsw^>mR3iKDL3TfILW_9%yx}ySFTS+6= xD$+2{!<{RmYsO{tJ?P2VejI literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/_distutils_hack/__pycache__/override.cpython-310.pyc b/.venv/lib/python3.10/site-packages/_distutils_hack/__pycache__/override.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fb65ffce9a9799c7fc9eb6ffca9d3b73bd121d45 GIT binary patch literal 231 zcmd1j<>g`k0*NPwGIfCTV-N=!FabFZKwK;UBvKht7@8RuFfL?ZWJqBQX3%81#UG!N zSzJ +License-Expression: MIT +License-File: LICENSE +Classifier: Intended Audience :: Information Technology +Classifier: Intended Audience :: System Administrators +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python +Classifier: Topic :: Internet +Classifier: Topic :: Software Development :: Libraries :: Application Frameworks +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Software Development :: Libraries +Classifier: Topic :: Software Development +Classifier: Typing :: Typed +Classifier: Development Status :: 4 - Beta +Classifier: Intended Audience :: Developers +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Classifier: Programming Language :: Python :: 3.14 +Project-URL: Homepage, https://github.com/fastapi/annotated-doc +Project-URL: Documentation, https://github.com/fastapi/annotated-doc +Project-URL: Repository, https://github.com/fastapi/annotated-doc +Project-URL: Issues, https://github.com/fastapi/annotated-doc/issues +Project-URL: Changelog, https://github.com/fastapi/annotated-doc/release-notes.md +Requires-Python: >=3.8 +Description-Content-Type: text/markdown + +# Annotated Doc + +Document parameters, class attributes, return types, and variables inline, with `Annotated`. + + + Test + + + Coverage + + + Package version + + + Supported Python versions + + +## Installation + +```bash +pip install annotated-doc +``` + +Or with `uv`: + +```Python +uv add annotated-doc +``` + +## Usage + +Import `Doc` and pass a single literal string with the documentation for the specific parameter, class attribute, return type, or variable. + +For example, to document a parameter `name` in a function `hi` you could do: + +```Python +from typing import Annotated + +from annotated_doc import Doc + +def hi(name: Annotated[str, Doc("Who to say hi to")]) -> None: + print(f"Hi, {name}!") +``` + +You can also use it to document class attributes: + +```Python +from typing import Annotated + +from annotated_doc import Doc + +class User: + name: Annotated[str, Doc("The user's name")] + age: Annotated[int, Doc("The user's age")] +``` + +The same way, you could document return types and variables, or anything that could have a type annotation with `Annotated`. + +## Who Uses This + +`annotated-doc` was made for: + +* [FastAPI](https://fastapi.tiangolo.com/) +* [Typer](https://typer.tiangolo.com/) +* [SQLModel](https://sqlmodel.tiangolo.com/) +* [Asyncer](https://asyncer.tiangolo.com/) + +`annotated-doc` is supported by [griffe-typingdoc](https://github.com/mkdocstrings/griffe-typingdoc), which powers reference documentation like the one in the [FastAPI Reference](https://fastapi.tiangolo.com/reference/). + +## Reasons not to use `annotated-doc` + +You are already comfortable with one of the existing docstring formats, like: + +* Sphinx +* numpydoc +* Google +* Keras + +Your team is already comfortable using them. + +You prefer having the documentation about parameters all together in a docstring, separated from the code defining them. + +You care about a specific set of users, using one specific editor, and that editor already has support for the specific docstring format you use. + +## Reasons to use `annotated-doc` + +* No micro-syntax to learn for newcomers, it’s **just Python** syntax. +* **Editing** would be already fully supported by default by any editor (current or future) supporting Python syntax, including syntax errors, syntax highlighting, etc. +* **Rendering** would be relatively straightforward to implement by static tools (tools that don't need runtime execution), as the information can be extracted from the AST they normally already create. +* **Deduplication of information**: the name of a parameter would be defined in a single place, not duplicated inside of a docstring. +* **Elimination** of the possibility of having **inconsistencies** when removing a parameter or class variable and **forgetting to remove** its documentation. +* **Minimization** of the probability of adding a new parameter or class variable and **forgetting to add its documentation**. +* **Elimination** of the possibility of having **inconsistencies** between the **name** of a parameter in the **signature** and the name in the docstring when it is renamed. +* **Access** to the documentation string for each symbol at **runtime**, including existing (older) Python versions. +* A more formalized way to document other symbols, like type aliases, that could use Annotated. +* **Support** for apps using FastAPI, Typer and others. +* **AI Accessibility**: AI tools will have an easier way understanding each parameter as the distance from documentation to parameter is much closer. + +## History + +I ([@tiangolo](https://github.com/tiangolo)) originally wanted for this to be part of the Python standard library (in [PEP 727](https://peps.python.org/pep-0727/)), but the proposal was withdrawn as there was a fair amount of negative feedback and opposition. + +The conclusion was that this was better done as an external effort, in a third-party library. + +So, here it is, with a simpler approach, as a third-party library, in a way that can be used by others, starting with FastAPI and friends. + +## License + +This project is licensed under the terms of the MIT license. diff --git a/.venv/lib/python3.10/site-packages/annotated_doc-0.0.4.dist-info/RECORD b/.venv/lib/python3.10/site-packages/annotated_doc-0.0.4.dist-info/RECORD new file mode 100644 index 0000000..314d720 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/annotated_doc-0.0.4.dist-info/RECORD @@ -0,0 +1,11 @@ +annotated_doc-0.0.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +annotated_doc-0.0.4.dist-info/METADATA,sha256=Irm5KJua33dY2qKKAjJ-OhKaVBVIfwFGej_dSe3Z1TU,6566 +annotated_doc-0.0.4.dist-info/RECORD,, +annotated_doc-0.0.4.dist-info/WHEEL,sha256=9P2ygRxDrTJz3gsagc0Z96ukrxjr-LFBGOgv3AuKlCA,90 +annotated_doc-0.0.4.dist-info/entry_points.txt,sha256=6OYgBcLyFCUgeqLgnvMyOJxPCWzgy7se4rLPKtNonMs,34 +annotated_doc-0.0.4.dist-info/licenses/LICENSE,sha256=__Fwd5pqy_ZavbQFwIfxzuF4ZpHkqWpANFF-SlBKDN8,1086 +annotated_doc/__init__.py,sha256=VuyxxUe80kfEyWnOrCx_Bk8hybo3aKo6RYBlkBBYW8k,52 +annotated_doc/__pycache__/__init__.cpython-310.pyc,, +annotated_doc/__pycache__/main.cpython-310.pyc,, +annotated_doc/main.py,sha256=5Zfvxv80SwwLqpRW73AZyZyiM4bWma9QWRbp_cgD20s,1075 +annotated_doc/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/.venv/lib/python3.10/site-packages/annotated_doc-0.0.4.dist-info/WHEEL b/.venv/lib/python3.10/site-packages/annotated_doc-0.0.4.dist-info/WHEEL new file mode 100644 index 0000000..045c8ac --- /dev/null +++ b/.venv/lib/python3.10/site-packages/annotated_doc-0.0.4.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: pdm-backend (2.4.5) +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/.venv/lib/python3.10/site-packages/annotated_doc-0.0.4.dist-info/entry_points.txt b/.venv/lib/python3.10/site-packages/annotated_doc-0.0.4.dist-info/entry_points.txt new file mode 100644 index 0000000..c3ad472 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/annotated_doc-0.0.4.dist-info/entry_points.txt @@ -0,0 +1,4 @@ +[console_scripts] + +[gui_scripts] + diff --git a/.venv/lib/python3.10/site-packages/annotated_doc-0.0.4.dist-info/licenses/LICENSE b/.venv/lib/python3.10/site-packages/annotated_doc-0.0.4.dist-info/licenses/LICENSE new file mode 100644 index 0000000..7a25446 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/annotated_doc-0.0.4.dist-info/licenses/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2025 Sebastián Ramírez + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/.venv/lib/python3.10/site-packages/annotated_doc/__init__.py b/.venv/lib/python3.10/site-packages/annotated_doc/__init__.py new file mode 100644 index 0000000..a0152a7 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/annotated_doc/__init__.py @@ -0,0 +1,3 @@ +from .main import Doc as Doc + +__version__ = "0.0.4" diff --git a/.venv/lib/python3.10/site-packages/annotated_doc/__pycache__/__init__.cpython-310.pyc b/.venv/lib/python3.10/site-packages/annotated_doc/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2501f8163f28c3a6c2133557cf99751e2a303d43 GIT binary patch literal 236 zcmYk0F>b;@5Jh)wBcTL3F5!Y5Cs0OFiqtfShGw*QCt(wN$MP-~a3ik4G2A8%S4fq0 zs(fkQ=>O4|hNsgz5%u_ewad7_2J>G@G%s=dEW!vQD^bg>l)@z2#H4GHXEzy7x$M(d zF3+Pv6>7Q4(>|-Ub?wma?-4s{y=8}Z5$z~ufB4zJo@)X!(6szPW$@q+yEi_9>d19a z*&Q^euxGbW4+VG|Xx`}ZQ@@i3?HmUk$e`g85UsNTQ8lN2{8Y0!RP;Q2=Cg>27$?8S Cy*!No literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/annotated_doc/__pycache__/main.cpython-310.pyc b/.venv/lib/python3.10/site-packages/annotated_doc/__pycache__/main.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b8adb3b95ab8306748dc82c585367e3908e89fc4 GIT binary patch literal 1618 zcmZux-EQMV6t-hGNwY~nMOq<{&}^?7sZC(_Znav0C<1PxMMXjiLX(MS(oE}kyffpl zDdlSSEf5dT*WfXH3va;PUhy3}$u_`9w$Go>`ObG{#`Jof0PFEzf9NN15d2BX{S`s^ z9FIG~>+3)UGJJ#Qbz>69#zioQ64>_^vebXPfS`g&D1%8uhLcD(R4gMI&trKYn{VRD zfs9lzC2FNrZ0%!MU32OfkPuOq!%v zs>}g(*@A z0Kl3Xr>THQ&rFuCnL}-WO*Qh1lyHhPH9y0S1{3Hebyd1lUn{1h_QnD->g^M8sWK#} zoXCL&nf5y%+Ofne^HdRWj{dC6-iNvYQX|g63sHnhE1^?ri})h`cWklg9)jtn+E=dx zReD;JFr7|ctifVd^)R<)NzRdXq2&2>AX_z0^5S^?RTSv zS*nqequiP+m3TLD#cXa~jfN|gtwyPyjq-}RC&SM^9bwm~vs@(C;!?TM9z~<2(Ah9w zmu=2)rLw{t;#LuA479gwZE%cJN{FZf_9Ag09C`+;YDESJ|VIe!YwMYY!{aQ zDM$gFe?m?oecNPhE)NVgs;%Y(XSJx}uGf#CplaxGx4D+b-3A2FZFm)3L#|Q8Wk=&0 z!7C{Prc)1uT!SvLN4t;n zvcvh($RZ`V%lXSfq#I9*(@B6i!Y;RmRH}zp8DR_C_eg4*8Ev65p5eZ*A5a8svU@KY sRn-Qy;)vFE5Qj$(`%yo77*(F}AgsRk{;HDHQ+`&1dtUudbRGr&00xzvumAu6 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/annotated_doc/main.py b/.venv/lib/python3.10/site-packages/annotated_doc/main.py new file mode 100644 index 0000000..7063c59 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/annotated_doc/main.py @@ -0,0 +1,36 @@ +class Doc: + """Define the documentation of a type annotation using `Annotated`, to be + used in class attributes, function and method parameters, return values, + and variables. + + The value should be a positional-only string literal to allow static tools + like editors and documentation generators to use it. + + This complements docstrings. + + The string value passed is available in the attribute `documentation`. + + Example: + + ```Python + from typing import Annotated + from annotated_doc import Doc + + def hi(name: Annotated[str, Doc("Who to say hi to")]) -> None: + print(f"Hi, {name}!") + ``` + """ + + def __init__(self, documentation: str, /) -> None: + self.documentation = documentation + + def __repr__(self) -> str: + return f"Doc({self.documentation!r})" + + def __hash__(self) -> int: + return hash(self.documentation) + + def __eq__(self, other: object) -> bool: + if not isinstance(other, Doc): + return NotImplemented + return self.documentation == other.documentation diff --git a/.venv/lib/python3.10/site-packages/annotated_doc/py.typed b/.venv/lib/python3.10/site-packages/annotated_doc/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/.venv/lib/python3.10/site-packages/annotated_types-0.7.0.dist-info/INSTALLER b/.venv/lib/python3.10/site-packages/annotated_types-0.7.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/.venv/lib/python3.10/site-packages/annotated_types-0.7.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/.venv/lib/python3.10/site-packages/annotated_types-0.7.0.dist-info/METADATA b/.venv/lib/python3.10/site-packages/annotated_types-0.7.0.dist-info/METADATA new file mode 100644 index 0000000..3ac05cf --- /dev/null +++ b/.venv/lib/python3.10/site-packages/annotated_types-0.7.0.dist-info/METADATA @@ -0,0 +1,295 @@ +Metadata-Version: 2.3 +Name: annotated-types +Version: 0.7.0 +Summary: Reusable constraint types to use with typing.Annotated +Project-URL: Homepage, https://github.com/annotated-types/annotated-types +Project-URL: Source, https://github.com/annotated-types/annotated-types +Project-URL: Changelog, https://github.com/annotated-types/annotated-types/releases +Author-email: Adrian Garcia Badaracco <1755071+adriangb@users.noreply.github.com>, Samuel Colvin , Zac Hatfield-Dodds +License-File: LICENSE +Classifier: Development Status :: 4 - Beta +Classifier: Environment :: Console +Classifier: Environment :: MacOS X +Classifier: Intended Audience :: Developers +Classifier: Intended Audience :: Information Technology +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: POSIX :: Linux +Classifier: Operating System :: Unix +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Typing :: Typed +Requires-Python: >=3.8 +Requires-Dist: typing-extensions>=4.0.0; python_version < '3.9' +Description-Content-Type: text/markdown + +# annotated-types + +[![CI](https://github.com/annotated-types/annotated-types/workflows/CI/badge.svg?event=push)](https://github.com/annotated-types/annotated-types/actions?query=event%3Apush+branch%3Amain+workflow%3ACI) +[![pypi](https://img.shields.io/pypi/v/annotated-types.svg)](https://pypi.python.org/pypi/annotated-types) +[![versions](https://img.shields.io/pypi/pyversions/annotated-types.svg)](https://github.com/annotated-types/annotated-types) +[![license](https://img.shields.io/github/license/annotated-types/annotated-types.svg)](https://github.com/annotated-types/annotated-types/blob/main/LICENSE) + +[PEP-593](https://peps.python.org/pep-0593/) added `typing.Annotated` as a way of +adding context-specific metadata to existing types, and specifies that +`Annotated[T, x]` _should_ be treated as `T` by any tool or library without special +logic for `x`. + +This package provides metadata objects which can be used to represent common +constraints such as upper and lower bounds on scalar values and collection sizes, +a `Predicate` marker for runtime checks, and +descriptions of how we intend these metadata to be interpreted. In some cases, +we also note alternative representations which do not require this package. + +## Install + +```bash +pip install annotated-types +``` + +## Examples + +```python +from typing import Annotated +from annotated_types import Gt, Len, Predicate + +class MyClass: + age: Annotated[int, Gt(18)] # Valid: 19, 20, ... + # Invalid: 17, 18, "19", 19.0, ... + factors: list[Annotated[int, Predicate(is_prime)]] # Valid: 2, 3, 5, 7, 11, ... + # Invalid: 4, 8, -2, 5.0, "prime", ... + + my_list: Annotated[list[int], Len(0, 10)] # Valid: [], [10, 20, 30, 40, 50] + # Invalid: (1, 2), ["abc"], [0] * 20 +``` + +## Documentation + +_While `annotated-types` avoids runtime checks for performance, users should not +construct invalid combinations such as `MultipleOf("non-numeric")` or `Annotated[int, Len(3)]`. +Downstream implementors may choose to raise an error, emit a warning, silently ignore +a metadata item, etc., if the metadata objects described below are used with an +incompatible type - or for any other reason!_ + +### Gt, Ge, Lt, Le + +Express inclusive and/or exclusive bounds on orderable values - which may be numbers, +dates, times, strings, sets, etc. Note that the boundary value need not be of the +same type that was annotated, so long as they can be compared: `Annotated[int, Gt(1.5)]` +is fine, for example, and implies that the value is an integer x such that `x > 1.5`. + +We suggest that implementors may also interpret `functools.partial(operator.le, 1.5)` +as being equivalent to `Gt(1.5)`, for users who wish to avoid a runtime dependency on +the `annotated-types` package. + +To be explicit, these types have the following meanings: + +* `Gt(x)` - value must be "Greater Than" `x` - equivalent to exclusive minimum +* `Ge(x)` - value must be "Greater than or Equal" to `x` - equivalent to inclusive minimum +* `Lt(x)` - value must be "Less Than" `x` - equivalent to exclusive maximum +* `Le(x)` - value must be "Less than or Equal" to `x` - equivalent to inclusive maximum + +### Interval + +`Interval(gt, ge, lt, le)` allows you to specify an upper and lower bound with a single +metadata object. `None` attributes should be ignored, and non-`None` attributes +treated as per the single bounds above. + +### MultipleOf + +`MultipleOf(multiple_of=x)` might be interpreted in two ways: + +1. Python semantics, implying `value % multiple_of == 0`, or +2. [JSONschema semantics](https://json-schema.org/draft/2020-12/json-schema-validation.html#rfc.section.6.2.1), + where `int(value / multiple_of) == value / multiple_of`. + +We encourage users to be aware of these two common interpretations and their +distinct behaviours, especially since very large or non-integer numbers make +it easy to cause silent data corruption due to floating-point imprecision. + +We encourage libraries to carefully document which interpretation they implement. + +### MinLen, MaxLen, Len + +`Len()` implies that `min_length <= len(value) <= max_length` - lower and upper bounds are inclusive. + +As well as `Len()` which can optionally include upper and lower bounds, we also +provide `MinLen(x)` and `MaxLen(y)` which are equivalent to `Len(min_length=x)` +and `Len(max_length=y)` respectively. + +`Len`, `MinLen`, and `MaxLen` may be used with any type which supports `len(value)`. + +Examples of usage: + +* `Annotated[list, MaxLen(10)]` (or `Annotated[list, Len(max_length=10))`) - list must have a length of 10 or less +* `Annotated[str, MaxLen(10)]` - string must have a length of 10 or less +* `Annotated[list, MinLen(3))` (or `Annotated[list, Len(min_length=3))`) - list must have a length of 3 or more +* `Annotated[list, Len(4, 6)]` - list must have a length of 4, 5, or 6 +* `Annotated[list, Len(8, 8)]` - list must have a length of exactly 8 + +#### Changed in v0.4.0 + +* `min_inclusive` has been renamed to `min_length`, no change in meaning +* `max_exclusive` has been renamed to `max_length`, upper bound is now **inclusive** instead of **exclusive** +* The recommendation that slices are interpreted as `Len` has been removed due to ambiguity and different semantic + meaning of the upper bound in slices vs. `Len` + +See [issue #23](https://github.com/annotated-types/annotated-types/issues/23) for discussion. + +### Timezone + +`Timezone` can be used with a `datetime` or a `time` to express which timezones +are allowed. `Annotated[datetime, Timezone(None)]` must be a naive datetime. +`Timezone[...]` ([literal ellipsis](https://docs.python.org/3/library/constants.html#Ellipsis)) +expresses that any timezone-aware datetime is allowed. You may also pass a specific +timezone string or [`tzinfo`](https://docs.python.org/3/library/datetime.html#tzinfo-objects) +object such as `Timezone(timezone.utc)` or `Timezone("Africa/Abidjan")` to express that you only +allow a specific timezone, though we note that this is often a symptom of fragile design. + +#### Changed in v0.x.x + +* `Timezone` accepts [`tzinfo`](https://docs.python.org/3/library/datetime.html#tzinfo-objects) objects instead of + `timezone`, extending compatibility to [`zoneinfo`](https://docs.python.org/3/library/zoneinfo.html) and third party libraries. + +### Unit + +`Unit(unit: str)` expresses that the annotated numeric value is the magnitude of +a quantity with the specified unit. For example, `Annotated[float, Unit("m/s")]` +would be a float representing a velocity in meters per second. + +Please note that `annotated_types` itself makes no attempt to parse or validate +the unit string in any way. That is left entirely to downstream libraries, +such as [`pint`](https://pint.readthedocs.io) or +[`astropy.units`](https://docs.astropy.org/en/stable/units/). + +An example of how a library might use this metadata: + +```python +from annotated_types import Unit +from typing import Annotated, TypeVar, Callable, Any, get_origin, get_args + +# given a type annotated with a unit: +Meters = Annotated[float, Unit("m")] + + +# you can cast the annotation to a specific unit type with any +# callable that accepts a string and returns the desired type +T = TypeVar("T") +def cast_unit(tp: Any, unit_cls: Callable[[str], T]) -> T | None: + if get_origin(tp) is Annotated: + for arg in get_args(tp): + if isinstance(arg, Unit): + return unit_cls(arg.unit) + return None + + +# using `pint` +import pint +pint_unit = cast_unit(Meters, pint.Unit) + + +# using `astropy.units` +import astropy.units as u +astropy_unit = cast_unit(Meters, u.Unit) +``` + +### Predicate + +`Predicate(func: Callable)` expresses that `func(value)` is truthy for valid values. +Users should prefer the statically inspectable metadata above, but if you need +the full power and flexibility of arbitrary runtime predicates... here it is. + +For some common constraints, we provide generic types: + +* `IsLower = Annotated[T, Predicate(str.islower)]` +* `IsUpper = Annotated[T, Predicate(str.isupper)]` +* `IsDigit = Annotated[T, Predicate(str.isdigit)]` +* `IsFinite = Annotated[T, Predicate(math.isfinite)]` +* `IsNotFinite = Annotated[T, Predicate(Not(math.isfinite))]` +* `IsNan = Annotated[T, Predicate(math.isnan)]` +* `IsNotNan = Annotated[T, Predicate(Not(math.isnan))]` +* `IsInfinite = Annotated[T, Predicate(math.isinf)]` +* `IsNotInfinite = Annotated[T, Predicate(Not(math.isinf))]` + +so that you can write e.g. `x: IsFinite[float] = 2.0` instead of the longer +(but exactly equivalent) `x: Annotated[float, Predicate(math.isfinite)] = 2.0`. + +Some libraries might have special logic to handle known or understandable predicates, +for example by checking for `str.isdigit` and using its presence to both call custom +logic to enforce digit-only strings, and customise some generated external schema. +Users are therefore encouraged to avoid indirection like `lambda s: s.lower()`, in +favor of introspectable methods such as `str.lower` or `re.compile("pattern").search`. + +To enable basic negation of commonly used predicates like `math.isnan` without introducing introspection that makes it impossible for implementers to introspect the predicate we provide a `Not` wrapper that simply negates the predicate in an introspectable manner. Several of the predicates listed above are created in this manner. + +We do not specify what behaviour should be expected for predicates that raise +an exception. For example `Annotated[int, Predicate(str.isdigit)]` might silently +skip invalid constraints, or statically raise an error; or it might try calling it +and then propagate or discard the resulting +`TypeError: descriptor 'isdigit' for 'str' objects doesn't apply to a 'int' object` +exception. We encourage libraries to document the behaviour they choose. + +### Doc + +`doc()` can be used to add documentation information in `Annotated`, for function and method parameters, variables, class attributes, return types, and any place where `Annotated` can be used. + +It expects a value that can be statically analyzed, as the main use case is for static analysis, editors, documentation generators, and similar tools. + +It returns a `DocInfo` class with a single attribute `documentation` containing the value passed to `doc()`. + +This is the early adopter's alternative form of the [`typing-doc` proposal](https://github.com/tiangolo/fastapi/blob/typing-doc/typing_doc.md). + +### Integrating downstream types with `GroupedMetadata` + +Implementers may choose to provide a convenience wrapper that groups multiple pieces of metadata. +This can help reduce verbosity and cognitive overhead for users. +For example, an implementer like Pydantic might provide a `Field` or `Meta` type that accepts keyword arguments and transforms these into low-level metadata: + +```python +from dataclasses import dataclass +from typing import Iterator +from annotated_types import GroupedMetadata, Ge + +@dataclass +class Field(GroupedMetadata): + ge: int | None = None + description: str | None = None + + def __iter__(self) -> Iterator[object]: + # Iterating over a GroupedMetadata object should yield annotated-types + # constraint metadata objects which describe it as fully as possible, + # and may include other unknown objects too. + if self.ge is not None: + yield Ge(self.ge) + if self.description is not None: + yield Description(self.description) +``` + +Libraries consuming annotated-types constraints should check for `GroupedMetadata` and unpack it by iterating over the object and treating the results as if they had been "unpacked" in the `Annotated` type. The same logic should be applied to the [PEP 646 `Unpack` type](https://peps.python.org/pep-0646/), so that `Annotated[T, Field(...)]`, `Annotated[T, Unpack[Field(...)]]` and `Annotated[T, *Field(...)]` are all treated consistently. + +Libraries consuming annotated-types should also ignore any metadata they do not recongize that came from unpacking a `GroupedMetadata`, just like they ignore unrecognized metadata in `Annotated` itself. + +Our own `annotated_types.Interval` class is a `GroupedMetadata` which unpacks itself into `Gt`, `Lt`, etc., so this is not an abstract concern. Similarly, `annotated_types.Len` is a `GroupedMetadata` which unpacks itself into `MinLen` (optionally) and `MaxLen`. + +### Consuming metadata + +We intend to not be prescriptive as to _how_ the metadata and constraints are used, but as an example of how one might parse constraints from types annotations see our [implementation in `test_main.py`](https://github.com/annotated-types/annotated-types/blob/f59cf6d1b5255a0fe359b93896759a180bec30ae/tests/test_main.py#L94-L103). + +It is up to the implementer to determine how this metadata is used. +You could use the metadata for runtime type checking, for generating schemas or to generate example data, amongst other use cases. + +## Design & History + +This package was designed at the PyCon 2022 sprints by the maintainers of Pydantic +and Hypothesis, with the goal of making it as easy as possible for end-users to +provide more informative annotations for use by runtime libraries. + +It is deliberately minimal, and following PEP-593 allows considerable downstream +discretion in what (if anything!) they choose to support. Nonetheless, we expect +that staying simple and covering _only_ the most common use-cases will give users +and maintainers the best experience we can. If you'd like more constraints for your +types - follow our lead, by defining them and documenting them downstream! diff --git a/.venv/lib/python3.10/site-packages/annotated_types-0.7.0.dist-info/RECORD b/.venv/lib/python3.10/site-packages/annotated_types-0.7.0.dist-info/RECORD new file mode 100644 index 0000000..7c37220 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/annotated_types-0.7.0.dist-info/RECORD @@ -0,0 +1,10 @@ +annotated_types-0.7.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +annotated_types-0.7.0.dist-info/METADATA,sha256=7ltqxksJJ0wCYFGBNIQCWTlWQGeAH0hRFdnK3CB895E,15046 +annotated_types-0.7.0.dist-info/RECORD,, +annotated_types-0.7.0.dist-info/WHEEL,sha256=zEMcRr9Kr03x1ozGwg5v9NQBKn3kndp6LSoSlVg-jhU,87 +annotated_types-0.7.0.dist-info/licenses/LICENSE,sha256=_hBJiEsaDZNCkB6I4H8ykl0ksxIdmXK2poBfuYJLCV0,1083 +annotated_types/__init__.py,sha256=RynLsRKUEGI0KimXydlD1fZEfEzWwDo0Uon3zOKhG1Q,13819 +annotated_types/__pycache__/__init__.cpython-310.pyc,, +annotated_types/__pycache__/test_cases.cpython-310.pyc,, +annotated_types/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +annotated_types/test_cases.py,sha256=zHFX6EpcMbGJ8FzBYDbO56bPwx_DYIVSKbZM-4B3_lg,6421 diff --git a/.venv/lib/python3.10/site-packages/annotated_types-0.7.0.dist-info/WHEEL b/.venv/lib/python3.10/site-packages/annotated_types-0.7.0.dist-info/WHEEL new file mode 100644 index 0000000..516596c --- /dev/null +++ b/.venv/lib/python3.10/site-packages/annotated_types-0.7.0.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: hatchling 1.24.2 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/.venv/lib/python3.10/site-packages/annotated_types-0.7.0.dist-info/licenses/LICENSE b/.venv/lib/python3.10/site-packages/annotated_types-0.7.0.dist-info/licenses/LICENSE new file mode 100644 index 0000000..d99323a --- /dev/null +++ b/.venv/lib/python3.10/site-packages/annotated_types-0.7.0.dist-info/licenses/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2022 the contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/.venv/lib/python3.10/site-packages/annotated_types/__init__.py b/.venv/lib/python3.10/site-packages/annotated_types/__init__.py new file mode 100644 index 0000000..74e0dee --- /dev/null +++ b/.venv/lib/python3.10/site-packages/annotated_types/__init__.py @@ -0,0 +1,432 @@ +import math +import sys +import types +from dataclasses import dataclass +from datetime import tzinfo +from typing import TYPE_CHECKING, Any, Callable, Iterator, Optional, SupportsFloat, SupportsIndex, TypeVar, Union + +if sys.version_info < (3, 8): + from typing_extensions import Protocol, runtime_checkable +else: + from typing import Protocol, runtime_checkable + +if sys.version_info < (3, 9): + from typing_extensions import Annotated, Literal +else: + from typing import Annotated, Literal + +if sys.version_info < (3, 10): + EllipsisType = type(Ellipsis) + KW_ONLY = {} + SLOTS = {} +else: + from types import EllipsisType + + KW_ONLY = {"kw_only": True} + SLOTS = {"slots": True} + + +__all__ = ( + 'BaseMetadata', + 'GroupedMetadata', + 'Gt', + 'Ge', + 'Lt', + 'Le', + 'Interval', + 'MultipleOf', + 'MinLen', + 'MaxLen', + 'Len', + 'Timezone', + 'Predicate', + 'LowerCase', + 'UpperCase', + 'IsDigits', + 'IsFinite', + 'IsNotFinite', + 'IsNan', + 'IsNotNan', + 'IsInfinite', + 'IsNotInfinite', + 'doc', + 'DocInfo', + '__version__', +) + +__version__ = '0.7.0' + + +T = TypeVar('T') + + +# arguments that start with __ are considered +# positional only +# see https://peps.python.org/pep-0484/#positional-only-arguments + + +class SupportsGt(Protocol): + def __gt__(self: T, __other: T) -> bool: + ... + + +class SupportsGe(Protocol): + def __ge__(self: T, __other: T) -> bool: + ... + + +class SupportsLt(Protocol): + def __lt__(self: T, __other: T) -> bool: + ... + + +class SupportsLe(Protocol): + def __le__(self: T, __other: T) -> bool: + ... + + +class SupportsMod(Protocol): + def __mod__(self: T, __other: T) -> T: + ... + + +class SupportsDiv(Protocol): + def __div__(self: T, __other: T) -> T: + ... + + +class BaseMetadata: + """Base class for all metadata. + + This exists mainly so that implementers + can do `isinstance(..., BaseMetadata)` while traversing field annotations. + """ + + __slots__ = () + + +@dataclass(frozen=True, **SLOTS) +class Gt(BaseMetadata): + """Gt(gt=x) implies that the value must be greater than x. + + It can be used with any type that supports the ``>`` operator, + including numbers, dates and times, strings, sets, and so on. + """ + + gt: SupportsGt + + +@dataclass(frozen=True, **SLOTS) +class Ge(BaseMetadata): + """Ge(ge=x) implies that the value must be greater than or equal to x. + + It can be used with any type that supports the ``>=`` operator, + including numbers, dates and times, strings, sets, and so on. + """ + + ge: SupportsGe + + +@dataclass(frozen=True, **SLOTS) +class Lt(BaseMetadata): + """Lt(lt=x) implies that the value must be less than x. + + It can be used with any type that supports the ``<`` operator, + including numbers, dates and times, strings, sets, and so on. + """ + + lt: SupportsLt + + +@dataclass(frozen=True, **SLOTS) +class Le(BaseMetadata): + """Le(le=x) implies that the value must be less than or equal to x. + + It can be used with any type that supports the ``<=`` operator, + including numbers, dates and times, strings, sets, and so on. + """ + + le: SupportsLe + + +@runtime_checkable +class GroupedMetadata(Protocol): + """A grouping of multiple objects, like typing.Unpack. + + `GroupedMetadata` on its own is not metadata and has no meaning. + All of the constraints and metadata should be fully expressable + in terms of the `BaseMetadata`'s returned by `GroupedMetadata.__iter__()`. + + Concrete implementations should override `GroupedMetadata.__iter__()` + to add their own metadata. + For example: + + >>> @dataclass + >>> class Field(GroupedMetadata): + >>> gt: float | None = None + >>> description: str | None = None + ... + >>> def __iter__(self) -> Iterable[object]: + >>> if self.gt is not None: + >>> yield Gt(self.gt) + >>> if self.description is not None: + >>> yield Description(self.gt) + + Also see the implementation of `Interval` below for an example. + + Parsers should recognize this and unpack it so that it can be used + both with and without unpacking: + + - `Annotated[int, Field(...)]` (parser must unpack Field) + - `Annotated[int, *Field(...)]` (PEP-646) + """ # noqa: trailing-whitespace + + @property + def __is_annotated_types_grouped_metadata__(self) -> Literal[True]: + return True + + def __iter__(self) -> Iterator[object]: + ... + + if not TYPE_CHECKING: + __slots__ = () # allow subclasses to use slots + + def __init_subclass__(cls, *args: Any, **kwargs: Any) -> None: + # Basic ABC like functionality without the complexity of an ABC + super().__init_subclass__(*args, **kwargs) + if cls.__iter__ is GroupedMetadata.__iter__: + raise TypeError("Can't subclass GroupedMetadata without implementing __iter__") + + def __iter__(self) -> Iterator[object]: # noqa: F811 + raise NotImplementedError # more helpful than "None has no attribute..." type errors + + +@dataclass(frozen=True, **KW_ONLY, **SLOTS) +class Interval(GroupedMetadata): + """Interval can express inclusive or exclusive bounds with a single object. + + It accepts keyword arguments ``gt``, ``ge``, ``lt``, and/or ``le``, which + are interpreted the same way as the single-bound constraints. + """ + + gt: Union[SupportsGt, None] = None + ge: Union[SupportsGe, None] = None + lt: Union[SupportsLt, None] = None + le: Union[SupportsLe, None] = None + + def __iter__(self) -> Iterator[BaseMetadata]: + """Unpack an Interval into zero or more single-bounds.""" + if self.gt is not None: + yield Gt(self.gt) + if self.ge is not None: + yield Ge(self.ge) + if self.lt is not None: + yield Lt(self.lt) + if self.le is not None: + yield Le(self.le) + + +@dataclass(frozen=True, **SLOTS) +class MultipleOf(BaseMetadata): + """MultipleOf(multiple_of=x) might be interpreted in two ways: + + 1. Python semantics, implying ``value % multiple_of == 0``, or + 2. JSONschema semantics, where ``int(value / multiple_of) == value / multiple_of`` + + We encourage users to be aware of these two common interpretations, + and libraries to carefully document which they implement. + """ + + multiple_of: Union[SupportsDiv, SupportsMod] + + +@dataclass(frozen=True, **SLOTS) +class MinLen(BaseMetadata): + """ + MinLen() implies minimum inclusive length, + e.g. ``len(value) >= min_length``. + """ + + min_length: Annotated[int, Ge(0)] + + +@dataclass(frozen=True, **SLOTS) +class MaxLen(BaseMetadata): + """ + MaxLen() implies maximum inclusive length, + e.g. ``len(value) <= max_length``. + """ + + max_length: Annotated[int, Ge(0)] + + +@dataclass(frozen=True, **SLOTS) +class Len(GroupedMetadata): + """ + Len() implies that ``min_length <= len(value) <= max_length``. + + Upper bound may be omitted or ``None`` to indicate no upper length bound. + """ + + min_length: Annotated[int, Ge(0)] = 0 + max_length: Optional[Annotated[int, Ge(0)]] = None + + def __iter__(self) -> Iterator[BaseMetadata]: + """Unpack a Len into zone or more single-bounds.""" + if self.min_length > 0: + yield MinLen(self.min_length) + if self.max_length is not None: + yield MaxLen(self.max_length) + + +@dataclass(frozen=True, **SLOTS) +class Timezone(BaseMetadata): + """Timezone(tz=...) requires a datetime to be aware (or ``tz=None``, naive). + + ``Annotated[datetime, Timezone(None)]`` must be a naive datetime. + ``Timezone[...]`` (the ellipsis literal) expresses that the datetime must be + tz-aware but any timezone is allowed. + + You may also pass a specific timezone string or tzinfo object such as + ``Timezone(timezone.utc)`` or ``Timezone("Africa/Abidjan")`` to express that + you only allow a specific timezone, though we note that this is often + a symptom of poor design. + """ + + tz: Union[str, tzinfo, EllipsisType, None] + + +@dataclass(frozen=True, **SLOTS) +class Unit(BaseMetadata): + """Indicates that the value is a physical quantity with the specified unit. + + It is intended for usage with numeric types, where the value represents the + magnitude of the quantity. For example, ``distance: Annotated[float, Unit('m')]`` + or ``speed: Annotated[float, Unit('m/s')]``. + + Interpretation of the unit string is left to the discretion of the consumer. + It is suggested to follow conventions established by python libraries that work + with physical quantities, such as + + - ``pint`` : + - ``astropy.units``: + + For indicating a quantity with a certain dimensionality but without a specific unit + it is recommended to use square brackets, e.g. `Annotated[float, Unit('[time]')]`. + Note, however, ``annotated_types`` itself makes no use of the unit string. + """ + + unit: str + + +@dataclass(frozen=True, **SLOTS) +class Predicate(BaseMetadata): + """``Predicate(func: Callable)`` implies `func(value)` is truthy for valid values. + + Users should prefer statically inspectable metadata, but if you need the full + power and flexibility of arbitrary runtime predicates... here it is. + + We provide a few predefined predicates for common string constraints: + ``IsLower = Predicate(str.islower)``, ``IsUpper = Predicate(str.isupper)``, and + ``IsDigits = Predicate(str.isdigit)``. Users are encouraged to use methods which + can be given special handling, and avoid indirection like ``lambda s: s.lower()``. + + Some libraries might have special logic to handle certain predicates, e.g. by + checking for `str.isdigit` and using its presence to both call custom logic to + enforce digit-only strings, and customise some generated external schema. + + We do not specify what behaviour should be expected for predicates that raise + an exception. For example `Annotated[int, Predicate(str.isdigit)]` might silently + skip invalid constraints, or statically raise an error; or it might try calling it + and then propagate or discard the resulting exception. + """ + + func: Callable[[Any], bool] + + def __repr__(self) -> str: + if getattr(self.func, "__name__", "") == "": + return f"{self.__class__.__name__}({self.func!r})" + if isinstance(self.func, (types.MethodType, types.BuiltinMethodType)) and ( + namespace := getattr(self.func.__self__, "__name__", None) + ): + return f"{self.__class__.__name__}({namespace}.{self.func.__name__})" + if isinstance(self.func, type(str.isascii)): # method descriptor + return f"{self.__class__.__name__}({self.func.__qualname__})" + return f"{self.__class__.__name__}({self.func.__name__})" + + +@dataclass +class Not: + func: Callable[[Any], bool] + + def __call__(self, __v: Any) -> bool: + return not self.func(__v) + + +_StrType = TypeVar("_StrType", bound=str) + +LowerCase = Annotated[_StrType, Predicate(str.islower)] +""" +Return True if the string is a lowercase string, False otherwise. + +A string is lowercase if all cased characters in the string are lowercase and there is at least one cased character in the string. +""" # noqa: E501 +UpperCase = Annotated[_StrType, Predicate(str.isupper)] +""" +Return True if the string is an uppercase string, False otherwise. + +A string is uppercase if all cased characters in the string are uppercase and there is at least one cased character in the string. +""" # noqa: E501 +IsDigit = Annotated[_StrType, Predicate(str.isdigit)] +IsDigits = IsDigit # type: ignore # plural for backwards compatibility, see #63 +""" +Return True if the string is a digit string, False otherwise. + +A string is a digit string if all characters in the string are digits and there is at least one character in the string. +""" # noqa: E501 +IsAscii = Annotated[_StrType, Predicate(str.isascii)] +""" +Return True if all characters in the string are ASCII, False otherwise. + +ASCII characters have code points in the range U+0000-U+007F. Empty string is ASCII too. +""" + +_NumericType = TypeVar('_NumericType', bound=Union[SupportsFloat, SupportsIndex]) +IsFinite = Annotated[_NumericType, Predicate(math.isfinite)] +"""Return True if x is neither an infinity nor a NaN, and False otherwise.""" +IsNotFinite = Annotated[_NumericType, Predicate(Not(math.isfinite))] +"""Return True if x is one of infinity or NaN, and False otherwise""" +IsNan = Annotated[_NumericType, Predicate(math.isnan)] +"""Return True if x is a NaN (not a number), and False otherwise.""" +IsNotNan = Annotated[_NumericType, Predicate(Not(math.isnan))] +"""Return True if x is anything but NaN (not a number), and False otherwise.""" +IsInfinite = Annotated[_NumericType, Predicate(math.isinf)] +"""Return True if x is a positive or negative infinity, and False otherwise.""" +IsNotInfinite = Annotated[_NumericType, Predicate(Not(math.isinf))] +"""Return True if x is neither a positive or negative infinity, and False otherwise.""" + +try: + from typing_extensions import DocInfo, doc # type: ignore [attr-defined] +except ImportError: + + @dataclass(frozen=True, **SLOTS) + class DocInfo: # type: ignore [no-redef] + """ " + The return value of doc(), mainly to be used by tools that want to extract the + Annotated documentation at runtime. + """ + + documentation: str + """The documentation string passed to doc().""" + + def doc( + documentation: str, + ) -> DocInfo: + """ + Add documentation to a type annotation inside of Annotated. + + For example: + + >>> def hi(name: Annotated[int, doc("The name of the user")]) -> None: ... + """ + return DocInfo(documentation) diff --git a/.venv/lib/python3.10/site-packages/annotated_types/__pycache__/__init__.cpython-310.pyc b/.venv/lib/python3.10/site-packages/annotated_types/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e8e57d2a9b81620b0f1ce73600a88dac921690dd GIT binary patch literal 14597 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/annotated_types/__pycache__/test_cases.cpython-310.pyc b/.venv/lib/python3.10/site-packages/annotated_types/__pycache__/test_cases.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5e81810d228e0a7019d249a82b7fd4cb4c5eb0ff GIT binary patch literal 5637 zcmb7IU2Gf25x%`UQpX?tSe9iuQ4}Ut95Hr8%Z}arDEhG+yKXHdspB*uQqUClNFB}N zse4DqW>Yi;{Zzmxinc&o1W4jM`6cfK3KYn5|6aQ*vL)^Nqamya*7{y7RvNQJN0j;X@ zG|yZ&i~BjdpyjhWz^rZLO=E^0i15hkU%R`%`o zk#r8vYA&$-AXh<6uIh>0rE<69QgChC_Akw=W-=YsJ6=;}u9O=NFOiNfhn;4uxRD={ zR;kp)7)vFYE|px5w;IG}OQr9&%8f`eR4Q?=QYwid3_^~UN`3P_YRLVg8EUyi#a5n}zLb!IsxNKEH6Z;5&i+gT z!oZLUG~y8b{Ps05j!s7L`jpgZ&19CDWn)a$%cQV_mT2w@0z0v=SIhPRb!znp=4$xOYme&mLyq_r1a!g#|Ya*HSvV zGCa$NsrC+ALj$(LGT92b&{nS%YVU2!;v=1COo7EmI}CKJ!+=FeK=)87hJpN$>iJ=u z?~TdG4=LXD!vxG5UmygH#Aq?prhJAb@CL;{#yI_d? z6Yni*H4vegEy9rLVK8{yM}#5M!;s{Om>yxs+yz6FANPx)p5=`1zj3#$1VSa9;sjqBDl{`gG>I(L(CtH$`$gjO|B zCf?$ynqH01@UDK({(b5b?(tr>;HZmoXHt}fXb)S^~j zt=F{>Oa%|{MgIH^)?o@oJhmZayeEEhRBJW!3{o7byYL{l8!{whZQZT?yp zCD*WVe0^hwcJ_H=CxOpSlE^=>8_gSH2E3qs(aslmZiB(|*X6u<`?z{OUcOyb&nL^b zfAvdxc9w7d{&)2Ja~b*v(LB-u6SnyEZ=FA3ceta>>S!Qnm*)JD>S+75^Dsy|u`s`I z?07q=J`2)7L9(OyL&sW$?!z0SJ5(*`~4n8pzHs6*L?f*p-obtaxr#%gc;_@jT% zz44c>kN&kBbs$cVoXL#aY6K2W4kfP&ePxxLBF0E=C^OU`P1Zwm6NE4oWN~W*&p1dJ7$rhx(aO_sxGtzA&1@|giDmW{U$1zl$+*Z2wqp6I)(O`0e2r zTEg453+KHi_nHWgNrxNBTw+^Ir<)VCFww_W;1m6X+cuw?KjuoKyjhXSs^@K%1$w2y zO13J^Q=SLm>ZvuHBwsl5V%`k>K>iZz)W}%fTV+V zPNY`KIk%W(SNmr(F%5yV78_-Elb4q|D1AoOvRZq;IwH<5HoQu?;V*#++W@|@)=$+a z!Bi^IJgR+o_HXTp4?kPJH&7hB6wu2iKY*iU4N2(8NE4I&xP46!S;a1%cQDUK;SS>Q(Az15rekP%99HNznf! z>apmb5Af2B5Mm;5X(H3>(R%)3RT_REWOChUp0}IQ01+8dOsy^G`c9h{3G-6~|GY0x18C z11(#cZaLVJMzahUSoLJ)oWJ1(kuZS*1Za&q;?n2*bIod~Ijm}XMFTfHa&%xCU}e1o zh_Rrk$`iLphd%wb{tp zOmc=zo6~FsziEAjE#W(Z?w)suTd?UH>pu$xrvhiN%FaPbvR47%@97-KQ$PYi1@ys=xN1zN32 WmS!OiSvJSg`UuPFmOf@orvC@C{tcM` literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/annotated_types/py.typed b/.venv/lib/python3.10/site-packages/annotated_types/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/.venv/lib/python3.10/site-packages/annotated_types/test_cases.py b/.venv/lib/python3.10/site-packages/annotated_types/test_cases.py new file mode 100644 index 0000000..d9164d6 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/annotated_types/test_cases.py @@ -0,0 +1,151 @@ +import math +import sys +from datetime import date, datetime, timedelta, timezone +from decimal import Decimal +from typing import Any, Dict, Iterable, Iterator, List, NamedTuple, Set, Tuple + +if sys.version_info < (3, 9): + from typing_extensions import Annotated +else: + from typing import Annotated + +import annotated_types as at + + +class Case(NamedTuple): + """ + A test case for `annotated_types`. + """ + + annotation: Any + valid_cases: Iterable[Any] + invalid_cases: Iterable[Any] + + +def cases() -> Iterable[Case]: + # Gt, Ge, Lt, Le + yield Case(Annotated[int, at.Gt(4)], (5, 6, 1000), (4, 0, -1)) + yield Case(Annotated[float, at.Gt(0.5)], (0.6, 0.7, 0.8, 0.9), (0.5, 0.0, -0.1)) + yield Case( + Annotated[datetime, at.Gt(datetime(2000, 1, 1))], + [datetime(2000, 1, 2), datetime(2000, 1, 3)], + [datetime(2000, 1, 1), datetime(1999, 12, 31)], + ) + yield Case( + Annotated[datetime, at.Gt(date(2000, 1, 1))], + [date(2000, 1, 2), date(2000, 1, 3)], + [date(2000, 1, 1), date(1999, 12, 31)], + ) + yield Case( + Annotated[datetime, at.Gt(Decimal('1.123'))], + [Decimal('1.1231'), Decimal('123')], + [Decimal('1.123'), Decimal('0')], + ) + + yield Case(Annotated[int, at.Ge(4)], (4, 5, 6, 1000, 4), (0, -1)) + yield Case(Annotated[float, at.Ge(0.5)], (0.5, 0.6, 0.7, 0.8, 0.9), (0.4, 0.0, -0.1)) + yield Case( + Annotated[datetime, at.Ge(datetime(2000, 1, 1))], + [datetime(2000, 1, 2), datetime(2000, 1, 3)], + [datetime(1998, 1, 1), datetime(1999, 12, 31)], + ) + + yield Case(Annotated[int, at.Lt(4)], (0, -1), (4, 5, 6, 1000, 4)) + yield Case(Annotated[float, at.Lt(0.5)], (0.4, 0.0, -0.1), (0.5, 0.6, 0.7, 0.8, 0.9)) + yield Case( + Annotated[datetime, at.Lt(datetime(2000, 1, 1))], + [datetime(1999, 12, 31), datetime(1999, 12, 31)], + [datetime(2000, 1, 2), datetime(2000, 1, 3)], + ) + + yield Case(Annotated[int, at.Le(4)], (4, 0, -1), (5, 6, 1000)) + yield Case(Annotated[float, at.Le(0.5)], (0.5, 0.0, -0.1), (0.6, 0.7, 0.8, 0.9)) + yield Case( + Annotated[datetime, at.Le(datetime(2000, 1, 1))], + [datetime(2000, 1, 1), datetime(1999, 12, 31)], + [datetime(2000, 1, 2), datetime(2000, 1, 3)], + ) + + # Interval + yield Case(Annotated[int, at.Interval(gt=4)], (5, 6, 1000), (4, 0, -1)) + yield Case(Annotated[int, at.Interval(gt=4, lt=10)], (5, 6), (4, 10, 1000, 0, -1)) + yield Case(Annotated[float, at.Interval(ge=0.5, le=1)], (0.5, 0.9, 1), (0.49, 1.1)) + yield Case( + Annotated[datetime, at.Interval(gt=datetime(2000, 1, 1), le=datetime(2000, 1, 3))], + [datetime(2000, 1, 2), datetime(2000, 1, 3)], + [datetime(2000, 1, 1), datetime(2000, 1, 4)], + ) + + yield Case(Annotated[int, at.MultipleOf(multiple_of=3)], (0, 3, 9), (1, 2, 4)) + yield Case(Annotated[float, at.MultipleOf(multiple_of=0.5)], (0, 0.5, 1, 1.5), (0.4, 1.1)) + + # lengths + + yield Case(Annotated[str, at.MinLen(3)], ('123', '1234', 'x' * 10), ('', '1', '12')) + yield Case(Annotated[str, at.Len(3)], ('123', '1234', 'x' * 10), ('', '1', '12')) + yield Case(Annotated[List[int], at.MinLen(3)], ([1, 2, 3], [1, 2, 3, 4], [1] * 10), ([], [1], [1, 2])) + yield Case(Annotated[List[int], at.Len(3)], ([1, 2, 3], [1, 2, 3, 4], [1] * 10), ([], [1], [1, 2])) + + yield Case(Annotated[str, at.MaxLen(4)], ('', '1234'), ('12345', 'x' * 10)) + yield Case(Annotated[str, at.Len(0, 4)], ('', '1234'), ('12345', 'x' * 10)) + yield Case(Annotated[List[str], at.MaxLen(4)], ([], ['a', 'bcdef'], ['a', 'b', 'c']), (['a'] * 5, ['b'] * 10)) + yield Case(Annotated[List[str], at.Len(0, 4)], ([], ['a', 'bcdef'], ['a', 'b', 'c']), (['a'] * 5, ['b'] * 10)) + + yield Case(Annotated[str, at.Len(3, 5)], ('123', '12345'), ('', '1', '12', '123456', 'x' * 10)) + yield Case(Annotated[str, at.Len(3, 3)], ('123',), ('12', '1234')) + + yield Case(Annotated[Dict[int, int], at.Len(2, 3)], [{1: 1, 2: 2}], [{}, {1: 1}, {1: 1, 2: 2, 3: 3, 4: 4}]) + yield Case(Annotated[Set[int], at.Len(2, 3)], ({1, 2}, {1, 2, 3}), (set(), {1}, {1, 2, 3, 4})) + yield Case(Annotated[Tuple[int, ...], at.Len(2, 3)], ((1, 2), (1, 2, 3)), ((), (1,), (1, 2, 3, 4))) + + # Timezone + + yield Case( + Annotated[datetime, at.Timezone(None)], [datetime(2000, 1, 1)], [datetime(2000, 1, 1, tzinfo=timezone.utc)] + ) + yield Case( + Annotated[datetime, at.Timezone(...)], [datetime(2000, 1, 1, tzinfo=timezone.utc)], [datetime(2000, 1, 1)] + ) + yield Case( + Annotated[datetime, at.Timezone(timezone.utc)], + [datetime(2000, 1, 1, tzinfo=timezone.utc)], + [datetime(2000, 1, 1), datetime(2000, 1, 1, tzinfo=timezone(timedelta(hours=6)))], + ) + yield Case( + Annotated[datetime, at.Timezone('Europe/London')], + [datetime(2000, 1, 1, tzinfo=timezone(timedelta(0), name='Europe/London'))], + [datetime(2000, 1, 1), datetime(2000, 1, 1, tzinfo=timezone(timedelta(hours=6)))], + ) + + # Quantity + + yield Case(Annotated[float, at.Unit(unit='m')], (5, 4.2), ('5m', '4.2m')) + + # predicate types + + yield Case(at.LowerCase[str], ['abc', 'foobar'], ['', 'A', 'Boom']) + yield Case(at.UpperCase[str], ['ABC', 'DEFO'], ['', 'a', 'abc', 'AbC']) + yield Case(at.IsDigit[str], ['123'], ['', 'ab', 'a1b2']) + yield Case(at.IsAscii[str], ['123', 'foo bar'], ['£100', '😊', 'whatever 👀']) + + yield Case(Annotated[int, at.Predicate(lambda x: x % 2 == 0)], [0, 2, 4], [1, 3, 5]) + + yield Case(at.IsFinite[float], [1.23], [math.nan, math.inf, -math.inf]) + yield Case(at.IsNotFinite[float], [math.nan, math.inf], [1.23]) + yield Case(at.IsNan[float], [math.nan], [1.23, math.inf]) + yield Case(at.IsNotNan[float], [1.23, math.inf], [math.nan]) + yield Case(at.IsInfinite[float], [math.inf], [math.nan, 1.23]) + yield Case(at.IsNotInfinite[float], [math.nan, 1.23], [math.inf]) + + # check stacked predicates + yield Case(at.IsInfinite[Annotated[float, at.Predicate(lambda x: x > 0)]], [math.inf], [-math.inf, 1.23, math.nan]) + + # doc + yield Case(Annotated[int, at.doc("A number")], [1, 2], []) + + # custom GroupedMetadata + class MyCustomGroupedMetadata(at.GroupedMetadata): + def __iter__(self) -> Iterator[at.Predicate]: + yield at.Predicate(lambda x: float(x).is_integer()) + + yield Case(Annotated[float, MyCustomGroupedMetadata()], [0, 2.0], [0.01, 1.5]) diff --git a/.venv/lib/python3.10/site-packages/anyio-4.13.0.dist-info/INSTALLER b/.venv/lib/python3.10/site-packages/anyio-4.13.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/.venv/lib/python3.10/site-packages/anyio-4.13.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/.venv/lib/python3.10/site-packages/anyio-4.13.0.dist-info/METADATA b/.venv/lib/python3.10/site-packages/anyio-4.13.0.dist-info/METADATA new file mode 100644 index 0000000..2de1cd5 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/anyio-4.13.0.dist-info/METADATA @@ -0,0 +1,105 @@ +Metadata-Version: 2.4 +Name: anyio +Version: 4.13.0 +Summary: High-level concurrency and networking framework on top of asyncio or Trio +Author-email: Alex Grönholm +License-Expression: MIT +Project-URL: Documentation, https://anyio.readthedocs.io/en/latest/ +Project-URL: Changelog, https://anyio.readthedocs.io/en/stable/versionhistory.html +Project-URL: Source code, https://github.com/agronholm/anyio +Project-URL: Issue tracker, https://github.com/agronholm/anyio/issues +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Framework :: AnyIO +Classifier: Typing :: Typed +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Classifier: Programming Language :: Python :: 3.14 +Requires-Python: >=3.10 +Description-Content-Type: text/x-rst +License-File: LICENSE +Requires-Dist: exceptiongroup>=1.0.2; python_version < "3.11" +Requires-Dist: idna>=2.8 +Requires-Dist: typing_extensions>=4.5; python_version < "3.13" +Provides-Extra: trio +Requires-Dist: trio>=0.32.0; extra == "trio" +Dynamic: license-file + +.. image:: https://github.com/agronholm/anyio/actions/workflows/test.yml/badge.svg + :target: https://github.com/agronholm/anyio/actions/workflows/test.yml + :alt: Build Status +.. image:: https://coveralls.io/repos/github/agronholm/anyio/badge.svg?branch=master + :target: https://coveralls.io/github/agronholm/anyio?branch=master + :alt: Code Coverage +.. image:: https://readthedocs.org/projects/anyio/badge/?version=latest + :target: https://anyio.readthedocs.io/en/latest/?badge=latest + :alt: Documentation +.. image:: https://badges.gitter.im/gitterHQ/gitter.svg + :target: https://gitter.im/python-trio/AnyIO + :alt: Gitter chat +.. image:: https://tidelift.com/badges/package/pypi/anyio + :target: https://tidelift.com/subscription/pkg/pypi-anyio + :alt: Tidelift + +AnyIO is an asynchronous networking and concurrency library that works on top of either asyncio_ or +Trio_. It implements Trio-like `structured concurrency`_ (SC) on top of asyncio and works in harmony +with the native SC of Trio itself. + +Applications and libraries written against AnyIO's API will run unmodified on either asyncio_ or +Trio_. AnyIO can also be adopted into a library or application incrementally – bit by bit, no full +refactoring necessary. It will blend in with the native libraries of your chosen backend. + +To find out why you might want to use AnyIO's APIs instead of asyncio's, you can read about it +`here `_. + +Documentation +------------- + +View full documentation at: https://anyio.readthedocs.io/ + +Features +-------- + +AnyIO offers the following functionality: + +* Task groups (nurseries_ in trio terminology) +* High-level networking (TCP, UDP and UNIX sockets) + + * `Happy eyeballs`_ algorithm for TCP connections (more robust than that of asyncio on Python + 3.8) + * async/await style UDP sockets (unlike asyncio where you still have to use Transports and + Protocols) + +* A versatile API for byte streams and object streams +* Inter-task synchronization and communication (locks, conditions, events, semaphores, object + streams) +* Worker threads +* Subprocesses +* Subinterpreter support for code parallelization (on Python 3.13 and later) +* Asynchronous file I/O (using worker threads) +* Signal handling +* Asynchronous version of the functools_ module + +AnyIO also comes with its own pytest_ plugin which also supports asynchronous fixtures. +It even works with the popular Hypothesis_ library. + +.. _asyncio: https://docs.python.org/3/library/asyncio.html +.. _Trio: https://github.com/python-trio/trio +.. _structured concurrency: https://en.wikipedia.org/wiki/Structured_concurrency +.. _nurseries: https://trio.readthedocs.io/en/stable/reference-core.html#nurseries-and-spawning +.. _Happy eyeballs: https://en.wikipedia.org/wiki/Happy_Eyeballs +.. _pytest: https://docs.pytest.org/en/latest/ +.. _functools: https://docs.python.org/3/library/functools.html +.. _Hypothesis: https://hypothesis.works/ + +Security contact information +---------------------------- + +To report a security vulnerability, please use the `Tidelift security contact`_. +Tidelift will coordinate the fix and disclosure. + +.. _Tidelift security contact: https://tidelift.com/security diff --git a/.venv/lib/python3.10/site-packages/anyio-4.13.0.dist-info/RECORD b/.venv/lib/python3.10/site-packages/anyio-4.13.0.dist-info/RECORD new file mode 100644 index 0000000..d4b6f84 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/anyio-4.13.0.dist-info/RECORD @@ -0,0 +1,92 @@ +anyio-4.13.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +anyio-4.13.0.dist-info/METADATA,sha256=F0EYfiPlmTRwmJN2JktNxJg1GNnl0wHhzOWmz7pFvjM,4513 +anyio-4.13.0.dist-info/RECORD,, +anyio-4.13.0.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91 +anyio-4.13.0.dist-info/entry_points.txt,sha256=_d6Yu6uiaZmNe0CydowirE9Cmg7zUL2g08tQpoS3Qvc,39 +anyio-4.13.0.dist-info/licenses/LICENSE,sha256=U2GsncWPLvX9LpsJxoKXwX8ElQkJu8gCO9uC6s8iwrA,1081 +anyio-4.13.0.dist-info/top_level.txt,sha256=QglSMiWX8_5dpoVAEIHdEYzvqFMdSYWmCj6tYw2ITkQ,6 +anyio/__init__.py,sha256=7iDVqMUprUuKNY91FuoKqayAhR-OY136YDPI6P78HHk,6170 +anyio/__pycache__/__init__.cpython-310.pyc,, +anyio/__pycache__/from_thread.cpython-310.pyc,, +anyio/__pycache__/functools.cpython-310.pyc,, +anyio/__pycache__/lowlevel.cpython-310.pyc,, +anyio/__pycache__/pytest_plugin.cpython-310.pyc,, +anyio/__pycache__/to_interpreter.cpython-310.pyc,, +anyio/__pycache__/to_process.cpython-310.pyc,, +anyio/__pycache__/to_thread.cpython-310.pyc,, +anyio/_backends/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +anyio/_backends/__pycache__/__init__.cpython-310.pyc,, +anyio/_backends/__pycache__/_asyncio.cpython-310.pyc,, +anyio/_backends/__pycache__/_trio.cpython-310.pyc,, +anyio/_backends/_asyncio.py,sha256=kuqlg2sBUsFdgY80xSDAw60Gx_4WNCl9iSL5XlY6lCU,99476 +anyio/_backends/_trio.py,sha256=l9U-TsKRxzmTQxSMvOhn0bNeFn_iRx3Ho30jvR5Bdu0,41366 +anyio/_core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +anyio/_core/__pycache__/__init__.cpython-310.pyc,, +anyio/_core/__pycache__/_asyncio_selector_thread.cpython-310.pyc,, +anyio/_core/__pycache__/_contextmanagers.cpython-310.pyc,, +anyio/_core/__pycache__/_eventloop.cpython-310.pyc,, +anyio/_core/__pycache__/_exceptions.cpython-310.pyc,, +anyio/_core/__pycache__/_fileio.cpython-310.pyc,, +anyio/_core/__pycache__/_resources.cpython-310.pyc,, +anyio/_core/__pycache__/_signals.cpython-310.pyc,, +anyio/_core/__pycache__/_sockets.cpython-310.pyc,, +anyio/_core/__pycache__/_streams.cpython-310.pyc,, +anyio/_core/__pycache__/_subprocesses.cpython-310.pyc,, +anyio/_core/__pycache__/_synchronization.cpython-310.pyc,, +anyio/_core/__pycache__/_tasks.cpython-310.pyc,, +anyio/_core/__pycache__/_tempfile.cpython-310.pyc,, +anyio/_core/__pycache__/_testing.cpython-310.pyc,, +anyio/_core/__pycache__/_typedattr.cpython-310.pyc,, +anyio/_core/_asyncio_selector_thread.py,sha256=2PdxFM3cs02Kp6BSppbvmRT7q7asreTW5FgBxEsflBo,5626 +anyio/_core/_contextmanagers.py,sha256=YInBCabiEeS-UaP_Jdxa1CaFC71ETPW8HZTHIM8Rsc8,7215 +anyio/_core/_eventloop.py,sha256=c2EdcBX-xnKwxPcC4Pjn3_qG9I-x4IWFO2R9RqCGjM4,6448 +anyio/_core/_exceptions.py,sha256=Y3aq-Wxd7Q2HqwSg7nZPvRsHEuGazv_qeet6gqEBdPk,4407 +anyio/_core/_fileio.py,sha256=CKi1gFNiW2G4knWeBE7He7-rptQwgYjDUWfG8DSlvLs,25665 +anyio/_core/_resources.py,sha256=NbmU5O5UX3xEyACnkmYX28Fmwdl-f-ny0tHym26e0w0,435 +anyio/_core/_signals.py,sha256=mjTBB2hTKNPRlU0IhnijeQedpWOGERDiMjSlJQsFrug,1016 +anyio/_core/_sockets.py,sha256=RBXHcUqZt5gg_-OOfgHVv8uq2FSKk1uVUzTdpjBoI1o,34977 +anyio/_core/_streams.py,sha256=FczFwIgDpnkK0bODWJXMpsUJYdvAD04kaUaGzJU8DK0,1806 +anyio/_core/_subprocesses.py,sha256=tkmkPKEkEaiMD8C9WRZBlmgjOYRDRbZdte6e-unay2E,7916 +anyio/_core/_synchronization.py,sha256=9G3fvRsPNrrWJ_Z6gD_80wXq8I8qgAyhwM8PvHQnT2c,21061 +anyio/_core/_tasks.py,sha256=pVB7K6AAulzUM8YgXAeqNZG44nSyZ1bYJjH8GznC00I,5435 +anyio/_core/_tempfile.py,sha256=jE2w59FRF3yRo4vjkjfZF2YcqsBZvc66VWRwrJGDYGk,19624 +anyio/_core/_testing.py,sha256=u7MPqGXwpTxqI7hclSdNA30z2GH1Nw258uwKvy_RfBg,2340 +anyio/_core/_typedattr.py,sha256=P4ozZikn3-DbpoYcvyghS_FOYAgbmUxeoU8-L_07pZM,2508 +anyio/abc/__init__.py,sha256=6mWhcl_pGXhrgZVHP_TCfMvIXIOp9mroEFM90fYCU_U,2869 +anyio/abc/__pycache__/__init__.cpython-310.pyc,, +anyio/abc/__pycache__/_eventloop.cpython-310.pyc,, +anyio/abc/__pycache__/_resources.cpython-310.pyc,, +anyio/abc/__pycache__/_sockets.cpython-310.pyc,, +anyio/abc/__pycache__/_streams.cpython-310.pyc,, +anyio/abc/__pycache__/_subprocesses.cpython-310.pyc,, +anyio/abc/__pycache__/_tasks.cpython-310.pyc,, +anyio/abc/__pycache__/_testing.cpython-310.pyc,, +anyio/abc/_eventloop.py,sha256=39lYnmtvoHaZw22sWBKOTA_zv7bamOnr8O49PqgDXdw,10629 +anyio/abc/_resources.py,sha256=DrYvkNN1hH6Uvv5_5uKySvDsnknGVDe8FCKfko0VtN8,783 +anyio/abc/_sockets.py,sha256=OmVDrfemVvF9c5K1tpBgQyV6fn5v0XyCExLAqBOGz9o,13124 +anyio/abc/_streams.py,sha256=HYvna1iZbWcwLROTO6IhLX79RTRLPShZMWe0sG1q54I,7481 +anyio/abc/_subprocesses.py,sha256=cumAPJTktOQtw63IqG0lDpyZqu_l1EElvQHMiwJgL08,2067 +anyio/abc/_tasks.py,sha256=KC7wrciE48AINOI-AhPutnFhe1ewfP7QnamFlDzqesQ,3721 +anyio/abc/_testing.py,sha256=tBJUzkSfOXJw23fe8qSJ03kJlShOYjjaEyFB6k6MYT8,1821 +anyio/from_thread.py,sha256=L-0w1HxJ6BSb-KuVi57k5Tkc3yzQrx3QK5tAxMPcY-0,19141 +anyio/functools.py,sha256=5AWM1iYTKkTzptvUhQDdLSh5GvbBW-vcs-SAUfIfA9A,12076 +anyio/lowlevel.py,sha256=AyKLVK3LaWSoK39LkCKxE4_GDMLKZBNqTrLUgk63y80,5158 +anyio/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +anyio/pytest_plugin.py,sha256=t6h4KJstqIxfxwTZ1YO8vpUVuB99nfCLltn0NHfatHo,12775 +anyio/streams/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +anyio/streams/__pycache__/__init__.cpython-310.pyc,, +anyio/streams/__pycache__/buffered.cpython-310.pyc,, +anyio/streams/__pycache__/file.cpython-310.pyc,, +anyio/streams/__pycache__/memory.cpython-310.pyc,, +anyio/streams/__pycache__/stapled.cpython-310.pyc,, +anyio/streams/__pycache__/text.cpython-310.pyc,, +anyio/streams/__pycache__/tls.cpython-310.pyc,, +anyio/streams/buffered.py,sha256=2R3PeJhe4EXrdYqz44Y6-Eg9R6DrmlsYrP36Ir43-po,6263 +anyio/streams/file.py,sha256=msnrotVKGMQomUu_Rj2qz9MvIdUp6d3JGr7MOEO8kV4,4428 +anyio/streams/memory.py,sha256=F0zwzvFJKAhX_LRZGoKzzqDC2oMM-f-yyTBrEYEGOaU,10740 +anyio/streams/stapled.py,sha256=T8Xqwf8K6EgURPxbt1N4i7A8BAk-gScv-GRhjLXIf_o,4390 +anyio/streams/text.py,sha256=BcVAGJw1VRvtIqnv-o0Rb0pwH7p8vwlvl21xHq522ag,5765 +anyio/streams/tls.py,sha256=DQVkXUvsTEYKkBO8dlVU7j_5H8QOtLy4sGi1Wrjqevo,15303 +anyio/to_interpreter.py,sha256=_mLngrMy97TMR6VbW4Y6YzDUk9ZuPcQMPlkuyRh3C9k,7100 +anyio/to_process.py,sha256=J7gAA_YOuoHqnpDAf5fm1Qu6kOmTzdFbiDNvnV755vk,9798 +anyio/to_thread.py,sha256=f6h_k2d743GBv9FhAnhM_YpTvWgIrzBy9cOE0eJ1UJw,2693 diff --git a/.venv/lib/python3.10/site-packages/anyio-4.13.0.dist-info/WHEEL b/.venv/lib/python3.10/site-packages/anyio-4.13.0.dist-info/WHEEL new file mode 100644 index 0000000..14a883f --- /dev/null +++ b/.venv/lib/python3.10/site-packages/anyio-4.13.0.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: setuptools (82.0.1) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/.venv/lib/python3.10/site-packages/anyio-4.13.0.dist-info/entry_points.txt b/.venv/lib/python3.10/site-packages/anyio-4.13.0.dist-info/entry_points.txt new file mode 100644 index 0000000..44dd9bd --- /dev/null +++ b/.venv/lib/python3.10/site-packages/anyio-4.13.0.dist-info/entry_points.txt @@ -0,0 +1,2 @@ +[pytest11] +anyio = anyio.pytest_plugin diff --git a/.venv/lib/python3.10/site-packages/anyio-4.13.0.dist-info/licenses/LICENSE b/.venv/lib/python3.10/site-packages/anyio-4.13.0.dist-info/licenses/LICENSE new file mode 100644 index 0000000..104eebf --- /dev/null +++ b/.venv/lib/python3.10/site-packages/anyio-4.13.0.dist-info/licenses/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2018 Alex Grönholm + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/.venv/lib/python3.10/site-packages/anyio-4.13.0.dist-info/top_level.txt b/.venv/lib/python3.10/site-packages/anyio-4.13.0.dist-info/top_level.txt new file mode 100644 index 0000000..c77c069 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/anyio-4.13.0.dist-info/top_level.txt @@ -0,0 +1 @@ +anyio diff --git a/.venv/lib/python3.10/site-packages/anyio/__init__.py b/.venv/lib/python3.10/site-packages/anyio/__init__.py new file mode 100644 index 0000000..d23c5a5 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/anyio/__init__.py @@ -0,0 +1,111 @@ +from __future__ import annotations + +from ._core._contextmanagers import AsyncContextManagerMixin as AsyncContextManagerMixin +from ._core._contextmanagers import ContextManagerMixin as ContextManagerMixin +from ._core._eventloop import current_time as current_time +from ._core._eventloop import get_all_backends as get_all_backends +from ._core._eventloop import get_available_backends as get_available_backends +from ._core._eventloop import get_cancelled_exc_class as get_cancelled_exc_class +from ._core._eventloop import run as run +from ._core._eventloop import sleep as sleep +from ._core._eventloop import sleep_forever as sleep_forever +from ._core._eventloop import sleep_until as sleep_until +from ._core._exceptions import BrokenResourceError as BrokenResourceError +from ._core._exceptions import BrokenWorkerInterpreter as BrokenWorkerInterpreter +from ._core._exceptions import BrokenWorkerProcess as BrokenWorkerProcess +from ._core._exceptions import BusyResourceError as BusyResourceError +from ._core._exceptions import ClosedResourceError as ClosedResourceError +from ._core._exceptions import ConnectionFailed as ConnectionFailed +from ._core._exceptions import DelimiterNotFound as DelimiterNotFound +from ._core._exceptions import EndOfStream as EndOfStream +from ._core._exceptions import IncompleteRead as IncompleteRead +from ._core._exceptions import NoEventLoopError as NoEventLoopError +from ._core._exceptions import RunFinishedError as RunFinishedError +from ._core._exceptions import TypedAttributeLookupError as TypedAttributeLookupError +from ._core._exceptions import WouldBlock as WouldBlock +from ._core._fileio import AsyncFile as AsyncFile +from ._core._fileio import Path as Path +from ._core._fileio import open_file as open_file +from ._core._fileio import wrap_file as wrap_file +from ._core._resources import aclose_forcefully as aclose_forcefully +from ._core._signals import open_signal_receiver as open_signal_receiver +from ._core._sockets import TCPConnectable as TCPConnectable +from ._core._sockets import UNIXConnectable as UNIXConnectable +from ._core._sockets import as_connectable as as_connectable +from ._core._sockets import connect_tcp as connect_tcp +from ._core._sockets import connect_unix as connect_unix +from ._core._sockets import create_connected_udp_socket as create_connected_udp_socket +from ._core._sockets import ( + create_connected_unix_datagram_socket as create_connected_unix_datagram_socket, +) +from ._core._sockets import create_tcp_listener as create_tcp_listener +from ._core._sockets import create_udp_socket as create_udp_socket +from ._core._sockets import create_unix_datagram_socket as create_unix_datagram_socket +from ._core._sockets import create_unix_listener as create_unix_listener +from ._core._sockets import getaddrinfo as getaddrinfo +from ._core._sockets import getnameinfo as getnameinfo +from ._core._sockets import notify_closing as notify_closing +from ._core._sockets import wait_readable as wait_readable +from ._core._sockets import wait_socket_readable as wait_socket_readable +from ._core._sockets import wait_socket_writable as wait_socket_writable +from ._core._sockets import wait_writable as wait_writable +from ._core._streams import create_memory_object_stream as create_memory_object_stream +from ._core._subprocesses import open_process as open_process +from ._core._subprocesses import run_process as run_process +from ._core._synchronization import CapacityLimiter as CapacityLimiter +from ._core._synchronization import ( + CapacityLimiterStatistics as CapacityLimiterStatistics, +) +from ._core._synchronization import Condition as Condition +from ._core._synchronization import ConditionStatistics as ConditionStatistics +from ._core._synchronization import Event as Event +from ._core._synchronization import EventStatistics as EventStatistics +from ._core._synchronization import Lock as Lock +from ._core._synchronization import LockStatistics as LockStatistics +from ._core._synchronization import ResourceGuard as ResourceGuard +from ._core._synchronization import Semaphore as Semaphore +from ._core._synchronization import SemaphoreStatistics as SemaphoreStatistics +from ._core._tasks import TASK_STATUS_IGNORED as TASK_STATUS_IGNORED +from ._core._tasks import CancelScope as CancelScope +from ._core._tasks import create_task_group as create_task_group +from ._core._tasks import current_effective_deadline as current_effective_deadline +from ._core._tasks import fail_after as fail_after +from ._core._tasks import move_on_after as move_on_after +from ._core._tempfile import NamedTemporaryFile as NamedTemporaryFile +from ._core._tempfile import SpooledTemporaryFile as SpooledTemporaryFile +from ._core._tempfile import TemporaryDirectory as TemporaryDirectory +from ._core._tempfile import TemporaryFile as TemporaryFile +from ._core._tempfile import gettempdir as gettempdir +from ._core._tempfile import gettempdirb as gettempdirb +from ._core._tempfile import mkdtemp as mkdtemp +from ._core._tempfile import mkstemp as mkstemp +from ._core._testing import TaskInfo as TaskInfo +from ._core._testing import get_current_task as get_current_task +from ._core._testing import get_running_tasks as get_running_tasks +from ._core._testing import wait_all_tasks_blocked as wait_all_tasks_blocked +from ._core._typedattr import TypedAttributeProvider as TypedAttributeProvider +from ._core._typedattr import TypedAttributeSet as TypedAttributeSet +from ._core._typedattr import typed_attribute as typed_attribute + +# Re-export imports so they look like they live directly in this package +for __value in list(locals().values()): + if getattr(__value, "__module__", "").startswith("anyio."): + __value.__module__ = __name__ + + +del __value + + +def __getattr__(attr: str) -> type[BrokenWorkerInterpreter]: + """Support deprecated aliases.""" + if attr == "BrokenWorkerIntepreter": + import warnings + + warnings.warn( + "The 'BrokenWorkerIntepreter' alias is deprecated, use 'BrokenWorkerInterpreter' instead.", + DeprecationWarning, + stacklevel=2, + ) + return BrokenWorkerInterpreter + + raise AttributeError(f"module {__name__!r} has no attribute {attr!r}") diff --git a/.venv/lib/python3.10/site-packages/anyio/__pycache__/__init__.cpython-310.pyc b/.venv/lib/python3.10/site-packages/anyio/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b8fee1e68dadb60bf737dd318893aad49027929c GIT binary patch literal 4285 zcmb`KNmCrj700WarfF!JT_8Y9Yei_GweK6dkk~{wLX(oFR8(a{iCWrORR|Pvgv0XH z5p$n##LUrGe*}Mwy4n|g1W$w`{C}^y5y%?P#Sro5moHytdZ4yn)8E{5qn46tuH!HHtS#XPJ zVQvBEM28A%#@q(Zi#&54+%DRg+rb4 z0{4g>=5BDW=w zkBAZGli+jW9P=sgs2F8F4L&c4S;u7;Y@R%559tD>~iTOPE zvbfBA0enSVVZI2yDy}kL0$&r?n8(1^#dYQq_=dQ_d>MRG++@B2z9nukUv+M~cf=j$ zYtCKwp18++9eiKhXTIS)a36|?%s0W0#3SZg;K$-I^KJ0B7-zl%o)8nvcfpfllKCEZ zN=z}|2TzM><_F*zF~j^2JS%3IAAz5UC(MtXIrph}$~+E!CY~`*fak?L^CWmdEHF=j z7sVp;G_&ej#2k&x6;*8uJ49 zrFhA_=zQl2A()rIuf!|nW$}zce@OlAU$3O4Td%D*f69n=*7s#? z^zCQLAET)_Z+M;`8lmlb!RJ(BJ3Jojdgi3>g>olcFg#;Jss($;_Tb<9ZF9RBDJ8v7 z4{cY%t!qPuy5Ttbx?yff&kA7cXWO=6JI1;r_ty+ijcItMbR3LS?wGpi7y&hEQW1T& zIdG(`0SXLy)mL&`Dj4#KA@V}oL9us2`S{?94E#u$a#|^$yap2UnyRM)}%Ea zhRR-#LJ9Y+Xs)XRCmhPi+X6% zp0+oNk!SCqJZxfpLfL49h={D39$-2$MD>~fu0}iEGD2fR8SWRy-nt{cqC0jFN{=_Z zyKX+vY2%wTgl}}!*Jwl4`})cwat+H;wpaBrG%9+AE9=D$94))Li(vKx+uMLc;k{vp zSV6<8FGU|4lDYk={k^iox_{EaK0{;Ru5^91tNZKk5Quuv2(fnFx!PV>=W(9&FU8JD zqh^?PxI3T3Duy`tm8neGAqZ`gj$qa$65e3&rweRg2dKR(CRzctUh(*__wDl-A+h;%-?~nIK}B zF;~Hq=91Xsl-rmTO%<-)=tRekdx$=rY@CNV(-rmfsZ z?Z@{wW|B+|c$9Agy?$2I~PjK%$54=1@H6b)wa!^_I1ERKBJ zWhCjOXb1Z`zF3TcZ?vf2J0nHg!zLQm*k_s`wyG@%aaB6F)tnD4$to5<^b|LZpy>I< zy)`b5X5-v@L(z@~afT@FnW|3*$8s&HQl02E?%2B^_}++fx=z_i*GJRpB^;Cv`KzWZ z{P|^}wCTIDB&`zC10|856h!M)f2TBt8)>`b*z2X*Zn)`t*T$|~E(N&SE+Kbp;dKy{ zc&kggj%zB^^|9J+oY!>(AB|hrP4pl1Kyv9^Dw9s9=r{ZCOmkmaRbgHn%_QUb4h1Dh zUO`5;D59znLIz`2v`}$BZUrUB=x(6biJQDm0)>BkG(~X|chxPEvrx-HnzzrmXRcNOe#pt)=QB=_a9xs9usjl0zi@Bm*S)|4dVZBtww6 zQ16qjTH9B{RB?plD9JH$X$)A^-ztfNiL9FB)LQ~Mp7cVOmc(u53RW~+= zo{yW#_v{b+uv9n6;}!`WV0DM&F3CNT`y>xY9+EsFc?^l$>tEwErN+rVL4s7EsVS0a zk{L+c+3-bTq_tMFRP}^pj^ruHGm?3d1(HR`-aJEzJI>osOH{K=@|T8%`Hn(b zm8q^mvPupadJ@E0BvQi(;_SBJL^6n5be$<~shxKAW? uo4cPR0{oYS1N1jYyVjm=PyJthn|`C0->Ux~qv&bsOJ!4;Kct&Fn*IYDgy8M~ literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/anyio/__pycache__/from_thread.cpython-310.pyc b/.venv/lib/python3.10/site-packages/anyio/__pycache__/from_thread.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f4c62beeffac2cd3e1a07c5f9e41c7e53b503e5e GIT binary patch literal 18776 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/anyio/__pycache__/lowlevel.cpython-310.pyc b/.venv/lib/python3.10/site-packages/anyio/__pycache__/lowlevel.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b86dee98cfe9f82fd211fa33271f9f19ac144914 GIT binary patch literal 6168 zcmb7IOLN=S6~>Do36YYl$PX!T4B4?`rVbT1Y1685V#ijVj?%`A(@>*9Al%Ck5(qFC zpk#9BPFs1=O}p((Gnt8(p6Q~~pV0gZY}-w?^-j~){munRQIb7QpyAcI58TH&-}%nD zh{|P4!SmX`{^4JkRg`~HW&FvZa#c~(_>`(BpD0XWYM`{#x~eKnt81w1fnL|~-w2FW zuAW1?!g7Jx%GdK!HiJT|STDA$y49MfPqa$)Qmb4qwNY+_ffAIJX^{-0nkuqifu�e-bd1eFItA$&HVbKvmwApIXD8Un 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%0Dl8nrrp zZY_OqYjG9qt=w6=bK}nKLg5Ae?Dy@dOVjqd<@V43pEP(;4i;dsYG@8HJF~@;Dap6% zv-16m8-+wP=L$AHWbUVJGVNF-nVKRBWjTm*K|3%&v!>3|ta2fPnmu55Z7;UbpONf` zBi62o1|Ot`nFSui{H4=xdKfA67#uuEz0o_!v^|wEIBoZDS)R7fzeJQ>#$OOm#zyz7 zQY2lmj>^<6H8Fmrt|&hztDnQD39ANgj56n|PqoYr!`BMZztrkt zD4&kB?;yi|<|jt``vA4>q)cbTA`uyaVSonF@OaGOFWj2vhxqZ5M8q#M@X}ChVQppw z)Ctuf`}K{ufW8+FOlDgim^?8Zn2z)mp?jjsx}ujFb}F?@IV&%&w@kPo6A=Uitb!kL4Mll0H8Wd<$d=4gI(AqI+R_{QYAt=zbF46e;kEw!j2>{1JGZsg#^KVo=UP>?0wqhgK2Qg4)VL2KWlMaYxVS>a`&39fdzET3ZXu>Jt6@{ES9Edoujuc`kzUF_ zC&8sh78Y;LuisvCZ`@sXZy;7#d;SK|AcK)wccXY7j&>~_cfALAoKYCzK9mo_I6e8l zJx0@fd)h%sK1uJl!@3O_$_?BYA&CSfg+!aTlm%tO+=m%@qEP((8GOKtkvLgDio`iR zI)zIuGu!jf1;FyhNmTFf{cFsOO%$Y)MNL#t#XBP3enlUg>&E5xv*+sl&MjTpdJhyq zsnGmEo6;~S8QGe9m~X%zJl3<7$l?rNYEy~tK7^B^zmM_V`)*R)8EF|iCA^vO-eB6# zjBL$4B^d=p@Fl)zp=A1`vNLu$ab>L?JXaVZ5dS3quqY!C)<7f2s0aG z9uQE6wr3BTwwZz?H8W#B^hAiLX>QKG6ZV_8X-R4hFOj)VD^b|awaoOJ$4~9-odO!M zjpUEr?D#Lfnt;BCEFM$FDh?}_D2>1 zo#9rOa?Ov4i3=6sCq77_@OMN(;xQG7oqPh5|X`2bB2 z>q#R!Jb&rZwj$4AFiTR|?H)Q0QV{ebdnEY;`L@6g8?{X??5KK3#Bujzh#*MB_LN_> zBjnrQF*514GjiQca7UEq$O7s)grvwwWhcP{8L2zkgn&n<&Q2^mKZeAV@E6y z{Oy=TD#1gy!RbBsGF)b`Tox2O$XKfUiXi7lAu#J1aIr#t!?&Yow^7f$F9qnSjz~B) zfsaRif)pg*@?&HdrJY2a71h(i643D|TXBZ=C{m$QAw3c0{<3HG#7Fc0?B2Vx^5No& zyR>k7(Op~mXfe%$NWiO!bXnM`UI*NeP>_Ku8PP0fRvch<6aA?kMh_2Jce(F>U@)fR zXrEiJn5w1~5tN&-?_;X=bt$Kzh3C4eeWQIo^|fXq4pTMxSNyAK8R|IduWH6$EfcH$ zGT6?}MF}Bt6x|P*adMzH$b^$)-lHcA(na@>EP|QUnn-WcU!o_*liX9KKAxD5)qQ#e zfY}q6jmf!+VD68UILZ9*|a-&8$fXnzdbV(G$qXra0hKy+*ZYf zET0^cQV=S8gb)zel?a&aC~XJIq_Bs0i#92Lnc)u6%8zj$5?x}4YIJ$27RBjMrQUEW z5#l}J(7-Mg5~ViPWFbQqLhGOK&61Y|_-RNIDNIOHBDn*W6SRyHtTJDgy*%luh1@Fz z1maUFDB&oh4sa$RR;3QPiXL*(ZHw*hOp1IEP{>updHFIWld28qF_KAwq7~#gU1%>_ z0WE7#mmW9cbhr`)0d4~3Di%_iM*DhZyv>Rr-=CUEvkqe-^0b^_B+2D;A$n;Zq^uLfVz-8VSEo$!%&9DpKo8<|?m}^2J21q!^l&v*?k9zX^3rDn4cA y#!)Y50F5?QC>)nF>xmNcT&FUnI$RN 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 oqJPEkiey?L++WBJjto39Fqn7?|FY@-3j_Mj= (3, 11): + from asyncio import Runner + from typing import TypeVarTuple, Unpack +else: + import contextvars + import enum + import signal + from asyncio import coroutines, events, exceptions, tasks + + from exceptiongroup import BaseExceptionGroup + from typing_extensions import TypeVarTuple, Unpack + + class _State(enum.Enum): + CREATED = "created" + INITIALIZED = "initialized" + CLOSED = "closed" + + class Runner: + # Copied from CPython 3.11 + def __init__( + self, + *, + debug: bool | None = None, + loop_factory: Callable[[], AbstractEventLoop] | None = None, + ): + self._state = _State.CREATED + self._debug = debug + self._loop_factory = loop_factory + self._loop: AbstractEventLoop | None = None + self._context = None + self._interrupt_count = 0 + self._set_event_loop = False + + def __enter__(self) -> Runner: + self._lazy_init() + return self + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + self.close() + + def close(self) -> None: + """Shutdown and close event loop.""" + loop = self._loop + if self._state is not _State.INITIALIZED or loop is None: + return + try: + _cancel_all_tasks(loop) + loop.run_until_complete(loop.shutdown_asyncgens()) + if hasattr(loop, "shutdown_default_executor"): + loop.run_until_complete(loop.shutdown_default_executor()) + else: + loop.run_until_complete(_shutdown_default_executor(loop)) + finally: + if self._set_event_loop: + events.set_event_loop(None) + loop.close() + self._loop = None + self._state = _State.CLOSED + + def get_loop(self) -> AbstractEventLoop: + """Return embedded event loop.""" + self._lazy_init() + return self._loop + + def run(self, coro: Coroutine[T_Retval], *, context=None) -> T_Retval: + """Run a coroutine inside the embedded event loop.""" + if not coroutines.iscoroutine(coro): + raise ValueError(f"a coroutine was expected, got {coro!r}") + + if events._get_running_loop() is not None: + # fail fast with short traceback + raise RuntimeError( + "Runner.run() cannot be called from a running event loop" + ) + + self._lazy_init() + + if context is None: + context = self._context + task = context.run(self._loop.create_task, coro) + + if ( + threading.current_thread() is threading.main_thread() + and signal.getsignal(signal.SIGINT) is signal.default_int_handler + ): + sigint_handler = partial(self._on_sigint, main_task=task) + try: + signal.signal(signal.SIGINT, sigint_handler) + except ValueError: + # `signal.signal` may throw if `threading.main_thread` does + # not support signals (e.g. embedded interpreter with signals + # not registered - see gh-91880) + sigint_handler = None + else: + sigint_handler = None + + self._interrupt_count = 0 + try: + return self._loop.run_until_complete(task) + except exceptions.CancelledError: + if self._interrupt_count > 0: + uncancel = getattr(task, "uncancel", None) + if uncancel is not None and uncancel() == 0: + raise KeyboardInterrupt # noqa: B904 + raise # CancelledError + finally: + if ( + sigint_handler is not None + and signal.getsignal(signal.SIGINT) is sigint_handler + ): + signal.signal(signal.SIGINT, signal.default_int_handler) + + def _lazy_init(self) -> None: + if self._state is _State.CLOSED: + raise RuntimeError("Runner is closed") + if self._state is _State.INITIALIZED: + return + if self._loop_factory is None: + self._loop = events.new_event_loop() + if not self._set_event_loop: + # Call set_event_loop only once to avoid calling + # attach_loop multiple times on child watchers + events.set_event_loop(self._loop) + self._set_event_loop = True + else: + self._loop = self._loop_factory() + if self._debug is not None: + self._loop.set_debug(self._debug) + self._context = contextvars.copy_context() + self._state = _State.INITIALIZED + + def _on_sigint(self, signum, frame, main_task: asyncio.Task) -> None: + self._interrupt_count += 1 + if self._interrupt_count == 1 and not main_task.done(): + main_task.cancel() + # wakeup loop if it is blocked by select() with long timeout + self._loop.call_soon_threadsafe(lambda: None) + return + raise KeyboardInterrupt() + + def _cancel_all_tasks(loop: AbstractEventLoop) -> None: + to_cancel = tasks.all_tasks(loop) + if not to_cancel: + return + + for task in to_cancel: + task.cancel() + + loop.run_until_complete(tasks.gather(*to_cancel, return_exceptions=True)) + + for task in to_cancel: + if task.cancelled(): + continue + if task.exception() is not None: + loop.call_exception_handler( + { + "message": "unhandled exception during asyncio.run() shutdown", + "exception": task.exception(), + "task": task, + } + ) + + async def _shutdown_default_executor(loop: AbstractEventLoop) -> None: + """Schedule the shutdown of the default executor.""" + + def _do_shutdown(future: asyncio.futures.Future) -> None: + try: + loop._default_executor.shutdown(wait=True) # type: ignore[attr-defined] + loop.call_soon_threadsafe(future.set_result, None) + except Exception as ex: + loop.call_soon_threadsafe(future.set_exception, ex) + + loop._executor_shutdown_called = True + if loop._default_executor is None: + return + future = loop.create_future() + thread = threading.Thread(target=_do_shutdown, args=(future,)) + thread.start() + try: + await future + finally: + thread.join() + + +T_Retval = TypeVar("T_Retval") +T_contra = TypeVar("T_contra", contravariant=True) +PosArgsT = TypeVarTuple("PosArgsT") +P = ParamSpec("P") + +_root_task: RunVar[asyncio.Task | None] = RunVar("_root_task") + + +def find_root_task() -> asyncio.Task: + root_task = _root_task.get(None) + if root_task is not None and not root_task.done(): + return root_task + + # Look for a task that has been started via run_until_complete() + for task in all_tasks(): + if task._callbacks and not task.done(): + callbacks = [cb for cb, context in task._callbacks] + for cb in callbacks: + if ( + cb is _run_until_complete_cb + or getattr(cb, "__module__", None) == "uvloop.loop" + ): + _root_task.set(task) + return task + + # Look up the topmost task in the AnyIO task tree, if possible + task = cast(asyncio.Task, current_task()) + state = _task_states.get(task) + if state: + cancel_scope = state.cancel_scope + while cancel_scope and cancel_scope._parent_scope is not None: + cancel_scope = cancel_scope._parent_scope + + if cancel_scope is not None: + return cast(asyncio.Task, cancel_scope._host_task) + + return task + + +def get_callable_name(func: Callable) -> str: + module = getattr(func, "__module__", None) + qualname = getattr(func, "__qualname__", None) + return ".".join([x for x in (module, qualname) if x]) + + +# +# Event loop +# + +_run_vars: WeakKeyDictionary[asyncio.AbstractEventLoop, Any] = WeakKeyDictionary() + + +def _task_started(task: asyncio.Task) -> bool: + """Return ``True`` if the task has been started and has not finished.""" + # The task coro should never be None here, as we never add finished tasks to the + # task list + coro = task.get_coro() + assert coro is not None + try: + return getcoroutinestate(coro) in (CORO_RUNNING, CORO_SUSPENDED) + except AttributeError: + # task coro is async_genenerator_asend https://bugs.python.org/issue37771 + raise Exception(f"Cannot determine if task {task} has started or not") from None + + +# +# Timeouts and cancellation +# + + +def is_anyio_cancellation(exc: CancelledError) -> bool: + # Sometimes third party frameworks catch a CancelledError and raise a new one, so as + # a workaround we have to look at the previous ones in __context__ too for a + # matching cancel message + while True: + if ( + exc.args + and isinstance(exc.args[0], str) + and exc.args[0].startswith("Cancelled via cancel scope ") + ): + return True + + if isinstance(exc.__context__, CancelledError): + exc = exc.__context__ + continue + + return False + + +class CancelScope(BaseCancelScope): + def __new__( + cls, *, deadline: float = math.inf, shield: bool = False + ) -> CancelScope: + return object.__new__(cls) + + def __init__(self, deadline: float = math.inf, shield: bool = False): + self._deadline = deadline + self._shield = shield + self._parent_scope: CancelScope | None = None + self._child_scopes: set[CancelScope] = set() + self._cancel_called = False + self._cancel_reason: str | None = None + self._cancelled_caught = False + self._active = False + self._timeout_handle: asyncio.TimerHandle | None = None + self._cancel_handle: asyncio.Handle | None = None + self._tasks: set[asyncio.Task] = set() + self._host_task: asyncio.Task | None = None + if sys.version_info >= (3, 11): + self._pending_uncancellations: int | None = 0 + else: + self._pending_uncancellations = None + + def __enter__(self) -> CancelScope: + if self._active: + raise RuntimeError( + "Each CancelScope may only be used for a single 'with' block" + ) + + self._host_task = host_task = cast(asyncio.Task, current_task()) + self._tasks.add(host_task) + try: + task_state = _task_states[host_task] + except KeyError: + task_state = TaskState(None, self) + _task_states[host_task] = task_state + else: + self._parent_scope = task_state.cancel_scope + task_state.cancel_scope = self + if self._parent_scope is not None: + # If using an eager task factory, the parent scope may not even contain + # the host task + self._parent_scope._child_scopes.add(self) + self._parent_scope._tasks.discard(host_task) + + self._timeout() + self._active = True + + # Start cancelling the host task if the scope was cancelled before entering + if self._cancel_called: + self._deliver_cancellation(self) + + return self + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> bool: + del exc_tb + + if not self._active: + raise RuntimeError("This cancel scope is not active") + if current_task() is not self._host_task: + raise RuntimeError( + "Attempted to exit cancel scope in a different task than it was " + "entered in" + ) + + assert self._host_task is not None + host_task_state = _task_states.get(self._host_task) + if host_task_state is None or host_task_state.cancel_scope is not self: + raise RuntimeError( + "Attempted to exit a cancel scope that isn't the current tasks's " + "current cancel scope" + ) + + try: + self._active = False + if self._timeout_handle: + self._timeout_handle.cancel() + self._timeout_handle = None + + self._tasks.remove(self._host_task) + if self._parent_scope is not None: + self._parent_scope._child_scopes.remove(self) + self._parent_scope._tasks.add(self._host_task) + + host_task_state.cancel_scope = self._parent_scope + + # Restart the cancellation effort in the closest visible, cancelled parent + # scope if necessary + self._restart_cancellation_in_parent() + + # We only swallow the exception iff it was an AnyIO CancelledError, either + # directly as exc_val or inside an exception group and there are no cancelled + # parent cancel scopes visible to us here + if self._cancel_called and not self._parent_cancellation_is_visible_to_us: + # For each level-cancel() call made on the host task, call uncancel() + while self._pending_uncancellations: + self._host_task.uncancel() + self._pending_uncancellations -= 1 + + # Update cancelled_caught and check for exceptions we must not swallow + if isinstance(exc_val, BaseExceptionGroup): + cancelleds_caught, remaining = exc_val.split( + lambda exc: ( + isinstance(exc, CancelledError) + and is_anyio_cancellation(exc) + ) + ) + + if cancelleds_caught is None: + return False + + self._cancelled_caught = True + + if remaining is None: + return True + + context = remaining.__context__ + try: + # Preserve __cause__ and __suppress_context__ by avoiding `raise + # ... from ...` + raise remaining + finally: + # Preserve __context__ + remaining.__context__ = context + del context + else: + if isinstance(exc_val, CancelledError) and is_anyio_cancellation( + exc_val + ): + self._cancelled_caught = True + return True + else: + return False + else: + if self._pending_uncancellations: + assert self._parent_scope is not None + assert self._parent_scope._pending_uncancellations is not None + self._parent_scope._pending_uncancellations += ( + self._pending_uncancellations + ) + self._pending_uncancellations = 0 + + return False + finally: + self._host_task = None + del exc_val + + @property + def _effectively_cancelled(self) -> bool: + cancel_scope: CancelScope | None = self + while cancel_scope is not None: + if cancel_scope._cancel_called: + return True + + if cancel_scope.shield: + return False + + cancel_scope = cancel_scope._parent_scope + + return False + + @property + def _parent_cancellation_is_visible_to_us(self) -> bool: + return ( + self._parent_scope is not None + and not self.shield + and self._parent_scope._effectively_cancelled + ) + + def _timeout(self) -> None: + if self._deadline != math.inf: + loop = get_running_loop() + if loop.time() >= self._deadline: + self.cancel("deadline exceeded") + else: + self._timeout_handle = loop.call_at(self._deadline, self._timeout) + + def _deliver_cancellation(self, origin: CancelScope) -> bool: + """ + Deliver cancellation to directly contained tasks and nested cancel scopes. + + Schedule another run at the end if we still have tasks eligible for + cancellation. + + :param origin: the cancel scope that originated the cancellation + :return: ``True`` if the delivery needs to be retried on the next cycle + + """ + should_retry = False + current = current_task() + for task in self._tasks: + should_retry = True + if task._must_cancel: # type: ignore[attr-defined] + continue + + # The task is eligible for cancellation if it has started + if task is not current and (task is self._host_task or _task_started(task)): + waiter = task._fut_waiter # type: ignore[attr-defined] + if not isinstance(waiter, asyncio.Future) or not waiter.done(): + task.cancel(origin._cancel_reason) + if ( + task is origin._host_task + and origin._pending_uncancellations is not None + ): + origin._pending_uncancellations += 1 + + # Deliver cancellation to child scopes that aren't shielded or running their own + # cancellation callbacks + for scope in self._child_scopes: + if not scope._shield and not scope.cancel_called: + should_retry = scope._deliver_cancellation(origin) or should_retry + + # Schedule another callback if there are still tasks left + if origin is self: + if should_retry: + self._cancel_handle = get_running_loop().call_soon( + self._deliver_cancellation, origin + ) + else: + self._cancel_handle = None + + return should_retry + + def _restart_cancellation_in_parent(self) -> None: + """ + Restart the cancellation effort in the closest directly cancelled parent scope. + + """ + scope = self._parent_scope + while scope is not None: + if scope._cancel_called: + if scope._cancel_handle is None: + scope._deliver_cancellation(scope) + + break + + # No point in looking beyond any shielded scope + if scope._shield: + break + + scope = scope._parent_scope + + def cancel(self, reason: str | None = None) -> None: + if not self._cancel_called: + if self._timeout_handle: + self._timeout_handle.cancel() + self._timeout_handle = None + + self._cancel_called = True + self._cancel_reason = f"Cancelled via cancel scope {id(self):x}" + if task := current_task(): + self._cancel_reason += f" by {task}" + + if reason: + self._cancel_reason += f"; reason: {reason}" + + if self._host_task is not None: + self._deliver_cancellation(self) + + @property + def deadline(self) -> float: + return self._deadline + + @deadline.setter + def deadline(self, value: float) -> None: + self._deadline = float(value) + if self._timeout_handle is not None: + self._timeout_handle.cancel() + self._timeout_handle = None + + if self._active and not self._cancel_called: + self._timeout() + + @property + def cancel_called(self) -> bool: + return self._cancel_called + + @property + def cancelled_caught(self) -> bool: + return self._cancelled_caught + + @property + def shield(self) -> bool: + return self._shield + + @shield.setter + def shield(self, value: bool) -> None: + if self._shield != value: + self._shield = value + if not value: + self._restart_cancellation_in_parent() + + +# +# Task states +# + + +class TaskState: + """ + Encapsulates auxiliary task information that cannot be added to the Task instance + itself because there are no guarantees about its implementation. + """ + + __slots__ = "parent_id", "cancel_scope", "__weakref__" + + def __init__(self, parent_id: int | None, cancel_scope: CancelScope | None): + self.parent_id = parent_id + self.cancel_scope = cancel_scope + + +_task_states: WeakKeyDictionary[asyncio.Task, TaskState] = WeakKeyDictionary() + + +# +# Task groups +# + + +class _AsyncioTaskStatus(abc.TaskStatus): + def __init__(self, future: asyncio.Future, parent_id: int): + self._future = future + self._parent_id = parent_id + + def started(self, value: T_contra | None = None) -> None: + try: + self._future.set_result(value) + except asyncio.InvalidStateError: + if not self._future.cancelled(): + raise RuntimeError( + "called 'started' twice on the same task status" + ) from None + + task = cast(asyncio.Task, current_task()) + _task_states[task].parent_id = self._parent_id + + +if sys.version_info >= (3, 12): + _eager_task_factory_code: CodeType | None = asyncio.eager_task_factory.__code__ +else: + _eager_task_factory_code = None + + +class TaskGroup(abc.TaskGroup): + def __init__(self) -> None: + self.cancel_scope: CancelScope = CancelScope() + self._active = False + self._exceptions: list[BaseException] = [] + self._tasks: set[asyncio.Task] = set() + self._on_completed_fut: asyncio.Future[None] | None = None + + async def __aenter__(self) -> TaskGroup: + self.cancel_scope.__enter__() + self._active = True + return self + + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> bool: + try: + if exc_val is not None: + self.cancel_scope.cancel() + if not isinstance(exc_val, CancelledError): + self._exceptions.append(exc_val) + + loop = get_running_loop() + try: + if self._tasks: + with CancelScope() as wait_scope: + while self._tasks: + self._on_completed_fut = loop.create_future() + + try: + await self._on_completed_fut + except CancelledError as exc: + # Shield the scope against further cancellation attempts, + # as they're not productive (#695) + wait_scope.shield = True + self.cancel_scope.cancel() + + # Set exc_val from the cancellation exception if it was + # previously unset. However, we should not replace a native + # cancellation exception with one raise by a cancel scope. + if exc_val is None or ( + isinstance(exc_val, CancelledError) + and not is_anyio_cancellation(exc) + ): + exc_val = exc + + self._on_completed_fut = None + else: + # If there are no child tasks to wait on, run at least one checkpoint + # anyway + await AsyncIOBackend.cancel_shielded_checkpoint() + + self._active = False + if self._exceptions: + # The exception that got us here should already have been + # added to self._exceptions so it's ok to break exception + # chaining and avoid adding a "During handling of above..." + # for each nesting level. + raise BaseExceptionGroup( + "unhandled errors in a TaskGroup", self._exceptions + ) from None + elif exc_val: + raise exc_val + except BaseException as exc: + if self.cancel_scope.__exit__(type(exc), exc, exc.__traceback__): + return True + + raise + + return self.cancel_scope.__exit__(exc_type, exc_val, exc_tb) + finally: + del exc_val, exc_tb, self._exceptions + + def _spawn( + self, + func: Callable[[Unpack[PosArgsT]], Awaitable[Any]], + args: tuple[Unpack[PosArgsT]], + name: object, + task_status_future: asyncio.Future | None = None, + ) -> asyncio.Task: + def task_done(_task: asyncio.Task) -> None: + if sys.version_info >= (3, 14) and self.cancel_scope._host_task is not None: + asyncio.future_discard_from_awaited_by( + _task, self.cancel_scope._host_task + ) + + task_state = _task_states[_task] + assert task_state.cancel_scope is not None + assert _task in task_state.cancel_scope._tasks + task_state.cancel_scope._tasks.remove(_task) + self._tasks.remove(task) + del _task_states[_task] + + if self._on_completed_fut is not None and not self._tasks: + try: + self._on_completed_fut.set_result(None) + except asyncio.InvalidStateError: + pass + + try: + exc = _task.exception() + except CancelledError as e: + while isinstance(e.__context__, CancelledError): + e = e.__context__ + + exc = e + + if exc is not None: + # The future can only be in the cancelled state if the host task was + # cancelled, so return immediately instead of adding one more + # CancelledError to the exceptions list + if task_status_future is not None and task_status_future.cancelled(): + return + + if task_status_future is None or task_status_future.done(): + if not isinstance(exc, CancelledError): + self._exceptions.append(exc) + + if not self.cancel_scope._effectively_cancelled: + self.cancel_scope.cancel() + else: + task_status_future.set_exception(exc) + elif task_status_future is not None and not task_status_future.done(): + task_status_future.set_exception( + RuntimeError("Child exited without calling task_status.started()") + ) + + if not self._active: + raise RuntimeError( + "This task group is not active; no new tasks can be started." + ) + + kwargs = {} + if task_status_future: + parent_id = id(current_task()) + kwargs["task_status"] = _AsyncioTaskStatus( + task_status_future, id(self.cancel_scope._host_task) + ) + else: + parent_id = id(self.cancel_scope._host_task) + + coro = func(*args, **kwargs) + if not iscoroutine(coro): + prefix = f"{func.__module__}." if hasattr(func, "__module__") else "" + raise TypeError( + f"Expected {prefix}{func.__qualname__}() to return a coroutine, but " + f"the return value ({coro!r}) is not a coroutine object" + ) + + name = get_callable_name(func) if name is None else str(name) + loop = asyncio.get_running_loop() + if ( + (factory := loop.get_task_factory()) + and getattr(factory, "__code__", None) is _eager_task_factory_code + and (closure := getattr(factory, "__closure__", None)) + ): + custom_task_constructor = closure[0].cell_contents + task = custom_task_constructor(coro, loop=loop, name=name) + else: + task = create_task(coro, name=name) + + # Make the spawned task inherit the task group's cancel scope + _task_states[task] = TaskState( + parent_id=parent_id, cancel_scope=self.cancel_scope + ) + self.cancel_scope._tasks.add(task) + self._tasks.add(task) + if sys.version_info >= (3, 14) and self.cancel_scope._host_task is not None: + asyncio.future_add_to_awaited_by(task, self.cancel_scope._host_task) + + task.add_done_callback(task_done) + return task + + def start_soon( + self, + func: Callable[[Unpack[PosArgsT]], Awaitable[Any]], + *args: Unpack[PosArgsT], + name: object = None, + ) -> None: + self._spawn(func, args, name) + + async def start( + self, func: Callable[..., Awaitable[Any]], *args: object, name: object = None + ) -> Any: + future: asyncio.Future = asyncio.Future() + task = self._spawn(func, args, name, future) + + # If the task raises an exception after sending a start value without a switch + # point between, the task group is cancelled and this method never proceeds to + # process the completed future. That's why we have to have a shielded cancel + # scope here. + try: + return await future + except CancelledError: + # Cancel the task and wait for it to exit before returning + task.cancel() + with CancelScope(shield=True), suppress(CancelledError): + await task + + raise + + +# +# Threads +# + +_Retval_Queue_Type = tuple[T_Retval | None, BaseException | None] + + +class WorkerThread(Thread): + MAX_IDLE_TIME = 10 # seconds + + def __init__( + self, + root_task: asyncio.Task, + workers: set[WorkerThread], + idle_workers: deque[WorkerThread], + ): + super().__init__(name="AnyIO worker thread") + self.root_task = root_task + self.workers = workers + self.idle_workers = idle_workers + self.loop = root_task._loop + self.queue: Queue[ + tuple[Context, Callable, tuple, asyncio.Future, CancelScope] | None + ] = Queue(2) + self.idle_since = AsyncIOBackend.current_time() + self.stopping = False + + def _report_result( + self, future: asyncio.Future, result: Any, exc: BaseException | None + ) -> None: + self.idle_since = AsyncIOBackend.current_time() + if not self.stopping: + self.idle_workers.append(self) + + if not future.cancelled(): + if exc is not None: + if isinstance(exc, StopIteration): + new_exc = RuntimeError("coroutine raised StopIteration") + new_exc.__cause__ = exc + exc = new_exc + + future.set_exception(exc) + else: + future.set_result(result) + + def run(self) -> None: + with claim_worker_thread(AsyncIOBackend, self.loop): + while True: + item = self.queue.get() + if item is None: + # Shutdown command received + return + + context, func, args, future, cancel_scope = item + if not future.cancelled(): + result = None + exception: BaseException | None = None + threadlocals.current_cancel_scope = cancel_scope + try: + result = context.run(func, *args) + except BaseException as exc: + exception = exc + finally: + del threadlocals.current_cancel_scope + + if not self.loop.is_closed(): + self.loop.call_soon_threadsafe( + self._report_result, future, result, exception + ) + + del result, exception + + self.queue.task_done() + del item, context, func, args, future, cancel_scope + + def stop(self, f: asyncio.Task | None = None) -> None: + self.stopping = True + self.queue.put_nowait(None) + self.workers.discard(self) + try: + self.idle_workers.remove(self) + except ValueError: + pass + + +_threadpool_idle_workers: RunVar[deque[WorkerThread]] = RunVar( + "_threadpool_idle_workers" +) +_threadpool_workers: RunVar[set[WorkerThread]] = RunVar("_threadpool_workers") + + +# +# Subprocesses +# + + +@dataclass(eq=False) +class StreamReaderWrapper(abc.ByteReceiveStream): + _stream: asyncio.StreamReader + + async def receive(self, max_bytes: int = 65536) -> bytes: + data = await self._stream.read(max_bytes) + if data: + return data + else: + raise EndOfStream + + async def aclose(self) -> None: + self._stream.set_exception(ClosedResourceError()) + await AsyncIOBackend.checkpoint() + + +@dataclass(eq=False) +class StreamWriterWrapper(abc.ByteSendStream): + _stream: asyncio.StreamWriter + _closed: bool = field(init=False, default=False) + + async def send(self, item: bytes) -> None: + await AsyncIOBackend.checkpoint_if_cancelled() + stream_paused = self._stream._protocol._paused # type: ignore[attr-defined] + try: + self._stream.write(item) + await self._stream.drain() + except (ConnectionResetError, BrokenPipeError, RuntimeError) as exc: + # If closed by us and/or the peer: + # * on stdlib, drain() raises ConnectionResetError or BrokenPipeError + # * on uvloop and Winloop, write() eventually starts raising RuntimeError + if self._closed: + raise ClosedResourceError from exc + elif self._stream.is_closing(): + raise BrokenResourceError from exc + + raise + + if not stream_paused: + await AsyncIOBackend.cancel_shielded_checkpoint() + + async def aclose(self) -> None: + self._closed = True + self._stream.close() + await AsyncIOBackend.checkpoint() + + +@dataclass(eq=False) +class Process(abc.Process): + _process: asyncio.subprocess.Process + _stdin: StreamWriterWrapper | None + _stdout: StreamReaderWrapper | None + _stderr: StreamReaderWrapper | None + + async def aclose(self) -> None: + with CancelScope(shield=True) as scope: + if self._stdin: + await self._stdin.aclose() + if self._stdout: + await self._stdout.aclose() + if self._stderr: + await self._stderr.aclose() + + scope.shield = False + try: + await self.wait() + except BaseException: + scope.shield = True + self.kill() + await self.wait() + raise + + async def wait(self) -> int: + return await self._process.wait() + + def terminate(self) -> None: + self._process.terminate() + + def kill(self) -> None: + self._process.kill() + + def send_signal(self, signal: int) -> None: + self._process.send_signal(signal) + + @property + def pid(self) -> int: + return self._process.pid + + @property + def returncode(self) -> int | None: + return self._process.returncode + + @property + def stdin(self) -> abc.ByteSendStream | None: + return self._stdin + + @property + def stdout(self) -> abc.ByteReceiveStream | None: + return self._stdout + + @property + def stderr(self) -> abc.ByteReceiveStream | None: + return self._stderr + + +def _forcibly_shutdown_process_pool_on_exit( + workers: set[Process], _task: object +) -> None: + """ + Forcibly shuts down worker processes belonging to this event loop.""" + child_watcher: asyncio.AbstractChildWatcher | None = None # type: ignore[name-defined] + if sys.version_info < (3, 12): + try: + child_watcher = asyncio.get_event_loop_policy().get_child_watcher() + except NotImplementedError: + pass + + # Close as much as possible (w/o async/await) to avoid warnings + for process in workers.copy(): + if process.returncode is not None: + continue + + process._stdin._stream._transport.close() # type: ignore[union-attr] + process._stdout._stream._transport.close() # type: ignore[union-attr] + process._stderr._stream._transport.close() # type: ignore[union-attr] + process.kill() + if child_watcher: + child_watcher.remove_child_handler(process.pid) + + +async def _shutdown_process_pool_on_exit(workers: set[abc.Process]) -> None: + """ + Shuts down worker processes belonging to this event loop. + + NOTE: this only works when the event loop was started using asyncio.run() or + anyio.run(). + + """ + process: abc.Process + try: + await sleep(math.inf) + except asyncio.CancelledError: + workers = workers.copy() + for process in workers: + if process.returncode is None: + process.kill() + + for process in workers: + await process.aclose() + + +# +# Sockets and networking +# + + +class StreamProtocol(asyncio.Protocol): + read_queue: deque[bytes] + read_event: asyncio.Event + write_event: asyncio.Event + exception: Exception | None = None + is_at_eof: bool = False + + def connection_made(self, transport: asyncio.BaseTransport) -> None: + self.read_queue = deque() + self.read_event = asyncio.Event() + self.write_event = asyncio.Event() + self.write_event.set() + cast(asyncio.Transport, transport).set_write_buffer_limits(0) + + def connection_lost(self, exc: Exception | None) -> None: + if exc: + self.exception = exc + + self.read_event.set() + self.write_event.set() + + def data_received(self, data: bytes) -> None: + # ProactorEventloop sometimes sends bytearray instead of bytes + self.read_queue.append(bytes(data)) + self.read_event.set() + + def eof_received(self) -> bool | None: + self.is_at_eof = True + self.read_event.set() + return True + + def pause_writing(self) -> None: + self.write_event = asyncio.Event() + + def resume_writing(self) -> None: + self.write_event.set() + + +class DatagramProtocol(asyncio.DatagramProtocol): + read_queue: deque[tuple[bytes, IPSockAddrType]] + read_event: asyncio.Event + write_event: asyncio.Event + exception: Exception | None = None + + def connection_made(self, transport: asyncio.BaseTransport) -> None: + self.read_queue = deque(maxlen=100) # arbitrary value + self.read_event = asyncio.Event() + self.write_event = asyncio.Event() + self.write_event.set() + + def connection_lost(self, exc: Exception | None) -> None: + self.read_event.set() + self.write_event.set() + + def datagram_received(self, data: bytes, addr: IPSockAddrType) -> None: + addr = convert_ipv6_sockaddr(addr) + self.read_queue.append((data, addr)) + self.read_event.set() + + def error_received(self, exc: Exception) -> None: + self.exception = exc + + def pause_writing(self) -> None: + self.write_event.clear() + + def resume_writing(self) -> None: + self.write_event.set() + + +class SocketStream(abc.SocketStream): + def __init__(self, transport: asyncio.Transport, protocol: StreamProtocol): + self._transport = transport + self._protocol = protocol + self._receive_guard = ResourceGuard("reading from") + self._send_guard = ResourceGuard("writing to") + self._closed = False + + @property + def _raw_socket(self) -> socket.socket: + return self._transport.get_extra_info("socket") + + async def receive(self, max_bytes: int = 65536) -> bytes: + with self._receive_guard: + if ( + not self._protocol.read_event.is_set() + and not self._transport.is_closing() + and not self._protocol.is_at_eof + ): + self._transport.resume_reading() + await self._protocol.read_event.wait() + self._transport.pause_reading() + else: + await AsyncIOBackend.checkpoint() + + try: + chunk = self._protocol.read_queue.popleft() + except IndexError: + if self._closed: + raise ClosedResourceError from None + elif self._protocol.exception: + raise BrokenResourceError from self._protocol.exception + else: + raise EndOfStream from None + + if len(chunk) > max_bytes: + # Split the oversized chunk + chunk, leftover = chunk[:max_bytes], chunk[max_bytes:] + self._protocol.read_queue.appendleft(leftover) + + # If the read queue is empty, clear the flag so that the next call will + # block until data is available + if not self._protocol.read_queue: + self._protocol.read_event.clear() + + return chunk + + async def send(self, item: bytes) -> None: + with self._send_guard: + await AsyncIOBackend.checkpoint() + + if self._closed: + raise ClosedResourceError + elif self._protocol.exception is not None: + raise BrokenResourceError from self._protocol.exception + + try: + self._transport.write(item) + except RuntimeError as exc: + if self._transport.is_closing(): + raise BrokenResourceError from exc + else: + raise + + await self._protocol.write_event.wait() + + async def send_eof(self) -> None: + try: + self._transport.write_eof() + except OSError: + pass + + async def aclose(self) -> None: + self._closed = True + if not self._transport.is_closing(): + try: + self._transport.write_eof() + except OSError: + pass + + self._transport.close() + await sleep(0) + self._transport.abort() + + +class _RawSocketMixin: + _receive_future: asyncio.Future | None = None + _send_future: asyncio.Future | None = None + _closing = False + + def __init__(self, raw_socket: socket.socket): + self.__raw_socket = raw_socket + self._receive_guard = ResourceGuard("reading from") + self._send_guard = ResourceGuard("writing to") + + @property + def _raw_socket(self) -> socket.socket: + return self.__raw_socket + + def _wait_until_readable(self, loop: asyncio.AbstractEventLoop) -> asyncio.Future: + def callback(f: object) -> None: + del self._receive_future + loop.remove_reader(self.__raw_socket) + + f = self._receive_future = asyncio.Future() + loop.add_reader(self.__raw_socket, f.set_result, None) + f.add_done_callback(callback) + return f + + def _wait_until_writable(self, loop: asyncio.AbstractEventLoop) -> asyncio.Future: + def callback(f: object) -> None: + del self._send_future + loop.remove_writer(self.__raw_socket) + + f = self._send_future = asyncio.Future() + loop.add_writer(self.__raw_socket, f.set_result, None) + f.add_done_callback(callback) + return f + + async def aclose(self) -> None: + if not self._closing: + self._closing = True + if self.__raw_socket.fileno() != -1: + self.__raw_socket.close() + + if self._receive_future: + self._receive_future.set_result(None) + if self._send_future: + self._send_future.set_result(None) + + +class UNIXSocketStream(_RawSocketMixin, abc.UNIXSocketStream): + async def send_eof(self) -> None: + with self._send_guard: + self._raw_socket.shutdown(socket.SHUT_WR) + + async def receive(self, max_bytes: int = 65536) -> bytes: + loop = get_running_loop() + await AsyncIOBackend.checkpoint() + with self._receive_guard: + while True: + try: + data = self._raw_socket.recv(max_bytes) + except BlockingIOError: + await self._wait_until_readable(loop) + except OSError as exc: + if self._closing: + raise ClosedResourceError from None + else: + raise BrokenResourceError from exc + else: + if not data: + raise EndOfStream + + return data + + async def send(self, item: bytes) -> None: + loop = get_running_loop() + await AsyncIOBackend.checkpoint() + with self._send_guard: + view = memoryview(item) + while view: + try: + bytes_sent = self._raw_socket.send(view) + except BlockingIOError: + await self._wait_until_writable(loop) + except OSError as exc: + if self._closing: + raise ClosedResourceError from None + else: + raise BrokenResourceError from exc + else: + view = view[bytes_sent:] + + async def receive_fds(self, msglen: int, maxfds: int) -> tuple[bytes, list[int]]: + if not isinstance(msglen, int) or msglen < 0: + raise ValueError("msglen must be a non-negative integer") + if not isinstance(maxfds, int) or maxfds < 1: + raise ValueError("maxfds must be a positive integer") + + loop = get_running_loop() + fds = array.array("i") + await AsyncIOBackend.checkpoint() + with self._receive_guard: + while True: + try: + message, ancdata, flags, addr = self._raw_socket.recvmsg( + msglen, socket.CMSG_LEN(maxfds * fds.itemsize) + ) + except BlockingIOError: + await self._wait_until_readable(loop) + except OSError as exc: + if self._closing: + raise ClosedResourceError from None + else: + raise BrokenResourceError from exc + else: + if not message and not ancdata: + raise EndOfStream + + break + + for cmsg_level, cmsg_type, cmsg_data in ancdata: + if cmsg_level != socket.SOL_SOCKET or cmsg_type != socket.SCM_RIGHTS: + raise RuntimeError( + f"Received unexpected ancillary data; message = {message!r}, " + f"cmsg_level = {cmsg_level}, cmsg_type = {cmsg_type}" + ) + + fds.frombytes(cmsg_data[: len(cmsg_data) - (len(cmsg_data) % fds.itemsize)]) + + return message, list(fds) + + async def send_fds(self, message: bytes, fds: Collection[int | IOBase]) -> None: + if not message: + raise ValueError("message must not be empty") + if not fds: + raise ValueError("fds must not be empty") + + loop = get_running_loop() + filenos: list[int] = [] + for fd in fds: + if isinstance(fd, int): + filenos.append(fd) + elif isinstance(fd, IOBase): + filenos.append(fd.fileno()) + + fdarray = array.array("i", filenos) + await AsyncIOBackend.checkpoint() + with self._send_guard: + while True: + try: + # The ignore can be removed after mypy picks up + # https://github.com/python/typeshed/pull/5545 + self._raw_socket.sendmsg( + [message], [(socket.SOL_SOCKET, socket.SCM_RIGHTS, fdarray)] + ) + break + except BlockingIOError: + await self._wait_until_writable(loop) + except OSError as exc: + if self._closing: + raise ClosedResourceError from None + else: + raise BrokenResourceError from exc + + +class TCPSocketListener(abc.SocketListener): + _accept_scope: CancelScope | None = None + _closed = False + + def __init__(self, raw_socket: socket.socket): + self.__raw_socket = raw_socket + self._loop = cast(asyncio.BaseEventLoop, get_running_loop()) + self._accept_guard = ResourceGuard("accepting connections from") + + @property + def _raw_socket(self) -> socket.socket: + return self.__raw_socket + + async def accept(self) -> abc.SocketStream: + if self._closed: + raise ClosedResourceError + + with self._accept_guard: + await AsyncIOBackend.checkpoint() + with CancelScope() as self._accept_scope: + try: + client_sock, _addr = await self._loop.sock_accept(self._raw_socket) + except asyncio.CancelledError: + # Workaround for https://bugs.python.org/issue41317 + try: + self._loop.remove_reader(self._raw_socket) + except (ValueError, NotImplementedError): + pass + + if self._closed: + raise ClosedResourceError from None + + raise + finally: + self._accept_scope = None + + client_sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) + transport, protocol = await self._loop.connect_accepted_socket( + StreamProtocol, client_sock + ) + return SocketStream(transport, protocol) + + async def aclose(self) -> None: + if self._closed: + return + + self._closed = True + if self._accept_scope: + # Workaround for https://bugs.python.org/issue41317 + try: + self._loop.remove_reader(self._raw_socket) + except (ValueError, NotImplementedError): + pass + + self._accept_scope.cancel() + await sleep(0) + + self._raw_socket.close() + + +class UNIXSocketListener(abc.SocketListener): + def __init__(self, raw_socket: socket.socket): + self.__raw_socket = raw_socket + self._loop = get_running_loop() + self._accept_guard = ResourceGuard("accepting connections from") + self._closed = False + + async def accept(self) -> abc.SocketStream: + await AsyncIOBackend.checkpoint() + with self._accept_guard: + while True: + try: + client_sock, _ = self.__raw_socket.accept() + client_sock.setblocking(False) + return UNIXSocketStream(client_sock) + except BlockingIOError: + f: asyncio.Future = asyncio.Future() + self._loop.add_reader(self.__raw_socket, f.set_result, None) + f.add_done_callback( + lambda _: self._loop.remove_reader(self.__raw_socket) + ) + await f + except OSError as exc: + if self._closed: + raise ClosedResourceError from None + else: + raise BrokenResourceError from exc + + async def aclose(self) -> None: + self._closed = True + self.__raw_socket.close() + + @property + def _raw_socket(self) -> socket.socket: + return self.__raw_socket + + +class UDPSocket(abc.UDPSocket): + def __init__( + self, transport: asyncio.DatagramTransport, protocol: DatagramProtocol + ): + self._transport = transport + self._protocol = protocol + self._receive_guard = ResourceGuard("reading from") + self._send_guard = ResourceGuard("writing to") + self._closed = False + + @property + def _raw_socket(self) -> socket.socket: + return self._transport.get_extra_info("socket") + + async def aclose(self) -> None: + self._closed = True + if not self._transport.is_closing(): + self._transport.close() + + async def receive(self) -> tuple[bytes, IPSockAddrType]: + with self._receive_guard: + await AsyncIOBackend.checkpoint() + + # If the buffer is empty, ask for more data + if not self._protocol.read_queue and not self._transport.is_closing(): + self._protocol.read_event.clear() + await self._protocol.read_event.wait() + + try: + return self._protocol.read_queue.popleft() + except IndexError: + if self._closed: + raise ClosedResourceError from None + else: + raise BrokenResourceError from None + + async def send(self, item: UDPPacketType) -> None: + with self._send_guard: + await AsyncIOBackend.checkpoint() + await self._protocol.write_event.wait() + if self._closed: + raise ClosedResourceError + elif self._transport.is_closing(): + raise BrokenResourceError + else: + self._transport.sendto(*item) + + +class ConnectedUDPSocket(abc.ConnectedUDPSocket): + def __init__( + self, transport: asyncio.DatagramTransport, protocol: DatagramProtocol + ): + self._transport = transport + self._protocol = protocol + self._receive_guard = ResourceGuard("reading from") + self._send_guard = ResourceGuard("writing to") + self._closed = False + + @property + def _raw_socket(self) -> socket.socket: + return self._transport.get_extra_info("socket") + + async def aclose(self) -> None: + self._closed = True + if not self._transport.is_closing(): + self._transport.close() + + async def receive(self) -> bytes: + with self._receive_guard: + await AsyncIOBackend.checkpoint() + + # If the buffer is empty, ask for more data + if not self._protocol.read_queue and not self._transport.is_closing(): + self._protocol.read_event.clear() + await self._protocol.read_event.wait() + + try: + packet = self._protocol.read_queue.popleft() + except IndexError: + if self._closed: + raise ClosedResourceError from None + else: + raise BrokenResourceError from None + + return packet[0] + + async def send(self, item: bytes) -> None: + with self._send_guard: + await AsyncIOBackend.checkpoint() + await self._protocol.write_event.wait() + if self._closed: + raise ClosedResourceError + elif self._transport.is_closing(): + raise BrokenResourceError + else: + self._transport.sendto(item) + + +class UNIXDatagramSocket(_RawSocketMixin, abc.UNIXDatagramSocket): + async def receive(self) -> UNIXDatagramPacketType: + loop = get_running_loop() + await AsyncIOBackend.checkpoint() + with self._receive_guard: + while True: + try: + data = self._raw_socket.recvfrom(65536) + except BlockingIOError: + await self._wait_until_readable(loop) + except OSError as exc: + if self._closing: + raise ClosedResourceError from None + else: + raise BrokenResourceError from exc + else: + return data + + async def send(self, item: UNIXDatagramPacketType) -> None: + loop = get_running_loop() + await AsyncIOBackend.checkpoint() + with self._send_guard: + while True: + try: + self._raw_socket.sendto(*item) + except BlockingIOError: + await self._wait_until_writable(loop) + except OSError as exc: + if self._closing: + raise ClosedResourceError from None + else: + raise BrokenResourceError from exc + else: + return + + +class ConnectedUNIXDatagramSocket(_RawSocketMixin, abc.ConnectedUNIXDatagramSocket): + async def receive(self) -> bytes: + loop = get_running_loop() + await AsyncIOBackend.checkpoint() + with self._receive_guard: + while True: + try: + data = self._raw_socket.recv(65536) + except BlockingIOError: + await self._wait_until_readable(loop) + except OSError as exc: + if self._closing: + raise ClosedResourceError from None + else: + raise BrokenResourceError from exc + else: + return data + + async def send(self, item: bytes) -> None: + loop = get_running_loop() + await AsyncIOBackend.checkpoint() + with self._send_guard: + while True: + try: + self._raw_socket.send(item) + except BlockingIOError: + await self._wait_until_writable(loop) + except OSError as exc: + if self._closing: + raise ClosedResourceError from None + else: + raise BrokenResourceError from exc + else: + return + + +_read_events: RunVar[dict[int, asyncio.Future[bool]]] = RunVar("read_events") +_write_events: RunVar[dict[int, asyncio.Future[bool]]] = RunVar("write_events") + + +# +# Synchronization +# + + +class Event(BaseEvent): + def __new__(cls) -> Event: + return object.__new__(cls) + + def __init__(self) -> None: + self._event = asyncio.Event() + + def set(self) -> None: + self._event.set() + + def is_set(self) -> bool: + return self._event.is_set() + + async def wait(self) -> None: + if self.is_set(): + await AsyncIOBackend.checkpoint() + else: + await self._event.wait() + + def statistics(self) -> EventStatistics: + return EventStatistics(len(self._event._waiters)) + + +class Lock(BaseLock): + def __new__(cls, *, fast_acquire: bool = False) -> Lock: + return object.__new__(cls) + + def __init__(self, *, fast_acquire: bool = False) -> None: + self._fast_acquire = fast_acquire + self._owner_task: asyncio.Task | None = None + self._waiters: deque[tuple[asyncio.Task, asyncio.Future]] = deque() + + async def acquire(self) -> None: + task = cast(asyncio.Task, current_task()) + if self._owner_task is None and not self._waiters: + await AsyncIOBackend.checkpoint_if_cancelled() + self._owner_task = task + + # Unless on the "fast path", yield control of the event loop so that other + # tasks can run too + if not self._fast_acquire: + try: + await AsyncIOBackend.cancel_shielded_checkpoint() + except CancelledError: + self.release() + raise + + return + + if self._owner_task == task: + raise RuntimeError("Attempted to acquire an already held Lock") + + fut: asyncio.Future[None] = asyncio.Future() + item = task, fut + self._waiters.append(item) + try: + await fut + except CancelledError: + self._waiters.remove(item) + if self._owner_task is task: + self.release() + + raise + + self._waiters.remove(item) + + def acquire_nowait(self) -> None: + task = cast(asyncio.Task, current_task()) + if self._owner_task is None and not self._waiters: + self._owner_task = task + return + + if self._owner_task is task: + raise RuntimeError("Attempted to acquire an already held Lock") + + raise WouldBlock + + def locked(self) -> bool: + return self._owner_task is not None + + def release(self) -> None: + if self._owner_task != current_task(): + raise RuntimeError("The current task is not holding this lock") + + for task, fut in self._waiters: + if not fut.cancelled(): + self._owner_task = task + fut.set_result(None) + return + + self._owner_task = None + + def statistics(self) -> LockStatistics: + task_info = AsyncIOTaskInfo(self._owner_task) if self._owner_task else None + return LockStatistics(self.locked(), task_info, len(self._waiters)) + + +class Semaphore(BaseSemaphore): + def __new__( + cls, + initial_value: int, + *, + max_value: int | None = None, + fast_acquire: bool = False, + ) -> Semaphore: + return object.__new__(cls) + + def __init__( + self, + initial_value: int, + *, + max_value: int | None = None, + fast_acquire: bool = False, + ): + super().__init__(initial_value, max_value=max_value) + self._value = initial_value + self._max_value = max_value + self._fast_acquire = fast_acquire + self._waiters: deque[asyncio.Future[None]] = deque() + + async def acquire(self) -> None: + if self._value > 0 and not self._waiters: + await AsyncIOBackend.checkpoint_if_cancelled() + self._value -= 1 + + # Unless on the "fast path", yield control of the event loop so that other + # tasks can run too + if not self._fast_acquire: + try: + await AsyncIOBackend.cancel_shielded_checkpoint() + except CancelledError: + self.release() + raise + + return + + fut: asyncio.Future[None] = asyncio.Future() + self._waiters.append(fut) + try: + await fut + except CancelledError: + try: + self._waiters.remove(fut) + except ValueError: + self.release() + + raise + + def acquire_nowait(self) -> None: + if self._value == 0: + raise WouldBlock + + self._value -= 1 + + def release(self) -> None: + if self._max_value is not None and self._value == self._max_value: + raise ValueError("semaphore released too many times") + + for fut in self._waiters: + if not fut.cancelled(): + fut.set_result(None) + self._waiters.remove(fut) + return + + self._value += 1 + + @property + def value(self) -> int: + return self._value + + @property + def max_value(self) -> int | None: + return self._max_value + + def statistics(self) -> SemaphoreStatistics: + return SemaphoreStatistics(len(self._waiters)) + + +class CapacityLimiter(BaseCapacityLimiter): + _total_tokens: float = 0 + + def __new__(cls, total_tokens: float) -> CapacityLimiter: + return object.__new__(cls) + + def __init__(self, total_tokens: float): + self._borrowers: set[Any] = set() + self._wait_queue: OrderedDict[Any, asyncio.Event] = OrderedDict() + self.total_tokens = total_tokens + + async def __aenter__(self) -> None: + await self.acquire() + + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + self.release() + + @property + def total_tokens(self) -> float: + return self._total_tokens + + @total_tokens.setter + def total_tokens(self, value: float) -> None: + if not isinstance(value, int) and not math.isinf(value): + raise TypeError("total_tokens must be an int or math.inf") + + if value < 0: + raise ValueError("total_tokens must be >= 0") + + waiters_to_notify = max(value - self._total_tokens, 0) + self._total_tokens = value + + # Notify waiting tasks that they have acquired the limiter + while self._wait_queue and waiters_to_notify: + event = self._wait_queue.popitem(last=False)[1] + event.set() + waiters_to_notify -= 1 + + @property + def borrowed_tokens(self) -> int: + return len(self._borrowers) + + @property + def available_tokens(self) -> float: + return self._total_tokens - len(self._borrowers) + + def _notify_next_waiter(self) -> None: + """Notify the next task in line if this limiter has free capacity now.""" + if self._wait_queue and len(self._borrowers) < self._total_tokens: + event = self._wait_queue.popitem(last=False)[1] + event.set() + + def acquire_nowait(self) -> None: + self.acquire_on_behalf_of_nowait(current_task()) + + def acquire_on_behalf_of_nowait(self, borrower: object) -> None: + if borrower in self._borrowers: + raise RuntimeError( + "this borrower is already holding one of this CapacityLimiter's tokens" + ) + + if self._wait_queue or len(self._borrowers) >= self._total_tokens: + raise WouldBlock + + self._borrowers.add(borrower) + + async def acquire(self) -> None: + return await self.acquire_on_behalf_of(current_task()) + + async def acquire_on_behalf_of(self, borrower: object) -> None: + await AsyncIOBackend.checkpoint_if_cancelled() + try: + self.acquire_on_behalf_of_nowait(borrower) + except WouldBlock: + event = asyncio.Event() + self._wait_queue[borrower] = event + try: + await event.wait() + except BaseException: + self._wait_queue.pop(borrower, None) + if event.is_set(): + self._notify_next_waiter() + + raise + + self._borrowers.add(borrower) + else: + try: + await AsyncIOBackend.cancel_shielded_checkpoint() + except BaseException: + self.release() + raise + + def release(self) -> None: + self.release_on_behalf_of(current_task()) + + def release_on_behalf_of(self, borrower: object) -> None: + try: + self._borrowers.remove(borrower) + except KeyError: + raise RuntimeError( + "this borrower isn't holding any of this CapacityLimiter's tokens" + ) from None + + self._notify_next_waiter() + + def statistics(self) -> CapacityLimiterStatistics: + return CapacityLimiterStatistics( + self.borrowed_tokens, + self.total_tokens, + tuple(self._borrowers), + len(self._wait_queue), + ) + + +_default_thread_limiter: RunVar[CapacityLimiter] = RunVar("_default_thread_limiter") + + +# +# Operating system signals +# + + +class _SignalReceiver: + def __init__(self, signals: tuple[Signals, ...]): + self._signals = signals + self._loop = get_running_loop() + self._signal_queue: deque[Signals] = deque() + self._future: asyncio.Future = asyncio.Future() + self._handled_signals: set[Signals] = set() + + def _deliver(self, signum: Signals) -> None: + self._signal_queue.append(signum) + if not self._future.done(): + self._future.set_result(None) + + def __enter__(self) -> _SignalReceiver: + for sig in set(self._signals): + self._loop.add_signal_handler(sig, self._deliver, sig) + self._handled_signals.add(sig) + + return self + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + for sig in self._handled_signals: + self._loop.remove_signal_handler(sig) + + def __aiter__(self) -> _SignalReceiver: + return self + + async def __anext__(self) -> Signals: + await AsyncIOBackend.checkpoint() + if not self._signal_queue: + self._future = asyncio.Future() + await self._future + + return self._signal_queue.popleft() + + +# +# Testing and debugging +# + + +class AsyncIOTaskInfo(TaskInfo): + def __init__(self, task: asyncio.Task): + task_state = _task_states.get(task) + if task_state is None: + parent_id = None + else: + parent_id = task_state.parent_id + + coro = task.get_coro() + assert coro is not None, "created TaskInfo from a completed Task" + super().__init__(id(task), parent_id, task.get_name(), coro) + self._task = weakref.ref(task) + + def has_pending_cancellation(self) -> bool: + if not (task := self._task()): + # If the task isn't around anymore, it won't have a pending cancellation + return False + + if task._must_cancel: # type: ignore[attr-defined] + return True + elif ( + isinstance(task._fut_waiter, asyncio.Future) # type: ignore[attr-defined] + and task._fut_waiter.cancelled() # type: ignore[attr-defined] + ): + return True + + if task_state := _task_states.get(task): + if cancel_scope := task_state.cancel_scope: + return cancel_scope._effectively_cancelled + + return False + + +class TestRunner(abc.TestRunner): + _send_stream: MemoryObjectSendStream[tuple[Awaitable[Any], asyncio.Future[Any]]] + + def __init__( + self, + *, + debug: bool | None = None, + use_uvloop: bool = False, + loop_factory: Callable[[], AbstractEventLoop] | None = None, + ) -> None: + if use_uvloop and loop_factory is None: + if sys.platform != "win32": + import uvloop + + loop_factory = uvloop.new_event_loop + else: + import winloop + + loop_factory = winloop.new_event_loop + + self._runner = Runner(debug=debug, loop_factory=loop_factory) + self._exceptions: list[BaseException] = [] + self._runner_task: asyncio.Task | None = None + + def __enter__(self) -> TestRunner: + self._runner.__enter__() + self.get_loop().set_exception_handler(self._exception_handler) + return self + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + self._runner.__exit__(exc_type, exc_val, exc_tb) + + def get_loop(self) -> AbstractEventLoop: + return self._runner.get_loop() + + def _exception_handler( + self, loop: asyncio.AbstractEventLoop, context: dict[str, Any] + ) -> None: + if isinstance(context.get("exception"), Exception): + self._exceptions.append(context["exception"]) + else: + loop.default_exception_handler(context) + + def _raise_async_exceptions(self) -> None: + # Re-raise any exceptions raised in asynchronous callbacks + if self._exceptions: + exceptions, self._exceptions = self._exceptions, [] + if len(exceptions) == 1: + raise exceptions[0] + elif exceptions: + raise BaseExceptionGroup( + "Multiple exceptions occurred in asynchronous callbacks", exceptions + ) + + async def _run_tests_and_fixtures( + self, + receive_stream: MemoryObjectReceiveStream[ + tuple[Awaitable[T_Retval], asyncio.Future[T_Retval]] + ], + ) -> None: + from _pytest.outcomes import OutcomeException + + with receive_stream, self._send_stream: + async for coro, future in receive_stream: + try: + retval = await coro + except CancelledError as exc: + if not future.cancelled(): + future.cancel(*exc.args) + + raise + except BaseException as exc: + if not future.cancelled(): + future.set_exception(exc) + + if not isinstance(exc, (Exception, OutcomeException)): + raise + else: + if not future.cancelled(): + future.set_result(retval) + + async def _call_in_runner_task( + self, + func: Callable[P, Awaitable[T_Retval]], + /, + *args: P.args, + **kwargs: P.kwargs, + ) -> T_Retval: + if not self._runner_task: + self._send_stream, receive_stream = create_memory_object_stream[ + tuple[Awaitable[Any], asyncio.Future] + ](1) + self._runner_task = self.get_loop().create_task( + self._run_tests_and_fixtures(receive_stream) + ) + + coro = func(*args, **kwargs) + future: asyncio.Future[T_Retval] = self.get_loop().create_future() + self._send_stream.send_nowait((coro, future)) + return await future + + def run_asyncgen_fixture( + self, + fixture_func: Callable[..., AsyncGenerator[T_Retval, Any]], + kwargs: dict[str, Any], + ) -> Iterable[T_Retval]: + asyncgen = fixture_func(**kwargs) + fixturevalue: T_Retval = self.get_loop().run_until_complete( + self._call_in_runner_task(asyncgen.asend, None) + ) + self._raise_async_exceptions() + + yield fixturevalue + + try: + self.get_loop().run_until_complete( + self._call_in_runner_task(asyncgen.asend, None) + ) + except StopAsyncIteration: + self._raise_async_exceptions() + else: + self.get_loop().run_until_complete(asyncgen.aclose()) + raise RuntimeError("Async generator fixture did not stop") + + def run_fixture( + self, + fixture_func: Callable[..., Coroutine[Any, Any, T_Retval]], + kwargs: dict[str, Any], + ) -> T_Retval: + retval = self.get_loop().run_until_complete( + self._call_in_runner_task(fixture_func, **kwargs) + ) + self._raise_async_exceptions() + return retval + + def run_test( + self, test_func: Callable[..., Coroutine[Any, Any, Any]], kwargs: dict[str, Any] + ) -> None: + try: + self.get_loop().run_until_complete( + self._call_in_runner_task(test_func, **kwargs) + ) + except Exception as exc: + self._exceptions.append(exc) + + self._raise_async_exceptions() + + +class AsyncIOBackend(AsyncBackend): + @classmethod + def run( + cls, + func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]], + args: tuple[Unpack[PosArgsT]], + kwargs: dict[str, Any], + options: dict[str, Any], + ) -> T_Retval: + @wraps(func) + async def wrapper() -> T_Retval: + task = cast(asyncio.Task, current_task()) + task.set_name(get_callable_name(func)) + _task_states[task] = TaskState(None, None) + + try: + return await func(*args) + finally: + del _task_states[task] + + debug = options.get("debug", None) + loop_factory = options.get("loop_factory", None) + if loop_factory is None and options.get("use_uvloop", False): + if sys.platform != "win32": + import uvloop + + loop_factory = uvloop.new_event_loop + else: + import winloop + + loop_factory = winloop.new_event_loop + + with Runner(debug=debug, loop_factory=loop_factory) as runner: + return runner.run(wrapper()) + + @classmethod + def current_token(cls) -> object: + return get_running_loop() + + @classmethod + def current_time(cls) -> float: + return get_running_loop().time() + + @classmethod + def cancelled_exception_class(cls) -> type[BaseException]: + return CancelledError + + @classmethod + async def checkpoint(cls) -> None: + await sleep(0) + + @classmethod + async def checkpoint_if_cancelled(cls) -> None: + task = current_task() + if task is None: + return + + try: + cancel_scope = _task_states[task].cancel_scope + except KeyError: + return + + while cancel_scope: + if cancel_scope.cancel_called: + await sleep(0) + elif cancel_scope.shield: + break + else: + cancel_scope = cancel_scope._parent_scope + + @classmethod + async def cancel_shielded_checkpoint(cls) -> None: + with CancelScope(shield=True): + await sleep(0) + + @classmethod + async def sleep(cls, delay: float) -> None: + await sleep(delay) + + @classmethod + def create_cancel_scope( + cls, *, deadline: float = math.inf, shield: bool = False + ) -> CancelScope: + return CancelScope(deadline=deadline, shield=shield) + + @classmethod + def current_effective_deadline(cls) -> float: + if (task := current_task()) is None: + return math.inf + + try: + cancel_scope = _task_states[task].cancel_scope + except KeyError: + return math.inf + + deadline = math.inf + while cancel_scope: + deadline = min(deadline, cancel_scope.deadline) + if cancel_scope._cancel_called: + deadline = -math.inf + break + elif cancel_scope.shield: + break + else: + cancel_scope = cancel_scope._parent_scope + + return deadline + + @classmethod + def create_task_group(cls) -> abc.TaskGroup: + return TaskGroup() + + @classmethod + def create_event(cls) -> abc.Event: + return Event() + + @classmethod + def create_lock(cls, *, fast_acquire: bool) -> abc.Lock: + return Lock(fast_acquire=fast_acquire) + + @classmethod + def create_semaphore( + cls, + initial_value: int, + *, + max_value: int | None = None, + fast_acquire: bool = False, + ) -> abc.Semaphore: + return Semaphore(initial_value, max_value=max_value, fast_acquire=fast_acquire) + + @classmethod + def create_capacity_limiter(cls, total_tokens: float) -> abc.CapacityLimiter: + return CapacityLimiter(total_tokens) + + @classmethod + async def run_sync_in_worker_thread( # type: ignore[return] + cls, + func: Callable[[Unpack[PosArgsT]], T_Retval], + args: tuple[Unpack[PosArgsT]], + abandon_on_cancel: bool = False, + limiter: abc.CapacityLimiter | None = None, + ) -> T_Retval: + await cls.checkpoint() + + # If this is the first run in this event loop thread, set up the necessary + # variables + try: + idle_workers = _threadpool_idle_workers.get() + workers = _threadpool_workers.get() + except LookupError: + idle_workers = deque() + workers = set() + _threadpool_idle_workers.set(idle_workers) + _threadpool_workers.set(workers) + + async with limiter or cls.current_default_thread_limiter(): + with CancelScope(shield=not abandon_on_cancel) as scope: + future = asyncio.Future[T_Retval]() + root_task = find_root_task() + if not idle_workers: + worker = WorkerThread(root_task, workers, idle_workers) + worker.start() + workers.add(worker) + root_task.add_done_callback( + worker.stop, context=contextvars.Context() + ) + else: + worker = idle_workers.pop() + + # Prune any other workers that have been idle for MAX_IDLE_TIME + # seconds or longer + now = cls.current_time() + while idle_workers: + if ( + now - idle_workers[0].idle_since + < WorkerThread.MAX_IDLE_TIME + ): + break + + expired_worker = idle_workers.popleft() + expired_worker.root_task.remove_done_callback( + expired_worker.stop + ) + expired_worker.stop() + + context = copy_context() + context.run(set_current_async_library, None) + if abandon_on_cancel or scope._parent_scope is None: + worker_scope = scope + else: + worker_scope = scope._parent_scope + + worker.queue.put_nowait((context, func, args, future, worker_scope)) + return await future + + @classmethod + def check_cancelled(cls) -> None: + scope: CancelScope | None = threadlocals.current_cancel_scope + while scope is not None: + if scope.cancel_called: + raise CancelledError(f"Cancelled by cancel scope {id(scope):x}") + + if scope.shield: + return + + scope = scope._parent_scope + + @classmethod + def run_async_from_thread( + cls, + func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]], + args: tuple[Unpack[PosArgsT]], + token: object, + ) -> T_Retval: + async def task_wrapper() -> T_Retval: + __tracebackhide__ = True + if scope is not None: + task = cast(asyncio.Task, current_task()) + _task_states[task] = TaskState(None, scope) + scope._tasks.add(task) + try: + return await func(*args) + except CancelledError as exc: + raise concurrent.futures.CancelledError(str(exc)) from None + finally: + if scope is not None: + scope._tasks.discard(task) + + loop = cast( + "AbstractEventLoop", token or threadlocals.current_token.native_token + ) + if loop.is_closed(): + raise RunFinishedError + + context = copy_context() + context.run(set_current_async_library, "asyncio") + scope = getattr(threadlocals, "current_cancel_scope", None) + f: concurrent.futures.Future[T_Retval] = context.run( + asyncio.run_coroutine_threadsafe, task_wrapper(), loop=loop + ) + return f.result() + + @classmethod + def run_sync_from_thread( + cls, + func: Callable[[Unpack[PosArgsT]], T_Retval], + args: tuple[Unpack[PosArgsT]], + token: object, + ) -> T_Retval: + @wraps(func) + def wrapper() -> None: + try: + set_current_async_library("asyncio") + f.set_result(func(*args)) + except BaseException as exc: + f.set_exception(exc) + if not isinstance(exc, Exception): + raise + + loop = cast( + "AbstractEventLoop", token or threadlocals.current_token.native_token + ) + if loop.is_closed(): + raise RunFinishedError + + f: concurrent.futures.Future[T_Retval] = Future() + loop.call_soon_threadsafe(wrapper) + return f.result() + + @classmethod + async def open_process( + cls, + command: StrOrBytesPath | Sequence[StrOrBytesPath], + *, + stdin: int | IO[Any] | None, + stdout: int | IO[Any] | None, + stderr: int | IO[Any] | None, + **kwargs: Any, + ) -> Process: + await cls.checkpoint() + if isinstance(command, PathLike): + command = os.fspath(command) + + if isinstance(command, (str, bytes)): + process = await asyncio.create_subprocess_shell( + command, + stdin=stdin, + stdout=stdout, + stderr=stderr, + **kwargs, + ) + else: + process = await asyncio.create_subprocess_exec( + *command, + stdin=stdin, + stdout=stdout, + stderr=stderr, + **kwargs, + ) + + stdin_stream = StreamWriterWrapper(process.stdin) if process.stdin else None + stdout_stream = StreamReaderWrapper(process.stdout) if process.stdout else None + stderr_stream = StreamReaderWrapper(process.stderr) if process.stderr else None + return Process(process, stdin_stream, stdout_stream, stderr_stream) + + @classmethod + def setup_process_pool_exit_at_shutdown(cls, workers: set[abc.Process]) -> None: + create_task( + _shutdown_process_pool_on_exit(workers), + name="AnyIO process pool shutdown task", + ) + find_root_task().add_done_callback( + partial(_forcibly_shutdown_process_pool_on_exit, workers) # type:ignore[arg-type] + ) + + @classmethod + async def connect_tcp( + cls, host: str, port: int, local_address: IPSockAddrType | None = None + ) -> abc.SocketStream: + transport, protocol = cast( + tuple[asyncio.Transport, StreamProtocol], + await get_running_loop().create_connection( + StreamProtocol, host, port, local_addr=local_address + ), + ) + transport.pause_reading() + return SocketStream(transport, protocol) + + @classmethod + async def connect_unix(cls, path: str | bytes) -> abc.UNIXSocketStream: + await cls.checkpoint() + loop = get_running_loop() + raw_socket = socket.socket(socket.AF_UNIX) + raw_socket.setblocking(False) + while True: + try: + raw_socket.connect(path) + except BlockingIOError: + f: asyncio.Future = asyncio.Future() + loop.add_writer(raw_socket, f.set_result, None) + f.add_done_callback(lambda _: loop.remove_writer(raw_socket)) + await f + except BaseException: + raw_socket.close() + raise + else: + return UNIXSocketStream(raw_socket) + + @classmethod + def create_tcp_listener(cls, sock: socket.socket) -> SocketListener: + return TCPSocketListener(sock) + + @classmethod + def create_unix_listener(cls, sock: socket.socket) -> SocketListener: + return UNIXSocketListener(sock) + + @classmethod + async def create_udp_socket( + cls, + family: AddressFamily, + local_address: IPSockAddrType | None, + remote_address: IPSockAddrType | None, + reuse_port: bool, + ) -> UDPSocket | ConnectedUDPSocket: + transport, protocol = await get_running_loop().create_datagram_endpoint( + DatagramProtocol, + local_addr=local_address, + remote_addr=remote_address, + family=family, + reuse_port=reuse_port, + ) + if protocol.exception: + transport.close() + raise protocol.exception + + if not remote_address: + return UDPSocket(transport, protocol) + else: + return ConnectedUDPSocket(transport, protocol) + + @classmethod + async def create_unix_datagram_socket( # type: ignore[override] + cls, raw_socket: socket.socket, remote_path: str | bytes | None + ) -> abc.UNIXDatagramSocket | abc.ConnectedUNIXDatagramSocket: + await cls.checkpoint() + loop = get_running_loop() + + if remote_path: + while True: + try: + raw_socket.connect(remote_path) + except BlockingIOError: + f: asyncio.Future = asyncio.Future() + loop.add_writer(raw_socket, f.set_result, None) + f.add_done_callback(lambda _: loop.remove_writer(raw_socket)) + await f + except BaseException: + raw_socket.close() + raise + else: + return ConnectedUNIXDatagramSocket(raw_socket) + else: + return UNIXDatagramSocket(raw_socket) + + @classmethod + async def getaddrinfo( + cls, + host: bytes | str | None, + port: str | int | None, + *, + family: int | AddressFamily = 0, + type: int | SocketKind = 0, + proto: int = 0, + flags: int = 0, + ) -> Sequence[ + tuple[ + AddressFamily, + SocketKind, + int, + str, + tuple[str, int] | tuple[str, int, int, int] | tuple[int, bytes], + ] + ]: + return await get_running_loop().getaddrinfo( + host, port, family=family, type=type, proto=proto, flags=flags + ) + + @classmethod + async def getnameinfo( + cls, sockaddr: IPSockAddrType, flags: int = 0 + ) -> tuple[str, str]: + return await get_running_loop().getnameinfo(sockaddr, flags) + + @classmethod + async def wait_readable(cls, obj: FileDescriptorLike) -> None: + try: + read_events = _read_events.get() + except LookupError: + read_events = {} + _read_events.set(read_events) + + fd = obj if isinstance(obj, int) else obj.fileno() + if read_events.get(fd): + raise BusyResourceError("reading from") + + loop = get_running_loop() + fut: asyncio.Future[bool] = loop.create_future() + + def cb() -> None: + try: + del read_events[fd] + except KeyError: + pass + else: + remove_reader(fd) + + try: + fut.set_result(True) + except asyncio.InvalidStateError: + pass + + try: + loop.add_reader(fd, cb) + except NotImplementedError: + from anyio._core._asyncio_selector_thread import get_selector + + selector = get_selector() + selector.add_reader(fd, cb) + remove_reader = selector.remove_reader + else: + remove_reader = loop.remove_reader + + read_events[fd] = fut + try: + success = await fut + finally: + try: + del read_events[fd] + except KeyError: + pass + else: + remove_reader(fd) + + if not success: + raise ClosedResourceError + + @classmethod + async def wait_writable(cls, obj: FileDescriptorLike) -> None: + try: + write_events = _write_events.get() + except LookupError: + write_events = {} + _write_events.set(write_events) + + fd = obj if isinstance(obj, int) else obj.fileno() + if write_events.get(fd): + raise BusyResourceError("writing to") + + loop = get_running_loop() + fut: asyncio.Future[bool] = loop.create_future() + + def cb() -> None: + try: + del write_events[fd] + except KeyError: + pass + else: + remove_writer(fd) + + try: + fut.set_result(True) + except asyncio.InvalidStateError: + pass + + try: + loop.add_writer(fd, cb) + except NotImplementedError: + from anyio._core._asyncio_selector_thread import get_selector + + selector = get_selector() + selector.add_writer(fd, cb) + remove_writer = selector.remove_writer + else: + remove_writer = loop.remove_writer + + write_events[fd] = fut + try: + success = await fut + finally: + try: + del write_events[fd] + except KeyError: + pass + else: + remove_writer(fd) + + if not success: + raise ClosedResourceError + + @classmethod + def notify_closing(cls, obj: FileDescriptorLike) -> None: + fd = obj if isinstance(obj, int) else obj.fileno() + loop = get_running_loop() + + try: + write_events = _write_events.get() + except LookupError: + pass + else: + try: + fut = write_events.pop(fd) + except KeyError: + pass + else: + try: + fut.set_result(False) + except asyncio.InvalidStateError: + pass + + try: + loop.remove_writer(fd) + except NotImplementedError: + from anyio._core._asyncio_selector_thread import get_selector + + get_selector().remove_writer(fd) + + try: + read_events = _read_events.get() + except LookupError: + pass + else: + try: + fut = read_events.pop(fd) + except KeyError: + pass + else: + try: + fut.set_result(False) + except asyncio.InvalidStateError: + pass + + try: + loop.remove_reader(fd) + except NotImplementedError: + from anyio._core._asyncio_selector_thread import get_selector + + get_selector().remove_reader(fd) + + @classmethod + async def wrap_listener_socket(cls, sock: socket.socket) -> SocketListener: + return TCPSocketListener(sock) + + @classmethod + async def wrap_stream_socket(cls, sock: socket.socket) -> SocketStream: + transport, protocol = await get_running_loop().create_connection( + StreamProtocol, sock=sock + ) + return SocketStream(transport, protocol) + + @classmethod + async def wrap_unix_stream_socket(cls, sock: socket.socket) -> UNIXSocketStream: + return UNIXSocketStream(sock) + + @classmethod + async def wrap_udp_socket(cls, sock: socket.socket) -> UDPSocket: + transport, protocol = await get_running_loop().create_datagram_endpoint( + DatagramProtocol, sock=sock + ) + return UDPSocket(transport, protocol) + + @classmethod + async def wrap_connected_udp_socket(cls, sock: socket.socket) -> ConnectedUDPSocket: + transport, protocol = await get_running_loop().create_datagram_endpoint( + DatagramProtocol, sock=sock + ) + return ConnectedUDPSocket(transport, protocol) + + @classmethod + async def wrap_unix_datagram_socket(cls, sock: socket.socket) -> UNIXDatagramSocket: + return UNIXDatagramSocket(sock) + + @classmethod + async def wrap_connected_unix_datagram_socket( + cls, sock: socket.socket + ) -> ConnectedUNIXDatagramSocket: + return ConnectedUNIXDatagramSocket(sock) + + @classmethod + def current_default_thread_limiter(cls) -> CapacityLimiter: + try: + return _default_thread_limiter.get() + except LookupError: + limiter = CapacityLimiter(40) + _default_thread_limiter.set(limiter) + return limiter + + @classmethod + def open_signal_receiver( + cls, *signals: Signals + ) -> AbstractContextManager[AsyncIterator[Signals]]: + return _SignalReceiver(signals) + + @classmethod + def get_current_task(cls) -> TaskInfo: + return AsyncIOTaskInfo(current_task()) # type: ignore[arg-type] + + @classmethod + def get_running_tasks(cls) -> Sequence[TaskInfo]: + return [AsyncIOTaskInfo(task) for task in all_tasks() if not task.done()] + + @classmethod + async def wait_all_tasks_blocked(cls) -> None: + await cls.checkpoint() + this_task = current_task() + while True: + for task in all_tasks(): + if task is this_task: + continue + + waiter = task._fut_waiter # type: ignore[attr-defined] + if waiter is None or waiter.done(): + await sleep(0.1) + break + else: + return + + @classmethod + def create_test_runner(cls, options: dict[str, Any]) -> TestRunner: + return TestRunner(**options) + + +backend_class = AsyncIOBackend diff --git a/.venv/lib/python3.10/site-packages/anyio/_backends/_trio.py b/.venv/lib/python3.10/site-packages/anyio/_backends/_trio.py new file mode 100644 index 0000000..b85a10a --- /dev/null +++ b/.venv/lib/python3.10/site-packages/anyio/_backends/_trio.py @@ -0,0 +1,1343 @@ +from __future__ import annotations + +import array +import math +import os +import socket +import sys +import types +import weakref +from collections.abc import ( + AsyncGenerator, + AsyncIterator, + Awaitable, + Callable, + Collection, + Coroutine, + Iterable, + Sequence, +) +from contextlib import AbstractContextManager +from dataclasses import dataclass +from io import IOBase +from os import PathLike +from signal import Signals +from socket import AddressFamily, SocketKind +from types import TracebackType +from typing import ( + IO, + TYPE_CHECKING, + Any, + Generic, + NoReturn, + ParamSpec, + TypeVar, + cast, + overload, +) + +import trio.from_thread +import trio.lowlevel +from outcome import Error, Outcome, Value +from trio.lowlevel import ( + current_root_task, + current_task, + notify_closing, + wait_readable, + wait_writable, +) +from trio.socket import SocketType as TrioSocketType +from trio.to_thread import run_sync + +from .. import ( + CapacityLimiterStatistics, + EventStatistics, + LockStatistics, + RunFinishedError, + TaskInfo, + WouldBlock, + abc, +) +from .._core._eventloop import claim_worker_thread +from .._core._exceptions import ( + BrokenResourceError, + BusyResourceError, + ClosedResourceError, + EndOfStream, +) +from .._core._sockets import convert_ipv6_sockaddr +from .._core._streams import create_memory_object_stream +from .._core._synchronization import ( + CapacityLimiter as BaseCapacityLimiter, +) +from .._core._synchronization import Event as BaseEvent +from .._core._synchronization import Lock as BaseLock +from .._core._synchronization import ( + ResourceGuard, + SemaphoreStatistics, +) +from .._core._synchronization import Semaphore as BaseSemaphore +from .._core._tasks import CancelScope as BaseCancelScope +from ..abc import IPSockAddrType, UDPPacketType, UNIXDatagramPacketType +from ..abc._eventloop import AsyncBackend, StrOrBytesPath +from ..streams.memory import MemoryObjectSendStream + +if TYPE_CHECKING: + from _typeshed import FileDescriptorLike + +if sys.version_info >= (3, 11): + from typing import TypeVarTuple, Unpack +else: + from exceptiongroup import BaseExceptionGroup + from typing_extensions import TypeVarTuple, Unpack + +T = TypeVar("T") +T_Retval = TypeVar("T_Retval") +T_SockAddr = TypeVar("T_SockAddr", str, IPSockAddrType) +PosArgsT = TypeVarTuple("PosArgsT") +P = ParamSpec("P") + + +# +# Event loop +# + +RunVar = trio.lowlevel.RunVar + + +# +# Timeouts and cancellation +# + + +class CancelScope(BaseCancelScope): + def __new__( + cls, original: trio.CancelScope | None = None, **kwargs: object + ) -> CancelScope: + return object.__new__(cls) + + def __init__(self, original: trio.CancelScope | None = None, **kwargs: Any) -> None: + self.__original = original or trio.CancelScope(**kwargs) + + def __enter__(self) -> CancelScope: + self.__original.__enter__() + return self + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> bool: + return self.__original.__exit__(exc_type, exc_val, exc_tb) + + def cancel(self, reason: str | None = None) -> None: + self.__original.cancel(reason) + + @property + def deadline(self) -> float: + return self.__original.deadline + + @deadline.setter + def deadline(self, value: float) -> None: + self.__original.deadline = value + + @property + def cancel_called(self) -> bool: + return self.__original.cancel_called + + @property + def cancelled_caught(self) -> bool: + return self.__original.cancelled_caught + + @property + def shield(self) -> bool: + return self.__original.shield + + @shield.setter + def shield(self, value: bool) -> None: + self.__original.shield = value + + +# +# Task groups +# + + +class TaskGroup(abc.TaskGroup): + def __init__(self) -> None: + self._active = False + self._nursery_manager = trio.open_nursery(strict_exception_groups=True) + self.cancel_scope = None # type: ignore[assignment] + + async def __aenter__(self) -> TaskGroup: + self._active = True + self._nursery = await self._nursery_manager.__aenter__() + self.cancel_scope = CancelScope(self._nursery.cancel_scope) + return self + + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> bool: + try: + # trio.Nursery.__exit__ returns bool; .open_nursery has wrong type + return await self._nursery_manager.__aexit__(exc_type, exc_val, exc_tb) # type: ignore[return-value] + except BaseExceptionGroup as exc: + if not exc.split(trio.Cancelled)[1]: + raise trio.Cancelled._create() from exc + + raise + finally: + del exc_val, exc_tb + self._active = False + + def start_soon( + self, + func: Callable[[Unpack[PosArgsT]], Awaitable[Any]], + *args: Unpack[PosArgsT], + name: object = None, + ) -> None: + if not self._active: + raise RuntimeError( + "This task group is not active; no new tasks can be started." + ) + + self._nursery.start_soon(func, *args, name=name) + + async def start( + self, func: Callable[..., Awaitable[Any]], *args: object, name: object = None + ) -> Any: + if not self._active: + raise RuntimeError( + "This task group is not active; no new tasks can be started." + ) + + return await self._nursery.start(func, *args, name=name) + + +# +# Subprocesses +# + + +@dataclass(eq=False) +class ReceiveStreamWrapper(abc.ByteReceiveStream): + _stream: trio.abc.ReceiveStream + + async def receive(self, max_bytes: int | None = None) -> bytes: + try: + data = await self._stream.receive_some(max_bytes) + except trio.ClosedResourceError as exc: + raise ClosedResourceError from exc.__cause__ + except trio.BrokenResourceError as exc: + raise BrokenResourceError from exc.__cause__ + + if data: + return bytes(data) + else: + raise EndOfStream + + async def aclose(self) -> None: + await self._stream.aclose() + + +@dataclass(eq=False) +class SendStreamWrapper(abc.ByteSendStream): + _stream: trio.abc.SendStream + + async def send(self, item: bytes) -> None: + try: + await self._stream.send_all(item) + except trio.ClosedResourceError as exc: + raise ClosedResourceError from exc.__cause__ + except trio.BrokenResourceError as exc: + raise BrokenResourceError from exc.__cause__ + + async def aclose(self) -> None: + await self._stream.aclose() + + +@dataclass(eq=False) +class Process(abc.Process): + _process: trio.Process + _stdin: abc.ByteSendStream | None + _stdout: abc.ByteReceiveStream | None + _stderr: abc.ByteReceiveStream | None + + async def aclose(self) -> None: + with CancelScope(shield=True): + if self._stdin: + await self._stdin.aclose() + if self._stdout: + await self._stdout.aclose() + if self._stderr: + await self._stderr.aclose() + + try: + await self.wait() + except BaseException: + self.kill() + with CancelScope(shield=True): + await self.wait() + raise + + async def wait(self) -> int: + return await self._process.wait() + + def terminate(self) -> None: + self._process.terminate() + + def kill(self) -> None: + self._process.kill() + + def send_signal(self, signal: Signals) -> None: + self._process.send_signal(signal) + + @property + def pid(self) -> int: + return self._process.pid + + @property + def returncode(self) -> int | None: + return self._process.returncode + + @property + def stdin(self) -> abc.ByteSendStream | None: + return self._stdin + + @property + def stdout(self) -> abc.ByteReceiveStream | None: + return self._stdout + + @property + def stderr(self) -> abc.ByteReceiveStream | None: + return self._stderr + + +class _ProcessPoolShutdownInstrument(trio.abc.Instrument): + def after_run(self) -> None: + super().after_run() + + +current_default_worker_process_limiter: trio.lowlevel.RunVar = RunVar( + "current_default_worker_process_limiter" +) + + +async def _shutdown_process_pool(workers: set[abc.Process]) -> None: + try: + await trio.sleep(math.inf) + except trio.Cancelled: + for process in workers: + if process.returncode is None: + process.kill() + + with CancelScope(shield=True): + for process in workers: + await process.aclose() + + +# +# Sockets and networking +# + + +class _TrioSocketMixin(Generic[T_SockAddr]): + def __init__(self, trio_socket: TrioSocketType) -> None: + self._trio_socket = trio_socket + self._closed = False + + def _check_closed(self) -> None: + if self._closed: + raise ClosedResourceError + if self._trio_socket.fileno() < 0: + raise BrokenResourceError + + @property + def _raw_socket(self) -> socket.socket: + return self._trio_socket._sock # type: ignore[attr-defined] + + async def aclose(self) -> None: + if self._trio_socket.fileno() >= 0: + self._closed = True + self._trio_socket.close() + + def _convert_socket_error(self, exc: BaseException) -> NoReturn: + if isinstance(exc, trio.ClosedResourceError): + raise ClosedResourceError from exc + elif self._trio_socket.fileno() < 0 and self._closed: + raise ClosedResourceError from None + elif isinstance(exc, OSError): + raise BrokenResourceError from exc + else: + raise exc + + +class SocketStream(_TrioSocketMixin, abc.SocketStream): + def __init__(self, trio_socket: TrioSocketType) -> None: + super().__init__(trio_socket) + self._receive_guard = ResourceGuard("reading from") + self._send_guard = ResourceGuard("writing to") + + async def receive(self, max_bytes: int = 65536) -> bytes: + with self._receive_guard: + try: + data = await self._trio_socket.recv(max_bytes) + except BaseException as exc: + self._convert_socket_error(exc) + + if data: + return data + else: + raise EndOfStream + + async def send(self, item: bytes) -> None: + with self._send_guard: + view = memoryview(item) + while view: + try: + bytes_sent = await self._trio_socket.send(view) + except BaseException as exc: + self._convert_socket_error(exc) + + view = view[bytes_sent:] + + async def send_eof(self) -> None: + self._trio_socket.shutdown(socket.SHUT_WR) + + +class UNIXSocketStream(SocketStream, abc.UNIXSocketStream): + async def receive_fds(self, msglen: int, maxfds: int) -> tuple[bytes, list[int]]: + if not isinstance(msglen, int) or msglen < 0: + raise ValueError("msglen must be a non-negative integer") + if not isinstance(maxfds, int) or maxfds < 1: + raise ValueError("maxfds must be a positive integer") + + fds = array.array("i") + await trio.lowlevel.checkpoint() + with self._receive_guard: + while True: + try: + message, ancdata, flags, addr = await self._trio_socket.recvmsg( + msglen, socket.CMSG_LEN(maxfds * fds.itemsize) + ) + except BaseException as exc: + self._convert_socket_error(exc) + else: + if not message and not ancdata: + raise EndOfStream + + break + + for cmsg_level, cmsg_type, cmsg_data in ancdata: + if cmsg_level != socket.SOL_SOCKET or cmsg_type != socket.SCM_RIGHTS: + raise RuntimeError( + f"Received unexpected ancillary data; message = {message!r}, " + f"cmsg_level = {cmsg_level}, cmsg_type = {cmsg_type}" + ) + + fds.frombytes(cmsg_data[: len(cmsg_data) - (len(cmsg_data) % fds.itemsize)]) + + return message, list(fds) + + async def send_fds(self, message: bytes, fds: Collection[int | IOBase]) -> None: + if not message: + raise ValueError("message must not be empty") + if not fds: + raise ValueError("fds must not be empty") + + filenos: list[int] = [] + for fd in fds: + if isinstance(fd, int): + filenos.append(fd) + elif isinstance(fd, IOBase): + filenos.append(fd.fileno()) + + fdarray = array.array("i", filenos) + await trio.lowlevel.checkpoint() + with self._send_guard: + while True: + try: + await self._trio_socket.sendmsg( + [message], + [ + ( + socket.SOL_SOCKET, + socket.SCM_RIGHTS, + fdarray, + ) + ], + ) + break + except BaseException as exc: + self._convert_socket_error(exc) + + +class TCPSocketListener(_TrioSocketMixin, abc.SocketListener): + def __init__(self, raw_socket: socket.socket): + super().__init__(trio.socket.from_stdlib_socket(raw_socket)) + self._accept_guard = ResourceGuard("accepting connections from") + + async def accept(self) -> SocketStream: + with self._accept_guard: + try: + trio_socket, _addr = await self._trio_socket.accept() + except BaseException as exc: + self._convert_socket_error(exc) + + trio_socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) + return SocketStream(trio_socket) + + +class UNIXSocketListener(_TrioSocketMixin, abc.SocketListener): + def __init__(self, raw_socket: socket.socket): + super().__init__(trio.socket.from_stdlib_socket(raw_socket)) + self._accept_guard = ResourceGuard("accepting connections from") + + async def accept(self) -> UNIXSocketStream: + with self._accept_guard: + try: + trio_socket, _addr = await self._trio_socket.accept() + except BaseException as exc: + self._convert_socket_error(exc) + + return UNIXSocketStream(trio_socket) + + +class UDPSocket(_TrioSocketMixin[IPSockAddrType], abc.UDPSocket): + def __init__(self, trio_socket: TrioSocketType) -> None: + super().__init__(trio_socket) + self._receive_guard = ResourceGuard("reading from") + self._send_guard = ResourceGuard("writing to") + + async def receive(self) -> tuple[bytes, IPSockAddrType]: + with self._receive_guard: + try: + data, addr = await self._trio_socket.recvfrom(65536) + return data, convert_ipv6_sockaddr(addr) + except BaseException as exc: + self._convert_socket_error(exc) + + async def send(self, item: UDPPacketType) -> None: + with self._send_guard: + try: + await self._trio_socket.sendto(*item) + except BaseException as exc: + self._convert_socket_error(exc) + + +class ConnectedUDPSocket(_TrioSocketMixin[IPSockAddrType], abc.ConnectedUDPSocket): + def __init__(self, trio_socket: TrioSocketType) -> None: + super().__init__(trio_socket) + self._receive_guard = ResourceGuard("reading from") + self._send_guard = ResourceGuard("writing to") + + async def receive(self) -> bytes: + with self._receive_guard: + try: + return await self._trio_socket.recv(65536) + except BaseException as exc: + self._convert_socket_error(exc) + + async def send(self, item: bytes) -> None: + with self._send_guard: + try: + await self._trio_socket.send(item) + except BaseException as exc: + self._convert_socket_error(exc) + + +class UNIXDatagramSocket(_TrioSocketMixin[str], abc.UNIXDatagramSocket): + def __init__(self, trio_socket: TrioSocketType) -> None: + super().__init__(trio_socket) + self._receive_guard = ResourceGuard("reading from") + self._send_guard = ResourceGuard("writing to") + + async def receive(self) -> UNIXDatagramPacketType: + with self._receive_guard: + try: + data, addr = await self._trio_socket.recvfrom(65536) + return data, addr + except BaseException as exc: + self._convert_socket_error(exc) + + async def send(self, item: UNIXDatagramPacketType) -> None: + with self._send_guard: + try: + await self._trio_socket.sendto(*item) + except BaseException as exc: + self._convert_socket_error(exc) + + +class ConnectedUNIXDatagramSocket( + _TrioSocketMixin[str], abc.ConnectedUNIXDatagramSocket +): + def __init__(self, trio_socket: TrioSocketType) -> None: + super().__init__(trio_socket) + self._receive_guard = ResourceGuard("reading from") + self._send_guard = ResourceGuard("writing to") + + async def receive(self) -> bytes: + with self._receive_guard: + try: + return await self._trio_socket.recv(65536) + except BaseException as exc: + self._convert_socket_error(exc) + + async def send(self, item: bytes) -> None: + with self._send_guard: + try: + await self._trio_socket.send(item) + except BaseException as exc: + self._convert_socket_error(exc) + + +# +# Synchronization +# + + +class Event(BaseEvent): + def __new__(cls) -> Event: + return object.__new__(cls) + + def __init__(self) -> None: + self.__original = trio.Event() + + def is_set(self) -> bool: + return self.__original.is_set() + + async def wait(self) -> None: + return await self.__original.wait() + + def statistics(self) -> EventStatistics: + orig_statistics = self.__original.statistics() + return EventStatistics(tasks_waiting=orig_statistics.tasks_waiting) + + def set(self) -> None: + self.__original.set() + + +class Lock(BaseLock): + def __new__(cls, *, fast_acquire: bool = False) -> Lock: + return object.__new__(cls) + + def __init__(self, *, fast_acquire: bool = False) -> None: + self._fast_acquire = fast_acquire + self.__original = trio.Lock() + + @staticmethod + def _convert_runtime_error_msg(exc: RuntimeError) -> None: + if exc.args == ("attempt to re-acquire an already held Lock",): + exc.args = ("Attempted to acquire an already held Lock",) + + async def acquire(self) -> None: + if not self._fast_acquire: + try: + await self.__original.acquire() + except RuntimeError as exc: + self._convert_runtime_error_msg(exc) + raise + + return + + # This is the "fast path" where we don't let other tasks run + await trio.lowlevel.checkpoint_if_cancelled() + try: + self.__original.acquire_nowait() + except trio.WouldBlock: + await self.__original._lot.park() + except RuntimeError as exc: + self._convert_runtime_error_msg(exc) + raise + + def acquire_nowait(self) -> None: + try: + self.__original.acquire_nowait() + except trio.WouldBlock: + raise WouldBlock from None + except RuntimeError as exc: + self._convert_runtime_error_msg(exc) + raise + + def locked(self) -> bool: + return self.__original.locked() + + def release(self) -> None: + self.__original.release() + + def statistics(self) -> LockStatistics: + orig_statistics = self.__original.statistics() + owner = TrioTaskInfo(orig_statistics.owner) if orig_statistics.owner else None + return LockStatistics( + orig_statistics.locked, owner, orig_statistics.tasks_waiting + ) + + +class Semaphore(BaseSemaphore): + def __new__( + cls, + initial_value: int, + *, + max_value: int | None = None, + fast_acquire: bool = False, + ) -> Semaphore: + return object.__new__(cls) + + def __init__( + self, + initial_value: int, + *, + max_value: int | None = None, + fast_acquire: bool = False, + ) -> None: + super().__init__(initial_value, max_value=max_value, fast_acquire=fast_acquire) + self.__original = trio.Semaphore(initial_value, max_value=max_value) + + async def acquire(self) -> None: + if not self._fast_acquire: + await self.__original.acquire() + return + + # This is the "fast path" where we don't let other tasks run + await trio.lowlevel.checkpoint_if_cancelled() + try: + self.__original.acquire_nowait() + except trio.WouldBlock: + await self.__original._lot.park() + + def acquire_nowait(self) -> None: + try: + self.__original.acquire_nowait() + except trio.WouldBlock: + raise WouldBlock from None + + @property + def max_value(self) -> int | None: + return self.__original.max_value + + @property + def value(self) -> int: + return self.__original.value + + def release(self) -> None: + self.__original.release() + + def statistics(self) -> SemaphoreStatistics: + orig_statistics = self.__original.statistics() + return SemaphoreStatistics(orig_statistics.tasks_waiting) + + +class CapacityLimiter(BaseCapacityLimiter): + def __new__( + cls, + total_tokens: float | None = None, + *, + original: trio.CapacityLimiter | None = None, + ) -> CapacityLimiter: + return object.__new__(cls) + + def __init__( + self, + total_tokens: float | None = None, + *, + original: trio.CapacityLimiter | None = None, + ) -> None: + if original is not None: + self.__original = original + else: + assert total_tokens is not None + self.__original = trio.CapacityLimiter(total_tokens) + + async def __aenter__(self) -> None: + return await self.__original.__aenter__() + + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + await self.__original.__aexit__(exc_type, exc_val, exc_tb) + + @property + def total_tokens(self) -> float: + return self.__original.total_tokens + + @total_tokens.setter + def total_tokens(self, value: float) -> None: + self.__original.total_tokens = value + + @property + def borrowed_tokens(self) -> int: + return self.__original.borrowed_tokens + + @property + def available_tokens(self) -> float: + return self.__original.available_tokens + + def acquire_nowait(self) -> None: + self.__original.acquire_nowait() + + def acquire_on_behalf_of_nowait(self, borrower: object) -> None: + self.__original.acquire_on_behalf_of_nowait(borrower) + + async def acquire(self) -> None: + await self.__original.acquire() + + async def acquire_on_behalf_of(self, borrower: object) -> None: + await self.__original.acquire_on_behalf_of(borrower) + + def release(self) -> None: + return self.__original.release() + + def release_on_behalf_of(self, borrower: object) -> None: + return self.__original.release_on_behalf_of(borrower) + + def statistics(self) -> CapacityLimiterStatistics: + orig = self.__original.statistics() + return CapacityLimiterStatistics( + borrowed_tokens=orig.borrowed_tokens, + total_tokens=orig.total_tokens, + borrowers=tuple(orig.borrowers), + tasks_waiting=orig.tasks_waiting, + ) + + +_capacity_limiter_wrapper: trio.lowlevel.RunVar = RunVar("_capacity_limiter_wrapper") + + +# +# Signal handling +# + + +class _SignalReceiver: + _iterator: AsyncIterator[int] + + def __init__(self, signals: tuple[Signals, ...]): + self._signals = signals + + def __enter__(self) -> _SignalReceiver: + self._cm = trio.open_signal_receiver(*self._signals) + self._iterator = self._cm.__enter__() + return self + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> bool | None: + return self._cm.__exit__(exc_type, exc_val, exc_tb) + + def __aiter__(self) -> _SignalReceiver: + return self + + async def __anext__(self) -> Signals: + signum = await self._iterator.__anext__() + return Signals(signum) + + +# +# Testing and debugging +# + + +class TestRunner(abc.TestRunner): + def __init__(self, **options: Any) -> None: + from queue import Queue + + self._call_queue: Queue[Callable[[], object]] = Queue() + self._send_stream: MemoryObjectSendStream | None = None + self._options = options + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: types.TracebackType | None, + ) -> None: + if self._send_stream: + self._send_stream.close() + while self._send_stream is not None: + self._call_queue.get()() + + async def _run_tests_and_fixtures(self) -> None: + self._send_stream, receive_stream = create_memory_object_stream(1) + with receive_stream: + async for coro, outcome_holder in receive_stream: + try: + retval = await coro + except BaseException as exc: + outcome_holder.append(Error(exc)) + else: + outcome_holder.append(Value(retval)) + + def _main_task_finished(self, outcome: object) -> None: + self._send_stream = None + + def _call_in_runner_task( + self, + func: Callable[P, Awaitable[T_Retval]], + /, + *args: P.args, + **kwargs: P.kwargs, + ) -> T_Retval: + if self._send_stream is None: + trio.lowlevel.start_guest_run( + self._run_tests_and_fixtures, + run_sync_soon_threadsafe=self._call_queue.put, + done_callback=self._main_task_finished, + **self._options, + ) + while self._send_stream is None: + self._call_queue.get()() + + outcome_holder: list[Outcome] = [] + self._send_stream.send_nowait((func(*args, **kwargs), outcome_holder)) + while not outcome_holder: + self._call_queue.get()() + + return outcome_holder[0].unwrap() + + def run_asyncgen_fixture( + self, + fixture_func: Callable[..., AsyncGenerator[T_Retval, Any]], + kwargs: dict[str, Any], + ) -> Iterable[T_Retval]: + asyncgen = fixture_func(**kwargs) + fixturevalue: T_Retval = self._call_in_runner_task(asyncgen.asend, None) + + yield fixturevalue + + try: + self._call_in_runner_task(asyncgen.asend, None) + except StopAsyncIteration: + pass + else: + self._call_in_runner_task(asyncgen.aclose) + raise RuntimeError("Async generator fixture did not stop") + + def run_fixture( + self, + fixture_func: Callable[..., Coroutine[Any, Any, T_Retval]], + kwargs: dict[str, Any], + ) -> T_Retval: + return self._call_in_runner_task(fixture_func, **kwargs) + + def run_test( + self, test_func: Callable[..., Coroutine[Any, Any, Any]], kwargs: dict[str, Any] + ) -> None: + self._call_in_runner_task(test_func, **kwargs) + + +class TrioTaskInfo(TaskInfo): + def __init__(self, task: trio.lowlevel.Task): + parent_id = None + if task.parent_nursery and task.parent_nursery.parent_task: + parent_id = id(task.parent_nursery.parent_task) + + super().__init__(id(task), parent_id, task.name, task.coro) + self._task = weakref.proxy(task) + + def has_pending_cancellation(self) -> bool: + try: + return self._task._cancel_status.effectively_cancelled + except ReferenceError: + # If the task is no longer around, it surely doesn't have a cancellation + # pending + return False + + +class TrioBackend(AsyncBackend): + @classmethod + def run( + cls, + func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]], + args: tuple[Unpack[PosArgsT]], + kwargs: dict[str, Any], + options: dict[str, Any], + ) -> T_Retval: + return trio.run(func, *args) + + @classmethod + def current_token(cls) -> object: + return trio.lowlevel.current_trio_token() + + @classmethod + def current_time(cls) -> float: + return trio.current_time() + + @classmethod + def cancelled_exception_class(cls) -> type[BaseException]: + return trio.Cancelled + + @classmethod + async def checkpoint(cls) -> None: + await trio.lowlevel.checkpoint() + + @classmethod + async def checkpoint_if_cancelled(cls) -> None: + await trio.lowlevel.checkpoint_if_cancelled() + + @classmethod + async def cancel_shielded_checkpoint(cls) -> None: + await trio.lowlevel.cancel_shielded_checkpoint() + + @classmethod + async def sleep(cls, delay: float) -> None: + await trio.sleep(delay) + + @classmethod + def create_cancel_scope( + cls, *, deadline: float = math.inf, shield: bool = False + ) -> abc.CancelScope: + return CancelScope(deadline=deadline, shield=shield) + + @classmethod + def current_effective_deadline(cls) -> float: + return trio.current_effective_deadline() + + @classmethod + def create_task_group(cls) -> abc.TaskGroup: + return TaskGroup() + + @classmethod + def create_event(cls) -> abc.Event: + return Event() + + @classmethod + def create_lock(cls, *, fast_acquire: bool) -> Lock: + return Lock(fast_acquire=fast_acquire) + + @classmethod + def create_semaphore( + cls, + initial_value: int, + *, + max_value: int | None = None, + fast_acquire: bool = False, + ) -> abc.Semaphore: + return Semaphore(initial_value, max_value=max_value, fast_acquire=fast_acquire) + + @classmethod + def create_capacity_limiter(cls, total_tokens: float) -> CapacityLimiter: + return CapacityLimiter(total_tokens) + + @classmethod + async def run_sync_in_worker_thread( + cls, + func: Callable[[Unpack[PosArgsT]], T_Retval], + args: tuple[Unpack[PosArgsT]], + abandon_on_cancel: bool = False, + limiter: abc.CapacityLimiter | None = None, + ) -> T_Retval: + def wrapper() -> T_Retval: + with claim_worker_thread(TrioBackend, token): + return func(*args) + + token = TrioBackend.current_token() + return await run_sync( + wrapper, + abandon_on_cancel=abandon_on_cancel, + limiter=cast(trio.CapacityLimiter, limiter), + ) + + @classmethod + def check_cancelled(cls) -> None: + trio.from_thread.check_cancelled() + + @classmethod + def run_async_from_thread( + cls, + func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]], + args: tuple[Unpack[PosArgsT]], + token: object, + ) -> T_Retval: + trio_token = cast("trio.lowlevel.TrioToken | None", token) + try: + return trio.from_thread.run(func, *args, trio_token=trio_token) + except trio.RunFinishedError: + raise RunFinishedError from None + + @classmethod + def run_sync_from_thread( + cls, + func: Callable[[Unpack[PosArgsT]], T_Retval], + args: tuple[Unpack[PosArgsT]], + token: object, + ) -> T_Retval: + trio_token = cast("trio.lowlevel.TrioToken | None", token) + try: + return trio.from_thread.run_sync(func, *args, trio_token=trio_token) + except trio.RunFinishedError: + raise RunFinishedError from None + + @classmethod + async def open_process( + cls, + command: StrOrBytesPath | Sequence[StrOrBytesPath], + *, + stdin: int | IO[Any] | None, + stdout: int | IO[Any] | None, + stderr: int | IO[Any] | None, + **kwargs: Any, + ) -> Process: + def convert_item(item: StrOrBytesPath) -> str: + str_or_bytes = os.fspath(item) + if isinstance(str_or_bytes, str): + return str_or_bytes + else: + return os.fsdecode(str_or_bytes) + + if isinstance(command, (str, bytes, PathLike)): + process = await trio.lowlevel.open_process( + convert_item(command), + stdin=stdin, + stdout=stdout, + stderr=stderr, + shell=True, + **kwargs, + ) + else: + process = await trio.lowlevel.open_process( + [convert_item(item) for item in command], + stdin=stdin, + stdout=stdout, + stderr=stderr, + shell=False, + **kwargs, + ) + + stdin_stream = SendStreamWrapper(process.stdin) if process.stdin else None + stdout_stream = ReceiveStreamWrapper(process.stdout) if process.stdout else None + stderr_stream = ReceiveStreamWrapper(process.stderr) if process.stderr else None + return Process(process, stdin_stream, stdout_stream, stderr_stream) + + @classmethod + def setup_process_pool_exit_at_shutdown(cls, workers: set[abc.Process]) -> None: + trio.lowlevel.spawn_system_task(_shutdown_process_pool, workers) + + @classmethod + async def connect_tcp( + cls, host: str, port: int, local_address: IPSockAddrType | None = None + ) -> SocketStream: + family = socket.AF_INET6 if ":" in host else socket.AF_INET + trio_socket = trio.socket.socket(family) + trio_socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) + if local_address: + await trio_socket.bind(local_address) + + try: + await trio_socket.connect((host, port)) + except BaseException: + trio_socket.close() + raise + + return SocketStream(trio_socket) + + @classmethod + async def connect_unix(cls, path: str | bytes) -> abc.UNIXSocketStream: + trio_socket = trio.socket.socket(socket.AF_UNIX) + try: + await trio_socket.connect(path) + except BaseException: + trio_socket.close() + raise + + return UNIXSocketStream(trio_socket) + + @classmethod + def create_tcp_listener(cls, sock: socket.socket) -> abc.SocketListener: + return TCPSocketListener(sock) + + @classmethod + def create_unix_listener(cls, sock: socket.socket) -> abc.SocketListener: + return UNIXSocketListener(sock) + + @classmethod + async def create_udp_socket( + cls, + family: socket.AddressFamily, + local_address: IPSockAddrType | None, + remote_address: IPSockAddrType | None, + reuse_port: bool, + ) -> UDPSocket | ConnectedUDPSocket: + trio_socket = trio.socket.socket(family=family, type=socket.SOCK_DGRAM) + + if reuse_port: + trio_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) + + if local_address: + await trio_socket.bind(local_address) + + if remote_address: + await trio_socket.connect(remote_address) + return ConnectedUDPSocket(trio_socket) + else: + return UDPSocket(trio_socket) + + @classmethod + @overload + async def create_unix_datagram_socket( + cls, raw_socket: socket.socket, remote_path: None + ) -> abc.UNIXDatagramSocket: ... + + @classmethod + @overload + async def create_unix_datagram_socket( + cls, raw_socket: socket.socket, remote_path: str | bytes + ) -> abc.ConnectedUNIXDatagramSocket: ... + + @classmethod + async def create_unix_datagram_socket( + cls, raw_socket: socket.socket, remote_path: str | bytes | None + ) -> abc.UNIXDatagramSocket | abc.ConnectedUNIXDatagramSocket: + trio_socket = trio.socket.from_stdlib_socket(raw_socket) + + if remote_path: + await trio_socket.connect(remote_path) + return ConnectedUNIXDatagramSocket(trio_socket) + else: + return UNIXDatagramSocket(trio_socket) + + @classmethod + async def getaddrinfo( + cls, + host: bytes | str | None, + port: str | int | None, + *, + family: int | AddressFamily = 0, + type: int | SocketKind = 0, + proto: int = 0, + flags: int = 0, + ) -> Sequence[ + tuple[ + AddressFamily, + SocketKind, + int, + str, + tuple[str, int] | tuple[str, int, int, int] | tuple[int, bytes], + ] + ]: + return await trio.socket.getaddrinfo(host, port, family, type, proto, flags) + + @classmethod + async def getnameinfo( + cls, sockaddr: IPSockAddrType, flags: int = 0 + ) -> tuple[str, str]: + return await trio.socket.getnameinfo(sockaddr, flags) + + @classmethod + async def wait_readable(cls, obj: FileDescriptorLike) -> None: + try: + await wait_readable(obj) + except trio.ClosedResourceError as exc: + raise ClosedResourceError().with_traceback(exc.__traceback__) from None + except trio.BusyResourceError: + raise BusyResourceError("reading from") from None + + @classmethod + async def wait_writable(cls, obj: FileDescriptorLike) -> None: + try: + await wait_writable(obj) + except trio.ClosedResourceError as exc: + raise ClosedResourceError().with_traceback(exc.__traceback__) from None + except trio.BusyResourceError: + raise BusyResourceError("writing to") from None + + @classmethod + def notify_closing(cls, obj: FileDescriptorLike) -> None: + notify_closing(obj) + + @classmethod + async def wrap_listener_socket(cls, sock: socket.socket) -> abc.SocketListener: + return TCPSocketListener(sock) + + @classmethod + async def wrap_stream_socket(cls, sock: socket.socket) -> SocketStream: + trio_sock = trio.socket.from_stdlib_socket(sock) + return SocketStream(trio_sock) + + @classmethod + async def wrap_unix_stream_socket(cls, sock: socket.socket) -> UNIXSocketStream: + trio_sock = trio.socket.from_stdlib_socket(sock) + return UNIXSocketStream(trio_sock) + + @classmethod + async def wrap_udp_socket(cls, sock: socket.socket) -> UDPSocket: + trio_sock = trio.socket.from_stdlib_socket(sock) + return UDPSocket(trio_sock) + + @classmethod + async def wrap_connected_udp_socket(cls, sock: socket.socket) -> ConnectedUDPSocket: + trio_sock = trio.socket.from_stdlib_socket(sock) + return ConnectedUDPSocket(trio_sock) + + @classmethod + async def wrap_unix_datagram_socket(cls, sock: socket.socket) -> UNIXDatagramSocket: + trio_sock = trio.socket.from_stdlib_socket(sock) + return UNIXDatagramSocket(trio_sock) + + @classmethod + async def wrap_connected_unix_datagram_socket( + cls, sock: socket.socket + ) -> ConnectedUNIXDatagramSocket: + trio_sock = trio.socket.from_stdlib_socket(sock) + return ConnectedUNIXDatagramSocket(trio_sock) + + @classmethod + def current_default_thread_limiter(cls) -> CapacityLimiter: + try: + return _capacity_limiter_wrapper.get() + except LookupError: + limiter = CapacityLimiter( + original=trio.to_thread.current_default_thread_limiter() + ) + _capacity_limiter_wrapper.set(limiter) + return limiter + + @classmethod + def open_signal_receiver( + cls, *signals: Signals + ) -> AbstractContextManager[AsyncIterator[Signals]]: + return _SignalReceiver(signals) + + @classmethod + def get_current_task(cls) -> TaskInfo: + task = current_task() + return TrioTaskInfo(task) + + @classmethod + def get_running_tasks(cls) -> Sequence[TaskInfo]: + root_task = current_root_task() + assert root_task + task_infos = [TrioTaskInfo(root_task)] + nurseries = root_task.child_nurseries + while nurseries: + new_nurseries: list[trio.Nursery] = [] + for nursery in nurseries: + for task in nursery.child_tasks: + task_infos.append(TrioTaskInfo(task)) + new_nurseries.extend(task.child_nurseries) + + nurseries = new_nurseries + + return task_infos + + @classmethod + async def wait_all_tasks_blocked(cls) -> None: + from trio.testing import wait_all_tasks_blocked + + await wait_all_tasks_blocked() + + @classmethod + def create_test_runner(cls, options: dict[str, Any]) -> TestRunner: + return TestRunner(**options) + + +backend_class = TrioBackend diff --git a/.venv/lib/python3.10/site-packages/anyio/_core/__init__.py b/.venv/lib/python3.10/site-packages/anyio/_core/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/.venv/lib/python3.10/site-packages/anyio/_core/__pycache__/__init__.cpython-310.pyc b/.venv/lib/python3.10/site-packages/anyio/_core/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d66f08eb04edcf412ad72b27425cfa370418a606 GIT binary patch literal 176 zcmd1j<>g`k0+T0)GC}lX5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;x_;enx(7s(xyU zenC-wR%&udv3_xBQd)k6zFt{sUYUMQW|DqEWl2VUp0S>xfqrpjNvdu^Vsdt3dTOzL tVqRrtzJ7dieo?A^e0*kJW=VX!UP0w84x8Nkl+v73JCJ3?OhAH#0RW%+E8GA8 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/anyio/_core/__pycache__/_asyncio_selector_thread.cpython-310.pyc b/.venv/lib/python3.10/site-packages/anyio/_core/__pycache__/_asyncio_selector_thread.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..58508b6ee87032861e4eef198e51ca8653dc2a93 GIT binary patch literal 4106 zcmb7HOLH5?5uSZuu~>otNs+Ro$SF9H6C<_-yW}`8$+1LIGA$WYiIh}=t!ynZ3lY#_ zmzo`r1`4dCEFW@7`Ic+IBX9W)`5ALfEy$UZtbAwv5lVYufOR{ zrl&oI>!W}Dqy2n=v42wM=w+evDPuSE0C@$e0Cn|NzjWYW7Xl9Q!X1N*6 z@qBoSyO-Gw#tYp0mT~W?*_h`gUgXo?+KmNnuCZ$Qd$PD{sHq^16B)>M5~p?a-Nhh^ zf{iGwTFP6#w_IQM?<`+kQd60H|IW(#vMMiyt)LglwJ-{sG7(i%O|L(=z3eZ3w!Cd7X=L?VukWTYAAbEJ> z3_lBLil2jPeyrSyg~}13?1@;}WN6bkVj9UVo<$1u-yulWF@~&Ta)XVhiBO%VpX9Y0dex)zlsda=s;*@SSgPEc|vC)26C>~||@3zb8h zW3F6Zgw3$M9jd7`lp7KLoHTmq(BfoEDsOG|mcO>TcyoDO71mb$JB#_170~t0^>oeRXO1*3}0pzq+<8L?VGqIs?fz%oj73XAEX10K7PP?cWlBIMS0(-S94+> zYg8^pP^Fk9c?L1aoZ|;F{JJeEI5OE1KgF!}OV<31x>Ypq;YrDl9;_ae4(!u9UvJzW z@CHX(_%Jau5XQkoGL_66<;D_H1bug$67InYCzCh}9LzhT!X6Xve-0LXYJ3AS0F15r z`ryh0x|LM6qo}eOq?O4ALtbftgev@ih0;pU0xT-&W>4~DC$4(pC$Li$eK29W)u#Zq z#2Yk})0oNpXLpizoT1z6#S``746Vx}S^RGBYX7~96(8V9Por^6*YI$cbZaB(rs2Lg z;!z!kmppnvHSa*jfG7n1K20q~K4D2ohwoLu zG!L5u+R2rJK)MOU&;ATSYJ}`s1CS(PWQg7E+Mu-s?9J}KmF-Q><%WiIq%*XJX3K0F zM3kVrH+LAu>`s20iFc*T4Z=vahDN1xnJ{OL3PS^ZPde8ajb}7Fnj$1>M49!$$8xis zp2STBLqS9g*guA@M4+o_v07C5F$<^}f&|zx2D$lBg51)?sFCtG1SQ-I`N$^idX|Zv{i0-pfXu3*u91h{6x4D%&op55--Yp*^42R5q*ZjUvD+lgo^7C`fe27)AesQ8r;}{%Aju3$vZ2|*Nq?2uY}XQ1^m5X^k} zaqy{rdPe+{g`QHmWVuLd+b;gsHV3B<0)Ona*E&etfG+VFn%9_r7`p@W#R|Ri8Z)!7 zNLq0V&C3R53yu*Z{RfebJ_r8;f&80pqcuk69$R7$H@`A>ja_qSbo8m%19S#u%;Vr8 z@)VT^)BnXJ##BQ+afhbNf67E1dR&=5i&}2i+O=_{fl4|aMRSlJTBE6< zoe{FG#EShdj%tC9Y3SI}I;M~4D7{+86BlSJ_LGT@C$6>xI~4eASesB)o6R5wWqpEW z4CCPVLK&m-bnGP?o$Q3NQFLvKOK_5=nhaStsY^7X=83lbG)dxd)shCSP!;d=V%hFy zTqJZzzrbo#6c^}Cf?$@AS4ko&IuTxR3S-~kNhysTeTt(HlLo`L}6IS5H%rsOCzk2y;q|+<|RwDj}k(3huu31F7lVzaurQ?x zlmAIGsOD(BLo<%-Z{gq&c^V<-;M);HVY(TP%Mbe&ZRj4&>*KcU`$s--VTRr&nfj_= kDfe;)gHNbz(sg=?xv1D&Aafpvrfn7t7f;Dze=L>%2i&)=Y5)KL literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/anyio/_core/__pycache__/_contextmanagers.cpython-310.pyc b/.venv/lib/python3.10/site-packages/anyio/_core/__pycache__/_contextmanagers.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..854d64504c7901d43419f047ac5f09741ba5c833 GIT binary patch literal 6983 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 TK&;3`r6jMUR@72v;luv`P3EPc literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/anyio/_core/__pycache__/_eventloop.cpython-310.pyc b/.venv/lib/python3.10/site-packages/anyio/_core/__pycache__/_eventloop.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2139d44b078fd7df089ae53752850f9ca23e504a GIT binary patch literal 6337 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 Ae*gdg literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/anyio/_core/__pycache__/_exceptions.cpython-310.pyc b/.venv/lib/python3.10/site-packages/anyio/_core/__pycache__/_exceptions.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7d9120e03ad14def373e5899a3d55279515d33b7 GIT binary patch literal 6044 zcmcIo&2JmW72jDdDT<j**cViq)n=(sV&EL-4;qU1EgAT|^^d>#Z_gXX--#IgSs<<(22)p=VQ_=9z-Y5NWAtnWX5Ga9T###9bxV&~ zLB3t67xZ&Jm}(d6MP>+deVP|G40#!=r-D*@rar@rI|eWE=`RgFEy@pa^;ys*J_CA2 z({rH9d=~VqrjLN0<3~Ur(R2lLh0lYY*YrH-qkIAMf;b9(3;YT{$xnT0)sJE3G(Urx zGkWDqpwIGipwDUgIOv!8dC=!IeFC)2FMz%vPJ+`Z(68`|pfBqA)1WW$S3$oj&S3s5 z=-2pV(3drRj+^(5YV`@pvC7gJHw>fLjr}N8E1;+Eh)_s3jwFZz7hHrfo^m(BZqJ_C$wXz9XZg;}O%*AJn21^t6HpVbmEnpcGcm=}qL)g=HCSi140J zQ6fEYOUg+09+qtU?zz4a+}>Ifp&iSvAFkSQWG714t}XlP?Rd?N?KM}~O@U=ngj`6x zl!S?Ln}M)-BIqr#9Sa${foANvV500RqPAKCFNK$E6-(i^@v#W}J3>g!l>5qy!ccgz z;MJObd1cQ^i;fezZQ(d+$#L2dPXc-_JI?2c8}w(U9EV4qS}*9I6aCjb+uL@IQ&gm;A65$vh6_nRLMZFNgpA#?*%(cG$YHYwnop9G;jwj^5Ng zThBcNIuiZRc$C{U!zo&^p6i^Yv0XE^9vI)|cg)AY&K?l@d8&VtkFK9 z)p{CpHkz74S1>JBX2;o_SvE_oXCI=E+TdGh0s2W~nC9TX9)Zo^M{+8nK|W0V5)Zw? zjs>ERjQu7A)~v3@c3;0E%3YdVU7ga>N=rgYAWtW7yXo{0U*#zrA_c7A zq!1vPIz%5!zf(2k8Bp>#b!VyDm+mVduc9duvkBRj*&H*UnK_dcnf1)f7ye}xtbg{- zA1-PAJ$!@Is%;R@FVpjRbl5W)ft;m|G$@ZyM_-fl?R2)Ub58`pK<|2cdZXF`j$s|W zph#au!(wy!<7G*shdTIE;yvczg;59BE}e&_rqcQ4M0Ll*%c|DXSa{ir?ATQsKq`rN zF$^|{3EXbUs14w3BX zgG6B%n{EaO#e7_IOJhnKs_D5ofv5S@Rt^s=pzO>tkZsmY9Tk}&pzLC&RFw%u*NowV&R zX*U5AQOj=PZ8e$}1ID&|K1Le4_eb;=V%6L4)IExLTZu54}~y! z1!APAc=aPBG5gH7ke9>4GxoOIjwpr4ik2@`Z1)P;K4q2O?#Hkn=|If~lbXgZP>81lDgy%XcA9J;_>KSO)I;V*$(2W{W*rzDL{SkOVk zKlKqR0DdDz^4Uyc@#`qsNIF^R{-;q(ny4Pf-$TW@>7!n+p*ojtqhIMmh^s(76h!n9 z3Y^(jG-GIZ1W-`7hY|3m4MAW$cvPW=?s#+bQM#o$(^Z+h{0>Bx0#;;Z47hD@gUNEvZ4MOA}K70j*Di**$0x+R87lw%vKcx83FJJokt=2@m zrco_JI;1RuGE-<{@X9`~ezv1?9ISBzg;iPEO9n!sT58lN%XTuRR6sYdAAZSNFngj4(d_FUCrz{+0zZE;hUjS zh?-E!L7c7JOTybIiPf6mnREO_e`Vif{`<2Ju3WT~HCL@QoF(#nBt}`d*Z7CKhrsuI zx_!yc3fB2sH1vUQfVZq0!gR(Nx!5_UFWGfDUlT7HA<&5Be*LGx#V?pX&F+A{dRVh zD#=pyiAPc&o&Qi`oEG2BZZF?spcKikY!pqpBq*~I{#SC9Dg0fmlqy!Kh<>(GsLWx+ HI#&8OmE`iF literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/anyio/_core/__pycache__/_fileio.cpython-310.pyc b/.venv/lib/python3.10/site-packages/anyio/_core/__pycache__/_fileio.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6ff7b9ebd2947cba9f6af199b4067d4c4ce17d4c GIT binary patch literal 27614 zcmbt-3z%F-b!Ok&x1ZA*jYhIwmgTl(%Nk>kB)`D2Fp_1TW)qftUm!e9NMHj57D#eQ0)Y)#ZOF2T!iF6~wEutV z-rKhyGm^}Vr*v*T&N+4JRMn|->R#8EEXl_3bKU>=e0ise#eTqt=uZ+4J7O`b@vIe# zshF}Vv8q+DEW&ohF4*#Kybzavoq~gZg;X_NNLMq3Of_4`N*kxrSIrf2 z0w*dG}~@SL!8o$~Jswn)PCHT)QO&8iwin-9~*{3p3e! z>T0^;?wgr%ha9i}-YK_s3lQoVhCO?m3SA4u56Tc*dxTtfq1A4zV5t~1*@70|rjja!k#W>+)u(cR5*U%&MKc_XNlM+J2Gla-r_~-c zsFnlDs5{kNYPDK}vCRU$TV15q1MXAzsEbt|HF9c1U8*(!TB7b%8`Twn`T=cHLx7gL z1L{8Y3U$>pq_7N6uT{grle%ARAuRcO)wSw6sWpgN`=E>dlX@LA4{%{nJ)je3wmm7J}nEX*)nrh@r`9`x;QzfmUwe!fzPwD!R zvT{*}IP+t=?ABCeCJ(J>P<8Y5v3zsf6})5hN~M0ZTsxdURH=_n5~#Y(@w#f{Hys^! zwVN*;DV0U5^Yt2=n+& zQEHiACUCTEQ%~1MOJRA#btnC*O}A3ue zmyVXo&3qj*yGYubhKGlTP@W&#CgNgk{`mS+*Lli2U#@jlV5KRIf!o9iL(k`(+9=HD(Z5ZoQ-thrbb8{Xd7No(Y!<;9C*Q$x1r zG~CLVUWW=NWBM}uGk^c)@p{$W?5fQWGN(ynb7T6@SpC@M;UjMC$mUA<(B`Qb=yC1Z z;jLRXHz1I!r%I!f7?;N8Qf;PO-&`E6Yj?Bszg!=ln(@-bV!2js7K^(<;WYWmTC;;Y zIfpn~hl66zsgok%2Cy4!hV$np$6q z=aaVHfPeHRChVU{E(hfG6^nk=VsQ^Lgt448dqI@3u*N7>+3<%j|AY~m7hnUT9kOOu z@54OiIx+=Kk1jU)5>z{B8Fo52N%;-#MwJG|lZ?+UYjNS1&Kt(|_?u#&1#OJ6G5>bi z76($0Xn!sTiJQ7-4K6Lv2?^$nM@+it3e=&bM@a zKi2&N3zF4$0)^<=f&}$lsPYJ_aV4E!aX&iLvY_*GFzj>}esaccEi!8aZ%Cl>69g{oK zvz2fw3(0+9xd_ScjbN4Xz3t_WmfU@9xxqd!-G5zJpa+Fl;WS?aFgnSjQA zvFK%s#j5y80OyLuN2W^^za&*Gs`_ZLs5g?*)kwTFP9;;WZqDc}%)5@stC-N3(z}?5 z(ZStab9>d??(`rNF4nS&X-;gsf;;7nx%++b(C`g-FOr zg9Ott$I4!ujoa~@m36Y|Ts#-g`oGMxZRFbmIfQcY0hIQ~1iK-&OWRL!SCQBOlllv((LCzSXc|fILpU%2I`-m|X?+-_y3AyP z$t0616Yl=H&O|om_O;8)geT=+MiqYrbFy0Y)YWW7{XADbbb~G0NeHSJm_Logv$V|c zeX=-2Z4aEO546$Apn4zvxO_LbfSBdGY0vR6ZO_H$oVmnYaxQfugJs;p(JI}H&!wNX za1OL*-y2jqBU%|F9_+_>or0fp*h_)G5z&5z4jB}xf!^=2nMxtiA=MahLoB{ZMK7mTikf=HbG-=Cntg`|@LgCy6IAj@lSw>#%>gHv5S{L8P=O_(!E1lM}_-8j< z#J2m$D8RO#IG%Q}=Xn5uBlmSsDL1a{?FxI}@@P5y(3ZVUM z%g6yQUG_Z%GNC<(#ckU&c}wC?G@Pp@HGIONhEFgSVk!GM$CxN|8>rZHOkdDMbmS?! znSj#;ntn1qvJc**Wu-%KkJf8N{5M*HAymPpwgMRCbtUUKY?YH3+B=&~mi` zQ0{pQiCU>v0bT;wQft&&!2N)2wO(Becq!nxxN3E~1ioBt1UxA46>1aU z<$xVEq^<r?t{D z$*__2V$nj3d@dxf@6PHhHM9}IkNd4~ZG4~3z&8QJ|uVC7Q(8X(Cu#lHU z5aNMnl7*p2&V%Y9k&@cPrJCrUqpGlzJN2ZvdrL>X+0T0l(7c z^iAr`!s)Ao)3>O%qU=V2-=>}gyiMTe)Y}2yB=9e*=K*gQ_#Nt30KZz`cdB;*zS-{? zW&bhB|5f#C$bXH%|53dg@D8cdFa7#s$$yXfb>#09_`T`{z_$qeKJ^=bcL83l-mi`W zz7_BqbwYgr@NIzCs^3%}1iTyYh3Z4wkya7+^@OP2=ZS^|{Ox@w`$$ZrOB6mIh zE><5`e;`5DJ6mO$kD`Q{dx`qPpfvM|%qKJV@fZ1*;%|fc6w3;CLav`yp8>tQkQ-B< zRi6WVx751~IhU)?s~1u4o=_sT-ht8if@sV}^+ok37{3wGTu1#Wo}9u6+NIQ&)RzI@ z3-}84XX-0}N&5=*RrNK%uLZmbe?#i)>Knj+zmGrmysfLqU!nfH`X=h_?a(D#&x$VD z`i)(>^ewbVqD4!WZ2fC(y7X;R1Ng60f1&;o`1b*Rh4R#Q0KYDr30JAVR(}Ir56Bph z&#TpU)%U>XgMc}cHmmQeAK>{Rz%1XQ{$BkM&kslB^sUSRNSvd%6@S;Le^ft0jRN3n z)&EvM2F3k=uT%f5{sr*s0bj5FRs96;0l+t?e^WmN%=WKT^XetQ#c&L%={KsMsh`EGnmAoP8#X&H6z<2I;f37eTEsDp@VfP-@e)NCZ~r$4f_C zgyX6(n;=D4*bMWPD&^)31XE(<(ht*`&Im*PpoKBoo*a$Vr)Cc3H${lmA_BP%Uqni?QRJsn;qqq7{hm zMnn583l&A5WoB(M(l}bGOctl7dWoSW0AC=O zIxR7rgZwE5;$K({Q6xeHC-`uNH^&k5S9RPyXiVn!Y`!;Nb1{FLbxwN;(aUTe&hHy{ z8?AK#=kLX5a_LZ`UcoABmc4~$>Ns3Ci`O{1c)6TZ8;hcFk4@pkHQjLaqSX%Ls>Rfz zHO6tzC0H^=j0^ONw*nSLgqbJTDT>NHQXV~P-BA!e$EvtMayH6iWvm^Gu@CO(aXVX` zaP2q?u4;X{);t@s2Cn_MXRkF=rTiB~RvA63PE~MeX>nTB$+HPk97>DzynYlO#6>w} z46!KT>9bekm7cTKI;(87OKW3B;4r!fjJar2Tt`;SVv^05f=%`zo z)b1GEMN8-bdJ7WIfg`suzr2S_-+0s+b?NfI(Fcbxh1D1UK=0d}^>#Qvi*hx`L|fv# z$0`Q_IYH<*qb7V>beHM3GHLffO0eWgoHtGr_kcCK>{6d<&}7Iy6-WN5rAQVeuNeg} zz4nPh)<*&qJ*mDEEv^Zv4)|2VHs?VK(I$-D0-bvo$Xp+i$@yfYeisP`b$4-08Ni@0 zC#?6vn~G~#_KDbgZDqgDfg?9QGH-2~w}yt|bZ*L-473lTiI*-lic|GQ`B<+WGjgVJ z1}YX`1%70Z5%LWN*_7y8fToKt>I3=emNFQSHG6^1zZVT}3OnELcRpyb{rqTw{qa&` zAtibN$Zifv1-&v2yo6jX)eOeyDN<#Rf*)!Z|JcLRc>o9^SWR3F)af~E!meRvJxb5E zeLRlPJABth&m1pXZj@`h@;mCbCYYBj7TrgR#gl&Y{e3{_C7YPyZnIPIkE3iS$ASaD z!on58K3_z{Fu!Wb%--Sqd}G>=_$|o2{te*qxzq0_OxLxUgkY-zC%8VroQ{eATgbbO zvinT{ArGwnvPmI6+mqCXKw(ceDO7*Cqz*6Cs}FRs>g*M@ zF3>cILi1#7(cNn#1m-!@HW%Em$({SUMI5BQAALv?A z(AZ2kM(xZ}7fdXF0Z;H9jNUi!eiv=_1B0w#h~Q*}0ja+rA^o4xD3GvhO9`cMF735a z>fb}%BK!AW0Ql&o_IaRpbiLl}iT(G1l!y%Wj4;p2=Yc$lMQ6OOd!qjs&>s%bn-#@W zpYIP|c#)7__o#%*$-A{p3FJM)(ZMo!D^ye>tMQRGJ_DU@1pC&LXmB9)C?bN?EM6CW zq-B%n-v(kBME39&&zkDgugvztxM^@~O5a=s{|&B+_7f{(vlj>B%V78LcDxmVi}p7U zhqbX2CPd-PQpdM2fdX(pYmjsh0({2~8Sk7u6^pZq6OImu%p!NN>YIe-h}AhUkq( zndA*M(aJ2D9=>{u#mtCgcjnbZdXTh7;cd@mNa08?9-0^!!w1FqMCyCF2#9KoW z{`w=;v7fyIg{OG*nO(8Ve_3unUSsoLcEg(~m=y3$d2wLx+POme*qnKq7LFS>F4W7y z)HWlZ1qCl1IIOYY#78R){m01d6#EyE_dK|j^yi(Y%eIzk&oKV)jCDSL?4azr#5E2J+s+;rw#|{$41xL-fcO zRSb6z8W!v*-ps(@1h>7vj$D5RXz5cALhmOb8WpH0s?ra*OD`$eo-3s1Fc#2LE5C_0 zA0&3!(#@o2<$b$P+TK#*V8Cl4;!kkeZLa1AlrDer+n1LBW5&3Mx}o|to*Nt`bruHf|$xg`Vb z_!im?rE~`Wn6Yvg(J>oOcvD7G;fE6DY)?*G9O1?w;u@W!`W@8y2*h!k0>*1NsibA& zH~I5*iCH5YQt`6p;8KLUW5J&3zal*kNgJD)Fz~b(uYb$7q4e}$^RYuOzKgs+;K=oCy|&w8Z(*T^In4jXr~k~j-PA*1% zbewl==ePhVDnQDHhhF;n4=DY1OBwntyq{%GD1x(XHRCD~$KQ)wAzD^O6R)#PI4vuK zH%D7mXVl8zychMr4tG>R6aIu5pJmda38#?ffvwX?0I)A?*cbA0`!E`|F%`&CnBtXl zbG;9816y*ruk{Ao<0y{a3pGnr(gdPMj-VeaHgiZA>Cc?QKNJa)z=1G(d zk&H0Xd!}StF|VE+{Sz4ZJ_n4d&sP#xTFx1NH*GZyb|mVkI99p+&zsl3%$3Bt_K#H@ z)!>Jt%fDS5VXoH@qrWjeYU9SF9gZvZd$Zcmbu1SI0}J5CXy(OnHtHPH(4ZWk>7-$+U%K z@=E}{0o=8ihA9{Bsd^sSAyX6)hnIiC6!navp(8u8Iofl$-Dk|C|A!ieGk>3JaYod7 zA@*LPfH-Q&6t_5Ta_K~uu95#2F-H0yiL19-CnPG`Q-{u=RR*0hT5YDg)SkcEm<;0d z^c{G-025r<=K?3sQla}zuW$}r1qxz67~f=uzDewASkjt_i6n#;3tkK2cRzv?YO2Ez z7+KL=Ae1+CC-vX4&+Q}Y^+f`_IrPk*9a&tOU2FSprbv}GfpT=?_!EKtPa@AFfql|$ zu$YC*VT9OUxx5S?BwEtJkB(y)S5U(L3#fcOXXQ4+sI%~?$m_#K5*(&_j$#7s*N}#s zj*KfU(x!{lxhTz2Ac)4ddlF89@H!AaZI&Ru5uH0TyCT^AqU~Q66WnYgf%Bd`q`|`_ z?0gD9Yv+wLds(EDAPw`eC&>&bZ6wLaUSO)fEK(`7WkA0tEqsCpr;31k`z@o zr~g5{TJLCGf9*nF6Bll41 zZ%3i8!a;-3xYYh z0WXLlnwInZa8>Zy2##8f=}LEqA>eRPvq!E7_0+*NpuU&V5Un?6kJLVO1|^!#cD!}S zcdv@|$x#vuehBjg`|HOAxSPLgfFDU z9%#vGeLQey@q*K^yfYbj3$el`RVFniJCTf%)rP5`oY3%Qg2JF+rh6D*o! z(n8k3*fEsu2V>d7Mh#g)gHgv?%6p0^(4Wyem zZHJqH{sAfbCt%7zNa9s!+(y%lP9){{(F~3eL9V~@C#0p#*h;^{9VX|D3EZn z5iI^Hd&;E^@k-F zJmd01XN-gPI^gOd^yNKZL9VXBq=3h9C7og>Vr3dGxTEV$9IQM#0Jq`$@lQl|!b7f? z!mTP^Ani&26~J(uqslvXz6s;kM>MvH_*b)yJT)ePzZW@at^^?70EtNB9a}_`;7>v< z0VW)7inYu)F3p&Kc=`A$(D4m4-_!k%m22tUX3+X5W%Yki=;W4M#M4%Y4Vi83Dg6?g|BQ)X`#GT=*#3w-{yPfWW+{1N z-(Td&(a{y%QUfpV;#Q8_Anv)DYytK!lWb(`lGxi_m|KQ%wNMo?;c z%l)7k4r8z@@g>B%o>_2HZw!Nq%;W{vz19bRqB^q3vXgDy0}uN00rus(9wTu*^8Si_ zNuvfvB9XM#*}n6;h2|6ka0~Zgz2Aq{@uoM=T?d?mTtyF<6mz+k;r>cc{{flgM75t- z7X(zKwU@1y8@P#im`4m$3V#T*SEA>y0`MemRCIqYP$FA!m?E;}%z!$7=Wqx2DaN;u zf7D;+J1tu;X>Q4T%XZ@hk&$|HH{2Xb0$zdY^P+91>feaGAF?kzjWXJ>7TyqtZs{`! zc$v+|N1Vnd5AY$Iqcwa#xK@XcSaGuFM%7sB978p(i7!n(Z9Qm))tZ4r$PZXX2GrJ1p{}=tUzRWt9DY=SD-}YF z;)#$|>vC4=$MxN!d`AM`n3#5d!U2>c3BM#^VwIPOrAfoNWn#9s+6TShRMD@24!|4E z#l~~kBC-O}_QEGsHn84J)SvB4WG%V{ke3h!^zTbstS=1@Hzk|nzER5S#F`xIU4VW} zHo2qQPxL1TlD0JfgAE_Qum>!A-e0nW{3g`tnme3qyCBkt-(-R7Hqwy{-}jYoGih!r zoqB%<_;KRM7srWlkhNNTx)%e~LNXxt;myf{3_$;^iTJ8m^xlsXvA;-3?yLpVkjOjO z!RJ=UEw6p0$keZ+ihm9Y3k1i4Qqi}QOdjp9d~wjsaQ2zza+xlm|4EjLE`;O{# z;1p>(N+k$>2-817+Fh6OjMHe&IgwcS>v+PM`4XZzEc>BEVXSpx7KcvHJu1fk)-hIMA}Dl#U;=Zi*T4U9@FjZTuH0wsQ7)9 zaB{1U{|Bvbwrk~fNJh%jrd;T@%I8UtSWUmBrr#TELp}7uuhF47et*kEBz@@O9RDi_ zu0Hs`K*Vo*XmqveRxp?pqcA_#pMtfWzDQ3El@TL^uXyaA;5fzQ@h_8dVi zwq-}__`VUUftU?aB(}q=*_qa?6lVCU6d2#c&WgAt_c7C*Pxs7~U979FY%#5_`xsqm3p&*cT(QO%#BQ*XM)>l zF}&{^$9{E zJrT>N_$Xrg454>3`5cpHnNTSD3rM^^d0o%E#Hzo@?5{HU29s|x`3{rsGWi~p?=$&( zCjY?X6q6q@`6ni)nVex_v$t_3yuzS)oj^05uNh(241H^cq&36D8voOon1o0*gO-|c zM9uh`W^79WN}6#U3741;U>+k4`p9*j2|dW-A=UH;iX%KPTfUwt zDZizOUnl&y*_TI27i`I+iBLw_M=rgC`E0<6~5#Nm??iVOodLucFet` z!Fl`-bK(ZJEj;xF@W6a_iK(4S*m3a1)=n-pkjgni-9cW$PzQhU!L*$k`1wF~Af5xC z#4_-++yz3HRB;fntraf~C1nX89>V`Mh~gb*Qf6{qTSA>JWVLyOkY*yYekY)zl%dgs z$a!rU3lfoSB-OT!>>KIskt{e9WbGU_xdn;IHscs+T@?0nhW&hnyyiTO|E&gJ60}+9 zGLZ#wCgWY92o zRI|)XHfN^b_RxK7m}9bpNk5aNOa_=NV={=u!z|}NaninkPyz@*VI|>AQ69!!Wkz2{ zXAMf^OZMi~*$esDWHQTSj)}}ke6#*A91HMJ$YgCLoVH$iJFe2=4G-=)v4%pD!$%O) zIEt>baw%K|u{K$`J~%<}<=eIPfW0zqmxDP$P3`}woometKc}Dn2EVzVW>=^CR$Bc_ LVvn2O{yqO6n{2l$ literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/anyio/_core/__pycache__/_resources.cpython-310.pyc b/.venv/lib/python3.10/site-packages/anyio/_core/__pycache__/_resources.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ce94b1aa605475ef757eb2a0d43a198e2121ffff GIT binary patch literal 755 zcmY*Xv5pfl5VdzVxm+$eK%%2r(QQG@0o4g1&|Lvd3L=C^vvO=FS#H;}vb`6A4heMh z{K8#{M8_Y%Uu+9aet`lp-Xw6$%HA1!=FJ<=K)>H5C=Y&q%f3=Vet6@mglIe_gxY(k zNFr%Y3Oc5g$Uug9P=wkzsA!E_sP|=8?tP5LZP^=u3mC2_LW(581)>-IF~= zoH9z&*Qv72W$79PZ+uKq^;WK3!vdn;` z0*qqm_95(`T-G<%Inya%Q>Rs)FMV$7=PY>N+3nEl^!9Ia4b5Q^HN2YM8s9y$i(9f& zchhuQVW(A^8sFJEIRptQRkd-}Zq{YjUX8sekq{T) z%6sq{JVvf?;SEqvjCVItD{z$6*#128&F2~G;jr(~c=YRs{L}WlpKfw}(3lWdW~Ek!ro$t%RLQXw$gD7jCCFmUG22 z^V_dI-I@yCZSK5e|8oh6Rxdbn6E`oD0R z49KwFXYa!Q=za4jE1!L(%|6f=TZR@;BtkBvnu9J}O3pG%V?_=PwV+?YqkoTe1fhzNvzvahr*o+E0EK%RrrV9KJ22n~SnQAHOf8{6v5@XQ8Z}dRg0^hXv{j zkysO&a(1pigaNTxgqfU$#nPr)Jq#Y)4-M7JVL>fMjc7v3PUWi^V}fFdyX4uu zEylIW;C3}X8Fi|_RX^emZJ>jUc31s4J};>|MI56$u-Z>_mJt>AE(C0rpnHi{{id9W z5q8|dR-Jv_;QhF&FsDqFd=;}w@!DtTj%`2AH7_&q#PxI4#{+NB8u;{U?X~{`TB3&1 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/anyio/_core/__pycache__/_sockets.cpython-310.pyc b/.venv/lib/python3.10/site-packages/anyio/_core/__pycache__/_sockets.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..714b32b0c220ae6b1c4c1163a9de3f5a6757cd65 GIT binary patch literal 29596 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/anyio/_core/__pycache__/_streams.cpython-310.pyc b/.venv/lib/python3.10/site-packages/anyio/_core/__pycache__/_streams.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f03a25a6c4666878671f2b42384c69afb32cff71 GIT binary patch literal 1988 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 YD#r{XJ8EvDrOFqEGg`A>n*8T~0JS@RkN^Mx literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/anyio/_core/__pycache__/_synchronization.cpython-310.pyc b/.venv/lib/python3.10/site-packages/anyio/_core/__pycache__/_synchronization.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..652e4c315565fb2ba6bbf358e025732e96eb883c GIT binary patch literal 24581 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≧?wS>H`| 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/anyio/_core/__pycache__/_tasks.cpython-310.pyc b/.venv/lib/python3.10/site-packages/anyio/_core/__pycache__/_tasks.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..024bfb618c9122b89c814b1ce33efa05898f5aee GIT binary patch literal 6529 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/anyio/_core/__pycache__/_tempfile.cpython-310.pyc b/.venv/lib/python3.10/site-packages/anyio/_core/__pycache__/_tempfile.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1578beacc3d671c87ab016c2d7d698e0393687ca GIT binary patch literal 19312 zcmeHPS#TW3dES{lu)A0sB*B}MMxN$l8;ovU1B(n(c}Bu*UXevPX9q{w zsN3f54BFj@y6tKQ>UKo!9CusJmcJ==hdQPXsvEARuUMsz4 z?pF7xcd1(i!l4iXYTu)ZVXb)|b?;TTv95GTy-yugw_i<_4y*U8X*Gk~&B{KVC?0=> zvsJYG(Mq$~YFFB|R@0kBIeV(@>dJiGE!zIbgDY*r*OtG#y69FfEVXLQcDc4tu2z~=w_bNuG3Adx zvE()%tTiiosATb?)bqz{{ z9`wKL)tcv=Cs*2wt>&$sCLK@Tg*@)%N2ID`zRMC}&(*R=~cjgvd$+5#ri?!+^dWpx;0^7N2 z+Ih%bs4Umppnl6abm_MFLuSYUqNb=4i zSQu10=Xlt@8m^fbjwhU|8JQxsFfSW;8`~m2e9r8dXZ+E!tn9KZgmuf$m>2w%=hhcC zrn;8KbMxG%&-f|QS5IOe^K%gg`AMu#KO17Ok@wo#S#xGvP1hd@X3@_W+WQ$pNIwa} z=sf^b%_89k$9N(a{GLGZ)f5UUaXPVX&8{cbb9yhzdOwo`Om1M}Fu94zAtr~J5UPGx zm~70=EVdf%jH_m_-<-!}cr)Je{6g#U%=AUKd2yy*o1a;dJ>stEV|UDW*vxNV!m`KC zE49{4x!Th1Oqr7=)LL5cv*mKFS!aH%LO@~c3ws+M(2l|}R z+wjWJvFn?O{w+*oAh$+2DIQ_5h~!>o-i>4@*RShJB@Ye}T`S_)}$EsZp_mO+|c8$p^`%OV}&Yzfxu*)31h zu%Uez{d?rJOd(^%e|f7)MhQPemy+NWG7JgvqSa1Zvp%0#u#~0jtJ&+;DKOEaiRZ1h zy=GmpUIO|rCC(>t>Lq8ZA(-%&BIgc{o}k)^^JsqFW^;T~_@?pA;5&kE7T=t*zL*6l zdsgqp8^yez4Vgqwp<>Ha;Iyt=hQ*^P_OtiaD~)+o`A`LqJpxQ6Qdak0=4Y$#?qV;n zUB%^rSuRiCTW{e=_CAD+0koddV*ul4^>VY!gI$lKsCOY*x21dEURW|rM-I?rH9sGN zETildkk~Jzth|+fJ&);G-7^dWYzvpGpr-p^F3 z^_J&?KC;bx0B`9JGP#e5Oi4U1Inv`YSAPpnWuvlRn98i~?k9t^S|6D4RI%+tkO1K1yJ>Bbns~ z1ClPL-?lC^H&lHG5-_CXcQT*VG9|L%$-I1s&F*7zKa=>a9QS6P<>fLN7bn(oo%uq! z{Hf(iJ$N!wE~{1*)f1S@SV1Y5^(et{bJfS0oMaNuf5Zf`zR4@zqe${tm)RY*Z6|H3 z)HrkEh-cOZ8#`n$pCme3|_b*DPSR?sHyQis*eqD|ZlZRDtE69=&w z-s5kd1^HFiVyLWPRf?F_t5R@6AYA^RC>E5Qdi4qCQmwrhi2oOBUX8*maijnjio1@t z;sN7n=Tw^_nAfjl$WV_{p*Vi_S2#Ek9Qx_fp>$APqE=x9bx|T(^AuPFBLh$rr{f)3 zg-E1bDjKu~ZM5xQY8>72{4X^QD)_x>a+k)T+`8L_PWJSo3toqsM4gXSG3#GibfF-N z+Al|@>H_e#sVsqZYkDuYnq}$ixO2ql^A3ddJ8vs)hA8xSdB@ITo)W{2R z#%`|loCburgN_p`QWm~~7DiJUU)|q7$XH$3-T$ydXW1g^`eQ^WJ~$&ZuCe~(Okz=D z&L}Oh%`H${LZe%Jy!TO#B0DMPy$2a6EH)IC6cm&U6qD>41oUs@pqeDw)_Ggm7t(s~ zTAsont!@+o`7Neqi#ap7Tcq*2{Ynzuy+T1)b3%(rf21sy9nVkVaPSMXVnD=&mWV@U z7%jewS3L@YcDFnL86x}B{OGuqdVQ$6qwkb{`;{1qzf@vg-Hr^E7-iKGP*&_ew7z6P zorbc)X(=Z4UHH*YGWi4(nJkg|B_}g>4<7s@zQQ=$6RR`*ys@dmp*b!3ecj*%GNr2@ z;M=WDB%w_l+_aC)1;L?;fPR2Dh)Vq+a}P1;VNc3>|HS%-k*ppVf`$?4vw=uIUEF2X z=u>=A7V0E(!bxvYrkAxmM<|hWFI=Xj?h!l)JAFFp^cNQLH|?~T?O3f8{O5py4EC9K zcCe9LuODScrAf7Jcr{c>84c*M*d7L-TkNLR9a)dLc0l=`Ja{2A$9m_0jBWC^{O~J)bP|vAP$QyL&zyXHx87a@GJ5U~1pOn%ubtm9WsIrvcHbQAqot4u2)caA| z7L<;w51_Q&-En>j2APVqxKG^=SUc6clpatIqQx#%RZ7Yy)I)f>+r`1D9#)SCUVBhl zP^ZF@Iwvh3L%C4mvqd$lo{*M%QL3qrh9z}gTAoI^P}=)>SWilHcUyIOgD> zsW>p@*Xf26*)bk@==Z2xE_=0Ah?tL8F4r2%4TmL?PfX0tybCxT(k3WLfY1=TVbZS< zf`m=l*vM&}?zXdw76lj>!2cIligP6LmpF8Hbh|U&k`A*Oz+d`Dz)26w$qEt9@Y=Lk zbB#K%f6%H4{UO;#z|LAu`kvFj$C%fx8pzQeNwbvyDarEp!~i`YZ)A)GJl=|+Dq=%? zLPoOp5AnWH0mfDj4jNdj1neF3cz_!42AJz}M0o%zud{xU2_bYy7g{8W=-lrk5%mvj z)RxC~1H^rLB8=w(4uCcLB1EyaeI;=%*-l+aT(^wvH>gRo4(dW~Ev=F&^~H4fyqKQV z#{l2A=I4qjW0n=7I;trz#f(20`G!IzAXg4q!%t&(g<4$1o0_t@ro%$$ z0{Abghk?`*fKK&n!^yh2jZ zonegN-YB#m>zaKXtVZ3Zodju80}SKEv{rb_PnH*!{In?2x`_%6_DpEe5?ai~So6VM z#F~t3zmS1@AZ1P2s{>ciw6V8$X*VItFB4^2lmnCtACg>kv*EF1Q150)KU0=ykmJNYE7

?%RjqZd!NYPEvDTh1}GpUZn3Rp);an((ObQ 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/anyio/_core/__pycache__/_testing.cpython-310.pyc b/.venv/lib/python3.10/site-packages/anyio/_core/__pycache__/_testing.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b613057003642da0b216872a3a80d98a7885149d GIT binary patch literal 3133 zcmc&$TW=dh6rR2KwsD-Kr1#q(3e=F=Effhw6j2pgBB6kqN=UAv$$Dp8Z@S)fXVxu= z3<9P9qN>zB_HTgr6C?2iFZ~OB;+z?;>s)wdB2UiF<;-`^`OcZi=H~+f?fO5z$Cqk^ z{EZ*8&4Z7x2ys*&1Wve29F*O}9e5pY;CFoU?Ioo_xlI?dFp(&ckjZbnT8vg$(md!nk)c-O+v&s{FNMH!eL8ISbWJ8nJE|JrpUAP~~i! znsysT1?f1PbX@LqJnnXUewNSiIshv1b9{*(1F6i<1K?$lD*OUJ!B2uzrr|(XXk4gB#%Ad(D0#fBjvFVeT5U?io33zRslBf4NuMLKY7(l8B-gMTVeBK=pitWZ*V$R^0gDeEjzG=f7eIic;c!DnaM3fD0|B=^ z`0qV01M&RzUH@{-Z|qi9OiJH)<21o>HLxiOl>*WMlnLQ5r7X?fN9izR3B`@ED==vw zU)UdQJ9`K%y33&TLEzw|rn}2bp4)nfT%cQ9_vA=yZDGa2a)_xx!3Q*?5k@yj%)LN| zP~3rsE3n~qm?+#~$n_*vVp3aC>un4EC^JrhRyI+?W_4dJ%<@aS?@r_YU#r)fRhxec zu+1juB1%|$hz zg8-@|%OQaBEY7}%-3QoxjNJ-$Zv$u~B)rKI%oK%atHgKwAaH|5P!7C?XLAT4M)2F$ z4iJ8iyl`G(VRLr>G_kyEa@xdhQr`C6cQ)l$A)Lq(b3xjGPHwr`J@!74A%s*xLH`Cy zRsLO;4Zo34_E(W1X-3s(ILstu_x?Lp;9{D${MmHoOfB+?WMwf}R$r-AywoPv zF=O44zQ$Di8h*yti#3Vg+Q+;7kcW|%f1rmkJ$`d?Vwt%HzW$cL%hcAJ&whlbB)qZm zIH6&Z*qUJo3Kd2QiZ4whN-vXC!Ihc!@v>W=kV2opc?KITX4XwIcxLh=v3~+Met@6C z*t@?jyAnrGl}UZfy+StbnT%h<@dmyIdLyWac>kkmdf~u}N_sFVQMWF`a}Hoie61KC v!)`+kq`zgexf2bg(S-)dQJ{783;PE75{tDVYn?2*i%#8bctJa;H|qZaR7VNh literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/anyio/_core/__pycache__/_typedattr.cpython-310.pyc b/.venv/lib/python3.10/site-packages/anyio/_core/__pycache__/_typedattr.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5718a857984e0da5c06a15d3f028ab9dc66b7b91 GIT binary patch literal 3315 zcmaJ@TaVku6`mm}iqdNDu2G|PJ58FzN;gu21}(5ii@2MjNRuv#+HDXT1~cM}EXKUZ zGvux%$UzVp&5tMwB#-_Redu$40biS!Jm<|Q(3~@*D9JWTfWx_Q&UY@~Ig{<~b_qOh zef_WK-yK5!gM-b-hQT|8Q2iNn1Q9eQ3H2$(z7<=E?c0gtJ7#Rht;F@+r0us8&-ap! z-+_5YwBl~EJdXJ&mSy{od^(NNdwr+0Z>F=deS0>Q zf90xdjiZ#urI%eu6=z(0L#van;RbOt&s8)ka`{1)-7luUQz}!Xdpp4SvU59lSB`lR z=cTJ;UZ_;H;O7vrY(9A68QRK)PEM8t5YzcD|7?C?oE2&GppYyZeImpBgcVu}mS-&C z>ORX61>-9idH_ng)y^kG?ZbhldHR>(BunH_is4jcc#aVk4hI)9y%@&PXgHna zlPvwk;LV>8b(G6DraZjQ?@2x6=`6~IL6|8y42(n+IGE1LeKQIg`MV%cThO?cI)u-2 zx;iik57jS0D~V49@hw4pTex44F-5OG?)lCa#36nQ?9eU`w+($u=JUUG89cX&sZ?Ri zwPxc?J!=UTW^oL9qNfL4^TXLhhW9ngCp>2o+&N>@ViZT=+I%b<*DGM0>gWmA-~v>W ztz&0k&Qqvu>6~Y&4AF(x&F36I;OYR;&vKH2tmax8} z`uf6J&spl_FU7;A-oEmWu9zhRZ!$FTY^s1|H{9FK|W8Xo?egK`#0G5t8GU4k$ifTz$91Bl$9^gWBf^F7m<)^e)e0gC0mEO>B%~hFC#s{bO5}@ z-8B#7!(8!oVC#V~;nP>@G z7jHr~GWio3lusmkRz4yO>ttI4uTrAf4VgtrJ@pzrKO>CA2 z#+d6Qt6u{zm@Mn;%wKzP%nY9Wr|dKqQ9JN|i0oZG*kAehTl6vJnkV$Uf@LWbsQTD6 z6{UjKGGg9>m2dG3ht7Za|L~M;Q58hhgWXS$s(@n)h`hQ|hL}885B68E)ax)%Kf?ww z^z98$gVk&W&k*_q=6;3qZ(xJ0ReR8EosXJ&@SY)`--gb-vml?41-(Wd*&mXHjiuNj zIh|dn0ECi-m0JZ-*C0*PB^B1^kiuQ^5$w7IMEswdlrWaL(HQ-N)vEuxNTC;{QuM2` zg#NEgN;Z}piwVA9X)v8o-D!`_yR=h$gHPng5EX``Ape~IwP`|3z8*D*YjiuJY z6pu8dxlhggW3Y{P5 zNFl9MaL@aWx&hHqdhg3wRU12v6BXWrVZ)jt7>%V16*h;wu+0~RQF#ilDTda5kGk#N zQxD3aXIcL}@7IOy)#^w?IOJ+o{;=0~D;k`o~zc#|7Mmp=wuGi2cp08XtuUd9RS1rJK+2R$lQJug4W41X%6_@?j{a=7wjy yVDg&DEQab8ZoGw>N^Y>cNR85ayShdE26K(krAH2|@6(>;Ssrz1*WPO#9eoE>npQ#p literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/anyio/_core/_asyncio_selector_thread.py b/.venv/lib/python3.10/site-packages/anyio/_core/_asyncio_selector_thread.py new file mode 100644 index 0000000..9f35bae --- /dev/null +++ b/.venv/lib/python3.10/site-packages/anyio/_core/_asyncio_selector_thread.py @@ -0,0 +1,167 @@ +from __future__ import annotations + +import asyncio +import socket +import threading +from collections.abc import Callable +from selectors import EVENT_READ, EVENT_WRITE, DefaultSelector +from typing import TYPE_CHECKING, Any + +if TYPE_CHECKING: + from _typeshed import FileDescriptorLike + +_selector_lock = threading.Lock() +_selector: Selector | None = None + + +class Selector: + def __init__(self) -> None: + self._thread = threading.Thread(target=self.run, name="AnyIO socket selector") + self._selector = DefaultSelector() + self._send, self._receive = socket.socketpair() + self._send.setblocking(False) + self._receive.setblocking(False) + # This somewhat reduces the amount of memory wasted queueing up data + # for wakeups. With these settings, maximum number of 1-byte sends + # before getting BlockingIOError: + # Linux 4.8: 6 + # macOS (darwin 15.5): 1 + # Windows 10: 525347 + # Windows you're weird. (And on Windows setting SNDBUF to 0 makes send + # blocking, even on non-blocking sockets, so don't do that.) + self._receive.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 1) + self._send.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 1) + # On Windows this is a TCP socket so this might matter. On other + # platforms this fails b/c AF_UNIX sockets aren't actually TCP. + try: + self._send.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) + except OSError: + pass + + self._selector.register(self._receive, EVENT_READ) + self._closed = False + + def start(self) -> None: + self._thread.start() + threading._register_atexit(self._stop) # type: ignore[attr-defined] + + def _stop(self) -> None: + global _selector + self._closed = True + self._notify_self() + self._send.close() + self._thread.join() + self._selector.unregister(self._receive) + self._receive.close() + self._selector.close() + _selector = None + assert not self._selector.get_map(), ( + "selector still has registered file descriptors after shutdown" + ) + + def _notify_self(self) -> None: + try: + self._send.send(b"\x00") + except BlockingIOError: + pass + + def add_reader(self, fd: FileDescriptorLike, callback: Callable[[], Any]) -> None: + loop = asyncio.get_running_loop() + try: + key = self._selector.get_key(fd) + except KeyError: + self._selector.register(fd, EVENT_READ, {EVENT_READ: (loop, callback)}) + else: + if EVENT_READ in key.data: + raise ValueError( + "this file descriptor is already registered for reading" + ) + + key.data[EVENT_READ] = loop, callback + self._selector.modify(fd, key.events | EVENT_READ, key.data) + + self._notify_self() + + def add_writer(self, fd: FileDescriptorLike, callback: Callable[[], Any]) -> None: + loop = asyncio.get_running_loop() + try: + key = self._selector.get_key(fd) + except KeyError: + self._selector.register(fd, EVENT_WRITE, {EVENT_WRITE: (loop, callback)}) + else: + if EVENT_WRITE in key.data: + raise ValueError( + "this file descriptor is already registered for writing" + ) + + key.data[EVENT_WRITE] = loop, callback + self._selector.modify(fd, key.events | EVENT_WRITE, key.data) + + self._notify_self() + + def remove_reader(self, fd: FileDescriptorLike) -> bool: + try: + key = self._selector.get_key(fd) + except KeyError: + return False + + if new_events := key.events ^ EVENT_READ: + del key.data[EVENT_READ] + self._selector.modify(fd, new_events, key.data) + else: + self._selector.unregister(fd) + + return True + + def remove_writer(self, fd: FileDescriptorLike) -> bool: + try: + key = self._selector.get_key(fd) + except KeyError: + return False + + if new_events := key.events ^ EVENT_WRITE: + del key.data[EVENT_WRITE] + self._selector.modify(fd, new_events, key.data) + else: + self._selector.unregister(fd) + + return True + + def run(self) -> None: + while not self._closed: + for key, events in self._selector.select(): + if key.fileobj is self._receive: + try: + while self._receive.recv(4096): + pass + except BlockingIOError: + pass + + continue + + if events & EVENT_READ: + loop, callback = key.data[EVENT_READ] + self.remove_reader(key.fd) + try: + loop.call_soon_threadsafe(callback) + except RuntimeError: + pass # the loop was already closed + + if events & EVENT_WRITE: + loop, callback = key.data[EVENT_WRITE] + self.remove_writer(key.fd) + try: + loop.call_soon_threadsafe(callback) + except RuntimeError: + pass # the loop was already closed + + +def get_selector() -> Selector: + global _selector + + with _selector_lock: + if _selector is None: + _selector = Selector() + _selector.start() + + return _selector diff --git a/.venv/lib/python3.10/site-packages/anyio/_core/_contextmanagers.py b/.venv/lib/python3.10/site-packages/anyio/_core/_contextmanagers.py new file mode 100644 index 0000000..302f32b --- /dev/null +++ b/.venv/lib/python3.10/site-packages/anyio/_core/_contextmanagers.py @@ -0,0 +1,200 @@ +from __future__ import annotations + +from abc import abstractmethod +from contextlib import AbstractAsyncContextManager, AbstractContextManager +from inspect import isasyncgen, iscoroutine, isgenerator +from types import TracebackType +from typing import Protocol, TypeVar, cast, final + +_T_co = TypeVar("_T_co", covariant=True) +_ExitT_co = TypeVar("_ExitT_co", covariant=True, bound="bool | None") + + +class _SupportsCtxMgr(Protocol[_T_co, _ExitT_co]): + def __contextmanager__(self) -> AbstractContextManager[_T_co, _ExitT_co]: ... + + +class _SupportsAsyncCtxMgr(Protocol[_T_co, _ExitT_co]): + def __asynccontextmanager__( + self, + ) -> AbstractAsyncContextManager[_T_co, _ExitT_co]: ... + + +class ContextManagerMixin: + """ + Mixin class providing context manager functionality via a generator-based + implementation. + + This class allows you to implement a context manager via :meth:`__contextmanager__` + which should return a generator. The mechanics are meant to mirror those of + :func:`@contextmanager `. + + .. note:: Classes using this mix-in are not reentrant as context managers, meaning + that once you enter it, you can't re-enter before first exiting it. + + .. seealso:: :doc:`contextmanagers` + """ + + __cm: AbstractContextManager[object, bool | None] | None = None + + @final + def __enter__(self: _SupportsCtxMgr[_T_co, bool | None]) -> _T_co: + # Needed for mypy to assume self still has the __cm member + assert isinstance(self, ContextManagerMixin) + if self.__cm is not None: + raise RuntimeError( + f"this {self.__class__.__qualname__} has already been entered" + ) + + cm = self.__contextmanager__() + if not isinstance(cm, AbstractContextManager): + if isgenerator(cm): + raise TypeError( + "__contextmanager__() returned a generator object instead of " + "a context manager. Did you forget to add the @contextmanager " + "decorator?" + ) + + raise TypeError( + f"__contextmanager__() did not return a context manager object, " + f"but {cm.__class__!r}" + ) + + if cm is self: + raise TypeError( + f"{self.__class__.__qualname__}.__contextmanager__() returned " + f"self. Did you forget to add the @contextmanager decorator and a " + f"'yield' statement?" + ) + + value = cm.__enter__() + self.__cm = cm + return value + + @final + def __exit__( + self: _SupportsCtxMgr[object, _ExitT_co], + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> _ExitT_co: + # Needed for mypy to assume self still has the __cm member + assert isinstance(self, ContextManagerMixin) + if self.__cm is None: + raise RuntimeError( + f"this {self.__class__.__qualname__} has not been entered yet" + ) + + # Prevent circular references + cm = self.__cm + del self.__cm + + return cast(_ExitT_co, cm.__exit__(exc_type, exc_val, exc_tb)) + + @abstractmethod + def __contextmanager__(self) -> AbstractContextManager[object, bool | None]: + """ + Implement your context manager logic here. + + This method **must** be decorated with + :func:`@contextmanager `. + + .. note:: Remember that the ``yield`` will raise any exception raised in the + enclosed context block, so use a ``finally:`` block to clean up resources! + + :return: a context manager object + """ + + +class AsyncContextManagerMixin: + """ + Mixin class providing async context manager functionality via a generator-based + implementation. + + This class allows you to implement a context manager via + :meth:`__asynccontextmanager__`. The mechanics are meant to mirror those of + :func:`@asynccontextmanager `. + + .. note:: Classes using this mix-in are not reentrant as context managers, meaning + that once you enter it, you can't re-enter before first exiting it. + + .. seealso:: :doc:`contextmanagers` + """ + + __cm: AbstractAsyncContextManager[object, bool | None] | None = None + + @final + async def __aenter__(self: _SupportsAsyncCtxMgr[_T_co, bool | None]) -> _T_co: + # Needed for mypy to assume self still has the __cm member + assert isinstance(self, AsyncContextManagerMixin) + if self.__cm is not None: + raise RuntimeError( + f"this {self.__class__.__qualname__} has already been entered" + ) + + cm = self.__asynccontextmanager__() + if not isinstance(cm, AbstractAsyncContextManager): + if isasyncgen(cm): + raise TypeError( + "__asynccontextmanager__() returned an async generator instead of " + "an async context manager. Did you forget to add the " + "@asynccontextmanager decorator?" + ) + elif iscoroutine(cm): + cm.close() + raise TypeError( + "__asynccontextmanager__() returned a coroutine object instead of " + "an async context manager. Did you forget to add the " + "@asynccontextmanager decorator and a 'yield' statement?" + ) + + raise TypeError( + f"__asynccontextmanager__() did not return an async context manager, " + f"but {cm.__class__!r}" + ) + + if cm is self: + raise TypeError( + f"{self.__class__.__qualname__}.__asynccontextmanager__() returned " + f"self. Did you forget to add the @asynccontextmanager decorator and a " + f"'yield' statement?" + ) + + value = await cm.__aenter__() + self.__cm = cm + return value + + @final + async def __aexit__( + self: _SupportsAsyncCtxMgr[object, _ExitT_co], + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> _ExitT_co: + assert isinstance(self, AsyncContextManagerMixin) + if self.__cm is None: + raise RuntimeError( + f"this {self.__class__.__qualname__} has not been entered yet" + ) + + # Prevent circular references + cm = self.__cm + del self.__cm + + return cast(_ExitT_co, await cm.__aexit__(exc_type, exc_val, exc_tb)) + + @abstractmethod + def __asynccontextmanager__( + self, + ) -> AbstractAsyncContextManager[object, bool | None]: + """ + Implement your async context manager logic here. + + This method **must** be decorated with + :func:`@asynccontextmanager `. + + .. note:: Remember that the ``yield`` will raise any exception raised in the + enclosed context block, so use a ``finally:`` block to clean up resources! + + :return: an async context manager object + """ diff --git a/.venv/lib/python3.10/site-packages/anyio/_core/_eventloop.py b/.venv/lib/python3.10/site-packages/anyio/_core/_eventloop.py new file mode 100644 index 0000000..59a69cc --- /dev/null +++ b/.venv/lib/python3.10/site-packages/anyio/_core/_eventloop.py @@ -0,0 +1,234 @@ +from __future__ import annotations + +import math +import sys +import threading +from collections.abc import Awaitable, Callable, Generator +from contextlib import contextmanager +from contextvars import Token +from importlib import import_module +from typing import TYPE_CHECKING, Any, TypeVar + +from ._exceptions import NoEventLoopError + +if sys.version_info >= (3, 11): + from typing import TypeVarTuple, Unpack +else: + from typing_extensions import TypeVarTuple, Unpack + +sniffio: Any +try: + import sniffio +except ModuleNotFoundError: + sniffio = None + +if TYPE_CHECKING: + from ..abc import AsyncBackend + +# This must be updated when new backends are introduced +BACKENDS = "asyncio", "trio" + +T_Retval = TypeVar("T_Retval") +PosArgsT = TypeVarTuple("PosArgsT") + +threadlocals = threading.local() +loaded_backends: dict[str, type[AsyncBackend]] = {} + + +def run( + func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]], + *args: Unpack[PosArgsT], + backend: str = "asyncio", + backend_options: dict[str, Any] | None = None, +) -> T_Retval: + """ + Run the given coroutine function in an asynchronous event loop. + + The current thread must not be already running an event loop. + + :param func: a coroutine function + :param args: positional arguments to ``func`` + :param backend: name of the asynchronous event loop implementation – currently + either ``asyncio`` or ``trio`` + :param backend_options: keyword arguments to call the backend ``run()`` + implementation with (documented :ref:`here `) + :return: the return value of the coroutine function + :raises RuntimeError: if an asynchronous event loop is already running in this + thread + :raises LookupError: if the named backend is not found + + """ + if asynclib_name := current_async_library(): + raise RuntimeError(f"Already running {asynclib_name} in this thread") + + try: + async_backend = get_async_backend(backend) + except ImportError as exc: + raise LookupError(f"No such backend: {backend}") from exc + + token = None + if asynclib_name is None: + # Since we're in control of the event loop, we can cache the name of the async + # library + token = set_current_async_library(backend) + + try: + backend_options = backend_options or {} + return async_backend.run(func, args, {}, backend_options) + finally: + reset_current_async_library(token) + + +async def sleep(delay: float) -> None: + """ + Pause the current task for the specified duration. + + :param delay: the duration, in seconds + + """ + return await get_async_backend().sleep(delay) + + +async def sleep_forever() -> None: + """ + Pause the current task until it's cancelled. + + This is a shortcut for ``sleep(math.inf)``. + + .. versionadded:: 3.1 + + """ + await sleep(math.inf) + + +async def sleep_until(deadline: float) -> None: + """ + Pause the current task until the given time. + + :param deadline: the absolute time to wake up at (according to the internal + monotonic clock of the event loop) + + .. versionadded:: 3.1 + + """ + now = current_time() + await sleep(max(deadline - now, 0)) + + +def current_time() -> float: + """ + Return the current value of the event loop's internal clock. + + :return: the clock value (seconds) + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + return get_async_backend().current_time() + + +def get_all_backends() -> tuple[str, ...]: + """Return a tuple of the names of all built-in backends.""" + return BACKENDS + + +def get_available_backends() -> tuple[str, ...]: + """ + Test for the availability of built-in backends. + + :return a tuple of the built-in backend names that were successfully imported + + .. versionadded:: 4.12 + + """ + available_backends: list[str] = [] + for backend_name in get_all_backends(): + try: + get_async_backend(backend_name) + except ImportError: + continue + + available_backends.append(backend_name) + + return tuple(available_backends) + + +def get_cancelled_exc_class() -> type[BaseException]: + """ + Return the current async library's cancellation exception class. + + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + return get_async_backend().cancelled_exception_class() + + +# +# Private API +# + + +@contextmanager +def claim_worker_thread( + backend_class: type[AsyncBackend], token: object +) -> Generator[Any, None, None]: + from ..lowlevel import EventLoopToken + + threadlocals.current_token = EventLoopToken(backend_class, token) + try: + yield + finally: + del threadlocals.current_token + + +def get_async_backend(asynclib_name: str | None = None) -> type[AsyncBackend]: + if asynclib_name is None: + asynclib_name = current_async_library() + if not asynclib_name: + raise NoEventLoopError( + f"Not currently running on any asynchronous event loop. " + f"Available async backends: {', '.join(get_all_backends())}" + ) + + # We use our own dict instead of sys.modules to get the already imported back-end + # class because the appropriate modules in sys.modules could potentially be only + # partially initialized + try: + return loaded_backends[asynclib_name] + except KeyError: + module = import_module(f"anyio._backends._{asynclib_name}") + loaded_backends[asynclib_name] = module.backend_class + return module.backend_class + + +def current_async_library() -> str | None: + if sniffio is None: + # If sniffio is not installed, we assume we're either running asyncio or nothing + import asyncio + + try: + asyncio.get_running_loop() + return "asyncio" + except RuntimeError: + pass + else: + try: + return sniffio.current_async_library() + except sniffio.AsyncLibraryNotFoundError: + pass + + return None + + +def set_current_async_library(asynclib_name: str | None) -> Token | None: + # no-op if sniffio is not installed + if sniffio is None: + return None + + return sniffio.current_async_library_cvar.set(asynclib_name) + + +def reset_current_async_library(token: Token | None) -> None: + if token is not None: + sniffio.current_async_library_cvar.reset(token) diff --git a/.venv/lib/python3.10/site-packages/anyio/_core/_exceptions.py b/.venv/lib/python3.10/site-packages/anyio/_core/_exceptions.py new file mode 100644 index 0000000..3776bed --- /dev/null +++ b/.venv/lib/python3.10/site-packages/anyio/_core/_exceptions.py @@ -0,0 +1,156 @@ +from __future__ import annotations + +import sys +from collections.abc import Generator +from textwrap import dedent +from typing import Any + +if sys.version_info < (3, 11): + from exceptiongroup import BaseExceptionGroup + + +class BrokenResourceError(Exception): + """ + Raised when trying to use a resource that has been rendered unusable due to external + causes (e.g. a send stream whose peer has disconnected). + """ + + +class BrokenWorkerProcess(Exception): + """ + Raised by :meth:`~anyio.to_process.run_sync` if the worker process terminates abruptly or + otherwise misbehaves. + """ + + +class BrokenWorkerInterpreter(Exception): + """ + Raised by :meth:`~anyio.to_interpreter.run_sync` if an unexpected exception is + raised in the subinterpreter. + """ + + def __init__(self, excinfo: Any): + # This was adapted from concurrent.futures.interpreter.ExecutionFailed + msg = excinfo.formatted + if not msg: + if excinfo.type and excinfo.msg: + msg = f"{excinfo.type.__name__}: {excinfo.msg}" + else: + msg = excinfo.type.__name__ or excinfo.msg + + super().__init__(msg) + self.excinfo = excinfo + + def __str__(self) -> str: + try: + formatted = self.excinfo.errdisplay + except Exception: + return super().__str__() + else: + return dedent( + f""" + {super().__str__()} + + Uncaught in the interpreter: + + {formatted} + """.strip() + ) + + +class BusyResourceError(Exception): + """ + Raised when two tasks are trying to read from or write to the same resource + concurrently. + """ + + def __init__(self, action: str): + super().__init__(f"Another task is already {action} this resource") + + +class ClosedResourceError(Exception): + """Raised when trying to use a resource that has been closed.""" + + +class ConnectionFailed(OSError): + """ + Raised when a connection attempt fails. + + .. note:: This class inherits from :exc:`OSError` for backwards compatibility. + """ + + +def iterate_exceptions( + exception: BaseException, +) -> Generator[BaseException, None, None]: + if isinstance(exception, BaseExceptionGroup): + for exc in exception.exceptions: + yield from iterate_exceptions(exc) + else: + yield exception + + +class DelimiterNotFound(Exception): + """ + Raised during + :meth:`~anyio.streams.buffered.BufferedByteReceiveStream.receive_until` if the + maximum number of bytes has been read without the delimiter being found. + """ + + def __init__(self, max_bytes: int) -> None: + super().__init__( + f"The delimiter was not found among the first {max_bytes} bytes" + ) + + +class EndOfStream(Exception): + """ + Raised when trying to read from a stream that has been closed from the other end. + """ + + +class IncompleteRead(Exception): + """ + Raised during + :meth:`~anyio.streams.buffered.BufferedByteReceiveStream.receive_exactly` or + :meth:`~anyio.streams.buffered.BufferedByteReceiveStream.receive_until` if the + connection is closed before the requested amount of bytes has been read. + """ + + def __init__(self) -> None: + super().__init__( + "The stream was closed before the read operation could be completed" + ) + + +class TypedAttributeLookupError(LookupError): + """ + Raised by :meth:`~anyio.TypedAttributeProvider.extra` when the given typed attribute + is not found and no default value has been given. + """ + + +class WouldBlock(Exception): + """Raised by ``X_nowait`` functions if ``X()`` would block.""" + + +class NoEventLoopError(RuntimeError): + """ + Raised by several functions that require an event loop to be running in the current + thread when there is no running event loop. + + This is also raised by :func:`.from_thread.run` and :func:`.from_thread.run_sync` + if not calling from an AnyIO worker thread, and no ``token`` was passed. + """ + + +class RunFinishedError(RuntimeError): + """ + Raised by :func:`.from_thread.run` and :func:`.from_thread.run_sync` if the event + loop associated with the explicitly passed token has already finished. + """ + + def __init__(self) -> None: + super().__init__( + "The event loop associated with the given token has already finished" + ) diff --git a/.venv/lib/python3.10/site-packages/anyio/_core/_fileio.py b/.venv/lib/python3.10/site-packages/anyio/_core/_fileio.py new file mode 100644 index 0000000..3bb8c84 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/anyio/_core/_fileio.py @@ -0,0 +1,799 @@ +from __future__ import annotations + +import os +import pathlib +import sys +from collections.abc import ( + AsyncIterator, + Callable, + Iterable, + Iterator, + Sequence, +) +from dataclasses import dataclass +from functools import partial +from os import PathLike +from typing import ( + IO, + TYPE_CHECKING, + Any, + AnyStr, + ClassVar, + Final, + Generic, + overload, +) + +from .. import to_thread +from ..abc import AsyncResource + +if TYPE_CHECKING: + from types import ModuleType + + from _typeshed import OpenBinaryMode, OpenTextMode, ReadableBuffer, WriteableBuffer +else: + ReadableBuffer = OpenBinaryMode = OpenTextMode = WriteableBuffer = object + + +class AsyncFile(AsyncResource, Generic[AnyStr]): + """ + An asynchronous file object. + + This class wraps a standard file object and provides async friendly versions of the + following blocking methods (where available on the original file object): + + * read + * read1 + * readline + * readlines + * readinto + * readinto1 + * write + * writelines + * truncate + * seek + * tell + * flush + + All other methods are directly passed through. + + This class supports the asynchronous context manager protocol which closes the + underlying file at the end of the context block. + + This class also supports asynchronous iteration:: + + async with await open_file(...) as f: + async for line in f: + print(line) + """ + + def __init__(self, fp: IO[AnyStr]) -> None: + self._fp: Any = fp + + def __getattr__(self, name: str) -> object: + return getattr(self._fp, name) + + @property + def wrapped(self) -> IO[AnyStr]: + """The wrapped file object.""" + return self._fp + + async def __aiter__(self) -> AsyncIterator[AnyStr]: + while True: + line = await self.readline() + if line: + yield line + else: + break + + async def aclose(self) -> None: + return await to_thread.run_sync(self._fp.close) + + async def read(self, size: int = -1) -> AnyStr: + return await to_thread.run_sync(self._fp.read, size) + + async def read1(self: AsyncFile[bytes], size: int = -1) -> bytes: + return await to_thread.run_sync(self._fp.read1, size) + + async def readline(self) -> AnyStr: + return await to_thread.run_sync(self._fp.readline) + + async def readlines(self) -> list[AnyStr]: + return await to_thread.run_sync(self._fp.readlines) + + async def readinto(self: AsyncFile[bytes], b: WriteableBuffer) -> int: + return await to_thread.run_sync(self._fp.readinto, b) + + async def readinto1(self: AsyncFile[bytes], b: WriteableBuffer) -> int: + return await to_thread.run_sync(self._fp.readinto1, b) + + @overload + async def write(self: AsyncFile[bytes], b: ReadableBuffer) -> int: ... + + @overload + async def write(self: AsyncFile[str], b: str) -> int: ... + + async def write(self, b: ReadableBuffer | str) -> int: + return await to_thread.run_sync(self._fp.write, b) + + @overload + async def writelines( + self: AsyncFile[bytes], lines: Iterable[ReadableBuffer] + ) -> None: ... + + @overload + async def writelines(self: AsyncFile[str], lines: Iterable[str]) -> None: ... + + async def writelines(self, lines: Iterable[ReadableBuffer] | Iterable[str]) -> None: + return await to_thread.run_sync(self._fp.writelines, lines) + + async def truncate(self, size: int | None = None) -> int: + return await to_thread.run_sync(self._fp.truncate, size) + + async def seek(self, offset: int, whence: int | None = os.SEEK_SET) -> int: + return await to_thread.run_sync(self._fp.seek, offset, whence) + + async def tell(self) -> int: + return await to_thread.run_sync(self._fp.tell) + + async def flush(self) -> None: + return await to_thread.run_sync(self._fp.flush) + + +@overload +async def open_file( + file: str | PathLike[str] | int, + mode: OpenBinaryMode, + buffering: int = ..., + encoding: str | None = ..., + errors: str | None = ..., + newline: str | None = ..., + closefd: bool = ..., + opener: Callable[[str, int], int] | None = ..., +) -> AsyncFile[bytes]: ... + + +@overload +async def open_file( + file: str | PathLike[str] | int, + mode: OpenTextMode = ..., + buffering: int = ..., + encoding: str | None = ..., + errors: str | None = ..., + newline: str | None = ..., + closefd: bool = ..., + opener: Callable[[str, int], int] | None = ..., +) -> AsyncFile[str]: ... + + +async def open_file( + file: str | PathLike[str] | int, + mode: str = "r", + buffering: int = -1, + encoding: str | None = None, + errors: str | None = None, + newline: str | None = None, + closefd: bool = True, + opener: Callable[[str, int], int] | None = None, +) -> AsyncFile[Any]: + """ + Open a file asynchronously. + + The arguments are exactly the same as for the builtin :func:`open`. + + :return: an asynchronous file object + + """ + fp = await to_thread.run_sync( + open, file, mode, buffering, encoding, errors, newline, closefd, opener + ) + return AsyncFile(fp) + + +def wrap_file(file: IO[AnyStr]) -> AsyncFile[AnyStr]: + """ + Wrap an existing file as an asynchronous file. + + :param file: an existing file-like object + :return: an asynchronous file object + + """ + return AsyncFile(file) + + +@dataclass(eq=False) +class _PathIterator(AsyncIterator["Path"]): + iterator: Iterator[PathLike[str]] + + async def __anext__(self) -> Path: + nextval = await to_thread.run_sync( + next, self.iterator, None, abandon_on_cancel=True + ) + if nextval is None: + raise StopAsyncIteration from None + + return Path(nextval) + + +class Path: + """ + An asynchronous version of :class:`pathlib.Path`. + + This class cannot be substituted for :class:`pathlib.Path` or + :class:`pathlib.PurePath`, but it is compatible with the :class:`os.PathLike` + interface. + + It implements the Python 3.10 version of :class:`pathlib.Path` interface, except for + the deprecated :meth:`~pathlib.Path.link_to` method. + + Some methods may be unavailable or have limited functionality, based on the Python + version: + + * :meth:`~pathlib.Path.copy` (available on Python 3.14 or later) + * :meth:`~pathlib.Path.copy_into` (available on Python 3.14 or later) + * :meth:`~pathlib.Path.from_uri` (available on Python 3.13 or later) + * :meth:`~pathlib.PurePath.full_match` (available on Python 3.13 or later) + * :attr:`~pathlib.Path.info` (available on Python 3.14 or later) + * :meth:`~pathlib.Path.is_junction` (available on Python 3.12 or later) + * :meth:`~pathlib.PurePath.match` (the ``case_sensitive`` parameter is only + available on Python 3.13 or later) + * :meth:`~pathlib.Path.move` (available on Python 3.14 or later) + * :meth:`~pathlib.Path.move_into` (available on Python 3.14 or later) + * :meth:`~pathlib.PurePath.relative_to` (the ``walk_up`` parameter is only available + on Python 3.12 or later) + * :meth:`~pathlib.Path.walk` (available on Python 3.12 or later) + + Any methods that do disk I/O need to be awaited on. These methods are: + + * :meth:`~pathlib.Path.absolute` + * :meth:`~pathlib.Path.chmod` + * :meth:`~pathlib.Path.cwd` + * :meth:`~pathlib.Path.exists` + * :meth:`~pathlib.Path.expanduser` + * :meth:`~pathlib.Path.group` + * :meth:`~pathlib.Path.hardlink_to` + * :meth:`~pathlib.Path.home` + * :meth:`~pathlib.Path.is_block_device` + * :meth:`~pathlib.Path.is_char_device` + * :meth:`~pathlib.Path.is_dir` + * :meth:`~pathlib.Path.is_fifo` + * :meth:`~pathlib.Path.is_file` + * :meth:`~pathlib.Path.is_junction` + * :meth:`~pathlib.Path.is_mount` + * :meth:`~pathlib.Path.is_socket` + * :meth:`~pathlib.Path.is_symlink` + * :meth:`~pathlib.Path.lchmod` + * :meth:`~pathlib.Path.lstat` + * :meth:`~pathlib.Path.mkdir` + * :meth:`~pathlib.Path.open` + * :meth:`~pathlib.Path.owner` + * :meth:`~pathlib.Path.read_bytes` + * :meth:`~pathlib.Path.read_text` + * :meth:`~pathlib.Path.readlink` + * :meth:`~pathlib.Path.rename` + * :meth:`~pathlib.Path.replace` + * :meth:`~pathlib.Path.resolve` + * :meth:`~pathlib.Path.rmdir` + * :meth:`~pathlib.Path.samefile` + * :meth:`~pathlib.Path.stat` + * :meth:`~pathlib.Path.symlink_to` + * :meth:`~pathlib.Path.touch` + * :meth:`~pathlib.Path.unlink` + * :meth:`~pathlib.Path.walk` + * :meth:`~pathlib.Path.write_bytes` + * :meth:`~pathlib.Path.write_text` + + Additionally, the following methods return an async iterator yielding + :class:`~.Path` objects: + + * :meth:`~pathlib.Path.glob` + * :meth:`~pathlib.Path.iterdir` + * :meth:`~pathlib.Path.rglob` + """ + + __slots__ = "_path", "__weakref__" + + __weakref__: Any + + def __init__(self, *args: str | PathLike[str]) -> None: + self._path: Final[pathlib.Path] = pathlib.Path(*args) + + def __fspath__(self) -> str: + return self._path.__fspath__() + + if sys.version_info >= (3, 15): + + def __vfspath__(self) -> str: + return self._path.__vfspath__() + + def __str__(self) -> str: + return self._path.__str__() + + def __repr__(self) -> str: + return f"{self.__class__.__name__}({self.as_posix()!r})" + + def __bytes__(self) -> bytes: + return self._path.__bytes__() + + def __hash__(self) -> int: + return self._path.__hash__() + + def __eq__(self, other: object) -> bool: + target = other._path if isinstance(other, Path) else other + return self._path.__eq__(target) + + def __lt__(self, other: pathlib.PurePath | Path) -> bool: + target = other._path if isinstance(other, Path) else other + return self._path.__lt__(target) + + def __le__(self, other: pathlib.PurePath | Path) -> bool: + target = other._path if isinstance(other, Path) else other + return self._path.__le__(target) + + def __gt__(self, other: pathlib.PurePath | Path) -> bool: + target = other._path if isinstance(other, Path) else other + return self._path.__gt__(target) + + def __ge__(self, other: pathlib.PurePath | Path) -> bool: + target = other._path if isinstance(other, Path) else other + return self._path.__ge__(target) + + def __truediv__(self, other: str | PathLike[str]) -> Path: + return Path(self._path / other) + + def __rtruediv__(self, other: str | PathLike[str]) -> Path: + return Path(other) / self + + @property + def parts(self) -> tuple[str, ...]: + return self._path.parts + + @property + def drive(self) -> str: + return self._path.drive + + @property + def root(self) -> str: + return self._path.root + + @property + def anchor(self) -> str: + return self._path.anchor + + @property + def parents(self) -> Sequence[Path]: + return tuple(Path(p) for p in self._path.parents) + + @property + def parent(self) -> Path: + return Path(self._path.parent) + + @property + def name(self) -> str: + return self._path.name + + @property + def suffix(self) -> str: + return self._path.suffix + + @property + def suffixes(self) -> list[str]: + return self._path.suffixes + + @property + def stem(self) -> str: + return self._path.stem + + async def absolute(self) -> Path: + path = await to_thread.run_sync(self._path.absolute) + return Path(path) + + def as_posix(self) -> str: + return self._path.as_posix() + + def as_uri(self) -> str: + return self._path.as_uri() + + if sys.version_info >= (3, 13): + parser: ClassVar[ModuleType] = pathlib.Path.parser + + @classmethod + def from_uri(cls, uri: str) -> Path: + return Path(pathlib.Path.from_uri(uri)) + + def full_match( + self, path_pattern: str, *, case_sensitive: bool | None = None + ) -> bool: + return self._path.full_match(path_pattern, case_sensitive=case_sensitive) + + def match( + self, path_pattern: str, *, case_sensitive: bool | None = None + ) -> bool: + return self._path.match(path_pattern, case_sensitive=case_sensitive) + else: + + def match(self, path_pattern: str) -> bool: + return self._path.match(path_pattern) + + if sys.version_info >= (3, 14): + + @property + def info(self) -> Any: # TODO: add return type annotation when Typeshed gets it + return self._path.info + + async def copy( + self, + target: str | os.PathLike[str], + *, + follow_symlinks: bool = True, + preserve_metadata: bool = False, + ) -> Path: + func = partial( + self._path.copy, + follow_symlinks=follow_symlinks, + preserve_metadata=preserve_metadata, + ) + return Path(await to_thread.run_sync(func, pathlib.Path(target))) + + async def copy_into( + self, + target_dir: str | os.PathLike[str], + *, + follow_symlinks: bool = True, + preserve_metadata: bool = False, + ) -> Path: + func = partial( + self._path.copy_into, + follow_symlinks=follow_symlinks, + preserve_metadata=preserve_metadata, + ) + return Path(await to_thread.run_sync(func, pathlib.Path(target_dir))) + + async def move(self, target: str | os.PathLike[str]) -> Path: + # Upstream does not handle anyio.Path properly as a PathLike + target = pathlib.Path(target) + return Path(await to_thread.run_sync(self._path.move, target)) + + async def move_into( + self, + target_dir: str | os.PathLike[str], + ) -> Path: + return Path(await to_thread.run_sync(self._path.move_into, target_dir)) + + def is_relative_to(self, other: str | PathLike[str]) -> bool: + try: + self.relative_to(other) + return True + except ValueError: + return False + + async def chmod(self, mode: int, *, follow_symlinks: bool = True) -> None: + func = partial(os.chmod, follow_symlinks=follow_symlinks) + return await to_thread.run_sync(func, self._path, mode) + + @classmethod + async def cwd(cls) -> Path: + path = await to_thread.run_sync(pathlib.Path.cwd) + return cls(path) + + async def exists(self) -> bool: + return await to_thread.run_sync(self._path.exists, abandon_on_cancel=True) + + async def expanduser(self) -> Path: + return Path( + await to_thread.run_sync(self._path.expanduser, abandon_on_cancel=True) + ) + + if sys.version_info < (3, 12): + # Python 3.11 and earlier + def glob(self, pattern: str) -> AsyncIterator[Path]: + gen = self._path.glob(pattern) + return _PathIterator(gen) + elif (3, 12) <= sys.version_info < (3, 13): + # changed in Python 3.12: + # - The case_sensitive parameter was added. + def glob( + self, + pattern: str, + *, + case_sensitive: bool | None = None, + ) -> AsyncIterator[Path]: + gen = self._path.glob(pattern, case_sensitive=case_sensitive) + return _PathIterator(gen) + elif sys.version_info >= (3, 13): + # Changed in Python 3.13: + # - The recurse_symlinks parameter was added. + # - The pattern parameter accepts a path-like object. + def glob( # type: ignore[misc] # mypy doesn't allow for differing signatures in a conditional block + self, + pattern: str | PathLike[str], + *, + case_sensitive: bool | None = None, + recurse_symlinks: bool = False, + ) -> AsyncIterator[Path]: + gen = self._path.glob( + pattern, # type: ignore[arg-type] + case_sensitive=case_sensitive, + recurse_symlinks=recurse_symlinks, + ) + return _PathIterator(gen) + + async def group(self) -> str: + return await to_thread.run_sync(self._path.group, abandon_on_cancel=True) + + async def hardlink_to( + self, target: str | bytes | PathLike[str] | PathLike[bytes] + ) -> None: + if isinstance(target, Path): + target = target._path + + await to_thread.run_sync(os.link, target, self) + + @classmethod + async def home(cls) -> Path: + home_path = await to_thread.run_sync(pathlib.Path.home) + return cls(home_path) + + def is_absolute(self) -> bool: + return self._path.is_absolute() + + async def is_block_device(self) -> bool: + return await to_thread.run_sync( + self._path.is_block_device, abandon_on_cancel=True + ) + + async def is_char_device(self) -> bool: + return await to_thread.run_sync( + self._path.is_char_device, abandon_on_cancel=True + ) + + async def is_dir(self) -> bool: + return await to_thread.run_sync(self._path.is_dir, abandon_on_cancel=True) + + async def is_fifo(self) -> bool: + return await to_thread.run_sync(self._path.is_fifo, abandon_on_cancel=True) + + async def is_file(self) -> bool: + return await to_thread.run_sync(self._path.is_file, abandon_on_cancel=True) + + if sys.version_info >= (3, 12): + + async def is_junction(self) -> bool: + return await to_thread.run_sync(self._path.is_junction) + + async def is_mount(self) -> bool: + return await to_thread.run_sync( + os.path.ismount, self._path, abandon_on_cancel=True + ) + + if sys.version_info < (3, 15): + + def is_reserved(self) -> bool: + return self._path.is_reserved() + + async def is_socket(self) -> bool: + return await to_thread.run_sync(self._path.is_socket, abandon_on_cancel=True) + + async def is_symlink(self) -> bool: + return await to_thread.run_sync(self._path.is_symlink, abandon_on_cancel=True) + + async def iterdir(self) -> AsyncIterator[Path]: + gen = ( + self._path.iterdir() + if sys.version_info < (3, 13) + else await to_thread.run_sync(self._path.iterdir, abandon_on_cancel=True) + ) + async for path in _PathIterator(gen): + yield path + + def joinpath(self, *args: str | PathLike[str]) -> Path: + return Path(self._path.joinpath(*args)) + + async def lchmod(self, mode: int) -> None: + await to_thread.run_sync(self._path.lchmod, mode) + + async def lstat(self) -> os.stat_result: + return await to_thread.run_sync(self._path.lstat, abandon_on_cancel=True) + + async def mkdir( + self, mode: int = 0o777, parents: bool = False, exist_ok: bool = False + ) -> None: + await to_thread.run_sync(self._path.mkdir, mode, parents, exist_ok) + + @overload + async def open( + self, + mode: OpenBinaryMode, + buffering: int = ..., + encoding: str | None = ..., + errors: str | None = ..., + newline: str | None = ..., + ) -> AsyncFile[bytes]: ... + + @overload + async def open( + self, + mode: OpenTextMode = ..., + buffering: int = ..., + encoding: str | None = ..., + errors: str | None = ..., + newline: str | None = ..., + ) -> AsyncFile[str]: ... + + async def open( + self, + mode: str = "r", + buffering: int = -1, + encoding: str | None = None, + errors: str | None = None, + newline: str | None = None, + ) -> AsyncFile[Any]: + fp = await to_thread.run_sync( + self._path.open, mode, buffering, encoding, errors, newline + ) + return AsyncFile(fp) + + async def owner(self) -> str: + return await to_thread.run_sync(self._path.owner, abandon_on_cancel=True) + + async def read_bytes(self) -> bytes: + return await to_thread.run_sync(self._path.read_bytes) + + async def read_text( + self, encoding: str | None = None, errors: str | None = None + ) -> str: + return await to_thread.run_sync(self._path.read_text, encoding, errors) + + if sys.version_info >= (3, 12): + + def relative_to( + self, *other: str | PathLike[str], walk_up: bool = False + ) -> Path: + # relative_to() should work with any PathLike but it doesn't + others = [pathlib.Path(other) for other in other] + return Path(self._path.relative_to(*others, walk_up=walk_up)) + + else: + + def relative_to(self, *other: str | PathLike[str]) -> Path: + return Path(self._path.relative_to(*other)) + + async def readlink(self) -> Path: + target = await to_thread.run_sync(os.readlink, self._path) + return Path(target) + + async def rename(self, target: str | pathlib.PurePath | Path) -> Path: + if isinstance(target, Path): + target = target._path + + await to_thread.run_sync(self._path.rename, target) + return Path(target) + + async def replace(self, target: str | pathlib.PurePath | Path) -> Path: + if isinstance(target, Path): + target = target._path + + await to_thread.run_sync(self._path.replace, target) + return Path(target) + + async def resolve(self, strict: bool = False) -> Path: + func = partial(self._path.resolve, strict=strict) + return Path(await to_thread.run_sync(func, abandon_on_cancel=True)) + + if sys.version_info < (3, 12): + # Pre Python 3.12 + def rglob(self, pattern: str) -> AsyncIterator[Path]: + gen = self._path.rglob(pattern) + return _PathIterator(gen) + elif (3, 12) <= sys.version_info < (3, 13): + # Changed in Python 3.12: + # - The case_sensitive parameter was added. + def rglob( + self, pattern: str, *, case_sensitive: bool | None = None + ) -> AsyncIterator[Path]: + gen = self._path.rglob(pattern, case_sensitive=case_sensitive) + return _PathIterator(gen) + elif sys.version_info >= (3, 13): + # Changed in Python 3.13: + # - The recurse_symlinks parameter was added. + # - The pattern parameter accepts a path-like object. + def rglob( # type: ignore[misc] # mypy doesn't allow for differing signatures in a conditional block + self, + pattern: str | PathLike[str], + *, + case_sensitive: bool | None = None, + recurse_symlinks: bool = False, + ) -> AsyncIterator[Path]: + gen = self._path.rglob( + pattern, # type: ignore[arg-type] + case_sensitive=case_sensitive, + recurse_symlinks=recurse_symlinks, + ) + return _PathIterator(gen) + + async def rmdir(self) -> None: + await to_thread.run_sync(self._path.rmdir) + + async def samefile(self, other_path: str | PathLike[str]) -> bool: + if isinstance(other_path, Path): + other_path = other_path._path + + return await to_thread.run_sync( + self._path.samefile, other_path, abandon_on_cancel=True + ) + + async def stat(self, *, follow_symlinks: bool = True) -> os.stat_result: + func = partial(os.stat, follow_symlinks=follow_symlinks) + return await to_thread.run_sync(func, self._path, abandon_on_cancel=True) + + async def symlink_to( + self, + target: str | bytes | PathLike[str] | PathLike[bytes], + target_is_directory: bool = False, + ) -> None: + if isinstance(target, Path): + target = target._path + + await to_thread.run_sync(self._path.symlink_to, target, target_is_directory) + + async def touch(self, mode: int = 0o666, exist_ok: bool = True) -> None: + await to_thread.run_sync(self._path.touch, mode, exist_ok) + + async def unlink(self, missing_ok: bool = False) -> None: + try: + await to_thread.run_sync(self._path.unlink) + except FileNotFoundError: + if not missing_ok: + raise + + if sys.version_info >= (3, 12): + + async def walk( + self, + top_down: bool = True, + on_error: Callable[[OSError], object] | None = None, + follow_symlinks: bool = False, + ) -> AsyncIterator[tuple[Path, list[str], list[str]]]: + def get_next_value() -> tuple[pathlib.Path, list[str], list[str]] | None: + try: + return next(gen) + except StopIteration: + return None + + gen = self._path.walk(top_down, on_error, follow_symlinks) + while True: + value = await to_thread.run_sync(get_next_value) + if value is None: + return + + root, dirs, paths = value + yield Path(root), dirs, paths + + def with_name(self, name: str) -> Path: + return Path(self._path.with_name(name)) + + def with_stem(self, stem: str) -> Path: + return Path(self._path.with_name(stem + self._path.suffix)) + + def with_suffix(self, suffix: str) -> Path: + return Path(self._path.with_suffix(suffix)) + + def with_segments(self, *pathsegments: str | PathLike[str]) -> Path: + return Path(*pathsegments) + + async def write_bytes(self, data: bytes) -> int: + return await to_thread.run_sync(self._path.write_bytes, data) + + async def write_text( + self, + data: str, + encoding: str | None = None, + errors: str | None = None, + newline: str | None = None, + ) -> int: + return await to_thread.run_sync( + self._path.write_text, data, encoding, errors, newline + ) + + +PathLike.register(Path) diff --git a/.venv/lib/python3.10/site-packages/anyio/_core/_resources.py b/.venv/lib/python3.10/site-packages/anyio/_core/_resources.py new file mode 100644 index 0000000..b9a5344 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/anyio/_core/_resources.py @@ -0,0 +1,18 @@ +from __future__ import annotations + +from ..abc import AsyncResource +from ._tasks import CancelScope + + +async def aclose_forcefully(resource: AsyncResource) -> None: + """ + Close an asynchronous resource in a cancelled scope. + + Doing this closes the resource without waiting on anything. + + :param resource: the resource to close + + """ + with CancelScope() as scope: + scope.cancel() + await resource.aclose() diff --git a/.venv/lib/python3.10/site-packages/anyio/_core/_signals.py b/.venv/lib/python3.10/site-packages/anyio/_core/_signals.py new file mode 100644 index 0000000..e24c79e --- /dev/null +++ b/.venv/lib/python3.10/site-packages/anyio/_core/_signals.py @@ -0,0 +1,29 @@ +from __future__ import annotations + +from collections.abc import AsyncIterator +from contextlib import AbstractContextManager +from signal import Signals + +from ._eventloop import get_async_backend + + +def open_signal_receiver( + *signals: Signals, +) -> AbstractContextManager[AsyncIterator[Signals]]: + """ + Start receiving operating system signals. + + :param signals: signals to receive (e.g. ``signal.SIGINT``) + :return: an asynchronous context manager for an asynchronous iterator which yields + signal numbers + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + .. warning:: Windows does not support signals natively so it is best to avoid + relying on this in cross-platform applications. + + .. warning:: On asyncio, this permanently replaces any previous signal handler for + the given signals, as set via :meth:`~asyncio.loop.add_signal_handler`. + + """ + return get_async_backend().open_signal_receiver(*signals) diff --git a/.venv/lib/python3.10/site-packages/anyio/_core/_sockets.py b/.venv/lib/python3.10/site-packages/anyio/_core/_sockets.py new file mode 100644 index 0000000..6c99b3a --- /dev/null +++ b/.venv/lib/python3.10/site-packages/anyio/_core/_sockets.py @@ -0,0 +1,1003 @@ +from __future__ import annotations + +import errno +import os +import socket +import ssl +import stat +import sys +from collections.abc import Awaitable +from dataclasses import dataclass +from ipaddress import IPv4Address, IPv6Address, ip_address +from os import PathLike, chmod +from socket import AddressFamily, SocketKind +from typing import TYPE_CHECKING, Any, Literal, cast, overload + +from .. import ConnectionFailed, to_thread +from ..abc import ( + ByteStreamConnectable, + ConnectedUDPSocket, + ConnectedUNIXDatagramSocket, + IPAddressType, + IPSockAddrType, + SocketListener, + SocketStream, + UDPSocket, + UNIXDatagramSocket, + UNIXSocketStream, +) +from ..streams.stapled import MultiListener +from ..streams.tls import TLSConnectable, TLSStream +from ._eventloop import get_async_backend +from ._resources import aclose_forcefully +from ._synchronization import Event +from ._tasks import create_task_group, move_on_after + +if TYPE_CHECKING: + from _typeshed import FileDescriptorLike +else: + FileDescriptorLike = object + +if sys.version_info < (3, 11): + from exceptiongroup import ExceptionGroup + +if sys.version_info >= (3, 12): + from typing import override +else: + from typing_extensions import override + +if sys.version_info < (3, 13): + from typing_extensions import deprecated +else: + from warnings import deprecated + +IPPROTO_IPV6 = getattr(socket, "IPPROTO_IPV6", 41) # https://bugs.python.org/issue29515 + +AnyIPAddressFamily = Literal[ + AddressFamily.AF_UNSPEC, AddressFamily.AF_INET, AddressFamily.AF_INET6 +] +IPAddressFamily = Literal[AddressFamily.AF_INET, AddressFamily.AF_INET6] + + +# tls_hostname given +@overload +async def connect_tcp( + remote_host: IPAddressType, + remote_port: int, + *, + local_host: IPAddressType | None = ..., + ssl_context: ssl.SSLContext | None = ..., + tls_standard_compatible: bool = ..., + tls_hostname: str, + happy_eyeballs_delay: float = ..., +) -> TLSStream: ... + + +# ssl_context given +@overload +async def connect_tcp( + remote_host: IPAddressType, + remote_port: int, + *, + local_host: IPAddressType | None = ..., + ssl_context: ssl.SSLContext, + tls_standard_compatible: bool = ..., + tls_hostname: str | None = ..., + happy_eyeballs_delay: float = ..., +) -> TLSStream: ... + + +# tls=True +@overload +async def connect_tcp( + remote_host: IPAddressType, + remote_port: int, + *, + local_host: IPAddressType | None = ..., + tls: Literal[True], + ssl_context: ssl.SSLContext | None = ..., + tls_standard_compatible: bool = ..., + tls_hostname: str | None = ..., + happy_eyeballs_delay: float = ..., +) -> TLSStream: ... + + +# tls=False +@overload +async def connect_tcp( + remote_host: IPAddressType, + remote_port: int, + *, + local_host: IPAddressType | None = ..., + tls: Literal[False], + ssl_context: ssl.SSLContext | None = ..., + tls_standard_compatible: bool = ..., + tls_hostname: str | None = ..., + happy_eyeballs_delay: float = ..., +) -> SocketStream: ... + + +# No TLS arguments +@overload +async def connect_tcp( + remote_host: IPAddressType, + remote_port: int, + *, + local_host: IPAddressType | None = ..., + happy_eyeballs_delay: float = ..., +) -> SocketStream: ... + + +async def connect_tcp( + remote_host: IPAddressType, + remote_port: int, + *, + local_host: IPAddressType | None = None, + tls: bool = False, + ssl_context: ssl.SSLContext | None = None, + tls_standard_compatible: bool = True, + tls_hostname: str | None = None, + happy_eyeballs_delay: float = 0.25, +) -> SocketStream | TLSStream: + """ + Connect to a host using the TCP protocol. + + This function implements the stateless version of the Happy Eyeballs algorithm (RFC + 6555). If ``remote_host`` is a host name that resolves to multiple IP addresses, + each one is tried until one connection attempt succeeds. If the first attempt does + not connected within 250 milliseconds, a second attempt is started using the next + address in the list, and so on. On IPv6 enabled systems, an IPv6 address (if + available) is tried first. + + When the connection has been established, a TLS handshake will be done if either + ``ssl_context`` or ``tls_hostname`` is not ``None``, or if ``tls`` is ``True``. + + :param remote_host: the IP address or host name to connect to + :param remote_port: port on the target host to connect to + :param local_host: the interface address or name to bind the socket to before + connecting + :param tls: ``True`` to do a TLS handshake with the connected stream and return a + :class:`~anyio.streams.tls.TLSStream` instead + :param ssl_context: the SSL context object to use (if omitted, a default context is + created) + :param tls_standard_compatible: If ``True``, performs the TLS shutdown handshake + before closing the stream and requires that the server does this as well. + Otherwise, :exc:`~ssl.SSLEOFError` may be raised during reads from the stream. + Some protocols, such as HTTP, require this option to be ``False``. + See :meth:`~ssl.SSLContext.wrap_socket` for details. + :param tls_hostname: host name to check the server certificate against (defaults to + the value of ``remote_host``) + :param happy_eyeballs_delay: delay (in seconds) before starting the next connection + attempt + :return: a socket stream object if no TLS handshake was done, otherwise a TLS stream + :raises ConnectionFailed: if the connection fails + + """ + # Placed here due to https://github.com/python/mypy/issues/7057 + connected_stream: SocketStream | None = None + + async def try_connect(remote_host: str, event: Event) -> None: + nonlocal connected_stream + try: + stream = await asynclib.connect_tcp(remote_host, remote_port, local_address) + except OSError as exc: + oserrors.append(exc) + return + else: + if connected_stream is None: + connected_stream = stream + tg.cancel_scope.cancel() + else: + await stream.aclose() + finally: + event.set() + + asynclib = get_async_backend() + local_address: IPSockAddrType | None = None + family = socket.AF_UNSPEC + if local_host: + gai_res = await getaddrinfo(str(local_host), None) + family, *_, local_address = gai_res[0] + + target_host = str(remote_host) + try: + addr_obj = ip_address(remote_host) + except ValueError: + addr_obj = None + + if addr_obj is not None: + if isinstance(addr_obj, IPv6Address): + target_addrs = [(socket.AF_INET6, addr_obj.compressed)] + else: + target_addrs = [(socket.AF_INET, addr_obj.compressed)] + else: + # getaddrinfo() will raise an exception if name resolution fails + gai_res = await getaddrinfo( + target_host, remote_port, family=family, type=socket.SOCK_STREAM + ) + + # Organize the list so that the first address is an IPv6 address (if available) + # and the second one is an IPv4 addresses. The rest can be in whatever order. + v6_found = v4_found = False + target_addrs = [] + for af, *_, sa in gai_res: + if af == socket.AF_INET6 and not v6_found: + v6_found = True + target_addrs.insert(0, (af, sa[0])) + elif af == socket.AF_INET and not v4_found and v6_found: + v4_found = True + target_addrs.insert(1, (af, sa[0])) + else: + target_addrs.append((af, sa[0])) + + oserrors: list[OSError] = [] + try: + async with create_task_group() as tg: + for _af, addr in target_addrs: + event = Event() + tg.start_soon(try_connect, addr, event) + with move_on_after(happy_eyeballs_delay): + await event.wait() + + if connected_stream is None: + cause = ( + oserrors[0] + if len(oserrors) == 1 + else ExceptionGroup("multiple connection attempts failed", oserrors) + ) + raise OSError("All connection attempts failed") from cause + finally: + oserrors.clear() + + if tls or tls_hostname or ssl_context: + try: + return await TLSStream.wrap( + connected_stream, + server_side=False, + hostname=tls_hostname or str(remote_host), + ssl_context=ssl_context, + standard_compatible=tls_standard_compatible, + ) + except BaseException: + await aclose_forcefully(connected_stream) + raise + + return connected_stream + + +async def connect_unix(path: str | bytes | PathLike[Any]) -> UNIXSocketStream: + """ + Connect to the given UNIX socket. + + Not available on Windows. + + :param path: path to the socket + :return: a socket stream object + :raises ConnectionFailed: if the connection fails + + """ + path = os.fspath(path) + return await get_async_backend().connect_unix(path) + + +async def create_tcp_listener( + *, + local_host: IPAddressType | None = None, + local_port: int = 0, + family: AnyIPAddressFamily = socket.AddressFamily.AF_UNSPEC, + backlog: int = 65536, + reuse_port: bool = False, +) -> MultiListener[SocketStream]: + """ + Create a TCP socket listener. + + :param local_port: port number to listen on + :param local_host: IP address of the interface to listen on. If omitted, listen on + all IPv4 and IPv6 interfaces. To listen on all interfaces on a specific address + family, use ``0.0.0.0`` for IPv4 or ``::`` for IPv6. + :param family: address family (used if ``local_host`` was omitted) + :param backlog: maximum number of queued incoming connections (up to a maximum of + 2**16, or 65536) + :param reuse_port: ``True`` to allow multiple sockets to bind to the same + address/port (not supported on Windows) + :return: a multi-listener object containing one or more socket listeners + :raises OSError: if there's an error creating a socket, or binding to one or more + interfaces failed + + """ + asynclib = get_async_backend() + backlog = min(backlog, 65536) + local_host = str(local_host) if local_host is not None else None + + def setup_raw_socket( + fam: AddressFamily, + bind_addr: tuple[str, int] | tuple[str, int, int, int], + *, + v6only: bool = True, + ) -> socket.socket: + sock = socket.socket(fam) + try: + sock.setblocking(False) + + if fam == AddressFamily.AF_INET6: + sock.setsockopt(IPPROTO_IPV6, socket.IPV6_V6ONLY, v6only) + + # For Windows, enable exclusive address use. For others, enable address + # reuse. + if sys.platform == "win32": + sock.setsockopt(socket.SOL_SOCKET, socket.SO_EXCLUSIVEADDRUSE, 1) + else: + sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + + if reuse_port: + sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) + + # Workaround for #554 + if fam == socket.AF_INET6 and "%" in bind_addr[0]: + addr, scope_id = bind_addr[0].split("%", 1) + bind_addr = (addr, bind_addr[1], 0, int(scope_id)) + + sock.bind(bind_addr) + sock.listen(backlog) + except BaseException: + sock.close() + raise + + return sock + + # We passing type=0 on non-Windows platforms as a workaround for a uvloop bug + # where we don't get the correct scope ID for IPv6 link-local addresses when passing + # type=socket.SOCK_STREAM to getaddrinfo(): + # https://github.com/MagicStack/uvloop/issues/539 + gai_res = await getaddrinfo( + local_host, + local_port, + family=family, + type=socket.SOCK_STREAM if sys.platform == "win32" else 0, + flags=socket.AI_PASSIVE | socket.AI_ADDRCONFIG, + ) + + # The set comprehension is here to work around a glibc bug: + # https://sourceware.org/bugzilla/show_bug.cgi?id=14969 + sockaddrs = sorted({res for res in gai_res if res[1] == SocketKind.SOCK_STREAM}) + + # Special case for dual-stack binding on the "any" interface + if ( + local_host is None + and family == AddressFamily.AF_UNSPEC + and socket.has_dualstack_ipv6() + and any(fam == AddressFamily.AF_INET6 for fam, *_ in gai_res) + ): + raw_socket = setup_raw_socket( + AddressFamily.AF_INET6, ("::", local_port), v6only=False + ) + listener = asynclib.create_tcp_listener(raw_socket) + return MultiListener([listener]) + + errors: list[OSError] = [] + try: + for _ in range(len(sockaddrs)): + listeners: list[SocketListener] = [] + bound_ephemeral_port = local_port + try: + for fam, *_, sockaddr in sockaddrs: + sockaddr = sockaddr[0], bound_ephemeral_port, *sockaddr[2:] + raw_socket = setup_raw_socket(fam, sockaddr) + + # Store the assigned port if an ephemeral port was requested, so + # we'll bind to the same port on all interfaces + if local_port == 0 and len(gai_res) > 1: + bound_ephemeral_port = raw_socket.getsockname()[1] + + listeners.append(asynclib.create_tcp_listener(raw_socket)) + except BaseException as exc: + for listener in listeners: + await listener.aclose() + + # If an ephemeral port was requested but binding the assigned port + # failed for another interface, rotate the address list and try again + if ( + isinstance(exc, OSError) + and exc.errno == errno.EADDRINUSE + and local_port == 0 + and bound_ephemeral_port + ): + errors.append(exc) + sockaddrs.append(sockaddrs.pop(0)) + continue + + raise + + return MultiListener(listeners) + + raise OSError( + f"Could not create {len(sockaddrs)} listeners with a consistent port" + ) from ExceptionGroup("Several bind attempts failed", errors) + finally: + del errors # Prevent reference cycles + + +async def create_unix_listener( + path: str | bytes | PathLike[Any], + *, + mode: int | None = None, + backlog: int = 65536, +) -> SocketListener: + """ + Create a UNIX socket listener. + + Not available on Windows. + + :param path: path of the socket + :param mode: permissions to set on the socket + :param backlog: maximum number of queued incoming connections (up to a maximum of + 2**16, or 65536) + :return: a listener object + + .. versionchanged:: 3.0 + If a socket already exists on the file system in the given path, it will be + removed first. + + """ + backlog = min(backlog, 65536) + raw_socket = await setup_unix_local_socket(path, mode, socket.SOCK_STREAM) + try: + raw_socket.listen(backlog) + return get_async_backend().create_unix_listener(raw_socket) + except BaseException: + raw_socket.close() + raise + + +async def create_udp_socket( + family: AnyIPAddressFamily = AddressFamily.AF_UNSPEC, + *, + local_host: IPAddressType | None = None, + local_port: int = 0, + reuse_port: bool = False, +) -> UDPSocket: + """ + Create a UDP socket. + + If ``port`` has been given, the socket will be bound to this port on the local + machine, making this socket suitable for providing UDP based services. + + :param family: address family (``AF_INET`` or ``AF_INET6``) – automatically + determined from ``local_host`` if omitted + :param local_host: IP address or host name of the local interface to bind to + :param local_port: local port to bind to + :param reuse_port: ``True`` to allow multiple sockets to bind to the same + address/port (not supported on Windows) + :return: a UDP socket + + """ + if family is AddressFamily.AF_UNSPEC and not local_host: + raise ValueError('Either "family" or "local_host" must be given') + + if local_host: + gai_res = await getaddrinfo( + str(local_host), + local_port, + family=family, + type=socket.SOCK_DGRAM, + flags=socket.AI_PASSIVE | socket.AI_ADDRCONFIG, + ) + family = cast(AnyIPAddressFamily, gai_res[0][0]) + local_address = gai_res[0][-1] + elif family is AddressFamily.AF_INET6: + local_address = ("::", 0) + else: + local_address = ("0.0.0.0", 0) + + sock = await get_async_backend().create_udp_socket( + family, local_address, None, reuse_port + ) + return cast(UDPSocket, sock) + + +async def create_connected_udp_socket( + remote_host: IPAddressType, + remote_port: int, + *, + family: AnyIPAddressFamily = AddressFamily.AF_UNSPEC, + local_host: IPAddressType | None = None, + local_port: int = 0, + reuse_port: bool = False, +) -> ConnectedUDPSocket: + """ + Create a connected UDP socket. + + Connected UDP sockets can only communicate with the specified remote host/port, an + any packets sent from other sources are dropped. + + :param remote_host: remote host to set as the default target + :param remote_port: port on the remote host to set as the default target + :param family: address family (``AF_INET`` or ``AF_INET6``) – automatically + determined from ``local_host`` or ``remote_host`` if omitted + :param local_host: IP address or host name of the local interface to bind to + :param local_port: local port to bind to + :param reuse_port: ``True`` to allow multiple sockets to bind to the same + address/port (not supported on Windows) + :return: a connected UDP socket + + """ + local_address = None + if local_host: + gai_res = await getaddrinfo( + str(local_host), + local_port, + family=family, + type=socket.SOCK_DGRAM, + flags=socket.AI_PASSIVE | socket.AI_ADDRCONFIG, + ) + family = cast(AnyIPAddressFamily, gai_res[0][0]) + local_address = gai_res[0][-1] + + gai_res = await getaddrinfo( + str(remote_host), remote_port, family=family, type=socket.SOCK_DGRAM + ) + family = cast(AnyIPAddressFamily, gai_res[0][0]) + remote_address = gai_res[0][-1] + + sock = await get_async_backend().create_udp_socket( + family, local_address, remote_address, reuse_port + ) + return cast(ConnectedUDPSocket, sock) + + +async def create_unix_datagram_socket( + *, + local_path: None | str | bytes | PathLike[Any] = None, + local_mode: int | None = None, +) -> UNIXDatagramSocket: + """ + Create a UNIX datagram socket. + + Not available on Windows. + + If ``local_path`` has been given, the socket will be bound to this path, making this + socket suitable for receiving datagrams from other processes. Other processes can + send datagrams to this socket only if ``local_path`` is set. + + If a socket already exists on the file system in the ``local_path``, it will be + removed first. + + :param local_path: the path on which to bind to + :param local_mode: permissions to set on the local socket + :return: a UNIX datagram socket + + """ + raw_socket = await setup_unix_local_socket( + local_path, local_mode, socket.SOCK_DGRAM + ) + return await get_async_backend().create_unix_datagram_socket(raw_socket, None) + + +async def create_connected_unix_datagram_socket( + remote_path: str | bytes | PathLike[Any], + *, + local_path: None | str | bytes | PathLike[Any] = None, + local_mode: int | None = None, +) -> ConnectedUNIXDatagramSocket: + """ + Create a connected UNIX datagram socket. + + Connected datagram sockets can only communicate with the specified remote path. + + If ``local_path`` has been given, the socket will be bound to this path, making + this socket suitable for receiving datagrams from other processes. Other processes + can send datagrams to this socket only if ``local_path`` is set. + + If a socket already exists on the file system in the ``local_path``, it will be + removed first. + + :param remote_path: the path to set as the default target + :param local_path: the path on which to bind to + :param local_mode: permissions to set on the local socket + :return: a connected UNIX datagram socket + + """ + remote_path = os.fspath(remote_path) + raw_socket = await setup_unix_local_socket( + local_path, local_mode, socket.SOCK_DGRAM + ) + return await get_async_backend().create_unix_datagram_socket( + raw_socket, remote_path + ) + + +async def getaddrinfo( + host: bytes | str | None, + port: str | int | None, + *, + family: int | AddressFamily = 0, + type: int | SocketKind = 0, + proto: int = 0, + flags: int = 0, +) -> list[tuple[AddressFamily, SocketKind, int, str, tuple[str, int]]]: + """ + Look up a numeric IP address given a host name. + + Internationalized domain names are translated according to the (non-transitional) + IDNA 2008 standard. + + .. note:: 4-tuple IPv6 socket addresses are automatically converted to 2-tuples of + (host, port), unlike what :func:`socket.getaddrinfo` does. + + :param host: host name + :param port: port number + :param family: socket family (`'AF_INET``, ...) + :param type: socket type (``SOCK_STREAM``, ...) + :param proto: protocol number + :param flags: flags to pass to upstream ``getaddrinfo()`` + :return: list of tuples containing (family, type, proto, canonname, sockaddr) + + .. seealso:: :func:`socket.getaddrinfo` + + """ + # Handle unicode hostnames + if isinstance(host, str): + try: + encoded_host: bytes | None = host.encode("ascii") + except UnicodeEncodeError: + import idna + + encoded_host = idna.encode(host, uts46=True) + else: + encoded_host = host + + gai_res = await get_async_backend().getaddrinfo( + encoded_host, port, family=family, type=type, proto=proto, flags=flags + ) + return [ + (family, type, proto, canonname, convert_ipv6_sockaddr(sockaddr)) + for family, type, proto, canonname, sockaddr in gai_res + # filter out IPv6 results when IPv6 is disabled + if not isinstance(sockaddr[0], int) + ] + + +def getnameinfo(sockaddr: IPSockAddrType, flags: int = 0) -> Awaitable[tuple[str, str]]: + """ + Look up the host name of an IP address. + + :param sockaddr: socket address (e.g. (ipaddress, port) for IPv4) + :param flags: flags to pass to upstream ``getnameinfo()`` + :return: a tuple of (host name, service name) + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + .. seealso:: :func:`socket.getnameinfo` + + """ + return get_async_backend().getnameinfo(sockaddr, flags) + + +@deprecated("This function is deprecated; use `wait_readable` instead") +def wait_socket_readable(sock: socket.socket) -> Awaitable[None]: + """ + .. deprecated:: 4.7.0 + Use :func:`wait_readable` instead. + + Wait until the given socket has data to be read. + + .. warning:: Only use this on raw sockets that have not been wrapped by any higher + level constructs like socket streams! + + :param sock: a socket object + :raises ~anyio.ClosedResourceError: if the socket was closed while waiting for the + socket to become readable + :raises ~anyio.BusyResourceError: if another task is already waiting for the socket + to become readable + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + return get_async_backend().wait_readable(sock.fileno()) + + +@deprecated("This function is deprecated; use `wait_writable` instead") +def wait_socket_writable(sock: socket.socket) -> Awaitable[None]: + """ + .. deprecated:: 4.7.0 + Use :func:`wait_writable` instead. + + Wait until the given socket can be written to. + + This does **NOT** work on Windows when using the asyncio backend with a proactor + event loop (default on py3.8+). + + .. warning:: Only use this on raw sockets that have not been wrapped by any higher + level constructs like socket streams! + + :param sock: a socket object + :raises ~anyio.ClosedResourceError: if the socket was closed while waiting for the + socket to become writable + :raises ~anyio.BusyResourceError: if another task is already waiting for the socket + to become writable + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + return get_async_backend().wait_writable(sock.fileno()) + + +def wait_readable(obj: FileDescriptorLike) -> Awaitable[None]: + """ + Wait until the given object has data to be read. + + On Unix systems, ``obj`` must either be an integer file descriptor, or else an + object with a ``.fileno()`` method which returns an integer file descriptor. Any + kind of file descriptor can be passed, though the exact semantics will depend on + your kernel. For example, this probably won't do anything useful for on-disk files. + + On Windows systems, ``obj`` must either be an integer ``SOCKET`` handle, or else an + object with a ``.fileno()`` method which returns an integer ``SOCKET`` handle. File + descriptors aren't supported, and neither are handles that refer to anything besides + a ``SOCKET``. + + On backends where this functionality is not natively provided (asyncio + ``ProactorEventLoop`` on Windows), it is provided using a separate selector thread + which is set to shut down when the interpreter shuts down. + + .. warning:: Don't use this on raw sockets that have been wrapped by any higher + level constructs like socket streams! + + :param obj: an object with a ``.fileno()`` method or an integer handle + :raises ~anyio.ClosedResourceError: if the object was closed while waiting for the + object to become readable + :raises ~anyio.BusyResourceError: if another task is already waiting for the object + to become readable + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + return get_async_backend().wait_readable(obj) + + +def wait_writable(obj: FileDescriptorLike) -> Awaitable[None]: + """ + Wait until the given object can be written to. + + :param obj: an object with a ``.fileno()`` method or an integer handle + :raises ~anyio.ClosedResourceError: if the object was closed while waiting for the + object to become writable + :raises ~anyio.BusyResourceError: if another task is already waiting for the object + to become writable + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + .. seealso:: See the documentation of :func:`wait_readable` for the definition of + ``obj`` and notes on backend compatibility. + + .. warning:: Don't use this on raw sockets that have been wrapped by any higher + level constructs like socket streams! + + """ + return get_async_backend().wait_writable(obj) + + +def notify_closing(obj: FileDescriptorLike) -> None: + """ + Call this before closing a file descriptor (on Unix) or socket (on + Windows). This will cause any `wait_readable` or `wait_writable` + calls on the given object to immediately wake up and raise + `~anyio.ClosedResourceError`. + + This doesn't actually close the object – you still have to do that + yourself afterwards. Also, you want to be careful to make sure no + new tasks start waiting on the object in between when you call this + and when it's actually closed. So to close something properly, you + usually want to do these steps in order: + + 1. Explicitly mark the object as closed, so that any new attempts + to use it will abort before they start. + 2. Call `notify_closing` to wake up any already-existing users. + 3. Actually close the object. + + It's also possible to do them in a different order if that's more + convenient, *but only if* you make sure not to have any checkpoints in + between the steps. This way they all happen in a single atomic + step, so other tasks won't be able to tell what order they happened + in anyway. + + :param obj: an object with a ``.fileno()`` method or an integer handle + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + get_async_backend().notify_closing(obj) + + +# +# Private API +# + + +def convert_ipv6_sockaddr( + sockaddr: tuple[str, int, int, int] | tuple[str, int], +) -> tuple[str, int]: + """ + Convert a 4-tuple IPv6 socket address to a 2-tuple (address, port) format. + + If the scope ID is nonzero, it is added to the address, separated with ``%``. + Otherwise the flow id and scope id are simply cut off from the tuple. + Any other kinds of socket addresses are returned as-is. + + :param sockaddr: the result of :meth:`~socket.socket.getsockname` + :return: the converted socket address + + """ + # This is more complicated than it should be because of MyPy + if isinstance(sockaddr, tuple) and len(sockaddr) == 4: + host, port, flowinfo, scope_id = sockaddr + if scope_id: + # PyPy (as of v7.3.11) leaves the interface name in the result, so + # we discard it and only get the scope ID from the end + # (https://foss.heptapod.net/pypy/pypy/-/issues/3938) + host = host.split("%")[0] + + # Add scope_id to the address + return f"{host}%{scope_id}", port + else: + return host, port + else: + return sockaddr + + +async def setup_unix_local_socket( + path: None | str | bytes | PathLike[Any], + mode: int | None, + socktype: int, +) -> socket.socket: + """ + Create a UNIX local socket object, deleting the socket at the given path if it + exists. + + Not available on Windows. + + :param path: path of the socket + :param mode: permissions to set on the socket + :param socktype: socket.SOCK_STREAM or socket.SOCK_DGRAM + + """ + path_str: str | None + if path is not None: + path_str = os.fsdecode(path) + + # Linux abstract namespace sockets aren't backed by a concrete file so skip stat call + if not path_str.startswith("\0"): + # Copied from pathlib... + try: + stat_result = os.stat(path) + except OSError as e: + if e.errno not in ( + errno.ENOENT, + errno.ENOTDIR, + errno.EBADF, + errno.ELOOP, + ): + raise + else: + if stat.S_ISSOCK(stat_result.st_mode): + os.unlink(path) + else: + path_str = None + + raw_socket = socket.socket(socket.AF_UNIX, socktype) + raw_socket.setblocking(False) + + if path_str is not None: + try: + await to_thread.run_sync(raw_socket.bind, path_str, abandon_on_cancel=True) + if mode is not None: + await to_thread.run_sync(chmod, path_str, mode, abandon_on_cancel=True) + except BaseException: + raw_socket.close() + raise + + return raw_socket + + +@dataclass +class TCPConnectable(ByteStreamConnectable): + """ + Connects to a TCP server at the given host and port. + + :param host: host name or IP address of the server + :param port: TCP port number of the server + """ + + host: str | IPv4Address | IPv6Address + port: int + + def __post_init__(self) -> None: + if self.port < 1 or self.port > 65535: + raise ValueError("TCP port number out of range") + + @override + async def connect(self) -> SocketStream: + try: + return await connect_tcp(self.host, self.port) + except OSError as exc: + raise ConnectionFailed( + f"error connecting to {self.host}:{self.port}: {exc}" + ) from exc + + +@dataclass +class UNIXConnectable(ByteStreamConnectable): + """ + Connects to a UNIX domain socket at the given path. + + :param path: the file system path of the socket + """ + + path: str | bytes | PathLike[str] | PathLike[bytes] + + @override + async def connect(self) -> UNIXSocketStream: + try: + return await connect_unix(self.path) + except OSError as exc: + raise ConnectionFailed(f"error connecting to {self.path!r}: {exc}") from exc + + +def as_connectable( + remote: ByteStreamConnectable + | tuple[str | IPv4Address | IPv6Address, int] + | str + | bytes + | PathLike[str], + /, + *, + tls: bool = False, + ssl_context: ssl.SSLContext | None = None, + tls_hostname: str | None = None, + tls_standard_compatible: bool = True, +) -> ByteStreamConnectable: + """ + Return a byte stream connectable from the given object. + + If a bytestream connectable is given, it is returned unchanged. + If a tuple of (host, port) is given, a TCP connectable is returned. + If a string or bytes path is given, a UNIX connectable is returned. + + If ``tls=True``, the connectable will be wrapped in a + :class:`~.streams.tls.TLSConnectable`. + + :param remote: a connectable, a tuple of (host, port) or a path to a UNIX socket + :param tls: if ``True``, wrap the plaintext connectable in a + :class:`~.streams.tls.TLSConnectable`, using the provided TLS settings) + :param ssl_context: if ``tls=True``, the SSLContext object to use (if not provided, + a secure default will be created) + :param tls_hostname: if ``tls=True``, host name of the server to use for checking + the server certificate (defaults to the host portion of the address for TCP + connectables) + :param tls_standard_compatible: if ``False`` and ``tls=True``, makes the TLS stream + skip the closing handshake when closing the connection, so it won't raise an + exception if the server does the same + + """ + connectable: TCPConnectable | UNIXConnectable | TLSConnectable + if isinstance(remote, ByteStreamConnectable): + return remote + elif isinstance(remote, tuple) and len(remote) == 2: + connectable = TCPConnectable(*remote) + elif isinstance(remote, (str, bytes, PathLike)): + connectable = UNIXConnectable(remote) + else: + raise TypeError(f"cannot convert {remote!r} to a connectable") + + if tls: + if not tls_hostname and isinstance(connectable, TCPConnectable): + tls_hostname = str(connectable.host) + + connectable = TLSConnectable( + connectable, + ssl_context=ssl_context, + hostname=tls_hostname, + standard_compatible=tls_standard_compatible, + ) + + return connectable diff --git a/.venv/lib/python3.10/site-packages/anyio/_core/_streams.py b/.venv/lib/python3.10/site-packages/anyio/_core/_streams.py new file mode 100644 index 0000000..2b9c7df --- /dev/null +++ b/.venv/lib/python3.10/site-packages/anyio/_core/_streams.py @@ -0,0 +1,52 @@ +from __future__ import annotations + +import math +from typing import TypeVar +from warnings import warn + +from ..streams.memory import ( + MemoryObjectReceiveStream, + MemoryObjectSendStream, + _MemoryObjectStreamState, +) + +T_Item = TypeVar("T_Item") + + +class create_memory_object_stream( + tuple[MemoryObjectSendStream[T_Item], MemoryObjectReceiveStream[T_Item]], +): + """ + Create a memory object stream. + + The stream's item type can be annotated like + :func:`create_memory_object_stream[T_Item]`. + + :param max_buffer_size: number of items held in the buffer until ``send()`` starts + blocking + :param item_type: old way of marking the streams with the right generic type for + static typing (does nothing on AnyIO 4) + + .. deprecated:: 4.0 + Use ``create_memory_object_stream[YourItemType](...)`` instead. + :return: a tuple of (send stream, receive stream) + + """ + + def __new__( # type: ignore[misc] + cls, max_buffer_size: float = 0, item_type: object = None + ) -> tuple[MemoryObjectSendStream[T_Item], MemoryObjectReceiveStream[T_Item]]: + if max_buffer_size != math.inf and not isinstance(max_buffer_size, int): + raise ValueError("max_buffer_size must be either an integer or math.inf") + if max_buffer_size < 0: + raise ValueError("max_buffer_size cannot be negative") + if item_type is not None: + warn( + "The item_type argument has been deprecated in AnyIO 4.0. " + "Use create_memory_object_stream[YourItemType](...) instead.", + DeprecationWarning, + stacklevel=2, + ) + + state = _MemoryObjectStreamState[T_Item](max_buffer_size) + return (MemoryObjectSendStream(state), MemoryObjectReceiveStream(state)) diff --git a/.venv/lib/python3.10/site-packages/anyio/_core/_subprocesses.py b/.venv/lib/python3.10/site-packages/anyio/_core/_subprocesses.py new file mode 100644 index 0000000..9796f8b --- /dev/null +++ b/.venv/lib/python3.10/site-packages/anyio/_core/_subprocesses.py @@ -0,0 +1,196 @@ +from __future__ import annotations + +from collections.abc import AsyncIterable, Iterable, Mapping, Sequence +from io import BytesIO +from os import PathLike +from subprocess import PIPE, CalledProcessError, CompletedProcess +from typing import IO, Any, TypeAlias, cast + +from ..abc import Process +from ._eventloop import get_async_backend +from ._tasks import create_task_group + +StrOrBytesPath: TypeAlias = str | bytes | PathLike[str] | PathLike[bytes] + + +async def run_process( + command: StrOrBytesPath | Sequence[StrOrBytesPath], + *, + input: bytes | None = None, + stdin: int | IO[Any] | None = None, + stdout: int | IO[Any] | None = PIPE, + stderr: int | IO[Any] | None = PIPE, + check: bool = True, + cwd: StrOrBytesPath | None = None, + env: Mapping[str, str] | None = None, + startupinfo: Any = None, + creationflags: int = 0, + start_new_session: bool = False, + pass_fds: Sequence[int] = (), + user: str | int | None = None, + group: str | int | None = None, + extra_groups: Iterable[str | int] | None = None, + umask: int = -1, +) -> CompletedProcess[bytes]: + """ + Run an external command in a subprocess and wait until it completes. + + .. seealso:: :func:`subprocess.run` + + :param command: either a string to pass to the shell, or an iterable of strings + containing the executable name or path and its arguments + :param input: bytes passed to the standard input of the subprocess + :param stdin: one of :data:`subprocess.PIPE`, :data:`subprocess.DEVNULL`, + a file-like object, or `None`; ``input`` overrides this + :param stdout: one of :data:`subprocess.PIPE`, :data:`subprocess.DEVNULL`, + a file-like object, or `None` + :param stderr: one of :data:`subprocess.PIPE`, :data:`subprocess.DEVNULL`, + :data:`subprocess.STDOUT`, a file-like object, or `None` + :param check: if ``True``, raise :exc:`~subprocess.CalledProcessError` if the + process terminates with a return code other than 0 + :param cwd: If not ``None``, change the working directory to this before running the + command + :param env: if not ``None``, this mapping replaces the inherited environment + variables from the parent process + :param startupinfo: an instance of :class:`subprocess.STARTUPINFO` that can be used + to specify process startup parameters (Windows only) + :param creationflags: flags that can be used to control the creation of the + subprocess (see :class:`subprocess.Popen` for the specifics) + :param start_new_session: if ``true`` the setsid() system call will be made in the + child process prior to the execution of the subprocess. (POSIX only) + :param pass_fds: sequence of file descriptors to keep open between the parent and + child processes. (POSIX only) + :param user: effective user to run the process as (Python >= 3.9, POSIX only) + :param group: effective group to run the process as (Python >= 3.9, POSIX only) + :param extra_groups: supplementary groups to set in the subprocess (Python >= 3.9, + POSIX only) + :param umask: if not negative, this umask is applied in the child process before + running the given command (Python >= 3.9, POSIX only) + :return: an object representing the completed process + :raises ~subprocess.CalledProcessError: if ``check`` is ``True`` and the process + exits with a nonzero return code + + """ + + async def drain_stream(stream: AsyncIterable[bytes], index: int) -> None: + buffer = BytesIO() + async for chunk in stream: + buffer.write(chunk) + + stream_contents[index] = buffer.getvalue() + + if stdin is not None and input is not None: + raise ValueError("only one of stdin and input is allowed") + + async with await open_process( + command, + stdin=PIPE if input else stdin, + stdout=stdout, + stderr=stderr, + cwd=cwd, + env=env, + startupinfo=startupinfo, + creationflags=creationflags, + start_new_session=start_new_session, + pass_fds=pass_fds, + user=user, + group=group, + extra_groups=extra_groups, + umask=umask, + ) as process: + stream_contents: list[bytes | None] = [None, None] + async with create_task_group() as tg: + if process.stdout: + tg.start_soon(drain_stream, process.stdout, 0) + + if process.stderr: + tg.start_soon(drain_stream, process.stderr, 1) + + if process.stdin and input: + await process.stdin.send(input) + await process.stdin.aclose() + + await process.wait() + + output, errors = stream_contents + if check and process.returncode != 0: + raise CalledProcessError(cast(int, process.returncode), command, output, errors) + + return CompletedProcess(command, cast(int, process.returncode), output, errors) + + +async def open_process( + command: StrOrBytesPath | Sequence[StrOrBytesPath], + *, + stdin: int | IO[Any] | None = PIPE, + stdout: int | IO[Any] | None = PIPE, + stderr: int | IO[Any] | None = PIPE, + cwd: StrOrBytesPath | None = None, + env: Mapping[str, str] | None = None, + startupinfo: Any = None, + creationflags: int = 0, + start_new_session: bool = False, + pass_fds: Sequence[int] = (), + user: str | int | None = None, + group: str | int | None = None, + extra_groups: Iterable[str | int] | None = None, + umask: int = -1, +) -> Process: + """ + Start an external command in a subprocess. + + .. seealso:: :class:`subprocess.Popen` + + :param command: either a string to pass to the shell, or an iterable of strings + containing the executable name or path and its arguments + :param stdin: one of :data:`subprocess.PIPE`, :data:`subprocess.DEVNULL`, a + file-like object, or ``None`` + :param stdout: one of :data:`subprocess.PIPE`, :data:`subprocess.DEVNULL`, + a file-like object, or ``None`` + :param stderr: one of :data:`subprocess.PIPE`, :data:`subprocess.DEVNULL`, + :data:`subprocess.STDOUT`, a file-like object, or ``None`` + :param cwd: If not ``None``, the working directory is changed before executing + :param env: If env is not ``None``, it must be a mapping that defines the + environment variables for the new process + :param creationflags: flags that can be used to control the creation of the + subprocess (see :class:`subprocess.Popen` for the specifics) + :param startupinfo: an instance of :class:`subprocess.STARTUPINFO` that can be used + to specify process startup parameters (Windows only) + :param start_new_session: if ``true`` the setsid() system call will be made in the + child process prior to the execution of the subprocess. (POSIX only) + :param pass_fds: sequence of file descriptors to keep open between the parent and + child processes. (POSIX only) + :param user: effective user to run the process as (POSIX only) + :param group: effective group to run the process as (POSIX only) + :param extra_groups: supplementary groups to set in the subprocess (POSIX only) + :param umask: if not negative, this umask is applied in the child process before + running the given command (POSIX only) + :return: an asynchronous process object + + """ + kwargs: dict[str, Any] = {} + if user is not None: + kwargs["user"] = user + + if group is not None: + kwargs["group"] = group + + if extra_groups is not None: + kwargs["extra_groups"] = group + + if umask >= 0: + kwargs["umask"] = umask + + return await get_async_backend().open_process( + command, + stdin=stdin, + stdout=stdout, + stderr=stderr, + cwd=cwd, + env=env, + startupinfo=startupinfo, + creationflags=creationflags, + start_new_session=start_new_session, + pass_fds=pass_fds, + **kwargs, + ) diff --git a/.venv/lib/python3.10/site-packages/anyio/_core/_synchronization.py b/.venv/lib/python3.10/site-packages/anyio/_core/_synchronization.py new file mode 100644 index 0000000..9c6f9a0 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/anyio/_core/_synchronization.py @@ -0,0 +1,757 @@ +from __future__ import annotations + +import math +from collections import deque +from collections.abc import Callable +from dataclasses import dataclass +from types import TracebackType +from typing import TypeVar + +from ..lowlevel import checkpoint_if_cancelled +from ._eventloop import get_async_backend +from ._exceptions import BusyResourceError, NoEventLoopError +from ._tasks import CancelScope +from ._testing import TaskInfo, get_current_task + +T = TypeVar("T") + + +@dataclass(frozen=True) +class EventStatistics: + """ + :ivar int tasks_waiting: number of tasks waiting on :meth:`~.Event.wait` + """ + + tasks_waiting: int + + +@dataclass(frozen=True) +class CapacityLimiterStatistics: + """ + :ivar int borrowed_tokens: number of tokens currently borrowed by tasks + :ivar float total_tokens: total number of available tokens + :ivar tuple borrowers: tasks or other objects currently holding tokens borrowed from + this limiter + :ivar int tasks_waiting: number of tasks waiting on + :meth:`~.CapacityLimiter.acquire` or + :meth:`~.CapacityLimiter.acquire_on_behalf_of` + """ + + borrowed_tokens: int + total_tokens: float + borrowers: tuple[object, ...] + tasks_waiting: int + + +@dataclass(frozen=True) +class LockStatistics: + """ + :ivar bool locked: flag indicating if this lock is locked or not + :ivar ~anyio.TaskInfo owner: task currently holding the lock (or ``None`` if the + lock is not held by any task) + :ivar int tasks_waiting: number of tasks waiting on :meth:`~.Lock.acquire` + """ + + locked: bool + owner: TaskInfo | None + tasks_waiting: int + + +@dataclass(frozen=True) +class ConditionStatistics: + """ + :ivar int tasks_waiting: number of tasks blocked on :meth:`~.Condition.wait` + :ivar ~anyio.LockStatistics lock_statistics: statistics of the underlying + :class:`~.Lock` + """ + + tasks_waiting: int + lock_statistics: LockStatistics + + +@dataclass(frozen=True) +class SemaphoreStatistics: + """ + :ivar int tasks_waiting: number of tasks waiting on :meth:`~.Semaphore.acquire` + + """ + + tasks_waiting: int + + +class Event: + def __new__(cls) -> Event: + try: + return get_async_backend().create_event() + except NoEventLoopError: + return EventAdapter() + + def set(self) -> None: + """Set the flag, notifying all listeners.""" + raise NotImplementedError + + def is_set(self) -> bool: + """Return ``True`` if the flag is set, ``False`` if not.""" + raise NotImplementedError + + async def wait(self) -> None: + """ + Wait until the flag has been set. + + If the flag has already been set when this method is called, it returns + immediately. + + """ + raise NotImplementedError + + def statistics(self) -> EventStatistics: + """Return statistics about the current state of this event.""" + raise NotImplementedError + + +class EventAdapter(Event): + _internal_event: Event | None = None + _is_set: bool = False + + def __new__(cls) -> EventAdapter: + return object.__new__(cls) + + @property + def _event(self) -> Event: + if self._internal_event is None: + self._internal_event = get_async_backend().create_event() + if self._is_set: + self._internal_event.set() + + return self._internal_event + + def set(self) -> None: + if self._internal_event is None: + self._is_set = True + else: + self._event.set() + + def is_set(self) -> bool: + if self._internal_event is None: + return self._is_set + + return self._internal_event.is_set() + + async def wait(self) -> None: + await self._event.wait() + + def statistics(self) -> EventStatistics: + if self._internal_event is None: + return EventStatistics(tasks_waiting=0) + + return self._internal_event.statistics() + + +class Lock: + def __new__(cls, *, fast_acquire: bool = False) -> Lock: + try: + return get_async_backend().create_lock(fast_acquire=fast_acquire) + except NoEventLoopError: + return LockAdapter(fast_acquire=fast_acquire) + + async def __aenter__(self) -> None: + await self.acquire() + + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + self.release() + + async def acquire(self) -> None: + """Acquire the lock.""" + raise NotImplementedError + + def acquire_nowait(self) -> None: + """ + Acquire the lock, without blocking. + + :raises ~anyio.WouldBlock: if the operation would block + + """ + raise NotImplementedError + + def release(self) -> None: + """Release the lock.""" + raise NotImplementedError + + def locked(self) -> bool: + """Return True if the lock is currently held.""" + raise NotImplementedError + + def statistics(self) -> LockStatistics: + """ + Return statistics about the current state of this lock. + + .. versionadded:: 3.0 + """ + raise NotImplementedError + + +class LockAdapter(Lock): + _internal_lock: Lock | None = None + + def __new__(cls, *, fast_acquire: bool = False) -> LockAdapter: + return object.__new__(cls) + + def __init__(self, *, fast_acquire: bool = False): + self._fast_acquire = fast_acquire + + @property + def _lock(self) -> Lock: + if self._internal_lock is None: + self._internal_lock = get_async_backend().create_lock( + fast_acquire=self._fast_acquire + ) + + return self._internal_lock + + async def __aenter__(self) -> None: + await self._lock.acquire() + + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + if self._internal_lock is not None: + self._internal_lock.release() + + async def acquire(self) -> None: + """Acquire the lock.""" + await self._lock.acquire() + + def acquire_nowait(self) -> None: + """ + Acquire the lock, without blocking. + + :raises ~anyio.WouldBlock: if the operation would block + + """ + self._lock.acquire_nowait() + + def release(self) -> None: + """Release the lock.""" + self._lock.release() + + def locked(self) -> bool: + """Return True if the lock is currently held.""" + return self._lock.locked() + + def statistics(self) -> LockStatistics: + """ + Return statistics about the current state of this lock. + + .. versionadded:: 3.0 + + """ + if self._internal_lock is None: + return LockStatistics(False, None, 0) + + return self._internal_lock.statistics() + + +class Condition: + _owner_task: TaskInfo | None = None + + def __init__(self, lock: Lock | None = None): + self._lock = lock or Lock() + self._waiters: deque[Event] = deque() + + async def __aenter__(self) -> None: + await self.acquire() + + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + self.release() + + def _check_acquired(self) -> None: + if self._owner_task != get_current_task(): + raise RuntimeError("The current task is not holding the underlying lock") + + async def acquire(self) -> None: + """Acquire the underlying lock.""" + await self._lock.acquire() + self._owner_task = get_current_task() + + def acquire_nowait(self) -> None: + """ + Acquire the underlying lock, without blocking. + + :raises ~anyio.WouldBlock: if the operation would block + + """ + self._lock.acquire_nowait() + self._owner_task = get_current_task() + + def release(self) -> None: + """Release the underlying lock.""" + self._lock.release() + + def locked(self) -> bool: + """Return True if the lock is set.""" + return self._lock.locked() + + def notify(self, n: int = 1) -> None: + """Notify exactly n listeners.""" + self._check_acquired() + for _ in range(n): + try: + event = self._waiters.popleft() + except IndexError: + break + + event.set() + + def notify_all(self) -> None: + """Notify all the listeners.""" + self._check_acquired() + for event in self._waiters: + event.set() + + self._waiters.clear() + + async def wait(self) -> None: + """Wait for a notification.""" + await checkpoint_if_cancelled() + self._check_acquired() + event = Event() + self._waiters.append(event) + self.release() + try: + await event.wait() + except BaseException: + if not event.is_set(): + self._waiters.remove(event) + elif self._waiters: + # This task was notified by could not act on it, so pass + # it on to the next task + self._waiters.popleft().set() + + raise + finally: + with CancelScope(shield=True): + await self.acquire() + + async def wait_for(self, predicate: Callable[[], T]) -> T: + """ + Wait until a predicate becomes true. + + :param predicate: a callable that returns a truthy value when the condition is + met + :return: the result of the predicate + + .. versionadded:: 4.11.0 + + """ + while not (result := predicate()): + await self.wait() + + return result + + def statistics(self) -> ConditionStatistics: + """ + Return statistics about the current state of this condition. + + .. versionadded:: 3.0 + """ + return ConditionStatistics(len(self._waiters), self._lock.statistics()) + + +class Semaphore: + def __new__( + cls, + initial_value: int, + *, + max_value: int | None = None, + fast_acquire: bool = False, + ) -> Semaphore: + try: + return get_async_backend().create_semaphore( + initial_value, max_value=max_value, fast_acquire=fast_acquire + ) + except NoEventLoopError: + return SemaphoreAdapter(initial_value, max_value=max_value) + + def __init__( + self, + initial_value: int, + *, + max_value: int | None = None, + fast_acquire: bool = False, + ): + if not isinstance(initial_value, int): + raise TypeError("initial_value must be an integer") + if initial_value < 0: + raise ValueError("initial_value must be >= 0") + if max_value is not None: + if not isinstance(max_value, int): + raise TypeError("max_value must be an integer or None") + if max_value < initial_value: + raise ValueError( + "max_value must be equal to or higher than initial_value" + ) + + self._fast_acquire = fast_acquire + + async def __aenter__(self) -> Semaphore: + await self.acquire() + return self + + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + self.release() + + async def acquire(self) -> None: + """Decrement the semaphore value, blocking if necessary.""" + raise NotImplementedError + + def acquire_nowait(self) -> None: + """ + Acquire the underlying lock, without blocking. + + :raises ~anyio.WouldBlock: if the operation would block + + """ + raise NotImplementedError + + def release(self) -> None: + """Increment the semaphore value.""" + raise NotImplementedError + + @property + def value(self) -> int: + """The current value of the semaphore.""" + raise NotImplementedError + + @property + def max_value(self) -> int | None: + """The maximum value of the semaphore.""" + raise NotImplementedError + + def statistics(self) -> SemaphoreStatistics: + """ + Return statistics about the current state of this semaphore. + + .. versionadded:: 3.0 + """ + raise NotImplementedError + + +class SemaphoreAdapter(Semaphore): + _internal_semaphore: Semaphore | None = None + + def __new__( + cls, + initial_value: int, + *, + max_value: int | None = None, + fast_acquire: bool = False, + ) -> SemaphoreAdapter: + return object.__new__(cls) + + def __init__( + self, + initial_value: int, + *, + max_value: int | None = None, + fast_acquire: bool = False, + ) -> None: + super().__init__(initial_value, max_value=max_value, fast_acquire=fast_acquire) + self._initial_value = initial_value + self._max_value = max_value + + @property + def _semaphore(self) -> Semaphore: + if self._internal_semaphore is None: + self._internal_semaphore = get_async_backend().create_semaphore( + self._initial_value, max_value=self._max_value + ) + + return self._internal_semaphore + + async def acquire(self) -> None: + await self._semaphore.acquire() + + def acquire_nowait(self) -> None: + self._semaphore.acquire_nowait() + + def release(self) -> None: + self._semaphore.release() + + @property + def value(self) -> int: + if self._internal_semaphore is None: + return self._initial_value + + return self._semaphore.value + + @property + def max_value(self) -> int | None: + return self._max_value + + def statistics(self) -> SemaphoreStatistics: + if self._internal_semaphore is None: + return SemaphoreStatistics(tasks_waiting=0) + + return self._semaphore.statistics() + + +class CapacityLimiter: + def __new__(cls, total_tokens: float) -> CapacityLimiter: + try: + return get_async_backend().create_capacity_limiter(total_tokens) + except NoEventLoopError: + return CapacityLimiterAdapter(total_tokens) + + async def __aenter__(self) -> None: + raise NotImplementedError + + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + raise NotImplementedError + + @property + def total_tokens(self) -> float: + """ + The total number of tokens available for borrowing. + + This is a read-write property. If the total number of tokens is increased, the + proportionate number of tasks waiting on this limiter will be granted their + tokens. + + .. versionchanged:: 3.0 + The property is now writable. + .. versionchanged:: 4.12 + The value can now be set to 0. + + """ + raise NotImplementedError + + @total_tokens.setter + def total_tokens(self, value: float) -> None: + raise NotImplementedError + + @property + def borrowed_tokens(self) -> int: + """The number of tokens that have currently been borrowed.""" + raise NotImplementedError + + @property + def available_tokens(self) -> float: + """The number of tokens currently available to be borrowed""" + raise NotImplementedError + + def acquire_nowait(self) -> None: + """ + Acquire a token for the current task without waiting for one to become + available. + + :raises ~anyio.WouldBlock: if there are no tokens available for borrowing + + """ + raise NotImplementedError + + def acquire_on_behalf_of_nowait(self, borrower: object) -> None: + """ + Acquire a token without waiting for one to become available. + + :param borrower: the entity borrowing a token + :raises ~anyio.WouldBlock: if there are no tokens available for borrowing + + """ + raise NotImplementedError + + async def acquire(self) -> None: + """ + Acquire a token for the current task, waiting if necessary for one to become + available. + + """ + raise NotImplementedError + + async def acquire_on_behalf_of(self, borrower: object) -> None: + """ + Acquire a token, waiting if necessary for one to become available. + + :param borrower: the entity borrowing a token + + """ + raise NotImplementedError + + def release(self) -> None: + """ + Release the token held by the current task. + + :raises RuntimeError: if the current task has not borrowed a token from this + limiter. + + """ + raise NotImplementedError + + def release_on_behalf_of(self, borrower: object) -> None: + """ + Release the token held by the given borrower. + + :raises RuntimeError: if the borrower has not borrowed a token from this + limiter. + + """ + raise NotImplementedError + + def statistics(self) -> CapacityLimiterStatistics: + """ + Return statistics about the current state of this limiter. + + .. versionadded:: 3.0 + + """ + raise NotImplementedError + + +class CapacityLimiterAdapter(CapacityLimiter): + _internal_limiter: CapacityLimiter | None = None + + def __new__(cls, total_tokens: float) -> CapacityLimiterAdapter: + return object.__new__(cls) + + def __init__(self, total_tokens: float) -> None: + self.total_tokens = total_tokens + + @property + def _limiter(self) -> CapacityLimiter: + if self._internal_limiter is None: + self._internal_limiter = get_async_backend().create_capacity_limiter( + self._total_tokens + ) + + return self._internal_limiter + + async def __aenter__(self) -> None: + await self._limiter.__aenter__() + + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + return await self._limiter.__aexit__(exc_type, exc_val, exc_tb) + + @property + def total_tokens(self) -> float: + if self._internal_limiter is None: + return self._total_tokens + + return self._internal_limiter.total_tokens + + @total_tokens.setter + def total_tokens(self, value: float) -> None: + if not isinstance(value, int) and value is not math.inf: + raise TypeError("total_tokens must be an int or math.inf") + elif value < 1: + raise ValueError("total_tokens must be >= 1") + + if self._internal_limiter is None: + self._total_tokens = value + return + + self._limiter.total_tokens = value + + @property + def borrowed_tokens(self) -> int: + if self._internal_limiter is None: + return 0 + + return self._internal_limiter.borrowed_tokens + + @property + def available_tokens(self) -> float: + if self._internal_limiter is None: + return self._total_tokens + + return self._internal_limiter.available_tokens + + def acquire_nowait(self) -> None: + self._limiter.acquire_nowait() + + def acquire_on_behalf_of_nowait(self, borrower: object) -> None: + self._limiter.acquire_on_behalf_of_nowait(borrower) + + async def acquire(self) -> None: + await self._limiter.acquire() + + async def acquire_on_behalf_of(self, borrower: object) -> None: + await self._limiter.acquire_on_behalf_of(borrower) + + def release(self) -> None: + self._limiter.release() + + def release_on_behalf_of(self, borrower: object) -> None: + self._limiter.release_on_behalf_of(borrower) + + def statistics(self) -> CapacityLimiterStatistics: + if self._internal_limiter is None: + return CapacityLimiterStatistics( + borrowed_tokens=0, + total_tokens=self.total_tokens, + borrowers=(), + tasks_waiting=0, + ) + + return self._internal_limiter.statistics() + + +class ResourceGuard: + """ + A context manager for ensuring that a resource is only used by a single task at a + time. + + Entering this context manager while the previous has not exited it yet will trigger + :exc:`BusyResourceError`. + + :param action: the action to guard against (visible in the :exc:`BusyResourceError` + when triggered, e.g. "Another task is already {action} this resource") + + .. versionadded:: 4.1 + """ + + __slots__ = "action", "_guarded" + + def __init__(self, action: str = "using"): + self.action: str = action + self._guarded = False + + def __enter__(self) -> None: + if self._guarded: + raise BusyResourceError(self.action) + + self._guarded = True + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + self._guarded = False diff --git a/.venv/lib/python3.10/site-packages/anyio/_core/_tasks.py b/.venv/lib/python3.10/site-packages/anyio/_core/_tasks.py new file mode 100644 index 0000000..0688bfe --- /dev/null +++ b/.venv/lib/python3.10/site-packages/anyio/_core/_tasks.py @@ -0,0 +1,173 @@ +from __future__ import annotations + +import math +from collections.abc import Generator +from contextlib import contextmanager +from types import TracebackType + +from ..abc._tasks import TaskGroup, TaskStatus +from ._eventloop import get_async_backend + + +class _IgnoredTaskStatus(TaskStatus[object]): + def started(self, value: object = None) -> None: + pass + + +TASK_STATUS_IGNORED = _IgnoredTaskStatus() + + +class CancelScope: + """ + Wraps a unit of work that can be made separately cancellable. + + :param deadline: The time (clock value) when this scope is cancelled automatically + :param shield: ``True`` to shield the cancel scope from external cancellation + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + """ + + def __new__( + cls, *, deadline: float = math.inf, shield: bool = False + ) -> CancelScope: + return get_async_backend().create_cancel_scope(shield=shield, deadline=deadline) + + def cancel(self, reason: str | None = None) -> None: + """ + Cancel this scope immediately. + + :param reason: a message describing the reason for the cancellation + + """ + raise NotImplementedError + + @property + def deadline(self) -> float: + """ + The time (clock value) when this scope is cancelled automatically. + + Will be ``float('inf')`` if no timeout has been set. + + """ + raise NotImplementedError + + @deadline.setter + def deadline(self, value: float) -> None: + raise NotImplementedError + + @property + def cancel_called(self) -> bool: + """``True`` if :meth:`cancel` has been called.""" + raise NotImplementedError + + @property + def cancelled_caught(self) -> bool: + """ + ``True`` if this scope suppressed a cancellation exception it itself raised. + + This is typically used to check if any work was interrupted, or to see if the + scope was cancelled due to its deadline being reached. The value will, however, + only be ``True`` if the cancellation was triggered by the scope itself (and not + an outer scope). + + """ + raise NotImplementedError + + @property + def shield(self) -> bool: + """ + ``True`` if this scope is shielded from external cancellation. + + While a scope is shielded, it will not receive cancellations from outside. + + """ + raise NotImplementedError + + @shield.setter + def shield(self, value: bool) -> None: + raise NotImplementedError + + def __enter__(self) -> CancelScope: + raise NotImplementedError + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> bool: + raise NotImplementedError + + +@contextmanager +def fail_after( + delay: float | None, shield: bool = False +) -> Generator[CancelScope, None, None]: + """ + Create a context manager which raises a :class:`TimeoutError` if does not finish in + time. + + :param delay: maximum allowed time (in seconds) before raising the exception, or + ``None`` to disable the timeout + :param shield: ``True`` to shield the cancel scope from external cancellation + :return: a context manager that yields a cancel scope + :rtype: :class:`~typing.ContextManager`\\[:class:`~anyio.CancelScope`\\] + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + current_time = get_async_backend().current_time + deadline = (current_time() + delay) if delay is not None else math.inf + with get_async_backend().create_cancel_scope( + deadline=deadline, shield=shield + ) as cancel_scope: + yield cancel_scope + + if cancel_scope.cancelled_caught and current_time() >= cancel_scope.deadline: + raise TimeoutError + + +def move_on_after(delay: float | None, shield: bool = False) -> CancelScope: + """ + Create a cancel scope with a deadline that expires after the given delay. + + :param delay: maximum allowed time (in seconds) before exiting the context block, or + ``None`` to disable the timeout + :param shield: ``True`` to shield the cancel scope from external cancellation + :return: a cancel scope + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + deadline = ( + (get_async_backend().current_time() + delay) if delay is not None else math.inf + ) + return get_async_backend().create_cancel_scope(deadline=deadline, shield=shield) + + +def current_effective_deadline() -> float: + """ + Return the nearest deadline among all the cancel scopes effective for the current + task. + + :return: a clock value from the event loop's internal clock (or ``float('inf')`` if + there is no deadline in effect, or ``float('-inf')`` if the current scope has + been cancelled) + :rtype: float + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + return get_async_backend().current_effective_deadline() + + +def create_task_group() -> TaskGroup: + """ + Create a task group. + + :return: a task group + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + return get_async_backend().create_task_group() diff --git a/.venv/lib/python3.10/site-packages/anyio/_core/_tempfile.py b/.venv/lib/python3.10/site-packages/anyio/_core/_tempfile.py new file mode 100644 index 0000000..75a09f7 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/anyio/_core/_tempfile.py @@ -0,0 +1,613 @@ +from __future__ import annotations + +import os +import sys +import tempfile +from collections.abc import Iterable +from io import BytesIO, TextIOWrapper +from types import TracebackType +from typing import ( + TYPE_CHECKING, + Any, + AnyStr, + Generic, + overload, +) + +from .. import to_thread +from .._core._fileio import AsyncFile +from ..lowlevel import checkpoint_if_cancelled + +if TYPE_CHECKING: + from _typeshed import OpenBinaryMode, OpenTextMode, ReadableBuffer, WriteableBuffer + + +class TemporaryFile(Generic[AnyStr]): + """ + An asynchronous temporary file that is automatically created and cleaned up. + + This class provides an asynchronous context manager interface to a temporary file. + The file is created using Python's standard `tempfile.TemporaryFile` function in a + background thread, and is wrapped as an asynchronous file using `AsyncFile`. + + :param mode: The mode in which the file is opened. Defaults to "w+b". + :param buffering: The buffering policy (-1 means the default buffering). + :param encoding: The encoding used to decode or encode the file. Only applicable in + text mode. + :param newline: Controls how universal newlines mode works (only applicable in text + mode). + :param suffix: The suffix for the temporary file name. + :param prefix: The prefix for the temporary file name. + :param dir: The directory in which the temporary file is created. + :param errors: The error handling scheme used for encoding/decoding errors. + """ + + _async_file: AsyncFile[AnyStr] + + @overload + def __init__( + self: TemporaryFile[bytes], + mode: OpenBinaryMode = ..., + buffering: int = ..., + encoding: str | None = ..., + newline: str | None = ..., + suffix: str | None = ..., + prefix: str | None = ..., + dir: str | None = ..., + *, + errors: str | None = ..., + ): ... + @overload + def __init__( + self: TemporaryFile[str], + mode: OpenTextMode, + buffering: int = ..., + encoding: str | None = ..., + newline: str | None = ..., + suffix: str | None = ..., + prefix: str | None = ..., + dir: str | None = ..., + *, + errors: str | None = ..., + ): ... + + def __init__( + self, + mode: OpenTextMode | OpenBinaryMode = "w+b", + buffering: int = -1, + encoding: str | None = None, + newline: str | None = None, + suffix: str | None = None, + prefix: str | None = None, + dir: str | None = None, + *, + errors: str | None = None, + ) -> None: + self.mode = mode + self.buffering = buffering + self.encoding = encoding + self.newline = newline + self.suffix: str | None = suffix + self.prefix: str | None = prefix + self.dir: str | None = dir + self.errors = errors + + async def __aenter__(self) -> AsyncFile[AnyStr]: + fp = await to_thread.run_sync( + lambda: tempfile.TemporaryFile( + self.mode, + self.buffering, + self.encoding, + self.newline, + self.suffix, + self.prefix, + self.dir, + errors=self.errors, + ) + ) + self._async_file = AsyncFile(fp) + return self._async_file + + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_value: BaseException | None, + traceback: TracebackType | None, + ) -> None: + await self._async_file.aclose() + + +class NamedTemporaryFile(Generic[AnyStr]): + """ + An asynchronous named temporary file that is automatically created and cleaned up. + + This class provides an asynchronous context manager for a temporary file with a + visible name in the file system. It uses Python's standard + :func:`~tempfile.NamedTemporaryFile` function and wraps the file object with + :class:`AsyncFile` for asynchronous operations. + + :param mode: The mode in which the file is opened. Defaults to "w+b". + :param buffering: The buffering policy (-1 means the default buffering). + :param encoding: The encoding used to decode or encode the file. Only applicable in + text mode. + :param newline: Controls how universal newlines mode works (only applicable in text + mode). + :param suffix: The suffix for the temporary file name. + :param prefix: The prefix for the temporary file name. + :param dir: The directory in which the temporary file is created. + :param delete: Whether to delete the file when it is closed. + :param errors: The error handling scheme used for encoding/decoding errors. + :param delete_on_close: (Python 3.12+) Whether to delete the file on close. + """ + + _async_file: AsyncFile[AnyStr] + + @overload + def __init__( + self: NamedTemporaryFile[bytes], + mode: OpenBinaryMode = ..., + buffering: int = ..., + encoding: str | None = ..., + newline: str | None = ..., + suffix: str | None = ..., + prefix: str | None = ..., + dir: str | None = ..., + delete: bool = ..., + *, + errors: str | None = ..., + delete_on_close: bool = ..., + ): ... + @overload + def __init__( + self: NamedTemporaryFile[str], + mode: OpenTextMode, + buffering: int = ..., + encoding: str | None = ..., + newline: str | None = ..., + suffix: str | None = ..., + prefix: str | None = ..., + dir: str | None = ..., + delete: bool = ..., + *, + errors: str | None = ..., + delete_on_close: bool = ..., + ): ... + + def __init__( + self, + mode: OpenBinaryMode | OpenTextMode = "w+b", + buffering: int = -1, + encoding: str | None = None, + newline: str | None = None, + suffix: str | None = None, + prefix: str | None = None, + dir: str | None = None, + delete: bool = True, + *, + errors: str | None = None, + delete_on_close: bool = True, + ) -> None: + self._params: dict[str, Any] = { + "mode": mode, + "buffering": buffering, + "encoding": encoding, + "newline": newline, + "suffix": suffix, + "prefix": prefix, + "dir": dir, + "delete": delete, + "errors": errors, + } + if sys.version_info >= (3, 12): + self._params["delete_on_close"] = delete_on_close + + async def __aenter__(self) -> AsyncFile[AnyStr]: + fp = await to_thread.run_sync( + lambda: tempfile.NamedTemporaryFile(**self._params) + ) + self._async_file = AsyncFile(fp) + return self._async_file + + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_value: BaseException | None, + traceback: TracebackType | None, + ) -> None: + await self._async_file.aclose() + + +class SpooledTemporaryFile(AsyncFile[AnyStr]): + """ + An asynchronous spooled temporary file that starts in memory and is spooled to disk. + + This class provides an asynchronous interface to a spooled temporary file, much like + Python's standard :class:`~tempfile.SpooledTemporaryFile`. It supports asynchronous + write operations and provides a method to force a rollover to disk. + + :param max_size: Maximum size in bytes before the file is rolled over to disk. + :param mode: The mode in which the file is opened. Defaults to "w+b". + :param buffering: The buffering policy (-1 means the default buffering). + :param encoding: The encoding used to decode or encode the file (text mode only). + :param newline: Controls how universal newlines mode works (text mode only). + :param suffix: The suffix for the temporary file name. + :param prefix: The prefix for the temporary file name. + :param dir: The directory in which the temporary file is created. + :param errors: The error handling scheme used for encoding/decoding errors. + """ + + _rolled: bool = False + + @overload + def __init__( + self: SpooledTemporaryFile[bytes], + max_size: int = ..., + mode: OpenBinaryMode = ..., + buffering: int = ..., + encoding: str | None = ..., + newline: str | None = ..., + suffix: str | None = ..., + prefix: str | None = ..., + dir: str | None = ..., + *, + errors: str | None = ..., + ): ... + @overload + def __init__( + self: SpooledTemporaryFile[str], + max_size: int = ..., + mode: OpenTextMode = ..., + buffering: int = ..., + encoding: str | None = ..., + newline: str | None = ..., + suffix: str | None = ..., + prefix: str | None = ..., + dir: str | None = ..., + *, + errors: str | None = ..., + ): ... + + def __init__( + self, + max_size: int = 0, + mode: OpenBinaryMode | OpenTextMode = "w+b", + buffering: int = -1, + encoding: str | None = None, + newline: str | None = None, + suffix: str | None = None, + prefix: str | None = None, + dir: str | None = None, + *, + errors: str | None = None, + ) -> None: + self._tempfile_params: dict[str, Any] = { + "mode": mode, + "buffering": buffering, + "encoding": encoding, + "newline": newline, + "suffix": suffix, + "prefix": prefix, + "dir": dir, + "errors": errors, + } + self._max_size = max_size + if "b" in mode: + super().__init__(BytesIO()) # type: ignore[arg-type] + else: + super().__init__( + TextIOWrapper( # type: ignore[arg-type] + BytesIO(), + encoding=encoding, + errors=errors, + newline=newline, + write_through=True, + ) + ) + + async def aclose(self) -> None: + if not self._rolled: + self._fp.close() + return + + await super().aclose() + + async def _check(self) -> None: + if self._rolled or self._fp.tell() <= self._max_size: + return + + await self.rollover() + + async def rollover(self) -> None: + if self._rolled: + return + + self._rolled = True + buffer = self._fp + buffer.seek(0) + self._fp = await to_thread.run_sync( + lambda: tempfile.TemporaryFile(**self._tempfile_params) + ) + await self.write(buffer.read()) + buffer.close() + + @property + def closed(self) -> bool: + return self._fp.closed + + async def read(self, size: int = -1) -> AnyStr: + if not self._rolled: + await checkpoint_if_cancelled() + return self._fp.read(size) + + return await super().read(size) # type: ignore[return-value] + + async def read1(self: SpooledTemporaryFile[bytes], size: int = -1) -> bytes: + if not self._rolled: + await checkpoint_if_cancelled() + return self._fp.read1(size) + + return await super().read1(size) + + async def readline(self) -> AnyStr: + if not self._rolled: + await checkpoint_if_cancelled() + return self._fp.readline() + + return await super().readline() # type: ignore[return-value] + + async def readlines(self) -> list[AnyStr]: + if not self._rolled: + await checkpoint_if_cancelled() + return self._fp.readlines() + + return await super().readlines() # type: ignore[return-value] + + async def readinto(self: SpooledTemporaryFile[bytes], b: WriteableBuffer) -> int: + if not self._rolled: + await checkpoint_if_cancelled() + self._fp.readinto(b) + + return await super().readinto(b) + + async def readinto1(self: SpooledTemporaryFile[bytes], b: WriteableBuffer) -> int: + if not self._rolled: + await checkpoint_if_cancelled() + self._fp.readinto(b) + + return await super().readinto1(b) + + async def seek(self, offset: int, whence: int | None = os.SEEK_SET) -> int: + if not self._rolled: + await checkpoint_if_cancelled() + return self._fp.seek(offset, whence) + + return await super().seek(offset, whence) + + async def tell(self) -> int: + if not self._rolled: + await checkpoint_if_cancelled() + return self._fp.tell() + + return await super().tell() + + async def truncate(self, size: int | None = None) -> int: + if not self._rolled: + await checkpoint_if_cancelled() + return self._fp.truncate(size) + + return await super().truncate(size) + + @overload + async def write(self: SpooledTemporaryFile[bytes], b: ReadableBuffer) -> int: ... + @overload + async def write(self: SpooledTemporaryFile[str], b: str) -> int: ... + + async def write(self, b: ReadableBuffer | str) -> int: + """ + Asynchronously write data to the spooled temporary file. + + If the file has not yet been rolled over, the data is written synchronously, + and a rollover is triggered if the size exceeds the maximum size. + + :param s: The data to write. + :return: The number of bytes written. + :raises RuntimeError: If the underlying file is not initialized. + + """ + if not self._rolled: + await checkpoint_if_cancelled() + result = self._fp.write(b) + await self._check() + return result + + return await super().write(b) # type: ignore[misc] + + @overload + async def writelines( + self: SpooledTemporaryFile[bytes], lines: Iterable[ReadableBuffer] + ) -> None: ... + @overload + async def writelines( + self: SpooledTemporaryFile[str], lines: Iterable[str] + ) -> None: ... + + async def writelines(self, lines: Iterable[str] | Iterable[ReadableBuffer]) -> None: + """ + Asynchronously write a list of lines to the spooled temporary file. + + If the file has not yet been rolled over, the lines are written synchronously, + and a rollover is triggered if the size exceeds the maximum size. + + :param lines: An iterable of lines to write. + :raises RuntimeError: If the underlying file is not initialized. + + """ + if not self._rolled: + await checkpoint_if_cancelled() + result = self._fp.writelines(lines) + await self._check() + return result + + return await super().writelines(lines) # type: ignore[misc] + + +class TemporaryDirectory(Generic[AnyStr]): + """ + An asynchronous temporary directory that is created and cleaned up automatically. + + This class provides an asynchronous context manager for creating a temporary + directory. It wraps Python's standard :class:`~tempfile.TemporaryDirectory` to + perform directory creation and cleanup operations in a background thread. + + :param suffix: Suffix to be added to the temporary directory name. + :param prefix: Prefix to be added to the temporary directory name. + :param dir: The parent directory where the temporary directory is created. + :param ignore_cleanup_errors: Whether to ignore errors during cleanup + :param delete: Whether to delete the directory upon closing (Python 3.12+). + """ + + def __init__( + self, + suffix: AnyStr | None = None, + prefix: AnyStr | None = None, + dir: AnyStr | None = None, + *, + ignore_cleanup_errors: bool = False, + delete: bool = True, + ) -> None: + self.suffix: AnyStr | None = suffix + self.prefix: AnyStr | None = prefix + self.dir: AnyStr | None = dir + self.ignore_cleanup_errors = ignore_cleanup_errors + self.delete = delete + + self._tempdir: tempfile.TemporaryDirectory | None = None + + async def __aenter__(self) -> str: + params: dict[str, Any] = { + "suffix": self.suffix, + "prefix": self.prefix, + "dir": self.dir, + "ignore_cleanup_errors": self.ignore_cleanup_errors, + } + if sys.version_info >= (3, 12): + params["delete"] = self.delete + + self._tempdir = await to_thread.run_sync( + lambda: tempfile.TemporaryDirectory(**params) + ) + return await to_thread.run_sync(self._tempdir.__enter__) + + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_value: BaseException | None, + traceback: TracebackType | None, + ) -> None: + if self._tempdir is not None: + await to_thread.run_sync( + self._tempdir.__exit__, exc_type, exc_value, traceback + ) + + async def cleanup(self) -> None: + if self._tempdir is not None: + await to_thread.run_sync(self._tempdir.cleanup) + + +@overload +async def mkstemp( + suffix: str | None = None, + prefix: str | None = None, + dir: str | None = None, + text: bool = False, +) -> tuple[int, str]: ... + + +@overload +async def mkstemp( + suffix: bytes | None = None, + prefix: bytes | None = None, + dir: bytes | None = None, + text: bool = False, +) -> tuple[int, bytes]: ... + + +async def mkstemp( + suffix: AnyStr | None = None, + prefix: AnyStr | None = None, + dir: AnyStr | None = None, + text: bool = False, +) -> tuple[int, str | bytes]: + """ + Asynchronously create a temporary file and return an OS-level handle and the file + name. + + This function wraps `tempfile.mkstemp` and executes it in a background thread. + + :param suffix: Suffix to be added to the file name. + :param prefix: Prefix to be added to the file name. + :param dir: Directory in which the temporary file is created. + :param text: Whether the file is opened in text mode. + :return: A tuple containing the file descriptor and the file name. + + """ + return await to_thread.run_sync(tempfile.mkstemp, suffix, prefix, dir, text) + + +@overload +async def mkdtemp( + suffix: str | None = None, + prefix: str | None = None, + dir: str | None = None, +) -> str: ... + + +@overload +async def mkdtemp( + suffix: bytes | None = None, + prefix: bytes | None = None, + dir: bytes | None = None, +) -> bytes: ... + + +async def mkdtemp( + suffix: AnyStr | None = None, + prefix: AnyStr | None = None, + dir: AnyStr | None = None, +) -> str | bytes: + """ + Asynchronously create a temporary directory and return its path. + + This function wraps `tempfile.mkdtemp` and executes it in a background thread. + + :param suffix: Suffix to be added to the directory name. + :param prefix: Prefix to be added to the directory name. + :param dir: Parent directory where the temporary directory is created. + :return: The path of the created temporary directory. + + """ + return await to_thread.run_sync(tempfile.mkdtemp, suffix, prefix, dir) + + +async def gettempdir() -> str: + """ + Asynchronously return the name of the directory used for temporary files. + + This function wraps `tempfile.gettempdir` and executes it in a background thread. + + :return: The path of the temporary directory as a string. + + """ + return await to_thread.run_sync(tempfile.gettempdir) + + +async def gettempdirb() -> bytes: + """ + Asynchronously return the name of the directory used for temporary files in bytes. + + This function wraps `tempfile.gettempdirb` and executes it in a background thread. + + :return: The path of the temporary directory as bytes. + + """ + return await to_thread.run_sync(tempfile.gettempdirb) diff --git a/.venv/lib/python3.10/site-packages/anyio/_core/_testing.py b/.venv/lib/python3.10/site-packages/anyio/_core/_testing.py new file mode 100644 index 0000000..369e65c --- /dev/null +++ b/.venv/lib/python3.10/site-packages/anyio/_core/_testing.py @@ -0,0 +1,82 @@ +from __future__ import annotations + +from collections.abc import Awaitable, Generator +from typing import Any, cast + +from ._eventloop import get_async_backend + + +class TaskInfo: + """ + Represents an asynchronous task. + + :ivar int id: the unique identifier of the task + :ivar parent_id: the identifier of the parent task, if any + :vartype parent_id: Optional[int] + :ivar str name: the description of the task (if any) + :ivar ~collections.abc.Coroutine coro: the coroutine object of the task + """ + + __slots__ = "_name", "id", "parent_id", "name", "coro" + + def __init__( + self, + id: int, + parent_id: int | None, + name: str | None, + coro: Generator[Any, Any, Any] | Awaitable[Any], + ): + func = get_current_task + self._name = f"{func.__module__}.{func.__qualname__}" + self.id: int = id + self.parent_id: int | None = parent_id + self.name: str | None = name + self.coro: Generator[Any, Any, Any] | Awaitable[Any] = coro + + def __eq__(self, other: object) -> bool: + if isinstance(other, TaskInfo): + return self.id == other.id + + return NotImplemented + + def __hash__(self) -> int: + return hash(self.id) + + def __repr__(self) -> str: + return f"{self.__class__.__name__}(id={self.id!r}, name={self.name!r})" + + def has_pending_cancellation(self) -> bool: + """ + Return ``True`` if the task has a cancellation pending, ``False`` otherwise. + + """ + return False + + +def get_current_task() -> TaskInfo: + """ + Return the current task. + + :return: a representation of the current task + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + return get_async_backend().get_current_task() + + +def get_running_tasks() -> list[TaskInfo]: + """ + Return a list of running tasks in the current event loop. + + :return: a list of task info objects + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + return cast("list[TaskInfo]", get_async_backend().get_running_tasks()) + + +async def wait_all_tasks_blocked() -> None: + """Wait until all other tasks are waiting for something.""" + await get_async_backend().wait_all_tasks_blocked() diff --git a/.venv/lib/python3.10/site-packages/anyio/_core/_typedattr.py b/.venv/lib/python3.10/site-packages/anyio/_core/_typedattr.py new file mode 100644 index 0000000..f358a44 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/anyio/_core/_typedattr.py @@ -0,0 +1,81 @@ +from __future__ import annotations + +from collections.abc import Callable, Mapping +from typing import Any, TypeVar, final, overload + +from ._exceptions import TypedAttributeLookupError + +T_Attr = TypeVar("T_Attr") +T_Default = TypeVar("T_Default") +undefined = object() + + +def typed_attribute() -> Any: + """Return a unique object, used to mark typed attributes.""" + return object() + + +class TypedAttributeSet: + """ + Superclass for typed attribute collections. + + Checks that every public attribute of every subclass has a type annotation. + """ + + def __init_subclass__(cls) -> None: + annotations: dict[str, Any] = getattr(cls, "__annotations__", {}) + for attrname in dir(cls): + if not attrname.startswith("_") and attrname not in annotations: + raise TypeError( + f"Attribute {attrname!r} is missing its type annotation" + ) + + super().__init_subclass__() + + +class TypedAttributeProvider: + """Base class for classes that wish to provide typed extra attributes.""" + + @property + def extra_attributes(self) -> Mapping[T_Attr, Callable[[], T_Attr]]: + """ + A mapping of the extra attributes to callables that return the corresponding + values. + + If the provider wraps another provider, the attributes from that wrapper should + also be included in the returned mapping (but the wrapper may override the + callables from the wrapped instance). + + """ + return {} + + @overload + def extra(self, attribute: T_Attr) -> T_Attr: ... + + @overload + def extra(self, attribute: T_Attr, default: T_Default) -> T_Attr | T_Default: ... + + @final + def extra(self, attribute: Any, default: object = undefined) -> object: + """ + extra(attribute, default=undefined) + + Return the value of the given typed extra attribute. + + :param attribute: the attribute (member of a :class:`~TypedAttributeSet`) to + look for + :param default: the value that should be returned if no value is found for the + attribute + :raises ~anyio.TypedAttributeLookupError: if the search failed and no default + value was given + + """ + try: + getter = self.extra_attributes[attribute] + except KeyError: + if default is undefined: + raise TypedAttributeLookupError("Attribute not found") from None + else: + return default + + return getter() diff --git a/.venv/lib/python3.10/site-packages/anyio/abc/__init__.py b/.venv/lib/python3.10/site-packages/anyio/abc/__init__.py new file mode 100644 index 0000000..d560ce3 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/anyio/abc/__init__.py @@ -0,0 +1,58 @@ +from __future__ import annotations + +from ._eventloop import AsyncBackend as AsyncBackend +from ._resources import AsyncResource as AsyncResource +from ._sockets import ConnectedUDPSocket as ConnectedUDPSocket +from ._sockets import ConnectedUNIXDatagramSocket as ConnectedUNIXDatagramSocket +from ._sockets import IPAddressType as IPAddressType +from ._sockets import IPSockAddrType as IPSockAddrType +from ._sockets import SocketAttribute as SocketAttribute +from ._sockets import SocketListener as SocketListener +from ._sockets import SocketStream as SocketStream +from ._sockets import UDPPacketType as UDPPacketType +from ._sockets import UDPSocket as UDPSocket +from ._sockets import UNIXDatagramPacketType as UNIXDatagramPacketType +from ._sockets import UNIXDatagramSocket as UNIXDatagramSocket +from ._sockets import UNIXSocketStream as UNIXSocketStream +from ._streams import AnyByteReceiveStream as AnyByteReceiveStream +from ._streams import AnyByteSendStream as AnyByteSendStream +from ._streams import AnyByteStream as AnyByteStream +from ._streams import AnyByteStreamConnectable as AnyByteStreamConnectable +from ._streams import AnyUnreliableByteReceiveStream as AnyUnreliableByteReceiveStream +from ._streams import AnyUnreliableByteSendStream as AnyUnreliableByteSendStream +from ._streams import AnyUnreliableByteStream as AnyUnreliableByteStream +from ._streams import ByteReceiveStream as ByteReceiveStream +from ._streams import ByteSendStream as ByteSendStream +from ._streams import ByteStream as ByteStream +from ._streams import ByteStreamConnectable as ByteStreamConnectable +from ._streams import Listener as Listener +from ._streams import ObjectReceiveStream as ObjectReceiveStream +from ._streams import ObjectSendStream as ObjectSendStream +from ._streams import ObjectStream as ObjectStream +from ._streams import ObjectStreamConnectable as ObjectStreamConnectable +from ._streams import UnreliableObjectReceiveStream as UnreliableObjectReceiveStream +from ._streams import UnreliableObjectSendStream as UnreliableObjectSendStream +from ._streams import UnreliableObjectStream as UnreliableObjectStream +from ._subprocesses import Process as Process +from ._tasks import TaskGroup as TaskGroup +from ._tasks import TaskStatus as TaskStatus +from ._testing import TestRunner as TestRunner + +# Re-exported here, for backwards compatibility +# isort: off +from .._core._synchronization import ( + CapacityLimiter as CapacityLimiter, + Condition as Condition, + Event as Event, + Lock as Lock, + Semaphore as Semaphore, +) +from .._core._tasks import CancelScope as CancelScope +from ..from_thread import BlockingPortal as BlockingPortal + +# Re-export imports so they look like they live directly in this package +for __value in list(locals().values()): + if getattr(__value, "__module__", "").startswith("anyio.abc."): + __value.__module__ = __name__ + +del __value diff --git a/.venv/lib/python3.10/site-packages/anyio/abc/__pycache__/__init__.cpython-310.pyc b/.venv/lib/python3.10/site-packages/anyio/abc/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ef4ac19e8e5f87a4ae8b3f7b1564721a48f28f45 GIT binary patch literal 2165 zcmb`I*-j%z6o$LOyW0!K*nrvh)y*_`io`N8AfsVkP1taG8~f`+)mdKXD0ofDI6rfd|#)wCN$JsdXDDVWEARYsrWRt|>z*B6BcmjBuO%qQ7&#)QdDQDK5 zV{^pQ&b+(87Kmqn7uh25th3}Uvt{5pYu>54I@8@1w&Jd`Rd4a8De4@I!jA8G zye_$Qyn9gdp`Qe|a__$1`(f9V=9w_vyXMT^!IotS9t20N24>0b(X(jYIJtJ`Eh&Y4 z(v;MxZSC8EWH?$qjjyUMp6 z=wf?k2fmP|6Q&Hq^{uAE4I@-Oq)e}6`&IL#UVT6R78_5SvMHcZ;3UA{IF94{4H0P@ zaDwO@1_D0zC&V}#UALzmo3;4hy$`Z;lN);s3ZXRgo)zM0y3g0#4 zIoukSSV1S^z@-w#V0%m_2xFI~)8s)IHw>aMe#W6TqzF@iG=&U)v*kHV%u*@AY%vF>i@1+VGA#H$3D>;EqU&H>($j2J%EZ@hVr^F z&v>9y8R$?3x?$L!Ee)gEXoZPa?NWJ-7jy6vh^A;=n)?6z4MnuLrWU%3YD|s%5$pO7 D*b~blr zEo(`^CIMPV8YmC~1c-SAOj;-u=+{yRB`tl>NBW?T>5G>9$gUVG2pIrrRq&OPVcbI-kZ@!-vLC79I{K5=r;@WFm1k z!4fQKCG4b{Okz1@rPLJtrqwk3rmc*fRkLMopS22h zm)b?;oYigjs6A9}vwH15wU5eqtKVLyuCoW!0lQ!ACtSOAlf7PDZx5=2_6Bu>J){oV z8`X{WusWPf80m92vySB~p9M)efpU|&$=;mBsC(>Db<`eH z$Lzi8UVERq&)%=@w-2ZXh;E&A(7s*0oyr5&TkJd3JE(k<^;Y{%^-hp`BU}GOQXMxo zu|fE~%Q$4*eKcY87>9-u^m{k{s`s!B#=UIlP~v2QZDhkwCfKl%Wj8;aRu8k(RHC@) zb+lVC>38bovg7HV>6G2m#gyN6CLz2w=3x8$&5#_u}fu9i!ap22m` z;ePv(72WjodCTzg6S`%I(vG%#R{8?Jjow@qu+@0fB*%ZB%WS!RCDrE)RnrzRiryQUvKb6lIa@A$+6 zlc!Jm=_BP;zkPbOVjQtd-SykB_=wK^ymQ{*mZP&`>h&~?_w`O3bjmMCg6V1nq|co# zSM<^{$kKnpw2WhhTjFK~hKLfrp28*>zh^=RBGX$vW!fgFz|S5(ZaPnH*)*I`m5ig~{u^ieiSp25x@J0r&E57%+0C*N^Q z_w+@s+p@BIlE_dyD7fD(@TW}IGs+-JK|D`++|X^mz20m8+1Ac_5!cuNZE%J=B~UyR z+fmw++^JUJp<~)`y@#tHE$DJud)V;K>lRqgagXptcbfOZfIu3LKg5r&dWMT;Edeg_ zX@jT37!=+OCNL6ek|orXkv1~yyR3tCKACwU367j4%;rTY`4Vp5#|-PhmA^1KVklm?PL2TW*uP;0EdIX;g8rj zyGwEypqd}Cd)U2__9n!%Z)rck{+Rs*mDxIgD|hMPqI%* z%ud4m6ZQv`vUu-#EcN;U)h(~ixRVkF#pEB z%)TNqqlEc)c7=UaV#WybQ}#9Xb&1(anEznkVBeIOeT4Z>_AT~piP=w>m)UpN??}u6 z!u*W=F8e)+Imiw`*niD0P!K-~@y>v-npvopOKbar@I5mlLg7p>!)IqllrYTC1QB3% z*3ak=0M-UQ44|!z{M_;i5p*-Nvb$=5_if@ z)m01(*NWvhmC=r{qiN`*ROKA2yd?;qOtGu3r@)e^%o~bsA!=3O5CYBeBK8^E&3HwJ zXieAt4hJ$f*W5}d_06}FN*`C2jnx&0 zvnaO`tlgx|dEpem9>%+~I5(%5HkcR1qWmBf2d%JTdP^Z!(YW%lCn~`2hsCBe(;>cmUR>#+Dr07&F*dg*)e9{dC9N>imLpVQdsk zdw$F^=f^6mkgJprjPBbz2C6mo;JOYuhdZX1S50S3pD&GRWI^(S%Br7+p(4kh<1(K~ z)Os7I$0$_#IcFZ3mCz}J50(Qb<#)nEF;)9fI3idk!L`v@L{rd!?tw2^&Wfuz;I|ww z=vZWI-~kT94Deakgdg#tb>oh?3KNbC~n0lnG0qKT_@T)bX=GZSR-9MloSmq zLRjsm`=M|Xje3{vEcCyKS-#S0g=Y1xn6N<5IMC;=X}@@teSzh4xfns9k z?qFT@5o0ey12+#Kb+Na-Kbd)>cI#EF5oy+98tj5ha|{ZXl8-0Of$~}E>EttTBmss= zvh?L7m?nd!c{}`OV1aoe4Q9$rCH5uU;gw_(YLbaZ(R6?-W@|qURdj?V0V?}VOaxLr zCPj_2g)HV&Dh~ImW!S*tG6B}OreFeKXJ^r|bC>xhyT99-VPyTz&u-p#6T zU;=4ggBoNSNGwIx6cCMIgqKTH$Vvp5VoEH^4}&C43l%>DxF-;gi*l_$GHBA|2~c!C zm_Ph9lG1vHB|kIoI2PXm#n8)f>}mMo_$S~;2`#FeC!CM~21dubNwA!zv&d_`)N zttk@@B-W z|0N)yo`_Gg-O5FxB-Nee!+v|XiMxcTs{m9L)oBwJ-VC+vSx_} zr9>rpimO@T827tKOL}ce0)iz;9Qp?2Yum4RR1zML_{>Y+rVo_YTm!9CZuK9_nO%mUf&a^vvLM4KKYSy|k_z3tBb% z#7#IvofL!NTk7OhpcJ7dU)vgyDVF?tMdEgh1OuUx8wBu?&;d}prGybq<>1t6S-X?Q@7 z#0UZAOY$WsG&p8XIOb!BbrDn%oJVjwf~F`}fK|Dy!I4f0E+Ae50v8Pn4%yihaU1FU zHsQzaTER8E8F_s%8_EbhTu-F90A$VbY=aJ~l|Ue^0+|u)fK3SR9%P(V(9TNvzpx#7 z?cRuquA`}+S#n&@Ps5q0pTV5m?}FeB0Z$iqUu!o-FMEO@y&YJ_`Wi-vW)n#Fe;11R z%Lv|$ph@waa14UiP?}e&{5RAGfgoFJT4L&CATjK_);d9WkZT^Vd^p?#*L?%Zq2A*J zlNs!Lfvj1aLLd%oQZD=-5Crn1oBW`W&d<28^6_r$?=}F}>i}1zAn%V6B-oCCS|IF; zE4CCkyD)fc7TZXAy&~`r#PA-F%M|J$WZo7sj|PM|T0gfym#4e{z5CtVupQW0N#F82 zxB+_>@M-R?Z4R#q!ITp%H#D4xq1gin&UIF<>T7}}j4!BLIC``rI`Wxn+j16mhTd#Q|Hf^~CzF~Q` zp*)vRSSY~tI7jpQ8Qfp^S%~GHgXg|FToLtClmKyr+?a5#^@?&m1zlSw%8~nj{w$8S zSJa3LYkU=ee*)P)hjrC(i4*rwk>(>xy$x=vJvb=GdniFlML^=Z7sW{0NFBANfy~a% zhRVZr3NN=&1u@=MY!eG%Jqptt!BN%6(CmSoi}3CRtOT&bbKuR9a4{Tc3d#*+ejXTCM@3-pBNhaW)pq|4|LRWsdMf0%bnL$gU( z4x>7Gvy${72RI7AcT6;t#C<9hC3@P~LKv%oxD_By1M6wIgky5SRGY_RM1y?JO@kA^;g;2;7z zaCi%rh$EHWijVl-5eP%&dmG9}8_LHT$|ta#;dJ$aG@>P8bK)X}uyn679oFNGO2B1z zLm7{#p|=?%tW)E;aWT*7XjQ{1JgMb#2%0E20}k5HV^v+6VZ^3RoDOusu)3}bIv*r% z3s|v;pstI2tp4cO4E57W+0=U+Wr5Qn5Xbf|0uKQl2T|#Kh$B1o;Uh`33raA)3y4?^ zv8Zi2X96WrQvEn0=zN3JMZ3@Ugyh?y1f9GW5l@6zJgxxj`w>CM2E-804nS>`pck;J z-WP3Wsn@5lqHeCIu}zNCW|DfM9VH1#ed5lvwZ1ONw%GcQAror|X{4XR z63O{#EYWV_c`VVki1hFrK2nML`3yW3lVYQmzfSf7l4bbkv1$kbHOAqz zs!OW2Nr~~Q#Wbn4hpn+#Qdx^}NKtaGl8BZ$4- z&ubcPRW!}-&@|hDH%+iy(6q;@x+QBm=@l9A20YI|JAOBUBM2rC97k{;f(H@24Z#@% z4Ttx6Bf?q-Ks|bD#!2kk09^juv za2dfD5qt^3iwM4q;428OAowbRmk|60g5N~&H3Z*4@J$5YLhx+_-$776A)(SC#O(#J zAHMD=#OHh>l}shOlc@oMd4g>O(*jdSraJK()Z|kAZ=|yHRA`_R)Bv%r|9?~MK^;E# zHar6_!9_sPFSbkd2K|P80j(&D-ZIpufY56yhq42=|3T@m*}k>MR*V>vz&Dmd%Kjwj z4qvkepVG;>ibv4@7OL>hAow3op@PwQ;D~tD_0#amB2Oa@z0dC{IhKVlI>BFSjAB(5 zt8xh15af}l12TL3dkc6WlD8uw<+!{93ptT+QPwA-UjbWnQ5_uKK>opd5Yvl*;&DHg z)*(P|^9zusxxgK+lHmG$5b+xj-zQqbNjdyU0us1>yN1U>F1*7<@x))R!CRolDBVQi zOSxu^-in|rKDxA}i&MIdgjpzPDH);{6a4M~1?d6GsUX|D+&a3nDWbDB5!^7Ka|~0o zO`}snI;r-%G~T~jb(*J?s8n`-rg`@>B4e3c z5}Bw_roV)FPj*kqsP_-vHlpp0(AqSjDUEicpiPdSJ^xZQqP-_3uCbzMYSm1Q1kb@4 zm}(-5*JsO_f`tVCzY?~kX9Y&PJ0dWiV*ZZ-D3Vi2@<7r<CWJq0cGGJMw|tm3x;_ z9;-wi%KLKvGJ>pAc>p;cwS!}~)Wr+s%-j}g^=FU4IKD}YO@vddsDyLu+*l^63M}K4 zm{f`hJUO*So4I55CW0IHe2A}&eeJ-73BB!D7~QBv!)l?$D`nXa)3TVt@n&wdW6e~t zQoBaz0zl(bbl`*U_%WiZ zhg*Fa-@3J_S`@qiU0lC|^Ec0+N1rYVHA8`Y%igdPqg9)r*M+FAhgG2Bw-=;6``o?4o-+hsr4n^#|2;K0U}@Q14Q2Q5IuuCxZ9?jYf&rCQ3kb<^9pgF z^Y7=Py4guMm!^Pa;K@~{ah%&-4Ehi!Y>UtR4y&kMPpwS>p@qIuP8X%2W~Rs0 zO-h^{8nUR3ZDfrkyT}H~?jjPBhX}}19s=Ywe#iy+1)awv4}M#~Kmu^%b-q*8-P1Ee zX`Qt;ULZ|OvFcQH)v2m;zH{nSJ0l}m1<#3p|NHt&#}(z@s1Sb=D7>gBs=KW!%0UGhInHGnI^>B^udgu96e^WFy}k zsf>txs!?c;Rz{n}N>P;44ZS&5858+TW4t+0nP^T{CY!q|yFkm@xyDp;cV)N8=No&P z)0OGw-pbzQzREt(M(jdkfAc`)K=WYbVDnJrkf4n=%;rOthg5|<%tlWutaw_fJYpBw zqxRVI3VRIH$5*szrE*x%#z8yG9!8rZqC6qml-Oa><_STY3}_Dv+LMB|3$$JK)RtPA zVfyOP71iF2zdb+E?C0!9?Z=;@+jdIzZMR}GTWXGlz(dsy;Pua&nJ;n~PCj#mTP@lGs zgL)j)Qb2tM)D!kIpgsfYlL7T4s3+}bL47vX_E}q7R7&6Yl%%4h`Z=rBay-kcJ1uts z<$|^BdfcjcP3B#3?2_)M=dDJ=T5d2uJMT0atVV79)azEeU2k2cS5CPbt=gIEb#KwL zYF9x?o;`Qka#>09b7#-5pEzaPoVl(joD2$RH4{q#5MuE$#FVCrIvGw^|#pIctVv}Fr0o>{WotFLfpt<6W! zgFkZid@vOn(=VJozv$Gi5=oTveWj6$FP%S6+f*xLZ@*-D)@5!rWAyY=^#b$O zt;Wk(#WBv_U8{3etvRh0IAOLw5|WmkwU+H?U5r?Dcy-0zo}fJQ%JQGtHR~@@|t>0j)VR&(r4 z?kZdAYUam^o%|{KxT$s=^jPa8yNTP`JBq4+k1@f=a==HTH(IavuE9Uw`h~?s!^MCuT3zQv5kL}<3?-$58!N^ zW_wcs4~g3ocJ2<~zncIooP}Kn#Li0#4+SieF6`9s<v>=mcUW|=+P<_>|MJL|43uQ=Cd%j>MQKHI1-&$c&UAzH`F$DW#X>mEDW2C7+? znLBH>HtNo-wOpI6%4KuQ?G3+J1)9}u%VPocAO>>Rkz~`FT2u>aUe)OD3r*90Vdz=a zP_wG0rEh5ena?GWE2_p9nqi<#9<8$~YQ8XZO&v!mtr<7+Y8r1FdRm>-G}I^2-uNP$ z(9}th%Ntn@Ei~=t*_5I3moRh!GC}o0DR znU@5iw?Td(;5=AEKNp+HLMiX3tJMIGv(;+TvDX@aW`2UYNmZ-1Q$uM2CBcI~TCK($ zWmLUPRj*L;DkWzr`5j6KK4Zx|70)0cq;ZQ#vWlS=%mOfr{>Ig)7InQRI;hc1LmXnd zow0S>xCJkuVlbU0aCidZP#F~X3qX?`n3Zr6`ojDO`q(}cc>Ihx%&rcIplsu#eQhB}#8R9lAsxsnR9-5OBMu@)ti)(L2EP7Tg^44-lpI zS9LE7rz^Xf7Y>&#MoCAlM$k&WZ{vSvTKP!(Ktn%(-k_ht^Ga8xC0gL4m=k=RT@bu= z#=UC2y?#>YHpvU^Ro_EP17T2Ia%n$QR+UwBb5~uU6Hc`!bW&bP0`985;j+exlmrq2 zKmB~eYA)N>3qL@~l?&W?dSI){>^e?gy(5ZSeqIQ<`vNlZ^&#f4N0PY$GFWMKRk^Lw zN-rw>0!Vi?zKDPP8NEx@X$!)4~aU5{{od_uL`PYeb2?<73zkTJI-_r5~5}JD{Aw*NJ^uA0Vg`n z%AuRYzeRO~7E+P~$OwE98~6-WlqnH#BM|agDn3Vv03(8+k|uW5&qj`eD|jjy{M*#< z5+wqw#O4!YesNIlJ_gl&6iHqy=y1+-y=?~0uXNdPNF^59SP{HgZ^<)iH~NmZF@EOS7D73K2^o-? z>oG4~z8$6*EzX<_tHj=s6OPUIt}2dk3#EiO!tkTm2R}!L(CXsSg)^sK=j3Mi<23)O zd^-S`yNI#X8m>GP{x%x*uu8zcpCbVY8vh;YKNDu)MlnCGcJ@edS(NJ^Yq$Vl>6aP4 zjCb!Q2lR};PHg3b^vUQVulMtCnu_z3PzQg5-)CfS)9{$IWKk8=8VG$)s9`QSi=l?W zQ<}65I}vzF3452Fv-6^qgx54>kJ;m*l(Huvp}YMe#o^*J9GKFO8qmsoLTW%t(o+Md zf-Y3SfGXgKcsntm3Kt%LDiE)sl>h(Hhv8Yrl!DvXhJ{kHrxKijBEl;4qST4qLMPT* z_3QnL!7rojfHDZ-{AbYJEE4U8md~rnFUIxG{y|YG$CSZOHE~Kt7{pHqwD$EC+uh#N zi=1Dga8}op5%RZvW5Gd0SH}q9LwU%E6fTmo_f?ymR;}~12qhK~`yNC|U}VDqlwGTP zS4_(c*r4bdo&Lyq8V0GL5ur`XX&q(Fwg+4zD}!))>vA++fN7WtHLXS00EDFk)~!!bB`TtR31_3wUSI&+QdGSl{T5w%sT^y;JxT;lL}1~kT`UJ8 z-|oLs554(w$F4!?Sy*U&A z>&>+$ZO<}xDcH7HVAmxMpb}Lay+gSj_lwXhrEWE<%YzlFZMX|y4R?TU~T&^JOLYIF5ID8F`q&RNF zNgR!<(pPg5NrCASFNSzaLvCW&=zr@V4(b>=k`Khw3mJ-;HTZfaq@vH)6NXLNvq@pk z!uJBl?ViT$ztEFB*xx7?;L+{v7nishldcwlUHDL*exKl90Dhf=r)qTlATMbG$?Azz zS;BWL6c8zipR~lAY4j)+eb)dlvVOr&U9nnrgYoSHy@-`;Djm@vdgW(5+{soi)1~Zo zF}k0Hp(Xn&)V>eO$*yLC*|=?F$jHhF*QQPpt}W$+f&+~5s`6(CHgTLmTuR~lyT)z3 zivx~0+@Nk#%iv1$ws9wDy9sX(9v?2~?r5s=?txNR*!7JBsT0lKkJ#H85(OU)rt3~YCgrC9Py;&GMbPSUDdk~sFK=!lZ@cq&&7s9jmsKDhl8|QDaAoqmiN3b<~6&-eVMY0vgVc)=o zsl~~a@r^5v>-jn~**CxkWpbzAF^?P}_GZi@#M+EWT$M_t*j6ma zKsdhCF(f?w0T|+cNXZW<>DOhz6uR{s+zTioCaB%mljszCD40iswpEtp!02>--KXFHA!Vqi<1y1yP!VI@ii|F3?eE9iJ zG^5VO4mk3gi6U=c+L5sQiYRiQnSCvI@_!Y|+iBi$NUG(lW3k}~5uUVH6i~!t}7zG z7s|mev%udWT?xY6qc{{D92UH|j`U0njIiZh;ljoUBdmjs@S%Jp2vaEZjPQT~p8qO# zmpFjEUEn{&5TzhaCXC>ZL5S(>JQc~RwQ0JY%HTN+oGsM}w==99&yhY;m!y(o)pquGanL(s9b!zIB0 zfIKp2Z0V}t%R)&v6mOVaoIk~7!QuNzZX8#3(6^sJR_<+ksdfzmO501NQa*NP^$5L8 z7D#^g`8ego$DfBOXHp_^LUT(fmY(zRA=JtmKI*0qp)_hSOUY3rzK*Xs#l^Tk+Kc|X zWulUZxk zoELmCD!-0k_~g`UI8IxFd`PBmAF(wa=VSEBI3*MGUOKqkarrKy5&ZJqRFM=h7MJfK ziU6)@$}Lb`LIkzNtpKM}llbgR9K85`DjuMOF7Y{qY2`K38OoibWSJ6*?uvkeI1UJZ zNWdExJGlcW;+r7(<=G3^NX2~>NkK^?0F%cTt9kqtWloz^CljFIe-Sm4_z1&DYM*QP dvbC^XJX0)R@&seY3OI{2vk`la&Af literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/anyio/abc/__pycache__/_streams.cpython-310.pyc b/.venv/lib/python3.10/site-packages/anyio/abc/__pycache__/_streams.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0ffccb0ad641b604ad2d8fc28a74961d79635202 GIT binary patch literal 8581 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/anyio/abc/__pycache__/_subprocesses.cpython-310.pyc b/.venv/lib/python3.10/site-packages/anyio/abc/__pycache__/_subprocesses.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..df16e1f2abb8172510eb3450da71cc52414623d7 GIT binary patch literal 2982 zcmcImOLH4V5Z+zMdP{!A!Ff3YT%sbZNFY^|ilUMLWn3|i%QA%0fz@bdWG~r=m>JoT ziwl+f5^lNk3*Z-U-78#j_RS}{_oWRnjswM3ZC7{C%=Xvc_Vi59Y}Pb*KKk=lXSt$j zf1r_nieTK;G+pk3!ZfD4ny2@59d*Msyh6Va=>@mw&GqL%FS0qeX@RWPb zo=;u*LXQ_T@5!le?{FDRgw5MVxOji6_zt(ZbHIB_aO#CEboIE;V%x@8`DYG{yO`h4 zpm43PGp%nhyp+z6xvgXevKa+WI_3fQ4?3DT3)mkxCn${qTycPc-q;K}C#5|Z`HJiQy<}s36)Q%QYaK<%tZvJQL9s}}ou~x*H1QHh)K+I|p-C;>a4NqXv*+^*mppIJ=OERVH zmy9-ScZ8C7aasejZIC1JTxEb|WyK#G-dnV~JswmV} zl!ytH`Q_K!gLVcruBWykT9A#nh$8C%aaq-K;ormYh^OVWta78TEv&WOT+7<{{BP~Z zJfpS?V~5?zg4fgF;61598zn!IGrLCmiw?8A5lP%5PwR{(*?6f_l6@)(oQ-7470EUd zOM1p3luGvDA%_NlVDkOqjLd2=3T)5aEWxET!P(%+%F74oc~icHnZh{^XE7NCBHGMS zQJ+!4h~tkZ>J5IwoK(#5?`JrhDbC1$vii#Le_oWg&q5hY)SJO90UTJgp5bieaKgZA z3-#l(;BX;;$A1M1mTsO33I?`d6XI1+)Ip^BBI?C>Ut$xAXGGp)_NCnHD>?ld>hod6 zvV7`s%L;3jCyVFb_1c0 zCU9p0=mI-$Sb&Q~j5g|6$P7#p$wgEOygWhbaoI~z22;T0I!1IF)UfhNOwOm+)g`9T O&>DcYVJzqu3V#8FV%=>3 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/anyio/abc/__pycache__/_tasks.cpython-310.pyc b/.venv/lib/python3.10/site-packages/anyio/abc/__pycache__/_tasks.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..386edbb8ede379070472ac1ea76b54850ca74472 GIT binary patch literal 4695 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 s0= (3, 11): + from typing import TypeVarTuple, Unpack +else: + from typing_extensions import TypeVarTuple, Unpack + +if TYPE_CHECKING: + from _typeshed import FileDescriptorLike + + from .._core._synchronization import CapacityLimiter, Event, Lock, Semaphore + from .._core._tasks import CancelScope + from .._core._testing import TaskInfo + from ._sockets import ( + ConnectedUDPSocket, + ConnectedUNIXDatagramSocket, + IPSockAddrType, + SocketListener, + SocketStream, + UDPSocket, + UNIXDatagramSocket, + UNIXSocketStream, + ) + from ._subprocesses import Process + from ._tasks import TaskGroup + from ._testing import TestRunner + +T_Retval = TypeVar("T_Retval") +PosArgsT = TypeVarTuple("PosArgsT") +StrOrBytesPath: TypeAlias = str | bytes | PathLike[str] | PathLike[bytes] + + +class AsyncBackend(metaclass=ABCMeta): + @classmethod + @abstractmethod + def run( + cls, + func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]], + args: tuple[Unpack[PosArgsT]], + kwargs: dict[str, Any], + options: dict[str, Any], + ) -> T_Retval: + """ + Run the given coroutine function in an asynchronous event loop. + + The current thread must not be already running an event loop. + + :param func: a coroutine function + :param args: positional arguments to ``func`` + :param kwargs: positional arguments to ``func`` + :param options: keyword arguments to call the backend ``run()`` implementation + with + :return: the return value of the coroutine function + """ + + @classmethod + @abstractmethod + def current_token(cls) -> object: + """ + Return an object that allows other threads to run code inside the event loop. + + :return: a token object, specific to the event loop running in the current + thread + """ + + @classmethod + @abstractmethod + def current_time(cls) -> float: + """ + Return the current value of the event loop's internal clock. + + :return: the clock value (seconds) + """ + + @classmethod + @abstractmethod + def cancelled_exception_class(cls) -> type[BaseException]: + """Return the exception class that is raised in a task if it's cancelled.""" + + @classmethod + @abstractmethod + async def checkpoint(cls) -> None: + """ + Check if the task has been cancelled, and allow rescheduling of other tasks. + + This is effectively the same as running :meth:`checkpoint_if_cancelled` and then + :meth:`cancel_shielded_checkpoint`. + """ + + @classmethod + async def checkpoint_if_cancelled(cls) -> None: + """ + Check if the current task group has been cancelled. + + This will check if the task has been cancelled, but will not allow other tasks + to be scheduled if not. + + """ + if cls.current_effective_deadline() == -math.inf: + await cls.checkpoint() + + @classmethod + async def cancel_shielded_checkpoint(cls) -> None: + """ + Allow the rescheduling of other tasks. + + This will give other tasks the opportunity to run, but without checking if the + current task group has been cancelled, unlike with :meth:`checkpoint`. + + """ + with cls.create_cancel_scope(shield=True): + await cls.sleep(0) + + @classmethod + @abstractmethod + async def sleep(cls, delay: float) -> None: + """ + Pause the current task for the specified duration. + + :param delay: the duration, in seconds + """ + + @classmethod + @abstractmethod + def create_cancel_scope( + cls, *, deadline: float = math.inf, shield: bool = False + ) -> CancelScope: + pass + + @classmethod + @abstractmethod + def current_effective_deadline(cls) -> float: + """ + Return the nearest deadline among all the cancel scopes effective for the + current task. + + :return: + - a clock value from the event loop's internal clock + - ``inf`` if there is no deadline in effect + - ``-inf`` if the current scope has been cancelled + :rtype: float + """ + + @classmethod + @abstractmethod + def create_task_group(cls) -> TaskGroup: + pass + + @classmethod + @abstractmethod + def create_event(cls) -> Event: + pass + + @classmethod + @abstractmethod + def create_lock(cls, *, fast_acquire: bool) -> Lock: + pass + + @classmethod + @abstractmethod + def create_semaphore( + cls, + initial_value: int, + *, + max_value: int | None = None, + fast_acquire: bool = False, + ) -> Semaphore: + pass + + @classmethod + @abstractmethod + def create_capacity_limiter(cls, total_tokens: float) -> CapacityLimiter: + pass + + @classmethod + @abstractmethod + async def run_sync_in_worker_thread( + cls, + func: Callable[[Unpack[PosArgsT]], T_Retval], + args: tuple[Unpack[PosArgsT]], + abandon_on_cancel: bool = False, + limiter: CapacityLimiter | None = None, + ) -> T_Retval: + pass + + @classmethod + @abstractmethod + def check_cancelled(cls) -> None: + pass + + @classmethod + @abstractmethod + def run_async_from_thread( + cls, + func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]], + args: tuple[Unpack[PosArgsT]], + token: object, + ) -> T_Retval: + pass + + @classmethod + @abstractmethod + def run_sync_from_thread( + cls, + func: Callable[[Unpack[PosArgsT]], T_Retval], + args: tuple[Unpack[PosArgsT]], + token: object, + ) -> T_Retval: + pass + + @classmethod + @abstractmethod + async def open_process( + cls, + command: StrOrBytesPath | Sequence[StrOrBytesPath], + *, + stdin: int | IO[Any] | None, + stdout: int | IO[Any] | None, + stderr: int | IO[Any] | None, + **kwargs: Any, + ) -> Process: + pass + + @classmethod + @abstractmethod + def setup_process_pool_exit_at_shutdown(cls, workers: set[Process]) -> None: + pass + + @classmethod + @abstractmethod + async def connect_tcp( + cls, host: str, port: int, local_address: IPSockAddrType | None = None + ) -> SocketStream: + pass + + @classmethod + @abstractmethod + async def connect_unix(cls, path: str | bytes) -> UNIXSocketStream: + pass + + @classmethod + @abstractmethod + def create_tcp_listener(cls, sock: socket) -> SocketListener: + pass + + @classmethod + @abstractmethod + def create_unix_listener(cls, sock: socket) -> SocketListener: + pass + + @classmethod + @abstractmethod + async def create_udp_socket( + cls, + family: AddressFamily, + local_address: IPSockAddrType | None, + remote_address: IPSockAddrType | None, + reuse_port: bool, + ) -> UDPSocket | ConnectedUDPSocket: + pass + + @classmethod + @overload + async def create_unix_datagram_socket( + cls, raw_socket: socket, remote_path: None + ) -> UNIXDatagramSocket: ... + + @classmethod + @overload + async def create_unix_datagram_socket( + cls, raw_socket: socket, remote_path: str | bytes + ) -> ConnectedUNIXDatagramSocket: ... + + @classmethod + @abstractmethod + async def create_unix_datagram_socket( + cls, raw_socket: socket, remote_path: str | bytes | None + ) -> UNIXDatagramSocket | ConnectedUNIXDatagramSocket: + pass + + @classmethod + @abstractmethod + async def getaddrinfo( + cls, + host: bytes | str | None, + port: str | int | None, + *, + family: int | AddressFamily = 0, + type: int | SocketKind = 0, + proto: int = 0, + flags: int = 0, + ) -> Sequence[ + tuple[ + AddressFamily, + SocketKind, + int, + str, + tuple[str, int] | tuple[str, int, int, int] | tuple[int, bytes], + ] + ]: + pass + + @classmethod + @abstractmethod + async def getnameinfo( + cls, sockaddr: IPSockAddrType, flags: int = 0 + ) -> tuple[str, str]: + pass + + @classmethod + @abstractmethod + async def wait_readable(cls, obj: FileDescriptorLike) -> None: + pass + + @classmethod + @abstractmethod + async def wait_writable(cls, obj: FileDescriptorLike) -> None: + pass + + @classmethod + @abstractmethod + def notify_closing(cls, obj: FileDescriptorLike) -> None: + pass + + @classmethod + @abstractmethod + async def wrap_listener_socket(cls, sock: socket) -> SocketListener: + pass + + @classmethod + @abstractmethod + async def wrap_stream_socket(cls, sock: socket) -> SocketStream: + pass + + @classmethod + @abstractmethod + async def wrap_unix_stream_socket(cls, sock: socket) -> UNIXSocketStream: + pass + + @classmethod + @abstractmethod + async def wrap_udp_socket(cls, sock: socket) -> UDPSocket: + pass + + @classmethod + @abstractmethod + async def wrap_connected_udp_socket(cls, sock: socket) -> ConnectedUDPSocket: + pass + + @classmethod + @abstractmethod + async def wrap_unix_datagram_socket(cls, sock: socket) -> UNIXDatagramSocket: + pass + + @classmethod + @abstractmethod + async def wrap_connected_unix_datagram_socket( + cls, sock: socket + ) -> ConnectedUNIXDatagramSocket: + pass + + @classmethod + @abstractmethod + def current_default_thread_limiter(cls) -> CapacityLimiter: + pass + + @classmethod + @abstractmethod + def open_signal_receiver( + cls, *signals: Signals + ) -> AbstractContextManager[AsyncIterator[Signals]]: + pass + + @classmethod + @abstractmethod + def get_current_task(cls) -> TaskInfo: + pass + + @classmethod + @abstractmethod + def get_running_tasks(cls) -> Sequence[TaskInfo]: + pass + + @classmethod + @abstractmethod + async def wait_all_tasks_blocked(cls) -> None: + pass + + @classmethod + @abstractmethod + def create_test_runner(cls, options: dict[str, Any]) -> TestRunner: + pass diff --git a/.venv/lib/python3.10/site-packages/anyio/abc/_resources.py b/.venv/lib/python3.10/site-packages/anyio/abc/_resources.py new file mode 100644 index 0000000..10df115 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/anyio/abc/_resources.py @@ -0,0 +1,33 @@ +from __future__ import annotations + +from abc import ABCMeta, abstractmethod +from types import TracebackType +from typing import TypeVar + +T = TypeVar("T") + + +class AsyncResource(metaclass=ABCMeta): + """ + Abstract base class for all closeable asynchronous resources. + + Works as an asynchronous context manager which returns the instance itself on enter, + and calls :meth:`aclose` on exit. + """ + + __slots__ = () + + async def __aenter__(self: T) -> T: + return self + + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + await self.aclose() + + @abstractmethod + async def aclose(self) -> None: + """Close the resource.""" diff --git a/.venv/lib/python3.10/site-packages/anyio/abc/_sockets.py b/.venv/lib/python3.10/site-packages/anyio/abc/_sockets.py new file mode 100644 index 0000000..feb26bd --- /dev/null +++ b/.venv/lib/python3.10/site-packages/anyio/abc/_sockets.py @@ -0,0 +1,399 @@ +from __future__ import annotations + +import errno +import socket +from abc import abstractmethod +from collections.abc import Callable, Collection, Mapping +from contextlib import AsyncExitStack +from io import IOBase +from ipaddress import IPv4Address, IPv6Address +from socket import AddressFamily +from typing import Any, TypeAlias, TypeVar + +from .._core._eventloop import get_async_backend +from .._core._typedattr import ( + TypedAttributeProvider, + TypedAttributeSet, + typed_attribute, +) +from ._streams import ByteStream, Listener, UnreliableObjectStream +from ._tasks import TaskGroup + +IPAddressType: TypeAlias = str | IPv4Address | IPv6Address +IPSockAddrType: TypeAlias = tuple[str, int] +SockAddrType: TypeAlias = IPSockAddrType | str +UDPPacketType: TypeAlias = tuple[bytes, IPSockAddrType] +UNIXDatagramPacketType: TypeAlias = tuple[bytes, str] +T_Retval = TypeVar("T_Retval") + + +def _validate_socket( + sock_or_fd: socket.socket | int, + sock_type: socket.SocketKind, + addr_family: socket.AddressFamily = socket.AF_UNSPEC, + *, + require_connected: bool = False, + require_bound: bool = False, +) -> socket.socket: + if isinstance(sock_or_fd, int): + try: + sock = socket.socket(fileno=sock_or_fd) + except OSError as exc: + if exc.errno == errno.ENOTSOCK: + raise ValueError( + "the file descriptor does not refer to a socket" + ) from exc + elif require_connected: + raise ValueError("the socket must be connected") from exc + elif require_bound: + raise ValueError("the socket must be bound to a local address") from exc + else: + raise + elif isinstance(sock_or_fd, socket.socket): + sock = sock_or_fd + else: + raise TypeError( + f"expected an int or socket, got {type(sock_or_fd).__qualname__} instead" + ) + + try: + if require_connected: + try: + sock.getpeername() + except OSError as exc: + raise ValueError("the socket must be connected") from exc + + if require_bound: + try: + if sock.family in (socket.AF_INET, socket.AF_INET6): + bound_addr = sock.getsockname()[1] + else: + bound_addr = sock.getsockname() + except OSError: + bound_addr = None + + if not bound_addr: + raise ValueError("the socket must be bound to a local address") + + if addr_family != socket.AF_UNSPEC and sock.family != addr_family: + raise ValueError( + f"address family mismatch: expected {addr_family.name}, got " + f"{sock.family.name}" + ) + + if sock.type != sock_type: + raise ValueError( + f"socket type mismatch: expected {sock_type.name}, got {sock.type.name}" + ) + except BaseException: + # Avoid ResourceWarning from the locally constructed socket object + if isinstance(sock_or_fd, int): + sock.detach() + + raise + + sock.setblocking(False) + return sock + + +class SocketAttribute(TypedAttributeSet): + """ + .. attribute:: family + :type: socket.AddressFamily + + the address family of the underlying socket + + .. attribute:: local_address + :type: tuple[str, int] | str + + the local address the underlying socket is connected to + + .. attribute:: local_port + :type: int + + for IP based sockets, the local port the underlying socket is bound to + + .. attribute:: raw_socket + :type: socket.socket + + the underlying stdlib socket object + + .. attribute:: remote_address + :type: tuple[str, int] | str + + the remote address the underlying socket is connected to + + .. attribute:: remote_port + :type: int + + for IP based sockets, the remote port the underlying socket is connected to + """ + + family: AddressFamily = typed_attribute() + local_address: SockAddrType = typed_attribute() + local_port: int = typed_attribute() + raw_socket: socket.socket = typed_attribute() + remote_address: SockAddrType = typed_attribute() + remote_port: int = typed_attribute() + + +class _SocketProvider(TypedAttributeProvider): + @property + def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: + from .._core._sockets import convert_ipv6_sockaddr as convert + + attributes: dict[Any, Callable[[], Any]] = { + SocketAttribute.family: lambda: self._raw_socket.family, + SocketAttribute.local_address: lambda: convert( + self._raw_socket.getsockname() + ), + SocketAttribute.raw_socket: lambda: self._raw_socket, + } + try: + peername: tuple[str, int] | None = convert(self._raw_socket.getpeername()) + except OSError: + peername = None + + # Provide the remote address for connected sockets + if peername is not None: + attributes[SocketAttribute.remote_address] = lambda: peername + + # Provide local and remote ports for IP based sockets + if self._raw_socket.family in (AddressFamily.AF_INET, AddressFamily.AF_INET6): + attributes[SocketAttribute.local_port] = lambda: ( + self._raw_socket.getsockname()[1] + ) + if peername is not None: + remote_port = peername[1] + attributes[SocketAttribute.remote_port] = lambda: remote_port + + return attributes + + @property + @abstractmethod + def _raw_socket(self) -> socket.socket: + pass + + +class SocketStream(ByteStream, _SocketProvider): + """ + Transports bytes over a socket. + + Supports all relevant extra attributes from :class:`~SocketAttribute`. + """ + + @classmethod + async def from_socket(cls, sock_or_fd: socket.socket | int) -> SocketStream: + """ + Wrap an existing socket object or file descriptor as a socket stream. + + The newly created socket wrapper takes ownership of the socket being passed in. + The existing socket must already be connected. + + :param sock_or_fd: a socket object or file descriptor + :return: a socket stream + + """ + sock = _validate_socket(sock_or_fd, socket.SOCK_STREAM, require_connected=True) + return await get_async_backend().wrap_stream_socket(sock) + + +class UNIXSocketStream(SocketStream): + @classmethod + async def from_socket(cls, sock_or_fd: socket.socket | int) -> UNIXSocketStream: + """ + Wrap an existing socket object or file descriptor as a UNIX socket stream. + + The newly created socket wrapper takes ownership of the socket being passed in. + The existing socket must already be connected. + + :param sock_or_fd: a socket object or file descriptor + :return: a UNIX socket stream + + """ + sock = _validate_socket( + sock_or_fd, socket.SOCK_STREAM, socket.AF_UNIX, require_connected=True + ) + return await get_async_backend().wrap_unix_stream_socket(sock) + + @abstractmethod + async def send_fds(self, message: bytes, fds: Collection[int | IOBase]) -> None: + """ + Send file descriptors along with a message to the peer. + + :param message: a non-empty bytestring + :param fds: a collection of files (either numeric file descriptors or open file + or socket objects) + """ + + @abstractmethod + async def receive_fds(self, msglen: int, maxfds: int) -> tuple[bytes, list[int]]: + """ + Receive file descriptors along with a message from the peer. + + :param msglen: length of the message to expect from the peer + :param maxfds: maximum number of file descriptors to expect from the peer + :return: a tuple of (message, file descriptors) + """ + + +class SocketListener(Listener[SocketStream], _SocketProvider): + """ + Listens to incoming socket connections. + + Supports all relevant extra attributes from :class:`~SocketAttribute`. + """ + + @classmethod + async def from_socket( + cls, + sock_or_fd: socket.socket | int, + ) -> SocketListener: + """ + Wrap an existing socket object or file descriptor as a socket listener. + + The newly created listener takes ownership of the socket being passed in. + + :param sock_or_fd: a socket object or file descriptor + :return: a socket listener + + """ + sock = _validate_socket(sock_or_fd, socket.SOCK_STREAM, require_bound=True) + return await get_async_backend().wrap_listener_socket(sock) + + @abstractmethod + async def accept(self) -> SocketStream: + """Accept an incoming connection.""" + + async def serve( + self, + handler: Callable[[SocketStream], Any], + task_group: TaskGroup | None = None, + ) -> None: + from .. import create_task_group + + async with AsyncExitStack() as stack: + if task_group is None: + task_group = await stack.enter_async_context(create_task_group()) + + while True: + stream = await self.accept() + task_group.start_soon(handler, stream) + + +class UDPSocket(UnreliableObjectStream[UDPPacketType], _SocketProvider): + """ + Represents an unconnected UDP socket. + + Supports all relevant extra attributes from :class:`~SocketAttribute`. + """ + + @classmethod + async def from_socket(cls, sock_or_fd: socket.socket | int) -> UDPSocket: + """ + Wrap an existing socket object or file descriptor as a UDP socket. + + The newly created socket wrapper takes ownership of the socket being passed in. + The existing socket must be bound to a local address. + + :param sock_or_fd: a socket object or file descriptor + :return: a UDP socket + + """ + sock = _validate_socket(sock_or_fd, socket.SOCK_DGRAM, require_bound=True) + return await get_async_backend().wrap_udp_socket(sock) + + async def sendto(self, data: bytes, host: str, port: int) -> None: + """ + Alias for :meth:`~.UnreliableObjectSendStream.send` ((data, (host, port))). + + """ + return await self.send((data, (host, port))) + + +class ConnectedUDPSocket(UnreliableObjectStream[bytes], _SocketProvider): + """ + Represents an connected UDP socket. + + Supports all relevant extra attributes from :class:`~SocketAttribute`. + """ + + @classmethod + async def from_socket(cls, sock_or_fd: socket.socket | int) -> ConnectedUDPSocket: + """ + Wrap an existing socket object or file descriptor as a connected UDP socket. + + The newly created socket wrapper takes ownership of the socket being passed in. + The existing socket must already be connected. + + :param sock_or_fd: a socket object or file descriptor + :return: a connected UDP socket + + """ + sock = _validate_socket( + sock_or_fd, + socket.SOCK_DGRAM, + require_connected=True, + ) + return await get_async_backend().wrap_connected_udp_socket(sock) + + +class UNIXDatagramSocket( + UnreliableObjectStream[UNIXDatagramPacketType], _SocketProvider +): + """ + Represents an unconnected Unix datagram socket. + + Supports all relevant extra attributes from :class:`~SocketAttribute`. + """ + + @classmethod + async def from_socket( + cls, + sock_or_fd: socket.socket | int, + ) -> UNIXDatagramSocket: + """ + Wrap an existing socket object or file descriptor as a UNIX datagram + socket. + + The newly created socket wrapper takes ownership of the socket being passed in. + + :param sock_or_fd: a socket object or file descriptor + :return: a UNIX datagram socket + + """ + sock = _validate_socket(sock_or_fd, socket.SOCK_DGRAM, socket.AF_UNIX) + return await get_async_backend().wrap_unix_datagram_socket(sock) + + async def sendto(self, data: bytes, path: str) -> None: + """Alias for :meth:`~.UnreliableObjectSendStream.send` ((data, path)).""" + return await self.send((data, path)) + + +class ConnectedUNIXDatagramSocket(UnreliableObjectStream[bytes], _SocketProvider): + """ + Represents a connected Unix datagram socket. + + Supports all relevant extra attributes from :class:`~SocketAttribute`. + """ + + @classmethod + async def from_socket( + cls, + sock_or_fd: socket.socket | int, + ) -> ConnectedUNIXDatagramSocket: + """ + Wrap an existing socket object or file descriptor as a connected UNIX datagram + socket. + + The newly created socket wrapper takes ownership of the socket being passed in. + The existing socket must already be connected. + + :param sock_or_fd: a socket object or file descriptor + :return: a connected UNIX datagram socket + + """ + sock = _validate_socket( + sock_or_fd, socket.SOCK_DGRAM, socket.AF_UNIX, require_connected=True + ) + return await get_async_backend().wrap_connected_unix_datagram_socket(sock) diff --git a/.venv/lib/python3.10/site-packages/anyio/abc/_streams.py b/.venv/lib/python3.10/site-packages/anyio/abc/_streams.py new file mode 100644 index 0000000..186e3f5 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/anyio/abc/_streams.py @@ -0,0 +1,233 @@ +from __future__ import annotations + +from abc import ABCMeta, abstractmethod +from collections.abc import Callable +from typing import Any, Generic, TypeAlias, TypeVar + +from .._core._exceptions import EndOfStream +from .._core._typedattr import TypedAttributeProvider +from ._resources import AsyncResource +from ._tasks import TaskGroup + +T_Item = TypeVar("T_Item") +T_co = TypeVar("T_co", covariant=True) +T_contra = TypeVar("T_contra", contravariant=True) + + +class UnreliableObjectReceiveStream( + Generic[T_co], AsyncResource, TypedAttributeProvider +): + """ + An interface for receiving objects. + + This interface makes no guarantees that the received messages arrive in the order in + which they were sent, or that no messages are missed. + + Asynchronously iterating over objects of this type will yield objects matching the + given type parameter. + """ + + def __aiter__(self) -> UnreliableObjectReceiveStream[T_co]: + return self + + async def __anext__(self) -> T_co: + try: + return await self.receive() + except EndOfStream: + raise StopAsyncIteration from None + + @abstractmethod + async def receive(self) -> T_co: + """ + Receive the next item. + + :raises ~anyio.ClosedResourceError: if the receive stream has been explicitly + closed + :raises ~anyio.EndOfStream: if this stream has been closed from the other end + :raises ~anyio.BrokenResourceError: if this stream has been rendered unusable + due to external causes + """ + + +class UnreliableObjectSendStream( + Generic[T_contra], AsyncResource, TypedAttributeProvider +): + """ + An interface for sending objects. + + This interface makes no guarantees that the messages sent will reach the + recipient(s) in the same order in which they were sent, or at all. + """ + + @abstractmethod + async def send(self, item: T_contra) -> None: + """ + Send an item to the peer(s). + + :param item: the item to send + :raises ~anyio.ClosedResourceError: if the send stream has been explicitly + closed + :raises ~anyio.BrokenResourceError: if this stream has been rendered unusable + due to external causes + """ + + +class UnreliableObjectStream( + UnreliableObjectReceiveStream[T_Item], UnreliableObjectSendStream[T_Item] +): + """ + A bidirectional message stream which does not guarantee the order or reliability of + message delivery. + """ + + +class ObjectReceiveStream(UnreliableObjectReceiveStream[T_co]): + """ + A receive message stream which guarantees that messages are received in the same + order in which they were sent, and that no messages are missed. + """ + + +class ObjectSendStream(UnreliableObjectSendStream[T_contra]): + """ + A send message stream which guarantees that messages are delivered in the same order + in which they were sent, without missing any messages in the middle. + """ + + +class ObjectStream( + ObjectReceiveStream[T_Item], + ObjectSendStream[T_Item], + UnreliableObjectStream[T_Item], +): + """ + A bidirectional message stream which guarantees the order and reliability of message + delivery. + """ + + @abstractmethod + async def send_eof(self) -> None: + """ + Send an end-of-file indication to the peer. + + You should not try to send any further data to this stream after calling this + method. This method is idempotent (does nothing on successive calls). + """ + + +class ByteReceiveStream(AsyncResource, TypedAttributeProvider): + """ + An interface for receiving bytes from a single peer. + + Iterating this byte stream will yield a byte string of arbitrary length, but no more + than 65536 bytes. + """ + + def __aiter__(self) -> ByteReceiveStream: + return self + + async def __anext__(self) -> bytes: + try: + return await self.receive() + except EndOfStream: + raise StopAsyncIteration from None + + @abstractmethod + async def receive(self, max_bytes: int = 65536) -> bytes: + """ + Receive at most ``max_bytes`` bytes from the peer. + + .. note:: Implementers of this interface should not return an empty + :class:`bytes` object, and users should ignore them. + + :param max_bytes: maximum number of bytes to receive + :return: the received bytes + :raises ~anyio.EndOfStream: if this stream has been closed from the other end + """ + + +class ByteSendStream(AsyncResource, TypedAttributeProvider): + """An interface for sending bytes to a single peer.""" + + @abstractmethod + async def send(self, item: bytes) -> None: + """ + Send the given bytes to the peer. + + :param item: the bytes to send + """ + + +class ByteStream(ByteReceiveStream, ByteSendStream): + """A bidirectional byte stream.""" + + @abstractmethod + async def send_eof(self) -> None: + """ + Send an end-of-file indication to the peer. + + You should not try to send any further data to this stream after calling this + method. This method is idempotent (does nothing on successive calls). + """ + + +#: Type alias for all unreliable bytes-oriented receive streams. +AnyUnreliableByteReceiveStream: TypeAlias = ( + UnreliableObjectReceiveStream[bytes] | ByteReceiveStream +) +#: Type alias for all unreliable bytes-oriented send streams. +AnyUnreliableByteSendStream: TypeAlias = ( + UnreliableObjectSendStream[bytes] | ByteSendStream +) +#: Type alias for all unreliable bytes-oriented streams. +AnyUnreliableByteStream: TypeAlias = UnreliableObjectStream[bytes] | ByteStream +#: Type alias for all bytes-oriented receive streams. +AnyByteReceiveStream: TypeAlias = ObjectReceiveStream[bytes] | ByteReceiveStream +#: Type alias for all bytes-oriented send streams. +AnyByteSendStream: TypeAlias = ObjectSendStream[bytes] | ByteSendStream +#: Type alias for all bytes-oriented streams. +AnyByteStream: TypeAlias = ObjectStream[bytes] | ByteStream + + +class Listener(Generic[T_co], AsyncResource, TypedAttributeProvider): + """An interface for objects that let you accept incoming connections.""" + + @abstractmethod + async def serve( + self, handler: Callable[[T_co], Any], task_group: TaskGroup | None = None + ) -> None: + """ + Accept incoming connections as they come in and start tasks to handle them. + + :param handler: a callable that will be used to handle each accepted connection + :param task_group: the task group that will be used to start tasks for handling + each accepted connection (if omitted, an ad-hoc task group will be created) + """ + + +class ObjectStreamConnectable(Generic[T_co], metaclass=ABCMeta): + @abstractmethod + async def connect(self) -> ObjectStream[T_co]: + """ + Connect to the remote endpoint. + + :return: an object stream connected to the remote end + :raises ConnectionFailed: if the connection fails + """ + + +class ByteStreamConnectable(metaclass=ABCMeta): + @abstractmethod + async def connect(self) -> ByteStream: + """ + Connect to the remote endpoint. + + :return: a bytestream connected to the remote end + :raises ConnectionFailed: if the connection fails + """ + + +#: Type alias for all connectables returning bytestreams or bytes-oriented object streams +AnyByteStreamConnectable: TypeAlias = ( + ObjectStreamConnectable[bytes] | ByteStreamConnectable +) diff --git a/.venv/lib/python3.10/site-packages/anyio/abc/_subprocesses.py b/.venv/lib/python3.10/site-packages/anyio/abc/_subprocesses.py new file mode 100644 index 0000000..ce0564c --- /dev/null +++ b/.venv/lib/python3.10/site-packages/anyio/abc/_subprocesses.py @@ -0,0 +1,79 @@ +from __future__ import annotations + +from abc import abstractmethod +from signal import Signals + +from ._resources import AsyncResource +from ._streams import ByteReceiveStream, ByteSendStream + + +class Process(AsyncResource): + """An asynchronous version of :class:`subprocess.Popen`.""" + + @abstractmethod + async def wait(self) -> int: + """ + Wait until the process exits. + + :return: the exit code of the process + """ + + @abstractmethod + def terminate(self) -> None: + """ + Terminates the process, gracefully if possible. + + On Windows, this calls ``TerminateProcess()``. + On POSIX systems, this sends ``SIGTERM`` to the process. + + .. seealso:: :meth:`subprocess.Popen.terminate` + """ + + @abstractmethod + def kill(self) -> None: + """ + Kills the process. + + On Windows, this calls ``TerminateProcess()``. + On POSIX systems, this sends ``SIGKILL`` to the process. + + .. seealso:: :meth:`subprocess.Popen.kill` + """ + + @abstractmethod + def send_signal(self, signal: Signals) -> None: + """ + Send a signal to the subprocess. + + .. seealso:: :meth:`subprocess.Popen.send_signal` + + :param signal: the signal number (e.g. :data:`signal.SIGHUP`) + """ + + @property + @abstractmethod + def pid(self) -> int: + """The process ID of the process.""" + + @property + @abstractmethod + def returncode(self) -> int | None: + """ + The return code of the process. If the process has not yet terminated, this will + be ``None``. + """ + + @property + @abstractmethod + def stdin(self) -> ByteSendStream | None: + """The stream for the standard input of the process.""" + + @property + @abstractmethod + def stdout(self) -> ByteReceiveStream | None: + """The stream for the standard output of the process.""" + + @property + @abstractmethod + def stderr(self) -> ByteReceiveStream | None: + """The stream for the standard error output of the process.""" diff --git a/.venv/lib/python3.10/site-packages/anyio/abc/_tasks.py b/.venv/lib/python3.10/site-packages/anyio/abc/_tasks.py new file mode 100644 index 0000000..516b3ec --- /dev/null +++ b/.venv/lib/python3.10/site-packages/anyio/abc/_tasks.py @@ -0,0 +1,117 @@ +from __future__ import annotations + +import sys +from abc import ABCMeta, abstractmethod +from collections.abc import Awaitable, Callable +from types import TracebackType +from typing import TYPE_CHECKING, Any, Protocol, overload + +if sys.version_info >= (3, 13): + from typing import TypeVar +else: + from typing_extensions import TypeVar + +if sys.version_info >= (3, 11): + from typing import TypeVarTuple, Unpack +else: + from typing_extensions import TypeVarTuple, Unpack + +if TYPE_CHECKING: + from .._core._tasks import CancelScope + +T_Retval = TypeVar("T_Retval") +T_contra = TypeVar("T_contra", contravariant=True, default=None) +PosArgsT = TypeVarTuple("PosArgsT") + + +class TaskStatus(Protocol[T_contra]): + @overload + def started(self: TaskStatus[None]) -> None: ... + + @overload + def started(self, value: T_contra) -> None: ... + + def started(self, value: T_contra | None = None) -> None: + """ + Signal that the task has started. + + :param value: object passed back to the starter of the task + """ + + +class TaskGroup(metaclass=ABCMeta): + """ + Groups several asynchronous tasks together. + + :ivar cancel_scope: the cancel scope inherited by all child tasks + :vartype cancel_scope: CancelScope + + .. note:: On asyncio, support for eager task factories is considered to be + **experimental**. In particular, they don't follow the usual semantics of new + tasks being scheduled on the next iteration of the event loop, and may thus + cause unexpected behavior in code that wasn't written with such semantics in + mind. + """ + + cancel_scope: CancelScope + + @abstractmethod + def start_soon( + self, + func: Callable[[Unpack[PosArgsT]], Awaitable[Any]], + *args: Unpack[PosArgsT], + name: object = None, + ) -> None: + """ + Start a new task in this task group. + + :param func: a coroutine function + :param args: positional arguments to call the function with + :param name: name of the task, for the purposes of introspection and debugging + + .. versionadded:: 3.0 + """ + + @abstractmethod + async def start( + self, + func: Callable[..., Awaitable[Any]], + *args: object, + name: object = None, + ) -> Any: + """ + Start a new task and wait until it signals for readiness. + + The target callable must accept a keyword argument ``task_status`` (of type + :class:`TaskStatus`). Awaiting on this method will return whatever was passed to + ``task_status.started()`` (``None`` by default). + + .. note:: The :class:`TaskStatus` class is generic, and the type argument should + indicate the type of the value that will be passed to + ``task_status.started()``. + + :param func: a coroutine function that accepts the ``task_status`` keyword + argument + :param args: positional arguments to call the function with + :param name: an optional name for the task, for introspection and debugging + :return: the value passed to ``task_status.started()`` + :raises RuntimeError: if the task finishes without calling + ``task_status.started()`` + + .. seealso:: :ref:`start_initialize` + + .. versionadded:: 3.0 + """ + + @abstractmethod + async def __aenter__(self) -> TaskGroup: + """Enter the task group context and allow starting new tasks.""" + + @abstractmethod + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> bool: + """Exit the task group context waiting for all tasks to finish.""" diff --git a/.venv/lib/python3.10/site-packages/anyio/abc/_testing.py b/.venv/lib/python3.10/site-packages/anyio/abc/_testing.py new file mode 100644 index 0000000..7c50ed7 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/anyio/abc/_testing.py @@ -0,0 +1,65 @@ +from __future__ import annotations + +import types +from abc import ABCMeta, abstractmethod +from collections.abc import AsyncGenerator, Callable, Coroutine, Iterable +from typing import Any, TypeVar + +_T = TypeVar("_T") + + +class TestRunner(metaclass=ABCMeta): + """ + Encapsulates a running event loop. Every call made through this object will use the + same event loop. + """ + + def __enter__(self) -> TestRunner: + return self + + @abstractmethod + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: types.TracebackType | None, + ) -> bool | None: ... + + @abstractmethod + def run_asyncgen_fixture( + self, + fixture_func: Callable[..., AsyncGenerator[_T, Any]], + kwargs: dict[str, Any], + ) -> Iterable[_T]: + """ + Run an async generator fixture. + + :param fixture_func: the fixture function + :param kwargs: keyword arguments to call the fixture function with + :return: an iterator yielding the value yielded from the async generator + """ + + @abstractmethod + def run_fixture( + self, + fixture_func: Callable[..., Coroutine[Any, Any, _T]], + kwargs: dict[str, Any], + ) -> _T: + """ + Run an async fixture. + + :param fixture_func: the fixture function + :param kwargs: keyword arguments to call the fixture function with + :return: the return value of the fixture function + """ + + @abstractmethod + def run_test( + self, test_func: Callable[..., Coroutine[Any, Any, Any]], kwargs: dict[str, Any] + ) -> None: + """ + Run an async test function. + + :param test_func: the test function + :param kwargs: keyword arguments to call the test function with + """ diff --git a/.venv/lib/python3.10/site-packages/anyio/from_thread.py b/.venv/lib/python3.10/site-packages/anyio/from_thread.py new file mode 100644 index 0000000..837de5e --- /dev/null +++ b/.venv/lib/python3.10/site-packages/anyio/from_thread.py @@ -0,0 +1,578 @@ +from __future__ import annotations + +__all__ = ( + "BlockingPortal", + "BlockingPortalProvider", + "check_cancelled", + "run", + "run_sync", + "start_blocking_portal", +) + +import sys +from collections.abc import Awaitable, Callable, Generator +from concurrent.futures import Future +from contextlib import ( + AbstractAsyncContextManager, + AbstractContextManager, + contextmanager, +) +from dataclasses import dataclass, field +from functools import partial +from inspect import isawaitable +from threading import Lock, Thread, current_thread, get_ident +from types import TracebackType +from typing import ( + Any, + Generic, + TypeVar, + cast, + overload, +) + +from ._core._eventloop import ( + get_cancelled_exc_class, + threadlocals, +) +from ._core._eventloop import run as run_eventloop +from ._core._exceptions import NoEventLoopError +from ._core._synchronization import Event +from ._core._tasks import CancelScope, create_task_group +from .abc._tasks import TaskStatus +from .lowlevel import EventLoopToken, current_token + +if sys.version_info >= (3, 11): + from typing import TypeVarTuple, Unpack +else: + from typing_extensions import TypeVarTuple, Unpack + +T_Retval = TypeVar("T_Retval") +T_co = TypeVar("T_co", covariant=True) +PosArgsT = TypeVarTuple("PosArgsT") + + +def _token_or_error(token: EventLoopToken | None) -> EventLoopToken: + if token is not None: + return token + + try: + return threadlocals.current_token + except AttributeError: + raise NoEventLoopError( + "Not running inside an AnyIO worker thread, and no event loop token was " + "provided" + ) from None + + +def run( + func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]], + *args: Unpack[PosArgsT], + token: EventLoopToken | None = None, +) -> T_Retval: + """ + Call a coroutine function from a worker thread. + + :param func: a coroutine function + :param args: positional arguments for the callable + :param token: an event loop token to use to get back to the event loop thread + (required if calling this function from outside an AnyIO worker thread) + :return: the return value of the coroutine function + :raises MissingTokenError: if no token was provided and called from outside an + AnyIO worker thread + :raises RunFinishedError: if the event loop tied to ``token`` is no longer running + + .. versionchanged:: 4.11.0 + Added the ``token`` parameter. + + """ + explicit_token = token is not None + token = _token_or_error(token) + return token.backend_class.run_async_from_thread( + func, args, token=token.native_token if explicit_token else None + ) + + +def run_sync( + func: Callable[[Unpack[PosArgsT]], T_Retval], + *args: Unpack[PosArgsT], + token: EventLoopToken | None = None, +) -> T_Retval: + """ + Call a function in the event loop thread from a worker thread. + + :param func: a callable + :param args: positional arguments for the callable + :param token: an event loop token to use to get back to the event loop thread + (required if calling this function from outside an AnyIO worker thread) + :return: the return value of the callable + :raises MissingTokenError: if no token was provided and called from outside an + AnyIO worker thread + :raises RunFinishedError: if the event loop tied to ``token`` is no longer running + + .. versionchanged:: 4.11.0 + Added the ``token`` parameter. + + """ + explicit_token = token is not None + token = _token_or_error(token) + return token.backend_class.run_sync_from_thread( + func, args, token=token.native_token if explicit_token else None + ) + + +class _BlockingAsyncContextManager(Generic[T_co], AbstractContextManager): + _enter_future: Future[T_co] + _exit_future: Future[bool | None] + _exit_event: Event + _exit_exc_info: tuple[ + type[BaseException] | None, BaseException | None, TracebackType | None + ] = (None, None, None) + + def __init__( + self, async_cm: AbstractAsyncContextManager[T_co], portal: BlockingPortal + ): + self._async_cm = async_cm + self._portal = portal + + async def run_async_cm(self) -> bool | None: + try: + self._exit_event = Event() + value = await self._async_cm.__aenter__() + except BaseException as exc: + self._enter_future.set_exception(exc) + raise + else: + self._enter_future.set_result(value) + + try: + # Wait for the sync context manager to exit. + # This next statement can raise `get_cancelled_exc_class()` if + # something went wrong in a task group in this async context + # manager. + await self._exit_event.wait() + finally: + # In case of cancellation, it could be that we end up here before + # `_BlockingAsyncContextManager.__exit__` is called, and an + # `_exit_exc_info` has been set. + result = await self._async_cm.__aexit__(*self._exit_exc_info) + + return result + + def __enter__(self) -> T_co: + self._enter_future = Future() + self._exit_future = self._portal.start_task_soon(self.run_async_cm) + return self._enter_future.result() + + def __exit__( + self, + __exc_type: type[BaseException] | None, + __exc_value: BaseException | None, + __traceback: TracebackType | None, + ) -> bool | None: + self._exit_exc_info = __exc_type, __exc_value, __traceback + self._portal.call(self._exit_event.set) + return self._exit_future.result() + + +class _BlockingPortalTaskStatus(TaskStatus): + def __init__(self, future: Future): + self._future = future + + def started(self, value: object = None) -> None: + self._future.set_result(value) + + +class BlockingPortal: + """ + An object that lets external threads run code in an asynchronous event loop. + + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + """ + + def __init__(self) -> None: + self._token = current_token() + self._event_loop_thread_id: int | None = get_ident() + self._stop_event = Event() + self._task_group = create_task_group() + + async def __aenter__(self) -> BlockingPortal: + await self._task_group.__aenter__() + return self + + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> bool: + await self.stop() + return await self._task_group.__aexit__(exc_type, exc_val, exc_tb) + + def _check_running(self) -> None: + if self._event_loop_thread_id is None: + raise RuntimeError("This portal is not running") + if self._event_loop_thread_id == get_ident(): + raise RuntimeError( + "This method cannot be called from the event loop thread" + ) + + async def sleep_until_stopped(self) -> None: + """Sleep until :meth:`stop` is called.""" + await self._stop_event.wait() + + async def stop(self, cancel_remaining: bool = False) -> None: + """ + Signal the portal to shut down. + + This marks the portal as no longer accepting new calls and exits from + :meth:`sleep_until_stopped`. + + :param cancel_remaining: ``True`` to cancel all the remaining tasks, ``False`` + to let them finish before returning + + """ + self._event_loop_thread_id = None + self._stop_event.set() + if cancel_remaining: + self._task_group.cancel_scope.cancel("the blocking portal is shutting down") + + async def _call_func( + self, + func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval] | T_Retval], + args: tuple[Unpack[PosArgsT]], + kwargs: dict[str, Any], + future: Future[T_Retval], + ) -> None: + def callback(f: Future[T_Retval]) -> None: + if f.cancelled(): + if self._event_loop_thread_id == get_ident(): + scope.cancel("the future was cancelled") + elif self._event_loop_thread_id is not None: + self.call(scope.cancel, "the future was cancelled") + + try: + retval_or_awaitable = func(*args, **kwargs) + if isawaitable(retval_or_awaitable): + with CancelScope() as scope: + future.add_done_callback(callback) + retval = await retval_or_awaitable + else: + retval = retval_or_awaitable + except get_cancelled_exc_class(): + future.cancel() + future.set_running_or_notify_cancel() + except BaseException as exc: + if not future.cancelled(): + future.set_exception(exc) + + # Let base exceptions fall through + if not isinstance(exc, Exception): + raise + else: + if not future.cancelled(): + future.set_result(retval) + finally: + scope = None # type: ignore[assignment] + + def _spawn_task_from_thread( + self, + func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval] | T_Retval], + args: tuple[Unpack[PosArgsT]], + kwargs: dict[str, Any], + name: object, + future: Future[T_Retval], + ) -> None: + """ + Spawn a new task using the given callable. + + :param func: a callable + :param args: positional arguments to be passed to the callable + :param kwargs: keyword arguments to be passed to the callable + :param name: name of the task (will be coerced to a string if not ``None``) + :param future: a future that will resolve to the return value of the callable, + or the exception raised during its execution + + """ + run_sync( + partial(self._task_group.start_soon, name=name), + self._call_func, + func, + args, + kwargs, + future, + token=self._token, + ) + + @overload + def call( + self, + func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]], + *args: Unpack[PosArgsT], + ) -> T_Retval: ... + + @overload + def call( + self, func: Callable[[Unpack[PosArgsT]], T_Retval], *args: Unpack[PosArgsT] + ) -> T_Retval: ... + + def call( + self, + func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval] | T_Retval], + *args: Unpack[PosArgsT], + ) -> T_Retval: + """ + Call the given function in the event loop thread. + + If the callable returns a coroutine object, it is awaited on. + + :param func: any callable + :raises RuntimeError: if the portal is not running or if this method is called + from within the event loop thread + + """ + return cast(T_Retval, self.start_task_soon(func, *args).result()) + + @overload + def start_task_soon( + self, + func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]], + *args: Unpack[PosArgsT], + name: object = None, + ) -> Future[T_Retval]: ... + + @overload + def start_task_soon( + self, + func: Callable[[Unpack[PosArgsT]], T_Retval], + *args: Unpack[PosArgsT], + name: object = None, + ) -> Future[T_Retval]: ... + + def start_task_soon( + self, + func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval] | T_Retval], + *args: Unpack[PosArgsT], + name: object = None, + ) -> Future[T_Retval]: + """ + Start a task in the portal's task group. + + The task will be run inside a cancel scope which can be cancelled by cancelling + the returned future. + + :param func: the target function + :param args: positional arguments passed to ``func`` + :param name: name of the task (will be coerced to a string if not ``None``) + :return: a future that resolves with the return value of the callable if the + task completes successfully, or with the exception raised in the task + :raises RuntimeError: if the portal is not running or if this method is called + from within the event loop thread + :rtype: concurrent.futures.Future[T_Retval] + + .. versionadded:: 3.0 + + """ + self._check_running() + f: Future[T_Retval] = Future() + self._spawn_task_from_thread(func, args, {}, name, f) + return f + + def start_task( + self, + func: Callable[..., Awaitable[T_Retval]], + *args: object, + name: object = None, + ) -> tuple[Future[T_Retval], Any]: + """ + Start a task in the portal's task group and wait until it signals for readiness. + + This method works the same way as :meth:`.abc.TaskGroup.start`. + + :param func: the target function + :param args: positional arguments passed to ``func`` + :param name: name of the task (will be coerced to a string if not ``None``) + :return: a tuple of (future, task_status_value) where the ``task_status_value`` + is the value passed to ``task_status.started()`` from within the target + function + :rtype: tuple[concurrent.futures.Future[T_Retval], Any] + + .. versionadded:: 3.0 + + """ + + def task_done(future: Future[T_Retval]) -> None: + if not task_status_future.done(): + if future.cancelled(): + task_status_future.cancel() + elif future.exception(): + task_status_future.set_exception(future.exception()) + else: + exc = RuntimeError( + "Task exited without calling task_status.started()" + ) + task_status_future.set_exception(exc) + + self._check_running() + task_status_future: Future = Future() + task_status = _BlockingPortalTaskStatus(task_status_future) + f: Future = Future() + f.add_done_callback(task_done) + self._spawn_task_from_thread(func, args, {"task_status": task_status}, name, f) + return f, task_status_future.result() + + def wrap_async_context_manager( + self, cm: AbstractAsyncContextManager[T_co] + ) -> AbstractContextManager[T_co]: + """ + Wrap an async context manager as a synchronous context manager via this portal. + + Spawns a task that will call both ``__aenter__()`` and ``__aexit__()``, stopping + in the middle until the synchronous context manager exits. + + :param cm: an asynchronous context manager + :return: a synchronous context manager + + .. versionadded:: 2.1 + + """ + return _BlockingAsyncContextManager(cm, self) + + +@dataclass +class BlockingPortalProvider: + """ + A manager for a blocking portal. Used as a context manager. The first thread to + enter this context manager causes a blocking portal to be started with the specific + parameters, and the last thread to exit causes the portal to be shut down. Thus, + there will be exactly one blocking portal running in this context as long as at + least one thread has entered this context manager. + + The parameters are the same as for :func:`~anyio.run`. + + :param backend: name of the backend + :param backend_options: backend options + + .. versionadded:: 4.4 + """ + + backend: str = "asyncio" + backend_options: dict[str, Any] | None = None + _lock: Lock = field(init=False, default_factory=Lock) + _leases: int = field(init=False, default=0) + _portal: BlockingPortal = field(init=False) + _portal_cm: AbstractContextManager[BlockingPortal] | None = field( + init=False, default=None + ) + + def __enter__(self) -> BlockingPortal: + with self._lock: + if self._portal_cm is None: + self._portal_cm = start_blocking_portal( + self.backend, self.backend_options + ) + self._portal = self._portal_cm.__enter__() + + self._leases += 1 + return self._portal + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + portal_cm: AbstractContextManager[BlockingPortal] | None = None + with self._lock: + assert self._portal_cm + assert self._leases > 0 + self._leases -= 1 + if not self._leases: + portal_cm = self._portal_cm + self._portal_cm = None + del self._portal + + if portal_cm: + portal_cm.__exit__(None, None, None) + + +@contextmanager +def start_blocking_portal( + backend: str = "asyncio", + backend_options: dict[str, Any] | None = None, + *, + name: str | None = None, +) -> Generator[BlockingPortal, Any, None]: + """ + Start a new event loop in a new thread and run a blocking portal in its main task. + + The parameters are the same as for :func:`~anyio.run`. + + :param backend: name of the backend + :param backend_options: backend options + :param name: name of the thread + :return: a context manager that yields a blocking portal + + .. versionchanged:: 3.0 + Usage as a context manager is now required. + + """ + + async def run_portal() -> None: + async with BlockingPortal() as portal_: + if name is None: + current_thread().name = f"{backend}-portal-{id(portal_):x}" + + future.set_result(portal_) + await portal_.sleep_until_stopped() + + def run_blocking_portal() -> None: + if future.set_running_or_notify_cancel(): + try: + run_eventloop( + run_portal, backend=backend, backend_options=backend_options + ) + except BaseException as exc: + if not future.done(): + future.set_exception(exc) + + future: Future[BlockingPortal] = Future() + thread = Thread(target=run_blocking_portal, daemon=True, name=name) + thread.start() + try: + cancel_remaining_tasks = False + portal = future.result() + try: + yield portal + except BaseException: + cancel_remaining_tasks = True + raise + finally: + try: + portal.call(portal.stop, cancel_remaining_tasks) + except RuntimeError: + pass + finally: + thread.join() + + +def check_cancelled() -> None: + """ + Check if the cancel scope of the host task's running the current worker thread has + been cancelled. + + If the host task's current cancel scope has indeed been cancelled, the + backend-specific cancellation exception will be raised. + + :raises RuntimeError: if the current thread was not spawned by + :func:`.to_thread.run_sync` + + """ + try: + token: EventLoopToken = threadlocals.current_token + except AttributeError: + raise NoEventLoopError( + "This function can only be called inside an AnyIO worker thread" + ) from None + + token.backend_class.check_cancelled() diff --git a/.venv/lib/python3.10/site-packages/anyio/functools.py b/.venv/lib/python3.10/site-packages/anyio/functools.py new file mode 100644 index 0000000..f1d6c7c --- /dev/null +++ b/.venv/lib/python3.10/site-packages/anyio/functools.py @@ -0,0 +1,409 @@ +from __future__ import annotations + +__all__ = ( + "AsyncCacheInfo", + "AsyncCacheParameters", + "AsyncLRUCacheWrapper", + "cache", + "lru_cache", + "reduce", +) + +import functools +import sys +from collections import OrderedDict +from collections.abc import ( + AsyncIterable, + Awaitable, + Callable, + Coroutine, + Hashable, + Iterable, +) +from functools import update_wrapper +from inspect import iscoroutinefunction +from typing import ( + Any, + Generic, + NamedTuple, + TypedDict, + TypeVar, + cast, + final, + overload, +) +from weakref import WeakKeyDictionary + +from ._core._eventloop import current_time +from ._core._synchronization import Lock +from .lowlevel import RunVar, checkpoint + +if sys.version_info >= (3, 11): + from typing import ParamSpec +else: + from typing_extensions import ParamSpec + +T = TypeVar("T") +S = TypeVar("S") +P = ParamSpec("P") +lru_cache_items: RunVar[ + WeakKeyDictionary[ + AsyncLRUCacheWrapper[Any, Any], + OrderedDict[ + Hashable, + tuple[_InitialMissingType, Lock, float | None] + | tuple[Any, None, float | None], + ], + ] +] = RunVar("lru_cache_items") + + +class _InitialMissingType: + pass + + +initial_missing: _InitialMissingType = _InitialMissingType() + + +class AsyncCacheInfo(NamedTuple): + hits: int + misses: int + maxsize: int | None + currsize: int + ttl: int | None + + +class AsyncCacheParameters(TypedDict): + maxsize: int | None + typed: bool + always_checkpoint: bool + ttl: int | None + + +class _LRUMethodWrapper(Generic[T]): + def __init__(self, wrapper: AsyncLRUCacheWrapper[..., T], instance: object): + self.__wrapper = wrapper + self.__instance = instance + + def cache_info(self) -> AsyncCacheInfo: + return self.__wrapper.cache_info() + + def cache_parameters(self) -> AsyncCacheParameters: + return self.__wrapper.cache_parameters() + + def cache_clear(self) -> None: + self.__wrapper.cache_clear() + + async def __call__(self, *args: Any, **kwargs: Any) -> T: + if self.__instance is None: + return await self.__wrapper(*args, **kwargs) + + return await self.__wrapper(self.__instance, *args, **kwargs) + + +@final +class AsyncLRUCacheWrapper(Generic[P, T]): + def __init__( + self, + func: Callable[P, Awaitable[T]], + maxsize: int | None, + typed: bool, + always_checkpoint: bool, + ttl: int | None, + ): + self.__wrapped__ = func + self._hits: int = 0 + self._misses: int = 0 + self._maxsize = max(maxsize, 0) if maxsize is not None else None + self._currsize: int = 0 + self._typed = typed + self._always_checkpoint = always_checkpoint + self._ttl = ttl + update_wrapper(self, func) + + def cache_info(self) -> AsyncCacheInfo: + return AsyncCacheInfo( + self._hits, self._misses, self._maxsize, self._currsize, self._ttl + ) + + def cache_parameters(self) -> AsyncCacheParameters: + return { + "maxsize": self._maxsize, + "typed": self._typed, + "always_checkpoint": self._always_checkpoint, + "ttl": self._ttl, + } + + def cache_clear(self) -> None: + if cache := lru_cache_items.get(None): + cache.pop(self, None) + self._hits = self._misses = self._currsize = 0 + + async def __call__(self, *args: P.args, **kwargs: P.kwargs) -> T: + # Easy case first: if maxsize == 0, no caching is done + if self._maxsize == 0: + value = await self.__wrapped__(*args, **kwargs) + self._misses += 1 + return value + + # The key is constructed as a flat tuple to avoid memory overhead + key: tuple[Any, ...] = args + if kwargs: + # initial_missing is used as a separator + key += (initial_missing,) + sum(kwargs.items(), ()) + + if self._typed: + key += tuple(type(arg) for arg in args) + if kwargs: + key += (initial_missing,) + tuple(type(val) for val in kwargs.values()) + + try: + cache = lru_cache_items.get() + except LookupError: + cache = WeakKeyDictionary() + lru_cache_items.set(cache) + + try: + cache_entry = cache[self] + except KeyError: + cache_entry = cache[self] = OrderedDict() + + cached_value: T | _InitialMissingType + try: + cached_value, lock, expires_at = cache_entry[key] + except KeyError: + # We're the first task to call this function + cached_value, lock, expires_at = ( + initial_missing, + Lock(fast_acquire=not self._always_checkpoint), + None, + ) + cache_entry[key] = cached_value, lock, expires_at + + if lock is None: + if expires_at is not None and current_time() >= expires_at: + self._currsize -= 1 + cached_value, lock, expires_at = ( + initial_missing, + Lock(fast_acquire=not self._always_checkpoint), + None, + ) + cache_entry[key] = cached_value, lock, expires_at + else: + # The value was already cached + self._hits += 1 + cache_entry.move_to_end(key) + if self._always_checkpoint: + await checkpoint() + + return cast(T, cached_value) + + async with lock: + # Check if another task filled the cache while we acquired the lock + if (cached_value := cache_entry[key][0]) is initial_missing: + self._misses += 1 + if self._maxsize is not None and self._currsize >= self._maxsize: + cache_entry.popitem(last=False) + else: + self._currsize += 1 + + value = await self.__wrapped__(*args, **kwargs) + expires_at = ( + current_time() + self._ttl if self._ttl is not None else None + ) + cache_entry[key] = value, None, expires_at + else: + # Another task filled the cache while we were waiting for the lock + self._hits += 1 + cache_entry.move_to_end(key) + value = cast(T, cached_value) + + return value + + def __get__( + self, instance: object, owner: type | None = None + ) -> _LRUMethodWrapper[T]: + wrapper = _LRUMethodWrapper(self, instance) + update_wrapper(wrapper, self.__wrapped__) + return wrapper + + +class _LRUCacheWrapper(Generic[T]): + def __init__( + self, maxsize: int | None, typed: bool, always_checkpoint: bool, ttl: int | None + ): + self._maxsize = maxsize + self._typed = typed + self._always_checkpoint = always_checkpoint + self._ttl = ttl + + @overload + def __call__( # type: ignore[overload-overlap] + self, func: Callable[P, Coroutine[Any, Any, T]], / + ) -> AsyncLRUCacheWrapper[P, T]: ... + + @overload + def __call__( + self, func: Callable[..., T], / + ) -> functools._lru_cache_wrapper[T]: ... + + def __call__( + self, f: Callable[P, Coroutine[Any, Any, T]] | Callable[..., T], / + ) -> AsyncLRUCacheWrapper[P, T] | functools._lru_cache_wrapper[T]: + if iscoroutinefunction(f): + return AsyncLRUCacheWrapper( + f, self._maxsize, self._typed, self._always_checkpoint, self._ttl + ) + + return functools.lru_cache(maxsize=self._maxsize, typed=self._typed)(f) # type: ignore[arg-type] + + +@overload +def cache( # type: ignore[overload-overlap] + func: Callable[P, Coroutine[Any, Any, T]], / +) -> AsyncLRUCacheWrapper[P, T]: ... + + +@overload +def cache(func: Callable[..., T], /) -> functools._lru_cache_wrapper[T]: ... + + +def cache( + func: Callable[..., T] | Callable[P, Coroutine[Any, Any, T]], / +) -> AsyncLRUCacheWrapper[P, T] | functools._lru_cache_wrapper[T]: + """ + A convenient shortcut for :func:`lru_cache` with ``maxsize=None``. + + This is the asynchronous equivalent to :func:`functools.cache`. + + """ + return lru_cache(maxsize=None)(func) + + +@overload +def lru_cache( + *, + maxsize: int | None = ..., + typed: bool = ..., + always_checkpoint: bool = ..., + ttl: int | None = ..., +) -> _LRUCacheWrapper[Any]: ... + + +@overload +def lru_cache( # type: ignore[overload-overlap] + func: Callable[P, Coroutine[Any, Any, T]], / +) -> AsyncLRUCacheWrapper[P, T]: ... + + +@overload +def lru_cache(func: Callable[..., T], /) -> functools._lru_cache_wrapper[T]: ... + + +def lru_cache( + func: Callable[P, Coroutine[Any, Any, T]] | Callable[..., T] | None = None, + /, + *, + maxsize: int | None = 128, + typed: bool = False, + always_checkpoint: bool = False, + ttl: int | None = None, +) -> ( + AsyncLRUCacheWrapper[P, T] | functools._lru_cache_wrapper[T] | _LRUCacheWrapper[Any] +): + """ + An asynchronous version of :func:`functools.lru_cache`. + + If a synchronous function is passed, the standard library + :func:`functools.lru_cache` is applied instead. + + :param always_checkpoint: if ``True``, every call to the cached function will be + guaranteed to yield control to the event loop at least once + :param ttl: time in seconds after which to invalidate cache entries + + .. note:: Caches and locks are managed on a per-event loop basis. + + """ + if func is None: + return _LRUCacheWrapper[Any](maxsize, typed, always_checkpoint, ttl) + + if not callable(func): + raise TypeError("the first argument must be callable") + + return _LRUCacheWrapper[T](maxsize, typed, always_checkpoint, ttl)(func) + + +@overload +async def reduce( + function: Callable[[T, S], Awaitable[T]], + iterable: Iterable[S] | AsyncIterable[S], + /, + initial: T, +) -> T: ... + + +@overload +async def reduce( + function: Callable[[T, T], Awaitable[T]], + iterable: Iterable[T] | AsyncIterable[T], + /, +) -> T: ... + + +async def reduce( # type: ignore[misc] + function: Callable[[T, T], Awaitable[T]] | Callable[[T, S], Awaitable[T]], + iterable: Iterable[T] | Iterable[S] | AsyncIterable[T] | AsyncIterable[S], + /, + initial: T | _InitialMissingType = initial_missing, +) -> T: + """ + Asynchronous version of :func:`functools.reduce`. + + :param function: a coroutine function that takes two arguments: the accumulated + value and the next element from the iterable + :param iterable: an iterable or async iterable + :param initial: the initial value (if missing, the first element of the iterable is + used as the initial value) + + """ + element: Any + function_called = False + if isinstance(iterable, AsyncIterable): + async_it = iterable.__aiter__() + if initial is initial_missing: + try: + value = cast(T, await async_it.__anext__()) + except StopAsyncIteration: + raise TypeError( + "reduce() of empty sequence with no initial value" + ) from None + else: + value = cast(T, initial) + + async for element in async_it: + value = await function(value, element) + function_called = True + elif isinstance(iterable, Iterable): + it = iter(iterable) + if initial is initial_missing: + try: + value = cast(T, next(it)) + except StopIteration: + raise TypeError( + "reduce() of empty sequence with no initial value" + ) from None + else: + value = cast(T, initial) + + for element in it: + value = await function(value, element) + function_called = True + else: + raise TypeError("reduce() argument 2 must be an iterable or async iterable") + + # Make sure there is at least one checkpoint, even if an empty iterable and an + # initial value were given + if not function_called: + await checkpoint() + + return value diff --git a/.venv/lib/python3.10/site-packages/anyio/lowlevel.py b/.venv/lib/python3.10/site-packages/anyio/lowlevel.py new file mode 100644 index 0000000..ffbb75a --- /dev/null +++ b/.venv/lib/python3.10/site-packages/anyio/lowlevel.py @@ -0,0 +1,196 @@ +from __future__ import annotations + +__all__ = ( + "EventLoopToken", + "RunvarToken", + "RunVar", + "checkpoint", + "checkpoint_if_cancelled", + "cancel_shielded_checkpoint", + "current_token", +) + +import enum +from dataclasses import dataclass +from types import TracebackType +from typing import Any, Generic, Literal, TypeVar, final, overload +from weakref import WeakKeyDictionary + +from ._core._eventloop import get_async_backend +from .abc import AsyncBackend + +T = TypeVar("T") +D = TypeVar("D") + + +async def checkpoint() -> None: + """ + Check for cancellation and allow the scheduler to switch to another task. + + Equivalent to (but more efficient than):: + + await checkpoint_if_cancelled() + await cancel_shielded_checkpoint() + + .. versionadded:: 3.0 + + """ + await get_async_backend().checkpoint() + + +async def checkpoint_if_cancelled() -> None: + """ + Enter a checkpoint if the enclosing cancel scope has been cancelled. + + This does not allow the scheduler to switch to a different task. + + .. versionadded:: 3.0 + + """ + await get_async_backend().checkpoint_if_cancelled() + + +async def cancel_shielded_checkpoint() -> None: + """ + Allow the scheduler to switch to another task but without checking for cancellation. + + Equivalent to (but potentially more efficient than):: + + with CancelScope(shield=True): + await checkpoint() + + .. versionadded:: 3.0 + + """ + await get_async_backend().cancel_shielded_checkpoint() + + +@final +@dataclass(frozen=True, repr=False) +class EventLoopToken: + """ + An opaque object that holds a reference to an event loop. + + .. versionadded:: 4.11.0 + """ + + backend_class: type[AsyncBackend] + native_token: object + + +def current_token() -> EventLoopToken: + """ + Return a token object that can be used to call code in the current event loop from + another thread. + + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + .. versionadded:: 4.11.0 + + """ + backend_class = get_async_backend() + raw_token = backend_class.current_token() + return EventLoopToken(backend_class, raw_token) + + +_run_vars: WeakKeyDictionary[object, dict[RunVar[Any], Any]] = WeakKeyDictionary() + + +class _NoValueSet(enum.Enum): + NO_VALUE_SET = enum.auto() + + +class RunvarToken(Generic[T]): + __slots__ = "_var", "_value", "_redeemed" + + def __init__(self, var: RunVar[T], value: T | Literal[_NoValueSet.NO_VALUE_SET]): + self._var = var + self._value: T | Literal[_NoValueSet.NO_VALUE_SET] = value + self._redeemed = False + + def __enter__(self) -> RunvarToken[T]: + return self + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + self._var.reset(self) + + +class RunVar(Generic[T]): + """ + Like a :class:`~contextvars.ContextVar`, except scoped to the running event loop. + + Can be used as a context manager, Just like :class:`~contextvars.ContextVar`, that + will reset the variable to its previous value when the context block is exited. + """ + + __slots__ = "_name", "_default" + + NO_VALUE_SET: Literal[_NoValueSet.NO_VALUE_SET] = _NoValueSet.NO_VALUE_SET + + def __init__( + self, name: str, default: T | Literal[_NoValueSet.NO_VALUE_SET] = NO_VALUE_SET + ): + self._name = name + self._default = default + + @property + def _current_vars(self) -> dict[RunVar[T], T]: + native_token = current_token().native_token + try: + return _run_vars[native_token] + except KeyError: + run_vars = _run_vars[native_token] = {} + return run_vars + + @overload + def get(self, default: D) -> T | D: ... + + @overload + def get(self) -> T: ... + + def get( + self, default: D | Literal[_NoValueSet.NO_VALUE_SET] = NO_VALUE_SET + ) -> T | D: + try: + return self._current_vars[self] + except KeyError: + if default is not RunVar.NO_VALUE_SET: + return default + elif self._default is not RunVar.NO_VALUE_SET: + return self._default + + raise LookupError( + f'Run variable "{self._name}" has no value and no default set' + ) + + def set(self, value: T) -> RunvarToken[T]: + current_vars = self._current_vars + token = RunvarToken(self, current_vars.get(self, RunVar.NO_VALUE_SET)) + current_vars[self] = value + return token + + def reset(self, token: RunvarToken[T]) -> None: + if token._var is not self: + raise ValueError("This token does not belong to this RunVar") + + if token._redeemed: + raise ValueError("This token has already been used") + + if token._value is _NoValueSet.NO_VALUE_SET: + try: + del self._current_vars[self] + except KeyError: + pass + else: + self._current_vars[self] = token._value + + token._redeemed = True + + def __repr__(self) -> str: + return f"" diff --git a/.venv/lib/python3.10/site-packages/anyio/py.typed b/.venv/lib/python3.10/site-packages/anyio/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/.venv/lib/python3.10/site-packages/anyio/pytest_plugin.py b/.venv/lib/python3.10/site-packages/anyio/pytest_plugin.py new file mode 100644 index 0000000..a5183f0 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/anyio/pytest_plugin.py @@ -0,0 +1,363 @@ +from __future__ import annotations + +import dataclasses +import socket +import sys +from collections.abc import Callable, Generator, Iterator +from contextlib import ExitStack, contextmanager +from inspect import isasyncgenfunction, iscoroutinefunction, ismethod +from typing import Any, cast + +import pytest +from _pytest.fixtures import FuncFixtureInfo, SubRequest +from _pytest.outcomes import Exit +from _pytest.python import CallSpec2 +from _pytest.scope import Scope + +from . import get_available_backends +from ._core._eventloop import ( + current_async_library, + get_async_backend, + reset_current_async_library, + set_current_async_library, +) +from ._core._exceptions import iterate_exceptions +from .abc import TestRunner + +if sys.version_info < (3, 11): + from exceptiongroup import ExceptionGroup + +_current_runner: TestRunner | None = None +_runner_stack: ExitStack | None = None +_runner_leases = 0 + + +def extract_backend_and_options(backend: object) -> tuple[str, dict[str, Any]]: + if isinstance(backend, str): + return backend, {} + elif isinstance(backend, tuple) and len(backend) == 2: + if isinstance(backend[0], str) and isinstance(backend[1], dict): + return cast(tuple[str, dict[str, Any]], backend) + + raise TypeError("anyio_backend must be either a string or tuple of (string, dict)") + + +@contextmanager +def get_runner( + backend_name: str, backend_options: dict[str, Any] +) -> Iterator[TestRunner]: + global _current_runner, _runner_leases, _runner_stack + if _current_runner is None: + asynclib = get_async_backend(backend_name) + _runner_stack = ExitStack() + if current_async_library() is None: + # Since we're in control of the event loop, we can cache the name of the + # async library + token = set_current_async_library(backend_name) + _runner_stack.callback(reset_current_async_library, token) + + backend_options = backend_options or {} + _current_runner = _runner_stack.enter_context( + asynclib.create_test_runner(backend_options) + ) + + _runner_leases += 1 + try: + yield _current_runner + finally: + _runner_leases -= 1 + if not _runner_leases: + assert _runner_stack is not None + _runner_stack.close() + _runner_stack = _current_runner = None + + +def pytest_addoption(parser: pytest.Parser) -> None: + parser.addini( + "anyio_mode", + default="strict", + help='AnyIO plugin mode (either "strict" or "auto")', + ) + + +def pytest_configure(config: pytest.Config) -> None: + config.addinivalue_line( + "markers", + "anyio: mark the (coroutine function) test to be run asynchronously via anyio.", + ) + if ( + config.getini("anyio_mode") == "auto" + and config.pluginmanager.has_plugin("asyncio") + and config.getini("asyncio_mode") == "auto" + ): + config.issue_config_time_warning( + pytest.PytestConfigWarning( + "AnyIO auto mode has been enabled together with pytest-asyncio auto " + "mode. This may cause unexpected behavior." + ), + 1, + ) + + +@pytest.hookimpl(hookwrapper=True) +def pytest_fixture_setup(fixturedef: Any, request: Any) -> Generator[Any]: + def wrapper(anyio_backend: Any, request: SubRequest, **kwargs: Any) -> Any: + # Rebind any fixture methods to the request instance + if ( + request.instance + and ismethod(func) + and type(func.__self__) is type(request.instance) + ): + local_func = func.__func__.__get__(request.instance) + else: + local_func = func + + backend_name, backend_options = extract_backend_and_options(anyio_backend) + if has_backend_arg: + kwargs["anyio_backend"] = anyio_backend + + if has_request_arg: + kwargs["request"] = request + + with get_runner(backend_name, backend_options) as runner: + if isasyncgenfunction(local_func): + yield from runner.run_asyncgen_fixture(local_func, kwargs) + else: + yield runner.run_fixture(local_func, kwargs) + + # Only apply this to coroutine functions and async generator functions in requests + # that involve the anyio_backend fixture + func = fixturedef.func + if isasyncgenfunction(func) or iscoroutinefunction(func): + if "anyio_backend" in request.fixturenames: + fixturedef.func = wrapper + original_argname = fixturedef.argnames + + if not (has_backend_arg := "anyio_backend" in fixturedef.argnames): + fixturedef.argnames += ("anyio_backend",) + + if not (has_request_arg := "request" in fixturedef.argnames): + fixturedef.argnames += ("request",) + + try: + return (yield) + finally: + fixturedef.func = func + fixturedef.argnames = original_argname + + return (yield) + + +@pytest.hookimpl(tryfirst=True) +def pytest_pycollect_makeitem( + collector: pytest.Module | pytest.Class, name: str, obj: object +) -> None: + if collector.istestfunction(obj, name): + inner_func = obj.hypothesis.inner_test if hasattr(obj, "hypothesis") else obj + if iscoroutinefunction(inner_func): + anyio_auto_mode = collector.config.getini("anyio_mode") == "auto" + marker = collector.get_closest_marker("anyio") + own_markers = getattr(obj, "pytestmark", ()) + if ( + anyio_auto_mode + or marker + or any(marker.name == "anyio" for marker in own_markers) + ): + pytest.mark.usefixtures("anyio_backend")(obj) + + +def pytest_collection_finish(session: pytest.Session) -> None: + for i, item in reversed(list(enumerate(session.items))): + if ( + isinstance(item, pytest.Function) + and iscoroutinefunction(item.function) + and item.get_closest_marker("anyio") is not None + and "anyio_backend" not in item.fixturenames + ): + new_items = [] + try: + cs_fields = {f.name for f in dataclasses.fields(CallSpec2)} + except TypeError: + cs_fields = set() + + for param_index, backend in enumerate(get_available_backends()): + if "_arg2scope" in cs_fields: # pytest >= 8 + callspec = CallSpec2( + params={"anyio_backend": backend}, + indices={"anyio_backend": param_index}, + _arg2scope={"anyio_backend": Scope.Module}, + _idlist=[backend], + marks=[], + ) + else: # pytest 7.x + callspec = CallSpec2( # type: ignore[call-arg] + funcargs={}, + params={"anyio_backend": backend}, + indices={"anyio_backend": param_index}, + arg2scope={"anyio_backend": Scope.Module}, + idlist=[backend], + marks=[], + ) + + fi = item._fixtureinfo + new_names_closure = list(fi.names_closure) + if "anyio_backend" not in new_names_closure: + new_names_closure.append("anyio_backend") + + new_fixtureinfo = FuncFixtureInfo( + argnames=fi.argnames, + initialnames=fi.initialnames, + names_closure=new_names_closure, + name2fixturedefs=fi.name2fixturedefs, + ) + new_item = pytest.Function.from_parent( + item.parent, + name=f"{item.originalname}[{backend}]", + callspec=callspec, + callobj=item.obj, + fixtureinfo=new_fixtureinfo, + keywords=item.keywords, + originalname=item.originalname, + ) + new_items.append(new_item) + + session.items[i : i + 1] = new_items + + +@pytest.hookimpl(tryfirst=True) +def pytest_pyfunc_call(pyfuncitem: Any) -> bool | None: + def run_with_hypothesis(**kwargs: Any) -> None: + with get_runner(backend_name, backend_options) as runner: + runner.run_test(original_func, kwargs) + + backend = pyfuncitem.funcargs.get("anyio_backend") + if backend: + backend_name, backend_options = extract_backend_and_options(backend) + + if hasattr(pyfuncitem.obj, "hypothesis"): + # Wrap the inner test function unless it's already wrapped + original_func = pyfuncitem.obj.hypothesis.inner_test + if original_func.__qualname__ != run_with_hypothesis.__qualname__: + if iscoroutinefunction(original_func): + pyfuncitem.obj.hypothesis.inner_test = run_with_hypothesis + + return None + + if iscoroutinefunction(pyfuncitem.obj): + funcargs = pyfuncitem.funcargs + testargs = {arg: funcargs[arg] for arg in pyfuncitem._fixtureinfo.argnames} + with get_runner(backend_name, backend_options) as runner: + try: + runner.run_test(pyfuncitem.obj, testargs) + except ExceptionGroup as excgrp: + for exc in iterate_exceptions(excgrp): + if isinstance(exc, (Exit, KeyboardInterrupt, SystemExit)): + raise exc from excgrp + + raise + + return True + + return None + + +@pytest.fixture(scope="module", params=get_available_backends()) +def anyio_backend(request: Any) -> Any: + return request.param + + +@pytest.fixture +def anyio_backend_name(anyio_backend: Any) -> str: + if isinstance(anyio_backend, str): + return anyio_backend + else: + return anyio_backend[0] + + +@pytest.fixture +def anyio_backend_options(anyio_backend: Any) -> dict[str, Any]: + if isinstance(anyio_backend, str): + return {} + else: + return anyio_backend[1] + + +class FreePortFactory: + """ + Manages port generation based on specified socket kind, ensuring no duplicate + ports are generated. + + This class provides functionality for generating available free ports on the + system. It is initialized with a specific socket kind and can generate ports + for given address families while avoiding reuse of previously generated ports. + + Users should not instantiate this class directly, but use the + ``free_tcp_port_factory`` and ``free_udp_port_factory`` fixtures instead. For simple + uses cases, ``free_tcp_port`` and ``free_udp_port`` can be used instead. + """ + + def __init__(self, kind: socket.SocketKind) -> None: + self._kind = kind + self._generated = set[int]() + + @property + def kind(self) -> socket.SocketKind: + """ + The type of socket connection (e.g., :data:`~socket.SOCK_STREAM` or + :data:`~socket.SOCK_DGRAM`) used to bind for checking port availability + + """ + return self._kind + + def __call__(self, family: socket.AddressFamily | None = None) -> int: + """ + Return an unbound port for the given address family. + + :param family: if omitted, both IPv4 and IPv6 addresses will be tried + :return: a port number + + """ + if family is not None: + families = [family] + else: + families = [socket.AF_INET] + if socket.has_ipv6: + families.append(socket.AF_INET6) + + while True: + port = 0 + with ExitStack() as stack: + for family in families: + sock = stack.enter_context(socket.socket(family, self._kind)) + addr = "::1" if family == socket.AF_INET6 else "127.0.0.1" + try: + sock.bind((addr, port)) + except OSError: + break + + if not port: + port = sock.getsockname()[1] + else: + if port not in self._generated: + self._generated.add(port) + return port + + +@pytest.fixture(scope="session") +def free_tcp_port_factory() -> FreePortFactory: + return FreePortFactory(socket.SOCK_STREAM) + + +@pytest.fixture(scope="session") +def free_udp_port_factory() -> FreePortFactory: + return FreePortFactory(socket.SOCK_DGRAM) + + +@pytest.fixture +def free_tcp_port(free_tcp_port_factory: Callable[[], int]) -> int: + return free_tcp_port_factory() + + +@pytest.fixture +def free_udp_port(free_udp_port_factory: Callable[[], int]) -> int: + return free_udp_port_factory() diff --git a/.venv/lib/python3.10/site-packages/anyio/streams/__init__.py b/.venv/lib/python3.10/site-packages/anyio/streams/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/.venv/lib/python3.10/site-packages/anyio/streams/__pycache__/__init__.cpython-310.pyc b/.venv/lib/python3.10/site-packages/anyio/streams/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0774356da9df287372f32524bfad5cab34f08374 GIT binary patch literal 178 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/anyio/streams/__pycache__/file.cpython-310.pyc b/.venv/lib/python3.10/site-packages/anyio/streams/__pycache__/file.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f6bbfd895b154ecd33002252469a2146aad3dabd GIT binary patch literal 5528 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/anyio/streams/__pycache__/stapled.cpython-310.pyc b/.venv/lib/python3.10/site-packages/anyio/streams/__pycache__/stapled.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7550cc8bc34f7e8f21c64a6cbd749fdb49c93798 GIT binary patch literal 5409 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 HxGnX6QB^Q3 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/anyio/streams/__pycache__/text.cpython-310.pyc b/.venv/lib/python3.10/site-packages/anyio/streams/__pycache__/text.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..94870cdf0623e142a84efd6d751309d91c4e22d9 GIT binary patch literal 7136 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 Js=4;!zX1_6+=>7I literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/anyio/streams/__pycache__/tls.cpython-310.pyc b/.venv/lib/python3.10/site-packages/anyio/streams/__pycache__/tls.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1483329fbc5f6327c1b7ea64bdbd5ab1766442e5 GIT binary patch literal 12780 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 (3, 12): + from typing import override +else: + from typing_extensions import override + + +@dataclass(eq=False) +class BufferedByteReceiveStream(ByteReceiveStream): + """ + Wraps any bytes-based receive stream and uses a buffer to provide sophisticated + receiving capabilities in the form of a byte stream. + """ + + receive_stream: AnyByteReceiveStream + _buffer: bytearray = field(init=False, default_factory=bytearray) + _closed: bool = field(init=False, default=False) + + async def aclose(self) -> None: + await self.receive_stream.aclose() + self._closed = True + + @property + def buffer(self) -> bytes: + """The bytes currently in the buffer.""" + return bytes(self._buffer) + + @property + def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: + return self.receive_stream.extra_attributes + + def feed_data(self, data: Iterable[SupportsIndex], /) -> None: + """ + Append data directly into the buffer. + + Any data in the buffer will be consumed by receive operations before receiving + anything from the wrapped stream. + + :param data: the data to append to the buffer (can be bytes or anything else + that supports ``__index__()``) + + """ + self._buffer.extend(data) + + async def receive(self, max_bytes: int = 65536) -> bytes: + if self._closed: + raise ClosedResourceError + + if self._buffer: + chunk = bytes(self._buffer[:max_bytes]) + del self._buffer[:max_bytes] + return chunk + elif isinstance(self.receive_stream, ByteReceiveStream): + return await self.receive_stream.receive(max_bytes) + else: + # With a bytes-oriented object stream, we need to handle any surplus bytes + # we get from the receive() call + chunk = await self.receive_stream.receive() + if len(chunk) > max_bytes: + # Save the surplus bytes in the buffer + self._buffer.extend(chunk[max_bytes:]) + return chunk[:max_bytes] + else: + return chunk + + async def receive_exactly(self, nbytes: int) -> bytes: + """ + Read exactly the given amount of bytes from the stream. + + :param nbytes: the number of bytes to read + :return: the bytes read + :raises ~anyio.IncompleteRead: if the stream was closed before the requested + amount of bytes could be read from the stream + + """ + while True: + remaining = nbytes - len(self._buffer) + if remaining <= 0: + retval = self._buffer[:nbytes] + del self._buffer[:nbytes] + return bytes(retval) + + try: + if isinstance(self.receive_stream, ByteReceiveStream): + chunk = await self.receive_stream.receive(remaining) + else: + chunk = await self.receive_stream.receive() + except EndOfStream as exc: + raise IncompleteRead from exc + + self._buffer.extend(chunk) + + async def receive_until(self, delimiter: bytes, max_bytes: int) -> bytes: + """ + Read from the stream until the delimiter is found or max_bytes have been read. + + :param delimiter: the marker to look for in the stream + :param max_bytes: maximum number of bytes that will be read before raising + :exc:`~anyio.DelimiterNotFound` + :return: the bytes read (not including the delimiter) + :raises ~anyio.IncompleteRead: if the stream was closed before the delimiter + was found + :raises ~anyio.DelimiterNotFound: if the delimiter is not found within the + bytes read up to the maximum allowed + + """ + delimiter_size = len(delimiter) + offset = 0 + while True: + # Check if the delimiter can be found in the current buffer + index = self._buffer.find(delimiter, offset) + if index >= 0: + found = self._buffer[:index] + del self._buffer[: index + len(delimiter) :] + return bytes(found) + + # Check if the buffer is already at or over the limit + if len(self._buffer) >= max_bytes: + raise DelimiterNotFound(max_bytes) + + # Read more data into the buffer from the socket + try: + data = await self.receive_stream.receive() + except EndOfStream as exc: + raise IncompleteRead from exc + + # Move the offset forward and add the new data to the buffer + offset = max(len(self._buffer) - delimiter_size + 1, 0) + self._buffer.extend(data) + + +class BufferedByteStream(BufferedByteReceiveStream, ByteStream): + """ + A full-duplex variant of :class:`BufferedByteReceiveStream`. All writes are passed + through to the wrapped stream as-is. + """ + + def __init__(self, stream: AnyByteStream): + """ + :param stream: the stream to be wrapped + + """ + super().__init__(stream) + self._stream = stream + + @override + async def send_eof(self) -> None: + await self._stream.send_eof() + + @override + async def send(self, item: bytes) -> None: + await self._stream.send(item) + + +class BufferedConnectable(ByteStreamConnectable): + def __init__(self, connectable: AnyByteStreamConnectable): + """ + :param connectable: the connectable to wrap + + """ + self.connectable = connectable + + @override + async def connect(self) -> BufferedByteStream: + stream = await self.connectable.connect() + return BufferedByteStream(stream) diff --git a/.venv/lib/python3.10/site-packages/anyio/streams/file.py b/.venv/lib/python3.10/site-packages/anyio/streams/file.py new file mode 100644 index 0000000..79c3d50 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/anyio/streams/file.py @@ -0,0 +1,154 @@ +from __future__ import annotations + +__all__ = ( + "FileReadStream", + "FileStreamAttribute", + "FileWriteStream", +) + +from collections.abc import Callable, Mapping +from io import SEEK_SET, UnsupportedOperation +from os import PathLike +from pathlib import Path +from typing import IO, Any + +from .. import ( + BrokenResourceError, + ClosedResourceError, + EndOfStream, + TypedAttributeSet, + to_thread, + typed_attribute, +) +from ..abc import ByteReceiveStream, ByteSendStream + + +class FileStreamAttribute(TypedAttributeSet): + #: the open file descriptor + file: IO[bytes] = typed_attribute() + #: the path of the file on the file system, if available (file must be a real file) + path: Path = typed_attribute() + #: the file number, if available (file must be a real file or a TTY) + fileno: int = typed_attribute() + + +class _BaseFileStream: + def __init__(self, file: IO[bytes]): + self._file = file + + async def aclose(self) -> None: + await to_thread.run_sync(self._file.close) + + @property + def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: + attributes: dict[Any, Callable[[], Any]] = { + FileStreamAttribute.file: lambda: self._file, + } + + if hasattr(self._file, "name"): + attributes[FileStreamAttribute.path] = lambda: Path(self._file.name) + + try: + self._file.fileno() + except UnsupportedOperation: + pass + else: + attributes[FileStreamAttribute.fileno] = lambda: self._file.fileno() + + return attributes + + +class FileReadStream(_BaseFileStream, ByteReceiveStream): + """ + A byte stream that reads from a file in the file system. + + :param file: a file that has been opened for reading in binary mode + + .. versionadded:: 3.0 + """ + + @classmethod + async def from_path(cls, path: str | PathLike[str]) -> FileReadStream: + """ + Create a file read stream by opening the given file. + + :param path: path of the file to read from + + """ + file = await to_thread.run_sync(Path(path).open, "rb") + return cls(file) + + async def receive(self, max_bytes: int = 65536) -> bytes: + try: + data = await to_thread.run_sync(self._file.read, max_bytes) + except ValueError: + raise ClosedResourceError from None + except OSError as exc: + raise BrokenResourceError from exc + + if data: + return data + else: + raise EndOfStream + + async def seek(self, position: int, whence: int = SEEK_SET) -> int: + """ + Seek the file to the given position. + + .. seealso:: :meth:`io.IOBase.seek` + + .. note:: Not all file descriptors are seekable. + + :param position: position to seek the file to + :param whence: controls how ``position`` is interpreted + :return: the new absolute position + :raises OSError: if the file is not seekable + + """ + return await to_thread.run_sync(self._file.seek, position, whence) + + async def tell(self) -> int: + """ + Return the current stream position. + + .. note:: Not all file descriptors are seekable. + + :return: the current absolute position + :raises OSError: if the file is not seekable + + """ + return await to_thread.run_sync(self._file.tell) + + +class FileWriteStream(_BaseFileStream, ByteSendStream): + """ + A byte stream that writes to a file in the file system. + + :param file: a file that has been opened for writing in binary mode + + .. versionadded:: 3.0 + """ + + @classmethod + async def from_path( + cls, path: str | PathLike[str], append: bool = False + ) -> FileWriteStream: + """ + Create a file write stream by opening the given file for writing. + + :param path: path of the file to write to + :param append: if ``True``, open the file for appending; if ``False``, any + existing file at the given path will be truncated + + """ + mode = "ab" if append else "wb" + file = await to_thread.run_sync(Path(path).open, mode) + return cls(file) + + async def send(self, item: bytes) -> None: + try: + await to_thread.run_sync(self._file.write, item) + except ValueError: + raise ClosedResourceError from None + except OSError as exc: + raise BrokenResourceError from exc diff --git a/.venv/lib/python3.10/site-packages/anyio/streams/memory.py b/.venv/lib/python3.10/site-packages/anyio/streams/memory.py new file mode 100644 index 0000000..a3fa0c3 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/anyio/streams/memory.py @@ -0,0 +1,325 @@ +from __future__ import annotations + +__all__ = ( + "MemoryObjectReceiveStream", + "MemoryObjectSendStream", + "MemoryObjectStreamStatistics", +) + +import warnings +from collections import OrderedDict, deque +from dataclasses import dataclass, field +from types import TracebackType +from typing import Generic, NamedTuple, TypeVar + +from .. import ( + BrokenResourceError, + ClosedResourceError, + EndOfStream, + WouldBlock, +) +from .._core._testing import TaskInfo, get_current_task +from ..abc import Event, ObjectReceiveStream, ObjectSendStream +from ..lowlevel import checkpoint + +T_Item = TypeVar("T_Item") +T_co = TypeVar("T_co", covariant=True) +T_contra = TypeVar("T_contra", contravariant=True) + + +class MemoryObjectStreamStatistics(NamedTuple): + current_buffer_used: int #: number of items stored in the buffer + #: maximum number of items that can be stored on this stream (or :data:`math.inf`) + max_buffer_size: float + open_send_streams: int #: number of unclosed clones of the send stream + open_receive_streams: int #: number of unclosed clones of the receive stream + #: number of tasks blocked on :meth:`MemoryObjectSendStream.send` + tasks_waiting_send: int + #: number of tasks blocked on :meth:`MemoryObjectReceiveStream.receive` + tasks_waiting_receive: int + + +@dataclass(eq=False) +class _MemoryObjectItemReceiver(Generic[T_Item]): + task_info: TaskInfo = field(init=False, default_factory=get_current_task) + item: T_Item = field(init=False) + + def __repr__(self) -> str: + # When item is not defined, we get following error with default __repr__: + # AttributeError: 'MemoryObjectItemReceiver' object has no attribute 'item' + item = getattr(self, "item", None) + return f"{self.__class__.__name__}(task_info={self.task_info}, item={item!r})" + + +@dataclass(eq=False) +class _MemoryObjectStreamState(Generic[T_Item]): + max_buffer_size: float = field() + buffer: deque[T_Item] = field(init=False, default_factory=deque) + open_send_channels: int = field(init=False, default=0) + open_receive_channels: int = field(init=False, default=0) + waiting_receivers: OrderedDict[Event, _MemoryObjectItemReceiver[T_Item]] = field( + init=False, default_factory=OrderedDict + ) + waiting_senders: OrderedDict[Event, T_Item] = field( + init=False, default_factory=OrderedDict + ) + + def statistics(self) -> MemoryObjectStreamStatistics: + return MemoryObjectStreamStatistics( + len(self.buffer), + self.max_buffer_size, + self.open_send_channels, + self.open_receive_channels, + len(self.waiting_senders), + len(self.waiting_receivers), + ) + + +@dataclass(eq=False) +class MemoryObjectReceiveStream(Generic[T_co], ObjectReceiveStream[T_co]): + _state: _MemoryObjectStreamState[T_co] + _closed: bool = field(init=False, default=False) + + def __post_init__(self) -> None: + self._state.open_receive_channels += 1 + + def receive_nowait(self) -> T_co: + """ + Receive the next item if it can be done without waiting. + + :return: the received item + :raises ~anyio.ClosedResourceError: if this send stream has been closed + :raises ~anyio.EndOfStream: if the buffer is empty and this stream has been + closed from the sending end + :raises ~anyio.WouldBlock: if there are no items in the buffer and no tasks + waiting to send + + """ + if self._closed: + raise ClosedResourceError + + if self._state.waiting_senders: + # Get the item from the next sender + send_event, item = self._state.waiting_senders.popitem(last=False) + self._state.buffer.append(item) + send_event.set() + + if self._state.buffer: + return self._state.buffer.popleft() + elif not self._state.open_send_channels: + raise EndOfStream + + raise WouldBlock + + async def receive(self) -> T_co: + await checkpoint() + try: + return self.receive_nowait() + except WouldBlock: + # Add ourselves in the queue + receive_event = Event() + receiver = _MemoryObjectItemReceiver[T_co]() + self._state.waiting_receivers[receive_event] = receiver + + try: + await receive_event.wait() + finally: + self._state.waiting_receivers.pop(receive_event, None) + + try: + return receiver.item + except AttributeError: + raise EndOfStream from None + + def clone(self) -> MemoryObjectReceiveStream[T_co]: + """ + Create a clone of this receive stream. + + Each clone can be closed separately. Only when all clones have been closed will + the receiving end of the memory stream be considered closed by the sending ends. + + :return: the cloned stream + + """ + if self._closed: + raise ClosedResourceError + + return MemoryObjectReceiveStream(_state=self._state) + + def close(self) -> None: + """ + Close the stream. + + This works the exact same way as :meth:`aclose`, but is provided as a special + case for the benefit of synchronous callbacks. + + """ + if not self._closed: + self._closed = True + self._state.open_receive_channels -= 1 + if self._state.open_receive_channels == 0: + send_events = list(self._state.waiting_senders.keys()) + for event in send_events: + event.set() + + async def aclose(self) -> None: + self.close() + + def statistics(self) -> MemoryObjectStreamStatistics: + """ + Return statistics about the current state of this stream. + + .. versionadded:: 3.0 + """ + return self._state.statistics() + + def __enter__(self) -> MemoryObjectReceiveStream[T_co]: + return self + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + self.close() + + def __del__(self) -> None: + if not self._closed: + warnings.warn( + f"Unclosed <{self.__class__.__name__} at {id(self):x}>", + ResourceWarning, + stacklevel=1, + source=self, + ) + + +@dataclass(eq=False) +class MemoryObjectSendStream(Generic[T_contra], ObjectSendStream[T_contra]): + _state: _MemoryObjectStreamState[T_contra] + _closed: bool = field(init=False, default=False) + + def __post_init__(self) -> None: + self._state.open_send_channels += 1 + + def send_nowait(self, item: T_contra) -> None: + """ + Send an item immediately if it can be done without waiting. + + :param item: the item to send + :raises ~anyio.ClosedResourceError: if this send stream has been closed + :raises ~anyio.BrokenResourceError: if the stream has been closed from the + receiving end + :raises ~anyio.WouldBlock: if the buffer is full and there are no tasks waiting + to receive + + """ + if self._closed: + raise ClosedResourceError + if not self._state.open_receive_channels: + raise BrokenResourceError + + while self._state.waiting_receivers: + receive_event, receiver = self._state.waiting_receivers.popitem(last=False) + if not receiver.task_info.has_pending_cancellation(): + receiver.item = item + receive_event.set() + return + + if len(self._state.buffer) < self._state.max_buffer_size: + self._state.buffer.append(item) + else: + raise WouldBlock + + async def send(self, item: T_contra) -> None: + """ + Send an item to the stream. + + If the buffer is full, this method blocks until there is again room in the + buffer or the item can be sent directly to a receiver. + + :param item: the item to send + :raises ~anyio.ClosedResourceError: if this send stream has been closed + :raises ~anyio.BrokenResourceError: if the stream has been closed from the + receiving end + + """ + await checkpoint() + try: + self.send_nowait(item) + except WouldBlock: + # Wait until there's someone on the receiving end + send_event = Event() + self._state.waiting_senders[send_event] = item + try: + await send_event.wait() + except BaseException: + self._state.waiting_senders.pop(send_event, None) + raise + + if send_event in self._state.waiting_senders: + del self._state.waiting_senders[send_event] + raise BrokenResourceError from None + + def clone(self) -> MemoryObjectSendStream[T_contra]: + """ + Create a clone of this send stream. + + Each clone can be closed separately. Only when all clones have been closed will + the sending end of the memory stream be considered closed by the receiving ends. + + :return: the cloned stream + + """ + if self._closed: + raise ClosedResourceError + + return MemoryObjectSendStream(_state=self._state) + + def close(self) -> None: + """ + Close the stream. + + This works the exact same way as :meth:`aclose`, but is provided as a special + case for the benefit of synchronous callbacks. + + """ + if not self._closed: + self._closed = True + self._state.open_send_channels -= 1 + if self._state.open_send_channels == 0: + receive_events = list(self._state.waiting_receivers.keys()) + self._state.waiting_receivers.clear() + for event in receive_events: + event.set() + + async def aclose(self) -> None: + self.close() + + def statistics(self) -> MemoryObjectStreamStatistics: + """ + Return statistics about the current state of this stream. + + .. versionadded:: 3.0 + """ + return self._state.statistics() + + def __enter__(self) -> MemoryObjectSendStream[T_contra]: + return self + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + self.close() + + def __del__(self) -> None: + if not self._closed: + warnings.warn( + f"Unclosed <{self.__class__.__name__} at {id(self):x}>", + ResourceWarning, + stacklevel=1, + source=self, + ) diff --git a/.venv/lib/python3.10/site-packages/anyio/streams/stapled.py b/.venv/lib/python3.10/site-packages/anyio/streams/stapled.py new file mode 100644 index 0000000..9248b68 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/anyio/streams/stapled.py @@ -0,0 +1,147 @@ +from __future__ import annotations + +__all__ = ( + "MultiListener", + "StapledByteStream", + "StapledObjectStream", +) + +from collections.abc import Callable, Mapping, Sequence +from dataclasses import dataclass +from typing import Any, Generic, TypeVar + +from ..abc import ( + ByteReceiveStream, + ByteSendStream, + ByteStream, + Listener, + ObjectReceiveStream, + ObjectSendStream, + ObjectStream, + TaskGroup, +) + +T_Item = TypeVar("T_Item") +T_Stream = TypeVar("T_Stream") + + +@dataclass(eq=False) +class StapledByteStream(ByteStream): + """ + Combines two byte streams into a single, bidirectional byte stream. + + Extra attributes will be provided from both streams, with the receive stream + providing the values in case of a conflict. + + :param ByteSendStream send_stream: the sending byte stream + :param ByteReceiveStream receive_stream: the receiving byte stream + """ + + send_stream: ByteSendStream + receive_stream: ByteReceiveStream + + async def receive(self, max_bytes: int = 65536) -> bytes: + return await self.receive_stream.receive(max_bytes) + + async def send(self, item: bytes) -> None: + await self.send_stream.send(item) + + async def send_eof(self) -> None: + await self.send_stream.aclose() + + async def aclose(self) -> None: + await self.send_stream.aclose() + await self.receive_stream.aclose() + + @property + def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: + return { + **self.send_stream.extra_attributes, + **self.receive_stream.extra_attributes, + } + + +@dataclass(eq=False) +class StapledObjectStream(Generic[T_Item], ObjectStream[T_Item]): + """ + Combines two object streams into a single, bidirectional object stream. + + Extra attributes will be provided from both streams, with the receive stream + providing the values in case of a conflict. + + :param ObjectSendStream send_stream: the sending object stream + :param ObjectReceiveStream receive_stream: the receiving object stream + """ + + send_stream: ObjectSendStream[T_Item] + receive_stream: ObjectReceiveStream[T_Item] + + async def receive(self) -> T_Item: + return await self.receive_stream.receive() + + async def send(self, item: T_Item) -> None: + await self.send_stream.send(item) + + async def send_eof(self) -> None: + await self.send_stream.aclose() + + async def aclose(self) -> None: + await self.send_stream.aclose() + await self.receive_stream.aclose() + + @property + def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: + return { + **self.send_stream.extra_attributes, + **self.receive_stream.extra_attributes, + } + + +@dataclass(eq=False) +class MultiListener(Generic[T_Stream], Listener[T_Stream]): + """ + Combines multiple listeners into one, serving connections from all of them at once. + + Any MultiListeners in the given collection of listeners will have their listeners + moved into this one. + + Extra attributes are provided from each listener, with each successive listener + overriding any conflicting attributes from the previous one. + + :param listeners: listeners to serve + :type listeners: Sequence[Listener[T_Stream]] + """ + + listeners: Sequence[Listener[T_Stream]] + + def __post_init__(self) -> None: + listeners: list[Listener[T_Stream]] = [] + for listener in self.listeners: + if isinstance(listener, MultiListener): + listeners.extend(listener.listeners) + del listener.listeners[:] # type: ignore[attr-defined] + else: + listeners.append(listener) + + self.listeners = listeners + + async def serve( + self, handler: Callable[[T_Stream], Any], task_group: TaskGroup | None = None + ) -> None: + from .. import create_task_group + + async with create_task_group() as tg: + for listener in self.listeners: + tg.start_soon(listener.serve, handler, task_group) + + async def aclose(self) -> None: + for listener in self.listeners: + await listener.aclose() + + @property + def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: + attributes: dict = {} + for listener in self.listeners: + attributes.update(listener.extra_attributes) + + return attributes diff --git a/.venv/lib/python3.10/site-packages/anyio/streams/text.py b/.venv/lib/python3.10/site-packages/anyio/streams/text.py new file mode 100644 index 0000000..296cd25 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/anyio/streams/text.py @@ -0,0 +1,176 @@ +from __future__ import annotations + +__all__ = ( + "TextConnectable", + "TextReceiveStream", + "TextSendStream", + "TextStream", +) + +import codecs +import sys +from collections.abc import Callable, Mapping +from dataclasses import InitVar, dataclass, field +from typing import Any + +from ..abc import ( + AnyByteReceiveStream, + AnyByteSendStream, + AnyByteStream, + AnyByteStreamConnectable, + ObjectReceiveStream, + ObjectSendStream, + ObjectStream, + ObjectStreamConnectable, +) + +if sys.version_info >= (3, 12): + from typing import override +else: + from typing_extensions import override + + +@dataclass(eq=False) +class TextReceiveStream(ObjectReceiveStream[str]): + """ + Stream wrapper that decodes bytes to strings using the given encoding. + + Decoding is done using :class:`~codecs.IncrementalDecoder` which returns any + completely received unicode characters as soon as they come in. + + :param transport_stream: any bytes-based receive stream + :param encoding: character encoding to use for decoding bytes to strings (defaults + to ``utf-8``) + :param errors: handling scheme for decoding errors (defaults to ``strict``; see the + `codecs module documentation`_ for a comprehensive list of options) + + .. _codecs module documentation: + https://docs.python.org/3/library/codecs.html#codec-objects + """ + + transport_stream: AnyByteReceiveStream + encoding: InitVar[str] = "utf-8" + errors: InitVar[str] = "strict" + _decoder: codecs.IncrementalDecoder = field(init=False) + + def __post_init__(self, encoding: str, errors: str) -> None: + decoder_class = codecs.getincrementaldecoder(encoding) + self._decoder = decoder_class(errors=errors) + + async def receive(self) -> str: + while True: + chunk = await self.transport_stream.receive() + decoded = self._decoder.decode(chunk) + if decoded: + return decoded + + async def aclose(self) -> None: + await self.transport_stream.aclose() + self._decoder.reset() + + @property + def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: + return self.transport_stream.extra_attributes + + +@dataclass(eq=False) +class TextSendStream(ObjectSendStream[str]): + """ + Sends strings to the wrapped stream as bytes using the given encoding. + + :param AnyByteSendStream transport_stream: any bytes-based send stream + :param str encoding: character encoding to use for encoding strings to bytes + (defaults to ``utf-8``) + :param str errors: handling scheme for encoding errors (defaults to ``strict``; see + the `codecs module documentation`_ for a comprehensive list of options) + + .. _codecs module documentation: + https://docs.python.org/3/library/codecs.html#codec-objects + """ + + transport_stream: AnyByteSendStream + encoding: InitVar[str] = "utf-8" + errors: str = "strict" + _encoder: Callable[..., tuple[bytes, int]] = field(init=False) + + def __post_init__(self, encoding: str) -> None: + self._encoder = codecs.getencoder(encoding) + + async def send(self, item: str) -> None: + encoded = self._encoder(item, self.errors)[0] + await self.transport_stream.send(encoded) + + async def aclose(self) -> None: + await self.transport_stream.aclose() + + @property + def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: + return self.transport_stream.extra_attributes + + +@dataclass(eq=False) +class TextStream(ObjectStream[str]): + """ + A bidirectional stream that decodes bytes to strings on receive and encodes strings + to bytes on send. + + Extra attributes will be provided from both streams, with the receive stream + providing the values in case of a conflict. + + :param AnyByteStream transport_stream: any bytes-based stream + :param str encoding: character encoding to use for encoding/decoding strings to/from + bytes (defaults to ``utf-8``) + :param str errors: handling scheme for encoding errors (defaults to ``strict``; see + the `codecs module documentation`_ for a comprehensive list of options) + + .. _codecs module documentation: + https://docs.python.org/3/library/codecs.html#codec-objects + """ + + transport_stream: AnyByteStream + encoding: InitVar[str] = "utf-8" + errors: InitVar[str] = "strict" + _receive_stream: TextReceiveStream = field(init=False) + _send_stream: TextSendStream = field(init=False) + + def __post_init__(self, encoding: str, errors: str) -> None: + self._receive_stream = TextReceiveStream( + self.transport_stream, encoding=encoding, errors=errors + ) + self._send_stream = TextSendStream( + self.transport_stream, encoding=encoding, errors=errors + ) + + async def receive(self) -> str: + return await self._receive_stream.receive() + + async def send(self, item: str) -> None: + await self._send_stream.send(item) + + async def send_eof(self) -> None: + await self.transport_stream.send_eof() + + async def aclose(self) -> None: + await self._send_stream.aclose() + await self._receive_stream.aclose() + + @property + def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: + return { + **self._send_stream.extra_attributes, + **self._receive_stream.extra_attributes, + } + + +class TextConnectable(ObjectStreamConnectable[str]): + def __init__(self, connectable: AnyByteStreamConnectable): + """ + :param connectable: the bytestream endpoint to wrap + + """ + self.connectable = connectable + + @override + async def connect(self) -> TextStream: + stream = await self.connectable.connect() + return TextStream(stream) diff --git a/.venv/lib/python3.10/site-packages/anyio/streams/tls.py b/.venv/lib/python3.10/site-packages/anyio/streams/tls.py new file mode 100644 index 0000000..e2a7ca5 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/anyio/streams/tls.py @@ -0,0 +1,421 @@ +from __future__ import annotations + +__all__ = ( + "TLSAttribute", + "TLSConnectable", + "TLSListener", + "TLSStream", +) + +import logging +import re +import ssl +import sys +from collections.abc import Callable, Mapping +from dataclasses import dataclass +from functools import wraps +from ssl import SSLContext +from typing import Any, TypeAlias, TypeVar + +from .. import ( + BrokenResourceError, + EndOfStream, + aclose_forcefully, + get_cancelled_exc_class, + to_thread, +) +from .._core._typedattr import TypedAttributeSet, typed_attribute +from ..abc import ( + AnyByteStream, + AnyByteStreamConnectable, + ByteStream, + ByteStreamConnectable, + Listener, + TaskGroup, +) + +if sys.version_info >= (3, 11): + from typing import TypeVarTuple, Unpack +else: + from typing_extensions import TypeVarTuple, Unpack + +if sys.version_info >= (3, 12): + from typing import override +else: + from typing_extensions import override + +T_Retval = TypeVar("T_Retval") +PosArgsT = TypeVarTuple("PosArgsT") +_PCTRTT: TypeAlias = tuple[tuple[str, str], ...] +_PCTRTTT: TypeAlias = tuple[_PCTRTT, ...] + + +class TLSAttribute(TypedAttributeSet): + """Contains Transport Layer Security related attributes.""" + + #: the selected ALPN protocol + alpn_protocol: str | None = typed_attribute() + #: the channel binding for type ``tls-unique`` + channel_binding_tls_unique: bytes = typed_attribute() + #: the selected cipher + cipher: tuple[str, str, int] = typed_attribute() + #: the peer certificate in dictionary form (see :meth:`ssl.SSLSocket.getpeercert` + # for more information) + peer_certificate: None | (dict[str, str | _PCTRTTT | _PCTRTT]) = typed_attribute() + #: the peer certificate in binary form + peer_certificate_binary: bytes | None = typed_attribute() + #: ``True`` if this is the server side of the connection + server_side: bool = typed_attribute() + #: ciphers shared by the client during the TLS handshake (``None`` if this is the + #: client side) + shared_ciphers: list[tuple[str, str, int]] | None = typed_attribute() + #: the :class:`~ssl.SSLObject` used for encryption + ssl_object: ssl.SSLObject = typed_attribute() + #: ``True`` if this stream does (and expects) a closing TLS handshake when the + #: stream is being closed + standard_compatible: bool = typed_attribute() + #: the TLS protocol version (e.g. ``TLSv1.2``) + tls_version: str = typed_attribute() + + +@dataclass(eq=False) +class TLSStream(ByteStream): + """ + A stream wrapper that encrypts all sent data and decrypts received data. + + This class has no public initializer; use :meth:`wrap` instead. + All extra attributes from :class:`~TLSAttribute` are supported. + + :var AnyByteStream transport_stream: the wrapped stream + + """ + + transport_stream: AnyByteStream + standard_compatible: bool + _ssl_object: ssl.SSLObject + _read_bio: ssl.MemoryBIO + _write_bio: ssl.MemoryBIO + + @classmethod + async def wrap( + cls, + transport_stream: AnyByteStream, + *, + server_side: bool | None = None, + hostname: str | None = None, + ssl_context: ssl.SSLContext | None = None, + standard_compatible: bool = True, + ) -> TLSStream: + """ + Wrap an existing stream with Transport Layer Security. + + This performs a TLS handshake with the peer. + + :param transport_stream: a bytes-transporting stream to wrap + :param server_side: ``True`` if this is the server side of the connection, + ``False`` if this is the client side (if omitted, will be set to ``False`` + if ``hostname`` has been provided, ``False`` otherwise). Used only to create + a default context when an explicit context has not been provided. + :param hostname: host name of the peer (if host name checking is desired) + :param ssl_context: the SSLContext object to use (if not provided, a secure + default will be created) + :param standard_compatible: if ``False``, skip the closing handshake when + closing the connection, and don't raise an exception if the peer does the + same + :raises ~ssl.SSLError: if the TLS handshake fails + + """ + if server_side is None: + server_side = not hostname + + if not ssl_context: + purpose = ( + ssl.Purpose.CLIENT_AUTH if server_side else ssl.Purpose.SERVER_AUTH + ) + ssl_context = ssl.create_default_context(purpose) + + # Re-enable detection of unexpected EOFs if it was disabled by Python + if hasattr(ssl, "OP_IGNORE_UNEXPECTED_EOF"): + ssl_context.options &= ~ssl.OP_IGNORE_UNEXPECTED_EOF + + bio_in = ssl.MemoryBIO() + bio_out = ssl.MemoryBIO() + + # External SSLContext implementations may do blocking I/O in wrap_bio(), + # but the standard library implementation won't + if type(ssl_context) is ssl.SSLContext: + ssl_object = ssl_context.wrap_bio( + bio_in, bio_out, server_side=server_side, server_hostname=hostname + ) + else: + ssl_object = await to_thread.run_sync( + ssl_context.wrap_bio, + bio_in, + bio_out, + server_side, + hostname, + None, + ) + + wrapper = cls( + transport_stream=transport_stream, + standard_compatible=standard_compatible, + _ssl_object=ssl_object, + _read_bio=bio_in, + _write_bio=bio_out, + ) + await wrapper._call_sslobject_method(ssl_object.do_handshake) + return wrapper + + async def _call_sslobject_method( + self, func: Callable[[Unpack[PosArgsT]], T_Retval], *args: Unpack[PosArgsT] + ) -> T_Retval: + while True: + try: + result = func(*args) + except ssl.SSLWantReadError: + try: + # Flush any pending writes first + if self._write_bio.pending: + await self.transport_stream.send(self._write_bio.read()) + + data = await self.transport_stream.receive() + except EndOfStream: + self._read_bio.write_eof() + except OSError as exc: + self._read_bio.write_eof() + self._write_bio.write_eof() + raise BrokenResourceError from exc + else: + self._read_bio.write(data) + except ssl.SSLWantWriteError: + await self.transport_stream.send(self._write_bio.read()) + except ssl.SSLSyscallError as exc: + self._read_bio.write_eof() + self._write_bio.write_eof() + raise BrokenResourceError from exc + except ssl.SSLError as exc: + self._read_bio.write_eof() + self._write_bio.write_eof() + if isinstance(exc, ssl.SSLEOFError) or ( + exc.strerror and "UNEXPECTED_EOF_WHILE_READING" in exc.strerror + ): + if self.standard_compatible: + raise BrokenResourceError from exc + else: + raise EndOfStream from None + + raise + else: + # Flush any pending writes first + if self._write_bio.pending: + await self.transport_stream.send(self._write_bio.read()) + + return result + + async def unwrap(self) -> tuple[AnyByteStream, bytes]: + """ + Does the TLS closing handshake. + + :return: a tuple of (wrapped byte stream, bytes left in the read buffer) + + """ + await self._call_sslobject_method(self._ssl_object.unwrap) + self._read_bio.write_eof() + self._write_bio.write_eof() + return self.transport_stream, self._read_bio.read() + + async def aclose(self) -> None: + if self.standard_compatible: + try: + await self.unwrap() + except BaseException: + await aclose_forcefully(self.transport_stream) + raise + + await self.transport_stream.aclose() + + async def receive(self, max_bytes: int = 65536) -> bytes: + data = await self._call_sslobject_method(self._ssl_object.read, max_bytes) + if not data: + raise EndOfStream + + return data + + async def send(self, item: bytes) -> None: + await self._call_sslobject_method(self._ssl_object.write, item) + + async def send_eof(self) -> None: + tls_version = self.extra(TLSAttribute.tls_version) + match = re.match(r"TLSv(\d+)(?:\.(\d+))?", tls_version) + if match: + major, minor = int(match.group(1)), int(match.group(2) or 0) + if (major, minor) < (1, 3): + raise NotImplementedError( + f"send_eof() requires at least TLSv1.3; current " + f"session uses {tls_version}" + ) + + raise NotImplementedError( + "send_eof() has not yet been implemented for TLS streams" + ) + + @property + def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: + return { + **self.transport_stream.extra_attributes, + TLSAttribute.alpn_protocol: self._ssl_object.selected_alpn_protocol, + TLSAttribute.channel_binding_tls_unique: ( + self._ssl_object.get_channel_binding + ), + TLSAttribute.cipher: self._ssl_object.cipher, + TLSAttribute.peer_certificate: lambda: self._ssl_object.getpeercert(False), + TLSAttribute.peer_certificate_binary: lambda: self._ssl_object.getpeercert( + True + ), + TLSAttribute.server_side: lambda: self._ssl_object.server_side, + TLSAttribute.shared_ciphers: lambda: ( + self._ssl_object.shared_ciphers() + if self._ssl_object.server_side + else None + ), + TLSAttribute.standard_compatible: lambda: self.standard_compatible, + TLSAttribute.ssl_object: lambda: self._ssl_object, + TLSAttribute.tls_version: self._ssl_object.version, + } + + +@dataclass(eq=False) +class TLSListener(Listener[TLSStream]): + """ + A convenience listener that wraps another listener and auto-negotiates a TLS session + on every accepted connection. + + If the TLS handshake times out or raises an exception, + :meth:`handle_handshake_error` is called to do whatever post-mortem processing is + deemed necessary. + + Supports only the :attr:`~TLSAttribute.standard_compatible` extra attribute. + + :param Listener listener: the listener to wrap + :param ssl_context: the SSL context object + :param standard_compatible: a flag passed through to :meth:`TLSStream.wrap` + :param handshake_timeout: time limit for the TLS handshake + (passed to :func:`~anyio.fail_after`) + """ + + listener: Listener[Any] + ssl_context: ssl.SSLContext + standard_compatible: bool = True + handshake_timeout: float = 30 + + @staticmethod + async def handle_handshake_error(exc: BaseException, stream: AnyByteStream) -> None: + """ + Handle an exception raised during the TLS handshake. + + This method does 3 things: + + #. Forcefully closes the original stream + #. Logs the exception (unless it was a cancellation exception) using the + ``anyio.streams.tls`` logger + #. Reraises the exception if it was a base exception or a cancellation exception + + :param exc: the exception + :param stream: the original stream + + """ + await aclose_forcefully(stream) + + # Log all except cancellation exceptions + if not isinstance(exc, get_cancelled_exc_class()): + # CPython (as of 3.11.5) returns incorrect `sys.exc_info()` here when using + # any asyncio implementation, so we explicitly pass the exception to log + # (https://github.com/python/cpython/issues/108668). Trio does not have this + # issue because it works around the CPython bug. + logging.getLogger(__name__).exception( + "Error during TLS handshake", exc_info=exc + ) + + # Only reraise base exceptions and cancellation exceptions + if not isinstance(exc, Exception) or isinstance(exc, get_cancelled_exc_class()): + raise + + async def serve( + self, + handler: Callable[[TLSStream], Any], + task_group: TaskGroup | None = None, + ) -> None: + @wraps(handler) + async def handler_wrapper(stream: AnyByteStream) -> None: + from .. import fail_after + + try: + with fail_after(self.handshake_timeout): + wrapped_stream = await TLSStream.wrap( + stream, + ssl_context=self.ssl_context, + standard_compatible=self.standard_compatible, + ) + except BaseException as exc: + await self.handle_handshake_error(exc, stream) + else: + await handler(wrapped_stream) + + await self.listener.serve(handler_wrapper, task_group) + + async def aclose(self) -> None: + await self.listener.aclose() + + @property + def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: + return { + TLSAttribute.standard_compatible: lambda: self.standard_compatible, + } + + +class TLSConnectable(ByteStreamConnectable): + """ + Wraps another connectable and does TLS negotiation after a successful connection. + + :param connectable: the connectable to wrap + :param hostname: host name of the server (if host name checking is desired) + :param ssl_context: the SSLContext object to use (if not provided, a secure default + will be created) + :param standard_compatible: if ``False``, skip the closing handshake when closing + the connection, and don't raise an exception if the server does the same + """ + + def __init__( + self, + connectable: AnyByteStreamConnectable, + *, + hostname: str | None = None, + ssl_context: ssl.SSLContext | None = None, + standard_compatible: bool = True, + ) -> None: + self.connectable = connectable + self.ssl_context: SSLContext = ssl_context or ssl.create_default_context( + ssl.Purpose.SERVER_AUTH + ) + if not isinstance(self.ssl_context, ssl.SSLContext): + raise TypeError( + "ssl_context must be an instance of ssl.SSLContext, not " + f"{type(self.ssl_context).__name__}" + ) + self.hostname = hostname + self.standard_compatible = standard_compatible + + @override + async def connect(self) -> TLSStream: + stream = await self.connectable.connect() + try: + return await TLSStream.wrap( + stream, + hostname=self.hostname, + ssl_context=self.ssl_context, + standard_compatible=self.standard_compatible, + ) + except BaseException: + await aclose_forcefully(stream) + raise diff --git a/.venv/lib/python3.10/site-packages/anyio/to_interpreter.py b/.venv/lib/python3.10/site-packages/anyio/to_interpreter.py new file mode 100644 index 0000000..694dbe7 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/anyio/to_interpreter.py @@ -0,0 +1,246 @@ +from __future__ import annotations + +__all__ = ( + "run_sync", + "current_default_interpreter_limiter", +) + +import atexit +import os +import sys +from collections import deque +from collections.abc import Callable +from typing import Any, Final, TypeVar + +from . import current_time, to_thread +from ._core._exceptions import BrokenWorkerInterpreter +from ._core._synchronization import CapacityLimiter +from .lowlevel import RunVar + +if sys.version_info >= (3, 11): + from typing import TypeVarTuple, Unpack +else: + from typing_extensions import TypeVarTuple, Unpack + +if sys.version_info >= (3, 14): + from concurrent.interpreters import ExecutionFailed, create + + def _interp_call( + func: Callable[..., Any], args: tuple[Any, ...] + ) -> tuple[Any, bool]: + try: + retval = func(*args) + except BaseException as exc: + return exc, True + else: + return retval, False + + class _Worker: + last_used: float = 0 + + def __init__(self) -> None: + self._interpreter = create() + + def destroy(self) -> None: + self._interpreter.close() + + def call( + self, + func: Callable[..., T_Retval], + args: tuple[Any, ...], + ) -> T_Retval: + try: + res, is_exception = self._interpreter.call(_interp_call, func, args) + except ExecutionFailed as exc: + raise BrokenWorkerInterpreter(exc.excinfo) from exc + + if is_exception: + raise res + + return res +elif sys.version_info >= (3, 13): + import _interpqueues + import _interpreters + + UNBOUND: Final = 2 # I have no clue how this works, but it was used in the stdlib + FMT_UNPICKLED: Final = 0 + FMT_PICKLED: Final = 1 + QUEUE_PICKLE_ARGS: Final = (FMT_PICKLED, UNBOUND) + QUEUE_UNPICKLE_ARGS: Final = (FMT_UNPICKLED, UNBOUND) + + _run_func = compile( + """ +import _interpqueues +from _interpreters import NotShareableError +from pickle import loads, dumps, HIGHEST_PROTOCOL + +QUEUE_PICKLE_ARGS = (1, 2) +QUEUE_UNPICKLE_ARGS = (0, 2) + +item = _interpqueues.get(queue_id)[0] +try: + func, args = loads(item) + retval = func(*args) +except BaseException as exc: + is_exception = True + retval = exc +else: + is_exception = False + +try: + _interpqueues.put(queue_id, (retval, is_exception), *QUEUE_UNPICKLE_ARGS) +except NotShareableError: + retval = dumps(retval, HIGHEST_PROTOCOL) + _interpqueues.put(queue_id, (retval, is_exception), *QUEUE_PICKLE_ARGS) + """, + "", + "exec", + ) + + class _Worker: + last_used: float = 0 + + def __init__(self) -> None: + self._interpreter_id = _interpreters.create() + self._queue_id = _interpqueues.create(1, *QUEUE_UNPICKLE_ARGS) + _interpreters.set___main___attrs( + self._interpreter_id, {"queue_id": self._queue_id} + ) + + def destroy(self) -> None: + _interpqueues.destroy(self._queue_id) + _interpreters.destroy(self._interpreter_id) + + def call( + self, + func: Callable[..., T_Retval], + args: tuple[Any, ...], + ) -> T_Retval: + import pickle + + item = pickle.dumps((func, args), pickle.HIGHEST_PROTOCOL) + _interpqueues.put(self._queue_id, item, *QUEUE_PICKLE_ARGS) + exc_info = _interpreters.exec(self._interpreter_id, _run_func) + if exc_info: + raise BrokenWorkerInterpreter(exc_info) + + res = _interpqueues.get(self._queue_id) + (res, is_exception), fmt = res[:2] + if fmt == FMT_PICKLED: + res = pickle.loads(res) + + if is_exception: + raise res + + return res +else: + + class _Worker: + last_used: float = 0 + + def __init__(self) -> None: + raise RuntimeError("subinterpreters require at least Python 3.13") + + def call( + self, + func: Callable[..., T_Retval], + args: tuple[Any, ...], + ) -> T_Retval: + raise NotImplementedError + + def destroy(self) -> None: + pass + + +DEFAULT_CPU_COUNT: Final = 8 # this is just an arbitrarily selected value +MAX_WORKER_IDLE_TIME = ( + 30 # seconds a subinterpreter can be idle before becoming eligible for pruning +) + +T_Retval = TypeVar("T_Retval") +PosArgsT = TypeVarTuple("PosArgsT") + +_idle_workers = RunVar[deque[_Worker]]("_available_workers") +_default_interpreter_limiter = RunVar[CapacityLimiter]("_default_interpreter_limiter") + + +def _stop_workers(workers: deque[_Worker]) -> None: + for worker in workers: + worker.destroy() + + workers.clear() + + +async def run_sync( + func: Callable[[Unpack[PosArgsT]], T_Retval], + *args: Unpack[PosArgsT], + limiter: CapacityLimiter | None = None, +) -> T_Retval: + """ + Call the given function with the given arguments in a subinterpreter. + + .. warning:: On Python 3.13, the :mod:`concurrent.interpreters` module was not yet + available, so the code path for that Python version relies on an undocumented, + private API. As such, it is recommended to not rely on this function for anything + mission-critical on Python 3.13. + + :param func: a callable + :param args: the positional arguments for the callable + :param limiter: capacity limiter to use to limit the total number of subinterpreters + running (if omitted, the default limiter is used) + :return: the result of the call + :raises BrokenWorkerInterpreter: if there's an internal error in a subinterpreter + + """ + if limiter is None: + limiter = current_default_interpreter_limiter() + + try: + idle_workers = _idle_workers.get() + except LookupError: + idle_workers = deque() + _idle_workers.set(idle_workers) + atexit.register(_stop_workers, idle_workers) + + async with limiter: + try: + worker = idle_workers.pop() + except IndexError: + worker = _Worker() + + try: + return await to_thread.run_sync( + worker.call, + func, + args, + limiter=limiter, + ) + finally: + # Prune workers that have been idle for too long + now = current_time() + while idle_workers: + if now - idle_workers[0].last_used <= MAX_WORKER_IDLE_TIME: + break + + await to_thread.run_sync(idle_workers.popleft().destroy, limiter=limiter) + + worker.last_used = current_time() + idle_workers.append(worker) + + +def current_default_interpreter_limiter() -> CapacityLimiter: + """ + Return the capacity limiter used by default to limit the number of concurrently + running subinterpreters. + + Defaults to the number of CPU cores. + + :return: a capacity limiter object + + """ + try: + return _default_interpreter_limiter.get() + except LookupError: + limiter = CapacityLimiter(os.cpu_count() or DEFAULT_CPU_COUNT) + _default_interpreter_limiter.set(limiter) + return limiter diff --git a/.venv/lib/python3.10/site-packages/anyio/to_process.py b/.venv/lib/python3.10/site-packages/anyio/to_process.py new file mode 100644 index 0000000..b289234 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/anyio/to_process.py @@ -0,0 +1,266 @@ +from __future__ import annotations + +__all__ = ( + "current_default_process_limiter", + "process_worker", + "run_sync", +) + +import os +import pickle +import subprocess +import sys +from collections import deque +from collections.abc import Callable +from importlib.util import module_from_spec, spec_from_file_location +from typing import TypeVar, cast + +from ._core._eventloop import current_time, get_async_backend, get_cancelled_exc_class +from ._core._exceptions import BrokenWorkerProcess +from ._core._subprocesses import open_process +from ._core._synchronization import CapacityLimiter +from ._core._tasks import CancelScope, fail_after +from .abc import ByteReceiveStream, ByteSendStream, Process +from .lowlevel import RunVar, checkpoint_if_cancelled +from .streams.buffered import BufferedByteReceiveStream + +if sys.version_info >= (3, 11): + from typing import TypeVarTuple, Unpack +else: + from typing_extensions import TypeVarTuple, Unpack + +WORKER_MAX_IDLE_TIME = 300 # 5 minutes + +T_Retval = TypeVar("T_Retval") +PosArgsT = TypeVarTuple("PosArgsT") + +_process_pool_workers: RunVar[set[Process]] = RunVar("_process_pool_workers") +_process_pool_idle_workers: RunVar[deque[tuple[Process, float]]] = RunVar( + "_process_pool_idle_workers" +) +_default_process_limiter: RunVar[CapacityLimiter] = RunVar("_default_process_limiter") + + +async def run_sync( # type: ignore[return] + func: Callable[[Unpack[PosArgsT]], T_Retval], + *args: Unpack[PosArgsT], + cancellable: bool = False, + limiter: CapacityLimiter | None = None, +) -> T_Retval: + """ + Call the given function with the given arguments in a worker process. + + If the ``cancellable`` option is enabled and the task waiting for its completion is + cancelled, the worker process running it will be abruptly terminated using SIGKILL + (or ``terminateProcess()`` on Windows). + + :param func: a callable + :param args: positional arguments for the callable + :param cancellable: ``True`` to allow cancellation of the operation while it's + running + :param limiter: capacity limiter to use to limit the total amount of processes + running (if omitted, the default limiter is used) + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + :return: an awaitable that yields the return value of the function. + + """ + + async def send_raw_command(pickled_cmd: bytes) -> object: + try: + await stdin.send(pickled_cmd) + response = await buffered.receive_until(b"\n", 50) + status, length = response.split(b" ") + if status not in (b"RETURN", b"EXCEPTION"): + raise RuntimeError( + f"Worker process returned unexpected response: {response!r}" + ) + + pickled_response = await buffered.receive_exactly(int(length)) + except BaseException as exc: + workers.discard(process) + try: + process.kill() + with CancelScope(shield=True): + await process.aclose() + except ProcessLookupError: + pass + + if isinstance(exc, get_cancelled_exc_class()): + raise + else: + raise BrokenWorkerProcess from exc + + retval = pickle.loads(pickled_response) + if status == b"EXCEPTION": + assert isinstance(retval, BaseException) + raise retval + else: + return retval + + # First pickle the request before trying to reserve a worker process + await checkpoint_if_cancelled() + request = pickle.dumps(("run", func, args), protocol=pickle.HIGHEST_PROTOCOL) + + # If this is the first run in this event loop thread, set up the necessary variables + try: + workers = _process_pool_workers.get() + idle_workers = _process_pool_idle_workers.get() + except LookupError: + workers = set() + idle_workers = deque() + _process_pool_workers.set(workers) + _process_pool_idle_workers.set(idle_workers) + get_async_backend().setup_process_pool_exit_at_shutdown(workers) + + async with limiter or current_default_process_limiter(): + # Pop processes from the pool (starting from the most recently used) until we + # find one that hasn't exited yet + process: Process + while idle_workers: + process, idle_since = idle_workers.pop() + if process.returncode is None: + stdin = cast(ByteSendStream, process.stdin) + buffered = BufferedByteReceiveStream( + cast(ByteReceiveStream, process.stdout) + ) + + # Prune any other workers that have been idle for WORKER_MAX_IDLE_TIME + # seconds or longer + now = current_time() + killed_processes: list[Process] = [] + while idle_workers: + if now - idle_workers[0][1] < WORKER_MAX_IDLE_TIME: + break + + process_to_kill, idle_since = idle_workers.popleft() + process_to_kill.kill() + workers.remove(process_to_kill) + killed_processes.append(process_to_kill) + + with CancelScope(shield=True): + for killed_process in killed_processes: + await killed_process.aclose() + + break + + workers.remove(process) + else: + command = [sys.executable, "-u", "-m", __name__] + process = await open_process( + command, stdin=subprocess.PIPE, stdout=subprocess.PIPE + ) + try: + stdin = cast(ByteSendStream, process.stdin) + buffered = BufferedByteReceiveStream( + cast(ByteReceiveStream, process.stdout) + ) + with fail_after(20): + message = await buffered.receive(6) + + if message != b"READY\n": + raise BrokenWorkerProcess( + f"Worker process returned unexpected response: {message!r}" + ) + + main_module_path = getattr(sys.modules["__main__"], "__file__", None) + pickled = pickle.dumps( + ("init", sys.path, main_module_path), + protocol=pickle.HIGHEST_PROTOCOL, + ) + await send_raw_command(pickled) + except (BrokenWorkerProcess, get_cancelled_exc_class()): + raise + except BaseException as exc: + process.kill() + raise BrokenWorkerProcess( + "Error during worker process initialization" + ) from exc + + workers.add(process) + + with CancelScope(shield=not cancellable): + try: + return cast(T_Retval, await send_raw_command(request)) + finally: + if process in workers: + idle_workers.append((process, current_time())) + + +def current_default_process_limiter() -> CapacityLimiter: + """ + Return the capacity limiter that is used by default to limit the number of worker + processes. + + :return: a capacity limiter object + + """ + try: + return _default_process_limiter.get() + except LookupError: + limiter = CapacityLimiter(os.cpu_count() or 2) + _default_process_limiter.set(limiter) + return limiter + + +def process_worker() -> None: + # Redirect standard streams to os.devnull so that user code won't interfere with the + # parent-worker communication + stdin = sys.stdin + stdout = sys.stdout + sys.stdin = open(os.devnull) + sys.stdout = open(os.devnull, "w") + + stdout.buffer.write(b"READY\n") + while True: + retval = exception = None + try: + command, *args = pickle.load(stdin.buffer) + except EOFError: + return + except BaseException as exc: + exception = exc + else: + if command == "run": + func, args = args + try: + retval = func(*args) + except BaseException as exc: + exception = exc + elif command == "init": + main_module_path: str | None + sys.path, main_module_path = args + del sys.modules["__main__"] + if main_module_path and os.path.isfile(main_module_path): + # Load the parent's main module but as __mp_main__ instead of + # __main__ (like multiprocessing does) to avoid infinite recursion + try: + spec = spec_from_file_location("__mp_main__", main_module_path) + if spec and spec.loader: + main = module_from_spec(spec) + spec.loader.exec_module(main) + sys.modules["__main__"] = main + except BaseException as exc: + exception = exc + try: + if exception is not None: + status = b"EXCEPTION" + pickled = pickle.dumps(exception, pickle.HIGHEST_PROTOCOL) + else: + status = b"RETURN" + pickled = pickle.dumps(retval, pickle.HIGHEST_PROTOCOL) + except BaseException as exc: + exception = exc + status = b"EXCEPTION" + pickled = pickle.dumps(exc, pickle.HIGHEST_PROTOCOL) + + stdout.buffer.write(b"%s %d\n" % (status, len(pickled))) + stdout.buffer.write(pickled) + + # Respect SIGTERM + if isinstance(exception, SystemExit): + raise exception + + +if __name__ == "__main__": + process_worker() diff --git a/.venv/lib/python3.10/site-packages/anyio/to_thread.py b/.venv/lib/python3.10/site-packages/anyio/to_thread.py new file mode 100644 index 0000000..83c79d1 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/anyio/to_thread.py @@ -0,0 +1,78 @@ +from __future__ import annotations + +__all__ = ( + "run_sync", + "current_default_thread_limiter", +) + +import sys +from collections.abc import Callable +from typing import TypeVar +from warnings import warn + +from ._core._eventloop import get_async_backend +from .abc import CapacityLimiter + +if sys.version_info >= (3, 11): + from typing import TypeVarTuple, Unpack +else: + from typing_extensions import TypeVarTuple, Unpack + +T_Retval = TypeVar("T_Retval") +PosArgsT = TypeVarTuple("PosArgsT") + + +async def run_sync( + func: Callable[[Unpack[PosArgsT]], T_Retval], + *args: Unpack[PosArgsT], + abandon_on_cancel: bool = False, + cancellable: bool | None = None, + limiter: CapacityLimiter | None = None, +) -> T_Retval: + """ + Call the given function with the given arguments in a worker thread. + + If the ``abandon_on_cancel`` option is enabled and the task waiting for its + completion is cancelled, the thread will still run its course but its + return value (or any raised exception) will be ignored. + + :param func: a callable + :param args: positional arguments for the callable + :param abandon_on_cancel: ``True`` to abandon the thread (leaving it to run + unchecked on own) if the host task is cancelled, ``False`` to ignore + cancellations in the host task until the operation has completed in the worker + thread + :param cancellable: deprecated alias of ``abandon_on_cancel``; will override + ``abandon_on_cancel`` if both parameters are passed + :param limiter: capacity limiter to use to limit the total amount of threads running + (if omitted, the default limiter is used) + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + :return: an awaitable that yields the return value of the function. + + """ + if cancellable is not None: + abandon_on_cancel = cancellable + warn( + "The `cancellable=` keyword argument to `anyio.to_thread.run_sync` is " + "deprecated since AnyIO 4.1.0; use `abandon_on_cancel=` instead", + DeprecationWarning, + stacklevel=2, + ) + + return await get_async_backend().run_sync_in_worker_thread( + func, args, abandon_on_cancel=abandon_on_cancel, limiter=limiter + ) + + +def current_default_thread_limiter() -> CapacityLimiter: + """ + Return the capacity limiter that is used by default to limit the number of + concurrent threads. + + :return: a capacity limiter object + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + return get_async_backend().current_default_thread_limiter() diff --git a/.venv/lib/python3.10/site-packages/beautifulsoup4-4.14.3.dist-info/INSTALLER b/.venv/lib/python3.10/site-packages/beautifulsoup4-4.14.3.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/.venv/lib/python3.10/site-packages/beautifulsoup4-4.14.3.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/.venv/lib/python3.10/site-packages/beautifulsoup4-4.14.3.dist-info/METADATA b/.venv/lib/python3.10/site-packages/beautifulsoup4-4.14.3.dist-info/METADATA new file mode 100644 index 0000000..7fd97b7 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/beautifulsoup4-4.14.3.dist-info/METADATA @@ -0,0 +1,123 @@ +Metadata-Version: 2.4 +Name: beautifulsoup4 +Version: 4.14.3 +Summary: Screen-scraping library +Project-URL: Download, https://www.crummy.com/software/BeautifulSoup/bs4/download/ +Project-URL: Homepage, https://www.crummy.com/software/BeautifulSoup/bs4/ +Author-email: Leonard Richardson +License: MIT License +License-File: AUTHORS +License-File: LICENSE +Keywords: HTML,XML,parse,soup +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Text Processing :: Markup :: HTML +Classifier: Topic :: Text Processing :: Markup :: SGML +Classifier: Topic :: Text Processing :: Markup :: XML +Requires-Python: >=3.7.0 +Requires-Dist: soupsieve>=1.6.1 +Requires-Dist: typing-extensions>=4.0.0 +Provides-Extra: cchardet +Requires-Dist: cchardet; extra == 'cchardet' +Provides-Extra: chardet +Requires-Dist: chardet; extra == 'chardet' +Provides-Extra: charset-normalizer +Requires-Dist: charset-normalizer; extra == 'charset-normalizer' +Provides-Extra: html5lib +Requires-Dist: html5lib; extra == 'html5lib' +Provides-Extra: lxml +Requires-Dist: lxml; extra == 'lxml' +Description-Content-Type: text/markdown + +Beautiful Soup is a library that makes it easy to scrape information +from web pages. It sits atop an HTML or XML parser, providing Pythonic +idioms for iterating, searching, and modifying the parse tree. + +# Quick start + +``` +>>> from bs4 import BeautifulSoup +>>> soup = BeautifulSoup("

SomebadHTML") +>>> print(soup.prettify()) + + +

+ Some + + bad + + HTML + + +

+ + +>>> soup.find(string="bad") +'bad' +>>> soup.i +HTML +# +>>> soup = BeautifulSoup("SomebadXML", "xml") +# +>>> print(soup.prettify()) + + + Some + + bad + + XML + + +``` + +To go beyond the basics, [comprehensive documentation is available](https://www.crummy.com/software/BeautifulSoup/bs4/doc/). + +# Links + +* [Homepage](https://www.crummy.com/software/BeautifulSoup/bs4/) +* [Documentation](https://www.crummy.com/software/BeautifulSoup/bs4/doc/) +* [Discussion group](https://groups.google.com/group/beautifulsoup/) +* [Development](https://code.launchpad.net/beautifulsoup/) +* [Bug tracker](https://bugs.launchpad.net/beautifulsoup/) +* [Complete changelog](https://git.launchpad.net/beautifulsoup/tree/CHANGELOG) + +# Note on Python 2 sunsetting + +Beautiful Soup's support for Python 2 was discontinued on December 31, +2020: one year after the sunset date for Python 2 itself. From this +point onward, new Beautiful Soup development will exclusively target +Python 3. The final release of Beautiful Soup 4 to support Python 2 +was 4.9.3. + +# Supporting the project + +If you use Beautiful Soup as part of your professional work, please consider a +[Tidelift subscription](https://tidelift.com/subscription/pkg/pypi-beautifulsoup4?utm_source=pypi-beautifulsoup4&utm_medium=referral&utm_campaign=readme). +This will support many of the free software projects your organization +depends on, not just Beautiful Soup. + +If you use Beautiful Soup for personal projects, the best way to say +thank you is to read +[Tool Safety](https://www.crummy.com/software/BeautifulSoup/zine/), a zine I +wrote about what Beautiful Soup has taught me about software +development. + +# Building the documentation + +The bs4/doc/ directory contains full documentation in Sphinx +format. Run `make html` in that directory to create HTML +documentation. + +# Running the unit tests + +Beautiful Soup supports unit test discovery using Pytest: + +``` +$ pytest +``` + diff --git a/.venv/lib/python3.10/site-packages/beautifulsoup4-4.14.3.dist-info/RECORD b/.venv/lib/python3.10/site-packages/beautifulsoup4-4.14.3.dist-info/RECORD new file mode 100644 index 0000000..febdfb4 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/beautifulsoup4-4.14.3.dist-info/RECORD @@ -0,0 +1,37 @@ +beautifulsoup4-4.14.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +beautifulsoup4-4.14.3.dist-info/METADATA,sha256=Ac93vA8Xp9FtgOcKXFM8ESfVdztimUfJ3WUpVlhKtsY,3812 +beautifulsoup4-4.14.3.dist-info/RECORD,, +beautifulsoup4-4.14.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87 +beautifulsoup4-4.14.3.dist-info/licenses/AUTHORS,sha256=uYkjiRjh_aweRnF8tAW2PpJJeickE68NmJwd9siry28,2201 +beautifulsoup4-4.14.3.dist-info/licenses/LICENSE,sha256=VbTY1LHlvIbRDvrJG3TIe8t3UmsPW57a-LnNKtxzl7I,1441 +bs4/__init__.py,sha256=E7wiVp7oQK0JhdAYxpehZa8drv3W_sJv5oeTFiBfR5o,44386 +bs4/__pycache__/__init__.cpython-310.pyc,, +bs4/__pycache__/_deprecation.cpython-310.pyc,, +bs4/__pycache__/_typing.cpython-310.pyc,, +bs4/__pycache__/_warnings.cpython-310.pyc,, +bs4/__pycache__/css.cpython-310.pyc,, +bs4/__pycache__/dammit.cpython-310.pyc,, +bs4/__pycache__/diagnose.cpython-310.pyc,, +bs4/__pycache__/element.cpython-310.pyc,, +bs4/__pycache__/exceptions.cpython-310.pyc,, +bs4/__pycache__/filter.cpython-310.pyc,, +bs4/__pycache__/formatter.cpython-310.pyc,, +bs4/_deprecation.py,sha256=niHJCk37APg8KEuFOa57ZXaxLdBmc_2V6uuaJqu7r30,2408 +bs4/_typing.py,sha256=zNcx7R1yCTK8WwtumP28hc7CJ3pMyZXj_VAeYaNXMZA,7549 +bs4/_warnings.py,sha256=ZuOETgcnEbZgw2N0nnNXn6wvtrn2ut7AF0d98bvkMFc,4711 +bs4/builder/__init__.py,sha256=Rl4qjOXvdyyyjayOFqbkgoUoo81IgoyKD-RwWeVK59g,31194 +bs4/builder/__pycache__/__init__.cpython-310.pyc,, +bs4/builder/__pycache__/_html5lib.cpython-310.pyc,, +bs4/builder/__pycache__/_htmlparser.cpython-310.pyc,, +bs4/builder/__pycache__/_lxml.cpython-310.pyc,, +bs4/builder/_html5lib.py,sha256=hL6xUk4_I2i5CMguFoYFlrI26cY4Dut7fOEQrUctHIM,23607 +bs4/builder/_htmlparser.py,sha256=CnULPQV2rm4vLojJABpQ7Xm9diddnEZx2Wcz_VTC1Mg,17445 +bs4/builder/_lxml.py,sha256=ks1e8boA_nOA2oomAhxeudccR6ThbEE-EllFqHRoPLA,18969 +bs4/css.py,sha256=_m_l_4SGWHnY620VJ21j_qQH1RX3p91sYVemgKxaLsM,12713 +bs4/dammit.py,sha256=ZJWa9K32X6N2imFHleqUq0ekf592weU1lvULN_WYWYk,57024 +bs4/diagnose.py,sha256=at98iuxyOrqec4V8iwkTIbNUqBCsq9Lr3fDAQx2129Y,7846 +bs4/element.py,sha256=oXmj7LG_2NpsDK90mq73q0PMK0FjFBIGSeTTJLVwwTc,120237 +bs4/exceptions.py,sha256=Q9FOadNe8QRvzDMaKSXe2Wtl8JK_oAZW7mbFZBVP_GE,951 +bs4/filter.py,sha256=rw8ZNhTDLEJVCEiSifou5tZR_3zBLeuvAyouY82qU_E,29201 +bs4/formatter.py,sha256=uBT0k6W8O5kJ9PCuJYjra97yoUqC-dlM9D_v-oRM0r8,10478 +bs4/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/.venv/lib/python3.10/site-packages/beautifulsoup4-4.14.3.dist-info/WHEEL b/.venv/lib/python3.10/site-packages/beautifulsoup4-4.14.3.dist-info/WHEEL new file mode 100644 index 0000000..12228d4 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/beautifulsoup4-4.14.3.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: hatchling 1.27.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/.venv/lib/python3.10/site-packages/beautifulsoup4-4.14.3.dist-info/licenses/AUTHORS b/.venv/lib/python3.10/site-packages/beautifulsoup4-4.14.3.dist-info/licenses/AUTHORS new file mode 100644 index 0000000..18926c2 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/beautifulsoup4-4.14.3.dist-info/licenses/AUTHORS @@ -0,0 +1,49 @@ +Behold, mortal, the origins of Beautiful Soup... +================================================ + +Leonard Richardson is the primary maintainer. + +Aaron DeVore, Isaac Muse and Chris Papademetrious have made +significant contributions to the code base. + +Mark Pilgrim provided the encoding detection code that forms the base +of UnicodeDammit. + +Thomas Kluyver and Ezio Melotti finished the work of getting Beautiful +Soup 4 working under Python 3. + +Simon Willison wrote soupselect, which was used to make Beautiful Soup +support CSS selectors. Isaac Muse wrote SoupSieve, which made it +possible to _remove_ the CSS selector code from Beautiful Soup. + +Sam Ruby helped with a lot of edge cases. + +Jonathan Ellis was awarded the prestigious Beau Potage D'Or for his +work in solving the nestable tags conundrum. + +An incomplete list of people have contributed patches to Beautiful +Soup: + + Istvan Albert, Andrew Lin, Anthony Baxter, Oliver Beattie, Andrew +Boyko, Tony Chang, Francisco Canas, "Delong", Zephyr Fang, Fuzzy, +Roman Gaufman, Yoni Gilad, Richie Hindle, Toshihiro Kamiya, Peteris +Krumins, Kent Johnson, Marek Kapolka, Andreas Kostyrka, Roel Kramer, +Ben Last, Robert Leftwich, Stefaan Lippens, "liquider", Staffan +Malmgren, Ksenia Marasanova, JP Moins, Adam Monsen, John Nagle, "Jon", +Ed Oskiewicz, Martijn Peters, Greg Phillips, Giles Radford, Stefano +Revera, Arthur Rudolph, Marko Samastur, James Salter, Jouni Seppänen, +Alexander Schmolck, Tim Shirley, Geoffrey Sneddon, Ville Skyttä, +"Vikas", Jens Svalgaard, Andy Theyers, Eric Weiser, Glyn Webster, John +Wiseman, Paul Wright, Danny Yoo + +An incomplete list of people who made suggestions or found bugs or +found ways to break Beautiful Soup: + + Hanno Böck, Matteo Bertini, Chris Curvey, Simon Cusack, Bruce Eckel, + Matt Ernst, Michael Foord, Tom Harris, Bill de hOra, Donald Howes, + Matt Patterson, Scott Roberts, Steve Strassmann, Mike Williams, + warchild at redho dot com, Sami Kuisma, Carlos Rocha, Bob Hutchison, + Joren Mc, Michal Migurski, John Kleven, Tim Heaney, Tripp Lilley, Ed + Summers, Dennis Sutch, Chris Smith, Aaron Swartz, Stuart + Turner, Greg Edwards, Kevin J Kalupson, Nikos Kouremenos, Artur de + Sousa Rocha, Yichun Wei, Per Vognsen diff --git a/.venv/lib/python3.10/site-packages/beautifulsoup4-4.14.3.dist-info/licenses/LICENSE b/.venv/lib/python3.10/site-packages/beautifulsoup4-4.14.3.dist-info/licenses/LICENSE new file mode 100644 index 0000000..08e3a9c --- /dev/null +++ b/.venv/lib/python3.10/site-packages/beautifulsoup4-4.14.3.dist-info/licenses/LICENSE @@ -0,0 +1,31 @@ +Beautiful Soup is made available under the MIT license: + + Copyright (c) Leonard Richardson + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. + +Beautiful Soup incorporates code from the html5lib library, which is +also made available under the MIT license. Copyright (c) James Graham +and other contributors + +Beautiful Soup has an optional dependency on the soupsieve library, +which is also made available under the MIT license. Copyright (c) +Isaac Muse diff --git a/.venv/lib/python3.10/site-packages/bs4/__init__.py b/.venv/lib/python3.10/site-packages/bs4/__init__.py new file mode 100644 index 0000000..19b7c0e --- /dev/null +++ b/.venv/lib/python3.10/site-packages/bs4/__init__.py @@ -0,0 +1,1174 @@ +"""Beautiful Soup Elixir and Tonic - "The Screen-Scraper's Friend". + +http://www.crummy.com/software/BeautifulSoup/ + +Beautiful Soup uses a pluggable XML or HTML parser to parse a +(possibly invalid) document into a tree representation. Beautiful Soup +provides methods and Pythonic idioms that make it easy to navigate, +search, and modify the parse tree. + +Beautiful Soup works with Python 3.7 and up. It works better if lxml +and/or html5lib is installed, but they are not required. + +For more than you ever wanted to know about Beautiful Soup, see the +documentation: http://www.crummy.com/software/BeautifulSoup/bs4/doc/ +""" + +__author__ = "Leonard Richardson (leonardr@segfault.org)" +__version__ = "4.14.3" +__copyright__ = "Copyright (c) 2004-2025 Leonard Richardson" +# Use of this source code is governed by the MIT license. +__license__ = "MIT" + +__all__ = [ + "AttributeResemblesVariableWarning", + "BeautifulSoup", + "Comment", + "Declaration", + "ProcessingInstruction", + "ResultSet", + "CSS", + "Script", + "Stylesheet", + "Tag", + "TemplateString", + "ElementFilter", + "UnicodeDammit", + "CData", + "Doctype", + + # Exceptions + "FeatureNotFound", + "ParserRejectedMarkup", + "StopParsing", + + # Warnings + "AttributeResemblesVariableWarning", + "GuessedAtParserWarning", + "MarkupResemblesLocatorWarning", + "UnusualUsageWarning", + "XMLParsedAsHTMLWarning", +] + +from collections import Counter +import io +import sys +import warnings + +# The very first thing we do is give a useful error if someone is +# running this code under Python 2. +if sys.version_info.major < 3: + raise ImportError( + "You are trying to use a Python 3-specific version of Beautiful Soup under Python 2. This will not work. The final version of Beautiful Soup to support Python 2 was 4.9.3." + ) + +from .builder import ( + builder_registry, + TreeBuilder, +) +from .builder._htmlparser import HTMLParserTreeBuilder +from .dammit import UnicodeDammit +from .css import CSS +from ._deprecation import ( + _deprecated, +) +from .element import ( + CData, + Comment, + DEFAULT_OUTPUT_ENCODING, + Declaration, + Doctype, + NavigableString, + PageElement, + ProcessingInstruction, + PYTHON_SPECIFIC_ENCODINGS, + ResultSet, + Script, + Stylesheet, + Tag, + TemplateString, +) +from .formatter import Formatter +from .filter import ( + ElementFilter, + SoupStrainer, +) +from typing import ( + Any, + cast, + Counter as CounterType, + Dict, + Iterator, + List, + Sequence, + Sized, + Optional, + Type, + Union, +) + +from bs4._typing import ( + _Encoding, + _Encodings, + _IncomingMarkup, + _InsertableElement, + _RawAttributeValue, + _RawAttributeValues, + _RawMarkup, +) + +# Import all warnings and exceptions into the main package. +from bs4.exceptions import ( + FeatureNotFound, + ParserRejectedMarkup, + StopParsing, +) +from bs4._warnings import ( + AttributeResemblesVariableWarning, + GuessedAtParserWarning, + MarkupResemblesLocatorWarning, + UnusualUsageWarning, + XMLParsedAsHTMLWarning, +) + + +class BeautifulSoup(Tag): + """A data structure representing a parsed HTML or XML document. + + Most of the methods you'll call on a BeautifulSoup object are inherited from + PageElement or Tag. + + Internally, this class defines the basic interface called by the + tree builders when converting an HTML/XML document into a data + structure. The interface abstracts away the differences between + parsers. To write a new tree builder, you'll need to understand + these methods as a whole. + + These methods will be called by the BeautifulSoup constructor: + * reset() + * feed(markup) + + The tree builder may call these methods from its feed() implementation: + * handle_starttag(name, attrs) # See note about return value + * handle_endtag(name) + * handle_data(data) # Appends to the current data node + * endData(containerClass) # Ends the current data node + + No matter how complicated the underlying parser is, you should be + able to build a tree using 'start tag' events, 'end tag' events, + 'data' events, and "done with data" events. + + If you encounter an empty-element tag (aka a self-closing tag, + like HTML's
tag), call handle_starttag and then + handle_endtag. + """ + + #: Since `BeautifulSoup` subclasses `Tag`, it's possible to treat it as + #: a `Tag` with a `Tag.name`. Hoever, this name makes it clear the + #: `BeautifulSoup` object isn't a real markup tag. + ROOT_TAG_NAME: str = "[document]" + + #: If the end-user gives no indication which tree builder they + #: want, look for one with these features. + DEFAULT_BUILDER_FEATURES: Sequence[str] = ["html", "fast"] + + #: A string containing all ASCII whitespace characters, used in + #: during parsing to detect data chunks that seem 'empty'. + ASCII_SPACES: str = "\x20\x0a\x09\x0c\x0d" + + # FUTURE PYTHON: + element_classes: Dict[Type[PageElement], Type[PageElement]] #: :meta private: + builder: TreeBuilder #: :meta private: + is_xml: bool + known_xml: Optional[bool] + parse_only: Optional[SoupStrainer] #: :meta private: + + # These members are only used while parsing markup. + markup: Optional[_RawMarkup] #: :meta private: + current_data: List[str] #: :meta private: + currentTag: Optional[Tag] #: :meta private: + tagStack: List[Tag] #: :meta private: + open_tag_counter: CounterType[str] #: :meta private: + preserve_whitespace_tag_stack: List[Tag] #: :meta private: + string_container_stack: List[Tag] #: :meta private: + _most_recent_element: Optional[PageElement] #: :meta private: + + #: Beautiful Soup's best guess as to the character encoding of the + #: original document. + original_encoding: Optional[_Encoding] + + #: The character encoding, if any, that was explicitly defined + #: in the original document. This may or may not match + #: `BeautifulSoup.original_encoding`. + declared_html_encoding: Optional[_Encoding] + + #: This is True if the markup that was parsed contains + #: U+FFFD REPLACEMENT_CHARACTER characters which were not present + #: in the original markup. These mark character sequences that + #: could not be represented in Unicode. + contains_replacement_characters: bool + + def __init__( + self, + markup: _IncomingMarkup = "", + features: Optional[Union[str, Sequence[str]]] = None, + builder: Optional[Union[TreeBuilder, Type[TreeBuilder]]] = None, + parse_only: Optional[SoupStrainer] = None, + from_encoding: Optional[_Encoding] = None, + exclude_encodings: Optional[_Encodings] = None, + element_classes: Optional[Dict[Type[PageElement], Type[PageElement]]] = None, + **kwargs: Any, + ): + """Constructor. + + :param markup: A string or a file-like object representing + markup to be parsed. + + :param features: Desirable features of the parser to be + used. This may be the name of a specific parser ("lxml", + "lxml-xml", "html.parser", or "html5lib") or it may be the + type of markup to be used ("html", "html5", "xml"). It's + recommended that you name a specific parser, so that + Beautiful Soup gives you the same results across platforms + and virtual environments. + + :param builder: A TreeBuilder subclass to instantiate (or + instance to use) instead of looking one up based on + `features`. You only need to use this if you've implemented a + custom TreeBuilder. + + :param parse_only: A SoupStrainer. Only parts of the document + matching the SoupStrainer will be considered. This is useful + when parsing part of a document that would otherwise be too + large to fit into memory. + + :param from_encoding: A string indicating the encoding of the + document to be parsed. Pass this in if Beautiful Soup is + guessing wrongly about the document's encoding. + + :param exclude_encodings: A list of strings indicating + encodings known to be wrong. Pass this in if you don't know + the document's encoding but you know Beautiful Soup's guess is + wrong. + + :param element_classes: A dictionary mapping BeautifulSoup + classes like Tag and NavigableString, to other classes you'd + like to be instantiated instead as the parse tree is + built. This is useful for subclassing Tag or NavigableString + to modify default behavior. + + :param kwargs: For backwards compatibility purposes, the + constructor accepts certain keyword arguments used in + Beautiful Soup 3. None of these arguments do anything in + Beautiful Soup 4; they will result in a warning and then be + ignored. + + Apart from this, any keyword arguments passed into the + BeautifulSoup constructor are propagated to the TreeBuilder + constructor. This makes it possible to configure a + TreeBuilder by passing in arguments, not just by saying which + one to use. + """ + if "convertEntities" in kwargs: + del kwargs["convertEntities"] + warnings.warn( + "BS4 does not respect the convertEntities argument to the " + "BeautifulSoup constructor. Entities are always converted " + "to Unicode characters." + ) + + if "markupMassage" in kwargs: + del kwargs["markupMassage"] + warnings.warn( + "BS4 does not respect the markupMassage argument to the " + "BeautifulSoup constructor. The tree builder is responsible " + "for any necessary markup massage." + ) + + if "smartQuotesTo" in kwargs: + del kwargs["smartQuotesTo"] + warnings.warn( + "BS4 does not respect the smartQuotesTo argument to the " + "BeautifulSoup constructor. Smart quotes are always converted " + "to Unicode characters." + ) + + if "selfClosingTags" in kwargs: + del kwargs["selfClosingTags"] + warnings.warn( + "Beautiful Soup 4 does not respect the selfClosingTags argument to the " + "BeautifulSoup constructor. The tree builder is responsible " + "for understanding self-closing tags." + ) + + if "isHTML" in kwargs: + del kwargs["isHTML"] + warnings.warn( + "Beautiful Soup 4 does not respect the isHTML argument to the " + "BeautifulSoup constructor. Suggest you use " + "features='lxml' for HTML and features='lxml-xml' for " + "XML." + ) + + def deprecated_argument(old_name: str, new_name: str) -> Optional[Any]: + if old_name in kwargs: + warnings.warn( + 'The "%s" argument to the BeautifulSoup constructor ' + 'was renamed to "%s" in Beautiful Soup 4.0.0' + % (old_name, new_name), + DeprecationWarning, + stacklevel=3, + ) + return kwargs.pop(old_name) + return None + + parse_only = parse_only or deprecated_argument("parseOnlyThese", "parse_only") + if parse_only is not None: + # Issue a warning if we can tell in advance that + # parse_only will exclude the entire tree. + if parse_only.excludes_everything: + warnings.warn( + f"The given value for parse_only will exclude everything: {parse_only}", + UserWarning, + stacklevel=3, + ) + + from_encoding = from_encoding or deprecated_argument( + "fromEncoding", "from_encoding" + ) + + if from_encoding and isinstance(markup, str): + warnings.warn( + "You provided Unicode markup but also provided a value for from_encoding. Your from_encoding will be ignored." + ) + from_encoding = None + + self.element_classes = element_classes or dict() + + # We need this information to track whether or not the builder + # was specified well enough that we can omit the 'you need to + # specify a parser' warning. + original_builder = builder + original_features = features + + builder_class: Optional[Type[TreeBuilder]] = None + if isinstance(builder, type): + # A builder class was passed in; it needs to be instantiated. + builder_class = builder + builder = None + elif builder is None: + if isinstance(features, str): + features = [features] + if features is None or len(features) == 0: + features = self.DEFAULT_BUILDER_FEATURES + possible_builder_class = builder_registry.lookup(*features) + if possible_builder_class is None: + raise FeatureNotFound( + "Couldn't find a tree builder with the features you " + "requested: %s. Do you need to install a parser library?" + % ",".join(features) + ) + builder_class = possible_builder_class + + # At this point either we have a TreeBuilder instance in + # builder, or we have a builder_class that we can instantiate + # with the remaining **kwargs. + if builder is None: + assert builder_class is not None + builder = builder_class(**kwargs) + if ( + not original_builder + and not ( + original_features == builder.NAME + or ( + isinstance(original_features, str) + and original_features in builder.ALTERNATE_NAMES + ) + ) + and markup + ): + # The user did not tell us which TreeBuilder to use, + # and we had to guess. Issue a warning. + if builder.is_xml: + markup_type = "XML" + else: + markup_type = "HTML" + + # This code adapted from warnings.py so that we get the same line + # of code as our warnings.warn() call gets, even if the answer is wrong + # (as it may be in a multithreading situation). + caller = None + try: + caller = sys._getframe(1) + except ValueError: + pass + if caller: + globals = caller.f_globals + line_number = caller.f_lineno + else: + globals = sys.__dict__ + line_number = 1 + filename = globals.get("__file__") + if filename: + fnl = filename.lower() + if fnl.endswith((".pyc", ".pyo")): + filename = filename[:-1] + if filename: + # If there is no filename at all, the user is most likely in a REPL, + # and the warning is not necessary. + values = dict( + filename=filename, + line_number=line_number, + parser=builder.NAME, + markup_type=markup_type, + ) + warnings.warn( + GuessedAtParserWarning.MESSAGE % values, + GuessedAtParserWarning, + stacklevel=2, + ) + else: + if kwargs: + warnings.warn( + "Keyword arguments to the BeautifulSoup constructor will be ignored. These would normally be passed into the TreeBuilder constructor, but a TreeBuilder instance was passed in as `builder`." + ) + + self.builder = builder + self.is_xml = builder.is_xml + self.known_xml = self.is_xml + self._namespaces = dict() + self.parse_only = parse_only + + if hasattr(markup, "read"): # It's a file-type object. + markup = cast(io.IOBase, markup).read() + elif not isinstance(markup, (bytes, str)) and not hasattr(markup, "__len__"): + raise TypeError( + f"Incoming markup is of an invalid type: {markup!r}. Markup must be a string, a bytestring, or an open filehandle." + ) + elif isinstance(markup, Sized) and len(markup) <= 256 and ( + (isinstance(markup, bytes) and b"<" not in markup and b"\n" not in markup) + or (isinstance(markup, str) and "<" not in markup and "\n" not in markup) + ): + # Issue warnings for a couple beginner problems + # involving passing non-markup to Beautiful Soup. + # Beautiful Soup will still parse the input as markup, + # since that is sometimes the intended behavior. + if not self._markup_is_url(markup): + self._markup_resembles_filename(markup) + + # At this point we know markup is a string or bytestring. If + # it was a file-type object, we've read from it. + markup = cast(_RawMarkup, markup) + + rejections = [] + success = False + for ( + self.markup, + self.original_encoding, + self.declared_html_encoding, + self.contains_replacement_characters, + ) in self.builder.prepare_markup( + markup, from_encoding, exclude_encodings=exclude_encodings + ): + self.reset() + self.builder.initialize_soup(self) + try: + self._feed() + success = True + break + except ParserRejectedMarkup as e: + rejections.append(e) + pass + + if not success: + other_exceptions = [str(e) for e in rejections] + raise ParserRejectedMarkup( + "The markup you provided was rejected by the parser. Trying a different parser or a different encoding may help.\n\nOriginal exception(s) from parser:\n " + + "\n ".join(other_exceptions) + ) + + # Clear out the markup and remove the builder's circular + # reference to this object. + self.markup = None + self.builder.soup = None + + def copy_self(self) -> "BeautifulSoup": + """Create a new BeautifulSoup object with the same TreeBuilder, + but not associated with any markup. + + This is the first step of the deepcopy process. + """ + clone = type(self)("", None, self.builder) + + # Keep track of the encoding of the original document, + # since we won't be parsing it again. + clone.original_encoding = self.original_encoding + return clone + + def __getstate__(self) -> Dict[str, Any]: + # Frequently a tree builder can't be pickled. + d = dict(self.__dict__) + if "builder" in d and d["builder"] is not None and not self.builder.picklable: + d["builder"] = type(self.builder) + # Store the contents as a Unicode string. + d["contents"] = [] + d["markup"] = self.decode() + + # If _most_recent_element is present, it's a Tag object left + # over from initial parse. It might not be picklable and we + # don't need it. + if "_most_recent_element" in d: + del d["_most_recent_element"] + return d + + def __setstate__(self, state: Dict[str, Any]) -> None: + # If necessary, restore the TreeBuilder by looking it up. + self.__dict__ = state + if isinstance(self.builder, type): + self.builder = self.builder() + elif not self.builder: + # We don't know which builder was used to build this + # parse tree, so use a default we know is always available. + self.builder = HTMLParserTreeBuilder() + self.builder.soup = self + self.reset() + self._feed() + + @classmethod + @_deprecated( + replaced_by="nothing (private method, will be removed)", version="4.13.0" + ) + def _decode_markup(cls, markup: _RawMarkup) -> str: + """Ensure `markup` is Unicode so it's safe to send into warnings.warn. + + warnings.warn had this problem back in 2010 but fortunately + not anymore. This has not been used for a long time; I just + noticed that fact while working on 4.13.0. + """ + if isinstance(markup, bytes): + decoded = markup.decode("utf-8", "replace") + else: + decoded = markup + return decoded + + @classmethod + def _markup_is_url(cls, markup: _RawMarkup) -> bool: + """Error-handling method to raise a warning if incoming markup looks + like a URL. + + :param markup: A string of markup. + :return: Whether or not the markup resembled a URL + closely enough to justify issuing a warning. + """ + problem: bool = False + if isinstance(markup, bytes): + problem = ( + any(markup.startswith(prefix) for prefix in (b"http:", b"https:")) + and b" " not in markup + ) + elif isinstance(markup, str): + problem = ( + any(markup.startswith(prefix) for prefix in ("http:", "https:")) + and " " not in markup + ) + else: + return False + + if not problem: + return False + warnings.warn( + MarkupResemblesLocatorWarning.URL_MESSAGE % dict(what="URL"), + MarkupResemblesLocatorWarning, + stacklevel=3, + ) + return True + + @classmethod + def _markup_resembles_filename(cls, markup: _RawMarkup) -> bool: + """Error-handling method to issue a warning if incoming markup + resembles a filename. + + :param markup: A string of markup. + :return: Whether or not the markup resembled a filename + closely enough to justify issuing a warning. + """ + markup_b: bytes + + # We're only checking ASCII characters, so rather than write + # the same tests twice, convert Unicode to a bytestring and + # operate on the bytestring. + if isinstance(markup, str): + markup_b = markup.encode("utf8") + else: + markup_b = markup + + # Step 1: does it end with a common textual file extension? + filelike = False + lower = markup_b.lower() + extensions = [b".html", b".htm", b".xml", b".xhtml", b".txt"] + if any(lower.endswith(ext) for ext in extensions): + filelike = True + if not filelike: + return False + + # Step 2: it _might_ be a file, but there are a few things + # we can look for that aren't very common in filenames. + + # Characters that have special meaning to Unix shells. (< was + # excluded before this method was called.) + # + # Many of these are also reserved characters that cannot + # appear in Windows filenames. + for byte in markup_b: + if byte in b"?*#&;>$|": + return False + + # Two consecutive forward slashes (as seen in a URL) or two + # consecutive spaces (as seen in fixed-width data). + # + # (Paths to Windows network shares contain consecutive + # backslashes, so checking that doesn't seem as helpful.) + if b"//" in markup_b: + return False + if b" " in markup_b: + return False + + # A colon in any position other than position 1 (e.g. after a + # Windows drive letter). + if markup_b.startswith(b":"): + return False + colon_i = markup_b.rfind(b":") + if colon_i not in (-1, 1): + return False + + # Step 3: If it survived all of those checks, it's similar + # enough to a file to justify issuing a warning. + warnings.warn( + MarkupResemblesLocatorWarning.FILENAME_MESSAGE % dict(what="filename"), + MarkupResemblesLocatorWarning, + stacklevel=3, + ) + return True + + def _feed(self) -> None: + """Internal method that parses previously set markup, creating a large + number of Tag and NavigableString objects. + """ + # Convert the document to Unicode. + self.builder.reset() + + if self.markup is not None: + self.builder.feed(self.markup) + # Close out any unfinished strings and close all the open tags. + self.endData() + while ( + self.currentTag is not None and self.currentTag.name != self.ROOT_TAG_NAME + ): + self.popTag() + + def reset(self) -> None: + """Reset this object to a state as though it had never parsed any + markup. + """ + Tag.__init__(self, self, self.builder, self.ROOT_TAG_NAME) + self.hidden = True + self.builder.reset() + self.current_data = [] + self.currentTag = None + self.tagStack = [] + self.open_tag_counter = Counter() + self.preserve_whitespace_tag_stack = [] + self.string_container_stack = [] + self._most_recent_element = None + self.pushTag(self) + + def new_tag( + self, + name: str, + namespace: Optional[str] = None, + nsprefix: Optional[str] = None, + attrs: Optional[_RawAttributeValues] = None, + sourceline: Optional[int] = None, + sourcepos: Optional[int] = None, + string: Optional[str] = None, + **kwattrs: _RawAttributeValue, + ) -> Tag: + """Create a new Tag associated with this BeautifulSoup object. + + :param name: The name of the new Tag. + :param namespace: The URI of the new Tag's XML namespace, if any. + :param prefix: The prefix for the new Tag's XML namespace, if any. + :param attrs: A dictionary of this Tag's attribute values; can + be used instead of ``kwattrs`` for attributes like 'class' + that are reserved words in Python. + :param sourceline: The line number where this tag was + (purportedly) found in its source document. + :param sourcepos: The character position within ``sourceline`` where this + tag was (purportedly) found. + :param string: String content for the new Tag, if any. + :param kwattrs: Keyword arguments for the new Tag's attribute values. + + """ + attr_container = self.builder.attribute_dict_class(**kwattrs) + if attrs is not None: + attr_container.update(attrs) + tag_class = self.element_classes.get(Tag, Tag) + + # Assume that this is either Tag or a subclass of Tag. If not, + # the user brought type-unsafety upon themselves. + tag_class = cast(Type[Tag], tag_class) + tag = tag_class( + None, + self.builder, + name, + namespace, + nsprefix, + attr_container, + sourceline=sourceline, + sourcepos=sourcepos, + ) + + if string is not None: + tag.string = string + return tag + + def string_container( + self, base_class: Optional[Type[NavigableString]] = None + ) -> Type[NavigableString]: + """Find the class that should be instantiated to hold a given kind of + string. + + This may be a built-in Beautiful Soup class or a custom class passed + in to the BeautifulSoup constructor. + """ + container = base_class or NavigableString + + # The user may want us to use some other class (hopefully a + # custom subclass) instead of the one we'd use normally. + container = cast( + Type[NavigableString], self.element_classes.get(container, container) + ) + + # On top of that, we may be inside a tag that needs a special + # container class. + if self.string_container_stack and container is NavigableString: + container = self.builder.string_containers.get( + self.string_container_stack[-1].name, container + ) + return container + + def new_string( + self, s: str, subclass: Optional[Type[NavigableString]] = None + ) -> NavigableString: + """Create a new `NavigableString` associated with this `BeautifulSoup` + object. + + :param s: The string content of the `NavigableString` + :param subclass: The subclass of `NavigableString`, if any, to + use. If a document is being processed, an appropriate + subclass for the current location in the document will + be determined automatically. + """ + container = self.string_container(subclass) + return container(s) + + def insert_before(self, *args: _InsertableElement) -> List[PageElement]: + """This method is part of the PageElement API, but `BeautifulSoup` doesn't implement + it because there is nothing before or after it in the parse tree. + """ + raise NotImplementedError( + "BeautifulSoup objects don't support insert_before()." + ) + + def insert_after(self, *args: _InsertableElement) -> List[PageElement]: + """This method is part of the PageElement API, but `BeautifulSoup` doesn't implement + it because there is nothing before or after it in the parse tree. + """ + raise NotImplementedError("BeautifulSoup objects don't support insert_after().") + + def popTag(self) -> Optional[Tag]: + """Internal method called by _popToTag when a tag is closed. + + :meta private: + """ + if not self.tagStack: + # Nothing to pop. This shouldn't happen. + return None + tag = self.tagStack.pop() + if tag.name in self.open_tag_counter: + self.open_tag_counter[tag.name] -= 1 + if ( + self.preserve_whitespace_tag_stack + and tag == self.preserve_whitespace_tag_stack[-1] + ): + self.preserve_whitespace_tag_stack.pop() + if self.string_container_stack and tag == self.string_container_stack[-1]: + self.string_container_stack.pop() + # print("Pop", tag.name) + if self.tagStack: + self.currentTag = self.tagStack[-1] + return self.currentTag + + def pushTag(self, tag: Tag) -> None: + """Internal method called by handle_starttag when a tag is opened. + + :meta private: + """ + # print("Push", tag.name) + if self.currentTag is not None: + self.currentTag.contents.append(tag) + self.tagStack.append(tag) + self.currentTag = self.tagStack[-1] + if tag.name != self.ROOT_TAG_NAME: + self.open_tag_counter[tag.name] += 1 + if tag.name in self.builder.preserve_whitespace_tags: + self.preserve_whitespace_tag_stack.append(tag) + if tag.name in self.builder.string_containers: + self.string_container_stack.append(tag) + + def endData(self, containerClass: Optional[Type[NavigableString]] = None) -> None: + """Method called by the TreeBuilder when the end of a data segment + occurs. + + :param containerClass: The class to use when incorporating the + data segment into the parse tree. + + :meta private: + """ + if self.current_data: + current_data = "".join(self.current_data) + # If whitespace is not preserved, and this string contains + # nothing but ASCII spaces, replace it with a single space + # or newline. + if not self.preserve_whitespace_tag_stack: + strippable = True + for i in current_data: + if i not in self.ASCII_SPACES: + strippable = False + break + if strippable: + if "\n" in current_data: + current_data = "\n" + else: + current_data = " " + + # Reset the data collector. + self.current_data = [] + + # Should we add this string to the tree at all? + if ( + self.parse_only + and len(self.tagStack) <= 1 + and (not self.parse_only.allow_string_creation(current_data)) + ): + return + + containerClass = self.string_container(containerClass) + o = containerClass(current_data) + self.object_was_parsed(o) + + def object_was_parsed( + self, + o: PageElement, + parent: Optional[Tag] = None, + most_recent_element: Optional[PageElement] = None, + ) -> None: + """Method called by the TreeBuilder to integrate an object into the + parse tree. + + :meta private: + """ + if parent is None: + parent = self.currentTag + assert parent is not None + previous_element: Optional[PageElement] + if most_recent_element is not None: + previous_element = most_recent_element + else: + previous_element = self._most_recent_element + + next_element = previous_sibling = next_sibling = None + if isinstance(o, Tag): + next_element = o.next_element + next_sibling = o.next_sibling + previous_sibling = o.previous_sibling + if previous_element is None: + previous_element = o.previous_element + + fix = parent.next_element is not None + + o.setup(parent, previous_element, next_element, previous_sibling, next_sibling) + + self._most_recent_element = o + parent.contents.append(o) + + # Check if we are inserting into an already parsed node. + if fix: + self._linkage_fixer(parent) + + def _linkage_fixer(self, el: Tag) -> None: + """Make sure linkage of this fragment is sound.""" + + first = el.contents[0] + child = el.contents[-1] + descendant: PageElement = child + + if child is first and el.parent is not None: + # Parent should be linked to first child + el.next_element = child + # We are no longer linked to whatever this element is + prev_el = child.previous_element + if prev_el is not None and prev_el is not el: + prev_el.next_element = None + # First child should be linked to the parent, and no previous siblings. + child.previous_element = el + child.previous_sibling = None + + # We have no sibling as we've been appended as the last. + child.next_sibling = None + + # This index is a tag, dig deeper for a "last descendant" + if isinstance(child, Tag) and child.contents: + # _last_decendant is typed as returning Optional[PageElement], + # but the value can't be None here, because el is a Tag + # which we know has contents. + descendant = cast(PageElement, child._last_descendant(False)) + + # As the final step, link last descendant. It should be linked + # to the parent's next sibling (if found), else walk up the chain + # and find a parent with a sibling. It should have no next sibling. + descendant.next_element = None + descendant.next_sibling = None + + target: Optional[Tag] = el + while True: + if target is None: + break + elif target.next_sibling is not None: + descendant.next_element = target.next_sibling + target.next_sibling.previous_element = child + break + target = target.parent + + def _popToTag( + self, name: str, nsprefix: Optional[str] = None, inclusivePop: bool = True + ) -> Optional[Tag]: + """Pops the tag stack up to and including the most recent + instance of the given tag. + + If there are no open tags with the given name, nothing will be + popped. + + :param name: Pop up to the most recent tag with this name. + :param nsprefix: The namespace prefix that goes with `name`. + :param inclusivePop: It this is false, pops the tag stack up + to but *not* including the most recent instqance of the + given tag. + + :meta private: + """ + # print("Popping to %s" % name) + if name == self.ROOT_TAG_NAME: + # The BeautifulSoup object itself can never be popped. + return None + + most_recently_popped = None + + stack_size = len(self.tagStack) + for i in range(stack_size - 1, 0, -1): + if not self.open_tag_counter.get(name): + break + t = self.tagStack[i] + if name == t.name and nsprefix == t.prefix: + if inclusivePop: + most_recently_popped = self.popTag() + break + most_recently_popped = self.popTag() + + return most_recently_popped + + def handle_starttag( + self, + name: str, + namespace: Optional[str], + nsprefix: Optional[str], + attrs: _RawAttributeValues, + sourceline: Optional[int] = None, + sourcepos: Optional[int] = None, + namespaces: Optional[Dict[str, str]] = None, + ) -> Optional[Tag]: + """Called by the tree builder when a new tag is encountered. + + :param name: Name of the tag. + :param nsprefix: Namespace prefix for the tag. + :param attrs: A dictionary of attribute values. Note that + attribute values are expected to be simple strings; processing + of multi-valued attributes such as "class" comes later. + :param sourceline: The line number where this tag was found in its + source document. + :param sourcepos: The character position within `sourceline` where this + tag was found. + :param namespaces: A dictionary of all namespace prefix mappings + currently in scope in the document. + + If this method returns None, the tag was rejected by an active + `ElementFilter`. You should proceed as if the tag had not occurred + in the document. For instance, if this was a self-closing tag, + don't call handle_endtag. + + :meta private: + """ + # print("Start tag %s: %s" % (name, attrs)) + self.endData() + + if ( + self.parse_only + and len(self.tagStack) <= 1 + and not self.parse_only.allow_tag_creation(nsprefix, name, attrs) + ): + return None + + tag_class = self.element_classes.get(Tag, Tag) + # Assume that this is either Tag or a subclass of Tag. If not, + # the user brought type-unsafety upon themselves. + tag_class = cast(Type[Tag], tag_class) + tag = tag_class( + self, + self.builder, + name, + namespace, + nsprefix, + attrs, + self.currentTag, + self._most_recent_element, + sourceline=sourceline, + sourcepos=sourcepos, + namespaces=namespaces, + ) + if tag is None: + return tag + if self._most_recent_element is not None: + self._most_recent_element.next_element = tag + self._most_recent_element = tag + self.pushTag(tag) + return tag + + def handle_endtag(self, name: str, nsprefix: Optional[str] = None) -> None: + """Called by the tree builder when an ending tag is encountered. + + :param name: Name of the tag. + :param nsprefix: Namespace prefix for the tag. + + :meta private: + """ + # print("End tag: " + name) + self.endData() + self._popToTag(name, nsprefix) + + def handle_data(self, data: str) -> None: + """Called by the tree builder when a chunk of textual data is + encountered. + + :meta private: + """ + self.current_data.append(data) + + def decode( + self, + indent_level: Optional[int] = None, + eventual_encoding: _Encoding = DEFAULT_OUTPUT_ENCODING, + formatter: Union[Formatter, str] = "minimal", + iterator: Optional[Iterator[PageElement]] = None, + **kwargs: Any, + ) -> str: + """Returns a string representation of the parse tree + as a full HTML or XML document. + + :param indent_level: Each line of the rendering will be + indented this many levels. (The ``formatter`` decides what a + 'level' means, in terms of spaces or other characters + output.) This is used internally in recursive calls while + pretty-printing. + :param eventual_encoding: The encoding of the final document. + If this is None, the document will be a Unicode string. + :param formatter: Either a `Formatter` object, or a string naming one of + the standard formatters. + :param iterator: The iterator to use when navigating over the + parse tree. This is only used by `Tag.decode_contents` and + you probably won't need to use it. + """ + if self.is_xml: + # Print the XML declaration + encoding_part = "" + declared_encoding: Optional[str] = eventual_encoding + if eventual_encoding in PYTHON_SPECIFIC_ENCODINGS: + # This is a special Python encoding; it can't actually + # go into an XML document because it means nothing + # outside of Python. + declared_encoding = None + if declared_encoding is not None: + encoding_part = ' encoding="%s"' % declared_encoding + prefix = '\n' % encoding_part + else: + prefix = "" + + # Prior to 4.13.0, the first argument to this method was a + # bool called pretty_print, which gave the method a different + # signature from its superclass implementation, Tag.decode. + # + # The signatures of the two methods now match, but just in + # case someone is still passing a boolean in as the first + # argument to this method (or a keyword argument with the old + # name), we can handle it and put out a DeprecationWarning. + warning: Optional[str] = None + pretty_print: Optional[bool] = None + if isinstance(indent_level, bool): + if indent_level is True: + indent_level = 0 + elif indent_level is False: + indent_level = None + warning = f"As of 4.13.0, the first argument to BeautifulSoup.decode has been changed from bool to int, to match Tag.decode. Pass in a value of {indent_level} instead." + else: + pretty_print = kwargs.pop("pretty_print", None) + assert not kwargs + if pretty_print is not None: + if pretty_print is True: + indent_level = 0 + elif pretty_print is False: + indent_level = None + warning = f"As of 4.13.0, the pretty_print argument to BeautifulSoup.decode has been removed, to match Tag.decode. Pass in a value of indent_level={indent_level} instead." + + if warning: + warnings.warn(warning, DeprecationWarning, stacklevel=2) + elif indent_level is False or pretty_print is False: + indent_level = None + return prefix + super(BeautifulSoup, self).decode( + indent_level, eventual_encoding, formatter, iterator + ) + + +# Aliases to make it easier to get started quickly, e.g. 'from bs4 import _soup' +_s = BeautifulSoup +_soup = BeautifulSoup + + +class BeautifulStoneSoup(BeautifulSoup): + """Deprecated interface to an XML parser.""" + + def __init__(self, *args: Any, **kwargs: Any): + kwargs["features"] = "xml" + warnings.warn( + "The BeautifulStoneSoup class was deprecated in version 4.0.0. Instead of using " + 'it, pass features="xml" into the BeautifulSoup constructor.', + DeprecationWarning, + stacklevel=2, + ) + super(BeautifulStoneSoup, self).__init__(*args, **kwargs) + + +# If this file is run as a script, act as an HTML pretty-printer. +if __name__ == "__main__": + import sys + + soup = BeautifulSoup(sys.stdin) + print((soup.prettify())) diff --git a/.venv/lib/python3.10/site-packages/bs4/__pycache__/__init__.cpython-310.pyc b/.venv/lib/python3.10/site-packages/bs4/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7854b4de51ec72fd24104c560335e30826a4f583 GIT binary patch literal 28551 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 Da&45l literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/bs4/__pycache__/_deprecation.cpython-310.pyc b/.venv/lib/python3.10/site-packages/bs4/__pycache__/_deprecation.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a62c8fd431617f92eb597db2bc8ed2d5880629f2 GIT binary patch literal 2748 zcma)8OK%iM5T5CI?0US$KnMW@PABBSCibp*D2WiVcpb>ai2@RmFU#z7&+eGn=}~u& z&03q2k??)O1%>*Y{P8#nMt>!5IGa zN77%gtUvK#e&E}iFx3+f%-XV;%}8o*+2)sQ5%_gdXW(wR18>W-E#`8cc`$wM$3CmE z`crqSHm_w1+~aP~=59>RT5+8PY!UX7$!^m}4d;iRJ846W+tcLM>#A-so$ctLyD{&U4kujop@zJ$znU|8o6Gd*e|j zcn);2Hk+h$Ze_!=ekV**On+GyDeGk609F~_tyZ-iNF3l7Ie2J1T=?~1qE2mq&_F$H z$K;vy%zj2<#1K#GW z4MA@6NUOFgy0LiDZUNU3IP9ncNd=J0F%_hyb1k z>#705bxzv^{`|iKZ;wtlbJj8YS~pS=g{j(Tna9%G3DbgaMtJAR!1WZRb$EDtlt%Wx zgE&b%zjxuGgz(>ljfBo>No=KZ5d}ssmq0XKc^ua#P@Du&*3>w$M4m$BSrqT0IE~^x z6lXwu0`o`~8eS8?n-D_c-AW(KK{G5JrRAYp!DE0zjEtemuJM4z%M-685*;fHp7>{M zci}ut`92=6fq126(Xgr64`Bfn3v`F+Xe;)omFY6?X#?vP66kN1ZYX=I^s(l8steK zafu|HFS4@UG2fg{$CO)>%t8QgKZf1%BNV1QrWIE<@T1!q_r<%gVO)A=#trD0w|8w0 znpx|abTB?s&6{dE<$@uD5UDD?T^Z)epbvqWU_J$3hh!ELki+OrsV+>d-@%YD=DJOx zJoi@qKNzrr(8G;qm;D?R72Q6=m2t2*XXZ9&4ZolVEJ*~r8I-k7hlvQ1c?r*8D=Yo# z--n9B=tW*YVH(CoT;b8mk;(5Y$@Lop!HSe`VDT%YziZVSb^ACu?UM`8>HnR~1_}N- GxBMS4o1*6c literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/bs4/__pycache__/_typing.cpython-310.pyc b/.venv/lib/python3.10/site-packages/bs4/__pycache__/_typing.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d4992deb68b97f641a5b02dc4f1da91d16bf9054 GIT binary patch literal 3062 zcmaJ@OLN;s5(YpJe2b(+Q4h-!{EAImBBj{QQ=3?^6~~)cRxCSJ3zrH4fsuqY9^4tw z5mmLP_|N39e`0^Y{(!meY0s(J!yeY#-QdegvS8s;_t)JsJv}oG#g$4?foJgVzx#i^ ztSJ9PW%@Bdc>u5Yho&em6;JWhKnYb#4K+&(Ggd}LP7CxfYh^>jGQymd3-eY!ELerG zXcfbfRSL^iIjmTfaK@TZ6;|Q*Atn=4!sCFSwPwRPYc6b9jd0$Y2OssZ;^|)Y zt>R^w_EY93)oQXCw!juyo-HgXfQw7YvA(2OODw~dJ!4x*?Z+B$mx#*&w_vT1oCmqU zR={?d^a9ydNiLGSMsf+{99v~;G>%DJnYcB!O57FVDim{-7t6JAct^p5udUf)> zPTVZTFR<&x-5_p`{I0PZ#C?L5+nwF`ix2T>QWLqKI2D?qOwu!quFJ zBz}$f4)C2JzeT(W{Fe10$yY$m!JckW++E_XVw`sk#<@rOb zoo>KnexJul?8bpCycqP@PT)JDRg{^XXdv?sogg4D{gLk`QhV}D=AR^t6PJ7H^m=}D zBJ^+v*mk~I$3^}`#B;4=z6ZV4>^x1d5 zNaWm}6Ee|rT;`3fvbyKI@lSA`0|CXSQWA=t+G~@1{nVXnDp8D>o={k|=xGw7@ zCi9b1#?AdfavDcBh1u=t@VNh%tp9`Y^9~bOaf&v!k(x z>9J!!VxHL@pd*cxoci3`=s7$YKmZ>GKy_b3{o3TxmWD`+n(4(t8Z7eYFK0=gN3ISv z8$Bqi@IHk17gRjuK>1nS`&nt}QWq>Z=1pMv0>UD~$_W1R$IfXSvJUe)P#dg?=!kyz zI6mvN->~RSC-A$S9#!LRduy{J{DeW?l&9!)#l4Q54Dfuldjm+AIov(H2ZIaf&x)>{ zU-|w0Xs6yTW6j|EuW@l{{tDeiFHH2!(y>@Ynqwr1#wU zaVQt;T`+oh;fiBX$eKOAqx&4r+?lLQn3vDLll6%@>IzFR&l|{`dE?lTX%=T3-*xH) z=i5W$D{2+5pdRbyIB?P!4%f|J2OrA0Uz37Yp&qc@_a}n2yiW+Ziowq~+-4W<^;8$4 z%mkmsab{sT0+xdo)JfdaultdUy^uFBrfx%XdXJYY_Fg~jscBz(-`cQ$ zi>=yUIRg8j<44qan-_>tK8qLl@j@Z{N%+W{CL0bp@vKjIrpd_pDQfH}S{W(~t(4bs zxh4BqG_Fk@%KS7I$rM$YP*9gNW@*A*==kT&ag%>FHSi%Ez3=;s4^pc*pP9J9sE4v( zA3)myQJgPNOcw?}#6^MI1zPO2K9}{h?bz%rVG*`@!LjA=3@bJ)O;kI|%Ct*bR6ap@XoAu!Zm;!d(RHr2IaB)VpyU@Q+ac7y;WI{}kaf zgwGMS5&nSi1;UpI4-j?`zCyq+1b>9Ei|{qVV}##mSu($!HpDNmBa0sZn$^v$UNKdz zIIEiVhF&&mnX*yNG~idxYew;1BiGOyMni9wn$_iOGrOXLp4IfCT7Cz1z_QWE)Qp;n KzcT!4>i+;?QcOGm literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/bs4/__pycache__/_warnings.cpython-310.pyc b/.venv/lib/python3.10/site-packages/bs4/__pycache__/_warnings.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a5d574da2723e7567bea113377d4b3398a8355b2 GIT binary patch literal 5310 zcmb_g&u=416?SYV_Bb;;VRsoM1gMCJ5=$Nj1YA}-s|gThBW1#9lG$By=`DAcog&>` z-m2<&JlEySk^f=;1-NnNAMlkkr?~c+%k>tz`4G*1h}cd%sdcoh#u?rbJvgZ!$5F zHrM&c^<%8Q^l6~=7}w`Nz)jW8*I--y1#CNSB=z&AT2~uM<6T&Vxz}e8o)pSCl^pnI z(mG{74D-JF!`X$Z77^OHLM38yp>pvHB@3^IMS5zAvAB>Rk;^e+ImbZRE}RJ&+x1#v=^D2vj494ExjxA1g^Z0S86d&I_-Bl z6g6JiQ!LomNwB8`42&nMQo_^D9(_f5kqwmX;`xw0Hq`7V`pRVnCt>>tvGT&|By_?g z<$OJO5TU1_$t2NUn;ct_c2v+l#O_c@Us&ZHU3cg%VTOh*gJ~)1v)0qY)6;_|hbN!4 zX6+~XKZ;}y|4TB4 z``7XQ1^BeDl6|1_cPjR7-xY(QdAZ-eLMZlAJ=h;l{e{VY+W*Oq_nr3Y;aJ9(a-`h; z!2N7LnsabGwROzf#P#_GZk<|lZL7)8VltGA;Ka??=i;+Dh zPb~39ryg{np*m0Wl}?BoTJd5;#l#RzQ;nU>amHQ=4pD$x@{pB_ z+`{5T!=weN3?8kriHEL;P>725PNnc5*tu*Q6pwsl6_J#5@ub_dlt3)O#kT0yrrR8z z;n!Vy_6BbEaXG?QyVhRgC;tU3g8gIa_8x8(uvY25YJR77-r_v4jy$lz?KZbtXtx2w zJG1XUWtn`goXVh^?%2cl z5GF}5G=+_oNW*%RJfwK>{FrnTiYxsEX@?}3D4qw9OSHQz)5M=aluqY;Gf`K{LPdip zPb8!W!&p5-8cn2^Yz$J^c&u_xV`NHY$<7`jqU(AD#T*GMu!j=f$Ur zNI1(lgA!W{VM(Vw#sueuh0~C>3ad@w_$6TfJ!R~C^z<0%5i&#+&r}HrDn)L@Yz`B0;zSLw<_KXi1xO9ylpi{D}~cVUV&37I?>&p4xCQcfhn++C|aK>_6*=f$D&F+h&h5j2uk%Jh&zeuPE) z;x{=6Li^wX;CfGhQwn6hW%W{U8P@~h4e74AvF-kB6I0K>E{5AtT1u{<7UgN>vi@xA*GI>PCkIatt0 zbfW``{TAJDKv|tUC~YMdO{okE0>g{@~{?9kQu+%5Uwe)GA^%$20 z6zHJv!vhaoq0&|JobZ9Pnu_WV!s2i zJWmu*N5VR)6O2t$fSUVo$ucJ~&%%;-Ra(~i&aad>-SM@QK6f);&AU#ly(s^Q{ zDTPsWPS%%cYqMUf?d%z=M;hgG7e@q23Rs6r!E2*=$5dZX2M9!#ffSWTXiX{%clK~Z zGiCDW;smvmY&^8;s?OuGdiFr2aYmh$=p}wjFMfT@e*w-886SB zh!=CEN|JMYGobMnWs=xK78**FYX~mYBtQe`+7%zsiY4Ix1i&AmIA7F$2o~}nrVq>s ziMw33T8=nDY{EH@kC(vT0sflEXb6L;gdve*xo2-)-_s&o-h(!Df|(eLj6x@PSWqSF z%iK&bBS<>8ht@64VG4ljTyUVKXA$IrjXMNWDjUfS7~8{f9>tu)S$H{h-zW%n)0bJg z%eexKQb}Oo{EU66rZ5+zQAmGCsr{LMW(`oMI%aWALXdb*u17_`a!~Y=fQGRxGP;Az=8e5xNn{WQ; H?Qj1F?2nI0 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/bs4/__pycache__/css.cpython-310.pyc b/.venv/lib/python3.10/site-packages/bs4/__pycache__/css.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4fa9396a947a73ee0b2301b38f8ab01340676375 GIT binary patch literal 12492 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/bs4/__pycache__/dammit.cpython-310.pyc b/.venv/lib/python3.10/site-packages/bs4/__pycache__/dammit.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..89121638e329dd328cc3c1219f56db0d66382a65 GIT binary patch literal 35455 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 KLvNlw@_zte?-hdp literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/bs4/__pycache__/diagnose.cpython-310.pyc b/.venv/lib/python3.10/site-packages/bs4/__pycache__/diagnose.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9ed0b0746e05903d216982d018fa74fa6d5fdeed GIT binary patch literal 8593 zcmb_hTaOz@cJ3RSO%6Htkw&sDwJ);7mBjHi>u424cY9)Kq)7CQ*$v&(Rh;3d*-ce9 zXNC8ewwtIn;y3d-f8f?w~yziR#SF-7@LdKmu|@Nf}V_)}F;K2VraSD0E?nZ|Ta zt82I$p58XQ=i@FGzacE4C-<6S8i3rFOYqZco-H z+f((a_H=!^JyV})&(>#Eh0lsVME`;}*PgG>XFM0`3!v%Vq52_tKU_a7?~C{W7`<(_Sbvcp=P$7%=M{Fe{<5q;hx+U61^x;v@#9T{9b?DA?F4&cjP@dX z3A9()o9vZQyA$kH&`z?qQW_*N*eO;4?G$@k(oSdNo9qlb3wnirhgI)s;@|mm{OHE% zoin@20~NEO-<4P8_u@ae+H%(XAdFhB-R$~q)C&CYjNNuxzSpyxfv~$Fx3|{0Z?mA~ zuh|iI*X^*|=>#IGCi>0g+9O)?m5Q3=FZUuIF5g16_+IVijoXe0xu|GK`7(F9QLEYY z?grgXGSO&kauH&rMgwi9SGz5banTTbtrbS1S1}X)lHW_Td)gi$gFUi%q z9gipF+9$WKHLkpO?aKShEAN8IRAbq9gEl0*>4g@NAJ`uc{ssfZU< z#V_4o?5jKZzP5`Q1_z_BrTy>Ev0Pt8t2*9W%%u160?RYYE3}IPXg^vPSaD|}Dn;eK zu`&4oJkq`&DSp{dqN&~|szQIXoS+r_MDf)vg_R`VUR(yZvNt`*;r(Pkw{fud_Ne#N zUhin8udwL{n)tl0?9A>e14Vw}xq%5TGkr6afXxo_aWR_fD}9sAeW493Hb2Nit~tmx z-~0K9^TM!4w6Jq%7qX@@_VeNw;CE>BR_R+ihf_TS{V>UM{~;^iRVs_|zl>>P*lk5z zYG5l2JSQUM!wR!?gT}GwK^gj?Wyy?4TQUx>4FaJ~<|? z==wg12=PYR4q+h0i7=kI-HX=oCR2NmD*D$G>rvaQLUtHQV$s9fUTZZmyzRCZe{b3L z0~jR@PhW8&v|AyO?3NE?Cu=cVa@uQjF1~&C|M^#0Omb3>go)Wo^spBu`AiK&o=8^a{z9=x zk8oD)V3Q}N)9G-Z$+Z*<^v2kL15Wg|(*c`EB&8c4-@MWI@YQP>G z!j{`ewKPl&-)ZwCpNTBxN(VDDJl74aIleEt5?I?Qs3vn81B26v-y zDeSH`gYBj2Cigd&p!Z81X(De{Uw>^Wgyo;@Ks0BKhfAyBTT7W~@@l7-Si=V!tiw8r zk~yhbnxz);H&pGLqOPf?YJ8)8W*J3QQ%mYGt%Oqh#=;v*oz0$#x`lov>VvlyF4^k0 zhEDgQX8cOL0rs`TAVp5hds~iJ3th6O;m<;aR`z{dVT^(yzwwl|I?z?6uk9e;V8*UC zFe1ILLAzz_DEo%E>E;kf~Wn+Wa9 zC06ZEz|M7inMy=72+W%ChzrDPnOs0pA^W3|bX#GEyR9a2lFZc;yVgO^3S*WYi`<$$ zv?9p{E(@(wcNT@*Yd#}VWZ?i`i8w-Qea>EP+BMPTlnTjMveoiDa({9rGS5K+KnTip zQo2YPAttq&_I1Y#(LZYhTg}?Q>!hrZS!IDpx@a*E^-1!AyRd%&rRzq`cPg5A6J+r= zig@A#QnM3pQ4y|GN@Ko3?*yHs*a~HE@LeumB3>p(PK3;g5*?uvr2xwksi_{NXFYP( z5+mZT>2)?LD+fIwuiCK|8wITh=$9N7YK9ou& zjm)wL^Rm@N7^S!fvWsiqk3_tPEBr4MT){3u!45&K>rCSY*${Hw95azq=L>oLQh2 zxXJU};HV!_n%WWNh=L5fAX{6=*-OZPi&@)pMmO0cn*yCO`XS#LHVeKb$uk{kj?IHo z9-}OY|OjU;L)rm@y5``jtHR=Td>3QH&=B&C!hG6fT+VwWLEZ?UH^$gIU>JRDR* zt30#&ZYfxZ3E{#A&=taugoJWPTmVoyQxz-HCdQOu1bHErvg;lb4rbkpS@F z5bS60_I(Yd_74VS^-@TEu?9&fR+r$0K9yHC!)%dvSH}82+eEUqYh%ij0%K0$+gL z!bo~;B{q>rU0b;--b0IuJ|_4dfpAdf@^J2a28ll>&NT0{YJBWz5+kcYQ|WCUTl=AS zg5qff!sH>$)l0QYQkpNdR2s@m4hk}n2|~MoKcn|IQN+(bO$ciC?9q!D{mOfn?%cU{ zeV+iNJqHDt%mi@P9U*x0FGeyPf0_(g%V&#Gk}FbMu6;5TMBILY1k{@l>9dfweD?TK6|P;m@$|t* zI>24;uSX+4T?f$Y*~3m@@;_L4f92LkD`&5M>+q$nf6ouL{00N#pN__V;jy_NZ})5g zauDG5^3%V%kS%+s^|zxjk3Kf$sL_{dtumKbjRvLijYd*zG}-~{!v8grQloLd>v-9l ze4_zx-)P8WLi#a5fS(}0EGAGS#%d6FVws+AP;rZjKc?ai6?dtqQSkv4A5yXB^JI+@ z2XP5SfGhkC3QIB6*}RrFexqsHZ)bJwe>6k;jg~9^deNHI_x^`;*>4}JL#~Is9C^5q z(y2&!pb&DiqxMrDry`7K@mKqkfDjx^n7*z@nFu>2A7~rUG&Rz9jK03Beiv(Y-|W*`8S(jdxzB|IEXc710(H=~ zw*tY=daZjLxD4%MhS`0aM@VKwYZI-{$%#&sN2C)nzpmtx92l%|u}Y**Q6RIG923)B z4*<3xPBVIUnck_bM13sB%?TR(=Xf6ywrJ#Nr-;3#HjQ1R@IZP*pTBQDuqoS{58C82 z6>%3k!-q-)y`))rpzfw$d-3tF4dF+T$n)Rri^aPKho=dk+ zREV>yJy1UcWOpA6gGtv#8_gb3PQHQ%`YN%G0-F;|7q*wkzqIOWVuN1n8MM^4!ud6< z*LFu-_&2Dw(_QXT&e6#%*_0lI4nz}%r){{BFhvw>xy?K-yK8r1V; z(4d&utmm+qHvsD9(q!p=5iN3P@g~uuoa~DY3e6-XQ}TTt@2?!-fbIQ|g9Lp|0*ns> z);&xaZYjQcM`|R%cbdmk?|tlMHysavmE3BMQt-@AJg)YYe4+v+Vy#W&$sNa+E0w6L zi5a@0)rpc^U!h6(JPIpk zNO%S?4~)&iUXp5)s`lBeDt?Ftk9PiC-EVlLz;wx#$0-oO=X)T(CLtGC0lk@jbF!ph%we(-N?EPwi4OdDFFA^jxEnkcpaPO0nO#8=&1!fIgd=*_Nh-NHB!`4ENB}G1uc&Id zw^N~!a?mmBc4Bt0&yT_+cURtuAx>2qDQO}F`U5#oTb!sNT-qs zTBhMK18G`fM!gPlJwc&7MKtARg!Uonj-)*5*T|Ym`TvF*Q1&9epyDAF(lDQ+8ZD{# zJ{1?KxJ1QER8U%+=7>{`h6CUYt3+qx_>@(=N_3<_X=Ws-C9QXAEHssZ%z+jI$x?d! zvX{-snoO0f^XbOx0wR+VUO-_ghE4|(bQm#>(pHTE>M+OQzoECaIZ}z{qS1&lat7{Wng9P^ym5|ohq-a4CDqXt8%LfGwen%tVo+T7a8y4uVYm0NPRRBp}PTDdKETjloL?Ug%ncU11o-C4OScUNU+ZfE80+})L3 zxm}fea`#kr=XO`_&D~qsliP#uZ#J`P#rlZ3M*psl%oyt1b}B89TRMtvMgf-LKZ7{JLEc^{Bc^ZG1AGdq7>CJD@foH;Xq| zZWGGALdtDM&MRjl>Y8^%&qi|(s%uf|x?Pd`BkFp!<;jTJVjesj%Z=lHs~W=nklY`_ z{S9gx?zfqT@cc0Dx2s{?51Z@EgX<&6dlm9V)DGnBFbB;6bAY`;{t@KgsBS|3P395Y zPvHJ$bqnrqk^4#9->PoI{cTeBL%6?P-GTc%%!g6_5!~OYR^WbxdC+|1Y&`cUa_&+) zk+ai$6eS+R{oQI8?su7w;Xa4^d(>{+@0R<=aeuGcgZn+^<9PmR+>fgJaDSgXKZ^S? zwHNn$<^DCe->3HDe!tx3aeu#h0QV2b_oi@vK)nL@uaNr!?q8`M#QlSEKaKl?Y8?0D za$m&#A$1t{hvi=3{#EJ-?vJ29v7BjcQWNGQYVv6#H-l#nsfY3GVT|kypkptE2I~#&oGYi!sYthf}cK808RVmc#rsecLFnRF7)@|m|z#ZDKX|!Iq zO4AE<^N4AimFco+KU}a%1tcCRSk+Q>c4(Co8?7!nsj))2%zP)lw^XbcN3TMT^g*r=2m?sv@YSDC3hvwPfLfPp$EbXj1u?e&8 z^iDo@cwc_(fqi4IJTQL0lbBqX=LaVj=S`=JS2WH^JXFQIPP|yaH&V5erd6&L)R5uC zC(QDU)6H_D93>2A?|o)rpWdQ#(>8wbZmqiC9bczE?~mjmYrIe~hx#!&qxFL|yMCx@x^+3dt*ptyth2s# zJ6WO$Q}QO3*`k9UkGQ|PB$7Q1_OD1d1rN}TpN9FRe%)Rh?2F6 z+15|?g4q}i+gZ`}(AorazyuW zk4+vkv#+fpc_v%%#xZ-UU}sy%lPy)VfDjwgn7wu6j*%NjvIl0ei?xMp)ihPMRNtPh z6powBv9h&O)oiggzc>Ow={_4oim!zxmXii z`{`&st_&4>Iu?!86KBDvn~}Fiegw37B2rJPM7`_nhDsvO_>uV8=lG#wF3su{NS@W5Qbr|;- zUa{jCU}lG@cFbF~IkQ-|ci0QlGquw@Moya5lRL_#=^gWnfQITVBRAc+!^U(CW4ex` z3VX-2ed`WWBIs#;)&#AsTlstrmD`k?Qqfd&U9{gAj9N$d!Nfv+X82BL?cRO+ zM<04{GJoiy$-@s#=J$<{9oh?W1Q?ju=JZ!<)zD-QWt@0PRSQnMGF=2AubCAmIbSGO zY8a^bh3X=(*K`J~!m0d1wZxmeX%`EiXx$4{WzLkUAn|?SM-3JqcJqdH@rGB%yYB^f z0p;9V$GvqcZ}fqlKJL>FK~kuW2< zsEXtaNRLrSiiR0iF-R@^jk~{zU6Jl&cT)AJjOteDClk4ZN`lk%I;+MBFT|l1@oD_r zXjZ^TvIDTT)f|}}$<~3>TTWNXJIjUY>=vT0e|OJjv$}c9P&$i$n1bT5tOep-nFe~x zYksX+u+Ev%>Fid%x@9O^s4BkzGNoo+P5oG*o;_t+W_AGtGFz`@iUn8)0rU+KlJ%Hm*K zECcu5Dyh04ttV6p!=84o^QoFJ@JCAZV`Ik(mTlI95=7xoqLIjGHCupCVHJw?Y_VLh z?JP)gm7JYW4icIzWQ%wg&rK@}IZ3#F)}A+urJ0hc1RhIOyQEA&be4i$c4}%@1$1rq z)Ks=!m>o$=8GKplH|?x>8iJVAZ5Dtp^JSo7)?Pre``*gapc>ebY&+U`)7~108%PkOmM!4MCS|vRwMZDLv)82xWMay!qB#t^;8B$E zCuN+kSrl4*5CP&Wus8<>{8LM{AaE$*!B)}lx$YOMfyl6GyjDNpea%$Dwx5BRZ9~kq zYG`x-@rZNIs#g7e-+u!SY<4#pZ`>6IiDi&wq(d#^Lvj7ZJ*Y|3TBcmeVU?IW$IEeE z%DgP_BJ`kj5z0`(gP+Bpox(*ZLtmd^F}H}n&_ACOQULWRg7CpUmkz|$3e``}CtR-= zG-0K)epw_aG)M=svs!i1_&@9-KQT)Hh`?HC!)!o80PAF~eav&Q{t?1#8!iC$ZBPML zT`5?{fgLWv5JCeCzGpLJo;x>#er#tcsn~DCvbdf-RVtT3CW?^Hvb8Gy1ifq|rbSS5 zn*>Rlb@&hn=q&@XUE-$sEhw3XCfOQFTX+R|4^8eLzH>X+uq|y0(>eWp0yP1hp8&sW zRRbbZHw%ibnwnz&rlwqctzsGlX#?y!h?X%t=bVp`3y}ADEEud8vUt-V>z#l&Jw6oE z^$7oAwa>(?8T?rCiCL!Fz>Xz9hCiF=o{0$$-Lx#Ec%0OlU{!)_BS%SlxC0sIMJNkQaDr~A7s<`(f6`bXNo2SD~5r!7QS0A8@*41_5q%_#*K zH6vppH&9mKSeD7$J;C)@t*oV7nJHVSh^G|WT3(ikI950bY5)U434BCPtDW7dWdd8I z3J{wuB0y{zg0@`8?c4%BQ~+O{T__hUsfOR)o`vN|l<6WM3`4KQni9%F;-067gESde zP1+lrn1*@b?_iKLyp$V$QPjW}U%P%u}yFPc(`(zI$R}-n8^6 zc$1{?0Az|RJTz4hDhjh(G!9$9$x4q-38HX?FSwA+ zItV%d4^WduJp{xD5$`w%y6;ZxxVdQULDQXtyedW*L2@TP4!%{4;hFc3Y4#VtQF{*( zO+!T&B34p?_QNJ))T3t&D^u-}v{8@E7`R_sk2j68QIvpH=3J6I;=BP%FR5>=@p&lW z6vX@<>Mm@DkY?MZ>GEP03QuWfk(~pk0LanPd1P}|WlBkU*)ydoE#?*R7y9R+ zmGydL18G(ga6?#Acr%Fo{{_VH5YR3xYTVo6H_HQ|0*obvY^8J>W=$>mnWr_uFM7(W zKm<%M)T)5TBO@bQwAyxG!7de{wk=Y&fHZjdfD8C>X`JX^po--Z%(m^b&3bDKv&S?k zfZ3631Bx~URSQN=m)u%ZZL@?-U``7=DYd{JL|juf)2?o*3npl4a&gdEo|GueF-Zwb zyS*R}H1YP(>T?f_XfWP-gk>XA(K<=W6*T&uF{*t{kQJBQ#OnzmH$(NLOK!SAZc;wE z5vif^>X%4vd<+(55~8Hr{bxhQei(JStv8`R)>FJp@gkNT8d|Jx=VcEs-@yy9#(J6; z!H_WeZUA_TfSrn`;uM9`5SCKWB+N{y*g&*#)e?*d;<5D>R{Pz&NVRfl;UO(oEBFCQ z+LXiAq%G!k#KS!#_q*}bV{h8fX~xebXylwro;Pw`DrTm{+__Q=obg<@8c?fL9~L+h zxwPsBu^)umx180Y@GimTm#X%8W)hhSpHjaVwQr}MMNj!VR~x=N6Ne(E)}g;82l`;Vt7Hr8+5`kLn5 zL$9`PAXNhgxo2qW=c8E7G0tIyM~uK)!-PCB5wT9880@*rer;!r7;#U>i$2bIc%#qWPM09Bj+F!o{v5iS&J1rnCm~wB3Ncj%z_tT zVcPmZ+(RX8nbkO-PM2k#vLGJiIHv}3`l5~9%g<&9?RR8XxdxVN?;dfhqA86Zv);+cd_y`+EfJ-I%u}07zgMzMyd#M4p zqjAq_u)f#w(!^z`r<2;|7#5rWC?CUq>qHLk-s#rq!p^)hhcW)^u|{W=3to3fpG* zp7bJpjp~(jpZc`=JMsHTNDylbu+%U3N`SU>f9PLZLY?5*Q$R~yVN~s**bH*+6|u^wqS$$th!H) zA@>UP&+2n(zq%jqU8(*>J)jOC_p0t!sL!h}h(}E#w-N1yFO9r;wfdquq9#x#i`1lg z2&qlxW<4hAU)8^<*QorH34Hk)H}^L6CH0(|_HzA_UsfjbP;R}NQL|F}wO&mqbxi%c z`iiQks?>I!SDQTfpXz_9dGCp?(S752WidZ@9cr~zU247Ft5w>!piWASTf7>jeW$!! zT^mY%S)FEHZVPH!R1K+Vt5=izwXdkxs;1O7)^AZy zNUb*@{jEs99y7De`+~Ifta?&v-|p2eZGD56t813FzL9yk?WpNZ>M5yd*sIC?@>kTi zsc)CsM!eeO3ETP|-V#a!tFw$)6Z7i)WsIRIYQ9p`ux8vE5sdG~94!5Rb>TBxj>b!afp5KY* z?^Hi7&+kI|Cy-`6JAr%OP(P`DN^tLPx%+ALjNI)~FQ}hW?*c~L)BW>r!MZ#CqUt^B z7g67CGmSe#{gV1+DSNMb|6cVga=*vD|5f!qxgT}!e@*?m+~4Qk|AzWaxgT@ye@p$g z-0yYopH;sj_xs%Y_p1-c{eHQRsozx}lKcDJ=f9_ZU+y13>*DGU)Q8df1L)PK)JN1u z<;g3|SE`R;91LmyAF4l++y{~S$A0dgs6Un5gUJ0eKlkJ6&n0&pxu5WJ|3ZCIat|Tb z@pJ!D{SV1KOtorj0tDabISgMA*Rx44y+GLuFTrA|(1Pb1?1!?>2fM{AtfH>xh?p)R z9>_9^tO2@0_f(q?6IM^AV9UafSuc)cMMcI6iD#$85{zpFp9-{SY9zZ~47pH*;dEfb zU<2#s7QV;DMp*G=-4g4&aCp+Hsfh8~p(q=w%D2Sw^(xm6btUL;kxP-`(o&6Hs`1(Y zlQ5jv*wdCl7b<%7IK`sSr(gq;_o=&c&^BX1fPLrkE|TpdUIr*(jSbdT8%r_uQzjO4#MI(}G%WL4 z8HDJo*W27DwhP;oiFabW3l%~GMtx^?QsV&9T1W=Kx-WHjr)@g)+uqkvBmHbjm5Qlo zv4^R1+Jrq!KuGw&4n4*F8$74ykZ}UTqx0%3r@fd7d=NyxpcJv z{n$be+zy3mch@3qDih*p=cyFZYu|@p`QCMI1pDlLk0#=2y@=+v*0KE0ny!;d|&+zgyxHu_SySGtDRD!mWEToHvRZ=Gb<#}QLbris_N15dMq>+Xr zPVkzFrJ<-AFJM&^&oa^Y3yqZlLOCKeI8j>^6{j2U0$mLAaAAW_Q`$Xqj}~M2nD>v` zH}3_fN09Jr`&=dUOmKETv^1>mo`>13Nv$0E+8H=mQD1Ak52P9&6-?91q^@Cofh;4C z?Kf^I@WR$U8uB0E=)0)qzs559Tj-#>p1xhvR`-igR{6=+y1VuxC|HV)K6+$;%>L9u zvlE+LH~Q@i_(k$ai3cWJLw&apl$FW-ZzyZMn=d453w8Lxv>6(lUR_UKx9Q!S-3*GS zl48n(ISw|L`D)02QnnB(B!mZ-d{doH`?($6%5Mj)Rx(_ofrfRU9j_TV)Bc zU=Nq4fD5s@)gWDEd^q$)j3;{AR@Y1at|zcz-+@(|$36yla$?aM3x(EVV9a56 zS*6D%?}I+ZWvDBFC|&uIEy76;u^@G1-~9(BCXYO3(TD(I=x&Da@a4VCjbbx|_q8^B zvEG9Mzey|^L?Yc6k0xVqNsPwfPniO?q@s$QB{^e#OF;l=WWRK~M=nU2v)iG9fU^qHPt(2HC)L(jh^X$6Y5y zwgev3Gc%=P2~+AVmS=4&1Hm5xc*Lm!!-hz_n6)6#lmQ8Ri~q)*q@Lydn8Tkk^_jB-K}!)#3+eUcL@R;5%jmQG~in8sDXX>?)8=^+oF&=To|#I4wcaHF%r z*Op$Wp)ta&8FY;2uC%3DnR zAag&&OSt`XuvMlx&+QKR{B!IGh2CVeu`bksK%pfN$j^^aO6CyI!dZ%(2i=4d<5Qzp zNtj=x{8PvV>XVtPRYmH<6E;8!V%o6R36SK^j1(e^Tk>|XxPY1quCtPM^c1UaOUi0Z zFbu1|&(1%~OWO!w1A^}TSG?Y*OI1e{{Ur``{@8*ipM{QbXqo2-FmCc_80VU4{{1J}fM>`B;1{=@Ht|VZ8 z!yC+GR~sk=3WY$4a2La0k)U)X65lGoM05Gx$kD_ZER;M9Fh2oD3;es(B$p6y@)BSK4 zhD(g?#uI%hFpw7-R|a}I(q3GzU3A+fu%iG#41h9sSSX>}e_jB|!fgVr-Odr@9>=OUZ~3CM zKbo$j?KM6yQ?A(T_iJZ%LOTX{D~_G321oH<=};SScPBT9O3B1T01)B>$nhT>#KT)iW)@$A|v?bZ77Y zU%Ud{CWk60%~rup6>2WKUJ_)-V6XTyPZv$ulL`8QT##m=XQB6}O}OBd1TnO=s92zP zF~(FJmozQ_Q$S$a`W32%G-qsYpPU4a2-^Js?OA~I(KxBicN-@_XUR7 zHPGgWqTZGiw%0R;Ne2peN}*UpWwyb4sx3Y4d%$k)%ybR3Xg0h@(dZHDZJ0NUGGJ(G z35H~;w{U7VAVHRTG)3U%lq^Jqp&AN7)@gz=7Ark;_?%g98CW{q1J*TX~Jla5E!iix}LPiZvB>%=Znd^|Cs4d1R zU?<#2V6ckfUIg!tJ%XAvpACU4n1kLorp231Fg`UEXa)C!)I`$u@C8CA?8^{?gw6Ok z1G-HGFi7Av;L6+BwU(V;)a}t&2%`nazd*i71Fl^IO95UJy`7h2rx1>0fRfMv&8qSw z(a&?x3`}nuHIB0f_j7tk+tNv~LiGnhlm#sMc?VV)AhI0|4LG6OAMn4x4Rvawl!vH%#PfQTxQycPO&!}I&x{g%`N~7V31M$216kHOMiQ zQbQULY^z7i1@1!Fahb$?D6P%oe-Dtb-h~UoHDEtR9Xhg&B?5(A2o{B8>pU-FKNm~- z&+wL(bkABu0Cdvws>sN?Y#5lW&!Et&2+OqZq`OlfEwB?M(#d2rEf(|vAvxHMYorZ4 zbFZ+Tw;3T^k{DtT1aBY2AH@x6%6Vv6O#~iLG=LM(qt*@ZMU}fb7{vJ;?(R{zx*OKj z3T5(1NKH`yDNLmRD}xM%@7WoDp(Rt|`ns@&UPb!}-^T4tbBOqX-*7u$l%_D_|2SX^vlr zAM!@ZS%P??~%~DazJBpnA|6Cd%R@e0&Le0+fu> zz-=bjdYvf3S=!PT(l7A2c>WR%tRKh4rOi$hPFk``w=myMp1b|ee=FgdtSr^T4P9iN zZ~(?t?=A0tzOgz;wf*-doj%y>+?CE!1A!BI3Pma|LV-f|l@JkU$cJXsqQ{~pop6FAv2E^XL$xlMtw}_y?lk z&z1*cL3XEEB#0+iX8`ghxYZj=xDfO(iEv#v%kwg^Go@KN+Y8XbmjLt_BvQ6QQKj_f zT0n1?CIhns#Jzyqx zKNaXU3=G`OOA&Vp8|dkxK@g^S5qCDCQE={qqe1qF$Vsqs)vEXUvpsJ89PuupS6zkE z$U2`OC-Kr_Hy4n$zRJs&d1>P_&moUi8+!nWz5&QgMn7<||AmY}+zgwS+WDQcN^*Si zJ|j5SsDh0f;#o;y{$pXj&5OlNK*GFf8 zyVO08u0Ip6BN|3M4jdk8!gpVInQ<;Dx+nBb=#~cdOC*}{^CB;w*eDCT$-=|nP6rVI zNMo+M16D)+R(nW*-1k;sToKSBY{&;_d7=$qI{;auuzQgNxB`!BJCd!7%og8(Ah?WZ zB?NHLLP3EkRI6oWz7}ehTPFo<*eI9xr0}WF7t-nIvhftYp?lhiQ6KQM@^kPIeJ+E8TNpZa%iYxX4 z>2g9-T+-;;0U@yfnMa=K*7D(}*o431MetFiLE)$r9GxWOF$jy+KjJ2+lWOf24&OR> zS5E-eERi?`Z=YqgqLTN9n*FQ9U=C5Thha{rj*_pYV_aPv1Wt!n<3sO;#@xk8jh9cM z!k2=V3Q7-f6S5+3bJLjwa5EvexviOK!_6eHRpTc14Is`<41cfziB20+U3UP(Ph=&= zO{#F{#o#J-G+z``Ctn(t0_00ARDB6pDqcxTYWcs1q&HmzNu{lqkE7N%2%X%za&cVz zG=SB50mZ`hBNr&;qn*%@_M?tysE5?WLa~NvyBPEpY)940w>0}`6ie1-X294jE`dAU zKA3bwvP`f|e@Yyq;U}5#aSS}t!?F#)G~iii{WSQx7MSnG`%Z$pxaWztIgMdGQjAnup2xDUwMhRd>zv3mH87BFO%e$whi-Zuyg2qYW1 za7Cx#z`#JFJ$m6j*F(sUwg`z1?m_--+loW*kqh8Qmo$}QC*wvFDRl$`0UZ^HxY zPFzAx$mGI!O`x+4k)Cl0S{p{M;aAr3(gC-vRd}$`Yh64Y76!tdyW>T)#ahP?wkZ_+ z)(!ZUwH}EJx4U@j#s36ic8U;+>|pHDqf17E`hwubmqbvEm)5AdkUKyI#DoZrO*Lsnd=1qD6yEVxp7rcUs_V`<$Tu4 zqW)>`LrZG%ShTeg#fGAV&*5i3QJNgBSjJ`%nA+UtYO@J!N`b}(5L~lnA0d~bdiJ8M z`I~~v{?|1#_CurnhhxH1ZCrTj;@JFB5eN%_1DJ8Rtz*uG`R3ipwmZSF08^R3G|0DB z@GT;T>tZR7mv9!8?1&?sc-tlvevU=yC}3 z!vyP%e4)P$L2Zi&22O-+l*a;yYhOs*LZ|5^>;a`a;%)~C-4)_Juj>!65yIQT+f<0f zUYVEkIg2anAN4-6q^5Sh_GOfo9VXL=U=B$HD@pCDp}WWl{uah(Vk*ax*zBXP)=|R+ zTe5CPE%m=JS}U|#%Y2a-{c;(c7QP@G`oPzbzY(ZDL7)=;mf^G?b~juKz%5}E%OOZ7 z+}w)7pJ(O5+?I-b!PdR(4?XXFXh}`&yloL$+{;A`G~Gvy<&dHSH~cS@co``1pOne1 z^tgk!;oR=1zY&=da6-_GP9#xiYCf{^G1wpZTp)W1n^+EgJMp*Gqy|3u@Z{v}Y=iK* zO#!uNq+{8a^Lc9+ZN1(5*piys`Q4XL`iOQt5WHJXm0J#3FJGC1v9*kinC>!@~8BhJQHq z!C}al!7elvhv`2?(?7P7B&^j~4oK)oD)4ho78q}DzpEtqc0)`MHURjZJON|}&Uotr zL0!q0A-$Eo|6jQX++B8NA943{(-a#VJG~Ge+=9JypCm91&URQ^G;R;#;Xii#?K+@Lj_*jurk@t^FekuHMk;}dr3Bvc8WF4EZ z>aq2_A&p|FS8;={_RsV-xUv5f4#X>^$d~77m1$k)0GB7`Sh^4Iivq@%FC} z5BdSA$yFId@QJ^`7(PZc^+MPOhCuHjoyMcXf&%bpK_x&+DnV{m$Q2DwWf6Rgt}SE% z#0c5ubnhfcP6(QDR15=GNMLcgB!al0_gw7LXIC&3lopaebFjxuZ@G9DmA3T^XE$QO z;Lp%CS;1uX?n|5*YCra^LzeJF}q7j7-Npy>ylNYES?2j$0#q9B$1@wmeG$Yov=PAf$gplf6;8KA z)Rt}StNlm|0pfeqx(SsPNm;#r91Kscw#QM4?7xawt3gk@5Skr5#SVAIfQs?_O@(a% z&7_Jy9mAOp2`RCa`Sti*g6D4X6sV_-HQW~CmBN`AJU9CcI$rO_sHWhOd^xS|7@Ui`L{{l`zkj|Nx6fm9!TDwv{-P?q5V4QQW}1lg8aZDIZjsz%dnR4)X?8c$ zr1z}9o#)rw~KxmDV+ z8nCgVai^XMh)q12H;X_W*kmI##9zUug%z;Qt@SNAYh>Js(|MgRxaO!QbKEy zmVLEd?uvgq?Eg6mUI~n}`H>Bg#!vu;M>NcXod;YZ{Y~eV;y1*>V9<%pBj(Wq%s9Xc z1c`{npj7YgIQQ~6X$kWr>c4e83$dY2hNtJj+YX^dOv}29D7uIF2?=_K zO}O(o3q-RHVHeYU^NTDYu1@rh8tUulY$!ZsA1iG6C-J*D@l{;r7NWZUjf8anmSdw7^um*dXroF7wj9E6dy)- zzlS?d1>}^Ll_jv@L(aVl%#*Jd%JFtB4Q3qihq&?6dW`*RgX3$Ew>L0PIG^+)^W^E; zp{}3?f1a$z*_CKx+ePNa)wR63FbUSH*)lfea)#e~@erDAy#_B`Z1BCpp%!-My=OSY!(Mi;HPnV~<6U3^(bXcS8Xs5}z0S_h#R4&pa1CtS23G>9OOCydq zA^R>eAs#$yKG+GOT(g`%RcvU-soLO!{*oq6`PdR~Tpt)31lB~D1>j$6)xc}eB`56- zohR)@V~p3ompG$9Fxg(+X-;p%P|XAotm~3<+7VvBy{lvG0-_9?sUDd!JQGap>pn?qnSW$8Tm} z?t$Vzi=KMHKV~>cJP)OvpOTY3&2gc?0=Wn0N^zSGBBX_NNN|<=(ls_UH8O&5^{ z=clX*)EwBfFJjV?W~1BEY_UE(6K(YEgyN6r7*^>d!r$z~=a-eP#1Hv?Pd|G*(MSvm zA(tqMiGCRo6)xTctArNetJiRjo@LL&f{!!E8Yi@qqF?bj|Kq`79qClmA`iU0HZ036 z{Z)Lw0YBk4pd-Kc%ULATm-qE$3HmyZMYoT_&-jhFHV6XC6}Lz+F0U=i(v}sPzWM$8 zZ+;W52sJ?nk6#K#ApRT5=q;~5!D$wg)euuZ#fzkbIZI09U`dVg=^Jsu_E!n2wuc$- z=H(Z7k>||A26hJ4wSL9V?MCVuLzj4p>FEAvlGX?L{C9cz5HEb7i)4}ViZhK5egr?d z#7CL>1775VA4AG3%QQ?`f69k@cxij<&zKi%rtB_cgtgXp(fH3Z;|qSSq_`mtkN$?a zU-BPik@7w+BV$ZXqOr1bU%DgP_gfv~IHH!e&wib`F-}Xmwb{@T3tV>;-{W>d8F;-% z=vLlJFK%#O)CYLFFS8x`Wl71)vh6R;x>_%9RdJrohdS z9os7=1Q{+dA$%LlwKao#s92@+VLVjrvOT$sYPlWiV$GA@T}C|{I10yDS*l}S+j=82 z630~Pj$}H%a~YqNQE?GQfF`4Dvwa-FWyieJl*!vsF}x1-U*gqP!^G^fpM76;;%-7y zJlJQ+A-B1T>9{5QUTPR+o2A67Ivo(E12~sii1LE<^St~rFYm#{f!$mOyphn&7LCHz z@9^>gUVfjK|Been_cA!A^p@bYiGe1@0j zd0`9;>ubEkS-6Xrt9dKi0ax>uJ9ezAdCBs!nU_txT+7RKywKm%8sdcxW7alaw(~+q z7i$MEvd(@JQ#bQ+J1=+e!qpY)ZeDiraxX9U@xmPy;;^j+gQL6^W}RnBSZ0B#8+jpj z5jJC)Oo_Q*mZ>B=Gso0%Udp^wc&YNzV)>GK6$_uog;KhmhUChF*fPC1{?nk4#{V*~ z$a&kGG8fV}r+bYn5m0Xp{)}|2FBy+zUNE{dQ6s}rnXkpyW9PMzS&P4P`bJ|No?gk- z*mOL7g|W$qu~gsJaA=d4>e26I1`R{!Nr?+aPw1|fxl-~%ChL{#RF5$zYrpZ(+soEv zWTkX0_)e!_rxzd}L%vUoTF#d=(X2cP3ENQIof8N;J z7d2A&i{mft{`TNEfxnFVi~CF$=Prd(;lF{Xz(o^j-TpMJJgM8r5eDoSt%TOH>g%4w_DvTv1EA6UM80|dvE~W26crT8kJGE z;t;&6anxP{hwJsI+tp@ujXdcy`{q`tJJfaFy~>#Vb1P>I9F=#2+J^E2D1VpQu7;)j zDme^&5Q@@H>n=3C@t)D_VZ{65)@<3&taWHCTtM#9TebB{r4Hz+b!T{1R9h->R&-(% zXS7|Y9@wvH9Y zYgJ@L{$fd{j-x|ys!{Yjq9j(kyt{hrJWl73n1?tA^;|-S@uAjPAjKQ=4&JDmr?PE3 z&;t6o4BtX^zEnKUGoYZUwUwokj~Q@7U?JrOccL-ES5P_9?)YFU#@>DVM<04{GJoiy z$-@s#=J$<{9ol;0L>P1Z6f6LW}iiH%d<2sLfoc=gr`JctS6+Zu12uwAj=;F;P*7`6h?u-a>1u-y-e{K*1{{RNYw$ylw zuhX9ZH*QSryMcI^O9_XD(Aii*YXy8jO$c}-3!QDw zsvu{sqjNB!g7xrUFaAHK z{YgyYMo;1lrcmO2K=&)gRbyYr#YiK=Y$NBB0j!^b23Hoa=@>_gFxWo=K*N|xpxW}<8_#S(aCKNm z5t@&{gk8OzsEm8`R2TgUl8IoTj8(Xiyz4cwZjPvpxypWwBcmxL!ZaI~F z9#V6i51!=Z&Aj*nZJos|eTGv_IW27rMEj$SD>{y_u4`E`BVYXK;1xug11W<7WrBrL>lnH zCE2xLjL@*<%f}u)EYJD_)EcEfM&9Q<7>su}*0hh1?gdt=5p=RrC~GUlR=l-@&k^c` ztT956UN6<$4eP@2+e26@LCFAnh($l8Ghd8y4 z9rGK3SNQJ{)DQ6d~Kkq$`LiO_qc~t8^8ZyI3_pnNI0g? zqxldF5D~P57(F6$sG4b$trx9=-I6t6Q?6z$00raXWGki9Lg=vo0ZbD1)&`f}(Fr^K zws0;UKP@d3usAL92Jp~}nt3#^EE6&i`&EoDk0-Pg&~Hj_ix_NcjeJ#10wJs*E%x~Y z73DfC>ZH3^LpX96+ZO43-Ki=a&sR<{l_NG7)F=qOotxhn8f~wQ=M8ZtL94ZUYeB~; zdM0WeM0;Rq5c(;05FrXJ%D}t~dMvCm<=PF!WVjPgtdHRml59w3W6UJuIf(?8Qg|#V zBgNu8g*k}1a3!MyS4?7D!afeCG33F0>ngbP8i=-hr2=eL5fZ#45^{kXlW1+9r*Z z-v@oqH_Hbrfqn2SIRsIoHN&1U9)x}+^T3Y>!JJ98TJ^{z?8Bw-HW~i-;}JZb!2BG0e7{;3Dq?>Il6q!z~9G$ssW9jiFrK z;iQ&O6&F3VMSSp8HRQP=Lb4m&7j5IQR}_XpS@om|N5Y-%rQeQmaoU43vl#8Z z0OWJl9~?a}o*z3jKDlpvGLMt{psVF4A3MBn!a74PB#O~TP}2G|F3^;O5J(1*91MRk zFJkl?c*j6Ha7jDKlPB6(mDmUeNhq#GNjQ)V!r=T#~G!a%aKbs zSn&L;CCtmCpwE$lQm!~JKF|f4{4|<}256eW`gsHo{GoxeWJ;|=vH}n+ybDi#;SJIV z2k@!exK&2m+HB08CazW7S?MCNux|yZ$%Z+9jEqiugW-Ip+uFz@2*0vub=lZhr%Fyh`k7zGmz|D*J`hn$rQ zP?u>9%)kYj_P_+}fplB%a|R%Ecrve=5Yt!V{g8ay=-!k_e;~Vaun~9`0vw$M`JbW{ zMP_mT zo~M=DP))*20w$zj*L87ymWpm1&Qb*d?mVL2C<0D`U(h4Uxc~%GP3C~}-?;TAOr$6L z3ejodt)MJ1{wN6{{vxSNhQ@=dmm<$dNcD18wxzybz}ISE0k z#;ZUO#`Y51Y|I}e&Rxgq^?7^ejvdN8IdbZjk(xET<5;~?zHJ9#dicSy9rhw*mD3~4 zyr!stn#1n9_U@_tNTYk#rpKkq$1OBXcf1ihdUUr?-*H6ryo}-LG%`Pc5vXEhL^hC- zLF|5uxyz1=_5FB?-mX6EpRISGb(~&f<7jr`ei#j4g@C0?&feiZ3Ri|3xnS(Nx7CLW zQMU)y52Dfl@o&xD+wfokEwtXs61=-)%hthY(YbL4MsaQ_O&XnB*P5tPr%rhjHF;#m zk$q#srz_xbAJe=;r@_g=CmKa4k;eouIJ$)0q%G`#U0Y&g$0rclMR z4O>mUJeYD%L`2g`D`gCp)O3+fyJa;r#&>NR9&Yu$5gQ)9Waobr-977fo_Ck*e9vAJ zHhFCP0SYztdou@rH!rg_1{Y~LX1ZLP9aeSKVcM)8K|?eSEf0Y|hBDvoH=TD&n(j*% z`VBW7S#^B%}~I% z(hNhuu(6^nd7qHkXdM(u=BPh1yko~Bw~X!Bv3GKB_EACHn?`Qhv18x(7QdIS4b>la zms{)JLI8O2A0?XsmkDFTY4-OfHe`oR4#N@xBMH%}P#ytdw3-B#eh#zftaA?w_D^CL zAODiF=}v?B*WNqlQPg?|FG8+;nvJkTHA}W%d9QsRphxUr1HFxPdo?hQv=<729K?OG zhK*5Xe-Jm#=zL6qHXvLBEL|J8dA*5^lQ`cYjxCVPTZcTP-Mlz#UpoI<VShD1)u|05ORJIqzG*5k-JBe;Jso6ws+#!k2bWYh<#AAG+_s17q3E*V&sJ3H_7F zPCPa-x$mId$*kaXpH34d+GlvytaoB2-^qz0hSLH8Zwve(Cc!u4OgL{0MwSDPMtaw# zy@$qVB*}_w)-ZObHFfoT*7l%kOW>x!lmL&UMtMuvyS$RD2QGshq#mb77IO6*SU-*$ zrDN@~Vyo{y*vjX>n*-2~+9?c)qe>t2%ass{*tjKxA9*4yT4&gxn3JBUFG8t1W}5ZJ zKX+0LadaobOcS@E-VnybSmADjC}gL0*{ooA{!I45c`J2o)^to`la7j||42JLH{$TR% zl7qRLgLznX4&Y>zlI@P^TVK+c&VRGVbUrkumjI=oL4W_+?>+C9^qxY`9tu2Fq{60$ zZn&Xd>_7E2^>x?%Fs?SiopCeNh->iMh2Io@yWQV3ey_!S4}J&nyUP7tjo$&>Ux(l8 z@w)}TTk$)D-z)KZh5LLBe%IlCEq*uPcm1x2nS>+bX0`2X4C>4`)C=lnbqgIQ-x5_3 zx<%4;(oEwn3b)8RL=oySGjM<0cGi&GyVOp}?Uho7x?Am%dvTpaiI}?A&*?W;9y4+S zYLB^UZg7V0$JIWyAKzPTrp?t*tJWYdpp>$k~jiD^*R+qx>~U52zE$Li$>yS3w|OK>9kQ2h}Nc z8tLn$%%W-_y#?vj>Wq3F(p!;^s&7$GAU%Zi8ufa07U>(1UaOu|Z$NsRxn1B!U*Cu) z9EbJl&FZ_J#1e3B*nj>Ol;iUa_`5=VulKye+gGX|;M3eNN?xVjrhW+D89{oZ`eF4W zNbivJkE$O-`bMO$R_D}tq;E2Bibrxc=Wa1?Rfc+pdgn|WPqXT0)z6`}+mwO)cOV)Y zb2q7Xt6xCw?e|C2d((7LNdN_tRsy|a7muLI@XKz9NP58T6eZqU@&5--nE$WkelG|tQSC0Bi^*=Cb_xtaY zinO5Muhd^l{SWxh!%*-y-gEC8fw!+zf6J%22k@OwsZR_3A3*x=kmfgEA=o^q{$71X zFzc1>{XeLGl=}zW`+riOmHUJK4Bo0fr~U;skK=0}L$7Yb-|gxP>Wj!bByZiJ{!M*J z-a3piea^+=LG@+z?~?l}iW} z%j&(Wtl8ZVjTI6ogD#)`W;=7kCCEF!2?zMF z9g+z4p6bwBzMPglScAu8ZAMz+s!fna7K(^0=EwMfKL@JjqHxu9f1@_{al6c7vLxoe=2w&>NP`%DD-Da|aD=}_+tz|t|4H)I9@HG#t(^{};8i3E_e z*yMg|TC4xs6clPPBsDft%oDU!u%O7Y8c-;FxOH?kig7-Jy<#bQzEH$TY?F|PA3AbC z3&((P6veR6Ozs!*qN9bX&}(n{eVuL@$S$`IA_)(80}#nt3BiR1mySofwI&3B>rGnK6_K*6`T6CD`iHAi~kX??)s)+wdBjsSiHz)e4!uepO$JO(2e zHxgu#B}PV}icr9CVzu8C5SZ4t{r01atu}-@0V0Isb@Sr3;{{G>A1c0WAFC|@FIw~5 zLQbq<0zP)3)Q;UF9A!B;+#SczyTNz-wz==_-n9c|cZVCt1-m>$YUO>ny%iQ zWC0hRNz!KjL(s^Cen@j!X=tq}Y$pB+n#-W-M+CZyduY35HIgO9dg zdmgPv+s29gf+4tdo8$2)za{QqdS_3U2rpheTr##{bHb>4O(OB-HkJi(7vgpmS`Pf$ zI<_$2!Q)vKxln-?3e&^axc&pWC!yfHDz*e5Q?I;xZKoTMHvQpzOuEbx`CU(P8wA_( zn-fIh5zo00`=2nnq$GkCKn*sA%Z+S52KLVRPD3Xa@F$8IPjm4UW6dSC+zKTTEVIf#~Vk3 zlZb*f(`)i%tH1u6ga9~PV0b`%!9F1607qN{%X|&v!pXpJ`V7`xbS36j{f>BZDu^Ed zAMT3+@dM%mn>E{`B@62>HUC`>u?PV)XTttoh8R-g4kjrvjs-4?5!QvZ{<*LrihtDU za{29r)qaV9lyFopa};Q}q^>T}ox0tMYG%5S5Kc=SvBfCXI9oTX9iHtnCm^W64$;n1I+=v+lQE*EdA={%Cr3L zit2WGKWddxs-M?$E8!-E2%+cUmW}6EdL^65a|7oih_ks05jaizoW zAXZ)n5npt$If!>xG-1IxQAc0C3w5qWEo-VV#P`H615D=EVx@Lnv#XgpZ@|f$Us><= z;oZ#)?lv@gaqVyR;d(`L1+G`}0BH6C={~gZs%AtEQ#a0Sz-li?c>`OI-+ugFfnWTg z560X^#6SH6e|f(?a*SnlZIQXFy)@!WG_D)3=`(xjh~aNm5iJ1x3Bo4FU z^AthdAfFprxx%G2KFP|G4lnUbsLHt(+e=^vFPiyINT8F)igN^xdZq8?9!nFMLN0ZpHpX6T9xP(7Pig&n2Y|TEnIwSQ$ zD&8MwR81^B;+N0i-H8&6%EX#d2pFA-rP8T*#u&t3BSTK_HK5U=cVvE#-xpNeKx==4 z9o@qrALd2og27MpggnI*C&cN|;5Syr4qWT~$eC>4p*qU4SzL-ST)clNBw*{+9up^# z(02e^&FtI{B~B#`uukQk|<#gVu9AQ3%J$$Y{}(okh@VGkk>1uB@VvI5LO?;C|Ey- z%TU_s=8Jj8(Qt9%b4^=fNVXQ471`6V})^auHAejl-DVW%;j?s{PsU&KjyPC`B}ablhR*2h5y zP_PZa<(uaT+v`vnpw~#o1_6r*E@2=ptkEAcp1|(rehfosb8Qjr_5Tq}xWGI{L;n;K zdh;tLnBX8FA>@?d`Xh5-RG9wA9JZOxrSJ#BJ_mL*2i7!~0Z8!T_ zgKRgAvj{r|AlTgGj-Ggdr#*$XzN3XYu6b);8M>ZJ+GdziFLT157cg;i)L%5Wc#}x zlfZ*L*<>d=CY(tHA}PNHwb!NaI1b3TO!^0x7$J=$2SY3L-j7a%^?i6A;4+=a>2G2d zuuTB5)j&}tq?@;m@sIc1!k6grc^}~4b>x8)Lk)KR4_y(g6cls~+rBweQo-}$1 ze?EqVfDg4r4Ezc35r_$VbC8r2Vt3aFRCKT5{*YMVJPID*6mlK`FObAV|MnKWn0aq@ zYvFhS#Dus!%rm$+_;@hX+I%r8Z;P3P+aSH!kWG@J#&)XMmEj2oZSPlWttu+8>A(QU zA9t5tdtIUluokolT7MnH5TPpQKd*I@serscs6?z92cWF|yl7Z2-0Ln151e~&|(2L>(MN{ev7!Wabu1?u;He8(v^R-~Z zM+2WA{uK*$s~hxS6El%#TJ^LgjuDI^d?DC9jP|AaCpvRWp(9NoxVU7bHCbp@`|Rjh z@rZ@n=+=0-jTfsTO<;jGv$^~y8@DEbN1p~TYwj(m_bhM2xa9Q1#1^t3eS(NZbXd2t zF*peTX)j>?IS^(E0uhObKwiAW{+-$IzHx9nzSwb_P%jp-fh%JgRsI<*&=C_?>hA}h zg}%#H#@z4PyO9VWZp`ZD5(W{O!T}=6BW$?r3tdh6FL!a-B^sSeV3(&p=;cvVIo8@n zNl6?*AFxpibRG5(fdpbR!h~pn)3f7|Aoz1c`wFZk5RVqH!(CjOV2{95%c&XQDFH1r2;0WpiK!~_oI817yVBLdPZ`^&%l}z@Dl|Vk``8=r?AZ=2ySya z_iJiu93`fL!4NdIqR;-sA-#Zbm+-$qU=kp|?hR+fdtERId^XS$S*}49+AYlUO+*=Z ziF0l{v=f6`)h<+T|fWG15&Mp@ZD z_C;c8KZ^FP;4Vn)fW#jnQbikS;*6f{R%pV|MkS(*Z#TFRH(CylM(Xfhu0u?+AT-S( zVi5FrY_P^tY^iR7A5w-^6rPO6?ju^s6O7=PfVXNX7zRaBOdpbkZi`&X#=ASf*Ya_rYpB`>k3oZT-{)_f}x zfj#9gP=H=Up*%q8=k9Wt4Uoe@n4?5_D-JM$H*GzE13s=gu^KzZ;plxPE_=?C7&z=G zmp$j(POPqWyF1cvV;**%-*y6&$J*bFo$ET!-R3EGx4B{6hbOY%9KSIM3cOl|IaZhe zJ<{7zgL|woz(r6cI&jI*a1S$#UkpZ#tzl4vwYd_=TM1Gc2&Mn8ZQdT`UN+I(X(eq@ zHsBCIW?@>oCt{4h1S6m&GJv;c=tc{oMLAT%GJCbje0_nzw-du;>wO|r31zsE4!yOT zh`Sv%V{3OmQ8x)qk!Oa;7H{|%8{dH5XvA@kuz0v)!}k|m9TJ$}+E;CapLEyLtZzeQ zPDZGO%UP@)$O;iYx{`rzM(!u(^XoXc2gV2B^$PmSpCcjU29Ef7F&EIl08jep2|Odw zD^Q3!P=!et@+{BTgOE*LMVmoj^%D{uEeV>BhG<~`87D~~Pt`2!JGD!d5}Y|HnAWgd zy-2a?*v=_}H~^1d14A`W7tQ&)gg~P8U+4SNt=&l>l(_DU_&%Fh3<(+<{k;Lx>z=R# znih7Ic)6~u;4K(tYsKQid?_4uOXP609z-8@4Nd#qA)oU63bcC5fe9`t1v$01E>H6A zzO9=S8cB?Z?rLD@T!~3mo$&>Xn=S%XBlvC$+Vx33h84y1IbE>EaZJI0#4`BT1o^+= zlayDD%XB)i-hTwp-0Lx&cyEg5+xSdZzi)jSm4)nH++gYR+b`p(YimwHnw$y2)GU|G@Q2nY`pNZtt) zsKUm^ldP;l)0l+>01J4ZL=i+Pk9u%AD8y_$U%=Xfkq7g{wZBSRJfeW9P*8-rJ6({y#n|$bEb;fee1?~w;pL}! zd4`wgc=;(_XiSut1=w@aLM1}Ke97r`mrH?g$~^7#VKq(sMKr!UYkgX6=V3|q&rFh@ zIfI~9w5jR?iriy1uto+Ka+hATiGzQO?;as$&ZAkht@FP@{2|P3bX~k3>9h!mX`Tqg z)0>35z7QK@&I{dm7XVVkL~7G=jdt zSRXk{n|KNgD+<`+9z(#^39KN|nAtedlE*1|2M8gYO1Q_J)urhh52U) zC4(rG1SE*<5W$Tz(KXRNpOWi>*5_HtjVKwKQe^t(LhH>e@(EmE-jL$Y;%WPbSGgnf z2qt38Wp=-TRy;=oMk>}=OX%rP#);Jnvw~tFF@|sX{A3MosK0?1Kw&}9&**tWMb{H5 zjK)v+62j=bw(wD**8yR|FajdPM;?TPb+{nBV346ipk4G&3xHX$jB7ENM1`6`!+%1% zABJAgaO9e+p!Er9`ZULnD}b&JZ2c=oI6RYbK;G|g8aWheQd;NLA3>Z>c<)@;s(lI$ z&{t*};WqOJgzGcCPjC4+s$C31BTGz8;!m*kJCT4vNgqSlLxa&Al|7?+gXG5Ri5c?f z?e*kbmx|U?idajo%y-CRx9W0G6}OTP<6X=SR=JF7w>(LcbF*I7>WiXj5k+BjKGy?5 zRCMkWSREsl7k&_9;mu@F0@Zj6OHb!n^r1kE7r~kGXA>?jFhCW2V{I5Zy!t^RU=@+I z>9B?a*kLdu(OLiA!nGAhYe^>jZweLD z5~pu%=%h7y4x!){XbB+Or)|E(>b)NvjR4$wM(Y5;x`s44PR#3KtMQEkqn?d}0fZ;H zpok^ztagHQLlt8{@L)tYOCPMsdtDpF*gC?#jL6{x)?R=g4gz@-ezal8XWBv$tUY}2 z051n{ae5wtRQpK5s>05qtw}5SObjZnsQYh#9w&v#kcE4FUTi1qilW?yiCvpfL%KIZ z!YI++aqQ#Q2SGGNNsGm?U_AgPsj*M@Nuu{tZ>;7C*-)(4HFhBS?B0r z9Ptkh5_Ax_0qAJg(;!N;jt`o`VowNyMJ0qXEIwFp5_4VehJ5sJL#(>9-EQ^>eZ^~V z3(UqrC&fSFc?_ipXr8%DGCG~?NjuxWayqGp45Y+dXvDwP=qBhD%Qz}7#NJ5%d>Y78 z8bFzN94pLVB7xk2Re1wuFi0R`P9KEg9M=)W>s**cDHUB8fiAESlZktp!PZj#kIOqW zlkG+-UiVV5I@afHohK{sA+r zA{tMNK1E2-(zrfgm|)OJ4j0|>`fi^fk)LqlH9?Y(>EM1JMvWKN z`>v4r(U2SI(U6UW^X|*UeYgRgaHFxD=h9xZa4nj1L{`Sg$W3>7?0>g+?lE##*B#$^ z?(FP%Jzg8z7zYL?#=8U-f|Jk^12#5>6j%r>q%m>Ei)Ys?e&1R1Sk?^)Qpkh6TP01K z*iDm`Hf?B>N1OH!q)JiRpr-8~Z8c4$Hhrm53sNdojlsB|@43JGd(4a-L(_*;)|%_z zBt}s-c0{YHCTOMaXy{x#45r2`K8#R?;#7Bk~1_dt^Jh3*Ow(P9k zj8t={85w4#PmFgweRtXP9fOUA2!Q4>U)7>TtRfykDBkq9p8TA)o$(*`i!aglnx0_qdYm zQs`8WpIL|AN$+iEUybZ9!;1`?MGbNPQfGDu!oz_NdE@bAKuQhwHkbo^nDC>Bos2; z1!lS)K|*PSk{DWtxJQG~Z#*qr>U-j$EG#V5q^FK)urtd}JES({f&SZ+Uv9F1#Bau% z$gxLLcp^k!NS3lfGR{&j>b2*N`i#Aq_L8C5+)Y0nEX6<=ewE{~COQ12C)}0D3m9G{ zOtg=)hQx`A)!-Yo;T6~=k0rVb`_Ukv(aF`{r|Q#pZm`*;3I;6hn-^00r|x?yyoBVm z;NeaQ$`yYSuun^5tY{bX*ZA6qducZJs>w$v9jrc+S3N_bVbL0O@8=4U)umfRbiHu! zz@;W4moaKYTLEhcC*x6=^2^~_D(PAnnw)zM9^A)4K=j7w6I<12b@&$+Za71R#6{?* z4z-PokUW<4L0kuK_iz&q9|l8o(ytUu7tel~#JH8>6O$hJpX%+rlkCZbevib!Pg_71 zXO#3zT1-3@rz-G1Eo6bQ#m3vV!4+n^-qI6bU%Toq4oKQ?agD|TVXons0&is85BqU| z3bpypJrFuRnh&cse&=Nyb|R(r^=_q-RZ6N#-mLG|kyg70Nx~o71-SKrftv&;!^$V9 zvQ(kt1Hbl2SlvA~CRS#CIO8 z0CUZrM*09Wbfv}eY#DE!!C%RJ7=0glI@K^>`oSm{2GyBd(wdo>984DPdTNpOON`UP zv8`UZ((qWyY^0|fv)IYY10!Iqz*dC~Y}(|QaPKVzWhdO5-_lMruE+kAr7*T(dc$~3 za}p_}08=n%I3cmG^M)EyYlJNG{8Vn`z&xRAS``VI;cQU?!PmkaGkv*ZgRP?h8a&_W)6JrCX!gd$1zo+)XI?jM$Clbi zPyX}CQ>RWXd}w05Wf^Zzc^r;mF{XeJ*p?X3nTD@rUC6a=JQjLN@++AM4iB=?H7TpM zKVnaXil&V$2&|BEgz~h~w_cvpyXzR^M3&mg!$FCREnK)^eS1Ts>oQ9|C`!Wj=_N4p zeR6gxvWga*C4yFWtAGSdgl)Qp1aHK7g{ZJxx2VOBkc5qJoz?C|t{ORam&$g**6n2f znqX@k7b|hvA;g~Th|w7ofCyy2AJu}*O0URmOJ@;s|K=xQ7Cjm8xC z|3?k5Mh6K}#NPQAcK$JERBkH@Hd4L6`$>^z{uI%yL-mtaPwoyT;ZrRYC4^R4WW(n@*%@z$0Z zME1%VLbtu3DBNj2g<9o6F2V^LMX!v|tD1iYFf&Ct0zr^&lCmLf@V2)k8pc(!Ywq3h$*4PdBOV~P%)-mS6`J4?_ zYJ<0`B%TXm%^9~}wy1n5KCE21C=gK`!z1BCsK86yC&vAd0?4L%G<#7337c&iBn?ZL zwp2kPU+Tu(zQp;2O43q%KDcM3;%{M?7+5x{NQ}3~9~hf$7@3TO!=Ozs+0lTeKiTH_ zj0ejFA+mu#YJPU`x&$qAKB_9E2}t@L9YevSWe*T+Z0K2V8zL8+NJOdNLZ%P(;h|*T zl<8k$0!cd)246F~%v@H>#a9wV;UEZtslh$O?6PiV>WaI}!mvn937$hH?@tgm$u}S( z&x01Hk7O!{!+7Fm)1EkFM-E#A&yAPuo4dymnddU0s1Q}sdT^<=3Tm^clFYCDJ)L*w zfu=w!!ag(MaHR8j<}Oh340yyfbhX%rO?W*o{za%xbbaJJBt2&6?<;c$RaTQ(Kozh_wK_HFCY82Dv%2?6^6i3%rfYMD7tK@TuD`D?*3;%ly#435Kp+;;Y)GzGs@WL(?2aZ;c4j*8zQbaZ&Ja=f=NXF;ECIE5sxA&6FY(mI0uAVw)O(o_LlLkRG!5jrt-)h;X(OQx zmFe;;pbeO`2y!BW`Cj_)8bS?g?METhK(x9jsrDa2-I87=L^X{M()3jfs?k$r&eB&9 z0u#kP7lLpx!p@7+br4kKkUS7DMY5euq$L(&H5FgzTyR`G;L$&u>~t++>o^q~5(ovi za?`eVN(i!)#2`pEYd%f_S)p%p8DbzVJ2(&qg@BjYMl6zOXMD88n1%7Dk_-*q#Abfl zf*waFCutTU8uBVASNbCr@*<&PXHB^zeHG^O(;M#6b4tbc&+W-XQOe?d45Q$w%px%+ z?WQF$`VQ?7!)jI_tr?Si%2?H?RHpxC1rYqm{K?~*wa}Hcd)Sm2_fEq04q_%CGoJ0H zq&F$l_%gpkfdCA+uPAv=G{S@&-{q>a{Q6sNn|fCtcYi{G_(@QZEBD7LWg7h_Rcb}k z6Vj$%F#HGjn*$X`N=N9#!?;)e{{<~$lQgdm7|k-eV}wh@huA`Mif`B<*oZ~rkU$W# z18e%v)UQ9o+QO#<-me~T~!U6f+BV=Wtl4xT?4NYqHoBCSJ&h{RmC2-#+9e3e)aCA zrOY2)AJ{Ajqz`NFtu~u-m7a2Fk6e3t-}O3tb>U$+roaJu2Q5}6BOD^!OC_R=#%{6z zF>g~)$QW?M0Q(vR`%&CS4~vNddDgi$E_?d0-JRuq`uYH4>K@_4+-2|=C*BnE4E~Vv zJ|!+`WZ4Od#eZTg#GWv8x%TgH@u(OIwnc|z2xMl@FbvniPGB6lSn#GnCL9>^R$rJ1 z5$a>HIGdLjTz9VaIS3rQ)^{tV%kD~Y4=xsb?!#4u{Rnr|HzXDTlOH{=hUbT?)Via8 zYwepQpwJIT|DAkTOca91%fd10XA$x@K)s!JdJE?lvEPe?h&)?03(bm$l;($ zq#n}|m68D(N1tNvbVPbywd8jtaV?RZk!@1C`$waZpOT=K?=*KLK3e^}W6MwL09mg^ zH{V$rwWDj3&~mmQX4z6juJe4C#w1=R45A1gE=*b)beqp@Ar(SNn6g{2==EyOYZy`4 zx;?lsS%G%@;BEzCZ6&JPR9&F!WQD1;34|WRlG2>`%@*q&ywtn95^VCTF$_28D7rHRgA7YE=((#6_Hy; zt9k6Rz?Ze$=*v~&42_saMP4z9FaX6a>*WP=)6aygabKpi6j;O(QdcKPc1vm!{u%1brjMO&PP;5aB`Wp#j{LQycANv9ZfIh&w@Qqwv3+xs3Jg0D(%^rXE|=wknWAi z7Ty+#SK1B5rQ9D*rHnY$r0&KZStLZg)}r!#IbD-JqeX-yGcpQJ$B|MUPLwf8s*S;o z2G6>38?9GX_n3uFlKciys||L)Z!lh_ldDR$=SM0;BQkhNw!tybbZS0Ar|)}b*x&W# z5ypY1X9T$;fKzc)6uu}P0eD>)6}Q&K(X1Ctid=<1l}n_0fR~7t!~aHyfXgbsJq#SO z%S6J56{;hyoPtZNV$W>QTX002W5-NnxTAv*KK8`h26o=a{&?tU)uQRK8WxAxss04s zeARgwD?!4zlC1seRuPp=m9o_XtL^C^?{C1PuZj(8^}vWdV@K`oWLG)B-uTYNDnw37 z9*Ej8THvZi{vnh~C00tFU2^R>Yeu_WEMSL?9IjhLWy<*gYOP{#waSQhci$5CGx)fT z96GA|7ORmuR1fj=NXz_|tm0TlTYr^Fo68fq%Up|LJCSRg$X$IRx5<5maT~Au$ZhxV zrc;eoD?Z$tcRqVS_(<%e+pJ{2k|QKOvYHv;d2^x8%ELzvg49#CJ|+V445^S|=UiD- zh5)!8wTYo64yVcS$45NFn((TcdEC={w2@{T@3VV-ki2@_*T}=zZ6a%A^P}DsXuC7$ z8N`;mL9MUpX&vesRoaDHH&EGgfr~ApHY}C|pT&Ya%D7VsM#VQRx5AFK77r`aNI2U3 zO5PM@iVqIPQ@SY5R({f$=AY#5rF<#>V!oU|kq;^&&j}cg|1^C+y*6PjZviP(%m)Pq z1GRxe`rq42NlcMnc=8VK5^O9C8wqVJ)0^y>*0l+18igen&Eu?iE9hB+_Caj!#v-9% zV-pozBW^;WcVavhcBAd_sHpH-f(2!X@O8nCG&DgsVR)l!tj8GZ>M+Wz zs|^qI+4S_7fzXB#r*3-#7CCR6iS3@zRkmF`(w!_sW*<6-#=TiV+3O|3i?eOYT`$~+-aZs6j?@>tl{ygu5n@3ix?d)kQcn#j6MHr|JtY@%PvZwaQ?rW_?S_sHp( z_R_Shb#Bx5L?-4;DU4u`u13@+rCvxNA)>B9qR}O8i3I&gNjr$%d&PQX@B>7=YeZtN z1O|F#3tJl7gEaidE)3`MiKZiOw}?9!o12vl(ym?Mv(PXwD#1xgQhxABI%p6GgY?L}eFl2vKI-NUp%6QnJ zyjopOJpExYXn%v@elviNUlkf%ph%8GFi|EU%7y~5?7lzRb&)qzFrl$P-WbcF{yz#H zyN5Xj6s_DJld>#EGHehd2EKvcuQphaB58Llf=VzF=#r3SF}VV!WG3y(u!f7PiR5%@ zVYx_ESDwtm7D|uNy22Kk6533`P(sTQO7`=j-??dVJc+)&kDqT!sPm&0(b;X!Ynof{ ze+Ao@fJHBj`k&O?M!bN>ED3!Lnsmd784QwubKbpOa4dCW5Fi*FCk&4)X1dst&Qgz^ zVhnVLfLWAhWEoOb1Ldw9?x)m@xGdrc8;fz9gwLH}4_r4Ry4jZjch#n!(J?s(EauzV zizz@C8cTQ@VgUo}g@w0oi>=NgLqiiaU3bSu1XueHAu70MuG?=)It)no-2F&(u8K!P z+-CgstaSA`tZo~SoAePkE9qL@Bi?*rYeYo%#EW}aJiOnJX0y19`KF9^R#aO9bd!Y6 z!(1h1uR(j9*eQLBjNa_k3~967aVzNJgY?0@k7^bwLM<|0b8qZ!QwT+EYLvU%jNFL( zwb`e+$JE@2dR-^Ue3;}y`Z#@9`&lj`L)S6C3rQKemXH%C>`JkfpDoEcat?*6Ok5Ee zmEA=$ge9naNlu~Ks>f!p+mo^=pS#NvF4}FgvV)njVv1plWD46;24%K;4`m7jjY+jP zUY`CKBW&Jw;x`cA^mr*}Ff6hqjlbozSV=L+rL&ok87med3wxf-yP|NkDjdz+bV`i1 z1w&a?*t|G`c=F3XbXpL-XhBQ%IZLC$uT|^5RTlh1W{P(r5*B5dn+7 zB&J>(68kC_LN>_!3T=fX&vAuZ4ciaoXm$|$geVkN{G1aJ{Xgg?=85h#Uomo-W+z_i^ly?1EwP}H|ESv8$Aa4Lqg49*Xm=MK-V}oanDS;qF0L+eeeTw zJ0jAQf?jqi0r7XckgVmcSxlS>L9SG$#ES`2_il#JQ0|`yH_D%=e6Fk!D!H}!N|D$H zlH_8AP&`#BDO#D_O7x_1s#Z$hbp|!Mkb0}EQ`4Qtq43r;8UN{;Rqa{jIv3)89ybKF z4YPe?lCSitess!md}J~A5VRoo$t>=POhal!zqS}T$(9JEJFv5)I7b%7Hm_5260X(# z6EQzK_|%047Ecb1~|OL0O}sp^{x4PFO3d# zh%5yX+RYB)-8A4stM=>jo9OefzFz}bD|r!hKb3Ii3&Q4qw?^Jk@=^J9KzAO?wJTzQ zMFF^n_9&Jdc9_h`eI<)8haD!)MK}gosN#+0UY~PUqIE4v%Vnk)#rXYO{QLHWUJvFO zY+a9+7VgZ9nSdw^cWkQQg~hLE$R?-QYAKkZXIIj(vg4S8NgTpxm)cosK?D;Ox&qK1 zJT!@1tTPxzB6MZVMAu$L%YRhkuRSH?Gnu^7T{wwAhC%w;2QZ;dBnIJn?EhA_T zTU28SY>Ns@fF1?HKAXoauOM=6@|bVa=xuRynB<@~dD6u}VvL8@R>B`U*T-}u@Rd<# z#91bFDQrYcp;Jt{H*8nl)bXO>h&%D?mO<(rJIOAt0_NE)U7`(6x*_SElaf03uK)3V zRMBN{VT6uqjY9}c%5p{Gf^cXe>g=ppwyg6!m4OdGxZ5m1dOtRhhnr>|BGN7#OKdAb zccsAcX6Q&A4tnd4JLZr&q=VYy?|@ZETaPFFj3>T}@wnh8UfA7k;|ONc(8MA=$O!IY zP1}J{-n+F6@^sk1`mpj>E?pQA-b*SuF>B$7sPCuVh=o|67zMaY|~@7JBqh*8iR zLS=W-Gt(lM%U)=heQj*TnY-!krYTw!o$K4;s(4SbRUA&-^iBq#K7|QH`~}h*CsBVZ6w0s8~B7aiA*v! z9^>7ySW<$mfJ(>af(W~i;9JM`OpX~a>1O7KONncX(n@WC5iAiLp8B~AXs$Jcq zTf3?#%a@gWQO{%**YD6&_uG2$17-P2d}W6M{j#2YRnNYr#EdJxp({HU;CFTPO(nla zGM<}qhjk;)%pKH|yxS7`0@bs)3!C-8p8l+^KCWzKXMxt=uLp{@Zo&C|CLJ-Dd2b=4 zFN-U&_fa#KD{s-qgiUfB_fJhO^#fJDMTJ$)9paV(Kh*V;O6-;OYu>+-NxC~8zp@@a zz%5;RTu(PE`Hqqk%DE+6^}c^8e*ZIMqSd6ll~Vg*ywpr@j!RVe5vt+U_jJ8PNm4l7 zrT6KT6|ndEq^EnD)YI|uOxuuM$jx49yo>}RnjMT>N4Jv3| z*i1ciq3h}8s;TD9X_dp*X_H|!4e6O#OWO3w&Nc<-DuIQiwXSRLV`ych5$?{JGrx(UujZIX^jp{^KB@e578ePRDC^Xu^_AmZ&c~CYTH1* ztL?fUJ>$b{#=pq}!`*%hk^r}Xd_FQgs=9t93w{!nf2)0Lw6xIfbEw{`U$UEQzb&y|$*>@Rg?=;srV$rXqv&+xDILggVj zV)gvPT>yuHLM>lglV3}?*U=HoSWytI;<{QcjGU^B^KN#a#Kg`#c**ng?KO-69Q4n(q3z^>YLy;nePHw80_(mjfmt1$9uXU*%T+jH_@A}Vj( z3#&I$_eQ&DFQ7fKDmI|aRKAmaErfKcZ`=MgRDK7&p0FBL3ERAJ%D+o!QrWhn2R z*>`C6$i7rCN4DB#5g^%aFf%a!bi{@e3$Ks65zTsUq@{HWi|ZyD?>cy71CBZUt(7scr;QHI#m(mQx!Ufa=m1V$V^&+Pi0&4{utRU+_n%an{NS*~P- zl5>XT~77_3k0>KB!KR>|j-98>Z|CBLfV*OWZ1!bB`_0=oZt{$on)*JOV)-M`(Z}#8l&Vl#V eFQ}i#`|xk9K2)#r8>*MHdBa_8^_qNr^?w3pc||J# literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/bs4/__pycache__/exceptions.cpython-310.pyc b/.venv/lib/python3.10/site-packages/bs4/__pycache__/exceptions.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..930457e23211be6cb6599f0d06e0d293e7344511 GIT binary patch literal 1479 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 UPi6`R@<5EheKK0+`SOhUcT>v!FaQ7m literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/bs4/_deprecation.py b/.venv/lib/python3.10/site-packages/bs4/_deprecation.py new file mode 100644 index 0000000..a7b5685 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/bs4/_deprecation.py @@ -0,0 +1,80 @@ +"""Helper functions for deprecation. + +This interface is itself unstable and may change without warning. Do +not use these functions yourself, even as a joke. The underscores are +there for a reason. No support will be given. + +In particular, most of this will go away without warning once +Beautiful Soup drops support for Python 3.11, since Python 3.12 +defines a `@typing.deprecated() +decorator. `_ +""" + +import functools +import warnings + +from typing import ( + Any, + Callable, +) + + +def _deprecated_alias(old_name: str, new_name: str, version: str): + """Alias one attribute name to another for backward compatibility + + :meta private: + """ + + @property # type:ignore + def alias(self) -> Any: + ":meta private:" + warnings.warn( + f"Access to deprecated property {old_name}. (Replaced by {new_name}) -- Deprecated since version {version}.", + DeprecationWarning, + stacklevel=2, + ) + return getattr(self, new_name) + + @alias.setter + def alias(self, value: str) -> None: + ":meta private:" + warnings.warn( + f"Write to deprecated property {old_name}. (Replaced by {new_name}) -- Deprecated since version {version}.", + DeprecationWarning, + stacklevel=2, + ) + return setattr(self, new_name, value) + + return alias + + +def _deprecated_function_alias( + old_name: str, new_name: str, version: str +) -> Callable[[Any], Any]: + def alias(self, *args: Any, **kwargs: Any) -> Any: + ":meta private:" + warnings.warn( + f"Call to deprecated method {old_name}. (Replaced by {new_name}) -- Deprecated since version {version}.", + DeprecationWarning, + stacklevel=2, + ) + return getattr(self, new_name)(*args, **kwargs) + + return alias + + +def _deprecated(replaced_by: str, version: str) -> Callable: + def deprecate(func: Callable) -> Callable: + @functools.wraps(func) + def with_warning(*args: Any, **kwargs: Any) -> Any: + ":meta private:" + warnings.warn( + f"Call to deprecated method {func.__name__}. (Replaced by {replaced_by}) -- Deprecated since version {version}.", + DeprecationWarning, + stacklevel=2, + ) + return func(*args, **kwargs) + + return with_warning + + return deprecate diff --git a/.venv/lib/python3.10/site-packages/bs4/_typing.py b/.venv/lib/python3.10/site-packages/bs4/_typing.py new file mode 100644 index 0000000..0ab69df --- /dev/null +++ b/.venv/lib/python3.10/site-packages/bs4/_typing.py @@ -0,0 +1,205 @@ +# Custom type aliases used throughout Beautiful Soup to improve readability. + +# Notes on improvements to the type system in newer versions of Python +# that can be used once Beautiful Soup drops support for older +# versions: +# +# * ClassVar can be put on class variables now. +# * In 3.10, x|y is an accepted shorthand for Union[x,y]. +# * In 3.10, TypeAlias gains capabilities that can be used to +# improve the tree matching types (I don't remember what, exactly). +# * In 3.9 it's possible to specialize the re.Match type, +# e.g. re.Match[str]. In 3.8 there's a typing.re namespace for this, +# but it's removed in 3.12, so to support the widest possible set of +# versions I'm not using it. + +from typing_extensions import ( + runtime_checkable, + Protocol, + TypeAlias, +) +from typing import ( + Any, + Callable, + Dict, + IO, + Iterable, + Mapping, + Optional, + Pattern, + TYPE_CHECKING, + Union, +) + +if TYPE_CHECKING: + from bs4.element import ( + AttributeValueList, + NamespacedAttribute, + NavigableString, + PageElement, + ResultSet, + Tag, + ) + + +@runtime_checkable +class _RegularExpressionProtocol(Protocol): + """A protocol object which can accept either Python's built-in + `re.Pattern` objects, or the similar ``Regex`` objects defined by the + third-party ``regex`` package. + """ + + def search( + self, string: str, pos: int = ..., endpos: int = ... + ) -> Optional[Any]: ... + + @property + def pattern(self) -> str: ... + + +# Aliases for markup in various stages of processing. +# +#: The rawest form of markup: either a string, bytestring, or an open filehandle. +_IncomingMarkup: TypeAlias = Union[str, bytes, IO[str], IO[bytes]] + +#: Markup that is in memory but has (potentially) yet to be converted +#: to Unicode. +_RawMarkup: TypeAlias = Union[str, bytes] + +# Aliases for character encodings +# + +#: A data encoding. +_Encoding: TypeAlias = str + +#: One or more data encodings. +_Encodings: TypeAlias = Iterable[_Encoding] + +# Aliases for XML namespaces +# + +#: The prefix for an XML namespace. +_NamespacePrefix: TypeAlias = str + +#: The URL of an XML namespace +_NamespaceURL: TypeAlias = str + +#: A mapping of prefixes to namespace URLs. +_NamespaceMapping: TypeAlias = Dict[_NamespacePrefix, _NamespaceURL] + +#: A mapping of namespace URLs to prefixes +_InvertedNamespaceMapping: TypeAlias = Dict[_NamespaceURL, _NamespacePrefix] + +# Aliases for the attribute values associated with HTML/XML tags. +# + +#: The value associated with an HTML or XML attribute. This is the +#: relatively unprocessed value Beautiful Soup expects to come from a +#: `TreeBuilder`. +_RawAttributeValue: TypeAlias = str + +#: A dictionary of names to `_RawAttributeValue` objects. This is how +#: Beautiful Soup expects a `TreeBuilder` to represent a tag's +#: attribute values. +_RawAttributeValues: TypeAlias = ( + "Mapping[Union[str, NamespacedAttribute], _RawAttributeValue]" +) + +#: An attribute value in its final form, as stored in the +# `Tag` class, after it has been processed and (in some cases) +# split into a list of strings. +_AttributeValue: TypeAlias = Union[str, "AttributeValueList"] + +#: A dictionary of names to :py:data:`_AttributeValue` objects. This is what +#: a tag's attributes look like after processing. +_AttributeValues: TypeAlias = Dict[str, _AttributeValue] + +#: The methods that deal with turning :py:data:`_RawAttributeValue` into +#: :py:data:`_AttributeValue` may be called several times, even after the values +#: are already processed (e.g. when cloning a tag), so they need to +#: be able to acommodate both possibilities. +_RawOrProcessedAttributeValues: TypeAlias = Union[_RawAttributeValues, _AttributeValues] + +#: A number of tree manipulation methods can take either a `PageElement` or a +#: normal Python string (which will be converted to a `NavigableString`). +_InsertableElement: TypeAlias = Union["PageElement", str] + +# Aliases to represent the many possibilities for matching bits of a +# parse tree. +# +# This is very complicated because we're applying a formal type system +# to some very DWIM code. The types we end up with will be the types +# of the arguments to the SoupStrainer constructor and (more +# familiarly to Beautiful Soup users) the find* methods. + +#: A function that takes a PageElement and returns a yes-or-no answer. +_PageElementMatchFunction: TypeAlias = Callable[["PageElement"], bool] + +#: A function that takes the raw parsed ingredients of a markup tag +#: and returns a yes-or-no answer. +# Not necessary at the moment. +# _AllowTagCreationFunction:TypeAlias = Callable[[Optional[str], str, Optional[_RawAttributeValues]], bool] + +#: A function that takes the raw parsed ingredients of a markup string node +#: and returns a yes-or-no answer. +# Not necessary at the moment. +# _AllowStringCreationFunction:TypeAlias = Callable[[Optional[str]], bool] + +#: A function that takes a `Tag` and returns a yes-or-no answer. +#: A `TagNameMatchRule` expects this kind of function, if you're +#: going to pass it a function. +_TagMatchFunction: TypeAlias = Callable[["Tag"], bool] + +#: A function that takes a string (or None) and returns a yes-or-no +#: answer. An `AttributeValueMatchRule` expects this kind of function, if +#: you're going to pass it a function. +_NullableStringMatchFunction: TypeAlias = Callable[[Optional[str]], bool] + +#: A function that takes a string and returns a yes-or-no answer. A +# `StringMatchRule` expects this kind of function, if you're going to +# pass it a function. +_StringMatchFunction: TypeAlias = Callable[[str], bool] + +#: Either a tag name, an attribute value or a string can be matched +#: against a string, bytestring, regular expression, or a boolean. +_BaseStrainable: TypeAlias = Union[str, bytes, Pattern[str], bool] + +#: A tag can be matched either with the `_BaseStrainable` options, or +#: using a function that takes the `Tag` as its sole argument. +_BaseStrainableElement: TypeAlias = Union[_BaseStrainable, _TagMatchFunction] + +#: A tag's attribute value can be matched either with the +#: `_BaseStrainable` options, or using a function that takes that +#: value as its sole argument. +_BaseStrainableAttribute: TypeAlias = Union[_BaseStrainable, _NullableStringMatchFunction] + +#: A tag can be matched using either a single criterion or a list of +#: criteria. +_StrainableElement: TypeAlias = Union[ + _BaseStrainableElement, Iterable[_BaseStrainableElement] +] + +#: An attribute value can be matched using either a single criterion +#: or a list of criteria. +_StrainableAttribute: TypeAlias = Union[ + _BaseStrainableAttribute, Iterable[_BaseStrainableAttribute] +] + +#: An string can be matched using the same techniques as +#: an attribute value. +_StrainableString: TypeAlias = _StrainableAttribute + +#: A dictionary may be used to match against multiple attribute vlaues at once. +_StrainableAttributes: TypeAlias = Dict[str, _StrainableAttribute] + +#: Many Beautiful soup methods return a PageElement or an ResultSet of +#: PageElements. A PageElement is either a Tag or a NavigableString. +#: These convenience aliases make it easier for IDE users to see which methods +#: are available on the objects they're dealing with. +_OneElement: TypeAlias = Union["PageElement", "Tag", "NavigableString"] +_AtMostOneElement: TypeAlias = Optional[_OneElement] +_AtMostOneTag: TypeAlias = Optional["Tag"] +_AtMostOneNavigableString: TypeAlias = Optional["NavigableString"] +_QueryResults: TypeAlias = "ResultSet[_OneElement]" +_SomeTags: TypeAlias = "ResultSet[Tag]" +_SomeNavigableStrings: TypeAlias = "ResultSet[NavigableString]" diff --git a/.venv/lib/python3.10/site-packages/bs4/_warnings.py b/.venv/lib/python3.10/site-packages/bs4/_warnings.py new file mode 100644 index 0000000..4309473 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/bs4/_warnings.py @@ -0,0 +1,98 @@ +"""Define some custom warnings.""" + + +class GuessedAtParserWarning(UserWarning): + """The warning issued when BeautifulSoup has to guess what parser to + use -- probably because no parser was specified in the constructor. + """ + + MESSAGE: str = """No parser was explicitly specified, so I'm using the best available %(markup_type)s parser for this system ("%(parser)s"). This usually isn't a problem, but if you run this code on another system, or in a different virtual environment, it may use a different parser and behave differently. + +The code that caused this warning is on line %(line_number)s of the file %(filename)s. To get rid of this warning, pass the additional argument 'features="%(parser)s"' to the BeautifulSoup constructor. +""" + + +class UnusualUsageWarning(UserWarning): + """A superclass for warnings issued when Beautiful Soup sees + something that is typically the result of a mistake in the calling + code, but might be intentional on the part of the user. If it is + in fact intentional, you can filter the individual warning class + to get rid of the warning. If you don't like Beautiful Soup + second-guessing what you are doing, you can filter the + UnusualUsageWarningclass itself and get rid of these entirely. + """ + + +class MarkupResemblesLocatorWarning(UnusualUsageWarning): + """The warning issued when BeautifulSoup is given 'markup' that + actually looks like a resource locator -- a URL or a path to a file + on disk. + """ + + #: :meta private: + GENERIC_MESSAGE: str = """ + +However, if you want to parse some data that happens to look like a %(what)s, then nothing has gone wrong: you are using Beautiful Soup correctly, and this warning is spurious and can be filtered. To make this warning go away, run this code before calling the BeautifulSoup constructor: + + from bs4 import MarkupResemblesLocatorWarning + import warnings + + warnings.filterwarnings("ignore", category=MarkupResemblesLocatorWarning) + """ + + URL_MESSAGE: str = ( + """The input passed in on this line looks more like a URL than HTML or XML. + +If you meant to use Beautiful Soup to parse the web page found at a certain URL, then something has gone wrong. You should use an Python package like 'requests' to fetch the content behind the URL. Once you have the content as a string, you can feed that string into Beautiful Soup.""" + + GENERIC_MESSAGE + ) + + FILENAME_MESSAGE: str = ( + """The input passed in on this line looks more like a filename than HTML or XML. + +If you meant to use Beautiful Soup to parse the contents of a file on disk, then something has gone wrong. You should open the file first, using code like this: + + filehandle = open(your filename) + +You can then feed the open filehandle into Beautiful Soup instead of using the filename.""" + + GENERIC_MESSAGE + ) + + +class AttributeResemblesVariableWarning(UnusualUsageWarning, SyntaxWarning): + """The warning issued when Beautiful Soup suspects a provided + attribute name may actually be the misspelled name of a Beautiful + Soup variable. Generally speaking, this is only used in cases like + "_class" where it's very unlikely the user would be referencing an + XML attribute with that name. + """ + + MESSAGE: str = """%(original)r is an unusual attribute name and is a common misspelling for %(autocorrect)r. + +If you meant %(autocorrect)r, change your code to use it, and this warning will go away. + +If you really did mean to check the %(original)r attribute, this warning is spurious and can be filtered. To make it go away, run this code before creating your BeautifulSoup object: + + from bs4 import AttributeResemblesVariableWarning + import warnings + + warnings.filterwarnings("ignore", category=AttributeResemblesVariableWarning) +""" + + +class XMLParsedAsHTMLWarning(UnusualUsageWarning): + """The warning issued when an HTML parser is used to parse + XML that is not (as far as we can tell) XHTML. + """ + + MESSAGE: str = """It looks like you're using an HTML parser to parse an XML document. + +Assuming this really is an XML document, what you're doing might work, but you should know that using an XML parser will be more reliable. To parse this document as XML, make sure you have the Python package 'lxml' installed, and pass the keyword argument `features="xml"` into the BeautifulSoup constructor. + +If you want or need to use an HTML parser on this document, you can make this warning go away by filtering it. To do that, run this code before calling the BeautifulSoup constructor: + + from bs4 import XMLParsedAsHTMLWarning + import warnings + + warnings.filterwarnings("ignore", category=XMLParsedAsHTMLWarning) +""" diff --git a/.venv/lib/python3.10/site-packages/bs4/builder/__init__.py b/.venv/lib/python3.10/site-packages/bs4/builder/__init__.py new file mode 100644 index 0000000..4aae4d3 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/bs4/builder/__init__.py @@ -0,0 +1,848 @@ +from __future__ import annotations + +# Use of this source code is governed by the MIT license. +__license__ = "MIT" + +from collections import defaultdict +import re +from types import ModuleType +from typing import ( + Any, + cast, + Dict, + Iterable, + List, + Optional, + Pattern, + Set, + Tuple, + Type, + TYPE_CHECKING, +) +import warnings +import sys +from bs4.element import ( + AttributeDict, + AttributeValueList, + CharsetMetaAttributeValue, + ContentMetaAttributeValue, + RubyParenthesisString, + RubyTextString, + Stylesheet, + Script, + TemplateString, + nonwhitespace_re, +) + +# Exceptions were moved to their own module in 4.13. Import here for +# backwards compatibility. +from bs4.exceptions import ParserRejectedMarkup + +from bs4._typing import ( + _AttributeValues, + _RawAttributeValue, +) + +from bs4._warnings import XMLParsedAsHTMLWarning + +if TYPE_CHECKING: + from bs4 import BeautifulSoup + from bs4.element import ( + NavigableString, + Tag, + ) + from bs4._typing import ( + _AttributeValue, + _Encoding, + _Encodings, + _RawOrProcessedAttributeValues, + _RawMarkup, + ) + +__all__ = [ + "HTMLTreeBuilder", + "SAXTreeBuilder", + "TreeBuilder", + "TreeBuilderRegistry", +] + +# Some useful features for a TreeBuilder to have. +FAST = "fast" +PERMISSIVE = "permissive" +STRICT = "strict" +XML = "xml" +HTML = "html" +HTML_5 = "html5" + +__all__ = [ + "TreeBuilderRegistry", + "TreeBuilder", + "HTMLTreeBuilder", + "DetectsXMLParsedAsHTML", + + "ParserRejectedMarkup", # backwards compatibility only as of 4.13.0 +] + +class TreeBuilderRegistry(object): + """A way of looking up TreeBuilder subclasses by their name or by desired + features. + """ + + builders_for_feature: Dict[str, List[Type[TreeBuilder]]] + builders: List[Type[TreeBuilder]] + + def __init__(self) -> None: + self.builders_for_feature = defaultdict(list) + self.builders = [] + + def register(self, treebuilder_class: type[TreeBuilder]) -> None: + """Register a treebuilder based on its advertised features. + + :param treebuilder_class: A subclass of `TreeBuilder`. its + `TreeBuilder.features` attribute should list its features. + """ + for feature in treebuilder_class.features: + self.builders_for_feature[feature].insert(0, treebuilder_class) + self.builders.insert(0, treebuilder_class) + + def lookup(self, *features: str) -> Optional[Type[TreeBuilder]]: + """Look up a TreeBuilder subclass with the desired features. + + :param features: A list of features to look for. If none are + provided, the most recently registered TreeBuilder subclass + will be used. + :return: A TreeBuilder subclass, or None if there's no + registered subclass with all the requested features. + """ + if len(self.builders) == 0: + # There are no builders at all. + return None + + if len(features) == 0: + # They didn't ask for any features. Give them the most + # recently registered builder. + return self.builders[0] + + # Go down the list of features in order, and eliminate any builders + # that don't match every feature. + feature_list = list(features) + feature_list.reverse() + candidates = None + candidate_set = None + while len(feature_list) > 0: + feature = feature_list.pop() + we_have_the_feature = self.builders_for_feature.get(feature, []) + if len(we_have_the_feature) > 0: + if candidates is None: + candidates = we_have_the_feature + candidate_set = set(candidates) + elif candidate_set is not None: + # Eliminate any candidates that don't have this feature. + candidate_set = candidate_set.intersection(set(we_have_the_feature)) + + # The only valid candidates are the ones in candidate_set. + # Go through the original list of candidates and pick the first one + # that's in candidate_set. + if candidate_set is None or candidates is None: + return None + for candidate in candidates: + if candidate in candidate_set: + return candidate + return None + + +#: The `BeautifulSoup` constructor will take a list of features +#: and use it to look up `TreeBuilder` classes in this registry. +builder_registry: TreeBuilderRegistry = TreeBuilderRegistry() + + +class TreeBuilder(object): + """Turn a textual document into a Beautiful Soup object tree. + + This is an abstract superclass which smooths out the behavior of + different parser libraries into a single, unified interface. + + :param multi_valued_attributes: If this is set to None, the + TreeBuilder will not turn any values for attributes like + 'class' into lists. Setting this to a dictionary will + customize this behavior; look at :py:attr:`bs4.builder.HTMLTreeBuilder.DEFAULT_CDATA_LIST_ATTRIBUTES` + for an example. + + Internally, these are called "CDATA list attributes", but that + probably doesn't make sense to an end-user, so the argument name + is ``multi_valued_attributes``. + + :param preserve_whitespace_tags: A set of tags to treat + the way
 tags are treated in HTML. Tags in this set
+     are immune from pretty-printing; their contents will always be
+     output as-is.
+
+    :param string_containers: A dictionary mapping tag names to
+     the classes that should be instantiated to contain the textual
+     contents of those tags. The default is to use NavigableString
+     for every tag, no matter what the name. You can override the
+     default by changing :py:attr:`DEFAULT_STRING_CONTAINERS`.
+
+    :param store_line_numbers: If the parser keeps track of the line
+     numbers and positions of the original markup, that information
+     will, by default, be stored in each corresponding
+     :py:class:`bs4.element.Tag` object. You can turn this off by
+     passing store_line_numbers=False; then Tag.sourcepos and
+     Tag.sourceline will always be None. If the parser you're using
+     doesn't keep track of this information, then store_line_numbers
+     is irrelevant.
+
+    :param attribute_dict_class: The value of a multi-valued attribute
+      (such as HTML's 'class') willl be stored in an instance of this
+      class.  The default is Beautiful Soup's built-in
+      `AttributeValueList`, which is a normal Python list, and you
+      will probably never need to change it.
+    """
+
+    USE_DEFAULT: Any = object()  #: :meta private:
+
+    def __init__(
+        self,
+        multi_valued_attributes: Dict[str, Set[str]] = USE_DEFAULT,
+        preserve_whitespace_tags: Set[str] = USE_DEFAULT,
+        store_line_numbers: bool = USE_DEFAULT,
+        string_containers: Dict[str, Type[NavigableString]] = USE_DEFAULT,
+        empty_element_tags: Set[str] = USE_DEFAULT,
+        attribute_dict_class: Type[AttributeDict] = AttributeDict,
+        attribute_value_list_class: Type[AttributeValueList] = AttributeValueList,
+    ):
+        self.soup = None
+        if multi_valued_attributes is self.USE_DEFAULT:
+            multi_valued_attributes = self.DEFAULT_CDATA_LIST_ATTRIBUTES
+        self.cdata_list_attributes = multi_valued_attributes
+        if preserve_whitespace_tags is self.USE_DEFAULT:
+            preserve_whitespace_tags = self.DEFAULT_PRESERVE_WHITESPACE_TAGS
+        self.preserve_whitespace_tags = preserve_whitespace_tags
+        if empty_element_tags is self.USE_DEFAULT:
+            self.empty_element_tags = self.DEFAULT_EMPTY_ELEMENT_TAGS
+        else:
+            self.empty_element_tags = empty_element_tags
+        # TODO: store_line_numbers is probably irrelevant now that
+        # the behavior of sourceline and sourcepos has been made consistent
+        # everywhere.
+        if store_line_numbers == self.USE_DEFAULT:
+            store_line_numbers = self.TRACKS_LINE_NUMBERS
+        self.store_line_numbers = store_line_numbers
+        if string_containers == self.USE_DEFAULT:
+            string_containers = self.DEFAULT_STRING_CONTAINERS
+        self.string_containers = string_containers
+        self.attribute_dict_class = attribute_dict_class
+        self.attribute_value_list_class = attribute_value_list_class
+
+    NAME: str = "[Unknown tree builder]"
+    ALTERNATE_NAMES: Iterable[str] = []
+    features: Iterable[str] = []
+
+    is_xml: bool = False
+    picklable: bool = False
+
+    soup: Optional[BeautifulSoup]  #: :meta private:
+
+    #: A tag will be considered an empty-element
+    #: tag when and only when it has no contents.
+    empty_element_tags: Optional[Set[str]] = None  #: :meta private:
+    cdata_list_attributes: Dict[str, Set[str]]  #: :meta private:
+    preserve_whitespace_tags: Set[str]  #: :meta private:
+    string_containers: Dict[str, Type[NavigableString]]  #: :meta private:
+    tracks_line_numbers: bool  #: :meta private:
+
+    #: A value for these tag/attribute combinations is a space- or
+    #: comma-separated list of CDATA, rather than a single CDATA.
+    DEFAULT_CDATA_LIST_ATTRIBUTES: Dict[str, Set[str]] = defaultdict(set)
+
+    #: Whitespace should be preserved inside these tags.
+    DEFAULT_PRESERVE_WHITESPACE_TAGS: Set[str] = set()
+
+    #: The textual contents of tags with these names should be
+    #: instantiated with some class other than `bs4.element.NavigableString`.
+    DEFAULT_STRING_CONTAINERS: Dict[str, Type[bs4.element.NavigableString]] = {} # type:ignore
+
+    #: By default, tags are treated as empty-element tags if they have
+    #: no contents--that is, using XML rules. HTMLTreeBuilder
+    #: defines a different set of DEFAULT_EMPTY_ELEMENT_TAGS based on the
+    #: HTML 4 and HTML5 standards.
+    DEFAULT_EMPTY_ELEMENT_TAGS: Optional[Set[str]] = None
+
+    #: Most parsers don't keep track of line numbers.
+    TRACKS_LINE_NUMBERS: bool = False
+
+    def initialize_soup(self, soup: BeautifulSoup) -> None:
+        """The BeautifulSoup object has been initialized and is now
+        being associated with the TreeBuilder.
+
+        :param soup: A BeautifulSoup object.
+        """
+        self.soup = soup
+
+    def reset(self) -> None:
+        """Do any work necessary to reset the underlying parser
+        for a new document.
+
+        By default, this does nothing.
+        """
+        pass
+
+    def can_be_empty_element(self, tag_name: str) -> bool:
+        """Might a tag with this name be an empty-element tag?
+
+        The final markup may or may not actually present this tag as
+        self-closing.
+
+        For instance: an HTMLBuilder does not consider a 

tag to be + an empty-element tag (it's not in + HTMLBuilder.empty_element_tags). This means an empty

tag + will be presented as "

", not "

" or "

". + + The default implementation has no opinion about which tags are + empty-element tags, so a tag will be presented as an + empty-element tag if and only if it has no children. + "" will become "", and "bar" will + be left alone. + + :param tag_name: The name of a markup tag. + """ + if self.empty_element_tags is None: + return True + return tag_name in self.empty_element_tags + + def feed(self, markup: _RawMarkup) -> None: + """Run incoming markup through some parsing process.""" + raise NotImplementedError() + + def prepare_markup( + self, + markup: _RawMarkup, + user_specified_encoding: Optional[_Encoding] = None, + document_declared_encoding: Optional[_Encoding] = None, + exclude_encodings: Optional[_Encodings] = None, + ) -> Iterable[Tuple[_RawMarkup, Optional[_Encoding], Optional[_Encoding], bool]]: + """Run any preliminary steps necessary to make incoming markup + acceptable to the parser. + + :param markup: The markup that's about to be parsed. + :param user_specified_encoding: The user asked to try this encoding + to convert the markup into a Unicode string. + :param document_declared_encoding: The markup itself claims to be + in this encoding. NOTE: This argument is not used by the + calling code and can probably be removed. + :param exclude_encodings: The user asked *not* to try any of + these encodings. + + :yield: A series of 4-tuples: (markup, encoding, declared encoding, + has undergone character replacement) + + Each 4-tuple represents a strategy that the parser can try + to convert the document to Unicode and parse it. Each + strategy will be tried in turn. + + By default, the only strategy is to parse the markup + as-is. See `LXMLTreeBuilderForXML` and + `HTMLParserTreeBuilder` for implementations that take into + account the quirks of particular parsers. + + :meta private: + + """ + yield markup, None, None, False + + def test_fragment_to_document(self, fragment: str) -> str: + """Wrap an HTML fragment to make it look like a document. + + Different parsers do this differently. For instance, lxml + introduces an empty tag, and html5lib + doesn't. Abstracting this away lets us write simple tests + which run HTML fragments through the parser and compare the + results against other HTML fragments. + + This method should not be used outside of unit tests. + + :param fragment: A fragment of HTML. + :return: A full HTML document. + :meta private: + """ + return fragment + + def set_up_substitutions(self, tag: Tag) -> bool: + """Set up any substitutions that will need to be performed on + a `Tag` when it's output as a string. + + By default, this does nothing. See `HTMLTreeBuilder` for a + case where this is used. + + :return: Whether or not a substitution was performed. + :meta private: + """ + return False + + def _replace_cdata_list_attribute_values( + self, tag_name: str, attrs: _RawOrProcessedAttributeValues + ) -> _AttributeValues: + """When an attribute value is associated with a tag that can + have multiple values for that attribute, convert the string + value to a list of strings. + + Basically, replaces class="foo bar" with class=["foo", "bar"] + + NOTE: This method modifies its input in place. + + :param tag_name: The name of a tag. + :param attrs: A dictionary containing the tag's attributes. + Any appropriate attribute values will be modified in place. + :return: The modified dictionary that was originally passed in. + """ + + # First, cast the attrs dict to _AttributeValues. This might + # not be accurate yet, but it will be by the time this method + # returns. + modified_attrs = cast(_AttributeValues, attrs) + if not modified_attrs or not self.cdata_list_attributes: + # Nothing to do. + return modified_attrs + + # There is at least a possibility that we need to modify one of + # the attribute values. + universal: Set[str] = self.cdata_list_attributes.get("*", set()) + tag_specific = self.cdata_list_attributes.get(tag_name.lower(), None) + for attr in list(modified_attrs.keys()): + modified_value: _AttributeValue + if attr in universal or (tag_specific and attr in tag_specific): + # We have a "class"-type attribute whose string + # value is a whitespace-separated list of + # values. Split it into a list. + original_value: _AttributeValue = modified_attrs[attr] + if isinstance(original_value, _RawAttributeValue): + # This is a _RawAttributeValue (a string) that + # needs to be split and converted to a + # AttributeValueList so it can be an + # _AttributeValue. + modified_value = self.attribute_value_list_class( + nonwhitespace_re.findall(original_value) + ) + else: + # html5lib calls setAttributes twice for the + # same tag when rearranging the parse tree. On + # the second call the attribute value here is + # already a list. This can also happen when a + # Tag object is cloned. If this happens, leave + # the value alone rather than trying to split + # it again. + modified_value = original_value + modified_attrs[attr] = modified_value + return modified_attrs + + +class SAXTreeBuilder(TreeBuilder): + """A Beautiful Soup treebuilder that listens for SAX events. + + This is not currently used for anything, and it will be removed + soon. It was a good idea, but it wasn't properly integrated into the + rest of Beautiful Soup, so there have been long stretches where it + hasn't worked properly. + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + warnings.warn( + "The SAXTreeBuilder class was deprecated in 4.13.0 and will be removed soon thereafter. It is completely untested and probably doesn't work; do not use it.", + DeprecationWarning, + stacklevel=2, + ) + super(SAXTreeBuilder, self).__init__(*args, **kwargs) + + def feed(self, markup: _RawMarkup) -> None: + raise NotImplementedError() + + def close(self) -> None: + pass + + def startElement(self, name: str, attrs: Dict[str, str]) -> None: + attrs = AttributeDict((key[1], value) for key, value in list(attrs.items())) + # print("Start %s, %r" % (name, attrs)) + assert self.soup is not None + self.soup.handle_starttag(name, None, None, attrs) + + def endElement(self, name: str) -> None: + # print("End %s" % name) + assert self.soup is not None + self.soup.handle_endtag(name) + + def startElementNS( + self, nsTuple: Tuple[str, str], nodeName: str, attrs: Dict[str, str] + ) -> None: + # Throw away (ns, nodeName) for now. + self.startElement(nodeName, attrs) + + def endElementNS(self, nsTuple: Tuple[str, str], nodeName: str) -> None: + # Throw away (ns, nodeName) for now. + self.endElement(nodeName) + # handler.endElementNS((ns, node.nodeName), node.nodeName) + + def startPrefixMapping(self, prefix: str, nodeValue: str) -> None: + # Ignore the prefix for now. + pass + + def endPrefixMapping(self, prefix: str) -> None: + # Ignore the prefix for now. + # handler.endPrefixMapping(prefix) + pass + + def characters(self, content: str) -> None: + assert self.soup is not None + self.soup.handle_data(content) + + def startDocument(self) -> None: + pass + + def endDocument(self) -> None: + pass + + +class HTMLTreeBuilder(TreeBuilder): + """This TreeBuilder knows facts about HTML, such as which tags are treated + specially by the HTML standard. + """ + + #: Some HTML tags are defined as having no contents. Beautiful Soup + #: treats these specially. + DEFAULT_EMPTY_ELEMENT_TAGS: Optional[Set[str]] = set( + [ + # These are from HTML5. + "area", + "base", + "br", + "col", + "embed", + "hr", + "img", + "input", + "keygen", + "link", + "menuitem", + "meta", + "param", + "source", + "track", + "wbr", + # These are from earlier versions of HTML and are removed in HTML5. + "basefont", + "bgsound", + "command", + "frame", + "image", + "isindex", + "nextid", + "spacer", + ] + ) + + #: The HTML standard defines these tags as block-level elements. Beautiful + #: Soup does not treat these elements differently from other elements, + #: but it may do so eventually, and this information is available if + #: you need to use it. + DEFAULT_BLOCK_ELEMENTS: Set[str] = set( + [ + "address", + "article", + "aside", + "blockquote", + "canvas", + "dd", + "div", + "dl", + "dt", + "fieldset", + "figcaption", + "figure", + "footer", + "form", + "h1", + "h2", + "h3", + "h4", + "h5", + "h6", + "header", + "hr", + "li", + "main", + "nav", + "noscript", + "ol", + "output", + "p", + "pre", + "section", + "table", + "tfoot", + "ul", + "video", + ] + ) + + #: These HTML tags need special treatment so they can be + #: represented by a string class other than `bs4.element.NavigableString`. + #: + #: For some of these tags, it's because the HTML standard defines + #: an unusual content model for them. I made this list by going + #: through the HTML spec + #: (https://html.spec.whatwg.org/#metadata-content) and looking for + #: "metadata content" elements that can contain strings. + #: + #: The Ruby tags ( and ) are here despite being normal + #: "phrasing content" tags, because the content they contain is + #: qualitatively different from other text in the document, and it + #: can be useful to be able to distinguish it. + #: + #: TODO: Arguably

?j9uiX5W6uU@luZ;JpcnNl1K6O9WpT%2CNJrq>t` z+yf_K_i|Y@1mckwqD>SIL3cs#rhxF=?(|flUKm7d0mjv#x|Grps{JBIu(!}Hi=c~R zFXW3f9mL1LUPr}8m@JFiJrSrV>gjMUB@TqlS3!_pBUvNfzS$2S-Tg?SLpDL)r3kYf z7yeC~3_tscYmJ#Scdd*$Mt*;GjOn9lLBjAN57IZT_Tm->bX5E1oUv!^rWKCtoYA*% zU0{ z?e13^_4W&@uw8HSCcdIbwE`Wz!uR$Hceh2mKw$PJCRk9=P>BgVLjWb8M-#f=7Wee0 zgd~`dNuni+Bq(y4v(=HUx{{~B_?+>>gq9hm+Tv~mbcc*DU&mwEsS%vUAe~_5B#fIS zlT-TyKbt*fpJkJ~mktM71fRzokEei+oDioTDoauWn7(iBktvy+LTf5GLfHt0DV2!k z1mZg^Sd6&|a2FMs8ml$e3EqI45Gd=$ce8s)UI2eMQ_Fc>xzT*pxP5UbL-$Ggu->y& z>Os11`Nl&ERy_G&1VO1Wj8e!gCf}pvaodb=EEC!spN5fx2-2dXPslB)Xp3N)J}x9x zu5uAgXx&80bb4Km#60j3kX6+su#J*+pfgN3veWSi?sWc6HgIV0WpvnK6lAO9unQP4 zmNuPS7E$7`s3qqiX1+g(I6?Hld+aaIa-DwB(V6cl*WqpZDEKxeFcWG9MfC#n*)2x`-p>e7mCxej5NKMNj9eC=Ql^Yt60Y z$Ubi_xsk=`+f-^}YZDV}MHbht&}GL_*>MbFVC=T|KzWUO4dg_!Ac@H1sHcH1=|tMh zo4bX>hy3t^$XjIiQgj-|b=b*yQiB3WzDy0psH6{Td5M}YQ}Y@%Z&5=*AXlkzsd1>G zD2#GDnfHLpb(SYIl;_d>2X{aRz(t)gJ({+sZRXmK9mYO$EcU-Ng=!-GUp7mWv!F0L z{Wv|IeNjJMT6!UL06r+&A}k?{jMSmvj5N`@lVV{qg6tqncs=DeHQMN1frC=8>3Px7 z*N)JZA0sLBO&NJepMUz;ifS$$9aNpk1!~SwLk0;aG@4c8vWxy+k#7)ZY~LGe%}yXV z{t~IHdYCD;`R3L;sJ`&uf&4lxo!V$eK&bz(i4&QI&>Zw_{<^wzlaqc+b%z@Y&-G@*n;5s=sIc$rdi)oMuuPMluG!f913P2g90*nE(I) literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/h11/__pycache__/_util.cpython-310.pyc b/.venv/lib/python3.10/site-packages/h11/__pycache__/_util.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..58cee112b7bf19b9ec405f81fa5c05dea08c54ad GIT binary patch literal 3847 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/h11/_abnf.py b/.venv/lib/python3.10/site-packages/h11/_abnf.py new file mode 100644 index 0000000..933587f --- /dev/null +++ b/.venv/lib/python3.10/site-packages/h11/_abnf.py @@ -0,0 +1,132 @@ +# We use native strings for all the re patterns, to take advantage of string +# formatting, and then convert to bytestrings when compiling the final re +# objects. + +# https://svn.tools.ietf.org/svn/wg/httpbis/specs/rfc7230.html#whitespace +# OWS = *( SP / HTAB ) +# ; optional whitespace +OWS = r"[ \t]*" + +# https://svn.tools.ietf.org/svn/wg/httpbis/specs/rfc7230.html#rule.token.separators +# token = 1*tchar +# +# tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" +# / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~" +# / DIGIT / ALPHA +# ; any VCHAR, except delimiters +token = r"[-!#$%&'*+.^_`|~0-9a-zA-Z]+" + +# https://svn.tools.ietf.org/svn/wg/httpbis/specs/rfc7230.html#header.fields +# field-name = token +field_name = token + +# The standard says: +# +# field-value = *( field-content / obs-fold ) +# field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ] +# field-vchar = VCHAR / obs-text +# obs-fold = CRLF 1*( SP / HTAB ) +# ; obsolete line folding +# ; see Section 3.2.4 +# +# https://tools.ietf.org/html/rfc5234#appendix-B.1 +# +# VCHAR = %x21-7E +# ; visible (printing) characters +# +# https://svn.tools.ietf.org/svn/wg/httpbis/specs/rfc7230.html#rule.quoted-string +# obs-text = %x80-FF +# +# However, the standard definition of field-content is WRONG! It disallows +# fields containing a single visible character surrounded by whitespace, +# e.g. "foo a bar". +# +# See: https://www.rfc-editor.org/errata_search.php?rfc=7230&eid=4189 +# +# So our definition of field_content attempts to fix it up... +# +# Also, we allow lots of control characters, because apparently people assume +# that they're legal in practice (e.g., google analytics makes cookies with +# \x01 in them!): +# https://github.com/python-hyper/h11/issues/57 +# We still don't allow NUL or whitespace, because those are often treated as +# meta-characters and letting them through can lead to nasty issues like SSRF. +vchar = r"[\x21-\x7e]" +vchar_or_obs_text = r"[^\x00\s]" +field_vchar = vchar_or_obs_text +field_content = r"{field_vchar}+(?:[ \t]+{field_vchar}+)*".format(**globals()) + +# We handle obs-fold at a different level, and our fixed-up field_content +# already grows to swallow the whole value, so ? instead of * +field_value = r"({field_content})?".format(**globals()) + +# header-field = field-name ":" OWS field-value OWS +header_field = ( + r"(?P{field_name})" + r":" + r"{OWS}" + r"(?P{field_value})" + r"{OWS}".format(**globals()) +) + +# https://svn.tools.ietf.org/svn/wg/httpbis/specs/rfc7230.html#request.line +# +# request-line = method SP request-target SP HTTP-version CRLF +# method = token +# HTTP-version = HTTP-name "/" DIGIT "." DIGIT +# HTTP-name = %x48.54.54.50 ; "HTTP", case-sensitive +# +# request-target is complicated (see RFC 7230 sec 5.3) -- could be path, full +# URL, host+port (for connect), or even "*", but in any case we are guaranteed +# that it contists of the visible printing characters. +method = token +request_target = r"{vchar}+".format(**globals()) +http_version = r"HTTP/(?P[0-9]\.[0-9])" +request_line = ( + r"(?P{method})" + r" " + r"(?P{request_target})" + r" " + r"{http_version}".format(**globals()) +) + +# https://svn.tools.ietf.org/svn/wg/httpbis/specs/rfc7230.html#status.line +# +# status-line = HTTP-version SP status-code SP reason-phrase CRLF +# status-code = 3DIGIT +# reason-phrase = *( HTAB / SP / VCHAR / obs-text ) +status_code = r"[0-9]{3}" +reason_phrase = r"([ \t]|{vchar_or_obs_text})*".format(**globals()) +status_line = ( + r"{http_version}" + r" " + r"(?P{status_code})" + # However, there are apparently a few too many servers out there that just + # leave out the reason phrase: + # https://github.com/scrapy/scrapy/issues/345#issuecomment-281756036 + # https://github.com/seanmonstar/httparse/issues/29 + # so make it optional. ?: is a non-capturing group. + r"(?: (?P{reason_phrase}))?".format(**globals()) +) + +HEXDIG = r"[0-9A-Fa-f]" +# Actually +# +# chunk-size = 1*HEXDIG +# +# but we impose an upper-limit to avoid ridiculosity. len(str(2**64)) == 20 +chunk_size = r"({HEXDIG}){{1,20}}".format(**globals()) +# Actually +# +# chunk-ext = *( ";" chunk-ext-name [ "=" chunk-ext-val ] ) +# +# but we aren't parsing the things so we don't really care. +chunk_ext = r";.*" +chunk_header = ( + r"(?P{chunk_size})" + r"(?P{chunk_ext})?" + r"{OWS}\r\n".format( + **globals() + ) # Even though the specification does not allow for extra whitespaces, + # we are lenient with trailing whitespaces because some servers on the wild use it. +) diff --git a/.venv/lib/python3.10/site-packages/h11/_connection.py b/.venv/lib/python3.10/site-packages/h11/_connection.py new file mode 100644 index 0000000..e37d82a --- /dev/null +++ b/.venv/lib/python3.10/site-packages/h11/_connection.py @@ -0,0 +1,659 @@ +# This contains the main Connection class. Everything in h11 revolves around +# this. +from typing import ( + Any, + Callable, + cast, + Dict, + List, + Optional, + overload, + Tuple, + Type, + Union, +) + +from ._events import ( + ConnectionClosed, + Data, + EndOfMessage, + Event, + InformationalResponse, + Request, + Response, +) +from ._headers import get_comma_header, has_expect_100_continue, set_comma_header +from ._readers import READERS, ReadersType +from ._receivebuffer import ReceiveBuffer +from ._state import ( + _SWITCH_CONNECT, + _SWITCH_UPGRADE, + CLIENT, + ConnectionState, + DONE, + ERROR, + MIGHT_SWITCH_PROTOCOL, + SEND_BODY, + SERVER, + SWITCHED_PROTOCOL, +) +from ._util import ( # Import the internal things we need + LocalProtocolError, + RemoteProtocolError, + Sentinel, +) +from ._writers import WRITERS, WritersType + +# Everything in __all__ gets re-exported as part of the h11 public API. +__all__ = ["Connection", "NEED_DATA", "PAUSED"] + + +class NEED_DATA(Sentinel, metaclass=Sentinel): + pass + + +class PAUSED(Sentinel, metaclass=Sentinel): + pass + + +# If we ever have this much buffered without it making a complete parseable +# event, we error out. The only time we really buffer is when reading the +# request/response line + headers together, so this is effectively the limit on +# the size of that. +# +# Some precedents for defaults: +# - node.js: 80 * 1024 +# - tomcat: 8 * 1024 +# - IIS: 16 * 1024 +# - Apache: <8 KiB per line> +DEFAULT_MAX_INCOMPLETE_EVENT_SIZE = 16 * 1024 + + +# RFC 7230's rules for connection lifecycles: +# - If either side says they want to close the connection, then the connection +# must close. +# - HTTP/1.1 defaults to keep-alive unless someone says Connection: close +# - HTTP/1.0 defaults to close unless both sides say Connection: keep-alive +# (and even this is a mess -- e.g. if you're implementing a proxy then +# sending Connection: keep-alive is forbidden). +# +# We simplify life by simply not supporting keep-alive with HTTP/1.0 peers. So +# our rule is: +# - If someone says Connection: close, we will close +# - If someone uses HTTP/1.0, we will close. +def _keep_alive(event: Union[Request, Response]) -> bool: + connection = get_comma_header(event.headers, b"connection") + if b"close" in connection: + return False + if getattr(event, "http_version", b"1.1") < b"1.1": + return False + return True + + +def _body_framing( + request_method: bytes, event: Union[Request, Response] +) -> Tuple[str, Union[Tuple[()], Tuple[int]]]: + # Called when we enter SEND_BODY to figure out framing information for + # this body. + # + # These are the only two events that can trigger a SEND_BODY state: + assert type(event) in (Request, Response) + # Returns one of: + # + # ("content-length", count) + # ("chunked", ()) + # ("http/1.0", ()) + # + # which are (lookup key, *args) for constructing body reader/writer + # objects. + # + # Reference: https://tools.ietf.org/html/rfc7230#section-3.3.3 + # + # Step 1: some responses always have an empty body, regardless of what the + # headers say. + if type(event) is Response: + if ( + event.status_code in (204, 304) + or request_method == b"HEAD" + or (request_method == b"CONNECT" and 200 <= event.status_code < 300) + ): + return ("content-length", (0,)) + # Section 3.3.3 also lists another case -- responses with status_code + # < 200. For us these are InformationalResponses, not Responses, so + # they can't get into this function in the first place. + assert event.status_code >= 200 + + # Step 2: check for Transfer-Encoding (T-E beats C-L): + transfer_encodings = get_comma_header(event.headers, b"transfer-encoding") + if transfer_encodings: + assert transfer_encodings == [b"chunked"] + return ("chunked", ()) + + # Step 3: check for Content-Length + content_lengths = get_comma_header(event.headers, b"content-length") + if content_lengths: + return ("content-length", (int(content_lengths[0]),)) + + # Step 4: no applicable headers; fallback/default depends on type + if type(event) is Request: + return ("content-length", (0,)) + else: + return ("http/1.0", ()) + + +################################################################ +# +# The main Connection class +# +################################################################ + + +class Connection: + """An object encapsulating the state of an HTTP connection. + + Args: + our_role: If you're implementing a client, pass :data:`h11.CLIENT`. If + you're implementing a server, pass :data:`h11.SERVER`. + + max_incomplete_event_size (int): + The maximum number of bytes we're willing to buffer of an + incomplete event. In practice this mostly sets a limit on the + maximum size of the request/response line + headers. If this is + exceeded, then :meth:`next_event` will raise + :exc:`RemoteProtocolError`. + + """ + + def __init__( + self, + our_role: Type[Sentinel], + max_incomplete_event_size: int = DEFAULT_MAX_INCOMPLETE_EVENT_SIZE, + ) -> None: + self._max_incomplete_event_size = max_incomplete_event_size + # State and role tracking + if our_role not in (CLIENT, SERVER): + raise ValueError(f"expected CLIENT or SERVER, not {our_role!r}") + self.our_role = our_role + self.their_role: Type[Sentinel] + if our_role is CLIENT: + self.their_role = SERVER + else: + self.their_role = CLIENT + self._cstate = ConnectionState() + + # Callables for converting data->events or vice-versa given the + # current state + self._writer = self._get_io_object(self.our_role, None, WRITERS) + self._reader = self._get_io_object(self.their_role, None, READERS) + + # Holds any unprocessed received data + self._receive_buffer = ReceiveBuffer() + # If this is true, then it indicates that the incoming connection was + # closed *after* the end of whatever's in self._receive_buffer: + self._receive_buffer_closed = False + + # Extra bits of state that don't fit into the state machine. + # + # These two are only used to interpret framing headers for figuring + # out how to read/write response bodies. their_http_version is also + # made available as a convenient public API. + self.their_http_version: Optional[bytes] = None + self._request_method: Optional[bytes] = None + # This is pure flow-control and doesn't at all affect the set of legal + # transitions, so no need to bother ConnectionState with it: + self.client_is_waiting_for_100_continue = False + + @property + def states(self) -> Dict[Type[Sentinel], Type[Sentinel]]: + """A dictionary like:: + + {CLIENT: , SERVER: } + + See :ref:`state-machine` for details. + + """ + return dict(self._cstate.states) + + @property + def our_state(self) -> Type[Sentinel]: + """The current state of whichever role we are playing. See + :ref:`state-machine` for details. + """ + return self._cstate.states[self.our_role] + + @property + def their_state(self) -> Type[Sentinel]: + """The current state of whichever role we are NOT playing. See + :ref:`state-machine` for details. + """ + return self._cstate.states[self.their_role] + + @property + def they_are_waiting_for_100_continue(self) -> bool: + return self.their_role is CLIENT and self.client_is_waiting_for_100_continue + + def start_next_cycle(self) -> None: + """Attempt to reset our connection state for a new request/response + cycle. + + If both client and server are in :data:`DONE` state, then resets them + both to :data:`IDLE` state in preparation for a new request/response + cycle on this same connection. Otherwise, raises a + :exc:`LocalProtocolError`. + + See :ref:`keepalive-and-pipelining`. + + """ + old_states = dict(self._cstate.states) + self._cstate.start_next_cycle() + self._request_method = None + # self.their_http_version gets left alone, since it presumably lasts + # beyond a single request/response cycle + assert not self.client_is_waiting_for_100_continue + self._respond_to_state_changes(old_states) + + def _process_error(self, role: Type[Sentinel]) -> None: + old_states = dict(self._cstate.states) + self._cstate.process_error(role) + self._respond_to_state_changes(old_states) + + def _server_switch_event(self, event: Event) -> Optional[Type[Sentinel]]: + if type(event) is InformationalResponse and event.status_code == 101: + return _SWITCH_UPGRADE + if type(event) is Response: + if ( + _SWITCH_CONNECT in self._cstate.pending_switch_proposals + and 200 <= event.status_code < 300 + ): + return _SWITCH_CONNECT + return None + + # All events go through here + def _process_event(self, role: Type[Sentinel], event: Event) -> None: + # First, pass the event through the state machine to make sure it + # succeeds. + old_states = dict(self._cstate.states) + if role is CLIENT and type(event) is Request: + if event.method == b"CONNECT": + self._cstate.process_client_switch_proposal(_SWITCH_CONNECT) + if get_comma_header(event.headers, b"upgrade"): + self._cstate.process_client_switch_proposal(_SWITCH_UPGRADE) + server_switch_event = None + if role is SERVER: + server_switch_event = self._server_switch_event(event) + self._cstate.process_event(role, type(event), server_switch_event) + + # Then perform the updates triggered by it. + + if type(event) is Request: + self._request_method = event.method + + if role is self.their_role and type(event) in ( + Request, + Response, + InformationalResponse, + ): + event = cast(Union[Request, Response, InformationalResponse], event) + self.their_http_version = event.http_version + + # Keep alive handling + # + # RFC 7230 doesn't really say what one should do if Connection: close + # shows up on a 1xx InformationalResponse. I think the idea is that + # this is not supposed to happen. In any case, if it does happen, we + # ignore it. + if type(event) in (Request, Response) and not _keep_alive( + cast(Union[Request, Response], event) + ): + self._cstate.process_keep_alive_disabled() + + # 100-continue + if type(event) is Request and has_expect_100_continue(event): + self.client_is_waiting_for_100_continue = True + if type(event) in (InformationalResponse, Response): + self.client_is_waiting_for_100_continue = False + if role is CLIENT and type(event) in (Data, EndOfMessage): + self.client_is_waiting_for_100_continue = False + + self._respond_to_state_changes(old_states, event) + + def _get_io_object( + self, + role: Type[Sentinel], + event: Optional[Event], + io_dict: Union[ReadersType, WritersType], + ) -> Optional[Callable[..., Any]]: + # event may be None; it's only used when entering SEND_BODY + state = self._cstate.states[role] + if state is SEND_BODY: + # Special case: the io_dict has a dict of reader/writer factories + # that depend on the request/response framing. + framing_type, args = _body_framing( + cast(bytes, self._request_method), cast(Union[Request, Response], event) + ) + return io_dict[SEND_BODY][framing_type](*args) # type: ignore[index] + else: + # General case: the io_dict just has the appropriate reader/writer + # for this state + return io_dict.get((role, state)) # type: ignore[return-value] + + # This must be called after any action that might have caused + # self._cstate.states to change. + def _respond_to_state_changes( + self, + old_states: Dict[Type[Sentinel], Type[Sentinel]], + event: Optional[Event] = None, + ) -> None: + # Update reader/writer + if self.our_state != old_states[self.our_role]: + self._writer = self._get_io_object(self.our_role, event, WRITERS) + if self.their_state != old_states[self.their_role]: + self._reader = self._get_io_object(self.their_role, event, READERS) + + @property + def trailing_data(self) -> Tuple[bytes, bool]: + """Data that has been received, but not yet processed, represented as + a tuple with two elements, where the first is a byte-string containing + the unprocessed data itself, and the second is a bool that is True if + the receive connection was closed. + + See :ref:`switching-protocols` for discussion of why you'd want this. + """ + return (bytes(self._receive_buffer), self._receive_buffer_closed) + + def receive_data(self, data: bytes) -> None: + """Add data to our internal receive buffer. + + This does not actually do any processing on the data, just stores + it. To trigger processing, you have to call :meth:`next_event`. + + Args: + data (:term:`bytes-like object`): + The new data that was just received. + + Special case: If *data* is an empty byte-string like ``b""``, + then this indicates that the remote side has closed the + connection (end of file). Normally this is convenient, because + standard Python APIs like :meth:`file.read` or + :meth:`socket.recv` use ``b""`` to indicate end-of-file, while + other failures to read are indicated using other mechanisms + like raising :exc:`TimeoutError`. When using such an API you + can just blindly pass through whatever you get from ``read`` + to :meth:`receive_data`, and everything will work. + + But, if you have an API where reading an empty string is a + valid non-EOF condition, then you need to be aware of this and + make sure to check for such strings and avoid passing them to + :meth:`receive_data`. + + Returns: + Nothing, but after calling this you should call :meth:`next_event` + to parse the newly received data. + + Raises: + RuntimeError: + Raised if you pass an empty *data*, indicating EOF, and then + pass a non-empty *data*, indicating more data that somehow + arrived after the EOF. + + (Calling ``receive_data(b"")`` multiple times is fine, + and equivalent to calling it once.) + + """ + if data: + if self._receive_buffer_closed: + raise RuntimeError("received close, then received more data?") + self._receive_buffer += data + else: + self._receive_buffer_closed = True + + def _extract_next_receive_event( + self, + ) -> Union[Event, Type[NEED_DATA], Type[PAUSED]]: + state = self.their_state + # We don't pause immediately when they enter DONE, because even in + # DONE state we can still process a ConnectionClosed() event. But + # if we have data in our buffer, then we definitely aren't getting + # a ConnectionClosed() immediately and we need to pause. + if state is DONE and self._receive_buffer: + return PAUSED + if state is MIGHT_SWITCH_PROTOCOL or state is SWITCHED_PROTOCOL: + return PAUSED + assert self._reader is not None + event = self._reader(self._receive_buffer) + if event is None: + if not self._receive_buffer and self._receive_buffer_closed: + # In some unusual cases (basically just HTTP/1.0 bodies), EOF + # triggers an actual protocol event; in that case, we want to + # return that event, and then the state will change and we'll + # get called again to generate the actual ConnectionClosed(). + if hasattr(self._reader, "read_eof"): + event = self._reader.read_eof() + else: + event = ConnectionClosed() + if event is None: + event = NEED_DATA + return event # type: ignore[no-any-return] + + def next_event(self) -> Union[Event, Type[NEED_DATA], Type[PAUSED]]: + """Parse the next event out of our receive buffer, update our internal + state, and return it. + + This is a mutating operation -- think of it like calling :func:`next` + on an iterator. + + Returns: + : One of three things: + + 1) An event object -- see :ref:`events`. + + 2) The special constant :data:`NEED_DATA`, which indicates that + you need to read more data from your socket and pass it to + :meth:`receive_data` before this method will be able to return + any more events. + + 3) The special constant :data:`PAUSED`, which indicates that we + are not in a state where we can process incoming data (usually + because the peer has finished their part of the current + request/response cycle, and you have not yet called + :meth:`start_next_cycle`). See :ref:`flow-control` for details. + + Raises: + RemoteProtocolError: + The peer has misbehaved. You should close the connection + (possibly after sending some kind of 4xx response). + + Once this method returns :class:`ConnectionClosed` once, then all + subsequent calls will also return :class:`ConnectionClosed`. + + If this method raises any exception besides :exc:`RemoteProtocolError` + then that's a bug -- if it happens please file a bug report! + + If this method raises any exception then it also sets + :attr:`Connection.their_state` to :data:`ERROR` -- see + :ref:`error-handling` for discussion. + + """ + + if self.their_state is ERROR: + raise RemoteProtocolError("Can't receive data when peer state is ERROR") + try: + event = self._extract_next_receive_event() + if event not in [NEED_DATA, PAUSED]: + self._process_event(self.their_role, cast(Event, event)) + if event is NEED_DATA: + if len(self._receive_buffer) > self._max_incomplete_event_size: + # 431 is "Request header fields too large" which is pretty + # much the only situation where we can get here + raise RemoteProtocolError( + "Receive buffer too long", error_status_hint=431 + ) + if self._receive_buffer_closed: + # We're still trying to complete some event, but that's + # never going to happen because no more data is coming + raise RemoteProtocolError("peer unexpectedly closed connection") + return event + except BaseException as exc: + self._process_error(self.their_role) + if isinstance(exc, LocalProtocolError): + exc._reraise_as_remote_protocol_error() + else: + raise + + @overload + def send(self, event: ConnectionClosed) -> None: + ... + + @overload + def send( + self, event: Union[Request, InformationalResponse, Response, Data, EndOfMessage] + ) -> bytes: + ... + + @overload + def send(self, event: Event) -> Optional[bytes]: + ... + + def send(self, event: Event) -> Optional[bytes]: + """Convert a high-level event into bytes that can be sent to the peer, + while updating our internal state machine. + + Args: + event: The :ref:`event ` to send. + + Returns: + If ``type(event) is ConnectionClosed``, then returns + ``None``. Otherwise, returns a :term:`bytes-like object`. + + Raises: + LocalProtocolError: + Sending this event at this time would violate our + understanding of the HTTP/1.1 protocol. + + If this method raises any exception then it also sets + :attr:`Connection.our_state` to :data:`ERROR` -- see + :ref:`error-handling` for discussion. + + """ + data_list = self.send_with_data_passthrough(event) + if data_list is None: + return None + else: + return b"".join(data_list) + + def send_with_data_passthrough(self, event: Event) -> Optional[List[bytes]]: + """Identical to :meth:`send`, except that in situations where + :meth:`send` returns a single :term:`bytes-like object`, this instead + returns a list of them -- and when sending a :class:`Data` event, this + list is guaranteed to contain the exact object you passed in as + :attr:`Data.data`. See :ref:`sendfile` for discussion. + + """ + if self.our_state is ERROR: + raise LocalProtocolError("Can't send data when our state is ERROR") + try: + if type(event) is Response: + event = self._clean_up_response_headers_for_sending(event) + # We want to call _process_event before calling the writer, + # because if someone tries to do something invalid then this will + # give a sensible error message, while our writers all just assume + # they will only receive valid events. But, _process_event might + # change self._writer. So we have to do a little dance: + writer = self._writer + self._process_event(self.our_role, event) + if type(event) is ConnectionClosed: + return None + else: + # In any situation where writer is None, process_event should + # have raised ProtocolError + assert writer is not None + data_list: List[bytes] = [] + writer(event, data_list.append) + return data_list + except: + self._process_error(self.our_role) + raise + + def send_failed(self) -> None: + """Notify the state machine that we failed to send the data it gave + us. + + This causes :attr:`Connection.our_state` to immediately become + :data:`ERROR` -- see :ref:`error-handling` for discussion. + + """ + self._process_error(self.our_role) + + # When sending a Response, we take responsibility for a few things: + # + # - Sometimes you MUST set Connection: close. We take care of those + # times. (You can also set it yourself if you want, and if you do then + # we'll respect that and close the connection at the right time. But you + # don't have to worry about that unless you want to.) + # + # - The user has to set Content-Length if they want it. Otherwise, for + # responses that have bodies (e.g. not HEAD), then we will automatically + # select the right mechanism for streaming a body of unknown length, + # which depends on depending on the peer's HTTP version. + # + # This function's *only* responsibility is making sure headers are set up + # right -- everything downstream just looks at the headers. There are no + # side channels. + def _clean_up_response_headers_for_sending(self, response: Response) -> Response: + assert type(response) is Response + + headers = response.headers + need_close = False + + # HEAD requests need some special handling: they always act like they + # have Content-Length: 0, and that's how _body_framing treats + # them. But their headers are supposed to match what we would send if + # the request was a GET. (Technically there is one deviation allowed: + # we're allowed to leave out the framing headers -- see + # https://tools.ietf.org/html/rfc7231#section-4.3.2 . But it's just as + # easy to get them right.) + method_for_choosing_headers = cast(bytes, self._request_method) + if method_for_choosing_headers == b"HEAD": + method_for_choosing_headers = b"GET" + framing_type, _ = _body_framing(method_for_choosing_headers, response) + if framing_type in ("chunked", "http/1.0"): + # This response has a body of unknown length. + # If our peer is HTTP/1.1, we use Transfer-Encoding: chunked + # If our peer is HTTP/1.0, we use no framing headers, and close the + # connection afterwards. + # + # Make sure to clear Content-Length (in principle user could have + # set both and then we ignored Content-Length b/c + # Transfer-Encoding overwrote it -- this would be naughty of them, + # but the HTTP spec says that if our peer does this then we have + # to fix it instead of erroring out, so we'll accord the user the + # same respect). + headers = set_comma_header(headers, b"content-length", []) + if self.their_http_version is None or self.their_http_version < b"1.1": + # Either we never got a valid request and are sending back an + # error (their_http_version is None), so we assume the worst; + # or else we did get a valid HTTP/1.0 request, so we know that + # they don't understand chunked encoding. + headers = set_comma_header(headers, b"transfer-encoding", []) + # This is actually redundant ATM, since currently we + # unconditionally disable keep-alive when talking to HTTP/1.0 + # peers. But let's be defensive just in case we add + # Connection: keep-alive support later: + if self._request_method != b"HEAD": + need_close = True + else: + headers = set_comma_header(headers, b"transfer-encoding", [b"chunked"]) + + if not self._cstate.keep_alive or need_close: + # Make sure Connection: close is set + connection = set(get_comma_header(headers, b"connection")) + connection.discard(b"keep-alive") + connection.add(b"close") + headers = set_comma_header(headers, b"connection", sorted(connection)) + + return Response( + headers=headers, + status_code=response.status_code, + http_version=response.http_version, + reason=response.reason, + ) diff --git a/.venv/lib/python3.10/site-packages/h11/_events.py b/.venv/lib/python3.10/site-packages/h11/_events.py new file mode 100644 index 0000000..ca1c3ad --- /dev/null +++ b/.venv/lib/python3.10/site-packages/h11/_events.py @@ -0,0 +1,369 @@ +# High level events that make up HTTP/1.1 conversations. Loosely inspired by +# the corresponding events in hyper-h2: +# +# http://python-hyper.org/h2/en/stable/api.html#events +# +# Don't subclass these. Stuff will break. + +import re +from abc import ABC +from dataclasses import dataclass +from typing import List, Tuple, Union + +from ._abnf import method, request_target +from ._headers import Headers, normalize_and_validate +from ._util import bytesify, LocalProtocolError, validate + +# Everything in __all__ gets re-exported as part of the h11 public API. +__all__ = [ + "Event", + "Request", + "InformationalResponse", + "Response", + "Data", + "EndOfMessage", + "ConnectionClosed", +] + +method_re = re.compile(method.encode("ascii")) +request_target_re = re.compile(request_target.encode("ascii")) + + +class Event(ABC): + """ + Base class for h11 events. + """ + + __slots__ = () + + +@dataclass(init=False, frozen=True) +class Request(Event): + """The beginning of an HTTP request. + + Fields: + + .. attribute:: method + + An HTTP method, e.g. ``b"GET"`` or ``b"POST"``. Always a byte + string. :term:`Bytes-like objects ` and native + strings containing only ascii characters will be automatically + converted to byte strings. + + .. attribute:: target + + The target of an HTTP request, e.g. ``b"/index.html"``, or one of the + more exotic formats described in `RFC 7320, section 5.3 + `_. Always a byte + string. :term:`Bytes-like objects ` and native + strings containing only ascii characters will be automatically + converted to byte strings. + + .. attribute:: headers + + Request headers, represented as a list of (name, value) pairs. See + :ref:`the header normalization rules ` for details. + + .. attribute:: http_version + + The HTTP protocol version, represented as a byte string like + ``b"1.1"``. See :ref:`the HTTP version normalization rules + ` for details. + + """ + + __slots__ = ("method", "headers", "target", "http_version") + + method: bytes + headers: Headers + target: bytes + http_version: bytes + + def __init__( + self, + *, + method: Union[bytes, str], + headers: Union[Headers, List[Tuple[bytes, bytes]], List[Tuple[str, str]]], + target: Union[bytes, str], + http_version: Union[bytes, str] = b"1.1", + _parsed: bool = False, + ) -> None: + super().__init__() + if isinstance(headers, Headers): + object.__setattr__(self, "headers", headers) + else: + object.__setattr__( + self, "headers", normalize_and_validate(headers, _parsed=_parsed) + ) + if not _parsed: + object.__setattr__(self, "method", bytesify(method)) + object.__setattr__(self, "target", bytesify(target)) + object.__setattr__(self, "http_version", bytesify(http_version)) + else: + object.__setattr__(self, "method", method) + object.__setattr__(self, "target", target) + object.__setattr__(self, "http_version", http_version) + + # "A server MUST respond with a 400 (Bad Request) status code to any + # HTTP/1.1 request message that lacks a Host header field and to any + # request message that contains more than one Host header field or a + # Host header field with an invalid field-value." + # -- https://tools.ietf.org/html/rfc7230#section-5.4 + host_count = 0 + for name, value in self.headers: + if name == b"host": + host_count += 1 + if self.http_version == b"1.1" and host_count == 0: + raise LocalProtocolError("Missing mandatory Host: header") + if host_count > 1: + raise LocalProtocolError("Found multiple Host: headers") + + validate(method_re, self.method, "Illegal method characters") + validate(request_target_re, self.target, "Illegal target characters") + + # This is an unhashable type. + __hash__ = None # type: ignore + + +@dataclass(init=False, frozen=True) +class _ResponseBase(Event): + __slots__ = ("headers", "http_version", "reason", "status_code") + + headers: Headers + http_version: bytes + reason: bytes + status_code: int + + def __init__( + self, + *, + headers: Union[Headers, List[Tuple[bytes, bytes]], List[Tuple[str, str]]], + status_code: int, + http_version: Union[bytes, str] = b"1.1", + reason: Union[bytes, str] = b"", + _parsed: bool = False, + ) -> None: + super().__init__() + if isinstance(headers, Headers): + object.__setattr__(self, "headers", headers) + else: + object.__setattr__( + self, "headers", normalize_and_validate(headers, _parsed=_parsed) + ) + if not _parsed: + object.__setattr__(self, "reason", bytesify(reason)) + object.__setattr__(self, "http_version", bytesify(http_version)) + if not isinstance(status_code, int): + raise LocalProtocolError("status code must be integer") + # Because IntEnum objects are instances of int, but aren't + # duck-compatible (sigh), see gh-72. + object.__setattr__(self, "status_code", int(status_code)) + else: + object.__setattr__(self, "reason", reason) + object.__setattr__(self, "http_version", http_version) + object.__setattr__(self, "status_code", status_code) + + self.__post_init__() + + def __post_init__(self) -> None: + pass + + # This is an unhashable type. + __hash__ = None # type: ignore + + +@dataclass(init=False, frozen=True) +class InformationalResponse(_ResponseBase): + """An HTTP informational response. + + Fields: + + .. attribute:: status_code + + The status code of this response, as an integer. For an + :class:`InformationalResponse`, this is always in the range [100, + 200). + + .. attribute:: headers + + Request headers, represented as a list of (name, value) pairs. See + :ref:`the header normalization rules ` for + details. + + .. attribute:: http_version + + The HTTP protocol version, represented as a byte string like + ``b"1.1"``. See :ref:`the HTTP version normalization rules + ` for details. + + .. attribute:: reason + + The reason phrase of this response, as a byte string. For example: + ``b"OK"``, or ``b"Not Found"``. + + """ + + def __post_init__(self) -> None: + if not (100 <= self.status_code < 200): + raise LocalProtocolError( + "InformationalResponse status_code should be in range " + "[100, 200), not {}".format(self.status_code) + ) + + # This is an unhashable type. + __hash__ = None # type: ignore + + +@dataclass(init=False, frozen=True) +class Response(_ResponseBase): + """The beginning of an HTTP response. + + Fields: + + .. attribute:: status_code + + The status code of this response, as an integer. For an + :class:`Response`, this is always in the range [200, + 1000). + + .. attribute:: headers + + Request headers, represented as a list of (name, value) pairs. See + :ref:`the header normalization rules ` for details. + + .. attribute:: http_version + + The HTTP protocol version, represented as a byte string like + ``b"1.1"``. See :ref:`the HTTP version normalization rules + ` for details. + + .. attribute:: reason + + The reason phrase of this response, as a byte string. For example: + ``b"OK"``, or ``b"Not Found"``. + + """ + + def __post_init__(self) -> None: + if not (200 <= self.status_code < 1000): + raise LocalProtocolError( + "Response status_code should be in range [200, 1000), not {}".format( + self.status_code + ) + ) + + # This is an unhashable type. + __hash__ = None # type: ignore + + +@dataclass(init=False, frozen=True) +class Data(Event): + """Part of an HTTP message body. + + Fields: + + .. attribute:: data + + A :term:`bytes-like object` containing part of a message body. Or, if + using the ``combine=False`` argument to :meth:`Connection.send`, then + any object that your socket writing code knows what to do with, and for + which calling :func:`len` returns the number of bytes that will be + written -- see :ref:`sendfile` for details. + + .. attribute:: chunk_start + + A marker that indicates whether this data object is from the start of a + chunked transfer encoding chunk. This field is ignored when when a Data + event is provided to :meth:`Connection.send`: it is only valid on + events emitted from :meth:`Connection.next_event`. You probably + shouldn't use this attribute at all; see + :ref:`chunk-delimiters-are-bad` for details. + + .. attribute:: chunk_end + + A marker that indicates whether this data object is the last for a + given chunked transfer encoding chunk. This field is ignored when when + a Data event is provided to :meth:`Connection.send`: it is only valid + on events emitted from :meth:`Connection.next_event`. You probably + shouldn't use this attribute at all; see + :ref:`chunk-delimiters-are-bad` for details. + + """ + + __slots__ = ("data", "chunk_start", "chunk_end") + + data: bytes + chunk_start: bool + chunk_end: bool + + def __init__( + self, data: bytes, chunk_start: bool = False, chunk_end: bool = False + ) -> None: + object.__setattr__(self, "data", data) + object.__setattr__(self, "chunk_start", chunk_start) + object.__setattr__(self, "chunk_end", chunk_end) + + # This is an unhashable type. + __hash__ = None # type: ignore + + +# XX FIXME: "A recipient MUST ignore (or consider as an error) any fields that +# are forbidden to be sent in a trailer, since processing them as if they were +# present in the header section might bypass external security filters." +# https://svn.tools.ietf.org/svn/wg/httpbis/specs/rfc7230.html#chunked.trailer.part +# Unfortunately, the list of forbidden fields is long and vague :-/ +@dataclass(init=False, frozen=True) +class EndOfMessage(Event): + """The end of an HTTP message. + + Fields: + + .. attribute:: headers + + Default value: ``[]`` + + Any trailing headers attached to this message, represented as a list of + (name, value) pairs. See :ref:`the header normalization rules + ` for details. + + Must be empty unless ``Transfer-Encoding: chunked`` is in use. + + """ + + __slots__ = ("headers",) + + headers: Headers + + def __init__( + self, + *, + headers: Union[ + Headers, List[Tuple[bytes, bytes]], List[Tuple[str, str]], None + ] = None, + _parsed: bool = False, + ) -> None: + super().__init__() + if headers is None: + headers = Headers([]) + elif not isinstance(headers, Headers): + headers = normalize_and_validate(headers, _parsed=_parsed) + + object.__setattr__(self, "headers", headers) + + # This is an unhashable type. + __hash__ = None # type: ignore + + +@dataclass(frozen=True) +class ConnectionClosed(Event): + """This event indicates that the sender has closed their outgoing + connection. + + Note that this does not necessarily mean that they can't *receive* further + data, because TCP connections are composed to two one-way channels which + can be closed independently. See :ref:`closing` for details. + + No fields. + """ + + pass diff --git a/.venv/lib/python3.10/site-packages/h11/_headers.py b/.venv/lib/python3.10/site-packages/h11/_headers.py new file mode 100644 index 0000000..31da3e2 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/h11/_headers.py @@ -0,0 +1,282 @@ +import re +from typing import AnyStr, cast, List, overload, Sequence, Tuple, TYPE_CHECKING, Union + +from ._abnf import field_name, field_value +from ._util import bytesify, LocalProtocolError, validate + +if TYPE_CHECKING: + from ._events import Request + +try: + from typing import Literal +except ImportError: + from typing_extensions import Literal # type: ignore + +CONTENT_LENGTH_MAX_DIGITS = 20 # allow up to 1 billion TB - 1 + + +# Facts +# ----- +# +# Headers are: +# keys: case-insensitive ascii +# values: mixture of ascii and raw bytes +# +# "Historically, HTTP has allowed field content with text in the ISO-8859-1 +# charset [ISO-8859-1], supporting other charsets only through use of +# [RFC2047] encoding. In practice, most HTTP header field values use only a +# subset of the US-ASCII charset [USASCII]. Newly defined header fields SHOULD +# limit their field values to US-ASCII octets. A recipient SHOULD treat other +# octets in field content (obs-text) as opaque data." +# And it deprecates all non-ascii values +# +# Leading/trailing whitespace in header names is forbidden +# +# Values get leading/trailing whitespace stripped +# +# Content-Disposition actually needs to contain unicode semantically; to +# accomplish this it has a terrifically weird way of encoding the filename +# itself as ascii (and even this still has lots of cross-browser +# incompatibilities) +# +# Order is important: +# "a proxy MUST NOT change the order of these field values when forwarding a +# message" +# (and there are several headers where the order indicates a preference) +# +# Multiple occurences of the same header: +# "A sender MUST NOT generate multiple header fields with the same field name +# in a message unless either the entire field value for that header field is +# defined as a comma-separated list [or the header is Set-Cookie which gets a +# special exception]" - RFC 7230. (cookies are in RFC 6265) +# +# So every header aside from Set-Cookie can be merged by b", ".join if it +# occurs repeatedly. But, of course, they can't necessarily be split by +# .split(b","), because quoting. +# +# Given all this mess (case insensitive, duplicates allowed, order is +# important, ...), there doesn't appear to be any standard way to handle +# headers in Python -- they're almost like dicts, but... actually just +# aren't. For now we punt and just use a super simple representation: headers +# are a list of pairs +# +# [(name1, value1), (name2, value2), ...] +# +# where all entries are bytestrings, names are lowercase and have no +# leading/trailing whitespace, and values are bytestrings with no +# leading/trailing whitespace. Searching and updating are done via naive O(n) +# methods. +# +# Maybe a dict-of-lists would be better? + +_content_length_re = re.compile(rb"[0-9]+") +_field_name_re = re.compile(field_name.encode("ascii")) +_field_value_re = re.compile(field_value.encode("ascii")) + + +class Headers(Sequence[Tuple[bytes, bytes]]): + """ + A list-like interface that allows iterating over headers as byte-pairs + of (lowercased-name, value). + + Internally we actually store the representation as three-tuples, + including both the raw original casing, in order to preserve casing + over-the-wire, and the lowercased name, for case-insensitive comparisions. + + r = Request( + method="GET", + target="/", + headers=[("Host", "example.org"), ("Connection", "keep-alive")], + http_version="1.1", + ) + assert r.headers == [ + (b"host", b"example.org"), + (b"connection", b"keep-alive") + ] + assert r.headers.raw_items() == [ + (b"Host", b"example.org"), + (b"Connection", b"keep-alive") + ] + """ + + __slots__ = "_full_items" + + def __init__(self, full_items: List[Tuple[bytes, bytes, bytes]]) -> None: + self._full_items = full_items + + def __bool__(self) -> bool: + return bool(self._full_items) + + def __eq__(self, other: object) -> bool: + return list(self) == list(other) # type: ignore + + def __len__(self) -> int: + return len(self._full_items) + + def __repr__(self) -> str: + return "" % repr(list(self)) + + def __getitem__(self, idx: int) -> Tuple[bytes, bytes]: # type: ignore[override] + _, name, value = self._full_items[idx] + return (name, value) + + def raw_items(self) -> List[Tuple[bytes, bytes]]: + return [(raw_name, value) for raw_name, _, value in self._full_items] + + +HeaderTypes = Union[ + List[Tuple[bytes, bytes]], + List[Tuple[bytes, str]], + List[Tuple[str, bytes]], + List[Tuple[str, str]], +] + + +@overload +def normalize_and_validate(headers: Headers, _parsed: Literal[True]) -> Headers: + ... + + +@overload +def normalize_and_validate(headers: HeaderTypes, _parsed: Literal[False]) -> Headers: + ... + + +@overload +def normalize_and_validate( + headers: Union[Headers, HeaderTypes], _parsed: bool = False +) -> Headers: + ... + + +def normalize_and_validate( + headers: Union[Headers, HeaderTypes], _parsed: bool = False +) -> Headers: + new_headers = [] + seen_content_length = None + saw_transfer_encoding = False + for name, value in headers: + # For headers coming out of the parser, we can safely skip some steps, + # because it always returns bytes and has already run these regexes + # over the data: + if not _parsed: + name = bytesify(name) + value = bytesify(value) + validate(_field_name_re, name, "Illegal header name {!r}", name) + validate(_field_value_re, value, "Illegal header value {!r}", value) + assert isinstance(name, bytes) + assert isinstance(value, bytes) + + raw_name = name + name = name.lower() + if name == b"content-length": + lengths = {length.strip() for length in value.split(b",")} + if len(lengths) != 1: + raise LocalProtocolError("conflicting Content-Length headers") + value = lengths.pop() + validate(_content_length_re, value, "bad Content-Length") + if len(value) > CONTENT_LENGTH_MAX_DIGITS: + raise LocalProtocolError("bad Content-Length") + if seen_content_length is None: + seen_content_length = value + new_headers.append((raw_name, name, value)) + elif seen_content_length != value: + raise LocalProtocolError("conflicting Content-Length headers") + elif name == b"transfer-encoding": + # "A server that receives a request message with a transfer coding + # it does not understand SHOULD respond with 501 (Not + # Implemented)." + # https://tools.ietf.org/html/rfc7230#section-3.3.1 + if saw_transfer_encoding: + raise LocalProtocolError( + "multiple Transfer-Encoding headers", error_status_hint=501 + ) + # "All transfer-coding names are case-insensitive" + # -- https://tools.ietf.org/html/rfc7230#section-4 + value = value.lower() + if value != b"chunked": + raise LocalProtocolError( + "Only Transfer-Encoding: chunked is supported", + error_status_hint=501, + ) + saw_transfer_encoding = True + new_headers.append((raw_name, name, value)) + else: + new_headers.append((raw_name, name, value)) + return Headers(new_headers) + + +def get_comma_header(headers: Headers, name: bytes) -> List[bytes]: + # Should only be used for headers whose value is a list of + # comma-separated, case-insensitive values. + # + # The header name `name` is expected to be lower-case bytes. + # + # Connection: meets these criteria (including cast insensitivity). + # + # Content-Length: technically is just a single value (1*DIGIT), but the + # standard makes reference to implementations that do multiple values, and + # using this doesn't hurt. Ditto, case insensitivity doesn't things either + # way. + # + # Transfer-Encoding: is more complex (allows for quoted strings), so + # splitting on , is actually wrong. For example, this is legal: + # + # Transfer-Encoding: foo; options="1,2", chunked + # + # and should be parsed as + # + # foo; options="1,2" + # chunked + # + # but this naive function will parse it as + # + # foo; options="1 + # 2" + # chunked + # + # However, this is okay because the only thing we are going to do with + # any Transfer-Encoding is reject ones that aren't just "chunked", so + # both of these will be treated the same anyway. + # + # Expect: the only legal value is the literal string + # "100-continue". Splitting on commas is harmless. Case insensitive. + # + out: List[bytes] = [] + for _, found_name, found_raw_value in headers._full_items: + if found_name == name: + found_raw_value = found_raw_value.lower() + for found_split_value in found_raw_value.split(b","): + found_split_value = found_split_value.strip() + if found_split_value: + out.append(found_split_value) + return out + + +def set_comma_header(headers: Headers, name: bytes, new_values: List[bytes]) -> Headers: + # The header name `name` is expected to be lower-case bytes. + # + # Note that when we store the header we use title casing for the header + # names, in order to match the conventional HTTP header style. + # + # Simply calling `.title()` is a blunt approach, but it's correct + # here given the cases where we're using `set_comma_header`... + # + # Connection, Content-Length, Transfer-Encoding. + new_headers: List[Tuple[bytes, bytes]] = [] + for found_raw_name, found_name, found_raw_value in headers._full_items: + if found_name != name: + new_headers.append((found_raw_name, found_raw_value)) + for new_value in new_values: + new_headers.append((name.title(), new_value)) + return normalize_and_validate(new_headers) + + +def has_expect_100_continue(request: "Request") -> bool: + # https://tools.ietf.org/html/rfc7231#section-5.1.1 + # "A server that receives a 100-continue expectation in an HTTP/1.0 request + # MUST ignore that expectation." + if request.http_version < b"1.1": + return False + expect = get_comma_header(request.headers, b"expect") + return b"100-continue" in expect diff --git a/.venv/lib/python3.10/site-packages/h11/_readers.py b/.venv/lib/python3.10/site-packages/h11/_readers.py new file mode 100644 index 0000000..576804c --- /dev/null +++ b/.venv/lib/python3.10/site-packages/h11/_readers.py @@ -0,0 +1,250 @@ +# Code to read HTTP data +# +# Strategy: each reader is a callable which takes a ReceiveBuffer object, and +# either: +# 1) consumes some of it and returns an Event +# 2) raises a LocalProtocolError (for consistency -- e.g. we call validate() +# and it might raise a LocalProtocolError, so simpler just to always use +# this) +# 3) returns None, meaning "I need more data" +# +# If they have a .read_eof attribute, then this will be called if an EOF is +# received -- but this is optional. Either way, the actual ConnectionClosed +# event will be generated afterwards. +# +# READERS is a dict describing how to pick a reader. It maps states to either: +# - a reader +# - or, for body readers, a dict of per-framing reader factories + +import re +from typing import Any, Callable, Dict, Iterable, NoReturn, Optional, Tuple, Type, Union + +from ._abnf import chunk_header, header_field, request_line, status_line +from ._events import Data, EndOfMessage, InformationalResponse, Request, Response +from ._receivebuffer import ReceiveBuffer +from ._state import ( + CLIENT, + CLOSED, + DONE, + IDLE, + MUST_CLOSE, + SEND_BODY, + SEND_RESPONSE, + SERVER, +) +from ._util import LocalProtocolError, RemoteProtocolError, Sentinel, validate + +__all__ = ["READERS"] + +header_field_re = re.compile(header_field.encode("ascii")) +obs_fold_re = re.compile(rb"[ \t]+") + + +def _obsolete_line_fold(lines: Iterable[bytes]) -> Iterable[bytes]: + it = iter(lines) + last: Optional[bytes] = None + for line in it: + match = obs_fold_re.match(line) + if match: + if last is None: + raise LocalProtocolError("continuation line at start of headers") + if not isinstance(last, bytearray): + # Cast to a mutable type, avoiding copy on append to ensure O(n) time + last = bytearray(last) + last += b" " + last += line[match.end() :] + else: + if last is not None: + yield last + last = line + if last is not None: + yield last + + +def _decode_header_lines( + lines: Iterable[bytes], +) -> Iterable[Tuple[bytes, bytes]]: + for line in _obsolete_line_fold(lines): + matches = validate(header_field_re, line, "illegal header line: {!r}", line) + yield (matches["field_name"], matches["field_value"]) + + +request_line_re = re.compile(request_line.encode("ascii")) + + +def maybe_read_from_IDLE_client(buf: ReceiveBuffer) -> Optional[Request]: + lines = buf.maybe_extract_lines() + if lines is None: + if buf.is_next_line_obviously_invalid_request_line(): + raise LocalProtocolError("illegal request line") + return None + if not lines: + raise LocalProtocolError("no request line received") + matches = validate( + request_line_re, lines[0], "illegal request line: {!r}", lines[0] + ) + return Request( + headers=list(_decode_header_lines(lines[1:])), _parsed=True, **matches + ) + + +status_line_re = re.compile(status_line.encode("ascii")) + + +def maybe_read_from_SEND_RESPONSE_server( + buf: ReceiveBuffer, +) -> Union[InformationalResponse, Response, None]: + lines = buf.maybe_extract_lines() + if lines is None: + if buf.is_next_line_obviously_invalid_request_line(): + raise LocalProtocolError("illegal request line") + return None + if not lines: + raise LocalProtocolError("no response line received") + matches = validate(status_line_re, lines[0], "illegal status line: {!r}", lines[0]) + http_version = ( + b"1.1" if matches["http_version"] is None else matches["http_version"] + ) + reason = b"" if matches["reason"] is None else matches["reason"] + status_code = int(matches["status_code"]) + class_: Union[Type[InformationalResponse], Type[Response]] = ( + InformationalResponse if status_code < 200 else Response + ) + return class_( + headers=list(_decode_header_lines(lines[1:])), + _parsed=True, + status_code=status_code, + reason=reason, + http_version=http_version, + ) + + +class ContentLengthReader: + def __init__(self, length: int) -> None: + self._length = length + self._remaining = length + + def __call__(self, buf: ReceiveBuffer) -> Union[Data, EndOfMessage, None]: + if self._remaining == 0: + return EndOfMessage() + data = buf.maybe_extract_at_most(self._remaining) + if data is None: + return None + self._remaining -= len(data) + return Data(data=data) + + def read_eof(self) -> NoReturn: + raise RemoteProtocolError( + "peer closed connection without sending complete message body " + "(received {} bytes, expected {})".format( + self._length - self._remaining, self._length + ) + ) + + +chunk_header_re = re.compile(chunk_header.encode("ascii")) + + +class ChunkedReader: + def __init__(self) -> None: + self._bytes_in_chunk = 0 + # After reading a chunk, we have to throw away the trailing \r\n. + # This tracks the bytes that we need to match and throw away. + self._bytes_to_discard = b"" + self._reading_trailer = False + + def __call__(self, buf: ReceiveBuffer) -> Union[Data, EndOfMessage, None]: + if self._reading_trailer: + lines = buf.maybe_extract_lines() + if lines is None: + return None + return EndOfMessage(headers=list(_decode_header_lines(lines))) + if self._bytes_to_discard: + data = buf.maybe_extract_at_most(len(self._bytes_to_discard)) + if data is None: + return None + if data != self._bytes_to_discard[: len(data)]: + raise LocalProtocolError( + f"malformed chunk footer: {data!r} (expected {self._bytes_to_discard!r})" + ) + self._bytes_to_discard = self._bytes_to_discard[len(data) :] + if self._bytes_to_discard: + return None + # else, fall through and read some more + assert self._bytes_to_discard == b"" + if self._bytes_in_chunk == 0: + # We need to refill our chunk count + chunk_header = buf.maybe_extract_next_line() + if chunk_header is None: + return None + matches = validate( + chunk_header_re, + chunk_header, + "illegal chunk header: {!r}", + chunk_header, + ) + # XX FIXME: we discard chunk extensions. Does anyone care? + self._bytes_in_chunk = int(matches["chunk_size"], base=16) + if self._bytes_in_chunk == 0: + self._reading_trailer = True + return self(buf) + chunk_start = True + else: + chunk_start = False + assert self._bytes_in_chunk > 0 + data = buf.maybe_extract_at_most(self._bytes_in_chunk) + if data is None: + return None + self._bytes_in_chunk -= len(data) + if self._bytes_in_chunk == 0: + self._bytes_to_discard = b"\r\n" + chunk_end = True + else: + chunk_end = False + return Data(data=data, chunk_start=chunk_start, chunk_end=chunk_end) + + def read_eof(self) -> NoReturn: + raise RemoteProtocolError( + "peer closed connection without sending complete message body " + "(incomplete chunked read)" + ) + + +class Http10Reader: + def __call__(self, buf: ReceiveBuffer) -> Optional[Data]: + data = buf.maybe_extract_at_most(999999999) + if data is None: + return None + return Data(data=data) + + def read_eof(self) -> EndOfMessage: + return EndOfMessage() + + +def expect_nothing(buf: ReceiveBuffer) -> None: + if buf: + raise LocalProtocolError("Got data when expecting EOF") + return None + + +ReadersType = Dict[ + Union[Type[Sentinel], Tuple[Type[Sentinel], Type[Sentinel]]], + Union[Callable[..., Any], Dict[str, Callable[..., Any]]], +] + +READERS: ReadersType = { + (CLIENT, IDLE): maybe_read_from_IDLE_client, + (SERVER, IDLE): maybe_read_from_SEND_RESPONSE_server, + (SERVER, SEND_RESPONSE): maybe_read_from_SEND_RESPONSE_server, + (CLIENT, DONE): expect_nothing, + (CLIENT, MUST_CLOSE): expect_nothing, + (CLIENT, CLOSED): expect_nothing, + (SERVER, DONE): expect_nothing, + (SERVER, MUST_CLOSE): expect_nothing, + (SERVER, CLOSED): expect_nothing, + SEND_BODY: { + "chunked": ChunkedReader, + "content-length": ContentLengthReader, + "http/1.0": Http10Reader, + }, +} diff --git a/.venv/lib/python3.10/site-packages/h11/_receivebuffer.py b/.venv/lib/python3.10/site-packages/h11/_receivebuffer.py new file mode 100644 index 0000000..e5c4e08 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/h11/_receivebuffer.py @@ -0,0 +1,153 @@ +import re +import sys +from typing import List, Optional, Union + +__all__ = ["ReceiveBuffer"] + + +# Operations we want to support: +# - find next \r\n or \r\n\r\n (\n or \n\n are also acceptable), +# or wait until there is one +# - read at-most-N bytes +# Goals: +# - on average, do this fast +# - worst case, do this in O(n) where n is the number of bytes processed +# Plan: +# - store bytearray, offset, how far we've searched for a separator token +# - use the how-far-we've-searched data to avoid rescanning +# - while doing a stream of uninterrupted processing, advance offset instead +# of constantly copying +# WARNING: +# - I haven't benchmarked or profiled any of this yet. +# +# Note that starting in Python 3.4, deleting the initial n bytes from a +# bytearray is amortized O(n), thanks to some excellent work by Antoine +# Martin: +# +# https://bugs.python.org/issue19087 +# +# This means that if we only supported 3.4+, we could get rid of the code here +# involving self._start and self.compress, because it's doing exactly the same +# thing that bytearray now does internally. +# +# BUT unfortunately, we still support 2.7, and reading short segments out of a +# long buffer MUST be O(bytes read) to avoid DoS issues, so we can't actually +# delete this code. Yet: +# +# https://pythonclock.org/ +# +# (Two things to double-check first though: make sure PyPy also has the +# optimization, and benchmark to make sure it's a win, since we do have a +# slightly clever thing where we delay calling compress() until we've +# processed a whole event, which could in theory be slightly more efficient +# than the internal bytearray support.) +blank_line_regex = re.compile(b"\n\r?\n", re.MULTILINE) + + +class ReceiveBuffer: + def __init__(self) -> None: + self._data = bytearray() + self._next_line_search = 0 + self._multiple_lines_search = 0 + + def __iadd__(self, byteslike: Union[bytes, bytearray]) -> "ReceiveBuffer": + self._data += byteslike + return self + + def __bool__(self) -> bool: + return bool(len(self)) + + def __len__(self) -> int: + return len(self._data) + + # for @property unprocessed_data + def __bytes__(self) -> bytes: + return bytes(self._data) + + def _extract(self, count: int) -> bytearray: + # extracting an initial slice of the data buffer and return it + out = self._data[:count] + del self._data[:count] + + self._next_line_search = 0 + self._multiple_lines_search = 0 + + return out + + def maybe_extract_at_most(self, count: int) -> Optional[bytearray]: + """ + Extract a fixed number of bytes from the buffer. + """ + out = self._data[:count] + if not out: + return None + + return self._extract(count) + + def maybe_extract_next_line(self) -> Optional[bytearray]: + """ + Extract the first line, if it is completed in the buffer. + """ + # Only search in buffer space that we've not already looked at. + search_start_index = max(0, self._next_line_search - 1) + partial_idx = self._data.find(b"\r\n", search_start_index) + + if partial_idx == -1: + self._next_line_search = len(self._data) + return None + + # + 2 is to compensate len(b"\r\n") + idx = partial_idx + 2 + + return self._extract(idx) + + def maybe_extract_lines(self) -> Optional[List[bytearray]]: + """ + Extract everything up to the first blank line, and return a list of lines. + """ + # Handle the case where we have an immediate empty line. + if self._data[:1] == b"\n": + self._extract(1) + return [] + + if self._data[:2] == b"\r\n": + self._extract(2) + return [] + + # Only search in buffer space that we've not already looked at. + match = blank_line_regex.search(self._data, self._multiple_lines_search) + if match is None: + self._multiple_lines_search = max(0, len(self._data) - 2) + return None + + # Truncate the buffer and return it. + idx = match.span(0)[-1] + out = self._extract(idx) + lines = out.split(b"\n") + + for line in lines: + if line.endswith(b"\r"): + del line[-1] + + assert lines[-2] == lines[-1] == b"" + + del lines[-2:] + + return lines + + # In theory we should wait until `\r\n` before starting to validate + # incoming data. However it's interesting to detect (very) invalid data + # early given they might not even contain `\r\n` at all (hence only + # timeout will get rid of them). + # This is not a 100% effective detection but more of a cheap sanity check + # allowing for early abort in some useful cases. + # This is especially interesting when peer is messing up with HTTPS and + # sent us a TLS stream where we were expecting plain HTTP given all + # versions of TLS so far start handshake with a 0x16 message type code. + def is_next_line_obviously_invalid_request_line(self) -> bool: + try: + # HTTP header line must not contain non-printable characters + # and should not start with a space + return self._data[0] < 0x21 + except IndexError: + return False diff --git a/.venv/lib/python3.10/site-packages/h11/_state.py b/.venv/lib/python3.10/site-packages/h11/_state.py new file mode 100644 index 0000000..3ad444b --- /dev/null +++ b/.venv/lib/python3.10/site-packages/h11/_state.py @@ -0,0 +1,365 @@ +################################################################ +# The core state machine +################################################################ +# +# Rule 1: everything that affects the state machine and state transitions must +# live here in this file. As much as possible goes into the table-based +# representation, but for the bits that don't quite fit, the actual code and +# state must nonetheless live here. +# +# Rule 2: this file does not know about what role we're playing; it only knows +# about HTTP request/response cycles in the abstract. This ensures that we +# don't cheat and apply different rules to local and remote parties. +# +# +# Theory of operation +# =================== +# +# Possibly the simplest way to think about this is that we actually have 5 +# different state machines here. Yes, 5. These are: +# +# 1) The client state, with its complicated automaton (see the docs) +# 2) The server state, with its complicated automaton (see the docs) +# 3) The keep-alive state, with possible states {True, False} +# 4) The SWITCH_CONNECT state, with possible states {False, True} +# 5) The SWITCH_UPGRADE state, with possible states {False, True} +# +# For (3)-(5), the first state listed is the initial state. +# +# (1)-(3) are stored explicitly in member variables. The last +# two are stored implicitly in the pending_switch_proposals set as: +# (state of 4) == (_SWITCH_CONNECT in pending_switch_proposals) +# (state of 5) == (_SWITCH_UPGRADE in pending_switch_proposals) +# +# And each of these machines has two different kinds of transitions: +# +# a) Event-triggered +# b) State-triggered +# +# Event triggered is the obvious thing that you'd think it is: some event +# happens, and if it's the right event at the right time then a transition +# happens. But there are somewhat complicated rules for which machines can +# "see" which events. (As a rule of thumb, if a machine "sees" an event, this +# means two things: the event can affect the machine, and if the machine is +# not in a state where it expects that event then it's an error.) These rules +# are: +# +# 1) The client machine sees all h11.events objects emitted by the client. +# +# 2) The server machine sees all h11.events objects emitted by the server. +# +# It also sees the client's Request event. +# +# And sometimes, server events are annotated with a _SWITCH_* event. For +# example, we can have a (Response, _SWITCH_CONNECT) event, which is +# different from a regular Response event. +# +# 3) The keep-alive machine sees the process_keep_alive_disabled() event +# (which is derived from Request/Response events), and this event +# transitions it from True -> False, or from False -> False. There's no way +# to transition back. +# +# 4&5) The _SWITCH_* machines transition from False->True when we get a +# Request that proposes the relevant type of switch (via +# process_client_switch_proposals), and they go from True->False when we +# get a Response that has no _SWITCH_* annotation. +# +# So that's event-triggered transitions. +# +# State-triggered transitions are less standard. What they do here is couple +# the machines together. The way this works is, when certain *joint* +# configurations of states are achieved, then we automatically transition to a +# new *joint* state. So, for example, if we're ever in a joint state with +# +# client: DONE +# keep-alive: False +# +# then the client state immediately transitions to: +# +# client: MUST_CLOSE +# +# This is fundamentally different from an event-based transition, because it +# doesn't matter how we arrived at the {client: DONE, keep-alive: False} state +# -- maybe the client transitioned SEND_BODY -> DONE, or keep-alive +# transitioned True -> False. Either way, once this precondition is satisfied, +# this transition is immediately triggered. +# +# What if two conflicting state-based transitions get enabled at the same +# time? In practice there's only one case where this arises (client DONE -> +# MIGHT_SWITCH_PROTOCOL versus DONE -> MUST_CLOSE), and we resolve it by +# explicitly prioritizing the DONE -> MIGHT_SWITCH_PROTOCOL transition. +# +# Implementation +# -------------- +# +# The event-triggered transitions for the server and client machines are all +# stored explicitly in a table. Ditto for the state-triggered transitions that +# involve just the server and client state. +# +# The transitions for the other machines, and the state-triggered transitions +# that involve the other machines, are written out as explicit Python code. +# +# It'd be nice if there were some cleaner way to do all this. This isn't +# *too* terrible, but I feel like it could probably be better. +# +# WARNING +# ------- +# +# The script that generates the state machine diagrams for the docs knows how +# to read out the EVENT_TRIGGERED_TRANSITIONS and STATE_TRIGGERED_TRANSITIONS +# tables. But it can't automatically read the transitions that are written +# directly in Python code. So if you touch those, you need to also update the +# script to keep it in sync! +from typing import cast, Dict, Optional, Set, Tuple, Type, Union + +from ._events import * +from ._util import LocalProtocolError, Sentinel + +# Everything in __all__ gets re-exported as part of the h11 public API. +__all__ = [ + "CLIENT", + "SERVER", + "IDLE", + "SEND_RESPONSE", + "SEND_BODY", + "DONE", + "MUST_CLOSE", + "CLOSED", + "MIGHT_SWITCH_PROTOCOL", + "SWITCHED_PROTOCOL", + "ERROR", +] + + +class CLIENT(Sentinel, metaclass=Sentinel): + pass + + +class SERVER(Sentinel, metaclass=Sentinel): + pass + + +# States +class IDLE(Sentinel, metaclass=Sentinel): + pass + + +class SEND_RESPONSE(Sentinel, metaclass=Sentinel): + pass + + +class SEND_BODY(Sentinel, metaclass=Sentinel): + pass + + +class DONE(Sentinel, metaclass=Sentinel): + pass + + +class MUST_CLOSE(Sentinel, metaclass=Sentinel): + pass + + +class CLOSED(Sentinel, metaclass=Sentinel): + pass + + +class ERROR(Sentinel, metaclass=Sentinel): + pass + + +# Switch types +class MIGHT_SWITCH_PROTOCOL(Sentinel, metaclass=Sentinel): + pass + + +class SWITCHED_PROTOCOL(Sentinel, metaclass=Sentinel): + pass + + +class _SWITCH_UPGRADE(Sentinel, metaclass=Sentinel): + pass + + +class _SWITCH_CONNECT(Sentinel, metaclass=Sentinel): + pass + + +EventTransitionType = Dict[ + Type[Sentinel], + Dict[ + Type[Sentinel], + Dict[Union[Type[Event], Tuple[Type[Event], Type[Sentinel]]], Type[Sentinel]], + ], +] + +EVENT_TRIGGERED_TRANSITIONS: EventTransitionType = { + CLIENT: { + IDLE: {Request: SEND_BODY, ConnectionClosed: CLOSED}, + SEND_BODY: {Data: SEND_BODY, EndOfMessage: DONE}, + DONE: {ConnectionClosed: CLOSED}, + MUST_CLOSE: {ConnectionClosed: CLOSED}, + CLOSED: {ConnectionClosed: CLOSED}, + MIGHT_SWITCH_PROTOCOL: {}, + SWITCHED_PROTOCOL: {}, + ERROR: {}, + }, + SERVER: { + IDLE: { + ConnectionClosed: CLOSED, + Response: SEND_BODY, + # Special case: server sees client Request events, in this form + (Request, CLIENT): SEND_RESPONSE, + }, + SEND_RESPONSE: { + InformationalResponse: SEND_RESPONSE, + Response: SEND_BODY, + (InformationalResponse, _SWITCH_UPGRADE): SWITCHED_PROTOCOL, + (Response, _SWITCH_CONNECT): SWITCHED_PROTOCOL, + }, + SEND_BODY: {Data: SEND_BODY, EndOfMessage: DONE}, + DONE: {ConnectionClosed: CLOSED}, + MUST_CLOSE: {ConnectionClosed: CLOSED}, + CLOSED: {ConnectionClosed: CLOSED}, + SWITCHED_PROTOCOL: {}, + ERROR: {}, + }, +} + +StateTransitionType = Dict[ + Tuple[Type[Sentinel], Type[Sentinel]], Dict[Type[Sentinel], Type[Sentinel]] +] + +# NB: there are also some special-case state-triggered transitions hard-coded +# into _fire_state_triggered_transitions below. +STATE_TRIGGERED_TRANSITIONS: StateTransitionType = { + # (Client state, Server state) -> new states + # Protocol negotiation + (MIGHT_SWITCH_PROTOCOL, SWITCHED_PROTOCOL): {CLIENT: SWITCHED_PROTOCOL}, + # Socket shutdown + (CLOSED, DONE): {SERVER: MUST_CLOSE}, + (CLOSED, IDLE): {SERVER: MUST_CLOSE}, + (ERROR, DONE): {SERVER: MUST_CLOSE}, + (DONE, CLOSED): {CLIENT: MUST_CLOSE}, + (IDLE, CLOSED): {CLIENT: MUST_CLOSE}, + (DONE, ERROR): {CLIENT: MUST_CLOSE}, +} + + +class ConnectionState: + def __init__(self) -> None: + # Extra bits of state that don't quite fit into the state model. + + # If this is False then it enables the automatic DONE -> MUST_CLOSE + # transition. Don't set this directly; call .keep_alive_disabled() + self.keep_alive = True + + # This is a subset of {UPGRADE, CONNECT}, containing the proposals + # made by the client for switching protocols. + self.pending_switch_proposals: Set[Type[Sentinel]] = set() + + self.states: Dict[Type[Sentinel], Type[Sentinel]] = {CLIENT: IDLE, SERVER: IDLE} + + def process_error(self, role: Type[Sentinel]) -> None: + self.states[role] = ERROR + self._fire_state_triggered_transitions() + + def process_keep_alive_disabled(self) -> None: + self.keep_alive = False + self._fire_state_triggered_transitions() + + def process_client_switch_proposal(self, switch_event: Type[Sentinel]) -> None: + self.pending_switch_proposals.add(switch_event) + self._fire_state_triggered_transitions() + + def process_event( + self, + role: Type[Sentinel], + event_type: Type[Event], + server_switch_event: Optional[Type[Sentinel]] = None, + ) -> None: + _event_type: Union[Type[Event], Tuple[Type[Event], Type[Sentinel]]] = event_type + if server_switch_event is not None: + assert role is SERVER + if server_switch_event not in self.pending_switch_proposals: + raise LocalProtocolError( + "Received server _SWITCH_UPGRADE event without a pending proposal" + ) + _event_type = (event_type, server_switch_event) + if server_switch_event is None and _event_type is Response: + self.pending_switch_proposals = set() + self._fire_event_triggered_transitions(role, _event_type) + # Special case: the server state does get to see Request + # events. + if _event_type is Request: + assert role is CLIENT + self._fire_event_triggered_transitions(SERVER, (Request, CLIENT)) + self._fire_state_triggered_transitions() + + def _fire_event_triggered_transitions( + self, + role: Type[Sentinel], + event_type: Union[Type[Event], Tuple[Type[Event], Type[Sentinel]]], + ) -> None: + state = self.states[role] + try: + new_state = EVENT_TRIGGERED_TRANSITIONS[role][state][event_type] + except KeyError: + event_type = cast(Type[Event], event_type) + raise LocalProtocolError( + "can't handle event type {} when role={} and state={}".format( + event_type.__name__, role, self.states[role] + ) + ) from None + self.states[role] = new_state + + def _fire_state_triggered_transitions(self) -> None: + # We apply these rules repeatedly until converging on a fixed point + while True: + start_states = dict(self.states) + + # It could happen that both these special-case transitions are + # enabled at the same time: + # + # DONE -> MIGHT_SWITCH_PROTOCOL + # DONE -> MUST_CLOSE + # + # For example, this will always be true of a HTTP/1.0 client + # requesting CONNECT. If this happens, the protocol switch takes + # priority. From there the client will either go to + # SWITCHED_PROTOCOL, in which case it's none of our business when + # they close the connection, or else the server will deny the + # request, in which case the client will go back to DONE and then + # from there to MUST_CLOSE. + if self.pending_switch_proposals: + if self.states[CLIENT] is DONE: + self.states[CLIENT] = MIGHT_SWITCH_PROTOCOL + + if not self.pending_switch_proposals: + if self.states[CLIENT] is MIGHT_SWITCH_PROTOCOL: + self.states[CLIENT] = DONE + + if not self.keep_alive: + for role in (CLIENT, SERVER): + if self.states[role] is DONE: + self.states[role] = MUST_CLOSE + + # Tabular state-triggered transitions + joint_state = (self.states[CLIENT], self.states[SERVER]) + changes = STATE_TRIGGERED_TRANSITIONS.get(joint_state, {}) + self.states.update(changes) + + if self.states == start_states: + # Fixed point reached + return + + def start_next_cycle(self) -> None: + if self.states != {CLIENT: DONE, SERVER: DONE}: + raise LocalProtocolError( + f"not in a reusable state. self.states={self.states}" + ) + # Can't reach DONE/DONE with any of these active, but still, let's be + # sure. + assert self.keep_alive + assert not self.pending_switch_proposals + self.states = {CLIENT: IDLE, SERVER: IDLE} diff --git a/.venv/lib/python3.10/site-packages/h11/_util.py b/.venv/lib/python3.10/site-packages/h11/_util.py new file mode 100644 index 0000000..6718445 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/h11/_util.py @@ -0,0 +1,135 @@ +from typing import Any, Dict, NoReturn, Pattern, Tuple, Type, TypeVar, Union + +__all__ = [ + "ProtocolError", + "LocalProtocolError", + "RemoteProtocolError", + "validate", + "bytesify", +] + + +class ProtocolError(Exception): + """Exception indicating a violation of the HTTP/1.1 protocol. + + This as an abstract base class, with two concrete base classes: + :exc:`LocalProtocolError`, which indicates that you tried to do something + that HTTP/1.1 says is illegal, and :exc:`RemoteProtocolError`, which + indicates that the remote peer tried to do something that HTTP/1.1 says is + illegal. See :ref:`error-handling` for details. + + In addition to the normal :exc:`Exception` features, it has one attribute: + + .. attribute:: error_status_hint + + This gives a suggestion as to what status code a server might use if + this error occurred as part of a request. + + For a :exc:`RemoteProtocolError`, this is useful as a suggestion for + how you might want to respond to a misbehaving peer, if you're + implementing a server. + + For a :exc:`LocalProtocolError`, this can be taken as a suggestion for + how your peer might have responded to *you* if h11 had allowed you to + continue. + + The default is 400 Bad Request, a generic catch-all for protocol + violations. + + """ + + def __init__(self, msg: str, error_status_hint: int = 400) -> None: + if type(self) is ProtocolError: + raise TypeError("tried to directly instantiate ProtocolError") + Exception.__init__(self, msg) + self.error_status_hint = error_status_hint + + +# Strategy: there are a number of public APIs where a LocalProtocolError can +# be raised (send(), all the different event constructors, ...), and only one +# public API where RemoteProtocolError can be raised +# (receive_data()). Therefore we always raise LocalProtocolError internally, +# and then receive_data will translate this into a RemoteProtocolError. +# +# Internally: +# LocalProtocolError is the generic "ProtocolError". +# Externally: +# LocalProtocolError is for local errors and RemoteProtocolError is for +# remote errors. +class LocalProtocolError(ProtocolError): + def _reraise_as_remote_protocol_error(self) -> NoReturn: + # After catching a LocalProtocolError, use this method to re-raise it + # as a RemoteProtocolError. This method must be called from inside an + # except: block. + # + # An easy way to get an equivalent RemoteProtocolError is just to + # modify 'self' in place. + self.__class__ = RemoteProtocolError # type: ignore + # But the re-raising is somewhat non-trivial -- you might think that + # now that we've modified the in-flight exception object, that just + # doing 'raise' to re-raise it would be enough. But it turns out that + # this doesn't work, because Python tracks the exception type + # (exc_info[0]) separately from the exception object (exc_info[1]), + # and we only modified the latter. So we really do need to re-raise + # the new type explicitly. + # On py3, the traceback is part of the exception object, so our + # in-place modification preserved it and we can just re-raise: + raise self + + +class RemoteProtocolError(ProtocolError): + pass + + +def validate( + regex: Pattern[bytes], data: bytes, msg: str = "malformed data", *format_args: Any +) -> Dict[str, bytes]: + match = regex.fullmatch(data) + if not match: + if format_args: + msg = msg.format(*format_args) + raise LocalProtocolError(msg) + return match.groupdict() + + +# Sentinel values +# +# - Inherit identity-based comparison and hashing from object +# - Have a nice repr +# - Have a *bonus property*: type(sentinel) is sentinel +# +# The bonus property is useful if you want to take the return value from +# next_event() and do some sort of dispatch based on type(event). + +_T_Sentinel = TypeVar("_T_Sentinel", bound="Sentinel") + + +class Sentinel(type): + def __new__( + cls: Type[_T_Sentinel], + name: str, + bases: Tuple[type, ...], + namespace: Dict[str, Any], + **kwds: Any + ) -> _T_Sentinel: + assert bases == (Sentinel,) + v = super().__new__(cls, name, bases, namespace, **kwds) + v.__class__ = v # type: ignore + return v + + def __repr__(self) -> str: + return self.__name__ + + +# Used for methods, request targets, HTTP versions, header names, and header +# values. Accepts ascii-strings, or bytes/bytearray/memoryview/..., and always +# returns bytes. +def bytesify(s: Union[bytes, bytearray, memoryview, int, str]) -> bytes: + # Fast-path: + if type(s) is bytes: + return s + if isinstance(s, str): + s = s.encode("ascii") + if isinstance(s, int): + raise TypeError("expected bytes-like object, not int") + return bytes(s) diff --git a/.venv/lib/python3.10/site-packages/h11/_version.py b/.venv/lib/python3.10/site-packages/h11/_version.py new file mode 100644 index 0000000..76e7327 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/h11/_version.py @@ -0,0 +1,16 @@ +# This file must be kept very simple, because it is consumed from several +# places -- it is imported by h11/__init__.py, execfile'd by setup.py, etc. + +# We use a simple scheme: +# 1.0.0 -> 1.0.0+dev -> 1.1.0 -> 1.1.0+dev +# where the +dev versions are never released into the wild, they're just what +# we stick into the VCS in between releases. +# +# This is compatible with PEP 440: +# http://legacy.python.org/dev/peps/pep-0440/ +# via the use of the "local suffix" "+dev", which is disallowed on index +# servers and causes 1.0.0+dev to sort after plain 1.0.0, which is what we +# want. (Contrast with the special suffix 1.0.0.dev, which sorts *before* +# 1.0.0.) + +__version__ = "0.16.0" diff --git a/.venv/lib/python3.10/site-packages/h11/_writers.py b/.venv/lib/python3.10/site-packages/h11/_writers.py new file mode 100644 index 0000000..939cdb9 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/h11/_writers.py @@ -0,0 +1,145 @@ +# Code to read HTTP data +# +# Strategy: each writer takes an event + a write-some-bytes function, which is +# calls. +# +# WRITERS is a dict describing how to pick a reader. It maps states to either: +# - a writer +# - or, for body writers, a dict of framin-dependent writer factories + +from typing import Any, Callable, Dict, List, Tuple, Type, Union + +from ._events import Data, EndOfMessage, Event, InformationalResponse, Request, Response +from ._headers import Headers +from ._state import CLIENT, IDLE, SEND_BODY, SEND_RESPONSE, SERVER +from ._util import LocalProtocolError, Sentinel + +__all__ = ["WRITERS"] + +Writer = Callable[[bytes], Any] + + +def write_headers(headers: Headers, write: Writer) -> None: + # "Since the Host field-value is critical information for handling a + # request, a user agent SHOULD generate Host as the first header field + # following the request-line." - RFC 7230 + raw_items = headers._full_items + for raw_name, name, value in raw_items: + if name == b"host": + write(b"%s: %s\r\n" % (raw_name, value)) + for raw_name, name, value in raw_items: + if name != b"host": + write(b"%s: %s\r\n" % (raw_name, value)) + write(b"\r\n") + + +def write_request(request: Request, write: Writer) -> None: + if request.http_version != b"1.1": + raise LocalProtocolError("I only send HTTP/1.1") + write(b"%s %s HTTP/1.1\r\n" % (request.method, request.target)) + write_headers(request.headers, write) + + +# Shared between InformationalResponse and Response +def write_any_response( + response: Union[InformationalResponse, Response], write: Writer +) -> None: + if response.http_version != b"1.1": + raise LocalProtocolError("I only send HTTP/1.1") + status_bytes = str(response.status_code).encode("ascii") + # We don't bother sending ascii status messages like "OK"; they're + # optional and ignored by the protocol. (But the space after the numeric + # status code is mandatory.) + # + # XX FIXME: could at least make an effort to pull out the status message + # from stdlib's http.HTTPStatus table. Or maybe just steal their enums + # (either by import or copy/paste). We already accept them as status codes + # since they're of type IntEnum < int. + write(b"HTTP/1.1 %s %s\r\n" % (status_bytes, response.reason)) + write_headers(response.headers, write) + + +class BodyWriter: + def __call__(self, event: Event, write: Writer) -> None: + if type(event) is Data: + self.send_data(event.data, write) + elif type(event) is EndOfMessage: + self.send_eom(event.headers, write) + else: # pragma: no cover + assert False + + def send_data(self, data: bytes, write: Writer) -> None: + pass + + def send_eom(self, headers: Headers, write: Writer) -> None: + pass + + +# +# These are all careful not to do anything to 'data' except call len(data) and +# write(data). This allows us to transparently pass-through funny objects, +# like placeholder objects referring to files on disk that will be sent via +# sendfile(2). +# +class ContentLengthWriter(BodyWriter): + def __init__(self, length: int) -> None: + self._length = length + + def send_data(self, data: bytes, write: Writer) -> None: + self._length -= len(data) + if self._length < 0: + raise LocalProtocolError("Too much data for declared Content-Length") + write(data) + + def send_eom(self, headers: Headers, write: Writer) -> None: + if self._length != 0: + raise LocalProtocolError("Too little data for declared Content-Length") + if headers: + raise LocalProtocolError("Content-Length and trailers don't mix") + + +class ChunkedWriter(BodyWriter): + def send_data(self, data: bytes, write: Writer) -> None: + # if we encoded 0-length data in the naive way, it would look like an + # end-of-message. + if not data: + return + write(b"%x\r\n" % len(data)) + write(data) + write(b"\r\n") + + def send_eom(self, headers: Headers, write: Writer) -> None: + write(b"0\r\n") + write_headers(headers, write) + + +class Http10Writer(BodyWriter): + def send_data(self, data: bytes, write: Writer) -> None: + write(data) + + def send_eom(self, headers: Headers, write: Writer) -> None: + if headers: + raise LocalProtocolError("can't send trailers to HTTP/1.0 client") + # no need to close the socket ourselves, that will be taken care of by + # Connection: close machinery + + +WritersType = Dict[ + Union[Tuple[Type[Sentinel], Type[Sentinel]], Type[Sentinel]], + Union[ + Dict[str, Type[BodyWriter]], + Callable[[Union[InformationalResponse, Response], Writer], None], + Callable[[Request, Writer], None], + ], +] + +WRITERS: WritersType = { + (CLIENT, IDLE): write_request, + (SERVER, IDLE): write_any_response, + (SERVER, SEND_RESPONSE): write_any_response, + SEND_BODY: { + "chunked": ChunkedWriter, + "content-length": ContentLengthWriter, + "http/1.0": Http10Writer, + }, +} diff --git a/.venv/lib/python3.10/site-packages/h11/py.typed b/.venv/lib/python3.10/site-packages/h11/py.typed new file mode 100644 index 0000000..f5642f7 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/h11/py.typed @@ -0,0 +1 @@ +Marker diff --git a/.venv/lib/python3.10/site-packages/httpcore-1.0.9.dist-info/INSTALLER b/.venv/lib/python3.10/site-packages/httpcore-1.0.9.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpcore-1.0.9.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/.venv/lib/python3.10/site-packages/httpcore-1.0.9.dist-info/METADATA b/.venv/lib/python3.10/site-packages/httpcore-1.0.9.dist-info/METADATA new file mode 100644 index 0000000..8056834 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpcore-1.0.9.dist-info/METADATA @@ -0,0 +1,625 @@ +Metadata-Version: 2.4 +Name: httpcore +Version: 1.0.9 +Summary: A minimal low-level HTTP client. +Project-URL: Documentation, https://www.encode.io/httpcore +Project-URL: Homepage, https://www.encode.io/httpcore/ +Project-URL: Source, https://github.com/encode/httpcore +Author-email: Tom Christie +License-Expression: BSD-3-Clause +License-File: LICENSE.md +Classifier: Development Status :: 3 - Alpha +Classifier: Environment :: Web Environment +Classifier: Framework :: AsyncIO +Classifier: Framework :: Trio +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Topic :: Internet :: WWW/HTTP +Requires-Python: >=3.8 +Requires-Dist: certifi +Requires-Dist: h11>=0.16 +Provides-Extra: asyncio +Requires-Dist: anyio<5.0,>=4.0; extra == 'asyncio' +Provides-Extra: http2 +Requires-Dist: h2<5,>=3; extra == 'http2' +Provides-Extra: socks +Requires-Dist: socksio==1.*; extra == 'socks' +Provides-Extra: trio +Requires-Dist: trio<1.0,>=0.22.0; extra == 'trio' +Description-Content-Type: text/markdown + +# HTTP Core + +[![Test Suite](https://github.com/encode/httpcore/workflows/Test%20Suite/badge.svg)](https://github.com/encode/httpcore/actions) +[![Package version](https://badge.fury.io/py/httpcore.svg)](https://pypi.org/project/httpcore/) + +> *Do one thing, and do it well.* + +The HTTP Core package provides a minimal low-level HTTP client, which does +one thing only. Sending HTTP requests. + +It does not provide any high level model abstractions over the API, +does not handle redirects, multipart uploads, building authentication headers, +transparent HTTP caching, URL parsing, session cookie handling, +content or charset decoding, handling JSON, environment based configuration +defaults, or any of that Jazz. + +Some things HTTP Core does do: + +* Sending HTTP requests. +* Thread-safe / task-safe connection pooling. +* HTTP(S) proxy & SOCKS proxy support. +* Supports HTTP/1.1 and HTTP/2. +* Provides both sync and async interfaces. +* Async backend support for `asyncio` and `trio`. + +## Requirements + +Python 3.8+ + +## Installation + +For HTTP/1.1 only support, install with: + +```shell +$ pip install httpcore +``` + +There are also a number of optional extras available... + +```shell +$ pip install httpcore['asyncio,trio,http2,socks'] +``` + +## Sending requests + +Send an HTTP request: + +```python +import httpcore + +response = httpcore.request("GET", "https://www.example.com/") + +print(response) +# +print(response.status) +# 200 +print(response.headers) +# [(b'Accept-Ranges', b'bytes'), (b'Age', b'557328'), (b'Cache-Control', b'max-age=604800'), ...] +print(response.content) +# b'\n\n\nExample Domain\n\n\n ...' +``` + +The top-level `httpcore.request()` function is provided for convenience. In practice whenever you're working with `httpcore` you'll want to use the connection pooling functionality that it provides. + +```python +import httpcore + +http = httpcore.ConnectionPool() +response = http.request("GET", "https://www.example.com/") +``` + +Once you're ready to get going, [head over to the documentation](https://www.encode.io/httpcore/). + +## Motivation + +You *probably* don't want to be using HTTP Core directly. It might make sense if +you're writing something like a proxy service in Python, and you just want +something at the lowest possible level, but more typically you'll want to use +a higher level client library, such as `httpx`. + +The motivation for `httpcore` is: + +* To provide a reusable low-level client library, that other packages can then build on top of. +* To provide a *really clear interface split* between the networking code and client logic, + so that each is easier to understand and reason about in isolation. + +## Dependencies + +The `httpcore` package has the following dependencies... + +* `h11` +* `certifi` + +And the following optional extras... + +* `anyio` - Required by `pip install httpcore['asyncio']`. +* `trio` - Required by `pip install httpcore['trio']`. +* `h2` - Required by `pip install httpcore['http2']`. +* `socksio` - Required by `pip install httpcore['socks']`. + +## Versioning + +We use [SEMVER for our versioning policy](https://semver.org/). + +For changes between package versions please see our [project changelog](CHANGELOG.md). + +We recommend pinning your requirements either the most current major version, or a more specific version range: + +```python +pip install 'httpcore==1.*' +``` +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). + +## Version 1.0.9 (April 24th, 2025) + +- Resolve https://github.com/advisories/GHSA-vqfr-h8mv-ghfj with h11 dependency update. (#1008) + +## Version 1.0.8 (April 11th, 2025) + +- Fix `AttributeError` when importing on Python 3.14. (#1005) + +## Version 1.0.7 (November 15th, 2024) + +- Support `proxy=…` configuration on `ConnectionPool()`. (#974) + +## Version 1.0.6 (October 1st, 2024) + +- Relax `trio` dependency pinning. (#956) +- Handle `trio` raising `NotImplementedError` on unsupported platforms. (#955) +- Handle mapping `ssl.SSLError` to `httpcore.ConnectError`. (#918) + +## 1.0.5 (March 27th, 2024) + +- Handle `EndOfStream` exception for anyio backend. (#899) +- Allow trio `0.25.*` series in package dependancies. (#903) + +## 1.0.4 (February 21st, 2024) + +- Add `target` request extension. (#888) +- Fix support for connection `Upgrade` and `CONNECT` when some data in the stream has been read. (#882) + +## 1.0.3 (February 13th, 2024) + +- Fix support for async cancellations. (#880) +- Fix trace extension when used with socks proxy. (#849) +- Fix SSL context for connections using the "wss" scheme (#869) + +## 1.0.2 (November 10th, 2023) + +- Fix `float("inf")` timeouts in `Event.wait` function. (#846) + +## 1.0.1 (November 3rd, 2023) + +- Fix pool timeout to account for the total time spent retrying. (#823) +- Raise a neater RuntimeError when the correct async deps are not installed. (#826) +- Add support for synchronous TLS-in-TLS streams. (#840) + +## 1.0.0 (October 6th, 2023) + +From version 1.0 our async support is now optional, as the package has minimal dependencies by default. + +For async support use either `pip install 'httpcore[asyncio]'` or `pip install 'httpcore[trio]'`. + +The project versioning policy is now explicitly governed by SEMVER. See https://semver.org/. + +- Async support becomes fully optional. (#809) +- Add support for Python 3.12. (#807) + +## 0.18.0 (September 8th, 2023) + +- Add support for HTTPS proxies. (#745, #786) +- Drop Python 3.7 support. (#727) +- Handle `sni_hostname` extension with SOCKS proxy. (#774) +- Handle HTTP/1.1 half-closed connections gracefully. (#641) +- Change the type of `Extensions` from `Mapping[Str, Any]` to `MutableMapping[Str, Any]`. (#762) + +## 0.17.3 (July 5th, 2023) + +- Support async cancellations, ensuring that the connection pool is left in a clean state when cancellations occur. (#726) +- The networking backend interface has [been added to the public API](https://www.encode.io/httpcore/network-backends). Some classes which were previously private implementation detail are now part of the top-level public API. (#699) +- Graceful handling of HTTP/2 GoAway frames, with requests being transparently retried on a new connection. (#730) +- Add exceptions when a synchronous `trace callback` is passed to an asynchronous request or an asynchronous `trace callback` is passed to a synchronous request. (#717) +- Drop Python 3.7 support. (#727) + +## 0.17.2 (May 23th, 2023) + +- Add `socket_options` argument to `ConnectionPool` and `HTTProxy` classes. (#668) +- Improve logging with per-module logger names. (#690) +- Add `sni_hostname` request extension. (#696) +- Resolve race condition during import of `anyio` package. (#692) +- Enable TCP_NODELAY for all synchronous sockets. (#651) + +## 0.17.1 (May 17th, 2023) + +- If 'retries' is set, then allow retries if an SSL handshake error occurs. (#669) +- Improve correctness of tracebacks on network exceptions, by raising properly chained exceptions. (#678) +- Prevent connection-hanging behaviour when HTTP/2 connections are closed by a server-sent 'GoAway' frame. (#679) +- Fix edge-case exception when removing requests from the connection pool. (#680) +- Fix pool timeout edge-case. (#688) + +## 0.17.0 (March 16th, 2023) + +- Add DEBUG level logging. (#648) +- Respect HTTP/2 max concurrent streams when settings updates are sent by server. (#652) +- Increase the allowable HTTP header size to 100kB. (#647) +- Add `retries` option to SOCKS proxy classes. (#643) + +## 0.16.3 (December 20th, 2022) + +- Allow `ws` and `wss` schemes. Allows us to properly support websocket upgrade connections. (#625) +- Forwarding HTTP proxies use a connection-per-remote-host. Required by some proxy implementations. (#637) +- Don't raise `RuntimeError` when closing a connection pool with active connections. Removes some error cases when cancellations are used. (#631) +- Lazy import `anyio`, so that it's no longer a hard dependancy, and isn't imported if unused. (#639) + +## 0.16.2 (November 25th, 2022) + +- Revert 'Fix async cancellation behaviour', which introduced race conditions. (#627) +- Raise `RuntimeError` if attempting to us UNIX domain sockets on Windows. (#619) + +## 0.16.1 (November 17th, 2022) + +- Fix HTTP/1.1 interim informational responses, such as "100 Continue". (#605) + +## 0.16.0 (October 11th, 2022) + +- Support HTTP/1.1 informational responses. (#581) +- Fix async cancellation behaviour. (#580) +- Support `h11` 0.14. (#579) + +## 0.15.0 (May 17th, 2022) + +- Drop Python 3.6 support (#535) +- Ensure HTTP proxy CONNECT requests include `timeout` configuration. (#506) +- Switch to explicit `typing.Optional` for type hints. (#513) +- For `trio` map OSError exceptions to `ConnectError`. (#543) + +## 0.14.7 (February 4th, 2022) + +- Requests which raise a PoolTimeout need to be removed from the pool queue. (#502) +- Fix AttributeError that happened when Socks5Connection were terminated. (#501) + +## 0.14.6 (February 1st, 2022) + +- Fix SOCKS support for `http://` URLs. (#492) +- Resolve race condition around exceptions during streaming a response. (#491) + +## 0.14.5 (January 18th, 2022) + +- SOCKS proxy support. (#478) +- Add proxy_auth argument to HTTPProxy. (#481) +- Improve error message on 'RemoteProtocolError' exception when server disconnects without sending a response. (#479) + +## 0.14.4 (January 5th, 2022) + +- Support HTTP/2 on HTTPS tunnelling proxies. (#468) +- Fix proxy headers missing on HTTP forwarding. (#456) +- Only instantiate SSL context if required. (#457) +- More robust HTTP/2 handling. (#253, #439, #440, #441) + +## 0.14.3 (November 17th, 2021) + +- Fix race condition when removing closed connections from the pool. (#437) + +## 0.14.2 (November 16th, 2021) + +- Failed connections no longer remain in the pool. (Pull #433) + +## 0.14.1 (November 12th, 2021) + +- `max_connections` becomes optional. (Pull #429) +- `certifi` is now included in the install dependancies. (Pull #428) +- `h2` is now strictly optional. (Pull #428) + +## 0.14.0 (November 11th, 2021) + +The 0.14 release is a complete reworking of `httpcore`, comprehensively addressing some underlying issues in the connection pooling, as well as substantially redesigning the API to be more user friendly. + +Some of the lower-level API design also makes the components more easily testable in isolation, and the package now has 100% test coverage. + +See [discussion #419](https://github.com/encode/httpcore/discussions/419) for a little more background. + +There's some other neat bits in there too, such as the "trace" extension, which gives a hook into inspecting the internal events that occur during the request/response cycle. This extension is needed for the HTTPX cli, in order to... + +* Log the point at which the connection is established, and the IP/port on which it is made. +* Determine if the outgoing request should log as HTTP/1.1 or HTTP/2, rather than having to assume it's HTTP/2 if the --http2 flag was passed. (Which may not actually be true.) +* Log SSL version info / certificate info. + +Note that `curio` support is not currently available in 0.14.0. If you're using `httpcore` with `curio` please get in touch, so we can assess if we ought to prioritize it as a feature or not. + +## 0.13.7 (September 13th, 2021) + +- Fix broken error messaging when URL scheme is missing, or a non HTTP(S) scheme is used. (Pull #403) + +## 0.13.6 (June 15th, 2021) + +### Fixed + +- Close sockets when read or write timeouts occur. (Pull #365) + +## 0.13.5 (June 14th, 2021) + +### Fixed + +- Resolved niggles with AnyIO EOF behaviours. (Pull #358, #362) + +## 0.13.4 (June 9th, 2021) + +### Added + +- Improved error messaging when URL scheme is missing, or a non HTTP(S) scheme is used. (Pull #354) + +### Fixed + +- Switched to `anyio` as the default backend implementation when running with `asyncio`. Resolves some awkward [TLS timeout issues](https://github.com/encode/httpx/discussions/1511). + +## 0.13.3 (May 6th, 2021) + +### Added + +- Support HTTP/2 prior knowledge, using `httpcore.SyncConnectionPool(http1=False)`. (Pull #333) + +### Fixed + +- Handle cases where environment does not provide `select.poll` support. (Pull #331) + +## 0.13.2 (April 29th, 2021) + +### Added + +- Improve error message for specific case of `RemoteProtocolError` where server disconnects without sending a response. (Pull #313) + +## 0.13.1 (April 28th, 2021) + +### Fixed + +- More resiliant testing for closed connections. (Pull #311) +- Don't raise exceptions on ungraceful connection closes. (Pull #310) + +## 0.13.0 (April 21st, 2021) + +The 0.13 release updates the core API in order to match the HTTPX Transport API, +introduced in HTTPX 0.18 onwards. + +An example of making requests with the new interface is: + +```python +with httpcore.SyncConnectionPool() as http: + status_code, headers, stream, extensions = http.handle_request( + method=b'GET', + url=(b'https', b'example.org', 443, b'/'), + headers=[(b'host', b'example.org'), (b'user-agent', b'httpcore')] + stream=httpcore.ByteStream(b''), + extensions={} + ) + body = stream.read() + print(status_code, body) +``` + +### Changed + +- The `.request()` method is now `handle_request()`. (Pull #296) +- The `.arequest()` method is now `.handle_async_request()`. (Pull #296) +- The `headers` argument is no longer optional. (Pull #296) +- The `stream` argument is no longer optional. (Pull #296) +- The `ext` argument is now named `extensions`, and is no longer optional. (Pull #296) +- The `"reason"` extension keyword is now named `"reason_phrase"`. (Pull #296) +- The `"reason_phrase"` and `"http_version"` extensions now use byte strings for their values. (Pull #296) +- The `httpcore.PlainByteStream()` class becomes `httpcore.ByteStream()`. (Pull #296) + +### Added + +- Streams now support a `.read()` interface. (Pull #296) + +### Fixed + +- Task cancellation no longer leaks connections from the connection pool. (Pull #305) + +## 0.12.3 (December 7th, 2020) + +### Fixed + +- Abort SSL connections on close rather than waiting for remote EOF when using `asyncio`. (Pull #167) +- Fix exception raised in case of connect timeouts when using the `anyio` backend. (Pull #236) +- Fix `Host` header precedence for `:authority` in HTTP/2. (Pull #241, #243) +- Handle extra edge case when detecting for socket readability when using `asyncio`. (Pull #242, #244) +- Fix `asyncio` SSL warning when using proxy tunneling. (Pull #249) + +## 0.12.2 (November 20th, 2020) + +### Fixed + +- Properly wrap connect errors on the asyncio backend. (Pull #235) +- Fix `ImportError` occurring on Python 3.9 when using the HTTP/1.1 sync client in a multithreaded context. (Pull #237) + +## 0.12.1 (November 7th, 2020) + +### Added + +- Add connect retries. (Pull #221) + +### Fixed + +- Tweak detection of dropped connections, resolving an issue with open files limits on Linux. (Pull #185) +- Avoid leaking connections when establishing an HTTP tunnel to a proxy has failed. (Pull #223) +- Properly wrap OS errors when using `trio`. (Pull #225) + +## 0.12.0 (October 6th, 2020) + +### Changed + +- HTTP header casing is now preserved, rather than always sent in lowercase. (#216 and python-hyper/h11#104) + +### Added + +- Add Python 3.9 to officially supported versions. + +### Fixed + +- Gracefully handle a stdlib asyncio bug when a connection is closed while it is in a paused-for-reading state. (#201) + +## 0.11.1 (September 28nd, 2020) + +### Fixed + +- Add await to async semaphore release() coroutine (#197) +- Drop incorrect curio classifier (#192) + +## 0.11.0 (September 22nd, 2020) + +The Transport API with 0.11.0 has a couple of significant changes. + +Firstly we've moved changed the request interface in order to allow extensions, which will later enable us to support features +such as trailing headers, HTTP/2 server push, and CONNECT/Upgrade connections. + +The interface changes from: + +```python +def request(method, url, headers, stream, timeout): + return (http_version, status_code, reason, headers, stream) +``` + +To instead including an optional dictionary of extensions on the request and response: + +```python +def request(method, url, headers, stream, ext): + return (status_code, headers, stream, ext) +``` + +Having an open-ended extensions point will allow us to add later support for various optional features, that wouldn't otherwise be supported without these API changes. + +In particular: + +* Trailing headers support. +* HTTP/2 Server Push +* sendfile. +* Exposing raw connection on CONNECT, Upgrade, HTTP/2 bi-di streaming. +* Exposing debug information out of the API, including template name, template context. + +Currently extensions are limited to: + +* request: `timeout` - Optional. Timeout dictionary. +* response: `http_version` - Optional. Include the HTTP version used on the response. +* response: `reason` - Optional. Include the reason phrase used on the response. Only valid with HTTP/1.*. + +See https://github.com/encode/httpx/issues/1274#issuecomment-694884553 for the history behind this. + +Secondly, the async version of `request` is now namespaced as `arequest`. + +This allows concrete transports to support both sync and async implementations on the same class. + +### Added + +- Add curio support. (Pull #168) +- Add anyio support, with `backend="anyio"`. (Pull #169) + +### Changed + +- Update the Transport API to use 'ext' for optional extensions. (Pull #190) +- Update the Transport API to use `.request` and `.arequest` so implementations can support both sync and async. (Pull #189) + +## 0.10.2 (August 20th, 2020) + +### Added + +- Added Unix Domain Socket support. (Pull #139) + +### Fixed + +- Always include the port on proxy CONNECT requests. (Pull #154) +- Fix `max_keepalive_connections` configuration. (Pull #153) +- Fixes behaviour in HTTP/1.1 where server disconnects can be used to signal the end of the response body. (Pull #164) + +## 0.10.1 (August 7th, 2020) + +- Include `max_keepalive_connections` on `AsyncHTTPProxy`/`SyncHTTPProxy` classes. + +## 0.10.0 (August 7th, 2020) + +The most notable change in the 0.10.0 release is that HTTP/2 support is now fully optional. + +Use either `pip install httpcore` for HTTP/1.1 support only, or `pip install httpcore[http2]` for HTTP/1.1 and HTTP/2 support. + +### Added + +- HTTP/2 support becomes optional. (Pull #121, #130) +- Add `local_address=...` support. (Pull #100, #134) +- Add `PlainByteStream`, `IteratorByteStream`, `AsyncIteratorByteStream`. The `AsyncByteSteam` and `SyncByteStream` classes are now pure interface classes. (#133) +- Add `LocalProtocolError`, `RemoteProtocolError` exceptions. (Pull #129) +- Add `UnsupportedProtocol` exception. (Pull #128) +- Add `.get_connection_info()` method. (Pull #102, #137) +- Add better TRACE logs. (Pull #101) + +### Changed + +- `max_keepalive` is deprecated in favour of `max_keepalive_connections`. (Pull #140) + +### Fixed + +- Improve handling of server disconnects. (Pull #112) + +## 0.9.1 (May 27th, 2020) + +### Fixed + +- Proper host resolution for sync case, including IPv6 support. (Pull #97) +- Close outstanding connections when connection pool is closed. (Pull #98) + +## 0.9.0 (May 21th, 2020) + +### Changed + +- URL port becomes an `Optional[int]` instead of `int`. (Pull #92) + +### Fixed + +- Honor HTTP/2 max concurrent streams settings. (Pull #89, #90) +- Remove incorrect debug log. (Pull #83) + +## 0.8.4 (May 11th, 2020) + +### Added + +- Logging via HTTPCORE_LOG_LEVEL and HTTPX_LOG_LEVEL environment variables +and TRACE level logging. (Pull #79) + +### Fixed + +- Reuse of connections on HTTP/2 in close concurrency situations. (Pull #81) + +## 0.8.3 (May 6rd, 2020) + +### Fixed + +- Include `Host` and `Accept` headers on proxy "CONNECT" requests. +- De-duplicate any headers also contained in proxy_headers. +- HTTP/2 flag not being passed down to proxy connections. + +## 0.8.2 (May 3rd, 2020) + +### Fixed + +- Fix connections using proxy forwarding requests not being added to the +connection pool properly. (Pull #70) + +## 0.8.1 (April 30th, 2020) + +### Changed + +- Allow inherintance of both `httpcore.AsyncByteStream`, `httpcore.SyncByteStream` without type conflicts. + +## 0.8.0 (April 30th, 2020) + +### Fixed + +- Fixed tunnel proxy support. + +### Added + +- New `TimeoutException` base class. + +## 0.7.0 (March 5th, 2020) + +- First integration with HTTPX. diff --git a/.venv/lib/python3.10/site-packages/httpcore-1.0.9.dist-info/RECORD b/.venv/lib/python3.10/site-packages/httpcore-1.0.9.dist-info/RECORD new file mode 100644 index 0000000..aac7c19 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpcore-1.0.9.dist-info/RECORD @@ -0,0 +1,68 @@ +httpcore-1.0.9.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +httpcore-1.0.9.dist-info/METADATA,sha256=_i1P2mGZEol4d54M8n88BFxTGGP83Zh-rMdPOhjUHCE,21529 +httpcore-1.0.9.dist-info/RECORD,, +httpcore-1.0.9.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87 +httpcore-1.0.9.dist-info/licenses/LICENSE.md,sha256=_ctZFUx0y6uhahEkL3dAvqnyPW_rVUeRfYxflKgDkqU,1518 +httpcore/__init__.py,sha256=9kT_kqChCCJUTHww24ZmR_ezcdbpRYWksD-gYNzkZP8,3445 +httpcore/__pycache__/__init__.cpython-310.pyc,, +httpcore/__pycache__/_api.cpython-310.pyc,, +httpcore/__pycache__/_exceptions.cpython-310.pyc,, +httpcore/__pycache__/_models.cpython-310.pyc,, +httpcore/__pycache__/_ssl.cpython-310.pyc,, +httpcore/__pycache__/_synchronization.cpython-310.pyc,, +httpcore/__pycache__/_trace.cpython-310.pyc,, +httpcore/__pycache__/_utils.cpython-310.pyc,, +httpcore/_api.py,sha256=unZmeDschBWCGCPCwkS3Wot9euK6bg_kKxLtGTxw214,3146 +httpcore/_async/__init__.py,sha256=EWdl2v4thnAHzJpqjU4h2a8DUiGAvNiWrkii9pfhTf0,1221 +httpcore/_async/__pycache__/__init__.cpython-310.pyc,, +httpcore/_async/__pycache__/connection.cpython-310.pyc,, +httpcore/_async/__pycache__/connection_pool.cpython-310.pyc,, +httpcore/_async/__pycache__/http11.cpython-310.pyc,, +httpcore/_async/__pycache__/http2.cpython-310.pyc,, +httpcore/_async/__pycache__/http_proxy.cpython-310.pyc,, +httpcore/_async/__pycache__/interfaces.cpython-310.pyc,, +httpcore/_async/__pycache__/socks_proxy.cpython-310.pyc,, +httpcore/_async/connection.py,sha256=6OcPXqMEfc0BU38_-iHUNDd1vKSTc2UVT09XqNb_BOk,8449 +httpcore/_async/connection_pool.py,sha256=DOIQ2s2ZCf9qfwxhzMprTPLqCL8OxGXiKF6qRHxvVyY,17307 +httpcore/_async/http11.py,sha256=-qM9bV7PjSQF5vxs37-eUXOIFwbIjPcZbNliuX9TtBw,13880 +httpcore/_async/http2.py,sha256=azX1fcmtXaIwjputFlZ4vd92J8xwjGOa9ax9QIv4394,23936 +httpcore/_async/http_proxy.py,sha256=2zVkrlv-Ds-rWGaqaXlrhEJiAQFPo23BT3Gq_sWoBXU,14701 +httpcore/_async/interfaces.py,sha256=jTiaWL83pgpGC9ziv90ZfwaKNMmHwmOalzaKiuTxATo,4455 +httpcore/_async/socks_proxy.py,sha256=lLKgLlggPfhFlqi0ODeBkOWvt9CghBBUyqsnsU1tx6Q,13841 +httpcore/_backends/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +httpcore/_backends/__pycache__/__init__.cpython-310.pyc,, +httpcore/_backends/__pycache__/anyio.cpython-310.pyc,, +httpcore/_backends/__pycache__/auto.cpython-310.pyc,, +httpcore/_backends/__pycache__/base.cpython-310.pyc,, +httpcore/_backends/__pycache__/mock.cpython-310.pyc,, +httpcore/_backends/__pycache__/sync.cpython-310.pyc,, +httpcore/_backends/__pycache__/trio.cpython-310.pyc,, +httpcore/_backends/anyio.py,sha256=x8PgEhXRC8bVqsdzk_YJx8Y6d9Tub06CuUSwnbmtqoY,5252 +httpcore/_backends/auto.py,sha256=zO136PKZmsaTDK-HRk84eA-MUg8_2wJf4NvmK432Aio,1662 +httpcore/_backends/base.py,sha256=aShgRdZnMmRhFWHetjumlM73f8Kz1YOAyCUP_4kHslA,3042 +httpcore/_backends/mock.py,sha256=er9T436uSe7NLrfiLa4x6Nuqg5ivQ693CxWYCWsgbH4,4077 +httpcore/_backends/sync.py,sha256=bhE4d9iK9Umxdsdsgm2EfKnXaBms2WggGYU-7jmUujU,7977 +httpcore/_backends/trio.py,sha256=LHu4_Mr5MswQmmT3yE4oLgf9b_JJfeVS4BjDxeJc7Ro,5996 +httpcore/_exceptions.py,sha256=looCKga3_YVYu3s-d3L9RMPRJyhsY7fiuuGxvkOD0c0,1184 +httpcore/_models.py,sha256=IO2CcXcdpovRcLTdGFGB6RyBZdEm2h_TOmoCc4rEKho,17623 +httpcore/_ssl.py,sha256=srqmSNU4iOUvWF-SrJvb8G_YEbHFELOXQOwdDIBTS9c,187 +httpcore/_sync/__init__.py,sha256=JBDIgXt5la1LCJ1sLQeKhjKFpLnpNr8Svs6z2ni3fgg,1141 +httpcore/_sync/__pycache__/__init__.cpython-310.pyc,, +httpcore/_sync/__pycache__/connection.cpython-310.pyc,, +httpcore/_sync/__pycache__/connection_pool.cpython-310.pyc,, +httpcore/_sync/__pycache__/http11.cpython-310.pyc,, +httpcore/_sync/__pycache__/http2.cpython-310.pyc,, +httpcore/_sync/__pycache__/http_proxy.cpython-310.pyc,, +httpcore/_sync/__pycache__/interfaces.cpython-310.pyc,, +httpcore/_sync/__pycache__/socks_proxy.cpython-310.pyc,, +httpcore/_sync/connection.py,sha256=9exGOb3PB-Mp2T1-sckSeL2t-tJ_9-NXomV8ihmWCgU,8238 +httpcore/_sync/connection_pool.py,sha256=a-T8LTsUxc7r0Ww1atfHSDoWPjQ0fA8Ul7S3-F0Mj70,16955 +httpcore/_sync/http11.py,sha256=IFobD1Md5JFlJGKWnh1_Q3epikUryI8qo09v8MiJIEA,13476 +httpcore/_sync/http2.py,sha256=AxU4yhcq68Bn5vqdJYtiXKYUj7nvhYbxz3v4rT4xnvA,23400 +httpcore/_sync/http_proxy.py,sha256=_al_6crKuEZu2wyvu493RZImJdBJnj5oGKNjLOJL2Zo,14463 +httpcore/_sync/interfaces.py,sha256=snXON42vUDHO5JBJvo8D4VWk2Wat44z2OXXHDrjbl94,4344 +httpcore/_sync/socks_proxy.py,sha256=zegZW9Snqj2_992DFJa8_CppOVBkVL4AgwduRkStakQ,13614 +httpcore/_synchronization.py,sha256=zSi13mAColBnknjZBknUC6hKNDQT4C6ijnezZ-r0T2s,9434 +httpcore/_trace.py,sha256=ck6ZoIzYTkdNAIfq5MGeKqBXDtqjOX-qfYwmZFbrGco,3952 +httpcore/_utils.py,sha256=_RLgXYOAYC350ikALV59GZ68IJrdocRZxPs9PjmzdFY,1537 +httpcore/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/.venv/lib/python3.10/site-packages/httpcore-1.0.9.dist-info/WHEEL b/.venv/lib/python3.10/site-packages/httpcore-1.0.9.dist-info/WHEEL new file mode 100644 index 0000000..12228d4 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpcore-1.0.9.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: hatchling 1.27.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/.venv/lib/python3.10/site-packages/httpcore-1.0.9.dist-info/licenses/LICENSE.md b/.venv/lib/python3.10/site-packages/httpcore-1.0.9.dist-info/licenses/LICENSE.md new file mode 100644 index 0000000..311b2b5 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpcore-1.0.9.dist-info/licenses/LICENSE.md @@ -0,0 +1,27 @@ +Copyright © 2020, [Encode OSS Ltd](https://www.encode.io/). +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/.venv/lib/python3.10/site-packages/httpcore/__init__.py b/.venv/lib/python3.10/site-packages/httpcore/__init__.py new file mode 100644 index 0000000..9a92dc4 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpcore/__init__.py @@ -0,0 +1,141 @@ +from ._api import request, stream +from ._async import ( + AsyncConnectionInterface, + AsyncConnectionPool, + AsyncHTTP2Connection, + AsyncHTTP11Connection, + AsyncHTTPConnection, + AsyncHTTPProxy, + AsyncSOCKSProxy, +) +from ._backends.base import ( + SOCKET_OPTION, + AsyncNetworkBackend, + AsyncNetworkStream, + NetworkBackend, + NetworkStream, +) +from ._backends.mock import AsyncMockBackend, AsyncMockStream, MockBackend, MockStream +from ._backends.sync import SyncBackend +from ._exceptions import ( + ConnectError, + ConnectionNotAvailable, + ConnectTimeout, + LocalProtocolError, + NetworkError, + PoolTimeout, + ProtocolError, + ProxyError, + ReadError, + ReadTimeout, + RemoteProtocolError, + TimeoutException, + UnsupportedProtocol, + WriteError, + WriteTimeout, +) +from ._models import URL, Origin, Proxy, Request, Response +from ._ssl import default_ssl_context +from ._sync import ( + ConnectionInterface, + ConnectionPool, + HTTP2Connection, + HTTP11Connection, + HTTPConnection, + HTTPProxy, + SOCKSProxy, +) + +# The 'httpcore.AnyIOBackend' class is conditional on 'anyio' being installed. +try: + from ._backends.anyio import AnyIOBackend +except ImportError: # pragma: nocover + + class AnyIOBackend: # type: ignore + def __init__(self, *args, **kwargs): # type: ignore + msg = ( + "Attempted to use 'httpcore.AnyIOBackend' but 'anyio' is not installed." + ) + raise RuntimeError(msg) + + +# The 'httpcore.TrioBackend' class is conditional on 'trio' being installed. +try: + from ._backends.trio import TrioBackend +except ImportError: # pragma: nocover + + class TrioBackend: # type: ignore + def __init__(self, *args, **kwargs): # type: ignore + msg = "Attempted to use 'httpcore.TrioBackend' but 'trio' is not installed." + raise RuntimeError(msg) + + +__all__ = [ + # top-level requests + "request", + "stream", + # models + "Origin", + "URL", + "Request", + "Response", + "Proxy", + # async + "AsyncHTTPConnection", + "AsyncConnectionPool", + "AsyncHTTPProxy", + "AsyncHTTP11Connection", + "AsyncHTTP2Connection", + "AsyncConnectionInterface", + "AsyncSOCKSProxy", + # sync + "HTTPConnection", + "ConnectionPool", + "HTTPProxy", + "HTTP11Connection", + "HTTP2Connection", + "ConnectionInterface", + "SOCKSProxy", + # network backends, implementations + "SyncBackend", + "AnyIOBackend", + "TrioBackend", + # network backends, mock implementations + "AsyncMockBackend", + "AsyncMockStream", + "MockBackend", + "MockStream", + # network backends, interface + "AsyncNetworkStream", + "AsyncNetworkBackend", + "NetworkStream", + "NetworkBackend", + # util + "default_ssl_context", + "SOCKET_OPTION", + # exceptions + "ConnectionNotAvailable", + "ProxyError", + "ProtocolError", + "LocalProtocolError", + "RemoteProtocolError", + "UnsupportedProtocol", + "TimeoutException", + "PoolTimeout", + "ConnectTimeout", + "ReadTimeout", + "WriteTimeout", + "NetworkError", + "ConnectError", + "ReadError", + "WriteError", +] + +__version__ = "1.0.9" + + +__locals = locals() +for __name in __all__: + # Exclude SOCKET_OPTION, it causes AttributeError on Python 3.14 + if not __name.startswith(("__", "SOCKET_OPTION")): + setattr(__locals[__name], "__module__", "httpcore") # noqa diff --git a/.venv/lib/python3.10/site-packages/httpcore/__pycache__/__init__.cpython-310.pyc b/.venv/lib/python3.10/site-packages/httpcore/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4984a0c7fbd07f522de8192a5e0226f673738864 GIT binary patch literal 2776 zcmai0TTdJ}6duoB**h!{NJz3tNXRB(mxWwP11TFwThtT~5Jk0AjfNcq(~M^}wwIe) zsVeyueQNWT=l+07{Q>;}ey#e@=SY31)QgX2mt9cW4)VA5v5$Such0d1ve}fOzF&X; z$!%o~;};n8en~Z0P>sJvhT#|v@(hYFq9!&Gj7={>qc}=qI7Z_*P7^pmlQ>EHa34+K zlwK3@(lmoJG>fw|hjTQK^R$2qdM@hq(*Zm{i?~P!@gN<-Ls}m5hUqzcPWR*92pz?v z^gKRKFW?Jw43E)^_#(Z8FVV~RGA-c}y@IdMtN1FthOg0aJWj9U>+}Y`K_~Ep-Xr1N zq-9*Dx9}}`8{ejP@EtmdC-q#?tI#U0>VBU$MQgZ5r|~qM!87zOzDw`nd-OiOPaoh1 z$T&(WuT$Q8bQaGdUe(1uYS{!PWnD4R0D$jcVtLdLmZ#HQth9I5j|zp)tjK4}Oy@Rxl-*tXpu zvUp}@EeJe0sD&SIZmvytb>z^Av{vg8hdaRH9%1fe?HUUX4rN}CH&z!v+0cS=OlD#9 zWYbz*+gx52g#Sw9=3&;JMJ4iV{i%$vGIz)IWlS3)6YK4SO0E;$417)$Peq4p z+bvI6oO@OyPziM)RHhZX40V&NLyxjZ=U4u0Y860mDywp55~>fzp*g9ZG(s{{_Yap> z+W~8+3OMzdYP6u*+d&1yz{oMM=^)2^W#EVtQDqZlH8s_M+Ua~z)d9s-)!t?lIOwa0 zFusf&qi;~zTsiu%E(D=X#c4?dr4}cpiCrO@jewC#uQ?N?t(GWF*#4m#Oq5(+@&i$F zeJ*UzBTnUwvVOhg3zalF7;mC7%89ovqc+>&GX7#;|3)a^d1J7L%8)1Et?Uthuj;v5)#jnt4g8r(ZK}#uoF|*AnCuqdCObL1QeKi#%Wk?|dSu+P;aLlv)@*1FG#i>BO%AXjbJkY)r0~j?%}IEI z_Dg%H{Q?hr7gF_Jyo;3HHTrzuQKl`@xpjHyoMuP6u8GlJYdSPpnl|mfCPvd%QX7Tb z0VkR)nScr-9uM`kPfkqy^gq!z0L=n3J`ml?-HV~C!Gf} zy-eY)2%m-?&Y(1Ok|=X5b$O|BPg~X=VO(A5Y7qC}z2k5*w0rUJj*uyJ*)hTQU9l?@ zoCsS8)>B6(r67}Y;Z5=gZekAQRxrlVSl>t@gO<=(e+G>sGhIL#G+>&4b$iKVbUq$Q NqLf)c=GW0b{{a~0=@tM0 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/httpcore/__pycache__/_api.cpython-310.pyc b/.venv/lib/python3.10/site-packages/httpcore/__pycache__/_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c6d190d2f472048014c1638bed7858bb85700300 GIT binary patch literal 3325 zcmeHK-Hy{n6trvE5Ot~0vSLF~Q=!CbPl&;uNoU4n zBL%4y+*Z6mUx3%>WB9h}1usyk;ewtswiE9Pq^ft7u;s~_ne#Vi&iQ7-*VdW_Jb(W6 zd-&a|Vf=xe@>7G(H-=$K0YqQ~W@N->&oq&?BCBWV-%76%RDx<$jcdJHZ1?QA-mAxr zUIX|lK`lBFH+xN>E&bZRRf3J+OmOyv-CLp7ENnM%dV3 zFz25Yb80#c*(2w+qQX;L{HVttg77Y9RIDKHsipJzcxnr(62U|r=6wqqd@Asvg$8^# zaX)SVp^WFo%hS(lv)W^GX3Wf)HLJ|3f%$9gfnh-^UZmYderHO6vD2ZV&OTZ2vL>~ywoWz^o? z{ccX(FNp2#%^e&AQ-jv6&Ye!T(;7GneUJ{BUzieL5Q9_>phG$#j0xiD*oI6hkNKHz zi%@~=F&Dua2tdNQI$@Uf@{BFTB9Al4XO0*oL8$ZH6A+Q%Qs2>dWX3!ag;MD?O!!rm z!2ZZ1LQ5y|YRR0)JH_G)cMf(}&>>1|39+xsah$wkNr?L=%9adpXd7^NOHUB-G{-s>pX2AWf zO)QWmPmWhL0bpu~b!;>`ATa2P-)&n0i#V<4!D`#@^OUluZWJE4<0+sP`_j4gxho;2SI3_J#Ct@gTcn%Y_r{?!o{F=e z5}lH#p=n&In%3g2zPbEX&(AL&N3dd@503y7A{DOEM_@Vx;+G7XoOeOf%av#L%>Eug z=s^jh*hzq>Ps8!+I`Ya*1q?lchTXsm`|tBg#l33%niV`r89COqj0aO`X(OUdxipKp9pLMFfsW zazM2*FHszeB7;P5G;ql6A(`@oOgyHD;>7cPDrH_Lxf-n-ndFEkQJ_`P48;;j$)JeO z^~Hh!?7iShJBLYxWq*{gCr~L%7Od}nE()x9R6n3SfYArEhami~(O#SZ$XnpLomFkS z{$5xY=YT(L6o8=7J!>w>!RJ7x2kT&{#h=E|;;{eq-4U^U~kzZ!NR+R`a%3GfQhI ztWTVekUDxP6(?~Fubko(Hi-KAhWX#6H$X*uJ#F^;!vwC0wBHwaTTPp~&JPuwN2#41 zAZfiH^MFQD06H52|5Rl6Wjs03bA35wKHLY38+sp)J$*{*V<=tEHRhPCS6zx4o{j=T omo~lzGf6~m;Qs^p2{fxl!)llt)~adM@q}BSSFcz#q|VO&0raGgIsgCw literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/httpcore/__pycache__/_exceptions.cpython-310.pyc b/.venv/lib/python3.10/site-packages/httpcore/__pycache__/_exceptions.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..680d98e38eec451ab5052ef12b1130f0fb86840f GIT binary patch literal 2389 zcma)-TW{P%6o6;O&R)FNWH*;hnkH!xun&!?5D!QN710Qg$|`CKl~$mYRnk^{I4TXKgI!U?AX(w*&TmkN5sU~`1qA{YAu)*{_GL5^~qi8=1T`8=mBa^P~8 z&%JcdXt(ec;W?gvNqAnkXHK^WT;N6EqG1o%<0asd;Sz9}SAZ*q%fMA$1FnfOJYNB> z^LgNT!&Tq~-T-cx`)j~Wz6iW1YH)uYc!@6qFB_f*Ug0g^mf;29RlWwiX1D=-jjsc* z8($OnI^O`^5KZtc0&nsy;4Q;Tz&H3!;G2e*Io%`e_x`}Vc2Z{;#A!|mJyKB!NzE2W zKf#X?!j|kp^D}vtKUVTcggWt)(f)xP``gDNI`#+seLtS) zLm7R%efuLnfiSn?Abb)$7KwkTbsS11d^FBFl5EG5vYGHm>0j)lpuhrLbHJ3@Y5BDOU;@8?Uky)ZEco% zyGo8HJ4#8_Q8hSs$&2|_M&5)Ye1Fxz2FWUJd>197IF?Ea4l%S0<=~14i{M<%A|P2K zR4%l(-eb?NXKo~`yYWB_r55iRVHun^vIt1l2n+XR7!2MuzzQhe&jKJ>1Job(heD3@ z&c(>SBKs{6-pceyR()w#%E5VvE6n&!Z)avCtGRmqbJ*o;p!+0~BU$C82O{8h^EGgN znwgQT=JF#2wZ*Pp2ia$t8p*Ei2z?^e6Wc(?L4Ge&BiYsG$+oFCK=yT}MzX4lm};AM z6HNCrFOt>knMB*fTcE;;YgV$5+AFCS%1Dc`hDibDkxAT-9;f+lgV-Fn4=1ruSU%Hw z_S0Nkte!tP3?i60R9g5(3l(UoOz}6h*3?CXrAwJwiDf|Hud48eQl`4$7*#l&6n=PR tsuCtsZDNDHd|UlZ3wLHS!RI)sBp*UkAO*V0TxXTmy}FyN`8SW6?tjHDru+Z^ literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/httpcore/__pycache__/_models.cpython-310.pyc b/.venv/lib/python3.10/site-packages/httpcore/__pycache__/_models.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..22be0563f01e4d6762b2e7840ae8ba0e6a27465e GIT binary patch literal 16881 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 Y_%-85>7mlT(t*skppK7azBOt64?IIwIRF3v literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/httpcore/__pycache__/_ssl.cpython-310.pyc b/.venv/lib/python3.10/site-packages/httpcore/__pycache__/_ssl.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c10dda2569a06650f4b1e9390d3b89c729f44303 GIT binary patch literal 438 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 Jug(^%-vLaLN;d!i literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/httpcore/__pycache__/_utils.cpython-310.pyc b/.venv/lib/python3.10/site-packages/httpcore/__pycache__/_utils.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1c01448f6e8a5a0691288f2cbedaa87c4b562b41 GIT binary patch literal 924 zcmYjQ&2H2%5VjLNKrO+cHK?l$aY#5Wlu#s z$M(o;@EE>uKpc1h4m~l>7O4|yW;}oXX2y{_J0k@2`|l5d1B8CL!)@~6@CqTUk3eCF z;SyDNg0a)R(wlg_^e28V$%L>iHe}&fG8r)M6h)&yu3Cicovf~<$&8S-9$TVizPR3V zoSS$fXh+Ag<~C5=w5qmbDrK2tmw!V8kN^_Bae%&o(gC0rses|y@6Z}up%w11v*}%s z-U6vT=AR;i&pbvJo_=h6L)d`fOTW)NG-ORWJi{|IgNCliCx7Lw{FQG8op*^LldJ=% zN;|&ze%g+%7`p^TX7jtgrT+xhf8atqwrh@U>h=MaZT~c8* zEkwyF<2qNOF;X2+p{e2-%cdod`*QoQZwlOY?bC{9wWemC8DPB6q0_b~;6|bACx-H> zF-xcy^LP`MXJsksSzk0(JU@RLQCR~DdLi4AQBhT#iOleF3FX}I;o=I=WhUD|87sGk zk9Ke&>f<9z8d;XnmJM7JwY0uoY8y6XW(uh)JDhRYv{5$DyyUr2ZfPn6W<$kiLK_ag z_wPy{x>-*8f94LJ-UYU| zeGe1-XzQUD;t=13Pdxy0M0%i#fUew2?7NBrJ4(}{g`x2@Ri3l&0E5>1x2@do)#vw( a++z1#RQRHjtS$LVH(u>xw^6vc*Z&6rRr^T* literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/httpcore/_api.py b/.venv/lib/python3.10/site-packages/httpcore/_api.py new file mode 100644 index 0000000..38b961d --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpcore/_api.py @@ -0,0 +1,94 @@ +from __future__ import annotations + +import contextlib +import typing + +from ._models import URL, Extensions, HeaderTypes, Response +from ._sync.connection_pool import ConnectionPool + + +def request( + method: bytes | str, + url: URL | bytes | str, + *, + headers: HeaderTypes = None, + content: bytes | typing.Iterator[bytes] | None = None, + extensions: Extensions | None = None, +) -> Response: + """ + Sends an HTTP request, returning the response. + + ``` + response = httpcore.request("GET", "https://www.example.com/") + ``` + + Arguments: + method: The HTTP method for the request. Typically one of `"GET"`, + `"OPTIONS"`, `"HEAD"`, `"POST"`, `"PUT"`, `"PATCH"`, or `"DELETE"`. + url: The URL of the HTTP request. Either as an instance of `httpcore.URL`, + or as str/bytes. + headers: The HTTP request headers. Either as a dictionary of str/bytes, + or as a list of two-tuples of str/bytes. + content: The content of the request body. Either as bytes, + or as a bytes iterator. + extensions: A dictionary of optional extra information included on the request. + Possible keys include `"timeout"`. + + Returns: + An instance of `httpcore.Response`. + """ + with ConnectionPool() as pool: + return pool.request( + method=method, + url=url, + headers=headers, + content=content, + extensions=extensions, + ) + + +@contextlib.contextmanager +def stream( + method: bytes | str, + url: URL | bytes | str, + *, + headers: HeaderTypes = None, + content: bytes | typing.Iterator[bytes] | None = None, + extensions: Extensions | None = None, +) -> typing.Iterator[Response]: + """ + Sends an HTTP request, returning the response within a content manager. + + ``` + with httpcore.stream("GET", "https://www.example.com/") as response: + ... + ``` + + When using the `stream()` function, the body of the response will not be + automatically read. If you want to access the response body you should + either use `content = response.read()`, or `for chunk in response.iter_content()`. + + Arguments: + method: The HTTP method for the request. Typically one of `"GET"`, + `"OPTIONS"`, `"HEAD"`, `"POST"`, `"PUT"`, `"PATCH"`, or `"DELETE"`. + url: The URL of the HTTP request. Either as an instance of `httpcore.URL`, + or as str/bytes. + headers: The HTTP request headers. Either as a dictionary of str/bytes, + or as a list of two-tuples of str/bytes. + content: The content of the request body. Either as bytes, + or as a bytes iterator. + extensions: A dictionary of optional extra information included on the request. + Possible keys include `"timeout"`. + + Returns: + An instance of `httpcore.Response`. + """ + with ConnectionPool() as pool: + with pool.stream( + method=method, + url=url, + headers=headers, + content=content, + extensions=extensions, + ) as response: + yield response diff --git a/.venv/lib/python3.10/site-packages/httpcore/_async/__init__.py b/.venv/lib/python3.10/site-packages/httpcore/_async/__init__.py new file mode 100644 index 0000000..88dc7f0 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpcore/_async/__init__.py @@ -0,0 +1,39 @@ +from .connection import AsyncHTTPConnection +from .connection_pool import AsyncConnectionPool +from .http11 import AsyncHTTP11Connection +from .http_proxy import AsyncHTTPProxy +from .interfaces import AsyncConnectionInterface + +try: + from .http2 import AsyncHTTP2Connection +except ImportError: # pragma: nocover + + class AsyncHTTP2Connection: # type: ignore + def __init__(self, *args, **kwargs) -> None: # type: ignore + raise RuntimeError( + "Attempted to use http2 support, but the `h2` package is not " + "installed. Use 'pip install httpcore[http2]'." + ) + + +try: + from .socks_proxy import AsyncSOCKSProxy +except ImportError: # pragma: nocover + + class AsyncSOCKSProxy: # type: ignore + def __init__(self, *args, **kwargs) -> None: # type: ignore + raise RuntimeError( + "Attempted to use SOCKS support, but the `socksio` package is not " + "installed. Use 'pip install httpcore[socks]'." + ) + + +__all__ = [ + "AsyncHTTPConnection", + "AsyncConnectionPool", + "AsyncHTTPProxy", + "AsyncHTTP11Connection", + "AsyncHTTP2Connection", + "AsyncConnectionInterface", + "AsyncSOCKSProxy", +] diff --git a/.venv/lib/python3.10/site-packages/httpcore/_async/__pycache__/__init__.cpython-310.pyc b/.venv/lib/python3.10/site-packages/httpcore/_async/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c4336ff0d0721bedb9bf6c36b36c74e08514c006 GIT binary patch literal 1436 zcmbVLOK;RL5Vo_~N3)L>C=Y><*u%eRm5Czp`VcsRNmaJU7# z_yB|xP7{*SkW%EG#7Qe*#qyQJO{-zm@@`T~>tWsU)ufRwgbS1$G{B>lcxf|iQu35! zOD++u@pVe@yGMAPH{KE6c`5s$T*hsT@X(FBi9>9Iq2>pcw@ zd3%F&J6|b0xl7Hd+r>DG?mvFKen)1Rh;%HonRqT*mofqI>6vxEKUadHGgGW9xjzQU zIV+hPJ;=0B+k;4eZh2*Mj?6`lCYlL#^`_zZm7YRQj^N zHPXHw3V(CBvgzl8Xm_w9{J8Klsr@)B^dLzD@A*%_^HLt?Q<)7DNhO}!crPyXCe*YZ zjWQjl;;vFsO)ADMM6zw%f!ZldZTB_)Cq$iqCw_k#3}q?;!Gm1Mmw-nR6r-(exgYfQ zM79?s@m7$J^-yNldi|?G5o>Yf_v?xPuf)3pHb7JZ#^Nm2jP>%dX-p3-EJqE9Lmle= zJh*rq7`>_W#8C@iyE<_(LN-VRW5#1Fm3)*S-(u|5Xpoc|bqZ{4B1gzclp#z_*oQDj zq(M5=N}v}O?e!aLcOGuo*7;`}D1;CIzW~4TP5(q&;n*U|*#B+b>uYPP5Myh!+FdeUG#hX0VHW2Cmcw-05T=GL)bHCU#=`@HKHMMM*v5;eLtNPC zrfQqKoWbUU6eq{_xM|vw{Px9%nmS`JGK?LUm}%T7`{^dmZ{Y)JkrpjK$5{gIq~rW> JyeZf6egUh*YJdO$ literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/httpcore/_async/__pycache__/connection.cpython-310.pyc b/.venv/lib/python3.10/site-packages/httpcore/_async/__pycache__/connection.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b06828807aa159d919d1f9b17af078c219fb4765 GIT binary patch literal 6827 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/httpcore/_async/__pycache__/connection_pool.cpython-310.pyc b/.venv/lib/python3.10/site-packages/httpcore/_async/__pycache__/connection_pool.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4ad35e5db25b70e9423f55584ae7abf85470dcff GIT binary patch literal 13027 zcmb_jOK=>=d7hb_oqb>dEI{y0OJi9QwKl!rONGfl_uqg2uWmNS$Fmwf|MiQ1ss3nQ)Bcl%{*Q^mIZe~Oe@8}WLa%9cy`<~R z8#SY3sK1F)Lj5&Mruv&KB}GD*HLIQ~rO-AZlC^X_Q_9q{rK~DjwXu4xl&g=I##K30 zo2XBgChPf9zCKl&s!x}u6+B(rQ=ci#)c2P5*7ue60hSTj+Wz{1(gBqps~xN#DjljH zE*;jjmoK1j>0ah4K_?pAg2PR+#>PYc1%(nA2!9 zeaEjh8{WbPMg%g0*bF=0Kd){n#t+lnL^j&dPHvML$Su2=<^}4Lysy2coVD~nH z)En-dmh1UJ`VH4x12S$Q5oFa&m+ra^KiIGGiz`*PCgz<+#jVv8*1@EzSXz;;BVKD( zZhxSMiwMztWohYZ4>2s}fNI_YU1|8PTy`pMuvgVYcyz%P5~}~xWsD1ex>`vW8kk|9 zNDAv66YQ{`8-<)H4u~<4LoS&a7YD^5F(szoNtP^eSj>pMfTzSbw&F;TR})`tHfu2v zQZl559K#%eC0)NI8-cmd1cA9n@rQZ-z`(k90GW>7(aK;^q`GfB;9oH4qV~SNP%!0Q zvBY5;AYCq38&$ttp2lpRg~ZY=J*T%14pXQYx0DBo*psS$hfTFR_Qw-#2HiuVb+lFe zk?~l==>owdsaZ&<;pHLZgM{b$1w$T2K7^7aiZ1dKteaWM9AoJd zdi$A?W$e_aLI#dM%y)N~WKnyo`MTO$2%#ZVxuXi-_w^9fAuRKin(N3u47r{NLlF9t zBNz_1UkFluweB`s{#I_e)^z-c#FEI3FlPe5pOHCFBl9+xa}^6{X);f0uNoa)=nwTP zfV~2`N42`Q|BKqUR9hSmV*x998odWL!(4Z&-Q8eqxDjfxYB%<f z?q?G-*bqx^KRvSG9XbZ)O>pS$`@%8frN#T9hfMO+4!C8iUKzr!<%*-kh})ah+lNLl z={Adwu960FA4eo#0ZQhVTviYIzR}BvOl&Ih$!EIFxKrR{HBf>1G*4c`sk`NJkS&+% zP0^|`pDP1Trxw=8Cpf?-nS6@Lb4)(Xq{m`i`b(axDg3+%Bx$TKo6MRb~`sV<5#j0LPWDI=6)XXF^mMQ}#&Wj7;3GpOEsww8hr^M3~wXP*Dif6^qcgzPm z1ned88F38oG@zdqMdUK#vN$eIAeR*{i<9CMa%18Zaauf&TrM14ToGRsFN&8i_PBUe zd_kN;-GtJduSNQ=Cu}IV+s|ihe9qfFsb*8E+2BCC?%b|6ZrM~tb|l!nqH4eJ0a<71 zvg9!j#yqdalj*zn{H?tx6c-m?!#pfUrz}W9^4{Cn$|*IRVt;ggQioE#4JY~*2WezzhlI;c+VkaSV$ewZESWPrg0?h1~3bsFjnSdpI3x^rG z)#L;AOLme-QyoCd=}ro1rjtgR?PQRSb+SlvoiR1e3;y^64P%c1Hqpr;oxDXQoLA|T zKdr>}9-&jRIfqj?`Q#gZeiz>9cDm|F99vMzo9n_jSRW_N+2TT@ILU9?Ezeb) zdDoTINt8U%~nm=POa8lFM==|w&VM5ea*K)6%XdF?ZijaZZ=R*y>=XPU5(`4tGKSf ztX0o;>dh8V3YUi?a@$6+TEi$k1Z}p9ZR63!_YP#Qi?-q1Em^{pf^10+}u+)!c(>D1ZM_kI8zuTB^2eHebw<-NEOF^ zvr)ZgUu^Pt*o#Ud5>7!~ZFoL>TME9V`KxxQE{CM_kiu158R}luo&It>98cYf(-1Y% zJL+d&nSFf_yFsNq7o!v@>G0&QICs^kI9t_5rPdOz7^GVyVtQCdEI7#G>yFps#eR*j zP?&)U+NVqctE|i)_+lGgkb+|Hs%wq?@Y4!`+?xosr~$tBxIlxs5IjT>C0&WJtmz-p>Uj?8eH5ic+a zXb!)5T4cXMCie2A%N)Hxq2Gl&Aqmylu$K7{RI`vbLGP2(a$@Mwn2gNi`0~7!#?7)*>Q#B8?vTO%pw6 z@e!YJ&i)>wGiM%V7BzorN4%yn&K~?`I1he%MfPD9_TJb+!B9aBGKlxQ2jfo*vnw)> zJfd-72x?K)_s9+ZET{Os98x;Sh9#%vuLR@Ltv7u)s*;LhhFIhrCnCF&!7)o{jbCoc zbw`S!0GTEK01bojaE2Ag9oUw^R9Nggin4@eAupao4x@%Knxz(kfVH7PGip%zHFmkq zM0MT`)k0Q&nT>X;-;LV~`{X6`2@)+?3oNg);?`aGQzT?4GUQh{B*zU*(oJ4u`Bf&b zG5Hdc-$xQ;Nu{XMH3Cu*6+(o*&W2M=7MQ%wPxmEb9899PfeFo2CFjYao z68qK@4)@X2W78}`6FJ>5a3*y_H@jc!SJ`X~k87;0TsmwSL&EmfFO6J(-*^=37f}?d z$6o3*k6^R)1WW_}+R(}GhDEP`d^E)8G1ni^&C#9zfOp$f3~#7dCKMirr%oF*csx6@ z>}wlPDt$&^cL4A$3`M8DR&(dFUFeM)H^Rtc7jpLO+0cyZQP}HNUhC%Qdc3GsImop3 zwWDMNZ*F!rnypxA*5^*2K6Uh1*UUU-pPyg4^5sj%>?m?;&(j5%v(H>Vd+h&fiYpgi z8=c_u*U#F&^$bI6_}uYs4#rP)z`&c-2I)tc zPV%v?YhTes+SE+#0W?e_eM0ljtpm#MSMh6K&XDb`cXNzoKFR_gYoy0l`+K0(SjT$I z2xwYGK$ELEL?p5*CJM-Asy)_8JsR&MS100Do9VA;jd4@+CpW$u&fQ5q$}?{LRjpyH zBl>XXWwbbr7E>GltZSPYVD?W@pnr&UjGu_HhY93Ok$Y%DD2%rscll^hx!sM>lZ~vSV{j`4 zd?(&}(8G*kXW`9Iv3Km3=y&5^C`8~$Rw)r<>BSm2|+tI?DcCQE}9Urc_s4Mci?j zlptXU%?pfm*q-a2*DmxAx&q@DqqTZ>WZe<$qwORoD605vVA4}xSd!0z`EfU9g&4y! z05~=(WrLNtT!U-pw>&9O3{p6SKCjTSh$FfUk5_$#!?KJzd4mls0e>EPK23;6Na7a4 zeQ&bJIIdhG%yQP&uv5X4xW7>s9T5q=!5a@Rm@ZdpO|M_Gc`8^O%qX|R4ex)tDDzTE z(iT!-vzOI5M)S&N~ zS}tt(?xNaXm==dwr{=tYT#$|~GrTZJzD8Jz_+y(@cs)oX#;GnOg9L&-Ln2OYpu@l7 z=Pe^K?&qvDR5ldvb~<6`S^S+ab9&lH8x#5wnAwJ&*0YHtALh;J1PpJ()F-xciCoh7 zA0uV_x4CZuNPLQ^w=6w<-}u#Zq{i9P+%^-|R{OajrL4r~PP84+(IhdAzyt+n z34-&MwyDQ@`l5FI^Aw&GqLPNI{wUEgDDv*405t)9x*yunA0_+hE!3a$Q$iQUJ4*9k z)E+>1QrO%!<+%tfLjz7vbOEqhrax?pV=CeKhE; z_O}>=Hc!gA)Nk{A$!XvUR0$~_On21mQI-mXo;q2SFmR}wa8z$~rDS~C`eGp=?lXN*j~Zv;m1_>OnB*%xWRfYNJcpT&m#oa4`E z?U#2tV821^6<<_A0`Dv`@tC{gejvs@9pf%>89IQ!x?96--uKWn6j+1SmHa*`iojY~ zRR^?@$>@3S;bEs~rU*42PR2vP=^p7gwu95crkk!fjdCPSBBl#+AZ0gdEx(KLa4D;t z9EFn#Fc6&+M2EhtrO_!dKC}|XhXz6mBgnR=m1p#?NVx+0`_}_Kk?82kWLHlcdh0VoyQ<5y zY6bDTl0W4#hmQH50d}o#g^4UIfg>NyB%&7s^IgA5*#RNl23Cd6@D8H=vXJ4bqIU}6 zY?Kf~^YS5p1FO-MyF-$%wIzj(o0@MmpZfAf0$G1w>YRI?tqB$4^i1ZzB2)(y9TEFofN9<&Hb@zggPU9SOzs>ZC_q$XCrUSo3q;) z+rj(AyY4Z&ow7r*-X8CrFE&Z4%g!zR#kOHzYbU^kZR7gcf<-2&)L_4r%kmf(uDmCu zUzBP}Ru~wH{13drQ%(7>CYXwpY`Oc~2P(LGrU|9a2=?Im8?W<-URTwGz#;t;?CWdU z8^{Z02p`rzj30;h5qNsH+zcjrJrrR0Ea0I~xIGP0(#A^D5J!1LDye|7P)u21=bce_0ZhbiP17UXdZv#=07gIU0*a3~D6o+KqtF*(iTc_wF=sGAU#`y7kU zFj03R1?JSnh|0ad;)_gPVse&=x+hV&b1a@`a)AlXW#2<8$OdH(WV+C40c+adkSm1IPn9$-l)h2IPyUd_M@;^XNl)ta&MPq` z<{rtM)=b^7=-!Tgb3e~sHJ*pLF_nE8UkjE9oLxiD{TdIxI7$V-flmUZbCiUiMyC7V zYbts@n-J6LNi*Nk?orQ~@wiLmA%SM(Tj-#I09%K{AV5*ckvIl$?I!$v@4B+X!uSQF zA_|EfJ$KX_N-%TrgRh40eg{!SqzUQ|yhyx^5KF2Y1z^U@{SlZTsfwr$4bfP`FlG^A zq>$;+T3LPEw(syjQ9W4j{4E@#_Wr@(Mfb*Shh_Us87+H2Jd?)MI`anT{01^_8|^7- zos(KSa|$-uD+p=QDfluBggePI3~*wJ2p#Gh&mnY(tGG6<+87mxRVV_g8p405`=-J0 zU;I$^#~59A;%bH;lGcP9_sL`kHql(Zf8?XAnWxQyCoLx^>EUo^Ljg;iGhD25p7U?Vr$W6U9fL3- zwD2U&)8!Vz!+57Ex%)7;yqcsp5+rGMdUBKbiTDkoSH!hnGrYC$1KvcmQ6|w+(l8Fj z;4Vg?M=uOYlB;l<@g~--dEp&5PgL)A0&f8Lo_$3&8`ZXoI;&^(Y7^BRf9SXH$`DaZ z8r1yX2A;YpmwPxAc|R0SO0w-hiXi=B_$c=*$e}5RKBv*w;WuaGv55!t8MT=ciTok$ KE$yx8ul+AM5z|Hh literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/httpcore/_async/__pycache__/http11.cpython-310.pyc b/.venv/lib/python3.10/site-packages/httpcore/_async/__pycache__/http11.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3f72b6b52a401e89a24c1846ac5fbc69a262d041 GIT binary patch literal 11593 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%0Ah)icv-4NUhg0pyt4 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

jPIQ_Gb_)_%Y^8Kjbdo6w-vPANg>~~j=PtTv z_jKos(;Mdf#QdVldAx?6@CH1@g#McFp84fD=Se1k6x-)Kt37=GWxW3a&0-b^g4@jZ zhp=~gde8c}!8T*Z$-Ea@yV$2yV2`BnKXA>*f}GZi{7dSV-7B7H5z6lqpl|1-fy4sjR=c=5 zeqrOWiU20*aIjbL`Ov7cKpgr8JMeINdQ~Da-B4fdPQ?*XBR-$(!e literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/httpcore/_async/__pycache__/http_proxy.cpython-310.pyc b/.venv/lib/python3.10/site-packages/httpcore/_async/__pycache__/http_proxy.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f95a18727271df6d9c9275ef6bcabd2112c58770 GIT binary patch literal 12409 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/httpcore/_async/__pycache__/socks_proxy.cpython-310.pyc b/.venv/lib/python3.10/site-packages/httpcore/_async/__pycache__/socks_proxy.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a116057bf68d6277f8db04723245fad5592c8e65 GIT binary patch literal 10273 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 F{{>x-pQHc) literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/httpcore/_async/connection.py b/.venv/lib/python3.10/site-packages/httpcore/_async/connection.py new file mode 100644 index 0000000..b42581d --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpcore/_async/connection.py @@ -0,0 +1,222 @@ +from __future__ import annotations + +import itertools +import logging +import ssl +import types +import typing + +from .._backends.auto import AutoBackend +from .._backends.base import SOCKET_OPTION, AsyncNetworkBackend, AsyncNetworkStream +from .._exceptions import ConnectError, ConnectTimeout +from .._models import Origin, Request, Response +from .._ssl import default_ssl_context +from .._synchronization import AsyncLock +from .._trace import Trace +from .http11 import AsyncHTTP11Connection +from .interfaces import AsyncConnectionInterface + +RETRIES_BACKOFF_FACTOR = 0.5 # 0s, 0.5s, 1s, 2s, 4s, etc. + + +logger = logging.getLogger("httpcore.connection") + + +def exponential_backoff(factor: float) -> typing.Iterator[float]: + """ + Generate a geometric sequence that has a ratio of 2 and starts with 0. + + For example: + - `factor = 2`: `0, 2, 4, 8, 16, 32, 64, ...` + - `factor = 3`: `0, 3, 6, 12, 24, 48, 96, ...` + """ + yield 0 + for n in itertools.count(): + yield factor * 2**n + + +class AsyncHTTPConnection(AsyncConnectionInterface): + def __init__( + self, + origin: Origin, + ssl_context: ssl.SSLContext | None = None, + keepalive_expiry: float | None = None, + http1: bool = True, + http2: bool = False, + retries: int = 0, + local_address: str | None = None, + uds: str | None = None, + network_backend: AsyncNetworkBackend | None = None, + socket_options: typing.Iterable[SOCKET_OPTION] | None = None, + ) -> None: + self._origin = origin + self._ssl_context = ssl_context + self._keepalive_expiry = keepalive_expiry + self._http1 = http1 + self._http2 = http2 + self._retries = retries + self._local_address = local_address + self._uds = uds + + self._network_backend: AsyncNetworkBackend = ( + AutoBackend() if network_backend is None else network_backend + ) + self._connection: AsyncConnectionInterface | None = None + self._connect_failed: bool = False + self._request_lock = AsyncLock() + self._socket_options = socket_options + + async def handle_async_request(self, request: Request) -> Response: + if not self.can_handle_request(request.url.origin): + raise RuntimeError( + f"Attempted to send request to {request.url.origin} on connection to {self._origin}" + ) + + try: + async with self._request_lock: + if self._connection is None: + stream = await self._connect(request) + + ssl_object = stream.get_extra_info("ssl_object") + http2_negotiated = ( + ssl_object is not None + and ssl_object.selected_alpn_protocol() == "h2" + ) + if http2_negotiated or (self._http2 and not self._http1): + from .http2 import AsyncHTTP2Connection + + self._connection = AsyncHTTP2Connection( + origin=self._origin, + stream=stream, + keepalive_expiry=self._keepalive_expiry, + ) + else: + self._connection = AsyncHTTP11Connection( + origin=self._origin, + stream=stream, + keepalive_expiry=self._keepalive_expiry, + ) + except BaseException as exc: + self._connect_failed = True + raise exc + + return await self._connection.handle_async_request(request) + + async def _connect(self, request: Request) -> AsyncNetworkStream: + timeouts = request.extensions.get("timeout", {}) + sni_hostname = request.extensions.get("sni_hostname", None) + timeout = timeouts.get("connect", None) + + retries_left = self._retries + delays = exponential_backoff(factor=RETRIES_BACKOFF_FACTOR) + + while True: + try: + if self._uds is None: + kwargs = { + "host": self._origin.host.decode("ascii"), + "port": self._origin.port, + "local_address": self._local_address, + "timeout": timeout, + "socket_options": self._socket_options, + } + async with Trace("connect_tcp", logger, request, kwargs) as trace: + stream = await self._network_backend.connect_tcp(**kwargs) + trace.return_value = stream + else: + kwargs = { + "path": self._uds, + "timeout": timeout, + "socket_options": self._socket_options, + } + async with Trace( + "connect_unix_socket", logger, request, kwargs + ) as trace: + stream = await self._network_backend.connect_unix_socket( + **kwargs + ) + trace.return_value = stream + + if self._origin.scheme in (b"https", b"wss"): + ssl_context = ( + default_ssl_context() + if self._ssl_context is None + else self._ssl_context + ) + alpn_protocols = ["http/1.1", "h2"] if self._http2 else ["http/1.1"] + ssl_context.set_alpn_protocols(alpn_protocols) + + kwargs = { + "ssl_context": ssl_context, + "server_hostname": sni_hostname + or self._origin.host.decode("ascii"), + "timeout": timeout, + } + async with Trace("start_tls", logger, request, kwargs) as trace: + stream = await stream.start_tls(**kwargs) + trace.return_value = stream + return stream + except (ConnectError, ConnectTimeout): + if retries_left <= 0: + raise + retries_left -= 1 + delay = next(delays) + async with Trace("retry", logger, request, kwargs) as trace: + await self._network_backend.sleep(delay) + + def can_handle_request(self, origin: Origin) -> bool: + return origin == self._origin + + async def aclose(self) -> None: + if self._connection is not None: + async with Trace("close", logger, None, {}): + await self._connection.aclose() + + def is_available(self) -> bool: + if self._connection is None: + # If HTTP/2 support is enabled, and the resulting connection could + # end up as HTTP/2 then we should indicate the connection as being + # available to service multiple requests. + return ( + self._http2 + and (self._origin.scheme == b"https" or not self._http1) + and not self._connect_failed + ) + return self._connection.is_available() + + def has_expired(self) -> bool: + if self._connection is None: + return self._connect_failed + return self._connection.has_expired() + + def is_idle(self) -> bool: + if self._connection is None: + return self._connect_failed + return self._connection.is_idle() + + def is_closed(self) -> bool: + if self._connection is None: + return self._connect_failed + return self._connection.is_closed() + + def info(self) -> str: + if self._connection is None: + return "CONNECTION FAILED" if self._connect_failed else "CONNECTING" + return self._connection.info() + + def __repr__(self) -> str: + return f"<{self.__class__.__name__} [{self.info()}]>" + + # These context managers are not used in the standard flow, but are + # useful for testing or working with connection instances directly. + + async def __aenter__(self) -> AsyncHTTPConnection: + return self + + async def __aexit__( + self, + exc_type: type[BaseException] | None = None, + exc_value: BaseException | None = None, + traceback: types.TracebackType | None = None, + ) -> None: + await self.aclose() diff --git a/.venv/lib/python3.10/site-packages/httpcore/_async/connection_pool.py b/.venv/lib/python3.10/site-packages/httpcore/_async/connection_pool.py new file mode 100644 index 0000000..96e973d --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpcore/_async/connection_pool.py @@ -0,0 +1,420 @@ +from __future__ import annotations + +import ssl +import sys +import types +import typing + +from .._backends.auto import AutoBackend +from .._backends.base import SOCKET_OPTION, AsyncNetworkBackend +from .._exceptions import ConnectionNotAvailable, UnsupportedProtocol +from .._models import Origin, Proxy, Request, Response +from .._synchronization import AsyncEvent, AsyncShieldCancellation, AsyncThreadLock +from .connection import AsyncHTTPConnection +from .interfaces import AsyncConnectionInterface, AsyncRequestInterface + + +class AsyncPoolRequest: + def __init__(self, request: Request) -> None: + self.request = request + self.connection: AsyncConnectionInterface | None = None + self._connection_acquired = AsyncEvent() + + def assign_to_connection(self, connection: AsyncConnectionInterface | None) -> None: + self.connection = connection + self._connection_acquired.set() + + def clear_connection(self) -> None: + self.connection = None + self._connection_acquired = AsyncEvent() + + async def wait_for_connection( + self, timeout: float | None = None + ) -> AsyncConnectionInterface: + if self.connection is None: + await self._connection_acquired.wait(timeout=timeout) + assert self.connection is not None + return self.connection + + def is_queued(self) -> bool: + return self.connection is None + + +class AsyncConnectionPool(AsyncRequestInterface): + """ + A connection pool for making HTTP requests. + """ + + def __init__( + self, + ssl_context: ssl.SSLContext | None = None, + proxy: Proxy | None = None, + max_connections: int | None = 10, + max_keepalive_connections: int | None = None, + keepalive_expiry: float | None = None, + http1: bool = True, + http2: bool = False, + retries: int = 0, + local_address: str | None = None, + uds: str | None = None, + network_backend: AsyncNetworkBackend | None = None, + socket_options: typing.Iterable[SOCKET_OPTION] | None = None, + ) -> None: + """ + A connection pool for making HTTP requests. + + Parameters: + ssl_context: An SSL context to use for verifying connections. + If not specified, the default `httpcore.default_ssl_context()` + will be used. + max_connections: The maximum number of concurrent HTTP connections that + the pool should allow. Any attempt to send a request on a pool that + would exceed this amount will block until a connection is available. + max_keepalive_connections: The maximum number of idle HTTP connections + that will be maintained in the pool. + keepalive_expiry: The duration in seconds that an idle HTTP connection + may be maintained for before being expired from the pool. + http1: A boolean indicating if HTTP/1.1 requests should be supported + by the connection pool. Defaults to True. + http2: A boolean indicating if HTTP/2 requests should be supported by + the connection pool. Defaults to False. + retries: The maximum number of retries when trying to establish a + connection. + local_address: Local address to connect from. Can also be used to connect + using a particular address family. Using `local_address="0.0.0.0"` + will connect using an `AF_INET` address (IPv4), while using + `local_address="::"` will connect using an `AF_INET6` address (IPv6). + uds: Path to a Unix Domain Socket to use instead of TCP sockets. + network_backend: A backend instance to use for handling network I/O. + socket_options: Socket options that have to be included + in the TCP socket when the connection was established. + """ + self._ssl_context = ssl_context + self._proxy = proxy + self._max_connections = ( + sys.maxsize if max_connections is None else max_connections + ) + self._max_keepalive_connections = ( + sys.maxsize + if max_keepalive_connections is None + else max_keepalive_connections + ) + self._max_keepalive_connections = min( + self._max_connections, self._max_keepalive_connections + ) + + self._keepalive_expiry = keepalive_expiry + self._http1 = http1 + self._http2 = http2 + self._retries = retries + self._local_address = local_address + self._uds = uds + + self._network_backend = ( + AutoBackend() if network_backend is None else network_backend + ) + self._socket_options = socket_options + + # The mutable state on a connection pool is the queue of incoming requests, + # and the set of connections that are servicing those requests. + self._connections: list[AsyncConnectionInterface] = [] + self._requests: list[AsyncPoolRequest] = [] + + # We only mutate the state of the connection pool within an 'optional_thread_lock' + # context. This holds a threading lock unless we're running in async mode, + # in which case it is a no-op. + self._optional_thread_lock = AsyncThreadLock() + + def create_connection(self, origin: Origin) -> AsyncConnectionInterface: + if self._proxy is not None: + if self._proxy.url.scheme in (b"socks5", b"socks5h"): + from .socks_proxy import AsyncSocks5Connection + + return AsyncSocks5Connection( + proxy_origin=self._proxy.url.origin, + proxy_auth=self._proxy.auth, + remote_origin=origin, + ssl_context=self._ssl_context, + keepalive_expiry=self._keepalive_expiry, + http1=self._http1, + http2=self._http2, + network_backend=self._network_backend, + ) + elif origin.scheme == b"http": + from .http_proxy import AsyncForwardHTTPConnection + + return AsyncForwardHTTPConnection( + proxy_origin=self._proxy.url.origin, + proxy_headers=self._proxy.headers, + proxy_ssl_context=self._proxy.ssl_context, + remote_origin=origin, + keepalive_expiry=self._keepalive_expiry, + network_backend=self._network_backend, + ) + from .http_proxy import AsyncTunnelHTTPConnection + + return AsyncTunnelHTTPConnection( + proxy_origin=self._proxy.url.origin, + proxy_headers=self._proxy.headers, + proxy_ssl_context=self._proxy.ssl_context, + remote_origin=origin, + ssl_context=self._ssl_context, + keepalive_expiry=self._keepalive_expiry, + http1=self._http1, + http2=self._http2, + network_backend=self._network_backend, + ) + + return AsyncHTTPConnection( + origin=origin, + ssl_context=self._ssl_context, + keepalive_expiry=self._keepalive_expiry, + http1=self._http1, + http2=self._http2, + retries=self._retries, + local_address=self._local_address, + uds=self._uds, + network_backend=self._network_backend, + socket_options=self._socket_options, + ) + + @property + def connections(self) -> list[AsyncConnectionInterface]: + """ + Return a list of the connections currently in the pool. + + For example: + + ```python + >>> pool.connections + [ + , + , + , + ] + ``` + """ + return list(self._connections) + + async def handle_async_request(self, request: Request) -> Response: + """ + Send an HTTP request, and return an HTTP response. + + This is the core implementation that is called into by `.request()` or `.stream()`. + """ + scheme = request.url.scheme.decode() + if scheme == "": + raise UnsupportedProtocol( + "Request URL is missing an 'http://' or 'https://' protocol." + ) + if scheme not in ("http", "https", "ws", "wss"): + raise UnsupportedProtocol( + f"Request URL has an unsupported protocol '{scheme}://'." + ) + + timeouts = request.extensions.get("timeout", {}) + timeout = timeouts.get("pool", None) + + with self._optional_thread_lock: + # Add the incoming request to our request queue. + pool_request = AsyncPoolRequest(request) + self._requests.append(pool_request) + + try: + while True: + with self._optional_thread_lock: + # Assign incoming requests to available connections, + # closing or creating new connections as required. + closing = self._assign_requests_to_connections() + await self._close_connections(closing) + + # Wait until this request has an assigned connection. + connection = await pool_request.wait_for_connection(timeout=timeout) + + try: + # Send the request on the assigned connection. + response = await connection.handle_async_request( + pool_request.request + ) + except ConnectionNotAvailable: + # In some cases a connection may initially be available to + # handle a request, but then become unavailable. + # + # In this case we clear the connection and try again. + pool_request.clear_connection() + else: + break # pragma: nocover + + except BaseException as exc: + with self._optional_thread_lock: + # For any exception or cancellation we remove the request from + # the queue, and then re-assign requests to connections. + self._requests.remove(pool_request) + closing = self._assign_requests_to_connections() + + await self._close_connections(closing) + raise exc from None + + # Return the response. Note that in this case we still have to manage + # the point at which the response is closed. + assert isinstance(response.stream, typing.AsyncIterable) + return Response( + status=response.status, + headers=response.headers, + content=PoolByteStream( + stream=response.stream, pool_request=pool_request, pool=self + ), + extensions=response.extensions, + ) + + def _assign_requests_to_connections(self) -> list[AsyncConnectionInterface]: + """ + Manage the state of the connection pool, assigning incoming + requests to connections as available. + + Called whenever a new request is added or removed from the pool. + + Any closing connections are returned, allowing the I/O for closing + those connections to be handled seperately. + """ + closing_connections = [] + + # First we handle cleaning up any connections that are closed, + # have expired their keep-alive, or surplus idle connections. + for connection in list(self._connections): + if connection.is_closed(): + # log: "removing closed connection" + self._connections.remove(connection) + elif connection.has_expired(): + # log: "closing expired connection" + self._connections.remove(connection) + closing_connections.append(connection) + elif ( + connection.is_idle() + and len([connection.is_idle() for connection in self._connections]) + > self._max_keepalive_connections + ): + # log: "closing idle connection" + self._connections.remove(connection) + closing_connections.append(connection) + + # Assign queued requests to connections. + queued_requests = [request for request in self._requests if request.is_queued()] + for pool_request in queued_requests: + origin = pool_request.request.url.origin + available_connections = [ + connection + for connection in self._connections + if connection.can_handle_request(origin) and connection.is_available() + ] + idle_connections = [ + connection for connection in self._connections if connection.is_idle() + ] + + # There are three cases for how we may be able to handle the request: + # + # 1. There is an existing connection that can handle the request. + # 2. We can create a new connection to handle the request. + # 3. We can close an idle connection and then create a new connection + # to handle the request. + if available_connections: + # log: "reusing existing connection" + connection = available_connections[0] + pool_request.assign_to_connection(connection) + elif len(self._connections) < self._max_connections: + # log: "creating new connection" + connection = self.create_connection(origin) + self._connections.append(connection) + pool_request.assign_to_connection(connection) + elif idle_connections: + # log: "closing idle connection" + connection = idle_connections[0] + self._connections.remove(connection) + closing_connections.append(connection) + # log: "creating new connection" + connection = self.create_connection(origin) + self._connections.append(connection) + pool_request.assign_to_connection(connection) + + return closing_connections + + async def _close_connections(self, closing: list[AsyncConnectionInterface]) -> None: + # Close connections which have been removed from the pool. + with AsyncShieldCancellation(): + for connection in closing: + await connection.aclose() + + async def aclose(self) -> None: + # Explicitly close the connection pool. + # Clears all existing requests and connections. + with self._optional_thread_lock: + closing_connections = list(self._connections) + self._connections = [] + await self._close_connections(closing_connections) + + async def __aenter__(self) -> AsyncConnectionPool: + return self + + async def __aexit__( + self, + exc_type: type[BaseException] | None = None, + exc_value: BaseException | None = None, + traceback: types.TracebackType | None = None, + ) -> None: + await self.aclose() + + def __repr__(self) -> str: + class_name = self.__class__.__name__ + with self._optional_thread_lock: + request_is_queued = [request.is_queued() for request in self._requests] + connection_is_idle = [ + connection.is_idle() for connection in self._connections + ] + + num_active_requests = request_is_queued.count(False) + num_queued_requests = request_is_queued.count(True) + num_active_connections = connection_is_idle.count(False) + num_idle_connections = connection_is_idle.count(True) + + requests_info = ( + f"Requests: {num_active_requests} active, {num_queued_requests} queued" + ) + connection_info = ( + f"Connections: {num_active_connections} active, {num_idle_connections} idle" + ) + + return f"<{class_name} [{requests_info} | {connection_info}]>" + + +class PoolByteStream: + def __init__( + self, + stream: typing.AsyncIterable[bytes], + pool_request: AsyncPoolRequest, + pool: AsyncConnectionPool, + ) -> None: + self._stream = stream + self._pool_request = pool_request + self._pool = pool + self._closed = False + + async def __aiter__(self) -> typing.AsyncIterator[bytes]: + try: + async for part in self._stream: + yield part + except BaseException as exc: + await self.aclose() + raise exc from None + + async def aclose(self) -> None: + if not self._closed: + self._closed = True + with AsyncShieldCancellation(): + if hasattr(self._stream, "aclose"): + await self._stream.aclose() + + with self._pool._optional_thread_lock: + self._pool._requests.remove(self._pool_request) + closing = self._pool._assign_requests_to_connections() + + await self._pool._close_connections(closing) diff --git a/.venv/lib/python3.10/site-packages/httpcore/_async/http11.py b/.venv/lib/python3.10/site-packages/httpcore/_async/http11.py new file mode 100644 index 0000000..e6d6d70 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpcore/_async/http11.py @@ -0,0 +1,379 @@ +from __future__ import annotations + +import enum +import logging +import ssl +import time +import types +import typing + +import h11 + +from .._backends.base import AsyncNetworkStream +from .._exceptions import ( + ConnectionNotAvailable, + LocalProtocolError, + RemoteProtocolError, + WriteError, + map_exceptions, +) +from .._models import Origin, Request, Response +from .._synchronization import AsyncLock, AsyncShieldCancellation +from .._trace import Trace +from .interfaces import AsyncConnectionInterface + +logger = logging.getLogger("httpcore.http11") + + +# A subset of `h11.Event` types supported by `_send_event` +H11SendEvent = typing.Union[ + h11.Request, + h11.Data, + h11.EndOfMessage, +] + + +class HTTPConnectionState(enum.IntEnum): + NEW = 0 + ACTIVE = 1 + IDLE = 2 + CLOSED = 3 + + +class AsyncHTTP11Connection(AsyncConnectionInterface): + READ_NUM_BYTES = 64 * 1024 + MAX_INCOMPLETE_EVENT_SIZE = 100 * 1024 + + def __init__( + self, + origin: Origin, + stream: AsyncNetworkStream, + keepalive_expiry: float | None = None, + ) -> None: + self._origin = origin + self._network_stream = stream + self._keepalive_expiry: float | None = keepalive_expiry + self._expire_at: float | None = None + self._state = HTTPConnectionState.NEW + self._state_lock = AsyncLock() + self._request_count = 0 + self._h11_state = h11.Connection( + our_role=h11.CLIENT, + max_incomplete_event_size=self.MAX_INCOMPLETE_EVENT_SIZE, + ) + + async def handle_async_request(self, request: Request) -> Response: + if not self.can_handle_request(request.url.origin): + raise RuntimeError( + f"Attempted to send request to {request.url.origin} on connection " + f"to {self._origin}" + ) + + async with self._state_lock: + if self._state in (HTTPConnectionState.NEW, HTTPConnectionState.IDLE): + self._request_count += 1 + self._state = HTTPConnectionState.ACTIVE + self._expire_at = None + else: + raise ConnectionNotAvailable() + + try: + kwargs = {"request": request} + try: + async with Trace( + "send_request_headers", logger, request, kwargs + ) as trace: + await self._send_request_headers(**kwargs) + async with Trace("send_request_body", logger, request, kwargs) as trace: + await self._send_request_body(**kwargs) + except WriteError: + # If we get a write error while we're writing the request, + # then we supress this error and move on to attempting to + # read the response. Servers can sometimes close the request + # pre-emptively and then respond with a well formed HTTP + # error response. + pass + + async with Trace( + "receive_response_headers", logger, request, kwargs + ) as trace: + ( + http_version, + status, + reason_phrase, + headers, + trailing_data, + ) = await self._receive_response_headers(**kwargs) + trace.return_value = ( + http_version, + status, + reason_phrase, + headers, + ) + + network_stream = self._network_stream + + # CONNECT or Upgrade request + if (status == 101) or ( + (request.method == b"CONNECT") and (200 <= status < 300) + ): + network_stream = AsyncHTTP11UpgradeStream(network_stream, trailing_data) + + return Response( + status=status, + headers=headers, + content=HTTP11ConnectionByteStream(self, request), + extensions={ + "http_version": http_version, + "reason_phrase": reason_phrase, + "network_stream": network_stream, + }, + ) + except BaseException as exc: + with AsyncShieldCancellation(): + async with Trace("response_closed", logger, request) as trace: + await self._response_closed() + raise exc + + # Sending the request... + + async def _send_request_headers(self, request: Request) -> None: + timeouts = request.extensions.get("timeout", {}) + timeout = timeouts.get("write", None) + + with map_exceptions({h11.LocalProtocolError: LocalProtocolError}): + event = h11.Request( + method=request.method, + target=request.url.target, + headers=request.headers, + ) + await self._send_event(event, timeout=timeout) + + async def _send_request_body(self, request: Request) -> None: + timeouts = request.extensions.get("timeout", {}) + timeout = timeouts.get("write", None) + + assert isinstance(request.stream, typing.AsyncIterable) + async for chunk in request.stream: + event = h11.Data(data=chunk) + await self._send_event(event, timeout=timeout) + + await self._send_event(h11.EndOfMessage(), timeout=timeout) + + async def _send_event(self, event: h11.Event, timeout: float | None = None) -> None: + bytes_to_send = self._h11_state.send(event) + if bytes_to_send is not None: + await self._network_stream.write(bytes_to_send, timeout=timeout) + + # Receiving the response... + + async def _receive_response_headers( + self, request: Request + ) -> tuple[bytes, int, bytes, list[tuple[bytes, bytes]], bytes]: + timeouts = request.extensions.get("timeout", {}) + timeout = timeouts.get("read", None) + + while True: + event = await self._receive_event(timeout=timeout) + if isinstance(event, h11.Response): + break + if ( + isinstance(event, h11.InformationalResponse) + and event.status_code == 101 + ): + break + + http_version = b"HTTP/" + event.http_version + + # h11 version 0.11+ supports a `raw_items` interface to get the + # raw header casing, rather than the enforced lowercase headers. + headers = event.headers.raw_items() + + trailing_data, _ = self._h11_state.trailing_data + + return http_version, event.status_code, event.reason, headers, trailing_data + + async def _receive_response_body( + self, request: Request + ) -> typing.AsyncIterator[bytes]: + timeouts = request.extensions.get("timeout", {}) + timeout = timeouts.get("read", None) + + while True: + event = await self._receive_event(timeout=timeout) + if isinstance(event, h11.Data): + yield bytes(event.data) + elif isinstance(event, (h11.EndOfMessage, h11.PAUSED)): + break + + async def _receive_event( + self, timeout: float | None = None + ) -> h11.Event | type[h11.PAUSED]: + while True: + with map_exceptions({h11.RemoteProtocolError: RemoteProtocolError}): + event = self._h11_state.next_event() + + if event is h11.NEED_DATA: + data = await self._network_stream.read( + self.READ_NUM_BYTES, timeout=timeout + ) + + # If we feed this case through h11 we'll raise an exception like: + # + # httpcore.RemoteProtocolError: can't handle event type + # ConnectionClosed when role=SERVER and state=SEND_RESPONSE + # + # Which is accurate, but not very informative from an end-user + # perspective. Instead we handle this case distinctly and treat + # it as a ConnectError. + if data == b"" and self._h11_state.their_state == h11.SEND_RESPONSE: + msg = "Server disconnected without sending a response." + raise RemoteProtocolError(msg) + + self._h11_state.receive_data(data) + else: + # mypy fails to narrow the type in the above if statement above + return event # type: ignore[return-value] + + async def _response_closed(self) -> None: + async with self._state_lock: + if ( + self._h11_state.our_state is h11.DONE + and self._h11_state.their_state is h11.DONE + ): + self._state = HTTPConnectionState.IDLE + self._h11_state.start_next_cycle() + if self._keepalive_expiry is not None: + now = time.monotonic() + self._expire_at = now + self._keepalive_expiry + else: + await self.aclose() + + # Once the connection is no longer required... + + async def aclose(self) -> None: + # Note that this method unilaterally closes the connection, and does + # not have any kind of locking in place around it. + self._state = HTTPConnectionState.CLOSED + await self._network_stream.aclose() + + # The AsyncConnectionInterface methods provide information about the state of + # the connection, allowing for a connection pooling implementation to + # determine when to reuse and when to close the connection... + + def can_handle_request(self, origin: Origin) -> bool: + return origin == self._origin + + def is_available(self) -> bool: + # Note that HTTP/1.1 connections in the "NEW" state are not treated as + # being "available". The control flow which created the connection will + # be able to send an outgoing request, but the connection will not be + # acquired from the connection pool for any other request. + return self._state == HTTPConnectionState.IDLE + + def has_expired(self) -> bool: + now = time.monotonic() + keepalive_expired = self._expire_at is not None and now > self._expire_at + + # If the HTTP connection is idle but the socket is readable, then the + # only valid state is that the socket is about to return b"", indicating + # a server-initiated disconnect. + server_disconnected = ( + self._state == HTTPConnectionState.IDLE + and self._network_stream.get_extra_info("is_readable") + ) + + return keepalive_expired or server_disconnected + + def is_idle(self) -> bool: + return self._state == HTTPConnectionState.IDLE + + def is_closed(self) -> bool: + return self._state == HTTPConnectionState.CLOSED + + def info(self) -> str: + origin = str(self._origin) + return ( + f"{origin!r}, HTTP/1.1, {self._state.name}, " + f"Request Count: {self._request_count}" + ) + + def __repr__(self) -> str: + class_name = self.__class__.__name__ + origin = str(self._origin) + return ( + f"<{class_name} [{origin!r}, {self._state.name}, " + f"Request Count: {self._request_count}]>" + ) + + # These context managers are not used in the standard flow, but are + # useful for testing or working with connection instances directly. + + async def __aenter__(self) -> AsyncHTTP11Connection: + return self + + async def __aexit__( + self, + exc_type: type[BaseException] | None = None, + exc_value: BaseException | None = None, + traceback: types.TracebackType | None = None, + ) -> None: + await self.aclose() + + +class HTTP11ConnectionByteStream: + def __init__(self, connection: AsyncHTTP11Connection, request: Request) -> None: + self._connection = connection + self._request = request + self._closed = False + + async def __aiter__(self) -> typing.AsyncIterator[bytes]: + kwargs = {"request": self._request} + try: + async with Trace("receive_response_body", logger, self._request, kwargs): + async for chunk in self._connection._receive_response_body(**kwargs): + yield chunk + except BaseException as exc: + # If we get an exception while streaming the response, + # we want to close the response (and possibly the connection) + # before raising that exception. + with AsyncShieldCancellation(): + await self.aclose() + raise exc + + async def aclose(self) -> None: + if not self._closed: + self._closed = True + async with Trace("response_closed", logger, self._request): + await self._connection._response_closed() + + +class AsyncHTTP11UpgradeStream(AsyncNetworkStream): + def __init__(self, stream: AsyncNetworkStream, leading_data: bytes) -> None: + self._stream = stream + self._leading_data = leading_data + + async def read(self, max_bytes: int, timeout: float | None = None) -> bytes: + if self._leading_data: + buffer = self._leading_data[:max_bytes] + self._leading_data = self._leading_data[max_bytes:] + return buffer + else: + return await self._stream.read(max_bytes, timeout) + + async def write(self, buffer: bytes, timeout: float | None = None) -> None: + await self._stream.write(buffer, timeout) + + async def aclose(self) -> None: + await self._stream.aclose() + + async def start_tls( + self, + ssl_context: ssl.SSLContext, + server_hostname: str | None = None, + timeout: float | None = None, + ) -> AsyncNetworkStream: + return await self._stream.start_tls(ssl_context, server_hostname, timeout) + + def get_extra_info(self, info: str) -> typing.Any: + return self._stream.get_extra_info(info) diff --git a/.venv/lib/python3.10/site-packages/httpcore/_async/http2.py b/.venv/lib/python3.10/site-packages/httpcore/_async/http2.py new file mode 100644 index 0000000..dbd0bee --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpcore/_async/http2.py @@ -0,0 +1,592 @@ +from __future__ import annotations + +import enum +import logging +import time +import types +import typing + +import h2.config +import h2.connection +import h2.events +import h2.exceptions +import h2.settings + +from .._backends.base import AsyncNetworkStream +from .._exceptions import ( + ConnectionNotAvailable, + LocalProtocolError, + RemoteProtocolError, +) +from .._models import Origin, Request, Response +from .._synchronization import AsyncLock, AsyncSemaphore, AsyncShieldCancellation +from .._trace import Trace +from .interfaces import AsyncConnectionInterface + +logger = logging.getLogger("httpcore.http2") + + +def has_body_headers(request: Request) -> bool: + return any( + k.lower() == b"content-length" or k.lower() == b"transfer-encoding" + for k, v in request.headers + ) + + +class HTTPConnectionState(enum.IntEnum): + ACTIVE = 1 + IDLE = 2 + CLOSED = 3 + + +class AsyncHTTP2Connection(AsyncConnectionInterface): + READ_NUM_BYTES = 64 * 1024 + CONFIG = h2.config.H2Configuration(validate_inbound_headers=False) + + def __init__( + self, + origin: Origin, + stream: AsyncNetworkStream, + keepalive_expiry: float | None = None, + ): + self._origin = origin + self._network_stream = stream + self._keepalive_expiry: float | None = keepalive_expiry + self._h2_state = h2.connection.H2Connection(config=self.CONFIG) + self._state = HTTPConnectionState.IDLE + self._expire_at: float | None = None + self._request_count = 0 + self._init_lock = AsyncLock() + self._state_lock = AsyncLock() + self._read_lock = AsyncLock() + self._write_lock = AsyncLock() + self._sent_connection_init = False + self._used_all_stream_ids = False + self._connection_error = False + + # Mapping from stream ID to response stream events. + self._events: dict[ + int, + list[ + h2.events.ResponseReceived + | h2.events.DataReceived + | h2.events.StreamEnded + | h2.events.StreamReset, + ], + ] = {} + + # Connection terminated events are stored as state since + # we need to handle them for all streams. + self._connection_terminated: h2.events.ConnectionTerminated | None = None + + self._read_exception: Exception | None = None + self._write_exception: Exception | None = None + + async def handle_async_request(self, request: Request) -> Response: + if not self.can_handle_request(request.url.origin): + # This cannot occur in normal operation, since the connection pool + # will only send requests on connections that handle them. + # It's in place simply for resilience as a guard against incorrect + # usage, for anyone working directly with httpcore connections. + raise RuntimeError( + f"Attempted to send request to {request.url.origin} on connection " + f"to {self._origin}" + ) + + async with self._state_lock: + if self._state in (HTTPConnectionState.ACTIVE, HTTPConnectionState.IDLE): + self._request_count += 1 + self._expire_at = None + self._state = HTTPConnectionState.ACTIVE + else: + raise ConnectionNotAvailable() + + async with self._init_lock: + if not self._sent_connection_init: + try: + sci_kwargs = {"request": request} + async with Trace( + "send_connection_init", logger, request, sci_kwargs + ): + await self._send_connection_init(**sci_kwargs) + except BaseException as exc: + with AsyncShieldCancellation(): + await self.aclose() + raise exc + + self._sent_connection_init = True + + # Initially start with just 1 until the remote server provides + # its max_concurrent_streams value + self._max_streams = 1 + + local_settings_max_streams = ( + self._h2_state.local_settings.max_concurrent_streams + ) + self._max_streams_semaphore = AsyncSemaphore(local_settings_max_streams) + + for _ in range(local_settings_max_streams - self._max_streams): + await self._max_streams_semaphore.acquire() + + await self._max_streams_semaphore.acquire() + + try: + stream_id = self._h2_state.get_next_available_stream_id() + self._events[stream_id] = [] + except h2.exceptions.NoAvailableStreamIDError: # pragma: nocover + self._used_all_stream_ids = True + self._request_count -= 1 + raise ConnectionNotAvailable() + + try: + kwargs = {"request": request, "stream_id": stream_id} + async with Trace("send_request_headers", logger, request, kwargs): + await self._send_request_headers(request=request, stream_id=stream_id) + async with Trace("send_request_body", logger, request, kwargs): + await self._send_request_body(request=request, stream_id=stream_id) + async with Trace( + "receive_response_headers", logger, request, kwargs + ) as trace: + status, headers = await self._receive_response( + request=request, stream_id=stream_id + ) + trace.return_value = (status, headers) + + return Response( + status=status, + headers=headers, + content=HTTP2ConnectionByteStream(self, request, stream_id=stream_id), + extensions={ + "http_version": b"HTTP/2", + "network_stream": self._network_stream, + "stream_id": stream_id, + }, + ) + except BaseException as exc: # noqa: PIE786 + with AsyncShieldCancellation(): + kwargs = {"stream_id": stream_id} + async with Trace("response_closed", logger, request, kwargs): + await self._response_closed(stream_id=stream_id) + + if isinstance(exc, h2.exceptions.ProtocolError): + # One case where h2 can raise a protocol error is when a + # closed frame has been seen by the state machine. + # + # This happens when one stream is reading, and encounters + # a GOAWAY event. Other flows of control may then raise + # a protocol error at any point they interact with the 'h2_state'. + # + # In this case we'll have stored the event, and should raise + # it as a RemoteProtocolError. + if self._connection_terminated: # pragma: nocover + raise RemoteProtocolError(self._connection_terminated) + # If h2 raises a protocol error in some other state then we + # must somehow have made a protocol violation. + raise LocalProtocolError(exc) # pragma: nocover + + raise exc + + async def _send_connection_init(self, request: Request) -> None: + """ + The HTTP/2 connection requires some initial setup before we can start + using individual request/response streams on it. + """ + # Need to set these manually here instead of manipulating via + # __setitem__() otherwise the H2Connection will emit SettingsUpdate + # frames in addition to sending the undesired defaults. + self._h2_state.local_settings = h2.settings.Settings( + client=True, + initial_values={ + # Disable PUSH_PROMISE frames from the server since we don't do anything + # with them for now. Maybe when we support caching? + h2.settings.SettingCodes.ENABLE_PUSH: 0, + # These two are taken from h2 for safe defaults + h2.settings.SettingCodes.MAX_CONCURRENT_STREAMS: 100, + h2.settings.SettingCodes.MAX_HEADER_LIST_SIZE: 65536, + }, + ) + + # Some websites (*cough* Yahoo *cough*) balk at this setting being + # present in the initial handshake since it's not defined in the original + # RFC despite the RFC mandating ignoring settings you don't know about. + del self._h2_state.local_settings[ + h2.settings.SettingCodes.ENABLE_CONNECT_PROTOCOL + ] + + self._h2_state.initiate_connection() + self._h2_state.increment_flow_control_window(2**24) + await self._write_outgoing_data(request) + + # Sending the request... + + async def _send_request_headers(self, request: Request, stream_id: int) -> None: + """ + Send the request headers to a given stream ID. + """ + end_stream = not has_body_headers(request) + + # In HTTP/2 the ':authority' pseudo-header is used instead of 'Host'. + # In order to gracefully handle HTTP/1.1 and HTTP/2 we always require + # HTTP/1.1 style headers, and map them appropriately if we end up on + # an HTTP/2 connection. + authority = [v for k, v in request.headers if k.lower() == b"host"][0] + + headers = [ + (b":method", request.method), + (b":authority", authority), + (b":scheme", request.url.scheme), + (b":path", request.url.target), + ] + [ + (k.lower(), v) + for k, v in request.headers + if k.lower() + not in ( + b"host", + b"transfer-encoding", + ) + ] + + self._h2_state.send_headers(stream_id, headers, end_stream=end_stream) + self._h2_state.increment_flow_control_window(2**24, stream_id=stream_id) + await self._write_outgoing_data(request) + + async def _send_request_body(self, request: Request, stream_id: int) -> None: + """ + Iterate over the request body sending it to a given stream ID. + """ + if not has_body_headers(request): + return + + assert isinstance(request.stream, typing.AsyncIterable) + async for data in request.stream: + await self._send_stream_data(request, stream_id, data) + await self._send_end_stream(request, stream_id) + + async def _send_stream_data( + self, request: Request, stream_id: int, data: bytes + ) -> None: + """ + Send a single chunk of data in one or more data frames. + """ + while data: + max_flow = await self._wait_for_outgoing_flow(request, stream_id) + chunk_size = min(len(data), max_flow) + chunk, data = data[:chunk_size], data[chunk_size:] + self._h2_state.send_data(stream_id, chunk) + await self._write_outgoing_data(request) + + async def _send_end_stream(self, request: Request, stream_id: int) -> None: + """ + Send an empty data frame on on a given stream ID with the END_STREAM flag set. + """ + self._h2_state.end_stream(stream_id) + await self._write_outgoing_data(request) + + # Receiving the response... + + async def _receive_response( + self, request: Request, stream_id: int + ) -> tuple[int, list[tuple[bytes, bytes]]]: + """ + Return the response status code and headers for a given stream ID. + """ + while True: + event = await self._receive_stream_event(request, stream_id) + if isinstance(event, h2.events.ResponseReceived): + break + + status_code = 200 + headers = [] + assert event.headers is not None + for k, v in event.headers: + if k == b":status": + status_code = int(v.decode("ascii", errors="ignore")) + elif not k.startswith(b":"): + headers.append((k, v)) + + return (status_code, headers) + + async def _receive_response_body( + self, request: Request, stream_id: int + ) -> typing.AsyncIterator[bytes]: + """ + Iterator that returns the bytes of the response body for a given stream ID. + """ + while True: + event = await self._receive_stream_event(request, stream_id) + if isinstance(event, h2.events.DataReceived): + assert event.flow_controlled_length is not None + assert event.data is not None + amount = event.flow_controlled_length + self._h2_state.acknowledge_received_data(amount, stream_id) + await self._write_outgoing_data(request) + yield event.data + elif isinstance(event, h2.events.StreamEnded): + break + + async def _receive_stream_event( + self, request: Request, stream_id: int + ) -> h2.events.ResponseReceived | h2.events.DataReceived | h2.events.StreamEnded: + """ + Return the next available event for a given stream ID. + + Will read more data from the network if required. + """ + while not self._events.get(stream_id): + await self._receive_events(request, stream_id) + event = self._events[stream_id].pop(0) + if isinstance(event, h2.events.StreamReset): + raise RemoteProtocolError(event) + return event + + async def _receive_events( + self, request: Request, stream_id: int | None = None + ) -> None: + """ + Read some data from the network until we see one or more events + for a given stream ID. + """ + async with self._read_lock: + if self._connection_terminated is not None: + last_stream_id = self._connection_terminated.last_stream_id + if stream_id and last_stream_id and stream_id > last_stream_id: + self._request_count -= 1 + raise ConnectionNotAvailable() + raise RemoteProtocolError(self._connection_terminated) + + # This conditional is a bit icky. We don't want to block reading if we've + # actually got an event to return for a given stream. We need to do that + # check *within* the atomic read lock. Though it also need to be optional, + # because when we call it from `_wait_for_outgoing_flow` we *do* want to + # block until we've available flow control, event when we have events + # pending for the stream ID we're attempting to send on. + if stream_id is None or not self._events.get(stream_id): + events = await self._read_incoming_data(request) + for event in events: + if isinstance(event, h2.events.RemoteSettingsChanged): + async with Trace( + "receive_remote_settings", logger, request + ) as trace: + await self._receive_remote_settings_change(event) + trace.return_value = event + + elif isinstance( + event, + ( + h2.events.ResponseReceived, + h2.events.DataReceived, + h2.events.StreamEnded, + h2.events.StreamReset, + ), + ): + if event.stream_id in self._events: + self._events[event.stream_id].append(event) + + elif isinstance(event, h2.events.ConnectionTerminated): + self._connection_terminated = event + + await self._write_outgoing_data(request) + + async def _receive_remote_settings_change( + self, event: h2.events.RemoteSettingsChanged + ) -> None: + max_concurrent_streams = event.changed_settings.get( + h2.settings.SettingCodes.MAX_CONCURRENT_STREAMS + ) + if max_concurrent_streams: + new_max_streams = min( + max_concurrent_streams.new_value, + self._h2_state.local_settings.max_concurrent_streams, + ) + if new_max_streams and new_max_streams != self._max_streams: + while new_max_streams > self._max_streams: + await self._max_streams_semaphore.release() + self._max_streams += 1 + while new_max_streams < self._max_streams: + await self._max_streams_semaphore.acquire() + self._max_streams -= 1 + + async def _response_closed(self, stream_id: int) -> None: + await self._max_streams_semaphore.release() + del self._events[stream_id] + async with self._state_lock: + if self._connection_terminated and not self._events: + await self.aclose() + + elif self._state == HTTPConnectionState.ACTIVE and not self._events: + self._state = HTTPConnectionState.IDLE + if self._keepalive_expiry is not None: + now = time.monotonic() + self._expire_at = now + self._keepalive_expiry + if self._used_all_stream_ids: # pragma: nocover + await self.aclose() + + async def aclose(self) -> None: + # Note that this method unilaterally closes the connection, and does + # not have any kind of locking in place around it. + self._h2_state.close_connection() + self._state = HTTPConnectionState.CLOSED + await self._network_stream.aclose() + + # Wrappers around network read/write operations... + + async def _read_incoming_data(self, request: Request) -> list[h2.events.Event]: + timeouts = request.extensions.get("timeout", {}) + timeout = timeouts.get("read", None) + + if self._read_exception is not None: + raise self._read_exception # pragma: nocover + + try: + data = await self._network_stream.read(self.READ_NUM_BYTES, timeout) + if data == b"": + raise RemoteProtocolError("Server disconnected") + except Exception as exc: + # If we get a network error we should: + # + # 1. Save the exception and just raise it immediately on any future reads. + # (For example, this means that a single read timeout or disconnect will + # immediately close all pending streams. Without requiring multiple + # sequential timeouts.) + # 2. Mark the connection as errored, so that we don't accept any other + # incoming requests. + self._read_exception = exc + self._connection_error = True + raise exc + + events: list[h2.events.Event] = self._h2_state.receive_data(data) + + return events + + async def _write_outgoing_data(self, request: Request) -> None: + timeouts = request.extensions.get("timeout", {}) + timeout = timeouts.get("write", None) + + async with self._write_lock: + data_to_send = self._h2_state.data_to_send() + + if self._write_exception is not None: + raise self._write_exception # pragma: nocover + + try: + await self._network_stream.write(data_to_send, timeout) + except Exception as exc: # pragma: nocover + # If we get a network error we should: + # + # 1. Save the exception and just raise it immediately on any future write. + # (For example, this means that a single write timeout or disconnect will + # immediately close all pending streams. Without requiring multiple + # sequential timeouts.) + # 2. Mark the connection as errored, so that we don't accept any other + # incoming requests. + self._write_exception = exc + self._connection_error = True + raise exc + + # Flow control... + + async def _wait_for_outgoing_flow(self, request: Request, stream_id: int) -> int: + """ + Returns the maximum allowable outgoing flow for a given stream. + + If the allowable flow is zero, then waits on the network until + WindowUpdated frames have increased the flow rate. + https://tools.ietf.org/html/rfc7540#section-6.9 + """ + local_flow: int = self._h2_state.local_flow_control_window(stream_id) + max_frame_size: int = self._h2_state.max_outbound_frame_size + flow = min(local_flow, max_frame_size) + while flow == 0: + await self._receive_events(request) + local_flow = self._h2_state.local_flow_control_window(stream_id) + max_frame_size = self._h2_state.max_outbound_frame_size + flow = min(local_flow, max_frame_size) + return flow + + # Interface for connection pooling... + + def can_handle_request(self, origin: Origin) -> bool: + return origin == self._origin + + def is_available(self) -> bool: + return ( + self._state != HTTPConnectionState.CLOSED + and not self._connection_error + and not self._used_all_stream_ids + and not ( + self._h2_state.state_machine.state + == h2.connection.ConnectionState.CLOSED + ) + ) + + def has_expired(self) -> bool: + now = time.monotonic() + return self._expire_at is not None and now > self._expire_at + + def is_idle(self) -> bool: + return self._state == HTTPConnectionState.IDLE + + def is_closed(self) -> bool: + return self._state == HTTPConnectionState.CLOSED + + def info(self) -> str: + origin = str(self._origin) + return ( + f"{origin!r}, HTTP/2, {self._state.name}, " + f"Request Count: {self._request_count}" + ) + + def __repr__(self) -> str: + class_name = self.__class__.__name__ + origin = str(self._origin) + return ( + f"<{class_name} [{origin!r}, {self._state.name}, " + f"Request Count: {self._request_count}]>" + ) + + # These context managers are not used in the standard flow, but are + # useful for testing or working with connection instances directly. + + async def __aenter__(self) -> AsyncHTTP2Connection: + return self + + async def __aexit__( + self, + exc_type: type[BaseException] | None = None, + exc_value: BaseException | None = None, + traceback: types.TracebackType | None = None, + ) -> None: + await self.aclose() + + +class HTTP2ConnectionByteStream: + def __init__( + self, connection: AsyncHTTP2Connection, request: Request, stream_id: int + ) -> None: + self._connection = connection + self._request = request + self._stream_id = stream_id + self._closed = False + + async def __aiter__(self) -> typing.AsyncIterator[bytes]: + kwargs = {"request": self._request, "stream_id": self._stream_id} + try: + async with Trace("receive_response_body", logger, self._request, kwargs): + async for chunk in self._connection._receive_response_body( + request=self._request, stream_id=self._stream_id + ): + yield chunk + except BaseException as exc: + # If we get an exception while streaming the response, + # we want to close the response (and possibly the connection) + # before raising that exception. + with AsyncShieldCancellation(): + await self.aclose() + raise exc + + async def aclose(self) -> None: + if not self._closed: + self._closed = True + kwargs = {"stream_id": self._stream_id} + async with Trace("response_closed", logger, self._request, kwargs): + await self._connection._response_closed(stream_id=self._stream_id) diff --git a/.venv/lib/python3.10/site-packages/httpcore/_async/http_proxy.py b/.venv/lib/python3.10/site-packages/httpcore/_async/http_proxy.py new file mode 100644 index 0000000..cc9d920 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpcore/_async/http_proxy.py @@ -0,0 +1,367 @@ +from __future__ import annotations + +import base64 +import logging +import ssl +import typing + +from .._backends.base import SOCKET_OPTION, AsyncNetworkBackend +from .._exceptions import ProxyError +from .._models import ( + URL, + Origin, + Request, + Response, + enforce_bytes, + enforce_headers, + enforce_url, +) +from .._ssl import default_ssl_context +from .._synchronization import AsyncLock +from .._trace import Trace +from .connection import AsyncHTTPConnection +from .connection_pool import AsyncConnectionPool +from .http11 import AsyncHTTP11Connection +from .interfaces import AsyncConnectionInterface + +ByteOrStr = typing.Union[bytes, str] +HeadersAsSequence = typing.Sequence[typing.Tuple[ByteOrStr, ByteOrStr]] +HeadersAsMapping = typing.Mapping[ByteOrStr, ByteOrStr] + + +logger = logging.getLogger("httpcore.proxy") + + +def merge_headers( + default_headers: typing.Sequence[tuple[bytes, bytes]] | None = None, + override_headers: typing.Sequence[tuple[bytes, bytes]] | None = None, +) -> list[tuple[bytes, bytes]]: + """ + Append default_headers and override_headers, de-duplicating if a key exists + in both cases. + """ + default_headers = [] if default_headers is None else list(default_headers) + override_headers = [] if override_headers is None else list(override_headers) + has_override = set(key.lower() for key, value in override_headers) + default_headers = [ + (key, value) + for key, value in default_headers + if key.lower() not in has_override + ] + return default_headers + override_headers + + +class AsyncHTTPProxy(AsyncConnectionPool): # pragma: nocover + """ + A connection pool that sends requests via an HTTP proxy. + """ + + def __init__( + self, + proxy_url: URL | bytes | str, + proxy_auth: tuple[bytes | str, bytes | str] | None = None, + proxy_headers: HeadersAsMapping | HeadersAsSequence | None = None, + ssl_context: ssl.SSLContext | None = None, + proxy_ssl_context: ssl.SSLContext | None = None, + max_connections: int | None = 10, + max_keepalive_connections: int | None = None, + keepalive_expiry: float | None = None, + http1: bool = True, + http2: bool = False, + retries: int = 0, + local_address: str | None = None, + uds: str | None = None, + network_backend: AsyncNetworkBackend | None = None, + socket_options: typing.Iterable[SOCKET_OPTION] | None = None, + ) -> None: + """ + A connection pool for making HTTP requests. + + Parameters: + proxy_url: The URL to use when connecting to the proxy server. + For example `"http://127.0.0.1:8080/"`. + proxy_auth: Any proxy authentication as a two-tuple of + (username, password). May be either bytes or ascii-only str. + proxy_headers: Any HTTP headers to use for the proxy requests. + For example `{"Proxy-Authorization": "Basic :"}`. + ssl_context: An SSL context to use for verifying connections. + If not specified, the default `httpcore.default_ssl_context()` + will be used. + proxy_ssl_context: The same as `ssl_context`, but for a proxy server rather than a remote origin. + max_connections: The maximum number of concurrent HTTP connections that + the pool should allow. Any attempt to send a request on a pool that + would exceed this amount will block until a connection is available. + max_keepalive_connections: The maximum number of idle HTTP connections + that will be maintained in the pool. + keepalive_expiry: The duration in seconds that an idle HTTP connection + may be maintained for before being expired from the pool. + http1: A boolean indicating if HTTP/1.1 requests should be supported + by the connection pool. Defaults to True. + http2: A boolean indicating if HTTP/2 requests should be supported by + the connection pool. Defaults to False. + retries: The maximum number of retries when trying to establish + a connection. + local_address: Local address to connect from. Can also be used to + connect using a particular address family. Using + `local_address="0.0.0.0"` will connect using an `AF_INET` address + (IPv4), while using `local_address="::"` will connect using an + `AF_INET6` address (IPv6). + uds: Path to a Unix Domain Socket to use instead of TCP sockets. + network_backend: A backend instance to use for handling network I/O. + """ + super().__init__( + ssl_context=ssl_context, + max_connections=max_connections, + max_keepalive_connections=max_keepalive_connections, + keepalive_expiry=keepalive_expiry, + http1=http1, + http2=http2, + network_backend=network_backend, + retries=retries, + local_address=local_address, + uds=uds, + socket_options=socket_options, + ) + + self._proxy_url = enforce_url(proxy_url, name="proxy_url") + if ( + self._proxy_url.scheme == b"http" and proxy_ssl_context is not None + ): # pragma: no cover + raise RuntimeError( + "The `proxy_ssl_context` argument is not allowed for the http scheme" + ) + + self._ssl_context = ssl_context + self._proxy_ssl_context = proxy_ssl_context + self._proxy_headers = enforce_headers(proxy_headers, name="proxy_headers") + if proxy_auth is not None: + username = enforce_bytes(proxy_auth[0], name="proxy_auth") + password = enforce_bytes(proxy_auth[1], name="proxy_auth") + userpass = username + b":" + password + authorization = b"Basic " + base64.b64encode(userpass) + self._proxy_headers = [ + (b"Proxy-Authorization", authorization) + ] + self._proxy_headers + + def create_connection(self, origin: Origin) -> AsyncConnectionInterface: + if origin.scheme == b"http": + return AsyncForwardHTTPConnection( + proxy_origin=self._proxy_url.origin, + proxy_headers=self._proxy_headers, + remote_origin=origin, + keepalive_expiry=self._keepalive_expiry, + network_backend=self._network_backend, + proxy_ssl_context=self._proxy_ssl_context, + ) + return AsyncTunnelHTTPConnection( + proxy_origin=self._proxy_url.origin, + proxy_headers=self._proxy_headers, + remote_origin=origin, + ssl_context=self._ssl_context, + proxy_ssl_context=self._proxy_ssl_context, + keepalive_expiry=self._keepalive_expiry, + http1=self._http1, + http2=self._http2, + network_backend=self._network_backend, + ) + + +class AsyncForwardHTTPConnection(AsyncConnectionInterface): + def __init__( + self, + proxy_origin: Origin, + remote_origin: Origin, + proxy_headers: HeadersAsMapping | HeadersAsSequence | None = None, + keepalive_expiry: float | None = None, + network_backend: AsyncNetworkBackend | None = None, + socket_options: typing.Iterable[SOCKET_OPTION] | None = None, + proxy_ssl_context: ssl.SSLContext | None = None, + ) -> None: + self._connection = AsyncHTTPConnection( + origin=proxy_origin, + keepalive_expiry=keepalive_expiry, + network_backend=network_backend, + socket_options=socket_options, + ssl_context=proxy_ssl_context, + ) + self._proxy_origin = proxy_origin + self._proxy_headers = enforce_headers(proxy_headers, name="proxy_headers") + self._remote_origin = remote_origin + + async def handle_async_request(self, request: Request) -> Response: + headers = merge_headers(self._proxy_headers, request.headers) + url = URL( + scheme=self._proxy_origin.scheme, + host=self._proxy_origin.host, + port=self._proxy_origin.port, + target=bytes(request.url), + ) + proxy_request = Request( + method=request.method, + url=url, + headers=headers, + content=request.stream, + extensions=request.extensions, + ) + return await self._connection.handle_async_request(proxy_request) + + def can_handle_request(self, origin: Origin) -> bool: + return origin == self._remote_origin + + async def aclose(self) -> None: + await self._connection.aclose() + + def info(self) -> str: + return self._connection.info() + + def is_available(self) -> bool: + return self._connection.is_available() + + def has_expired(self) -> bool: + return self._connection.has_expired() + + def is_idle(self) -> bool: + return self._connection.is_idle() + + def is_closed(self) -> bool: + return self._connection.is_closed() + + def __repr__(self) -> str: + return f"<{self.__class__.__name__} [{self.info()}]>" + + +class AsyncTunnelHTTPConnection(AsyncConnectionInterface): + def __init__( + self, + proxy_origin: Origin, + remote_origin: Origin, + ssl_context: ssl.SSLContext | None = None, + proxy_ssl_context: ssl.SSLContext | None = None, + proxy_headers: typing.Sequence[tuple[bytes, bytes]] | None = None, + keepalive_expiry: float | None = None, + http1: bool = True, + http2: bool = False, + network_backend: AsyncNetworkBackend | None = None, + socket_options: typing.Iterable[SOCKET_OPTION] | None = None, + ) -> None: + self._connection: AsyncConnectionInterface = AsyncHTTPConnection( + origin=proxy_origin, + keepalive_expiry=keepalive_expiry, + network_backend=network_backend, + socket_options=socket_options, + ssl_context=proxy_ssl_context, + ) + self._proxy_origin = proxy_origin + self._remote_origin = remote_origin + self._ssl_context = ssl_context + self._proxy_ssl_context = proxy_ssl_context + self._proxy_headers = enforce_headers(proxy_headers, name="proxy_headers") + self._keepalive_expiry = keepalive_expiry + self._http1 = http1 + self._http2 = http2 + self._connect_lock = AsyncLock() + self._connected = False + + async def handle_async_request(self, request: Request) -> Response: + timeouts = request.extensions.get("timeout", {}) + timeout = timeouts.get("connect", None) + + async with self._connect_lock: + if not self._connected: + target = b"%b:%d" % (self._remote_origin.host, self._remote_origin.port) + + connect_url = URL( + scheme=self._proxy_origin.scheme, + host=self._proxy_origin.host, + port=self._proxy_origin.port, + target=target, + ) + connect_headers = merge_headers( + [(b"Host", target), (b"Accept", b"*/*")], self._proxy_headers + ) + connect_request = Request( + method=b"CONNECT", + url=connect_url, + headers=connect_headers, + extensions=request.extensions, + ) + connect_response = await self._connection.handle_async_request( + connect_request + ) + + if connect_response.status < 200 or connect_response.status > 299: + reason_bytes = connect_response.extensions.get("reason_phrase", b"") + reason_str = reason_bytes.decode("ascii", errors="ignore") + msg = "%d %s" % (connect_response.status, reason_str) + await self._connection.aclose() + raise ProxyError(msg) + + stream = connect_response.extensions["network_stream"] + + # Upgrade the stream to SSL + ssl_context = ( + default_ssl_context() + if self._ssl_context is None + else self._ssl_context + ) + alpn_protocols = ["http/1.1", "h2"] if self._http2 else ["http/1.1"] + ssl_context.set_alpn_protocols(alpn_protocols) + + kwargs = { + "ssl_context": ssl_context, + "server_hostname": self._remote_origin.host.decode("ascii"), + "timeout": timeout, + } + async with Trace("start_tls", logger, request, kwargs) as trace: + stream = await stream.start_tls(**kwargs) + trace.return_value = stream + + # Determine if we should be using HTTP/1.1 or HTTP/2 + ssl_object = stream.get_extra_info("ssl_object") + http2_negotiated = ( + ssl_object is not None + and ssl_object.selected_alpn_protocol() == "h2" + ) + + # Create the HTTP/1.1 or HTTP/2 connection + if http2_negotiated or (self._http2 and not self._http1): + from .http2 import AsyncHTTP2Connection + + self._connection = AsyncHTTP2Connection( + origin=self._remote_origin, + stream=stream, + keepalive_expiry=self._keepalive_expiry, + ) + else: + self._connection = AsyncHTTP11Connection( + origin=self._remote_origin, + stream=stream, + keepalive_expiry=self._keepalive_expiry, + ) + + self._connected = True + return await self._connection.handle_async_request(request) + + def can_handle_request(self, origin: Origin) -> bool: + return origin == self._remote_origin + + async def aclose(self) -> None: + await self._connection.aclose() + + def info(self) -> str: + return self._connection.info() + + def is_available(self) -> bool: + return self._connection.is_available() + + def has_expired(self) -> bool: + return self._connection.has_expired() + + def is_idle(self) -> bool: + return self._connection.is_idle() + + def is_closed(self) -> bool: + return self._connection.is_closed() + + def __repr__(self) -> str: + return f"<{self.__class__.__name__} [{self.info()}]>" diff --git a/.venv/lib/python3.10/site-packages/httpcore/_async/interfaces.py b/.venv/lib/python3.10/site-packages/httpcore/_async/interfaces.py new file mode 100644 index 0000000..361583b --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpcore/_async/interfaces.py @@ -0,0 +1,137 @@ +from __future__ import annotations + +import contextlib +import typing + +from .._models import ( + URL, + Extensions, + HeaderTypes, + Origin, + Request, + Response, + enforce_bytes, + enforce_headers, + enforce_url, + include_request_headers, +) + + +class AsyncRequestInterface: + async def request( + self, + method: bytes | str, + url: URL | bytes | str, + *, + headers: HeaderTypes = None, + content: bytes | typing.AsyncIterator[bytes] | None = None, + extensions: Extensions | None = None, + ) -> Response: + # Strict type checking on our parameters. + method = enforce_bytes(method, name="method") + url = enforce_url(url, name="url") + headers = enforce_headers(headers, name="headers") + + # Include Host header, and optionally Content-Length or Transfer-Encoding. + headers = include_request_headers(headers, url=url, content=content) + + request = Request( + method=method, + url=url, + headers=headers, + content=content, + extensions=extensions, + ) + response = await self.handle_async_request(request) + try: + await response.aread() + finally: + await response.aclose() + return response + + @contextlib.asynccontextmanager + async def stream( + self, + method: bytes | str, + url: URL | bytes | str, + *, + headers: HeaderTypes = None, + content: bytes | typing.AsyncIterator[bytes] | None = None, + extensions: Extensions | None = None, + ) -> typing.AsyncIterator[Response]: + # Strict type checking on our parameters. + method = enforce_bytes(method, name="method") + url = enforce_url(url, name="url") + headers = enforce_headers(headers, name="headers") + + # Include Host header, and optionally Content-Length or Transfer-Encoding. + headers = include_request_headers(headers, url=url, content=content) + + request = Request( + method=method, + url=url, + headers=headers, + content=content, + extensions=extensions, + ) + response = await self.handle_async_request(request) + try: + yield response + finally: + await response.aclose() + + async def handle_async_request(self, request: Request) -> Response: + raise NotImplementedError() # pragma: nocover + + +class AsyncConnectionInterface(AsyncRequestInterface): + async def aclose(self) -> None: + raise NotImplementedError() # pragma: nocover + + def info(self) -> str: + raise NotImplementedError() # pragma: nocover + + def can_handle_request(self, origin: Origin) -> bool: + raise NotImplementedError() # pragma: nocover + + def is_available(self) -> bool: + """ + Return `True` if the connection is currently able to accept an + outgoing request. + + An HTTP/1.1 connection will only be available if it is currently idle. + + An HTTP/2 connection will be available so long as the stream ID space is + not yet exhausted, and the connection is not in an error state. + + While the connection is being established we may not yet know if it is going + to result in an HTTP/1.1 or HTTP/2 connection. The connection should be + treated as being available, but might ultimately raise `NewConnectionRequired` + required exceptions if multiple requests are attempted over a connection + that ends up being established as HTTP/1.1. + """ + raise NotImplementedError() # pragma: nocover + + def has_expired(self) -> bool: + """ + Return `True` if the connection is in a state where it should be closed. + + This either means that the connection is idle and it has passed the + expiry time on its keep-alive, or that server has sent an EOF. + """ + raise NotImplementedError() # pragma: nocover + + def is_idle(self) -> bool: + """ + Return `True` if the connection is currently idle. + """ + raise NotImplementedError() # pragma: nocover + + def is_closed(self) -> bool: + """ + Return `True` if the connection has been closed. + + Used when a response is closed to determine if the connection may be + returned to the connection pool or not. + """ + raise NotImplementedError() # pragma: nocover diff --git a/.venv/lib/python3.10/site-packages/httpcore/_async/socks_proxy.py b/.venv/lib/python3.10/site-packages/httpcore/_async/socks_proxy.py new file mode 100644 index 0000000..b363f55 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpcore/_async/socks_proxy.py @@ -0,0 +1,341 @@ +from __future__ import annotations + +import logging +import ssl + +import socksio + +from .._backends.auto import AutoBackend +from .._backends.base import AsyncNetworkBackend, AsyncNetworkStream +from .._exceptions import ConnectionNotAvailable, ProxyError +from .._models import URL, Origin, Request, Response, enforce_bytes, enforce_url +from .._ssl import default_ssl_context +from .._synchronization import AsyncLock +from .._trace import Trace +from .connection_pool import AsyncConnectionPool +from .http11 import AsyncHTTP11Connection +from .interfaces import AsyncConnectionInterface + +logger = logging.getLogger("httpcore.socks") + + +AUTH_METHODS = { + b"\x00": "NO AUTHENTICATION REQUIRED", + b"\x01": "GSSAPI", + b"\x02": "USERNAME/PASSWORD", + b"\xff": "NO ACCEPTABLE METHODS", +} + +REPLY_CODES = { + b"\x00": "Succeeded", + b"\x01": "General SOCKS server failure", + b"\x02": "Connection not allowed by ruleset", + b"\x03": "Network unreachable", + b"\x04": "Host unreachable", + b"\x05": "Connection refused", + b"\x06": "TTL expired", + b"\x07": "Command not supported", + b"\x08": "Address type not supported", +} + + +async def _init_socks5_connection( + stream: AsyncNetworkStream, + *, + host: bytes, + port: int, + auth: tuple[bytes, bytes] | None = None, +) -> None: + conn = socksio.socks5.SOCKS5Connection() + + # Auth method request + auth_method = ( + socksio.socks5.SOCKS5AuthMethod.NO_AUTH_REQUIRED + if auth is None + else socksio.socks5.SOCKS5AuthMethod.USERNAME_PASSWORD + ) + conn.send(socksio.socks5.SOCKS5AuthMethodsRequest([auth_method])) + outgoing_bytes = conn.data_to_send() + await stream.write(outgoing_bytes) + + # Auth method response + incoming_bytes = await stream.read(max_bytes=4096) + response = conn.receive_data(incoming_bytes) + assert isinstance(response, socksio.socks5.SOCKS5AuthReply) + if response.method != auth_method: + requested = AUTH_METHODS.get(auth_method, "UNKNOWN") + responded = AUTH_METHODS.get(response.method, "UNKNOWN") + raise ProxyError( + f"Requested {requested} from proxy server, but got {responded}." + ) + + if response.method == socksio.socks5.SOCKS5AuthMethod.USERNAME_PASSWORD: + # Username/password request + assert auth is not None + username, password = auth + conn.send(socksio.socks5.SOCKS5UsernamePasswordRequest(username, password)) + outgoing_bytes = conn.data_to_send() + await stream.write(outgoing_bytes) + + # Username/password response + incoming_bytes = await stream.read(max_bytes=4096) + response = conn.receive_data(incoming_bytes) + assert isinstance(response, socksio.socks5.SOCKS5UsernamePasswordReply) + if not response.success: + raise ProxyError("Invalid username/password") + + # Connect request + conn.send( + socksio.socks5.SOCKS5CommandRequest.from_address( + socksio.socks5.SOCKS5Command.CONNECT, (host, port) + ) + ) + outgoing_bytes = conn.data_to_send() + await stream.write(outgoing_bytes) + + # Connect response + incoming_bytes = await stream.read(max_bytes=4096) + response = conn.receive_data(incoming_bytes) + assert isinstance(response, socksio.socks5.SOCKS5Reply) + if response.reply_code != socksio.socks5.SOCKS5ReplyCode.SUCCEEDED: + reply_code = REPLY_CODES.get(response.reply_code, "UNKOWN") + raise ProxyError(f"Proxy Server could not connect: {reply_code}.") + + +class AsyncSOCKSProxy(AsyncConnectionPool): # pragma: nocover + """ + A connection pool that sends requests via an HTTP proxy. + """ + + def __init__( + self, + proxy_url: URL | bytes | str, + proxy_auth: tuple[bytes | str, bytes | str] | None = None, + ssl_context: ssl.SSLContext | None = None, + max_connections: int | None = 10, + max_keepalive_connections: int | None = None, + keepalive_expiry: float | None = None, + http1: bool = True, + http2: bool = False, + retries: int = 0, + network_backend: AsyncNetworkBackend | None = None, + ) -> None: + """ + A connection pool for making HTTP requests. + + Parameters: + proxy_url: The URL to use when connecting to the proxy server. + For example `"http://127.0.0.1:8080/"`. + ssl_context: An SSL context to use for verifying connections. + If not specified, the default `httpcore.default_ssl_context()` + will be used. + max_connections: The maximum number of concurrent HTTP connections that + the pool should allow. Any attempt to send a request on a pool that + would exceed this amount will block until a connection is available. + max_keepalive_connections: The maximum number of idle HTTP connections + that will be maintained in the pool. + keepalive_expiry: The duration in seconds that an idle HTTP connection + may be maintained for before being expired from the pool. + http1: A boolean indicating if HTTP/1.1 requests should be supported + by the connection pool. Defaults to True. + http2: A boolean indicating if HTTP/2 requests should be supported by + the connection pool. Defaults to False. + retries: The maximum number of retries when trying to establish + a connection. + local_address: Local address to connect from. Can also be used to + connect using a particular address family. Using + `local_address="0.0.0.0"` will connect using an `AF_INET` address + (IPv4), while using `local_address="::"` will connect using an + `AF_INET6` address (IPv6). + uds: Path to a Unix Domain Socket to use instead of TCP sockets. + network_backend: A backend instance to use for handling network I/O. + """ + super().__init__( + ssl_context=ssl_context, + max_connections=max_connections, + max_keepalive_connections=max_keepalive_connections, + keepalive_expiry=keepalive_expiry, + http1=http1, + http2=http2, + network_backend=network_backend, + retries=retries, + ) + self._ssl_context = ssl_context + self._proxy_url = enforce_url(proxy_url, name="proxy_url") + if proxy_auth is not None: + username, password = proxy_auth + username_bytes = enforce_bytes(username, name="proxy_auth") + password_bytes = enforce_bytes(password, name="proxy_auth") + self._proxy_auth: tuple[bytes, bytes] | None = ( + username_bytes, + password_bytes, + ) + else: + self._proxy_auth = None + + def create_connection(self, origin: Origin) -> AsyncConnectionInterface: + return AsyncSocks5Connection( + proxy_origin=self._proxy_url.origin, + remote_origin=origin, + proxy_auth=self._proxy_auth, + ssl_context=self._ssl_context, + keepalive_expiry=self._keepalive_expiry, + http1=self._http1, + http2=self._http2, + network_backend=self._network_backend, + ) + + +class AsyncSocks5Connection(AsyncConnectionInterface): + def __init__( + self, + proxy_origin: Origin, + remote_origin: Origin, + proxy_auth: tuple[bytes, bytes] | None = None, + ssl_context: ssl.SSLContext | None = None, + keepalive_expiry: float | None = None, + http1: bool = True, + http2: bool = False, + network_backend: AsyncNetworkBackend | None = None, + ) -> None: + self._proxy_origin = proxy_origin + self._remote_origin = remote_origin + self._proxy_auth = proxy_auth + self._ssl_context = ssl_context + self._keepalive_expiry = keepalive_expiry + self._http1 = http1 + self._http2 = http2 + + self._network_backend: AsyncNetworkBackend = ( + AutoBackend() if network_backend is None else network_backend + ) + self._connect_lock = AsyncLock() + self._connection: AsyncConnectionInterface | None = None + self._connect_failed = False + + async def handle_async_request(self, request: Request) -> Response: + timeouts = request.extensions.get("timeout", {}) + sni_hostname = request.extensions.get("sni_hostname", None) + timeout = timeouts.get("connect", None) + + async with self._connect_lock: + if self._connection is None: + try: + # Connect to the proxy + kwargs = { + "host": self._proxy_origin.host.decode("ascii"), + "port": self._proxy_origin.port, + "timeout": timeout, + } + async with Trace("connect_tcp", logger, request, kwargs) as trace: + stream = await self._network_backend.connect_tcp(**kwargs) + trace.return_value = stream + + # Connect to the remote host using socks5 + kwargs = { + "stream": stream, + "host": self._remote_origin.host.decode("ascii"), + "port": self._remote_origin.port, + "auth": self._proxy_auth, + } + async with Trace( + "setup_socks5_connection", logger, request, kwargs + ) as trace: + await _init_socks5_connection(**kwargs) + trace.return_value = stream + + # Upgrade the stream to SSL + if self._remote_origin.scheme == b"https": + ssl_context = ( + default_ssl_context() + if self._ssl_context is None + else self._ssl_context + ) + alpn_protocols = ( + ["http/1.1", "h2"] if self._http2 else ["http/1.1"] + ) + ssl_context.set_alpn_protocols(alpn_protocols) + + kwargs = { + "ssl_context": ssl_context, + "server_hostname": sni_hostname + or self._remote_origin.host.decode("ascii"), + "timeout": timeout, + } + async with Trace("start_tls", logger, request, kwargs) as trace: + stream = await stream.start_tls(**kwargs) + trace.return_value = stream + + # Determine if we should be using HTTP/1.1 or HTTP/2 + ssl_object = stream.get_extra_info("ssl_object") + http2_negotiated = ( + ssl_object is not None + and ssl_object.selected_alpn_protocol() == "h2" + ) + + # Create the HTTP/1.1 or HTTP/2 connection + if http2_negotiated or ( + self._http2 and not self._http1 + ): # pragma: nocover + from .http2 import AsyncHTTP2Connection + + self._connection = AsyncHTTP2Connection( + origin=self._remote_origin, + stream=stream, + keepalive_expiry=self._keepalive_expiry, + ) + else: + self._connection = AsyncHTTP11Connection( + origin=self._remote_origin, + stream=stream, + keepalive_expiry=self._keepalive_expiry, + ) + except Exception as exc: + self._connect_failed = True + raise exc + elif not self._connection.is_available(): # pragma: nocover + raise ConnectionNotAvailable() + + return await self._connection.handle_async_request(request) + + def can_handle_request(self, origin: Origin) -> bool: + return origin == self._remote_origin + + async def aclose(self) -> None: + if self._connection is not None: + await self._connection.aclose() + + def is_available(self) -> bool: + if self._connection is None: # pragma: nocover + # If HTTP/2 support is enabled, and the resulting connection could + # end up as HTTP/2 then we should indicate the connection as being + # available to service multiple requests. + return ( + self._http2 + and (self._remote_origin.scheme == b"https" or not self._http1) + and not self._connect_failed + ) + return self._connection.is_available() + + def has_expired(self) -> bool: + if self._connection is None: # pragma: nocover + return self._connect_failed + return self._connection.has_expired() + + def is_idle(self) -> bool: + if self._connection is None: # pragma: nocover + return self._connect_failed + return self._connection.is_idle() + + def is_closed(self) -> bool: + if self._connection is None: # pragma: nocover + return self._connect_failed + return self._connection.is_closed() + + def info(self) -> str: + if self._connection is None: # pragma: nocover + return "CONNECTION FAILED" if self._connect_failed else "CONNECTING" + return self._connection.info() + + def __repr__(self) -> str: + return f"<{self.__class__.__name__} [{self.info()}]>" diff --git a/.venv/lib/python3.10/site-packages/httpcore/_backends/__init__.py b/.venv/lib/python3.10/site-packages/httpcore/_backends/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/.venv/lib/python3.10/site-packages/httpcore/_backends/__pycache__/__init__.cpython-310.pyc b/.venv/lib/python3.10/site-packages/httpcore/_backends/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..96de191eb5b4f25579bb9d5b7d6fcc0fcb6e5640 GIT binary patch literal 183 zcmd1j<>g`kf~VgOWrFC(AOaaM0yz#qT+9L_QW%06G#UL?G8BP?5yY=3{fzwFRQ=Qx z{eq(WtkmR^V*TRMq_q4BeZ8{OyfXcq%q0DS%94!yJYzjW1O4L6l2qM-#N_P6^weVg zjFOUqXz literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/httpcore/_backends/__pycache__/anyio.cpython-310.pyc b/.venv/lib/python3.10/site-packages/httpcore/_backends/__pycache__/anyio.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3c2c844366a689ef67fbcf5e668ee5feb510dffc GIT binary patch literal 4943 zcmZ`-TXWmS6~-MPco9X(j<1UC*ooOrL_2AxNpIszoW>JJN=>zD*l|#Z3tFT}Kv{s6 zrJ*`X?Z+mWzV^v}^k3*xr+Mj9f55(W`rv2JxKqWp`ke(yfwBS&k9PMg7Q5&2oezqN zMOVS~pJ)GQKbTdNe^V!W8R%S66gB=c8cbnoSLvw@Ri(Dp)f$@ot2cD{*Jv0_XGYiT zSq-aaH|(C%aC*5$uIDz~UcQm<6&eLRt247(?3EfNv@K?Lr+Vc^xi{UI?o}EURr!^| z9F}{auv}2NuQz7UcUd0&d@zmvEYs>rweW=YSye^e55p+&lXeuw3r{o}v_;`+6ox@F zxyE_KMQPYuYWISupNQPez-Or{PtDP|yUg23kSYqYJ<^nV{+buuYX)obJ$P-U9eZ)q zyb~lI#}fWZH+Z7b%XLw#FJArl+LE{U>C*MZ1u=6u-UyouL9!n4J6C)>5;9TA4%QPa z(QDFyve(%7H!&J04V5V{_$g*G>wy82pJr!Rk(C~pF#Bot1}n2^v`u!FRoDz>SUEdq zvvcfCc9b21#%6D^Ircg<4zppx^CEva+_=7&zFt_d+{VtVA8xdxd4Huje`O;HMp_;u zeI5#9A%bDa%%h9i^t(!NLg6$}2a1OXsVk4w1(?eA(v_>4Fyf%w;?tP)Sm8(TXJ@&# z8ufx&z-nte>cC}jE$*+hqIKMh^*2Z;J zq5CuFvvc>_lq&1WMJ4`Z9Z8$crPVSs;3nvAW%cB`st(uj<2cb%{FG{56o$zl^Ml(M z6sEMcn7P6uMD@)ej{3ZrCJ?u1!pzlf6bEcVBl6cmw%AJJij(n#+w$98&u=9G=j1M7 z^Pm~D?*>(azlOft2R|t_$U+a&xVRpXsnnnp{AW3>vm!HO7IqjUEA@K$Y zhs0SDWO+`;N==T`4B5!uKcHcWx^cLVONMsX7Q zy2mx%U zE}~o;-lgwO>>Ar8r-U(QTYIT(yU(0r`KeRfJd_Q$@w!OLuodCd3Ey#(jkR`odma-f zDyfdwl7X&LF(IHKxVWS7sWc_1sC0~u*|C`N2*3`l2JOkQ)+UG<>vZUTIH7aLIs>}* zCv^F-&V=scS9M!jQW$6yDH3R`h196g3KeaUZ+6>3n0P*8d>jX|W2G!fw5|PNP`V8|C-(&I(29t6#RM-75Y0genfw{*=CQ1= zCm%-65YOQi5;G(~u!lfqr3H<^GY!(Y@ub($s#;tEFtzvVX%PV7c)`co!a~)N>B%qB zd>Q%g9`Gaq7dAzw=T}I`H4tk`HAifTkk0dj>v_G1^}EzAc-|L%zng0KF?y&<;%yQH zwEPl@Uz6B_VcDWmEYp&ZJ0>GIAYcW(P;!f!MOC}2!pUo9$Xk}5l{F&>wki` zak85z4S9W(lKq`?!*solXe6Hh`w4!3Yg8DdIc0Sq>NC2i{Eo@P-_b#V19j*t+`g@B znJIxtKo&t2byJ$hl_%S1b7#Vg(<%QC3;U(YYlJI@%xsrDy6Ooi0ht zkwxf$=_ndsltvnCkw(X zCw=u0)u2`%|877H;$&t{tV~!b4okWKeAxSUOd5ZZX%h6xZ`1Tchte+n#I(GA((cBR y2nb`v2URVSvP6PVTgIf^z(G3~&d<}T_)8UY<@O7TqdBUhoz)7tS+%Us-uORWQB4^D literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/httpcore/_backends/__pycache__/auto.cpython-310.pyc b/.venv/lib/python3.10/site-packages/httpcore/_backends/__pycache__/auto.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a8a2a15c14198da1313a39912a5a50a045740933 GIT binary patch literal 1887 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/httpcore/_backends/__pycache__/mock.cpython-310.pyc b/.venv/lib/python3.10/site-packages/httpcore/_backends/__pycache__/mock.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a69115dea6af50a4f4c70be919801e3c424445c9 GIT binary patch literal 5673 zcmbtYOLG(174B}mS`W)Mm^T9k3^SS;q=Cshgcv-KkeLyaF_|PHq$BILu|QI5Znpue zynsMuH(6$#EcG{%f6?1i7A&%IRTi!+@_nb>*3$_^x~h-PeRSXR{LX24Gc!2@*FXOC z*XBQG4dd?|3|~nMmJP%7{{%)E%4`{Jvu2v)t(H}@J2g|(DQx6g-g&$%|nbIMvZO7pKNamftx^-jkN>Os@%_|?}|G@1R znN&EldUxg1Tlbv1U);NMw;CS4;cs;sRX2F*>Bl$gjmK_Bg@=YGR|DBF}q;@22;*&27VhLspHxS?!x)+L1>~R+#kN*19fWPv6jo@U#0> zWy5Q`6<1Zd+T%HX#ot_8_nuYCPu$LvN~^h6>23uZUgzWTm5(ZZGjK0=VUzkp*RSxk z4NtojXDu?5Uui?;a(64V9jDo8297h2Q+6m`&g>l>(Wo463DepQHgzXV_IPoJYb{{Sr+h`Tw=^o>^arXXODw2o@KE2FVYFgG<|d*kPQ;zxV&i@^EvbvjR@ql6#M349 zu9{Qx;FI9rQ-{=H@F`VN3+f0WE}hL~bLxHdfjXs5V#p9-x0-%%e{Cyp{Rab+h(W?+)$6zohJ1XHkHd6_MvKC9+d{CK ziXjW^K*(Cv+xgz=mQz8utY59hxs~rcFfM;eqV? zAy*Bv?fNrEWDgU~P7r2-X4~~PgWbY<%c}>A+l$m7Ov#oBMX1aQ^KA)?1Z5_G5--i) zLyF9_Fuvf7(p@j5UH;b<|^X9rIkni1Yl>i5Xgt@>S%Fwyn8vA!R0 z_A<$+zF`tTq|RVL5MtDm^q+3@^;`L~+`#O(Q26Du23KfcJvcJVpb9<@s{ioPFVMgN#& znsKszP}hMIw0wF^pe32^EesiGe?ypTcGf)skKJ6b)opejmTz>nCeS^Oww>dY332w= z(z$@~Wh(0%f*}(JV3?yVJgFBjs^GjO@F8gguo7TI;7-`N_|Od;SWMS}+w0!P*do3? zZuU+Li9Wh(!pX7mqM(9cC9B#yaxJbC<-wb-M~GM2*8YTvxw zPiu+M^V~>n1(PF0zQ7?v8k;12KIDWrtV~W|yArL-OURF}^CdCFM|`zfvb6-jb?%oa zSf27EV+%Pgre<-7&ijPiDUec5pCxk5dOJSbg-RqZb|98hspizttJB0g@!VqU5+(1~AK-ML4 z19ONaXn-H$me>>Emz>)ZXbAa}1OrLBFxmBVphqJkoN0NDddsORrCs0G%Xnv4^r0Iv z#Oq2kxqERhTkiy}uCKM+`y(yngAs&bDT*)hv_0a&6qf}?AQj^!X+oLbpl+Z9>Yrj0 z;%5;*VUl%rpgjUw()c%6(+@}_s@Vrl%%F&10bdBz$E!wN!*G!Ho;f=rX)aQyzwPV<=)8S@UFh-69k&Q6nMXm6PDUA#j1 zVM@yL1VqNjqXjeurECxK9#Oh6yQKV<>vn(66#<#~VHspi-{s;LAOKfnenE@PC7;Fc zqmiS<1Dy48Um0cGy*fe!TyZ3*h>hskpJuO-+(E$v{!z zBt3qGg&*MF2MWu!On}6$HAAQ<+L}8K1PXl?t7rsgpnridd^R|@iU`MQ%j?bhbG{J2`kbN66uN&#cyD8 z+|)NQw}E?42sBkE#)a7LtcD8jCwOE6E)tkrf!XyfF#0wL;Yk0CWX#1Zz+KLN2GTn- ze&!ptMEY|)&35SIpdA`})xkZH)PJ8c2vSW+g{UVQ09Mq^3%GsB=T=Gf5a@DV*Ck(*N07=wIW7ky&cw4nmw~ zTx3cQh1WzA@fL+ZvVg%JU*xGRvp_zGUzpRn0V%bp2DFw|B!fPPIXND#>zLcdy_Y5^ z^ry#7I9%*Y++upvAOJ2NrA(!nQr4s--L~cN&fIPvR82M{1a#Wh< zzenqv_)84`9%&0x_-D*-h3Tm24DN>sPFMt#b+p^7qb=oXu=j^%jbEg*0{|5@KSpon6 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/httpcore/_backends/__pycache__/sync.cpython-310.pyc b/.venv/lib/python3.10/site-packages/httpcore/_backends/__pycache__/sync.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9ce813c1a64449e9ad4f2f19ac2cdf34cfa2edcb GIT binary patch literal 7031 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 XGs}jHG-3XC)hzoftY+21l^g#DVM7g< literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/httpcore/_backends/__pycache__/trio.cpython-310.pyc b/.venv/lib/python3.10/site-packages/httpcore/_backends/__pycache__/trio.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2523b680254872a55693f889fbb69fca1bfeacc7 GIT binary patch literal 5266 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 a(3j|APZD)&hHv`JH=i^YgNC*E(f None: + self._stream = stream + + async def read(self, max_bytes: int, timeout: float | None = None) -> bytes: + exc_map = { + TimeoutError: ReadTimeout, + anyio.BrokenResourceError: ReadError, + anyio.ClosedResourceError: ReadError, + anyio.EndOfStream: ReadError, + } + with map_exceptions(exc_map): + with anyio.fail_after(timeout): + try: + return await self._stream.receive(max_bytes=max_bytes) + except anyio.EndOfStream: # pragma: nocover + return b"" + + async def write(self, buffer: bytes, timeout: float | None = None) -> None: + if not buffer: + return + + exc_map = { + TimeoutError: WriteTimeout, + anyio.BrokenResourceError: WriteError, + anyio.ClosedResourceError: WriteError, + } + with map_exceptions(exc_map): + with anyio.fail_after(timeout): + await self._stream.send(item=buffer) + + async def aclose(self) -> None: + await self._stream.aclose() + + async def start_tls( + self, + ssl_context: ssl.SSLContext, + server_hostname: str | None = None, + timeout: float | None = None, + ) -> AsyncNetworkStream: + exc_map = { + TimeoutError: ConnectTimeout, + anyio.BrokenResourceError: ConnectError, + anyio.EndOfStream: ConnectError, + ssl.SSLError: ConnectError, + } + with map_exceptions(exc_map): + try: + with anyio.fail_after(timeout): + ssl_stream = await anyio.streams.tls.TLSStream.wrap( + self._stream, + ssl_context=ssl_context, + hostname=server_hostname, + standard_compatible=False, + server_side=False, + ) + except Exception as exc: # pragma: nocover + await self.aclose() + raise exc + return AnyIOStream(ssl_stream) + + def get_extra_info(self, info: str) -> typing.Any: + if info == "ssl_object": + return self._stream.extra(anyio.streams.tls.TLSAttribute.ssl_object, None) + if info == "client_addr": + return self._stream.extra(anyio.abc.SocketAttribute.local_address, None) + if info == "server_addr": + return self._stream.extra(anyio.abc.SocketAttribute.remote_address, None) + if info == "socket": + return self._stream.extra(anyio.abc.SocketAttribute.raw_socket, None) + if info == "is_readable": + sock = self._stream.extra(anyio.abc.SocketAttribute.raw_socket, None) + return is_socket_readable(sock) + return None + + +class AnyIOBackend(AsyncNetworkBackend): + async def connect_tcp( + self, + host: str, + port: int, + timeout: float | None = None, + local_address: str | None = None, + socket_options: typing.Iterable[SOCKET_OPTION] | None = None, + ) -> AsyncNetworkStream: # pragma: nocover + if socket_options is None: + socket_options = [] + exc_map = { + TimeoutError: ConnectTimeout, + OSError: ConnectError, + anyio.BrokenResourceError: ConnectError, + } + with map_exceptions(exc_map): + with anyio.fail_after(timeout): + stream: anyio.abc.ByteStream = await anyio.connect_tcp( + remote_host=host, + remote_port=port, + local_host=local_address, + ) + # By default TCP sockets opened in `asyncio` include TCP_NODELAY. + for option in socket_options: + stream._raw_socket.setsockopt(*option) # type: ignore[attr-defined] # pragma: no cover + return AnyIOStream(stream) + + async def connect_unix_socket( + self, + path: str, + timeout: float | None = None, + socket_options: typing.Iterable[SOCKET_OPTION] | None = None, + ) -> AsyncNetworkStream: # pragma: nocover + if socket_options is None: + socket_options = [] + exc_map = { + TimeoutError: ConnectTimeout, + OSError: ConnectError, + anyio.BrokenResourceError: ConnectError, + } + with map_exceptions(exc_map): + with anyio.fail_after(timeout): + stream: anyio.abc.ByteStream = await anyio.connect_unix(path) + for option in socket_options: + stream._raw_socket.setsockopt(*option) # type: ignore[attr-defined] # pragma: no cover + return AnyIOStream(stream) + + async def sleep(self, seconds: float) -> None: + await anyio.sleep(seconds) # pragma: nocover diff --git a/.venv/lib/python3.10/site-packages/httpcore/_backends/auto.py b/.venv/lib/python3.10/site-packages/httpcore/_backends/auto.py new file mode 100644 index 0000000..49f0e69 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpcore/_backends/auto.py @@ -0,0 +1,52 @@ +from __future__ import annotations + +import typing + +from .._synchronization import current_async_library +from .base import SOCKET_OPTION, AsyncNetworkBackend, AsyncNetworkStream + + +class AutoBackend(AsyncNetworkBackend): + async def _init_backend(self) -> None: + if not (hasattr(self, "_backend")): + backend = current_async_library() + if backend == "trio": + from .trio import TrioBackend + + self._backend: AsyncNetworkBackend = TrioBackend() + else: + from .anyio import AnyIOBackend + + self._backend = AnyIOBackend() + + async def connect_tcp( + self, + host: str, + port: int, + timeout: float | None = None, + local_address: str | None = None, + socket_options: typing.Iterable[SOCKET_OPTION] | None = None, + ) -> AsyncNetworkStream: + await self._init_backend() + return await self._backend.connect_tcp( + host, + port, + timeout=timeout, + local_address=local_address, + socket_options=socket_options, + ) + + async def connect_unix_socket( + self, + path: str, + timeout: float | None = None, + socket_options: typing.Iterable[SOCKET_OPTION] | None = None, + ) -> AsyncNetworkStream: # pragma: nocover + await self._init_backend() + return await self._backend.connect_unix_socket( + path, timeout=timeout, socket_options=socket_options + ) + + async def sleep(self, seconds: float) -> None: # pragma: nocover + await self._init_backend() + return await self._backend.sleep(seconds) diff --git a/.venv/lib/python3.10/site-packages/httpcore/_backends/base.py b/.venv/lib/python3.10/site-packages/httpcore/_backends/base.py new file mode 100644 index 0000000..cf55c8b --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpcore/_backends/base.py @@ -0,0 +1,101 @@ +from __future__ import annotations + +import ssl +import time +import typing + +SOCKET_OPTION = typing.Union[ + typing.Tuple[int, int, int], + typing.Tuple[int, int, typing.Union[bytes, bytearray]], + typing.Tuple[int, int, None, int], +] + + +class NetworkStream: + def read(self, max_bytes: int, timeout: float | None = None) -> bytes: + raise NotImplementedError() # pragma: nocover + + def write(self, buffer: bytes, timeout: float | None = None) -> None: + raise NotImplementedError() # pragma: nocover + + def close(self) -> None: + raise NotImplementedError() # pragma: nocover + + def start_tls( + self, + ssl_context: ssl.SSLContext, + server_hostname: str | None = None, + timeout: float | None = None, + ) -> NetworkStream: + raise NotImplementedError() # pragma: nocover + + def get_extra_info(self, info: str) -> typing.Any: + return None # pragma: nocover + + +class NetworkBackend: + def connect_tcp( + self, + host: str, + port: int, + timeout: float | None = None, + local_address: str | None = None, + socket_options: typing.Iterable[SOCKET_OPTION] | None = None, + ) -> NetworkStream: + raise NotImplementedError() # pragma: nocover + + def connect_unix_socket( + self, + path: str, + timeout: float | None = None, + socket_options: typing.Iterable[SOCKET_OPTION] | None = None, + ) -> NetworkStream: + raise NotImplementedError() # pragma: nocover + + def sleep(self, seconds: float) -> None: + time.sleep(seconds) # pragma: nocover + + +class AsyncNetworkStream: + async def read(self, max_bytes: int, timeout: float | None = None) -> bytes: + raise NotImplementedError() # pragma: nocover + + async def write(self, buffer: bytes, timeout: float | None = None) -> None: + raise NotImplementedError() # pragma: nocover + + async def aclose(self) -> None: + raise NotImplementedError() # pragma: nocover + + async def start_tls( + self, + ssl_context: ssl.SSLContext, + server_hostname: str | None = None, + timeout: float | None = None, + ) -> AsyncNetworkStream: + raise NotImplementedError() # pragma: nocover + + def get_extra_info(self, info: str) -> typing.Any: + return None # pragma: nocover + + +class AsyncNetworkBackend: + async def connect_tcp( + self, + host: str, + port: int, + timeout: float | None = None, + local_address: str | None = None, + socket_options: typing.Iterable[SOCKET_OPTION] | None = None, + ) -> AsyncNetworkStream: + raise NotImplementedError() # pragma: nocover + + async def connect_unix_socket( + self, + path: str, + timeout: float | None = None, + socket_options: typing.Iterable[SOCKET_OPTION] | None = None, + ) -> AsyncNetworkStream: + raise NotImplementedError() # pragma: nocover + + async def sleep(self, seconds: float) -> None: + raise NotImplementedError() # pragma: nocover diff --git a/.venv/lib/python3.10/site-packages/httpcore/_backends/mock.py b/.venv/lib/python3.10/site-packages/httpcore/_backends/mock.py new file mode 100644 index 0000000..9b6edca --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpcore/_backends/mock.py @@ -0,0 +1,143 @@ +from __future__ import annotations + +import ssl +import typing + +from .._exceptions import ReadError +from .base import ( + SOCKET_OPTION, + AsyncNetworkBackend, + AsyncNetworkStream, + NetworkBackend, + NetworkStream, +) + + +class MockSSLObject: + def __init__(self, http2: bool): + self._http2 = http2 + + def selected_alpn_protocol(self) -> str: + return "h2" if self._http2 else "http/1.1" + + +class MockStream(NetworkStream): + def __init__(self, buffer: list[bytes], http2: bool = False) -> None: + self._buffer = buffer + self._http2 = http2 + self._closed = False + + def read(self, max_bytes: int, timeout: float | None = None) -> bytes: + if self._closed: + raise ReadError("Connection closed") + if not self._buffer: + return b"" + return self._buffer.pop(0) + + def write(self, buffer: bytes, timeout: float | None = None) -> None: + pass + + def close(self) -> None: + self._closed = True + + def start_tls( + self, + ssl_context: ssl.SSLContext, + server_hostname: str | None = None, + timeout: float | None = None, + ) -> NetworkStream: + return self + + def get_extra_info(self, info: str) -> typing.Any: + return MockSSLObject(http2=self._http2) if info == "ssl_object" else None + + def __repr__(self) -> str: + return "" + + +class MockBackend(NetworkBackend): + def __init__(self, buffer: list[bytes], http2: bool = False) -> None: + self._buffer = buffer + self._http2 = http2 + + def connect_tcp( + self, + host: str, + port: int, + timeout: float | None = None, + local_address: str | None = None, + socket_options: typing.Iterable[SOCKET_OPTION] | None = None, + ) -> NetworkStream: + return MockStream(list(self._buffer), http2=self._http2) + + def connect_unix_socket( + self, + path: str, + timeout: float | None = None, + socket_options: typing.Iterable[SOCKET_OPTION] | None = None, + ) -> NetworkStream: + return MockStream(list(self._buffer), http2=self._http2) + + def sleep(self, seconds: float) -> None: + pass + + +class AsyncMockStream(AsyncNetworkStream): + def __init__(self, buffer: list[bytes], http2: bool = False) -> None: + self._buffer = buffer + self._http2 = http2 + self._closed = False + + async def read(self, max_bytes: int, timeout: float | None = None) -> bytes: + if self._closed: + raise ReadError("Connection closed") + if not self._buffer: + return b"" + return self._buffer.pop(0) + + async def write(self, buffer: bytes, timeout: float | None = None) -> None: + pass + + async def aclose(self) -> None: + self._closed = True + + async def start_tls( + self, + ssl_context: ssl.SSLContext, + server_hostname: str | None = None, + timeout: float | None = None, + ) -> AsyncNetworkStream: + return self + + def get_extra_info(self, info: str) -> typing.Any: + return MockSSLObject(http2=self._http2) if info == "ssl_object" else None + + def __repr__(self) -> str: + return "" + + +class AsyncMockBackend(AsyncNetworkBackend): + def __init__(self, buffer: list[bytes], http2: bool = False) -> None: + self._buffer = buffer + self._http2 = http2 + + async def connect_tcp( + self, + host: str, + port: int, + timeout: float | None = None, + local_address: str | None = None, + socket_options: typing.Iterable[SOCKET_OPTION] | None = None, + ) -> AsyncNetworkStream: + return AsyncMockStream(list(self._buffer), http2=self._http2) + + async def connect_unix_socket( + self, + path: str, + timeout: float | None = None, + socket_options: typing.Iterable[SOCKET_OPTION] | None = None, + ) -> AsyncNetworkStream: + return AsyncMockStream(list(self._buffer), http2=self._http2) + + async def sleep(self, seconds: float) -> None: + pass diff --git a/.venv/lib/python3.10/site-packages/httpcore/_backends/sync.py b/.venv/lib/python3.10/site-packages/httpcore/_backends/sync.py new file mode 100644 index 0000000..4018a09 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpcore/_backends/sync.py @@ -0,0 +1,241 @@ +from __future__ import annotations + +import functools +import socket +import ssl +import sys +import typing + +from .._exceptions import ( + ConnectError, + ConnectTimeout, + ExceptionMapping, + ReadError, + ReadTimeout, + WriteError, + WriteTimeout, + map_exceptions, +) +from .._utils import is_socket_readable +from .base import SOCKET_OPTION, NetworkBackend, NetworkStream + + +class TLSinTLSStream(NetworkStream): # pragma: no cover + """ + Because the standard `SSLContext.wrap_socket` method does + not work for `SSLSocket` objects, we need this class + to implement TLS stream using an underlying `SSLObject` + instance in order to support TLS on top of TLS. + """ + + # Defined in RFC 8449 + TLS_RECORD_SIZE = 16384 + + def __init__( + self, + sock: socket.socket, + ssl_context: ssl.SSLContext, + server_hostname: str | None = None, + timeout: float | None = None, + ): + self._sock = sock + self._incoming = ssl.MemoryBIO() + self._outgoing = ssl.MemoryBIO() + + self.ssl_obj = ssl_context.wrap_bio( + incoming=self._incoming, + outgoing=self._outgoing, + server_hostname=server_hostname, + ) + + self._sock.settimeout(timeout) + self._perform_io(self.ssl_obj.do_handshake) + + def _perform_io( + self, + func: typing.Callable[..., typing.Any], + ) -> typing.Any: + ret = None + + while True: + errno = None + try: + ret = func() + except (ssl.SSLWantReadError, ssl.SSLWantWriteError) as e: + errno = e.errno + + self._sock.sendall(self._outgoing.read()) + + if errno == ssl.SSL_ERROR_WANT_READ: + buf = self._sock.recv(self.TLS_RECORD_SIZE) + + if buf: + self._incoming.write(buf) + else: + self._incoming.write_eof() + if errno is None: + return ret + + def read(self, max_bytes: int, timeout: float | None = None) -> bytes: + exc_map: ExceptionMapping = {socket.timeout: ReadTimeout, OSError: ReadError} + with map_exceptions(exc_map): + self._sock.settimeout(timeout) + return typing.cast( + bytes, self._perform_io(functools.partial(self.ssl_obj.read, max_bytes)) + ) + + def write(self, buffer: bytes, timeout: float | None = None) -> None: + exc_map: ExceptionMapping = {socket.timeout: WriteTimeout, OSError: WriteError} + with map_exceptions(exc_map): + self._sock.settimeout(timeout) + while buffer: + nsent = self._perform_io(functools.partial(self.ssl_obj.write, buffer)) + buffer = buffer[nsent:] + + def close(self) -> None: + self._sock.close() + + def start_tls( + self, + ssl_context: ssl.SSLContext, + server_hostname: str | None = None, + timeout: float | None = None, + ) -> NetworkStream: + raise NotImplementedError() + + def get_extra_info(self, info: str) -> typing.Any: + if info == "ssl_object": + return self.ssl_obj + if info == "client_addr": + return self._sock.getsockname() + if info == "server_addr": + return self._sock.getpeername() + if info == "socket": + return self._sock + if info == "is_readable": + return is_socket_readable(self._sock) + return None + + +class SyncStream(NetworkStream): + def __init__(self, sock: socket.socket) -> None: + self._sock = sock + + def read(self, max_bytes: int, timeout: float | None = None) -> bytes: + exc_map: ExceptionMapping = {socket.timeout: ReadTimeout, OSError: ReadError} + with map_exceptions(exc_map): + self._sock.settimeout(timeout) + return self._sock.recv(max_bytes) + + def write(self, buffer: bytes, timeout: float | None = None) -> None: + if not buffer: + return + + exc_map: ExceptionMapping = {socket.timeout: WriteTimeout, OSError: WriteError} + with map_exceptions(exc_map): + while buffer: + self._sock.settimeout(timeout) + n = self._sock.send(buffer) + buffer = buffer[n:] + + def close(self) -> None: + self._sock.close() + + def start_tls( + self, + ssl_context: ssl.SSLContext, + server_hostname: str | None = None, + timeout: float | None = None, + ) -> NetworkStream: + exc_map: ExceptionMapping = { + socket.timeout: ConnectTimeout, + OSError: ConnectError, + } + with map_exceptions(exc_map): + try: + if isinstance(self._sock, ssl.SSLSocket): # pragma: no cover + # If the underlying socket has already been upgraded + # to the TLS layer (i.e. is an instance of SSLSocket), + # we need some additional smarts to support TLS-in-TLS. + return TLSinTLSStream( + self._sock, ssl_context, server_hostname, timeout + ) + else: + self._sock.settimeout(timeout) + sock = ssl_context.wrap_socket( + self._sock, server_hostname=server_hostname + ) + except Exception as exc: # pragma: nocover + self.close() + raise exc + return SyncStream(sock) + + def get_extra_info(self, info: str) -> typing.Any: + if info == "ssl_object" and isinstance(self._sock, ssl.SSLSocket): + return self._sock._sslobj # type: ignore + if info == "client_addr": + return self._sock.getsockname() + if info == "server_addr": + return self._sock.getpeername() + if info == "socket": + return self._sock + if info == "is_readable": + return is_socket_readable(self._sock) + return None + + +class SyncBackend(NetworkBackend): + def connect_tcp( + self, + host: str, + port: int, + timeout: float | None = None, + local_address: str | None = None, + socket_options: typing.Iterable[SOCKET_OPTION] | None = None, + ) -> NetworkStream: + # Note that we automatically include `TCP_NODELAY` + # in addition to any other custom socket options. + if socket_options is None: + socket_options = [] # pragma: no cover + address = (host, port) + source_address = None if local_address is None else (local_address, 0) + exc_map: ExceptionMapping = { + socket.timeout: ConnectTimeout, + OSError: ConnectError, + } + + with map_exceptions(exc_map): + sock = socket.create_connection( + address, + timeout, + source_address=source_address, + ) + for option in socket_options: + sock.setsockopt(*option) # pragma: no cover + sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) + return SyncStream(sock) + + def connect_unix_socket( + self, + path: str, + timeout: float | None = None, + socket_options: typing.Iterable[SOCKET_OPTION] | None = None, + ) -> NetworkStream: # pragma: nocover + if sys.platform == "win32": + raise RuntimeError( + "Attempted to connect to a UNIX socket on a Windows system." + ) + if socket_options is None: + socket_options = [] + + exc_map: ExceptionMapping = { + socket.timeout: ConnectTimeout, + OSError: ConnectError, + } + with map_exceptions(exc_map): + sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + for option in socket_options: + sock.setsockopt(*option) + sock.settimeout(timeout) + sock.connect(path) + return SyncStream(sock) diff --git a/.venv/lib/python3.10/site-packages/httpcore/_backends/trio.py b/.venv/lib/python3.10/site-packages/httpcore/_backends/trio.py new file mode 100644 index 0000000..6f53f5f --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpcore/_backends/trio.py @@ -0,0 +1,159 @@ +from __future__ import annotations + +import ssl +import typing + +import trio + +from .._exceptions import ( + ConnectError, + ConnectTimeout, + ExceptionMapping, + ReadError, + ReadTimeout, + WriteError, + WriteTimeout, + map_exceptions, +) +from .base import SOCKET_OPTION, AsyncNetworkBackend, AsyncNetworkStream + + +class TrioStream(AsyncNetworkStream): + def __init__(self, stream: trio.abc.Stream) -> None: + self._stream = stream + + async def read(self, max_bytes: int, timeout: float | None = None) -> bytes: + timeout_or_inf = float("inf") if timeout is None else timeout + exc_map: ExceptionMapping = { + trio.TooSlowError: ReadTimeout, + trio.BrokenResourceError: ReadError, + trio.ClosedResourceError: ReadError, + } + with map_exceptions(exc_map): + with trio.fail_after(timeout_or_inf): + data: bytes = await self._stream.receive_some(max_bytes=max_bytes) + return data + + async def write(self, buffer: bytes, timeout: float | None = None) -> None: + if not buffer: + return + + timeout_or_inf = float("inf") if timeout is None else timeout + exc_map: ExceptionMapping = { + trio.TooSlowError: WriteTimeout, + trio.BrokenResourceError: WriteError, + trio.ClosedResourceError: WriteError, + } + with map_exceptions(exc_map): + with trio.fail_after(timeout_or_inf): + await self._stream.send_all(data=buffer) + + async def aclose(self) -> None: + await self._stream.aclose() + + async def start_tls( + self, + ssl_context: ssl.SSLContext, + server_hostname: str | None = None, + timeout: float | None = None, + ) -> AsyncNetworkStream: + timeout_or_inf = float("inf") if timeout is None else timeout + exc_map: ExceptionMapping = { + trio.TooSlowError: ConnectTimeout, + trio.BrokenResourceError: ConnectError, + } + ssl_stream = trio.SSLStream( + self._stream, + ssl_context=ssl_context, + server_hostname=server_hostname, + https_compatible=True, + server_side=False, + ) + with map_exceptions(exc_map): + try: + with trio.fail_after(timeout_or_inf): + await ssl_stream.do_handshake() + except Exception as exc: # pragma: nocover + await self.aclose() + raise exc + return TrioStream(ssl_stream) + + def get_extra_info(self, info: str) -> typing.Any: + if info == "ssl_object" and isinstance(self._stream, trio.SSLStream): + # Type checkers cannot see `_ssl_object` attribute because trio._ssl.SSLStream uses __getattr__/__setattr__. + # Tracked at https://github.com/python-trio/trio/issues/542 + return self._stream._ssl_object # type: ignore[attr-defined] + if info == "client_addr": + return self._get_socket_stream().socket.getsockname() + if info == "server_addr": + return self._get_socket_stream().socket.getpeername() + if info == "socket": + stream = self._stream + while isinstance(stream, trio.SSLStream): + stream = stream.transport_stream + assert isinstance(stream, trio.SocketStream) + return stream.socket + if info == "is_readable": + socket = self.get_extra_info("socket") + return socket.is_readable() + return None + + def _get_socket_stream(self) -> trio.SocketStream: + stream = self._stream + while isinstance(stream, trio.SSLStream): + stream = stream.transport_stream + assert isinstance(stream, trio.SocketStream) + return stream + + +class TrioBackend(AsyncNetworkBackend): + async def connect_tcp( + self, + host: str, + port: int, + timeout: float | None = None, + local_address: str | None = None, + socket_options: typing.Iterable[SOCKET_OPTION] | None = None, + ) -> AsyncNetworkStream: + # By default for TCP sockets, trio enables TCP_NODELAY. + # https://trio.readthedocs.io/en/stable/reference-io.html#trio.SocketStream + if socket_options is None: + socket_options = [] # pragma: no cover + timeout_or_inf = float("inf") if timeout is None else timeout + exc_map: ExceptionMapping = { + trio.TooSlowError: ConnectTimeout, + trio.BrokenResourceError: ConnectError, + OSError: ConnectError, + } + with map_exceptions(exc_map): + with trio.fail_after(timeout_or_inf): + stream: trio.abc.Stream = await trio.open_tcp_stream( + host=host, port=port, local_address=local_address + ) + for option in socket_options: + stream.setsockopt(*option) # type: ignore[attr-defined] # pragma: no cover + return TrioStream(stream) + + async def connect_unix_socket( + self, + path: str, + timeout: float | None = None, + socket_options: typing.Iterable[SOCKET_OPTION] | None = None, + ) -> AsyncNetworkStream: # pragma: nocover + if socket_options is None: + socket_options = [] + timeout_or_inf = float("inf") if timeout is None else timeout + exc_map: ExceptionMapping = { + trio.TooSlowError: ConnectTimeout, + trio.BrokenResourceError: ConnectError, + OSError: ConnectError, + } + with map_exceptions(exc_map): + with trio.fail_after(timeout_or_inf): + stream: trio.abc.Stream = await trio.open_unix_socket(path) + for option in socket_options: + stream.setsockopt(*option) # type: ignore[attr-defined] # pragma: no cover + return TrioStream(stream) + + async def sleep(self, seconds: float) -> None: + await trio.sleep(seconds) # pragma: nocover diff --git a/.venv/lib/python3.10/site-packages/httpcore/_exceptions.py b/.venv/lib/python3.10/site-packages/httpcore/_exceptions.py new file mode 100644 index 0000000..bc28d44 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpcore/_exceptions.py @@ -0,0 +1,81 @@ +import contextlib +import typing + +ExceptionMapping = typing.Mapping[typing.Type[Exception], typing.Type[Exception]] + + +@contextlib.contextmanager +def map_exceptions(map: ExceptionMapping) -> typing.Iterator[None]: + try: + yield + except Exception as exc: # noqa: PIE786 + for from_exc, to_exc in map.items(): + if isinstance(exc, from_exc): + raise to_exc(exc) from exc + raise # pragma: nocover + + +class ConnectionNotAvailable(Exception): + pass + + +class ProxyError(Exception): + pass + + +class UnsupportedProtocol(Exception): + pass + + +class ProtocolError(Exception): + pass + + +class RemoteProtocolError(ProtocolError): + pass + + +class LocalProtocolError(ProtocolError): + pass + + +# Timeout errors + + +class TimeoutException(Exception): + pass + + +class PoolTimeout(TimeoutException): + pass + + +class ConnectTimeout(TimeoutException): + pass + + +class ReadTimeout(TimeoutException): + pass + + +class WriteTimeout(TimeoutException): + pass + + +# Network errors + + +class NetworkError(Exception): + pass + + +class ConnectError(NetworkError): + pass + + +class ReadError(NetworkError): + pass + + +class WriteError(NetworkError): + pass diff --git a/.venv/lib/python3.10/site-packages/httpcore/_models.py b/.venv/lib/python3.10/site-packages/httpcore/_models.py new file mode 100644 index 0000000..8a65f13 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpcore/_models.py @@ -0,0 +1,516 @@ +from __future__ import annotations + +import base64 +import ssl +import typing +import urllib.parse + +# Functions for typechecking... + + +ByteOrStr = typing.Union[bytes, str] +HeadersAsSequence = typing.Sequence[typing.Tuple[ByteOrStr, ByteOrStr]] +HeadersAsMapping = typing.Mapping[ByteOrStr, ByteOrStr] +HeaderTypes = typing.Union[HeadersAsSequence, HeadersAsMapping, None] + +Extensions = typing.MutableMapping[str, typing.Any] + + +def enforce_bytes(value: bytes | str, *, name: str) -> bytes: + """ + Any arguments that are ultimately represented as bytes can be specified + either as bytes or as strings. + + However we enforce that any string arguments must only contain characters in + the plain ASCII range. chr(0)...chr(127). If you need to use characters + outside that range then be precise, and use a byte-wise argument. + """ + if isinstance(value, str): + try: + return value.encode("ascii") + except UnicodeEncodeError: + raise TypeError(f"{name} strings may not include unicode characters.") + elif isinstance(value, bytes): + return value + + seen_type = type(value).__name__ + raise TypeError(f"{name} must be bytes or str, but got {seen_type}.") + + +def enforce_url(value: URL | bytes | str, *, name: str) -> URL: + """ + Type check for URL parameters. + """ + if isinstance(value, (bytes, str)): + return URL(value) + elif isinstance(value, URL): + return value + + seen_type = type(value).__name__ + raise TypeError(f"{name} must be a URL, bytes, or str, but got {seen_type}.") + + +def enforce_headers( + value: HeadersAsMapping | HeadersAsSequence | None = None, *, name: str +) -> list[tuple[bytes, bytes]]: + """ + Convienence function that ensure all items in request or response headers + are either bytes or strings in the plain ASCII range. + """ + if value is None: + return [] + elif isinstance(value, typing.Mapping): + return [ + ( + enforce_bytes(k, name="header name"), + enforce_bytes(v, name="header value"), + ) + for k, v in value.items() + ] + elif isinstance(value, typing.Sequence): + return [ + ( + enforce_bytes(k, name="header name"), + enforce_bytes(v, name="header value"), + ) + for k, v in value + ] + + seen_type = type(value).__name__ + raise TypeError( + f"{name} must be a mapping or sequence of two-tuples, but got {seen_type}." + ) + + +def enforce_stream( + value: bytes | typing.Iterable[bytes] | typing.AsyncIterable[bytes] | None, + *, + name: str, +) -> typing.Iterable[bytes] | typing.AsyncIterable[bytes]: + if value is None: + return ByteStream(b"") + elif isinstance(value, bytes): + return ByteStream(value) + return value + + +# * https://tools.ietf.org/html/rfc3986#section-3.2.3 +# * https://url.spec.whatwg.org/#url-miscellaneous +# * https://url.spec.whatwg.org/#scheme-state +DEFAULT_PORTS = { + b"ftp": 21, + b"http": 80, + b"https": 443, + b"ws": 80, + b"wss": 443, +} + + +def include_request_headers( + headers: list[tuple[bytes, bytes]], + *, + url: "URL", + content: None | bytes | typing.Iterable[bytes] | typing.AsyncIterable[bytes], +) -> list[tuple[bytes, bytes]]: + headers_set = set(k.lower() for k, v in headers) + + if b"host" not in headers_set: + default_port = DEFAULT_PORTS.get(url.scheme) + if url.port is None or url.port == default_port: + header_value = url.host + else: + header_value = b"%b:%d" % (url.host, url.port) + headers = [(b"Host", header_value)] + headers + + if ( + content is not None + and b"content-length" not in headers_set + and b"transfer-encoding" not in headers_set + ): + if isinstance(content, bytes): + content_length = str(len(content)).encode("ascii") + headers += [(b"Content-Length", content_length)] + else: + headers += [(b"Transfer-Encoding", b"chunked")] # pragma: nocover + + return headers + + +# Interfaces for byte streams... + + +class ByteStream: + """ + A container for non-streaming content, and that supports both sync and async + stream iteration. + """ + + def __init__(self, content: bytes) -> None: + self._content = content + + def __iter__(self) -> typing.Iterator[bytes]: + yield self._content + + async def __aiter__(self) -> typing.AsyncIterator[bytes]: + yield self._content + + def __repr__(self) -> str: + return f"<{self.__class__.__name__} [{len(self._content)} bytes]>" + + +class Origin: + def __init__(self, scheme: bytes, host: bytes, port: int) -> None: + self.scheme = scheme + self.host = host + self.port = port + + def __eq__(self, other: typing.Any) -> bool: + return ( + isinstance(other, Origin) + and self.scheme == other.scheme + and self.host == other.host + and self.port == other.port + ) + + def __str__(self) -> str: + scheme = self.scheme.decode("ascii") + host = self.host.decode("ascii") + port = str(self.port) + return f"{scheme}://{host}:{port}" + + +class URL: + """ + Represents the URL against which an HTTP request may be made. + + The URL may either be specified as a plain string, for convienence: + + ```python + url = httpcore.URL("https://www.example.com/") + ``` + + Or be constructed with explicitily pre-parsed components: + + ```python + url = httpcore.URL(scheme=b'https', host=b'www.example.com', port=None, target=b'/') + ``` + + Using this second more explicit style allows integrations that are using + `httpcore` to pass through URLs that have already been parsed in order to use + libraries such as `rfc-3986` rather than relying on the stdlib. It also ensures + that URL parsing is treated identically at both the networking level and at any + higher layers of abstraction. + + The four components are important here, as they allow the URL to be precisely + specified in a pre-parsed format. They also allow certain types of request to + be created that could not otherwise be expressed. + + For example, an HTTP request to `http://www.example.com/` forwarded via a proxy + at `http://localhost:8080`... + + ```python + # Constructs an HTTP request with a complete URL as the target: + # GET https://www.example.com/ HTTP/1.1 + url = httpcore.URL( + scheme=b'http', + host=b'localhost', + port=8080, + target=b'https://www.example.com/' + ) + request = httpcore.Request( + method="GET", + url=url + ) + ``` + + Another example is constructing an `OPTIONS *` request... + + ```python + # Constructs an 'OPTIONS *' HTTP request: + # OPTIONS * HTTP/1.1 + url = httpcore.URL(scheme=b'https', host=b'www.example.com', target=b'*') + request = httpcore.Request(method="OPTIONS", url=url) + ``` + + This kind of request is not possible to formulate with a URL string, + because the `/` delimiter is always used to demark the target from the + host/port portion of the URL. + + For convenience, string-like arguments may be specified either as strings or + as bytes. However, once a request is being issue over-the-wire, the URL + components are always ultimately required to be a bytewise representation. + + In order to avoid any ambiguity over character encodings, when strings are used + as arguments, they must be strictly limited to the ASCII range `chr(0)`-`chr(127)`. + If you require a bytewise representation that is outside this range you must + handle the character encoding directly, and pass a bytes instance. + """ + + def __init__( + self, + url: bytes | str = "", + *, + scheme: bytes | str = b"", + host: bytes | str = b"", + port: int | None = None, + target: bytes | str = b"", + ) -> None: + """ + Parameters: + url: The complete URL as a string or bytes. + scheme: The URL scheme as a string or bytes. + Typically either `"http"` or `"https"`. + host: The URL host as a string or bytes. Such as `"www.example.com"`. + port: The port to connect to. Either an integer or `None`. + target: The target of the HTTP request. Such as `"/items?search=red"`. + """ + if url: + parsed = urllib.parse.urlparse(enforce_bytes(url, name="url")) + self.scheme = parsed.scheme + self.host = parsed.hostname or b"" + self.port = parsed.port + self.target = (parsed.path or b"/") + ( + b"?" + parsed.query if parsed.query else b"" + ) + else: + self.scheme = enforce_bytes(scheme, name="scheme") + self.host = enforce_bytes(host, name="host") + self.port = port + self.target = enforce_bytes(target, name="target") + + @property + def origin(self) -> Origin: + default_port = { + b"http": 80, + b"https": 443, + b"ws": 80, + b"wss": 443, + b"socks5": 1080, + b"socks5h": 1080, + }[self.scheme] + return Origin( + scheme=self.scheme, host=self.host, port=self.port or default_port + ) + + def __eq__(self, other: typing.Any) -> bool: + return ( + isinstance(other, URL) + and other.scheme == self.scheme + and other.host == self.host + and other.port == self.port + and other.target == self.target + ) + + def __bytes__(self) -> bytes: + if self.port is None: + return b"%b://%b%b" % (self.scheme, self.host, self.target) + return b"%b://%b:%d%b" % (self.scheme, self.host, self.port, self.target) + + def __repr__(self) -> str: + return ( + f"{self.__class__.__name__}(scheme={self.scheme!r}, " + f"host={self.host!r}, port={self.port!r}, target={self.target!r})" + ) + + +class Request: + """ + An HTTP request. + """ + + def __init__( + self, + method: bytes | str, + url: URL | bytes | str, + *, + headers: HeaderTypes = None, + content: bytes + | typing.Iterable[bytes] + | typing.AsyncIterable[bytes] + | None = None, + extensions: Extensions | None = None, + ) -> None: + """ + Parameters: + method: The HTTP request method, either as a string or bytes. + For example: `GET`. + url: The request URL, either as a `URL` instance, or as a string or bytes. + For example: `"https://www.example.com".` + headers: The HTTP request headers. + content: The content of the request body. + extensions: A dictionary of optional extra information included on + the request. Possible keys include `"timeout"`, and `"trace"`. + """ + self.method: bytes = enforce_bytes(method, name="method") + self.url: URL = enforce_url(url, name="url") + self.headers: list[tuple[bytes, bytes]] = enforce_headers( + headers, name="headers" + ) + self.stream: typing.Iterable[bytes] | typing.AsyncIterable[bytes] = ( + enforce_stream(content, name="content") + ) + self.extensions = {} if extensions is None else extensions + + if "target" in self.extensions: + self.url = URL( + scheme=self.url.scheme, + host=self.url.host, + port=self.url.port, + target=self.extensions["target"], + ) + + def __repr__(self) -> str: + return f"<{self.__class__.__name__} [{self.method!r}]>" + + +class Response: + """ + An HTTP response. + """ + + def __init__( + self, + status: int, + *, + headers: HeaderTypes = None, + content: bytes + | typing.Iterable[bytes] + | typing.AsyncIterable[bytes] + | None = None, + extensions: Extensions | None = None, + ) -> None: + """ + Parameters: + status: The HTTP status code of the response. For example `200`. + headers: The HTTP response headers. + content: The content of the response body. + extensions: A dictionary of optional extra information included on + the responseself.Possible keys include `"http_version"`, + `"reason_phrase"`, and `"network_stream"`. + """ + self.status: int = status + self.headers: list[tuple[bytes, bytes]] = enforce_headers( + headers, name="headers" + ) + self.stream: typing.Iterable[bytes] | typing.AsyncIterable[bytes] = ( + enforce_stream(content, name="content") + ) + self.extensions = {} if extensions is None else extensions + + self._stream_consumed = False + + @property + def content(self) -> bytes: + if not hasattr(self, "_content"): + if isinstance(self.stream, typing.Iterable): + raise RuntimeError( + "Attempted to access 'response.content' on a streaming response. " + "Call 'response.read()' first." + ) + else: + raise RuntimeError( + "Attempted to access 'response.content' on a streaming response. " + "Call 'await response.aread()' first." + ) + return self._content + + def __repr__(self) -> str: + return f"<{self.__class__.__name__} [{self.status}]>" + + # Sync interface... + + def read(self) -> bytes: + if not isinstance(self.stream, typing.Iterable): # pragma: nocover + raise RuntimeError( + "Attempted to read an asynchronous response using 'response.read()'. " + "You should use 'await response.aread()' instead." + ) + if not hasattr(self, "_content"): + self._content = b"".join([part for part in self.iter_stream()]) + return self._content + + def iter_stream(self) -> typing.Iterator[bytes]: + if not isinstance(self.stream, typing.Iterable): # pragma: nocover + raise RuntimeError( + "Attempted to stream an asynchronous response using 'for ... in " + "response.iter_stream()'. " + "You should use 'async for ... in response.aiter_stream()' instead." + ) + if self._stream_consumed: + raise RuntimeError( + "Attempted to call 'for ... in response.iter_stream()' more than once." + ) + self._stream_consumed = True + for chunk in self.stream: + yield chunk + + def close(self) -> None: + if not isinstance(self.stream, typing.Iterable): # pragma: nocover + raise RuntimeError( + "Attempted to close an asynchronous response using 'response.close()'. " + "You should use 'await response.aclose()' instead." + ) + if hasattr(self.stream, "close"): + self.stream.close() + + # Async interface... + + async def aread(self) -> bytes: + if not isinstance(self.stream, typing.AsyncIterable): # pragma: nocover + raise RuntimeError( + "Attempted to read an synchronous response using " + "'await response.aread()'. " + "You should use 'response.read()' instead." + ) + if not hasattr(self, "_content"): + self._content = b"".join([part async for part in self.aiter_stream()]) + return self._content + + async def aiter_stream(self) -> typing.AsyncIterator[bytes]: + if not isinstance(self.stream, typing.AsyncIterable): # pragma: nocover + raise RuntimeError( + "Attempted to stream an synchronous response using 'async for ... in " + "response.aiter_stream()'. " + "You should use 'for ... in response.iter_stream()' instead." + ) + if self._stream_consumed: + raise RuntimeError( + "Attempted to call 'async for ... in response.aiter_stream()' " + "more than once." + ) + self._stream_consumed = True + async for chunk in self.stream: + yield chunk + + async def aclose(self) -> None: + if not isinstance(self.stream, typing.AsyncIterable): # pragma: nocover + raise RuntimeError( + "Attempted to close a synchronous response using " + "'await response.aclose()'. " + "You should use 'response.close()' instead." + ) + if hasattr(self.stream, "aclose"): + await self.stream.aclose() + + +class Proxy: + def __init__( + self, + url: URL | bytes | str, + auth: tuple[bytes | str, bytes | str] | None = None, + headers: HeadersAsMapping | HeadersAsSequence | None = None, + ssl_context: ssl.SSLContext | None = None, + ): + self.url = enforce_url(url, name="url") + self.headers = enforce_headers(headers, name="headers") + self.ssl_context = ssl_context + + if auth is not None: + username = enforce_bytes(auth[0], name="auth") + password = enforce_bytes(auth[1], name="auth") + userpass = username + b":" + password + authorization = b"Basic " + base64.b64encode(userpass) + self.auth: tuple[bytes, bytes] | None = (username, password) + self.headers = [(b"Proxy-Authorization", authorization)] + self.headers + else: + self.auth = None diff --git a/.venv/lib/python3.10/site-packages/httpcore/_ssl.py b/.venv/lib/python3.10/site-packages/httpcore/_ssl.py new file mode 100644 index 0000000..c99c5a6 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpcore/_ssl.py @@ -0,0 +1,9 @@ +import ssl + +import certifi + + +def default_ssl_context() -> ssl.SSLContext: + context = ssl.create_default_context() + context.load_verify_locations(certifi.where()) + return context diff --git a/.venv/lib/python3.10/site-packages/httpcore/_sync/__init__.py b/.venv/lib/python3.10/site-packages/httpcore/_sync/__init__.py new file mode 100644 index 0000000..b476d76 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpcore/_sync/__init__.py @@ -0,0 +1,39 @@ +from .connection import HTTPConnection +from .connection_pool import ConnectionPool +from .http11 import HTTP11Connection +from .http_proxy import HTTPProxy +from .interfaces import ConnectionInterface + +try: + from .http2 import HTTP2Connection +except ImportError: # pragma: nocover + + class HTTP2Connection: # type: ignore + def __init__(self, *args, **kwargs) -> None: # type: ignore + raise RuntimeError( + "Attempted to use http2 support, but the `h2` package is not " + "installed. Use 'pip install httpcore[http2]'." + ) + + +try: + from .socks_proxy import SOCKSProxy +except ImportError: # pragma: nocover + + class SOCKSProxy: # type: ignore + def __init__(self, *args, **kwargs) -> None: # type: ignore + raise RuntimeError( + "Attempted to use SOCKS support, but the `socksio` package is not " + "installed. Use 'pip install httpcore[socks]'." + ) + + +__all__ = [ + "HTTPConnection", + "ConnectionPool", + "HTTPProxy", + "HTTP11Connection", + "HTTP2Connection", + "ConnectionInterface", + "SOCKSProxy", +] diff --git a/.venv/lib/python3.10/site-packages/httpcore/_sync/__pycache__/__init__.cpython-310.pyc b/.venv/lib/python3.10/site-packages/httpcore/_sync/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fcb35fe7b48b4c255c49c169d238d0329162ee06 GIT binary patch literal 1390 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 C<{b$D literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/httpcore/_sync/__pycache__/connection_pool.cpython-310.pyc b/.venv/lib/python3.10/site-packages/httpcore/_sync/__pycache__/connection_pool.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5509f73f0a9e02a63c7e1371fbcbc4fb9ecc1fe8 GIT binary patch literal 12711 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 J^lv=-e*s6hA5{PV literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/httpcore/_sync/__pycache__/http_proxy.cpython-310.pyc b/.venv/lib/python3.10/site-packages/httpcore/_sync/__pycache__/http_proxy.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8ad516c487066b6c0e54d2834adaa660aaff1b4a GIT binary patch literal 12132 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 HCZGL3$nE1P literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/httpcore/_sync/__pycache__/interfaces.cpython-310.pyc b/.venv/lib/python3.10/site-packages/httpcore/_sync/__pycache__/interfaces.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..44a3ce6a94ce18ab10aeedf0ccbd9d97bf169db2 GIT binary patch literal 4334 zcmb_gTW=f372X?nS4)bzIhGY8@gQxIvb9M&>AgYW!gdn_g%Ze09Bh!%tDTX!@m`pj zr6dwG(8hlCKj=g9sDDxPNAzJ{i$3I~F9C{1eQ3{_cjaM)g=rbYIs|H)6v#)W4>0Qj=P-mDK!N zV*7UD_)g;bZnEGnB%bdjb-$i8{6@0qFD6aDscY|Qv_|b`8nvGq{t~nt>O#w9OHWOI znHmqY*2355NlTaYAWgG8$fGP3n_nCF(v#+gTfdXuy~CWP0y|{=Jr+>Lw}*Wur2RgR z_M%ieTkP`z6S;J^nCQbWCKp+{oAHo!cZNBPTq>JA^*PunUkrFG*P}Fy2b6VrVW&G8 z6{2giPYoKk5vaSMFwNJg2H@!G&-jx`uh1pB{LJ=EW_?zhdA~td>Dn{Ja`_xjb?Hews7B8-#4LWlE>?(+M+ppXSnIQxNQg<-Lp^*Hv(2OhnG536UJH z0AA3ZdC!-?Rc@nzrPq#MFZ=RgKT7x7_hHr`&-f?m{ipEpW|lI(f@4>vz)#*wo3nht zQ@#NGp$P&X{MViQ?jSsUXyn=$fia#NPxM?L8^9gZjocUmiYmp&Vx!n(2kr*K z7{3G!6@AMnbd0}MQ-h|R3KbP@%jK9Ryn&*QVi5%fCY!w=rEx_NX>s6@tc7tV*pVwO z!Q$O>4NGUjE9vqHKaVv28rVJlxYNrL)?u{M=hGX%N z*y-EtTQ@r*%Gr&65Izp}nCSHKydP$qb-H4hhMlM+kZAXZoPhb4;3sgNhS$&=debxv zLofgAe|wIhd%9~_y7!;amD4nAPn*{KMyrmzif=w&mdM< zP|z#dga+6tAJldDVS;>v`Iu`@wJ-D|ee+0{YnxeqKk3ITfm~8T=km_s(m=0s0|6q11R*U?F}vQvnZ zhKtIZATV5kp}Cr2Bm0}*TGt9~`P=5JY7CI}x8@FvmDWy{#pmY7sTj*l_{p5=T4EwuxZN85bB9+7C5$Ow_9DdR41hZfk%1!}L>P%4qvU{*Bp8x%=ErGvfY=w2D)SoZKNbO{I7wIlm?~J#QVerMu@>z00Goaw z1i%XeEAQB0KjK3I>&hVSU}8ZYGuFQm#L+&xPJm9zwqP9B1dRyDdSv^(_kVj4jO*}C zSIxqx0CbD(+!5TznGs6& z_>ZvjI*J=8)Oi;Vwftu&evaZ7D1L?F9Td|IU1{q4a1%Nn!cX9($<;jFGu7X!x6rgX z_O@2=*tR=>>mVH4I2H%q1|jX@z91bu)3I1^{O<*hSLfmys=UWrl{#A%$8~kxQWr0E j=fY!~nq;1D(tW2mEdCmgL;}BRXs+SvH;rcV(w+YTjp{T6 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/httpcore/_sync/__pycache__/socks_proxy.cpython-310.pyc b/.venv/lib/python3.10/site-packages/httpcore/_sync/__pycache__/socks_proxy.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..19ee10859fa8b8b51ca769f2ae97ce093a75af1a GIT binary patch literal 9982 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 typing.Iterator[float]: + """ + Generate a geometric sequence that has a ratio of 2 and starts with 0. + + For example: + - `factor = 2`: `0, 2, 4, 8, 16, 32, 64, ...` + - `factor = 3`: `0, 3, 6, 12, 24, 48, 96, ...` + """ + yield 0 + for n in itertools.count(): + yield factor * 2**n + + +class HTTPConnection(ConnectionInterface): + def __init__( + self, + origin: Origin, + ssl_context: ssl.SSLContext | None = None, + keepalive_expiry: float | None = None, + http1: bool = True, + http2: bool = False, + retries: int = 0, + local_address: str | None = None, + uds: str | None = None, + network_backend: NetworkBackend | None = None, + socket_options: typing.Iterable[SOCKET_OPTION] | None = None, + ) -> None: + self._origin = origin + self._ssl_context = ssl_context + self._keepalive_expiry = keepalive_expiry + self._http1 = http1 + self._http2 = http2 + self._retries = retries + self._local_address = local_address + self._uds = uds + + self._network_backend: NetworkBackend = ( + SyncBackend() if network_backend is None else network_backend + ) + self._connection: ConnectionInterface | None = None + self._connect_failed: bool = False + self._request_lock = Lock() + self._socket_options = socket_options + + def handle_request(self, request: Request) -> Response: + if not self.can_handle_request(request.url.origin): + raise RuntimeError( + f"Attempted to send request to {request.url.origin} on connection to {self._origin}" + ) + + try: + with self._request_lock: + if self._connection is None: + stream = self._connect(request) + + ssl_object = stream.get_extra_info("ssl_object") + http2_negotiated = ( + ssl_object is not None + and ssl_object.selected_alpn_protocol() == "h2" + ) + if http2_negotiated or (self._http2 and not self._http1): + from .http2 import HTTP2Connection + + self._connection = HTTP2Connection( + origin=self._origin, + stream=stream, + keepalive_expiry=self._keepalive_expiry, + ) + else: + self._connection = HTTP11Connection( + origin=self._origin, + stream=stream, + keepalive_expiry=self._keepalive_expiry, + ) + except BaseException as exc: + self._connect_failed = True + raise exc + + return self._connection.handle_request(request) + + def _connect(self, request: Request) -> NetworkStream: + timeouts = request.extensions.get("timeout", {}) + sni_hostname = request.extensions.get("sni_hostname", None) + timeout = timeouts.get("connect", None) + + retries_left = self._retries + delays = exponential_backoff(factor=RETRIES_BACKOFF_FACTOR) + + while True: + try: + if self._uds is None: + kwargs = { + "host": self._origin.host.decode("ascii"), + "port": self._origin.port, + "local_address": self._local_address, + "timeout": timeout, + "socket_options": self._socket_options, + } + with Trace("connect_tcp", logger, request, kwargs) as trace: + stream = self._network_backend.connect_tcp(**kwargs) + trace.return_value = stream + else: + kwargs = { + "path": self._uds, + "timeout": timeout, + "socket_options": self._socket_options, + } + with Trace( + "connect_unix_socket", logger, request, kwargs + ) as trace: + stream = self._network_backend.connect_unix_socket( + **kwargs + ) + trace.return_value = stream + + if self._origin.scheme in (b"https", b"wss"): + ssl_context = ( + default_ssl_context() + if self._ssl_context is None + else self._ssl_context + ) + alpn_protocols = ["http/1.1", "h2"] if self._http2 else ["http/1.1"] + ssl_context.set_alpn_protocols(alpn_protocols) + + kwargs = { + "ssl_context": ssl_context, + "server_hostname": sni_hostname + or self._origin.host.decode("ascii"), + "timeout": timeout, + } + with Trace("start_tls", logger, request, kwargs) as trace: + stream = stream.start_tls(**kwargs) + trace.return_value = stream + return stream + except (ConnectError, ConnectTimeout): + if retries_left <= 0: + raise + retries_left -= 1 + delay = next(delays) + with Trace("retry", logger, request, kwargs) as trace: + self._network_backend.sleep(delay) + + def can_handle_request(self, origin: Origin) -> bool: + return origin == self._origin + + def close(self) -> None: + if self._connection is not None: + with Trace("close", logger, None, {}): + self._connection.close() + + def is_available(self) -> bool: + if self._connection is None: + # If HTTP/2 support is enabled, and the resulting connection could + # end up as HTTP/2 then we should indicate the connection as being + # available to service multiple requests. + return ( + self._http2 + and (self._origin.scheme == b"https" or not self._http1) + and not self._connect_failed + ) + return self._connection.is_available() + + def has_expired(self) -> bool: + if self._connection is None: + return self._connect_failed + return self._connection.has_expired() + + def is_idle(self) -> bool: + if self._connection is None: + return self._connect_failed + return self._connection.is_idle() + + def is_closed(self) -> bool: + if self._connection is None: + return self._connect_failed + return self._connection.is_closed() + + def info(self) -> str: + if self._connection is None: + return "CONNECTION FAILED" if self._connect_failed else "CONNECTING" + return self._connection.info() + + def __repr__(self) -> str: + return f"<{self.__class__.__name__} [{self.info()}]>" + + # These context managers are not used in the standard flow, but are + # useful for testing or working with connection instances directly. + + def __enter__(self) -> HTTPConnection: + return self + + def __exit__( + self, + exc_type: type[BaseException] | None = None, + exc_value: BaseException | None = None, + traceback: types.TracebackType | None = None, + ) -> None: + self.close() diff --git a/.venv/lib/python3.10/site-packages/httpcore/_sync/connection_pool.py b/.venv/lib/python3.10/site-packages/httpcore/_sync/connection_pool.py new file mode 100644 index 0000000..9ccfa53 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpcore/_sync/connection_pool.py @@ -0,0 +1,420 @@ +from __future__ import annotations + +import ssl +import sys +import types +import typing + +from .._backends.sync import SyncBackend +from .._backends.base import SOCKET_OPTION, NetworkBackend +from .._exceptions import ConnectionNotAvailable, UnsupportedProtocol +from .._models import Origin, Proxy, Request, Response +from .._synchronization import Event, ShieldCancellation, ThreadLock +from .connection import HTTPConnection +from .interfaces import ConnectionInterface, RequestInterface + + +class PoolRequest: + def __init__(self, request: Request) -> None: + self.request = request + self.connection: ConnectionInterface | None = None + self._connection_acquired = Event() + + def assign_to_connection(self, connection: ConnectionInterface | None) -> None: + self.connection = connection + self._connection_acquired.set() + + def clear_connection(self) -> None: + self.connection = None + self._connection_acquired = Event() + + def wait_for_connection( + self, timeout: float | None = None + ) -> ConnectionInterface: + if self.connection is None: + self._connection_acquired.wait(timeout=timeout) + assert self.connection is not None + return self.connection + + def is_queued(self) -> bool: + return self.connection is None + + +class ConnectionPool(RequestInterface): + """ + A connection pool for making HTTP requests. + """ + + def __init__( + self, + ssl_context: ssl.SSLContext | None = None, + proxy: Proxy | None = None, + max_connections: int | None = 10, + max_keepalive_connections: int | None = None, + keepalive_expiry: float | None = None, + http1: bool = True, + http2: bool = False, + retries: int = 0, + local_address: str | None = None, + uds: str | None = None, + network_backend: NetworkBackend | None = None, + socket_options: typing.Iterable[SOCKET_OPTION] | None = None, + ) -> None: + """ + A connection pool for making HTTP requests. + + Parameters: + ssl_context: An SSL context to use for verifying connections. + If not specified, the default `httpcore.default_ssl_context()` + will be used. + max_connections: The maximum number of concurrent HTTP connections that + the pool should allow. Any attempt to send a request on a pool that + would exceed this amount will block until a connection is available. + max_keepalive_connections: The maximum number of idle HTTP connections + that will be maintained in the pool. + keepalive_expiry: The duration in seconds that an idle HTTP connection + may be maintained for before being expired from the pool. + http1: A boolean indicating if HTTP/1.1 requests should be supported + by the connection pool. Defaults to True. + http2: A boolean indicating if HTTP/2 requests should be supported by + the connection pool. Defaults to False. + retries: The maximum number of retries when trying to establish a + connection. + local_address: Local address to connect from. Can also be used to connect + using a particular address family. Using `local_address="0.0.0.0"` + will connect using an `AF_INET` address (IPv4), while using + `local_address="::"` will connect using an `AF_INET6` address (IPv6). + uds: Path to a Unix Domain Socket to use instead of TCP sockets. + network_backend: A backend instance to use for handling network I/O. + socket_options: Socket options that have to be included + in the TCP socket when the connection was established. + """ + self._ssl_context = ssl_context + self._proxy = proxy + self._max_connections = ( + sys.maxsize if max_connections is None else max_connections + ) + self._max_keepalive_connections = ( + sys.maxsize + if max_keepalive_connections is None + else max_keepalive_connections + ) + self._max_keepalive_connections = min( + self._max_connections, self._max_keepalive_connections + ) + + self._keepalive_expiry = keepalive_expiry + self._http1 = http1 + self._http2 = http2 + self._retries = retries + self._local_address = local_address + self._uds = uds + + self._network_backend = ( + SyncBackend() if network_backend is None else network_backend + ) + self._socket_options = socket_options + + # The mutable state on a connection pool is the queue of incoming requests, + # and the set of connections that are servicing those requests. + self._connections: list[ConnectionInterface] = [] + self._requests: list[PoolRequest] = [] + + # We only mutate the state of the connection pool within an 'optional_thread_lock' + # context. This holds a threading lock unless we're running in async mode, + # in which case it is a no-op. + self._optional_thread_lock = ThreadLock() + + def create_connection(self, origin: Origin) -> ConnectionInterface: + if self._proxy is not None: + if self._proxy.url.scheme in (b"socks5", b"socks5h"): + from .socks_proxy import Socks5Connection + + return Socks5Connection( + proxy_origin=self._proxy.url.origin, + proxy_auth=self._proxy.auth, + remote_origin=origin, + ssl_context=self._ssl_context, + keepalive_expiry=self._keepalive_expiry, + http1=self._http1, + http2=self._http2, + network_backend=self._network_backend, + ) + elif origin.scheme == b"http": + from .http_proxy import ForwardHTTPConnection + + return ForwardHTTPConnection( + proxy_origin=self._proxy.url.origin, + proxy_headers=self._proxy.headers, + proxy_ssl_context=self._proxy.ssl_context, + remote_origin=origin, + keepalive_expiry=self._keepalive_expiry, + network_backend=self._network_backend, + ) + from .http_proxy import TunnelHTTPConnection + + return TunnelHTTPConnection( + proxy_origin=self._proxy.url.origin, + proxy_headers=self._proxy.headers, + proxy_ssl_context=self._proxy.ssl_context, + remote_origin=origin, + ssl_context=self._ssl_context, + keepalive_expiry=self._keepalive_expiry, + http1=self._http1, + http2=self._http2, + network_backend=self._network_backend, + ) + + return HTTPConnection( + origin=origin, + ssl_context=self._ssl_context, + keepalive_expiry=self._keepalive_expiry, + http1=self._http1, + http2=self._http2, + retries=self._retries, + local_address=self._local_address, + uds=self._uds, + network_backend=self._network_backend, + socket_options=self._socket_options, + ) + + @property + def connections(self) -> list[ConnectionInterface]: + """ + Return a list of the connections currently in the pool. + + For example: + + ```python + >>> pool.connections + [ + , + , + , + ] + ``` + """ + return list(self._connections) + + def handle_request(self, request: Request) -> Response: + """ + Send an HTTP request, and return an HTTP response. + + This is the core implementation that is called into by `.request()` or `.stream()`. + """ + scheme = request.url.scheme.decode() + if scheme == "": + raise UnsupportedProtocol( + "Request URL is missing an 'http://' or 'https://' protocol." + ) + if scheme not in ("http", "https", "ws", "wss"): + raise UnsupportedProtocol( + f"Request URL has an unsupported protocol '{scheme}://'." + ) + + timeouts = request.extensions.get("timeout", {}) + timeout = timeouts.get("pool", None) + + with self._optional_thread_lock: + # Add the incoming request to our request queue. + pool_request = PoolRequest(request) + self._requests.append(pool_request) + + try: + while True: + with self._optional_thread_lock: + # Assign incoming requests to available connections, + # closing or creating new connections as required. + closing = self._assign_requests_to_connections() + self._close_connections(closing) + + # Wait until this request has an assigned connection. + connection = pool_request.wait_for_connection(timeout=timeout) + + try: + # Send the request on the assigned connection. + response = connection.handle_request( + pool_request.request + ) + except ConnectionNotAvailable: + # In some cases a connection may initially be available to + # handle a request, but then become unavailable. + # + # In this case we clear the connection and try again. + pool_request.clear_connection() + else: + break # pragma: nocover + + except BaseException as exc: + with self._optional_thread_lock: + # For any exception or cancellation we remove the request from + # the queue, and then re-assign requests to connections. + self._requests.remove(pool_request) + closing = self._assign_requests_to_connections() + + self._close_connections(closing) + raise exc from None + + # Return the response. Note that in this case we still have to manage + # the point at which the response is closed. + assert isinstance(response.stream, typing.Iterable) + return Response( + status=response.status, + headers=response.headers, + content=PoolByteStream( + stream=response.stream, pool_request=pool_request, pool=self + ), + extensions=response.extensions, + ) + + def _assign_requests_to_connections(self) -> list[ConnectionInterface]: + """ + Manage the state of the connection pool, assigning incoming + requests to connections as available. + + Called whenever a new request is added or removed from the pool. + + Any closing connections are returned, allowing the I/O for closing + those connections to be handled seperately. + """ + closing_connections = [] + + # First we handle cleaning up any connections that are closed, + # have expired their keep-alive, or surplus idle connections. + for connection in list(self._connections): + if connection.is_closed(): + # log: "removing closed connection" + self._connections.remove(connection) + elif connection.has_expired(): + # log: "closing expired connection" + self._connections.remove(connection) + closing_connections.append(connection) + elif ( + connection.is_idle() + and len([connection.is_idle() for connection in self._connections]) + > self._max_keepalive_connections + ): + # log: "closing idle connection" + self._connections.remove(connection) + closing_connections.append(connection) + + # Assign queued requests to connections. + queued_requests = [request for request in self._requests if request.is_queued()] + for pool_request in queued_requests: + origin = pool_request.request.url.origin + available_connections = [ + connection + for connection in self._connections + if connection.can_handle_request(origin) and connection.is_available() + ] + idle_connections = [ + connection for connection in self._connections if connection.is_idle() + ] + + # There are three cases for how we may be able to handle the request: + # + # 1. There is an existing connection that can handle the request. + # 2. We can create a new connection to handle the request. + # 3. We can close an idle connection and then create a new connection + # to handle the request. + if available_connections: + # log: "reusing existing connection" + connection = available_connections[0] + pool_request.assign_to_connection(connection) + elif len(self._connections) < self._max_connections: + # log: "creating new connection" + connection = self.create_connection(origin) + self._connections.append(connection) + pool_request.assign_to_connection(connection) + elif idle_connections: + # log: "closing idle connection" + connection = idle_connections[0] + self._connections.remove(connection) + closing_connections.append(connection) + # log: "creating new connection" + connection = self.create_connection(origin) + self._connections.append(connection) + pool_request.assign_to_connection(connection) + + return closing_connections + + def _close_connections(self, closing: list[ConnectionInterface]) -> None: + # Close connections which have been removed from the pool. + with ShieldCancellation(): + for connection in closing: + connection.close() + + def close(self) -> None: + # Explicitly close the connection pool. + # Clears all existing requests and connections. + with self._optional_thread_lock: + closing_connections = list(self._connections) + self._connections = [] + self._close_connections(closing_connections) + + def __enter__(self) -> ConnectionPool: + return self + + def __exit__( + self, + exc_type: type[BaseException] | None = None, + exc_value: BaseException | None = None, + traceback: types.TracebackType | None = None, + ) -> None: + self.close() + + def __repr__(self) -> str: + class_name = self.__class__.__name__ + with self._optional_thread_lock: + request_is_queued = [request.is_queued() for request in self._requests] + connection_is_idle = [ + connection.is_idle() for connection in self._connections + ] + + num_active_requests = request_is_queued.count(False) + num_queued_requests = request_is_queued.count(True) + num_active_connections = connection_is_idle.count(False) + num_idle_connections = connection_is_idle.count(True) + + requests_info = ( + f"Requests: {num_active_requests} active, {num_queued_requests} queued" + ) + connection_info = ( + f"Connections: {num_active_connections} active, {num_idle_connections} idle" + ) + + return f"<{class_name} [{requests_info} | {connection_info}]>" + + +class PoolByteStream: + def __init__( + self, + stream: typing.Iterable[bytes], + pool_request: PoolRequest, + pool: ConnectionPool, + ) -> None: + self._stream = stream + self._pool_request = pool_request + self._pool = pool + self._closed = False + + def __iter__(self) -> typing.Iterator[bytes]: + try: + for part in self._stream: + yield part + except BaseException as exc: + self.close() + raise exc from None + + def close(self) -> None: + if not self._closed: + self._closed = True + with ShieldCancellation(): + if hasattr(self._stream, "close"): + self._stream.close() + + with self._pool._optional_thread_lock: + self._pool._requests.remove(self._pool_request) + closing = self._pool._assign_requests_to_connections() + + self._pool._close_connections(closing) diff --git a/.venv/lib/python3.10/site-packages/httpcore/_sync/http11.py b/.venv/lib/python3.10/site-packages/httpcore/_sync/http11.py new file mode 100644 index 0000000..ebd3a97 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpcore/_sync/http11.py @@ -0,0 +1,379 @@ +from __future__ import annotations + +import enum +import logging +import ssl +import time +import types +import typing + +import h11 + +from .._backends.base import NetworkStream +from .._exceptions import ( + ConnectionNotAvailable, + LocalProtocolError, + RemoteProtocolError, + WriteError, + map_exceptions, +) +from .._models import Origin, Request, Response +from .._synchronization import Lock, ShieldCancellation +from .._trace import Trace +from .interfaces import ConnectionInterface + +logger = logging.getLogger("httpcore.http11") + + +# A subset of `h11.Event` types supported by `_send_event` +H11SendEvent = typing.Union[ + h11.Request, + h11.Data, + h11.EndOfMessage, +] + + +class HTTPConnectionState(enum.IntEnum): + NEW = 0 + ACTIVE = 1 + IDLE = 2 + CLOSED = 3 + + +class HTTP11Connection(ConnectionInterface): + READ_NUM_BYTES = 64 * 1024 + MAX_INCOMPLETE_EVENT_SIZE = 100 * 1024 + + def __init__( + self, + origin: Origin, + stream: NetworkStream, + keepalive_expiry: float | None = None, + ) -> None: + self._origin = origin + self._network_stream = stream + self._keepalive_expiry: float | None = keepalive_expiry + self._expire_at: float | None = None + self._state = HTTPConnectionState.NEW + self._state_lock = Lock() + self._request_count = 0 + self._h11_state = h11.Connection( + our_role=h11.CLIENT, + max_incomplete_event_size=self.MAX_INCOMPLETE_EVENT_SIZE, + ) + + def handle_request(self, request: Request) -> Response: + if not self.can_handle_request(request.url.origin): + raise RuntimeError( + f"Attempted to send request to {request.url.origin} on connection " + f"to {self._origin}" + ) + + with self._state_lock: + if self._state in (HTTPConnectionState.NEW, HTTPConnectionState.IDLE): + self._request_count += 1 + self._state = HTTPConnectionState.ACTIVE + self._expire_at = None + else: + raise ConnectionNotAvailable() + + try: + kwargs = {"request": request} + try: + with Trace( + "send_request_headers", logger, request, kwargs + ) as trace: + self._send_request_headers(**kwargs) + with Trace("send_request_body", logger, request, kwargs) as trace: + self._send_request_body(**kwargs) + except WriteError: + # If we get a write error while we're writing the request, + # then we supress this error and move on to attempting to + # read the response. Servers can sometimes close the request + # pre-emptively and then respond with a well formed HTTP + # error response. + pass + + with Trace( + "receive_response_headers", logger, request, kwargs + ) as trace: + ( + http_version, + status, + reason_phrase, + headers, + trailing_data, + ) = self._receive_response_headers(**kwargs) + trace.return_value = ( + http_version, + status, + reason_phrase, + headers, + ) + + network_stream = self._network_stream + + # CONNECT or Upgrade request + if (status == 101) or ( + (request.method == b"CONNECT") and (200 <= status < 300) + ): + network_stream = HTTP11UpgradeStream(network_stream, trailing_data) + + return Response( + status=status, + headers=headers, + content=HTTP11ConnectionByteStream(self, request), + extensions={ + "http_version": http_version, + "reason_phrase": reason_phrase, + "network_stream": network_stream, + }, + ) + except BaseException as exc: + with ShieldCancellation(): + with Trace("response_closed", logger, request) as trace: + self._response_closed() + raise exc + + # Sending the request... + + def _send_request_headers(self, request: Request) -> None: + timeouts = request.extensions.get("timeout", {}) + timeout = timeouts.get("write", None) + + with map_exceptions({h11.LocalProtocolError: LocalProtocolError}): + event = h11.Request( + method=request.method, + target=request.url.target, + headers=request.headers, + ) + self._send_event(event, timeout=timeout) + + def _send_request_body(self, request: Request) -> None: + timeouts = request.extensions.get("timeout", {}) + timeout = timeouts.get("write", None) + + assert isinstance(request.stream, typing.Iterable) + for chunk in request.stream: + event = h11.Data(data=chunk) + self._send_event(event, timeout=timeout) + + self._send_event(h11.EndOfMessage(), timeout=timeout) + + def _send_event(self, event: h11.Event, timeout: float | None = None) -> None: + bytes_to_send = self._h11_state.send(event) + if bytes_to_send is not None: + self._network_stream.write(bytes_to_send, timeout=timeout) + + # Receiving the response... + + def _receive_response_headers( + self, request: Request + ) -> tuple[bytes, int, bytes, list[tuple[bytes, bytes]], bytes]: + timeouts = request.extensions.get("timeout", {}) + timeout = timeouts.get("read", None) + + while True: + event = self._receive_event(timeout=timeout) + if isinstance(event, h11.Response): + break + if ( + isinstance(event, h11.InformationalResponse) + and event.status_code == 101 + ): + break + + http_version = b"HTTP/" + event.http_version + + # h11 version 0.11+ supports a `raw_items` interface to get the + # raw header casing, rather than the enforced lowercase headers. + headers = event.headers.raw_items() + + trailing_data, _ = self._h11_state.trailing_data + + return http_version, event.status_code, event.reason, headers, trailing_data + + def _receive_response_body( + self, request: Request + ) -> typing.Iterator[bytes]: + timeouts = request.extensions.get("timeout", {}) + timeout = timeouts.get("read", None) + + while True: + event = self._receive_event(timeout=timeout) + if isinstance(event, h11.Data): + yield bytes(event.data) + elif isinstance(event, (h11.EndOfMessage, h11.PAUSED)): + break + + def _receive_event( + self, timeout: float | None = None + ) -> h11.Event | type[h11.PAUSED]: + while True: + with map_exceptions({h11.RemoteProtocolError: RemoteProtocolError}): + event = self._h11_state.next_event() + + if event is h11.NEED_DATA: + data = self._network_stream.read( + self.READ_NUM_BYTES, timeout=timeout + ) + + # If we feed this case through h11 we'll raise an exception like: + # + # httpcore.RemoteProtocolError: can't handle event type + # ConnectionClosed when role=SERVER and state=SEND_RESPONSE + # + # Which is accurate, but not very informative from an end-user + # perspective. Instead we handle this case distinctly and treat + # it as a ConnectError. + if data == b"" and self._h11_state.their_state == h11.SEND_RESPONSE: + msg = "Server disconnected without sending a response." + raise RemoteProtocolError(msg) + + self._h11_state.receive_data(data) + else: + # mypy fails to narrow the type in the above if statement above + return event # type: ignore[return-value] + + def _response_closed(self) -> None: + with self._state_lock: + if ( + self._h11_state.our_state is h11.DONE + and self._h11_state.their_state is h11.DONE + ): + self._state = HTTPConnectionState.IDLE + self._h11_state.start_next_cycle() + if self._keepalive_expiry is not None: + now = time.monotonic() + self._expire_at = now + self._keepalive_expiry + else: + self.close() + + # Once the connection is no longer required... + + def close(self) -> None: + # Note that this method unilaterally closes the connection, and does + # not have any kind of locking in place around it. + self._state = HTTPConnectionState.CLOSED + self._network_stream.close() + + # The ConnectionInterface methods provide information about the state of + # the connection, allowing for a connection pooling implementation to + # determine when to reuse and when to close the connection... + + def can_handle_request(self, origin: Origin) -> bool: + return origin == self._origin + + def is_available(self) -> bool: + # Note that HTTP/1.1 connections in the "NEW" state are not treated as + # being "available". The control flow which created the connection will + # be able to send an outgoing request, but the connection will not be + # acquired from the connection pool for any other request. + return self._state == HTTPConnectionState.IDLE + + def has_expired(self) -> bool: + now = time.monotonic() + keepalive_expired = self._expire_at is not None and now > self._expire_at + + # If the HTTP connection is idle but the socket is readable, then the + # only valid state is that the socket is about to return b"", indicating + # a server-initiated disconnect. + server_disconnected = ( + self._state == HTTPConnectionState.IDLE + and self._network_stream.get_extra_info("is_readable") + ) + + return keepalive_expired or server_disconnected + + def is_idle(self) -> bool: + return self._state == HTTPConnectionState.IDLE + + def is_closed(self) -> bool: + return self._state == HTTPConnectionState.CLOSED + + def info(self) -> str: + origin = str(self._origin) + return ( + f"{origin!r}, HTTP/1.1, {self._state.name}, " + f"Request Count: {self._request_count}" + ) + + def __repr__(self) -> str: + class_name = self.__class__.__name__ + origin = str(self._origin) + return ( + f"<{class_name} [{origin!r}, {self._state.name}, " + f"Request Count: {self._request_count}]>" + ) + + # These context managers are not used in the standard flow, but are + # useful for testing or working with connection instances directly. + + def __enter__(self) -> HTTP11Connection: + return self + + def __exit__( + self, + exc_type: type[BaseException] | None = None, + exc_value: BaseException | None = None, + traceback: types.TracebackType | None = None, + ) -> None: + self.close() + + +class HTTP11ConnectionByteStream: + def __init__(self, connection: HTTP11Connection, request: Request) -> None: + self._connection = connection + self._request = request + self._closed = False + + def __iter__(self) -> typing.Iterator[bytes]: + kwargs = {"request": self._request} + try: + with Trace("receive_response_body", logger, self._request, kwargs): + for chunk in self._connection._receive_response_body(**kwargs): + yield chunk + except BaseException as exc: + # If we get an exception while streaming the response, + # we want to close the response (and possibly the connection) + # before raising that exception. + with ShieldCancellation(): + self.close() + raise exc + + def close(self) -> None: + if not self._closed: + self._closed = True + with Trace("response_closed", logger, self._request): + self._connection._response_closed() + + +class HTTP11UpgradeStream(NetworkStream): + def __init__(self, stream: NetworkStream, leading_data: bytes) -> None: + self._stream = stream + self._leading_data = leading_data + + def read(self, max_bytes: int, timeout: float | None = None) -> bytes: + if self._leading_data: + buffer = self._leading_data[:max_bytes] + self._leading_data = self._leading_data[max_bytes:] + return buffer + else: + return self._stream.read(max_bytes, timeout) + + def write(self, buffer: bytes, timeout: float | None = None) -> None: + self._stream.write(buffer, timeout) + + def close(self) -> None: + self._stream.close() + + def start_tls( + self, + ssl_context: ssl.SSLContext, + server_hostname: str | None = None, + timeout: float | None = None, + ) -> NetworkStream: + return self._stream.start_tls(ssl_context, server_hostname, timeout) + + def get_extra_info(self, info: str) -> typing.Any: + return self._stream.get_extra_info(info) diff --git a/.venv/lib/python3.10/site-packages/httpcore/_sync/http2.py b/.venv/lib/python3.10/site-packages/httpcore/_sync/http2.py new file mode 100644 index 0000000..ddcc189 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpcore/_sync/http2.py @@ -0,0 +1,592 @@ +from __future__ import annotations + +import enum +import logging +import time +import types +import typing + +import h2.config +import h2.connection +import h2.events +import h2.exceptions +import h2.settings + +from .._backends.base import NetworkStream +from .._exceptions import ( + ConnectionNotAvailable, + LocalProtocolError, + RemoteProtocolError, +) +from .._models import Origin, Request, Response +from .._synchronization import Lock, Semaphore, ShieldCancellation +from .._trace import Trace +from .interfaces import ConnectionInterface + +logger = logging.getLogger("httpcore.http2") + + +def has_body_headers(request: Request) -> bool: + return any( + k.lower() == b"content-length" or k.lower() == b"transfer-encoding" + for k, v in request.headers + ) + + +class HTTPConnectionState(enum.IntEnum): + ACTIVE = 1 + IDLE = 2 + CLOSED = 3 + + +class HTTP2Connection(ConnectionInterface): + READ_NUM_BYTES = 64 * 1024 + CONFIG = h2.config.H2Configuration(validate_inbound_headers=False) + + def __init__( + self, + origin: Origin, + stream: NetworkStream, + keepalive_expiry: float | None = None, + ): + self._origin = origin + self._network_stream = stream + self._keepalive_expiry: float | None = keepalive_expiry + self._h2_state = h2.connection.H2Connection(config=self.CONFIG) + self._state = HTTPConnectionState.IDLE + self._expire_at: float | None = None + self._request_count = 0 + self._init_lock = Lock() + self._state_lock = Lock() + self._read_lock = Lock() + self._write_lock = Lock() + self._sent_connection_init = False + self._used_all_stream_ids = False + self._connection_error = False + + # Mapping from stream ID to response stream events. + self._events: dict[ + int, + list[ + h2.events.ResponseReceived + | h2.events.DataReceived + | h2.events.StreamEnded + | h2.events.StreamReset, + ], + ] = {} + + # Connection terminated events are stored as state since + # we need to handle them for all streams. + self._connection_terminated: h2.events.ConnectionTerminated | None = None + + self._read_exception: Exception | None = None + self._write_exception: Exception | None = None + + def handle_request(self, request: Request) -> Response: + if not self.can_handle_request(request.url.origin): + # This cannot occur in normal operation, since the connection pool + # will only send requests on connections that handle them. + # It's in place simply for resilience as a guard against incorrect + # usage, for anyone working directly with httpcore connections. + raise RuntimeError( + f"Attempted to send request to {request.url.origin} on connection " + f"to {self._origin}" + ) + + with self._state_lock: + if self._state in (HTTPConnectionState.ACTIVE, HTTPConnectionState.IDLE): + self._request_count += 1 + self._expire_at = None + self._state = HTTPConnectionState.ACTIVE + else: + raise ConnectionNotAvailable() + + with self._init_lock: + if not self._sent_connection_init: + try: + sci_kwargs = {"request": request} + with Trace( + "send_connection_init", logger, request, sci_kwargs + ): + self._send_connection_init(**sci_kwargs) + except BaseException as exc: + with ShieldCancellation(): + self.close() + raise exc + + self._sent_connection_init = True + + # Initially start with just 1 until the remote server provides + # its max_concurrent_streams value + self._max_streams = 1 + + local_settings_max_streams = ( + self._h2_state.local_settings.max_concurrent_streams + ) + self._max_streams_semaphore = Semaphore(local_settings_max_streams) + + for _ in range(local_settings_max_streams - self._max_streams): + self._max_streams_semaphore.acquire() + + self._max_streams_semaphore.acquire() + + try: + stream_id = self._h2_state.get_next_available_stream_id() + self._events[stream_id] = [] + except h2.exceptions.NoAvailableStreamIDError: # pragma: nocover + self._used_all_stream_ids = True + self._request_count -= 1 + raise ConnectionNotAvailable() + + try: + kwargs = {"request": request, "stream_id": stream_id} + with Trace("send_request_headers", logger, request, kwargs): + self._send_request_headers(request=request, stream_id=stream_id) + with Trace("send_request_body", logger, request, kwargs): + self._send_request_body(request=request, stream_id=stream_id) + with Trace( + "receive_response_headers", logger, request, kwargs + ) as trace: + status, headers = self._receive_response( + request=request, stream_id=stream_id + ) + trace.return_value = (status, headers) + + return Response( + status=status, + headers=headers, + content=HTTP2ConnectionByteStream(self, request, stream_id=stream_id), + extensions={ + "http_version": b"HTTP/2", + "network_stream": self._network_stream, + "stream_id": stream_id, + }, + ) + except BaseException as exc: # noqa: PIE786 + with ShieldCancellation(): + kwargs = {"stream_id": stream_id} + with Trace("response_closed", logger, request, kwargs): + self._response_closed(stream_id=stream_id) + + if isinstance(exc, h2.exceptions.ProtocolError): + # One case where h2 can raise a protocol error is when a + # closed frame has been seen by the state machine. + # + # This happens when one stream is reading, and encounters + # a GOAWAY event. Other flows of control may then raise + # a protocol error at any point they interact with the 'h2_state'. + # + # In this case we'll have stored the event, and should raise + # it as a RemoteProtocolError. + if self._connection_terminated: # pragma: nocover + raise RemoteProtocolError(self._connection_terminated) + # If h2 raises a protocol error in some other state then we + # must somehow have made a protocol violation. + raise LocalProtocolError(exc) # pragma: nocover + + raise exc + + def _send_connection_init(self, request: Request) -> None: + """ + The HTTP/2 connection requires some initial setup before we can start + using individual request/response streams on it. + """ + # Need to set these manually here instead of manipulating via + # __setitem__() otherwise the H2Connection will emit SettingsUpdate + # frames in addition to sending the undesired defaults. + self._h2_state.local_settings = h2.settings.Settings( + client=True, + initial_values={ + # Disable PUSH_PROMISE frames from the server since we don't do anything + # with them for now. Maybe when we support caching? + h2.settings.SettingCodes.ENABLE_PUSH: 0, + # These two are taken from h2 for safe defaults + h2.settings.SettingCodes.MAX_CONCURRENT_STREAMS: 100, + h2.settings.SettingCodes.MAX_HEADER_LIST_SIZE: 65536, + }, + ) + + # Some websites (*cough* Yahoo *cough*) balk at this setting being + # present in the initial handshake since it's not defined in the original + # RFC despite the RFC mandating ignoring settings you don't know about. + del self._h2_state.local_settings[ + h2.settings.SettingCodes.ENABLE_CONNECT_PROTOCOL + ] + + self._h2_state.initiate_connection() + self._h2_state.increment_flow_control_window(2**24) + self._write_outgoing_data(request) + + # Sending the request... + + def _send_request_headers(self, request: Request, stream_id: int) -> None: + """ + Send the request headers to a given stream ID. + """ + end_stream = not has_body_headers(request) + + # In HTTP/2 the ':authority' pseudo-header is used instead of 'Host'. + # In order to gracefully handle HTTP/1.1 and HTTP/2 we always require + # HTTP/1.1 style headers, and map them appropriately if we end up on + # an HTTP/2 connection. + authority = [v for k, v in request.headers if k.lower() == b"host"][0] + + headers = [ + (b":method", request.method), + (b":authority", authority), + (b":scheme", request.url.scheme), + (b":path", request.url.target), + ] + [ + (k.lower(), v) + for k, v in request.headers + if k.lower() + not in ( + b"host", + b"transfer-encoding", + ) + ] + + self._h2_state.send_headers(stream_id, headers, end_stream=end_stream) + self._h2_state.increment_flow_control_window(2**24, stream_id=stream_id) + self._write_outgoing_data(request) + + def _send_request_body(self, request: Request, stream_id: int) -> None: + """ + Iterate over the request body sending it to a given stream ID. + """ + if not has_body_headers(request): + return + + assert isinstance(request.stream, typing.Iterable) + for data in request.stream: + self._send_stream_data(request, stream_id, data) + self._send_end_stream(request, stream_id) + + def _send_stream_data( + self, request: Request, stream_id: int, data: bytes + ) -> None: + """ + Send a single chunk of data in one or more data frames. + """ + while data: + max_flow = self._wait_for_outgoing_flow(request, stream_id) + chunk_size = min(len(data), max_flow) + chunk, data = data[:chunk_size], data[chunk_size:] + self._h2_state.send_data(stream_id, chunk) + self._write_outgoing_data(request) + + def _send_end_stream(self, request: Request, stream_id: int) -> None: + """ + Send an empty data frame on on a given stream ID with the END_STREAM flag set. + """ + self._h2_state.end_stream(stream_id) + self._write_outgoing_data(request) + + # Receiving the response... + + def _receive_response( + self, request: Request, stream_id: int + ) -> tuple[int, list[tuple[bytes, bytes]]]: + """ + Return the response status code and headers for a given stream ID. + """ + while True: + event = self._receive_stream_event(request, stream_id) + if isinstance(event, h2.events.ResponseReceived): + break + + status_code = 200 + headers = [] + assert event.headers is not None + for k, v in event.headers: + if k == b":status": + status_code = int(v.decode("ascii", errors="ignore")) + elif not k.startswith(b":"): + headers.append((k, v)) + + return (status_code, headers) + + def _receive_response_body( + self, request: Request, stream_id: int + ) -> typing.Iterator[bytes]: + """ + Iterator that returns the bytes of the response body for a given stream ID. + """ + while True: + event = self._receive_stream_event(request, stream_id) + if isinstance(event, h2.events.DataReceived): + assert event.flow_controlled_length is not None + assert event.data is not None + amount = event.flow_controlled_length + self._h2_state.acknowledge_received_data(amount, stream_id) + self._write_outgoing_data(request) + yield event.data + elif isinstance(event, h2.events.StreamEnded): + break + + def _receive_stream_event( + self, request: Request, stream_id: int + ) -> h2.events.ResponseReceived | h2.events.DataReceived | h2.events.StreamEnded: + """ + Return the next available event for a given stream ID. + + Will read more data from the network if required. + """ + while not self._events.get(stream_id): + self._receive_events(request, stream_id) + event = self._events[stream_id].pop(0) + if isinstance(event, h2.events.StreamReset): + raise RemoteProtocolError(event) + return event + + def _receive_events( + self, request: Request, stream_id: int | None = None + ) -> None: + """ + Read some data from the network until we see one or more events + for a given stream ID. + """ + with self._read_lock: + if self._connection_terminated is not None: + last_stream_id = self._connection_terminated.last_stream_id + if stream_id and last_stream_id and stream_id > last_stream_id: + self._request_count -= 1 + raise ConnectionNotAvailable() + raise RemoteProtocolError(self._connection_terminated) + + # This conditional is a bit icky. We don't want to block reading if we've + # actually got an event to return for a given stream. We need to do that + # check *within* the atomic read lock. Though it also need to be optional, + # because when we call it from `_wait_for_outgoing_flow` we *do* want to + # block until we've available flow control, event when we have events + # pending for the stream ID we're attempting to send on. + if stream_id is None or not self._events.get(stream_id): + events = self._read_incoming_data(request) + for event in events: + if isinstance(event, h2.events.RemoteSettingsChanged): + with Trace( + "receive_remote_settings", logger, request + ) as trace: + self._receive_remote_settings_change(event) + trace.return_value = event + + elif isinstance( + event, + ( + h2.events.ResponseReceived, + h2.events.DataReceived, + h2.events.StreamEnded, + h2.events.StreamReset, + ), + ): + if event.stream_id in self._events: + self._events[event.stream_id].append(event) + + elif isinstance(event, h2.events.ConnectionTerminated): + self._connection_terminated = event + + self._write_outgoing_data(request) + + def _receive_remote_settings_change( + self, event: h2.events.RemoteSettingsChanged + ) -> None: + max_concurrent_streams = event.changed_settings.get( + h2.settings.SettingCodes.MAX_CONCURRENT_STREAMS + ) + if max_concurrent_streams: + new_max_streams = min( + max_concurrent_streams.new_value, + self._h2_state.local_settings.max_concurrent_streams, + ) + if new_max_streams and new_max_streams != self._max_streams: + while new_max_streams > self._max_streams: + self._max_streams_semaphore.release() + self._max_streams += 1 + while new_max_streams < self._max_streams: + self._max_streams_semaphore.acquire() + self._max_streams -= 1 + + def _response_closed(self, stream_id: int) -> None: + self._max_streams_semaphore.release() + del self._events[stream_id] + with self._state_lock: + if self._connection_terminated and not self._events: + self.close() + + elif self._state == HTTPConnectionState.ACTIVE and not self._events: + self._state = HTTPConnectionState.IDLE + if self._keepalive_expiry is not None: + now = time.monotonic() + self._expire_at = now + self._keepalive_expiry + if self._used_all_stream_ids: # pragma: nocover + self.close() + + def close(self) -> None: + # Note that this method unilaterally closes the connection, and does + # not have any kind of locking in place around it. + self._h2_state.close_connection() + self._state = HTTPConnectionState.CLOSED + self._network_stream.close() + + # Wrappers around network read/write operations... + + def _read_incoming_data(self, request: Request) -> list[h2.events.Event]: + timeouts = request.extensions.get("timeout", {}) + timeout = timeouts.get("read", None) + + if self._read_exception is not None: + raise self._read_exception # pragma: nocover + + try: + data = self._network_stream.read(self.READ_NUM_BYTES, timeout) + if data == b"": + raise RemoteProtocolError("Server disconnected") + except Exception as exc: + # If we get a network error we should: + # + # 1. Save the exception and just raise it immediately on any future reads. + # (For example, this means that a single read timeout or disconnect will + # immediately close all pending streams. Without requiring multiple + # sequential timeouts.) + # 2. Mark the connection as errored, so that we don't accept any other + # incoming requests. + self._read_exception = exc + self._connection_error = True + raise exc + + events: list[h2.events.Event] = self._h2_state.receive_data(data) + + return events + + def _write_outgoing_data(self, request: Request) -> None: + timeouts = request.extensions.get("timeout", {}) + timeout = timeouts.get("write", None) + + with self._write_lock: + data_to_send = self._h2_state.data_to_send() + + if self._write_exception is not None: + raise self._write_exception # pragma: nocover + + try: + self._network_stream.write(data_to_send, timeout) + except Exception as exc: # pragma: nocover + # If we get a network error we should: + # + # 1. Save the exception and just raise it immediately on any future write. + # (For example, this means that a single write timeout or disconnect will + # immediately close all pending streams. Without requiring multiple + # sequential timeouts.) + # 2. Mark the connection as errored, so that we don't accept any other + # incoming requests. + self._write_exception = exc + self._connection_error = True + raise exc + + # Flow control... + + def _wait_for_outgoing_flow(self, request: Request, stream_id: int) -> int: + """ + Returns the maximum allowable outgoing flow for a given stream. + + If the allowable flow is zero, then waits on the network until + WindowUpdated frames have increased the flow rate. + https://tools.ietf.org/html/rfc7540#section-6.9 + """ + local_flow: int = self._h2_state.local_flow_control_window(stream_id) + max_frame_size: int = self._h2_state.max_outbound_frame_size + flow = min(local_flow, max_frame_size) + while flow == 0: + self._receive_events(request) + local_flow = self._h2_state.local_flow_control_window(stream_id) + max_frame_size = self._h2_state.max_outbound_frame_size + flow = min(local_flow, max_frame_size) + return flow + + # Interface for connection pooling... + + def can_handle_request(self, origin: Origin) -> bool: + return origin == self._origin + + def is_available(self) -> bool: + return ( + self._state != HTTPConnectionState.CLOSED + and not self._connection_error + and not self._used_all_stream_ids + and not ( + self._h2_state.state_machine.state + == h2.connection.ConnectionState.CLOSED + ) + ) + + def has_expired(self) -> bool: + now = time.monotonic() + return self._expire_at is not None and now > self._expire_at + + def is_idle(self) -> bool: + return self._state == HTTPConnectionState.IDLE + + def is_closed(self) -> bool: + return self._state == HTTPConnectionState.CLOSED + + def info(self) -> str: + origin = str(self._origin) + return ( + f"{origin!r}, HTTP/2, {self._state.name}, " + f"Request Count: {self._request_count}" + ) + + def __repr__(self) -> str: + class_name = self.__class__.__name__ + origin = str(self._origin) + return ( + f"<{class_name} [{origin!r}, {self._state.name}, " + f"Request Count: {self._request_count}]>" + ) + + # These context managers are not used in the standard flow, but are + # useful for testing or working with connection instances directly. + + def __enter__(self) -> HTTP2Connection: + return self + + def __exit__( + self, + exc_type: type[BaseException] | None = None, + exc_value: BaseException | None = None, + traceback: types.TracebackType | None = None, + ) -> None: + self.close() + + +class HTTP2ConnectionByteStream: + def __init__( + self, connection: HTTP2Connection, request: Request, stream_id: int + ) -> None: + self._connection = connection + self._request = request + self._stream_id = stream_id + self._closed = False + + def __iter__(self) -> typing.Iterator[bytes]: + kwargs = {"request": self._request, "stream_id": self._stream_id} + try: + with Trace("receive_response_body", logger, self._request, kwargs): + for chunk in self._connection._receive_response_body( + request=self._request, stream_id=self._stream_id + ): + yield chunk + except BaseException as exc: + # If we get an exception while streaming the response, + # we want to close the response (and possibly the connection) + # before raising that exception. + with ShieldCancellation(): + self.close() + raise exc + + def close(self) -> None: + if not self._closed: + self._closed = True + kwargs = {"stream_id": self._stream_id} + with Trace("response_closed", logger, self._request, kwargs): + self._connection._response_closed(stream_id=self._stream_id) diff --git a/.venv/lib/python3.10/site-packages/httpcore/_sync/http_proxy.py b/.venv/lib/python3.10/site-packages/httpcore/_sync/http_proxy.py new file mode 100644 index 0000000..ecca88f --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpcore/_sync/http_proxy.py @@ -0,0 +1,367 @@ +from __future__ import annotations + +import base64 +import logging +import ssl +import typing + +from .._backends.base import SOCKET_OPTION, NetworkBackend +from .._exceptions import ProxyError +from .._models import ( + URL, + Origin, + Request, + Response, + enforce_bytes, + enforce_headers, + enforce_url, +) +from .._ssl import default_ssl_context +from .._synchronization import Lock +from .._trace import Trace +from .connection import HTTPConnection +from .connection_pool import ConnectionPool +from .http11 import HTTP11Connection +from .interfaces import ConnectionInterface + +ByteOrStr = typing.Union[bytes, str] +HeadersAsSequence = typing.Sequence[typing.Tuple[ByteOrStr, ByteOrStr]] +HeadersAsMapping = typing.Mapping[ByteOrStr, ByteOrStr] + + +logger = logging.getLogger("httpcore.proxy") + + +def merge_headers( + default_headers: typing.Sequence[tuple[bytes, bytes]] | None = None, + override_headers: typing.Sequence[tuple[bytes, bytes]] | None = None, +) -> list[tuple[bytes, bytes]]: + """ + Append default_headers and override_headers, de-duplicating if a key exists + in both cases. + """ + default_headers = [] if default_headers is None else list(default_headers) + override_headers = [] if override_headers is None else list(override_headers) + has_override = set(key.lower() for key, value in override_headers) + default_headers = [ + (key, value) + for key, value in default_headers + if key.lower() not in has_override + ] + return default_headers + override_headers + + +class HTTPProxy(ConnectionPool): # pragma: nocover + """ + A connection pool that sends requests via an HTTP proxy. + """ + + def __init__( + self, + proxy_url: URL | bytes | str, + proxy_auth: tuple[bytes | str, bytes | str] | None = None, + proxy_headers: HeadersAsMapping | HeadersAsSequence | None = None, + ssl_context: ssl.SSLContext | None = None, + proxy_ssl_context: ssl.SSLContext | None = None, + max_connections: int | None = 10, + max_keepalive_connections: int | None = None, + keepalive_expiry: float | None = None, + http1: bool = True, + http2: bool = False, + retries: int = 0, + local_address: str | None = None, + uds: str | None = None, + network_backend: NetworkBackend | None = None, + socket_options: typing.Iterable[SOCKET_OPTION] | None = None, + ) -> None: + """ + A connection pool for making HTTP requests. + + Parameters: + proxy_url: The URL to use when connecting to the proxy server. + For example `"http://127.0.0.1:8080/"`. + proxy_auth: Any proxy authentication as a two-tuple of + (username, password). May be either bytes or ascii-only str. + proxy_headers: Any HTTP headers to use for the proxy requests. + For example `{"Proxy-Authorization": "Basic :"}`. + ssl_context: An SSL context to use for verifying connections. + If not specified, the default `httpcore.default_ssl_context()` + will be used. + proxy_ssl_context: The same as `ssl_context`, but for a proxy server rather than a remote origin. + max_connections: The maximum number of concurrent HTTP connections that + the pool should allow. Any attempt to send a request on a pool that + would exceed this amount will block until a connection is available. + max_keepalive_connections: The maximum number of idle HTTP connections + that will be maintained in the pool. + keepalive_expiry: The duration in seconds that an idle HTTP connection + may be maintained for before being expired from the pool. + http1: A boolean indicating if HTTP/1.1 requests should be supported + by the connection pool. Defaults to True. + http2: A boolean indicating if HTTP/2 requests should be supported by + the connection pool. Defaults to False. + retries: The maximum number of retries when trying to establish + a connection. + local_address: Local address to connect from. Can also be used to + connect using a particular address family. Using + `local_address="0.0.0.0"` will connect using an `AF_INET` address + (IPv4), while using `local_address="::"` will connect using an + `AF_INET6` address (IPv6). + uds: Path to a Unix Domain Socket to use instead of TCP sockets. + network_backend: A backend instance to use for handling network I/O. + """ + super().__init__( + ssl_context=ssl_context, + max_connections=max_connections, + max_keepalive_connections=max_keepalive_connections, + keepalive_expiry=keepalive_expiry, + http1=http1, + http2=http2, + network_backend=network_backend, + retries=retries, + local_address=local_address, + uds=uds, + socket_options=socket_options, + ) + + self._proxy_url = enforce_url(proxy_url, name="proxy_url") + if ( + self._proxy_url.scheme == b"http" and proxy_ssl_context is not None + ): # pragma: no cover + raise RuntimeError( + "The `proxy_ssl_context` argument is not allowed for the http scheme" + ) + + self._ssl_context = ssl_context + self._proxy_ssl_context = proxy_ssl_context + self._proxy_headers = enforce_headers(proxy_headers, name="proxy_headers") + if proxy_auth is not None: + username = enforce_bytes(proxy_auth[0], name="proxy_auth") + password = enforce_bytes(proxy_auth[1], name="proxy_auth") + userpass = username + b":" + password + authorization = b"Basic " + base64.b64encode(userpass) + self._proxy_headers = [ + (b"Proxy-Authorization", authorization) + ] + self._proxy_headers + + def create_connection(self, origin: Origin) -> ConnectionInterface: + if origin.scheme == b"http": + return ForwardHTTPConnection( + proxy_origin=self._proxy_url.origin, + proxy_headers=self._proxy_headers, + remote_origin=origin, + keepalive_expiry=self._keepalive_expiry, + network_backend=self._network_backend, + proxy_ssl_context=self._proxy_ssl_context, + ) + return TunnelHTTPConnection( + proxy_origin=self._proxy_url.origin, + proxy_headers=self._proxy_headers, + remote_origin=origin, + ssl_context=self._ssl_context, + proxy_ssl_context=self._proxy_ssl_context, + keepalive_expiry=self._keepalive_expiry, + http1=self._http1, + http2=self._http2, + network_backend=self._network_backend, + ) + + +class ForwardHTTPConnection(ConnectionInterface): + def __init__( + self, + proxy_origin: Origin, + remote_origin: Origin, + proxy_headers: HeadersAsMapping | HeadersAsSequence | None = None, + keepalive_expiry: float | None = None, + network_backend: NetworkBackend | None = None, + socket_options: typing.Iterable[SOCKET_OPTION] | None = None, + proxy_ssl_context: ssl.SSLContext | None = None, + ) -> None: + self._connection = HTTPConnection( + origin=proxy_origin, + keepalive_expiry=keepalive_expiry, + network_backend=network_backend, + socket_options=socket_options, + ssl_context=proxy_ssl_context, + ) + self._proxy_origin = proxy_origin + self._proxy_headers = enforce_headers(proxy_headers, name="proxy_headers") + self._remote_origin = remote_origin + + def handle_request(self, request: Request) -> Response: + headers = merge_headers(self._proxy_headers, request.headers) + url = URL( + scheme=self._proxy_origin.scheme, + host=self._proxy_origin.host, + port=self._proxy_origin.port, + target=bytes(request.url), + ) + proxy_request = Request( + method=request.method, + url=url, + headers=headers, + content=request.stream, + extensions=request.extensions, + ) + return self._connection.handle_request(proxy_request) + + def can_handle_request(self, origin: Origin) -> bool: + return origin == self._remote_origin + + def close(self) -> None: + self._connection.close() + + def info(self) -> str: + return self._connection.info() + + def is_available(self) -> bool: + return self._connection.is_available() + + def has_expired(self) -> bool: + return self._connection.has_expired() + + def is_idle(self) -> bool: + return self._connection.is_idle() + + def is_closed(self) -> bool: + return self._connection.is_closed() + + def __repr__(self) -> str: + return f"<{self.__class__.__name__} [{self.info()}]>" + + +class TunnelHTTPConnection(ConnectionInterface): + def __init__( + self, + proxy_origin: Origin, + remote_origin: Origin, + ssl_context: ssl.SSLContext | None = None, + proxy_ssl_context: ssl.SSLContext | None = None, + proxy_headers: typing.Sequence[tuple[bytes, bytes]] | None = None, + keepalive_expiry: float | None = None, + http1: bool = True, + http2: bool = False, + network_backend: NetworkBackend | None = None, + socket_options: typing.Iterable[SOCKET_OPTION] | None = None, + ) -> None: + self._connection: ConnectionInterface = HTTPConnection( + origin=proxy_origin, + keepalive_expiry=keepalive_expiry, + network_backend=network_backend, + socket_options=socket_options, + ssl_context=proxy_ssl_context, + ) + self._proxy_origin = proxy_origin + self._remote_origin = remote_origin + self._ssl_context = ssl_context + self._proxy_ssl_context = proxy_ssl_context + self._proxy_headers = enforce_headers(proxy_headers, name="proxy_headers") + self._keepalive_expiry = keepalive_expiry + self._http1 = http1 + self._http2 = http2 + self._connect_lock = Lock() + self._connected = False + + def handle_request(self, request: Request) -> Response: + timeouts = request.extensions.get("timeout", {}) + timeout = timeouts.get("connect", None) + + with self._connect_lock: + if not self._connected: + target = b"%b:%d" % (self._remote_origin.host, self._remote_origin.port) + + connect_url = URL( + scheme=self._proxy_origin.scheme, + host=self._proxy_origin.host, + port=self._proxy_origin.port, + target=target, + ) + connect_headers = merge_headers( + [(b"Host", target), (b"Accept", b"*/*")], self._proxy_headers + ) + connect_request = Request( + method=b"CONNECT", + url=connect_url, + headers=connect_headers, + extensions=request.extensions, + ) + connect_response = self._connection.handle_request( + connect_request + ) + + if connect_response.status < 200 or connect_response.status > 299: + reason_bytes = connect_response.extensions.get("reason_phrase", b"") + reason_str = reason_bytes.decode("ascii", errors="ignore") + msg = "%d %s" % (connect_response.status, reason_str) + self._connection.close() + raise ProxyError(msg) + + stream = connect_response.extensions["network_stream"] + + # Upgrade the stream to SSL + ssl_context = ( + default_ssl_context() + if self._ssl_context is None + else self._ssl_context + ) + alpn_protocols = ["http/1.1", "h2"] if self._http2 else ["http/1.1"] + ssl_context.set_alpn_protocols(alpn_protocols) + + kwargs = { + "ssl_context": ssl_context, + "server_hostname": self._remote_origin.host.decode("ascii"), + "timeout": timeout, + } + with Trace("start_tls", logger, request, kwargs) as trace: + stream = stream.start_tls(**kwargs) + trace.return_value = stream + + # Determine if we should be using HTTP/1.1 or HTTP/2 + ssl_object = stream.get_extra_info("ssl_object") + http2_negotiated = ( + ssl_object is not None + and ssl_object.selected_alpn_protocol() == "h2" + ) + + # Create the HTTP/1.1 or HTTP/2 connection + if http2_negotiated or (self._http2 and not self._http1): + from .http2 import HTTP2Connection + + self._connection = HTTP2Connection( + origin=self._remote_origin, + stream=stream, + keepalive_expiry=self._keepalive_expiry, + ) + else: + self._connection = HTTP11Connection( + origin=self._remote_origin, + stream=stream, + keepalive_expiry=self._keepalive_expiry, + ) + + self._connected = True + return self._connection.handle_request(request) + + def can_handle_request(self, origin: Origin) -> bool: + return origin == self._remote_origin + + def close(self) -> None: + self._connection.close() + + def info(self) -> str: + return self._connection.info() + + def is_available(self) -> bool: + return self._connection.is_available() + + def has_expired(self) -> bool: + return self._connection.has_expired() + + def is_idle(self) -> bool: + return self._connection.is_idle() + + def is_closed(self) -> bool: + return self._connection.is_closed() + + def __repr__(self) -> str: + return f"<{self.__class__.__name__} [{self.info()}]>" diff --git a/.venv/lib/python3.10/site-packages/httpcore/_sync/interfaces.py b/.venv/lib/python3.10/site-packages/httpcore/_sync/interfaces.py new file mode 100644 index 0000000..e673d4c --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpcore/_sync/interfaces.py @@ -0,0 +1,137 @@ +from __future__ import annotations + +import contextlib +import typing + +from .._models import ( + URL, + Extensions, + HeaderTypes, + Origin, + Request, + Response, + enforce_bytes, + enforce_headers, + enforce_url, + include_request_headers, +) + + +class RequestInterface: + def request( + self, + method: bytes | str, + url: URL | bytes | str, + *, + headers: HeaderTypes = None, + content: bytes | typing.Iterator[bytes] | None = None, + extensions: Extensions | None = None, + ) -> Response: + # Strict type checking on our parameters. + method = enforce_bytes(method, name="method") + url = enforce_url(url, name="url") + headers = enforce_headers(headers, name="headers") + + # Include Host header, and optionally Content-Length or Transfer-Encoding. + headers = include_request_headers(headers, url=url, content=content) + + request = Request( + method=method, + url=url, + headers=headers, + content=content, + extensions=extensions, + ) + response = self.handle_request(request) + try: + response.read() + finally: + response.close() + return response + + @contextlib.contextmanager + def stream( + self, + method: bytes | str, + url: URL | bytes | str, + *, + headers: HeaderTypes = None, + content: bytes | typing.Iterator[bytes] | None = None, + extensions: Extensions | None = None, + ) -> typing.Iterator[Response]: + # Strict type checking on our parameters. + method = enforce_bytes(method, name="method") + url = enforce_url(url, name="url") + headers = enforce_headers(headers, name="headers") + + # Include Host header, and optionally Content-Length or Transfer-Encoding. + headers = include_request_headers(headers, url=url, content=content) + + request = Request( + method=method, + url=url, + headers=headers, + content=content, + extensions=extensions, + ) + response = self.handle_request(request) + try: + yield response + finally: + response.close() + + def handle_request(self, request: Request) -> Response: + raise NotImplementedError() # pragma: nocover + + +class ConnectionInterface(RequestInterface): + def close(self) -> None: + raise NotImplementedError() # pragma: nocover + + def info(self) -> str: + raise NotImplementedError() # pragma: nocover + + def can_handle_request(self, origin: Origin) -> bool: + raise NotImplementedError() # pragma: nocover + + def is_available(self) -> bool: + """ + Return `True` if the connection is currently able to accept an + outgoing request. + + An HTTP/1.1 connection will only be available if it is currently idle. + + An HTTP/2 connection will be available so long as the stream ID space is + not yet exhausted, and the connection is not in an error state. + + While the connection is being established we may not yet know if it is going + to result in an HTTP/1.1 or HTTP/2 connection. The connection should be + treated as being available, but might ultimately raise `NewConnectionRequired` + required exceptions if multiple requests are attempted over a connection + that ends up being established as HTTP/1.1. + """ + raise NotImplementedError() # pragma: nocover + + def has_expired(self) -> bool: + """ + Return `True` if the connection is in a state where it should be closed. + + This either means that the connection is idle and it has passed the + expiry time on its keep-alive, or that server has sent an EOF. + """ + raise NotImplementedError() # pragma: nocover + + def is_idle(self) -> bool: + """ + Return `True` if the connection is currently idle. + """ + raise NotImplementedError() # pragma: nocover + + def is_closed(self) -> bool: + """ + Return `True` if the connection has been closed. + + Used when a response is closed to determine if the connection may be + returned to the connection pool or not. + """ + raise NotImplementedError() # pragma: nocover diff --git a/.venv/lib/python3.10/site-packages/httpcore/_sync/socks_proxy.py b/.venv/lib/python3.10/site-packages/httpcore/_sync/socks_proxy.py new file mode 100644 index 0000000..0ca96dd --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpcore/_sync/socks_proxy.py @@ -0,0 +1,341 @@ +from __future__ import annotations + +import logging +import ssl + +import socksio + +from .._backends.sync import SyncBackend +from .._backends.base import NetworkBackend, NetworkStream +from .._exceptions import ConnectionNotAvailable, ProxyError +from .._models import URL, Origin, Request, Response, enforce_bytes, enforce_url +from .._ssl import default_ssl_context +from .._synchronization import Lock +from .._trace import Trace +from .connection_pool import ConnectionPool +from .http11 import HTTP11Connection +from .interfaces import ConnectionInterface + +logger = logging.getLogger("httpcore.socks") + + +AUTH_METHODS = { + b"\x00": "NO AUTHENTICATION REQUIRED", + b"\x01": "GSSAPI", + b"\x02": "USERNAME/PASSWORD", + b"\xff": "NO ACCEPTABLE METHODS", +} + +REPLY_CODES = { + b"\x00": "Succeeded", + b"\x01": "General SOCKS server failure", + b"\x02": "Connection not allowed by ruleset", + b"\x03": "Network unreachable", + b"\x04": "Host unreachable", + b"\x05": "Connection refused", + b"\x06": "TTL expired", + b"\x07": "Command not supported", + b"\x08": "Address type not supported", +} + + +def _init_socks5_connection( + stream: NetworkStream, + *, + host: bytes, + port: int, + auth: tuple[bytes, bytes] | None = None, +) -> None: + conn = socksio.socks5.SOCKS5Connection() + + # Auth method request + auth_method = ( + socksio.socks5.SOCKS5AuthMethod.NO_AUTH_REQUIRED + if auth is None + else socksio.socks5.SOCKS5AuthMethod.USERNAME_PASSWORD + ) + conn.send(socksio.socks5.SOCKS5AuthMethodsRequest([auth_method])) + outgoing_bytes = conn.data_to_send() + stream.write(outgoing_bytes) + + # Auth method response + incoming_bytes = stream.read(max_bytes=4096) + response = conn.receive_data(incoming_bytes) + assert isinstance(response, socksio.socks5.SOCKS5AuthReply) + if response.method != auth_method: + requested = AUTH_METHODS.get(auth_method, "UNKNOWN") + responded = AUTH_METHODS.get(response.method, "UNKNOWN") + raise ProxyError( + f"Requested {requested} from proxy server, but got {responded}." + ) + + if response.method == socksio.socks5.SOCKS5AuthMethod.USERNAME_PASSWORD: + # Username/password request + assert auth is not None + username, password = auth + conn.send(socksio.socks5.SOCKS5UsernamePasswordRequest(username, password)) + outgoing_bytes = conn.data_to_send() + stream.write(outgoing_bytes) + + # Username/password response + incoming_bytes = stream.read(max_bytes=4096) + response = conn.receive_data(incoming_bytes) + assert isinstance(response, socksio.socks5.SOCKS5UsernamePasswordReply) + if not response.success: + raise ProxyError("Invalid username/password") + + # Connect request + conn.send( + socksio.socks5.SOCKS5CommandRequest.from_address( + socksio.socks5.SOCKS5Command.CONNECT, (host, port) + ) + ) + outgoing_bytes = conn.data_to_send() + stream.write(outgoing_bytes) + + # Connect response + incoming_bytes = stream.read(max_bytes=4096) + response = conn.receive_data(incoming_bytes) + assert isinstance(response, socksio.socks5.SOCKS5Reply) + if response.reply_code != socksio.socks5.SOCKS5ReplyCode.SUCCEEDED: + reply_code = REPLY_CODES.get(response.reply_code, "UNKOWN") + raise ProxyError(f"Proxy Server could not connect: {reply_code}.") + + +class SOCKSProxy(ConnectionPool): # pragma: nocover + """ + A connection pool that sends requests via an HTTP proxy. + """ + + def __init__( + self, + proxy_url: URL | bytes | str, + proxy_auth: tuple[bytes | str, bytes | str] | None = None, + ssl_context: ssl.SSLContext | None = None, + max_connections: int | None = 10, + max_keepalive_connections: int | None = None, + keepalive_expiry: float | None = None, + http1: bool = True, + http2: bool = False, + retries: int = 0, + network_backend: NetworkBackend | None = None, + ) -> None: + """ + A connection pool for making HTTP requests. + + Parameters: + proxy_url: The URL to use when connecting to the proxy server. + For example `"http://127.0.0.1:8080/"`. + ssl_context: An SSL context to use for verifying connections. + If not specified, the default `httpcore.default_ssl_context()` + will be used. + max_connections: The maximum number of concurrent HTTP connections that + the pool should allow. Any attempt to send a request on a pool that + would exceed this amount will block until a connection is available. + max_keepalive_connections: The maximum number of idle HTTP connections + that will be maintained in the pool. + keepalive_expiry: The duration in seconds that an idle HTTP connection + may be maintained for before being expired from the pool. + http1: A boolean indicating if HTTP/1.1 requests should be supported + by the connection pool. Defaults to True. + http2: A boolean indicating if HTTP/2 requests should be supported by + the connection pool. Defaults to False. + retries: The maximum number of retries when trying to establish + a connection. + local_address: Local address to connect from. Can also be used to + connect using a particular address family. Using + `local_address="0.0.0.0"` will connect using an `AF_INET` address + (IPv4), while using `local_address="::"` will connect using an + `AF_INET6` address (IPv6). + uds: Path to a Unix Domain Socket to use instead of TCP sockets. + network_backend: A backend instance to use for handling network I/O. + """ + super().__init__( + ssl_context=ssl_context, + max_connections=max_connections, + max_keepalive_connections=max_keepalive_connections, + keepalive_expiry=keepalive_expiry, + http1=http1, + http2=http2, + network_backend=network_backend, + retries=retries, + ) + self._ssl_context = ssl_context + self._proxy_url = enforce_url(proxy_url, name="proxy_url") + if proxy_auth is not None: + username, password = proxy_auth + username_bytes = enforce_bytes(username, name="proxy_auth") + password_bytes = enforce_bytes(password, name="proxy_auth") + self._proxy_auth: tuple[bytes, bytes] | None = ( + username_bytes, + password_bytes, + ) + else: + self._proxy_auth = None + + def create_connection(self, origin: Origin) -> ConnectionInterface: + return Socks5Connection( + proxy_origin=self._proxy_url.origin, + remote_origin=origin, + proxy_auth=self._proxy_auth, + ssl_context=self._ssl_context, + keepalive_expiry=self._keepalive_expiry, + http1=self._http1, + http2=self._http2, + network_backend=self._network_backend, + ) + + +class Socks5Connection(ConnectionInterface): + def __init__( + self, + proxy_origin: Origin, + remote_origin: Origin, + proxy_auth: tuple[bytes, bytes] | None = None, + ssl_context: ssl.SSLContext | None = None, + keepalive_expiry: float | None = None, + http1: bool = True, + http2: bool = False, + network_backend: NetworkBackend | None = None, + ) -> None: + self._proxy_origin = proxy_origin + self._remote_origin = remote_origin + self._proxy_auth = proxy_auth + self._ssl_context = ssl_context + self._keepalive_expiry = keepalive_expiry + self._http1 = http1 + self._http2 = http2 + + self._network_backend: NetworkBackend = ( + SyncBackend() if network_backend is None else network_backend + ) + self._connect_lock = Lock() + self._connection: ConnectionInterface | None = None + self._connect_failed = False + + def handle_request(self, request: Request) -> Response: + timeouts = request.extensions.get("timeout", {}) + sni_hostname = request.extensions.get("sni_hostname", None) + timeout = timeouts.get("connect", None) + + with self._connect_lock: + if self._connection is None: + try: + # Connect to the proxy + kwargs = { + "host": self._proxy_origin.host.decode("ascii"), + "port": self._proxy_origin.port, + "timeout": timeout, + } + with Trace("connect_tcp", logger, request, kwargs) as trace: + stream = self._network_backend.connect_tcp(**kwargs) + trace.return_value = stream + + # Connect to the remote host using socks5 + kwargs = { + "stream": stream, + "host": self._remote_origin.host.decode("ascii"), + "port": self._remote_origin.port, + "auth": self._proxy_auth, + } + with Trace( + "setup_socks5_connection", logger, request, kwargs + ) as trace: + _init_socks5_connection(**kwargs) + trace.return_value = stream + + # Upgrade the stream to SSL + if self._remote_origin.scheme == b"https": + ssl_context = ( + default_ssl_context() + if self._ssl_context is None + else self._ssl_context + ) + alpn_protocols = ( + ["http/1.1", "h2"] if self._http2 else ["http/1.1"] + ) + ssl_context.set_alpn_protocols(alpn_protocols) + + kwargs = { + "ssl_context": ssl_context, + "server_hostname": sni_hostname + or self._remote_origin.host.decode("ascii"), + "timeout": timeout, + } + with Trace("start_tls", logger, request, kwargs) as trace: + stream = stream.start_tls(**kwargs) + trace.return_value = stream + + # Determine if we should be using HTTP/1.1 or HTTP/2 + ssl_object = stream.get_extra_info("ssl_object") + http2_negotiated = ( + ssl_object is not None + and ssl_object.selected_alpn_protocol() == "h2" + ) + + # Create the HTTP/1.1 or HTTP/2 connection + if http2_negotiated or ( + self._http2 and not self._http1 + ): # pragma: nocover + from .http2 import HTTP2Connection + + self._connection = HTTP2Connection( + origin=self._remote_origin, + stream=stream, + keepalive_expiry=self._keepalive_expiry, + ) + else: + self._connection = HTTP11Connection( + origin=self._remote_origin, + stream=stream, + keepalive_expiry=self._keepalive_expiry, + ) + except Exception as exc: + self._connect_failed = True + raise exc + elif not self._connection.is_available(): # pragma: nocover + raise ConnectionNotAvailable() + + return self._connection.handle_request(request) + + def can_handle_request(self, origin: Origin) -> bool: + return origin == self._remote_origin + + def close(self) -> None: + if self._connection is not None: + self._connection.close() + + def is_available(self) -> bool: + if self._connection is None: # pragma: nocover + # If HTTP/2 support is enabled, and the resulting connection could + # end up as HTTP/2 then we should indicate the connection as being + # available to service multiple requests. + return ( + self._http2 + and (self._remote_origin.scheme == b"https" or not self._http1) + and not self._connect_failed + ) + return self._connection.is_available() + + def has_expired(self) -> bool: + if self._connection is None: # pragma: nocover + return self._connect_failed + return self._connection.has_expired() + + def is_idle(self) -> bool: + if self._connection is None: # pragma: nocover + return self._connect_failed + return self._connection.is_idle() + + def is_closed(self) -> bool: + if self._connection is None: # pragma: nocover + return self._connect_failed + return self._connection.is_closed() + + def info(self) -> str: + if self._connection is None: # pragma: nocover + return "CONNECTION FAILED" if self._connect_failed else "CONNECTING" + return self._connection.info() + + def __repr__(self) -> str: + return f"<{self.__class__.__name__} [{self.info()}]>" diff --git a/.venv/lib/python3.10/site-packages/httpcore/_synchronization.py b/.venv/lib/python3.10/site-packages/httpcore/_synchronization.py new file mode 100644 index 0000000..2ecc9e9 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpcore/_synchronization.py @@ -0,0 +1,318 @@ +from __future__ import annotations + +import threading +import types + +from ._exceptions import ExceptionMapping, PoolTimeout, map_exceptions + +# Our async synchronization primatives use either 'anyio' or 'trio' depending +# on if they're running under asyncio or trio. + +try: + import trio +except (ImportError, NotImplementedError): # pragma: nocover + trio = None # type: ignore + +try: + import anyio +except ImportError: # pragma: nocover + anyio = None # type: ignore + + +def current_async_library() -> str: + # Determine if we're running under trio or asyncio. + # See https://sniffio.readthedocs.io/en/latest/ + try: + import sniffio + except ImportError: # pragma: nocover + environment = "asyncio" + else: + environment = sniffio.current_async_library() + + if environment not in ("asyncio", "trio"): # pragma: nocover + raise RuntimeError("Running under an unsupported async environment.") + + if environment == "asyncio" and anyio is None: # pragma: nocover + raise RuntimeError( + "Running with asyncio requires installation of 'httpcore[asyncio]'." + ) + + if environment == "trio" and trio is None: # pragma: nocover + raise RuntimeError( + "Running with trio requires installation of 'httpcore[trio]'." + ) + + return environment + + +class AsyncLock: + """ + This is a standard lock. + + In the sync case `Lock` provides thread locking. + In the async case `AsyncLock` provides async locking. + """ + + def __init__(self) -> None: + self._backend = "" + + def setup(self) -> None: + """ + Detect if we're running under 'asyncio' or 'trio' and create + a lock with the correct implementation. + """ + self._backend = current_async_library() + if self._backend == "trio": + self._trio_lock = trio.Lock() + elif self._backend == "asyncio": + self._anyio_lock = anyio.Lock() + + async def __aenter__(self) -> AsyncLock: + if not self._backend: + self.setup() + + if self._backend == "trio": + await self._trio_lock.acquire() + elif self._backend == "asyncio": + await self._anyio_lock.acquire() + + return self + + async def __aexit__( + self, + exc_type: type[BaseException] | None = None, + exc_value: BaseException | None = None, + traceback: types.TracebackType | None = None, + ) -> None: + if self._backend == "trio": + self._trio_lock.release() + elif self._backend == "asyncio": + self._anyio_lock.release() + + +class AsyncThreadLock: + """ + This is a threading-only lock for no-I/O contexts. + + In the sync case `ThreadLock` provides thread locking. + In the async case `AsyncThreadLock` is a no-op. + """ + + def __enter__(self) -> AsyncThreadLock: + return self + + def __exit__( + self, + exc_type: type[BaseException] | None = None, + exc_value: BaseException | None = None, + traceback: types.TracebackType | None = None, + ) -> None: + pass + + +class AsyncEvent: + def __init__(self) -> None: + self._backend = "" + + def setup(self) -> None: + """ + Detect if we're running under 'asyncio' or 'trio' and create + a lock with the correct implementation. + """ + self._backend = current_async_library() + if self._backend == "trio": + self._trio_event = trio.Event() + elif self._backend == "asyncio": + self._anyio_event = anyio.Event() + + def set(self) -> None: + if not self._backend: + self.setup() + + if self._backend == "trio": + self._trio_event.set() + elif self._backend == "asyncio": + self._anyio_event.set() + + async def wait(self, timeout: float | None = None) -> None: + if not self._backend: + self.setup() + + if self._backend == "trio": + trio_exc_map: ExceptionMapping = {trio.TooSlowError: PoolTimeout} + timeout_or_inf = float("inf") if timeout is None else timeout + with map_exceptions(trio_exc_map): + with trio.fail_after(timeout_or_inf): + await self._trio_event.wait() + elif self._backend == "asyncio": + anyio_exc_map: ExceptionMapping = {TimeoutError: PoolTimeout} + with map_exceptions(anyio_exc_map): + with anyio.fail_after(timeout): + await self._anyio_event.wait() + + +class AsyncSemaphore: + def __init__(self, bound: int) -> None: + self._bound = bound + self._backend = "" + + def setup(self) -> None: + """ + Detect if we're running under 'asyncio' or 'trio' and create + a semaphore with the correct implementation. + """ + self._backend = current_async_library() + if self._backend == "trio": + self._trio_semaphore = trio.Semaphore( + initial_value=self._bound, max_value=self._bound + ) + elif self._backend == "asyncio": + self._anyio_semaphore = anyio.Semaphore( + initial_value=self._bound, max_value=self._bound + ) + + async def acquire(self) -> None: + if not self._backend: + self.setup() + + if self._backend == "trio": + await self._trio_semaphore.acquire() + elif self._backend == "asyncio": + await self._anyio_semaphore.acquire() + + async def release(self) -> None: + if self._backend == "trio": + self._trio_semaphore.release() + elif self._backend == "asyncio": + self._anyio_semaphore.release() + + +class AsyncShieldCancellation: + # For certain portions of our codebase where we're dealing with + # closing connections during exception handling we want to shield + # the operation from being cancelled. + # + # with AsyncShieldCancellation(): + # ... # clean-up operations, shielded from cancellation. + + def __init__(self) -> None: + """ + Detect if we're running under 'asyncio' or 'trio' and create + a shielded scope with the correct implementation. + """ + self._backend = current_async_library() + + if self._backend == "trio": + self._trio_shield = trio.CancelScope(shield=True) + elif self._backend == "asyncio": + self._anyio_shield = anyio.CancelScope(shield=True) + + def __enter__(self) -> AsyncShieldCancellation: + if self._backend == "trio": + self._trio_shield.__enter__() + elif self._backend == "asyncio": + self._anyio_shield.__enter__() + return self + + def __exit__( + self, + exc_type: type[BaseException] | None = None, + exc_value: BaseException | None = None, + traceback: types.TracebackType | None = None, + ) -> None: + if self._backend == "trio": + self._trio_shield.__exit__(exc_type, exc_value, traceback) + elif self._backend == "asyncio": + self._anyio_shield.__exit__(exc_type, exc_value, traceback) + + +# Our thread-based synchronization primitives... + + +class Lock: + """ + This is a standard lock. + + In the sync case `Lock` provides thread locking. + In the async case `AsyncLock` provides async locking. + """ + + def __init__(self) -> None: + self._lock = threading.Lock() + + def __enter__(self) -> Lock: + self._lock.acquire() + return self + + def __exit__( + self, + exc_type: type[BaseException] | None = None, + exc_value: BaseException | None = None, + traceback: types.TracebackType | None = None, + ) -> None: + self._lock.release() + + +class ThreadLock: + """ + This is a threading-only lock for no-I/O contexts. + + In the sync case `ThreadLock` provides thread locking. + In the async case `AsyncThreadLock` is a no-op. + """ + + def __init__(self) -> None: + self._lock = threading.Lock() + + def __enter__(self) -> ThreadLock: + self._lock.acquire() + return self + + def __exit__( + self, + exc_type: type[BaseException] | None = None, + exc_value: BaseException | None = None, + traceback: types.TracebackType | None = None, + ) -> None: + self._lock.release() + + +class Event: + def __init__(self) -> None: + self._event = threading.Event() + + def set(self) -> None: + self._event.set() + + def wait(self, timeout: float | None = None) -> None: + if timeout == float("inf"): # pragma: no cover + timeout = None + if not self._event.wait(timeout=timeout): + raise PoolTimeout() # pragma: nocover + + +class Semaphore: + def __init__(self, bound: int) -> None: + self._semaphore = threading.Semaphore(value=bound) + + def acquire(self) -> None: + self._semaphore.acquire() + + def release(self) -> None: + self._semaphore.release() + + +class ShieldCancellation: + # Thread-synchronous codebases don't support cancellation semantics. + # We have this class because we need to mirror the async and sync + # cases within our package, but it's just a no-op. + def __enter__(self) -> ShieldCancellation: + return self + + def __exit__( + self, + exc_type: type[BaseException] | None = None, + exc_value: BaseException | None = None, + traceback: types.TracebackType | None = None, + ) -> None: + pass diff --git a/.venv/lib/python3.10/site-packages/httpcore/_trace.py b/.venv/lib/python3.10/site-packages/httpcore/_trace.py new file mode 100644 index 0000000..5f1cd7c --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpcore/_trace.py @@ -0,0 +1,107 @@ +from __future__ import annotations + +import inspect +import logging +import types +import typing + +from ._models import Request + + +class Trace: + def __init__( + self, + name: str, + logger: logging.Logger, + request: Request | None = None, + kwargs: dict[str, typing.Any] | None = None, + ) -> None: + self.name = name + self.logger = logger + self.trace_extension = ( + None if request is None else request.extensions.get("trace") + ) + self.debug = self.logger.isEnabledFor(logging.DEBUG) + self.kwargs = kwargs or {} + self.return_value: typing.Any = None + self.should_trace = self.debug or self.trace_extension is not None + self.prefix = self.logger.name.split(".")[-1] + + def trace(self, name: str, info: dict[str, typing.Any]) -> None: + if self.trace_extension is not None: + prefix_and_name = f"{self.prefix}.{name}" + ret = self.trace_extension(prefix_and_name, info) + if inspect.iscoroutine(ret): # pragma: no cover + raise TypeError( + "If you are using a synchronous interface, " + "the callback of the `trace` extension should " + "be a normal function instead of an asynchronous function." + ) + + if self.debug: + if not info or "return_value" in info and info["return_value"] is None: + message = name + else: + args = " ".join([f"{key}={value!r}" for key, value in info.items()]) + message = f"{name} {args}" + self.logger.debug(message) + + def __enter__(self) -> Trace: + if self.should_trace: + info = self.kwargs + self.trace(f"{self.name}.started", info) + return self + + def __exit__( + self, + exc_type: type[BaseException] | None = None, + exc_value: BaseException | None = None, + traceback: types.TracebackType | None = None, + ) -> None: + if self.should_trace: + if exc_value is None: + info = {"return_value": self.return_value} + self.trace(f"{self.name}.complete", info) + else: + info = {"exception": exc_value} + self.trace(f"{self.name}.failed", info) + + async def atrace(self, name: str, info: dict[str, typing.Any]) -> None: + if self.trace_extension is not None: + prefix_and_name = f"{self.prefix}.{name}" + coro = self.trace_extension(prefix_and_name, info) + if not inspect.iscoroutine(coro): # pragma: no cover + raise TypeError( + "If you're using an asynchronous interface, " + "the callback of the `trace` extension should " + "be an asynchronous function rather than a normal function." + ) + await coro + + if self.debug: + if not info or "return_value" in info and info["return_value"] is None: + message = name + else: + args = " ".join([f"{key}={value!r}" for key, value in info.items()]) + message = f"{name} {args}" + self.logger.debug(message) + + async def __aenter__(self) -> Trace: + if self.should_trace: + info = self.kwargs + await self.atrace(f"{self.name}.started", info) + return self + + async def __aexit__( + self, + exc_type: type[BaseException] | None = None, + exc_value: BaseException | None = None, + traceback: types.TracebackType | None = None, + ) -> None: + if self.should_trace: + if exc_value is None: + info = {"return_value": self.return_value} + await self.atrace(f"{self.name}.complete", info) + else: + info = {"exception": exc_value} + await self.atrace(f"{self.name}.failed", info) diff --git a/.venv/lib/python3.10/site-packages/httpcore/_utils.py b/.venv/lib/python3.10/site-packages/httpcore/_utils.py new file mode 100644 index 0000000..c44ff93 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpcore/_utils.py @@ -0,0 +1,37 @@ +from __future__ import annotations + +import select +import socket +import sys + + +def is_socket_readable(sock: socket.socket | None) -> bool: + """ + Return whether a socket, as identifed by its file descriptor, is readable. + "A socket is readable" means that the read buffer isn't empty, i.e. that calling + .recv() on it would immediately return some data. + """ + # NOTE: we want check for readability without actually attempting to read, because + # we don't want to block forever if it's not readable. + + # In the case that the socket no longer exists, or cannot return a file + # descriptor, we treat it as being readable, as if it the next read operation + # on it is ready to return the terminating `b""`. + sock_fd = None if sock is None else sock.fileno() + if sock_fd is None or sock_fd < 0: # pragma: nocover + return True + + # The implementation below was stolen from: + # https://github.com/python-trio/trio/blob/20ee2b1b7376db637435d80e266212a35837ddcc/trio/_socket.py#L471-L478 + # See also: https://github.com/encode/httpcore/pull/193#issuecomment-703129316 + + # Use select.select on Windows, and when poll is unavailable and select.poll + # everywhere else. (E.g. When eventlet is in use. See #327) + if ( + sys.platform == "win32" or getattr(select, "poll", None) is None + ): # pragma: nocover + rready, _, _ = select.select([sock_fd], [], [], 0) + return bool(rready) + p = select.poll() + p.register(sock_fd, select.POLLIN) + return bool(p.poll(0)) diff --git a/.venv/lib/python3.10/site-packages/httpcore/py.typed b/.venv/lib/python3.10/site-packages/httpcore/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/.venv/lib/python3.10/site-packages/httpx-0.28.1.dist-info/INSTALLER b/.venv/lib/python3.10/site-packages/httpx-0.28.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpx-0.28.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/.venv/lib/python3.10/site-packages/httpx-0.28.1.dist-info/METADATA b/.venv/lib/python3.10/site-packages/httpx-0.28.1.dist-info/METADATA new file mode 100644 index 0000000..b0d2b19 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpx-0.28.1.dist-info/METADATA @@ -0,0 +1,203 @@ +Metadata-Version: 2.3 +Name: httpx +Version: 0.28.1 +Summary: The next generation HTTP client. +Project-URL: Changelog, https://github.com/encode/httpx/blob/master/CHANGELOG.md +Project-URL: Documentation, https://www.python-httpx.org +Project-URL: Homepage, https://github.com/encode/httpx +Project-URL: Source, https://github.com/encode/httpx +Author-email: Tom Christie +License: BSD-3-Clause +Classifier: Development Status :: 4 - Beta +Classifier: Environment :: Web Environment +Classifier: Framework :: AsyncIO +Classifier: Framework :: Trio +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Topic :: Internet :: WWW/HTTP +Requires-Python: >=3.8 +Requires-Dist: anyio +Requires-Dist: certifi +Requires-Dist: httpcore==1.* +Requires-Dist: idna +Provides-Extra: brotli +Requires-Dist: brotli; (platform_python_implementation == 'CPython') and extra == 'brotli' +Requires-Dist: brotlicffi; (platform_python_implementation != 'CPython') and extra == 'brotli' +Provides-Extra: cli +Requires-Dist: click==8.*; extra == 'cli' +Requires-Dist: pygments==2.*; extra == 'cli' +Requires-Dist: rich<14,>=10; extra == 'cli' +Provides-Extra: http2 +Requires-Dist: h2<5,>=3; extra == 'http2' +Provides-Extra: socks +Requires-Dist: socksio==1.*; extra == 'socks' +Provides-Extra: zstd +Requires-Dist: zstandard>=0.18.0; extra == 'zstd' +Description-Content-Type: text/markdown + +

+ HTTPX +

+ +

HTTPX - A next-generation HTTP client for Python.

+ +

+ + Test Suite + + + Package version + +

+ +HTTPX is a fully featured HTTP client library for Python 3. It includes **an integrated command line client**, has support for both **HTTP/1.1 and HTTP/2**, and provides both **sync and async APIs**. + +--- + +Install HTTPX using pip: + +```shell +$ pip install httpx +``` + +Now, let's get started: + +```pycon +>>> import httpx +>>> r = httpx.get('https://www.example.org/') +>>> r + +>>> r.status_code +200 +>>> r.headers['content-type'] +'text/html; charset=UTF-8' +>>> r.text +'\n\n\nExample Domain...' +``` + +Or, using the command-line client. + +```shell +$ pip install 'httpx[cli]' # The command line client is an optional dependency. +``` + +Which now allows us to use HTTPX directly from the command-line... + +

+ httpx --help +

+ +Sending a request... + +

+ httpx http://httpbin.org/json +

+ +## Features + +HTTPX builds on the well-established usability of `requests`, and gives you: + +* A broadly [requests-compatible API](https://www.python-httpx.org/compatibility/). +* An integrated command-line client. +* HTTP/1.1 [and HTTP/2 support](https://www.python-httpx.org/http2/). +* Standard synchronous interface, but with [async support if you need it](https://www.python-httpx.org/async/). +* Ability to make requests directly to [WSGI applications](https://www.python-httpx.org/advanced/transports/#wsgi-transport) or [ASGI applications](https://www.python-httpx.org/advanced/transports/#asgi-transport). +* Strict timeouts everywhere. +* Fully type annotated. +* 100% test coverage. + +Plus all the standard features of `requests`... + +* International Domains and URLs +* Keep-Alive & Connection Pooling +* Sessions with Cookie Persistence +* Browser-style SSL Verification +* Basic/Digest Authentication +* Elegant Key/Value Cookies +* Automatic Decompression +* Automatic Content Decoding +* Unicode Response Bodies +* Multipart File Uploads +* HTTP(S) Proxy Support +* Connection Timeouts +* Streaming Downloads +* .netrc Support +* Chunked Requests + +## Installation + +Install with pip: + +```shell +$ pip install httpx +``` + +Or, to include the optional HTTP/2 support, use: + +```shell +$ pip install httpx[http2] +``` + +HTTPX requires Python 3.8+. + +## Documentation + +Project documentation is available at [https://www.python-httpx.org/](https://www.python-httpx.org/). + +For a run-through of all the basics, head over to the [QuickStart](https://www.python-httpx.org/quickstart/). + +For more advanced topics, see the [Advanced Usage](https://www.python-httpx.org/advanced/) section, the [async support](https://www.python-httpx.org/async/) section, or the [HTTP/2](https://www.python-httpx.org/http2/) section. + +The [Developer Interface](https://www.python-httpx.org/api/) provides a comprehensive API reference. + +To find out about tools that integrate with HTTPX, see [Third Party Packages](https://www.python-httpx.org/third_party_packages/). + +## Contribute + +If you want to contribute with HTTPX check out the [Contributing Guide](https://www.python-httpx.org/contributing/) to learn how to start. + +## Dependencies + +The HTTPX project relies on these excellent libraries: + +* `httpcore` - The underlying transport implementation for `httpx`. + * `h11` - HTTP/1.1 support. +* `certifi` - SSL certificates. +* `idna` - Internationalized domain name support. +* `sniffio` - Async library autodetection. + +As well as these optional installs: + +* `h2` - HTTP/2 support. *(Optional, with `httpx[http2]`)* +* `socksio` - SOCKS proxy support. *(Optional, with `httpx[socks]`)* +* `rich` - Rich terminal support. *(Optional, with `httpx[cli]`)* +* `click` - Command line client support. *(Optional, with `httpx[cli]`)* +* `brotli` or `brotlicffi` - Decoding for "brotli" compressed responses. *(Optional, with `httpx[brotli]`)* +* `zstandard` - Decoding for "zstd" compressed responses. *(Optional, with `httpx[zstd]`)* + +A huge amount of credit is due to `requests` for the API layout that +much of this work follows, as well as to `urllib3` for plenty of design +inspiration around the lower-level networking details. + +--- + +

HTTPX is BSD licensed code.
Designed & crafted with care.

— 🦋 —

+ +## Release Information + +### Fixed + +* Reintroduced supposedly-private `URLTypes` shortcut. (#2673) + + +--- + +[Full changelog](https://github.com/encode/httpx/blob/master/CHANGELOG.md) diff --git a/.venv/lib/python3.10/site-packages/httpx-0.28.1.dist-info/RECORD b/.venv/lib/python3.10/site-packages/httpx-0.28.1.dist-info/RECORD new file mode 100644 index 0000000..6a45bb9 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpx-0.28.1.dist-info/RECORD @@ -0,0 +1,54 @@ +../../../bin/httpx,sha256=HtE632UzWio8Nhq-6ZBs4nzSZzIGDCyYChz4Fs2Gezo,177 +httpx-0.28.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +httpx-0.28.1.dist-info/METADATA,sha256=_rubD48-gNV8gZnDBPNcQzboWB0dGNeYPJJ2a4J5OyU,7052 +httpx-0.28.1.dist-info/RECORD,, +httpx-0.28.1.dist-info/WHEEL,sha256=C2FUgwZgiLbznR-k0b_5k3Ai_1aASOXDss3lzCUsUug,87 +httpx-0.28.1.dist-info/entry_points.txt,sha256=2lVkdQmxLA1pNMgSN2eV89o90HCZezhmNwsy6ryKDSA,37 +httpx-0.28.1.dist-info/licenses/LICENSE.md,sha256=TsWdVE8StfU5o6cW_TIaxYzNgDC0ZSIfLIgCAM3yjY0,1508 +httpx/__init__.py,sha256=CsaZe6yZj0rHg6322AWKWHGTMVr9txgEfD5P3_Rrz60,2171 +httpx/__pycache__/__init__.cpython-310.pyc,, +httpx/__pycache__/__version__.cpython-310.pyc,, +httpx/__pycache__/_api.cpython-310.pyc,, +httpx/__pycache__/_auth.cpython-310.pyc,, +httpx/__pycache__/_client.cpython-310.pyc,, +httpx/__pycache__/_config.cpython-310.pyc,, +httpx/__pycache__/_content.cpython-310.pyc,, +httpx/__pycache__/_decoders.cpython-310.pyc,, +httpx/__pycache__/_exceptions.cpython-310.pyc,, +httpx/__pycache__/_main.cpython-310.pyc,, +httpx/__pycache__/_models.cpython-310.pyc,, +httpx/__pycache__/_multipart.cpython-310.pyc,, +httpx/__pycache__/_status_codes.cpython-310.pyc,, +httpx/__pycache__/_types.cpython-310.pyc,, +httpx/__pycache__/_urlparse.cpython-310.pyc,, +httpx/__pycache__/_urls.cpython-310.pyc,, +httpx/__pycache__/_utils.cpython-310.pyc,, +httpx/__version__.py,sha256=LoUyYeOXTieGzuP_64UL0wxdtxjuu_QbOvE7NOg-IqU,108 +httpx/_api.py,sha256=r_Zgs4jIpcPJLqK5dbbSayqo_iVMKFaxZCd-oOHxLEs,11743 +httpx/_auth.py,sha256=Yr3QwaUSK17rGYx-7j-FdicFIzz4Y9FFV-1F4-7RXX4,11891 +httpx/_client.py,sha256=xD-UG67-WMkeltAAOeGGj-cZ2RRTAm19sWRxlFY7_40,65714 +httpx/_config.py,sha256=pPp2U-wicfcKsF-KYRE1LYdt3e6ERGeIoXZ8Gjo3LWc,8547 +httpx/_content.py,sha256=LGGzrJTR3OvN4Mb1GVVNLXkXJH-6oKlwAttO9p5w_yg,8161 +httpx/_decoders.py,sha256=p0dX8I0NEHexs3UGp4SsZutiMhsXrrWl6-GnqVb0iKM,12041 +httpx/_exceptions.py,sha256=bxW7fxzgVMAdNTbwT0Vnq04gJDW1_gI_GFiQPuMyjL0,8527 +httpx/_main.py,sha256=Cg9GMabiTT_swaDfUgIRitSwxLRMSwUDOm7LdSGqlA4,15626 +httpx/_models.py,sha256=4__Guyv1gLxuZChwim8kfQNiIOcJ9acreFOSurvZfms,44700 +httpx/_multipart.py,sha256=KOHEZZl6oohg9mPaKyyu345qq1rJLg35TUG3YAzXB3Y,9843 +httpx/_status_codes.py,sha256=DYn-2ufBgMeXy5s8x3_TB7wjAuAAMewTakPrm5rXEsc,5639 +httpx/_transports/__init__.py,sha256=GbUoBSAOp7z-l-9j5YhMhR3DMIcn6FVLhj072O3Nnno,275 +httpx/_transports/__pycache__/__init__.cpython-310.pyc,, +httpx/_transports/__pycache__/asgi.cpython-310.pyc,, +httpx/_transports/__pycache__/base.cpython-310.pyc,, +httpx/_transports/__pycache__/default.cpython-310.pyc,, +httpx/_transports/__pycache__/mock.cpython-310.pyc,, +httpx/_transports/__pycache__/wsgi.cpython-310.pyc,, +httpx/_transports/asgi.py,sha256=HRfiDYMPt4wQH2gFgHZg4c-i3sblo6bL5GTqcET-xz8,5501 +httpx/_transports/base.py,sha256=kZS_VMbViYfF570pogUCJ1bulz-ybfL51Pqs9yktebU,2523 +httpx/_transports/default.py,sha256=AzeaRUyVwCccTyyNJexDf0n1dFfzzydpdIQgvw7PLnk,13983 +httpx/_transports/mock.py,sha256=PTo0d567RITXxGrki6kN7_67wwAxfwiMDcuXJiZCjEo,1232 +httpx/_transports/wsgi.py,sha256=NcPX3Xap_EwCFZWO_OaSyQNuInCYx1QMNbO8GAei6jY,4825 +httpx/_types.py,sha256=Jyh41GQq7AOev8IOWKDAg7zCbvHAfufmW5g_PiTtErY,2965 +httpx/_urlparse.py,sha256=ZAmH47ONfkxrrj-PPYhGeiHjb6AjKCS-ANWIN4OL_KY,18546 +httpx/_urls.py,sha256=dX99VR1DSOHpgo9Aq7PzYO4FKdxqKjwyNp8grf8dHN0,21550 +httpx/_utils.py,sha256=_TVeqAKvxJkKHdz7dFeb4s0LZqQXgeFkXSgfiHBK_1o,8285 +httpx/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/.venv/lib/python3.10/site-packages/httpx-0.28.1.dist-info/WHEEL b/.venv/lib/python3.10/site-packages/httpx-0.28.1.dist-info/WHEEL new file mode 100644 index 0000000..21aaa72 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpx-0.28.1.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: hatchling 1.26.3 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/.venv/lib/python3.10/site-packages/httpx-0.28.1.dist-info/entry_points.txt b/.venv/lib/python3.10/site-packages/httpx-0.28.1.dist-info/entry_points.txt new file mode 100644 index 0000000..8ae9600 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpx-0.28.1.dist-info/entry_points.txt @@ -0,0 +1,2 @@ +[console_scripts] +httpx = httpx:main diff --git a/.venv/lib/python3.10/site-packages/httpx-0.28.1.dist-info/licenses/LICENSE.md b/.venv/lib/python3.10/site-packages/httpx-0.28.1.dist-info/licenses/LICENSE.md new file mode 100644 index 0000000..ab79d16 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpx-0.28.1.dist-info/licenses/LICENSE.md @@ -0,0 +1,12 @@ +Copyright © 2019, [Encode OSS Ltd](https://www.encode.io/). +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +* Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/.venv/lib/python3.10/site-packages/httpx/__init__.py b/.venv/lib/python3.10/site-packages/httpx/__init__.py new file mode 100644 index 0000000..e9addde --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpx/__init__.py @@ -0,0 +1,105 @@ +from .__version__ import __description__, __title__, __version__ +from ._api import * +from ._auth import * +from ._client import * +from ._config import * +from ._content import * +from ._exceptions import * +from ._models import * +from ._status_codes import * +from ._transports import * +from ._types import * +from ._urls import * + +try: + from ._main import main +except ImportError: # pragma: no cover + + def main() -> None: # type: ignore + import sys + + print( + "The httpx command line client could not run because the required " + "dependencies were not installed.\nMake sure you've installed " + "everything with: pip install 'httpx[cli]'" + ) + sys.exit(1) + + +__all__ = [ + "__description__", + "__title__", + "__version__", + "ASGITransport", + "AsyncBaseTransport", + "AsyncByteStream", + "AsyncClient", + "AsyncHTTPTransport", + "Auth", + "BaseTransport", + "BasicAuth", + "ByteStream", + "Client", + "CloseError", + "codes", + "ConnectError", + "ConnectTimeout", + "CookieConflict", + "Cookies", + "create_ssl_context", + "DecodingError", + "delete", + "DigestAuth", + "get", + "head", + "Headers", + "HTTPError", + "HTTPStatusError", + "HTTPTransport", + "InvalidURL", + "Limits", + "LocalProtocolError", + "main", + "MockTransport", + "NetRCAuth", + "NetworkError", + "options", + "patch", + "PoolTimeout", + "post", + "ProtocolError", + "Proxy", + "ProxyError", + "put", + "QueryParams", + "ReadError", + "ReadTimeout", + "RemoteProtocolError", + "request", + "Request", + "RequestError", + "RequestNotRead", + "Response", + "ResponseNotRead", + "stream", + "StreamClosed", + "StreamConsumed", + "StreamError", + "SyncByteStream", + "Timeout", + "TimeoutException", + "TooManyRedirects", + "TransportError", + "UnsupportedProtocol", + "URL", + "USE_CLIENT_DEFAULT", + "WriteError", + "WriteTimeout", + "WSGITransport", +] + + +__locals = locals() +for __name in __all__: + if not __name.startswith("__"): + setattr(__locals[__name], "__module__", "httpx") # noqa diff --git a/.venv/lib/python3.10/site-packages/httpx/__pycache__/__init__.cpython-310.pyc b/.venv/lib/python3.10/site-packages/httpx/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..924689dbf145fcfa91041e4926f0d6e5c9932995 GIT binary patch literal 1884 zcmZuxOK&7K5Vm{XkDkdU0mKFMEgB>;yW)lrBAWy@QWAy9gor^atJAK{m~`8{wmZoz zAR&bxvdaO9zrioy>?`81e}Dsrh3dy78;NeU>*4lS4_B4){Vu`hufKm6-?s_*GZ)@| zP)9z;&-{T4C!EG4p);CzGcO@CLUWxL*QO<{SF};lW<^^SZCA8Y(QZY17428lpOP1C zM6ShyWH=jAa!TZ&PGDuRPthh??eivY{al|7zaf%dk#oY^ztGtOSiK>$HF&T?o(^a0 zu>SHL-g!k0z`L*p>+ciZ<-MC4CC|U+jbk$MUsDWgRC7bdIG9L_)CwgTa~;O4urVOp zW9$;NDfA=i=!dw}lTb+4)L=6$4lbHNSEalz}rQ`?l(&M#P z$Z>)`)DK_dPvpg~(>VllYt!o>Qb`g@9>hXI5XAzdMO_y2Kq?#POa^BVg_(iC;u#Ik zGogV898!=RWF)`@SD>NzT}WfYI0nAiJqRx#Fd1$vRJL&m!R=lE7~;atg**?ggq?p9 zq#|8z2OEW3-=Zf^H*}S;npqgvNVSmG)!|y$5!D@x<2R!FNd7q(&s73r;Nw)Q?;x^f zY_hXw>Uz9+3G#9ri?eZx7M1*X^U=ex5f(m5!{{PB2Qx10jTsYCSjINfg>E9|Dt;y} z*EaP$kJkSkGz$G_S9_?{dDe9u7w2ysf4Mi+p){$|)~#-tg^V7D2JUpjQn#>hY&C?5 z>lKRaBHPu8C)4TC-HG~EX6Meo57R+WM8!_`@f}#R!s%|u%D}GHO1nm+u*O_}TSUPO%5?waNQk& zNwkGiwR6DxnM253>j|z{$gY#eRUR4U?6D1PW=e&BKj!Y9ybNQ(PbT}Wxi1o7(UW}@ zh4GPARz)f@& ziYXBWm2{|Vj^)}Dz*>?9+;GV)x0Y(ydLk$rM2{R zrDArkBPf#OR;EfFgmN(fj!lkjdEmg+uq;XJ)E+g z-7mII_NT6Us7=vN(6`vTAW!^cXCoGq{fiAU4itIHs@+@wdE7ddx1{*SIFLixia& zmTCO8!Sd-_)?9Bd$s;f0X)%VA4*hP%d5Ib{$||nOm<$u_4YZ=I$!DBv89U^9^$f&bLanF&s(8=I`F(VZNItKrd_&1y`SoD{sRL{bU*+A literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/httpx/__pycache__/__version__.cpython-310.pyc b/.venv/lib/python3.10/site-packages/httpx/__pycache__/__version__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e739aa49dda06cdd45aed89671671380cc6f1f2f GIT binary patch literal 288 zcmYjMu};G<5VhO1DxeBJ!E2>rw{&4Z2sS1ZiB4IpG`=>5)VAzvl=hGK4L&0);ujd0 za5D8t_fGFgclXXtr1)bNeWl6F)gy5=;0 zW(FE$J22pL)Yh<<^*UumrNQ8wZLMeN5zFYW_-VZ0clUhxIvchZQliERq-?LHR1gZU zT{j<%D=BO6p%6e iUVP*`2%--x&Q^1GY$p$Us}2=BcK?QPq=Y1NLjM7IS5wvi literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/httpx/__pycache__/_api.cpython-310.pyc b/.venv/lib/python3.10/site-packages/httpx/__pycache__/_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b62114b0d71255d81e0035b2ca5161bd6a4a37b6 GIT binary patch literal 7663 zcmd5>Npl;=6$S<%021J)h1x8+B{`vhkOU=JUTB#T#YLo~kc07uczPZ zw|+gey1Tm~@cGw^ziNLUjzs>6gYc&p2G=8zsQr&+$08)d=tUbF_GZE3JPb#nU_kf8F18 z^GQC;N4`!JPl|Z!I*Uk?GJhZTdS_4i75)Lx zPwz?pkbea9Ga-5)eZc2qka>oW@lRmgyZf%Y%0Gp5Y~OX`{2Ht~8(Np9Q)T#dIM+=+ z!EXTl99Nbi+1c;W`q`+PR!!4#R7bN+dmhF;70YzQremn4x+>)N;10MfF{x|9bf7md zH9a$N?@pmqnEUng!o5Oia$$aE?j}%DcZFSrZA7-y?VPANYlW?ULCBr?Te8tCsD!v1-k6lhWhoCTvFv z)tD({yWK<;1+v{FX$7Q+b7bGKLVV*7ZOe3%xU-P72oGwzaTN{^Ebw%0((#0I`&KMn zw>C;ra7~JeW4noUA+?n)x6_d|+bIci-Ax$6S+lqs10md4P3o^Y;V`VuU@T98EnW?@ zC<rNIbezX#wpt(hh|b7!b}N;c!@)0p(q!^gCNs&0HOsFt>tvMq7of7!b}9 zA!O@-a1IH54Sxux&*OA|(*uI}_h4T3Ve<=U-1xF(>GGGj_>^tyBTGwn$Rjo#cmR|F zEv*>D#R(~#nlxn+1{DPw{B*+?_ru>wOmPM1IFWj)-c|3er|UgD`c22T$G+^X_dbl) zBlT!KR*%;^>WR8iPu4r@8LoWO^;txL1Q?IRBVWa$k)_DRh<$zo(j)$T4qqOFpo*(K zz`2XTXGxgcW~#|%3x!4IyVgh-(Q-L*b8t;*kL7ayB+KPI+vjp@*n7+yvlUA+XH76u zY_PI#t1`2eAA%E&vGUF7LV1Xl7ZwY13-e3mA>vVBWU5A}`+aekKZ&voH@^ zmZzrgOc$ohBc4#eAKZ= zU$*!b?YbsN0N+F;((;xgY*dlTu*)>Cl`${DS0=Syb`oi*UyWP>?uH!io97Ur1^2};$q$Lg{UHXx5{=K%r8 zw}=s12^_WI?idLZ8mvEr|7XA?G4Q~U}Q7kj_0y}X2$H0*RIH>2vd_p~nuBX+*MD6znnnrS<#ms{x6<(=iF$(>c8I$K7-zj=s8+1}+GyXc~3 z1ENAdheEGO%QV1;i1WG%QAVo6th>WTjgoPfDjU`dtN|X*Dto2l9_~Bl^~>clZ8<(Z z&NQQHNr$aDPIa>}Dg9^JrygO%57rBVP)7!b*dQ*q$MSjnUDnJIORnYtKn-TwwxEft zfiUd;rO{EgaQneH%?E;PcSuAA63ac6aY+Rp%k_4bynwSgY!JRk#3>RniA4B8ct;!mGLbnq`Q* z;CYBiEVXvtt}U-voB5G-FkoKSmh;su0Bh#uk&B~w8&b<~RjoV%TiB$$&3s9%Y9rMx zk`-Clcv9t>5)J+m|5Xz4#weJ@-}sC7Uea@~PWTvX&M!ju1BE}>fpGd^YeYB|L^ywh z&L7$_&gIu*oNv=#_SO4-3uxxE5Y{pK0P9=`W1TP+aZl?Q)?W{=_ps69XXFO$zo;l&W00aA?nst2Z0?xa7e0DO+0UJmKls(z}y&0So<*3Y7WFR>}LqWg1Qe| zSP3U-FKSxl5hM}m zoc9EV)x$x6*|eej2uvYAhNj`UCt;B7{}DY`j=_#@Dqu|R>or%AIr94*eC-dQQGTzS zZu;5Y{+D>6q*Ku|&w5@e$#XAhkL}J-K(@qFGn5+9U5Nra{B*(>Up@r*`zZ#v1Fske zYby=3odiVQ30OM~NILfT-@ZKvMtdN)i7SW}hS9IL>bwOYj{FM!sf-8>p)o-w>>vax z16b#*>;uMf7`v)ahvAOQ)OA(UF;5eFte3vPGW=gArxRoVfZ(kn!*N0 z`|9&QJH4AOYk_<}XI<_P^x%q&<8%9H@d)VcMMH}?+V0-9p1(;@Gz@{srw6`RCc%c$ zr}#!;uOtL72GaFRy&IBIFD0YfJIzIR>bEf$-iO>cJ}z$pe{!kqo`V3O{qt?BR~`cf zCm{zvMbx7VgrmN_pLim1{hsQQvp|JBaH~ZT@KWKe^$>$s5=}M8Tfm|9498(^63!rR zBN0dYN_eM5LVDlv)-rZ1;`94RIRJ9$4JmPy-LF(ql|&bmhzlEsYAu!a9;GscFQyu$ z^2yF4`>%E0=FGIwPneopL_K&yNqA2-Q%d$g6?3QBTfOZNnBq@pN6O-E6 z1?R|35WA7Dcyk}(FbU1iTf$FK!hu~i$M6IP&3gm;&8y9nlPI&g=TF(f2Q-sP9>);OZ~L^9#g z3=95~Vw1nQi4yD~Y?%U*#C#xXY^7h>PP54KLtpmdnyyyZc@m5cl4T7bFr6fWDs!mh@B<5F%!5Io)0%UmEaZ^`8 z*qScJA&w*VGiWlAl#+>N@EaY9X3_~I6-~vI{`Mm1&Gh`B6qJs=sC_>uS6XR3&y~Tq UoeQ4pd7=yj{np<%r5$?yKce7FL;wH) literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/httpx/__pycache__/_auth.cpython-310.pyc b/.venv/lib/python3.10/site-packages/httpx/__pycache__/_auth.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c702118e0505e4ebdfe690fb267a5237dad530e9 GIT binary patch literal 10583 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 Hbh`Y1iQ^gM literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/httpx/__pycache__/_client.cpython-310.pyc b/.venv/lib/python3.10/site-packages/httpx/__pycache__/_client.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..471867a378d3d5419b36c40fa67d5db2fdfa5b78 GIT binary patch literal 41467 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/httpx/__pycache__/_config.cpython-310.pyc b/.venv/lib/python3.10/site-packages/httpx/__pycache__/_config.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1676c067a6ac0324c6fff9eb5cde3ce59eff86fe GIT binary patch literal 7109 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 LOQp+YocI49n5oSc literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/httpx/__pycache__/_content.cpython-310.pyc b/.venv/lib/python3.10/site-packages/httpx/__pycache__/_content.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..29906523d906c4e36de07cd61726aaa0ac7272d2 GIT binary patch literal 7314 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/httpx/__pycache__/_decoders.cpython-310.pyc b/.venv/lib/python3.10/site-packages/httpx/__pycache__/_decoders.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..19715c9cb4f18b859cda71f9e0c585dc5a0d50f4 GIT binary patch literal 10831 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 PW&bLbW}GgsTlfAKh?fUH literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/httpx/__pycache__/_exceptions.cpython-310.pyc b/.venv/lib/python3.10/site-packages/httpx/__pycache__/_exceptions.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..edbb1b4fcf997c3cf340ec5696bf135eef5ad6bd GIT binary patch literal 10365 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/httpx/__pycache__/_main.cpython-310.pyc b/.venv/lib/python3.10/site-packages/httpx/__pycache__/_main.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..885b9aabb4f28f33047b4cb8b75a857415b42b8a GIT binary patch literal 12426 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 z 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 b;yX&Y{Jrb@67Plm{=I{l#Cy%ZJ0AW2;)w@x literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/httpx/__pycache__/_multipart.cpython-310.pyc b/.venv/lib/python3.10/site-packages/httpx/__pycache__/_multipart.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..011b7174c032a1bee0b01a45a610542487d9f10f GIT binary patch literal 8980 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/httpx/__pycache__/_urlparse.cpython-310.pyc b/.venv/lib/python3.10/site-packages/httpx/__pycache__/_urlparse.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..014442d09b10578943d45be7dd4ac41a13a24ebb GIT binary patch literal 11044 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 Nr?Z)#;lBqC{Xbfq5G4Qr literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/httpx/__pycache__/_utils.cpython-310.pyc b/.venv/lib/python3.10/site-packages/httpx/__pycache__/_utils.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..56e13c35faa94d27223c7917fd0751c8bf184407 GIT binary patch literal 6712 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/httpx/__version__.py b/.venv/lib/python3.10/site-packages/httpx/__version__.py new file mode 100644 index 0000000..801bfac --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpx/__version__.py @@ -0,0 +1,3 @@ +__title__ = "httpx" +__description__ = "A next generation HTTP client, for Python 3." +__version__ = "0.28.1" diff --git a/.venv/lib/python3.10/site-packages/httpx/_api.py b/.venv/lib/python3.10/site-packages/httpx/_api.py new file mode 100644 index 0000000..c3cda1e --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpx/_api.py @@ -0,0 +1,438 @@ +from __future__ import annotations + +import typing +from contextlib import contextmanager + +from ._client import Client +from ._config import DEFAULT_TIMEOUT_CONFIG +from ._models import Response +from ._types import ( + AuthTypes, + CookieTypes, + HeaderTypes, + ProxyTypes, + QueryParamTypes, + RequestContent, + RequestData, + RequestFiles, + TimeoutTypes, +) +from ._urls import URL + +if typing.TYPE_CHECKING: + import ssl # pragma: no cover + + +__all__ = [ + "delete", + "get", + "head", + "options", + "patch", + "post", + "put", + "request", + "stream", +] + + +def request( + method: str, + url: URL | str, + *, + params: QueryParamTypes | None = None, + content: RequestContent | None = None, + data: RequestData | None = None, + files: RequestFiles | None = None, + json: typing.Any | None = None, + headers: HeaderTypes | None = None, + cookies: CookieTypes | None = None, + auth: AuthTypes | None = None, + proxy: ProxyTypes | None = None, + timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG, + follow_redirects: bool = False, + verify: ssl.SSLContext | str | bool = True, + trust_env: bool = True, +) -> Response: + """ + Sends an HTTP request. + + **Parameters:** + + * **method** - HTTP method for the new `Request` object: `GET`, `OPTIONS`, + `HEAD`, `POST`, `PUT`, `PATCH`, or `DELETE`. + * **url** - URL for the new `Request` object. + * **params** - *(optional)* Query parameters to include in the URL, as a + string, dictionary, or sequence of two-tuples. + * **content** - *(optional)* Binary content to include in the body of the + request, as bytes or a byte iterator. + * **data** - *(optional)* Form data to include in the body of the request, + as a dictionary. + * **files** - *(optional)* A dictionary of upload files to include in the + body of the request. + * **json** - *(optional)* A JSON serializable object to include in the body + of the request. + * **headers** - *(optional)* Dictionary of HTTP headers to include in the + request. + * **cookies** - *(optional)* Dictionary of Cookie items to include in the + request. + * **auth** - *(optional)* An authentication class to use when sending the + request. + * **proxy** - *(optional)* A proxy URL where all the traffic should be routed. + * **timeout** - *(optional)* The timeout configuration to use when sending + the request. + * **follow_redirects** - *(optional)* Enables or disables HTTP redirects. + * **verify** - *(optional)* Either `True` to use an SSL context with the + default CA bundle, `False` to disable verification, or an instance of + `ssl.SSLContext` to use a custom context. + * **trust_env** - *(optional)* Enables or disables usage of environment + variables for configuration. + + **Returns:** `Response` + + Usage: + + ``` + >>> import httpx + >>> response = httpx.request('GET', 'https://httpbin.org/get') + >>> response + + ``` + """ + with Client( + cookies=cookies, + proxy=proxy, + verify=verify, + timeout=timeout, + trust_env=trust_env, + ) as client: + return client.request( + method=method, + url=url, + content=content, + data=data, + files=files, + json=json, + params=params, + headers=headers, + auth=auth, + follow_redirects=follow_redirects, + ) + + +@contextmanager +def stream( + method: str, + url: URL | str, + *, + params: QueryParamTypes | None = None, + content: RequestContent | None = None, + data: RequestData | None = None, + files: RequestFiles | None = None, + json: typing.Any | None = None, + headers: HeaderTypes | None = None, + cookies: CookieTypes | None = None, + auth: AuthTypes | None = None, + proxy: ProxyTypes | None = None, + timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG, + follow_redirects: bool = False, + verify: ssl.SSLContext | str | bool = True, + trust_env: bool = True, +) -> typing.Iterator[Response]: + """ + Alternative to `httpx.request()` that streams the response body + instead of loading it into memory at once. + + **Parameters**: See `httpx.request`. + + See also: [Streaming Responses][0] + + [0]: /quickstart#streaming-responses + """ + with Client( + cookies=cookies, + proxy=proxy, + verify=verify, + timeout=timeout, + trust_env=trust_env, + ) as client: + with client.stream( + method=method, + url=url, + content=content, + data=data, + files=files, + json=json, + params=params, + headers=headers, + auth=auth, + follow_redirects=follow_redirects, + ) as response: + yield response + + +def get( + url: URL | str, + *, + params: QueryParamTypes | None = None, + headers: HeaderTypes | None = None, + cookies: CookieTypes | None = None, + auth: AuthTypes | None = None, + proxy: ProxyTypes | None = None, + follow_redirects: bool = False, + verify: ssl.SSLContext | str | bool = True, + timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG, + trust_env: bool = True, +) -> Response: + """ + Sends a `GET` request. + + **Parameters**: See `httpx.request`. + + Note that the `data`, `files`, `json` and `content` parameters are not available + on this function, as `GET` requests should not include a request body. + """ + return request( + "GET", + url, + params=params, + headers=headers, + cookies=cookies, + auth=auth, + proxy=proxy, + follow_redirects=follow_redirects, + verify=verify, + timeout=timeout, + trust_env=trust_env, + ) + + +def options( + url: URL | str, + *, + params: QueryParamTypes | None = None, + headers: HeaderTypes | None = None, + cookies: CookieTypes | None = None, + auth: AuthTypes | None = None, + proxy: ProxyTypes | None = None, + follow_redirects: bool = False, + verify: ssl.SSLContext | str | bool = True, + timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG, + trust_env: bool = True, +) -> Response: + """ + Sends an `OPTIONS` request. + + **Parameters**: See `httpx.request`. + + Note that the `data`, `files`, `json` and `content` parameters are not available + on this function, as `OPTIONS` requests should not include a request body. + """ + return request( + "OPTIONS", + url, + params=params, + headers=headers, + cookies=cookies, + auth=auth, + proxy=proxy, + follow_redirects=follow_redirects, + verify=verify, + timeout=timeout, + trust_env=trust_env, + ) + + +def head( + url: URL | str, + *, + params: QueryParamTypes | None = None, + headers: HeaderTypes | None = None, + cookies: CookieTypes | None = None, + auth: AuthTypes | None = None, + proxy: ProxyTypes | None = None, + follow_redirects: bool = False, + verify: ssl.SSLContext | str | bool = True, + timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG, + trust_env: bool = True, +) -> Response: + """ + Sends a `HEAD` request. + + **Parameters**: See `httpx.request`. + + Note that the `data`, `files`, `json` and `content` parameters are not available + on this function, as `HEAD` requests should not include a request body. + """ + return request( + "HEAD", + url, + params=params, + headers=headers, + cookies=cookies, + auth=auth, + proxy=proxy, + follow_redirects=follow_redirects, + verify=verify, + timeout=timeout, + trust_env=trust_env, + ) + + +def post( + url: URL | str, + *, + content: RequestContent | None = None, + data: RequestData | None = None, + files: RequestFiles | None = None, + json: typing.Any | None = None, + params: QueryParamTypes | None = None, + headers: HeaderTypes | None = None, + cookies: CookieTypes | None = None, + auth: AuthTypes | None = None, + proxy: ProxyTypes | None = None, + follow_redirects: bool = False, + verify: ssl.SSLContext | str | bool = True, + timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG, + trust_env: bool = True, +) -> Response: + """ + Sends a `POST` request. + + **Parameters**: See `httpx.request`. + """ + return request( + "POST", + url, + content=content, + data=data, + files=files, + json=json, + params=params, + headers=headers, + cookies=cookies, + auth=auth, + proxy=proxy, + follow_redirects=follow_redirects, + verify=verify, + timeout=timeout, + trust_env=trust_env, + ) + + +def put( + url: URL | str, + *, + content: RequestContent | None = None, + data: RequestData | None = None, + files: RequestFiles | None = None, + json: typing.Any | None = None, + params: QueryParamTypes | None = None, + headers: HeaderTypes | None = None, + cookies: CookieTypes | None = None, + auth: AuthTypes | None = None, + proxy: ProxyTypes | None = None, + follow_redirects: bool = False, + verify: ssl.SSLContext | str | bool = True, + timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG, + trust_env: bool = True, +) -> Response: + """ + Sends a `PUT` request. + + **Parameters**: See `httpx.request`. + """ + return request( + "PUT", + url, + content=content, + data=data, + files=files, + json=json, + params=params, + headers=headers, + cookies=cookies, + auth=auth, + proxy=proxy, + follow_redirects=follow_redirects, + verify=verify, + timeout=timeout, + trust_env=trust_env, + ) + + +def patch( + url: URL | str, + *, + content: RequestContent | None = None, + data: RequestData | None = None, + files: RequestFiles | None = None, + json: typing.Any | None = None, + params: QueryParamTypes | None = None, + headers: HeaderTypes | None = None, + cookies: CookieTypes | None = None, + auth: AuthTypes | None = None, + proxy: ProxyTypes | None = None, + follow_redirects: bool = False, + verify: ssl.SSLContext | str | bool = True, + timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG, + trust_env: bool = True, +) -> Response: + """ + Sends a `PATCH` request. + + **Parameters**: See `httpx.request`. + """ + return request( + "PATCH", + url, + content=content, + data=data, + files=files, + json=json, + params=params, + headers=headers, + cookies=cookies, + auth=auth, + proxy=proxy, + follow_redirects=follow_redirects, + verify=verify, + timeout=timeout, + trust_env=trust_env, + ) + + +def delete( + url: URL | str, + *, + params: QueryParamTypes | None = None, + headers: HeaderTypes | None = None, + cookies: CookieTypes | None = None, + auth: AuthTypes | None = None, + proxy: ProxyTypes | None = None, + follow_redirects: bool = False, + timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG, + verify: ssl.SSLContext | str | bool = True, + trust_env: bool = True, +) -> Response: + """ + Sends a `DELETE` request. + + **Parameters**: See `httpx.request`. + + Note that the `data`, `files`, `json` and `content` parameters are not available + on this function, as `DELETE` requests should not include a request body. + """ + return request( + "DELETE", + url, + params=params, + headers=headers, + cookies=cookies, + auth=auth, + proxy=proxy, + follow_redirects=follow_redirects, + verify=verify, + timeout=timeout, + trust_env=trust_env, + ) diff --git a/.venv/lib/python3.10/site-packages/httpx/_auth.py b/.venv/lib/python3.10/site-packages/httpx/_auth.py new file mode 100644 index 0000000..b03971a --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpx/_auth.py @@ -0,0 +1,348 @@ +from __future__ import annotations + +import hashlib +import os +import re +import time +import typing +from base64 import b64encode +from urllib.request import parse_http_list + +from ._exceptions import ProtocolError +from ._models import Cookies, Request, Response +from ._utils import to_bytes, to_str, unquote + +if typing.TYPE_CHECKING: # pragma: no cover + from hashlib import _Hash + + +__all__ = ["Auth", "BasicAuth", "DigestAuth", "NetRCAuth"] + + +class Auth: + """ + Base class for all authentication schemes. + + To implement a custom authentication scheme, subclass `Auth` and override + the `.auth_flow()` method. + + If the authentication scheme does I/O such as disk access or network calls, or uses + synchronization primitives such as locks, you should override `.sync_auth_flow()` + and/or `.async_auth_flow()` instead of `.auth_flow()` to provide specialized + implementations that will be used by `Client` and `AsyncClient` respectively. + """ + + requires_request_body = False + requires_response_body = False + + def auth_flow(self, request: Request) -> typing.Generator[Request, Response, None]: + """ + Execute the authentication flow. + + To dispatch a request, `yield` it: + + ``` + yield request + ``` + + The client will `.send()` the response back into the flow generator. You can + access it like so: + + ``` + response = yield request + ``` + + A `return` (or reaching the end of the generator) will result in the + client returning the last response obtained from the server. + + You can dispatch as many requests as is necessary. + """ + yield request + + def sync_auth_flow( + self, request: Request + ) -> typing.Generator[Request, Response, None]: + """ + Execute the authentication flow synchronously. + + By default, this defers to `.auth_flow()`. You should override this method + when the authentication scheme does I/O and/or uses concurrency primitives. + """ + if self.requires_request_body: + request.read() + + flow = self.auth_flow(request) + request = next(flow) + + while True: + response = yield request + if self.requires_response_body: + response.read() + + try: + request = flow.send(response) + except StopIteration: + break + + async def async_auth_flow( + self, request: Request + ) -> typing.AsyncGenerator[Request, Response]: + """ + Execute the authentication flow asynchronously. + + By default, this defers to `.auth_flow()`. You should override this method + when the authentication scheme does I/O and/or uses concurrency primitives. + """ + if self.requires_request_body: + await request.aread() + + flow = self.auth_flow(request) + request = next(flow) + + while True: + response = yield request + if self.requires_response_body: + await response.aread() + + try: + request = flow.send(response) + except StopIteration: + break + + +class FunctionAuth(Auth): + """ + Allows the 'auth' argument to be passed as a simple callable function, + that takes the request, and returns a new, modified request. + """ + + def __init__(self, func: typing.Callable[[Request], Request]) -> None: + self._func = func + + def auth_flow(self, request: Request) -> typing.Generator[Request, Response, None]: + yield self._func(request) + + +class BasicAuth(Auth): + """ + Allows the 'auth' argument to be passed as a (username, password) pair, + and uses HTTP Basic authentication. + """ + + def __init__(self, username: str | bytes, password: str | bytes) -> None: + self._auth_header = self._build_auth_header(username, password) + + def auth_flow(self, request: Request) -> typing.Generator[Request, Response, None]: + request.headers["Authorization"] = self._auth_header + yield request + + def _build_auth_header(self, username: str | bytes, password: str | bytes) -> str: + userpass = b":".join((to_bytes(username), to_bytes(password))) + token = b64encode(userpass).decode() + return f"Basic {token}" + + +class NetRCAuth(Auth): + """ + Use a 'netrc' file to lookup basic auth credentials based on the url host. + """ + + def __init__(self, file: str | None = None) -> None: + # Lazily import 'netrc'. + # There's no need for us to load this module unless 'NetRCAuth' is being used. + import netrc + + self._netrc_info = netrc.netrc(file) + + def auth_flow(self, request: Request) -> typing.Generator[Request, Response, None]: + auth_info = self._netrc_info.authenticators(request.url.host) + if auth_info is None or not auth_info[2]: + # The netrc file did not have authentication credentials for this host. + yield request + else: + # Build a basic auth header with credentials from the netrc file. + request.headers["Authorization"] = self._build_auth_header( + username=auth_info[0], password=auth_info[2] + ) + yield request + + def _build_auth_header(self, username: str | bytes, password: str | bytes) -> str: + userpass = b":".join((to_bytes(username), to_bytes(password))) + token = b64encode(userpass).decode() + return f"Basic {token}" + + +class DigestAuth(Auth): + _ALGORITHM_TO_HASH_FUNCTION: dict[str, typing.Callable[[bytes], _Hash]] = { + "MD5": hashlib.md5, + "MD5-SESS": hashlib.md5, + "SHA": hashlib.sha1, + "SHA-SESS": hashlib.sha1, + "SHA-256": hashlib.sha256, + "SHA-256-SESS": hashlib.sha256, + "SHA-512": hashlib.sha512, + "SHA-512-SESS": hashlib.sha512, + } + + def __init__(self, username: str | bytes, password: str | bytes) -> None: + self._username = to_bytes(username) + self._password = to_bytes(password) + self._last_challenge: _DigestAuthChallenge | None = None + self._nonce_count = 1 + + def auth_flow(self, request: Request) -> typing.Generator[Request, Response, None]: + if self._last_challenge: + request.headers["Authorization"] = self._build_auth_header( + request, self._last_challenge + ) + + response = yield request + + if response.status_code != 401 or "www-authenticate" not in response.headers: + # If the response is not a 401 then we don't + # need to build an authenticated request. + return + + for auth_header in response.headers.get_list("www-authenticate"): + if auth_header.lower().startswith("digest "): + break + else: + # If the response does not include a 'WWW-Authenticate: Digest ...' + # header, then we don't need to build an authenticated request. + return + + self._last_challenge = self._parse_challenge(request, response, auth_header) + self._nonce_count = 1 + + request.headers["Authorization"] = self._build_auth_header( + request, self._last_challenge + ) + if response.cookies: + Cookies(response.cookies).set_cookie_header(request=request) + yield request + + def _parse_challenge( + self, request: Request, response: Response, auth_header: str + ) -> _DigestAuthChallenge: + """ + Returns a challenge from a Digest WWW-Authenticate header. + These take the form of: + `Digest realm="realm@host.com",qop="auth,auth-int",nonce="abc",opaque="xyz"` + """ + scheme, _, fields = auth_header.partition(" ") + + # This method should only ever have been called with a Digest auth header. + assert scheme.lower() == "digest" + + header_dict: dict[str, str] = {} + for field in parse_http_list(fields): + key, value = field.strip().split("=", 1) + header_dict[key] = unquote(value) + + try: + realm = header_dict["realm"].encode() + nonce = header_dict["nonce"].encode() + algorithm = header_dict.get("algorithm", "MD5") + opaque = header_dict["opaque"].encode() if "opaque" in header_dict else None + qop = header_dict["qop"].encode() if "qop" in header_dict else None + return _DigestAuthChallenge( + realm=realm, nonce=nonce, algorithm=algorithm, opaque=opaque, qop=qop + ) + except KeyError as exc: + message = "Malformed Digest WWW-Authenticate header" + raise ProtocolError(message, request=request) from exc + + def _build_auth_header( + self, request: Request, challenge: _DigestAuthChallenge + ) -> str: + hash_func = self._ALGORITHM_TO_HASH_FUNCTION[challenge.algorithm.upper()] + + def digest(data: bytes) -> bytes: + return hash_func(data).hexdigest().encode() + + A1 = b":".join((self._username, challenge.realm, self._password)) + + path = request.url.raw_path + A2 = b":".join((request.method.encode(), path)) + # TODO: implement auth-int + HA2 = digest(A2) + + nc_value = b"%08x" % self._nonce_count + cnonce = self._get_client_nonce(self._nonce_count, challenge.nonce) + self._nonce_count += 1 + + HA1 = digest(A1) + if challenge.algorithm.lower().endswith("-sess"): + HA1 = digest(b":".join((HA1, challenge.nonce, cnonce))) + + qop = self._resolve_qop(challenge.qop, request=request) + if qop is None: + # Following RFC 2069 + digest_data = [HA1, challenge.nonce, HA2] + else: + # Following RFC 2617/7616 + digest_data = [HA1, challenge.nonce, nc_value, cnonce, qop, HA2] + + format_args = { + "username": self._username, + "realm": challenge.realm, + "nonce": challenge.nonce, + "uri": path, + "response": digest(b":".join(digest_data)), + "algorithm": challenge.algorithm.encode(), + } + if challenge.opaque: + format_args["opaque"] = challenge.opaque + if qop: + format_args["qop"] = b"auth" + format_args["nc"] = nc_value + format_args["cnonce"] = cnonce + + return "Digest " + self._get_header_value(format_args) + + def _get_client_nonce(self, nonce_count: int, nonce: bytes) -> bytes: + s = str(nonce_count).encode() + s += nonce + s += time.ctime().encode() + s += os.urandom(8) + + return hashlib.sha1(s).hexdigest()[:16].encode() + + def _get_header_value(self, header_fields: dict[str, bytes]) -> str: + NON_QUOTED_FIELDS = ("algorithm", "qop", "nc") + QUOTED_TEMPLATE = '{}="{}"' + NON_QUOTED_TEMPLATE = "{}={}" + + header_value = "" + for i, (field, value) in enumerate(header_fields.items()): + if i > 0: + header_value += ", " + template = ( + QUOTED_TEMPLATE + if field not in NON_QUOTED_FIELDS + else NON_QUOTED_TEMPLATE + ) + header_value += template.format(field, to_str(value)) + + return header_value + + def _resolve_qop(self, qop: bytes | None, request: Request) -> bytes | None: + if qop is None: + return None + qops = re.split(b", ?", qop) + if b"auth" in qops: + return b"auth" + + if qops == [b"auth-int"]: + raise NotImplementedError("Digest auth-int support is not yet implemented") + + message = f'Unexpected qop value "{qop!r}" in digest auth' + raise ProtocolError(message, request=request) + + +class _DigestAuthChallenge(typing.NamedTuple): + realm: bytes + nonce: bytes + algorithm: str + opaque: bytes | None + qop: bytes | None diff --git a/.venv/lib/python3.10/site-packages/httpx/_client.py b/.venv/lib/python3.10/site-packages/httpx/_client.py new file mode 100644 index 0000000..2249231 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpx/_client.py @@ -0,0 +1,2019 @@ +from __future__ import annotations + +import datetime +import enum +import logging +import time +import typing +import warnings +from contextlib import asynccontextmanager, contextmanager +from types import TracebackType + +from .__version__ import __version__ +from ._auth import Auth, BasicAuth, FunctionAuth +from ._config import ( + DEFAULT_LIMITS, + DEFAULT_MAX_REDIRECTS, + DEFAULT_TIMEOUT_CONFIG, + Limits, + Proxy, + Timeout, +) +from ._decoders import SUPPORTED_DECODERS +from ._exceptions import ( + InvalidURL, + RemoteProtocolError, + TooManyRedirects, + request_context, +) +from ._models import Cookies, Headers, Request, Response +from ._status_codes import codes +from ._transports.base import AsyncBaseTransport, BaseTransport +from ._transports.default import AsyncHTTPTransport, HTTPTransport +from ._types import ( + AsyncByteStream, + AuthTypes, + CertTypes, + CookieTypes, + HeaderTypes, + ProxyTypes, + QueryParamTypes, + RequestContent, + RequestData, + RequestExtensions, + RequestFiles, + SyncByteStream, + TimeoutTypes, +) +from ._urls import URL, QueryParams +from ._utils import URLPattern, get_environment_proxies + +if typing.TYPE_CHECKING: + import ssl # pragma: no cover + +__all__ = ["USE_CLIENT_DEFAULT", "AsyncClient", "Client"] + +# The type annotation for @classmethod and context managers here follows PEP 484 +# https://www.python.org/dev/peps/pep-0484/#annotating-instance-and-class-methods +T = typing.TypeVar("T", bound="Client") +U = typing.TypeVar("U", bound="AsyncClient") + + +def _is_https_redirect(url: URL, location: URL) -> bool: + """ + Return 'True' if 'location' is a HTTPS upgrade of 'url' + """ + if url.host != location.host: + return False + + return ( + url.scheme == "http" + and _port_or_default(url) == 80 + and location.scheme == "https" + and _port_or_default(location) == 443 + ) + + +def _port_or_default(url: URL) -> int | None: + if url.port is not None: + return url.port + return {"http": 80, "https": 443}.get(url.scheme) + + +def _same_origin(url: URL, other: URL) -> bool: + """ + Return 'True' if the given URLs share the same origin. + """ + return ( + url.scheme == other.scheme + and url.host == other.host + and _port_or_default(url) == _port_or_default(other) + ) + + +class UseClientDefault: + """ + For some parameters such as `auth=...` and `timeout=...` we need to be able + to indicate the default "unset" state, in a way that is distinctly different + to using `None`. + + The default "unset" state indicates that whatever default is set on the + client should be used. This is different to setting `None`, which + explicitly disables the parameter, possibly overriding a client default. + + For example we use `timeout=USE_CLIENT_DEFAULT` in the `request()` signature. + Omitting the `timeout` parameter will send a request using whatever default + timeout has been configured on the client. Including `timeout=None` will + ensure no timeout is used. + + Note that user code shouldn't need to use the `USE_CLIENT_DEFAULT` constant, + but it is used internally when a parameter is not included. + """ + + +USE_CLIENT_DEFAULT = UseClientDefault() + + +logger = logging.getLogger("httpx") + +USER_AGENT = f"python-httpx/{__version__}" +ACCEPT_ENCODING = ", ".join( + [key for key in SUPPORTED_DECODERS.keys() if key != "identity"] +) + + +class ClientState(enum.Enum): + # UNOPENED: + # The client has been instantiated, but has not been used to send a request, + # or been opened by entering the context of a `with` block. + UNOPENED = 1 + # OPENED: + # The client has either sent a request, or is within a `with` block. + OPENED = 2 + # CLOSED: + # The client has either exited the `with` block, or `close()` has + # been called explicitly. + CLOSED = 3 + + +class BoundSyncStream(SyncByteStream): + """ + A byte stream that is bound to a given response instance, and that + ensures the `response.elapsed` is set once the response is closed. + """ + + def __init__( + self, stream: SyncByteStream, response: Response, start: float + ) -> None: + self._stream = stream + self._response = response + self._start = start + + def __iter__(self) -> typing.Iterator[bytes]: + for chunk in self._stream: + yield chunk + + def close(self) -> None: + elapsed = time.perf_counter() - self._start + self._response.elapsed = datetime.timedelta(seconds=elapsed) + self._stream.close() + + +class BoundAsyncStream(AsyncByteStream): + """ + An async byte stream that is bound to a given response instance, and that + ensures the `response.elapsed` is set once the response is closed. + """ + + def __init__( + self, stream: AsyncByteStream, response: Response, start: float + ) -> None: + self._stream = stream + self._response = response + self._start = start + + async def __aiter__(self) -> typing.AsyncIterator[bytes]: + async for chunk in self._stream: + yield chunk + + async def aclose(self) -> None: + elapsed = time.perf_counter() - self._start + self._response.elapsed = datetime.timedelta(seconds=elapsed) + await self._stream.aclose() + + +EventHook = typing.Callable[..., typing.Any] + + +class BaseClient: + def __init__( + self, + *, + auth: AuthTypes | None = None, + params: QueryParamTypes | None = None, + headers: HeaderTypes | None = None, + cookies: CookieTypes | None = None, + timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG, + follow_redirects: bool = False, + max_redirects: int = DEFAULT_MAX_REDIRECTS, + event_hooks: None | (typing.Mapping[str, list[EventHook]]) = None, + base_url: URL | str = "", + trust_env: bool = True, + default_encoding: str | typing.Callable[[bytes], str] = "utf-8", + ) -> None: + event_hooks = {} if event_hooks is None else event_hooks + + self._base_url = self._enforce_trailing_slash(URL(base_url)) + + self._auth = self._build_auth(auth) + self._params = QueryParams(params) + self.headers = Headers(headers) + self._cookies = Cookies(cookies) + self._timeout = Timeout(timeout) + self.follow_redirects = follow_redirects + self.max_redirects = max_redirects + self._event_hooks = { + "request": list(event_hooks.get("request", [])), + "response": list(event_hooks.get("response", [])), + } + self._trust_env = trust_env + self._default_encoding = default_encoding + self._state = ClientState.UNOPENED + + @property + def is_closed(self) -> bool: + """ + Check if the client being closed + """ + return self._state == ClientState.CLOSED + + @property + def trust_env(self) -> bool: + return self._trust_env + + def _enforce_trailing_slash(self, url: URL) -> URL: + if url.raw_path.endswith(b"/"): + return url + return url.copy_with(raw_path=url.raw_path + b"/") + + def _get_proxy_map( + self, proxy: ProxyTypes | None, allow_env_proxies: bool + ) -> dict[str, Proxy | None]: + if proxy is None: + if allow_env_proxies: + return { + key: None if url is None else Proxy(url=url) + for key, url in get_environment_proxies().items() + } + return {} + else: + proxy = Proxy(url=proxy) if isinstance(proxy, (str, URL)) else proxy + return {"all://": proxy} + + @property + def timeout(self) -> Timeout: + return self._timeout + + @timeout.setter + def timeout(self, timeout: TimeoutTypes) -> None: + self._timeout = Timeout(timeout) + + @property + def event_hooks(self) -> dict[str, list[EventHook]]: + return self._event_hooks + + @event_hooks.setter + def event_hooks(self, event_hooks: dict[str, list[EventHook]]) -> None: + self._event_hooks = { + "request": list(event_hooks.get("request", [])), + "response": list(event_hooks.get("response", [])), + } + + @property + def auth(self) -> Auth | None: + """ + Authentication class used when none is passed at the request-level. + + See also [Authentication][0]. + + [0]: /quickstart/#authentication + """ + return self._auth + + @auth.setter + def auth(self, auth: AuthTypes) -> None: + self._auth = self._build_auth(auth) + + @property + def base_url(self) -> URL: + """ + Base URL to use when sending requests with relative URLs. + """ + return self._base_url + + @base_url.setter + def base_url(self, url: URL | str) -> None: + self._base_url = self._enforce_trailing_slash(URL(url)) + + @property + def headers(self) -> Headers: + """ + HTTP headers to include when sending requests. + """ + return self._headers + + @headers.setter + def headers(self, headers: HeaderTypes) -> None: + client_headers = Headers( + { + b"Accept": b"*/*", + b"Accept-Encoding": ACCEPT_ENCODING.encode("ascii"), + b"Connection": b"keep-alive", + b"User-Agent": USER_AGENT.encode("ascii"), + } + ) + client_headers.update(headers) + self._headers = client_headers + + @property + def cookies(self) -> Cookies: + """ + Cookie values to include when sending requests. + """ + return self._cookies + + @cookies.setter + def cookies(self, cookies: CookieTypes) -> None: + self._cookies = Cookies(cookies) + + @property + def params(self) -> QueryParams: + """ + Query parameters to include in the URL when sending requests. + """ + return self._params + + @params.setter + def params(self, params: QueryParamTypes) -> None: + self._params = QueryParams(params) + + def build_request( + self, + method: str, + url: URL | str, + *, + content: RequestContent | None = None, + data: RequestData | None = None, + files: RequestFiles | None = None, + json: typing.Any | None = None, + params: QueryParamTypes | None = None, + headers: HeaderTypes | None = None, + cookies: CookieTypes | None = None, + timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, + extensions: RequestExtensions | None = None, + ) -> Request: + """ + Build and return a request instance. + + * The `params`, `headers` and `cookies` arguments + are merged with any values set on the client. + * The `url` argument is merged with any `base_url` set on the client. + + See also: [Request instances][0] + + [0]: /advanced/clients/#request-instances + """ + url = self._merge_url(url) + headers = self._merge_headers(headers) + cookies = self._merge_cookies(cookies) + params = self._merge_queryparams(params) + extensions = {} if extensions is None else extensions + if "timeout" not in extensions: + timeout = ( + self.timeout + if isinstance(timeout, UseClientDefault) + else Timeout(timeout) + ) + extensions = dict(**extensions, timeout=timeout.as_dict()) + return Request( + method, + url, + content=content, + data=data, + files=files, + json=json, + params=params, + headers=headers, + cookies=cookies, + extensions=extensions, + ) + + def _merge_url(self, url: URL | str) -> URL: + """ + Merge a URL argument together with any 'base_url' on the client, + to create the URL used for the outgoing request. + """ + merge_url = URL(url) + if merge_url.is_relative_url: + # To merge URLs we always append to the base URL. To get this + # behaviour correct we always ensure the base URL ends in a '/' + # separator, and strip any leading '/' from the merge URL. + # + # So, eg... + # + # >>> client = Client(base_url="https://www.example.com/subpath") + # >>> client.base_url + # URL('https://www.example.com/subpath/') + # >>> client.build_request("GET", "/path").url + # URL('https://www.example.com/subpath/path') + merge_raw_path = self.base_url.raw_path + merge_url.raw_path.lstrip(b"/") + return self.base_url.copy_with(raw_path=merge_raw_path) + return merge_url + + def _merge_cookies(self, cookies: CookieTypes | None = None) -> CookieTypes | None: + """ + Merge a cookies argument together with any cookies on the client, + to create the cookies used for the outgoing request. + """ + if cookies or self.cookies: + merged_cookies = Cookies(self.cookies) + merged_cookies.update(cookies) + return merged_cookies + return cookies + + def _merge_headers(self, headers: HeaderTypes | None = None) -> HeaderTypes | None: + """ + Merge a headers argument together with any headers on the client, + to create the headers used for the outgoing request. + """ + merged_headers = Headers(self.headers) + merged_headers.update(headers) + return merged_headers + + def _merge_queryparams( + self, params: QueryParamTypes | None = None + ) -> QueryParamTypes | None: + """ + Merge a queryparams argument together with any queryparams on the client, + to create the queryparams used for the outgoing request. + """ + if params or self.params: + merged_queryparams = QueryParams(self.params) + return merged_queryparams.merge(params) + return params + + def _build_auth(self, auth: AuthTypes | None) -> Auth | None: + if auth is None: + return None + elif isinstance(auth, tuple): + return BasicAuth(username=auth[0], password=auth[1]) + elif isinstance(auth, Auth): + return auth + elif callable(auth): + return FunctionAuth(func=auth) + else: + raise TypeError(f'Invalid "auth" argument: {auth!r}') + + def _build_request_auth( + self, + request: Request, + auth: AuthTypes | UseClientDefault | None = USE_CLIENT_DEFAULT, + ) -> Auth: + auth = ( + self._auth if isinstance(auth, UseClientDefault) else self._build_auth(auth) + ) + + if auth is not None: + return auth + + username, password = request.url.username, request.url.password + if username or password: + return BasicAuth(username=username, password=password) + + return Auth() + + def _build_redirect_request(self, request: Request, response: Response) -> Request: + """ + Given a request and a redirect response, return a new request that + should be used to effect the redirect. + """ + method = self._redirect_method(request, response) + url = self._redirect_url(request, response) + headers = self._redirect_headers(request, url, method) + stream = self._redirect_stream(request, method) + cookies = Cookies(self.cookies) + return Request( + method=method, + url=url, + headers=headers, + cookies=cookies, + stream=stream, + extensions=request.extensions, + ) + + def _redirect_method(self, request: Request, response: Response) -> str: + """ + When being redirected we may want to change the method of the request + based on certain specs or browser behavior. + """ + method = request.method + + # https://tools.ietf.org/html/rfc7231#section-6.4.4 + if response.status_code == codes.SEE_OTHER and method != "HEAD": + method = "GET" + + # Do what the browsers do, despite standards... + # Turn 302s into GETs. + if response.status_code == codes.FOUND and method != "HEAD": + method = "GET" + + # If a POST is responded to with a 301, turn it into a GET. + # This bizarre behaviour is explained in 'requests' issue 1704. + if response.status_code == codes.MOVED_PERMANENTLY and method == "POST": + method = "GET" + + return method + + def _redirect_url(self, request: Request, response: Response) -> URL: + """ + Return the URL for the redirect to follow. + """ + location = response.headers["Location"] + + try: + url = URL(location) + except InvalidURL as exc: + raise RemoteProtocolError( + f"Invalid URL in location header: {exc}.", request=request + ) from None + + # Handle malformed 'Location' headers that are "absolute" form, have no host. + # See: https://github.com/encode/httpx/issues/771 + if url.scheme and not url.host: + url = url.copy_with(host=request.url.host) + + # Facilitate relative 'Location' headers, as allowed by RFC 7231. + # (e.g. '/path/to/resource' instead of 'http://domain.tld/path/to/resource') + if url.is_relative_url: + url = request.url.join(url) + + # Attach previous fragment if needed (RFC 7231 7.1.2) + if request.url.fragment and not url.fragment: + url = url.copy_with(fragment=request.url.fragment) + + return url + + def _redirect_headers(self, request: Request, url: URL, method: str) -> Headers: + """ + Return the headers that should be used for the redirect request. + """ + headers = Headers(request.headers) + + if not _same_origin(url, request.url): + if not _is_https_redirect(request.url, url): + # Strip Authorization headers when responses are redirected + # away from the origin. (Except for direct HTTP to HTTPS redirects.) + headers.pop("Authorization", None) + + # Update the Host header. + headers["Host"] = url.netloc.decode("ascii") + + if method != request.method and method == "GET": + # If we've switch to a 'GET' request, then strip any headers which + # are only relevant to the request body. + headers.pop("Content-Length", None) + headers.pop("Transfer-Encoding", None) + + # We should use the client cookie store to determine any cookie header, + # rather than whatever was on the original outgoing request. + headers.pop("Cookie", None) + + return headers + + def _redirect_stream( + self, request: Request, method: str + ) -> SyncByteStream | AsyncByteStream | None: + """ + Return the body that should be used for the redirect request. + """ + if method != request.method and method == "GET": + return None + + return request.stream + + def _set_timeout(self, request: Request) -> None: + if "timeout" not in request.extensions: + timeout = ( + self.timeout + if isinstance(self.timeout, UseClientDefault) + else Timeout(self.timeout) + ) + request.extensions = dict(**request.extensions, timeout=timeout.as_dict()) + + +class Client(BaseClient): + """ + An HTTP client, with connection pooling, HTTP/2, redirects, cookie persistence, etc. + + It can be shared between threads. + + Usage: + + ```python + >>> client = httpx.Client() + >>> response = client.get('https://example.org') + ``` + + **Parameters:** + + * **auth** - *(optional)* An authentication class to use when sending + requests. + * **params** - *(optional)* Query parameters to include in request URLs, as + a string, dictionary, or sequence of two-tuples. + * **headers** - *(optional)* Dictionary of HTTP headers to include when + sending requests. + * **cookies** - *(optional)* Dictionary of Cookie items to include when + sending requests. + * **verify** - *(optional)* Either `True` to use an SSL context with the + default CA bundle, `False` to disable verification, or an instance of + `ssl.SSLContext` to use a custom context. + * **http2** - *(optional)* A boolean indicating if HTTP/2 support should be + enabled. Defaults to `False`. + * **proxy** - *(optional)* A proxy URL where all the traffic should be routed. + * **timeout** - *(optional)* The timeout configuration to use when sending + requests. + * **limits** - *(optional)* The limits configuration to use. + * **max_redirects** - *(optional)* The maximum number of redirect responses + that should be followed. + * **base_url** - *(optional)* A URL to use as the base when building + request URLs. + * **transport** - *(optional)* A transport class to use for sending requests + over the network. + * **trust_env** - *(optional)* Enables or disables usage of environment + variables for configuration. + * **default_encoding** - *(optional)* The default encoding to use for decoding + response text, if no charset information is included in a response Content-Type + header. Set to a callable for automatic character set detection. Default: "utf-8". + """ + + def __init__( + self, + *, + auth: AuthTypes | None = None, + params: QueryParamTypes | None = None, + headers: HeaderTypes | None = None, + cookies: CookieTypes | None = None, + verify: ssl.SSLContext | str | bool = True, + cert: CertTypes | None = None, + trust_env: bool = True, + http1: bool = True, + http2: bool = False, + proxy: ProxyTypes | None = None, + mounts: None | (typing.Mapping[str, BaseTransport | None]) = None, + timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG, + follow_redirects: bool = False, + limits: Limits = DEFAULT_LIMITS, + max_redirects: int = DEFAULT_MAX_REDIRECTS, + event_hooks: None | (typing.Mapping[str, list[EventHook]]) = None, + base_url: URL | str = "", + transport: BaseTransport | None = None, + default_encoding: str | typing.Callable[[bytes], str] = "utf-8", + ) -> None: + super().__init__( + auth=auth, + params=params, + headers=headers, + cookies=cookies, + timeout=timeout, + follow_redirects=follow_redirects, + max_redirects=max_redirects, + event_hooks=event_hooks, + base_url=base_url, + trust_env=trust_env, + default_encoding=default_encoding, + ) + + if http2: + try: + import h2 # noqa + except ImportError: # pragma: no cover + raise ImportError( + "Using http2=True, but the 'h2' package is not installed. " + "Make sure to install httpx using `pip install httpx[http2]`." + ) from None + + allow_env_proxies = trust_env and transport is None + proxy_map = self._get_proxy_map(proxy, allow_env_proxies) + + self._transport = self._init_transport( + verify=verify, + cert=cert, + trust_env=trust_env, + http1=http1, + http2=http2, + limits=limits, + transport=transport, + ) + self._mounts: dict[URLPattern, BaseTransport | None] = { + URLPattern(key): None + if proxy is None + else self._init_proxy_transport( + proxy, + verify=verify, + cert=cert, + trust_env=trust_env, + http1=http1, + http2=http2, + limits=limits, + ) + for key, proxy in proxy_map.items() + } + if mounts is not None: + self._mounts.update( + {URLPattern(key): transport for key, transport in mounts.items()} + ) + + self._mounts = dict(sorted(self._mounts.items())) + + def _init_transport( + self, + verify: ssl.SSLContext | str | bool = True, + cert: CertTypes | None = None, + trust_env: bool = True, + http1: bool = True, + http2: bool = False, + limits: Limits = DEFAULT_LIMITS, + transport: BaseTransport | None = None, + ) -> BaseTransport: + if transport is not None: + return transport + + return HTTPTransport( + verify=verify, + cert=cert, + trust_env=trust_env, + http1=http1, + http2=http2, + limits=limits, + ) + + def _init_proxy_transport( + self, + proxy: Proxy, + verify: ssl.SSLContext | str | bool = True, + cert: CertTypes | None = None, + trust_env: bool = True, + http1: bool = True, + http2: bool = False, + limits: Limits = DEFAULT_LIMITS, + ) -> BaseTransport: + return HTTPTransport( + verify=verify, + cert=cert, + trust_env=trust_env, + http1=http1, + http2=http2, + limits=limits, + proxy=proxy, + ) + + def _transport_for_url(self, url: URL) -> BaseTransport: + """ + Returns the transport instance that should be used for a given URL. + This will either be the standard connection pool, or a proxy. + """ + for pattern, transport in self._mounts.items(): + if pattern.matches(url): + return self._transport if transport is None else transport + + return self._transport + + def request( + self, + method: str, + url: URL | str, + *, + content: RequestContent | None = None, + data: RequestData | None = None, + files: RequestFiles | None = None, + json: typing.Any | None = None, + params: QueryParamTypes | None = None, + headers: HeaderTypes | None = None, + cookies: CookieTypes | None = None, + auth: AuthTypes | UseClientDefault | None = USE_CLIENT_DEFAULT, + follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, + timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, + extensions: RequestExtensions | None = None, + ) -> Response: + """ + Build and send a request. + + Equivalent to: + + ```python + request = client.build_request(...) + response = client.send(request, ...) + ``` + + See `Client.build_request()`, `Client.send()` and + [Merging of configuration][0] for how the various parameters + are merged with client-level configuration. + + [0]: /advanced/clients/#merging-of-configuration + """ + if cookies is not None: + message = ( + "Setting per-request cookies=<...> is being deprecated, because " + "the expected behaviour on cookie persistence is ambiguous. Set " + "cookies directly on the client instance instead." + ) + warnings.warn(message, DeprecationWarning, stacklevel=2) + + request = self.build_request( + method=method, + url=url, + content=content, + data=data, + files=files, + json=json, + params=params, + headers=headers, + cookies=cookies, + timeout=timeout, + extensions=extensions, + ) + return self.send(request, auth=auth, follow_redirects=follow_redirects) + + @contextmanager + def stream( + self, + method: str, + url: URL | str, + *, + content: RequestContent | None = None, + data: RequestData | None = None, + files: RequestFiles | None = None, + json: typing.Any | None = None, + params: QueryParamTypes | None = None, + headers: HeaderTypes | None = None, + cookies: CookieTypes | None = None, + auth: AuthTypes | UseClientDefault | None = USE_CLIENT_DEFAULT, + follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, + timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, + extensions: RequestExtensions | None = None, + ) -> typing.Iterator[Response]: + """ + Alternative to `httpx.request()` that streams the response body + instead of loading it into memory at once. + + **Parameters**: See `httpx.request`. + + See also: [Streaming Responses][0] + + [0]: /quickstart#streaming-responses + """ + request = self.build_request( + method=method, + url=url, + content=content, + data=data, + files=files, + json=json, + params=params, + headers=headers, + cookies=cookies, + timeout=timeout, + extensions=extensions, + ) + response = self.send( + request=request, + auth=auth, + follow_redirects=follow_redirects, + stream=True, + ) + try: + yield response + finally: + response.close() + + def send( + self, + request: Request, + *, + stream: bool = False, + auth: AuthTypes | UseClientDefault | None = USE_CLIENT_DEFAULT, + follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, + ) -> Response: + """ + Send a request. + + The request is sent as-is, unmodified. + + Typically you'll want to build one with `Client.build_request()` + so that any client-level configuration is merged into the request, + but passing an explicit `httpx.Request()` is supported as well. + + See also: [Request instances][0] + + [0]: /advanced/clients/#request-instances + """ + if self._state == ClientState.CLOSED: + raise RuntimeError("Cannot send a request, as the client has been closed.") + + self._state = ClientState.OPENED + follow_redirects = ( + self.follow_redirects + if isinstance(follow_redirects, UseClientDefault) + else follow_redirects + ) + + self._set_timeout(request) + + auth = self._build_request_auth(request, auth) + + response = self._send_handling_auth( + request, + auth=auth, + follow_redirects=follow_redirects, + history=[], + ) + try: + if not stream: + response.read() + + return response + + except BaseException as exc: + response.close() + raise exc + + def _send_handling_auth( + self, + request: Request, + auth: Auth, + follow_redirects: bool, + history: list[Response], + ) -> Response: + auth_flow = auth.sync_auth_flow(request) + try: + request = next(auth_flow) + + while True: + response = self._send_handling_redirects( + request, + follow_redirects=follow_redirects, + history=history, + ) + try: + try: + next_request = auth_flow.send(response) + except StopIteration: + return response + + response.history = list(history) + response.read() + request = next_request + history.append(response) + + except BaseException as exc: + response.close() + raise exc + finally: + auth_flow.close() + + def _send_handling_redirects( + self, + request: Request, + follow_redirects: bool, + history: list[Response], + ) -> Response: + while True: + if len(history) > self.max_redirects: + raise TooManyRedirects( + "Exceeded maximum allowed redirects.", request=request + ) + + for hook in self._event_hooks["request"]: + hook(request) + + response = self._send_single_request(request) + try: + for hook in self._event_hooks["response"]: + hook(response) + response.history = list(history) + + if not response.has_redirect_location: + return response + + request = self._build_redirect_request(request, response) + history = history + [response] + + if follow_redirects: + response.read() + else: + response.next_request = request + return response + + except BaseException as exc: + response.close() + raise exc + + def _send_single_request(self, request: Request) -> Response: + """ + Sends a single request, without handling any redirections. + """ + transport = self._transport_for_url(request.url) + start = time.perf_counter() + + if not isinstance(request.stream, SyncByteStream): + raise RuntimeError( + "Attempted to send an async request with a sync Client instance." + ) + + with request_context(request=request): + response = transport.handle_request(request) + + assert isinstance(response.stream, SyncByteStream) + + response.request = request + response.stream = BoundSyncStream( + response.stream, response=response, start=start + ) + self.cookies.extract_cookies(response) + response.default_encoding = self._default_encoding + + logger.info( + 'HTTP Request: %s %s "%s %d %s"', + request.method, + request.url, + response.http_version, + response.status_code, + response.reason_phrase, + ) + + return response + + def get( + self, + url: URL | str, + *, + params: QueryParamTypes | None = None, + headers: HeaderTypes | None = None, + cookies: CookieTypes | None = None, + auth: AuthTypes | UseClientDefault | None = USE_CLIENT_DEFAULT, + follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, + timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, + extensions: RequestExtensions | None = None, + ) -> Response: + """ + Send a `GET` request. + + **Parameters**: See `httpx.request`. + """ + return self.request( + "GET", + url, + params=params, + headers=headers, + cookies=cookies, + auth=auth, + follow_redirects=follow_redirects, + timeout=timeout, + extensions=extensions, + ) + + def options( + self, + url: URL | str, + *, + params: QueryParamTypes | None = None, + headers: HeaderTypes | None = None, + cookies: CookieTypes | None = None, + auth: AuthTypes | UseClientDefault = USE_CLIENT_DEFAULT, + follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, + timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, + extensions: RequestExtensions | None = None, + ) -> Response: + """ + Send an `OPTIONS` request. + + **Parameters**: See `httpx.request`. + """ + return self.request( + "OPTIONS", + url, + params=params, + headers=headers, + cookies=cookies, + auth=auth, + follow_redirects=follow_redirects, + timeout=timeout, + extensions=extensions, + ) + + def head( + self, + url: URL | str, + *, + params: QueryParamTypes | None = None, + headers: HeaderTypes | None = None, + cookies: CookieTypes | None = None, + auth: AuthTypes | UseClientDefault = USE_CLIENT_DEFAULT, + follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, + timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, + extensions: RequestExtensions | None = None, + ) -> Response: + """ + Send a `HEAD` request. + + **Parameters**: See `httpx.request`. + """ + return self.request( + "HEAD", + url, + params=params, + headers=headers, + cookies=cookies, + auth=auth, + follow_redirects=follow_redirects, + timeout=timeout, + extensions=extensions, + ) + + def post( + self, + url: URL | str, + *, + content: RequestContent | None = None, + data: RequestData | None = None, + files: RequestFiles | None = None, + json: typing.Any | None = None, + params: QueryParamTypes | None = None, + headers: HeaderTypes | None = None, + cookies: CookieTypes | None = None, + auth: AuthTypes | UseClientDefault = USE_CLIENT_DEFAULT, + follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, + timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, + extensions: RequestExtensions | None = None, + ) -> Response: + """ + Send a `POST` request. + + **Parameters**: See `httpx.request`. + """ + return self.request( + "POST", + url, + content=content, + data=data, + files=files, + json=json, + params=params, + headers=headers, + cookies=cookies, + auth=auth, + follow_redirects=follow_redirects, + timeout=timeout, + extensions=extensions, + ) + + def put( + self, + url: URL | str, + *, + content: RequestContent | None = None, + data: RequestData | None = None, + files: RequestFiles | None = None, + json: typing.Any | None = None, + params: QueryParamTypes | None = None, + headers: HeaderTypes | None = None, + cookies: CookieTypes | None = None, + auth: AuthTypes | UseClientDefault = USE_CLIENT_DEFAULT, + follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, + timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, + extensions: RequestExtensions | None = None, + ) -> Response: + """ + Send a `PUT` request. + + **Parameters**: See `httpx.request`. + """ + return self.request( + "PUT", + url, + content=content, + data=data, + files=files, + json=json, + params=params, + headers=headers, + cookies=cookies, + auth=auth, + follow_redirects=follow_redirects, + timeout=timeout, + extensions=extensions, + ) + + def patch( + self, + url: URL | str, + *, + content: RequestContent | None = None, + data: RequestData | None = None, + files: RequestFiles | None = None, + json: typing.Any | None = None, + params: QueryParamTypes | None = None, + headers: HeaderTypes | None = None, + cookies: CookieTypes | None = None, + auth: AuthTypes | UseClientDefault = USE_CLIENT_DEFAULT, + follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, + timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, + extensions: RequestExtensions | None = None, + ) -> Response: + """ + Send a `PATCH` request. + + **Parameters**: See `httpx.request`. + """ + return self.request( + "PATCH", + url, + content=content, + data=data, + files=files, + json=json, + params=params, + headers=headers, + cookies=cookies, + auth=auth, + follow_redirects=follow_redirects, + timeout=timeout, + extensions=extensions, + ) + + def delete( + self, + url: URL | str, + *, + params: QueryParamTypes | None = None, + headers: HeaderTypes | None = None, + cookies: CookieTypes | None = None, + auth: AuthTypes | UseClientDefault = USE_CLIENT_DEFAULT, + follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, + timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, + extensions: RequestExtensions | None = None, + ) -> Response: + """ + Send a `DELETE` request. + + **Parameters**: See `httpx.request`. + """ + return self.request( + "DELETE", + url, + params=params, + headers=headers, + cookies=cookies, + auth=auth, + follow_redirects=follow_redirects, + timeout=timeout, + extensions=extensions, + ) + + def close(self) -> None: + """ + Close transport and proxies. + """ + if self._state != ClientState.CLOSED: + self._state = ClientState.CLOSED + + self._transport.close() + for transport in self._mounts.values(): + if transport is not None: + transport.close() + + def __enter__(self: T) -> T: + if self._state != ClientState.UNOPENED: + msg = { + ClientState.OPENED: "Cannot open a client instance more than once.", + ClientState.CLOSED: ( + "Cannot reopen a client instance, once it has been closed." + ), + }[self._state] + raise RuntimeError(msg) + + self._state = ClientState.OPENED + + self._transport.__enter__() + for transport in self._mounts.values(): + if transport is not None: + transport.__enter__() + return self + + def __exit__( + self, + exc_type: type[BaseException] | None = None, + exc_value: BaseException | None = None, + traceback: TracebackType | None = None, + ) -> None: + self._state = ClientState.CLOSED + + self._transport.__exit__(exc_type, exc_value, traceback) + for transport in self._mounts.values(): + if transport is not None: + transport.__exit__(exc_type, exc_value, traceback) + + +class AsyncClient(BaseClient): + """ + An asynchronous HTTP client, with connection pooling, HTTP/2, redirects, + cookie persistence, etc. + + It can be shared between tasks. + + Usage: + + ```python + >>> async with httpx.AsyncClient() as client: + >>> response = await client.get('https://example.org') + ``` + + **Parameters:** + + * **auth** - *(optional)* An authentication class to use when sending + requests. + * **params** - *(optional)* Query parameters to include in request URLs, as + a string, dictionary, or sequence of two-tuples. + * **headers** - *(optional)* Dictionary of HTTP headers to include when + sending requests. + * **cookies** - *(optional)* Dictionary of Cookie items to include when + sending requests. + * **verify** - *(optional)* Either `True` to use an SSL context with the + default CA bundle, `False` to disable verification, or an instance of + `ssl.SSLContext` to use a custom context. + * **http2** - *(optional)* A boolean indicating if HTTP/2 support should be + enabled. Defaults to `False`. + * **proxy** - *(optional)* A proxy URL where all the traffic should be routed. + * **timeout** - *(optional)* The timeout configuration to use when sending + requests. + * **limits** - *(optional)* The limits configuration to use. + * **max_redirects** - *(optional)* The maximum number of redirect responses + that should be followed. + * **base_url** - *(optional)* A URL to use as the base when building + request URLs. + * **transport** - *(optional)* A transport class to use for sending requests + over the network. + * **trust_env** - *(optional)* Enables or disables usage of environment + variables for configuration. + * **default_encoding** - *(optional)* The default encoding to use for decoding + response text, if no charset information is included in a response Content-Type + header. Set to a callable for automatic character set detection. Default: "utf-8". + """ + + def __init__( + self, + *, + auth: AuthTypes | None = None, + params: QueryParamTypes | None = None, + headers: HeaderTypes | None = None, + cookies: CookieTypes | None = None, + verify: ssl.SSLContext | str | bool = True, + cert: CertTypes | None = None, + http1: bool = True, + http2: bool = False, + proxy: ProxyTypes | None = None, + mounts: None | (typing.Mapping[str, AsyncBaseTransport | None]) = None, + timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG, + follow_redirects: bool = False, + limits: Limits = DEFAULT_LIMITS, + max_redirects: int = DEFAULT_MAX_REDIRECTS, + event_hooks: None | (typing.Mapping[str, list[EventHook]]) = None, + base_url: URL | str = "", + transport: AsyncBaseTransport | None = None, + trust_env: bool = True, + default_encoding: str | typing.Callable[[bytes], str] = "utf-8", + ) -> None: + super().__init__( + auth=auth, + params=params, + headers=headers, + cookies=cookies, + timeout=timeout, + follow_redirects=follow_redirects, + max_redirects=max_redirects, + event_hooks=event_hooks, + base_url=base_url, + trust_env=trust_env, + default_encoding=default_encoding, + ) + + if http2: + try: + import h2 # noqa + except ImportError: # pragma: no cover + raise ImportError( + "Using http2=True, but the 'h2' package is not installed. " + "Make sure to install httpx using `pip install httpx[http2]`." + ) from None + + allow_env_proxies = trust_env and transport is None + proxy_map = self._get_proxy_map(proxy, allow_env_proxies) + + self._transport = self._init_transport( + verify=verify, + cert=cert, + trust_env=trust_env, + http1=http1, + http2=http2, + limits=limits, + transport=transport, + ) + + self._mounts: dict[URLPattern, AsyncBaseTransport | None] = { + URLPattern(key): None + if proxy is None + else self._init_proxy_transport( + proxy, + verify=verify, + cert=cert, + trust_env=trust_env, + http1=http1, + http2=http2, + limits=limits, + ) + for key, proxy in proxy_map.items() + } + if mounts is not None: + self._mounts.update( + {URLPattern(key): transport for key, transport in mounts.items()} + ) + self._mounts = dict(sorted(self._mounts.items())) + + def _init_transport( + self, + verify: ssl.SSLContext | str | bool = True, + cert: CertTypes | None = None, + trust_env: bool = True, + http1: bool = True, + http2: bool = False, + limits: Limits = DEFAULT_LIMITS, + transport: AsyncBaseTransport | None = None, + ) -> AsyncBaseTransport: + if transport is not None: + return transport + + return AsyncHTTPTransport( + verify=verify, + cert=cert, + trust_env=trust_env, + http1=http1, + http2=http2, + limits=limits, + ) + + def _init_proxy_transport( + self, + proxy: Proxy, + verify: ssl.SSLContext | str | bool = True, + cert: CertTypes | None = None, + trust_env: bool = True, + http1: bool = True, + http2: bool = False, + limits: Limits = DEFAULT_LIMITS, + ) -> AsyncBaseTransport: + return AsyncHTTPTransport( + verify=verify, + cert=cert, + trust_env=trust_env, + http1=http1, + http2=http2, + limits=limits, + proxy=proxy, + ) + + def _transport_for_url(self, url: URL) -> AsyncBaseTransport: + """ + Returns the transport instance that should be used for a given URL. + This will either be the standard connection pool, or a proxy. + """ + for pattern, transport in self._mounts.items(): + if pattern.matches(url): + return self._transport if transport is None else transport + + return self._transport + + async def request( + self, + method: str, + url: URL | str, + *, + content: RequestContent | None = None, + data: RequestData | None = None, + files: RequestFiles | None = None, + json: typing.Any | None = None, + params: QueryParamTypes | None = None, + headers: HeaderTypes | None = None, + cookies: CookieTypes | None = None, + auth: AuthTypes | UseClientDefault | None = USE_CLIENT_DEFAULT, + follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, + timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, + extensions: RequestExtensions | None = None, + ) -> Response: + """ + Build and send a request. + + Equivalent to: + + ```python + request = client.build_request(...) + response = await client.send(request, ...) + ``` + + See `AsyncClient.build_request()`, `AsyncClient.send()` + and [Merging of configuration][0] for how the various parameters + are merged with client-level configuration. + + [0]: /advanced/clients/#merging-of-configuration + """ + + if cookies is not None: # pragma: no cover + message = ( + "Setting per-request cookies=<...> is being deprecated, because " + "the expected behaviour on cookie persistence is ambiguous. Set " + "cookies directly on the client instance instead." + ) + warnings.warn(message, DeprecationWarning, stacklevel=2) + + request = self.build_request( + method=method, + url=url, + content=content, + data=data, + files=files, + json=json, + params=params, + headers=headers, + cookies=cookies, + timeout=timeout, + extensions=extensions, + ) + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + + @asynccontextmanager + async def stream( + self, + method: str, + url: URL | str, + *, + content: RequestContent | None = None, + data: RequestData | None = None, + files: RequestFiles | None = None, + json: typing.Any | None = None, + params: QueryParamTypes | None = None, + headers: HeaderTypes | None = None, + cookies: CookieTypes | None = None, + auth: AuthTypes | UseClientDefault | None = USE_CLIENT_DEFAULT, + follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, + timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, + extensions: RequestExtensions | None = None, + ) -> typing.AsyncIterator[Response]: + """ + Alternative to `httpx.request()` that streams the response body + instead of loading it into memory at once. + + **Parameters**: See `httpx.request`. + + See also: [Streaming Responses][0] + + [0]: /quickstart#streaming-responses + """ + request = self.build_request( + method=method, + url=url, + content=content, + data=data, + files=files, + json=json, + params=params, + headers=headers, + cookies=cookies, + timeout=timeout, + extensions=extensions, + ) + response = await self.send( + request=request, + auth=auth, + follow_redirects=follow_redirects, + stream=True, + ) + try: + yield response + finally: + await response.aclose() + + async def send( + self, + request: Request, + *, + stream: bool = False, + auth: AuthTypes | UseClientDefault | None = USE_CLIENT_DEFAULT, + follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, + ) -> Response: + """ + Send a request. + + The request is sent as-is, unmodified. + + Typically you'll want to build one with `AsyncClient.build_request()` + so that any client-level configuration is merged into the request, + but passing an explicit `httpx.Request()` is supported as well. + + See also: [Request instances][0] + + [0]: /advanced/clients/#request-instances + """ + if self._state == ClientState.CLOSED: + raise RuntimeError("Cannot send a request, as the client has been closed.") + + self._state = ClientState.OPENED + follow_redirects = ( + self.follow_redirects + if isinstance(follow_redirects, UseClientDefault) + else follow_redirects + ) + + self._set_timeout(request) + + auth = self._build_request_auth(request, auth) + + response = await self._send_handling_auth( + request, + auth=auth, + follow_redirects=follow_redirects, + history=[], + ) + try: + if not stream: + await response.aread() + + return response + + except BaseException as exc: + await response.aclose() + raise exc + + async def _send_handling_auth( + self, + request: Request, + auth: Auth, + follow_redirects: bool, + history: list[Response], + ) -> Response: + auth_flow = auth.async_auth_flow(request) + try: + request = await auth_flow.__anext__() + + while True: + response = await self._send_handling_redirects( + request, + follow_redirects=follow_redirects, + history=history, + ) + try: + try: + next_request = await auth_flow.asend(response) + except StopAsyncIteration: + return response + + response.history = list(history) + await response.aread() + request = next_request + history.append(response) + + except BaseException as exc: + await response.aclose() + raise exc + finally: + await auth_flow.aclose() + + async def _send_handling_redirects( + self, + request: Request, + follow_redirects: bool, + history: list[Response], + ) -> Response: + while True: + if len(history) > self.max_redirects: + raise TooManyRedirects( + "Exceeded maximum allowed redirects.", request=request + ) + + for hook in self._event_hooks["request"]: + await hook(request) + + response = await self._send_single_request(request) + try: + for hook in self._event_hooks["response"]: + await hook(response) + + response.history = list(history) + + if not response.has_redirect_location: + return response + + request = self._build_redirect_request(request, response) + history = history + [response] + + if follow_redirects: + await response.aread() + else: + response.next_request = request + return response + + except BaseException as exc: + await response.aclose() + raise exc + + async def _send_single_request(self, request: Request) -> Response: + """ + Sends a single request, without handling any redirections. + """ + transport = self._transport_for_url(request.url) + start = time.perf_counter() + + if not isinstance(request.stream, AsyncByteStream): + raise RuntimeError( + "Attempted to send an sync request with an AsyncClient instance." + ) + + with request_context(request=request): + response = await transport.handle_async_request(request) + + assert isinstance(response.stream, AsyncByteStream) + response.request = request + response.stream = BoundAsyncStream( + response.stream, response=response, start=start + ) + self.cookies.extract_cookies(response) + response.default_encoding = self._default_encoding + + logger.info( + 'HTTP Request: %s %s "%s %d %s"', + request.method, + request.url, + response.http_version, + response.status_code, + response.reason_phrase, + ) + + return response + + async def get( + self, + url: URL | str, + *, + params: QueryParamTypes | None = None, + headers: HeaderTypes | None = None, + cookies: CookieTypes | None = None, + auth: AuthTypes | UseClientDefault | None = USE_CLIENT_DEFAULT, + follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, + timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, + extensions: RequestExtensions | None = None, + ) -> Response: + """ + Send a `GET` request. + + **Parameters**: See `httpx.request`. + """ + return await self.request( + "GET", + url, + params=params, + headers=headers, + cookies=cookies, + auth=auth, + follow_redirects=follow_redirects, + timeout=timeout, + extensions=extensions, + ) + + async def options( + self, + url: URL | str, + *, + params: QueryParamTypes | None = None, + headers: HeaderTypes | None = None, + cookies: CookieTypes | None = None, + auth: AuthTypes | UseClientDefault = USE_CLIENT_DEFAULT, + follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, + timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, + extensions: RequestExtensions | None = None, + ) -> Response: + """ + Send an `OPTIONS` request. + + **Parameters**: See `httpx.request`. + """ + return await self.request( + "OPTIONS", + url, + params=params, + headers=headers, + cookies=cookies, + auth=auth, + follow_redirects=follow_redirects, + timeout=timeout, + extensions=extensions, + ) + + async def head( + self, + url: URL | str, + *, + params: QueryParamTypes | None = None, + headers: HeaderTypes | None = None, + cookies: CookieTypes | None = None, + auth: AuthTypes | UseClientDefault = USE_CLIENT_DEFAULT, + follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, + timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, + extensions: RequestExtensions | None = None, + ) -> Response: + """ + Send a `HEAD` request. + + **Parameters**: See `httpx.request`. + """ + return await self.request( + "HEAD", + url, + params=params, + headers=headers, + cookies=cookies, + auth=auth, + follow_redirects=follow_redirects, + timeout=timeout, + extensions=extensions, + ) + + async def post( + self, + url: URL | str, + *, + content: RequestContent | None = None, + data: RequestData | None = None, + files: RequestFiles | None = None, + json: typing.Any | None = None, + params: QueryParamTypes | None = None, + headers: HeaderTypes | None = None, + cookies: CookieTypes | None = None, + auth: AuthTypes | UseClientDefault = USE_CLIENT_DEFAULT, + follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, + timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, + extensions: RequestExtensions | None = None, + ) -> Response: + """ + Send a `POST` request. + + **Parameters**: See `httpx.request`. + """ + return await self.request( + "POST", + url, + content=content, + data=data, + files=files, + json=json, + params=params, + headers=headers, + cookies=cookies, + auth=auth, + follow_redirects=follow_redirects, + timeout=timeout, + extensions=extensions, + ) + + async def put( + self, + url: URL | str, + *, + content: RequestContent | None = None, + data: RequestData | None = None, + files: RequestFiles | None = None, + json: typing.Any | None = None, + params: QueryParamTypes | None = None, + headers: HeaderTypes | None = None, + cookies: CookieTypes | None = None, + auth: AuthTypes | UseClientDefault = USE_CLIENT_DEFAULT, + follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, + timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, + extensions: RequestExtensions | None = None, + ) -> Response: + """ + Send a `PUT` request. + + **Parameters**: See `httpx.request`. + """ + return await self.request( + "PUT", + url, + content=content, + data=data, + files=files, + json=json, + params=params, + headers=headers, + cookies=cookies, + auth=auth, + follow_redirects=follow_redirects, + timeout=timeout, + extensions=extensions, + ) + + async def patch( + self, + url: URL | str, + *, + content: RequestContent | None = None, + data: RequestData | None = None, + files: RequestFiles | None = None, + json: typing.Any | None = None, + params: QueryParamTypes | None = None, + headers: HeaderTypes | None = None, + cookies: CookieTypes | None = None, + auth: AuthTypes | UseClientDefault = USE_CLIENT_DEFAULT, + follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, + timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, + extensions: RequestExtensions | None = None, + ) -> Response: + """ + Send a `PATCH` request. + + **Parameters**: See `httpx.request`. + """ + return await self.request( + "PATCH", + url, + content=content, + data=data, + files=files, + json=json, + params=params, + headers=headers, + cookies=cookies, + auth=auth, + follow_redirects=follow_redirects, + timeout=timeout, + extensions=extensions, + ) + + async def delete( + self, + url: URL | str, + *, + params: QueryParamTypes | None = None, + headers: HeaderTypes | None = None, + cookies: CookieTypes | None = None, + auth: AuthTypes | UseClientDefault = USE_CLIENT_DEFAULT, + follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, + timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, + extensions: RequestExtensions | None = None, + ) -> Response: + """ + Send a `DELETE` request. + + **Parameters**: See `httpx.request`. + """ + return await self.request( + "DELETE", + url, + params=params, + headers=headers, + cookies=cookies, + auth=auth, + follow_redirects=follow_redirects, + timeout=timeout, + extensions=extensions, + ) + + async def aclose(self) -> None: + """ + Close transport and proxies. + """ + if self._state != ClientState.CLOSED: + self._state = ClientState.CLOSED + + await self._transport.aclose() + for proxy in self._mounts.values(): + if proxy is not None: + await proxy.aclose() + + async def __aenter__(self: U) -> U: + if self._state != ClientState.UNOPENED: + msg = { + ClientState.OPENED: "Cannot open a client instance more than once.", + ClientState.CLOSED: ( + "Cannot reopen a client instance, once it has been closed." + ), + }[self._state] + raise RuntimeError(msg) + + self._state = ClientState.OPENED + + await self._transport.__aenter__() + for proxy in self._mounts.values(): + if proxy is not None: + await proxy.__aenter__() + return self + + async def __aexit__( + self, + exc_type: type[BaseException] | None = None, + exc_value: BaseException | None = None, + traceback: TracebackType | None = None, + ) -> None: + self._state = ClientState.CLOSED + + await self._transport.__aexit__(exc_type, exc_value, traceback) + for proxy in self._mounts.values(): + if proxy is not None: + await proxy.__aexit__(exc_type, exc_value, traceback) diff --git a/.venv/lib/python3.10/site-packages/httpx/_config.py b/.venv/lib/python3.10/site-packages/httpx/_config.py new file mode 100644 index 0000000..467a6c9 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpx/_config.py @@ -0,0 +1,248 @@ +from __future__ import annotations + +import os +import typing + +from ._models import Headers +from ._types import CertTypes, HeaderTypes, TimeoutTypes +from ._urls import URL + +if typing.TYPE_CHECKING: + import ssl # pragma: no cover + +__all__ = ["Limits", "Proxy", "Timeout", "create_ssl_context"] + + +class UnsetType: + pass # pragma: no cover + + +UNSET = UnsetType() + + +def create_ssl_context( + verify: ssl.SSLContext | str | bool = True, + cert: CertTypes | None = None, + trust_env: bool = True, +) -> ssl.SSLContext: + import ssl + import warnings + + import certifi + + if verify is True: + if trust_env and os.environ.get("SSL_CERT_FILE"): # pragma: nocover + ctx = ssl.create_default_context(cafile=os.environ["SSL_CERT_FILE"]) + elif trust_env and os.environ.get("SSL_CERT_DIR"): # pragma: nocover + ctx = ssl.create_default_context(capath=os.environ["SSL_CERT_DIR"]) + else: + # Default case... + ctx = ssl.create_default_context(cafile=certifi.where()) + elif verify is False: + ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) + ctx.check_hostname = False + ctx.verify_mode = ssl.CERT_NONE + elif isinstance(verify, str): # pragma: nocover + message = ( + "`verify=` is deprecated. " + "Use `verify=ssl.create_default_context(cafile=...)` " + "or `verify=ssl.create_default_context(capath=...)` instead." + ) + warnings.warn(message, DeprecationWarning) + if os.path.isdir(verify): + return ssl.create_default_context(capath=verify) + return ssl.create_default_context(cafile=verify) + else: + ctx = verify + + if cert: # pragma: nocover + message = ( + "`cert=...` is deprecated. Use `verify=` instead," + "with `.load_cert_chain()` to configure the certificate chain." + ) + warnings.warn(message, DeprecationWarning) + if isinstance(cert, str): + ctx.load_cert_chain(cert) + else: + ctx.load_cert_chain(*cert) + + return ctx + + +class Timeout: + """ + Timeout configuration. + + **Usage**: + + Timeout(None) # No timeouts. + Timeout(5.0) # 5s timeout on all operations. + Timeout(None, connect=5.0) # 5s timeout on connect, no other timeouts. + Timeout(5.0, connect=10.0) # 10s timeout on connect. 5s timeout elsewhere. + Timeout(5.0, pool=None) # No timeout on acquiring connection from pool. + # 5s timeout elsewhere. + """ + + def __init__( + self, + timeout: TimeoutTypes | UnsetType = UNSET, + *, + connect: None | float | UnsetType = UNSET, + read: None | float | UnsetType = UNSET, + write: None | float | UnsetType = UNSET, + pool: None | float | UnsetType = UNSET, + ) -> None: + if isinstance(timeout, Timeout): + # Passed as a single explicit Timeout. + assert connect is UNSET + assert read is UNSET + assert write is UNSET + assert pool is UNSET + self.connect = timeout.connect # type: typing.Optional[float] + self.read = timeout.read # type: typing.Optional[float] + self.write = timeout.write # type: typing.Optional[float] + self.pool = timeout.pool # type: typing.Optional[float] + elif isinstance(timeout, tuple): + # Passed as a tuple. + self.connect = timeout[0] + self.read = timeout[1] + self.write = None if len(timeout) < 3 else timeout[2] + self.pool = None if len(timeout) < 4 else timeout[3] + elif not ( + isinstance(connect, UnsetType) + or isinstance(read, UnsetType) + or isinstance(write, UnsetType) + or isinstance(pool, UnsetType) + ): + self.connect = connect + self.read = read + self.write = write + self.pool = pool + else: + if isinstance(timeout, UnsetType): + raise ValueError( + "httpx.Timeout must either include a default, or set all " + "four parameters explicitly." + ) + self.connect = timeout if isinstance(connect, UnsetType) else connect + self.read = timeout if isinstance(read, UnsetType) else read + self.write = timeout if isinstance(write, UnsetType) else write + self.pool = timeout if isinstance(pool, UnsetType) else pool + + def as_dict(self) -> dict[str, float | None]: + return { + "connect": self.connect, + "read": self.read, + "write": self.write, + "pool": self.pool, + } + + def __eq__(self, other: typing.Any) -> bool: + return ( + isinstance(other, self.__class__) + and self.connect == other.connect + and self.read == other.read + and self.write == other.write + and self.pool == other.pool + ) + + def __repr__(self) -> str: + class_name = self.__class__.__name__ + if len({self.connect, self.read, self.write, self.pool}) == 1: + return f"{class_name}(timeout={self.connect})" + return ( + f"{class_name}(connect={self.connect}, " + f"read={self.read}, write={self.write}, pool={self.pool})" + ) + + +class Limits: + """ + Configuration for limits to various client behaviors. + + **Parameters:** + + * **max_connections** - The maximum number of concurrent connections that may be + established. + * **max_keepalive_connections** - Allow the connection pool to maintain + keep-alive connections below this point. Should be less than or equal + to `max_connections`. + * **keepalive_expiry** - Time limit on idle keep-alive connections in seconds. + """ + + def __init__( + self, + *, + max_connections: int | None = None, + max_keepalive_connections: int | None = None, + keepalive_expiry: float | None = 5.0, + ) -> None: + self.max_connections = max_connections + self.max_keepalive_connections = max_keepalive_connections + self.keepalive_expiry = keepalive_expiry + + def __eq__(self, other: typing.Any) -> bool: + return ( + isinstance(other, self.__class__) + and self.max_connections == other.max_connections + and self.max_keepalive_connections == other.max_keepalive_connections + and self.keepalive_expiry == other.keepalive_expiry + ) + + def __repr__(self) -> str: + class_name = self.__class__.__name__ + return ( + f"{class_name}(max_connections={self.max_connections}, " + f"max_keepalive_connections={self.max_keepalive_connections}, " + f"keepalive_expiry={self.keepalive_expiry})" + ) + + +class Proxy: + def __init__( + self, + url: URL | str, + *, + ssl_context: ssl.SSLContext | None = None, + auth: tuple[str, str] | None = None, + headers: HeaderTypes | None = None, + ) -> None: + url = URL(url) + headers = Headers(headers) + + if url.scheme not in ("http", "https", "socks5", "socks5h"): + raise ValueError(f"Unknown scheme for proxy URL {url!r}") + + if url.username or url.password: + # Remove any auth credentials from the URL. + auth = (url.username, url.password) + url = url.copy_with(username=None, password=None) + + self.url = url + self.auth = auth + self.headers = headers + self.ssl_context = ssl_context + + @property + def raw_auth(self) -> tuple[bytes, bytes] | None: + # The proxy authentication as raw bytes. + return ( + None + if self.auth is None + else (self.auth[0].encode("utf-8"), self.auth[1].encode("utf-8")) + ) + + def __repr__(self) -> str: + # The authentication is represented with the password component masked. + auth = (self.auth[0], "********") if self.auth else None + + # Build a nice concise representation. + url_str = f"{str(self.url)!r}" + auth_str = f", auth={auth!r}" if auth else "" + headers_str = f", headers={dict(self.headers)!r}" if self.headers else "" + return f"Proxy({url_str}{auth_str}{headers_str})" + + +DEFAULT_TIMEOUT_CONFIG = Timeout(timeout=5.0) +DEFAULT_LIMITS = Limits(max_connections=100, max_keepalive_connections=20) +DEFAULT_MAX_REDIRECTS = 20 diff --git a/.venv/lib/python3.10/site-packages/httpx/_content.py b/.venv/lib/python3.10/site-packages/httpx/_content.py new file mode 100644 index 0000000..6f479a0 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpx/_content.py @@ -0,0 +1,240 @@ +from __future__ import annotations + +import inspect +import warnings +from json import dumps as json_dumps +from typing import ( + Any, + AsyncIterable, + AsyncIterator, + Iterable, + Iterator, + Mapping, +) +from urllib.parse import urlencode + +from ._exceptions import StreamClosed, StreamConsumed +from ._multipart import MultipartStream +from ._types import ( + AsyncByteStream, + RequestContent, + RequestData, + RequestFiles, + ResponseContent, + SyncByteStream, +) +from ._utils import peek_filelike_length, primitive_value_to_str + +__all__ = ["ByteStream"] + + +class ByteStream(AsyncByteStream, SyncByteStream): + def __init__(self, stream: bytes) -> None: + self._stream = stream + + def __iter__(self) -> Iterator[bytes]: + yield self._stream + + async def __aiter__(self) -> AsyncIterator[bytes]: + yield self._stream + + +class IteratorByteStream(SyncByteStream): + CHUNK_SIZE = 65_536 + + def __init__(self, stream: Iterable[bytes]) -> None: + self._stream = stream + self._is_stream_consumed = False + self._is_generator = inspect.isgenerator(stream) + + def __iter__(self) -> Iterator[bytes]: + if self._is_stream_consumed and self._is_generator: + raise StreamConsumed() + + self._is_stream_consumed = True + if hasattr(self._stream, "read"): + # File-like interfaces should use 'read' directly. + chunk = self._stream.read(self.CHUNK_SIZE) + while chunk: + yield chunk + chunk = self._stream.read(self.CHUNK_SIZE) + else: + # Otherwise iterate. + for part in self._stream: + yield part + + +class AsyncIteratorByteStream(AsyncByteStream): + CHUNK_SIZE = 65_536 + + def __init__(self, stream: AsyncIterable[bytes]) -> None: + self._stream = stream + self._is_stream_consumed = False + self._is_generator = inspect.isasyncgen(stream) + + async def __aiter__(self) -> AsyncIterator[bytes]: + if self._is_stream_consumed and self._is_generator: + raise StreamConsumed() + + self._is_stream_consumed = True + if hasattr(self._stream, "aread"): + # File-like interfaces should use 'aread' directly. + chunk = await self._stream.aread(self.CHUNK_SIZE) + while chunk: + yield chunk + chunk = await self._stream.aread(self.CHUNK_SIZE) + else: + # Otherwise iterate. + async for part in self._stream: + yield part + + +class UnattachedStream(AsyncByteStream, SyncByteStream): + """ + If a request or response is serialized using pickle, then it is no longer + attached to a stream for I/O purposes. Any stream operations should result + in `httpx.StreamClosed`. + """ + + def __iter__(self) -> Iterator[bytes]: + raise StreamClosed() + + async def __aiter__(self) -> AsyncIterator[bytes]: + raise StreamClosed() + yield b"" # pragma: no cover + + +def encode_content( + content: str | bytes | Iterable[bytes] | AsyncIterable[bytes], +) -> tuple[dict[str, str], SyncByteStream | AsyncByteStream]: + if isinstance(content, (bytes, str)): + body = content.encode("utf-8") if isinstance(content, str) else content + content_length = len(body) + headers = {"Content-Length": str(content_length)} if body else {} + return headers, ByteStream(body) + + elif isinstance(content, Iterable) and not isinstance(content, dict): + # `not isinstance(content, dict)` is a bit oddly specific, but it + # catches a case that's easy for users to make in error, and would + # otherwise pass through here, like any other bytes-iterable, + # because `dict` happens to be iterable. See issue #2491. + content_length_or_none = peek_filelike_length(content) + + if content_length_or_none is None: + headers = {"Transfer-Encoding": "chunked"} + else: + headers = {"Content-Length": str(content_length_or_none)} + return headers, IteratorByteStream(content) # type: ignore + + elif isinstance(content, AsyncIterable): + headers = {"Transfer-Encoding": "chunked"} + return headers, AsyncIteratorByteStream(content) + + raise TypeError(f"Unexpected type for 'content', {type(content)!r}") + + +def encode_urlencoded_data( + data: RequestData, +) -> tuple[dict[str, str], ByteStream]: + plain_data = [] + for key, value in data.items(): + if isinstance(value, (list, tuple)): + plain_data.extend([(key, primitive_value_to_str(item)) for item in value]) + else: + plain_data.append((key, primitive_value_to_str(value))) + body = urlencode(plain_data, doseq=True).encode("utf-8") + content_length = str(len(body)) + content_type = "application/x-www-form-urlencoded" + headers = {"Content-Length": content_length, "Content-Type": content_type} + return headers, ByteStream(body) + + +def encode_multipart_data( + data: RequestData, files: RequestFiles, boundary: bytes | None +) -> tuple[dict[str, str], MultipartStream]: + multipart = MultipartStream(data=data, files=files, boundary=boundary) + headers = multipart.get_headers() + return headers, multipart + + +def encode_text(text: str) -> tuple[dict[str, str], ByteStream]: + body = text.encode("utf-8") + content_length = str(len(body)) + content_type = "text/plain; charset=utf-8" + headers = {"Content-Length": content_length, "Content-Type": content_type} + return headers, ByteStream(body) + + +def encode_html(html: str) -> tuple[dict[str, str], ByteStream]: + body = html.encode("utf-8") + content_length = str(len(body)) + content_type = "text/html; charset=utf-8" + headers = {"Content-Length": content_length, "Content-Type": content_type} + return headers, ByteStream(body) + + +def encode_json(json: Any) -> tuple[dict[str, str], ByteStream]: + body = json_dumps( + json, ensure_ascii=False, separators=(",", ":"), allow_nan=False + ).encode("utf-8") + content_length = str(len(body)) + content_type = "application/json" + headers = {"Content-Length": content_length, "Content-Type": content_type} + return headers, ByteStream(body) + + +def encode_request( + content: RequestContent | None = None, + data: RequestData | None = None, + files: RequestFiles | None = None, + json: Any | None = None, + boundary: bytes | None = None, +) -> tuple[dict[str, str], SyncByteStream | AsyncByteStream]: + """ + Handles encoding the given `content`, `data`, `files`, and `json`, + returning a two-tuple of (, ). + """ + if data is not None and not isinstance(data, Mapping): + # We prefer to separate `content=` + # for raw request content, and `data=

` for url encoded or + # multipart form content. + # + # However for compat with requests, we *do* still support + # `data=` usages. We deal with that case here, treating it + # as if `content=<...>` had been supplied instead. + message = "Use 'content=<...>' to upload raw bytes/text content." + warnings.warn(message, DeprecationWarning, stacklevel=2) + return encode_content(data) + + if content is not None: + return encode_content(content) + elif files: + return encode_multipart_data(data or {}, files, boundary) + elif data: + return encode_urlencoded_data(data) + elif json is not None: + return encode_json(json) + + return {}, ByteStream(b"") + + +def encode_response( + content: ResponseContent | None = None, + text: str | None = None, + html: str | None = None, + json: Any | None = None, +) -> tuple[dict[str, str], SyncByteStream | AsyncByteStream]: + """ + Handles encoding the given `content`, returning a two-tuple of + (, ). + """ + if content is not None: + return encode_content(content) + elif text is not None: + return encode_text(text) + elif html is not None: + return encode_html(html) + elif json is not None: + return encode_json(json) + + return {}, ByteStream(b"") diff --git a/.venv/lib/python3.10/site-packages/httpx/_decoders.py b/.venv/lib/python3.10/site-packages/httpx/_decoders.py new file mode 100644 index 0000000..899dfad --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpx/_decoders.py @@ -0,0 +1,393 @@ +""" +Handlers for Content-Encoding. + +See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding +""" + +from __future__ import annotations + +import codecs +import io +import typing +import zlib + +from ._exceptions import DecodingError + +# Brotli support is optional +try: + # The C bindings in `brotli` are recommended for CPython. + import brotli +except ImportError: # pragma: no cover + try: + # The CFFI bindings in `brotlicffi` are recommended for PyPy + # and other environments. + import brotlicffi as brotli + except ImportError: + brotli = None + + +# Zstandard support is optional +try: + import zstandard +except ImportError: # pragma: no cover + zstandard = None # type: ignore + + +class ContentDecoder: + def decode(self, data: bytes) -> bytes: + raise NotImplementedError() # pragma: no cover + + def flush(self) -> bytes: + raise NotImplementedError() # pragma: no cover + + +class IdentityDecoder(ContentDecoder): + """ + Handle unencoded data. + """ + + def decode(self, data: bytes) -> bytes: + return data + + def flush(self) -> bytes: + return b"" + + +class DeflateDecoder(ContentDecoder): + """ + Handle 'deflate' decoding. + + See: https://stackoverflow.com/questions/1838699 + """ + + def __init__(self) -> None: + self.first_attempt = True + self.decompressor = zlib.decompressobj() + + def decode(self, data: bytes) -> bytes: + was_first_attempt = self.first_attempt + self.first_attempt = False + try: + return self.decompressor.decompress(data) + except zlib.error as exc: + if was_first_attempt: + self.decompressor = zlib.decompressobj(-zlib.MAX_WBITS) + return self.decode(data) + raise DecodingError(str(exc)) from exc + + def flush(self) -> bytes: + try: + return self.decompressor.flush() + except zlib.error as exc: # pragma: no cover + raise DecodingError(str(exc)) from exc + + +class GZipDecoder(ContentDecoder): + """ + Handle 'gzip' decoding. + + See: https://stackoverflow.com/questions/1838699 + """ + + def __init__(self) -> None: + self.decompressor = zlib.decompressobj(zlib.MAX_WBITS | 16) + + def decode(self, data: bytes) -> bytes: + try: + return self.decompressor.decompress(data) + except zlib.error as exc: + raise DecodingError(str(exc)) from exc + + def flush(self) -> bytes: + try: + return self.decompressor.flush() + except zlib.error as exc: # pragma: no cover + raise DecodingError(str(exc)) from exc + + +class BrotliDecoder(ContentDecoder): + """ + Handle 'brotli' decoding. + + Requires `pip install brotlipy`. See: https://brotlipy.readthedocs.io/ + or `pip install brotli`. See https://github.com/google/brotli + Supports both 'brotlipy' and 'Brotli' packages since they share an import + name. The top branches are for 'brotlipy' and bottom branches for 'Brotli' + """ + + def __init__(self) -> None: + if brotli is None: # pragma: no cover + raise ImportError( + "Using 'BrotliDecoder', but neither of the 'brotlicffi' or 'brotli' " + "packages have been installed. " + "Make sure to install httpx using `pip install httpx[brotli]`." + ) from None + + self.decompressor = brotli.Decompressor() + self.seen_data = False + self._decompress: typing.Callable[[bytes], bytes] + if hasattr(self.decompressor, "decompress"): + # The 'brotlicffi' package. + self._decompress = self.decompressor.decompress # pragma: no cover + else: + # The 'brotli' package. + self._decompress = self.decompressor.process # pragma: no cover + + def decode(self, data: bytes) -> bytes: + if not data: + return b"" + self.seen_data = True + try: + return self._decompress(data) + except brotli.error as exc: + raise DecodingError(str(exc)) from exc + + def flush(self) -> bytes: + if not self.seen_data: + return b"" + try: + if hasattr(self.decompressor, "finish"): + # Only available in the 'brotlicffi' package. + + # As the decompressor decompresses eagerly, this + # will never actually emit any data. However, it will potentially throw + # errors if a truncated or damaged data stream has been used. + self.decompressor.finish() # pragma: no cover + return b"" + except brotli.error as exc: # pragma: no cover + raise DecodingError(str(exc)) from exc + + +class ZStandardDecoder(ContentDecoder): + """ + Handle 'zstd' RFC 8878 decoding. + + Requires `pip install zstandard`. + Can be installed as a dependency of httpx using `pip install httpx[zstd]`. + """ + + # inspired by the ZstdDecoder implementation in urllib3 + def __init__(self) -> None: + if zstandard is None: # pragma: no cover + raise ImportError( + "Using 'ZStandardDecoder', ..." + "Make sure to install httpx using `pip install httpx[zstd]`." + ) from None + + self.decompressor = zstandard.ZstdDecompressor().decompressobj() + self.seen_data = False + + def decode(self, data: bytes) -> bytes: + assert zstandard is not None + self.seen_data = True + output = io.BytesIO() + try: + output.write(self.decompressor.decompress(data)) + while self.decompressor.eof and self.decompressor.unused_data: + unused_data = self.decompressor.unused_data + self.decompressor = zstandard.ZstdDecompressor().decompressobj() + output.write(self.decompressor.decompress(unused_data)) + except zstandard.ZstdError as exc: + raise DecodingError(str(exc)) from exc + return output.getvalue() + + def flush(self) -> bytes: + if not self.seen_data: + return b"" + ret = self.decompressor.flush() # note: this is a no-op + if not self.decompressor.eof: + raise DecodingError("Zstandard data is incomplete") # pragma: no cover + return bytes(ret) + + +class MultiDecoder(ContentDecoder): + """ + Handle the case where multiple encodings have been applied. + """ + + def __init__(self, children: typing.Sequence[ContentDecoder]) -> None: + """ + 'children' should be a sequence of decoders in the order in which + each was applied. + """ + # Note that we reverse the order for decoding. + self.children = list(reversed(children)) + + def decode(self, data: bytes) -> bytes: + for child in self.children: + data = child.decode(data) + return data + + def flush(self) -> bytes: + data = b"" + for child in self.children: + data = child.decode(data) + child.flush() + return data + + +class ByteChunker: + """ + Handles returning byte content in fixed-size chunks. + """ + + def __init__(self, chunk_size: int | None = None) -> None: + self._buffer = io.BytesIO() + self._chunk_size = chunk_size + + def decode(self, content: bytes) -> list[bytes]: + if self._chunk_size is None: + return [content] if content else [] + + self._buffer.write(content) + if self._buffer.tell() >= self._chunk_size: + value = self._buffer.getvalue() + chunks = [ + value[i : i + self._chunk_size] + for i in range(0, len(value), self._chunk_size) + ] + if len(chunks[-1]) == self._chunk_size: + self._buffer.seek(0) + self._buffer.truncate() + return chunks + else: + self._buffer.seek(0) + self._buffer.write(chunks[-1]) + self._buffer.truncate() + return chunks[:-1] + else: + return [] + + def flush(self) -> list[bytes]: + value = self._buffer.getvalue() + self._buffer.seek(0) + self._buffer.truncate() + return [value] if value else [] + + +class TextChunker: + """ + Handles returning text content in fixed-size chunks. + """ + + def __init__(self, chunk_size: int | None = None) -> None: + self._buffer = io.StringIO() + self._chunk_size = chunk_size + + def decode(self, content: str) -> list[str]: + if self._chunk_size is None: + return [content] if content else [] + + self._buffer.write(content) + if self._buffer.tell() >= self._chunk_size: + value = self._buffer.getvalue() + chunks = [ + value[i : i + self._chunk_size] + for i in range(0, len(value), self._chunk_size) + ] + if len(chunks[-1]) == self._chunk_size: + self._buffer.seek(0) + self._buffer.truncate() + return chunks + else: + self._buffer.seek(0) + self._buffer.write(chunks[-1]) + self._buffer.truncate() + return chunks[:-1] + else: + return [] + + def flush(self) -> list[str]: + value = self._buffer.getvalue() + self._buffer.seek(0) + self._buffer.truncate() + return [value] if value else [] + + +class TextDecoder: + """ + Handles incrementally decoding bytes into text + """ + + def __init__(self, encoding: str = "utf-8") -> None: + self.decoder = codecs.getincrementaldecoder(encoding)(errors="replace") + + def decode(self, data: bytes) -> str: + return self.decoder.decode(data) + + def flush(self) -> str: + return self.decoder.decode(b"", True) + + +class LineDecoder: + """ + Handles incrementally reading lines from text. + + Has the same behaviour as the stdllib splitlines, + but handling the input iteratively. + """ + + def __init__(self) -> None: + self.buffer: list[str] = [] + self.trailing_cr: bool = False + + def decode(self, text: str) -> list[str]: + # See https://docs.python.org/3/library/stdtypes.html#str.splitlines + NEWLINE_CHARS = "\n\r\x0b\x0c\x1c\x1d\x1e\x85\u2028\u2029" + + # We always push a trailing `\r` into the next decode iteration. + if self.trailing_cr: + text = "\r" + text + self.trailing_cr = False + if text.endswith("\r"): + self.trailing_cr = True + text = text[:-1] + + if not text: + # NOTE: the edge case input of empty text doesn't occur in practice, + # because other httpx internals filter out this value + return [] # pragma: no cover + + trailing_newline = text[-1] in NEWLINE_CHARS + lines = text.splitlines() + + if len(lines) == 1 and not trailing_newline: + # No new lines, buffer the input and continue. + self.buffer.append(lines[0]) + return [] + + if self.buffer: + # Include any existing buffer in the first portion of the + # splitlines result. + lines = ["".join(self.buffer) + lines[0]] + lines[1:] + self.buffer = [] + + if not trailing_newline: + # If the last segment of splitlines is not newline terminated, + # then drop it from our output and start a new buffer. + self.buffer = [lines.pop()] + + return lines + + def flush(self) -> list[str]: + if not self.buffer and not self.trailing_cr: + return [] + + lines = ["".join(self.buffer)] + self.buffer = [] + self.trailing_cr = False + return lines + + +SUPPORTED_DECODERS = { + "identity": IdentityDecoder, + "gzip": GZipDecoder, + "deflate": DeflateDecoder, + "br": BrotliDecoder, + "zstd": ZStandardDecoder, +} + + +if brotli is None: + SUPPORTED_DECODERS.pop("br") # pragma: no cover +if zstandard is None: + SUPPORTED_DECODERS.pop("zstd") # pragma: no cover diff --git a/.venv/lib/python3.10/site-packages/httpx/_exceptions.py b/.venv/lib/python3.10/site-packages/httpx/_exceptions.py new file mode 100644 index 0000000..77f45a6 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpx/_exceptions.py @@ -0,0 +1,379 @@ +""" +Our exception hierarchy: + +* HTTPError + x RequestError + + TransportError + - TimeoutException + · ConnectTimeout + · ReadTimeout + · WriteTimeout + · PoolTimeout + - NetworkError + · ConnectError + · ReadError + · WriteError + · CloseError + - ProtocolError + · LocalProtocolError + · RemoteProtocolError + - ProxyError + - UnsupportedProtocol + + DecodingError + + TooManyRedirects + x HTTPStatusError +* InvalidURL +* CookieConflict +* StreamError + x StreamConsumed + x StreamClosed + x ResponseNotRead + x RequestNotRead +""" + +from __future__ import annotations + +import contextlib +import typing + +if typing.TYPE_CHECKING: + from ._models import Request, Response # pragma: no cover + +__all__ = [ + "CloseError", + "ConnectError", + "ConnectTimeout", + "CookieConflict", + "DecodingError", + "HTTPError", + "HTTPStatusError", + "InvalidURL", + "LocalProtocolError", + "NetworkError", + "PoolTimeout", + "ProtocolError", + "ProxyError", + "ReadError", + "ReadTimeout", + "RemoteProtocolError", + "RequestError", + "RequestNotRead", + "ResponseNotRead", + "StreamClosed", + "StreamConsumed", + "StreamError", + "TimeoutException", + "TooManyRedirects", + "TransportError", + "UnsupportedProtocol", + "WriteError", + "WriteTimeout", +] + + +class HTTPError(Exception): + """ + Base class for `RequestError` and `HTTPStatusError`. + + Useful for `try...except` blocks when issuing a request, + and then calling `.raise_for_status()`. + + For example: + + ``` + try: + response = httpx.get("https://www.example.com") + response.raise_for_status() + except httpx.HTTPError as exc: + print(f"HTTP Exception for {exc.request.url} - {exc}") + ``` + """ + + def __init__(self, message: str) -> None: + super().__init__(message) + self._request: Request | None = None + + @property + def request(self) -> Request: + if self._request is None: + raise RuntimeError("The .request property has not been set.") + return self._request + + @request.setter + def request(self, request: Request) -> None: + self._request = request + + +class RequestError(HTTPError): + """ + Base class for all exceptions that may occur when issuing a `.request()`. + """ + + def __init__(self, message: str, *, request: Request | None = None) -> None: + super().__init__(message) + # At the point an exception is raised we won't typically have a request + # instance to associate it with. + # + # The 'request_context' context manager is used within the Client and + # Response methods in order to ensure that any raised exceptions + # have a `.request` property set on them. + self._request = request + + +class TransportError(RequestError): + """ + Base class for all exceptions that occur at the level of the Transport API. + """ + + +# Timeout exceptions... + + +class TimeoutException(TransportError): + """ + The base class for timeout errors. + + An operation has timed out. + """ + + +class ConnectTimeout(TimeoutException): + """ + Timed out while connecting to the host. + """ + + +class ReadTimeout(TimeoutException): + """ + Timed out while receiving data from the host. + """ + + +class WriteTimeout(TimeoutException): + """ + Timed out while sending data to the host. + """ + + +class PoolTimeout(TimeoutException): + """ + Timed out waiting to acquire a connection from the pool. + """ + + +# Core networking exceptions... + + +class NetworkError(TransportError): + """ + The base class for network-related errors. + + An error occurred while interacting with the network. + """ + + +class ReadError(NetworkError): + """ + Failed to receive data from the network. + """ + + +class WriteError(NetworkError): + """ + Failed to send data through the network. + """ + + +class ConnectError(NetworkError): + """ + Failed to establish a connection. + """ + + +class CloseError(NetworkError): + """ + Failed to close a connection. + """ + + +# Other transport exceptions... + + +class ProxyError(TransportError): + """ + An error occurred while establishing a proxy connection. + """ + + +class UnsupportedProtocol(TransportError): + """ + Attempted to make a request to an unsupported protocol. + + For example issuing a request to `ftp://www.example.com`. + """ + + +class ProtocolError(TransportError): + """ + The protocol was violated. + """ + + +class LocalProtocolError(ProtocolError): + """ + A protocol was violated by the client. + + For example if the user instantiated a `Request` instance explicitly, + failed to include the mandatory `Host:` header, and then issued it directly + using `client.send()`. + """ + + +class RemoteProtocolError(ProtocolError): + """ + The protocol was violated by the server. + + For example, returning malformed HTTP. + """ + + +# Other request exceptions... + + +class DecodingError(RequestError): + """ + Decoding of the response failed, due to a malformed encoding. + """ + + +class TooManyRedirects(RequestError): + """ + Too many redirects. + """ + + +# Client errors + + +class HTTPStatusError(HTTPError): + """ + The response had an error HTTP status of 4xx or 5xx. + + May be raised when calling `response.raise_for_status()` + """ + + def __init__(self, message: str, *, request: Request, response: Response) -> None: + super().__init__(message) + self.request = request + self.response = response + + +class InvalidURL(Exception): + """ + URL is improperly formed or cannot be parsed. + """ + + def __init__(self, message: str) -> None: + super().__init__(message) + + +class CookieConflict(Exception): + """ + Attempted to lookup a cookie by name, but multiple cookies existed. + + Can occur when calling `response.cookies.get(...)`. + """ + + def __init__(self, message: str) -> None: + super().__init__(message) + + +# Stream exceptions... + +# These may occur as the result of a programming error, by accessing +# the request/response stream in an invalid manner. + + +class StreamError(RuntimeError): + """ + The base class for stream exceptions. + + The developer made an error in accessing the request stream in + an invalid way. + """ + + def __init__(self, message: str) -> None: + super().__init__(message) + + +class StreamConsumed(StreamError): + """ + Attempted to read or stream content, but the content has already + been streamed. + """ + + def __init__(self) -> None: + message = ( + "Attempted to read or stream some content, but the content has " + "already been streamed. For requests, this could be due to passing " + "a generator as request content, and then receiving a redirect " + "response or a secondary request as part of an authentication flow." + "For responses, this could be due to attempting to stream the response " + "content more than once." + ) + super().__init__(message) + + +class StreamClosed(StreamError): + """ + Attempted to read or stream response content, but the request has been + closed. + """ + + def __init__(self) -> None: + message = ( + "Attempted to read or stream content, but the stream has " "been closed." + ) + super().__init__(message) + + +class ResponseNotRead(StreamError): + """ + Attempted to access streaming response content, without having called `read()`. + """ + + def __init__(self) -> None: + message = ( + "Attempted to access streaming response content," + " without having called `read()`." + ) + super().__init__(message) + + +class RequestNotRead(StreamError): + """ + Attempted to access streaming request content, without having called `read()`. + """ + + def __init__(self) -> None: + message = ( + "Attempted to access streaming request content," + " without having called `read()`." + ) + super().__init__(message) + + +@contextlib.contextmanager +def request_context( + request: Request | None = None, +) -> typing.Iterator[None]: + """ + A context manager that can be used to attach the given request context + to any `RequestError` exceptions that are raised within the block. + """ + try: + yield + except RequestError as exc: + if request is not None: + exc.request = request + raise exc diff --git a/.venv/lib/python3.10/site-packages/httpx/_main.py b/.venv/lib/python3.10/site-packages/httpx/_main.py new file mode 100644 index 0000000..cffa4bb --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpx/_main.py @@ -0,0 +1,506 @@ +from __future__ import annotations + +import functools +import json +import sys +import typing + +import click +import pygments.lexers +import pygments.util +import rich.console +import rich.markup +import rich.progress +import rich.syntax +import rich.table + +from ._client import Client +from ._exceptions import RequestError +from ._models import Response +from ._status_codes import codes + +if typing.TYPE_CHECKING: + import httpcore # pragma: no cover + + +def print_help() -> None: + console = rich.console.Console() + + console.print("[bold]HTTPX :butterfly:", justify="center") + console.print() + console.print("A next generation HTTP client.", justify="center") + console.print() + console.print( + "Usage: [bold]httpx[/bold] [cyan] [OPTIONS][/cyan] ", justify="left" + ) + console.print() + + table = rich.table.Table.grid(padding=1, pad_edge=True) + table.add_column("Parameter", no_wrap=True, justify="left", style="bold") + table.add_column("Description") + table.add_row( + "-m, --method [cyan]METHOD", + "Request method, such as GET, POST, PUT, PATCH, DELETE, OPTIONS, HEAD.\n" + "[Default: GET, or POST if a request body is included]", + ) + table.add_row( + "-p, --params [cyan] ...", + "Query parameters to include in the request URL.", + ) + table.add_row( + "-c, --content [cyan]TEXT", "Byte content to include in the request body." + ) + table.add_row( + "-d, --data [cyan] ...", "Form data to include in the request body." + ) + table.add_row( + "-f, --files [cyan] ...", + "Form files to include in the request body.", + ) + table.add_row("-j, --json [cyan]TEXT", "JSON data to include in the request body.") + table.add_row( + "-h, --headers [cyan] ...", + "Include additional HTTP headers in the request.", + ) + table.add_row( + "--cookies [cyan] ...", "Cookies to include in the request." + ) + table.add_row( + "--auth [cyan]", + "Username and password to include in the request. Specify '-' for the password" + " to use a password prompt. Note that using --verbose/-v will expose" + " the Authorization header, including the password encoding" + " in a trivially reversible format.", + ) + + table.add_row( + "--proxy [cyan]URL", + "Send the request via a proxy. Should be the URL giving the proxy address.", + ) + + table.add_row( + "--timeout [cyan]FLOAT", + "Timeout value to use for network operations, such as establishing the" + " connection, reading some data, etc... [Default: 5.0]", + ) + + table.add_row("--follow-redirects", "Automatically follow redirects.") + table.add_row("--no-verify", "Disable SSL verification.") + table.add_row( + "--http2", "Send the request using HTTP/2, if the remote server supports it." + ) + + table.add_row( + "--download [cyan]FILE", + "Save the response content as a file, rather than displaying it.", + ) + + table.add_row("-v, --verbose", "Verbose output. Show request as well as response.") + table.add_row("--help", "Show this message and exit.") + console.print(table) + + +def get_lexer_for_response(response: Response) -> str: + content_type = response.headers.get("Content-Type") + if content_type is not None: + mime_type, _, _ = content_type.partition(";") + try: + return typing.cast( + str, pygments.lexers.get_lexer_for_mimetype(mime_type.strip()).name + ) + except pygments.util.ClassNotFound: # pragma: no cover + pass + return "" # pragma: no cover + + +def format_request_headers(request: httpcore.Request, http2: bool = False) -> str: + version = "HTTP/2" if http2 else "HTTP/1.1" + headers = [ + (name.lower() if http2 else name, value) for name, value in request.headers + ] + method = request.method.decode("ascii") + target = request.url.target.decode("ascii") + lines = [f"{method} {target} {version}"] + [ + f"{name.decode('ascii')}: {value.decode('ascii')}" for name, value in headers + ] + return "\n".join(lines) + + +def format_response_headers( + http_version: bytes, + status: int, + reason_phrase: bytes | None, + headers: list[tuple[bytes, bytes]], +) -> str: + version = http_version.decode("ascii") + reason = ( + codes.get_reason_phrase(status) + if reason_phrase is None + else reason_phrase.decode("ascii") + ) + lines = [f"{version} {status} {reason}"] + [ + f"{name.decode('ascii')}: {value.decode('ascii')}" for name, value in headers + ] + return "\n".join(lines) + + +def print_request_headers(request: httpcore.Request, http2: bool = False) -> None: + console = rich.console.Console() + http_text = format_request_headers(request, http2=http2) + syntax = rich.syntax.Syntax(http_text, "http", theme="ansi_dark", word_wrap=True) + console.print(syntax) + syntax = rich.syntax.Syntax("", "http", theme="ansi_dark", word_wrap=True) + console.print(syntax) + + +def print_response_headers( + http_version: bytes, + status: int, + reason_phrase: bytes | None, + headers: list[tuple[bytes, bytes]], +) -> None: + console = rich.console.Console() + http_text = format_response_headers(http_version, status, reason_phrase, headers) + syntax = rich.syntax.Syntax(http_text, "http", theme="ansi_dark", word_wrap=True) + console.print(syntax) + syntax = rich.syntax.Syntax("", "http", theme="ansi_dark", word_wrap=True) + console.print(syntax) + + +def print_response(response: Response) -> None: + console = rich.console.Console() + lexer_name = get_lexer_for_response(response) + if lexer_name: + if lexer_name.lower() == "json": + try: + data = response.json() + text = json.dumps(data, indent=4) + except ValueError: # pragma: no cover + text = response.text + else: + text = response.text + + syntax = rich.syntax.Syntax(text, lexer_name, theme="ansi_dark", word_wrap=True) + console.print(syntax) + else: + console.print(f"<{len(response.content)} bytes of binary data>") + + +_PCTRTT = typing.Tuple[typing.Tuple[str, str], ...] +_PCTRTTT = typing.Tuple[_PCTRTT, ...] +_PeerCertRetDictType = typing.Dict[str, typing.Union[str, _PCTRTTT, _PCTRTT]] + + +def format_certificate(cert: _PeerCertRetDictType) -> str: # pragma: no cover + lines = [] + for key, value in cert.items(): + if isinstance(value, (list, tuple)): + lines.append(f"* {key}:") + for item in value: + if key in ("subject", "issuer"): + for sub_item in item: + lines.append(f"* {sub_item[0]}: {sub_item[1]!r}") + elif isinstance(item, tuple) and len(item) == 2: + lines.append(f"* {item[0]}: {item[1]!r}") + else: + lines.append(f"* {item!r}") + else: + lines.append(f"* {key}: {value!r}") + return "\n".join(lines) + + +def trace( + name: str, info: typing.Mapping[str, typing.Any], verbose: bool = False +) -> None: + console = rich.console.Console() + if name == "connection.connect_tcp.started" and verbose: + host = info["host"] + console.print(f"* Connecting to {host!r}") + elif name == "connection.connect_tcp.complete" and verbose: + stream = info["return_value"] + server_addr = stream.get_extra_info("server_addr") + console.print(f"* Connected to {server_addr[0]!r} on port {server_addr[1]}") + elif name == "connection.start_tls.complete" and verbose: # pragma: no cover + stream = info["return_value"] + ssl_object = stream.get_extra_info("ssl_object") + version = ssl_object.version() + cipher = ssl_object.cipher() + server_cert = ssl_object.getpeercert() + alpn = ssl_object.selected_alpn_protocol() + console.print(f"* SSL established using {version!r} / {cipher[0]!r}") + console.print(f"* Selected ALPN protocol: {alpn!r}") + if server_cert: + console.print("* Server certificate:") + console.print(format_certificate(server_cert)) + elif name == "http11.send_request_headers.started" and verbose: + request = info["request"] + print_request_headers(request, http2=False) + elif name == "http2.send_request_headers.started" and verbose: # pragma: no cover + request = info["request"] + print_request_headers(request, http2=True) + elif name == "http11.receive_response_headers.complete": + http_version, status, reason_phrase, headers = info["return_value"] + print_response_headers(http_version, status, reason_phrase, headers) + elif name == "http2.receive_response_headers.complete": # pragma: no cover + status, headers = info["return_value"] + http_version = b"HTTP/2" + reason_phrase = None + print_response_headers(http_version, status, reason_phrase, headers) + + +def download_response(response: Response, download: typing.BinaryIO) -> None: + console = rich.console.Console() + console.print() + content_length = response.headers.get("Content-Length") + with rich.progress.Progress( + "[progress.description]{task.description}", + "[progress.percentage]{task.percentage:>3.0f}%", + rich.progress.BarColumn(bar_width=None), + rich.progress.DownloadColumn(), + rich.progress.TransferSpeedColumn(), + ) as progress: + description = f"Downloading [bold]{rich.markup.escape(download.name)}" + download_task = progress.add_task( + description, + total=int(content_length or 0), + start=content_length is not None, + ) + for chunk in response.iter_bytes(): + download.write(chunk) + progress.update(download_task, completed=response.num_bytes_downloaded) + + +def validate_json( + ctx: click.Context, + param: click.Option | click.Parameter, + value: typing.Any, +) -> typing.Any: + if value is None: + return None + + try: + return json.loads(value) + except json.JSONDecodeError: # pragma: no cover + raise click.BadParameter("Not valid JSON") + + +def validate_auth( + ctx: click.Context, + param: click.Option | click.Parameter, + value: typing.Any, +) -> typing.Any: + if value == (None, None): + return None + + username, password = value + if password == "-": # pragma: no cover + password = click.prompt("Password", hide_input=True) + return (username, password) + + +def handle_help( + ctx: click.Context, + param: click.Option | click.Parameter, + value: typing.Any, +) -> None: + if not value or ctx.resilient_parsing: + return + + print_help() + ctx.exit() + + +@click.command(add_help_option=False) +@click.argument("url", type=str) +@click.option( + "--method", + "-m", + "method", + type=str, + help=( + "Request method, such as GET, POST, PUT, PATCH, DELETE, OPTIONS, HEAD. " + "[Default: GET, or POST if a request body is included]" + ), +) +@click.option( + "--params", + "-p", + "params", + type=(str, str), + multiple=True, + help="Query parameters to include in the request URL.", +) +@click.option( + "--content", + "-c", + "content", + type=str, + help="Byte content to include in the request body.", +) +@click.option( + "--data", + "-d", + "data", + type=(str, str), + multiple=True, + help="Form data to include in the request body.", +) +@click.option( + "--files", + "-f", + "files", + type=(str, click.File(mode="rb")), + multiple=True, + help="Form files to include in the request body.", +) +@click.option( + "--json", + "-j", + "json", + type=str, + callback=validate_json, + help="JSON data to include in the request body.", +) +@click.option( + "--headers", + "-h", + "headers", + type=(str, str), + multiple=True, + help="Include additional HTTP headers in the request.", +) +@click.option( + "--cookies", + "cookies", + type=(str, str), + multiple=True, + help="Cookies to include in the request.", +) +@click.option( + "--auth", + "auth", + type=(str, str), + default=(None, None), + callback=validate_auth, + help=( + "Username and password to include in the request. " + "Specify '-' for the password to use a password prompt. " + "Note that using --verbose/-v will expose the Authorization header, " + "including the password encoding in a trivially reversible format." + ), +) +@click.option( + "--proxy", + "proxy", + type=str, + default=None, + help="Send the request via a proxy. Should be the URL giving the proxy address.", +) +@click.option( + "--timeout", + "timeout", + type=float, + default=5.0, + help=( + "Timeout value to use for network operations, such as establishing the " + "connection, reading some data, etc... [Default: 5.0]" + ), +) +@click.option( + "--follow-redirects", + "follow_redirects", + is_flag=True, + default=False, + help="Automatically follow redirects.", +) +@click.option( + "--no-verify", + "verify", + is_flag=True, + default=True, + help="Disable SSL verification.", +) +@click.option( + "--http2", + "http2", + type=bool, + is_flag=True, + default=False, + help="Send the request using HTTP/2, if the remote server supports it.", +) +@click.option( + "--download", + type=click.File("wb"), + help="Save the response content as a file, rather than displaying it.", +) +@click.option( + "--verbose", + "-v", + type=bool, + is_flag=True, + default=False, + help="Verbose. Show request as well as response.", +) +@click.option( + "--help", + is_flag=True, + is_eager=True, + expose_value=False, + callback=handle_help, + help="Show this message and exit.", +) +def main( + url: str, + method: str, + params: list[tuple[str, str]], + content: str, + data: list[tuple[str, str]], + files: list[tuple[str, click.File]], + json: str, + headers: list[tuple[str, str]], + cookies: list[tuple[str, str]], + auth: tuple[str, str] | None, + proxy: str, + timeout: float, + follow_redirects: bool, + verify: bool, + http2: bool, + download: typing.BinaryIO | None, + verbose: bool, +) -> None: + """ + An HTTP command line client. + Sends a request and displays the response. + """ + if not method: + method = "POST" if content or data or files or json else "GET" + + try: + with Client(proxy=proxy, timeout=timeout, http2=http2, verify=verify) as client: + with client.stream( + method, + url, + params=list(params), + content=content, + data=dict(data), + files=files, # type: ignore + json=json, + headers=headers, + cookies=dict(cookies), + auth=auth, + follow_redirects=follow_redirects, + extensions={"trace": functools.partial(trace, verbose=verbose)}, + ) as response: + if download is not None: + download_response(response, download) + else: + response.read() + if response.content: + print_response(response) + + except RequestError as exc: + console = rich.console.Console() + console.print(f"[red]{type(exc).__name__}[/red]: {exc}") + sys.exit(1) + + sys.exit(0 if response.is_success else 1) diff --git a/.venv/lib/python3.10/site-packages/httpx/_models.py b/.venv/lib/python3.10/site-packages/httpx/_models.py new file mode 100644 index 0000000..67d74bf --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpx/_models.py @@ -0,0 +1,1277 @@ +from __future__ import annotations + +import codecs +import datetime +import email.message +import json as jsonlib +import re +import typing +import urllib.request +from collections.abc import Mapping +from http.cookiejar import Cookie, CookieJar + +from ._content import ByteStream, UnattachedStream, encode_request, encode_response +from ._decoders import ( + SUPPORTED_DECODERS, + ByteChunker, + ContentDecoder, + IdentityDecoder, + LineDecoder, + MultiDecoder, + TextChunker, + TextDecoder, +) +from ._exceptions import ( + CookieConflict, + HTTPStatusError, + RequestNotRead, + ResponseNotRead, + StreamClosed, + StreamConsumed, + request_context, +) +from ._multipart import get_multipart_boundary_from_content_type +from ._status_codes import codes +from ._types import ( + AsyncByteStream, + CookieTypes, + HeaderTypes, + QueryParamTypes, + RequestContent, + RequestData, + RequestExtensions, + RequestFiles, + ResponseContent, + ResponseExtensions, + SyncByteStream, +) +from ._urls import URL +from ._utils import to_bytes_or_str, to_str + +__all__ = ["Cookies", "Headers", "Request", "Response"] + +SENSITIVE_HEADERS = {"authorization", "proxy-authorization"} + + +def _is_known_encoding(encoding: str) -> bool: + """ + Return `True` if `encoding` is a known codec. + """ + try: + codecs.lookup(encoding) + except LookupError: + return False + return True + + +def _normalize_header_key(key: str | bytes, encoding: str | None = None) -> bytes: + """ + Coerce str/bytes into a strictly byte-wise HTTP header key. + """ + return key if isinstance(key, bytes) else key.encode(encoding or "ascii") + + +def _normalize_header_value(value: str | bytes, encoding: str | None = None) -> bytes: + """ + Coerce str/bytes into a strictly byte-wise HTTP header value. + """ + if isinstance(value, bytes): + return value + if not isinstance(value, str): + raise TypeError(f"Header value must be str or bytes, not {type(value)}") + return value.encode(encoding or "ascii") + + +def _parse_content_type_charset(content_type: str) -> str | None: + # We used to use `cgi.parse_header()` here, but `cgi` became a dead battery. + # See: https://peps.python.org/pep-0594/#cgi + msg = email.message.Message() + msg["content-type"] = content_type + return msg.get_content_charset(failobj=None) + + +def _parse_header_links(value: str) -> list[dict[str, str]]: + """ + Returns a list of parsed link headers, for more info see: + https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Link + The generic syntax of those is: + Link: < uri-reference >; param1=value1; param2="value2" + So for instance: + Link; '; type="image/jpeg",;' + would return + [ + {"url": "http:/.../front.jpeg", "type": "image/jpeg"}, + {"url": "http://.../back.jpeg"}, + ] + :param value: HTTP Link entity-header field + :return: list of parsed link headers + """ + links: list[dict[str, str]] = [] + replace_chars = " '\"" + value = value.strip(replace_chars) + if not value: + return links + for val in re.split(", *<", value): + try: + url, params = val.split(";", 1) + except ValueError: + url, params = val, "" + link = {"url": url.strip("<> '\"")} + for param in params.split(";"): + try: + key, value = param.split("=") + except ValueError: + break + link[key.strip(replace_chars)] = value.strip(replace_chars) + links.append(link) + return links + + +def _obfuscate_sensitive_headers( + items: typing.Iterable[tuple[typing.AnyStr, typing.AnyStr]], +) -> typing.Iterator[tuple[typing.AnyStr, typing.AnyStr]]: + for k, v in items: + if to_str(k.lower()) in SENSITIVE_HEADERS: + v = to_bytes_or_str("[secure]", match_type_of=v) + yield k, v + + +class Headers(typing.MutableMapping[str, str]): + """ + HTTP headers, as a case-insensitive multi-dict. + """ + + def __init__( + self, + headers: HeaderTypes | None = None, + encoding: str | None = None, + ) -> None: + self._list = [] # type: typing.List[typing.Tuple[bytes, bytes, bytes]] + + if isinstance(headers, Headers): + self._list = list(headers._list) + elif isinstance(headers, Mapping): + for k, v in headers.items(): + bytes_key = _normalize_header_key(k, encoding) + bytes_value = _normalize_header_value(v, encoding) + self._list.append((bytes_key, bytes_key.lower(), bytes_value)) + elif headers is not None: + for k, v in headers: + bytes_key = _normalize_header_key(k, encoding) + bytes_value = _normalize_header_value(v, encoding) + self._list.append((bytes_key, bytes_key.lower(), bytes_value)) + + self._encoding = encoding + + @property + def encoding(self) -> str: + """ + Header encoding is mandated as ascii, but we allow fallbacks to utf-8 + or iso-8859-1. + """ + if self._encoding is None: + for encoding in ["ascii", "utf-8"]: + for key, value in self.raw: + try: + key.decode(encoding) + value.decode(encoding) + except UnicodeDecodeError: + break + else: + # The else block runs if 'break' did not occur, meaning + # all values fitted the encoding. + self._encoding = encoding + break + else: + # The ISO-8859-1 encoding covers all 256 code points in a byte, + # so will never raise decode errors. + self._encoding = "iso-8859-1" + return self._encoding + + @encoding.setter + def encoding(self, value: str) -> None: + self._encoding = value + + @property + def raw(self) -> list[tuple[bytes, bytes]]: + """ + Returns a list of the raw header items, as byte pairs. + """ + return [(raw_key, value) for raw_key, _, value in self._list] + + def keys(self) -> typing.KeysView[str]: + return {key.decode(self.encoding): None for _, key, value in self._list}.keys() + + def values(self) -> typing.ValuesView[str]: + values_dict: dict[str, str] = {} + for _, key, value in self._list: + str_key = key.decode(self.encoding) + str_value = value.decode(self.encoding) + if str_key in values_dict: + values_dict[str_key] += f", {str_value}" + else: + values_dict[str_key] = str_value + return values_dict.values() + + def items(self) -> typing.ItemsView[str, str]: + """ + Return `(key, value)` items of headers. Concatenate headers + into a single comma separated value when a key occurs multiple times. + """ + values_dict: dict[str, str] = {} + for _, key, value in self._list: + str_key = key.decode(self.encoding) + str_value = value.decode(self.encoding) + if str_key in values_dict: + values_dict[str_key] += f", {str_value}" + else: + values_dict[str_key] = str_value + return values_dict.items() + + def multi_items(self) -> list[tuple[str, str]]: + """ + Return a list of `(key, value)` pairs of headers. Allow multiple + occurrences of the same key without concatenating into a single + comma separated value. + """ + return [ + (key.decode(self.encoding), value.decode(self.encoding)) + for _, key, value in self._list + ] + + def get(self, key: str, default: typing.Any = None) -> typing.Any: + """ + Return a header value. If multiple occurrences of the header occur + then concatenate them together with commas. + """ + try: + return self[key] + except KeyError: + return default + + def get_list(self, key: str, split_commas: bool = False) -> list[str]: + """ + Return a list of all header values for a given key. + If `split_commas=True` is passed, then any comma separated header + values are split into multiple return strings. + """ + get_header_key = key.lower().encode(self.encoding) + + values = [ + item_value.decode(self.encoding) + for _, item_key, item_value in self._list + if item_key.lower() == get_header_key + ] + + if not split_commas: + return values + + split_values = [] + for value in values: + split_values.extend([item.strip() for item in value.split(",")]) + return split_values + + def update(self, headers: HeaderTypes | None = None) -> None: # type: ignore + headers = Headers(headers) + for key in headers.keys(): + if key in self: + self.pop(key) + self._list.extend(headers._list) + + def copy(self) -> Headers: + return Headers(self, encoding=self.encoding) + + def __getitem__(self, key: str) -> str: + """ + Return a single header value. + + If there are multiple headers with the same key, then we concatenate + them with commas. See: https://tools.ietf.org/html/rfc7230#section-3.2.2 + """ + normalized_key = key.lower().encode(self.encoding) + + items = [ + header_value.decode(self.encoding) + for _, header_key, header_value in self._list + if header_key == normalized_key + ] + + if items: + return ", ".join(items) + + raise KeyError(key) + + def __setitem__(self, key: str, value: str) -> None: + """ + Set the header `key` to `value`, removing any duplicate entries. + Retains insertion order. + """ + set_key = key.encode(self._encoding or "utf-8") + set_value = value.encode(self._encoding or "utf-8") + lookup_key = set_key.lower() + + found_indexes = [ + idx + for idx, (_, item_key, _) in enumerate(self._list) + if item_key == lookup_key + ] + + for idx in reversed(found_indexes[1:]): + del self._list[idx] + + if found_indexes: + idx = found_indexes[0] + self._list[idx] = (set_key, lookup_key, set_value) + else: + self._list.append((set_key, lookup_key, set_value)) + + def __delitem__(self, key: str) -> None: + """ + Remove the header `key`. + """ + del_key = key.lower().encode(self.encoding) + + pop_indexes = [ + idx + for idx, (_, item_key, _) in enumerate(self._list) + if item_key.lower() == del_key + ] + + if not pop_indexes: + raise KeyError(key) + + for idx in reversed(pop_indexes): + del self._list[idx] + + def __contains__(self, key: typing.Any) -> bool: + header_key = key.lower().encode(self.encoding) + return header_key in [key for _, key, _ in self._list] + + def __iter__(self) -> typing.Iterator[typing.Any]: + return iter(self.keys()) + + def __len__(self) -> int: + return len(self._list) + + def __eq__(self, other: typing.Any) -> bool: + try: + other_headers = Headers(other) + except ValueError: + return False + + self_list = [(key, value) for _, key, value in self._list] + other_list = [(key, value) for _, key, value in other_headers._list] + return sorted(self_list) == sorted(other_list) + + def __repr__(self) -> str: + class_name = self.__class__.__name__ + + encoding_str = "" + if self.encoding != "ascii": + encoding_str = f", encoding={self.encoding!r}" + + as_list = list(_obfuscate_sensitive_headers(self.multi_items())) + as_dict = dict(as_list) + + no_duplicate_keys = len(as_dict) == len(as_list) + if no_duplicate_keys: + return f"{class_name}({as_dict!r}{encoding_str})" + return f"{class_name}({as_list!r}{encoding_str})" + + +class Request: + def __init__( + self, + method: str, + url: URL | str, + *, + params: QueryParamTypes | None = None, + headers: HeaderTypes | None = None, + cookies: CookieTypes | None = None, + content: RequestContent | None = None, + data: RequestData | None = None, + files: RequestFiles | None = None, + json: typing.Any | None = None, + stream: SyncByteStream | AsyncByteStream | None = None, + extensions: RequestExtensions | None = None, + ) -> None: + self.method = method.upper() + self.url = URL(url) if params is None else URL(url, params=params) + self.headers = Headers(headers) + self.extensions = {} if extensions is None else dict(extensions) + + if cookies: + Cookies(cookies).set_cookie_header(self) + + if stream is None: + content_type: str | None = self.headers.get("content-type") + headers, stream = encode_request( + content=content, + data=data, + files=files, + json=json, + boundary=get_multipart_boundary_from_content_type( + content_type=content_type.encode(self.headers.encoding) + if content_type + else None + ), + ) + self._prepare(headers) + self.stream = stream + # Load the request body, except for streaming content. + if isinstance(stream, ByteStream): + self.read() + else: + # There's an important distinction between `Request(content=...)`, + # and `Request(stream=...)`. + # + # Using `content=...` implies automatically populated `Host` and content + # headers, of either `Content-Length: ...` or `Transfer-Encoding: chunked`. + # + # Using `stream=...` will not automatically include *any* + # auto-populated headers. + # + # As an end-user you don't really need `stream=...`. It's only + # useful when: + # + # * Preserving the request stream when copying requests, eg for redirects. + # * Creating request instances on the *server-side* of the transport API. + self.stream = stream + + def _prepare(self, default_headers: dict[str, str]) -> None: + for key, value in default_headers.items(): + # Ignore Transfer-Encoding if the Content-Length has been set explicitly. + if key.lower() == "transfer-encoding" and "Content-Length" in self.headers: + continue + self.headers.setdefault(key, value) + + auto_headers: list[tuple[bytes, bytes]] = [] + + has_host = "Host" in self.headers + has_content_length = ( + "Content-Length" in self.headers or "Transfer-Encoding" in self.headers + ) + + if not has_host and self.url.host: + auto_headers.append((b"Host", self.url.netloc)) + if not has_content_length and self.method in ("POST", "PUT", "PATCH"): + auto_headers.append((b"Content-Length", b"0")) + + self.headers = Headers(auto_headers + self.headers.raw) + + @property + def content(self) -> bytes: + if not hasattr(self, "_content"): + raise RequestNotRead() + return self._content + + def read(self) -> bytes: + """ + Read and return the request content. + """ + if not hasattr(self, "_content"): + assert isinstance(self.stream, typing.Iterable) + self._content = b"".join(self.stream) + if not isinstance(self.stream, ByteStream): + # If a streaming request has been read entirely into memory, then + # we can replace the stream with a raw bytes implementation, + # to ensure that any non-replayable streams can still be used. + self.stream = ByteStream(self._content) + return self._content + + async def aread(self) -> bytes: + """ + Read and return the request content. + """ + if not hasattr(self, "_content"): + assert isinstance(self.stream, typing.AsyncIterable) + self._content = b"".join([part async for part in self.stream]) + if not isinstance(self.stream, ByteStream): + # If a streaming request has been read entirely into memory, then + # we can replace the stream with a raw bytes implementation, + # to ensure that any non-replayable streams can still be used. + self.stream = ByteStream(self._content) + return self._content + + def __repr__(self) -> str: + class_name = self.__class__.__name__ + url = str(self.url) + return f"<{class_name}({self.method!r}, {url!r})>" + + def __getstate__(self) -> dict[str, typing.Any]: + return { + name: value + for name, value in self.__dict__.items() + if name not in ["extensions", "stream"] + } + + def __setstate__(self, state: dict[str, typing.Any]) -> None: + for name, value in state.items(): + setattr(self, name, value) + self.extensions = {} + self.stream = UnattachedStream() + + +class Response: + def __init__( + self, + status_code: int, + *, + headers: HeaderTypes | None = None, + content: ResponseContent | None = None, + text: str | None = None, + html: str | None = None, + json: typing.Any = None, + stream: SyncByteStream | AsyncByteStream | None = None, + request: Request | None = None, + extensions: ResponseExtensions | None = None, + history: list[Response] | None = None, + default_encoding: str | typing.Callable[[bytes], str] = "utf-8", + ) -> None: + self.status_code = status_code + self.headers = Headers(headers) + + self._request: Request | None = request + + # When follow_redirects=False and a redirect is received, + # the client will set `response.next_request`. + self.next_request: Request | None = None + + self.extensions = {} if extensions is None else dict(extensions) + self.history = [] if history is None else list(history) + + self.is_closed = False + self.is_stream_consumed = False + + self.default_encoding = default_encoding + + if stream is None: + headers, stream = encode_response(content, text, html, json) + self._prepare(headers) + self.stream = stream + if isinstance(stream, ByteStream): + # Load the response body, except for streaming content. + self.read() + else: + # There's an important distinction between `Response(content=...)`, + # and `Response(stream=...)`. + # + # Using `content=...` implies automatically populated content headers, + # of either `Content-Length: ...` or `Transfer-Encoding: chunked`. + # + # Using `stream=...` will not automatically include any content headers. + # + # As an end-user you don't really need `stream=...`. It's only + # useful when creating response instances having received a stream + # from the transport API. + self.stream = stream + + self._num_bytes_downloaded = 0 + + def _prepare(self, default_headers: dict[str, str]) -> None: + for key, value in default_headers.items(): + # Ignore Transfer-Encoding if the Content-Length has been set explicitly. + if key.lower() == "transfer-encoding" and "content-length" in self.headers: + continue + self.headers.setdefault(key, value) + + @property + def elapsed(self) -> datetime.timedelta: + """ + Returns the time taken for the complete request/response + cycle to complete. + """ + if not hasattr(self, "_elapsed"): + raise RuntimeError( + "'.elapsed' may only be accessed after the response " + "has been read or closed." + ) + return self._elapsed + + @elapsed.setter + def elapsed(self, elapsed: datetime.timedelta) -> None: + self._elapsed = elapsed + + @property + def request(self) -> Request: + """ + Returns the request instance associated to the current response. + """ + if self._request is None: + raise RuntimeError( + "The request instance has not been set on this response." + ) + return self._request + + @request.setter + def request(self, value: Request) -> None: + self._request = value + + @property + def http_version(self) -> str: + try: + http_version: bytes = self.extensions["http_version"] + except KeyError: + return "HTTP/1.1" + else: + return http_version.decode("ascii", errors="ignore") + + @property + def reason_phrase(self) -> str: + try: + reason_phrase: bytes = self.extensions["reason_phrase"] + except KeyError: + return codes.get_reason_phrase(self.status_code) + else: + return reason_phrase.decode("ascii", errors="ignore") + + @property + def url(self) -> URL: + """ + Returns the URL for which the request was made. + """ + return self.request.url + + @property + def content(self) -> bytes: + if not hasattr(self, "_content"): + raise ResponseNotRead() + return self._content + + @property + def text(self) -> str: + if not hasattr(self, "_text"): + content = self.content + if not content: + self._text = "" + else: + decoder = TextDecoder(encoding=self.encoding or "utf-8") + self._text = "".join([decoder.decode(self.content), decoder.flush()]) + return self._text + + @property + def encoding(self) -> str | None: + """ + Return an encoding to use for decoding the byte content into text. + The priority for determining this is given by... + + * `.encoding = <>` has been set explicitly. + * The encoding as specified by the charset parameter in the Content-Type header. + * The encoding as determined by `default_encoding`, which may either be + a string like "utf-8" indicating the encoding to use, or may be a callable + which enables charset autodetection. + """ + if not hasattr(self, "_encoding"): + encoding = self.charset_encoding + if encoding is None or not _is_known_encoding(encoding): + if isinstance(self.default_encoding, str): + encoding = self.default_encoding + elif hasattr(self, "_content"): + encoding = self.default_encoding(self._content) + self._encoding = encoding or "utf-8" + return self._encoding + + @encoding.setter + def encoding(self, value: str) -> None: + """ + Set the encoding to use for decoding the byte content into text. + + If the `text` attribute has been accessed, attempting to set the + encoding will throw a ValueError. + """ + if hasattr(self, "_text"): + raise ValueError( + "Setting encoding after `text` has been accessed is not allowed." + ) + self._encoding = value + + @property + def charset_encoding(self) -> str | None: + """ + Return the encoding, as specified by the Content-Type header. + """ + content_type = self.headers.get("Content-Type") + if content_type is None: + return None + + return _parse_content_type_charset(content_type) + + def _get_content_decoder(self) -> ContentDecoder: + """ + Returns a decoder instance which can be used to decode the raw byte + content, depending on the Content-Encoding used in the response. + """ + if not hasattr(self, "_decoder"): + decoders: list[ContentDecoder] = [] + values = self.headers.get_list("content-encoding", split_commas=True) + for value in values: + value = value.strip().lower() + try: + decoder_cls = SUPPORTED_DECODERS[value] + decoders.append(decoder_cls()) + except KeyError: + continue + + if len(decoders) == 1: + self._decoder = decoders[0] + elif len(decoders) > 1: + self._decoder = MultiDecoder(children=decoders) + else: + self._decoder = IdentityDecoder() + + return self._decoder + + @property + def is_informational(self) -> bool: + """ + A property which is `True` for 1xx status codes, `False` otherwise. + """ + return codes.is_informational(self.status_code) + + @property + def is_success(self) -> bool: + """ + A property which is `True` for 2xx status codes, `False` otherwise. + """ + return codes.is_success(self.status_code) + + @property + def is_redirect(self) -> bool: + """ + A property which is `True` for 3xx status codes, `False` otherwise. + + Note that not all responses with a 3xx status code indicate a URL redirect. + + Use `response.has_redirect_location` to determine responses with a properly + formed URL redirection. + """ + return codes.is_redirect(self.status_code) + + @property + def is_client_error(self) -> bool: + """ + A property which is `True` for 4xx status codes, `False` otherwise. + """ + return codes.is_client_error(self.status_code) + + @property + def is_server_error(self) -> bool: + """ + A property which is `True` for 5xx status codes, `False` otherwise. + """ + return codes.is_server_error(self.status_code) + + @property + def is_error(self) -> bool: + """ + A property which is `True` for 4xx and 5xx status codes, `False` otherwise. + """ + return codes.is_error(self.status_code) + + @property + def has_redirect_location(self) -> bool: + """ + Returns True for 3xx responses with a properly formed URL redirection, + `False` otherwise. + """ + return ( + self.status_code + in ( + # 301 (Cacheable redirect. Method may change to GET.) + codes.MOVED_PERMANENTLY, + # 302 (Uncacheable redirect. Method may change to GET.) + codes.FOUND, + # 303 (Client should make a GET or HEAD request.) + codes.SEE_OTHER, + # 307 (Equiv. 302, but retain method) + codes.TEMPORARY_REDIRECT, + # 308 (Equiv. 301, but retain method) + codes.PERMANENT_REDIRECT, + ) + and "Location" in self.headers + ) + + def raise_for_status(self) -> Response: + """ + Raise the `HTTPStatusError` if one occurred. + """ + request = self._request + if request is None: + raise RuntimeError( + "Cannot call `raise_for_status` as the request " + "instance has not been set on this response." + ) + + if self.is_success: + return self + + if self.has_redirect_location: + message = ( + "{error_type} '{0.status_code} {0.reason_phrase}' for url '{0.url}'\n" + "Redirect location: '{0.headers[location]}'\n" + "For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/{0.status_code}" + ) + else: + message = ( + "{error_type} '{0.status_code} {0.reason_phrase}' for url '{0.url}'\n" + "For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/{0.status_code}" + ) + + status_class = self.status_code // 100 + error_types = { + 1: "Informational response", + 3: "Redirect response", + 4: "Client error", + 5: "Server error", + } + error_type = error_types.get(status_class, "Invalid status code") + message = message.format(self, error_type=error_type) + raise HTTPStatusError(message, request=request, response=self) + + def json(self, **kwargs: typing.Any) -> typing.Any: + return jsonlib.loads(self.content, **kwargs) + + @property + def cookies(self) -> Cookies: + if not hasattr(self, "_cookies"): + self._cookies = Cookies() + self._cookies.extract_cookies(self) + return self._cookies + + @property + def links(self) -> dict[str | None, dict[str, str]]: + """ + Returns the parsed header links of the response, if any + """ + header = self.headers.get("link") + if header is None: + return {} + + return { + (link.get("rel") or link.get("url")): link + for link in _parse_header_links(header) + } + + @property + def num_bytes_downloaded(self) -> int: + return self._num_bytes_downloaded + + def __repr__(self) -> str: + return f"" + + def __getstate__(self) -> dict[str, typing.Any]: + return { + name: value + for name, value in self.__dict__.items() + if name not in ["extensions", "stream", "is_closed", "_decoder"] + } + + def __setstate__(self, state: dict[str, typing.Any]) -> None: + for name, value in state.items(): + setattr(self, name, value) + self.is_closed = True + self.extensions = {} + self.stream = UnattachedStream() + + def read(self) -> bytes: + """ + Read and return the response content. + """ + if not hasattr(self, "_content"): + self._content = b"".join(self.iter_bytes()) + return self._content + + def iter_bytes(self, chunk_size: int | None = None) -> typing.Iterator[bytes]: + """ + A byte-iterator over the decoded response content. + This allows us to handle gzip, deflate, brotli, and zstd encoded responses. + """ + if hasattr(self, "_content"): + chunk_size = len(self._content) if chunk_size is None else chunk_size + for i in range(0, len(self._content), max(chunk_size, 1)): + yield self._content[i : i + chunk_size] + else: + decoder = self._get_content_decoder() + chunker = ByteChunker(chunk_size=chunk_size) + with request_context(request=self._request): + for raw_bytes in self.iter_raw(): + decoded = decoder.decode(raw_bytes) + for chunk in chunker.decode(decoded): + yield chunk + decoded = decoder.flush() + for chunk in chunker.decode(decoded): + yield chunk # pragma: no cover + for chunk in chunker.flush(): + yield chunk + + def iter_text(self, chunk_size: int | None = None) -> typing.Iterator[str]: + """ + A str-iterator over the decoded response content + that handles both gzip, deflate, etc but also detects the content's + string encoding. + """ + decoder = TextDecoder(encoding=self.encoding or "utf-8") + chunker = TextChunker(chunk_size=chunk_size) + with request_context(request=self._request): + for byte_content in self.iter_bytes(): + text_content = decoder.decode(byte_content) + for chunk in chunker.decode(text_content): + yield chunk + text_content = decoder.flush() + for chunk in chunker.decode(text_content): + yield chunk # pragma: no cover + for chunk in chunker.flush(): + yield chunk + + def iter_lines(self) -> typing.Iterator[str]: + decoder = LineDecoder() + with request_context(request=self._request): + for text in self.iter_text(): + for line in decoder.decode(text): + yield line + for line in decoder.flush(): + yield line + + def iter_raw(self, chunk_size: int | None = None) -> typing.Iterator[bytes]: + """ + A byte-iterator over the raw response content. + """ + if self.is_stream_consumed: + raise StreamConsumed() + if self.is_closed: + raise StreamClosed() + if not isinstance(self.stream, SyncByteStream): + raise RuntimeError("Attempted to call a sync iterator on an async stream.") + + self.is_stream_consumed = True + self._num_bytes_downloaded = 0 + chunker = ByteChunker(chunk_size=chunk_size) + + with request_context(request=self._request): + for raw_stream_bytes in self.stream: + self._num_bytes_downloaded += len(raw_stream_bytes) + for chunk in chunker.decode(raw_stream_bytes): + yield chunk + + for chunk in chunker.flush(): + yield chunk + + self.close() + + def close(self) -> None: + """ + Close the response and release the connection. + Automatically called if the response body is read to completion. + """ + if not isinstance(self.stream, SyncByteStream): + raise RuntimeError("Attempted to call an sync close on an async stream.") + + if not self.is_closed: + self.is_closed = True + with request_context(request=self._request): + self.stream.close() + + async def aread(self) -> bytes: + """ + Read and return the response content. + """ + if not hasattr(self, "_content"): + self._content = b"".join([part async for part in self.aiter_bytes()]) + return self._content + + async def aiter_bytes( + self, chunk_size: int | None = None + ) -> typing.AsyncIterator[bytes]: + """ + A byte-iterator over the decoded response content. + This allows us to handle gzip, deflate, brotli, and zstd encoded responses. + """ + if hasattr(self, "_content"): + chunk_size = len(self._content) if chunk_size is None else chunk_size + for i in range(0, len(self._content), max(chunk_size, 1)): + yield self._content[i : i + chunk_size] + else: + decoder = self._get_content_decoder() + chunker = ByteChunker(chunk_size=chunk_size) + with request_context(request=self._request): + async for raw_bytes in self.aiter_raw(): + decoded = decoder.decode(raw_bytes) + for chunk in chunker.decode(decoded): + yield chunk + decoded = decoder.flush() + for chunk in chunker.decode(decoded): + yield chunk # pragma: no cover + for chunk in chunker.flush(): + yield chunk + + async def aiter_text( + self, chunk_size: int | None = None + ) -> typing.AsyncIterator[str]: + """ + A str-iterator over the decoded response content + that handles both gzip, deflate, etc but also detects the content's + string encoding. + """ + decoder = TextDecoder(encoding=self.encoding or "utf-8") + chunker = TextChunker(chunk_size=chunk_size) + with request_context(request=self._request): + async for byte_content in self.aiter_bytes(): + text_content = decoder.decode(byte_content) + for chunk in chunker.decode(text_content): + yield chunk + text_content = decoder.flush() + for chunk in chunker.decode(text_content): + yield chunk # pragma: no cover + for chunk in chunker.flush(): + yield chunk + + async def aiter_lines(self) -> typing.AsyncIterator[str]: + decoder = LineDecoder() + with request_context(request=self._request): + async for text in self.aiter_text(): + for line in decoder.decode(text): + yield line + for line in decoder.flush(): + yield line + + async def aiter_raw( + self, chunk_size: int | None = None + ) -> typing.AsyncIterator[bytes]: + """ + A byte-iterator over the raw response content. + """ + if self.is_stream_consumed: + raise StreamConsumed() + if self.is_closed: + raise StreamClosed() + if not isinstance(self.stream, AsyncByteStream): + raise RuntimeError("Attempted to call an async iterator on an sync stream.") + + self.is_stream_consumed = True + self._num_bytes_downloaded = 0 + chunker = ByteChunker(chunk_size=chunk_size) + + with request_context(request=self._request): + async for raw_stream_bytes in self.stream: + self._num_bytes_downloaded += len(raw_stream_bytes) + for chunk in chunker.decode(raw_stream_bytes): + yield chunk + + for chunk in chunker.flush(): + yield chunk + + await self.aclose() + + async def aclose(self) -> None: + """ + Close the response and release the connection. + Automatically called if the response body is read to completion. + """ + if not isinstance(self.stream, AsyncByteStream): + raise RuntimeError("Attempted to call an async close on an sync stream.") + + if not self.is_closed: + self.is_closed = True + with request_context(request=self._request): + await self.stream.aclose() + + +class Cookies(typing.MutableMapping[str, str]): + """ + HTTP Cookies, as a mutable mapping. + """ + + def __init__(self, cookies: CookieTypes | None = None) -> None: + if cookies is None or isinstance(cookies, dict): + self.jar = CookieJar() + if isinstance(cookies, dict): + for key, value in cookies.items(): + self.set(key, value) + elif isinstance(cookies, list): + self.jar = CookieJar() + for key, value in cookies: + self.set(key, value) + elif isinstance(cookies, Cookies): + self.jar = CookieJar() + for cookie in cookies.jar: + self.jar.set_cookie(cookie) + else: + self.jar = cookies + + def extract_cookies(self, response: Response) -> None: + """ + Loads any cookies based on the response `Set-Cookie` headers. + """ + urllib_response = self._CookieCompatResponse(response) + urllib_request = self._CookieCompatRequest(response.request) + + self.jar.extract_cookies(urllib_response, urllib_request) # type: ignore + + def set_cookie_header(self, request: Request) -> None: + """ + Sets an appropriate 'Cookie:' HTTP header on the `Request`. + """ + urllib_request = self._CookieCompatRequest(request) + self.jar.add_cookie_header(urllib_request) + + def set(self, name: str, value: str, domain: str = "", path: str = "/") -> None: + """ + Set a cookie value by name. May optionally include domain and path. + """ + kwargs = { + "version": 0, + "name": name, + "value": value, + "port": None, + "port_specified": False, + "domain": domain, + "domain_specified": bool(domain), + "domain_initial_dot": domain.startswith("."), + "path": path, + "path_specified": bool(path), + "secure": False, + "expires": None, + "discard": True, + "comment": None, + "comment_url": None, + "rest": {"HttpOnly": None}, + "rfc2109": False, + } + cookie = Cookie(**kwargs) # type: ignore + self.jar.set_cookie(cookie) + + def get( # type: ignore + self, + name: str, + default: str | None = None, + domain: str | None = None, + path: str | None = None, + ) -> str | None: + """ + Get a cookie by name. May optionally include domain and path + in order to specify exactly which cookie to retrieve. + """ + value = None + for cookie in self.jar: + if cookie.name == name: + if domain is None or cookie.domain == domain: + if path is None or cookie.path == path: + if value is not None: + message = f"Multiple cookies exist with name={name}" + raise CookieConflict(message) + value = cookie.value + + if value is None: + return default + return value + + def delete( + self, + name: str, + domain: str | None = None, + path: str | None = None, + ) -> None: + """ + Delete a cookie by name. May optionally include domain and path + in order to specify exactly which cookie to delete. + """ + if domain is not None and path is not None: + return self.jar.clear(domain, path, name) + + remove = [ + cookie + for cookie in self.jar + if cookie.name == name + and (domain is None or cookie.domain == domain) + and (path is None or cookie.path == path) + ] + + for cookie in remove: + self.jar.clear(cookie.domain, cookie.path, cookie.name) + + def clear(self, domain: str | None = None, path: str | None = None) -> None: + """ + Delete all cookies. Optionally include a domain and path in + order to only delete a subset of all the cookies. + """ + args = [] + if domain is not None: + args.append(domain) + if path is not None: + assert domain is not None + args.append(path) + self.jar.clear(*args) + + def update(self, cookies: CookieTypes | None = None) -> None: # type: ignore + cookies = Cookies(cookies) + for cookie in cookies.jar: + self.jar.set_cookie(cookie) + + def __setitem__(self, name: str, value: str) -> None: + return self.set(name, value) + + def __getitem__(self, name: str) -> str: + value = self.get(name) + if value is None: + raise KeyError(name) + return value + + def __delitem__(self, name: str) -> None: + return self.delete(name) + + def __len__(self) -> int: + return len(self.jar) + + def __iter__(self) -> typing.Iterator[str]: + return (cookie.name for cookie in self.jar) + + def __bool__(self) -> bool: + for _ in self.jar: + return True + return False + + def __repr__(self) -> str: + cookies_repr = ", ".join( + [ + f"" + for cookie in self.jar + ] + ) + + return f"" + + class _CookieCompatRequest(urllib.request.Request): + """ + Wraps a `Request` instance up in a compatibility interface suitable + for use with `CookieJar` operations. + """ + + def __init__(self, request: Request) -> None: + super().__init__( + url=str(request.url), + headers=dict(request.headers), + method=request.method, + ) + self.request = request + + def add_unredirected_header(self, key: str, value: str) -> None: + super().add_unredirected_header(key, value) + self.request.headers[key] = value + + class _CookieCompatResponse: + """ + Wraps a `Request` instance up in a compatibility interface suitable + for use with `CookieJar` operations. + """ + + def __init__(self, response: Response) -> None: + self.response = response + + def info(self) -> email.message.Message: + info = email.message.Message() + for key, value in self.response.headers.multi_items(): + # Note that setting `info[key]` here is an "append" operation, + # not a "replace" operation. + # https://docs.python.org/3/library/email.compat32-message.html#email.message.Message.__setitem__ + info[key] = value + return info diff --git a/.venv/lib/python3.10/site-packages/httpx/_multipart.py b/.venv/lib/python3.10/site-packages/httpx/_multipart.py new file mode 100644 index 0000000..b4761af --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpx/_multipart.py @@ -0,0 +1,300 @@ +from __future__ import annotations + +import io +import mimetypes +import os +import re +import typing +from pathlib import Path + +from ._types import ( + AsyncByteStream, + FileContent, + FileTypes, + RequestData, + RequestFiles, + SyncByteStream, +) +from ._utils import ( + peek_filelike_length, + primitive_value_to_str, + to_bytes, +) + +_HTML5_FORM_ENCODING_REPLACEMENTS = {'"': "%22", "\\": "\\\\"} +_HTML5_FORM_ENCODING_REPLACEMENTS.update( + {chr(c): "%{:02X}".format(c) for c in range(0x1F + 1) if c != 0x1B} +) +_HTML5_FORM_ENCODING_RE = re.compile( + r"|".join([re.escape(c) for c in _HTML5_FORM_ENCODING_REPLACEMENTS.keys()]) +) + + +def _format_form_param(name: str, value: str) -> bytes: + """ + Encode a name/value pair within a multipart form. + """ + + def replacer(match: typing.Match[str]) -> str: + return _HTML5_FORM_ENCODING_REPLACEMENTS[match.group(0)] + + value = _HTML5_FORM_ENCODING_RE.sub(replacer, value) + return f'{name}="{value}"'.encode() + + +def _guess_content_type(filename: str | None) -> str | None: + """ + Guesses the mimetype based on a filename. Defaults to `application/octet-stream`. + + Returns `None` if `filename` is `None` or empty. + """ + if filename: + return mimetypes.guess_type(filename)[0] or "application/octet-stream" + return None + + +def get_multipart_boundary_from_content_type( + content_type: bytes | None, +) -> bytes | None: + if not content_type or not content_type.startswith(b"multipart/form-data"): + return None + # parse boundary according to + # https://www.rfc-editor.org/rfc/rfc2046#section-5.1.1 + if b";" in content_type: + for section in content_type.split(b";"): + if section.strip().lower().startswith(b"boundary="): + return section.strip()[len(b"boundary=") :].strip(b'"') + return None + + +class DataField: + """ + A single form field item, within a multipart form field. + """ + + def __init__(self, name: str, value: str | bytes | int | float | None) -> None: + if not isinstance(name, str): + raise TypeError( + f"Invalid type for name. Expected str, got {type(name)}: {name!r}" + ) + if value is not None and not isinstance(value, (str, bytes, int, float)): + raise TypeError( + "Invalid type for value. Expected primitive type," + f" got {type(value)}: {value!r}" + ) + self.name = name + self.value: str | bytes = ( + value if isinstance(value, bytes) else primitive_value_to_str(value) + ) + + def render_headers(self) -> bytes: + if not hasattr(self, "_headers"): + name = _format_form_param("name", self.name) + self._headers = b"".join( + [b"Content-Disposition: form-data; ", name, b"\r\n\r\n"] + ) + + return self._headers + + def render_data(self) -> bytes: + if not hasattr(self, "_data"): + self._data = to_bytes(self.value) + + return self._data + + def get_length(self) -> int: + headers = self.render_headers() + data = self.render_data() + return len(headers) + len(data) + + def render(self) -> typing.Iterator[bytes]: + yield self.render_headers() + yield self.render_data() + + +class FileField: + """ + A single file field item, within a multipart form field. + """ + + CHUNK_SIZE = 64 * 1024 + + def __init__(self, name: str, value: FileTypes) -> None: + self.name = name + + fileobj: FileContent + + headers: dict[str, str] = {} + content_type: str | None = None + + # This large tuple based API largely mirror's requests' API + # It would be good to think of better APIs for this that we could + # include in httpx 2.0 since variable length tuples(especially of 4 elements) + # are quite unwieldly + if isinstance(value, tuple): + if len(value) == 2: + # neither the 3rd parameter (content_type) nor the 4th (headers) + # was included + filename, fileobj = value + elif len(value) == 3: + filename, fileobj, content_type = value + else: + # all 4 parameters included + filename, fileobj, content_type, headers = value # type: ignore + else: + filename = Path(str(getattr(value, "name", "upload"))).name + fileobj = value + + if content_type is None: + content_type = _guess_content_type(filename) + + has_content_type_header = any("content-type" in key.lower() for key in headers) + if content_type is not None and not has_content_type_header: + # note that unlike requests, we ignore the content_type provided in the 3rd + # tuple element if it is also included in the headers requests does + # the opposite (it overwrites the headerwith the 3rd tuple element) + headers["Content-Type"] = content_type + + if isinstance(fileobj, io.StringIO): + raise TypeError( + "Multipart file uploads require 'io.BytesIO', not 'io.StringIO'." + ) + if isinstance(fileobj, io.TextIOBase): + raise TypeError( + "Multipart file uploads must be opened in binary mode, not text mode." + ) + + self.filename = filename + self.file = fileobj + self.headers = headers + + def get_length(self) -> int | None: + headers = self.render_headers() + + if isinstance(self.file, (str, bytes)): + return len(headers) + len(to_bytes(self.file)) + + file_length = peek_filelike_length(self.file) + + # If we can't determine the filesize without reading it into memory, + # then return `None` here, to indicate an unknown file length. + if file_length is None: + return None + + return len(headers) + file_length + + def render_headers(self) -> bytes: + if not hasattr(self, "_headers"): + parts = [ + b"Content-Disposition: form-data; ", + _format_form_param("name", self.name), + ] + if self.filename: + filename = _format_form_param("filename", self.filename) + parts.extend([b"; ", filename]) + for header_name, header_value in self.headers.items(): + key, val = f"\r\n{header_name}: ".encode(), header_value.encode() + parts.extend([key, val]) + parts.append(b"\r\n\r\n") + self._headers = b"".join(parts) + + return self._headers + + def render_data(self) -> typing.Iterator[bytes]: + if isinstance(self.file, (str, bytes)): + yield to_bytes(self.file) + return + + if hasattr(self.file, "seek"): + try: + self.file.seek(0) + except io.UnsupportedOperation: + pass + + chunk = self.file.read(self.CHUNK_SIZE) + while chunk: + yield to_bytes(chunk) + chunk = self.file.read(self.CHUNK_SIZE) + + def render(self) -> typing.Iterator[bytes]: + yield self.render_headers() + yield from self.render_data() + + +class MultipartStream(SyncByteStream, AsyncByteStream): + """ + Request content as streaming multipart encoded form data. + """ + + def __init__( + self, + data: RequestData, + files: RequestFiles, + boundary: bytes | None = None, + ) -> None: + if boundary is None: + boundary = os.urandom(16).hex().encode("ascii") + + self.boundary = boundary + self.content_type = "multipart/form-data; boundary=%s" % boundary.decode( + "ascii" + ) + self.fields = list(self._iter_fields(data, files)) + + def _iter_fields( + self, data: RequestData, files: RequestFiles + ) -> typing.Iterator[FileField | DataField]: + for name, value in data.items(): + if isinstance(value, (tuple, list)): + for item in value: + yield DataField(name=name, value=item) + else: + yield DataField(name=name, value=value) + + file_items = files.items() if isinstance(files, typing.Mapping) else files + for name, value in file_items: + yield FileField(name=name, value=value) + + def iter_chunks(self) -> typing.Iterator[bytes]: + for field in self.fields: + yield b"--%s\r\n" % self.boundary + yield from field.render() + yield b"\r\n" + yield b"--%s--\r\n" % self.boundary + + def get_content_length(self) -> int | None: + """ + Return the length of the multipart encoded content, or `None` if + any of the files have a length that cannot be determined upfront. + """ + boundary_length = len(self.boundary) + length = 0 + + for field in self.fields: + field_length = field.get_length() + if field_length is None: + return None + + length += 2 + boundary_length + 2 # b"--{boundary}\r\n" + length += field_length + length += 2 # b"\r\n" + + length += 2 + boundary_length + 4 # b"--{boundary}--\r\n" + return length + + # Content stream interface. + + def get_headers(self) -> dict[str, str]: + content_length = self.get_content_length() + content_type = self.content_type + if content_length is None: + return {"Transfer-Encoding": "chunked", "Content-Type": content_type} + return {"Content-Length": str(content_length), "Content-Type": content_type} + + def __iter__(self) -> typing.Iterator[bytes]: + for chunk in self.iter_chunks(): + yield chunk + + async def __aiter__(self) -> typing.AsyncIterator[bytes]: + for chunk in self.iter_chunks(): + yield chunk diff --git a/.venv/lib/python3.10/site-packages/httpx/_status_codes.py b/.venv/lib/python3.10/site-packages/httpx/_status_codes.py new file mode 100644 index 0000000..133a623 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpx/_status_codes.py @@ -0,0 +1,162 @@ +from __future__ import annotations + +from enum import IntEnum + +__all__ = ["codes"] + + +class codes(IntEnum): + """HTTP status codes and reason phrases + + Status codes from the following RFCs are all observed: + + * RFC 7231: Hypertext Transfer Protocol (HTTP/1.1), obsoletes 2616 + * RFC 6585: Additional HTTP Status Codes + * RFC 3229: Delta encoding in HTTP + * RFC 4918: HTTP Extensions for WebDAV, obsoletes 2518 + * RFC 5842: Binding Extensions to WebDAV + * RFC 7238: Permanent Redirect + * RFC 2295: Transparent Content Negotiation in HTTP + * RFC 2774: An HTTP Extension Framework + * RFC 7540: Hypertext Transfer Protocol Version 2 (HTTP/2) + * RFC 2324: Hyper Text Coffee Pot Control Protocol (HTCPCP/1.0) + * RFC 7725: An HTTP Status Code to Report Legal Obstacles + * RFC 8297: An HTTP Status Code for Indicating Hints + * RFC 8470: Using Early Data in HTTP + """ + + def __new__(cls, value: int, phrase: str = "") -> codes: + obj = int.__new__(cls, value) + obj._value_ = value + + obj.phrase = phrase # type: ignore[attr-defined] + return obj + + def __str__(self) -> str: + return str(self.value) + + @classmethod + def get_reason_phrase(cls, value: int) -> str: + try: + return codes(value).phrase # type: ignore + except ValueError: + return "" + + @classmethod + def is_informational(cls, value: int) -> bool: + """ + Returns `True` for 1xx status codes, `False` otherwise. + """ + return 100 <= value <= 199 + + @classmethod + def is_success(cls, value: int) -> bool: + """ + Returns `True` for 2xx status codes, `False` otherwise. + """ + return 200 <= value <= 299 + + @classmethod + def is_redirect(cls, value: int) -> bool: + """ + Returns `True` for 3xx status codes, `False` otherwise. + """ + return 300 <= value <= 399 + + @classmethod + def is_client_error(cls, value: int) -> bool: + """ + Returns `True` for 4xx status codes, `False` otherwise. + """ + return 400 <= value <= 499 + + @classmethod + def is_server_error(cls, value: int) -> bool: + """ + Returns `True` for 5xx status codes, `False` otherwise. + """ + return 500 <= value <= 599 + + @classmethod + def is_error(cls, value: int) -> bool: + """ + Returns `True` for 4xx or 5xx status codes, `False` otherwise. + """ + return 400 <= value <= 599 + + # informational + CONTINUE = 100, "Continue" + SWITCHING_PROTOCOLS = 101, "Switching Protocols" + PROCESSING = 102, "Processing" + EARLY_HINTS = 103, "Early Hints" + + # success + OK = 200, "OK" + CREATED = 201, "Created" + ACCEPTED = 202, "Accepted" + NON_AUTHORITATIVE_INFORMATION = 203, "Non-Authoritative Information" + NO_CONTENT = 204, "No Content" + RESET_CONTENT = 205, "Reset Content" + PARTIAL_CONTENT = 206, "Partial Content" + MULTI_STATUS = 207, "Multi-Status" + ALREADY_REPORTED = 208, "Already Reported" + IM_USED = 226, "IM Used" + + # redirection + MULTIPLE_CHOICES = 300, "Multiple Choices" + MOVED_PERMANENTLY = 301, "Moved Permanently" + FOUND = 302, "Found" + SEE_OTHER = 303, "See Other" + NOT_MODIFIED = 304, "Not Modified" + USE_PROXY = 305, "Use Proxy" + TEMPORARY_REDIRECT = 307, "Temporary Redirect" + PERMANENT_REDIRECT = 308, "Permanent Redirect" + + # client error + BAD_REQUEST = 400, "Bad Request" + UNAUTHORIZED = 401, "Unauthorized" + PAYMENT_REQUIRED = 402, "Payment Required" + FORBIDDEN = 403, "Forbidden" + NOT_FOUND = 404, "Not Found" + METHOD_NOT_ALLOWED = 405, "Method Not Allowed" + NOT_ACCEPTABLE = 406, "Not Acceptable" + PROXY_AUTHENTICATION_REQUIRED = 407, "Proxy Authentication Required" + REQUEST_TIMEOUT = 408, "Request Timeout" + CONFLICT = 409, "Conflict" + GONE = 410, "Gone" + LENGTH_REQUIRED = 411, "Length Required" + PRECONDITION_FAILED = 412, "Precondition Failed" + REQUEST_ENTITY_TOO_LARGE = 413, "Request Entity Too Large" + REQUEST_URI_TOO_LONG = 414, "Request-URI Too Long" + UNSUPPORTED_MEDIA_TYPE = 415, "Unsupported Media Type" + REQUESTED_RANGE_NOT_SATISFIABLE = 416, "Requested Range Not Satisfiable" + EXPECTATION_FAILED = 417, "Expectation Failed" + IM_A_TEAPOT = 418, "I'm a teapot" + MISDIRECTED_REQUEST = 421, "Misdirected Request" + UNPROCESSABLE_ENTITY = 422, "Unprocessable Entity" + LOCKED = 423, "Locked" + FAILED_DEPENDENCY = 424, "Failed Dependency" + TOO_EARLY = 425, "Too Early" + UPGRADE_REQUIRED = 426, "Upgrade Required" + PRECONDITION_REQUIRED = 428, "Precondition Required" + TOO_MANY_REQUESTS = 429, "Too Many Requests" + REQUEST_HEADER_FIELDS_TOO_LARGE = 431, "Request Header Fields Too Large" + UNAVAILABLE_FOR_LEGAL_REASONS = 451, "Unavailable For Legal Reasons" + + # server errors + INTERNAL_SERVER_ERROR = 500, "Internal Server Error" + NOT_IMPLEMENTED = 501, "Not Implemented" + BAD_GATEWAY = 502, "Bad Gateway" + SERVICE_UNAVAILABLE = 503, "Service Unavailable" + GATEWAY_TIMEOUT = 504, "Gateway Timeout" + HTTP_VERSION_NOT_SUPPORTED = 505, "HTTP Version Not Supported" + VARIANT_ALSO_NEGOTIATES = 506, "Variant Also Negotiates" + INSUFFICIENT_STORAGE = 507, "Insufficient Storage" + LOOP_DETECTED = 508, "Loop Detected" + NOT_EXTENDED = 510, "Not Extended" + NETWORK_AUTHENTICATION_REQUIRED = 511, "Network Authentication Required" + + +# Include lower-case styles for `requests` compatibility. +for code in codes: + setattr(codes, code._name_.lower(), int(code)) diff --git a/.venv/lib/python3.10/site-packages/httpx/_transports/__init__.py b/.venv/lib/python3.10/site-packages/httpx/_transports/__init__.py new file mode 100644 index 0000000..7a32105 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpx/_transports/__init__.py @@ -0,0 +1,15 @@ +from .asgi import * +from .base import * +from .default import * +from .mock import * +from .wsgi import * + +__all__ = [ + "ASGITransport", + "AsyncBaseTransport", + "BaseTransport", + "AsyncHTTPTransport", + "HTTPTransport", + "MockTransport", + "WSGITransport", +] diff --git a/.venv/lib/python3.10/site-packages/httpx/_transports/__pycache__/__init__.cpython-310.pyc b/.venv/lib/python3.10/site-packages/httpx/_transports/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..425e63b0b6459229e6395718ea5a93df5aa2a552 GIT binary patch literal 406 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 Q_ds2zVpj$R`$kIt1M1KOr2qf` literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/httpx/_transports/__pycache__/base.cpython-310.pyc b/.venv/lib/python3.10/site-packages/httpx/_transports/__pycache__/base.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b13248d0d198cca9046bb0bbdc5c39569a924192 GIT binary patch literal 3433 zcma)8&2JM&6yM$WD~@Am623zjg|>-lu&F>jAW{)%L~^Kwg6Y8sZN@v3c*%O#%*-aS z#Q_S}{txXj|3>>?Y>!nBoRNBnDz)#;+G`sd=tg;-k2k-0pYvWYJDWG)`|I!D+&`ub z<4>Fne<_&UH4IZK7%+pGp3ySvrio+Av+5T7PI*(UR6PZ2DVFxqtxP@B%GR@{!L4UG zmSI_z``M~b>)ABR>scOtvwK#3=7GUxSoV#V?%Zjqw{CUWwigMdrwt%YZhEA_ovrN^);kWO0}gT!q4S%%KZ$jQ{u1@_6|R!day)f@j=OvLeIAZg5m7A8`Mm;<=4VyQ7+cf3y6}jf!*? zzupF;(LF9JO{LmL6!!@^xe+^+6P{|6<42CI zz!4`Gkv>7jjU$J*(O*x=3sMby9!(?H0rf(DvM|DtFn}nrQ%@E~{M%3=vz z@wBlDFnD47V*CpBV_-Ca(xbl}FOd8=6BjM9Khh@I?Q^aUvYLUO^7MHh(fp7OjEgdD8nHai0-Nr0ef_oNU%= z4@nQ1P}qrs1Q}K0==c19dqJBENn|q!J?1Yf0#0xp>UkXkyMp+fGok{5OT_hI zq?)cI>kqdGa|J|=*I7*fK?sKf11I-A7ovbT9+i?nd>y!qOM)1<+jRGufbHS^B$QlS z-=z*HfUpUe?>bz$Tn-7m<&!`#I0<3^C`b-s3hr@;8PK)^(yGHi?4z$&mWfONef>4rxb%-63e%kmWXxXsZqJ5lTqk+k+6mAkx?Agf3(FB(L2{iBL(B6u+HZ z(hogQh^&$L)gN|Pa)V0?(>wI_hH8Avq|ru20DaA{0v^ed>A=w2Rm;Rqwz2X-v$pV0MU$8h0=Bc##iH`JvBg8z$@hkzN*oE%ptPVv-J+-qf``A4*dl2 z5crS}RO~?j`)bJh+qzQp&c?-UaJZa^*S%2#kmXTbmwVnLtxzh=5ElapFMt3$Hlz7! zptc4}8$tx)*ovRaEAVc;|40@`;V%M<#MjTdVwtIbyNjdG^Ct$>B_MA%Wmwx5U8i+994!hVkADiRcb$ez0VV6D-; z0b)yB${BgnN?WF77XHcSidP+28~L#C-GvT8V9|rlVg`O z7baXB`=g(AN&E>t`T~!BiR3FJ%Row5v4Z0gl50r5Mp8ynL4sEf8D@|p80G8mKPg9Y zr6R`bZU`MUWTC*$E6QLi`SGX!nG`BDpdAC*A``Ku>B(y`k~Nr1D6d|8*tF> mae570l}Hrj?!;;T9k%QeW3XW4tb%#kDq2M|XBDUBZvF=;+(}0O literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/httpx/_transports/__pycache__/default.cpython-310.pyc b/.venv/lib/python3.10/site-packages/httpx/_transports/__pycache__/default.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2750fe1cc335bc052b474d1039f8ac8d858d86cd GIT binary patch literal 10030 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/httpx/_transports/__pycache__/mock.cpython-310.pyc b/.venv/lib/python3.10/site-packages/httpx/_transports/__pycache__/mock.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a6c435f417db206f169c7d9c0e14b79dee3a990e GIT binary patch literal 1416 zcmZux&2HQ_5GE<^N~`_x#%&Y0O@T#E*`l$M^jZ{Y7e$jp_7JBRT?Bba+p;BULvjtT zp#W{22T6{8jphY%=C$a-FOWk{nUU6xw=e+>=7&Sh_svjczaJ7<|9$u;d(R2^7me$y z4aQ?asHs2^M9`cRG^P}Fma~`%Pw?C;c+87d+yZ|~wDWf1$9@sS0VR?hb|l}YvbD#y zNE}|-?651CVBq(*NFD15f1k$v--!r>|C$J2`Z74<@j$R0GVWYpU1RFHsZym)ZB{BX zyAEZj;Qh)q<2MT%87^7-b z*R?WTTT8pp%JFHbJoaiC=KK>CM zl!c6>h~~OHlrw80v)J7$PonK(sg9#O+l}T+dr+z$w;w);OlIZ%c{)2v_oayrteu}k ziM`~^L!Mue#d0ox)4J5>p5A~$^cNsppjXpWGunt-7#KA7 zBrABhxo%FtLmJY6a(a4qos#v08(DaVEq(+?{RP;Oho{iyCpWWkr(#X?74Wk|^Z?Sv z+_lmxkoqfd)#&sc)UaLG5PZ2RsHW`_$G5P@^gysb2Z*E{QqE4lyAjD+;&jYwW_1^D z!4q^J1bC5}ru(%QM_}B>AyR1}lf;EdQj}tmquxuBmy0xSB6<@uw@`e8;&c7AhHa=H z7Mu~4Lo#j0S^ie)i|N9ZI|;*?K>YYlezgkkB;xczd`$W9G>EWNt);B zZZ2K-+JkkSNvX?)&6IS#wWsSR2_(Qp_}Xu((gi;?2!F<3lELbGBw#}}q(gR>w!Pcl ECkz5vcmMzZ literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/httpx/_transports/__pycache__/wsgi.cpython-310.pyc b/.venv/lib/python3.10/site-packages/httpx/_transports/__pycache__/wsgi.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8ba44a80969e1a288d77fd8d529b662d2691e8f5 GIT binary patch literal 5230 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 bool: + try: + # sniffio is a dependency of trio. + + # See https://github.com/python-trio/trio/issues/2802 + import sniffio + + if sniffio.current_async_library() == "trio": + return True + except ImportError: # pragma: nocover + pass + + return False + + +def create_event() -> Event: + if is_running_trio(): + import trio + + return trio.Event() + + import asyncio + + return asyncio.Event() + + +class ASGIResponseStream(AsyncByteStream): + def __init__(self, body: list[bytes]) -> None: + self._body = body + + async def __aiter__(self) -> typing.AsyncIterator[bytes]: + yield b"".join(self._body) + + +class ASGITransport(AsyncBaseTransport): + """ + A custom AsyncTransport that handles sending requests directly to an ASGI app. + + ```python + transport = httpx.ASGITransport( + app=app, + root_path="/submount", + client=("1.2.3.4", 123) + ) + client = httpx.AsyncClient(transport=transport) + ``` + + Arguments: + + * `app` - The ASGI application. + * `raise_app_exceptions` - Boolean indicating if exceptions in the application + should be raised. Default to `True`. Can be set to `False` for use cases + such as testing the content of a client 500 response. + * `root_path` - The root path on which the ASGI application should be mounted. + * `client` - A two-tuple indicating the client IP and port of incoming requests. + ``` + """ + + def __init__( + self, + app: _ASGIApp, + raise_app_exceptions: bool = True, + root_path: str = "", + client: tuple[str, int] = ("127.0.0.1", 123), + ) -> None: + self.app = app + self.raise_app_exceptions = raise_app_exceptions + self.root_path = root_path + self.client = client + + async def handle_async_request( + self, + request: Request, + ) -> Response: + assert isinstance(request.stream, AsyncByteStream) + + # ASGI scope. + scope = { + "type": "http", + "asgi": {"version": "3.0"}, + "http_version": "1.1", + "method": request.method, + "headers": [(k.lower(), v) for (k, v) in request.headers.raw], + "scheme": request.url.scheme, + "path": request.url.path, + "raw_path": request.url.raw_path.split(b"?")[0], + "query_string": request.url.query, + "server": (request.url.host, request.url.port), + "client": self.client, + "root_path": self.root_path, + } + + # Request. + request_body_chunks = request.stream.__aiter__() + request_complete = False + + # Response. + status_code = None + response_headers = None + body_parts = [] + response_started = False + response_complete = create_event() + + # ASGI callables. + + async def receive() -> dict[str, typing.Any]: + nonlocal request_complete + + if request_complete: + await response_complete.wait() + return {"type": "http.disconnect"} + + try: + body = await request_body_chunks.__anext__() + except StopAsyncIteration: + request_complete = True + return {"type": "http.request", "body": b"", "more_body": False} + return {"type": "http.request", "body": body, "more_body": True} + + async def send(message: typing.MutableMapping[str, typing.Any]) -> None: + nonlocal status_code, response_headers, response_started + + if message["type"] == "http.response.start": + assert not response_started + + status_code = message["status"] + response_headers = message.get("headers", []) + response_started = True + + elif message["type"] == "http.response.body": + assert not response_complete.is_set() + body = message.get("body", b"") + more_body = message.get("more_body", False) + + if body and request.method != "HEAD": + body_parts.append(body) + + if not more_body: + response_complete.set() + + try: + await self.app(scope, receive, send) + except Exception: # noqa: PIE-786 + if self.raise_app_exceptions: + raise + + response_complete.set() + if status_code is None: + status_code = 500 + if response_headers is None: + response_headers = {} + + assert response_complete.is_set() + assert status_code is not None + assert response_headers is not None + + stream = ASGIResponseStream(body_parts) + + return Response(status_code, headers=response_headers, stream=stream) diff --git a/.venv/lib/python3.10/site-packages/httpx/_transports/base.py b/.venv/lib/python3.10/site-packages/httpx/_transports/base.py new file mode 100644 index 0000000..66fd99d --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpx/_transports/base.py @@ -0,0 +1,86 @@ +from __future__ import annotations + +import typing +from types import TracebackType + +from .._models import Request, Response + +T = typing.TypeVar("T", bound="BaseTransport") +A = typing.TypeVar("A", bound="AsyncBaseTransport") + +__all__ = ["AsyncBaseTransport", "BaseTransport"] + + +class BaseTransport: + def __enter__(self: T) -> T: + return self + + def __exit__( + self, + exc_type: type[BaseException] | None = None, + exc_value: BaseException | None = None, + traceback: TracebackType | None = None, + ) -> None: + self.close() + + def handle_request(self, request: Request) -> Response: + """ + Send a single HTTP request and return a response. + + Developers shouldn't typically ever need to call into this API directly, + since the Client class provides all the higher level user-facing API + niceties. + + In order to properly release any network resources, the response + stream should *either* be consumed immediately, with a call to + `response.stream.read()`, or else the `handle_request` call should + be followed with a try/finally block to ensuring the stream is + always closed. + + Example usage: + + with httpx.HTTPTransport() as transport: + req = httpx.Request( + method=b"GET", + url=(b"https", b"www.example.com", 443, b"/"), + headers=[(b"Host", b"www.example.com")], + ) + resp = transport.handle_request(req) + body = resp.stream.read() + print(resp.status_code, resp.headers, body) + + + Takes a `Request` instance as the only argument. + + Returns a `Response` instance. + """ + raise NotImplementedError( + "The 'handle_request' method must be implemented." + ) # pragma: no cover + + def close(self) -> None: + pass + + +class AsyncBaseTransport: + async def __aenter__(self: A) -> A: + return self + + async def __aexit__( + self, + exc_type: type[BaseException] | None = None, + exc_value: BaseException | None = None, + traceback: TracebackType | None = None, + ) -> None: + await self.aclose() + + async def handle_async_request( + self, + request: Request, + ) -> Response: + raise NotImplementedError( + "The 'handle_async_request' method must be implemented." + ) # pragma: no cover + + async def aclose(self) -> None: + pass diff --git a/.venv/lib/python3.10/site-packages/httpx/_transports/default.py b/.venv/lib/python3.10/site-packages/httpx/_transports/default.py new file mode 100644 index 0000000..d5aa05f --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpx/_transports/default.py @@ -0,0 +1,406 @@ +""" +Custom transports, with nicely configured defaults. + +The following additional keyword arguments are currently supported by httpcore... + +* uds: str +* local_address: str +* retries: int + +Example usages... + +# Disable HTTP/2 on a single specific domain. +mounts = { + "all://": httpx.HTTPTransport(http2=True), + "all://*example.org": httpx.HTTPTransport() +} + +# Using advanced httpcore configuration, with connection retries. +transport = httpx.HTTPTransport(retries=1) +client = httpx.Client(transport=transport) + +# Using advanced httpcore configuration, with unix domain sockets. +transport = httpx.HTTPTransport(uds="socket.uds") +client = httpx.Client(transport=transport) +""" + +from __future__ import annotations + +import contextlib +import typing +from types import TracebackType + +if typing.TYPE_CHECKING: + import ssl # pragma: no cover + + import httpx # pragma: no cover + +from .._config import DEFAULT_LIMITS, Limits, Proxy, create_ssl_context +from .._exceptions import ( + ConnectError, + ConnectTimeout, + LocalProtocolError, + NetworkError, + PoolTimeout, + ProtocolError, + ProxyError, + ReadError, + ReadTimeout, + RemoteProtocolError, + TimeoutException, + UnsupportedProtocol, + WriteError, + WriteTimeout, +) +from .._models import Request, Response +from .._types import AsyncByteStream, CertTypes, ProxyTypes, SyncByteStream +from .._urls import URL +from .base import AsyncBaseTransport, BaseTransport + +T = typing.TypeVar("T", bound="HTTPTransport") +A = typing.TypeVar("A", bound="AsyncHTTPTransport") + +SOCKET_OPTION = typing.Union[ + typing.Tuple[int, int, int], + typing.Tuple[int, int, typing.Union[bytes, bytearray]], + typing.Tuple[int, int, None, int], +] + +__all__ = ["AsyncHTTPTransport", "HTTPTransport"] + +HTTPCORE_EXC_MAP: dict[type[Exception], type[httpx.HTTPError]] = {} + + +def _load_httpcore_exceptions() -> dict[type[Exception], type[httpx.HTTPError]]: + import httpcore + + return { + httpcore.TimeoutException: TimeoutException, + httpcore.ConnectTimeout: ConnectTimeout, + httpcore.ReadTimeout: ReadTimeout, + httpcore.WriteTimeout: WriteTimeout, + httpcore.PoolTimeout: PoolTimeout, + httpcore.NetworkError: NetworkError, + httpcore.ConnectError: ConnectError, + httpcore.ReadError: ReadError, + httpcore.WriteError: WriteError, + httpcore.ProxyError: ProxyError, + httpcore.UnsupportedProtocol: UnsupportedProtocol, + httpcore.ProtocolError: ProtocolError, + httpcore.LocalProtocolError: LocalProtocolError, + httpcore.RemoteProtocolError: RemoteProtocolError, + } + + +@contextlib.contextmanager +def map_httpcore_exceptions() -> typing.Iterator[None]: + global HTTPCORE_EXC_MAP + if len(HTTPCORE_EXC_MAP) == 0: + HTTPCORE_EXC_MAP = _load_httpcore_exceptions() + try: + yield + except Exception as exc: + mapped_exc = None + + for from_exc, to_exc in HTTPCORE_EXC_MAP.items(): + if not isinstance(exc, from_exc): + continue + # We want to map to the most specific exception we can find. + # Eg if `exc` is an `httpcore.ReadTimeout`, we want to map to + # `httpx.ReadTimeout`, not just `httpx.TimeoutException`. + if mapped_exc is None or issubclass(to_exc, mapped_exc): + mapped_exc = to_exc + + if mapped_exc is None: # pragma: no cover + raise + + message = str(exc) + raise mapped_exc(message) from exc + + +class ResponseStream(SyncByteStream): + def __init__(self, httpcore_stream: typing.Iterable[bytes]) -> None: + self._httpcore_stream = httpcore_stream + + def __iter__(self) -> typing.Iterator[bytes]: + with map_httpcore_exceptions(): + for part in self._httpcore_stream: + yield part + + def close(self) -> None: + if hasattr(self._httpcore_stream, "close"): + self._httpcore_stream.close() + + +class HTTPTransport(BaseTransport): + def __init__( + self, + verify: ssl.SSLContext | str | bool = True, + cert: CertTypes | None = None, + trust_env: bool = True, + http1: bool = True, + http2: bool = False, + limits: Limits = DEFAULT_LIMITS, + proxy: ProxyTypes | None = None, + uds: str | None = None, + local_address: str | None = None, + retries: int = 0, + socket_options: typing.Iterable[SOCKET_OPTION] | None = None, + ) -> None: + import httpcore + + proxy = Proxy(url=proxy) if isinstance(proxy, (str, URL)) else proxy + ssl_context = create_ssl_context(verify=verify, cert=cert, trust_env=trust_env) + + if proxy is None: + self._pool = httpcore.ConnectionPool( + ssl_context=ssl_context, + max_connections=limits.max_connections, + max_keepalive_connections=limits.max_keepalive_connections, + keepalive_expiry=limits.keepalive_expiry, + http1=http1, + http2=http2, + uds=uds, + local_address=local_address, + retries=retries, + socket_options=socket_options, + ) + elif proxy.url.scheme in ("http", "https"): + self._pool = httpcore.HTTPProxy( + proxy_url=httpcore.URL( + scheme=proxy.url.raw_scheme, + host=proxy.url.raw_host, + port=proxy.url.port, + target=proxy.url.raw_path, + ), + proxy_auth=proxy.raw_auth, + proxy_headers=proxy.headers.raw, + ssl_context=ssl_context, + proxy_ssl_context=proxy.ssl_context, + max_connections=limits.max_connections, + max_keepalive_connections=limits.max_keepalive_connections, + keepalive_expiry=limits.keepalive_expiry, + http1=http1, + http2=http2, + socket_options=socket_options, + ) + elif proxy.url.scheme in ("socks5", "socks5h"): + try: + import socksio # noqa + except ImportError: # pragma: no cover + raise ImportError( + "Using SOCKS proxy, but the 'socksio' package is not installed. " + "Make sure to install httpx using `pip install httpx[socks]`." + ) from None + + self._pool = httpcore.SOCKSProxy( + proxy_url=httpcore.URL( + scheme=proxy.url.raw_scheme, + host=proxy.url.raw_host, + port=proxy.url.port, + target=proxy.url.raw_path, + ), + proxy_auth=proxy.raw_auth, + ssl_context=ssl_context, + max_connections=limits.max_connections, + max_keepalive_connections=limits.max_keepalive_connections, + keepalive_expiry=limits.keepalive_expiry, + http1=http1, + http2=http2, + ) + else: # pragma: no cover + raise ValueError( + "Proxy protocol must be either 'http', 'https', 'socks5', or 'socks5h'," + f" but got {proxy.url.scheme!r}." + ) + + def __enter__(self: T) -> T: # Use generics for subclass support. + self._pool.__enter__() + return self + + def __exit__( + self, + exc_type: type[BaseException] | None = None, + exc_value: BaseException | None = None, + traceback: TracebackType | None = None, + ) -> None: + with map_httpcore_exceptions(): + self._pool.__exit__(exc_type, exc_value, traceback) + + def handle_request( + self, + request: Request, + ) -> Response: + assert isinstance(request.stream, SyncByteStream) + import httpcore + + req = httpcore.Request( + method=request.method, + url=httpcore.URL( + scheme=request.url.raw_scheme, + host=request.url.raw_host, + port=request.url.port, + target=request.url.raw_path, + ), + headers=request.headers.raw, + content=request.stream, + extensions=request.extensions, + ) + with map_httpcore_exceptions(): + resp = self._pool.handle_request(req) + + assert isinstance(resp.stream, typing.Iterable) + + return Response( + status_code=resp.status, + headers=resp.headers, + stream=ResponseStream(resp.stream), + extensions=resp.extensions, + ) + + def close(self) -> None: + self._pool.close() + + +class AsyncResponseStream(AsyncByteStream): + def __init__(self, httpcore_stream: typing.AsyncIterable[bytes]) -> None: + self._httpcore_stream = httpcore_stream + + async def __aiter__(self) -> typing.AsyncIterator[bytes]: + with map_httpcore_exceptions(): + async for part in self._httpcore_stream: + yield part + + async def aclose(self) -> None: + if hasattr(self._httpcore_stream, "aclose"): + await self._httpcore_stream.aclose() + + +class AsyncHTTPTransport(AsyncBaseTransport): + def __init__( + self, + verify: ssl.SSLContext | str | bool = True, + cert: CertTypes | None = None, + trust_env: bool = True, + http1: bool = True, + http2: bool = False, + limits: Limits = DEFAULT_LIMITS, + proxy: ProxyTypes | None = None, + uds: str | None = None, + local_address: str | None = None, + retries: int = 0, + socket_options: typing.Iterable[SOCKET_OPTION] | None = None, + ) -> None: + import httpcore + + proxy = Proxy(url=proxy) if isinstance(proxy, (str, URL)) else proxy + ssl_context = create_ssl_context(verify=verify, cert=cert, trust_env=trust_env) + + if proxy is None: + self._pool = httpcore.AsyncConnectionPool( + ssl_context=ssl_context, + max_connections=limits.max_connections, + max_keepalive_connections=limits.max_keepalive_connections, + keepalive_expiry=limits.keepalive_expiry, + http1=http1, + http2=http2, + uds=uds, + local_address=local_address, + retries=retries, + socket_options=socket_options, + ) + elif proxy.url.scheme in ("http", "https"): + self._pool = httpcore.AsyncHTTPProxy( + proxy_url=httpcore.URL( + scheme=proxy.url.raw_scheme, + host=proxy.url.raw_host, + port=proxy.url.port, + target=proxy.url.raw_path, + ), + proxy_auth=proxy.raw_auth, + proxy_headers=proxy.headers.raw, + proxy_ssl_context=proxy.ssl_context, + ssl_context=ssl_context, + max_connections=limits.max_connections, + max_keepalive_connections=limits.max_keepalive_connections, + keepalive_expiry=limits.keepalive_expiry, + http1=http1, + http2=http2, + socket_options=socket_options, + ) + elif proxy.url.scheme in ("socks5", "socks5h"): + try: + import socksio # noqa + except ImportError: # pragma: no cover + raise ImportError( + "Using SOCKS proxy, but the 'socksio' package is not installed. " + "Make sure to install httpx using `pip install httpx[socks]`." + ) from None + + self._pool = httpcore.AsyncSOCKSProxy( + proxy_url=httpcore.URL( + scheme=proxy.url.raw_scheme, + host=proxy.url.raw_host, + port=proxy.url.port, + target=proxy.url.raw_path, + ), + proxy_auth=proxy.raw_auth, + ssl_context=ssl_context, + max_connections=limits.max_connections, + max_keepalive_connections=limits.max_keepalive_connections, + keepalive_expiry=limits.keepalive_expiry, + http1=http1, + http2=http2, + ) + else: # pragma: no cover + raise ValueError( + "Proxy protocol must be either 'http', 'https', 'socks5', or 'socks5h'," + " but got {proxy.url.scheme!r}." + ) + + async def __aenter__(self: A) -> A: # Use generics for subclass support. + await self._pool.__aenter__() + return self + + async def __aexit__( + self, + exc_type: type[BaseException] | None = None, + exc_value: BaseException | None = None, + traceback: TracebackType | None = None, + ) -> None: + with map_httpcore_exceptions(): + await self._pool.__aexit__(exc_type, exc_value, traceback) + + async def handle_async_request( + self, + request: Request, + ) -> Response: + assert isinstance(request.stream, AsyncByteStream) + import httpcore + + req = httpcore.Request( + method=request.method, + url=httpcore.URL( + scheme=request.url.raw_scheme, + host=request.url.raw_host, + port=request.url.port, + target=request.url.raw_path, + ), + headers=request.headers.raw, + content=request.stream, + extensions=request.extensions, + ) + with map_httpcore_exceptions(): + resp = await self._pool.handle_async_request(req) + + assert isinstance(resp.stream, typing.AsyncIterable) + + return Response( + status_code=resp.status, + headers=resp.headers, + stream=AsyncResponseStream(resp.stream), + extensions=resp.extensions, + ) + + async def aclose(self) -> None: + await self._pool.aclose() diff --git a/.venv/lib/python3.10/site-packages/httpx/_transports/mock.py b/.venv/lib/python3.10/site-packages/httpx/_transports/mock.py new file mode 100644 index 0000000..8c418f5 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpx/_transports/mock.py @@ -0,0 +1,43 @@ +from __future__ import annotations + +import typing + +from .._models import Request, Response +from .base import AsyncBaseTransport, BaseTransport + +SyncHandler = typing.Callable[[Request], Response] +AsyncHandler = typing.Callable[[Request], typing.Coroutine[None, None, Response]] + + +__all__ = ["MockTransport"] + + +class MockTransport(AsyncBaseTransport, BaseTransport): + def __init__(self, handler: SyncHandler | AsyncHandler) -> None: + self.handler = handler + + def handle_request( + self, + request: Request, + ) -> Response: + request.read() + response = self.handler(request) + if not isinstance(response, Response): # pragma: no cover + raise TypeError("Cannot use an async handler in a sync Client") + return response + + async def handle_async_request( + self, + request: Request, + ) -> Response: + await request.aread() + response = self.handler(request) + + # Allow handler to *optionally* be an `async` function. + # If it is, then the `response` variable need to be awaited to actually + # return the result. + + if not isinstance(response, Response): + response = await response + + return response diff --git a/.venv/lib/python3.10/site-packages/httpx/_transports/wsgi.py b/.venv/lib/python3.10/site-packages/httpx/_transports/wsgi.py new file mode 100644 index 0000000..8592ffe --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpx/_transports/wsgi.py @@ -0,0 +1,149 @@ +from __future__ import annotations + +import io +import itertools +import sys +import typing + +from .._models import Request, Response +from .._types import SyncByteStream +from .base import BaseTransport + +if typing.TYPE_CHECKING: + from _typeshed import OptExcInfo # pragma: no cover + from _typeshed.wsgi import WSGIApplication # pragma: no cover + +_T = typing.TypeVar("_T") + + +__all__ = ["WSGITransport"] + + +def _skip_leading_empty_chunks(body: typing.Iterable[_T]) -> typing.Iterable[_T]: + body = iter(body) + for chunk in body: + if chunk: + return itertools.chain([chunk], body) + return [] + + +class WSGIByteStream(SyncByteStream): + def __init__(self, result: typing.Iterable[bytes]) -> None: + self._close = getattr(result, "close", None) + self._result = _skip_leading_empty_chunks(result) + + def __iter__(self) -> typing.Iterator[bytes]: + for part in self._result: + yield part + + def close(self) -> None: + if self._close is not None: + self._close() + + +class WSGITransport(BaseTransport): + """ + A custom transport that handles sending requests directly to an WSGI app. + The simplest way to use this functionality is to use the `app` argument. + + ``` + client = httpx.Client(app=app) + ``` + + Alternatively, you can setup the transport instance explicitly. + This allows you to include any additional configuration arguments specific + to the WSGITransport class: + + ``` + transport = httpx.WSGITransport( + app=app, + script_name="/submount", + remote_addr="1.2.3.4" + ) + client = httpx.Client(transport=transport) + ``` + + Arguments: + + * `app` - The WSGI application. + * `raise_app_exceptions` - Boolean indicating if exceptions in the application + should be raised. Default to `True`. Can be set to `False` for use cases + such as testing the content of a client 500 response. + * `script_name` - The root path on which the WSGI application should be mounted. + * `remote_addr` - A string indicating the client IP of incoming requests. + ``` + """ + + def __init__( + self, + app: WSGIApplication, + raise_app_exceptions: bool = True, + script_name: str = "", + remote_addr: str = "127.0.0.1", + wsgi_errors: typing.TextIO | None = None, + ) -> None: + self.app = app + self.raise_app_exceptions = raise_app_exceptions + self.script_name = script_name + self.remote_addr = remote_addr + self.wsgi_errors = wsgi_errors + + def handle_request(self, request: Request) -> Response: + request.read() + wsgi_input = io.BytesIO(request.content) + + port = request.url.port or {"http": 80, "https": 443}[request.url.scheme] + environ = { + "wsgi.version": (1, 0), + "wsgi.url_scheme": request.url.scheme, + "wsgi.input": wsgi_input, + "wsgi.errors": self.wsgi_errors or sys.stderr, + "wsgi.multithread": True, + "wsgi.multiprocess": False, + "wsgi.run_once": False, + "REQUEST_METHOD": request.method, + "SCRIPT_NAME": self.script_name, + "PATH_INFO": request.url.path, + "QUERY_STRING": request.url.query.decode("ascii"), + "SERVER_NAME": request.url.host, + "SERVER_PORT": str(port), + "SERVER_PROTOCOL": "HTTP/1.1", + "REMOTE_ADDR": self.remote_addr, + } + for header_key, header_value in request.headers.raw: + key = header_key.decode("ascii").upper().replace("-", "_") + if key not in ("CONTENT_TYPE", "CONTENT_LENGTH"): + key = "HTTP_" + key + environ[key] = header_value.decode("ascii") + + seen_status = None + seen_response_headers = None + seen_exc_info = None + + def start_response( + status: str, + response_headers: list[tuple[str, str]], + exc_info: OptExcInfo | None = None, + ) -> typing.Callable[[bytes], typing.Any]: + nonlocal seen_status, seen_response_headers, seen_exc_info + seen_status = status + seen_response_headers = response_headers + seen_exc_info = exc_info + return lambda _: None + + result = self.app(environ, start_response) + + stream = WSGIByteStream(result) + + assert seen_status is not None + assert seen_response_headers is not None + if seen_exc_info and seen_exc_info[0] and self.raise_app_exceptions: + raise seen_exc_info[1] + + status_code = int(seen_status.split()[0]) + headers = [ + (key.encode("ascii"), value.encode("ascii")) + for key, value in seen_response_headers + ] + + return Response(status_code, headers=headers, stream=stream) diff --git a/.venv/lib/python3.10/site-packages/httpx/_types.py b/.venv/lib/python3.10/site-packages/httpx/_types.py new file mode 100644 index 0000000..704dfdf --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpx/_types.py @@ -0,0 +1,114 @@ +""" +Type definitions for type checking purposes. +""" + +from http.cookiejar import CookieJar +from typing import ( + IO, + TYPE_CHECKING, + Any, + AsyncIterable, + AsyncIterator, + Callable, + Dict, + Iterable, + Iterator, + List, + Mapping, + Optional, + Sequence, + Tuple, + Union, +) + +if TYPE_CHECKING: # pragma: no cover + from ._auth import Auth # noqa: F401 + from ._config import Proxy, Timeout # noqa: F401 + from ._models import Cookies, Headers, Request # noqa: F401 + from ._urls import URL, QueryParams # noqa: F401 + + +PrimitiveData = Optional[Union[str, int, float, bool]] + +URLTypes = Union["URL", str] + +QueryParamTypes = Union[ + "QueryParams", + Mapping[str, Union[PrimitiveData, Sequence[PrimitiveData]]], + List[Tuple[str, PrimitiveData]], + Tuple[Tuple[str, PrimitiveData], ...], + str, + bytes, +] + +HeaderTypes = Union[ + "Headers", + Mapping[str, str], + Mapping[bytes, bytes], + Sequence[Tuple[str, str]], + Sequence[Tuple[bytes, bytes]], +] + +CookieTypes = Union["Cookies", CookieJar, Dict[str, str], List[Tuple[str, str]]] + +TimeoutTypes = Union[ + Optional[float], + Tuple[Optional[float], Optional[float], Optional[float], Optional[float]], + "Timeout", +] +ProxyTypes = Union["URL", str, "Proxy"] +CertTypes = Union[str, Tuple[str, str], Tuple[str, str, str]] + +AuthTypes = Union[ + Tuple[Union[str, bytes], Union[str, bytes]], + Callable[["Request"], "Request"], + "Auth", +] + +RequestContent = Union[str, bytes, Iterable[bytes], AsyncIterable[bytes]] +ResponseContent = Union[str, bytes, Iterable[bytes], AsyncIterable[bytes]] +ResponseExtensions = Mapping[str, Any] + +RequestData = Mapping[str, Any] + +FileContent = Union[IO[bytes], bytes, str] +FileTypes = Union[ + # file (or bytes) + FileContent, + # (filename, file (or bytes)) + Tuple[Optional[str], FileContent], + # (filename, file (or bytes), content_type) + Tuple[Optional[str], FileContent, Optional[str]], + # (filename, file (or bytes), content_type, headers) + Tuple[Optional[str], FileContent, Optional[str], Mapping[str, str]], +] +RequestFiles = Union[Mapping[str, FileTypes], Sequence[Tuple[str, FileTypes]]] + +RequestExtensions = Mapping[str, Any] + +__all__ = ["AsyncByteStream", "SyncByteStream"] + + +class SyncByteStream: + def __iter__(self) -> Iterator[bytes]: + raise NotImplementedError( + "The '__iter__' method must be implemented." + ) # pragma: no cover + yield b"" # pragma: no cover + + def close(self) -> None: + """ + Subclasses can override this method to release any network resources + after a request/response cycle is complete. + """ + + +class AsyncByteStream: + async def __aiter__(self) -> AsyncIterator[bytes]: + raise NotImplementedError( + "The '__aiter__' method must be implemented." + ) # pragma: no cover + yield b"" # pragma: no cover + + async def aclose(self) -> None: + pass diff --git a/.venv/lib/python3.10/site-packages/httpx/_urlparse.py b/.venv/lib/python3.10/site-packages/httpx/_urlparse.py new file mode 100644 index 0000000..bf190fd --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpx/_urlparse.py @@ -0,0 +1,527 @@ +""" +An implementation of `urlparse` that provides URL validation and normalization +as described by RFC3986. + +We rely on this implementation rather than the one in Python's stdlib, because: + +* It provides more complete URL validation. +* It properly differentiates between an empty querystring and an absent querystring, + to distinguish URLs with a trailing '?'. +* It handles scheme, hostname, port, and path normalization. +* It supports IDNA hostnames, normalizing them to their encoded form. +* The API supports passing individual components, as well as the complete URL string. + +Previously we relied on the excellent `rfc3986` package to handle URL parsing and +validation, but this module provides a simpler alternative, with less indirection +required. +""" + +from __future__ import annotations + +import ipaddress +import re +import typing + +import idna + +from ._exceptions import InvalidURL + +MAX_URL_LENGTH = 65536 + +# https://datatracker.ietf.org/doc/html/rfc3986.html#section-2.3 +UNRESERVED_CHARACTERS = ( + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~" +) +SUB_DELIMS = "!$&'()*+,;=" + +PERCENT_ENCODED_REGEX = re.compile("%[A-Fa-f0-9]{2}") + +# https://url.spec.whatwg.org/#percent-encoded-bytes + +# The fragment percent-encode set is the C0 control percent-encode set +# and U+0020 SPACE, U+0022 ("), U+003C (<), U+003E (>), and U+0060 (`). +FRAG_SAFE = "".join( + [chr(i) for i in range(0x20, 0x7F) if i not in (0x20, 0x22, 0x3C, 0x3E, 0x60)] +) + +# The query percent-encode set is the C0 control percent-encode set +# and U+0020 SPACE, U+0022 ("), U+0023 (#), U+003C (<), and U+003E (>). +QUERY_SAFE = "".join( + [chr(i) for i in range(0x20, 0x7F) if i not in (0x20, 0x22, 0x23, 0x3C, 0x3E)] +) + +# The path percent-encode set is the query percent-encode set +# and U+003F (?), U+0060 (`), U+007B ({), and U+007D (}). +PATH_SAFE = "".join( + [ + chr(i) + for i in range(0x20, 0x7F) + if i not in (0x20, 0x22, 0x23, 0x3C, 0x3E) + (0x3F, 0x60, 0x7B, 0x7D) + ] +) + +# The userinfo percent-encode set is the path percent-encode set +# and U+002F (/), U+003A (:), U+003B (;), U+003D (=), U+0040 (@), +# U+005B ([) to U+005E (^), inclusive, and U+007C (|). +USERNAME_SAFE = "".join( + [ + chr(i) + for i in range(0x20, 0x7F) + if i + not in (0x20, 0x22, 0x23, 0x3C, 0x3E) + + (0x3F, 0x60, 0x7B, 0x7D) + + (0x2F, 0x3A, 0x3B, 0x3D, 0x40, 0x5B, 0x5C, 0x5D, 0x5E, 0x7C) + ] +) +PASSWORD_SAFE = "".join( + [ + chr(i) + for i in range(0x20, 0x7F) + if i + not in (0x20, 0x22, 0x23, 0x3C, 0x3E) + + (0x3F, 0x60, 0x7B, 0x7D) + + (0x2F, 0x3A, 0x3B, 0x3D, 0x40, 0x5B, 0x5C, 0x5D, 0x5E, 0x7C) + ] +) +# Note... The terminology 'userinfo' percent-encode set in the WHATWG document +# is used for the username and password quoting. For the joint userinfo component +# we remove U+003A (:) from the safe set. +USERINFO_SAFE = "".join( + [ + chr(i) + for i in range(0x20, 0x7F) + if i + not in (0x20, 0x22, 0x23, 0x3C, 0x3E) + + (0x3F, 0x60, 0x7B, 0x7D) + + (0x2F, 0x3B, 0x3D, 0x40, 0x5B, 0x5C, 0x5D, 0x5E, 0x7C) + ] +) + + +# {scheme}: (optional) +# //{authority} (optional) +# {path} +# ?{query} (optional) +# #{fragment} (optional) +URL_REGEX = re.compile( + ( + r"(?:(?P{scheme}):)?" + r"(?://(?P{authority}))?" + r"(?P{path})" + r"(?:\?(?P{query}))?" + r"(?:#(?P{fragment}))?" + ).format( + scheme="([a-zA-Z][a-zA-Z0-9+.-]*)?", + authority="[^/?#]*", + path="[^?#]*", + query="[^#]*", + fragment=".*", + ) +) + +# {userinfo}@ (optional) +# {host} +# :{port} (optional) +AUTHORITY_REGEX = re.compile( + ( + r"(?:(?P{userinfo})@)?" r"(?P{host})" r":?(?P{port})?" + ).format( + userinfo=".*", # Any character sequence. + host="(\\[.*\\]|[^:@]*)", # Either any character sequence excluding ':' or '@', + # or an IPv6 address enclosed within square brackets. + port=".*", # Any character sequence. + ) +) + + +# If we call urlparse with an individual component, then we need to regex +# validate that component individually. +# Note that we're duplicating the same strings as above. Shock! Horror!! +COMPONENT_REGEX = { + "scheme": re.compile("([a-zA-Z][a-zA-Z0-9+.-]*)?"), + "authority": re.compile("[^/?#]*"), + "path": re.compile("[^?#]*"), + "query": re.compile("[^#]*"), + "fragment": re.compile(".*"), + "userinfo": re.compile("[^@]*"), + "host": re.compile("(\\[.*\\]|[^:]*)"), + "port": re.compile(".*"), +} + + +# We use these simple regexs as a first pass before handing off to +# the stdlib 'ipaddress' module for IP address validation. +IPv4_STYLE_HOSTNAME = re.compile(r"^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$") +IPv6_STYLE_HOSTNAME = re.compile(r"^\[.*\]$") + + +class ParseResult(typing.NamedTuple): + scheme: str + userinfo: str + host: str + port: int | None + path: str + query: str | None + fragment: str | None + + @property + def authority(self) -> str: + return "".join( + [ + f"{self.userinfo}@" if self.userinfo else "", + f"[{self.host}]" if ":" in self.host else self.host, + f":{self.port}" if self.port is not None else "", + ] + ) + + @property + def netloc(self) -> str: + return "".join( + [ + f"[{self.host}]" if ":" in self.host else self.host, + f":{self.port}" if self.port is not None else "", + ] + ) + + def copy_with(self, **kwargs: str | None) -> ParseResult: + if not kwargs: + return self + + defaults = { + "scheme": self.scheme, + "authority": self.authority, + "path": self.path, + "query": self.query, + "fragment": self.fragment, + } + defaults.update(kwargs) + return urlparse("", **defaults) + + def __str__(self) -> str: + authority = self.authority + return "".join( + [ + f"{self.scheme}:" if self.scheme else "", + f"//{authority}" if authority else "", + self.path, + f"?{self.query}" if self.query is not None else "", + f"#{self.fragment}" if self.fragment is not None else "", + ] + ) + + +def urlparse(url: str = "", **kwargs: str | None) -> ParseResult: + # Initial basic checks on allowable URLs. + # --------------------------------------- + + # Hard limit the maximum allowable URL length. + if len(url) > MAX_URL_LENGTH: + raise InvalidURL("URL too long") + + # If a URL includes any ASCII control characters including \t, \r, \n, + # then treat it as invalid. + if any(char.isascii() and not char.isprintable() for char in url): + char = next(char for char in url if char.isascii() and not char.isprintable()) + idx = url.find(char) + error = ( + f"Invalid non-printable ASCII character in URL, {char!r} at position {idx}." + ) + raise InvalidURL(error) + + # Some keyword arguments require special handling. + # ------------------------------------------------ + + # Coerce "port" to a string, if it is provided as an integer. + if "port" in kwargs: + port = kwargs["port"] + kwargs["port"] = str(port) if isinstance(port, int) else port + + # Replace "netloc" with "host and "port". + if "netloc" in kwargs: + netloc = kwargs.pop("netloc") or "" + kwargs["host"], _, kwargs["port"] = netloc.partition(":") + + # Replace "username" and/or "password" with "userinfo". + if "username" in kwargs or "password" in kwargs: + username = quote(kwargs.pop("username", "") or "", safe=USERNAME_SAFE) + password = quote(kwargs.pop("password", "") or "", safe=PASSWORD_SAFE) + kwargs["userinfo"] = f"{username}:{password}" if password else username + + # Replace "raw_path" with "path" and "query". + if "raw_path" in kwargs: + raw_path = kwargs.pop("raw_path") or "" + kwargs["path"], seperator, kwargs["query"] = raw_path.partition("?") + if not seperator: + kwargs["query"] = None + + # Ensure that IPv6 "host" addresses are always escaped with "[...]". + if "host" in kwargs: + host = kwargs.get("host") or "" + if ":" in host and not (host.startswith("[") and host.endswith("]")): + kwargs["host"] = f"[{host}]" + + # If any keyword arguments are provided, ensure they are valid. + # ------------------------------------------------------------- + + for key, value in kwargs.items(): + if value is not None: + if len(value) > MAX_URL_LENGTH: + raise InvalidURL(f"URL component '{key}' too long") + + # If a component includes any ASCII control characters including \t, \r, \n, + # then treat it as invalid. + if any(char.isascii() and not char.isprintable() for char in value): + char = next( + char for char in value if char.isascii() and not char.isprintable() + ) + idx = value.find(char) + error = ( + f"Invalid non-printable ASCII character in URL {key} component, " + f"{char!r} at position {idx}." + ) + raise InvalidURL(error) + + # Ensure that keyword arguments match as a valid regex. + if not COMPONENT_REGEX[key].fullmatch(value): + raise InvalidURL(f"Invalid URL component '{key}'") + + # The URL_REGEX will always match, but may have empty components. + url_match = URL_REGEX.match(url) + assert url_match is not None + url_dict = url_match.groupdict() + + # * 'scheme', 'authority', and 'path' may be empty strings. + # * 'query' may be 'None', indicating no trailing "?" portion. + # Any string including the empty string, indicates a trailing "?". + # * 'fragment' may be 'None', indicating no trailing "#" portion. + # Any string including the empty string, indicates a trailing "#". + scheme = kwargs.get("scheme", url_dict["scheme"]) or "" + authority = kwargs.get("authority", url_dict["authority"]) or "" + path = kwargs.get("path", url_dict["path"]) or "" + query = kwargs.get("query", url_dict["query"]) + frag = kwargs.get("fragment", url_dict["fragment"]) + + # The AUTHORITY_REGEX will always match, but may have empty components. + authority_match = AUTHORITY_REGEX.match(authority) + assert authority_match is not None + authority_dict = authority_match.groupdict() + + # * 'userinfo' and 'host' may be empty strings. + # * 'port' may be 'None'. + userinfo = kwargs.get("userinfo", authority_dict["userinfo"]) or "" + host = kwargs.get("host", authority_dict["host"]) or "" + port = kwargs.get("port", authority_dict["port"]) + + # Normalize and validate each component. + # We end up with a parsed representation of the URL, + # with components that are plain ASCII bytestrings. + parsed_scheme: str = scheme.lower() + parsed_userinfo: str = quote(userinfo, safe=USERINFO_SAFE) + parsed_host: str = encode_host(host) + parsed_port: int | None = normalize_port(port, scheme) + + has_scheme = parsed_scheme != "" + has_authority = ( + parsed_userinfo != "" or parsed_host != "" or parsed_port is not None + ) + validate_path(path, has_scheme=has_scheme, has_authority=has_authority) + if has_scheme or has_authority: + path = normalize_path(path) + + parsed_path: str = quote(path, safe=PATH_SAFE) + parsed_query: str | None = None if query is None else quote(query, safe=QUERY_SAFE) + parsed_frag: str | None = None if frag is None else quote(frag, safe=FRAG_SAFE) + + # The parsed ASCII bytestrings are our canonical form. + # All properties of the URL are derived from these. + return ParseResult( + parsed_scheme, + parsed_userinfo, + parsed_host, + parsed_port, + parsed_path, + parsed_query, + parsed_frag, + ) + + +def encode_host(host: str) -> str: + if not host: + return "" + + elif IPv4_STYLE_HOSTNAME.match(host): + # Validate IPv4 hostnames like #.#.#.# + # + # From https://datatracker.ietf.org/doc/html/rfc3986/#section-3.2.2 + # + # IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet + try: + ipaddress.IPv4Address(host) + except ipaddress.AddressValueError: + raise InvalidURL(f"Invalid IPv4 address: {host!r}") + return host + + elif IPv6_STYLE_HOSTNAME.match(host): + # Validate IPv6 hostnames like [...] + # + # From https://datatracker.ietf.org/doc/html/rfc3986/#section-3.2.2 + # + # "A host identified by an Internet Protocol literal address, version 6 + # [RFC3513] or later, is distinguished by enclosing the IP literal + # within square brackets ("[" and "]"). This is the only place where + # square bracket characters are allowed in the URI syntax." + try: + ipaddress.IPv6Address(host[1:-1]) + except ipaddress.AddressValueError: + raise InvalidURL(f"Invalid IPv6 address: {host!r}") + return host[1:-1] + + elif host.isascii(): + # Regular ASCII hostnames + # + # From https://datatracker.ietf.org/doc/html/rfc3986/#section-3.2.2 + # + # reg-name = *( unreserved / pct-encoded / sub-delims ) + WHATWG_SAFE = '"`{}%|\\' + return quote(host.lower(), safe=SUB_DELIMS + WHATWG_SAFE) + + # IDNA hostnames + try: + return idna.encode(host.lower()).decode("ascii") + except idna.IDNAError: + raise InvalidURL(f"Invalid IDNA hostname: {host!r}") + + +def normalize_port(port: str | int | None, scheme: str) -> int | None: + # From https://tools.ietf.org/html/rfc3986#section-3.2.3 + # + # "A scheme may define a default port. For example, the "http" scheme + # defines a default port of "80", corresponding to its reserved TCP + # port number. The type of port designated by the port number (e.g., + # TCP, UDP, SCTP) is defined by the URI scheme. URI producers and + # normalizers should omit the port component and its ":" delimiter if + # port is empty or if its value would be the same as that of the + # scheme's default." + if port is None or port == "": + return None + + try: + port_as_int = int(port) + except ValueError: + raise InvalidURL(f"Invalid port: {port!r}") + + # See https://url.spec.whatwg.org/#url-miscellaneous + default_port = {"ftp": 21, "http": 80, "https": 443, "ws": 80, "wss": 443}.get( + scheme + ) + if port_as_int == default_port: + return None + return port_as_int + + +def validate_path(path: str, has_scheme: bool, has_authority: bool) -> None: + """ + Path validation rules that depend on if the URL contains + a scheme or authority component. + + See https://datatracker.ietf.org/doc/html/rfc3986.html#section-3.3 + """ + if has_authority: + # If a URI contains an authority component, then the path component + # must either be empty or begin with a slash ("/") character." + if path and not path.startswith("/"): + raise InvalidURL("For absolute URLs, path must be empty or begin with '/'") + + if not has_scheme and not has_authority: + # If a URI does not contain an authority component, then the path cannot begin + # with two slash characters ("//"). + if path.startswith("//"): + raise InvalidURL("Relative URLs cannot have a path starting with '//'") + + # In addition, a URI reference (Section 4.1) may be a relative-path reference, + # in which case the first path segment cannot contain a colon (":") character. + if path.startswith(":"): + raise InvalidURL("Relative URLs cannot have a path starting with ':'") + + +def normalize_path(path: str) -> str: + """ + Drop "." and ".." segments from a URL path. + + For example: + + normalize_path("/path/./to/somewhere/..") == "/path/to" + """ + # Fast return when no '.' characters in the path. + if "." not in path: + return path + + components = path.split("/") + + # Fast return when no '.' or '..' components in the path. + if "." not in components and ".." not in components: + return path + + # https://datatracker.ietf.org/doc/html/rfc3986#section-5.2.4 + output: list[str] = [] + for component in components: + if component == ".": + pass + elif component == "..": + if output and output != [""]: + output.pop() + else: + output.append(component) + return "/".join(output) + + +def PERCENT(string: str) -> str: + return "".join([f"%{byte:02X}" for byte in string.encode("utf-8")]) + + +def percent_encoded(string: str, safe: str) -> str: + """ + Use percent-encoding to quote a string. + """ + NON_ESCAPED_CHARS = UNRESERVED_CHARACTERS + safe + + # Fast path for strings that don't need escaping. + if not string.rstrip(NON_ESCAPED_CHARS): + return string + + return "".join( + [char if char in NON_ESCAPED_CHARS else PERCENT(char) for char in string] + ) + + +def quote(string: str, safe: str) -> str: + """ + Use percent-encoding to quote a string, omitting existing '%xx' escape sequences. + + See: https://www.rfc-editor.org/rfc/rfc3986#section-2.1 + + * `string`: The string to be percent-escaped. + * `safe`: A string containing characters that may be treated as safe, and do not + need to be escaped. Unreserved characters are always treated as safe. + See: https://www.rfc-editor.org/rfc/rfc3986#section-2.3 + """ + parts = [] + current_position = 0 + for match in re.finditer(PERCENT_ENCODED_REGEX, string): + start_position, end_position = match.start(), match.end() + matched_text = match.group(0) + # Add any text up to the '%xx' escape sequence. + if start_position != current_position: + leading_text = string[current_position:start_position] + parts.append(percent_encoded(leading_text, safe=safe)) + + # Add the '%xx' escape sequence. + parts.append(matched_text) + current_position = end_position + + # Add any text after the final '%xx' escape sequence. + if current_position != len(string): + trailing_text = string[current_position:] + parts.append(percent_encoded(trailing_text, safe=safe)) + + return "".join(parts) diff --git a/.venv/lib/python3.10/site-packages/httpx/_urls.py b/.venv/lib/python3.10/site-packages/httpx/_urls.py new file mode 100644 index 0000000..147a8fa --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpx/_urls.py @@ -0,0 +1,641 @@ +from __future__ import annotations + +import typing +from urllib.parse import parse_qs, unquote, urlencode + +import idna + +from ._types import QueryParamTypes +from ._urlparse import urlparse +from ._utils import primitive_value_to_str + +__all__ = ["URL", "QueryParams"] + + +class URL: + """ + url = httpx.URL("HTTPS://jo%40email.com:a%20secret@müller.de:1234/pa%20th?search=ab#anchorlink") + + assert url.scheme == "https" + assert url.username == "jo@email.com" + assert url.password == "a secret" + assert url.userinfo == b"jo%40email.com:a%20secret" + assert url.host == "müller.de" + assert url.raw_host == b"xn--mller-kva.de" + assert url.port == 1234 + assert url.netloc == b"xn--mller-kva.de:1234" + assert url.path == "/pa th" + assert url.query == b"?search=ab" + assert url.raw_path == b"/pa%20th?search=ab" + assert url.fragment == "anchorlink" + + The components of a URL are broken down like this: + + https://jo%40email.com:a%20secret@müller.de:1234/pa%20th?search=ab#anchorlink + [scheme] [ username ] [password] [ host ][port][ path ] [ query ] [fragment] + [ userinfo ] [ netloc ][ raw_path ] + + Note that: + + * `url.scheme` is normalized to always be lowercased. + + * `url.host` is normalized to always be lowercased. Internationalized domain + names are represented in unicode, without IDNA encoding applied. For instance: + + url = httpx.URL("http://中国.icom.museum") + assert url.host == "中国.icom.museum" + url = httpx.URL("http://xn--fiqs8s.icom.museum") + assert url.host == "中国.icom.museum" + + * `url.raw_host` is normalized to always be lowercased, and is IDNA encoded. + + url = httpx.URL("http://中国.icom.museum") + assert url.raw_host == b"xn--fiqs8s.icom.museum" + url = httpx.URL("http://xn--fiqs8s.icom.museum") + assert url.raw_host == b"xn--fiqs8s.icom.museum" + + * `url.port` is either None or an integer. URLs that include the default port for + "http", "https", "ws", "wss", and "ftp" schemes have their port + normalized to `None`. + + assert httpx.URL("http://example.com") == httpx.URL("http://example.com:80") + assert httpx.URL("http://example.com").port is None + assert httpx.URL("http://example.com:80").port is None + + * `url.userinfo` is raw bytes, without URL escaping. Usually you'll want to work + with `url.username` and `url.password` instead, which handle the URL escaping. + + * `url.raw_path` is raw bytes of both the path and query, without URL escaping. + This portion is used as the target when constructing HTTP requests. Usually you'll + want to work with `url.path` instead. + + * `url.query` is raw bytes, without URL escaping. A URL query string portion can + only be properly URL escaped when decoding the parameter names and values + themselves. + """ + + def __init__(self, url: URL | str = "", **kwargs: typing.Any) -> None: + if kwargs: + allowed = { + "scheme": str, + "username": str, + "password": str, + "userinfo": bytes, + "host": str, + "port": int, + "netloc": bytes, + "path": str, + "query": bytes, + "raw_path": bytes, + "fragment": str, + "params": object, + } + + # Perform type checking for all supported keyword arguments. + for key, value in kwargs.items(): + if key not in allowed: + message = f"{key!r} is an invalid keyword argument for URL()" + raise TypeError(message) + if value is not None and not isinstance(value, allowed[key]): + expected = allowed[key].__name__ + seen = type(value).__name__ + message = f"Argument {key!r} must be {expected} but got {seen}" + raise TypeError(message) + if isinstance(value, bytes): + kwargs[key] = value.decode("ascii") + + if "params" in kwargs: + # Replace any "params" keyword with the raw "query" instead. + # + # Ensure that empty params use `kwargs["query"] = None` rather + # than `kwargs["query"] = ""`, so that generated URLs do not + # include an empty trailing "?". + params = kwargs.pop("params") + kwargs["query"] = None if not params else str(QueryParams(params)) + + if isinstance(url, str): + self._uri_reference = urlparse(url, **kwargs) + elif isinstance(url, URL): + self._uri_reference = url._uri_reference.copy_with(**kwargs) + else: + raise TypeError( + "Invalid type for url. Expected str or httpx.URL," + f" got {type(url)}: {url!r}" + ) + + @property + def scheme(self) -> str: + """ + The URL scheme, such as "http", "https". + Always normalised to lowercase. + """ + return self._uri_reference.scheme + + @property + def raw_scheme(self) -> bytes: + """ + The raw bytes representation of the URL scheme, such as b"http", b"https". + Always normalised to lowercase. + """ + return self._uri_reference.scheme.encode("ascii") + + @property + def userinfo(self) -> bytes: + """ + The URL userinfo as a raw bytestring. + For example: b"jo%40email.com:a%20secret". + """ + return self._uri_reference.userinfo.encode("ascii") + + @property + def username(self) -> str: + """ + The URL username as a string, with URL decoding applied. + For example: "jo@email.com" + """ + userinfo = self._uri_reference.userinfo + return unquote(userinfo.partition(":")[0]) + + @property + def password(self) -> str: + """ + The URL password as a string, with URL decoding applied. + For example: "a secret" + """ + userinfo = self._uri_reference.userinfo + return unquote(userinfo.partition(":")[2]) + + @property + def host(self) -> str: + """ + The URL host as a string. + Always normalized to lowercase, with IDNA hosts decoded into unicode. + + Examples: + + url = httpx.URL("http://www.EXAMPLE.org") + assert url.host == "www.example.org" + + url = httpx.URL("http://中国.icom.museum") + assert url.host == "中国.icom.museum" + + url = httpx.URL("http://xn--fiqs8s.icom.museum") + assert url.host == "中国.icom.museum" + + url = httpx.URL("https://[::ffff:192.168.0.1]") + assert url.host == "::ffff:192.168.0.1" + """ + host: str = self._uri_reference.host + + if host.startswith("xn--"): + host = idna.decode(host) + + return host + + @property + def raw_host(self) -> bytes: + """ + The raw bytes representation of the URL host. + Always normalized to lowercase, and IDNA encoded. + + Examples: + + url = httpx.URL("http://www.EXAMPLE.org") + assert url.raw_host == b"www.example.org" + + url = httpx.URL("http://中国.icom.museum") + assert url.raw_host == b"xn--fiqs8s.icom.museum" + + url = httpx.URL("http://xn--fiqs8s.icom.museum") + assert url.raw_host == b"xn--fiqs8s.icom.museum" + + url = httpx.URL("https://[::ffff:192.168.0.1]") + assert url.raw_host == b"::ffff:192.168.0.1" + """ + return self._uri_reference.host.encode("ascii") + + @property + def port(self) -> int | None: + """ + The URL port as an integer. + + Note that the URL class performs port normalization as per the WHATWG spec. + Default ports for "http", "https", "ws", "wss", and "ftp" schemes are always + treated as `None`. + + For example: + + assert httpx.URL("http://www.example.com") == httpx.URL("http://www.example.com:80") + assert httpx.URL("http://www.example.com:80").port is None + """ + return self._uri_reference.port + + @property + def netloc(self) -> bytes: + """ + Either `` or `:` as bytes. + Always normalized to lowercase, and IDNA encoded. + + This property may be used for generating the value of a request + "Host" header. + """ + return self._uri_reference.netloc.encode("ascii") + + @property + def path(self) -> str: + """ + The URL path as a string. Excluding the query string, and URL decoded. + + For example: + + url = httpx.URL("https://example.com/pa%20th") + assert url.path == "/pa th" + """ + path = self._uri_reference.path or "/" + return unquote(path) + + @property + def query(self) -> bytes: + """ + The URL query string, as raw bytes, excluding the leading b"?". + + This is necessarily a bytewise interface, because we cannot + perform URL decoding of this representation until we've parsed + the keys and values into a QueryParams instance. + + For example: + + url = httpx.URL("https://example.com/?filter=some%20search%20terms") + assert url.query == b"filter=some%20search%20terms" + """ + query = self._uri_reference.query or "" + return query.encode("ascii") + + @property + def params(self) -> QueryParams: + """ + The URL query parameters, neatly parsed and packaged into an immutable + multidict representation. + """ + return QueryParams(self._uri_reference.query) + + @property + def raw_path(self) -> bytes: + """ + The complete URL path and query string as raw bytes. + Used as the target when constructing HTTP requests. + + For example: + + GET /users?search=some%20text HTTP/1.1 + Host: www.example.org + Connection: close + """ + path = self._uri_reference.path or "/" + if self._uri_reference.query is not None: + path += "?" + self._uri_reference.query + return path.encode("ascii") + + @property + def fragment(self) -> str: + """ + The URL fragments, as used in HTML anchors. + As a string, without the leading '#'. + """ + return unquote(self._uri_reference.fragment or "") + + @property + def is_absolute_url(self) -> bool: + """ + Return `True` for absolute URLs such as 'http://example.com/path', + and `False` for relative URLs such as '/path'. + """ + # We don't use `.is_absolute` from `rfc3986` because it treats + # URLs with a fragment portion as not absolute. + # What we actually care about is if the URL provides + # a scheme and hostname to which connections should be made. + return bool(self._uri_reference.scheme and self._uri_reference.host) + + @property + def is_relative_url(self) -> bool: + """ + Return `False` for absolute URLs such as 'http://example.com/path', + and `True` for relative URLs such as '/path'. + """ + return not self.is_absolute_url + + def copy_with(self, **kwargs: typing.Any) -> URL: + """ + Copy this URL, returning a new URL with some components altered. + Accepts the same set of parameters as the components that are made + available via properties on the `URL` class. + + For example: + + url = httpx.URL("https://www.example.com").copy_with( + username="jo@gmail.com", password="a secret" + ) + assert url == "https://jo%40email.com:a%20secret@www.example.com" + """ + return URL(self, **kwargs) + + def copy_set_param(self, key: str, value: typing.Any = None) -> URL: + return self.copy_with(params=self.params.set(key, value)) + + def copy_add_param(self, key: str, value: typing.Any = None) -> URL: + return self.copy_with(params=self.params.add(key, value)) + + def copy_remove_param(self, key: str) -> URL: + return self.copy_with(params=self.params.remove(key)) + + def copy_merge_params(self, params: QueryParamTypes) -> URL: + return self.copy_with(params=self.params.merge(params)) + + def join(self, url: URL | str) -> URL: + """ + Return an absolute URL, using this URL as the base. + + Eg. + + url = httpx.URL("https://www.example.com/test") + url = url.join("/new/path") + assert url == "https://www.example.com/new/path" + """ + from urllib.parse import urljoin + + return URL(urljoin(str(self), str(URL(url)))) + + def __hash__(self) -> int: + return hash(str(self)) + + def __eq__(self, other: typing.Any) -> bool: + return isinstance(other, (URL, str)) and str(self) == str(URL(other)) + + def __str__(self) -> str: + return str(self._uri_reference) + + def __repr__(self) -> str: + scheme, userinfo, host, port, path, query, fragment = self._uri_reference + + if ":" in userinfo: + # Mask any password component. + userinfo = f'{userinfo.split(":")[0]}:[secure]' + + authority = "".join( + [ + f"{userinfo}@" if userinfo else "", + f"[{host}]" if ":" in host else host, + f":{port}" if port is not None else "", + ] + ) + url = "".join( + [ + f"{self.scheme}:" if scheme else "", + f"//{authority}" if authority else "", + path, + f"?{query}" if query is not None else "", + f"#{fragment}" if fragment is not None else "", + ] + ) + + return f"{self.__class__.__name__}({url!r})" + + @property + def raw(self) -> tuple[bytes, bytes, int, bytes]: # pragma: nocover + import collections + import warnings + + warnings.warn("URL.raw is deprecated.") + RawURL = collections.namedtuple( + "RawURL", ["raw_scheme", "raw_host", "port", "raw_path"] + ) + return RawURL( + raw_scheme=self.raw_scheme, + raw_host=self.raw_host, + port=self.port, + raw_path=self.raw_path, + ) + + +class QueryParams(typing.Mapping[str, str]): + """ + URL query parameters, as a multi-dict. + """ + + def __init__(self, *args: QueryParamTypes | None, **kwargs: typing.Any) -> None: + assert len(args) < 2, "Too many arguments." + assert not (args and kwargs), "Cannot mix named and unnamed arguments." + + value = args[0] if args else kwargs + + if value is None or isinstance(value, (str, bytes)): + value = value.decode("ascii") if isinstance(value, bytes) else value + self._dict = parse_qs(value, keep_blank_values=True) + elif isinstance(value, QueryParams): + self._dict = {k: list(v) for k, v in value._dict.items()} + else: + dict_value: dict[typing.Any, list[typing.Any]] = {} + if isinstance(value, (list, tuple)): + # Convert list inputs like: + # [("a", "123"), ("a", "456"), ("b", "789")] + # To a dict representation, like: + # {"a": ["123", "456"], "b": ["789"]} + for item in value: + dict_value.setdefault(item[0], []).append(item[1]) + else: + # Convert dict inputs like: + # {"a": "123", "b": ["456", "789"]} + # To dict inputs where values are always lists, like: + # {"a": ["123"], "b": ["456", "789"]} + dict_value = { + k: list(v) if isinstance(v, (list, tuple)) else [v] + for k, v in value.items() + } + + # Ensure that keys and values are neatly coerced to strings. + # We coerce values `True` and `False` to JSON-like "true" and "false" + # representations, and coerce `None` values to the empty string. + self._dict = { + str(k): [primitive_value_to_str(item) for item in v] + for k, v in dict_value.items() + } + + def keys(self) -> typing.KeysView[str]: + """ + Return all the keys in the query params. + + Usage: + + q = httpx.QueryParams("a=123&a=456&b=789") + assert list(q.keys()) == ["a", "b"] + """ + return self._dict.keys() + + def values(self) -> typing.ValuesView[str]: + """ + Return all the values in the query params. If a key occurs more than once + only the first item for that key is returned. + + Usage: + + q = httpx.QueryParams("a=123&a=456&b=789") + assert list(q.values()) == ["123", "789"] + """ + return {k: v[0] for k, v in self._dict.items()}.values() + + def items(self) -> typing.ItemsView[str, str]: + """ + Return all items in the query params. If a key occurs more than once + only the first item for that key is returned. + + Usage: + + q = httpx.QueryParams("a=123&a=456&b=789") + assert list(q.items()) == [("a", "123"), ("b", "789")] + """ + return {k: v[0] for k, v in self._dict.items()}.items() + + def multi_items(self) -> list[tuple[str, str]]: + """ + Return all items in the query params. Allow duplicate keys to occur. + + Usage: + + q = httpx.QueryParams("a=123&a=456&b=789") + assert list(q.multi_items()) == [("a", "123"), ("a", "456"), ("b", "789")] + """ + multi_items: list[tuple[str, str]] = [] + for k, v in self._dict.items(): + multi_items.extend([(k, i) for i in v]) + return multi_items + + def get(self, key: typing.Any, default: typing.Any = None) -> typing.Any: + """ + Get a value from the query param for a given key. If the key occurs + more than once, then only the first value is returned. + + Usage: + + q = httpx.QueryParams("a=123&a=456&b=789") + assert q.get("a") == "123" + """ + if key in self._dict: + return self._dict[str(key)][0] + return default + + def get_list(self, key: str) -> list[str]: + """ + Get all values from the query param for a given key. + + Usage: + + q = httpx.QueryParams("a=123&a=456&b=789") + assert q.get_list("a") == ["123", "456"] + """ + return list(self._dict.get(str(key), [])) + + def set(self, key: str, value: typing.Any = None) -> QueryParams: + """ + Return a new QueryParams instance, setting the value of a key. + + Usage: + + q = httpx.QueryParams("a=123") + q = q.set("a", "456") + assert q == httpx.QueryParams("a=456") + """ + q = QueryParams() + q._dict = dict(self._dict) + q._dict[str(key)] = [primitive_value_to_str(value)] + return q + + def add(self, key: str, value: typing.Any = None) -> QueryParams: + """ + Return a new QueryParams instance, setting or appending the value of a key. + + Usage: + + q = httpx.QueryParams("a=123") + q = q.add("a", "456") + assert q == httpx.QueryParams("a=123&a=456") + """ + q = QueryParams() + q._dict = dict(self._dict) + q._dict[str(key)] = q.get_list(key) + [primitive_value_to_str(value)] + return q + + def remove(self, key: str) -> QueryParams: + """ + Return a new QueryParams instance, removing the value of a key. + + Usage: + + q = httpx.QueryParams("a=123") + q = q.remove("a") + assert q == httpx.QueryParams("") + """ + q = QueryParams() + q._dict = dict(self._dict) + q._dict.pop(str(key), None) + return q + + def merge(self, params: QueryParamTypes | None = None) -> QueryParams: + """ + Return a new QueryParams instance, updated with. + + Usage: + + q = httpx.QueryParams("a=123") + q = q.merge({"b": "456"}) + assert q == httpx.QueryParams("a=123&b=456") + + q = httpx.QueryParams("a=123") + q = q.merge({"a": "456", "b": "789"}) + assert q == httpx.QueryParams("a=456&b=789") + """ + q = QueryParams(params) + q._dict = {**self._dict, **q._dict} + return q + + def __getitem__(self, key: typing.Any) -> str: + return self._dict[key][0] + + def __contains__(self, key: typing.Any) -> bool: + return key in self._dict + + def __iter__(self) -> typing.Iterator[typing.Any]: + return iter(self.keys()) + + def __len__(self) -> int: + return len(self._dict) + + def __bool__(self) -> bool: + return bool(self._dict) + + def __hash__(self) -> int: + return hash(str(self)) + + def __eq__(self, other: typing.Any) -> bool: + if not isinstance(other, self.__class__): + return False + return sorted(self.multi_items()) == sorted(other.multi_items()) + + def __str__(self) -> str: + return urlencode(self.multi_items()) + + def __repr__(self) -> str: + class_name = self.__class__.__name__ + query_string = str(self) + return f"{class_name}({query_string!r})" + + def update(self, params: QueryParamTypes | None = None) -> None: + raise RuntimeError( + "QueryParams are immutable since 0.18.0. " + "Use `q = q.merge(...)` to create an updated copy." + ) + + def __setitem__(self, key: str, value: str) -> None: + raise RuntimeError( + "QueryParams are immutable since 0.18.0. " + "Use `q = q.set(key, value)` to create an updated copy." + ) diff --git a/.venv/lib/python3.10/site-packages/httpx/_utils.py b/.venv/lib/python3.10/site-packages/httpx/_utils.py new file mode 100644 index 0000000..7fe827d --- /dev/null +++ b/.venv/lib/python3.10/site-packages/httpx/_utils.py @@ -0,0 +1,242 @@ +from __future__ import annotations + +import ipaddress +import os +import re +import typing +from urllib.request import getproxies + +from ._types import PrimitiveData + +if typing.TYPE_CHECKING: # pragma: no cover + from ._urls import URL + + +def primitive_value_to_str(value: PrimitiveData) -> str: + """ + Coerce a primitive data type into a string value. + + Note that we prefer JSON-style 'true'/'false' for boolean values here. + """ + if value is True: + return "true" + elif value is False: + return "false" + elif value is None: + return "" + return str(value) + + +def get_environment_proxies() -> dict[str, str | None]: + """Gets proxy information from the environment""" + + # urllib.request.getproxies() falls back on System + # Registry and Config for proxies on Windows and macOS. + # We don't want to propagate non-HTTP proxies into + # our configuration such as 'TRAVIS_APT_PROXY'. + proxy_info = getproxies() + mounts: dict[str, str | None] = {} + + for scheme in ("http", "https", "all"): + if proxy_info.get(scheme): + hostname = proxy_info[scheme] + mounts[f"{scheme}://"] = ( + hostname if "://" in hostname else f"http://{hostname}" + ) + + no_proxy_hosts = [host.strip() for host in proxy_info.get("no", "").split(",")] + for hostname in no_proxy_hosts: + # See https://curl.haxx.se/libcurl/c/CURLOPT_NOPROXY.html for details + # on how names in `NO_PROXY` are handled. + if hostname == "*": + # If NO_PROXY=* is used or if "*" occurs as any one of the comma + # separated hostnames, then we should just bypass any information + # from HTTP_PROXY, HTTPS_PROXY, ALL_PROXY, and always ignore + # proxies. + return {} + elif hostname: + # NO_PROXY=.google.com is marked as "all://*.google.com, + # which disables "www.google.com" but not "google.com" + # NO_PROXY=google.com is marked as "all://*google.com, + # which disables "www.google.com" and "google.com". + # (But not "wwwgoogle.com") + # NO_PROXY can include domains, IPv6, IPv4 addresses and "localhost" + # NO_PROXY=example.com,::1,localhost,192.168.0.0/16 + if "://" in hostname: + mounts[hostname] = None + elif is_ipv4_hostname(hostname): + mounts[f"all://{hostname}"] = None + elif is_ipv6_hostname(hostname): + mounts[f"all://[{hostname}]"] = None + elif hostname.lower() == "localhost": + mounts[f"all://{hostname}"] = None + else: + mounts[f"all://*{hostname}"] = None + + return mounts + + +def to_bytes(value: str | bytes, encoding: str = "utf-8") -> bytes: + return value.encode(encoding) if isinstance(value, str) else value + + +def to_str(value: str | bytes, encoding: str = "utf-8") -> str: + return value if isinstance(value, str) else value.decode(encoding) + + +def to_bytes_or_str(value: str, match_type_of: typing.AnyStr) -> typing.AnyStr: + return value if isinstance(match_type_of, str) else value.encode() + + +def unquote(value: str) -> str: + return value[1:-1] if value[0] == value[-1] == '"' else value + + +def peek_filelike_length(stream: typing.Any) -> int | None: + """ + Given a file-like stream object, return its length in number of bytes + without reading it into memory. + """ + try: + # Is it an actual file? + fd = stream.fileno() + # Yup, seems to be an actual file. + length = os.fstat(fd).st_size + except (AttributeError, OSError): + # No... Maybe it's something that supports random access, like `io.BytesIO`? + try: + # Assuming so, go to end of stream to figure out its length, + # then put it back in place. + offset = stream.tell() + length = stream.seek(0, os.SEEK_END) + stream.seek(offset) + except (AttributeError, OSError): + # Not even that? Sorry, we're doomed... + return None + + return length + + +class URLPattern: + """ + A utility class currently used for making lookups against proxy keys... + + # Wildcard matching... + >>> pattern = URLPattern("all://") + >>> pattern.matches(httpx.URL("http://example.com")) + True + + # Witch scheme matching... + >>> pattern = URLPattern("https://") + >>> pattern.matches(httpx.URL("https://example.com")) + True + >>> pattern.matches(httpx.URL("http://example.com")) + False + + # With domain matching... + >>> pattern = URLPattern("https://example.com") + >>> pattern.matches(httpx.URL("https://example.com")) + True + >>> pattern.matches(httpx.URL("http://example.com")) + False + >>> pattern.matches(httpx.URL("https://other.com")) + False + + # Wildcard scheme, with domain matching... + >>> pattern = URLPattern("all://example.com") + >>> pattern.matches(httpx.URL("https://example.com")) + True + >>> pattern.matches(httpx.URL("http://example.com")) + True + >>> pattern.matches(httpx.URL("https://other.com")) + False + + # With port matching... + >>> pattern = URLPattern("https://example.com:1234") + >>> pattern.matches(httpx.URL("https://example.com:1234")) + True + >>> pattern.matches(httpx.URL("https://example.com")) + False + """ + + def __init__(self, pattern: str) -> None: + from ._urls import URL + + if pattern and ":" not in pattern: + raise ValueError( + f"Proxy keys should use proper URL forms rather " + f"than plain scheme strings. " + f'Instead of "{pattern}", use "{pattern}://"' + ) + + url = URL(pattern) + self.pattern = pattern + self.scheme = "" if url.scheme == "all" else url.scheme + self.host = "" if url.host == "*" else url.host + self.port = url.port + if not url.host or url.host == "*": + self.host_regex: typing.Pattern[str] | None = None + elif url.host.startswith("*."): + # *.example.com should match "www.example.com", but not "example.com" + domain = re.escape(url.host[2:]) + self.host_regex = re.compile(f"^.+\\.{domain}$") + elif url.host.startswith("*"): + # *example.com should match "www.example.com" and "example.com" + domain = re.escape(url.host[1:]) + self.host_regex = re.compile(f"^(.+\\.)?{domain}$") + else: + # example.com should match "example.com" but not "www.example.com" + domain = re.escape(url.host) + self.host_regex = re.compile(f"^{domain}$") + + def matches(self, other: URL) -> bool: + if self.scheme and self.scheme != other.scheme: + return False + if ( + self.host + and self.host_regex is not None + and not self.host_regex.match(other.host) + ): + return False + if self.port is not None and self.port != other.port: + return False + return True + + @property + def priority(self) -> tuple[int, int, int]: + """ + The priority allows URLPattern instances to be sortable, so that + we can match from most specific to least specific. + """ + # URLs with a port should take priority over URLs without a port. + port_priority = 0 if self.port is not None else 1 + # Longer hostnames should match first. + host_priority = -len(self.host) + # Longer schemes should match first. + scheme_priority = -len(self.scheme) + return (port_priority, host_priority, scheme_priority) + + def __hash__(self) -> int: + return hash(self.pattern) + + def __lt__(self, other: URLPattern) -> bool: + return self.priority < other.priority + + def __eq__(self, other: typing.Any) -> bool: + return isinstance(other, URLPattern) and self.pattern == other.pattern + + +def is_ipv4_hostname(hostname: str) -> bool: + try: + ipaddress.IPv4Address(hostname.split("/")[0]) + except Exception: + return False + return True + + +def is_ipv6_hostname(hostname: str) -> bool: + try: + ipaddress.IPv6Address(hostname.split("/")[0]) + except Exception: + return False + return True diff --git a/.venv/lib/python3.10/site-packages/httpx/py.typed b/.venv/lib/python3.10/site-packages/httpx/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/.venv/lib/python3.10/site-packages/idna-3.11.dist-info/INSTALLER b/.venv/lib/python3.10/site-packages/idna-3.11.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/.venv/lib/python3.10/site-packages/idna-3.11.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/.venv/lib/python3.10/site-packages/idna-3.11.dist-info/METADATA b/.venv/lib/python3.10/site-packages/idna-3.11.dist-info/METADATA new file mode 100644 index 0000000..7a4a4b7 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/idna-3.11.dist-info/METADATA @@ -0,0 +1,209 @@ +Metadata-Version: 2.4 +Name: idna +Version: 3.11 +Summary: Internationalized Domain Names in Applications (IDNA) +Author-email: Kim Davies +Requires-Python: >=3.8 +Description-Content-Type: text/x-rst +License-Expression: BSD-3-Clause +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Intended Audience :: System Administrators +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Classifier: Programming Language :: Python :: 3.14 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Internet :: Name Service (DNS) +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Utilities +License-File: LICENSE.md +Requires-Dist: ruff >= 0.6.2 ; extra == "all" +Requires-Dist: mypy >= 1.11.2 ; extra == "all" +Requires-Dist: pytest >= 8.3.2 ; extra == "all" +Requires-Dist: flake8 >= 7.1.1 ; extra == "all" +Project-URL: Changelog, https://github.com/kjd/idna/blob/master/HISTORY.rst +Project-URL: Issue tracker, https://github.com/kjd/idna/issues +Project-URL: Source, https://github.com/kjd/idna +Provides-Extra: all + +Internationalized Domain Names in Applications (IDNA) +===================================================== + +Support for `Internationalized Domain Names in +Applications (IDNA) `_ +and `Unicode IDNA Compatibility Processing +`_. + +The latest versions of these standards supplied here provide +more comprehensive language coverage and reduce the potential of +allowing domains with known security vulnerabilities. This library +is a suitable replacement for the “encodings.idna” +module that comes with the Python standard library, but which +only supports an older superseded IDNA specification from 2003. + +Basic functions are simply executed: + +.. code-block:: pycon + + >>> import idna + >>> idna.encode('ドメイン.テスト') + b'xn--eckwd4c7c.xn--zckzah' + >>> print(idna.decode('xn--eckwd4c7c.xn--zckzah')) + ドメイン.テスト + + +Installation +------------ + +This package is available for installation from PyPI via the +typical mechanisms, such as: + +.. code-block:: bash + + $ python3 -m pip install idna + + +Usage +----- + +For typical usage, the ``encode`` and ``decode`` functions will take a +domain name argument and perform a conversion to ASCII compatible encoding +(known as A-labels), or to Unicode strings (known as U-labels) +respectively. + +.. code-block:: pycon + + >>> import idna + >>> idna.encode('ドメイン.テスト') + b'xn--eckwd4c7c.xn--zckzah' + >>> print(idna.decode('xn--eckwd4c7c.xn--zckzah')) + ドメイン.テスト + +Conversions can be applied at a per-label basis using the ``ulabel`` or +``alabel`` functions if necessary: + +.. code-block:: pycon + + >>> idna.alabel('测试') + b'xn--0zwm56d' + + +Compatibility Mapping (UTS #46) ++++++++++++++++++++++++++++++++ + +This library provides support for `Unicode IDNA Compatibility +Processing `_ which normalizes input from +different potential ways a user may input a domain prior to performing the IDNA +conversion operations. This functionality, known as a +`mapping `_, is considered by the +specification to be a local user-interface issue distinct from IDNA +conversion functionality. + +For example, “Königsgäßchen” is not a permissible label as *LATIN +CAPITAL LETTER K* is not allowed (nor are capital letters in general). +UTS 46 will convert this into lower case prior to applying the IDNA +conversion. + +.. code-block:: pycon + + >>> import idna + >>> idna.encode('Königsgäßchen') + ... + idna.core.InvalidCodepoint: Codepoint U+004B at position 1 of 'Königsgäßchen' not allowed + >>> idna.encode('Königsgäßchen', uts46=True) + b'xn--knigsgchen-b4a3dun' + >>> print(idna.decode('xn--knigsgchen-b4a3dun')) + königsgäßchen + + +Exceptions +---------- + +All errors raised during the conversion following the specification +should raise an exception derived from the ``idna.IDNAError`` base +class. + +More specific exceptions that may be generated as ``idna.IDNABidiError`` +when the error reflects an illegal combination of left-to-right and +right-to-left characters in a label; ``idna.InvalidCodepoint`` when +a specific codepoint is an illegal character in an IDN label (i.e. +INVALID); and ``idna.InvalidCodepointContext`` when the codepoint is +illegal based on its position in the string (i.e. it is CONTEXTO or CONTEXTJ +but the contextual requirements are not satisfied.) + +Building and Diagnostics +------------------------ + +The IDNA and UTS 46 functionality relies upon pre-calculated lookup +tables for performance. These tables are derived from computing against +eligibility criteria in the respective standards using the command-line +script ``tools/idna-data``. + +This tool will fetch relevant codepoint data from the Unicode repository +and perform the required calculations to identify eligibility. There are +three main modes: + +* ``idna-data make-libdata``. Generates ``idnadata.py`` and + ``uts46data.py``, the pre-calculated lookup tables used for IDNA and + UTS 46 conversions. Implementers who wish to track this library against + a different Unicode version may use this tool to manually generate a + different version of the ``idnadata.py`` and ``uts46data.py`` files. + +* ``idna-data make-table``. Generate a table of the IDNA disposition + (e.g. PVALID, CONTEXTJ, CONTEXTO) in the format found in Appendix + B.1 of RFC 5892 and the pre-computed tables published by `IANA + `_. + +* ``idna-data U+0061``. Prints debugging output on the various + properties associated with an individual Unicode codepoint (in this + case, U+0061), that are used to assess the IDNA and UTS 46 status of a + codepoint. This is helpful in debugging or analysis. + +The tool accepts a number of arguments, described using ``idna-data +-h``. Most notably, the ``--version`` argument allows the specification +of the version of Unicode to be used in computing the table data. For +example, ``idna-data --version 9.0.0 make-libdata`` will generate +library data against Unicode 9.0.0. + + +Additional Notes +---------------- + +* **Packages**. The latest tagged release version is published in the + `Python Package Index `_. + +* **Version support**. This library supports Python 3.8 and higher. + As this library serves as a low-level toolkit for a variety of + applications, many of which strive for broad compatibility with older + Python versions, there is no rush to remove older interpreter support. + Support for older versions are likely to be removed from new releases + as automated tests can no longer easily be run, i.e. once the Python + version is officially end-of-life. + +* **Testing**. The library has a test suite based on each rule of the + IDNA specification, as well as tests that are provided as part of the + Unicode Technical Standard 46, `Unicode IDNA Compatibility Processing + `_. + +* **Emoji**. It is an occasional request to support emoji domains in + this library. Encoding of symbols like emoji is expressly prohibited by + the technical standard IDNA 2008 and emoji domains are broadly phased + out across the domain industry due to associated security risks. For + now, applications that need to support these non-compliant labels + may wish to consider trying the encode/decode operation in this library + first, and then falling back to using `encodings.idna`. See `the Github + project `_ for more discussion. + +* **Transitional processing**. Unicode 16.0.0 removed transitional + processing so the `transitional` argument for the encode() method + no longer has any effect and will be removed at a later date. + diff --git a/.venv/lib/python3.10/site-packages/idna-3.11.dist-info/RECORD b/.venv/lib/python3.10/site-packages/idna-3.11.dist-info/RECORD new file mode 100644 index 0000000..8995942 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/idna-3.11.dist-info/RECORD @@ -0,0 +1,22 @@ +idna-3.11.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +idna-3.11.dist-info/METADATA,sha256=fCwSww9SuiN8TIHllFSASUQCW55hAs8dzKnr9RaEEbA,8378 +idna-3.11.dist-info/RECORD,, +idna-3.11.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82 +idna-3.11.dist-info/licenses/LICENSE.md,sha256=t6M2q_OwThgOwGXN0W5wXQeeHMehT5EKpukYfza5zYc,1541 +idna/__init__.py,sha256=MPqNDLZbXqGaNdXxAFhiqFPKEQXju2jNQhCey6-5eJM,868 +idna/__pycache__/__init__.cpython-310.pyc,, +idna/__pycache__/codec.cpython-310.pyc,, +idna/__pycache__/compat.cpython-310.pyc,, +idna/__pycache__/core.cpython-310.pyc,, +idna/__pycache__/idnadata.cpython-310.pyc,, +idna/__pycache__/intranges.cpython-310.pyc,, +idna/__pycache__/package_data.cpython-310.pyc,, +idna/__pycache__/uts46data.cpython-310.pyc,, +idna/codec.py,sha256=M2SGWN7cs_6B32QmKTyTN6xQGZeYQgQ2wiX3_DR6loE,3438 +idna/compat.py,sha256=RzLy6QQCdl9784aFhb2EX9EKGCJjg0P3PilGdeXXcx8,316 +idna/core.py,sha256=P26_XVycuMTZ1R2mNK1ZREVzM5mvTzdabBXfyZVU1Lc,13246 +idna/idnadata.py,sha256=SG8jhaGE53iiD6B49pt2pwTv_UvClciWE-N54oR2p4U,79623 +idna/intranges.py,sha256=amUtkdhYcQG8Zr-CoMM_kVRacxkivC1WgxN1b63KKdU,1898 +idna/package_data.py,sha256=_CUavOxobnbyNG2FLyHoN8QHP3QM9W1tKuw7eq9QwBk,21 +idna/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +idna/uts46data.py,sha256=H9J35VkD0F9L9mKOqjeNGd2A-Va6FlPoz6Jz4K7h-ps,243725 diff --git a/.venv/lib/python3.10/site-packages/idna-3.11.dist-info/WHEEL b/.venv/lib/python3.10/site-packages/idna-3.11.dist-info/WHEEL new file mode 100644 index 0000000..d8b9936 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/idna-3.11.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: flit 3.12.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/.venv/lib/python3.10/site-packages/idna-3.11.dist-info/licenses/LICENSE.md b/.venv/lib/python3.10/site-packages/idna-3.11.dist-info/licenses/LICENSE.md new file mode 100644 index 0000000..256ba90 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/idna-3.11.dist-info/licenses/LICENSE.md @@ -0,0 +1,31 @@ +BSD 3-Clause License + +Copyright (c) 2013-2025, Kim Davies and contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/.venv/lib/python3.10/site-packages/idna/__init__.py b/.venv/lib/python3.10/site-packages/idna/__init__.py new file mode 100644 index 0000000..cfdc030 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/idna/__init__.py @@ -0,0 +1,45 @@ +from .core import ( + IDNABidiError, + IDNAError, + InvalidCodepoint, + InvalidCodepointContext, + alabel, + check_bidi, + check_hyphen_ok, + check_initial_combiner, + check_label, + check_nfc, + decode, + encode, + ulabel, + uts46_remap, + valid_contextj, + valid_contexto, + valid_label_length, + valid_string_length, +) +from .intranges import intranges_contain +from .package_data import __version__ + +__all__ = [ + "__version__", + "IDNABidiError", + "IDNAError", + "InvalidCodepoint", + "InvalidCodepointContext", + "alabel", + "check_bidi", + "check_hyphen_ok", + "check_initial_combiner", + "check_label", + "check_nfc", + "decode", + "encode", + "intranges_contain", + "ulabel", + "uts46_remap", + "valid_contextj", + "valid_contexto", + "valid_label_length", + "valid_string_length", +] diff --git a/.venv/lib/python3.10/site-packages/idna/__pycache__/__init__.cpython-310.pyc b/.venv/lib/python3.10/site-packages/idna/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..73f4b7d09c046c536134f205b0bad18819c359a2 GIT binary patch literal 833 zcmbu7&5qMB5XX~#q)n6bd%K7?=z(TeAWjGY3x}1^3W=L9mK%E;Z~YNDZnb?KZoCGM z;VWEt1x|R96+(O9f~EX2Gfw_9r-uS1s9yFk#2xN#t z*+CuIMP1oLJ=sTn8KFoH&_E8+P{t^hBQ%l;N@R*snW0RM(O6Ew z#wBgMRftNdPGz11te!zyvS_%m8!1!sBNB#Pteo*nj2uX9^epX|*ZHr4=dmWXCWimNZSe z0meiKjK2ovDU=5I^)WBCWI3aGW%L~@Y@OGK?XAAgH%F$9x!~KpI@waI=bOumyyliY mdyuYkP8G>9hWTT>sZMVAN@{u#>@{4)8qV!gkS^0O?feGRtKcgD literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/idna/__pycache__/codec.cpython-310.pyc b/.venv/lib/python3.10/site-packages/idna/__pycache__/codec.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..406fe80c754964751afeeb20325edf49d234a236 GIT binary patch literal 3254 zcmb7`&u<(>7RS4~tAEURJa!z1#4Ievgdf8XkHZhaE`)VRvM4KLBmzPjghuVDnz&6* z_fXXXIJBh|&K3R!`{)~g!0u(mnLnVeaLI{-PjK1&zUr~Zj*YVPs9smS*Hcxm>hoSz zK0RG`@T~m&pCp@hoS&$1{PEFPMbSS(2uHBg=~QplVQ9OlJMcQ*fOq)7@A%9Sp5SRP z2s_~*>O_NDr#7f}>Vv7y6muloZ3uslb*A5SL?FU@jtHf*+1&9uO=u!fgQf<}3^cRQ z)WsAuQ_!4)W)7N$n1*IrHlaJe!#n4pYl<1@W~^==x_L1xFNkxJj_sHr;4gBMi<)8lf%`gA@?w5b>ecGb|jz2XtR#EhO5YnL~ z?6`2#m7efWI414OpzmVZf$&9e&+mlR?jPB`BYP+!*s*MIX3F^2F{PdfbfJ=7VYrBk z7&D}aYZEA0j8xY1Fz(?)b&hf!BWqLFm=Bkil(T=yc5oaPzvO9}QUvDq%y9fBpQFcAK3Q#veKUage zP_!V%OJ%n28Lnm8SD?^QO^AI*UBc_PTkVZ}Alp*3hbrHcy+XJ3XuY3*)n5KWW?!_^ zWW7DyDmL=$mE|idZJiYIrD5FrEWRUkI}usjrakH{54Y@SQ|R-6ppRISahJ1M_in>3 z-Ey^?zq>|i7XLc*TAf2<-!&)PQu9!%h{OdFkB}fIDzQK{vf9rcMdfhhil?;}vn$%F znW)>%;(_dTO}*P4YFSn?arrx&)PGT7yXUq(CVi#cVeR!ckhsMi-7c0|NM#w zcEd8*W2Jx5*{)feU)f5uY)I6qkg#y5Ie4JXL)`x_o&&;v*#?0kCtHz?1dEKB?T)g9 zFzt%G&|M{suZL+;Ama>&G7~DKzKAKqH}fQG)zwAP90iNIOt!$LA#ECkiW7=I>W*Sx zk5Xg=o!mvoRSIiV%C05n0Y*);yFTjorRr7@@dWzTD-eevQ%Bfv7L7|_TNFyxZe`PJ z;C=VW(;O_H?0cyI(_E#|KQ z?Esj+2#5*uV2rudTg+c0i^V)Tfq77b$1wi~Ft3d^SQ6W2n~?on*R*v!1j&t)8X-JV&BMf|5X$J)cMIY|zyU^wEnX zULrv`O0^+OeT+4w#tA5t`X*3U$@Us_`c;St)OGfMfbE_Fd(6TS*oVpd6xc3Ct9*W$ zYQ$>A^S&0l@0Pi9a?zeOXd21%3!~f-#l{Z?U`Wyal zkAHhKnz>|hK2Ha`jmNS@T+okRo0v&b;fTh%@1ZQ6KE%M-!*dG?rFcjvsh`MIU}%k%sa HZ#Mr2-dLc5khYph)DE)2J09r9`vBU^FCRc^AT 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 B%BKJT literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/idna/__pycache__/idnadata.cpython-310.pyc b/.venv/lib/python3.10/site-packages/idna/__pycache__/idnadata.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..11f4be7d155e2e822a173606582db20e72df14c9 GIT binary patch literal 198632 zcmYhk37pk)|G$5lPIIPd5mHI}zD)bHPc_xFPy3WMseGhOTBf9?n#dkPNRlK(AxV;u zgd`*(2}vl55Vs}#U)THfJm25{{yy&Ox?Z2ooO#cg?m6#1pL6DWRjE?xG5b%`V>>4% zS{I3Z&G7&KPpS>s_TQN|ToQ{#u@SMTNR$#4jp9+UD0OAA5k)4(qC}K-caf-gV0vJQ zz>@5;Rt>BcSUs>t zV9mfmc%)pj`tpZyIwh3$- z*bauz)IQ8vfgJ)n26hU}4(uG*C9rE?PGGmd?twi5dj|Fj>>bz#hR>86=Dvab0{aIJ z2pkwVC~$CKUf__xp@A0%4htL}I3jRl;3ybA(-W+&K;H`m60&fevJ@5_~KGV`L-x+vU;N5}C z0`CdDH}Jl|<$?DHt_XY}aAn|wfvW-^3S14tXL>lyYXTn$TpRdk;A4T02d)czBJjz; z^?@4#p9*|B@R`7kfzQJ5nKp&_xxmeV&j)S^d?9da;ERFV0$&Q;9{6(LD}k>@JM8Dp zYtc^Q>w&vq_)Kqv`OR>Pw?gj@{dVX*q2CGI8~ASEdx7tV+w2ScAaH-+hv82T1bzg= zXZkqIp9CHZ{50@T;Aeq{13wS^BJj(=Bhgp3_M@S{4m=k4P2jhI-@)*ij)(a~Sj+dJ ze+WDo9*t9hKL-93cslUsz+VD?4LlS0Tj1}3{|o#BhR^h8nEwj=JMe7aKY{-S{s)&9 ziDGgQ)?#ytTvW&7tk;eglT+n{oF*5?e0IBSy6&TdTv9G2mzK|w%gE=-=gH^GW#tRx za&mdOf_$M|@&C7$i?qHX zSZ*RWm7B@U9HKFIZqy<<3r_(VP zj6TO$&Eqs*CPzAcxjbGD&wTd3f$-dC4$pq(@cd^E&w%Fe9B2;Dg68lXXb#VUT1$8? zv}57f&>Wr*&EXl*9G(-+;aSlfo)^vGnb91c8_nU_(L7gcoF^CPYnd-EkQd6~c~Wax zq>l;Dmv&#*={Aey>*X7CyBp=3(R`nq3{UzK;rugN>**X3PUYk5P*!gILY_gk8G z>vOyR{lr+ zSN<DfaJ9{}|spq(mh&my}D%rDfkc zq(o&jpDX*`AtgFrb6MH<4k?lE9a19SJETOucSx~+mHxlARMf{@6!t(VQ6;&uTt%)b zSCgyDHRPIdE%u4_IMvo%N3JW^lk3Y3upXC&I+h_fk{ioSo5n z8@a9APHxZNQ>`USk4p!+qufdMy+caWIsDyDiMq&L_2)U7yJ_~lLrUa(hm^?o4k?lE z9a19SJETN?bo*Sawe;1oesX`^x9=TNqJf%y?~oD=)|{uWYlu8lzF7A&Odc+ekVneC zcSwmYVb)qk>%M*OkP?m2?0bilXq@KDWZyfaM80=OiG1&n5?!G`pCC_^C&`oLDe{%_ zRIIgJrDN0N>GBMDrv5JG%d_O!`ueVx=g8N{bLDw*f$nd<9=`>0_!qX;67~=F_dfhf z+w6OX6x%!SZ;zBH{CnFR{>5#+LHB*5e3N{$e2aXmyhOfDzFodUUdkG^mOHiHyX3oN z-#es4zIRB8?$z=8xCZF!IUj=WcX zSAI`^U*0EwAn%tyln-F7re zLyGneDYkd;?|(SoV1FLYIGF#@@qgw2f{W_BLs8p1@Nq@$yo0-_9G8p9sd55`wb(6n zthk&mmyk=!rR37`IdU2KT=_ite7UTAfm}{5FIT`?%Y`~tQTDwMI+xk6pg~(L2C*72YXC??@%=Iy+hH+_YOs)#=0-x zI~0w4?@%=Iy+hH+_YOrP-#ZkIGIe|3I~0w4?@%=Iy+hH+_YOrP-#ZkI!rnn^X|IpX zk~_#9^+l{`(JF3*r>%K7pvdA5ADJV(Apo-5Cj3*`Co0<5(x)UiT&k$kOuoxE7SUcN!T zQNBsOS-wTSRbC?BCf_dKfwh*UI(DagmwdOpOuk3HSH4ePF5fS&kROm&$`8t`^XU}{JgwHenH+U zzbJ2$Uy`@WFUzmUugW{**W{g8Yk6JAcFAwZZ_01UyXCj#J@Py9Uin@5J^6ikpZtNm zU;YqlEeCY$Bl%t|nKPYsfX_T5@fInxvAVtZZ5ZwGv$_YE4j7Y zMsAC>mUcSUUiR}2@yO3R#3MiN5Rd%4Lp<{H4skp0;NROWvY&T|M>(4PyhA+l^A2&H zcZln}LtN(_;(p#iYw>dr@hF^ousO;w* z;?Xe8e%>J-jnF(2Yb~R6ES!6=wT#w$sXRs=E02>elOy?ZdA$CPUm;J>@rm*zd9pkO zYb{sm*i`u{d73<3o*~ba^W|BxpLdAcH4A^-=E#2DA#T?!{P;Y%K%S4amIXStP%e}g z$=Ax)$&2OdWk2r_kNmttJo57n@yO3R#G_mE_}r@7FVXCKhj1QF=N+_`uz#@6?R$r~U$?N?_YQHLcZln}LtN(_;yUjT*LjDy&O5|) z-XX5@4)MtM4so4#i0iyVJo3Fm++Jt!|DFTF{=q)C?;YZi?;YZi?;YZi?;YZH&B7mB z-#f%3-#f%3-#f%3-#f%3-#f%3-#f%3-#f%3-#f%3-#f%3-#f&kuy@eo67~ zBi}p3?V5#uZr?k^?V5$pzITY*H4C48?+}lC?+~|Z7Jl6K4)MtM4)MtM4)MtM4sm1QF=N+_`uz#?%_}(Gz*DY-Jy+d5*9pXCg5RZKC5Z8H!xXwGo zBi}p3Bi}m|)83(&_726gcPOU4Low|girMQO>}v{Zu~*22udkTDLT;)3iRR+6?;VQS zH47exVv+A1ibbU~mzK|w%gE=-=gH^GW#tRxa#(9AuVWSD3+0OPMRFy%vRp;3Dp!-M z%QfVhaxJ;GTt}{pwU&B1R$p!)Hm%pNedT^~e|dmBP#z=?mh+&x74f##^EqS;6w!BAvN8T&HE59ed zFYl8-z*@_G9s5u|Ab%u(EPoRAtHtzshhloYLowSsu%|8-eI_54KbOCdzm$*2U&%+Y z*7CKE9h1M2zm>m}kIN_I@8uullkzF~NBJlDwEVODi~K9rTF&U$Z}RW*|Kva9KjpvV zzvZ*?Kk~owf5EAGy+f*A?~tn3N~Y@d4ym?xNUkN-_76P9skV1;`+0{{+dKGN-2N;* z+@eJIZl!A1kg8ons-1DL@3`IS9J!2qu6&++zFbzmKrV;FBa>=p9sIs3$QQ~L<%{G> za%H)STve_nSC?zZHRW1zZMlwI7i%r`bgaJIKyD~!$c^O2aud0!+)QpRw~#aCmU1h( zwcG}4Ep2tIo!nl|k~_#9D`nvJ^6v+^cA7SG9>^)b)OTjUqyt@^kZHE+}W zl4gIUWU8HY@UQX}`BnY-4y?7jreiyGo7Xk(lHbtrH#NVd*-JYlrrKEt z|D1c}cjfow_jUVy@(2D1Yc>0I^h5c8{E_^z?0bh)?Hy9JcSzOVAys>aR6FnBtMk1> zs$MIZYUdsNxbGcO?Yx7}|8MV*8u{KKHS)bfs$MUd>aUlyRr}r{)y_Nk$NJtO)y_Nk z?0bjQ$oCGZcHY5{``#hd&O7+*dxumz@8GlV9a8PQgFTXZTzv14s@FWE>byg$&O4;) zyhEzaJEZEoL#oa@r0Tpws?Iy4>byg$&O0P*@4$C0p}j*wdxwP1J0$$PLs(0~&pp^} zQ^ViZgsxd6w0B78wUPXT9}jedJsn@2k0= z++QA`Klj&4CZa()?yr?hM0uKr=x207uXsr46%Pr!YT;i+*h6SFVIN^%sqY~Yk?$cA z_KHcrt?wZck?$cA_G(E#?t6%Y&O9V^<{=UJ9wK3{mh{{C9wK3{mh{>85DC50BH{0} z&|1Pi!q(z@h=ks4k68>%r`*YtzB=k;;gx+b9&^s*>dZ$G~@3cthofZkb(;}gF zS|s#Ni-cXZ@U?|Kgw_)F5%#%!50Qv`50Qv`50Qv`50TKTB@=qJWJ0f&Oz72;3B6h} zVXv0-&*6KBgk81p+4m3$UA0I=zK2LeVGp6Tgnfjq#rF`2$oCKlUA0K)szpLqEfTtF zk=;(`7!x%d7b=( z{G_~I-XK3EKaI7PXLM|%{H*NzhlH+LBy`mxp{o`NUA0K)szpLqEfTtFk1ewMh6?3$0~`KKE<#PWg3tm;8qOru>$?TYg*KBflf>mEV=$li!#3VXfr@ z9osK|C?AkNl0TL|kq^qB%7^6722ett;1)>&p$~hH{47NNy}Qk(BxlQ=VkCaErm&l{#OXV^0Sb3a$nHAkUW<$P48{d69gre4V^lzFxjTzEQqOzFEFS zz7=aNOLXiu`F8mZd8vG-e3yK;yiC4FzE{3aUM}A+uaF;*S7NQ@K^gjqfqTFX~Dc2xdaJ|=%7e=C0{AD2(a-^)M9C*@P} zkMd9QY58ZYwfv%EzshIi-{jxr|H*&If69N!f6Hg(f8>AV|ALEa?@(NOhvL3>2x}>> zvk%3!cPOsCLvigLifivsTziM&+B+22-l4em4#l;1D6YLjaqS(7Ywu88dxzrMI~2E9 zOWNbHw79)mGWoa^w^vO1u?ysKa(TIee4$)XzDTYlSC*^DRpn}Ob-9LIQ?7;exYX9M zI&xjPo?KsUAUBjV-fA@Wf9Vyv|c)3M?5 z2zjJDO1?xMEng~+k;ls8B5cgRcSJLS9NyX9r_J@UQsee!boetCub0M=So>ez$wD)}LKwfwNWMt($ID?chf zCOcmpd7J!_yj^}7Yb~$n z*sJmm`89c`{JOkLenWm!eoNjhzb)^P-;wvq@5=9Ct>t|k+b4e@@0UN656B8~I!LJNdYLLjGR{l_A~s z4sL(NL%Qu9d``&ziidPvwMe(Uga5f-wMf@hi*#MJNY^_p()CV@biLCeUGKC=_jg)o zEq>)9UGKI?*Sjs!^=^xF{g#Jx{g#Jxz0)FH@3ctQJ1x@fU7Eh8%5oLCs$5O3F4vH2 zVy&f?j@6dy$bQu#-QKC`pTnGm#7pPR@{Wxr~XZtv3c zKliH^>Gm#7o3$3da*=ND)b!hgD;M^?@~al<_D)Sd?pH0+Bfn~q9{E*^biLCeUGKC= z*E=oJ^-ha)z0)Gye#3*`k6*P&*E=oJ?W#rc?{2!i+rrvDcMrLz+)M5)_mOkuzH&dg zzdS%5C=Zec%X#t;c_`N7aqdWn=8+g3*`Co0(qfaC@+$) zm9LW*%h$^{$T!M2$v0!IgRbC?BCf_dKAupBhl<$)7mY2!*$oI+&x74f##^EqS;6w!BAvN8T&H zi?x>bbnJb3pZtNmU;a=&Ab%u(EPo;&ls}aZ$)CxG<}UBG`B(Xj{G0r{{6F~*`A_*T`EU8G{Ez&v z{9kYh-#di0l+d|{61r|tLgyVy=)6M-op&gq^A06+-l2rfJCx9QhY~vPP(tS&O6a^p z37vN+q4N$Ubl#za&O4Ow^A1|ed0OB3a#{HTxtv^Ht{`71SClW3E6J7RDsol1np|D3 zfwh*JI#x@rE!UCj%Jt;>as#=coFO-o8_P}PrgAg6x!eM4EtxvjQf?);mfOf}<#uv= zIZN&!ca%HH*>Y#Oi`-St!CFf<9qTUlkbBC#q zRu9;JSK5CcwEwPJS#(5E^FxDU^;VaN#pb3qYt^`Eo;}~Nqg2Q_mIpi+ zSRVH*v^?v1y=9rw;kGwgR`9&lvYO{@mQ6j^Shn#zYPrNS7PrrKPPm7Lm1D8x`60(y z=FbW_nWLUNEYHpkN6S^Ul@^4oVmZdMyJewgKg(+KPueGn4YSOiA8tFsGV&Z{ImL6d zWxnSE%L32mEn^G9hrMBW(DQ(0g@xhhVas8jr!Dh6f3w`}`Jd&%g;VS+jMc4fUq!q~ zEDYlt7KtruRLqAviloG1#nOCu*oMMX4c!OX>U)-s)h`!5YDHtapLV*7Gd4^~4j(tM zKgrUcq&AJk%4Tawv!POQXkf$Q2UOqg4t>+bqCWiqwRIs6bYIxM{ zvxhL=S&!Ok8}hqosMf4#ES_D;m)XLG-8mWt+mPL@lz(YOX7CL@Csx07xWB*o{v_`r z)+`n~(^cP}SabUx_0XOFXG3-$4Z~X4mz%3$+QK5S<@2@jRW|IhA>8$uCPnT0qcxnh z;Xrcu&xSKLgh!}IQ(KU&I}9~#sfEdP549oB)*bF`f(=V;s9)?*u^uxnzkKqcqCLk> zJ(Sw>@^LdRzxq&G&xtd}UNLs+*h6W3#^#TmY<1!(Tjq&8!^D_blG1I`8Kf%8FGZ~-U>%7Y5vLQoN01S)~bpbDr8s)6dD2B-;Y zf!d%Bs0-?W`k(=52r@t;&=}Z58=J^OI?*1m*u>_b1;_*~K`YQ2v;l2FJJ23vfexS} z=mfGsXV3+71v#J_=ni^-o}d@#4f=pw&=>Rr{lNe*5b)z>;$V;mhJc~qVlWI02P42p zFbZ4(MuSVi7%&!$1DAmaTn@&AE5HOW5ljM;0so7gcqNz$t^(KD52%TY!S&z%7Y5vLQoM@0@VyBa`@k64Qdc&KUVFpJg5!ofV!X_s1F)|h9Cnp z0*yfv&=fQS%|Q#030i_ypfzX%+JbhVJ;(wbKu6FCWE)O&WoexmyMV4B2Xq77K@ZRq z^a8y>ACL?Bf_|Vs7yt%>L0~Y*14F=2a4{GLhJz7cBp3xQ0i(gCU@Eu@Oas%w3@{VS z0<*!@U=Fwj%mwp60hkXKfQ6tCECSbp>%d}gJ-7kf2yOy5gImC@UIo`Bv=nNfTzII z;2E$HJPS5~=fGz0JlFzW09(O}U>kS|YzHrcSHP=a2Y3za1h0c#;0^F5cnj$N-H%W6%UN14Az&!D7z_i$!3Z!Ci~^T{(cn@r28;#c zz-7R;&-UyG#)B)s1Ylcfd-em9fo(wT*$+$wSAl6@I+y`wf_yLw%m!D3Ip7*F7t8|% zz;=N40|hJukAcU*I`9N|608Rsz*FF9@C?`p_JDW5Uhpn>54;cdfe*lb@F6$=J^~+u zPryO&DL4c^1Bb!q;0y32I0C)`N5R+N82AQ!3%&!#!3pp^_yL>*r@)WkCvY1441NK> zg1^8&pj?`vJg5LJ1Q&rypfaces)A~uI;a6^g4&=Cs0-?Y2B0Cx0F6L4=nT4mt{?|= z1KmLn&=d3my+I$43;Ke7pg$M@27*CgFvtT#z))~87zT!e5nv=31IB^NKm;xaSAYp% zBA5iGf$3ldmo|O!82eZcou8| z&wuYgy<4)7Y-30?=gz#HIA@D|t&_JDW5Uhpn>54;cd zfe*lb@F6$=J^~+uPryO&DL4c^1Bb!q;0y32I0C)`UxQ=d8}Kdo4jcz3!1v$>a1xvX zKZ2jYY49`n1^f!mfZxFH;D6u`@F(~S{0+{6f55-sKM*T!C<0PIJCFrBgD#*e$N}9z zchCd$1bx9kFbE6=d0+?_3N8lYz-3?&*bZI;JHhK<7kC#O1z&@IK@t1^g*Y(;$iaUEmGy7T68m1xLZx;4knuI1By(|APNO z5j*=gF$>ta8(Spk0=j}6&=(8=L%}$38Mqeg0PliWNkbfDfsUXP$Ohd(56~0z27N#- z=nIB`pg+uot`wj)Jd2tdyY$Xb-YLXV3+71$H9CJ`orPE(43e9VNGa67mIECqLhyTILG8Mp`B3+@B=gB9Qbuo657R)L4WYVa^v10Dfu z!K2_Y@Hkipo&ZmR^d3Oo&-0UN=yU=w%_YzEJRE#L*P6}$+xftSE`@Fr+f#?Tlv z0Zl=3&;n$FmY@}A4cdZspabX#hJoQ=G`JLu0n@<@Fcaj1Yr*y425=jA5L|M;VKlfD zoLAm(J}3*CgBD;A7z}2BnP4+`9=rgyf)~Ly@DkV#UIuT1x4|Cp4%iFc1@D3P!9MT- z*bhDgpMyjNLpmq{N`g}098e8Z2Q@%VPz%%sbwFKE57Y+@KtqrL8iB^331|wMf##qE z$OJ7xE6^IW0c}A$&>m!g4xl6G1hPSA&;@h_IiMTp4tju|pcm*3`hZ+uXQ}O{0O$_} zfPr8T7!2~j5HJ*642FT>U<4QmMuAJfXmBYQ1IB`J;4%<_%fWbX1(*OPf=OU9m;$Z@ zQ^8eW8ki1dfSDj4%mTB))nE>|9^3$K1UG@3!7bocums!&ZU=XOrQl9*7q}ZN1NVS? z!F^ykxF4(l4}g{6L9hxu1XhEG!5Z)gSPLEnkAcU*I`9N|5>&g;P#x3&bwNGQ9JB@P zKzmTWqM-t~2n+?oz;G}Ej0B^=C15ld1IB^N!FX^5m;fe%NnkRV0%n4IFbm8ESA#j= z8ZZ~k0|j6q*a)5lo4|8mGk6|s0WW~9;6<oR26lqi!7lIycoVz@ zc7wOU9`Fv>3*H6qf!IZcA|M461(~1~XbswcwxAuz0$splFa=x*rh==$G%y{^05d@$ zSOnI9N5ER}C|C!c0PDd9@D%tK90w=BDex0G4Soh0l?;tQW6%UN1;$iaUEmGyCU^_%25*Bs;2p3RybIm~?}L5d1F#=_2o8Xcz{lVda1eY74uQ|WVemQl z0(=RMfUm$&@HIFFz5(BY@4#_z0(=jC04KpI@FVyMoCZIGU%;>64EPQF4*m!J0DpqN zz~A63_y_z8{sSed8A^fD;2h8ZGz1x-5oip?fU#g4xC}&K5||98fGfdNa241GJ^=f{ zhu{GC2z(4a0SCdS;1Ku>90s3*FTj`J2>1#d1z&?>;2ZEQ_zoNgC&2gM2XGRc0zZPE z!0AvK6!;k|Y-BhBz5++V*WeiV27C*?1INJ$@ICkeoCK%9kKiY88vG1?0l$JX;5YC) z_#gNK{0aU7e}l8&AMh{u4{+6cVndJt8iD)43UJk9hG}3rm;v&^EHE2f4d#Grz+5m7 z6oC0)6?h1o20w$8b%s<>0@Ma|KnBPLok17S736?!pgZURdV*e{H|PU$L0`}h^algL zKrjdl261!@zJb0*nNsz$IWbxD<>5W5GCZ8Hm8;U_7`2OaK$XBrq9F0at>l z;3_Z;Ob0UzCvsy}yBOa9N5EI$DEJy21K)se!FS*|I03!~KY)|q6!;PR1WtpW!GEC6 z6Nb8=9;go*fQBFgGy*+9PtXhW27N#-=nMLR{$KzY2nxX>a4mQaYymHTt>8tl9lQ*_ z0rj6WGyn}j251BtgJz&PXbD<@t{@i_fQ?`icn)j^FMzG!74Rx}4V(n0!0+Ij^@ii% z6sYpIA@;AK2uJ}%K^znVsUQK;Kyi=`N`R7}6etbO0o6ctPy^HiwLoo92h;`iKz+~v zGz1x-5oipWfd9as{~7)Qe}jLD6tTZPDTdia4OfFX;2JO&6iGLvfTExnNChQ9DNq`m z1KNPLpdIK0c7WHwPVhR|1>OK}fw#dP@Gf`{ybtz)55Ru#Avgd&0w04%k4+MsO3j8QcPH1xvtf z;C65aSPJe0Pk<-EdawaJ1)c`6QidWR1r!BwPz(DWQbGteBg0GXgAXa!n>HlQtN2ik)y&;fJ=oj^9|47z}>AO~~@ zJwQ*;3-ktkKrZMD`hosn02l}cfx#dTOas%w3@{VqgIQoUxEjm>*MPZT9w-3w!2+-l z6oN(IT5ug$46X+o!6xt=*bJTrTfkQEBG?9A0^7mM;1%#Hcn$0XuY+CSZLkNt1B#R} zv;l2FJJ23vfexS}=mfGsXV3+71v#J_=nkfVnIIo51chJ`cn)j^&x0-CMX(L*1hI1s zML-Iu3+jRTpaEzI8iB^331|wMf##qE$OJP%Ay@>qfEU14@FLg-UIN>}%itC8HrNB+ z0eivwpvifLrl1+f1g$`8&=GV7UxKf}G4Kue7JLVegA?F;5If&c1hfZPARCMaSAYp% zBA5gwgDGGdm=0!unIIp$1h#{h!7JcZumijY_JRH2D{vIFDQjp8+JW{U3v>V-K_}1! zbOkw}I~Wa~1DnC~U<-HwYz5oEt6&G%30?=AE-*X?HiPHEcJMNI73=_q!RMewIYTCB z30i^HpbcmX+JO$B6UYYZ!Bb!(cou8|&w)BrU>El?ZO1@%CE&;T?9 zO)40gf@YvOXaO=oOVA3m25mt*(EdV07U&4Nf&<_q@GT3v>V-K@Ttx3<85e9vA|Kg5h8U7zu6xw}K_$HgG$* z11tr1g1f-oU>Udv+zXb2`$5x6hGw8SXaO=oOVA3m0c}A$&>m!g4xkgb3)~HsfqTHc z;6AV%+z(cO2f#}3AXo(+0;|EpU=4T#tObvP$H3#@Nw6Ml08fFZ!82eZ*aV&f&x0+X zS!F|W&;n$FmY@}A2eLp1&WkPG^P zexN@X00x3VU@*u7LqL_WhN_?%s19m?nxGb_4eEfppdP3X8iB^32{=8;@H6-Y{0h#1 zrjrfLKy%OnWP+BU73hDJ;SR7A+zIXi$H0Tz4XeOv@Gw{d9s#lU4Mji-C<@}B7)S*P zkOqo_bWj461f@V}a1JN~&IRXz^Fdi~0VoH`g9_k6P!U`NDuK$N3aARIf$E?Js0nI; z+Mo`o3+jRTpaEzIGC(8H6f^_PK?{%xT7p)fHE09cf_9)i$O0WeN6-mmgU+A}=n8T` zH_#ni@qu9im`>QlKsu{1Hm9L803K= zU?{j43`1Skngfzsd{PzIa}&I9Lzvfu(x4wMHKz=fb9xCm4Nl|dCy6;uP& zK@Ct7)B?3Z9Z(n41NA`z&=6#RMxZfh0-AzmpgCv(GC@nw3bY1oKwHobvxk4Xam}UcA!1T0v$j{&i#uJwY$f8}tFWpfBhL`hx*rAQ%J&gFG+<3bHO}N0Oo@Q zU?C_3i@>$uI<1r$ z1K=a@G57==1fPOK;4^R-d=9<xLOoqCMrc$T%y^|aGou{=*ZClwpzS}FZU)80`WtKiwovYMy8n>d!?+0Qc5bAV-* z=OD`*&pgXq&!Luip2I9hd5*A*JV#kh@f>ZL?>WY@z;m4CV$aBOiRXCBWu6l(S9;o+ zh}c@sDV7^Nr&@0IoMyS*bB5(E&wR_hp0h0vc+Rmr?8$q-k9*FyJngyA@(<5Nma)|E zNG`T4>3M@?ST4KjMcUhkCw9^E!Hi_`H*}u(W*`6O-_VoP7 za)9S2mcu+hwH)L5ndJn}FD$2d9G{3oTF;Y~8$5rs z-0bau8Lza=} zVaq9=Us&dQ9G{3oTF;Y~8$5rs-0XSUa=Ygl%e|g| zS|0KI$MU4-7<-1@Q6@Y(<181S8#1z7;yK=Ondbz{m7bF<*Lw1+9yWMRwcPAE&2qcv z49i`f`IdV^UwDW0n=^F3Ev7I?0)TS&!d)$J&#!~@%+|undfoKm7d>QuJz=XjBN1y(Q>orY0K@N zzgX__JY%`n^LNVwo_|;#_WaB8nCDr`lb-)tp7D&??@&1FnPM3)8y?iSWl7Ie%d(zn zmX$oyEo*s}w9N1K<1{;3EgT(1Ru4JZve5G;%N?F~Sk|f$ZgA9cl;^PG_FbqMjz*S+wL?y`T<*Ep za+l|AmSyXN8{BD`<@tnVuIICs>pY*c-0iu|@}TD%mZv@6wyab)+}Zn<8J-6%M|mEz zEcE=va=GU}mZv@cv;4y|o^IcOdg0DWSeErX*D}kqzGbdwGs|_JEi89?wz53n+0OEa zX9vsEo?R{f@a$z-sebru{VX#)2U+HLUSc`TbGGGj&&8JU2I0eQw=C;&o?bkd+xEU)G*xddzKlVA6RC49dV0n!;~C)| zN?DfmJl8VIv%Y1nXEV!no|%@rJ=<9x@a$%J+OwBsrAGchS!Q?+v&{31EDJoRSuXdS zVY$n5v1MB0a1Xaymi4^TvW@4xmOVWmu#7w(w4CP2?~9w``KaX*&-Iq8J-1nI^?cp( z56`zPD>U&3)v})F2bS5M2Q5c=p0-@>S&APTO~Z$sYuU!LzGY9(c9!cryIG$0>}6S@ znLkjL^*k@O%<~*+ImUCeWxi)*S?D>%*~&8g(XnjfX}^~% z*3+|>WrddE2K_DTc@DE2;2BvKcuuoi?pbJg+;g#Iyj8e|`z*_PZnB)}yJ7J9a_JmA^J@~~$+%VVBhE&uTBX<4R2xZl2( zwLAw|w(-2!GS_pIwX0wk-6#-LhWq@L|tdW_xb2-0k_Q zJo7kuNjQ3?WufPE%dMXI zmb*Q93vg_7xa|SUgPsR1M_n3@eqlMy^Lxue&x-cG$?P%V2G>{?dak#OjSEMAx7^`b z)!sH4i^9c!ca)ajsmd89}RqSK04mU`#jL!)fw=C(IYFXAZ&9ahbx@9fTl9m~sr7bf(%UEW4 zo@bfkS=KVwvz%p~X9deqo)s-4&q|h4JgZpddsee7@T_6E*t3@963;r8%RK8@uJmkR zxz;noa)W1M%gvrmEw_6%x7_8KX}Q<4mE{4?HkOAy+gTp-%(6V`+0pWhXSU^8&n}kn zYr^B3V_DL(yJcC=o|ct7dt27>%(cw$>}Q$jIlwZ@bC6|@XP#xQ=TOT$&taCMJV#hY zo}(tsp64pdX`ZVs3q03YF7{k&xy17^%VnPHELVCy zX}Q*OgXIR#r!6;oZnWI)xyf>u=Vr^jo?9#rcy6^k?77YInCEuOlb)|wp7GpadDe5M zWqe+E_;y*A^nBB@tmkgaN}hWxYkBUq%fGm z$TIRgY&pgA3(I`ZBbEi8M=ck79v__0gXfQyn>|lkZuk7f za+l{B%e|hzTORQI!}74_UzW!_&sv`J{MYh~XIfQzd_DP%)7b^#@vUd6Uo+jta)%$~ zmruv$bFnEFZZ&~h%?~-9TY1j3-0eBba-ZkbmIpnru{`2A&+@qEe9P0Gn=E%M2>1Jf zrG78uo5Ls$ooq zeMY+;$+_a#I2#r>({P0i%aVh=iYT@^IZU=;U2?e6hK&2CWitW4km|d zZHU{I&+thX+fXt&++ai5m6F3PHq=TEOKiwU4!7HonH-kdkd++nvLPoqEVCgu zIoxYQUUFD&!>Hu2!iFe0th8ZDa#&?UesWlCLqT#_W5eR)u-1kp$>A{@mL-REHmpnz zPuj3HIc%_DLvnc9hRw-gqYc}W!zLScC5O#6>`e|^Y&eh{w%TwwIc&4xSaR5I!^!0E ziVbIy!wwtHCWoCi#9Qe5v&)8($>B{K$|i^1HdIOudu*tc9QN9fksRK$Au~Dbvmq-v z?6)B&IUKMdH#vN4Ltb(?Xv3)FaL9%zIUKfON^AFtmL!K$ zHf&4|zu2%fIh?U!Z*r*9$o|)1ufh+1Ve8qjGC4H1VRLerV8f2&aGwolTk2yTx1q3= zhG%S8og7}^W0J$GHXKO~Z`lxQt&e%%hHA;-6C1LV!`2r_fBcXQ{PuHxagqP=e|&(w>>%8>sr@qZ zvN;-d*ihKrZfpOfi_NereSVwUYS~ZD`D4QI5+E6Ju^tPc^a>%tIBRTZ5Au~A)upuis46-37Ipo=pn;eGP zke3{W*)S?OjIbd}4x?ctjW5P%=5(U_;sDaFY#{lEW=F)JhIZ zY{*Csx7(1J9G2RUl^pJ}AtyO3vmrM*+-pN#a#(J|sN}H1hA26#v|&ne_|}Fw$>A3p zc3h+{p;}$L1G{t*zMfh(EJ+S^Y*>~Y>e;X|IW(|gZF0!4VMB6gY{TZ{(A0K4pVK|oE)av@c&hI zCvdx6Re8W~US30(WH1O6@P;{&At>{BFA`*m3`!9LdKnTR5R#aLNx*xth+?BsYAsR( zwA3PXKx+{dr{G58h1XU5>9;F>Y` zRl)vn`a^ub;D%%HYl1Vz;5P(kj=^sU?mY&-D>!EiJ|Z}G41Q1Wq%ruY;AvxUmEim_ z_?Y0LG5DO|qhoL;*WIVa;O>HVoRPlh6@o*zOTh;Z0)p!Bb8wa5=p9n;Ujy!68EIwP=C|-z5cK6r31?`yJQ-iL^u6;|_weQgEK&=oq|M zaAFMJC-~GD{E^_IyQZE`AC!&3X9XV`gX`Ya-w)Y$_?#OH?l=aw5S%jxcM+TzgR=#1 z8H1+^PL2W3_MsEwzhCoLfa{YGUZ=HVOMx>4DKYjatyvw@WwGX%)$2(|4Z7#=iKw#eNq3@*h6rI;KTkW zvWMV?hYkjh^bhUaMR4yic#z;NWAISHr^n!Nf@{X$TLec>NdR9E9NMMepHA6vnx)`} z4;*IKPr>g9PK?1P4}u${%o*2FcEc1rOz?AK@EE~qH%gh83674zn+|%uG-ci|I57sl zEjZ)GDf6bi|DKzq;O&AFH%q}af~S933eNlzXs4&(e8I^v_))>rzC2}qR&eDQ{G#B) zWAMv@tHn=;Fc+P@hikHLckpBRIqf@{X$6@n9I zCFma(9Qw)>eCQy!YYP5caK|yY?+s+`mNHL12=1PO%LOOK;B^NX-iP5Ai9|-P027f5HbPR5GU@d)AD!aen+%fnX!RN-{yAH}8lgeHrIAaXH zPjKcKyh-rjG5B%8%g5la1SiMf^9R9W6WadEK%bj}8wpMygPRH-JO*b8&K-lV61;5; z?k)Jx7(7t$kui9L;Oa4WwBR;hmpRJ9wE5NH>Kb_!O=1Jg@dy5Qs&nWf~Th7PY=q*;MTX0;gcG+jk^i1 z7=s52PL9DN56Zqdl|AUd_x$t}{N+LLtQ1`LR(=7;;Q9jp8tJvrrwjbkq1Oht5cu~o zuMO@i@DEvD8$3Ypu`xJDaP=6RCpdaRDtnvY#IsZIQNi2B;Ex5*eNM{!nc&JXIC5ao zes0PAGV{o3}=nE6tvjr!{;6lM0$Kd+~ZySTx9rU~?_56_F+%b5&;KUewme>8n%Tn1* z5Bt_HPr-u(j~auA3qCgnPZb<}MJoFl!O3q=!5i)Xz&{Z%{8*lIC&A59@V95{d1wmm zd2gAcDR}Zh;2#7SdcN>*UuO&+`L!}Px&F182R=i<-8Gaw;CX^GQgG}bVCxz(&l8*& zgZBtdj=`@Vl-)Iz{k7oe82tS~*%;jK`O5B=%Fa0m?w*441V_ift0B%I5B|BmeF`2bI5`H7ImmoT$~<0h|1tRKXZoYMe#(4aaOehO;9u)I`eiBj zf`7H|=q*z4=lM!Eq088L4;}oYM~7@^{ttWVq09I!4;}a!51n<&@HhFTXBbuw zo#J2Q9OSNd$$V@#yuQfCrhmHj;GY2f@GXYb=K(!&tKs$FAJRH`>jC8&T=mts>a(tM z)u~T-^25%3^f_0Z_VC9)?n#e$%99>5y*>VMXYH@L!Leg6y5O?QFTCX9W5=$#?&Z(A z?7~a0xcsUcJ@1kWFTU{N=N!A@rI%iC`BgW4)+Og(aH*v$jy>z5XIy^y1(*N$q07!X z_~r-y=kw>D{oG4laKYIZoPYMEmtFF_3!Zhw7Fl9!x)j~88V@r%yB=)z~7 zed$ZDc^{A}>Hcr_H{1QSx$l4PPv2d=zxnR3_FumH%l$2Of3d&i?o<0)?f!iK&vyT7f9u_! z?QgUD)BSCCf3p9I-5>7{?>@OdWA};u?RFpE-~QA;+TUUKhxf&)j`-+oderJEkMEzdd)xk-cK>mI-tNctPu=~8{nK`D-GB4$-|xR=_oMq` zyC2y-TRmBzH9$&yI1dDw)@Wg%XhEZzhd_<_TRqyj{Wi7D-RvtpK|Dx zyDxg~Jpak_I-dX6bMJYL=a+bX!Shtl&wF0i^B+A=^ZcCW^$xxA)X#ceU;GcAH}L#> z&l`Gv#`8v=f9Lt7p8v=5#-4xcc@xi1d*0OZZ#-}2`PZIb=J~%pPxrjq^X8s^<@x2F zf9ZJ(&%f}zrRS$SZ{_*tp8w4E_+Os47XO*&Z9MAZ{=Vl|dj6j0U44)L z;dwXlM?CND`QJV7;rY9sXM6sR=RG}t+w-eD|C{Gmd;XT^y*z)@^WL5x_PmehZ+PC< z^VdD^=lN@%_xJpe=L0&km`OTjH-t$|0k013sCjJr6r+dD| z^BJCR_I#%2n>?T8`NN*)d%n^00?&Wv`E1WOcs|GThdiI_`FhU_J^!ue^E`jh^ZB0t z#`7Z2AMkvE=fC#6*z^9s)^JzwbgFFjx6 z`8|h@pZa3Y*Lc3f^SeD?>iJ!s-{$#h&zE_Ar{~K(U*-7<&wt_h?VjJ^dEC?Qy|+^i zz0!C2;_&Xb-@4y_>vjO|_5km80q^z!?{)(3_5$yA1Ml_&?{)<5_5|;C1@HC+?{)_7 z_6F~E2k-U=?{*09_6YBG3Gem^?{*6B_6qNI3-9&|?{*CD_6+ZK4e$01?{*IF_73lM z5C1Lp5ASvm>-G@ub`kIP5$|>q@AeY!b`$UR6Yq8u@Aee$b`|gT74LQy@Aek&b{FsV z7w>i$@Aeq)b{X&X8Si!)@Aew+b{p^Z8}D`;@Ae$;b{+5b9q+dr-akIP+kLFtf2`Yq z{I}SHyxWDW+lRc{iM-p3yxWbu+mF24k-XcJyxWz$+n2oCnY`PZyxX0;+n>DKp}gCp zyxXO`+o!zSsl3~(yxXn3+poOavAo-}yxXpoyxY&b+tIw+)4bc&yxZ5j+u6L^+q~P|yxZTr+u^+1%80TyxZ@*+wr{H^Ss;jyxaG@KWun^&+u;dvu^*hZU^*k5A<#q^ll&YZYT8L zVlVV=H?(d)^lnG=Zcp@XSM+XQ^loSLZg2E%cl2(5^lpdrZjbbCm-KF*^lqp0Zm;xi zxAbnm^lr!WZqM{?*Ys}R^ls<$ZtwJN_w;W6^lk_BZV&Zt7xiu*^=>EiZZGw2H}&6Q zKlN@$wQf)KZddhgU-fQh^=@zVZg=%=fAwyM^=^;#ZkP3LpY?91^=_~AZnyPrzx94> zc(>1M-EQpNe(c?j?7zjH z?A@+x-M;MI&g|XZ?A`9{-Tv&|4(;6@?cFZz-9GKzPVL=Z?cHwe-G1%ej_uu^?cJ{J z-M;PJ&h6da?cMI}-Tv*}4({C^?%gi#-9GN!PVU`a?%i(g-G1)fj_%!_?%l5Lzs0`p z-Og^^-tOJ*?%n?G-45^F9`D^Q@7+G{-A?b_Uhmy*@7;dy{rK=c?D?Wo4kEcP9^}Ns z&MzMJe(|vTi--MRJe&aH;S3NDr+|1k2gJikARf*F@o*Z5hx0%@oCxCKOb`#Jf_OL= z#KXzpzj-(t#KY+zKb#NZ;e-$mXM}h-CB(xyAs$W&@o-j%htonloEPHZ#1Ic>hIlwN z#KXBE9!?JNaCV4?(?dL*AL8Kz5f5jGcsNDG!#N@zP7?8OmWYSbL_C});^9OQ4`+&a zI90^Mxgs7;7V&Vlh=6{hx1K5oN(gdj1v#1oIj7@oD&Zxo&0dt ziI1ee-{HIy4=0}daOR00mh$gOfB(bDCqJBh^26yT9?n1UZ~}^lGf+I7g5u#E6b~n% zcsL8i!)YiU&O`BVB8rDIQ9PWA;^ABr4=1B|I2*;o=_nq~NAYk%iia~&Je-o^;hYo? zC#64+;j9!7r=|RGUW$hkQ#_oR;^EX359g+MI61|`*(n}QPw{YmiiZ_;~vJP3OIpQ?6Z6^Tlib&aI_W-=9l5_pPOq zUtK!;t)slZyA z3#_Hdz*?FOtflF|TAB~6r3t}Wnh~s}DZyHr6Rf34!CIOXtfgteTACNErHR2>ni;I6 zsli&B8?2?t!JlcG9jvA4L0y_3tfdLUTACrOr76N%nj@^GNy1v1C9I`s!djXqtfh&< zTAC@WrK!SNnk%fO$--KiEv%*K!djXytfdLVTADGer76Q&nlr2&o_?;|rfUAO1|!{9!FkAnMW#Vl7P}*3ukeElncU(kx;v zO(WLQJYp?PB-YYQVl7Q2*3w*JElnoY(rjWaO()jUd}1w4DAv-9Vl7Q6*3z6}Eln!c z(yU@FO)J*Yykad)EY{M@Vl7QA*3#T!Eln=g((Ga_O)u8c{9-LlF#b%_3}Y=#G3wGB zV=YZG*3v9vElo4l(mZ1=O*GchOk*ugHP+HxV=YZK*3xWaEloGp(tKkrO*q!ljAJcL zIo8sgW9`WF^Ot5FYiZh1m*yR7Y2vY#W*%#4>amvQ9&2gxv6f~ZYiatimgXO8X#%pA zW*}>63i4-~<{)cn5>l6DA!}(GvXvX*8lYiX*omgXvJX|l4G zW-DuHy0Vt$D{E=OvX*8nYiY`|mgX#L$EKgZG;3K))0Vn4Z&^zdm$fu=SxZxwwKR8G zOOuziG<#V~)0ee0e_2Ztn6)&6SxZxxwKRuWOOu$jG>chF)0jWgG>=(J6Pda+lUYks znYA>RSxb|dwKSVqOVgRPG@n^Z6PmR&qghK+nzb~iSxb|ewKS_)OVgUQG_P4p6PvX( zvsp`1o3%8zSxb|fwKTg~OVgXRG{0F(6P&d)!&ysHoV7H^Sxb|gwKU6FOVgaSG|yQ} z6P-WPG}Bp2Q=Pgr*I7%GowYRESxeKMwKU&ZOB0^8G~-!IQ=YXn=UF>G{rpX{p4DmE zQ#;Lj)~AWj`ZV)dpQb+R)7)o$n*6L!v!C^8`m;XGf7Yi7(E2n3TA!vs>(d-)eVPQV zPqU!)X&SUX&4bpbiO~8q6I!39LVy0#Txflo4AoDwq4jAxv_8#;)~5;4`ZOb2pQc3X z)0}91niQ>1v!eBBTC_gRi`J)!(fTwqTA!vy>(kt5eVQDtPqU--X?nCi&5zcn3DWvB zLt3AvNbA!aX?>a`txvP0^=X>4KFyQXr-{<~G*eoirb_G6TxorpEd9Mqv!(TEx>P^S zm)55V)A}@HT0cDglv|(XOzYF6X?>bCtxwaY^=aO;K24m~r(gXveVR?JPt&QtmuWt=K250Vry14yG^JXf=2Yv`q-uSdRjp6cs`Y7JwLVR()~A`( z`ZTp#pXOHU)8uM>nq93=)2sDqeziVLu-2y;*7`KXTA$`v>(eA_eVS#hPt&aRX`Zz{ zO|;ghnb!I=)moqCTI`jOes|1{@XpC(;6)2wTK zns%*E^RD%2;(lIOeVTr)PxG(!X#%!B&A`^DDcJfn2V0*e zVe8W@Y<-%Btxxl?^=TruKF!3|r>WTbG#6W+CS&Whny#%+ z^R@M9!nQum*w&BDe*UL9+xj$V`+J#YZR^vt4QHCStxprT^=am|K26=$r@7nuG(g{@eVWg$PZPTJX-2m`P3hLBIo(exEeVXU3 zPZPcMX{NV6P4(8Nx!(FT*;}7xd+XD5Z+)8Ytxpra^=Zbpeth=xKb!MqW|O|2*{m-& zoA%{q^S<0{;`etnoB8EtQ@_61+%Gqq{N-k|zuav4mz&N1a@FZTyA8RA zKgi8)5OT9Sgxu^FAve26$jxpNaB&2AKOvpa>{>{cN+yI07~ZWeO0 zyM^5Bb|E*rU&tN)|G!~!vpa^|?3N)nyJyJFZW?m4yN2BCwjnpWZ^+GV9CEWehurMe zAve2s$jxpZ{%&V?54qXxL*MNFAve2$$j$B`a^>ql zyOGGv?j&-vTZ!E4ULrTUnaIuVCUUdeiQMddA~(CC$j$C3a}Df3yW7akZZ~qX`;FX@#qZzj zjw3g_<>;H;bL3_>9l6x!IjZZg%UDo85clW;Y+X+1*EOcKeZ= z-GAg}Hz0qvvpbO7>=vYNb`O%9-Gt<3cOkjiZAfl*ACjBhh~#E>BDvYENN#p7lAGO( zUH@ivco86`4X16K1*?mfG zcB7J;-Kpeew<@{Wy-IF&vyz+Lt>k96E4kVIO77U=_iuK`lAGPK^v&*BanB43RCO5l<$<6Lz zaJ@1$<1zLa~o!snRCpWv< z$<6L|atFK(9l7k5kf!}H&6`NjQGesRN; zU)(X}7q?9L#XVDganqDv+%@GFw@vxQeN%pMXQ+{#tlwaIEdac7lZ z+*;)q_g4AE%~gJJca>kB=we zy7G(LuKeP@E5Eq$$}jG`@{3!q{Nmm#zqt9zFYdnbi`%dK;{GeYxB<&A?!fYkTd@4% z9xT7O3Cl0;!t#sTu>9gaEWfxB%P;Q4@{3!s{Ni3LzqlF8FYdGF%4x}T55 zU0r^0Ti3t1ugfoP?DC5{yZqwTF2A_9%P(&3@{7B>{Nna5zqr54FK+Pii#xph;ubHz zxW~&cZu0VryS)73HZQ-p&&w}v^zw^4z5L=5v0tnT@0RyTb$tGm9M)otI;%j&+bW_9C-v%2%ES>5{8tnU44RyTh&tGmCN z)$L!+>i(~0#Q>;TaR6#oEP$F751?kn1gKeY0cuukfSMH_pk~Dgs9A9WYF4a(niVgg zX2lGsS#bkuR_uV96+fV6#So}jaRh2sEPwiosB`;xN>#SPV5Q9z)HF$xyT6GSsZt3^gl0L(PiOP_yDR)T~$yH7j02 z&5_Oiv*I??tk?}WD}F=Gis4YR;yBc-SPnHSozC_K6F;TPPOw_Dc6E!Q|M9qphQM2Ms)U4POH7ou^&5A+sGq&PT)T~$( zI4d4S&5B7;v*J?Jtk@JaD?UZdicwLs;#AbESQRxZUPaBZ&Hl6ER@AK66*wz?Ma_y~ zQM2M$)T~$*H7lM)&5CJJv*KFRtk@PcE51d|ig8i1;#}0MSQj-b-bKxdc~P_CUev7E z7d0#XMa_zVQM2M;)T~$-KVvH%M$L+efwSUb)U4PTH7hNb3nx((x`Zo@gL z+ptdRHoTL%4fCXK!#%0nuutkX{FAy31Ep@mL8;rYQ0g{3l)4QQrEbGTsoSto>Nb3o zx(y?xZo^5b+pto8PB*-ix(zc0Z^KQg+ptsWHvE*j4MU}F!%?Z*uvF?cJe9f)Q>AXh zRjJ#sRq8f;mAVaMrEbGnsoStt>NdQUx(#!sZo^%v+pt&aHvE;k4TGg_!(pl0uvqFg zJeIl*lcjFMWvSb+S?V@?mbwk2rEbG%sXLO{|2Djqx(&1C=XAqusoStyK6k@!soOAI z>NXsgx(&;vZo_k_+b~_~He8pw4cnz|!*{9MFkb35oR_){>!ohPd#T$nU+Om8m%0u6 zrEbH2soOAM>NXshx(y4aZo`AA+c073He8sx4I8Fz!-uKcFkcc% zW9l~Cn7R!+=I3<7kEz=*Wbif|nYs;2rf$QNsoOAR>NZ@Nx(!>VZo`+U+c0M8Hk_Hd z4Qr-u!<(twFlXvE+?l!!d!}x~pQ+n0XzDf`nz{{(rf$QdsoOAV>NZ@Ox(%DAZo{Xk z+c0YCHk_KeW10PL!>g&=Fl+EO+?u)#yQXf#uc_NGY<^BR9Gkig%LZ@5v#HxKZR$2$ zo4O6#rf$QxsoOAa>NcF4x((~5Zo|8&+c0nHHr$)K4g02U!@sH9FmUQN9Gtoh3#V?w z!>QXaaq2c)oVpDgr*6Z?soOAe>NcF5x(zF*Zo|u|+c0zLHr$-L4Lhf9!_TSPFm&oR z9G$uiOXufw!_%qTFm>=YT%EcNTc>Wr*QwhucIq~qow^Ncr*6aBsoOAj>Neb+x($1$ zZo}WH+c0?QHXNS14U4C4!{e#jFnQ`WT%NiOo2PEW=c(H;dg?Zup1R|i{V&7osmw5Y zFf-hq+6=p=HpB0!%`kjwGaR4V49llB!}F=lFnxY@GhCnA4BH1c!}qDpFn($?oS)hZ z>!&uu`>D+^e`+(_pV|!jr#8d?sm(BeYBL<5+6)V*Hp2s|%`ky#GhCqB3>&C6!w0I( zFoJ3`oS@naE2uWZ3#!d9gK9I}pxO*Os5Zk7s?9KjYBL<6+6+smHp3ID%`k;(GhCtC z3|r`DJ;N8O%`k>=Gn}E?3~Q)1!yBs2Fo$Y0+@abGd#ERywHfwN zZH9kTn_(c;W;jT-85UA)hKE#}VItLLxJb1bHd1Ydk5rpsB-Lg(NwpbPQf-EpRGVQY z)n>R!wHbC&ZHAvzn_(!`W;jZ<8J1FQhNo1UVJg*TxJtDdwo+||uT-01EY)T>OSKu+ z($9K^w^W;9F5zalOSKvHQf-F6RGVQi)n+(MwHX#uZHC8Gn_)85X1GkX88%aGhR;-c zB)k7+I8C(~RugW9*HoKfHq~ahO|=CbU_f(rR*wHY>4ZH5n3n_)!NW;ju`8CFznh8IR-wHdZlZH6yZn_*1VW;j!|8P-&7hBsB4VNTU%xKp(m_SDaM zhCfxCVNl^_I8?P67FBJAM^&3)Qq^X-RJ9p4Rc(e(ReLPE|7JKI99b8mQ`(rXH}bFTGeK_R<#+nRc(fERhwa4)n+(XwHek` zZH9MMn_*tnX1G_i8TM6ehJRI?VPO5NXE<2385S09hKE&~VPe&0xLCCrHdbwhk5!vt zWYuOkS+yBfR&9otRhwaE)n>R^wHbC+ZHAv!n_+0xW;j~48J1RUhNo4VVQST8xLUOt zwpMM1uT`62Y}IBsTeTV1R&9p2RhwaM)n>R`wHfwSZHB*9n_+O(W;k5685Y;idWOeU zn_+U{X1H9n88%mKhR;=dJiGs9IbGFRRu^`b*HxcocGYLOUG-UZSACY>Ri9;e)n_?g z^;wozeU|4{pJjU0XSrVWS+-YwmhV-cWqj3VIbZcz)>nO&_f?-|e${8WU-en`SACZM zRi9;m)n_?i^;s5JeU=ASpJjsmj%2xD^;tF;ewGhbpJjyAXE|Z@SyotmmKRo^Wro#f zxncELc36FuA6B1bh}CB~V)a>;Sbdf!R-a{x)n~b4^;x!9eU>j)pJj~IXE|f_S=Ly6 zmN!$EKUSY*kkw~7Wc67VS$&pAR-a{()n~b6^@nr2x!;#8pR7L1 zD8tWk%IdSMvidBqtUk*utIu-F>a*;!`YgY!KFctx&vMM_vn;dvEYGYy%QUOca?R?q zY_s|-->g2%IIGWc&g!$Qv-&LWtUk*;tIu-J>a*;#`YivfKFdI>&vMY}vn;gwEDxa#4h`YcbaKFd_A&vMo3vuw5cEMKiY%UG+=a@OjzthM?qZ>>JdT&vG=*XpzEwfZc7 ztv<_OtIu-S>a#4i`YeyFKFegQ&vM!7kL36NU6#*QpJlY+XE|;4SytQcOP1GGpJle; zXSr?lS$11}mfu#NWw_O6Id1h?mRo(6=T@I(y47d7ZuMEVTYZ-AR-a|O)n_?x^;yOn2UnkE!qsQFaP?U>Tz!@gSD$6X z)n_?z^;uS2eU=wjpJm4VzGS&^^;vctewH6spJm9^XE}29S(aRVmM2%AWy;lOxpMVc zwp@LdFIS&s%++T(bM;x)Tz!@|SD$6h)n~bL^;z~@eU?90pJmY1XE}8BSr%P=mPc2g zWzyAWxpei%3j6<$96Fx+e|bh7ewI^*pJmn6zd47lKFh4D&vNVPv+TOxmn^@oKFhGf z&vNYQvn;#%EYGe!%e1S{a_#D~Y`gj_->yE(xU0`{?&`CwyZS8eu0G4WtIu-p>a*;- z`YivhKFh$X&vNkUvn;&&EDx_f%fzeCa`Ec3Y`pp`AFn>k$g9tC^6Im!y!tFJuRhDn ztIu-t>a*;;`Yb=MKFiSieaUk4>a#38{47teKFidr&vNzZvuwTkEMKoa%h;>Wa`x)8 ztiAdyZ?8Vf+^f%W_v*9kz4|PFuRhD*tIu-y>a#4q`YeyHKFj2*&vN6u5mo1$JLgf#26tVEFYEIDS0^mf!DDf#=s#VETPd zf$P^(VEgqH_D`1?VZL0eT90fS!UPpr@b-=qacIdJ4LLo`N!oQs8&4pcUvTs0BW!pcm*VC)RJq10%=M)qLJs&TAPC-@B zQ_vNBPC;4FQ_vRl6x0Ph1${wJL1EBS&=~X-R0cf-ok34QY0y*98uS#@2ETI!y+Kbw zaqu|>%|TB=bHhVLAlUV&@S{8)C)ZY{X$Pc!O&CC zF!U5u3_S%ML(h@o`Saf5xlm9ud`>~n@HquVL(hAPpHomZ^b~XrpHoma^c1uWJq2|` zPeI?%Q&2ec6f_P!1(icjLFdp@P&)J!v<^K5wL?!q@6c0FJoFSa4?P9d!|z-{_s~;N zK739=`_NNRKlBvz4?P71L{C8j(Nj=C^b~XuJq0C1PeBXOQ&29K{L@)P)+m{bQ3)V<;3q?K|9e?P)~eLK|j$`P*C&~G!#7r6-7@$N6~Yvc>WZ$ z6g^Kb_7wCKJq1O@cPnTrdJ3wFo`SBTr=YCpDQGKt3hIiUg1(}sps?sEXe@dPDvO?i z&Z4KFwCE{lEqV%Si=KksqNkv^=qYF}dJ3wGo`UY8r=Yy(DQGWx3hImBxq|+pr=Y<2 zoPq|Ur=Y^xuapw{Rq=rwu@ijAIvW}~N|+UP0hHhK!m zjh=#bqo<(W=qczodI}1T-?@T@qo<(a_?&`{qvv?>EGcR^x{7L!&noIU`ihEipq|@qPC;2sP5=1>O1<13Xi^`#-p#O^5`q-Jo<`CkG`VTqpzs;=qu_y z`ihE=zM|%%uc-RyE9yS_ipr0^qV}V&sQ&0H>OcC53Xr~{2Bfd30{ML{>OlI6N|4Vh zYC-ynYLLF79;C0R2=Cw)Z)N?%cf(pOZW^c8g|eMKcoUr~$FS5%|?-WK&JeMLpe z=M^<6eMMDDUs0FRS5&6-6}2gSMRiJFQJ>ORRH*b7H7b2Yl}cYxr_xtcs`M4LDt$$@ zN?%d0(pOZh^c6KLeMQwuUs1QxS5&U_6}2mUMfFNwQNPkxRIv0FH7tEcD(7EO$I@3+ zvV2}q%hFd=v-B19EPX{q%kOPb)6!Q|wR~Pt*V0#1w)7RXEqz6GOJ7mn(pOZt^c6KO zeMOZ^Us31MS5&(66}2vXMYT&`QSZ`MRJ`;RH7|Wd)k|Md_tIBXzVsEfFMUPzOJ7m{ z(pOZ#^c6KQeMJ>aUr`6sS5(6E6}2#ZMKw%cQ4iBsRK)ZZH8FEmQ5ExhThzsTUQrqI zc|~nZUr`;?SJcP!6%{glMU6~fQ6Z)Y0@6l{BAM)Y9}7)iixYJxyOx zQPWq{)btfqHGM^0Ohu-WI(6(^u5&^c7V*eMQ|)Us1W!SJdwG71cX^ zMg2}+QNhz!)bR8jubh7s9ZzRP$@7^NEl+Pn&C^@a^Ym5}J-ro8Pj5xl(_7K?^j4HT zy%lXwZ$;hHThaIQRun$J(-nHny9y;C+e*zih3)WqTY(CsJEgk>a8e?dMnzZ-io@Yx1ulVttgCo zD;lHTipr?BqBH8PD2;yiD_W!8irVOND|(~eisGoZqB-iVsE&Fox})BT@~F3>J?gEf zk9sTmquz=Fskfp*>aD1ddMi4l-ii{bx1vSrt*DWDD|)2fiXy4EqDktlsFHdsx}@HU zGO4$sP3oaD1hdMi4m-ilJGx1v?*t*DiL_bYm(-il)Bb1Ryq z-im6ex1w9>ttgjzE83;rih8NHqF?GgQayhw8m8Wgis^GJI;P%=lBu_%W$LY{nR+XF zrrwI8skfqO>aD1ndMmo7-iorRx1w$8t*D!NEBdD1io&V4qH*f2sGNE$I;Y->(y6zi zb?U9Coq8*Jr{0R<>36@PdFrjGo<6std+MzypL#3Wr{0SCskfqk>a8fCdMg^J-iivU zx1xjUttg>-D_W@DiW;i7qKE3OD582RnyB82Dyp}li|VZ?qk1dasNRY?s<)z#>a8fG zdMg?!^|+#v>aFOcKDVNj>aA#{dMj$F-iltTx1yNpt!SotE2^pA{fcg?x1yZ-+=_Op zx1yfvt>~wEk5$j#iiWDUqN4iTijJzcqNM7rXsLQDYO3Cfo~pN^sOqg~s(LG`s@{sO zs<)!7>aA$2dMoOx-ip4ex1zA>t!S)zD=Mqriq5LHqO|I*XsvoHYOCIg-m15vxazHF zu6iq~tKN$4s<)!N`rWT+uX-!$tIw_IuX-yAtlo+StGA-U>aFOodMiq--ij8hx1z@C zt?03OD~hb%iYBYKqRQ&6=(2h%%BaFOsdMiq; z-ilVMx1!eSt?0FSD~he&ie{^~qT1@M=(c(*%B|jtcB{9d-um6I=(l>0SI^(7hO4`( z;`-iI9an!<$<<%ga`ji$T>Vu&SASK})nCD6D=di7V;Uj0?QSASLU)nC1#aMq; zGuB^KjrCV`WBpa-SbtSJ)_=Hmdh4(1$NH-Zvi_=utiP%v+dry0vi_=)?DMNyvi_=? ztiP%!>#r)x`m36<{;I01zp5+iuPV#>tJ<>us=BPdsxRxWD$M$;8ngbY%B;VtGwZJ^ z&HAfav;L~utiP%^>#r)#`m36={;KM%zp6XyuPV>_tJ<^vs`{+Isz2+mD$x3?8nphZ z3a!7YL+h_9(e{t37OlUkM*IA#9<9HsNb9d^()z2awEn6tt-q>F>#u6l`m5@+{;EE$ zzp7B{uWHo#t17krs!pxHs#NQ*YSsFyYPJ5VUah~XSnIE9*7~cewf?GZt-q>V>#u6p z`j0fu|Ehkizp7yS{Hlhnzp7&Euj<(Pt4g;1s+O(4s%G0is(QBms-o@ltD3g{s;aHO zs%z`7D%<+2+P40xx~;#eZ|kor-1@5;xBjZit-q>s>#r)^`m0*E{;Jxozp8iZuPWa9 ztD3j|s_L!3s(b6ND&P96+PD6y`mMjJf9tO*;QFf?xc;gNuD_~->#r)|`m0*F{;C?T zzp97puPWm9kE$lFzp9G+{HiXlzp9MuuWIA^tLnJ^sy?p2s*vliYUKK>D!KluPOiVI zl#u6&`m3tB{;F=Szp9+;uWIM|k2TK!s(!A&s-XM)s)nw= zs-o+!>gf8bO1l24maf05rt7cj>H4dRy8f!BuD`0P+drzhy8f!N?(?hKy8f!VuD`0U z>#r*8`l}kd{;JBZzpAtAuPW{Ot6IDMs@kraM@4yX&ti@A|9S zyZ);BuD`0k>#r*C`l}ke{;CSEzpBIQuPX8St6IGNsv57qs>kcED)RcPn!Nt1DzCq) z%j>Ty^Y)LbHm|>`&inkTKCi#3(Ce>i^!lqRz5c3BufM9)>#u6{`m1Wa{;FQDzpB{l zuWI)CtE#>Js&22ps@&_ZYWMn&H_rcteh;Cc;QI~@4If5B#fQ<*@nJNSd>9QaA4WsX zhtbgUVKfwd7!6GyMnlzy(a`l_G?aZ94Q(GrL*2K(H1vHK4TazLXlVQ}8Y(}GhRzS8 zq4dLOX#Fr6YCnvI-VdXp_`_&u{xBMX|JOVHpE&<=8;S+$-a0cn4rK+ygKg{s9;b2LX(RhX6*yMF6AWBY@Fx62NG931Bqb1TY$Y0vHWP0gQ&H z07k=A0Hfh6fYERkz-V|2U^LtXFdF^>7!8L3jE2VmM#E)b4{G=fU^JWtzDL7r0HfhH zfYI<9z-TxQU^F}jFdD7{7!BV6jE3_7M#Fmmqv1Y)(eNL@XgCmHG&~3}8ZHDF4IcuG zh7$os!;1i;;YNVb@FT!zI1*qqJP9xwt^^njUjmGVGXX}!n*gKXPJq$yC%|Yp6ks$w z3NRWj1sDyV0*r=J!5-A`D!^#C6?~6|UjatLu>hmtS%A@SEx>5_7GNA{&L0i$0*r=x z!S`tR7hp6T3@{oV1{e(&1B`}`0Y<~g0Hfh$fYER>z-agxU^E;JFdCi)7!6kgjE1iP zM#I?vqv36U(Qr4wX!sjoG#m~v8XgB24VMFqhR*>;!|4E{;dOw~a68z88h!^D4abA; z(eOOLXt*9=G<***8qNn84etYthWi0V!~X!I;edeA@Ib(5xFBFOd=M}iP6!wcF9eK+ z8v;hd4*{d$h=9@XM8IgcB49Lp5ilCg2pA1-1dN6|0!G6h0i)rNfYIA)kFdFU&-=pE5fYESJ zz-V|VU^HA5Fd9Az7!4-{jE0v2M#D`3qv5B3(Qs72Xm~1MG+Y%h8omk`4QB<6hPMJn z!(9QR;je(va9F@-cr0KvToy1IJ_{HPrv;3L*8)bvZ2_a;j7%&=c3>XbR28@Oy z14hG>0i)r{fYI<}z-Tx#U^KiLFdFU*7!7|0jD|x4M#G~4qv6tk(eP=&XgD=sG`t!x z8g3034ZjAAhGPRp!?OXS;o5-F@NK|2-kLv7ZF)DLG~FA%OVhsrr|IB;)AVq_X}UPz zG<_U!nobTlO)m$Wrkev!)6W5?>F9vd^mM>!x;o%AeI0O`&JH+DZwH*Fy8}+s-vOuT z@PO0wc))48Jm55a9&nmY4>(P)2b`wc15VTL0jKHsfYbDRz-hWZ;52<7aGK5!I8E;d zoTmH3EYG=^=sBbdmTzO&xPSbk=r|CX{)AXOf zX*y8gG(9MAnl2RkSks3Br|CrTeVSerI88SSoTeWIPScSBr|C(7({!c4Y5G#&G@U7M zn%)#RO?L{MrauKv)1d;V=~02xbg95;`c&XFohopeUKKb^w+fu5Ujz;*S%GsT zF#j}tD{z|572l`nU4hedufS>gSKu@qEO4407C2283!J8p1y0k+VjpXIS>QC?EWS_E z&jP3EXo1u8w7_Y)THrK&EpVF77C23B3!J9A1y0l70;lP4fz$N3z-hW%;52)Bgge>41UL^uWMr zx?tcmeK2sEP8c{%FASWf8^%7?^uxeuI%0gErY8nY(-i}!>5GBWbjHAGdSl=;-7#>Q z{unq-hYXyiM+Q#QB?G7FlY!H8%D`!QW#Ba3GH{xH88}VH44kHC2F|g-{L}Q!z-c;X ze4nOw22RsG1E=Yqfzx!*z-fAD;51z{aGE|EI87%FoTirsPSZ^Tr|GAG({$9>$C{oR zI89fL@6+_vz-c;b;55B8aGLHKI8A>IoTkGDPSaxpr|GhR)AZTEX*zA-G`%)(nr<67 zO}`DCrsD=q({lr->AHc_^xeQ|I&a`Ky*F^0?i)Bw{|%g`0|!pig9E4O!hzHD;lOD+ zao{w)IB=S795_us4xFYV2Ts$I1E=ZAv5z%2Ts$e1E=ZLfzx#Bz-jt*;4~dOaGIVSIL8C?Pr$bWDd61kodVt+SONDA ztbl(9R=~jnE8yXQ6>#yu3ixjzfA_X8{7{DBql{=f>je_#dtKd=H0AXotp5UhX;2v)!c1S{YKf)(%r!3wy6 zUD~Ut#2 z3V4WM1zbe10zM*G0VffxfR_kXz)b`z;3t9=a1_A`c#2>JTt%<~z9LuwXA!J`w+L3i zT?8xOFM<_t7}*O09wS%*myz!k@EO4hIE`QhyhgABZX;L$zY(l};|Ny3a|A2kI)WAO z9l;7Xk6;D7N3a6!BUl0d5v+g%30A;^1S{Y|f)(%~!3sE$UuxT3iy>^9SO}}0nZYwfNRP33iy^_1)NK;0^TK90rwKDfPV>Az`+D7;9-Ila52FO z_?Tb?oJ_C+UM5%pHxsOYp9xmL(F7~tX@V7SHNgt_nqUQ-O|SyqCRhP?6Rd#030A=2 z1S{Zif)#K%!3y}CU(Q1^iI30*)wH0Z$aHfGY}C zz!wE8;EaM5@J7K3xT9bN{86w14k=gxj})wcOA1!NCj~3ul!6uTO2G=arR;?PzZ9%v zq4_J|nSvE?P5EyO_@-b5oKvs@-YHlC_Y|yve+pK>K?N(|p@J1~QNarMs9*)0RImbG zDp&zG6|8`t3Rb{T1uNjGf)#L8!3y}QUwR> z3izyG1)Nr}0$wXv0k;*bfZqyMz;R_S40x_!1zcCYSHO1#E8x6>74Tlc3b?Oe1^idA z0uC%#0S^|efC~#&z=s7Z;KYIz@M6IVxUpab{8+F8jx1OKPZq3zD+^Y@mjx@}%z_p0 zX2A-$vtR}MS+D{QEm#4M7Oa3v3s%6V1uNjxf)(&;!3wywUg`8dRLf$TTA$J$NkiQFF$l(PqyS-wR&I@dYpB`GOa6eZdR)zTkzNU-r|G_X}Rg{pI_G{9o`w4lsBj4;Z|V z3k+V!2L>6sypV&;_X~N*;Duad@IpQ^cp)blypWd+UdT-bFXShK7jl%r3wg@m zgJ~MbBry0DE*9>0BZ3Zvo zH-i^)oWTou&ftYyXYfM4Gk78A8N8793|`261~244gBNn3*-t|rGc zFXU2#7xJmW3pv%`g}iF;js)kwkY5d6$g$@8g*SIjkaG=Q$h!tFxLS8m_AvYVmke>}+$k7Hb*2ypaD5UdRClFXVxP7jnVD3;E#Sg`9Bq(~uVqUdRpS z`-S{)@IsC_cp*<5ypSsnUdR^*FXW7a7xKoz3%TRqh5T{wLJm22A&(rqkV_6;$R`Ic zI(Q*39lVg6&VCy5)4>Zl>U_VDrw(4oRR=HRtAiJE*1-#T>)?gl zb?`#|I(Q+69lVgo4qnJ*2QTEagBNnz!3%lq;Dy|F@Irn&cp=9fypZP(UdVL^FXX#} z7joXg3wiJ0h1_@WLjF5=AqO73kOvQ5$b|_h1ISdoY9UJ(xlN9?YPF4`$HA2Q%p6gBkSk z!3;Y2UFoSMBm_a`u%%GzWX3*0IGwABG?*@H+FoVuM-!tg#gBf)9!3_HQU4Ep_G1|5GegPuQ_LDwJ5pzjZ6(D?^5=>3Bk zbpOE&`u|`C9e^-{9zd8u7a+`_4-jV12?#Uj1%w%N1HugY0bvFmfiQ!fK$t;SAk3gI z5N6OBXipA$17QZ;fxc(Z9|$w(5QG`@2*M1y1Yrh!f-n!qCPkP*uOQ5zTM%Z@F95@yf|2{Y)0gc)>0!VLN$VFn$MFoT{*m_b)0%%Cq4X3!Z4Gw6+k8FWX&4EiHs z1|5&_xL|=%a)gbW*|$dMRNB-IOqceoB}@MBN=D`5uRl`w<;N|-^1CCs455@yh42{Y)kgc)>N!VG#XVFuln=H#H? z5@yhG>3aq}moS5_OPE35CCs4n5@yhQ2{Y)vgczFoP~km_Z*V%%Bq! zX3&cXGw8;I8T4bq3_3Dl20fWDgRV@NL0=}!pfeL@(3=S}=+1;0^k>2hIy7MhJ(@6s zE=`z0pC-)X(fM;1_G&^6yET2+uwN5y*s*DE4tqA?hFzP!Z`ij9H|*Sm8}@F(4ZAnt zhW(px!wyckVGk$Vu!|FJ*vAPs?Bs+S_Hx1vyE);8{hV;aj!w8?Pbb{4s}pY6*9kZ5 z?1UTkcESz2JK=`?op8erPq<-^C)}{h6K>e&2{-KYgd6sH!VSAU;fDR5aKnyIxM9yH z+_3A@z8>~{!VNn=ec!P66K>f32{-Kjgd28%!VP;s;f7tHaKk=OxM3$K+^`oEZrBY9 zH|z(68+L@k4SPc2hFzg>!@f|sVP`1Zus0NL*c}Qt><@(-c8J0adqm+Lj!vm?!#+{C zVW%kEuvZjr*ewb->=%U_c8tOedq&}gU88WrzEQYg=cs)>>>Y(0c8~hLVgD%Hu!9tC z*h308>>`C5_L0I3J4xY&y`*r%Zc?~mKPlX>qZDq~QwlfiDuo;NmBI}>OW}sSrEtUU zQn+D%DcrEb6mHmK3ODRBg&X#n!VNo3;fB4YaKmm>xM9C3+_2*mZrF1QH|#ov8}^;T z4LeWahP|h7!|qf2df0yoH|#+5eZwA9xM3G6+^`Q7ZrF(mH|#})8+N0@4f|2yh8?MJ z!=6;QVOJ{LurC#E*qI79>`jFmcBjG(`%~eD9jb7{9#yzUI_BT7PZe(1sp|WNy{d4- zZdJHpzbf3YV-;@LvkEutT7?_-t-=jESK)@et8l~aRk&gQD%`Mx)xI9~u)+m%$qF~@WrZ7dv%(GgS>c8qt#HGhR=8nTE8MWJ6>iws3ODR+g&TIa!VUXd;f5Wq zaKj!~xM7zo+_29TZrJGxH|%wV8+N~rvT(yrS>HG8m4zF2%fb!&W#NV$ zvv9+nS-4@>EZnef7H-%%3pebYg&TIy!VUXp;f5WwaKj#2xM3G9+^~-pZrDj{Uk`g} z;fCF`zHiu13pebjg&X$N!VSA>;f8&+aKp}8xM6QC+_1YAZrEQ7H|(&58}``34ZCdN zhJChh!%kbcVXrORu-g`H*l!Cr?6`#+_T0h^yKdozeYbGK&Re))?=9T0`xb84e+xJ4 zz=a$3;KB{NaN&l1xNyTxT)1H`F5Ivi*S;S1Fxp2e&T)1I}F5Iw37w++n`M1NT3%SFo>pORNbzyh7bzyh-bzyfnc42pTc42q8 zc42q;c42oocVTyUcVTz9cVTz zd0}@rdYu6so?h4;u3q1}!`BPD!`TbF!`lnH!`%zJ!`}G3*W}G3*X6G3*XEG3*XM zG3*XUG3*XcG3*XkG3*XsG3*X!v9qDWTMWCyUF>^z_={n8IE-O;c#L6pxQt5t9 zIE`UEzAIF4a=c#dIrxQ=0W_>N(BIFDg>c#mOsxQ}6X_>Wf_DIFVs@c#&auxRGIZ_>p0EIFey^c#>gvxRPOa_>y6FIFn&_c#~mw zxRad?9sXq4N4n<*_g><+Io><+gw><+&&><-5=><-T|><-s5 z><-^D><;HL><;fT><;%b><<4j><$Mr><$kz><$+*><%9@><%Y0><%w8><%|G><&LO z><&jW><&*e><(8m><(Wu><(u$><(`;><)J`><)i3><)*sv!TP|47t4i7c#4i`1-4j(n_4ktD24lgzA4mUOI4nH;Q z4o5ZY4o@}g4p%ko4qr9w4rev&4sSK=4tF)|4u3W54u>`D4v#hL4wp6T4xcsb4yU!V zp~GtpyTfhmdw2M)VRtyLVRv}0VRyK$VR!hhVRtyMVRv}1VRyK%VR!hiVRtyNVRv}2 zVRyK&VR!hjVRtyOVRv}3VRyK(VR!hkVRtyPVRv}4VRyK)VR!hlVRtyQVRv}5VRyK* zVR!hmVIS|Bzq>rz(7RmPzI&HX8-ABl8-ABp8-ABt+d0wY*M{Ha*!KOqJlpWQT-)%w zeB1E5oZIlbyxZ`*+}rTG{M+!m9Nh4`JlycRT-@-xeBAK6oZRrcyxj1++}!ZH{M_)n z9NqA{Jl*iST;1@yeBJQ7oZaxdyxs7-+}-fI{N3=o9NzG|Jl^oTT;A}zeBSW8oZj%e zyx#D;+}`lJ{NC`p9N*5DF3&goF4wp3-{t#;-{t&<-{t*=-{t;>-{t>?-{k;@-{k>^ z-{k^_-{k{`-{k~{-{l2|-{l5}-{l8~-{lC0-{lF1-{lI2-{lL3-{lO4-{lR5f4FBl zhu`H7hu`H8hu`H9hu`HAhu`HBhu`HChu`HDhu`HEhu`HFhu`HGhu`HHhu`HIKlI9d qmv8*g@!g$wryTshzMsh-f+h literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/idna/__pycache__/intranges.cpython-310.pyc b/.venv/lib/python3.10/site-packages/idna/__pycache__/intranges.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..63adf11bbf2652454b0a5ce83cf9b83bdfde8e01 GIT binary patch literal 1965 zcmZuyTW=IM6t?G+&3ck(p^$Tz0Z~LQQJK#(P%2(kElc5S!D5HV5!Ulnyk)2h$cwn?$VJ>-I@bib3y`}kui&;Ty{9Z*N-uE6y5Ht6 zRVh+YAo9|xq0(kuj8dsYJtpGXUNu&Ox+o4}u$oa?6r!w0yGqk-QI$iX>(X>_ z$g0w)thP}5p02DKjccnQtkqa6qe`3FyediD?kO>-^r*YGW^AhM=DJX&+>F;nd%o?? zw`0-k_2Qm*wnzS!<`s;S=!;qzr)u?8YQ$@CqQ0A#?z+1^8eUJ_(zTl=xw- zsD^7do!@cX>mC6g_Bi&M;5%fZ37^&DLNy_!C21n9Y^}>)hK!vJf)5u;G6m{7A$xUIiL;F8*uc=X{P@NU4c{qNQLB; znIaT)S`L-@vMVr7fJio6=97&xD3TVNguo#*)`h9FJ>)sHA0*ppIjtm-Y9-X`G_%D4 zxGJN7(z%?&Jjun@J&?BudK^#>!c>4M?{%HBC(gZARhd;%NeaQ_<*+!fvy*}mTU+AJ zZ80HTaIvf`@md1Z^qjV%V~isLQ_~VhO=K!D3Mf+WFY(%ywm zQyl34qRnh8m{6ghPMn)fw@6VouXJuz!}Df7tF=bSw+jAX`U)if`M$r02>VL*$GUp1 zGHd##-W^o0`#rSe%YKpX_QwZESb3+nxzRUJ_Qg2O_EX^0&t;kRk>S>0Z+y^PIXfi- zU5%VWbFgEsV(D}O9`Hr{mbu55_{Tir9Z!Em5rhtb#z&}`2g2!~Jxy2Nq-lc3>ptrB zD~1~L9v=zNTqv=p$%wvoN^n%YL`M=_#WbX9j=OWi^#`3q82FgZ(jqow=>e_YLpGqt z%73hvK`)5w_|5Sf|HLrYE1g?Z&|l)J6mnM_17==!_FDFehB{(SF|vPzHg5~V#5JLK+;7~s)0^rTjz!o|tM z+2T*H+D^OO>A8~D6wR}5;;>D4w438qw#{t&O$s%zE*YBszTz2u10R=?CUWJSH2%0U zO+bujihQ_d8=m|((U;C^4)4BA^YU}(F$7iDo8ujSiC;$DdB=19BJW@qaD9^u&Neei zBC9M(^v5{E=)oAhtf@#ef!z3{n(EU9a01+JRTWObdybsL-q{*evM$tpswcC6C19PI OMgEC@_3HItHTW0DNAsot literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/idna/__pycache__/package_data.cpython-310.pyc b/.venv/lib/python3.10/site-packages/idna/__pycache__/package_data.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8e21706405eaf12499f17fdcb9eb5779d353da91 GIT binary patch literal 193 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

Q7xj1iv@I4VZ` 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 Tz9BU~ePe1~`li&}Qv3cN;u?Fb literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/idna/codec.py b/.venv/lib/python3.10/site-packages/idna/codec.py new file mode 100644 index 0000000..cbc2e4f --- /dev/null +++ b/.venv/lib/python3.10/site-packages/idna/codec.py @@ -0,0 +1,122 @@ +import codecs +import re +from typing import Any, Optional, Tuple + +from .core import IDNAError, alabel, decode, encode, ulabel + +_unicode_dots_re = re.compile("[\u002e\u3002\uff0e\uff61]") + + +class Codec(codecs.Codec): + def encode(self, data: str, errors: str = "strict") -> Tuple[bytes, int]: + if errors != "strict": + raise IDNAError('Unsupported error handling "{}"'.format(errors)) + + if not data: + return b"", 0 + + return encode(data), len(data) + + def decode(self, data: bytes, errors: str = "strict") -> Tuple[str, int]: + if errors != "strict": + raise IDNAError('Unsupported error handling "{}"'.format(errors)) + + if not data: + return "", 0 + + return decode(data), len(data) + + +class IncrementalEncoder(codecs.BufferedIncrementalEncoder): + def _buffer_encode(self, data: str, errors: str, final: bool) -> Tuple[bytes, int]: + if errors != "strict": + raise IDNAError('Unsupported error handling "{}"'.format(errors)) + + if not data: + return b"", 0 + + labels = _unicode_dots_re.split(data) + trailing_dot = b"" + if labels: + if not labels[-1]: + trailing_dot = b"." + del labels[-1] + elif not final: + # Keep potentially unfinished label until the next call + del labels[-1] + if labels: + trailing_dot = b"." + + result = [] + size = 0 + for label in labels: + result.append(alabel(label)) + if size: + size += 1 + size += len(label) + + # Join with U+002E + result_bytes = b".".join(result) + trailing_dot + size += len(trailing_dot) + return result_bytes, size + + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + def _buffer_decode(self, data: Any, errors: str, final: bool) -> Tuple[str, int]: + if errors != "strict": + raise IDNAError('Unsupported error handling "{}"'.format(errors)) + + if not data: + return ("", 0) + + if not isinstance(data, str): + data = str(data, "ascii") + + labels = _unicode_dots_re.split(data) + trailing_dot = "" + if labels: + if not labels[-1]: + trailing_dot = "." + del labels[-1] + elif not final: + # Keep potentially unfinished label until the next call + del labels[-1] + if labels: + trailing_dot = "." + + result = [] + size = 0 + for label in labels: + result.append(ulabel(label)) + if size: + size += 1 + size += len(label) + + result_str = ".".join(result) + trailing_dot + size += len(trailing_dot) + return (result_str, size) + + +class StreamWriter(Codec, codecs.StreamWriter): + pass + + +class StreamReader(Codec, codecs.StreamReader): + pass + + +def search_function(name: str) -> Optional[codecs.CodecInfo]: + if name != "idna2008": + return None + return codecs.CodecInfo( + name=name, + encode=Codec().encode, + decode=Codec().decode, # type: ignore + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) + + +codecs.register(search_function) diff --git a/.venv/lib/python3.10/site-packages/idna/compat.py b/.venv/lib/python3.10/site-packages/idna/compat.py new file mode 100644 index 0000000..1df9f2a --- /dev/null +++ b/.venv/lib/python3.10/site-packages/idna/compat.py @@ -0,0 +1,15 @@ +from typing import Any, Union + +from .core import decode, encode + + +def ToASCII(label: str) -> bytes: + return encode(label) + + +def ToUnicode(label: Union[bytes, bytearray]) -> str: + return decode(label) + + +def nameprep(s: Any) -> None: + raise NotImplementedError("IDNA 2008 does not utilise nameprep protocol") diff --git a/.venv/lib/python3.10/site-packages/idna/core.py b/.venv/lib/python3.10/site-packages/idna/core.py new file mode 100644 index 0000000..8177bf7 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/idna/core.py @@ -0,0 +1,437 @@ +import bisect +import re +import unicodedata +from typing import Optional, Union + +from . import idnadata +from .intranges import intranges_contain + +_virama_combining_class = 9 +_alabel_prefix = b"xn--" +_unicode_dots_re = re.compile("[\u002e\u3002\uff0e\uff61]") + + +class IDNAError(UnicodeError): + """Base exception for all IDNA-encoding related problems""" + + pass + + +class IDNABidiError(IDNAError): + """Exception when bidirectional requirements are not satisfied""" + + pass + + +class InvalidCodepoint(IDNAError): + """Exception when a disallowed or unallocated codepoint is used""" + + pass + + +class InvalidCodepointContext(IDNAError): + """Exception when the codepoint is not valid in the context it is used""" + + pass + + +def _combining_class(cp: int) -> int: + v = unicodedata.combining(chr(cp)) + if v == 0: + if not unicodedata.name(chr(cp)): + raise ValueError("Unknown character in unicodedata") + return v + + +def _is_script(cp: str, script: str) -> bool: + return intranges_contain(ord(cp), idnadata.scripts[script]) + + +def _punycode(s: str) -> bytes: + return s.encode("punycode") + + +def _unot(s: int) -> str: + return "U+{:04X}".format(s) + + +def valid_label_length(label: Union[bytes, str]) -> bool: + if len(label) > 63: + return False + return True + + +def valid_string_length(label: Union[bytes, str], trailing_dot: bool) -> bool: + if len(label) > (254 if trailing_dot else 253): + return False + return True + + +def check_bidi(label: str, check_ltr: bool = False) -> bool: + # Bidi rules should only be applied if string contains RTL characters + bidi_label = False + for idx, cp in enumerate(label, 1): + direction = unicodedata.bidirectional(cp) + if direction == "": + # String likely comes from a newer version of Unicode + raise IDNABidiError("Unknown directionality in label {} at position {}".format(repr(label), idx)) + if direction in ["R", "AL", "AN"]: + bidi_label = True + if not bidi_label and not check_ltr: + return True + + # Bidi rule 1 + direction = unicodedata.bidirectional(label[0]) + if direction in ["R", "AL"]: + rtl = True + elif direction == "L": + rtl = False + else: + raise IDNABidiError("First codepoint in label {} must be directionality L, R or AL".format(repr(label))) + + valid_ending = False + number_type: Optional[str] = None + for idx, cp in enumerate(label, 1): + direction = unicodedata.bidirectional(cp) + + if rtl: + # Bidi rule 2 + if direction not in [ + "R", + "AL", + "AN", + "EN", + "ES", + "CS", + "ET", + "ON", + "BN", + "NSM", + ]: + raise IDNABidiError("Invalid direction for codepoint at position {} in a right-to-left label".format(idx)) + # Bidi rule 3 + if direction in ["R", "AL", "EN", "AN"]: + valid_ending = True + elif direction != "NSM": + valid_ending = False + # Bidi rule 4 + if direction in ["AN", "EN"]: + if not number_type: + number_type = direction + else: + if number_type != direction: + raise IDNABidiError("Can not mix numeral types in a right-to-left label") + else: + # Bidi rule 5 + if direction not in ["L", "EN", "ES", "CS", "ET", "ON", "BN", "NSM"]: + raise IDNABidiError("Invalid direction for codepoint at position {} in a left-to-right label".format(idx)) + # Bidi rule 6 + if direction in ["L", "EN"]: + valid_ending = True + elif direction != "NSM": + valid_ending = False + + if not valid_ending: + raise IDNABidiError("Label ends with illegal codepoint directionality") + + return True + + +def check_initial_combiner(label: str) -> bool: + if unicodedata.category(label[0])[0] == "M": + raise IDNAError("Label begins with an illegal combining character") + return True + + +def check_hyphen_ok(label: str) -> bool: + if label[2:4] == "--": + raise IDNAError("Label has disallowed hyphens in 3rd and 4th position") + if label[0] == "-" or label[-1] == "-": + raise IDNAError("Label must not start or end with a hyphen") + return True + + +def check_nfc(label: str) -> None: + if unicodedata.normalize("NFC", label) != label: + raise IDNAError("Label must be in Normalization Form C") + + +def valid_contextj(label: str, pos: int) -> bool: + cp_value = ord(label[pos]) + + if cp_value == 0x200C: + if pos > 0: + if _combining_class(ord(label[pos - 1])) == _virama_combining_class: + return True + + ok = False + for i in range(pos - 1, -1, -1): + joining_type = idnadata.joining_types.get(ord(label[i])) + if joining_type == ord("T"): + continue + elif joining_type in [ord("L"), ord("D")]: + ok = True + break + else: + break + + if not ok: + return False + + ok = False + for i in range(pos + 1, len(label)): + joining_type = idnadata.joining_types.get(ord(label[i])) + if joining_type == ord("T"): + continue + elif joining_type in [ord("R"), ord("D")]: + ok = True + break + else: + break + return ok + + if cp_value == 0x200D: + if pos > 0: + if _combining_class(ord(label[pos - 1])) == _virama_combining_class: + return True + return False + + else: + return False + + +def valid_contexto(label: str, pos: int, exception: bool = False) -> bool: + cp_value = ord(label[pos]) + + if cp_value == 0x00B7: + if 0 < pos < len(label) - 1: + if ord(label[pos - 1]) == 0x006C and ord(label[pos + 1]) == 0x006C: + return True + return False + + elif cp_value == 0x0375: + if pos < len(label) - 1 and len(label) > 1: + return _is_script(label[pos + 1], "Greek") + return False + + elif cp_value == 0x05F3 or cp_value == 0x05F4: + if pos > 0: + return _is_script(label[pos - 1], "Hebrew") + return False + + elif cp_value == 0x30FB: + for cp in label: + if cp == "\u30fb": + continue + if _is_script(cp, "Hiragana") or _is_script(cp, "Katakana") or _is_script(cp, "Han"): + return True + return False + + elif 0x660 <= cp_value <= 0x669: + for cp in label: + if 0x6F0 <= ord(cp) <= 0x06F9: + return False + return True + + elif 0x6F0 <= cp_value <= 0x6F9: + for cp in label: + if 0x660 <= ord(cp) <= 0x0669: + return False + return True + + return False + + +def check_label(label: Union[str, bytes, bytearray]) -> None: + if isinstance(label, (bytes, bytearray)): + label = label.decode("utf-8") + if len(label) == 0: + raise IDNAError("Empty Label") + + check_nfc(label) + check_hyphen_ok(label) + check_initial_combiner(label) + + for pos, cp in enumerate(label): + cp_value = ord(cp) + if intranges_contain(cp_value, idnadata.codepoint_classes["PVALID"]): + continue + elif intranges_contain(cp_value, idnadata.codepoint_classes["CONTEXTJ"]): + try: + if not valid_contextj(label, pos): + raise InvalidCodepointContext( + "Joiner {} not allowed at position {} in {}".format(_unot(cp_value), pos + 1, repr(label)) + ) + except ValueError: + raise IDNAError( + "Unknown codepoint adjacent to joiner {} at position {} in {}".format( + _unot(cp_value), pos + 1, repr(label) + ) + ) + elif intranges_contain(cp_value, idnadata.codepoint_classes["CONTEXTO"]): + if not valid_contexto(label, pos): + raise InvalidCodepointContext( + "Codepoint {} not allowed at position {} in {}".format(_unot(cp_value), pos + 1, repr(label)) + ) + else: + raise InvalidCodepoint( + "Codepoint {} at position {} of {} not allowed".format(_unot(cp_value), pos + 1, repr(label)) + ) + + check_bidi(label) + + +def alabel(label: str) -> bytes: + try: + label_bytes = label.encode("ascii") + ulabel(label_bytes) + if not valid_label_length(label_bytes): + raise IDNAError("Label too long") + return label_bytes + except UnicodeEncodeError: + pass + + check_label(label) + label_bytes = _alabel_prefix + _punycode(label) + + if not valid_label_length(label_bytes): + raise IDNAError("Label too long") + + return label_bytes + + +def ulabel(label: Union[str, bytes, bytearray]) -> str: + if not isinstance(label, (bytes, bytearray)): + try: + label_bytes = label.encode("ascii") + except UnicodeEncodeError: + check_label(label) + return label + else: + label_bytes = bytes(label) + + label_bytes = label_bytes.lower() + if label_bytes.startswith(_alabel_prefix): + label_bytes = label_bytes[len(_alabel_prefix) :] + if not label_bytes: + raise IDNAError("Malformed A-label, no Punycode eligible content found") + if label_bytes.decode("ascii")[-1] == "-": + raise IDNAError("A-label must not end with a hyphen") + else: + check_label(label_bytes) + return label_bytes.decode("ascii") + + try: + label = label_bytes.decode("punycode") + except UnicodeError: + raise IDNAError("Invalid A-label") + check_label(label) + return label + + +def uts46_remap(domain: str, std3_rules: bool = True, transitional: bool = False) -> str: + """Re-map the characters in the string according to UTS46 processing.""" + from .uts46data import uts46data + + output = "" + + for pos, char in enumerate(domain): + code_point = ord(char) + try: + uts46row = uts46data[code_point if code_point < 256 else bisect.bisect_left(uts46data, (code_point, "Z")) - 1] + status = uts46row[1] + replacement: Optional[str] = None + if len(uts46row) == 3: + replacement = uts46row[2] + if ( + status == "V" + or (status == "D" and not transitional) + or (status == "3" and not std3_rules and replacement is None) + ): + output += char + elif replacement is not None and ( + status == "M" or (status == "3" and not std3_rules) or (status == "D" and transitional) + ): + output += replacement + elif status != "I": + raise IndexError() + except IndexError: + raise InvalidCodepoint( + "Codepoint {} not allowed at position {} in {}".format(_unot(code_point), pos + 1, repr(domain)) + ) + + return unicodedata.normalize("NFC", output) + + +def encode( + s: Union[str, bytes, bytearray], + strict: bool = False, + uts46: bool = False, + std3_rules: bool = False, + transitional: bool = False, +) -> bytes: + if not isinstance(s, str): + try: + s = str(s, "ascii") + except UnicodeDecodeError: + raise IDNAError("should pass a unicode string to the function rather than a byte string.") + if uts46: + s = uts46_remap(s, std3_rules, transitional) + trailing_dot = False + result = [] + if strict: + labels = s.split(".") + else: + labels = _unicode_dots_re.split(s) + if not labels or labels == [""]: + raise IDNAError("Empty domain") + if labels[-1] == "": + del labels[-1] + trailing_dot = True + for label in labels: + s = alabel(label) + if s: + result.append(s) + else: + raise IDNAError("Empty label") + if trailing_dot: + result.append(b"") + s = b".".join(result) + if not valid_string_length(s, trailing_dot): + raise IDNAError("Domain too long") + return s + + +def decode( + s: Union[str, bytes, bytearray], + strict: bool = False, + uts46: bool = False, + std3_rules: bool = False, +) -> str: + try: + if not isinstance(s, str): + s = str(s, "ascii") + except UnicodeDecodeError: + raise IDNAError("Invalid ASCII in A-label") + if uts46: + s = uts46_remap(s, std3_rules, False) + trailing_dot = False + result = [] + if not strict: + labels = _unicode_dots_re.split(s) + else: + labels = s.split(".") + if not labels or labels == [""]: + raise IDNAError("Empty domain") + if not labels[-1]: + del labels[-1] + trailing_dot = True + for label in labels: + s = ulabel(label) + if s: + result.append(s) + else: + raise IDNAError("Empty label") + if trailing_dot: + result.append("") + return ".".join(result) diff --git a/.venv/lib/python3.10/site-packages/idna/idnadata.py b/.venv/lib/python3.10/site-packages/idna/idnadata.py new file mode 100644 index 0000000..ded47ca --- /dev/null +++ b/.venv/lib/python3.10/site-packages/idna/idnadata.py @@ -0,0 +1,4309 @@ +# This file is automatically generated by tools/idna-data + +__version__ = "16.0.0" + +scripts = { + "Greek": ( + 0x37000000374, + 0x37500000378, + 0x37A0000037E, + 0x37F00000380, + 0x38400000385, + 0x38600000387, + 0x3880000038B, + 0x38C0000038D, + 0x38E000003A2, + 0x3A3000003E2, + 0x3F000000400, + 0x1D2600001D2B, + 0x1D5D00001D62, + 0x1D6600001D6B, + 0x1DBF00001DC0, + 0x1F0000001F16, + 0x1F1800001F1E, + 0x1F2000001F46, + 0x1F4800001F4E, + 0x1F5000001F58, + 0x1F5900001F5A, + 0x1F5B00001F5C, + 0x1F5D00001F5E, + 0x1F5F00001F7E, + 0x1F8000001FB5, + 0x1FB600001FC5, + 0x1FC600001FD4, + 0x1FD600001FDC, + 0x1FDD00001FF0, + 0x1FF200001FF5, + 0x1FF600001FFF, + 0x212600002127, + 0xAB650000AB66, + 0x101400001018F, + 0x101A0000101A1, + 0x1D2000001D246, + ), + "Han": ( + 0x2E8000002E9A, + 0x2E9B00002EF4, + 0x2F0000002FD6, + 0x300500003006, + 0x300700003008, + 0x30210000302A, + 0x30380000303C, + 0x340000004DC0, + 0x4E000000A000, + 0xF9000000FA6E, + 0xFA700000FADA, + 0x16FE200016FE4, + 0x16FF000016FF2, + 0x200000002A6E0, + 0x2A7000002B73A, + 0x2B7400002B81E, + 0x2B8200002CEA2, + 0x2CEB00002EBE1, + 0x2EBF00002EE5E, + 0x2F8000002FA1E, + 0x300000003134B, + 0x31350000323B0, + ), + "Hebrew": ( + 0x591000005C8, + 0x5D0000005EB, + 0x5EF000005F5, + 0xFB1D0000FB37, + 0xFB380000FB3D, + 0xFB3E0000FB3F, + 0xFB400000FB42, + 0xFB430000FB45, + 0xFB460000FB50, + ), + "Hiragana": ( + 0x304100003097, + 0x309D000030A0, + 0x1B0010001B120, + 0x1B1320001B133, + 0x1B1500001B153, + 0x1F2000001F201, + ), + "Katakana": ( + 0x30A1000030FB, + 0x30FD00003100, + 0x31F000003200, + 0x32D0000032FF, + 0x330000003358, + 0xFF660000FF70, + 0xFF710000FF9E, + 0x1AFF00001AFF4, + 0x1AFF50001AFFC, + 0x1AFFD0001AFFF, + 0x1B0000001B001, + 0x1B1200001B123, + 0x1B1550001B156, + 0x1B1640001B168, + ), +} +joining_types = { + 0xAD: 84, + 0x300: 84, + 0x301: 84, + 0x302: 84, + 0x303: 84, + 0x304: 84, + 0x305: 84, + 0x306: 84, + 0x307: 84, + 0x308: 84, + 0x309: 84, + 0x30A: 84, + 0x30B: 84, + 0x30C: 84, + 0x30D: 84, + 0x30E: 84, + 0x30F: 84, + 0x310: 84, + 0x311: 84, + 0x312: 84, + 0x313: 84, + 0x314: 84, + 0x315: 84, + 0x316: 84, + 0x317: 84, + 0x318: 84, + 0x319: 84, + 0x31A: 84, + 0x31B: 84, + 0x31C: 84, + 0x31D: 84, + 0x31E: 84, + 0x31F: 84, + 0x320: 84, + 0x321: 84, + 0x322: 84, + 0x323: 84, + 0x324: 84, + 0x325: 84, + 0x326: 84, + 0x327: 84, + 0x328: 84, + 0x329: 84, + 0x32A: 84, + 0x32B: 84, + 0x32C: 84, + 0x32D: 84, + 0x32E: 84, + 0x32F: 84, + 0x330: 84, + 0x331: 84, + 0x332: 84, + 0x333: 84, + 0x334: 84, + 0x335: 84, + 0x336: 84, + 0x337: 84, + 0x338: 84, + 0x339: 84, + 0x33A: 84, + 0x33B: 84, + 0x33C: 84, + 0x33D: 84, + 0x33E: 84, + 0x33F: 84, + 0x340: 84, + 0x341: 84, + 0x342: 84, + 0x343: 84, + 0x344: 84, + 0x345: 84, + 0x346: 84, + 0x347: 84, + 0x348: 84, + 0x349: 84, + 0x34A: 84, + 0x34B: 84, + 0x34C: 84, + 0x34D: 84, + 0x34E: 84, + 0x34F: 84, + 0x350: 84, + 0x351: 84, + 0x352: 84, + 0x353: 84, + 0x354: 84, + 0x355: 84, + 0x356: 84, + 0x357: 84, + 0x358: 84, + 0x359: 84, + 0x35A: 84, + 0x35B: 84, + 0x35C: 84, + 0x35D: 84, + 0x35E: 84, + 0x35F: 84, + 0x360: 84, + 0x361: 84, + 0x362: 84, + 0x363: 84, + 0x364: 84, + 0x365: 84, + 0x366: 84, + 0x367: 84, + 0x368: 84, + 0x369: 84, + 0x36A: 84, + 0x36B: 84, + 0x36C: 84, + 0x36D: 84, + 0x36E: 84, + 0x36F: 84, + 0x483: 84, + 0x484: 84, + 0x485: 84, + 0x486: 84, + 0x487: 84, + 0x488: 84, + 0x489: 84, + 0x591: 84, + 0x592: 84, + 0x593: 84, + 0x594: 84, + 0x595: 84, + 0x596: 84, + 0x597: 84, + 0x598: 84, + 0x599: 84, + 0x59A: 84, + 0x59B: 84, + 0x59C: 84, + 0x59D: 84, + 0x59E: 84, + 0x59F: 84, + 0x5A0: 84, + 0x5A1: 84, + 0x5A2: 84, + 0x5A3: 84, + 0x5A4: 84, + 0x5A5: 84, + 0x5A6: 84, + 0x5A7: 84, + 0x5A8: 84, + 0x5A9: 84, + 0x5AA: 84, + 0x5AB: 84, + 0x5AC: 84, + 0x5AD: 84, + 0x5AE: 84, + 0x5AF: 84, + 0x5B0: 84, + 0x5B1: 84, + 0x5B2: 84, + 0x5B3: 84, + 0x5B4: 84, + 0x5B5: 84, + 0x5B6: 84, + 0x5B7: 84, + 0x5B8: 84, + 0x5B9: 84, + 0x5BA: 84, + 0x5BB: 84, + 0x5BC: 84, + 0x5BD: 84, + 0x5BF: 84, + 0x5C1: 84, + 0x5C2: 84, + 0x5C4: 84, + 0x5C5: 84, + 0x5C7: 84, + 0x610: 84, + 0x611: 84, + 0x612: 84, + 0x613: 84, + 0x614: 84, + 0x615: 84, + 0x616: 84, + 0x617: 84, + 0x618: 84, + 0x619: 84, + 0x61A: 84, + 0x61C: 84, + 0x620: 68, + 0x622: 82, + 0x623: 82, + 0x624: 82, + 0x625: 82, + 0x626: 68, + 0x627: 82, + 0x628: 68, + 0x629: 82, + 0x62A: 68, + 0x62B: 68, + 0x62C: 68, + 0x62D: 68, + 0x62E: 68, + 0x62F: 82, + 0x630: 82, + 0x631: 82, + 0x632: 82, + 0x633: 68, + 0x634: 68, + 0x635: 68, + 0x636: 68, + 0x637: 68, + 0x638: 68, + 0x639: 68, + 0x63A: 68, + 0x63B: 68, + 0x63C: 68, + 0x63D: 68, + 0x63E: 68, + 0x63F: 68, + 0x640: 67, + 0x641: 68, + 0x642: 68, + 0x643: 68, + 0x644: 68, + 0x645: 68, + 0x646: 68, + 0x647: 68, + 0x648: 82, + 0x649: 68, + 0x64A: 68, + 0x64B: 84, + 0x64C: 84, + 0x64D: 84, + 0x64E: 84, + 0x64F: 84, + 0x650: 84, + 0x651: 84, + 0x652: 84, + 0x653: 84, + 0x654: 84, + 0x655: 84, + 0x656: 84, + 0x657: 84, + 0x658: 84, + 0x659: 84, + 0x65A: 84, + 0x65B: 84, + 0x65C: 84, + 0x65D: 84, + 0x65E: 84, + 0x65F: 84, + 0x66E: 68, + 0x66F: 68, + 0x670: 84, + 0x671: 82, + 0x672: 82, + 0x673: 82, + 0x675: 82, + 0x676: 82, + 0x677: 82, + 0x678: 68, + 0x679: 68, + 0x67A: 68, + 0x67B: 68, + 0x67C: 68, + 0x67D: 68, + 0x67E: 68, + 0x67F: 68, + 0x680: 68, + 0x681: 68, + 0x682: 68, + 0x683: 68, + 0x684: 68, + 0x685: 68, + 0x686: 68, + 0x687: 68, + 0x688: 82, + 0x689: 82, + 0x68A: 82, + 0x68B: 82, + 0x68C: 82, + 0x68D: 82, + 0x68E: 82, + 0x68F: 82, + 0x690: 82, + 0x691: 82, + 0x692: 82, + 0x693: 82, + 0x694: 82, + 0x695: 82, + 0x696: 82, + 0x697: 82, + 0x698: 82, + 0x699: 82, + 0x69A: 68, + 0x69B: 68, + 0x69C: 68, + 0x69D: 68, + 0x69E: 68, + 0x69F: 68, + 0x6A0: 68, + 0x6A1: 68, + 0x6A2: 68, + 0x6A3: 68, + 0x6A4: 68, + 0x6A5: 68, + 0x6A6: 68, + 0x6A7: 68, + 0x6A8: 68, + 0x6A9: 68, + 0x6AA: 68, + 0x6AB: 68, + 0x6AC: 68, + 0x6AD: 68, + 0x6AE: 68, + 0x6AF: 68, + 0x6B0: 68, + 0x6B1: 68, + 0x6B2: 68, + 0x6B3: 68, + 0x6B4: 68, + 0x6B5: 68, + 0x6B6: 68, + 0x6B7: 68, + 0x6B8: 68, + 0x6B9: 68, + 0x6BA: 68, + 0x6BB: 68, + 0x6BC: 68, + 0x6BD: 68, + 0x6BE: 68, + 0x6BF: 68, + 0x6C0: 82, + 0x6C1: 68, + 0x6C2: 68, + 0x6C3: 82, + 0x6C4: 82, + 0x6C5: 82, + 0x6C6: 82, + 0x6C7: 82, + 0x6C8: 82, + 0x6C9: 82, + 0x6CA: 82, + 0x6CB: 82, + 0x6CC: 68, + 0x6CD: 82, + 0x6CE: 68, + 0x6CF: 82, + 0x6D0: 68, + 0x6D1: 68, + 0x6D2: 82, + 0x6D3: 82, + 0x6D5: 82, + 0x6D6: 84, + 0x6D7: 84, + 0x6D8: 84, + 0x6D9: 84, + 0x6DA: 84, + 0x6DB: 84, + 0x6DC: 84, + 0x6DF: 84, + 0x6E0: 84, + 0x6E1: 84, + 0x6E2: 84, + 0x6E3: 84, + 0x6E4: 84, + 0x6E7: 84, + 0x6E8: 84, + 0x6EA: 84, + 0x6EB: 84, + 0x6EC: 84, + 0x6ED: 84, + 0x6EE: 82, + 0x6EF: 82, + 0x6FA: 68, + 0x6FB: 68, + 0x6FC: 68, + 0x6FF: 68, + 0x70F: 84, + 0x710: 82, + 0x711: 84, + 0x712: 68, + 0x713: 68, + 0x714: 68, + 0x715: 82, + 0x716: 82, + 0x717: 82, + 0x718: 82, + 0x719: 82, + 0x71A: 68, + 0x71B: 68, + 0x71C: 68, + 0x71D: 68, + 0x71E: 82, + 0x71F: 68, + 0x720: 68, + 0x721: 68, + 0x722: 68, + 0x723: 68, + 0x724: 68, + 0x725: 68, + 0x726: 68, + 0x727: 68, + 0x728: 82, + 0x729: 68, + 0x72A: 82, + 0x72B: 68, + 0x72C: 82, + 0x72D: 68, + 0x72E: 68, + 0x72F: 82, + 0x730: 84, + 0x731: 84, + 0x732: 84, + 0x733: 84, + 0x734: 84, + 0x735: 84, + 0x736: 84, + 0x737: 84, + 0x738: 84, + 0x739: 84, + 0x73A: 84, + 0x73B: 84, + 0x73C: 84, + 0x73D: 84, + 0x73E: 84, + 0x73F: 84, + 0x740: 84, + 0x741: 84, + 0x742: 84, + 0x743: 84, + 0x744: 84, + 0x745: 84, + 0x746: 84, + 0x747: 84, + 0x748: 84, + 0x749: 84, + 0x74A: 84, + 0x74D: 82, + 0x74E: 68, + 0x74F: 68, + 0x750: 68, + 0x751: 68, + 0x752: 68, + 0x753: 68, + 0x754: 68, + 0x755: 68, + 0x756: 68, + 0x757: 68, + 0x758: 68, + 0x759: 82, + 0x75A: 82, + 0x75B: 82, + 0x75C: 68, + 0x75D: 68, + 0x75E: 68, + 0x75F: 68, + 0x760: 68, + 0x761: 68, + 0x762: 68, + 0x763: 68, + 0x764: 68, + 0x765: 68, + 0x766: 68, + 0x767: 68, + 0x768: 68, + 0x769: 68, + 0x76A: 68, + 0x76B: 82, + 0x76C: 82, + 0x76D: 68, + 0x76E: 68, + 0x76F: 68, + 0x770: 68, + 0x771: 82, + 0x772: 68, + 0x773: 82, + 0x774: 82, + 0x775: 68, + 0x776: 68, + 0x777: 68, + 0x778: 82, + 0x779: 82, + 0x77A: 68, + 0x77B: 68, + 0x77C: 68, + 0x77D: 68, + 0x77E: 68, + 0x77F: 68, + 0x7A6: 84, + 0x7A7: 84, + 0x7A8: 84, + 0x7A9: 84, + 0x7AA: 84, + 0x7AB: 84, + 0x7AC: 84, + 0x7AD: 84, + 0x7AE: 84, + 0x7AF: 84, + 0x7B0: 84, + 0x7CA: 68, + 0x7CB: 68, + 0x7CC: 68, + 0x7CD: 68, + 0x7CE: 68, + 0x7CF: 68, + 0x7D0: 68, + 0x7D1: 68, + 0x7D2: 68, + 0x7D3: 68, + 0x7D4: 68, + 0x7D5: 68, + 0x7D6: 68, + 0x7D7: 68, + 0x7D8: 68, + 0x7D9: 68, + 0x7DA: 68, + 0x7DB: 68, + 0x7DC: 68, + 0x7DD: 68, + 0x7DE: 68, + 0x7DF: 68, + 0x7E0: 68, + 0x7E1: 68, + 0x7E2: 68, + 0x7E3: 68, + 0x7E4: 68, + 0x7E5: 68, + 0x7E6: 68, + 0x7E7: 68, + 0x7E8: 68, + 0x7E9: 68, + 0x7EA: 68, + 0x7EB: 84, + 0x7EC: 84, + 0x7ED: 84, + 0x7EE: 84, + 0x7EF: 84, + 0x7F0: 84, + 0x7F1: 84, + 0x7F2: 84, + 0x7F3: 84, + 0x7FA: 67, + 0x7FD: 84, + 0x816: 84, + 0x817: 84, + 0x818: 84, + 0x819: 84, + 0x81B: 84, + 0x81C: 84, + 0x81D: 84, + 0x81E: 84, + 0x81F: 84, + 0x820: 84, + 0x821: 84, + 0x822: 84, + 0x823: 84, + 0x825: 84, + 0x826: 84, + 0x827: 84, + 0x829: 84, + 0x82A: 84, + 0x82B: 84, + 0x82C: 84, + 0x82D: 84, + 0x840: 82, + 0x841: 68, + 0x842: 68, + 0x843: 68, + 0x844: 68, + 0x845: 68, + 0x846: 82, + 0x847: 82, + 0x848: 68, + 0x849: 82, + 0x84A: 68, + 0x84B: 68, + 0x84C: 68, + 0x84D: 68, + 0x84E: 68, + 0x84F: 68, + 0x850: 68, + 0x851: 68, + 0x852: 68, + 0x853: 68, + 0x854: 82, + 0x855: 68, + 0x856: 82, + 0x857: 82, + 0x858: 82, + 0x859: 84, + 0x85A: 84, + 0x85B: 84, + 0x860: 68, + 0x862: 68, + 0x863: 68, + 0x864: 68, + 0x865: 68, + 0x867: 82, + 0x868: 68, + 0x869: 82, + 0x86A: 82, + 0x870: 82, + 0x871: 82, + 0x872: 82, + 0x873: 82, + 0x874: 82, + 0x875: 82, + 0x876: 82, + 0x877: 82, + 0x878: 82, + 0x879: 82, + 0x87A: 82, + 0x87B: 82, + 0x87C: 82, + 0x87D: 82, + 0x87E: 82, + 0x87F: 82, + 0x880: 82, + 0x881: 82, + 0x882: 82, + 0x883: 67, + 0x884: 67, + 0x885: 67, + 0x886: 68, + 0x889: 68, + 0x88A: 68, + 0x88B: 68, + 0x88C: 68, + 0x88D: 68, + 0x88E: 82, + 0x897: 84, + 0x898: 84, + 0x899: 84, + 0x89A: 84, + 0x89B: 84, + 0x89C: 84, + 0x89D: 84, + 0x89E: 84, + 0x89F: 84, + 0x8A0: 68, + 0x8A1: 68, + 0x8A2: 68, + 0x8A3: 68, + 0x8A4: 68, + 0x8A5: 68, + 0x8A6: 68, + 0x8A7: 68, + 0x8A8: 68, + 0x8A9: 68, + 0x8AA: 82, + 0x8AB: 82, + 0x8AC: 82, + 0x8AE: 82, + 0x8AF: 68, + 0x8B0: 68, + 0x8B1: 82, + 0x8B2: 82, + 0x8B3: 68, + 0x8B4: 68, + 0x8B5: 68, + 0x8B6: 68, + 0x8B7: 68, + 0x8B8: 68, + 0x8B9: 82, + 0x8BA: 68, + 0x8BB: 68, + 0x8BC: 68, + 0x8BD: 68, + 0x8BE: 68, + 0x8BF: 68, + 0x8C0: 68, + 0x8C1: 68, + 0x8C2: 68, + 0x8C3: 68, + 0x8C4: 68, + 0x8C5: 68, + 0x8C6: 68, + 0x8C7: 68, + 0x8C8: 68, + 0x8CA: 84, + 0x8CB: 84, + 0x8CC: 84, + 0x8CD: 84, + 0x8CE: 84, + 0x8CF: 84, + 0x8D0: 84, + 0x8D1: 84, + 0x8D2: 84, + 0x8D3: 84, + 0x8D4: 84, + 0x8D5: 84, + 0x8D6: 84, + 0x8D7: 84, + 0x8D8: 84, + 0x8D9: 84, + 0x8DA: 84, + 0x8DB: 84, + 0x8DC: 84, + 0x8DD: 84, + 0x8DE: 84, + 0x8DF: 84, + 0x8E0: 84, + 0x8E1: 84, + 0x8E3: 84, + 0x8E4: 84, + 0x8E5: 84, + 0x8E6: 84, + 0x8E7: 84, + 0x8E8: 84, + 0x8E9: 84, + 0x8EA: 84, + 0x8EB: 84, + 0x8EC: 84, + 0x8ED: 84, + 0x8EE: 84, + 0x8EF: 84, + 0x8F0: 84, + 0x8F1: 84, + 0x8F2: 84, + 0x8F3: 84, + 0x8F4: 84, + 0x8F5: 84, + 0x8F6: 84, + 0x8F7: 84, + 0x8F8: 84, + 0x8F9: 84, + 0x8FA: 84, + 0x8FB: 84, + 0x8FC: 84, + 0x8FD: 84, + 0x8FE: 84, + 0x8FF: 84, + 0x900: 84, + 0x901: 84, + 0x902: 84, + 0x93A: 84, + 0x93C: 84, + 0x941: 84, + 0x942: 84, + 0x943: 84, + 0x944: 84, + 0x945: 84, + 0x946: 84, + 0x947: 84, + 0x948: 84, + 0x94D: 84, + 0x951: 84, + 0x952: 84, + 0x953: 84, + 0x954: 84, + 0x955: 84, + 0x956: 84, + 0x957: 84, + 0x962: 84, + 0x963: 84, + 0x981: 84, + 0x9BC: 84, + 0x9C1: 84, + 0x9C2: 84, + 0x9C3: 84, + 0x9C4: 84, + 0x9CD: 84, + 0x9E2: 84, + 0x9E3: 84, + 0x9FE: 84, + 0xA01: 84, + 0xA02: 84, + 0xA3C: 84, + 0xA41: 84, + 0xA42: 84, + 0xA47: 84, + 0xA48: 84, + 0xA4B: 84, + 0xA4C: 84, + 0xA4D: 84, + 0xA51: 84, + 0xA70: 84, + 0xA71: 84, + 0xA75: 84, + 0xA81: 84, + 0xA82: 84, + 0xABC: 84, + 0xAC1: 84, + 0xAC2: 84, + 0xAC3: 84, + 0xAC4: 84, + 0xAC5: 84, + 0xAC7: 84, + 0xAC8: 84, + 0xACD: 84, + 0xAE2: 84, + 0xAE3: 84, + 0xAFA: 84, + 0xAFB: 84, + 0xAFC: 84, + 0xAFD: 84, + 0xAFE: 84, + 0xAFF: 84, + 0xB01: 84, + 0xB3C: 84, + 0xB3F: 84, + 0xB41: 84, + 0xB42: 84, + 0xB43: 84, + 0xB44: 84, + 0xB4D: 84, + 0xB55: 84, + 0xB56: 84, + 0xB62: 84, + 0xB63: 84, + 0xB82: 84, + 0xBC0: 84, + 0xBCD: 84, + 0xC00: 84, + 0xC04: 84, + 0xC3C: 84, + 0xC3E: 84, + 0xC3F: 84, + 0xC40: 84, + 0xC46: 84, + 0xC47: 84, + 0xC48: 84, + 0xC4A: 84, + 0xC4B: 84, + 0xC4C: 84, + 0xC4D: 84, + 0xC55: 84, + 0xC56: 84, + 0xC62: 84, + 0xC63: 84, + 0xC81: 84, + 0xCBC: 84, + 0xCBF: 84, + 0xCC6: 84, + 0xCCC: 84, + 0xCCD: 84, + 0xCE2: 84, + 0xCE3: 84, + 0xD00: 84, + 0xD01: 84, + 0xD3B: 84, + 0xD3C: 84, + 0xD41: 84, + 0xD42: 84, + 0xD43: 84, + 0xD44: 84, + 0xD4D: 84, + 0xD62: 84, + 0xD63: 84, + 0xD81: 84, + 0xDCA: 84, + 0xDD2: 84, + 0xDD3: 84, + 0xDD4: 84, + 0xDD6: 84, + 0xE31: 84, + 0xE34: 84, + 0xE35: 84, + 0xE36: 84, + 0xE37: 84, + 0xE38: 84, + 0xE39: 84, + 0xE3A: 84, + 0xE47: 84, + 0xE48: 84, + 0xE49: 84, + 0xE4A: 84, + 0xE4B: 84, + 0xE4C: 84, + 0xE4D: 84, + 0xE4E: 84, + 0xEB1: 84, + 0xEB4: 84, + 0xEB5: 84, + 0xEB6: 84, + 0xEB7: 84, + 0xEB8: 84, + 0xEB9: 84, + 0xEBA: 84, + 0xEBB: 84, + 0xEBC: 84, + 0xEC8: 84, + 0xEC9: 84, + 0xECA: 84, + 0xECB: 84, + 0xECC: 84, + 0xECD: 84, + 0xECE: 84, + 0xF18: 84, + 0xF19: 84, + 0xF35: 84, + 0xF37: 84, + 0xF39: 84, + 0xF71: 84, + 0xF72: 84, + 0xF73: 84, + 0xF74: 84, + 0xF75: 84, + 0xF76: 84, + 0xF77: 84, + 0xF78: 84, + 0xF79: 84, + 0xF7A: 84, + 0xF7B: 84, + 0xF7C: 84, + 0xF7D: 84, + 0xF7E: 84, + 0xF80: 84, + 0xF81: 84, + 0xF82: 84, + 0xF83: 84, + 0xF84: 84, + 0xF86: 84, + 0xF87: 84, + 0xF8D: 84, + 0xF8E: 84, + 0xF8F: 84, + 0xF90: 84, + 0xF91: 84, + 0xF92: 84, + 0xF93: 84, + 0xF94: 84, + 0xF95: 84, + 0xF96: 84, + 0xF97: 84, + 0xF99: 84, + 0xF9A: 84, + 0xF9B: 84, + 0xF9C: 84, + 0xF9D: 84, + 0xF9E: 84, + 0xF9F: 84, + 0xFA0: 84, + 0xFA1: 84, + 0xFA2: 84, + 0xFA3: 84, + 0xFA4: 84, + 0xFA5: 84, + 0xFA6: 84, + 0xFA7: 84, + 0xFA8: 84, + 0xFA9: 84, + 0xFAA: 84, + 0xFAB: 84, + 0xFAC: 84, + 0xFAD: 84, + 0xFAE: 84, + 0xFAF: 84, + 0xFB0: 84, + 0xFB1: 84, + 0xFB2: 84, + 0xFB3: 84, + 0xFB4: 84, + 0xFB5: 84, + 0xFB6: 84, + 0xFB7: 84, + 0xFB8: 84, + 0xFB9: 84, + 0xFBA: 84, + 0xFBB: 84, + 0xFBC: 84, + 0xFC6: 84, + 0x102D: 84, + 0x102E: 84, + 0x102F: 84, + 0x1030: 84, + 0x1032: 84, + 0x1033: 84, + 0x1034: 84, + 0x1035: 84, + 0x1036: 84, + 0x1037: 84, + 0x1039: 84, + 0x103A: 84, + 0x103D: 84, + 0x103E: 84, + 0x1058: 84, + 0x1059: 84, + 0x105E: 84, + 0x105F: 84, + 0x1060: 84, + 0x1071: 84, + 0x1072: 84, + 0x1073: 84, + 0x1074: 84, + 0x1082: 84, + 0x1085: 84, + 0x1086: 84, + 0x108D: 84, + 0x109D: 84, + 0x135D: 84, + 0x135E: 84, + 0x135F: 84, + 0x1712: 84, + 0x1713: 84, + 0x1714: 84, + 0x1732: 84, + 0x1733: 84, + 0x1752: 84, + 0x1753: 84, + 0x1772: 84, + 0x1773: 84, + 0x17B4: 84, + 0x17B5: 84, + 0x17B7: 84, + 0x17B8: 84, + 0x17B9: 84, + 0x17BA: 84, + 0x17BB: 84, + 0x17BC: 84, + 0x17BD: 84, + 0x17C6: 84, + 0x17C9: 84, + 0x17CA: 84, + 0x17CB: 84, + 0x17CC: 84, + 0x17CD: 84, + 0x17CE: 84, + 0x17CF: 84, + 0x17D0: 84, + 0x17D1: 84, + 0x17D2: 84, + 0x17D3: 84, + 0x17DD: 84, + 0x1807: 68, + 0x180A: 67, + 0x180B: 84, + 0x180C: 84, + 0x180D: 84, + 0x180F: 84, + 0x1820: 68, + 0x1821: 68, + 0x1822: 68, + 0x1823: 68, + 0x1824: 68, + 0x1825: 68, + 0x1826: 68, + 0x1827: 68, + 0x1828: 68, + 0x1829: 68, + 0x182A: 68, + 0x182B: 68, + 0x182C: 68, + 0x182D: 68, + 0x182E: 68, + 0x182F: 68, + 0x1830: 68, + 0x1831: 68, + 0x1832: 68, + 0x1833: 68, + 0x1834: 68, + 0x1835: 68, + 0x1836: 68, + 0x1837: 68, + 0x1838: 68, + 0x1839: 68, + 0x183A: 68, + 0x183B: 68, + 0x183C: 68, + 0x183D: 68, + 0x183E: 68, + 0x183F: 68, + 0x1840: 68, + 0x1841: 68, + 0x1842: 68, + 0x1843: 68, + 0x1844: 68, + 0x1845: 68, + 0x1846: 68, + 0x1847: 68, + 0x1848: 68, + 0x1849: 68, + 0x184A: 68, + 0x184B: 68, + 0x184C: 68, + 0x184D: 68, + 0x184E: 68, + 0x184F: 68, + 0x1850: 68, + 0x1851: 68, + 0x1852: 68, + 0x1853: 68, + 0x1854: 68, + 0x1855: 68, + 0x1856: 68, + 0x1857: 68, + 0x1858: 68, + 0x1859: 68, + 0x185A: 68, + 0x185B: 68, + 0x185C: 68, + 0x185D: 68, + 0x185E: 68, + 0x185F: 68, + 0x1860: 68, + 0x1861: 68, + 0x1862: 68, + 0x1863: 68, + 0x1864: 68, + 0x1865: 68, + 0x1866: 68, + 0x1867: 68, + 0x1868: 68, + 0x1869: 68, + 0x186A: 68, + 0x186B: 68, + 0x186C: 68, + 0x186D: 68, + 0x186E: 68, + 0x186F: 68, + 0x1870: 68, + 0x1871: 68, + 0x1872: 68, + 0x1873: 68, + 0x1874: 68, + 0x1875: 68, + 0x1876: 68, + 0x1877: 68, + 0x1878: 68, + 0x1885: 84, + 0x1886: 84, + 0x1887: 68, + 0x1888: 68, + 0x1889: 68, + 0x188A: 68, + 0x188B: 68, + 0x188C: 68, + 0x188D: 68, + 0x188E: 68, + 0x188F: 68, + 0x1890: 68, + 0x1891: 68, + 0x1892: 68, + 0x1893: 68, + 0x1894: 68, + 0x1895: 68, + 0x1896: 68, + 0x1897: 68, + 0x1898: 68, + 0x1899: 68, + 0x189A: 68, + 0x189B: 68, + 0x189C: 68, + 0x189D: 68, + 0x189E: 68, + 0x189F: 68, + 0x18A0: 68, + 0x18A1: 68, + 0x18A2: 68, + 0x18A3: 68, + 0x18A4: 68, + 0x18A5: 68, + 0x18A6: 68, + 0x18A7: 68, + 0x18A8: 68, + 0x18A9: 84, + 0x18AA: 68, + 0x1920: 84, + 0x1921: 84, + 0x1922: 84, + 0x1927: 84, + 0x1928: 84, + 0x1932: 84, + 0x1939: 84, + 0x193A: 84, + 0x193B: 84, + 0x1A17: 84, + 0x1A18: 84, + 0x1A1B: 84, + 0x1A56: 84, + 0x1A58: 84, + 0x1A59: 84, + 0x1A5A: 84, + 0x1A5B: 84, + 0x1A5C: 84, + 0x1A5D: 84, + 0x1A5E: 84, + 0x1A60: 84, + 0x1A62: 84, + 0x1A65: 84, + 0x1A66: 84, + 0x1A67: 84, + 0x1A68: 84, + 0x1A69: 84, + 0x1A6A: 84, + 0x1A6B: 84, + 0x1A6C: 84, + 0x1A73: 84, + 0x1A74: 84, + 0x1A75: 84, + 0x1A76: 84, + 0x1A77: 84, + 0x1A78: 84, + 0x1A79: 84, + 0x1A7A: 84, + 0x1A7B: 84, + 0x1A7C: 84, + 0x1A7F: 84, + 0x1AB0: 84, + 0x1AB1: 84, + 0x1AB2: 84, + 0x1AB3: 84, + 0x1AB4: 84, + 0x1AB5: 84, + 0x1AB6: 84, + 0x1AB7: 84, + 0x1AB8: 84, + 0x1AB9: 84, + 0x1ABA: 84, + 0x1ABB: 84, + 0x1ABC: 84, + 0x1ABD: 84, + 0x1ABE: 84, + 0x1ABF: 84, + 0x1AC0: 84, + 0x1AC1: 84, + 0x1AC2: 84, + 0x1AC3: 84, + 0x1AC4: 84, + 0x1AC5: 84, + 0x1AC6: 84, + 0x1AC7: 84, + 0x1AC8: 84, + 0x1AC9: 84, + 0x1ACA: 84, + 0x1ACB: 84, + 0x1ACC: 84, + 0x1ACD: 84, + 0x1ACE: 84, + 0x1B00: 84, + 0x1B01: 84, + 0x1B02: 84, + 0x1B03: 84, + 0x1B34: 84, + 0x1B36: 84, + 0x1B37: 84, + 0x1B38: 84, + 0x1B39: 84, + 0x1B3A: 84, + 0x1B3C: 84, + 0x1B42: 84, + 0x1B6B: 84, + 0x1B6C: 84, + 0x1B6D: 84, + 0x1B6E: 84, + 0x1B6F: 84, + 0x1B70: 84, + 0x1B71: 84, + 0x1B72: 84, + 0x1B73: 84, + 0x1B80: 84, + 0x1B81: 84, + 0x1BA2: 84, + 0x1BA3: 84, + 0x1BA4: 84, + 0x1BA5: 84, + 0x1BA8: 84, + 0x1BA9: 84, + 0x1BAB: 84, + 0x1BAC: 84, + 0x1BAD: 84, + 0x1BE6: 84, + 0x1BE8: 84, + 0x1BE9: 84, + 0x1BED: 84, + 0x1BEF: 84, + 0x1BF0: 84, + 0x1BF1: 84, + 0x1C2C: 84, + 0x1C2D: 84, + 0x1C2E: 84, + 0x1C2F: 84, + 0x1C30: 84, + 0x1C31: 84, + 0x1C32: 84, + 0x1C33: 84, + 0x1C36: 84, + 0x1C37: 84, + 0x1CD0: 84, + 0x1CD1: 84, + 0x1CD2: 84, + 0x1CD4: 84, + 0x1CD5: 84, + 0x1CD6: 84, + 0x1CD7: 84, + 0x1CD8: 84, + 0x1CD9: 84, + 0x1CDA: 84, + 0x1CDB: 84, + 0x1CDC: 84, + 0x1CDD: 84, + 0x1CDE: 84, + 0x1CDF: 84, + 0x1CE0: 84, + 0x1CE2: 84, + 0x1CE3: 84, + 0x1CE4: 84, + 0x1CE5: 84, + 0x1CE6: 84, + 0x1CE7: 84, + 0x1CE8: 84, + 0x1CED: 84, + 0x1CF4: 84, + 0x1CF8: 84, + 0x1CF9: 84, + 0x1DC0: 84, + 0x1DC1: 84, + 0x1DC2: 84, + 0x1DC3: 84, + 0x1DC4: 84, + 0x1DC5: 84, + 0x1DC6: 84, + 0x1DC7: 84, + 0x1DC8: 84, + 0x1DC9: 84, + 0x1DCA: 84, + 0x1DCB: 84, + 0x1DCC: 84, + 0x1DCD: 84, + 0x1DCE: 84, + 0x1DCF: 84, + 0x1DD0: 84, + 0x1DD1: 84, + 0x1DD2: 84, + 0x1DD3: 84, + 0x1DD4: 84, + 0x1DD5: 84, + 0x1DD6: 84, + 0x1DD7: 84, + 0x1DD8: 84, + 0x1DD9: 84, + 0x1DDA: 84, + 0x1DDB: 84, + 0x1DDC: 84, + 0x1DDD: 84, + 0x1DDE: 84, + 0x1DDF: 84, + 0x1DE0: 84, + 0x1DE1: 84, + 0x1DE2: 84, + 0x1DE3: 84, + 0x1DE4: 84, + 0x1DE5: 84, + 0x1DE6: 84, + 0x1DE7: 84, + 0x1DE8: 84, + 0x1DE9: 84, + 0x1DEA: 84, + 0x1DEB: 84, + 0x1DEC: 84, + 0x1DED: 84, + 0x1DEE: 84, + 0x1DEF: 84, + 0x1DF0: 84, + 0x1DF1: 84, + 0x1DF2: 84, + 0x1DF3: 84, + 0x1DF4: 84, + 0x1DF5: 84, + 0x1DF6: 84, + 0x1DF7: 84, + 0x1DF8: 84, + 0x1DF9: 84, + 0x1DFA: 84, + 0x1DFB: 84, + 0x1DFC: 84, + 0x1DFD: 84, + 0x1DFE: 84, + 0x1DFF: 84, + 0x200B: 84, + 0x200D: 67, + 0x200E: 84, + 0x200F: 84, + 0x202A: 84, + 0x202B: 84, + 0x202C: 84, + 0x202D: 84, + 0x202E: 84, + 0x2060: 84, + 0x2061: 84, + 0x2062: 84, + 0x2063: 84, + 0x2064: 84, + 0x206A: 84, + 0x206B: 84, + 0x206C: 84, + 0x206D: 84, + 0x206E: 84, + 0x206F: 84, + 0x20D0: 84, + 0x20D1: 84, + 0x20D2: 84, + 0x20D3: 84, + 0x20D4: 84, + 0x20D5: 84, + 0x20D6: 84, + 0x20D7: 84, + 0x20D8: 84, + 0x20D9: 84, + 0x20DA: 84, + 0x20DB: 84, + 0x20DC: 84, + 0x20DD: 84, + 0x20DE: 84, + 0x20DF: 84, + 0x20E0: 84, + 0x20E1: 84, + 0x20E2: 84, + 0x20E3: 84, + 0x20E4: 84, + 0x20E5: 84, + 0x20E6: 84, + 0x20E7: 84, + 0x20E8: 84, + 0x20E9: 84, + 0x20EA: 84, + 0x20EB: 84, + 0x20EC: 84, + 0x20ED: 84, + 0x20EE: 84, + 0x20EF: 84, + 0x20F0: 84, + 0x2CEF: 84, + 0x2CF0: 84, + 0x2CF1: 84, + 0x2D7F: 84, + 0x2DE0: 84, + 0x2DE1: 84, + 0x2DE2: 84, + 0x2DE3: 84, + 0x2DE4: 84, + 0x2DE5: 84, + 0x2DE6: 84, + 0x2DE7: 84, + 0x2DE8: 84, + 0x2DE9: 84, + 0x2DEA: 84, + 0x2DEB: 84, + 0x2DEC: 84, + 0x2DED: 84, + 0x2DEE: 84, + 0x2DEF: 84, + 0x2DF0: 84, + 0x2DF1: 84, + 0x2DF2: 84, + 0x2DF3: 84, + 0x2DF4: 84, + 0x2DF5: 84, + 0x2DF6: 84, + 0x2DF7: 84, + 0x2DF8: 84, + 0x2DF9: 84, + 0x2DFA: 84, + 0x2DFB: 84, + 0x2DFC: 84, + 0x2DFD: 84, + 0x2DFE: 84, + 0x2DFF: 84, + 0x302A: 84, + 0x302B: 84, + 0x302C: 84, + 0x302D: 84, + 0x3099: 84, + 0x309A: 84, + 0xA66F: 84, + 0xA670: 84, + 0xA671: 84, + 0xA672: 84, + 0xA674: 84, + 0xA675: 84, + 0xA676: 84, + 0xA677: 84, + 0xA678: 84, + 0xA679: 84, + 0xA67A: 84, + 0xA67B: 84, + 0xA67C: 84, + 0xA67D: 84, + 0xA69E: 84, + 0xA69F: 84, + 0xA6F0: 84, + 0xA6F1: 84, + 0xA802: 84, + 0xA806: 84, + 0xA80B: 84, + 0xA825: 84, + 0xA826: 84, + 0xA82C: 84, + 0xA840: 68, + 0xA841: 68, + 0xA842: 68, + 0xA843: 68, + 0xA844: 68, + 0xA845: 68, + 0xA846: 68, + 0xA847: 68, + 0xA848: 68, + 0xA849: 68, + 0xA84A: 68, + 0xA84B: 68, + 0xA84C: 68, + 0xA84D: 68, + 0xA84E: 68, + 0xA84F: 68, + 0xA850: 68, + 0xA851: 68, + 0xA852: 68, + 0xA853: 68, + 0xA854: 68, + 0xA855: 68, + 0xA856: 68, + 0xA857: 68, + 0xA858: 68, + 0xA859: 68, + 0xA85A: 68, + 0xA85B: 68, + 0xA85C: 68, + 0xA85D: 68, + 0xA85E: 68, + 0xA85F: 68, + 0xA860: 68, + 0xA861: 68, + 0xA862: 68, + 0xA863: 68, + 0xA864: 68, + 0xA865: 68, + 0xA866: 68, + 0xA867: 68, + 0xA868: 68, + 0xA869: 68, + 0xA86A: 68, + 0xA86B: 68, + 0xA86C: 68, + 0xA86D: 68, + 0xA86E: 68, + 0xA86F: 68, + 0xA870: 68, + 0xA871: 68, + 0xA872: 76, + 0xA8C4: 84, + 0xA8C5: 84, + 0xA8E0: 84, + 0xA8E1: 84, + 0xA8E2: 84, + 0xA8E3: 84, + 0xA8E4: 84, + 0xA8E5: 84, + 0xA8E6: 84, + 0xA8E7: 84, + 0xA8E8: 84, + 0xA8E9: 84, + 0xA8EA: 84, + 0xA8EB: 84, + 0xA8EC: 84, + 0xA8ED: 84, + 0xA8EE: 84, + 0xA8EF: 84, + 0xA8F0: 84, + 0xA8F1: 84, + 0xA8FF: 84, + 0xA926: 84, + 0xA927: 84, + 0xA928: 84, + 0xA929: 84, + 0xA92A: 84, + 0xA92B: 84, + 0xA92C: 84, + 0xA92D: 84, + 0xA947: 84, + 0xA948: 84, + 0xA949: 84, + 0xA94A: 84, + 0xA94B: 84, + 0xA94C: 84, + 0xA94D: 84, + 0xA94E: 84, + 0xA94F: 84, + 0xA950: 84, + 0xA951: 84, + 0xA980: 84, + 0xA981: 84, + 0xA982: 84, + 0xA9B3: 84, + 0xA9B6: 84, + 0xA9B7: 84, + 0xA9B8: 84, + 0xA9B9: 84, + 0xA9BC: 84, + 0xA9BD: 84, + 0xA9E5: 84, + 0xAA29: 84, + 0xAA2A: 84, + 0xAA2B: 84, + 0xAA2C: 84, + 0xAA2D: 84, + 0xAA2E: 84, + 0xAA31: 84, + 0xAA32: 84, + 0xAA35: 84, + 0xAA36: 84, + 0xAA43: 84, + 0xAA4C: 84, + 0xAA7C: 84, + 0xAAB0: 84, + 0xAAB2: 84, + 0xAAB3: 84, + 0xAAB4: 84, + 0xAAB7: 84, + 0xAAB8: 84, + 0xAABE: 84, + 0xAABF: 84, + 0xAAC1: 84, + 0xAAEC: 84, + 0xAAED: 84, + 0xAAF6: 84, + 0xABE5: 84, + 0xABE8: 84, + 0xABED: 84, + 0xFB1E: 84, + 0xFE00: 84, + 0xFE01: 84, + 0xFE02: 84, + 0xFE03: 84, + 0xFE04: 84, + 0xFE05: 84, + 0xFE06: 84, + 0xFE07: 84, + 0xFE08: 84, + 0xFE09: 84, + 0xFE0A: 84, + 0xFE0B: 84, + 0xFE0C: 84, + 0xFE0D: 84, + 0xFE0E: 84, + 0xFE0F: 84, + 0xFE20: 84, + 0xFE21: 84, + 0xFE22: 84, + 0xFE23: 84, + 0xFE24: 84, + 0xFE25: 84, + 0xFE26: 84, + 0xFE27: 84, + 0xFE28: 84, + 0xFE29: 84, + 0xFE2A: 84, + 0xFE2B: 84, + 0xFE2C: 84, + 0xFE2D: 84, + 0xFE2E: 84, + 0xFE2F: 84, + 0xFEFF: 84, + 0xFFF9: 84, + 0xFFFA: 84, + 0xFFFB: 84, + 0x101FD: 84, + 0x102E0: 84, + 0x10376: 84, + 0x10377: 84, + 0x10378: 84, + 0x10379: 84, + 0x1037A: 84, + 0x10A01: 84, + 0x10A02: 84, + 0x10A03: 84, + 0x10A05: 84, + 0x10A06: 84, + 0x10A0C: 84, + 0x10A0D: 84, + 0x10A0E: 84, + 0x10A0F: 84, + 0x10A38: 84, + 0x10A39: 84, + 0x10A3A: 84, + 0x10A3F: 84, + 0x10AC0: 68, + 0x10AC1: 68, + 0x10AC2: 68, + 0x10AC3: 68, + 0x10AC4: 68, + 0x10AC5: 82, + 0x10AC7: 82, + 0x10AC9: 82, + 0x10ACA: 82, + 0x10ACD: 76, + 0x10ACE: 82, + 0x10ACF: 82, + 0x10AD0: 82, + 0x10AD1: 82, + 0x10AD2: 82, + 0x10AD3: 68, + 0x10AD4: 68, + 0x10AD5: 68, + 0x10AD6: 68, + 0x10AD7: 76, + 0x10AD8: 68, + 0x10AD9: 68, + 0x10ADA: 68, + 0x10ADB: 68, + 0x10ADC: 68, + 0x10ADD: 82, + 0x10ADE: 68, + 0x10ADF: 68, + 0x10AE0: 68, + 0x10AE1: 82, + 0x10AE4: 82, + 0x10AE5: 84, + 0x10AE6: 84, + 0x10AEB: 68, + 0x10AEC: 68, + 0x10AED: 68, + 0x10AEE: 68, + 0x10AEF: 82, + 0x10B80: 68, + 0x10B81: 82, + 0x10B82: 68, + 0x10B83: 82, + 0x10B84: 82, + 0x10B85: 82, + 0x10B86: 68, + 0x10B87: 68, + 0x10B88: 68, + 0x10B89: 82, + 0x10B8A: 68, + 0x10B8B: 68, + 0x10B8C: 82, + 0x10B8D: 68, + 0x10B8E: 82, + 0x10B8F: 82, + 0x10B90: 68, + 0x10B91: 82, + 0x10BA9: 82, + 0x10BAA: 82, + 0x10BAB: 82, + 0x10BAC: 82, + 0x10BAD: 68, + 0x10BAE: 68, + 0x10D00: 76, + 0x10D01: 68, + 0x10D02: 68, + 0x10D03: 68, + 0x10D04: 68, + 0x10D05: 68, + 0x10D06: 68, + 0x10D07: 68, + 0x10D08: 68, + 0x10D09: 68, + 0x10D0A: 68, + 0x10D0B: 68, + 0x10D0C: 68, + 0x10D0D: 68, + 0x10D0E: 68, + 0x10D0F: 68, + 0x10D10: 68, + 0x10D11: 68, + 0x10D12: 68, + 0x10D13: 68, + 0x10D14: 68, + 0x10D15: 68, + 0x10D16: 68, + 0x10D17: 68, + 0x10D18: 68, + 0x10D19: 68, + 0x10D1A: 68, + 0x10D1B: 68, + 0x10D1C: 68, + 0x10D1D: 68, + 0x10D1E: 68, + 0x10D1F: 68, + 0x10D20: 68, + 0x10D21: 68, + 0x10D22: 82, + 0x10D23: 68, + 0x10D24: 84, + 0x10D25: 84, + 0x10D26: 84, + 0x10D27: 84, + 0x10D69: 84, + 0x10D6A: 84, + 0x10D6B: 84, + 0x10D6C: 84, + 0x10D6D: 84, + 0x10EAB: 84, + 0x10EAC: 84, + 0x10EC2: 82, + 0x10EC3: 68, + 0x10EC4: 68, + 0x10EFC: 84, + 0x10EFD: 84, + 0x10EFE: 84, + 0x10EFF: 84, + 0x10F30: 68, + 0x10F31: 68, + 0x10F32: 68, + 0x10F33: 82, + 0x10F34: 68, + 0x10F35: 68, + 0x10F36: 68, + 0x10F37: 68, + 0x10F38: 68, + 0x10F39: 68, + 0x10F3A: 68, + 0x10F3B: 68, + 0x10F3C: 68, + 0x10F3D: 68, + 0x10F3E: 68, + 0x10F3F: 68, + 0x10F40: 68, + 0x10F41: 68, + 0x10F42: 68, + 0x10F43: 68, + 0x10F44: 68, + 0x10F46: 84, + 0x10F47: 84, + 0x10F48: 84, + 0x10F49: 84, + 0x10F4A: 84, + 0x10F4B: 84, + 0x10F4C: 84, + 0x10F4D: 84, + 0x10F4E: 84, + 0x10F4F: 84, + 0x10F50: 84, + 0x10F51: 68, + 0x10F52: 68, + 0x10F53: 68, + 0x10F54: 82, + 0x10F70: 68, + 0x10F71: 68, + 0x10F72: 68, + 0x10F73: 68, + 0x10F74: 82, + 0x10F75: 82, + 0x10F76: 68, + 0x10F77: 68, + 0x10F78: 68, + 0x10F79: 68, + 0x10F7A: 68, + 0x10F7B: 68, + 0x10F7C: 68, + 0x10F7D: 68, + 0x10F7E: 68, + 0x10F7F: 68, + 0x10F80: 68, + 0x10F81: 68, + 0x10F82: 84, + 0x10F83: 84, + 0x10F84: 84, + 0x10F85: 84, + 0x10FB0: 68, + 0x10FB2: 68, + 0x10FB3: 68, + 0x10FB4: 82, + 0x10FB5: 82, + 0x10FB6: 82, + 0x10FB8: 68, + 0x10FB9: 82, + 0x10FBA: 82, + 0x10FBB: 68, + 0x10FBC: 68, + 0x10FBD: 82, + 0x10FBE: 68, + 0x10FBF: 68, + 0x10FC1: 68, + 0x10FC2: 82, + 0x10FC3: 82, + 0x10FC4: 68, + 0x10FC9: 82, + 0x10FCA: 68, + 0x10FCB: 76, + 0x11001: 84, + 0x11038: 84, + 0x11039: 84, + 0x1103A: 84, + 0x1103B: 84, + 0x1103C: 84, + 0x1103D: 84, + 0x1103E: 84, + 0x1103F: 84, + 0x11040: 84, + 0x11041: 84, + 0x11042: 84, + 0x11043: 84, + 0x11044: 84, + 0x11045: 84, + 0x11046: 84, + 0x11070: 84, + 0x11073: 84, + 0x11074: 84, + 0x1107F: 84, + 0x11080: 84, + 0x11081: 84, + 0x110B3: 84, + 0x110B4: 84, + 0x110B5: 84, + 0x110B6: 84, + 0x110B9: 84, + 0x110BA: 84, + 0x110C2: 84, + 0x11100: 84, + 0x11101: 84, + 0x11102: 84, + 0x11127: 84, + 0x11128: 84, + 0x11129: 84, + 0x1112A: 84, + 0x1112B: 84, + 0x1112D: 84, + 0x1112E: 84, + 0x1112F: 84, + 0x11130: 84, + 0x11131: 84, + 0x11132: 84, + 0x11133: 84, + 0x11134: 84, + 0x11173: 84, + 0x11180: 84, + 0x11181: 84, + 0x111B6: 84, + 0x111B7: 84, + 0x111B8: 84, + 0x111B9: 84, + 0x111BA: 84, + 0x111BB: 84, + 0x111BC: 84, + 0x111BD: 84, + 0x111BE: 84, + 0x111C9: 84, + 0x111CA: 84, + 0x111CB: 84, + 0x111CC: 84, + 0x111CF: 84, + 0x1122F: 84, + 0x11230: 84, + 0x11231: 84, + 0x11234: 84, + 0x11236: 84, + 0x11237: 84, + 0x1123E: 84, + 0x11241: 84, + 0x112DF: 84, + 0x112E3: 84, + 0x112E4: 84, + 0x112E5: 84, + 0x112E6: 84, + 0x112E7: 84, + 0x112E8: 84, + 0x112E9: 84, + 0x112EA: 84, + 0x11300: 84, + 0x11301: 84, + 0x1133B: 84, + 0x1133C: 84, + 0x11340: 84, + 0x11366: 84, + 0x11367: 84, + 0x11368: 84, + 0x11369: 84, + 0x1136A: 84, + 0x1136B: 84, + 0x1136C: 84, + 0x11370: 84, + 0x11371: 84, + 0x11372: 84, + 0x11373: 84, + 0x11374: 84, + 0x113BB: 84, + 0x113BC: 84, + 0x113BD: 84, + 0x113BE: 84, + 0x113BF: 84, + 0x113C0: 84, + 0x113CE: 84, + 0x113D0: 84, + 0x113D2: 84, + 0x113E1: 84, + 0x113E2: 84, + 0x11438: 84, + 0x11439: 84, + 0x1143A: 84, + 0x1143B: 84, + 0x1143C: 84, + 0x1143D: 84, + 0x1143E: 84, + 0x1143F: 84, + 0x11442: 84, + 0x11443: 84, + 0x11444: 84, + 0x11446: 84, + 0x1145E: 84, + 0x114B3: 84, + 0x114B4: 84, + 0x114B5: 84, + 0x114B6: 84, + 0x114B7: 84, + 0x114B8: 84, + 0x114BA: 84, + 0x114BF: 84, + 0x114C0: 84, + 0x114C2: 84, + 0x114C3: 84, + 0x115B2: 84, + 0x115B3: 84, + 0x115B4: 84, + 0x115B5: 84, + 0x115BC: 84, + 0x115BD: 84, + 0x115BF: 84, + 0x115C0: 84, + 0x115DC: 84, + 0x115DD: 84, + 0x11633: 84, + 0x11634: 84, + 0x11635: 84, + 0x11636: 84, + 0x11637: 84, + 0x11638: 84, + 0x11639: 84, + 0x1163A: 84, + 0x1163D: 84, + 0x1163F: 84, + 0x11640: 84, + 0x116AB: 84, + 0x116AD: 84, + 0x116B0: 84, + 0x116B1: 84, + 0x116B2: 84, + 0x116B3: 84, + 0x116B4: 84, + 0x116B5: 84, + 0x116B7: 84, + 0x1171D: 84, + 0x1171F: 84, + 0x11722: 84, + 0x11723: 84, + 0x11724: 84, + 0x11725: 84, + 0x11727: 84, + 0x11728: 84, + 0x11729: 84, + 0x1172A: 84, + 0x1172B: 84, + 0x1182F: 84, + 0x11830: 84, + 0x11831: 84, + 0x11832: 84, + 0x11833: 84, + 0x11834: 84, + 0x11835: 84, + 0x11836: 84, + 0x11837: 84, + 0x11839: 84, + 0x1183A: 84, + 0x1193B: 84, + 0x1193C: 84, + 0x1193E: 84, + 0x11943: 84, + 0x119D4: 84, + 0x119D5: 84, + 0x119D6: 84, + 0x119D7: 84, + 0x119DA: 84, + 0x119DB: 84, + 0x119E0: 84, + 0x11A01: 84, + 0x11A02: 84, + 0x11A03: 84, + 0x11A04: 84, + 0x11A05: 84, + 0x11A06: 84, + 0x11A07: 84, + 0x11A08: 84, + 0x11A09: 84, + 0x11A0A: 84, + 0x11A33: 84, + 0x11A34: 84, + 0x11A35: 84, + 0x11A36: 84, + 0x11A37: 84, + 0x11A38: 84, + 0x11A3B: 84, + 0x11A3C: 84, + 0x11A3D: 84, + 0x11A3E: 84, + 0x11A47: 84, + 0x11A51: 84, + 0x11A52: 84, + 0x11A53: 84, + 0x11A54: 84, + 0x11A55: 84, + 0x11A56: 84, + 0x11A59: 84, + 0x11A5A: 84, + 0x11A5B: 84, + 0x11A8A: 84, + 0x11A8B: 84, + 0x11A8C: 84, + 0x11A8D: 84, + 0x11A8E: 84, + 0x11A8F: 84, + 0x11A90: 84, + 0x11A91: 84, + 0x11A92: 84, + 0x11A93: 84, + 0x11A94: 84, + 0x11A95: 84, + 0x11A96: 84, + 0x11A98: 84, + 0x11A99: 84, + 0x11C30: 84, + 0x11C31: 84, + 0x11C32: 84, + 0x11C33: 84, + 0x11C34: 84, + 0x11C35: 84, + 0x11C36: 84, + 0x11C38: 84, + 0x11C39: 84, + 0x11C3A: 84, + 0x11C3B: 84, + 0x11C3C: 84, + 0x11C3D: 84, + 0x11C3F: 84, + 0x11C92: 84, + 0x11C93: 84, + 0x11C94: 84, + 0x11C95: 84, + 0x11C96: 84, + 0x11C97: 84, + 0x11C98: 84, + 0x11C99: 84, + 0x11C9A: 84, + 0x11C9B: 84, + 0x11C9C: 84, + 0x11C9D: 84, + 0x11C9E: 84, + 0x11C9F: 84, + 0x11CA0: 84, + 0x11CA1: 84, + 0x11CA2: 84, + 0x11CA3: 84, + 0x11CA4: 84, + 0x11CA5: 84, + 0x11CA6: 84, + 0x11CA7: 84, + 0x11CAA: 84, + 0x11CAB: 84, + 0x11CAC: 84, + 0x11CAD: 84, + 0x11CAE: 84, + 0x11CAF: 84, + 0x11CB0: 84, + 0x11CB2: 84, + 0x11CB3: 84, + 0x11CB5: 84, + 0x11CB6: 84, + 0x11D31: 84, + 0x11D32: 84, + 0x11D33: 84, + 0x11D34: 84, + 0x11D35: 84, + 0x11D36: 84, + 0x11D3A: 84, + 0x11D3C: 84, + 0x11D3D: 84, + 0x11D3F: 84, + 0x11D40: 84, + 0x11D41: 84, + 0x11D42: 84, + 0x11D43: 84, + 0x11D44: 84, + 0x11D45: 84, + 0x11D47: 84, + 0x11D90: 84, + 0x11D91: 84, + 0x11D95: 84, + 0x11D97: 84, + 0x11EF3: 84, + 0x11EF4: 84, + 0x11F00: 84, + 0x11F01: 84, + 0x11F36: 84, + 0x11F37: 84, + 0x11F38: 84, + 0x11F39: 84, + 0x11F3A: 84, + 0x11F40: 84, + 0x11F42: 84, + 0x11F5A: 84, + 0x13430: 84, + 0x13431: 84, + 0x13432: 84, + 0x13433: 84, + 0x13434: 84, + 0x13435: 84, + 0x13436: 84, + 0x13437: 84, + 0x13438: 84, + 0x13439: 84, + 0x1343A: 84, + 0x1343B: 84, + 0x1343C: 84, + 0x1343D: 84, + 0x1343E: 84, + 0x1343F: 84, + 0x13440: 84, + 0x13447: 84, + 0x13448: 84, + 0x13449: 84, + 0x1344A: 84, + 0x1344B: 84, + 0x1344C: 84, + 0x1344D: 84, + 0x1344E: 84, + 0x1344F: 84, + 0x13450: 84, + 0x13451: 84, + 0x13452: 84, + 0x13453: 84, + 0x13454: 84, + 0x13455: 84, + 0x1611E: 84, + 0x1611F: 84, + 0x16120: 84, + 0x16121: 84, + 0x16122: 84, + 0x16123: 84, + 0x16124: 84, + 0x16125: 84, + 0x16126: 84, + 0x16127: 84, + 0x16128: 84, + 0x16129: 84, + 0x1612D: 84, + 0x1612E: 84, + 0x1612F: 84, + 0x16AF0: 84, + 0x16AF1: 84, + 0x16AF2: 84, + 0x16AF3: 84, + 0x16AF4: 84, + 0x16B30: 84, + 0x16B31: 84, + 0x16B32: 84, + 0x16B33: 84, + 0x16B34: 84, + 0x16B35: 84, + 0x16B36: 84, + 0x16F4F: 84, + 0x16F8F: 84, + 0x16F90: 84, + 0x16F91: 84, + 0x16F92: 84, + 0x16FE4: 84, + 0x1BC9D: 84, + 0x1BC9E: 84, + 0x1BCA0: 84, + 0x1BCA1: 84, + 0x1BCA2: 84, + 0x1BCA3: 84, + 0x1CF00: 84, + 0x1CF01: 84, + 0x1CF02: 84, + 0x1CF03: 84, + 0x1CF04: 84, + 0x1CF05: 84, + 0x1CF06: 84, + 0x1CF07: 84, + 0x1CF08: 84, + 0x1CF09: 84, + 0x1CF0A: 84, + 0x1CF0B: 84, + 0x1CF0C: 84, + 0x1CF0D: 84, + 0x1CF0E: 84, + 0x1CF0F: 84, + 0x1CF10: 84, + 0x1CF11: 84, + 0x1CF12: 84, + 0x1CF13: 84, + 0x1CF14: 84, + 0x1CF15: 84, + 0x1CF16: 84, + 0x1CF17: 84, + 0x1CF18: 84, + 0x1CF19: 84, + 0x1CF1A: 84, + 0x1CF1B: 84, + 0x1CF1C: 84, + 0x1CF1D: 84, + 0x1CF1E: 84, + 0x1CF1F: 84, + 0x1CF20: 84, + 0x1CF21: 84, + 0x1CF22: 84, + 0x1CF23: 84, + 0x1CF24: 84, + 0x1CF25: 84, + 0x1CF26: 84, + 0x1CF27: 84, + 0x1CF28: 84, + 0x1CF29: 84, + 0x1CF2A: 84, + 0x1CF2B: 84, + 0x1CF2C: 84, + 0x1CF2D: 84, + 0x1CF30: 84, + 0x1CF31: 84, + 0x1CF32: 84, + 0x1CF33: 84, + 0x1CF34: 84, + 0x1CF35: 84, + 0x1CF36: 84, + 0x1CF37: 84, + 0x1CF38: 84, + 0x1CF39: 84, + 0x1CF3A: 84, + 0x1CF3B: 84, + 0x1CF3C: 84, + 0x1CF3D: 84, + 0x1CF3E: 84, + 0x1CF3F: 84, + 0x1CF40: 84, + 0x1CF41: 84, + 0x1CF42: 84, + 0x1CF43: 84, + 0x1CF44: 84, + 0x1CF45: 84, + 0x1CF46: 84, + 0x1D167: 84, + 0x1D168: 84, + 0x1D169: 84, + 0x1D173: 84, + 0x1D174: 84, + 0x1D175: 84, + 0x1D176: 84, + 0x1D177: 84, + 0x1D178: 84, + 0x1D179: 84, + 0x1D17A: 84, + 0x1D17B: 84, + 0x1D17C: 84, + 0x1D17D: 84, + 0x1D17E: 84, + 0x1D17F: 84, + 0x1D180: 84, + 0x1D181: 84, + 0x1D182: 84, + 0x1D185: 84, + 0x1D186: 84, + 0x1D187: 84, + 0x1D188: 84, + 0x1D189: 84, + 0x1D18A: 84, + 0x1D18B: 84, + 0x1D1AA: 84, + 0x1D1AB: 84, + 0x1D1AC: 84, + 0x1D1AD: 84, + 0x1D242: 84, + 0x1D243: 84, + 0x1D244: 84, + 0x1DA00: 84, + 0x1DA01: 84, + 0x1DA02: 84, + 0x1DA03: 84, + 0x1DA04: 84, + 0x1DA05: 84, + 0x1DA06: 84, + 0x1DA07: 84, + 0x1DA08: 84, + 0x1DA09: 84, + 0x1DA0A: 84, + 0x1DA0B: 84, + 0x1DA0C: 84, + 0x1DA0D: 84, + 0x1DA0E: 84, + 0x1DA0F: 84, + 0x1DA10: 84, + 0x1DA11: 84, + 0x1DA12: 84, + 0x1DA13: 84, + 0x1DA14: 84, + 0x1DA15: 84, + 0x1DA16: 84, + 0x1DA17: 84, + 0x1DA18: 84, + 0x1DA19: 84, + 0x1DA1A: 84, + 0x1DA1B: 84, + 0x1DA1C: 84, + 0x1DA1D: 84, + 0x1DA1E: 84, + 0x1DA1F: 84, + 0x1DA20: 84, + 0x1DA21: 84, + 0x1DA22: 84, + 0x1DA23: 84, + 0x1DA24: 84, + 0x1DA25: 84, + 0x1DA26: 84, + 0x1DA27: 84, + 0x1DA28: 84, + 0x1DA29: 84, + 0x1DA2A: 84, + 0x1DA2B: 84, + 0x1DA2C: 84, + 0x1DA2D: 84, + 0x1DA2E: 84, + 0x1DA2F: 84, + 0x1DA30: 84, + 0x1DA31: 84, + 0x1DA32: 84, + 0x1DA33: 84, + 0x1DA34: 84, + 0x1DA35: 84, + 0x1DA36: 84, + 0x1DA3B: 84, + 0x1DA3C: 84, + 0x1DA3D: 84, + 0x1DA3E: 84, + 0x1DA3F: 84, + 0x1DA40: 84, + 0x1DA41: 84, + 0x1DA42: 84, + 0x1DA43: 84, + 0x1DA44: 84, + 0x1DA45: 84, + 0x1DA46: 84, + 0x1DA47: 84, + 0x1DA48: 84, + 0x1DA49: 84, + 0x1DA4A: 84, + 0x1DA4B: 84, + 0x1DA4C: 84, + 0x1DA4D: 84, + 0x1DA4E: 84, + 0x1DA4F: 84, + 0x1DA50: 84, + 0x1DA51: 84, + 0x1DA52: 84, + 0x1DA53: 84, + 0x1DA54: 84, + 0x1DA55: 84, + 0x1DA56: 84, + 0x1DA57: 84, + 0x1DA58: 84, + 0x1DA59: 84, + 0x1DA5A: 84, + 0x1DA5B: 84, + 0x1DA5C: 84, + 0x1DA5D: 84, + 0x1DA5E: 84, + 0x1DA5F: 84, + 0x1DA60: 84, + 0x1DA61: 84, + 0x1DA62: 84, + 0x1DA63: 84, + 0x1DA64: 84, + 0x1DA65: 84, + 0x1DA66: 84, + 0x1DA67: 84, + 0x1DA68: 84, + 0x1DA69: 84, + 0x1DA6A: 84, + 0x1DA6B: 84, + 0x1DA6C: 84, + 0x1DA75: 84, + 0x1DA84: 84, + 0x1DA9B: 84, + 0x1DA9C: 84, + 0x1DA9D: 84, + 0x1DA9E: 84, + 0x1DA9F: 84, + 0x1DAA1: 84, + 0x1DAA2: 84, + 0x1DAA3: 84, + 0x1DAA4: 84, + 0x1DAA5: 84, + 0x1DAA6: 84, + 0x1DAA7: 84, + 0x1DAA8: 84, + 0x1DAA9: 84, + 0x1DAAA: 84, + 0x1DAAB: 84, + 0x1DAAC: 84, + 0x1DAAD: 84, + 0x1DAAE: 84, + 0x1DAAF: 84, + 0x1E000: 84, + 0x1E001: 84, + 0x1E002: 84, + 0x1E003: 84, + 0x1E004: 84, + 0x1E005: 84, + 0x1E006: 84, + 0x1E008: 84, + 0x1E009: 84, + 0x1E00A: 84, + 0x1E00B: 84, + 0x1E00C: 84, + 0x1E00D: 84, + 0x1E00E: 84, + 0x1E00F: 84, + 0x1E010: 84, + 0x1E011: 84, + 0x1E012: 84, + 0x1E013: 84, + 0x1E014: 84, + 0x1E015: 84, + 0x1E016: 84, + 0x1E017: 84, + 0x1E018: 84, + 0x1E01B: 84, + 0x1E01C: 84, + 0x1E01D: 84, + 0x1E01E: 84, + 0x1E01F: 84, + 0x1E020: 84, + 0x1E021: 84, + 0x1E023: 84, + 0x1E024: 84, + 0x1E026: 84, + 0x1E027: 84, + 0x1E028: 84, + 0x1E029: 84, + 0x1E02A: 84, + 0x1E08F: 84, + 0x1E130: 84, + 0x1E131: 84, + 0x1E132: 84, + 0x1E133: 84, + 0x1E134: 84, + 0x1E135: 84, + 0x1E136: 84, + 0x1E2AE: 84, + 0x1E2EC: 84, + 0x1E2ED: 84, + 0x1E2EE: 84, + 0x1E2EF: 84, + 0x1E4EC: 84, + 0x1E4ED: 84, + 0x1E4EE: 84, + 0x1E4EF: 84, + 0x1E5EE: 84, + 0x1E5EF: 84, + 0x1E8D0: 84, + 0x1E8D1: 84, + 0x1E8D2: 84, + 0x1E8D3: 84, + 0x1E8D4: 84, + 0x1E8D5: 84, + 0x1E8D6: 84, + 0x1E900: 68, + 0x1E901: 68, + 0x1E902: 68, + 0x1E903: 68, + 0x1E904: 68, + 0x1E905: 68, + 0x1E906: 68, + 0x1E907: 68, + 0x1E908: 68, + 0x1E909: 68, + 0x1E90A: 68, + 0x1E90B: 68, + 0x1E90C: 68, + 0x1E90D: 68, + 0x1E90E: 68, + 0x1E90F: 68, + 0x1E910: 68, + 0x1E911: 68, + 0x1E912: 68, + 0x1E913: 68, + 0x1E914: 68, + 0x1E915: 68, + 0x1E916: 68, + 0x1E917: 68, + 0x1E918: 68, + 0x1E919: 68, + 0x1E91A: 68, + 0x1E91B: 68, + 0x1E91C: 68, + 0x1E91D: 68, + 0x1E91E: 68, + 0x1E91F: 68, + 0x1E920: 68, + 0x1E921: 68, + 0x1E922: 68, + 0x1E923: 68, + 0x1E924: 68, + 0x1E925: 68, + 0x1E926: 68, + 0x1E927: 68, + 0x1E928: 68, + 0x1E929: 68, + 0x1E92A: 68, + 0x1E92B: 68, + 0x1E92C: 68, + 0x1E92D: 68, + 0x1E92E: 68, + 0x1E92F: 68, + 0x1E930: 68, + 0x1E931: 68, + 0x1E932: 68, + 0x1E933: 68, + 0x1E934: 68, + 0x1E935: 68, + 0x1E936: 68, + 0x1E937: 68, + 0x1E938: 68, + 0x1E939: 68, + 0x1E93A: 68, + 0x1E93B: 68, + 0x1E93C: 68, + 0x1E93D: 68, + 0x1E93E: 68, + 0x1E93F: 68, + 0x1E940: 68, + 0x1E941: 68, + 0x1E942: 68, + 0x1E943: 68, + 0x1E944: 84, + 0x1E945: 84, + 0x1E946: 84, + 0x1E947: 84, + 0x1E948: 84, + 0x1E949: 84, + 0x1E94A: 84, + 0x1E94B: 84, + 0xE0001: 84, + 0xE0020: 84, + 0xE0021: 84, + 0xE0022: 84, + 0xE0023: 84, + 0xE0024: 84, + 0xE0025: 84, + 0xE0026: 84, + 0xE0027: 84, + 0xE0028: 84, + 0xE0029: 84, + 0xE002A: 84, + 0xE002B: 84, + 0xE002C: 84, + 0xE002D: 84, + 0xE002E: 84, + 0xE002F: 84, + 0xE0030: 84, + 0xE0031: 84, + 0xE0032: 84, + 0xE0033: 84, + 0xE0034: 84, + 0xE0035: 84, + 0xE0036: 84, + 0xE0037: 84, + 0xE0038: 84, + 0xE0039: 84, + 0xE003A: 84, + 0xE003B: 84, + 0xE003C: 84, + 0xE003D: 84, + 0xE003E: 84, + 0xE003F: 84, + 0xE0040: 84, + 0xE0041: 84, + 0xE0042: 84, + 0xE0043: 84, + 0xE0044: 84, + 0xE0045: 84, + 0xE0046: 84, + 0xE0047: 84, + 0xE0048: 84, + 0xE0049: 84, + 0xE004A: 84, + 0xE004B: 84, + 0xE004C: 84, + 0xE004D: 84, + 0xE004E: 84, + 0xE004F: 84, + 0xE0050: 84, + 0xE0051: 84, + 0xE0052: 84, + 0xE0053: 84, + 0xE0054: 84, + 0xE0055: 84, + 0xE0056: 84, + 0xE0057: 84, + 0xE0058: 84, + 0xE0059: 84, + 0xE005A: 84, + 0xE005B: 84, + 0xE005C: 84, + 0xE005D: 84, + 0xE005E: 84, + 0xE005F: 84, + 0xE0060: 84, + 0xE0061: 84, + 0xE0062: 84, + 0xE0063: 84, + 0xE0064: 84, + 0xE0065: 84, + 0xE0066: 84, + 0xE0067: 84, + 0xE0068: 84, + 0xE0069: 84, + 0xE006A: 84, + 0xE006B: 84, + 0xE006C: 84, + 0xE006D: 84, + 0xE006E: 84, + 0xE006F: 84, + 0xE0070: 84, + 0xE0071: 84, + 0xE0072: 84, + 0xE0073: 84, + 0xE0074: 84, + 0xE0075: 84, + 0xE0076: 84, + 0xE0077: 84, + 0xE0078: 84, + 0xE0079: 84, + 0xE007A: 84, + 0xE007B: 84, + 0xE007C: 84, + 0xE007D: 84, + 0xE007E: 84, + 0xE007F: 84, + 0xE0100: 84, + 0xE0101: 84, + 0xE0102: 84, + 0xE0103: 84, + 0xE0104: 84, + 0xE0105: 84, + 0xE0106: 84, + 0xE0107: 84, + 0xE0108: 84, + 0xE0109: 84, + 0xE010A: 84, + 0xE010B: 84, + 0xE010C: 84, + 0xE010D: 84, + 0xE010E: 84, + 0xE010F: 84, + 0xE0110: 84, + 0xE0111: 84, + 0xE0112: 84, + 0xE0113: 84, + 0xE0114: 84, + 0xE0115: 84, + 0xE0116: 84, + 0xE0117: 84, + 0xE0118: 84, + 0xE0119: 84, + 0xE011A: 84, + 0xE011B: 84, + 0xE011C: 84, + 0xE011D: 84, + 0xE011E: 84, + 0xE011F: 84, + 0xE0120: 84, + 0xE0121: 84, + 0xE0122: 84, + 0xE0123: 84, + 0xE0124: 84, + 0xE0125: 84, + 0xE0126: 84, + 0xE0127: 84, + 0xE0128: 84, + 0xE0129: 84, + 0xE012A: 84, + 0xE012B: 84, + 0xE012C: 84, + 0xE012D: 84, + 0xE012E: 84, + 0xE012F: 84, + 0xE0130: 84, + 0xE0131: 84, + 0xE0132: 84, + 0xE0133: 84, + 0xE0134: 84, + 0xE0135: 84, + 0xE0136: 84, + 0xE0137: 84, + 0xE0138: 84, + 0xE0139: 84, + 0xE013A: 84, + 0xE013B: 84, + 0xE013C: 84, + 0xE013D: 84, + 0xE013E: 84, + 0xE013F: 84, + 0xE0140: 84, + 0xE0141: 84, + 0xE0142: 84, + 0xE0143: 84, + 0xE0144: 84, + 0xE0145: 84, + 0xE0146: 84, + 0xE0147: 84, + 0xE0148: 84, + 0xE0149: 84, + 0xE014A: 84, + 0xE014B: 84, + 0xE014C: 84, + 0xE014D: 84, + 0xE014E: 84, + 0xE014F: 84, + 0xE0150: 84, + 0xE0151: 84, + 0xE0152: 84, + 0xE0153: 84, + 0xE0154: 84, + 0xE0155: 84, + 0xE0156: 84, + 0xE0157: 84, + 0xE0158: 84, + 0xE0159: 84, + 0xE015A: 84, + 0xE015B: 84, + 0xE015C: 84, + 0xE015D: 84, + 0xE015E: 84, + 0xE015F: 84, + 0xE0160: 84, + 0xE0161: 84, + 0xE0162: 84, + 0xE0163: 84, + 0xE0164: 84, + 0xE0165: 84, + 0xE0166: 84, + 0xE0167: 84, + 0xE0168: 84, + 0xE0169: 84, + 0xE016A: 84, + 0xE016B: 84, + 0xE016C: 84, + 0xE016D: 84, + 0xE016E: 84, + 0xE016F: 84, + 0xE0170: 84, + 0xE0171: 84, + 0xE0172: 84, + 0xE0173: 84, + 0xE0174: 84, + 0xE0175: 84, + 0xE0176: 84, + 0xE0177: 84, + 0xE0178: 84, + 0xE0179: 84, + 0xE017A: 84, + 0xE017B: 84, + 0xE017C: 84, + 0xE017D: 84, + 0xE017E: 84, + 0xE017F: 84, + 0xE0180: 84, + 0xE0181: 84, + 0xE0182: 84, + 0xE0183: 84, + 0xE0184: 84, + 0xE0185: 84, + 0xE0186: 84, + 0xE0187: 84, + 0xE0188: 84, + 0xE0189: 84, + 0xE018A: 84, + 0xE018B: 84, + 0xE018C: 84, + 0xE018D: 84, + 0xE018E: 84, + 0xE018F: 84, + 0xE0190: 84, + 0xE0191: 84, + 0xE0192: 84, + 0xE0193: 84, + 0xE0194: 84, + 0xE0195: 84, + 0xE0196: 84, + 0xE0197: 84, + 0xE0198: 84, + 0xE0199: 84, + 0xE019A: 84, + 0xE019B: 84, + 0xE019C: 84, + 0xE019D: 84, + 0xE019E: 84, + 0xE019F: 84, + 0xE01A0: 84, + 0xE01A1: 84, + 0xE01A2: 84, + 0xE01A3: 84, + 0xE01A4: 84, + 0xE01A5: 84, + 0xE01A6: 84, + 0xE01A7: 84, + 0xE01A8: 84, + 0xE01A9: 84, + 0xE01AA: 84, + 0xE01AB: 84, + 0xE01AC: 84, + 0xE01AD: 84, + 0xE01AE: 84, + 0xE01AF: 84, + 0xE01B0: 84, + 0xE01B1: 84, + 0xE01B2: 84, + 0xE01B3: 84, + 0xE01B4: 84, + 0xE01B5: 84, + 0xE01B6: 84, + 0xE01B7: 84, + 0xE01B8: 84, + 0xE01B9: 84, + 0xE01BA: 84, + 0xE01BB: 84, + 0xE01BC: 84, + 0xE01BD: 84, + 0xE01BE: 84, + 0xE01BF: 84, + 0xE01C0: 84, + 0xE01C1: 84, + 0xE01C2: 84, + 0xE01C3: 84, + 0xE01C4: 84, + 0xE01C5: 84, + 0xE01C6: 84, + 0xE01C7: 84, + 0xE01C8: 84, + 0xE01C9: 84, + 0xE01CA: 84, + 0xE01CB: 84, + 0xE01CC: 84, + 0xE01CD: 84, + 0xE01CE: 84, + 0xE01CF: 84, + 0xE01D0: 84, + 0xE01D1: 84, + 0xE01D2: 84, + 0xE01D3: 84, + 0xE01D4: 84, + 0xE01D5: 84, + 0xE01D6: 84, + 0xE01D7: 84, + 0xE01D8: 84, + 0xE01D9: 84, + 0xE01DA: 84, + 0xE01DB: 84, + 0xE01DC: 84, + 0xE01DD: 84, + 0xE01DE: 84, + 0xE01DF: 84, + 0xE01E0: 84, + 0xE01E1: 84, + 0xE01E2: 84, + 0xE01E3: 84, + 0xE01E4: 84, + 0xE01E5: 84, + 0xE01E6: 84, + 0xE01E7: 84, + 0xE01E8: 84, + 0xE01E9: 84, + 0xE01EA: 84, + 0xE01EB: 84, + 0xE01EC: 84, + 0xE01ED: 84, + 0xE01EE: 84, + 0xE01EF: 84, +} +codepoint_classes = { + "PVALID": ( + 0x2D0000002E, + 0x300000003A, + 0x610000007B, + 0xDF000000F7, + 0xF800000100, + 0x10100000102, + 0x10300000104, + 0x10500000106, + 0x10700000108, + 0x1090000010A, + 0x10B0000010C, + 0x10D0000010E, + 0x10F00000110, + 0x11100000112, + 0x11300000114, + 0x11500000116, + 0x11700000118, + 0x1190000011A, + 0x11B0000011C, + 0x11D0000011E, + 0x11F00000120, + 0x12100000122, + 0x12300000124, + 0x12500000126, + 0x12700000128, + 0x1290000012A, + 0x12B0000012C, + 0x12D0000012E, + 0x12F00000130, + 0x13100000132, + 0x13500000136, + 0x13700000139, + 0x13A0000013B, + 0x13C0000013D, + 0x13E0000013F, + 0x14200000143, + 0x14400000145, + 0x14600000147, + 0x14800000149, + 0x14B0000014C, + 0x14D0000014E, + 0x14F00000150, + 0x15100000152, + 0x15300000154, + 0x15500000156, + 0x15700000158, + 0x1590000015A, + 0x15B0000015C, + 0x15D0000015E, + 0x15F00000160, + 0x16100000162, + 0x16300000164, + 0x16500000166, + 0x16700000168, + 0x1690000016A, + 0x16B0000016C, + 0x16D0000016E, + 0x16F00000170, + 0x17100000172, + 0x17300000174, + 0x17500000176, + 0x17700000178, + 0x17A0000017B, + 0x17C0000017D, + 0x17E0000017F, + 0x18000000181, + 0x18300000184, + 0x18500000186, + 0x18800000189, + 0x18C0000018E, + 0x19200000193, + 0x19500000196, + 0x1990000019C, + 0x19E0000019F, + 0x1A1000001A2, + 0x1A3000001A4, + 0x1A5000001A6, + 0x1A8000001A9, + 0x1AA000001AC, + 0x1AD000001AE, + 0x1B0000001B1, + 0x1B4000001B5, + 0x1B6000001B7, + 0x1B9000001BC, + 0x1BD000001C4, + 0x1CE000001CF, + 0x1D0000001D1, + 0x1D2000001D3, + 0x1D4000001D5, + 0x1D6000001D7, + 0x1D8000001D9, + 0x1DA000001DB, + 0x1DC000001DE, + 0x1DF000001E0, + 0x1E1000001E2, + 0x1E3000001E4, + 0x1E5000001E6, + 0x1E7000001E8, + 0x1E9000001EA, + 0x1EB000001EC, + 0x1ED000001EE, + 0x1EF000001F1, + 0x1F5000001F6, + 0x1F9000001FA, + 0x1FB000001FC, + 0x1FD000001FE, + 0x1FF00000200, + 0x20100000202, + 0x20300000204, + 0x20500000206, + 0x20700000208, + 0x2090000020A, + 0x20B0000020C, + 0x20D0000020E, + 0x20F00000210, + 0x21100000212, + 0x21300000214, + 0x21500000216, + 0x21700000218, + 0x2190000021A, + 0x21B0000021C, + 0x21D0000021E, + 0x21F00000220, + 0x22100000222, + 0x22300000224, + 0x22500000226, + 0x22700000228, + 0x2290000022A, + 0x22B0000022C, + 0x22D0000022E, + 0x22F00000230, + 0x23100000232, + 0x2330000023A, + 0x23C0000023D, + 0x23F00000241, + 0x24200000243, + 0x24700000248, + 0x2490000024A, + 0x24B0000024C, + 0x24D0000024E, + 0x24F000002B0, + 0x2B9000002C2, + 0x2C6000002D2, + 0x2EC000002ED, + 0x2EE000002EF, + 0x30000000340, + 0x34200000343, + 0x3460000034F, + 0x35000000370, + 0x37100000372, + 0x37300000374, + 0x37700000378, + 0x37B0000037E, + 0x39000000391, + 0x3AC000003CF, + 0x3D7000003D8, + 0x3D9000003DA, + 0x3DB000003DC, + 0x3DD000003DE, + 0x3DF000003E0, + 0x3E1000003E2, + 0x3E3000003E4, + 0x3E5000003E6, + 0x3E7000003E8, + 0x3E9000003EA, + 0x3EB000003EC, + 0x3ED000003EE, + 0x3EF000003F0, + 0x3F3000003F4, + 0x3F8000003F9, + 0x3FB000003FD, + 0x43000000460, + 0x46100000462, + 0x46300000464, + 0x46500000466, + 0x46700000468, + 0x4690000046A, + 0x46B0000046C, + 0x46D0000046E, + 0x46F00000470, + 0x47100000472, + 0x47300000474, + 0x47500000476, + 0x47700000478, + 0x4790000047A, + 0x47B0000047C, + 0x47D0000047E, + 0x47F00000480, + 0x48100000482, + 0x48300000488, + 0x48B0000048C, + 0x48D0000048E, + 0x48F00000490, + 0x49100000492, + 0x49300000494, + 0x49500000496, + 0x49700000498, + 0x4990000049A, + 0x49B0000049C, + 0x49D0000049E, + 0x49F000004A0, + 0x4A1000004A2, + 0x4A3000004A4, + 0x4A5000004A6, + 0x4A7000004A8, + 0x4A9000004AA, + 0x4AB000004AC, + 0x4AD000004AE, + 0x4AF000004B0, + 0x4B1000004B2, + 0x4B3000004B4, + 0x4B5000004B6, + 0x4B7000004B8, + 0x4B9000004BA, + 0x4BB000004BC, + 0x4BD000004BE, + 0x4BF000004C0, + 0x4C2000004C3, + 0x4C4000004C5, + 0x4C6000004C7, + 0x4C8000004C9, + 0x4CA000004CB, + 0x4CC000004CD, + 0x4CE000004D0, + 0x4D1000004D2, + 0x4D3000004D4, + 0x4D5000004D6, + 0x4D7000004D8, + 0x4D9000004DA, + 0x4DB000004DC, + 0x4DD000004DE, + 0x4DF000004E0, + 0x4E1000004E2, + 0x4E3000004E4, + 0x4E5000004E6, + 0x4E7000004E8, + 0x4E9000004EA, + 0x4EB000004EC, + 0x4ED000004EE, + 0x4EF000004F0, + 0x4F1000004F2, + 0x4F3000004F4, + 0x4F5000004F6, + 0x4F7000004F8, + 0x4F9000004FA, + 0x4FB000004FC, + 0x4FD000004FE, + 0x4FF00000500, + 0x50100000502, + 0x50300000504, + 0x50500000506, + 0x50700000508, + 0x5090000050A, + 0x50B0000050C, + 0x50D0000050E, + 0x50F00000510, + 0x51100000512, + 0x51300000514, + 0x51500000516, + 0x51700000518, + 0x5190000051A, + 0x51B0000051C, + 0x51D0000051E, + 0x51F00000520, + 0x52100000522, + 0x52300000524, + 0x52500000526, + 0x52700000528, + 0x5290000052A, + 0x52B0000052C, + 0x52D0000052E, + 0x52F00000530, + 0x5590000055A, + 0x56000000587, + 0x58800000589, + 0x591000005BE, + 0x5BF000005C0, + 0x5C1000005C3, + 0x5C4000005C6, + 0x5C7000005C8, + 0x5D0000005EB, + 0x5EF000005F3, + 0x6100000061B, + 0x62000000640, + 0x64100000660, + 0x66E00000675, + 0x679000006D4, + 0x6D5000006DD, + 0x6DF000006E9, + 0x6EA000006F0, + 0x6FA00000700, + 0x7100000074B, + 0x74D000007B2, + 0x7C0000007F6, + 0x7FD000007FE, + 0x8000000082E, + 0x8400000085C, + 0x8600000086B, + 0x87000000888, + 0x8890000088F, + 0x897000008E2, + 0x8E300000958, + 0x96000000964, + 0x96600000970, + 0x97100000984, + 0x9850000098D, + 0x98F00000991, + 0x993000009A9, + 0x9AA000009B1, + 0x9B2000009B3, + 0x9B6000009BA, + 0x9BC000009C5, + 0x9C7000009C9, + 0x9CB000009CF, + 0x9D7000009D8, + 0x9E0000009E4, + 0x9E6000009F2, + 0x9FC000009FD, + 0x9FE000009FF, + 0xA0100000A04, + 0xA0500000A0B, + 0xA0F00000A11, + 0xA1300000A29, + 0xA2A00000A31, + 0xA3200000A33, + 0xA3500000A36, + 0xA3800000A3A, + 0xA3C00000A3D, + 0xA3E00000A43, + 0xA4700000A49, + 0xA4B00000A4E, + 0xA5100000A52, + 0xA5C00000A5D, + 0xA6600000A76, + 0xA8100000A84, + 0xA8500000A8E, + 0xA8F00000A92, + 0xA9300000AA9, + 0xAAA00000AB1, + 0xAB200000AB4, + 0xAB500000ABA, + 0xABC00000AC6, + 0xAC700000ACA, + 0xACB00000ACE, + 0xAD000000AD1, + 0xAE000000AE4, + 0xAE600000AF0, + 0xAF900000B00, + 0xB0100000B04, + 0xB0500000B0D, + 0xB0F00000B11, + 0xB1300000B29, + 0xB2A00000B31, + 0xB3200000B34, + 0xB3500000B3A, + 0xB3C00000B45, + 0xB4700000B49, + 0xB4B00000B4E, + 0xB5500000B58, + 0xB5F00000B64, + 0xB6600000B70, + 0xB7100000B72, + 0xB8200000B84, + 0xB8500000B8B, + 0xB8E00000B91, + 0xB9200000B96, + 0xB9900000B9B, + 0xB9C00000B9D, + 0xB9E00000BA0, + 0xBA300000BA5, + 0xBA800000BAB, + 0xBAE00000BBA, + 0xBBE00000BC3, + 0xBC600000BC9, + 0xBCA00000BCE, + 0xBD000000BD1, + 0xBD700000BD8, + 0xBE600000BF0, + 0xC0000000C0D, + 0xC0E00000C11, + 0xC1200000C29, + 0xC2A00000C3A, + 0xC3C00000C45, + 0xC4600000C49, + 0xC4A00000C4E, + 0xC5500000C57, + 0xC5800000C5B, + 0xC5D00000C5E, + 0xC6000000C64, + 0xC6600000C70, + 0xC8000000C84, + 0xC8500000C8D, + 0xC8E00000C91, + 0xC9200000CA9, + 0xCAA00000CB4, + 0xCB500000CBA, + 0xCBC00000CC5, + 0xCC600000CC9, + 0xCCA00000CCE, + 0xCD500000CD7, + 0xCDD00000CDF, + 0xCE000000CE4, + 0xCE600000CF0, + 0xCF100000CF4, + 0xD0000000D0D, + 0xD0E00000D11, + 0xD1200000D45, + 0xD4600000D49, + 0xD4A00000D4F, + 0xD5400000D58, + 0xD5F00000D64, + 0xD6600000D70, + 0xD7A00000D80, + 0xD8100000D84, + 0xD8500000D97, + 0xD9A00000DB2, + 0xDB300000DBC, + 0xDBD00000DBE, + 0xDC000000DC7, + 0xDCA00000DCB, + 0xDCF00000DD5, + 0xDD600000DD7, + 0xDD800000DE0, + 0xDE600000DF0, + 0xDF200000DF4, + 0xE0100000E33, + 0xE3400000E3B, + 0xE4000000E4F, + 0xE5000000E5A, + 0xE8100000E83, + 0xE8400000E85, + 0xE8600000E8B, + 0xE8C00000EA4, + 0xEA500000EA6, + 0xEA700000EB3, + 0xEB400000EBE, + 0xEC000000EC5, + 0xEC600000EC7, + 0xEC800000ECF, + 0xED000000EDA, + 0xEDE00000EE0, + 0xF0000000F01, + 0xF0B00000F0C, + 0xF1800000F1A, + 0xF2000000F2A, + 0xF3500000F36, + 0xF3700000F38, + 0xF3900000F3A, + 0xF3E00000F43, + 0xF4400000F48, + 0xF4900000F4D, + 0xF4E00000F52, + 0xF5300000F57, + 0xF5800000F5C, + 0xF5D00000F69, + 0xF6A00000F6D, + 0xF7100000F73, + 0xF7400000F75, + 0xF7A00000F81, + 0xF8200000F85, + 0xF8600000F93, + 0xF9400000F98, + 0xF9900000F9D, + 0xF9E00000FA2, + 0xFA300000FA7, + 0xFA800000FAC, + 0xFAD00000FB9, + 0xFBA00000FBD, + 0xFC600000FC7, + 0x10000000104A, + 0x10500000109E, + 0x10D0000010FB, + 0x10FD00001100, + 0x120000001249, + 0x124A0000124E, + 0x125000001257, + 0x125800001259, + 0x125A0000125E, + 0x126000001289, + 0x128A0000128E, + 0x1290000012B1, + 0x12B2000012B6, + 0x12B8000012BF, + 0x12C0000012C1, + 0x12C2000012C6, + 0x12C8000012D7, + 0x12D800001311, + 0x131200001316, + 0x13180000135B, + 0x135D00001360, + 0x138000001390, + 0x13A0000013F6, + 0x14010000166D, + 0x166F00001680, + 0x16810000169B, + 0x16A0000016EB, + 0x16F1000016F9, + 0x170000001716, + 0x171F00001735, + 0x174000001754, + 0x17600000176D, + 0x176E00001771, + 0x177200001774, + 0x1780000017B4, + 0x17B6000017D4, + 0x17D7000017D8, + 0x17DC000017DE, + 0x17E0000017EA, + 0x18100000181A, + 0x182000001879, + 0x1880000018AB, + 0x18B0000018F6, + 0x19000000191F, + 0x19200000192C, + 0x19300000193C, + 0x19460000196E, + 0x197000001975, + 0x1980000019AC, + 0x19B0000019CA, + 0x19D0000019DA, + 0x1A0000001A1C, + 0x1A2000001A5F, + 0x1A6000001A7D, + 0x1A7F00001A8A, + 0x1A9000001A9A, + 0x1AA700001AA8, + 0x1AB000001ABE, + 0x1ABF00001ACF, + 0x1B0000001B4D, + 0x1B5000001B5A, + 0x1B6B00001B74, + 0x1B8000001BF4, + 0x1C0000001C38, + 0x1C4000001C4A, + 0x1C4D00001C7E, + 0x1C8A00001C8B, + 0x1CD000001CD3, + 0x1CD400001CFB, + 0x1D0000001D2C, + 0x1D2F00001D30, + 0x1D3B00001D3C, + 0x1D4E00001D4F, + 0x1D6B00001D78, + 0x1D7900001D9B, + 0x1DC000001E00, + 0x1E0100001E02, + 0x1E0300001E04, + 0x1E0500001E06, + 0x1E0700001E08, + 0x1E0900001E0A, + 0x1E0B00001E0C, + 0x1E0D00001E0E, + 0x1E0F00001E10, + 0x1E1100001E12, + 0x1E1300001E14, + 0x1E1500001E16, + 0x1E1700001E18, + 0x1E1900001E1A, + 0x1E1B00001E1C, + 0x1E1D00001E1E, + 0x1E1F00001E20, + 0x1E2100001E22, + 0x1E2300001E24, + 0x1E2500001E26, + 0x1E2700001E28, + 0x1E2900001E2A, + 0x1E2B00001E2C, + 0x1E2D00001E2E, + 0x1E2F00001E30, + 0x1E3100001E32, + 0x1E3300001E34, + 0x1E3500001E36, + 0x1E3700001E38, + 0x1E3900001E3A, + 0x1E3B00001E3C, + 0x1E3D00001E3E, + 0x1E3F00001E40, + 0x1E4100001E42, + 0x1E4300001E44, + 0x1E4500001E46, + 0x1E4700001E48, + 0x1E4900001E4A, + 0x1E4B00001E4C, + 0x1E4D00001E4E, + 0x1E4F00001E50, + 0x1E5100001E52, + 0x1E5300001E54, + 0x1E5500001E56, + 0x1E5700001E58, + 0x1E5900001E5A, + 0x1E5B00001E5C, + 0x1E5D00001E5E, + 0x1E5F00001E60, + 0x1E6100001E62, + 0x1E6300001E64, + 0x1E6500001E66, + 0x1E6700001E68, + 0x1E6900001E6A, + 0x1E6B00001E6C, + 0x1E6D00001E6E, + 0x1E6F00001E70, + 0x1E7100001E72, + 0x1E7300001E74, + 0x1E7500001E76, + 0x1E7700001E78, + 0x1E7900001E7A, + 0x1E7B00001E7C, + 0x1E7D00001E7E, + 0x1E7F00001E80, + 0x1E8100001E82, + 0x1E8300001E84, + 0x1E8500001E86, + 0x1E8700001E88, + 0x1E8900001E8A, + 0x1E8B00001E8C, + 0x1E8D00001E8E, + 0x1E8F00001E90, + 0x1E9100001E92, + 0x1E9300001E94, + 0x1E9500001E9A, + 0x1E9C00001E9E, + 0x1E9F00001EA0, + 0x1EA100001EA2, + 0x1EA300001EA4, + 0x1EA500001EA6, + 0x1EA700001EA8, + 0x1EA900001EAA, + 0x1EAB00001EAC, + 0x1EAD00001EAE, + 0x1EAF00001EB0, + 0x1EB100001EB2, + 0x1EB300001EB4, + 0x1EB500001EB6, + 0x1EB700001EB8, + 0x1EB900001EBA, + 0x1EBB00001EBC, + 0x1EBD00001EBE, + 0x1EBF00001EC0, + 0x1EC100001EC2, + 0x1EC300001EC4, + 0x1EC500001EC6, + 0x1EC700001EC8, + 0x1EC900001ECA, + 0x1ECB00001ECC, + 0x1ECD00001ECE, + 0x1ECF00001ED0, + 0x1ED100001ED2, + 0x1ED300001ED4, + 0x1ED500001ED6, + 0x1ED700001ED8, + 0x1ED900001EDA, + 0x1EDB00001EDC, + 0x1EDD00001EDE, + 0x1EDF00001EE0, + 0x1EE100001EE2, + 0x1EE300001EE4, + 0x1EE500001EE6, + 0x1EE700001EE8, + 0x1EE900001EEA, + 0x1EEB00001EEC, + 0x1EED00001EEE, + 0x1EEF00001EF0, + 0x1EF100001EF2, + 0x1EF300001EF4, + 0x1EF500001EF6, + 0x1EF700001EF8, + 0x1EF900001EFA, + 0x1EFB00001EFC, + 0x1EFD00001EFE, + 0x1EFF00001F08, + 0x1F1000001F16, + 0x1F2000001F28, + 0x1F3000001F38, + 0x1F4000001F46, + 0x1F5000001F58, + 0x1F6000001F68, + 0x1F7000001F71, + 0x1F7200001F73, + 0x1F7400001F75, + 0x1F7600001F77, + 0x1F7800001F79, + 0x1F7A00001F7B, + 0x1F7C00001F7D, + 0x1FB000001FB2, + 0x1FB600001FB7, + 0x1FC600001FC7, + 0x1FD000001FD3, + 0x1FD600001FD8, + 0x1FE000001FE3, + 0x1FE400001FE8, + 0x1FF600001FF7, + 0x214E0000214F, + 0x218400002185, + 0x2C3000002C60, + 0x2C6100002C62, + 0x2C6500002C67, + 0x2C6800002C69, + 0x2C6A00002C6B, + 0x2C6C00002C6D, + 0x2C7100002C72, + 0x2C7300002C75, + 0x2C7600002C7C, + 0x2C8100002C82, + 0x2C8300002C84, + 0x2C8500002C86, + 0x2C8700002C88, + 0x2C8900002C8A, + 0x2C8B00002C8C, + 0x2C8D00002C8E, + 0x2C8F00002C90, + 0x2C9100002C92, + 0x2C9300002C94, + 0x2C9500002C96, + 0x2C9700002C98, + 0x2C9900002C9A, + 0x2C9B00002C9C, + 0x2C9D00002C9E, + 0x2C9F00002CA0, + 0x2CA100002CA2, + 0x2CA300002CA4, + 0x2CA500002CA6, + 0x2CA700002CA8, + 0x2CA900002CAA, + 0x2CAB00002CAC, + 0x2CAD00002CAE, + 0x2CAF00002CB0, + 0x2CB100002CB2, + 0x2CB300002CB4, + 0x2CB500002CB6, + 0x2CB700002CB8, + 0x2CB900002CBA, + 0x2CBB00002CBC, + 0x2CBD00002CBE, + 0x2CBF00002CC0, + 0x2CC100002CC2, + 0x2CC300002CC4, + 0x2CC500002CC6, + 0x2CC700002CC8, + 0x2CC900002CCA, + 0x2CCB00002CCC, + 0x2CCD00002CCE, + 0x2CCF00002CD0, + 0x2CD100002CD2, + 0x2CD300002CD4, + 0x2CD500002CD6, + 0x2CD700002CD8, + 0x2CD900002CDA, + 0x2CDB00002CDC, + 0x2CDD00002CDE, + 0x2CDF00002CE0, + 0x2CE100002CE2, + 0x2CE300002CE5, + 0x2CEC00002CED, + 0x2CEE00002CF2, + 0x2CF300002CF4, + 0x2D0000002D26, + 0x2D2700002D28, + 0x2D2D00002D2E, + 0x2D3000002D68, + 0x2D7F00002D97, + 0x2DA000002DA7, + 0x2DA800002DAF, + 0x2DB000002DB7, + 0x2DB800002DBF, + 0x2DC000002DC7, + 0x2DC800002DCF, + 0x2DD000002DD7, + 0x2DD800002DDF, + 0x2DE000002E00, + 0x2E2F00002E30, + 0x300500003008, + 0x302A0000302E, + 0x303C0000303D, + 0x304100003097, + 0x30990000309B, + 0x309D0000309F, + 0x30A1000030FB, + 0x30FC000030FF, + 0x310500003130, + 0x31A0000031C0, + 0x31F000003200, + 0x340000004DC0, + 0x4E000000A48D, + 0xA4D00000A4FE, + 0xA5000000A60D, + 0xA6100000A62C, + 0xA6410000A642, + 0xA6430000A644, + 0xA6450000A646, + 0xA6470000A648, + 0xA6490000A64A, + 0xA64B0000A64C, + 0xA64D0000A64E, + 0xA64F0000A650, + 0xA6510000A652, + 0xA6530000A654, + 0xA6550000A656, + 0xA6570000A658, + 0xA6590000A65A, + 0xA65B0000A65C, + 0xA65D0000A65E, + 0xA65F0000A660, + 0xA6610000A662, + 0xA6630000A664, + 0xA6650000A666, + 0xA6670000A668, + 0xA6690000A66A, + 0xA66B0000A66C, + 0xA66D0000A670, + 0xA6740000A67E, + 0xA67F0000A680, + 0xA6810000A682, + 0xA6830000A684, + 0xA6850000A686, + 0xA6870000A688, + 0xA6890000A68A, + 0xA68B0000A68C, + 0xA68D0000A68E, + 0xA68F0000A690, + 0xA6910000A692, + 0xA6930000A694, + 0xA6950000A696, + 0xA6970000A698, + 0xA6990000A69A, + 0xA69B0000A69C, + 0xA69E0000A6E6, + 0xA6F00000A6F2, + 0xA7170000A720, + 0xA7230000A724, + 0xA7250000A726, + 0xA7270000A728, + 0xA7290000A72A, + 0xA72B0000A72C, + 0xA72D0000A72E, + 0xA72F0000A732, + 0xA7330000A734, + 0xA7350000A736, + 0xA7370000A738, + 0xA7390000A73A, + 0xA73B0000A73C, + 0xA73D0000A73E, + 0xA73F0000A740, + 0xA7410000A742, + 0xA7430000A744, + 0xA7450000A746, + 0xA7470000A748, + 0xA7490000A74A, + 0xA74B0000A74C, + 0xA74D0000A74E, + 0xA74F0000A750, + 0xA7510000A752, + 0xA7530000A754, + 0xA7550000A756, + 0xA7570000A758, + 0xA7590000A75A, + 0xA75B0000A75C, + 0xA75D0000A75E, + 0xA75F0000A760, + 0xA7610000A762, + 0xA7630000A764, + 0xA7650000A766, + 0xA7670000A768, + 0xA7690000A76A, + 0xA76B0000A76C, + 0xA76D0000A76E, + 0xA76F0000A770, + 0xA7710000A779, + 0xA77A0000A77B, + 0xA77C0000A77D, + 0xA77F0000A780, + 0xA7810000A782, + 0xA7830000A784, + 0xA7850000A786, + 0xA7870000A789, + 0xA78C0000A78D, + 0xA78E0000A790, + 0xA7910000A792, + 0xA7930000A796, + 0xA7970000A798, + 0xA7990000A79A, + 0xA79B0000A79C, + 0xA79D0000A79E, + 0xA79F0000A7A0, + 0xA7A10000A7A2, + 0xA7A30000A7A4, + 0xA7A50000A7A6, + 0xA7A70000A7A8, + 0xA7A90000A7AA, + 0xA7AF0000A7B0, + 0xA7B50000A7B6, + 0xA7B70000A7B8, + 0xA7B90000A7BA, + 0xA7BB0000A7BC, + 0xA7BD0000A7BE, + 0xA7BF0000A7C0, + 0xA7C10000A7C2, + 0xA7C30000A7C4, + 0xA7C80000A7C9, + 0xA7CA0000A7CB, + 0xA7CD0000A7CE, + 0xA7D10000A7D2, + 0xA7D30000A7D4, + 0xA7D50000A7D6, + 0xA7D70000A7D8, + 0xA7D90000A7DA, + 0xA7DB0000A7DC, + 0xA7F60000A7F8, + 0xA7FA0000A828, + 0xA82C0000A82D, + 0xA8400000A874, + 0xA8800000A8C6, + 0xA8D00000A8DA, + 0xA8E00000A8F8, + 0xA8FB0000A8FC, + 0xA8FD0000A92E, + 0xA9300000A954, + 0xA9800000A9C1, + 0xA9CF0000A9DA, + 0xA9E00000A9FF, + 0xAA000000AA37, + 0xAA400000AA4E, + 0xAA500000AA5A, + 0xAA600000AA77, + 0xAA7A0000AAC3, + 0xAADB0000AADE, + 0xAAE00000AAF0, + 0xAAF20000AAF7, + 0xAB010000AB07, + 0xAB090000AB0F, + 0xAB110000AB17, + 0xAB200000AB27, + 0xAB280000AB2F, + 0xAB300000AB5B, + 0xAB600000AB69, + 0xABC00000ABEB, + 0xABEC0000ABEE, + 0xABF00000ABFA, + 0xAC000000D7A4, + 0xFA0E0000FA10, + 0xFA110000FA12, + 0xFA130000FA15, + 0xFA1F0000FA20, + 0xFA210000FA22, + 0xFA230000FA25, + 0xFA270000FA2A, + 0xFB1E0000FB1F, + 0xFE200000FE30, + 0xFE730000FE74, + 0x100000001000C, + 0x1000D00010027, + 0x100280001003B, + 0x1003C0001003E, + 0x1003F0001004E, + 0x100500001005E, + 0x10080000100FB, + 0x101FD000101FE, + 0x102800001029D, + 0x102A0000102D1, + 0x102E0000102E1, + 0x1030000010320, + 0x1032D00010341, + 0x103420001034A, + 0x103500001037B, + 0x103800001039E, + 0x103A0000103C4, + 0x103C8000103D0, + 0x104280001049E, + 0x104A0000104AA, + 0x104D8000104FC, + 0x1050000010528, + 0x1053000010564, + 0x10597000105A2, + 0x105A3000105B2, + 0x105B3000105BA, + 0x105BB000105BD, + 0x105C0000105F4, + 0x1060000010737, + 0x1074000010756, + 0x1076000010768, + 0x1078000010781, + 0x1080000010806, + 0x1080800010809, + 0x1080A00010836, + 0x1083700010839, + 0x1083C0001083D, + 0x1083F00010856, + 0x1086000010877, + 0x108800001089F, + 0x108E0000108F3, + 0x108F4000108F6, + 0x1090000010916, + 0x109200001093A, + 0x10980000109B8, + 0x109BE000109C0, + 0x10A0000010A04, + 0x10A0500010A07, + 0x10A0C00010A14, + 0x10A1500010A18, + 0x10A1900010A36, + 0x10A3800010A3B, + 0x10A3F00010A40, + 0x10A6000010A7D, + 0x10A8000010A9D, + 0x10AC000010AC8, + 0x10AC900010AE7, + 0x10B0000010B36, + 0x10B4000010B56, + 0x10B6000010B73, + 0x10B8000010B92, + 0x10C0000010C49, + 0x10CC000010CF3, + 0x10D0000010D28, + 0x10D3000010D3A, + 0x10D4000010D50, + 0x10D6900010D6E, + 0x10D6F00010D86, + 0x10E8000010EAA, + 0x10EAB00010EAD, + 0x10EB000010EB2, + 0x10EC200010EC5, + 0x10EFC00010F1D, + 0x10F2700010F28, + 0x10F3000010F51, + 0x10F7000010F86, + 0x10FB000010FC5, + 0x10FE000010FF7, + 0x1100000011047, + 0x1106600011076, + 0x1107F000110BB, + 0x110C2000110C3, + 0x110D0000110E9, + 0x110F0000110FA, + 0x1110000011135, + 0x1113600011140, + 0x1114400011148, + 0x1115000011174, + 0x1117600011177, + 0x11180000111C5, + 0x111C9000111CD, + 0x111CE000111DB, + 0x111DC000111DD, + 0x1120000011212, + 0x1121300011238, + 0x1123E00011242, + 0x1128000011287, + 0x1128800011289, + 0x1128A0001128E, + 0x1128F0001129E, + 0x1129F000112A9, + 0x112B0000112EB, + 0x112F0000112FA, + 0x1130000011304, + 0x113050001130D, + 0x1130F00011311, + 0x1131300011329, + 0x1132A00011331, + 0x1133200011334, + 0x113350001133A, + 0x1133B00011345, + 0x1134700011349, + 0x1134B0001134E, + 0x1135000011351, + 0x1135700011358, + 0x1135D00011364, + 0x113660001136D, + 0x1137000011375, + 0x113800001138A, + 0x1138B0001138C, + 0x1138E0001138F, + 0x11390000113B6, + 0x113B7000113C1, + 0x113C2000113C3, + 0x113C5000113C6, + 0x113C7000113CB, + 0x113CC000113D4, + 0x113E1000113E3, + 0x114000001144B, + 0x114500001145A, + 0x1145E00011462, + 0x11480000114C6, + 0x114C7000114C8, + 0x114D0000114DA, + 0x11580000115B6, + 0x115B8000115C1, + 0x115D8000115DE, + 0x1160000011641, + 0x1164400011645, + 0x116500001165A, + 0x11680000116B9, + 0x116C0000116CA, + 0x116D0000116E4, + 0x117000001171B, + 0x1171D0001172C, + 0x117300001173A, + 0x1174000011747, + 0x118000001183B, + 0x118C0000118EA, + 0x118FF00011907, + 0x119090001190A, + 0x1190C00011914, + 0x1191500011917, + 0x1191800011936, + 0x1193700011939, + 0x1193B00011944, + 0x119500001195A, + 0x119A0000119A8, + 0x119AA000119D8, + 0x119DA000119E2, + 0x119E3000119E5, + 0x11A0000011A3F, + 0x11A4700011A48, + 0x11A5000011A9A, + 0x11A9D00011A9E, + 0x11AB000011AF9, + 0x11BC000011BE1, + 0x11BF000011BFA, + 0x11C0000011C09, + 0x11C0A00011C37, + 0x11C3800011C41, + 0x11C5000011C5A, + 0x11C7200011C90, + 0x11C9200011CA8, + 0x11CA900011CB7, + 0x11D0000011D07, + 0x11D0800011D0A, + 0x11D0B00011D37, + 0x11D3A00011D3B, + 0x11D3C00011D3E, + 0x11D3F00011D48, + 0x11D5000011D5A, + 0x11D6000011D66, + 0x11D6700011D69, + 0x11D6A00011D8F, + 0x11D9000011D92, + 0x11D9300011D99, + 0x11DA000011DAA, + 0x11EE000011EF7, + 0x11F0000011F11, + 0x11F1200011F3B, + 0x11F3E00011F43, + 0x11F5000011F5B, + 0x11FB000011FB1, + 0x120000001239A, + 0x1248000012544, + 0x12F9000012FF1, + 0x1300000013430, + 0x1344000013456, + 0x13460000143FB, + 0x1440000014647, + 0x161000001613A, + 0x1680000016A39, + 0x16A4000016A5F, + 0x16A6000016A6A, + 0x16A7000016ABF, + 0x16AC000016ACA, + 0x16AD000016AEE, + 0x16AF000016AF5, + 0x16B0000016B37, + 0x16B4000016B44, + 0x16B5000016B5A, + 0x16B6300016B78, + 0x16B7D00016B90, + 0x16D4000016D6D, + 0x16D7000016D7A, + 0x16E6000016E80, + 0x16F0000016F4B, + 0x16F4F00016F88, + 0x16F8F00016FA0, + 0x16FE000016FE2, + 0x16FE300016FE5, + 0x16FF000016FF2, + 0x17000000187F8, + 0x1880000018CD6, + 0x18CFF00018D09, + 0x1AFF00001AFF4, + 0x1AFF50001AFFC, + 0x1AFFD0001AFFF, + 0x1B0000001B123, + 0x1B1320001B133, + 0x1B1500001B153, + 0x1B1550001B156, + 0x1B1640001B168, + 0x1B1700001B2FC, + 0x1BC000001BC6B, + 0x1BC700001BC7D, + 0x1BC800001BC89, + 0x1BC900001BC9A, + 0x1BC9D0001BC9F, + 0x1CCF00001CCFA, + 0x1CF000001CF2E, + 0x1CF300001CF47, + 0x1DA000001DA37, + 0x1DA3B0001DA6D, + 0x1DA750001DA76, + 0x1DA840001DA85, + 0x1DA9B0001DAA0, + 0x1DAA10001DAB0, + 0x1DF000001DF1F, + 0x1DF250001DF2B, + 0x1E0000001E007, + 0x1E0080001E019, + 0x1E01B0001E022, + 0x1E0230001E025, + 0x1E0260001E02B, + 0x1E08F0001E090, + 0x1E1000001E12D, + 0x1E1300001E13E, + 0x1E1400001E14A, + 0x1E14E0001E14F, + 0x1E2900001E2AF, + 0x1E2C00001E2FA, + 0x1E4D00001E4FA, + 0x1E5D00001E5FB, + 0x1E7E00001E7E7, + 0x1E7E80001E7EC, + 0x1E7ED0001E7EF, + 0x1E7F00001E7FF, + 0x1E8000001E8C5, + 0x1E8D00001E8D7, + 0x1E9220001E94C, + 0x1E9500001E95A, + 0x200000002A6E0, + 0x2A7000002B73A, + 0x2B7400002B81E, + 0x2B8200002CEA2, + 0x2CEB00002EBE1, + 0x2EBF00002EE5E, + 0x300000003134B, + 0x31350000323B0, + ), + "CONTEXTJ": (0x200C0000200E,), + "CONTEXTO": ( + 0xB7000000B8, + 0x37500000376, + 0x5F3000005F5, + 0x6600000066A, + 0x6F0000006FA, + 0x30FB000030FC, + ), +} diff --git a/.venv/lib/python3.10/site-packages/idna/intranges.py b/.venv/lib/python3.10/site-packages/idna/intranges.py new file mode 100644 index 0000000..7bfaa8d --- /dev/null +++ b/.venv/lib/python3.10/site-packages/idna/intranges.py @@ -0,0 +1,57 @@ +""" +Given a list of integers, made up of (hopefully) a small number of long runs +of consecutive integers, compute a representation of the form +((start1, end1), (start2, end2) ...). Then answer the question "was x present +in the original list?" in time O(log(# runs)). +""" + +import bisect +from typing import List, Tuple + + +def intranges_from_list(list_: List[int]) -> Tuple[int, ...]: + """Represent a list of integers as a sequence of ranges: + ((start_0, end_0), (start_1, end_1), ...), such that the original + integers are exactly those x such that start_i <= x < end_i for some i. + + Ranges are encoded as single integers (start << 32 | end), not as tuples. + """ + + sorted_list = sorted(list_) + ranges = [] + last_write = -1 + for i in range(len(sorted_list)): + if i + 1 < len(sorted_list): + if sorted_list[i] == sorted_list[i + 1] - 1: + continue + current_range = sorted_list[last_write + 1 : i + 1] + ranges.append(_encode_range(current_range[0], current_range[-1] + 1)) + last_write = i + + return tuple(ranges) + + +def _encode_range(start: int, end: int) -> int: + return (start << 32) | end + + +def _decode_range(r: int) -> Tuple[int, int]: + return (r >> 32), (r & ((1 << 32) - 1)) + + +def intranges_contain(int_: int, ranges: Tuple[int, ...]) -> bool: + """Determine if `int_` falls into one of the ranges in `ranges`.""" + tuple_ = _encode_range(int_, 0) + pos = bisect.bisect_left(ranges, tuple_) + # we could be immediately ahead of a tuple (start, end) + # with start < int_ <= end + if pos > 0: + left, right = _decode_range(ranges[pos - 1]) + if left <= int_ < right: + return True + # or we could be immediately behind a tuple (int_, end) + if pos < len(ranges): + left, _ = _decode_range(ranges[pos]) + if left == int_: + return True + return False diff --git a/.venv/lib/python3.10/site-packages/idna/package_data.py b/.venv/lib/python3.10/site-packages/idna/package_data.py new file mode 100644 index 0000000..7272c8d --- /dev/null +++ b/.venv/lib/python3.10/site-packages/idna/package_data.py @@ -0,0 +1 @@ +__version__ = "3.11" diff --git a/.venv/lib/python3.10/site-packages/idna/py.typed b/.venv/lib/python3.10/site-packages/idna/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/.venv/lib/python3.10/site-packages/idna/uts46data.py b/.venv/lib/python3.10/site-packages/idna/uts46data.py new file mode 100644 index 0000000..4610b71 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/idna/uts46data.py @@ -0,0 +1,8841 @@ +# This file is automatically generated by tools/idna-data +# vim: set fileencoding=utf-8 : + +from typing import List, Tuple, Union + +"""IDNA Mapping Table from UTS46.""" + + +__version__ = "16.0.0" + + +def _seg_0() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x0, "V"), + (0x1, "V"), + (0x2, "V"), + (0x3, "V"), + (0x4, "V"), + (0x5, "V"), + (0x6, "V"), + (0x7, "V"), + (0x8, "V"), + (0x9, "V"), + (0xA, "V"), + (0xB, "V"), + (0xC, "V"), + (0xD, "V"), + (0xE, "V"), + (0xF, "V"), + (0x10, "V"), + (0x11, "V"), + (0x12, "V"), + (0x13, "V"), + (0x14, "V"), + (0x15, "V"), + (0x16, "V"), + (0x17, "V"), + (0x18, "V"), + (0x19, "V"), + (0x1A, "V"), + (0x1B, "V"), + (0x1C, "V"), + (0x1D, "V"), + (0x1E, "V"), + (0x1F, "V"), + (0x20, "V"), + (0x21, "V"), + (0x22, "V"), + (0x23, "V"), + (0x24, "V"), + (0x25, "V"), + (0x26, "V"), + (0x27, "V"), + (0x28, "V"), + (0x29, "V"), + (0x2A, "V"), + (0x2B, "V"), + (0x2C, "V"), + (0x2D, "V"), + (0x2E, "V"), + (0x2F, "V"), + (0x30, "V"), + (0x31, "V"), + (0x32, "V"), + (0x33, "V"), + (0x34, "V"), + (0x35, "V"), + (0x36, "V"), + (0x37, "V"), + (0x38, "V"), + (0x39, "V"), + (0x3A, "V"), + (0x3B, "V"), + (0x3C, "V"), + (0x3D, "V"), + (0x3E, "V"), + (0x3F, "V"), + (0x40, "V"), + (0x41, "M", "a"), + (0x42, "M", "b"), + (0x43, "M", "c"), + (0x44, "M", "d"), + (0x45, "M", "e"), + (0x46, "M", "f"), + (0x47, "M", "g"), + (0x48, "M", "h"), + (0x49, "M", "i"), + (0x4A, "M", "j"), + (0x4B, "M", "k"), + (0x4C, "M", "l"), + (0x4D, "M", "m"), + (0x4E, "M", "n"), + (0x4F, "M", "o"), + (0x50, "M", "p"), + (0x51, "M", "q"), + (0x52, "M", "r"), + (0x53, "M", "s"), + (0x54, "M", "t"), + (0x55, "M", "u"), + (0x56, "M", "v"), + (0x57, "M", "w"), + (0x58, "M", "x"), + (0x59, "M", "y"), + (0x5A, "M", "z"), + (0x5B, "V"), + (0x5C, "V"), + (0x5D, "V"), + (0x5E, "V"), + (0x5F, "V"), + (0x60, "V"), + (0x61, "V"), + (0x62, "V"), + (0x63, "V"), + ] + + +def _seg_1() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x64, "V"), + (0x65, "V"), + (0x66, "V"), + (0x67, "V"), + (0x68, "V"), + (0x69, "V"), + (0x6A, "V"), + (0x6B, "V"), + (0x6C, "V"), + (0x6D, "V"), + (0x6E, "V"), + (0x6F, "V"), + (0x70, "V"), + (0x71, "V"), + (0x72, "V"), + (0x73, "V"), + (0x74, "V"), + (0x75, "V"), + (0x76, "V"), + (0x77, "V"), + (0x78, "V"), + (0x79, "V"), + (0x7A, "V"), + (0x7B, "V"), + (0x7C, "V"), + (0x7D, "V"), + (0x7E, "V"), + (0x7F, "V"), + (0x80, "X"), + (0x81, "X"), + (0x82, "X"), + (0x83, "X"), + (0x84, "X"), + (0x85, "X"), + (0x86, "X"), + (0x87, "X"), + (0x88, "X"), + (0x89, "X"), + (0x8A, "X"), + (0x8B, "X"), + (0x8C, "X"), + (0x8D, "X"), + (0x8E, "X"), + (0x8F, "X"), + (0x90, "X"), + (0x91, "X"), + (0x92, "X"), + (0x93, "X"), + (0x94, "X"), + (0x95, "X"), + (0x96, "X"), + (0x97, "X"), + (0x98, "X"), + (0x99, "X"), + (0x9A, "X"), + (0x9B, "X"), + (0x9C, "X"), + (0x9D, "X"), + (0x9E, "X"), + (0x9F, "X"), + (0xA0, "M", " "), + (0xA1, "V"), + (0xA2, "V"), + (0xA3, "V"), + (0xA4, "V"), + (0xA5, "V"), + (0xA6, "V"), + (0xA7, "V"), + (0xA8, "M", " ̈"), + (0xA9, "V"), + (0xAA, "M", "a"), + (0xAB, "V"), + (0xAC, "V"), + (0xAD, "I"), + (0xAE, "V"), + (0xAF, "M", " ̄"), + (0xB0, "V"), + (0xB1, "V"), + (0xB2, "M", "2"), + (0xB3, "M", "3"), + (0xB4, "M", " ́"), + (0xB5, "M", "μ"), + (0xB6, "V"), + (0xB7, "V"), + (0xB8, "M", " ̧"), + (0xB9, "M", "1"), + (0xBA, "M", "o"), + (0xBB, "V"), + (0xBC, "M", "1⁄4"), + (0xBD, "M", "1⁄2"), + (0xBE, "M", "3⁄4"), + (0xBF, "V"), + (0xC0, "M", "à"), + (0xC1, "M", "á"), + (0xC2, "M", "â"), + (0xC3, "M", "ã"), + (0xC4, "M", "ä"), + (0xC5, "M", "å"), + (0xC6, "M", "æ"), + (0xC7, "M", "ç"), + ] + + +def _seg_2() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xC8, "M", "è"), + (0xC9, "M", "é"), + (0xCA, "M", "ê"), + (0xCB, "M", "ë"), + (0xCC, "M", "ì"), + (0xCD, "M", "í"), + (0xCE, "M", "î"), + (0xCF, "M", "ï"), + (0xD0, "M", "ð"), + (0xD1, "M", "ñ"), + (0xD2, "M", "ò"), + (0xD3, "M", "ó"), + (0xD4, "M", "ô"), + (0xD5, "M", "õ"), + (0xD6, "M", "ö"), + (0xD7, "V"), + (0xD8, "M", "ø"), + (0xD9, "M", "ù"), + (0xDA, "M", "ú"), + (0xDB, "M", "û"), + (0xDC, "M", "ü"), + (0xDD, "M", "ý"), + (0xDE, "M", "þ"), + (0xDF, "D", "ss"), + (0xE0, "V"), + (0xE1, "V"), + (0xE2, "V"), + (0xE3, "V"), + (0xE4, "V"), + (0xE5, "V"), + (0xE6, "V"), + (0xE7, "V"), + (0xE8, "V"), + (0xE9, "V"), + (0xEA, "V"), + (0xEB, "V"), + (0xEC, "V"), + (0xED, "V"), + (0xEE, "V"), + (0xEF, "V"), + (0xF0, "V"), + (0xF1, "V"), + (0xF2, "V"), + (0xF3, "V"), + (0xF4, "V"), + (0xF5, "V"), + (0xF6, "V"), + (0xF7, "V"), + (0xF8, "V"), + (0xF9, "V"), + (0xFA, "V"), + (0xFB, "V"), + (0xFC, "V"), + (0xFD, "V"), + (0xFE, "V"), + (0xFF, "V"), + (0x100, "M", "ā"), + (0x101, "V"), + (0x102, "M", "ă"), + (0x103, "V"), + (0x104, "M", "ą"), + (0x105, "V"), + (0x106, "M", "ć"), + (0x107, "V"), + (0x108, "M", "ĉ"), + (0x109, "V"), + (0x10A, "M", "ċ"), + (0x10B, "V"), + (0x10C, "M", "č"), + (0x10D, "V"), + (0x10E, "M", "ď"), + (0x10F, "V"), + (0x110, "M", "đ"), + (0x111, "V"), + (0x112, "M", "ē"), + (0x113, "V"), + (0x114, "M", "ĕ"), + (0x115, "V"), + (0x116, "M", "ė"), + (0x117, "V"), + (0x118, "M", "ę"), + (0x119, "V"), + (0x11A, "M", "ě"), + (0x11B, "V"), + (0x11C, "M", "ĝ"), + (0x11D, "V"), + (0x11E, "M", "ğ"), + (0x11F, "V"), + (0x120, "M", "ġ"), + (0x121, "V"), + (0x122, "M", "ģ"), + (0x123, "V"), + (0x124, "M", "ĥ"), + (0x125, "V"), + (0x126, "M", "ħ"), + (0x127, "V"), + (0x128, "M", "ĩ"), + (0x129, "V"), + (0x12A, "M", "ī"), + (0x12B, "V"), + ] + + +def _seg_3() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x12C, "M", "ĭ"), + (0x12D, "V"), + (0x12E, "M", "į"), + (0x12F, "V"), + (0x130, "M", "i̇"), + (0x131, "V"), + (0x132, "M", "ij"), + (0x134, "M", "ĵ"), + (0x135, "V"), + (0x136, "M", "ķ"), + (0x137, "V"), + (0x139, "M", "ĺ"), + (0x13A, "V"), + (0x13B, "M", "ļ"), + (0x13C, "V"), + (0x13D, "M", "ľ"), + (0x13E, "V"), + (0x13F, "M", "l·"), + (0x141, "M", "ł"), + (0x142, "V"), + (0x143, "M", "ń"), + (0x144, "V"), + (0x145, "M", "ņ"), + (0x146, "V"), + (0x147, "M", "ň"), + (0x148, "V"), + (0x149, "M", "ʼn"), + (0x14A, "M", "ŋ"), + (0x14B, "V"), + (0x14C, "M", "ō"), + (0x14D, "V"), + (0x14E, "M", "ŏ"), + (0x14F, "V"), + (0x150, "M", "ő"), + (0x151, "V"), + (0x152, "M", "œ"), + (0x153, "V"), + (0x154, "M", "ŕ"), + (0x155, "V"), + (0x156, "M", "ŗ"), + (0x157, "V"), + (0x158, "M", "ř"), + (0x159, "V"), + (0x15A, "M", "ś"), + (0x15B, "V"), + (0x15C, "M", "ŝ"), + (0x15D, "V"), + (0x15E, "M", "ş"), + (0x15F, "V"), + (0x160, "M", "š"), + (0x161, "V"), + (0x162, "M", "ţ"), + (0x163, "V"), + (0x164, "M", "ť"), + (0x165, "V"), + (0x166, "M", "ŧ"), + (0x167, "V"), + (0x168, "M", "ũ"), + (0x169, "V"), + (0x16A, "M", "ū"), + (0x16B, "V"), + (0x16C, "M", "ŭ"), + (0x16D, "V"), + (0x16E, "M", "ů"), + (0x16F, "V"), + (0x170, "M", "ű"), + (0x171, "V"), + (0x172, "M", "ų"), + (0x173, "V"), + (0x174, "M", "ŵ"), + (0x175, "V"), + (0x176, "M", "ŷ"), + (0x177, "V"), + (0x178, "M", "ÿ"), + (0x179, "M", "ź"), + (0x17A, "V"), + (0x17B, "M", "ż"), + (0x17C, "V"), + (0x17D, "M", "ž"), + (0x17E, "V"), + (0x17F, "M", "s"), + (0x180, "V"), + (0x181, "M", "ɓ"), + (0x182, "M", "ƃ"), + (0x183, "V"), + (0x184, "M", "ƅ"), + (0x185, "V"), + (0x186, "M", "ɔ"), + (0x187, "M", "ƈ"), + (0x188, "V"), + (0x189, "M", "ɖ"), + (0x18A, "M", "ɗ"), + (0x18B, "M", "ƌ"), + (0x18C, "V"), + (0x18E, "M", "ǝ"), + (0x18F, "M", "ə"), + (0x190, "M", "ɛ"), + (0x191, "M", "ƒ"), + (0x192, "V"), + (0x193, "M", "ɠ"), + ] + + +def _seg_4() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x194, "M", "ɣ"), + (0x195, "V"), + (0x196, "M", "ɩ"), + (0x197, "M", "ɨ"), + (0x198, "M", "ƙ"), + (0x199, "V"), + (0x19C, "M", "ɯ"), + (0x19D, "M", "ɲ"), + (0x19E, "V"), + (0x19F, "M", "ɵ"), + (0x1A0, "M", "ơ"), + (0x1A1, "V"), + (0x1A2, "M", "ƣ"), + (0x1A3, "V"), + (0x1A4, "M", "ƥ"), + (0x1A5, "V"), + (0x1A6, "M", "ʀ"), + (0x1A7, "M", "ƨ"), + (0x1A8, "V"), + (0x1A9, "M", "ʃ"), + (0x1AA, "V"), + (0x1AC, "M", "ƭ"), + (0x1AD, "V"), + (0x1AE, "M", "ʈ"), + (0x1AF, "M", "ư"), + (0x1B0, "V"), + (0x1B1, "M", "ʊ"), + (0x1B2, "M", "ʋ"), + (0x1B3, "M", "ƴ"), + (0x1B4, "V"), + (0x1B5, "M", "ƶ"), + (0x1B6, "V"), + (0x1B7, "M", "ʒ"), + (0x1B8, "M", "ƹ"), + (0x1B9, "V"), + (0x1BC, "M", "ƽ"), + (0x1BD, "V"), + (0x1C4, "M", "dž"), + (0x1C7, "M", "lj"), + (0x1CA, "M", "nj"), + (0x1CD, "M", "ǎ"), + (0x1CE, "V"), + (0x1CF, "M", "ǐ"), + (0x1D0, "V"), + (0x1D1, "M", "ǒ"), + (0x1D2, "V"), + (0x1D3, "M", "ǔ"), + (0x1D4, "V"), + (0x1D5, "M", "ǖ"), + (0x1D6, "V"), + (0x1D7, "M", "ǘ"), + (0x1D8, "V"), + (0x1D9, "M", "ǚ"), + (0x1DA, "V"), + (0x1DB, "M", "ǜ"), + (0x1DC, "V"), + (0x1DE, "M", "ǟ"), + (0x1DF, "V"), + (0x1E0, "M", "ǡ"), + (0x1E1, "V"), + (0x1E2, "M", "ǣ"), + (0x1E3, "V"), + (0x1E4, "M", "ǥ"), + (0x1E5, "V"), + (0x1E6, "M", "ǧ"), + (0x1E7, "V"), + (0x1E8, "M", "ǩ"), + (0x1E9, "V"), + (0x1EA, "M", "ǫ"), + (0x1EB, "V"), + (0x1EC, "M", "ǭ"), + (0x1ED, "V"), + (0x1EE, "M", "ǯ"), + (0x1EF, "V"), + (0x1F1, "M", "dz"), + (0x1F4, "M", "ǵ"), + (0x1F5, "V"), + (0x1F6, "M", "ƕ"), + (0x1F7, "M", "ƿ"), + (0x1F8, "M", "ǹ"), + (0x1F9, "V"), + (0x1FA, "M", "ǻ"), + (0x1FB, "V"), + (0x1FC, "M", "ǽ"), + (0x1FD, "V"), + (0x1FE, "M", "ǿ"), + (0x1FF, "V"), + (0x200, "M", "ȁ"), + (0x201, "V"), + (0x202, "M", "ȃ"), + (0x203, "V"), + (0x204, "M", "ȅ"), + (0x205, "V"), + (0x206, "M", "ȇ"), + (0x207, "V"), + (0x208, "M", "ȉ"), + (0x209, "V"), + (0x20A, "M", "ȋ"), + (0x20B, "V"), + (0x20C, "M", "ȍ"), + ] + + +def _seg_5() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x20D, "V"), + (0x20E, "M", "ȏ"), + (0x20F, "V"), + (0x210, "M", "ȑ"), + (0x211, "V"), + (0x212, "M", "ȓ"), + (0x213, "V"), + (0x214, "M", "ȕ"), + (0x215, "V"), + (0x216, "M", "ȗ"), + (0x217, "V"), + (0x218, "M", "ș"), + (0x219, "V"), + (0x21A, "M", "ț"), + (0x21B, "V"), + (0x21C, "M", "ȝ"), + (0x21D, "V"), + (0x21E, "M", "ȟ"), + (0x21F, "V"), + (0x220, "M", "ƞ"), + (0x221, "V"), + (0x222, "M", "ȣ"), + (0x223, "V"), + (0x224, "M", "ȥ"), + (0x225, "V"), + (0x226, "M", "ȧ"), + (0x227, "V"), + (0x228, "M", "ȩ"), + (0x229, "V"), + (0x22A, "M", "ȫ"), + (0x22B, "V"), + (0x22C, "M", "ȭ"), + (0x22D, "V"), + (0x22E, "M", "ȯ"), + (0x22F, "V"), + (0x230, "M", "ȱ"), + (0x231, "V"), + (0x232, "M", "ȳ"), + (0x233, "V"), + (0x23A, "M", "ⱥ"), + (0x23B, "M", "ȼ"), + (0x23C, "V"), + (0x23D, "M", "ƚ"), + (0x23E, "M", "ⱦ"), + (0x23F, "V"), + (0x241, "M", "ɂ"), + (0x242, "V"), + (0x243, "M", "ƀ"), + (0x244, "M", "ʉ"), + (0x245, "M", "ʌ"), + (0x246, "M", "ɇ"), + (0x247, "V"), + (0x248, "M", "ɉ"), + (0x249, "V"), + (0x24A, "M", "ɋ"), + (0x24B, "V"), + (0x24C, "M", "ɍ"), + (0x24D, "V"), + (0x24E, "M", "ɏ"), + (0x24F, "V"), + (0x2B0, "M", "h"), + (0x2B1, "M", "ɦ"), + (0x2B2, "M", "j"), + (0x2B3, "M", "r"), + (0x2B4, "M", "ɹ"), + (0x2B5, "M", "ɻ"), + (0x2B6, "M", "ʁ"), + (0x2B7, "M", "w"), + (0x2B8, "M", "y"), + (0x2B9, "V"), + (0x2D8, "M", " ̆"), + (0x2D9, "M", " ̇"), + (0x2DA, "M", " ̊"), + (0x2DB, "M", " ̨"), + (0x2DC, "M", " ̃"), + (0x2DD, "M", " ̋"), + (0x2DE, "V"), + (0x2E0, "M", "ɣ"), + (0x2E1, "M", "l"), + (0x2E2, "M", "s"), + (0x2E3, "M", "x"), + (0x2E4, "M", "ʕ"), + (0x2E5, "V"), + (0x340, "M", "̀"), + (0x341, "M", "́"), + (0x342, "V"), + (0x343, "M", "̓"), + (0x344, "M", "̈́"), + (0x345, "M", "ι"), + (0x346, "V"), + (0x34F, "I"), + (0x350, "V"), + (0x370, "M", "ͱ"), + (0x371, "V"), + (0x372, "M", "ͳ"), + (0x373, "V"), + (0x374, "M", "ʹ"), + (0x375, "V"), + (0x376, "M", "ͷ"), + (0x377, "V"), + ] + + +def _seg_6() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x378, "X"), + (0x37A, "M", " ι"), + (0x37B, "V"), + (0x37E, "M", ";"), + (0x37F, "M", "ϳ"), + (0x380, "X"), + (0x384, "M", " ́"), + (0x385, "M", " ̈́"), + (0x386, "M", "ά"), + (0x387, "M", "·"), + (0x388, "M", "έ"), + (0x389, "M", "ή"), + (0x38A, "M", "ί"), + (0x38B, "X"), + (0x38C, "M", "ό"), + (0x38D, "X"), + (0x38E, "M", "ύ"), + (0x38F, "M", "ώ"), + (0x390, "V"), + (0x391, "M", "α"), + (0x392, "M", "β"), + (0x393, "M", "γ"), + (0x394, "M", "δ"), + (0x395, "M", "ε"), + (0x396, "M", "ζ"), + (0x397, "M", "η"), + (0x398, "M", "θ"), + (0x399, "M", "ι"), + (0x39A, "M", "κ"), + (0x39B, "M", "λ"), + (0x39C, "M", "μ"), + (0x39D, "M", "ν"), + (0x39E, "M", "ξ"), + (0x39F, "M", "ο"), + (0x3A0, "M", "π"), + (0x3A1, "M", "ρ"), + (0x3A2, "X"), + (0x3A3, "M", "σ"), + (0x3A4, "M", "τ"), + (0x3A5, "M", "υ"), + (0x3A6, "M", "φ"), + (0x3A7, "M", "χ"), + (0x3A8, "M", "ψ"), + (0x3A9, "M", "ω"), + (0x3AA, "M", "ϊ"), + (0x3AB, "M", "ϋ"), + (0x3AC, "V"), + (0x3C2, "D", "σ"), + (0x3C3, "V"), + (0x3CF, "M", "ϗ"), + (0x3D0, "M", "β"), + (0x3D1, "M", "θ"), + (0x3D2, "M", "υ"), + (0x3D3, "M", "ύ"), + (0x3D4, "M", "ϋ"), + (0x3D5, "M", "φ"), + (0x3D6, "M", "π"), + (0x3D7, "V"), + (0x3D8, "M", "ϙ"), + (0x3D9, "V"), + (0x3DA, "M", "ϛ"), + (0x3DB, "V"), + (0x3DC, "M", "ϝ"), + (0x3DD, "V"), + (0x3DE, "M", "ϟ"), + (0x3DF, "V"), + (0x3E0, "M", "ϡ"), + (0x3E1, "V"), + (0x3E2, "M", "ϣ"), + (0x3E3, "V"), + (0x3E4, "M", "ϥ"), + (0x3E5, "V"), + (0x3E6, "M", "ϧ"), + (0x3E7, "V"), + (0x3E8, "M", "ϩ"), + (0x3E9, "V"), + (0x3EA, "M", "ϫ"), + (0x3EB, "V"), + (0x3EC, "M", "ϭ"), + (0x3ED, "V"), + (0x3EE, "M", "ϯ"), + (0x3EF, "V"), + (0x3F0, "M", "κ"), + (0x3F1, "M", "ρ"), + (0x3F2, "M", "σ"), + (0x3F3, "V"), + (0x3F4, "M", "θ"), + (0x3F5, "M", "ε"), + (0x3F6, "V"), + (0x3F7, "M", "ϸ"), + (0x3F8, "V"), + (0x3F9, "M", "σ"), + (0x3FA, "M", "ϻ"), + (0x3FB, "V"), + (0x3FD, "M", "ͻ"), + (0x3FE, "M", "ͼ"), + (0x3FF, "M", "ͽ"), + (0x400, "M", "ѐ"), + (0x401, "M", "ё"), + (0x402, "M", "ђ"), + ] + + +def _seg_7() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x403, "M", "ѓ"), + (0x404, "M", "є"), + (0x405, "M", "ѕ"), + (0x406, "M", "і"), + (0x407, "M", "ї"), + (0x408, "M", "ј"), + (0x409, "M", "љ"), + (0x40A, "M", "њ"), + (0x40B, "M", "ћ"), + (0x40C, "M", "ќ"), + (0x40D, "M", "ѝ"), + (0x40E, "M", "ў"), + (0x40F, "M", "џ"), + (0x410, "M", "а"), + (0x411, "M", "б"), + (0x412, "M", "в"), + (0x413, "M", "г"), + (0x414, "M", "д"), + (0x415, "M", "е"), + (0x416, "M", "ж"), + (0x417, "M", "з"), + (0x418, "M", "и"), + (0x419, "M", "й"), + (0x41A, "M", "к"), + (0x41B, "M", "л"), + (0x41C, "M", "м"), + (0x41D, "M", "н"), + (0x41E, "M", "о"), + (0x41F, "M", "п"), + (0x420, "M", "р"), + (0x421, "M", "с"), + (0x422, "M", "т"), + (0x423, "M", "у"), + (0x424, "M", "ф"), + (0x425, "M", "х"), + (0x426, "M", "ц"), + (0x427, "M", "ч"), + (0x428, "M", "ш"), + (0x429, "M", "щ"), + (0x42A, "M", "ъ"), + (0x42B, "M", "ы"), + (0x42C, "M", "ь"), + (0x42D, "M", "э"), + (0x42E, "M", "ю"), + (0x42F, "M", "я"), + (0x430, "V"), + (0x460, "M", "ѡ"), + (0x461, "V"), + (0x462, "M", "ѣ"), + (0x463, "V"), + (0x464, "M", "ѥ"), + (0x465, "V"), + (0x466, "M", "ѧ"), + (0x467, "V"), + (0x468, "M", "ѩ"), + (0x469, "V"), + (0x46A, "M", "ѫ"), + (0x46B, "V"), + (0x46C, "M", "ѭ"), + (0x46D, "V"), + (0x46E, "M", "ѯ"), + (0x46F, "V"), + (0x470, "M", "ѱ"), + (0x471, "V"), + (0x472, "M", "ѳ"), + (0x473, "V"), + (0x474, "M", "ѵ"), + (0x475, "V"), + (0x476, "M", "ѷ"), + (0x477, "V"), + (0x478, "M", "ѹ"), + (0x479, "V"), + (0x47A, "M", "ѻ"), + (0x47B, "V"), + (0x47C, "M", "ѽ"), + (0x47D, "V"), + (0x47E, "M", "ѿ"), + (0x47F, "V"), + (0x480, "M", "ҁ"), + (0x481, "V"), + (0x48A, "M", "ҋ"), + (0x48B, "V"), + (0x48C, "M", "ҍ"), + (0x48D, "V"), + (0x48E, "M", "ҏ"), + (0x48F, "V"), + (0x490, "M", "ґ"), + (0x491, "V"), + (0x492, "M", "ғ"), + (0x493, "V"), + (0x494, "M", "ҕ"), + (0x495, "V"), + (0x496, "M", "җ"), + (0x497, "V"), + (0x498, "M", "ҙ"), + (0x499, "V"), + (0x49A, "M", "қ"), + (0x49B, "V"), + (0x49C, "M", "ҝ"), + (0x49D, "V"), + ] + + +def _seg_8() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x49E, "M", "ҟ"), + (0x49F, "V"), + (0x4A0, "M", "ҡ"), + (0x4A1, "V"), + (0x4A2, "M", "ң"), + (0x4A3, "V"), + (0x4A4, "M", "ҥ"), + (0x4A5, "V"), + (0x4A6, "M", "ҧ"), + (0x4A7, "V"), + (0x4A8, "M", "ҩ"), + (0x4A9, "V"), + (0x4AA, "M", "ҫ"), + (0x4AB, "V"), + (0x4AC, "M", "ҭ"), + (0x4AD, "V"), + (0x4AE, "M", "ү"), + (0x4AF, "V"), + (0x4B0, "M", "ұ"), + (0x4B1, "V"), + (0x4B2, "M", "ҳ"), + (0x4B3, "V"), + (0x4B4, "M", "ҵ"), + (0x4B5, "V"), + (0x4B6, "M", "ҷ"), + (0x4B7, "V"), + (0x4B8, "M", "ҹ"), + (0x4B9, "V"), + (0x4BA, "M", "һ"), + (0x4BB, "V"), + (0x4BC, "M", "ҽ"), + (0x4BD, "V"), + (0x4BE, "M", "ҿ"), + (0x4BF, "V"), + (0x4C0, "M", "ӏ"), + (0x4C1, "M", "ӂ"), + (0x4C2, "V"), + (0x4C3, "M", "ӄ"), + (0x4C4, "V"), + (0x4C5, "M", "ӆ"), + (0x4C6, "V"), + (0x4C7, "M", "ӈ"), + (0x4C8, "V"), + (0x4C9, "M", "ӊ"), + (0x4CA, "V"), + (0x4CB, "M", "ӌ"), + (0x4CC, "V"), + (0x4CD, "M", "ӎ"), + (0x4CE, "V"), + (0x4D0, "M", "ӑ"), + (0x4D1, "V"), + (0x4D2, "M", "ӓ"), + (0x4D3, "V"), + (0x4D4, "M", "ӕ"), + (0x4D5, "V"), + (0x4D6, "M", "ӗ"), + (0x4D7, "V"), + (0x4D8, "M", "ә"), + (0x4D9, "V"), + (0x4DA, "M", "ӛ"), + (0x4DB, "V"), + (0x4DC, "M", "ӝ"), + (0x4DD, "V"), + (0x4DE, "M", "ӟ"), + (0x4DF, "V"), + (0x4E0, "M", "ӡ"), + (0x4E1, "V"), + (0x4E2, "M", "ӣ"), + (0x4E3, "V"), + (0x4E4, "M", "ӥ"), + (0x4E5, "V"), + (0x4E6, "M", "ӧ"), + (0x4E7, "V"), + (0x4E8, "M", "ө"), + (0x4E9, "V"), + (0x4EA, "M", "ӫ"), + (0x4EB, "V"), + (0x4EC, "M", "ӭ"), + (0x4ED, "V"), + (0x4EE, "M", "ӯ"), + (0x4EF, "V"), + (0x4F0, "M", "ӱ"), + (0x4F1, "V"), + (0x4F2, "M", "ӳ"), + (0x4F3, "V"), + (0x4F4, "M", "ӵ"), + (0x4F5, "V"), + (0x4F6, "M", "ӷ"), + (0x4F7, "V"), + (0x4F8, "M", "ӹ"), + (0x4F9, "V"), + (0x4FA, "M", "ӻ"), + (0x4FB, "V"), + (0x4FC, "M", "ӽ"), + (0x4FD, "V"), + (0x4FE, "M", "ӿ"), + (0x4FF, "V"), + (0x500, "M", "ԁ"), + (0x501, "V"), + (0x502, "M", "ԃ"), + ] + + +def _seg_9() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x503, "V"), + (0x504, "M", "ԅ"), + (0x505, "V"), + (0x506, "M", "ԇ"), + (0x507, "V"), + (0x508, "M", "ԉ"), + (0x509, "V"), + (0x50A, "M", "ԋ"), + (0x50B, "V"), + (0x50C, "M", "ԍ"), + (0x50D, "V"), + (0x50E, "M", "ԏ"), + (0x50F, "V"), + (0x510, "M", "ԑ"), + (0x511, "V"), + (0x512, "M", "ԓ"), + (0x513, "V"), + (0x514, "M", "ԕ"), + (0x515, "V"), + (0x516, "M", "ԗ"), + (0x517, "V"), + (0x518, "M", "ԙ"), + (0x519, "V"), + (0x51A, "M", "ԛ"), + (0x51B, "V"), + (0x51C, "M", "ԝ"), + (0x51D, "V"), + (0x51E, "M", "ԟ"), + (0x51F, "V"), + (0x520, "M", "ԡ"), + (0x521, "V"), + (0x522, "M", "ԣ"), + (0x523, "V"), + (0x524, "M", "ԥ"), + (0x525, "V"), + (0x526, "M", "ԧ"), + (0x527, "V"), + (0x528, "M", "ԩ"), + (0x529, "V"), + (0x52A, "M", "ԫ"), + (0x52B, "V"), + (0x52C, "M", "ԭ"), + (0x52D, "V"), + (0x52E, "M", "ԯ"), + (0x52F, "V"), + (0x530, "X"), + (0x531, "M", "ա"), + (0x532, "M", "բ"), + (0x533, "M", "գ"), + (0x534, "M", "դ"), + (0x535, "M", "ե"), + (0x536, "M", "զ"), + (0x537, "M", "է"), + (0x538, "M", "ը"), + (0x539, "M", "թ"), + (0x53A, "M", "ժ"), + (0x53B, "M", "ի"), + (0x53C, "M", "լ"), + (0x53D, "M", "խ"), + (0x53E, "M", "ծ"), + (0x53F, "M", "կ"), + (0x540, "M", "հ"), + (0x541, "M", "ձ"), + (0x542, "M", "ղ"), + (0x543, "M", "ճ"), + (0x544, "M", "մ"), + (0x545, "M", "յ"), + (0x546, "M", "ն"), + (0x547, "M", "շ"), + (0x548, "M", "ո"), + (0x549, "M", "չ"), + (0x54A, "M", "պ"), + (0x54B, "M", "ջ"), + (0x54C, "M", "ռ"), + (0x54D, "M", "ս"), + (0x54E, "M", "վ"), + (0x54F, "M", "տ"), + (0x550, "M", "ր"), + (0x551, "M", "ց"), + (0x552, "M", "ւ"), + (0x553, "M", "փ"), + (0x554, "M", "ք"), + (0x555, "M", "օ"), + (0x556, "M", "ֆ"), + (0x557, "X"), + (0x559, "V"), + (0x587, "M", "եւ"), + (0x588, "V"), + (0x58B, "X"), + (0x58D, "V"), + (0x590, "X"), + (0x591, "V"), + (0x5C8, "X"), + (0x5D0, "V"), + (0x5EB, "X"), + (0x5EF, "V"), + (0x5F5, "X"), + (0x606, "V"), + (0x61C, "X"), + (0x61D, "V"), + ] + + +def _seg_10() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x675, "M", "اٴ"), + (0x676, "M", "وٴ"), + (0x677, "M", "ۇٴ"), + (0x678, "M", "يٴ"), + (0x679, "V"), + (0x6DD, "X"), + (0x6DE, "V"), + (0x70E, "X"), + (0x710, "V"), + (0x74B, "X"), + (0x74D, "V"), + (0x7B2, "X"), + (0x7C0, "V"), + (0x7FB, "X"), + (0x7FD, "V"), + (0x82E, "X"), + (0x830, "V"), + (0x83F, "X"), + (0x840, "V"), + (0x85C, "X"), + (0x85E, "V"), + (0x85F, "X"), + (0x860, "V"), + (0x86B, "X"), + (0x870, "V"), + (0x88F, "X"), + (0x897, "V"), + (0x8E2, "X"), + (0x8E3, "V"), + (0x958, "M", "क़"), + (0x959, "M", "ख़"), + (0x95A, "M", "ग़"), + (0x95B, "M", "ज़"), + (0x95C, "M", "ड़"), + (0x95D, "M", "ढ़"), + (0x95E, "M", "फ़"), + (0x95F, "M", "य़"), + (0x960, "V"), + (0x984, "X"), + (0x985, "V"), + (0x98D, "X"), + (0x98F, "V"), + (0x991, "X"), + (0x993, "V"), + (0x9A9, "X"), + (0x9AA, "V"), + (0x9B1, "X"), + (0x9B2, "V"), + (0x9B3, "X"), + (0x9B6, "V"), + (0x9BA, "X"), + (0x9BC, "V"), + (0x9C5, "X"), + (0x9C7, "V"), + (0x9C9, "X"), + (0x9CB, "V"), + (0x9CF, "X"), + (0x9D7, "V"), + (0x9D8, "X"), + (0x9DC, "M", "ড়"), + (0x9DD, "M", "ঢ়"), + (0x9DE, "X"), + (0x9DF, "M", "য়"), + (0x9E0, "V"), + (0x9E4, "X"), + (0x9E6, "V"), + (0x9FF, "X"), + (0xA01, "V"), + (0xA04, "X"), + (0xA05, "V"), + (0xA0B, "X"), + (0xA0F, "V"), + (0xA11, "X"), + (0xA13, "V"), + (0xA29, "X"), + (0xA2A, "V"), + (0xA31, "X"), + (0xA32, "V"), + (0xA33, "M", "ਲ਼"), + (0xA34, "X"), + (0xA35, "V"), + (0xA36, "M", "ਸ਼"), + (0xA37, "X"), + (0xA38, "V"), + (0xA3A, "X"), + (0xA3C, "V"), + (0xA3D, "X"), + (0xA3E, "V"), + (0xA43, "X"), + (0xA47, "V"), + (0xA49, "X"), + (0xA4B, "V"), + (0xA4E, "X"), + (0xA51, "V"), + (0xA52, "X"), + (0xA59, "M", "ਖ਼"), + (0xA5A, "M", "ਗ਼"), + (0xA5B, "M", "ਜ਼"), + (0xA5C, "V"), + (0xA5D, "X"), + ] + + +def _seg_11() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xA5E, "M", "ਫ਼"), + (0xA5F, "X"), + (0xA66, "V"), + (0xA77, "X"), + (0xA81, "V"), + (0xA84, "X"), + (0xA85, "V"), + (0xA8E, "X"), + (0xA8F, "V"), + (0xA92, "X"), + (0xA93, "V"), + (0xAA9, "X"), + (0xAAA, "V"), + (0xAB1, "X"), + (0xAB2, "V"), + (0xAB4, "X"), + (0xAB5, "V"), + (0xABA, "X"), + (0xABC, "V"), + (0xAC6, "X"), + (0xAC7, "V"), + (0xACA, "X"), + (0xACB, "V"), + (0xACE, "X"), + (0xAD0, "V"), + (0xAD1, "X"), + (0xAE0, "V"), + (0xAE4, "X"), + (0xAE6, "V"), + (0xAF2, "X"), + (0xAF9, "V"), + (0xB00, "X"), + (0xB01, "V"), + (0xB04, "X"), + (0xB05, "V"), + (0xB0D, "X"), + (0xB0F, "V"), + (0xB11, "X"), + (0xB13, "V"), + (0xB29, "X"), + (0xB2A, "V"), + (0xB31, "X"), + (0xB32, "V"), + (0xB34, "X"), + (0xB35, "V"), + (0xB3A, "X"), + (0xB3C, "V"), + (0xB45, "X"), + (0xB47, "V"), + (0xB49, "X"), + (0xB4B, "V"), + (0xB4E, "X"), + (0xB55, "V"), + (0xB58, "X"), + (0xB5C, "M", "ଡ଼"), + (0xB5D, "M", "ଢ଼"), + (0xB5E, "X"), + (0xB5F, "V"), + (0xB64, "X"), + (0xB66, "V"), + (0xB78, "X"), + (0xB82, "V"), + (0xB84, "X"), + (0xB85, "V"), + (0xB8B, "X"), + (0xB8E, "V"), + (0xB91, "X"), + (0xB92, "V"), + (0xB96, "X"), + (0xB99, "V"), + (0xB9B, "X"), + (0xB9C, "V"), + (0xB9D, "X"), + (0xB9E, "V"), + (0xBA0, "X"), + (0xBA3, "V"), + (0xBA5, "X"), + (0xBA8, "V"), + (0xBAB, "X"), + (0xBAE, "V"), + (0xBBA, "X"), + (0xBBE, "V"), + (0xBC3, "X"), + (0xBC6, "V"), + (0xBC9, "X"), + (0xBCA, "V"), + (0xBCE, "X"), + (0xBD0, "V"), + (0xBD1, "X"), + (0xBD7, "V"), + (0xBD8, "X"), + (0xBE6, "V"), + (0xBFB, "X"), + (0xC00, "V"), + (0xC0D, "X"), + (0xC0E, "V"), + (0xC11, "X"), + (0xC12, "V"), + (0xC29, "X"), + (0xC2A, "V"), + ] + + +def _seg_12() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xC3A, "X"), + (0xC3C, "V"), + (0xC45, "X"), + (0xC46, "V"), + (0xC49, "X"), + (0xC4A, "V"), + (0xC4E, "X"), + (0xC55, "V"), + (0xC57, "X"), + (0xC58, "V"), + (0xC5B, "X"), + (0xC5D, "V"), + (0xC5E, "X"), + (0xC60, "V"), + (0xC64, "X"), + (0xC66, "V"), + (0xC70, "X"), + (0xC77, "V"), + (0xC8D, "X"), + (0xC8E, "V"), + (0xC91, "X"), + (0xC92, "V"), + (0xCA9, "X"), + (0xCAA, "V"), + (0xCB4, "X"), + (0xCB5, "V"), + (0xCBA, "X"), + (0xCBC, "V"), + (0xCC5, "X"), + (0xCC6, "V"), + (0xCC9, "X"), + (0xCCA, "V"), + (0xCCE, "X"), + (0xCD5, "V"), + (0xCD7, "X"), + (0xCDD, "V"), + (0xCDF, "X"), + (0xCE0, "V"), + (0xCE4, "X"), + (0xCE6, "V"), + (0xCF0, "X"), + (0xCF1, "V"), + (0xCF4, "X"), + (0xD00, "V"), + (0xD0D, "X"), + (0xD0E, "V"), + (0xD11, "X"), + (0xD12, "V"), + (0xD45, "X"), + (0xD46, "V"), + (0xD49, "X"), + (0xD4A, "V"), + (0xD50, "X"), + (0xD54, "V"), + (0xD64, "X"), + (0xD66, "V"), + (0xD80, "X"), + (0xD81, "V"), + (0xD84, "X"), + (0xD85, "V"), + (0xD97, "X"), + (0xD9A, "V"), + (0xDB2, "X"), + (0xDB3, "V"), + (0xDBC, "X"), + (0xDBD, "V"), + (0xDBE, "X"), + (0xDC0, "V"), + (0xDC7, "X"), + (0xDCA, "V"), + (0xDCB, "X"), + (0xDCF, "V"), + (0xDD5, "X"), + (0xDD6, "V"), + (0xDD7, "X"), + (0xDD8, "V"), + (0xDE0, "X"), + (0xDE6, "V"), + (0xDF0, "X"), + (0xDF2, "V"), + (0xDF5, "X"), + (0xE01, "V"), + (0xE33, "M", "ํา"), + (0xE34, "V"), + (0xE3B, "X"), + (0xE3F, "V"), + (0xE5C, "X"), + (0xE81, "V"), + (0xE83, "X"), + (0xE84, "V"), + (0xE85, "X"), + (0xE86, "V"), + (0xE8B, "X"), + (0xE8C, "V"), + (0xEA4, "X"), + (0xEA5, "V"), + (0xEA6, "X"), + (0xEA7, "V"), + (0xEB3, "M", "ໍາ"), + (0xEB4, "V"), + ] + + +def _seg_13() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xEBE, "X"), + (0xEC0, "V"), + (0xEC5, "X"), + (0xEC6, "V"), + (0xEC7, "X"), + (0xEC8, "V"), + (0xECF, "X"), + (0xED0, "V"), + (0xEDA, "X"), + (0xEDC, "M", "ຫນ"), + (0xEDD, "M", "ຫມ"), + (0xEDE, "V"), + (0xEE0, "X"), + (0xF00, "V"), + (0xF0C, "M", "་"), + (0xF0D, "V"), + (0xF43, "M", "གྷ"), + (0xF44, "V"), + (0xF48, "X"), + (0xF49, "V"), + (0xF4D, "M", "ཌྷ"), + (0xF4E, "V"), + (0xF52, "M", "དྷ"), + (0xF53, "V"), + (0xF57, "M", "བྷ"), + (0xF58, "V"), + (0xF5C, "M", "ཛྷ"), + (0xF5D, "V"), + (0xF69, "M", "ཀྵ"), + (0xF6A, "V"), + (0xF6D, "X"), + (0xF71, "V"), + (0xF73, "M", "ཱི"), + (0xF74, "V"), + (0xF75, "M", "ཱུ"), + (0xF76, "M", "ྲྀ"), + (0xF77, "M", "ྲཱྀ"), + (0xF78, "M", "ླྀ"), + (0xF79, "M", "ླཱྀ"), + (0xF7A, "V"), + (0xF81, "M", "ཱྀ"), + (0xF82, "V"), + (0xF93, "M", "ྒྷ"), + (0xF94, "V"), + (0xF98, "X"), + (0xF99, "V"), + (0xF9D, "M", "ྜྷ"), + (0xF9E, "V"), + (0xFA2, "M", "ྡྷ"), + (0xFA3, "V"), + (0xFA7, "M", "ྦྷ"), + (0xFA8, "V"), + (0xFAC, "M", "ྫྷ"), + (0xFAD, "V"), + (0xFB9, "M", "ྐྵ"), + (0xFBA, "V"), + (0xFBD, "X"), + (0xFBE, "V"), + (0xFCD, "X"), + (0xFCE, "V"), + (0xFDB, "X"), + (0x1000, "V"), + (0x10A0, "M", "ⴀ"), + (0x10A1, "M", "ⴁ"), + (0x10A2, "M", "ⴂ"), + (0x10A3, "M", "ⴃ"), + (0x10A4, "M", "ⴄ"), + (0x10A5, "M", "ⴅ"), + (0x10A6, "M", "ⴆ"), + (0x10A7, "M", "ⴇ"), + (0x10A8, "M", "ⴈ"), + (0x10A9, "M", "ⴉ"), + (0x10AA, "M", "ⴊ"), + (0x10AB, "M", "ⴋ"), + (0x10AC, "M", "ⴌ"), + (0x10AD, "M", "ⴍ"), + (0x10AE, "M", "ⴎ"), + (0x10AF, "M", "ⴏ"), + (0x10B0, "M", "ⴐ"), + (0x10B1, "M", "ⴑ"), + (0x10B2, "M", "ⴒ"), + (0x10B3, "M", "ⴓ"), + (0x10B4, "M", "ⴔ"), + (0x10B5, "M", "ⴕ"), + (0x10B6, "M", "ⴖ"), + (0x10B7, "M", "ⴗ"), + (0x10B8, "M", "ⴘ"), + (0x10B9, "M", "ⴙ"), + (0x10BA, "M", "ⴚ"), + (0x10BB, "M", "ⴛ"), + (0x10BC, "M", "ⴜ"), + (0x10BD, "M", "ⴝ"), + (0x10BE, "M", "ⴞ"), + (0x10BF, "M", "ⴟ"), + (0x10C0, "M", "ⴠ"), + (0x10C1, "M", "ⴡ"), + (0x10C2, "M", "ⴢ"), + (0x10C3, "M", "ⴣ"), + (0x10C4, "M", "ⴤ"), + (0x10C5, "M", "ⴥ"), + ] + + +def _seg_14() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x10C6, "X"), + (0x10C7, "M", "ⴧ"), + (0x10C8, "X"), + (0x10CD, "M", "ⴭ"), + (0x10CE, "X"), + (0x10D0, "V"), + (0x10FC, "M", "ნ"), + (0x10FD, "V"), + (0x115F, "I"), + (0x1161, "V"), + (0x1249, "X"), + (0x124A, "V"), + (0x124E, "X"), + (0x1250, "V"), + (0x1257, "X"), + (0x1258, "V"), + (0x1259, "X"), + (0x125A, "V"), + (0x125E, "X"), + (0x1260, "V"), + (0x1289, "X"), + (0x128A, "V"), + (0x128E, "X"), + (0x1290, "V"), + (0x12B1, "X"), + (0x12B2, "V"), + (0x12B6, "X"), + (0x12B8, "V"), + (0x12BF, "X"), + (0x12C0, "V"), + (0x12C1, "X"), + (0x12C2, "V"), + (0x12C6, "X"), + (0x12C8, "V"), + (0x12D7, "X"), + (0x12D8, "V"), + (0x1311, "X"), + (0x1312, "V"), + (0x1316, "X"), + (0x1318, "V"), + (0x135B, "X"), + (0x135D, "V"), + (0x137D, "X"), + (0x1380, "V"), + (0x139A, "X"), + (0x13A0, "V"), + (0x13F6, "X"), + (0x13F8, "M", "Ᏸ"), + (0x13F9, "M", "Ᏹ"), + (0x13FA, "M", "Ᏺ"), + (0x13FB, "M", "Ᏻ"), + (0x13FC, "M", "Ᏼ"), + (0x13FD, "M", "Ᏽ"), + (0x13FE, "X"), + (0x1400, "V"), + (0x1680, "X"), + (0x1681, "V"), + (0x169D, "X"), + (0x16A0, "V"), + (0x16F9, "X"), + (0x1700, "V"), + (0x1716, "X"), + (0x171F, "V"), + (0x1737, "X"), + (0x1740, "V"), + (0x1754, "X"), + (0x1760, "V"), + (0x176D, "X"), + (0x176E, "V"), + (0x1771, "X"), + (0x1772, "V"), + (0x1774, "X"), + (0x1780, "V"), + (0x17B4, "I"), + (0x17B6, "V"), + (0x17DE, "X"), + (0x17E0, "V"), + (0x17EA, "X"), + (0x17F0, "V"), + (0x17FA, "X"), + (0x1800, "V"), + (0x180B, "I"), + (0x1810, "V"), + (0x181A, "X"), + (0x1820, "V"), + (0x1879, "X"), + (0x1880, "V"), + (0x18AB, "X"), + (0x18B0, "V"), + (0x18F6, "X"), + (0x1900, "V"), + (0x191F, "X"), + (0x1920, "V"), + (0x192C, "X"), + (0x1930, "V"), + (0x193C, "X"), + (0x1940, "V"), + (0x1941, "X"), + (0x1944, "V"), + (0x196E, "X"), + ] + + +def _seg_15() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1970, "V"), + (0x1975, "X"), + (0x1980, "V"), + (0x19AC, "X"), + (0x19B0, "V"), + (0x19CA, "X"), + (0x19D0, "V"), + (0x19DB, "X"), + (0x19DE, "V"), + (0x1A1C, "X"), + (0x1A1E, "V"), + (0x1A5F, "X"), + (0x1A60, "V"), + (0x1A7D, "X"), + (0x1A7F, "V"), + (0x1A8A, "X"), + (0x1A90, "V"), + (0x1A9A, "X"), + (0x1AA0, "V"), + (0x1AAE, "X"), + (0x1AB0, "V"), + (0x1ACF, "X"), + (0x1B00, "V"), + (0x1B4D, "X"), + (0x1B4E, "V"), + (0x1BF4, "X"), + (0x1BFC, "V"), + (0x1C38, "X"), + (0x1C3B, "V"), + (0x1C4A, "X"), + (0x1C4D, "V"), + (0x1C80, "M", "в"), + (0x1C81, "M", "д"), + (0x1C82, "M", "о"), + (0x1C83, "M", "с"), + (0x1C84, "M", "т"), + (0x1C86, "M", "ъ"), + (0x1C87, "M", "ѣ"), + (0x1C88, "M", "ꙋ"), + (0x1C89, "M", "ᲊ"), + (0x1C8A, "V"), + (0x1C8B, "X"), + (0x1C90, "M", "ა"), + (0x1C91, "M", "ბ"), + (0x1C92, "M", "გ"), + (0x1C93, "M", "დ"), + (0x1C94, "M", "ე"), + (0x1C95, "M", "ვ"), + (0x1C96, "M", "ზ"), + (0x1C97, "M", "თ"), + (0x1C98, "M", "ი"), + (0x1C99, "M", "კ"), + (0x1C9A, "M", "ლ"), + (0x1C9B, "M", "მ"), + (0x1C9C, "M", "ნ"), + (0x1C9D, "M", "ო"), + (0x1C9E, "M", "პ"), + (0x1C9F, "M", "ჟ"), + (0x1CA0, "M", "რ"), + (0x1CA1, "M", "ს"), + (0x1CA2, "M", "ტ"), + (0x1CA3, "M", "უ"), + (0x1CA4, "M", "ფ"), + (0x1CA5, "M", "ქ"), + (0x1CA6, "M", "ღ"), + (0x1CA7, "M", "ყ"), + (0x1CA8, "M", "შ"), + (0x1CA9, "M", "ჩ"), + (0x1CAA, "M", "ც"), + (0x1CAB, "M", "ძ"), + (0x1CAC, "M", "წ"), + (0x1CAD, "M", "ჭ"), + (0x1CAE, "M", "ხ"), + (0x1CAF, "M", "ჯ"), + (0x1CB0, "M", "ჰ"), + (0x1CB1, "M", "ჱ"), + (0x1CB2, "M", "ჲ"), + (0x1CB3, "M", "ჳ"), + (0x1CB4, "M", "ჴ"), + (0x1CB5, "M", "ჵ"), + (0x1CB6, "M", "ჶ"), + (0x1CB7, "M", "ჷ"), + (0x1CB8, "M", "ჸ"), + (0x1CB9, "M", "ჹ"), + (0x1CBA, "M", "ჺ"), + (0x1CBB, "X"), + (0x1CBD, "M", "ჽ"), + (0x1CBE, "M", "ჾ"), + (0x1CBF, "M", "ჿ"), + (0x1CC0, "V"), + (0x1CC8, "X"), + (0x1CD0, "V"), + (0x1CFB, "X"), + (0x1D00, "V"), + (0x1D2C, "M", "a"), + (0x1D2D, "M", "æ"), + (0x1D2E, "M", "b"), + (0x1D2F, "V"), + (0x1D30, "M", "d"), + (0x1D31, "M", "e"), + ] + + +def _seg_16() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D32, "M", "ǝ"), + (0x1D33, "M", "g"), + (0x1D34, "M", "h"), + (0x1D35, "M", "i"), + (0x1D36, "M", "j"), + (0x1D37, "M", "k"), + (0x1D38, "M", "l"), + (0x1D39, "M", "m"), + (0x1D3A, "M", "n"), + (0x1D3B, "V"), + (0x1D3C, "M", "o"), + (0x1D3D, "M", "ȣ"), + (0x1D3E, "M", "p"), + (0x1D3F, "M", "r"), + (0x1D40, "M", "t"), + (0x1D41, "M", "u"), + (0x1D42, "M", "w"), + (0x1D43, "M", "a"), + (0x1D44, "M", "ɐ"), + (0x1D45, "M", "ɑ"), + (0x1D46, "M", "ᴂ"), + (0x1D47, "M", "b"), + (0x1D48, "M", "d"), + (0x1D49, "M", "e"), + (0x1D4A, "M", "ə"), + (0x1D4B, "M", "ɛ"), + (0x1D4C, "M", "ɜ"), + (0x1D4D, "M", "g"), + (0x1D4E, "V"), + (0x1D4F, "M", "k"), + (0x1D50, "M", "m"), + (0x1D51, "M", "ŋ"), + (0x1D52, "M", "o"), + (0x1D53, "M", "ɔ"), + (0x1D54, "M", "ᴖ"), + (0x1D55, "M", "ᴗ"), + (0x1D56, "M", "p"), + (0x1D57, "M", "t"), + (0x1D58, "M", "u"), + (0x1D59, "M", "ᴝ"), + (0x1D5A, "M", "ɯ"), + (0x1D5B, "M", "v"), + (0x1D5C, "M", "ᴥ"), + (0x1D5D, "M", "β"), + (0x1D5E, "M", "γ"), + (0x1D5F, "M", "δ"), + (0x1D60, "M", "φ"), + (0x1D61, "M", "χ"), + (0x1D62, "M", "i"), + (0x1D63, "M", "r"), + (0x1D64, "M", "u"), + (0x1D65, "M", "v"), + (0x1D66, "M", "β"), + (0x1D67, "M", "γ"), + (0x1D68, "M", "ρ"), + (0x1D69, "M", "φ"), + (0x1D6A, "M", "χ"), + (0x1D6B, "V"), + (0x1D78, "M", "н"), + (0x1D79, "V"), + (0x1D9B, "M", "ɒ"), + (0x1D9C, "M", "c"), + (0x1D9D, "M", "ɕ"), + (0x1D9E, "M", "ð"), + (0x1D9F, "M", "ɜ"), + (0x1DA0, "M", "f"), + (0x1DA1, "M", "ɟ"), + (0x1DA2, "M", "ɡ"), + (0x1DA3, "M", "ɥ"), + (0x1DA4, "M", "ɨ"), + (0x1DA5, "M", "ɩ"), + (0x1DA6, "M", "ɪ"), + (0x1DA7, "M", "ᵻ"), + (0x1DA8, "M", "ʝ"), + (0x1DA9, "M", "ɭ"), + (0x1DAA, "M", "ᶅ"), + (0x1DAB, "M", "ʟ"), + (0x1DAC, "M", "ɱ"), + (0x1DAD, "M", "ɰ"), + (0x1DAE, "M", "ɲ"), + (0x1DAF, "M", "ɳ"), + (0x1DB0, "M", "ɴ"), + (0x1DB1, "M", "ɵ"), + (0x1DB2, "M", "ɸ"), + (0x1DB3, "M", "ʂ"), + (0x1DB4, "M", "ʃ"), + (0x1DB5, "M", "ƫ"), + (0x1DB6, "M", "ʉ"), + (0x1DB7, "M", "ʊ"), + (0x1DB8, "M", "ᴜ"), + (0x1DB9, "M", "ʋ"), + (0x1DBA, "M", "ʌ"), + (0x1DBB, "M", "z"), + (0x1DBC, "M", "ʐ"), + (0x1DBD, "M", "ʑ"), + (0x1DBE, "M", "ʒ"), + (0x1DBF, "M", "θ"), + (0x1DC0, "V"), + (0x1E00, "M", "ḁ"), + (0x1E01, "V"), + ] + + +def _seg_17() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1E02, "M", "ḃ"), + (0x1E03, "V"), + (0x1E04, "M", "ḅ"), + (0x1E05, "V"), + (0x1E06, "M", "ḇ"), + (0x1E07, "V"), + (0x1E08, "M", "ḉ"), + (0x1E09, "V"), + (0x1E0A, "M", "ḋ"), + (0x1E0B, "V"), + (0x1E0C, "M", "ḍ"), + (0x1E0D, "V"), + (0x1E0E, "M", "ḏ"), + (0x1E0F, "V"), + (0x1E10, "M", "ḑ"), + (0x1E11, "V"), + (0x1E12, "M", "ḓ"), + (0x1E13, "V"), + (0x1E14, "M", "ḕ"), + (0x1E15, "V"), + (0x1E16, "M", "ḗ"), + (0x1E17, "V"), + (0x1E18, "M", "ḙ"), + (0x1E19, "V"), + (0x1E1A, "M", "ḛ"), + (0x1E1B, "V"), + (0x1E1C, "M", "ḝ"), + (0x1E1D, "V"), + (0x1E1E, "M", "ḟ"), + (0x1E1F, "V"), + (0x1E20, "M", "ḡ"), + (0x1E21, "V"), + (0x1E22, "M", "ḣ"), + (0x1E23, "V"), + (0x1E24, "M", "ḥ"), + (0x1E25, "V"), + (0x1E26, "M", "ḧ"), + (0x1E27, "V"), + (0x1E28, "M", "ḩ"), + (0x1E29, "V"), + (0x1E2A, "M", "ḫ"), + (0x1E2B, "V"), + (0x1E2C, "M", "ḭ"), + (0x1E2D, "V"), + (0x1E2E, "M", "ḯ"), + (0x1E2F, "V"), + (0x1E30, "M", "ḱ"), + (0x1E31, "V"), + (0x1E32, "M", "ḳ"), + (0x1E33, "V"), + (0x1E34, "M", "ḵ"), + (0x1E35, "V"), + (0x1E36, "M", "ḷ"), + (0x1E37, "V"), + (0x1E38, "M", "ḹ"), + (0x1E39, "V"), + (0x1E3A, "M", "ḻ"), + (0x1E3B, "V"), + (0x1E3C, "M", "ḽ"), + (0x1E3D, "V"), + (0x1E3E, "M", "ḿ"), + (0x1E3F, "V"), + (0x1E40, "M", "ṁ"), + (0x1E41, "V"), + (0x1E42, "M", "ṃ"), + (0x1E43, "V"), + (0x1E44, "M", "ṅ"), + (0x1E45, "V"), + (0x1E46, "M", "ṇ"), + (0x1E47, "V"), + (0x1E48, "M", "ṉ"), + (0x1E49, "V"), + (0x1E4A, "M", "ṋ"), + (0x1E4B, "V"), + (0x1E4C, "M", "ṍ"), + (0x1E4D, "V"), + (0x1E4E, "M", "ṏ"), + (0x1E4F, "V"), + (0x1E50, "M", "ṑ"), + (0x1E51, "V"), + (0x1E52, "M", "ṓ"), + (0x1E53, "V"), + (0x1E54, "M", "ṕ"), + (0x1E55, "V"), + (0x1E56, "M", "ṗ"), + (0x1E57, "V"), + (0x1E58, "M", "ṙ"), + (0x1E59, "V"), + (0x1E5A, "M", "ṛ"), + (0x1E5B, "V"), + (0x1E5C, "M", "ṝ"), + (0x1E5D, "V"), + (0x1E5E, "M", "ṟ"), + (0x1E5F, "V"), + (0x1E60, "M", "ṡ"), + (0x1E61, "V"), + (0x1E62, "M", "ṣ"), + (0x1E63, "V"), + (0x1E64, "M", "ṥ"), + (0x1E65, "V"), + ] + + +def _seg_18() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1E66, "M", "ṧ"), + (0x1E67, "V"), + (0x1E68, "M", "ṩ"), + (0x1E69, "V"), + (0x1E6A, "M", "ṫ"), + (0x1E6B, "V"), + (0x1E6C, "M", "ṭ"), + (0x1E6D, "V"), + (0x1E6E, "M", "ṯ"), + (0x1E6F, "V"), + (0x1E70, "M", "ṱ"), + (0x1E71, "V"), + (0x1E72, "M", "ṳ"), + (0x1E73, "V"), + (0x1E74, "M", "ṵ"), + (0x1E75, "V"), + (0x1E76, "M", "ṷ"), + (0x1E77, "V"), + (0x1E78, "M", "ṹ"), + (0x1E79, "V"), + (0x1E7A, "M", "ṻ"), + (0x1E7B, "V"), + (0x1E7C, "M", "ṽ"), + (0x1E7D, "V"), + (0x1E7E, "M", "ṿ"), + (0x1E7F, "V"), + (0x1E80, "M", "ẁ"), + (0x1E81, "V"), + (0x1E82, "M", "ẃ"), + (0x1E83, "V"), + (0x1E84, "M", "ẅ"), + (0x1E85, "V"), + (0x1E86, "M", "ẇ"), + (0x1E87, "V"), + (0x1E88, "M", "ẉ"), + (0x1E89, "V"), + (0x1E8A, "M", "ẋ"), + (0x1E8B, "V"), + (0x1E8C, "M", "ẍ"), + (0x1E8D, "V"), + (0x1E8E, "M", "ẏ"), + (0x1E8F, "V"), + (0x1E90, "M", "ẑ"), + (0x1E91, "V"), + (0x1E92, "M", "ẓ"), + (0x1E93, "V"), + (0x1E94, "M", "ẕ"), + (0x1E95, "V"), + (0x1E9A, "M", "aʾ"), + (0x1E9B, "M", "ṡ"), + (0x1E9C, "V"), + (0x1E9E, "M", "ß"), + (0x1E9F, "V"), + (0x1EA0, "M", "ạ"), + (0x1EA1, "V"), + (0x1EA2, "M", "ả"), + (0x1EA3, "V"), + (0x1EA4, "M", "ấ"), + (0x1EA5, "V"), + (0x1EA6, "M", "ầ"), + (0x1EA7, "V"), + (0x1EA8, "M", "ẩ"), + (0x1EA9, "V"), + (0x1EAA, "M", "ẫ"), + (0x1EAB, "V"), + (0x1EAC, "M", "ậ"), + (0x1EAD, "V"), + (0x1EAE, "M", "ắ"), + (0x1EAF, "V"), + (0x1EB0, "M", "ằ"), + (0x1EB1, "V"), + (0x1EB2, "M", "ẳ"), + (0x1EB3, "V"), + (0x1EB4, "M", "ẵ"), + (0x1EB5, "V"), + (0x1EB6, "M", "ặ"), + (0x1EB7, "V"), + (0x1EB8, "M", "ẹ"), + (0x1EB9, "V"), + (0x1EBA, "M", "ẻ"), + (0x1EBB, "V"), + (0x1EBC, "M", "ẽ"), + (0x1EBD, "V"), + (0x1EBE, "M", "ế"), + (0x1EBF, "V"), + (0x1EC0, "M", "ề"), + (0x1EC1, "V"), + (0x1EC2, "M", "ể"), + (0x1EC3, "V"), + (0x1EC4, "M", "ễ"), + (0x1EC5, "V"), + (0x1EC6, "M", "ệ"), + (0x1EC7, "V"), + (0x1EC8, "M", "ỉ"), + (0x1EC9, "V"), + (0x1ECA, "M", "ị"), + (0x1ECB, "V"), + (0x1ECC, "M", "ọ"), + (0x1ECD, "V"), + (0x1ECE, "M", "ỏ"), + ] + + +def _seg_19() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1ECF, "V"), + (0x1ED0, "M", "ố"), + (0x1ED1, "V"), + (0x1ED2, "M", "ồ"), + (0x1ED3, "V"), + (0x1ED4, "M", "ổ"), + (0x1ED5, "V"), + (0x1ED6, "M", "ỗ"), + (0x1ED7, "V"), + (0x1ED8, "M", "ộ"), + (0x1ED9, "V"), + (0x1EDA, "M", "ớ"), + (0x1EDB, "V"), + (0x1EDC, "M", "ờ"), + (0x1EDD, "V"), + (0x1EDE, "M", "ở"), + (0x1EDF, "V"), + (0x1EE0, "M", "ỡ"), + (0x1EE1, "V"), + (0x1EE2, "M", "ợ"), + (0x1EE3, "V"), + (0x1EE4, "M", "ụ"), + (0x1EE5, "V"), + (0x1EE6, "M", "ủ"), + (0x1EE7, "V"), + (0x1EE8, "M", "ứ"), + (0x1EE9, "V"), + (0x1EEA, "M", "ừ"), + (0x1EEB, "V"), + (0x1EEC, "M", "ử"), + (0x1EED, "V"), + (0x1EEE, "M", "ữ"), + (0x1EEF, "V"), + (0x1EF0, "M", "ự"), + (0x1EF1, "V"), + (0x1EF2, "M", "ỳ"), + (0x1EF3, "V"), + (0x1EF4, "M", "ỵ"), + (0x1EF5, "V"), + (0x1EF6, "M", "ỷ"), + (0x1EF7, "V"), + (0x1EF8, "M", "ỹ"), + (0x1EF9, "V"), + (0x1EFA, "M", "ỻ"), + (0x1EFB, "V"), + (0x1EFC, "M", "ỽ"), + (0x1EFD, "V"), + (0x1EFE, "M", "ỿ"), + (0x1EFF, "V"), + (0x1F08, "M", "ἀ"), + (0x1F09, "M", "ἁ"), + (0x1F0A, "M", "ἂ"), + (0x1F0B, "M", "ἃ"), + (0x1F0C, "M", "ἄ"), + (0x1F0D, "M", "ἅ"), + (0x1F0E, "M", "ἆ"), + (0x1F0F, "M", "ἇ"), + (0x1F10, "V"), + (0x1F16, "X"), + (0x1F18, "M", "ἐ"), + (0x1F19, "M", "ἑ"), + (0x1F1A, "M", "ἒ"), + (0x1F1B, "M", "ἓ"), + (0x1F1C, "M", "ἔ"), + (0x1F1D, "M", "ἕ"), + (0x1F1E, "X"), + (0x1F20, "V"), + (0x1F28, "M", "ἠ"), + (0x1F29, "M", "ἡ"), + (0x1F2A, "M", "ἢ"), + (0x1F2B, "M", "ἣ"), + (0x1F2C, "M", "ἤ"), + (0x1F2D, "M", "ἥ"), + (0x1F2E, "M", "ἦ"), + (0x1F2F, "M", "ἧ"), + (0x1F30, "V"), + (0x1F38, "M", "ἰ"), + (0x1F39, "M", "ἱ"), + (0x1F3A, "M", "ἲ"), + (0x1F3B, "M", "ἳ"), + (0x1F3C, "M", "ἴ"), + (0x1F3D, "M", "ἵ"), + (0x1F3E, "M", "ἶ"), + (0x1F3F, "M", "ἷ"), + (0x1F40, "V"), + (0x1F46, "X"), + (0x1F48, "M", "ὀ"), + (0x1F49, "M", "ὁ"), + (0x1F4A, "M", "ὂ"), + (0x1F4B, "M", "ὃ"), + (0x1F4C, "M", "ὄ"), + (0x1F4D, "M", "ὅ"), + (0x1F4E, "X"), + (0x1F50, "V"), + (0x1F58, "X"), + (0x1F59, "M", "ὑ"), + (0x1F5A, "X"), + (0x1F5B, "M", "ὓ"), + (0x1F5C, "X"), + (0x1F5D, "M", "ὕ"), + ] + + +def _seg_20() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1F5E, "X"), + (0x1F5F, "M", "ὗ"), + (0x1F60, "V"), + (0x1F68, "M", "ὠ"), + (0x1F69, "M", "ὡ"), + (0x1F6A, "M", "ὢ"), + (0x1F6B, "M", "ὣ"), + (0x1F6C, "M", "ὤ"), + (0x1F6D, "M", "ὥ"), + (0x1F6E, "M", "ὦ"), + (0x1F6F, "M", "ὧ"), + (0x1F70, "V"), + (0x1F71, "M", "ά"), + (0x1F72, "V"), + (0x1F73, "M", "έ"), + (0x1F74, "V"), + (0x1F75, "M", "ή"), + (0x1F76, "V"), + (0x1F77, "M", "ί"), + (0x1F78, "V"), + (0x1F79, "M", "ό"), + (0x1F7A, "V"), + (0x1F7B, "M", "ύ"), + (0x1F7C, "V"), + (0x1F7D, "M", "ώ"), + (0x1F7E, "X"), + (0x1F80, "M", "ἀι"), + (0x1F81, "M", "ἁι"), + (0x1F82, "M", "ἂι"), + (0x1F83, "M", "ἃι"), + (0x1F84, "M", "ἄι"), + (0x1F85, "M", "ἅι"), + (0x1F86, "M", "ἆι"), + (0x1F87, "M", "ἇι"), + (0x1F88, "M", "ἀι"), + (0x1F89, "M", "ἁι"), + (0x1F8A, "M", "ἂι"), + (0x1F8B, "M", "ἃι"), + (0x1F8C, "M", "ἄι"), + (0x1F8D, "M", "ἅι"), + (0x1F8E, "M", "ἆι"), + (0x1F8F, "M", "ἇι"), + (0x1F90, "M", "ἠι"), + (0x1F91, "M", "ἡι"), + (0x1F92, "M", "ἢι"), + (0x1F93, "M", "ἣι"), + (0x1F94, "M", "ἤι"), + (0x1F95, "M", "ἥι"), + (0x1F96, "M", "ἦι"), + (0x1F97, "M", "ἧι"), + (0x1F98, "M", "ἠι"), + (0x1F99, "M", "ἡι"), + (0x1F9A, "M", "ἢι"), + (0x1F9B, "M", "ἣι"), + (0x1F9C, "M", "ἤι"), + (0x1F9D, "M", "ἥι"), + (0x1F9E, "M", "ἦι"), + (0x1F9F, "M", "ἧι"), + (0x1FA0, "M", "ὠι"), + (0x1FA1, "M", "ὡι"), + (0x1FA2, "M", "ὢι"), + (0x1FA3, "M", "ὣι"), + (0x1FA4, "M", "ὤι"), + (0x1FA5, "M", "ὥι"), + (0x1FA6, "M", "ὦι"), + (0x1FA7, "M", "ὧι"), + (0x1FA8, "M", "ὠι"), + (0x1FA9, "M", "ὡι"), + (0x1FAA, "M", "ὢι"), + (0x1FAB, "M", "ὣι"), + (0x1FAC, "M", "ὤι"), + (0x1FAD, "M", "ὥι"), + (0x1FAE, "M", "ὦι"), + (0x1FAF, "M", "ὧι"), + (0x1FB0, "V"), + (0x1FB2, "M", "ὰι"), + (0x1FB3, "M", "αι"), + (0x1FB4, "M", "άι"), + (0x1FB5, "X"), + (0x1FB6, "V"), + (0x1FB7, "M", "ᾶι"), + (0x1FB8, "M", "ᾰ"), + (0x1FB9, "M", "ᾱ"), + (0x1FBA, "M", "ὰ"), + (0x1FBB, "M", "ά"), + (0x1FBC, "M", "αι"), + (0x1FBD, "M", " ̓"), + (0x1FBE, "M", "ι"), + (0x1FBF, "M", " ̓"), + (0x1FC0, "M", " ͂"), + (0x1FC1, "M", " ̈͂"), + (0x1FC2, "M", "ὴι"), + (0x1FC3, "M", "ηι"), + (0x1FC4, "M", "ήι"), + (0x1FC5, "X"), + (0x1FC6, "V"), + (0x1FC7, "M", "ῆι"), + (0x1FC8, "M", "ὲ"), + (0x1FC9, "M", "έ"), + (0x1FCA, "M", "ὴ"), + ] + + +def _seg_21() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1FCB, "M", "ή"), + (0x1FCC, "M", "ηι"), + (0x1FCD, "M", " ̓̀"), + (0x1FCE, "M", " ̓́"), + (0x1FCF, "M", " ̓͂"), + (0x1FD0, "V"), + (0x1FD3, "M", "ΐ"), + (0x1FD4, "X"), + (0x1FD6, "V"), + (0x1FD8, "M", "ῐ"), + (0x1FD9, "M", "ῑ"), + (0x1FDA, "M", "ὶ"), + (0x1FDB, "M", "ί"), + (0x1FDC, "X"), + (0x1FDD, "M", " ̔̀"), + (0x1FDE, "M", " ̔́"), + (0x1FDF, "M", " ̔͂"), + (0x1FE0, "V"), + (0x1FE3, "M", "ΰ"), + (0x1FE4, "V"), + (0x1FE8, "M", "ῠ"), + (0x1FE9, "M", "ῡ"), + (0x1FEA, "M", "ὺ"), + (0x1FEB, "M", "ύ"), + (0x1FEC, "M", "ῥ"), + (0x1FED, "M", " ̈̀"), + (0x1FEE, "M", " ̈́"), + (0x1FEF, "M", "`"), + (0x1FF0, "X"), + (0x1FF2, "M", "ὼι"), + (0x1FF3, "M", "ωι"), + (0x1FF4, "M", "ώι"), + (0x1FF5, "X"), + (0x1FF6, "V"), + (0x1FF7, "M", "ῶι"), + (0x1FF8, "M", "ὸ"), + (0x1FF9, "M", "ό"), + (0x1FFA, "M", "ὼ"), + (0x1FFB, "M", "ώ"), + (0x1FFC, "M", "ωι"), + (0x1FFD, "M", " ́"), + (0x1FFE, "M", " ̔"), + (0x1FFF, "X"), + (0x2000, "M", " "), + (0x200B, "I"), + (0x200C, "D", ""), + (0x200E, "X"), + (0x2010, "V"), + (0x2011, "M", "‐"), + (0x2012, "V"), + (0x2017, "M", " ̳"), + (0x2018, "V"), + (0x2024, "X"), + (0x2027, "V"), + (0x2028, "X"), + (0x202F, "M", " "), + (0x2030, "V"), + (0x2033, "M", "′′"), + (0x2034, "M", "′′′"), + (0x2035, "V"), + (0x2036, "M", "‵‵"), + (0x2037, "M", "‵‵‵"), + (0x2038, "V"), + (0x203C, "M", "!!"), + (0x203D, "V"), + (0x203E, "M", " ̅"), + (0x203F, "V"), + (0x2047, "M", "??"), + (0x2048, "M", "?!"), + (0x2049, "M", "!?"), + (0x204A, "V"), + (0x2057, "M", "′′′′"), + (0x2058, "V"), + (0x205F, "M", " "), + (0x2060, "I"), + (0x2065, "X"), + (0x206A, "I"), + (0x2070, "M", "0"), + (0x2071, "M", "i"), + (0x2072, "X"), + (0x2074, "M", "4"), + (0x2075, "M", "5"), + (0x2076, "M", "6"), + (0x2077, "M", "7"), + (0x2078, "M", "8"), + (0x2079, "M", "9"), + (0x207A, "M", "+"), + (0x207B, "M", "−"), + (0x207C, "M", "="), + (0x207D, "M", "("), + (0x207E, "M", ")"), + (0x207F, "M", "n"), + (0x2080, "M", "0"), + (0x2081, "M", "1"), + (0x2082, "M", "2"), + (0x2083, "M", "3"), + (0x2084, "M", "4"), + (0x2085, "M", "5"), + (0x2086, "M", "6"), + (0x2087, "M", "7"), + ] + + +def _seg_22() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2088, "M", "8"), + (0x2089, "M", "9"), + (0x208A, "M", "+"), + (0x208B, "M", "−"), + (0x208C, "M", "="), + (0x208D, "M", "("), + (0x208E, "M", ")"), + (0x208F, "X"), + (0x2090, "M", "a"), + (0x2091, "M", "e"), + (0x2092, "M", "o"), + (0x2093, "M", "x"), + (0x2094, "M", "ə"), + (0x2095, "M", "h"), + (0x2096, "M", "k"), + (0x2097, "M", "l"), + (0x2098, "M", "m"), + (0x2099, "M", "n"), + (0x209A, "M", "p"), + (0x209B, "M", "s"), + (0x209C, "M", "t"), + (0x209D, "X"), + (0x20A0, "V"), + (0x20A8, "M", "rs"), + (0x20A9, "V"), + (0x20C1, "X"), + (0x20D0, "V"), + (0x20F1, "X"), + (0x2100, "M", "a/c"), + (0x2101, "M", "a/s"), + (0x2102, "M", "c"), + (0x2103, "M", "°c"), + (0x2104, "V"), + (0x2105, "M", "c/o"), + (0x2106, "M", "c/u"), + (0x2107, "M", "ɛ"), + (0x2108, "V"), + (0x2109, "M", "°f"), + (0x210A, "M", "g"), + (0x210B, "M", "h"), + (0x210F, "M", "ħ"), + (0x2110, "M", "i"), + (0x2112, "M", "l"), + (0x2114, "V"), + (0x2115, "M", "n"), + (0x2116, "M", "no"), + (0x2117, "V"), + (0x2119, "M", "p"), + (0x211A, "M", "q"), + (0x211B, "M", "r"), + (0x211E, "V"), + (0x2120, "M", "sm"), + (0x2121, "M", "tel"), + (0x2122, "M", "tm"), + (0x2123, "V"), + (0x2124, "M", "z"), + (0x2125, "V"), + (0x2126, "M", "ω"), + (0x2127, "V"), + (0x2128, "M", "z"), + (0x2129, "V"), + (0x212A, "M", "k"), + (0x212B, "M", "å"), + (0x212C, "M", "b"), + (0x212D, "M", "c"), + (0x212E, "V"), + (0x212F, "M", "e"), + (0x2131, "M", "f"), + (0x2132, "M", "ⅎ"), + (0x2133, "M", "m"), + (0x2134, "M", "o"), + (0x2135, "M", "א"), + (0x2136, "M", "ב"), + (0x2137, "M", "ג"), + (0x2138, "M", "ד"), + (0x2139, "M", "i"), + (0x213A, "V"), + (0x213B, "M", "fax"), + (0x213C, "M", "π"), + (0x213D, "M", "γ"), + (0x213F, "M", "π"), + (0x2140, "M", "∑"), + (0x2141, "V"), + (0x2145, "M", "d"), + (0x2147, "M", "e"), + (0x2148, "M", "i"), + (0x2149, "M", "j"), + (0x214A, "V"), + (0x2150, "M", "1⁄7"), + (0x2151, "M", "1⁄9"), + (0x2152, "M", "1⁄10"), + (0x2153, "M", "1⁄3"), + (0x2154, "M", "2⁄3"), + (0x2155, "M", "1⁄5"), + (0x2156, "M", "2⁄5"), + (0x2157, "M", "3⁄5"), + (0x2158, "M", "4⁄5"), + (0x2159, "M", "1⁄6"), + (0x215A, "M", "5⁄6"), + (0x215B, "M", "1⁄8"), + ] + + +def _seg_23() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x215C, "M", "3⁄8"), + (0x215D, "M", "5⁄8"), + (0x215E, "M", "7⁄8"), + (0x215F, "M", "1⁄"), + (0x2160, "M", "i"), + (0x2161, "M", "ii"), + (0x2162, "M", "iii"), + (0x2163, "M", "iv"), + (0x2164, "M", "v"), + (0x2165, "M", "vi"), + (0x2166, "M", "vii"), + (0x2167, "M", "viii"), + (0x2168, "M", "ix"), + (0x2169, "M", "x"), + (0x216A, "M", "xi"), + (0x216B, "M", "xii"), + (0x216C, "M", "l"), + (0x216D, "M", "c"), + (0x216E, "M", "d"), + (0x216F, "M", "m"), + (0x2170, "M", "i"), + (0x2171, "M", "ii"), + (0x2172, "M", "iii"), + (0x2173, "M", "iv"), + (0x2174, "M", "v"), + (0x2175, "M", "vi"), + (0x2176, "M", "vii"), + (0x2177, "M", "viii"), + (0x2178, "M", "ix"), + (0x2179, "M", "x"), + (0x217A, "M", "xi"), + (0x217B, "M", "xii"), + (0x217C, "M", "l"), + (0x217D, "M", "c"), + (0x217E, "M", "d"), + (0x217F, "M", "m"), + (0x2180, "V"), + (0x2183, "M", "ↄ"), + (0x2184, "V"), + (0x2189, "M", "0⁄3"), + (0x218A, "V"), + (0x218C, "X"), + (0x2190, "V"), + (0x222C, "M", "∫∫"), + (0x222D, "M", "∫∫∫"), + (0x222E, "V"), + (0x222F, "M", "∮∮"), + (0x2230, "M", "∮∮∮"), + (0x2231, "V"), + (0x2329, "M", "〈"), + (0x232A, "M", "〉"), + (0x232B, "V"), + (0x242A, "X"), + (0x2440, "V"), + (0x244B, "X"), + (0x2460, "M", "1"), + (0x2461, "M", "2"), + (0x2462, "M", "3"), + (0x2463, "M", "4"), + (0x2464, "M", "5"), + (0x2465, "M", "6"), + (0x2466, "M", "7"), + (0x2467, "M", "8"), + (0x2468, "M", "9"), + (0x2469, "M", "10"), + (0x246A, "M", "11"), + (0x246B, "M", "12"), + (0x246C, "M", "13"), + (0x246D, "M", "14"), + (0x246E, "M", "15"), + (0x246F, "M", "16"), + (0x2470, "M", "17"), + (0x2471, "M", "18"), + (0x2472, "M", "19"), + (0x2473, "M", "20"), + (0x2474, "M", "(1)"), + (0x2475, "M", "(2)"), + (0x2476, "M", "(3)"), + (0x2477, "M", "(4)"), + (0x2478, "M", "(5)"), + (0x2479, "M", "(6)"), + (0x247A, "M", "(7)"), + (0x247B, "M", "(8)"), + (0x247C, "M", "(9)"), + (0x247D, "M", "(10)"), + (0x247E, "M", "(11)"), + (0x247F, "M", "(12)"), + (0x2480, "M", "(13)"), + (0x2481, "M", "(14)"), + (0x2482, "M", "(15)"), + (0x2483, "M", "(16)"), + (0x2484, "M", "(17)"), + (0x2485, "M", "(18)"), + (0x2486, "M", "(19)"), + (0x2487, "M", "(20)"), + (0x2488, "X"), + (0x249C, "M", "(a)"), + (0x249D, "M", "(b)"), + (0x249E, "M", "(c)"), + (0x249F, "M", "(d)"), + ] + + +def _seg_24() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x24A0, "M", "(e)"), + (0x24A1, "M", "(f)"), + (0x24A2, "M", "(g)"), + (0x24A3, "M", "(h)"), + (0x24A4, "M", "(i)"), + (0x24A5, "M", "(j)"), + (0x24A6, "M", "(k)"), + (0x24A7, "M", "(l)"), + (0x24A8, "M", "(m)"), + (0x24A9, "M", "(n)"), + (0x24AA, "M", "(o)"), + (0x24AB, "M", "(p)"), + (0x24AC, "M", "(q)"), + (0x24AD, "M", "(r)"), + (0x24AE, "M", "(s)"), + (0x24AF, "M", "(t)"), + (0x24B0, "M", "(u)"), + (0x24B1, "M", "(v)"), + (0x24B2, "M", "(w)"), + (0x24B3, "M", "(x)"), + (0x24B4, "M", "(y)"), + (0x24B5, "M", "(z)"), + (0x24B6, "M", "a"), + (0x24B7, "M", "b"), + (0x24B8, "M", "c"), + (0x24B9, "M", "d"), + (0x24BA, "M", "e"), + (0x24BB, "M", "f"), + (0x24BC, "M", "g"), + (0x24BD, "M", "h"), + (0x24BE, "M", "i"), + (0x24BF, "M", "j"), + (0x24C0, "M", "k"), + (0x24C1, "M", "l"), + (0x24C2, "M", "m"), + (0x24C3, "M", "n"), + (0x24C4, "M", "o"), + (0x24C5, "M", "p"), + (0x24C6, "M", "q"), + (0x24C7, "M", "r"), + (0x24C8, "M", "s"), + (0x24C9, "M", "t"), + (0x24CA, "M", "u"), + (0x24CB, "M", "v"), + (0x24CC, "M", "w"), + (0x24CD, "M", "x"), + (0x24CE, "M", "y"), + (0x24CF, "M", "z"), + (0x24D0, "M", "a"), + (0x24D1, "M", "b"), + (0x24D2, "M", "c"), + (0x24D3, "M", "d"), + (0x24D4, "M", "e"), + (0x24D5, "M", "f"), + (0x24D6, "M", "g"), + (0x24D7, "M", "h"), + (0x24D8, "M", "i"), + (0x24D9, "M", "j"), + (0x24DA, "M", "k"), + (0x24DB, "M", "l"), + (0x24DC, "M", "m"), + (0x24DD, "M", "n"), + (0x24DE, "M", "o"), + (0x24DF, "M", "p"), + (0x24E0, "M", "q"), + (0x24E1, "M", "r"), + (0x24E2, "M", "s"), + (0x24E3, "M", "t"), + (0x24E4, "M", "u"), + (0x24E5, "M", "v"), + (0x24E6, "M", "w"), + (0x24E7, "M", "x"), + (0x24E8, "M", "y"), + (0x24E9, "M", "z"), + (0x24EA, "M", "0"), + (0x24EB, "V"), + (0x2A0C, "M", "∫∫∫∫"), + (0x2A0D, "V"), + (0x2A74, "M", "::="), + (0x2A75, "M", "=="), + (0x2A76, "M", "==="), + (0x2A77, "V"), + (0x2ADC, "M", "⫝̸"), + (0x2ADD, "V"), + (0x2B74, "X"), + (0x2B76, "V"), + (0x2B96, "X"), + (0x2B97, "V"), + (0x2C00, "M", "ⰰ"), + (0x2C01, "M", "ⰱ"), + (0x2C02, "M", "ⰲ"), + (0x2C03, "M", "ⰳ"), + (0x2C04, "M", "ⰴ"), + (0x2C05, "M", "ⰵ"), + (0x2C06, "M", "ⰶ"), + (0x2C07, "M", "ⰷ"), + (0x2C08, "M", "ⰸ"), + (0x2C09, "M", "ⰹ"), + (0x2C0A, "M", "ⰺ"), + (0x2C0B, "M", "ⰻ"), + ] + + +def _seg_25() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2C0C, "M", "ⰼ"), + (0x2C0D, "M", "ⰽ"), + (0x2C0E, "M", "ⰾ"), + (0x2C0F, "M", "ⰿ"), + (0x2C10, "M", "ⱀ"), + (0x2C11, "M", "ⱁ"), + (0x2C12, "M", "ⱂ"), + (0x2C13, "M", "ⱃ"), + (0x2C14, "M", "ⱄ"), + (0x2C15, "M", "ⱅ"), + (0x2C16, "M", "ⱆ"), + (0x2C17, "M", "ⱇ"), + (0x2C18, "M", "ⱈ"), + (0x2C19, "M", "ⱉ"), + (0x2C1A, "M", "ⱊ"), + (0x2C1B, "M", "ⱋ"), + (0x2C1C, "M", "ⱌ"), + (0x2C1D, "M", "ⱍ"), + (0x2C1E, "M", "ⱎ"), + (0x2C1F, "M", "ⱏ"), + (0x2C20, "M", "ⱐ"), + (0x2C21, "M", "ⱑ"), + (0x2C22, "M", "ⱒ"), + (0x2C23, "M", "ⱓ"), + (0x2C24, "M", "ⱔ"), + (0x2C25, "M", "ⱕ"), + (0x2C26, "M", "ⱖ"), + (0x2C27, "M", "ⱗ"), + (0x2C28, "M", "ⱘ"), + (0x2C29, "M", "ⱙ"), + (0x2C2A, "M", "ⱚ"), + (0x2C2B, "M", "ⱛ"), + (0x2C2C, "M", "ⱜ"), + (0x2C2D, "M", "ⱝ"), + (0x2C2E, "M", "ⱞ"), + (0x2C2F, "M", "ⱟ"), + (0x2C30, "V"), + (0x2C60, "M", "ⱡ"), + (0x2C61, "V"), + (0x2C62, "M", "ɫ"), + (0x2C63, "M", "ᵽ"), + (0x2C64, "M", "ɽ"), + (0x2C65, "V"), + (0x2C67, "M", "ⱨ"), + (0x2C68, "V"), + (0x2C69, "M", "ⱪ"), + (0x2C6A, "V"), + (0x2C6B, "M", "ⱬ"), + (0x2C6C, "V"), + (0x2C6D, "M", "ɑ"), + (0x2C6E, "M", "ɱ"), + (0x2C6F, "M", "ɐ"), + (0x2C70, "M", "ɒ"), + (0x2C71, "V"), + (0x2C72, "M", "ⱳ"), + (0x2C73, "V"), + (0x2C75, "M", "ⱶ"), + (0x2C76, "V"), + (0x2C7C, "M", "j"), + (0x2C7D, "M", "v"), + (0x2C7E, "M", "ȿ"), + (0x2C7F, "M", "ɀ"), + (0x2C80, "M", "ⲁ"), + (0x2C81, "V"), + (0x2C82, "M", "ⲃ"), + (0x2C83, "V"), + (0x2C84, "M", "ⲅ"), + (0x2C85, "V"), + (0x2C86, "M", "ⲇ"), + (0x2C87, "V"), + (0x2C88, "M", "ⲉ"), + (0x2C89, "V"), + (0x2C8A, "M", "ⲋ"), + (0x2C8B, "V"), + (0x2C8C, "M", "ⲍ"), + (0x2C8D, "V"), + (0x2C8E, "M", "ⲏ"), + (0x2C8F, "V"), + (0x2C90, "M", "ⲑ"), + (0x2C91, "V"), + (0x2C92, "M", "ⲓ"), + (0x2C93, "V"), + (0x2C94, "M", "ⲕ"), + (0x2C95, "V"), + (0x2C96, "M", "ⲗ"), + (0x2C97, "V"), + (0x2C98, "M", "ⲙ"), + (0x2C99, "V"), + (0x2C9A, "M", "ⲛ"), + (0x2C9B, "V"), + (0x2C9C, "M", "ⲝ"), + (0x2C9D, "V"), + (0x2C9E, "M", "ⲟ"), + (0x2C9F, "V"), + (0x2CA0, "M", "ⲡ"), + (0x2CA1, "V"), + (0x2CA2, "M", "ⲣ"), + (0x2CA3, "V"), + (0x2CA4, "M", "ⲥ"), + (0x2CA5, "V"), + ] + + +def _seg_26() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2CA6, "M", "ⲧ"), + (0x2CA7, "V"), + (0x2CA8, "M", "ⲩ"), + (0x2CA9, "V"), + (0x2CAA, "M", "ⲫ"), + (0x2CAB, "V"), + (0x2CAC, "M", "ⲭ"), + (0x2CAD, "V"), + (0x2CAE, "M", "ⲯ"), + (0x2CAF, "V"), + (0x2CB0, "M", "ⲱ"), + (0x2CB1, "V"), + (0x2CB2, "M", "ⲳ"), + (0x2CB3, "V"), + (0x2CB4, "M", "ⲵ"), + (0x2CB5, "V"), + (0x2CB6, "M", "ⲷ"), + (0x2CB7, "V"), + (0x2CB8, "M", "ⲹ"), + (0x2CB9, "V"), + (0x2CBA, "M", "ⲻ"), + (0x2CBB, "V"), + (0x2CBC, "M", "ⲽ"), + (0x2CBD, "V"), + (0x2CBE, "M", "ⲿ"), + (0x2CBF, "V"), + (0x2CC0, "M", "ⳁ"), + (0x2CC1, "V"), + (0x2CC2, "M", "ⳃ"), + (0x2CC3, "V"), + (0x2CC4, "M", "ⳅ"), + (0x2CC5, "V"), + (0x2CC6, "M", "ⳇ"), + (0x2CC7, "V"), + (0x2CC8, "M", "ⳉ"), + (0x2CC9, "V"), + (0x2CCA, "M", "ⳋ"), + (0x2CCB, "V"), + (0x2CCC, "M", "ⳍ"), + (0x2CCD, "V"), + (0x2CCE, "M", "ⳏ"), + (0x2CCF, "V"), + (0x2CD0, "M", "ⳑ"), + (0x2CD1, "V"), + (0x2CD2, "M", "ⳓ"), + (0x2CD3, "V"), + (0x2CD4, "M", "ⳕ"), + (0x2CD5, "V"), + (0x2CD6, "M", "ⳗ"), + (0x2CD7, "V"), + (0x2CD8, "M", "ⳙ"), + (0x2CD9, "V"), + (0x2CDA, "M", "ⳛ"), + (0x2CDB, "V"), + (0x2CDC, "M", "ⳝ"), + (0x2CDD, "V"), + (0x2CDE, "M", "ⳟ"), + (0x2CDF, "V"), + (0x2CE0, "M", "ⳡ"), + (0x2CE1, "V"), + (0x2CE2, "M", "ⳣ"), + (0x2CE3, "V"), + (0x2CEB, "M", "ⳬ"), + (0x2CEC, "V"), + (0x2CED, "M", "ⳮ"), + (0x2CEE, "V"), + (0x2CF2, "M", "ⳳ"), + (0x2CF3, "V"), + (0x2CF4, "X"), + (0x2CF9, "V"), + (0x2D26, "X"), + (0x2D27, "V"), + (0x2D28, "X"), + (0x2D2D, "V"), + (0x2D2E, "X"), + (0x2D30, "V"), + (0x2D68, "X"), + (0x2D6F, "M", "ⵡ"), + (0x2D70, "V"), + (0x2D71, "X"), + (0x2D7F, "V"), + (0x2D97, "X"), + (0x2DA0, "V"), + (0x2DA7, "X"), + (0x2DA8, "V"), + (0x2DAF, "X"), + (0x2DB0, "V"), + (0x2DB7, "X"), + (0x2DB8, "V"), + (0x2DBF, "X"), + (0x2DC0, "V"), + (0x2DC7, "X"), + (0x2DC8, "V"), + (0x2DCF, "X"), + (0x2DD0, "V"), + (0x2DD7, "X"), + (0x2DD8, "V"), + (0x2DDF, "X"), + (0x2DE0, "V"), + (0x2E5E, "X"), + ] + + +def _seg_27() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2E80, "V"), + (0x2E9A, "X"), + (0x2E9B, "V"), + (0x2E9F, "M", "母"), + (0x2EA0, "V"), + (0x2EF3, "M", "龟"), + (0x2EF4, "X"), + (0x2F00, "M", "一"), + (0x2F01, "M", "丨"), + (0x2F02, "M", "丶"), + (0x2F03, "M", "丿"), + (0x2F04, "M", "乙"), + (0x2F05, "M", "亅"), + (0x2F06, "M", "二"), + (0x2F07, "M", "亠"), + (0x2F08, "M", "人"), + (0x2F09, "M", "儿"), + (0x2F0A, "M", "入"), + (0x2F0B, "M", "八"), + (0x2F0C, "M", "冂"), + (0x2F0D, "M", "冖"), + (0x2F0E, "M", "冫"), + (0x2F0F, "M", "几"), + (0x2F10, "M", "凵"), + (0x2F11, "M", "刀"), + (0x2F12, "M", "力"), + (0x2F13, "M", "勹"), + (0x2F14, "M", "匕"), + (0x2F15, "M", "匚"), + (0x2F16, "M", "匸"), + (0x2F17, "M", "十"), + (0x2F18, "M", "卜"), + (0x2F19, "M", "卩"), + (0x2F1A, "M", "厂"), + (0x2F1B, "M", "厶"), + (0x2F1C, "M", "又"), + (0x2F1D, "M", "口"), + (0x2F1E, "M", "囗"), + (0x2F1F, "M", "土"), + (0x2F20, "M", "士"), + (0x2F21, "M", "夂"), + (0x2F22, "M", "夊"), + (0x2F23, "M", "夕"), + (0x2F24, "M", "大"), + (0x2F25, "M", "女"), + (0x2F26, "M", "子"), + (0x2F27, "M", "宀"), + (0x2F28, "M", "寸"), + (0x2F29, "M", "小"), + (0x2F2A, "M", "尢"), + (0x2F2B, "M", "尸"), + (0x2F2C, "M", "屮"), + (0x2F2D, "M", "山"), + (0x2F2E, "M", "巛"), + (0x2F2F, "M", "工"), + (0x2F30, "M", "己"), + (0x2F31, "M", "巾"), + (0x2F32, "M", "干"), + (0x2F33, "M", "幺"), + (0x2F34, "M", "广"), + (0x2F35, "M", "廴"), + (0x2F36, "M", "廾"), + (0x2F37, "M", "弋"), + (0x2F38, "M", "弓"), + (0x2F39, "M", "彐"), + (0x2F3A, "M", "彡"), + (0x2F3B, "M", "彳"), + (0x2F3C, "M", "心"), + (0x2F3D, "M", "戈"), + (0x2F3E, "M", "戶"), + (0x2F3F, "M", "手"), + (0x2F40, "M", "支"), + (0x2F41, "M", "攴"), + (0x2F42, "M", "文"), + (0x2F43, "M", "斗"), + (0x2F44, "M", "斤"), + (0x2F45, "M", "方"), + (0x2F46, "M", "无"), + (0x2F47, "M", "日"), + (0x2F48, "M", "曰"), + (0x2F49, "M", "月"), + (0x2F4A, "M", "木"), + (0x2F4B, "M", "欠"), + (0x2F4C, "M", "止"), + (0x2F4D, "M", "歹"), + (0x2F4E, "M", "殳"), + (0x2F4F, "M", "毋"), + (0x2F50, "M", "比"), + (0x2F51, "M", "毛"), + (0x2F52, "M", "氏"), + (0x2F53, "M", "气"), + (0x2F54, "M", "水"), + (0x2F55, "M", "火"), + (0x2F56, "M", "爪"), + (0x2F57, "M", "父"), + (0x2F58, "M", "爻"), + (0x2F59, "M", "爿"), + (0x2F5A, "M", "片"), + (0x2F5B, "M", "牙"), + (0x2F5C, "M", "牛"), + ] + + +def _seg_28() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2F5D, "M", "犬"), + (0x2F5E, "M", "玄"), + (0x2F5F, "M", "玉"), + (0x2F60, "M", "瓜"), + (0x2F61, "M", "瓦"), + (0x2F62, "M", "甘"), + (0x2F63, "M", "生"), + (0x2F64, "M", "用"), + (0x2F65, "M", "田"), + (0x2F66, "M", "疋"), + (0x2F67, "M", "疒"), + (0x2F68, "M", "癶"), + (0x2F69, "M", "白"), + (0x2F6A, "M", "皮"), + (0x2F6B, "M", "皿"), + (0x2F6C, "M", "目"), + (0x2F6D, "M", "矛"), + (0x2F6E, "M", "矢"), + (0x2F6F, "M", "石"), + (0x2F70, "M", "示"), + (0x2F71, "M", "禸"), + (0x2F72, "M", "禾"), + (0x2F73, "M", "穴"), + (0x2F74, "M", "立"), + (0x2F75, "M", "竹"), + (0x2F76, "M", "米"), + (0x2F77, "M", "糸"), + (0x2F78, "M", "缶"), + (0x2F79, "M", "网"), + (0x2F7A, "M", "羊"), + (0x2F7B, "M", "羽"), + (0x2F7C, "M", "老"), + (0x2F7D, "M", "而"), + (0x2F7E, "M", "耒"), + (0x2F7F, "M", "耳"), + (0x2F80, "M", "聿"), + (0x2F81, "M", "肉"), + (0x2F82, "M", "臣"), + (0x2F83, "M", "自"), + (0x2F84, "M", "至"), + (0x2F85, "M", "臼"), + (0x2F86, "M", "舌"), + (0x2F87, "M", "舛"), + (0x2F88, "M", "舟"), + (0x2F89, "M", "艮"), + (0x2F8A, "M", "色"), + (0x2F8B, "M", "艸"), + (0x2F8C, "M", "虍"), + (0x2F8D, "M", "虫"), + (0x2F8E, "M", "血"), + (0x2F8F, "M", "行"), + (0x2F90, "M", "衣"), + (0x2F91, "M", "襾"), + (0x2F92, "M", "見"), + (0x2F93, "M", "角"), + (0x2F94, "M", "言"), + (0x2F95, "M", "谷"), + (0x2F96, "M", "豆"), + (0x2F97, "M", "豕"), + (0x2F98, "M", "豸"), + (0x2F99, "M", "貝"), + (0x2F9A, "M", "赤"), + (0x2F9B, "M", "走"), + (0x2F9C, "M", "足"), + (0x2F9D, "M", "身"), + (0x2F9E, "M", "車"), + (0x2F9F, "M", "辛"), + (0x2FA0, "M", "辰"), + (0x2FA1, "M", "辵"), + (0x2FA2, "M", "邑"), + (0x2FA3, "M", "酉"), + (0x2FA4, "M", "釆"), + (0x2FA5, "M", "里"), + (0x2FA6, "M", "金"), + (0x2FA7, "M", "長"), + (0x2FA8, "M", "門"), + (0x2FA9, "M", "阜"), + (0x2FAA, "M", "隶"), + (0x2FAB, "M", "隹"), + (0x2FAC, "M", "雨"), + (0x2FAD, "M", "靑"), + (0x2FAE, "M", "非"), + (0x2FAF, "M", "面"), + (0x2FB0, "M", "革"), + (0x2FB1, "M", "韋"), + (0x2FB2, "M", "韭"), + (0x2FB3, "M", "音"), + (0x2FB4, "M", "頁"), + (0x2FB5, "M", "風"), + (0x2FB6, "M", "飛"), + (0x2FB7, "M", "食"), + (0x2FB8, "M", "首"), + (0x2FB9, "M", "香"), + (0x2FBA, "M", "馬"), + (0x2FBB, "M", "骨"), + (0x2FBC, "M", "高"), + (0x2FBD, "M", "髟"), + (0x2FBE, "M", "鬥"), + (0x2FBF, "M", "鬯"), + (0x2FC0, "M", "鬲"), + ] + + +def _seg_29() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2FC1, "M", "鬼"), + (0x2FC2, "M", "魚"), + (0x2FC3, "M", "鳥"), + (0x2FC4, "M", "鹵"), + (0x2FC5, "M", "鹿"), + (0x2FC6, "M", "麥"), + (0x2FC7, "M", "麻"), + (0x2FC8, "M", "黃"), + (0x2FC9, "M", "黍"), + (0x2FCA, "M", "黑"), + (0x2FCB, "M", "黹"), + (0x2FCC, "M", "黽"), + (0x2FCD, "M", "鼎"), + (0x2FCE, "M", "鼓"), + (0x2FCF, "M", "鼠"), + (0x2FD0, "M", "鼻"), + (0x2FD1, "M", "齊"), + (0x2FD2, "M", "齒"), + (0x2FD3, "M", "龍"), + (0x2FD4, "M", "龜"), + (0x2FD5, "M", "龠"), + (0x2FD6, "X"), + (0x3000, "M", " "), + (0x3001, "V"), + (0x3002, "M", "."), + (0x3003, "V"), + (0x3036, "M", "〒"), + (0x3037, "V"), + (0x3038, "M", "十"), + (0x3039, "M", "卄"), + (0x303A, "M", "卅"), + (0x303B, "V"), + (0x3040, "X"), + (0x3041, "V"), + (0x3097, "X"), + (0x3099, "V"), + (0x309B, "M", " ゙"), + (0x309C, "M", " ゚"), + (0x309D, "V"), + (0x309F, "M", "より"), + (0x30A0, "V"), + (0x30FF, "M", "コト"), + (0x3100, "X"), + (0x3105, "V"), + (0x3130, "X"), + (0x3131, "M", "ᄀ"), + (0x3132, "M", "ᄁ"), + (0x3133, "M", "ᆪ"), + (0x3134, "M", "ᄂ"), + (0x3135, "M", "ᆬ"), + (0x3136, "M", "ᆭ"), + (0x3137, "M", "ᄃ"), + (0x3138, "M", "ᄄ"), + (0x3139, "M", "ᄅ"), + (0x313A, "M", "ᆰ"), + (0x313B, "M", "ᆱ"), + (0x313C, "M", "ᆲ"), + (0x313D, "M", "ᆳ"), + (0x313E, "M", "ᆴ"), + (0x313F, "M", "ᆵ"), + (0x3140, "M", "ᄚ"), + (0x3141, "M", "ᄆ"), + (0x3142, "M", "ᄇ"), + (0x3143, "M", "ᄈ"), + (0x3144, "M", "ᄡ"), + (0x3145, "M", "ᄉ"), + (0x3146, "M", "ᄊ"), + (0x3147, "M", "ᄋ"), + (0x3148, "M", "ᄌ"), + (0x3149, "M", "ᄍ"), + (0x314A, "M", "ᄎ"), + (0x314B, "M", "ᄏ"), + (0x314C, "M", "ᄐ"), + (0x314D, "M", "ᄑ"), + (0x314E, "M", "ᄒ"), + (0x314F, "M", "ᅡ"), + (0x3150, "M", "ᅢ"), + (0x3151, "M", "ᅣ"), + (0x3152, "M", "ᅤ"), + (0x3153, "M", "ᅥ"), + (0x3154, "M", "ᅦ"), + (0x3155, "M", "ᅧ"), + (0x3156, "M", "ᅨ"), + (0x3157, "M", "ᅩ"), + (0x3158, "M", "ᅪ"), + (0x3159, "M", "ᅫ"), + (0x315A, "M", "ᅬ"), + (0x315B, "M", "ᅭ"), + (0x315C, "M", "ᅮ"), + (0x315D, "M", "ᅯ"), + (0x315E, "M", "ᅰ"), + (0x315F, "M", "ᅱ"), + (0x3160, "M", "ᅲ"), + (0x3161, "M", "ᅳ"), + (0x3162, "M", "ᅴ"), + (0x3163, "M", "ᅵ"), + (0x3164, "I"), + (0x3165, "M", "ᄔ"), + (0x3166, "M", "ᄕ"), + (0x3167, "M", "ᇇ"), + ] + + +def _seg_30() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x3168, "M", "ᇈ"), + (0x3169, "M", "ᇌ"), + (0x316A, "M", "ᇎ"), + (0x316B, "M", "ᇓ"), + (0x316C, "M", "ᇗ"), + (0x316D, "M", "ᇙ"), + (0x316E, "M", "ᄜ"), + (0x316F, "M", "ᇝ"), + (0x3170, "M", "ᇟ"), + (0x3171, "M", "ᄝ"), + (0x3172, "M", "ᄞ"), + (0x3173, "M", "ᄠ"), + (0x3174, "M", "ᄢ"), + (0x3175, "M", "ᄣ"), + (0x3176, "M", "ᄧ"), + (0x3177, "M", "ᄩ"), + (0x3178, "M", "ᄫ"), + (0x3179, "M", "ᄬ"), + (0x317A, "M", "ᄭ"), + (0x317B, "M", "ᄮ"), + (0x317C, "M", "ᄯ"), + (0x317D, "M", "ᄲ"), + (0x317E, "M", "ᄶ"), + (0x317F, "M", "ᅀ"), + (0x3180, "M", "ᅇ"), + (0x3181, "M", "ᅌ"), + (0x3182, "M", "ᇱ"), + (0x3183, "M", "ᇲ"), + (0x3184, "M", "ᅗ"), + (0x3185, "M", "ᅘ"), + (0x3186, "M", "ᅙ"), + (0x3187, "M", "ᆄ"), + (0x3188, "M", "ᆅ"), + (0x3189, "M", "ᆈ"), + (0x318A, "M", "ᆑ"), + (0x318B, "M", "ᆒ"), + (0x318C, "M", "ᆔ"), + (0x318D, "M", "ᆞ"), + (0x318E, "M", "ᆡ"), + (0x318F, "X"), + (0x3190, "V"), + (0x3192, "M", "一"), + (0x3193, "M", "二"), + (0x3194, "M", "三"), + (0x3195, "M", "四"), + (0x3196, "M", "上"), + (0x3197, "M", "中"), + (0x3198, "M", "下"), + (0x3199, "M", "甲"), + (0x319A, "M", "乙"), + (0x319B, "M", "丙"), + (0x319C, "M", "丁"), + (0x319D, "M", "天"), + (0x319E, "M", "地"), + (0x319F, "M", "人"), + (0x31A0, "V"), + (0x31E6, "X"), + (0x31F0, "V"), + (0x3200, "M", "(ᄀ)"), + (0x3201, "M", "(ᄂ)"), + (0x3202, "M", "(ᄃ)"), + (0x3203, "M", "(ᄅ)"), + (0x3204, "M", "(ᄆ)"), + (0x3205, "M", "(ᄇ)"), + (0x3206, "M", "(ᄉ)"), + (0x3207, "M", "(ᄋ)"), + (0x3208, "M", "(ᄌ)"), + (0x3209, "M", "(ᄎ)"), + (0x320A, "M", "(ᄏ)"), + (0x320B, "M", "(ᄐ)"), + (0x320C, "M", "(ᄑ)"), + (0x320D, "M", "(ᄒ)"), + (0x320E, "M", "(가)"), + (0x320F, "M", "(나)"), + (0x3210, "M", "(다)"), + (0x3211, "M", "(라)"), + (0x3212, "M", "(마)"), + (0x3213, "M", "(바)"), + (0x3214, "M", "(사)"), + (0x3215, "M", "(아)"), + (0x3216, "M", "(자)"), + (0x3217, "M", "(차)"), + (0x3218, "M", "(카)"), + (0x3219, "M", "(타)"), + (0x321A, "M", "(파)"), + (0x321B, "M", "(하)"), + (0x321C, "M", "(주)"), + (0x321D, "M", "(오전)"), + (0x321E, "M", "(오후)"), + (0x321F, "X"), + (0x3220, "M", "(一)"), + (0x3221, "M", "(二)"), + (0x3222, "M", "(三)"), + (0x3223, "M", "(四)"), + (0x3224, "M", "(五)"), + (0x3225, "M", "(六)"), + (0x3226, "M", "(七)"), + (0x3227, "M", "(八)"), + (0x3228, "M", "(九)"), + (0x3229, "M", "(十)"), + ] + + +def _seg_31() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x322A, "M", "(月)"), + (0x322B, "M", "(火)"), + (0x322C, "M", "(水)"), + (0x322D, "M", "(木)"), + (0x322E, "M", "(金)"), + (0x322F, "M", "(土)"), + (0x3230, "M", "(日)"), + (0x3231, "M", "(株)"), + (0x3232, "M", "(有)"), + (0x3233, "M", "(社)"), + (0x3234, "M", "(名)"), + (0x3235, "M", "(特)"), + (0x3236, "M", "(財)"), + (0x3237, "M", "(祝)"), + (0x3238, "M", "(労)"), + (0x3239, "M", "(代)"), + (0x323A, "M", "(呼)"), + (0x323B, "M", "(学)"), + (0x323C, "M", "(監)"), + (0x323D, "M", "(企)"), + (0x323E, "M", "(資)"), + (0x323F, "M", "(協)"), + (0x3240, "M", "(祭)"), + (0x3241, "M", "(休)"), + (0x3242, "M", "(自)"), + (0x3243, "M", "(至)"), + (0x3244, "M", "問"), + (0x3245, "M", "幼"), + (0x3246, "M", "文"), + (0x3247, "M", "箏"), + (0x3248, "V"), + (0x3250, "M", "pte"), + (0x3251, "M", "21"), + (0x3252, "M", "22"), + (0x3253, "M", "23"), + (0x3254, "M", "24"), + (0x3255, "M", "25"), + (0x3256, "M", "26"), + (0x3257, "M", "27"), + (0x3258, "M", "28"), + (0x3259, "M", "29"), + (0x325A, "M", "30"), + (0x325B, "M", "31"), + (0x325C, "M", "32"), + (0x325D, "M", "33"), + (0x325E, "M", "34"), + (0x325F, "M", "35"), + (0x3260, "M", "ᄀ"), + (0x3261, "M", "ᄂ"), + (0x3262, "M", "ᄃ"), + (0x3263, "M", "ᄅ"), + (0x3264, "M", "ᄆ"), + (0x3265, "M", "ᄇ"), + (0x3266, "M", "ᄉ"), + (0x3267, "M", "ᄋ"), + (0x3268, "M", "ᄌ"), + (0x3269, "M", "ᄎ"), + (0x326A, "M", "ᄏ"), + (0x326B, "M", "ᄐ"), + (0x326C, "M", "ᄑ"), + (0x326D, "M", "ᄒ"), + (0x326E, "M", "가"), + (0x326F, "M", "나"), + (0x3270, "M", "다"), + (0x3271, "M", "라"), + (0x3272, "M", "마"), + (0x3273, "M", "바"), + (0x3274, "M", "사"), + (0x3275, "M", "아"), + (0x3276, "M", "자"), + (0x3277, "M", "차"), + (0x3278, "M", "카"), + (0x3279, "M", "타"), + (0x327A, "M", "파"), + (0x327B, "M", "하"), + (0x327C, "M", "참고"), + (0x327D, "M", "주의"), + (0x327E, "M", "우"), + (0x327F, "V"), + (0x3280, "M", "一"), + (0x3281, "M", "二"), + (0x3282, "M", "三"), + (0x3283, "M", "四"), + (0x3284, "M", "五"), + (0x3285, "M", "六"), + (0x3286, "M", "七"), + (0x3287, "M", "八"), + (0x3288, "M", "九"), + (0x3289, "M", "十"), + (0x328A, "M", "月"), + (0x328B, "M", "火"), + (0x328C, "M", "水"), + (0x328D, "M", "木"), + (0x328E, "M", "金"), + (0x328F, "M", "土"), + (0x3290, "M", "日"), + (0x3291, "M", "株"), + (0x3292, "M", "有"), + (0x3293, "M", "社"), + (0x3294, "M", "名"), + ] + + +def _seg_32() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x3295, "M", "特"), + (0x3296, "M", "財"), + (0x3297, "M", "祝"), + (0x3298, "M", "労"), + (0x3299, "M", "秘"), + (0x329A, "M", "男"), + (0x329B, "M", "女"), + (0x329C, "M", "適"), + (0x329D, "M", "優"), + (0x329E, "M", "印"), + (0x329F, "M", "注"), + (0x32A0, "M", "項"), + (0x32A1, "M", "休"), + (0x32A2, "M", "写"), + (0x32A3, "M", "正"), + (0x32A4, "M", "上"), + (0x32A5, "M", "中"), + (0x32A6, "M", "下"), + (0x32A7, "M", "左"), + (0x32A8, "M", "右"), + (0x32A9, "M", "医"), + (0x32AA, "M", "宗"), + (0x32AB, "M", "学"), + (0x32AC, "M", "監"), + (0x32AD, "M", "企"), + (0x32AE, "M", "資"), + (0x32AF, "M", "協"), + (0x32B0, "M", "夜"), + (0x32B1, "M", "36"), + (0x32B2, "M", "37"), + (0x32B3, "M", "38"), + (0x32B4, "M", "39"), + (0x32B5, "M", "40"), + (0x32B6, "M", "41"), + (0x32B7, "M", "42"), + (0x32B8, "M", "43"), + (0x32B9, "M", "44"), + (0x32BA, "M", "45"), + (0x32BB, "M", "46"), + (0x32BC, "M", "47"), + (0x32BD, "M", "48"), + (0x32BE, "M", "49"), + (0x32BF, "M", "50"), + (0x32C0, "M", "1月"), + (0x32C1, "M", "2月"), + (0x32C2, "M", "3月"), + (0x32C3, "M", "4月"), + (0x32C4, "M", "5月"), + (0x32C5, "M", "6月"), + (0x32C6, "M", "7月"), + (0x32C7, "M", "8月"), + (0x32C8, "M", "9月"), + (0x32C9, "M", "10月"), + (0x32CA, "M", "11月"), + (0x32CB, "M", "12月"), + (0x32CC, "M", "hg"), + (0x32CD, "M", "erg"), + (0x32CE, "M", "ev"), + (0x32CF, "M", "ltd"), + (0x32D0, "M", "ア"), + (0x32D1, "M", "イ"), + (0x32D2, "M", "ウ"), + (0x32D3, "M", "エ"), + (0x32D4, "M", "オ"), + (0x32D5, "M", "カ"), + (0x32D6, "M", "キ"), + (0x32D7, "M", "ク"), + (0x32D8, "M", "ケ"), + (0x32D9, "M", "コ"), + (0x32DA, "M", "サ"), + (0x32DB, "M", "シ"), + (0x32DC, "M", "ス"), + (0x32DD, "M", "セ"), + (0x32DE, "M", "ソ"), + (0x32DF, "M", "タ"), + (0x32E0, "M", "チ"), + (0x32E1, "M", "ツ"), + (0x32E2, "M", "テ"), + (0x32E3, "M", "ト"), + (0x32E4, "M", "ナ"), + (0x32E5, "M", "ニ"), + (0x32E6, "M", "ヌ"), + (0x32E7, "M", "ネ"), + (0x32E8, "M", "ノ"), + (0x32E9, "M", "ハ"), + (0x32EA, "M", "ヒ"), + (0x32EB, "M", "フ"), + (0x32EC, "M", "ヘ"), + (0x32ED, "M", "ホ"), + (0x32EE, "M", "マ"), + (0x32EF, "M", "ミ"), + (0x32F0, "M", "ム"), + (0x32F1, "M", "メ"), + (0x32F2, "M", "モ"), + (0x32F3, "M", "ヤ"), + (0x32F4, "M", "ユ"), + (0x32F5, "M", "ヨ"), + (0x32F6, "M", "ラ"), + (0x32F7, "M", "リ"), + (0x32F8, "M", "ル"), + ] + + +def _seg_33() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x32F9, "M", "レ"), + (0x32FA, "M", "ロ"), + (0x32FB, "M", "ワ"), + (0x32FC, "M", "ヰ"), + (0x32FD, "M", "ヱ"), + (0x32FE, "M", "ヲ"), + (0x32FF, "M", "令和"), + (0x3300, "M", "アパート"), + (0x3301, "M", "アルファ"), + (0x3302, "M", "アンペア"), + (0x3303, "M", "アール"), + (0x3304, "M", "イニング"), + (0x3305, "M", "インチ"), + (0x3306, "M", "ウォン"), + (0x3307, "M", "エスクード"), + (0x3308, "M", "エーカー"), + (0x3309, "M", "オンス"), + (0x330A, "M", "オーム"), + (0x330B, "M", "カイリ"), + (0x330C, "M", "カラット"), + (0x330D, "M", "カロリー"), + (0x330E, "M", "ガロン"), + (0x330F, "M", "ガンマ"), + (0x3310, "M", "ギガ"), + (0x3311, "M", "ギニー"), + (0x3312, "M", "キュリー"), + (0x3313, "M", "ギルダー"), + (0x3314, "M", "キロ"), + (0x3315, "M", "キログラム"), + (0x3316, "M", "キロメートル"), + (0x3317, "M", "キロワット"), + (0x3318, "M", "グラム"), + (0x3319, "M", "グラムトン"), + (0x331A, "M", "クルゼイロ"), + (0x331B, "M", "クローネ"), + (0x331C, "M", "ケース"), + (0x331D, "M", "コルナ"), + (0x331E, "M", "コーポ"), + (0x331F, "M", "サイクル"), + (0x3320, "M", "サンチーム"), + (0x3321, "M", "シリング"), + (0x3322, "M", "センチ"), + (0x3323, "M", "セント"), + (0x3324, "M", "ダース"), + (0x3325, "M", "デシ"), + (0x3326, "M", "ドル"), + (0x3327, "M", "トン"), + (0x3328, "M", "ナノ"), + (0x3329, "M", "ノット"), + (0x332A, "M", "ハイツ"), + (0x332B, "M", "パーセント"), + (0x332C, "M", "パーツ"), + (0x332D, "M", "バーレル"), + (0x332E, "M", "ピアストル"), + (0x332F, "M", "ピクル"), + (0x3330, "M", "ピコ"), + (0x3331, "M", "ビル"), + (0x3332, "M", "ファラッド"), + (0x3333, "M", "フィート"), + (0x3334, "M", "ブッシェル"), + (0x3335, "M", "フラン"), + (0x3336, "M", "ヘクタール"), + (0x3337, "M", "ペソ"), + (0x3338, "M", "ペニヒ"), + (0x3339, "M", "ヘルツ"), + (0x333A, "M", "ペンス"), + (0x333B, "M", "ページ"), + (0x333C, "M", "ベータ"), + (0x333D, "M", "ポイント"), + (0x333E, "M", "ボルト"), + (0x333F, "M", "ホン"), + (0x3340, "M", "ポンド"), + (0x3341, "M", "ホール"), + (0x3342, "M", "ホーン"), + (0x3343, "M", "マイクロ"), + (0x3344, "M", "マイル"), + (0x3345, "M", "マッハ"), + (0x3346, "M", "マルク"), + (0x3347, "M", "マンション"), + (0x3348, "M", "ミクロン"), + (0x3349, "M", "ミリ"), + (0x334A, "M", "ミリバール"), + (0x334B, "M", "メガ"), + (0x334C, "M", "メガトン"), + (0x334D, "M", "メートル"), + (0x334E, "M", "ヤード"), + (0x334F, "M", "ヤール"), + (0x3350, "M", "ユアン"), + (0x3351, "M", "リットル"), + (0x3352, "M", "リラ"), + (0x3353, "M", "ルピー"), + (0x3354, "M", "ルーブル"), + (0x3355, "M", "レム"), + (0x3356, "M", "レントゲン"), + (0x3357, "M", "ワット"), + (0x3358, "M", "0点"), + (0x3359, "M", "1点"), + (0x335A, "M", "2点"), + (0x335B, "M", "3点"), + (0x335C, "M", "4点"), + ] + + +def _seg_34() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x335D, "M", "5点"), + (0x335E, "M", "6点"), + (0x335F, "M", "7点"), + (0x3360, "M", "8点"), + (0x3361, "M", "9点"), + (0x3362, "M", "10点"), + (0x3363, "M", "11点"), + (0x3364, "M", "12点"), + (0x3365, "M", "13点"), + (0x3366, "M", "14点"), + (0x3367, "M", "15点"), + (0x3368, "M", "16点"), + (0x3369, "M", "17点"), + (0x336A, "M", "18点"), + (0x336B, "M", "19点"), + (0x336C, "M", "20点"), + (0x336D, "M", "21点"), + (0x336E, "M", "22点"), + (0x336F, "M", "23点"), + (0x3370, "M", "24点"), + (0x3371, "M", "hpa"), + (0x3372, "M", "da"), + (0x3373, "M", "au"), + (0x3374, "M", "bar"), + (0x3375, "M", "ov"), + (0x3376, "M", "pc"), + (0x3377, "M", "dm"), + (0x3378, "M", "dm2"), + (0x3379, "M", "dm3"), + (0x337A, "M", "iu"), + (0x337B, "M", "平成"), + (0x337C, "M", "昭和"), + (0x337D, "M", "大正"), + (0x337E, "M", "明治"), + (0x337F, "M", "株式会社"), + (0x3380, "M", "pa"), + (0x3381, "M", "na"), + (0x3382, "M", "μa"), + (0x3383, "M", "ma"), + (0x3384, "M", "ka"), + (0x3385, "M", "kb"), + (0x3386, "M", "mb"), + (0x3387, "M", "gb"), + (0x3388, "M", "cal"), + (0x3389, "M", "kcal"), + (0x338A, "M", "pf"), + (0x338B, "M", "nf"), + (0x338C, "M", "μf"), + (0x338D, "M", "μg"), + (0x338E, "M", "mg"), + (0x338F, "M", "kg"), + (0x3390, "M", "hz"), + (0x3391, "M", "khz"), + (0x3392, "M", "mhz"), + (0x3393, "M", "ghz"), + (0x3394, "M", "thz"), + (0x3395, "M", "μl"), + (0x3396, "M", "ml"), + (0x3397, "M", "dl"), + (0x3398, "M", "kl"), + (0x3399, "M", "fm"), + (0x339A, "M", "nm"), + (0x339B, "M", "μm"), + (0x339C, "M", "mm"), + (0x339D, "M", "cm"), + (0x339E, "M", "km"), + (0x339F, "M", "mm2"), + (0x33A0, "M", "cm2"), + (0x33A1, "M", "m2"), + (0x33A2, "M", "km2"), + (0x33A3, "M", "mm3"), + (0x33A4, "M", "cm3"), + (0x33A5, "M", "m3"), + (0x33A6, "M", "km3"), + (0x33A7, "M", "m∕s"), + (0x33A8, "M", "m∕s2"), + (0x33A9, "M", "pa"), + (0x33AA, "M", "kpa"), + (0x33AB, "M", "mpa"), + (0x33AC, "M", "gpa"), + (0x33AD, "M", "rad"), + (0x33AE, "M", "rad∕s"), + (0x33AF, "M", "rad∕s2"), + (0x33B0, "M", "ps"), + (0x33B1, "M", "ns"), + (0x33B2, "M", "μs"), + (0x33B3, "M", "ms"), + (0x33B4, "M", "pv"), + (0x33B5, "M", "nv"), + (0x33B6, "M", "μv"), + (0x33B7, "M", "mv"), + (0x33B8, "M", "kv"), + (0x33B9, "M", "mv"), + (0x33BA, "M", "pw"), + (0x33BB, "M", "nw"), + (0x33BC, "M", "μw"), + (0x33BD, "M", "mw"), + (0x33BE, "M", "kw"), + (0x33BF, "M", "mw"), + (0x33C0, "M", "kω"), + ] + + +def _seg_35() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x33C1, "M", "mω"), + (0x33C2, "X"), + (0x33C3, "M", "bq"), + (0x33C4, "M", "cc"), + (0x33C5, "M", "cd"), + (0x33C6, "M", "c∕kg"), + (0x33C7, "X"), + (0x33C8, "M", "db"), + (0x33C9, "M", "gy"), + (0x33CA, "M", "ha"), + (0x33CB, "M", "hp"), + (0x33CC, "M", "in"), + (0x33CD, "M", "kk"), + (0x33CE, "M", "km"), + (0x33CF, "M", "kt"), + (0x33D0, "M", "lm"), + (0x33D1, "M", "ln"), + (0x33D2, "M", "log"), + (0x33D3, "M", "lx"), + (0x33D4, "M", "mb"), + (0x33D5, "M", "mil"), + (0x33D6, "M", "mol"), + (0x33D7, "M", "ph"), + (0x33D8, "X"), + (0x33D9, "M", "ppm"), + (0x33DA, "M", "pr"), + (0x33DB, "M", "sr"), + (0x33DC, "M", "sv"), + (0x33DD, "M", "wb"), + (0x33DE, "M", "v∕m"), + (0x33DF, "M", "a∕m"), + (0x33E0, "M", "1日"), + (0x33E1, "M", "2日"), + (0x33E2, "M", "3日"), + (0x33E3, "M", "4日"), + (0x33E4, "M", "5日"), + (0x33E5, "M", "6日"), + (0x33E6, "M", "7日"), + (0x33E7, "M", "8日"), + (0x33E8, "M", "9日"), + (0x33E9, "M", "10日"), + (0x33EA, "M", "11日"), + (0x33EB, "M", "12日"), + (0x33EC, "M", "13日"), + (0x33ED, "M", "14日"), + (0x33EE, "M", "15日"), + (0x33EF, "M", "16日"), + (0x33F0, "M", "17日"), + (0x33F1, "M", "18日"), + (0x33F2, "M", "19日"), + (0x33F3, "M", "20日"), + (0x33F4, "M", "21日"), + (0x33F5, "M", "22日"), + (0x33F6, "M", "23日"), + (0x33F7, "M", "24日"), + (0x33F8, "M", "25日"), + (0x33F9, "M", "26日"), + (0x33FA, "M", "27日"), + (0x33FB, "M", "28日"), + (0x33FC, "M", "29日"), + (0x33FD, "M", "30日"), + (0x33FE, "M", "31日"), + (0x33FF, "M", "gal"), + (0x3400, "V"), + (0xA48D, "X"), + (0xA490, "V"), + (0xA4C7, "X"), + (0xA4D0, "V"), + (0xA62C, "X"), + (0xA640, "M", "ꙁ"), + (0xA641, "V"), + (0xA642, "M", "ꙃ"), + (0xA643, "V"), + (0xA644, "M", "ꙅ"), + (0xA645, "V"), + (0xA646, "M", "ꙇ"), + (0xA647, "V"), + (0xA648, "M", "ꙉ"), + (0xA649, "V"), + (0xA64A, "M", "ꙋ"), + (0xA64B, "V"), + (0xA64C, "M", "ꙍ"), + (0xA64D, "V"), + (0xA64E, "M", "ꙏ"), + (0xA64F, "V"), + (0xA650, "M", "ꙑ"), + (0xA651, "V"), + (0xA652, "M", "ꙓ"), + (0xA653, "V"), + (0xA654, "M", "ꙕ"), + (0xA655, "V"), + (0xA656, "M", "ꙗ"), + (0xA657, "V"), + (0xA658, "M", "ꙙ"), + (0xA659, "V"), + (0xA65A, "M", "ꙛ"), + (0xA65B, "V"), + (0xA65C, "M", "ꙝ"), + (0xA65D, "V"), + (0xA65E, "M", "ꙟ"), + ] + + +def _seg_36() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xA65F, "V"), + (0xA660, "M", "ꙡ"), + (0xA661, "V"), + (0xA662, "M", "ꙣ"), + (0xA663, "V"), + (0xA664, "M", "ꙥ"), + (0xA665, "V"), + (0xA666, "M", "ꙧ"), + (0xA667, "V"), + (0xA668, "M", "ꙩ"), + (0xA669, "V"), + (0xA66A, "M", "ꙫ"), + (0xA66B, "V"), + (0xA66C, "M", "ꙭ"), + (0xA66D, "V"), + (0xA680, "M", "ꚁ"), + (0xA681, "V"), + (0xA682, "M", "ꚃ"), + (0xA683, "V"), + (0xA684, "M", "ꚅ"), + (0xA685, "V"), + (0xA686, "M", "ꚇ"), + (0xA687, "V"), + (0xA688, "M", "ꚉ"), + (0xA689, "V"), + (0xA68A, "M", "ꚋ"), + (0xA68B, "V"), + (0xA68C, "M", "ꚍ"), + (0xA68D, "V"), + (0xA68E, "M", "ꚏ"), + (0xA68F, "V"), + (0xA690, "M", "ꚑ"), + (0xA691, "V"), + (0xA692, "M", "ꚓ"), + (0xA693, "V"), + (0xA694, "M", "ꚕ"), + (0xA695, "V"), + (0xA696, "M", "ꚗ"), + (0xA697, "V"), + (0xA698, "M", "ꚙ"), + (0xA699, "V"), + (0xA69A, "M", "ꚛ"), + (0xA69B, "V"), + (0xA69C, "M", "ъ"), + (0xA69D, "M", "ь"), + (0xA69E, "V"), + (0xA6F8, "X"), + (0xA700, "V"), + (0xA722, "M", "ꜣ"), + (0xA723, "V"), + (0xA724, "M", "ꜥ"), + (0xA725, "V"), + (0xA726, "M", "ꜧ"), + (0xA727, "V"), + (0xA728, "M", "ꜩ"), + (0xA729, "V"), + (0xA72A, "M", "ꜫ"), + (0xA72B, "V"), + (0xA72C, "M", "ꜭ"), + (0xA72D, "V"), + (0xA72E, "M", "ꜯ"), + (0xA72F, "V"), + (0xA732, "M", "ꜳ"), + (0xA733, "V"), + (0xA734, "M", "ꜵ"), + (0xA735, "V"), + (0xA736, "M", "ꜷ"), + (0xA737, "V"), + (0xA738, "M", "ꜹ"), + (0xA739, "V"), + (0xA73A, "M", "ꜻ"), + (0xA73B, "V"), + (0xA73C, "M", "ꜽ"), + (0xA73D, "V"), + (0xA73E, "M", "ꜿ"), + (0xA73F, "V"), + (0xA740, "M", "ꝁ"), + (0xA741, "V"), + (0xA742, "M", "ꝃ"), + (0xA743, "V"), + (0xA744, "M", "ꝅ"), + (0xA745, "V"), + (0xA746, "M", "ꝇ"), + (0xA747, "V"), + (0xA748, "M", "ꝉ"), + (0xA749, "V"), + (0xA74A, "M", "ꝋ"), + (0xA74B, "V"), + (0xA74C, "M", "ꝍ"), + (0xA74D, "V"), + (0xA74E, "M", "ꝏ"), + (0xA74F, "V"), + (0xA750, "M", "ꝑ"), + (0xA751, "V"), + (0xA752, "M", "ꝓ"), + (0xA753, "V"), + (0xA754, "M", "ꝕ"), + (0xA755, "V"), + (0xA756, "M", "ꝗ"), + (0xA757, "V"), + ] + + +def _seg_37() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xA758, "M", "ꝙ"), + (0xA759, "V"), + (0xA75A, "M", "ꝛ"), + (0xA75B, "V"), + (0xA75C, "M", "ꝝ"), + (0xA75D, "V"), + (0xA75E, "M", "ꝟ"), + (0xA75F, "V"), + (0xA760, "M", "ꝡ"), + (0xA761, "V"), + (0xA762, "M", "ꝣ"), + (0xA763, "V"), + (0xA764, "M", "ꝥ"), + (0xA765, "V"), + (0xA766, "M", "ꝧ"), + (0xA767, "V"), + (0xA768, "M", "ꝩ"), + (0xA769, "V"), + (0xA76A, "M", "ꝫ"), + (0xA76B, "V"), + (0xA76C, "M", "ꝭ"), + (0xA76D, "V"), + (0xA76E, "M", "ꝯ"), + (0xA76F, "V"), + (0xA770, "M", "ꝯ"), + (0xA771, "V"), + (0xA779, "M", "ꝺ"), + (0xA77A, "V"), + (0xA77B, "M", "ꝼ"), + (0xA77C, "V"), + (0xA77D, "M", "ᵹ"), + (0xA77E, "M", "ꝿ"), + (0xA77F, "V"), + (0xA780, "M", "ꞁ"), + (0xA781, "V"), + (0xA782, "M", "ꞃ"), + (0xA783, "V"), + (0xA784, "M", "ꞅ"), + (0xA785, "V"), + (0xA786, "M", "ꞇ"), + (0xA787, "V"), + (0xA78B, "M", "ꞌ"), + (0xA78C, "V"), + (0xA78D, "M", "ɥ"), + (0xA78E, "V"), + (0xA790, "M", "ꞑ"), + (0xA791, "V"), + (0xA792, "M", "ꞓ"), + (0xA793, "V"), + (0xA796, "M", "ꞗ"), + (0xA797, "V"), + (0xA798, "M", "ꞙ"), + (0xA799, "V"), + (0xA79A, "M", "ꞛ"), + (0xA79B, "V"), + (0xA79C, "M", "ꞝ"), + (0xA79D, "V"), + (0xA79E, "M", "ꞟ"), + (0xA79F, "V"), + (0xA7A0, "M", "ꞡ"), + (0xA7A1, "V"), + (0xA7A2, "M", "ꞣ"), + (0xA7A3, "V"), + (0xA7A4, "M", "ꞥ"), + (0xA7A5, "V"), + (0xA7A6, "M", "ꞧ"), + (0xA7A7, "V"), + (0xA7A8, "M", "ꞩ"), + (0xA7A9, "V"), + (0xA7AA, "M", "ɦ"), + (0xA7AB, "M", "ɜ"), + (0xA7AC, "M", "ɡ"), + (0xA7AD, "M", "ɬ"), + (0xA7AE, "M", "ɪ"), + (0xA7AF, "V"), + (0xA7B0, "M", "ʞ"), + (0xA7B1, "M", "ʇ"), + (0xA7B2, "M", "ʝ"), + (0xA7B3, "M", "ꭓ"), + (0xA7B4, "M", "ꞵ"), + (0xA7B5, "V"), + (0xA7B6, "M", "ꞷ"), + (0xA7B7, "V"), + (0xA7B8, "M", "ꞹ"), + (0xA7B9, "V"), + (0xA7BA, "M", "ꞻ"), + (0xA7BB, "V"), + (0xA7BC, "M", "ꞽ"), + (0xA7BD, "V"), + (0xA7BE, "M", "ꞿ"), + (0xA7BF, "V"), + (0xA7C0, "M", "ꟁ"), + (0xA7C1, "V"), + (0xA7C2, "M", "ꟃ"), + (0xA7C3, "V"), + (0xA7C4, "M", "ꞔ"), + (0xA7C5, "M", "ʂ"), + (0xA7C6, "M", "ᶎ"), + (0xA7C7, "M", "ꟈ"), + (0xA7C8, "V"), + ] + + +def _seg_38() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xA7C9, "M", "ꟊ"), + (0xA7CA, "V"), + (0xA7CB, "M", "ɤ"), + (0xA7CC, "M", "ꟍ"), + (0xA7CD, "V"), + (0xA7CE, "X"), + (0xA7D0, "M", "ꟑ"), + (0xA7D1, "V"), + (0xA7D2, "X"), + (0xA7D3, "V"), + (0xA7D4, "X"), + (0xA7D5, "V"), + (0xA7D6, "M", "ꟗ"), + (0xA7D7, "V"), + (0xA7D8, "M", "ꟙ"), + (0xA7D9, "V"), + (0xA7DA, "M", "ꟛ"), + (0xA7DB, "V"), + (0xA7DC, "M", "ƛ"), + (0xA7DD, "X"), + (0xA7F2, "M", "c"), + (0xA7F3, "M", "f"), + (0xA7F4, "M", "q"), + (0xA7F5, "M", "ꟶ"), + (0xA7F6, "V"), + (0xA7F8, "M", "ħ"), + (0xA7F9, "M", "œ"), + (0xA7FA, "V"), + (0xA82D, "X"), + (0xA830, "V"), + (0xA83A, "X"), + (0xA840, "V"), + (0xA878, "X"), + (0xA880, "V"), + (0xA8C6, "X"), + (0xA8CE, "V"), + (0xA8DA, "X"), + (0xA8E0, "V"), + (0xA954, "X"), + (0xA95F, "V"), + (0xA97D, "X"), + (0xA980, "V"), + (0xA9CE, "X"), + (0xA9CF, "V"), + (0xA9DA, "X"), + (0xA9DE, "V"), + (0xA9FF, "X"), + (0xAA00, "V"), + (0xAA37, "X"), + (0xAA40, "V"), + (0xAA4E, "X"), + (0xAA50, "V"), + (0xAA5A, "X"), + (0xAA5C, "V"), + (0xAAC3, "X"), + (0xAADB, "V"), + (0xAAF7, "X"), + (0xAB01, "V"), + (0xAB07, "X"), + (0xAB09, "V"), + (0xAB0F, "X"), + (0xAB11, "V"), + (0xAB17, "X"), + (0xAB20, "V"), + (0xAB27, "X"), + (0xAB28, "V"), + (0xAB2F, "X"), + (0xAB30, "V"), + (0xAB5C, "M", "ꜧ"), + (0xAB5D, "M", "ꬷ"), + (0xAB5E, "M", "ɫ"), + (0xAB5F, "M", "ꭒ"), + (0xAB60, "V"), + (0xAB69, "M", "ʍ"), + (0xAB6A, "V"), + (0xAB6C, "X"), + (0xAB70, "M", "Ꭰ"), + (0xAB71, "M", "Ꭱ"), + (0xAB72, "M", "Ꭲ"), + (0xAB73, "M", "Ꭳ"), + (0xAB74, "M", "Ꭴ"), + (0xAB75, "M", "Ꭵ"), + (0xAB76, "M", "Ꭶ"), + (0xAB77, "M", "Ꭷ"), + (0xAB78, "M", "Ꭸ"), + (0xAB79, "M", "Ꭹ"), + (0xAB7A, "M", "Ꭺ"), + (0xAB7B, "M", "Ꭻ"), + (0xAB7C, "M", "Ꭼ"), + (0xAB7D, "M", "Ꭽ"), + (0xAB7E, "M", "Ꭾ"), + (0xAB7F, "M", "Ꭿ"), + (0xAB80, "M", "Ꮀ"), + (0xAB81, "M", "Ꮁ"), + (0xAB82, "M", "Ꮂ"), + (0xAB83, "M", "Ꮃ"), + (0xAB84, "M", "Ꮄ"), + (0xAB85, "M", "Ꮅ"), + (0xAB86, "M", "Ꮆ"), + (0xAB87, "M", "Ꮇ"), + ] + + +def _seg_39() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xAB88, "M", "Ꮈ"), + (0xAB89, "M", "Ꮉ"), + (0xAB8A, "M", "Ꮊ"), + (0xAB8B, "M", "Ꮋ"), + (0xAB8C, "M", "Ꮌ"), + (0xAB8D, "M", "Ꮍ"), + (0xAB8E, "M", "Ꮎ"), + (0xAB8F, "M", "Ꮏ"), + (0xAB90, "M", "Ꮐ"), + (0xAB91, "M", "Ꮑ"), + (0xAB92, "M", "Ꮒ"), + (0xAB93, "M", "Ꮓ"), + (0xAB94, "M", "Ꮔ"), + (0xAB95, "M", "Ꮕ"), + (0xAB96, "M", "Ꮖ"), + (0xAB97, "M", "Ꮗ"), + (0xAB98, "M", "Ꮘ"), + (0xAB99, "M", "Ꮙ"), + (0xAB9A, "M", "Ꮚ"), + (0xAB9B, "M", "Ꮛ"), + (0xAB9C, "M", "Ꮜ"), + (0xAB9D, "M", "Ꮝ"), + (0xAB9E, "M", "Ꮞ"), + (0xAB9F, "M", "Ꮟ"), + (0xABA0, "M", "Ꮠ"), + (0xABA1, "M", "Ꮡ"), + (0xABA2, "M", "Ꮢ"), + (0xABA3, "M", "Ꮣ"), + (0xABA4, "M", "Ꮤ"), + (0xABA5, "M", "Ꮥ"), + (0xABA6, "M", "Ꮦ"), + (0xABA7, "M", "Ꮧ"), + (0xABA8, "M", "Ꮨ"), + (0xABA9, "M", "Ꮩ"), + (0xABAA, "M", "Ꮪ"), + (0xABAB, "M", "Ꮫ"), + (0xABAC, "M", "Ꮬ"), + (0xABAD, "M", "Ꮭ"), + (0xABAE, "M", "Ꮮ"), + (0xABAF, "M", "Ꮯ"), + (0xABB0, "M", "Ꮰ"), + (0xABB1, "M", "Ꮱ"), + (0xABB2, "M", "Ꮲ"), + (0xABB3, "M", "Ꮳ"), + (0xABB4, "M", "Ꮴ"), + (0xABB5, "M", "Ꮵ"), + (0xABB6, "M", "Ꮶ"), + (0xABB7, "M", "Ꮷ"), + (0xABB8, "M", "Ꮸ"), + (0xABB9, "M", "Ꮹ"), + (0xABBA, "M", "Ꮺ"), + (0xABBB, "M", "Ꮻ"), + (0xABBC, "M", "Ꮼ"), + (0xABBD, "M", "Ꮽ"), + (0xABBE, "M", "Ꮾ"), + (0xABBF, "M", "Ꮿ"), + (0xABC0, "V"), + (0xABEE, "X"), + (0xABF0, "V"), + (0xABFA, "X"), + (0xAC00, "V"), + (0xD7A4, "X"), + (0xD7B0, "V"), + (0xD7C7, "X"), + (0xD7CB, "V"), + (0xD7FC, "X"), + (0xF900, "M", "豈"), + (0xF901, "M", "更"), + (0xF902, "M", "車"), + (0xF903, "M", "賈"), + (0xF904, "M", "滑"), + (0xF905, "M", "串"), + (0xF906, "M", "句"), + (0xF907, "M", "龜"), + (0xF909, "M", "契"), + (0xF90A, "M", "金"), + (0xF90B, "M", "喇"), + (0xF90C, "M", "奈"), + (0xF90D, "M", "懶"), + (0xF90E, "M", "癩"), + (0xF90F, "M", "羅"), + (0xF910, "M", "蘿"), + (0xF911, "M", "螺"), + (0xF912, "M", "裸"), + (0xF913, "M", "邏"), + (0xF914, "M", "樂"), + (0xF915, "M", "洛"), + (0xF916, "M", "烙"), + (0xF917, "M", "珞"), + (0xF918, "M", "落"), + (0xF919, "M", "酪"), + (0xF91A, "M", "駱"), + (0xF91B, "M", "亂"), + (0xF91C, "M", "卵"), + (0xF91D, "M", "欄"), + (0xF91E, "M", "爛"), + (0xF91F, "M", "蘭"), + (0xF920, "M", "鸞"), + (0xF921, "M", "嵐"), + (0xF922, "M", "濫"), + ] + + +def _seg_40() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xF923, "M", "藍"), + (0xF924, "M", "襤"), + (0xF925, "M", "拉"), + (0xF926, "M", "臘"), + (0xF927, "M", "蠟"), + (0xF928, "M", "廊"), + (0xF929, "M", "朗"), + (0xF92A, "M", "浪"), + (0xF92B, "M", "狼"), + (0xF92C, "M", "郎"), + (0xF92D, "M", "來"), + (0xF92E, "M", "冷"), + (0xF92F, "M", "勞"), + (0xF930, "M", "擄"), + (0xF931, "M", "櫓"), + (0xF932, "M", "爐"), + (0xF933, "M", "盧"), + (0xF934, "M", "老"), + (0xF935, "M", "蘆"), + (0xF936, "M", "虜"), + (0xF937, "M", "路"), + (0xF938, "M", "露"), + (0xF939, "M", "魯"), + (0xF93A, "M", "鷺"), + (0xF93B, "M", "碌"), + (0xF93C, "M", "祿"), + (0xF93D, "M", "綠"), + (0xF93E, "M", "菉"), + (0xF93F, "M", "錄"), + (0xF940, "M", "鹿"), + (0xF941, "M", "論"), + (0xF942, "M", "壟"), + (0xF943, "M", "弄"), + (0xF944, "M", "籠"), + (0xF945, "M", "聾"), + (0xF946, "M", "牢"), + (0xF947, "M", "磊"), + (0xF948, "M", "賂"), + (0xF949, "M", "雷"), + (0xF94A, "M", "壘"), + (0xF94B, "M", "屢"), + (0xF94C, "M", "樓"), + (0xF94D, "M", "淚"), + (0xF94E, "M", "漏"), + (0xF94F, "M", "累"), + (0xF950, "M", "縷"), + (0xF951, "M", "陋"), + (0xF952, "M", "勒"), + (0xF953, "M", "肋"), + (0xF954, "M", "凜"), + (0xF955, "M", "凌"), + (0xF956, "M", "稜"), + (0xF957, "M", "綾"), + (0xF958, "M", "菱"), + (0xF959, "M", "陵"), + (0xF95A, "M", "讀"), + (0xF95B, "M", "拏"), + (0xF95C, "M", "樂"), + (0xF95D, "M", "諾"), + (0xF95E, "M", "丹"), + (0xF95F, "M", "寧"), + (0xF960, "M", "怒"), + (0xF961, "M", "率"), + (0xF962, "M", "異"), + (0xF963, "M", "北"), + (0xF964, "M", "磻"), + (0xF965, "M", "便"), + (0xF966, "M", "復"), + (0xF967, "M", "不"), + (0xF968, "M", "泌"), + (0xF969, "M", "數"), + (0xF96A, "M", "索"), + (0xF96B, "M", "參"), + (0xF96C, "M", "塞"), + (0xF96D, "M", "省"), + (0xF96E, "M", "葉"), + (0xF96F, "M", "說"), + (0xF970, "M", "殺"), + (0xF971, "M", "辰"), + (0xF972, "M", "沈"), + (0xF973, "M", "拾"), + (0xF974, "M", "若"), + (0xF975, "M", "掠"), + (0xF976, "M", "略"), + (0xF977, "M", "亮"), + (0xF978, "M", "兩"), + (0xF979, "M", "凉"), + (0xF97A, "M", "梁"), + (0xF97B, "M", "糧"), + (0xF97C, "M", "良"), + (0xF97D, "M", "諒"), + (0xF97E, "M", "量"), + (0xF97F, "M", "勵"), + (0xF980, "M", "呂"), + (0xF981, "M", "女"), + (0xF982, "M", "廬"), + (0xF983, "M", "旅"), + (0xF984, "M", "濾"), + (0xF985, "M", "礪"), + (0xF986, "M", "閭"), + ] + + +def _seg_41() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xF987, "M", "驪"), + (0xF988, "M", "麗"), + (0xF989, "M", "黎"), + (0xF98A, "M", "力"), + (0xF98B, "M", "曆"), + (0xF98C, "M", "歷"), + (0xF98D, "M", "轢"), + (0xF98E, "M", "年"), + (0xF98F, "M", "憐"), + (0xF990, "M", "戀"), + (0xF991, "M", "撚"), + (0xF992, "M", "漣"), + (0xF993, "M", "煉"), + (0xF994, "M", "璉"), + (0xF995, "M", "秊"), + (0xF996, "M", "練"), + (0xF997, "M", "聯"), + (0xF998, "M", "輦"), + (0xF999, "M", "蓮"), + (0xF99A, "M", "連"), + (0xF99B, "M", "鍊"), + (0xF99C, "M", "列"), + (0xF99D, "M", "劣"), + (0xF99E, "M", "咽"), + (0xF99F, "M", "烈"), + (0xF9A0, "M", "裂"), + (0xF9A1, "M", "說"), + (0xF9A2, "M", "廉"), + (0xF9A3, "M", "念"), + (0xF9A4, "M", "捻"), + (0xF9A5, "M", "殮"), + (0xF9A6, "M", "簾"), + (0xF9A7, "M", "獵"), + (0xF9A8, "M", "令"), + (0xF9A9, "M", "囹"), + (0xF9AA, "M", "寧"), + (0xF9AB, "M", "嶺"), + (0xF9AC, "M", "怜"), + (0xF9AD, "M", "玲"), + (0xF9AE, "M", "瑩"), + (0xF9AF, "M", "羚"), + (0xF9B0, "M", "聆"), + (0xF9B1, "M", "鈴"), + (0xF9B2, "M", "零"), + (0xF9B3, "M", "靈"), + (0xF9B4, "M", "領"), + (0xF9B5, "M", "例"), + (0xF9B6, "M", "禮"), + (0xF9B7, "M", "醴"), + (0xF9B8, "M", "隸"), + (0xF9B9, "M", "惡"), + (0xF9BA, "M", "了"), + (0xF9BB, "M", "僚"), + (0xF9BC, "M", "寮"), + (0xF9BD, "M", "尿"), + (0xF9BE, "M", "料"), + (0xF9BF, "M", "樂"), + (0xF9C0, "M", "燎"), + (0xF9C1, "M", "療"), + (0xF9C2, "M", "蓼"), + (0xF9C3, "M", "遼"), + (0xF9C4, "M", "龍"), + (0xF9C5, "M", "暈"), + (0xF9C6, "M", "阮"), + (0xF9C7, "M", "劉"), + (0xF9C8, "M", "杻"), + (0xF9C9, "M", "柳"), + (0xF9CA, "M", "流"), + (0xF9CB, "M", "溜"), + (0xF9CC, "M", "琉"), + (0xF9CD, "M", "留"), + (0xF9CE, "M", "硫"), + (0xF9CF, "M", "紐"), + (0xF9D0, "M", "類"), + (0xF9D1, "M", "六"), + (0xF9D2, "M", "戮"), + (0xF9D3, "M", "陸"), + (0xF9D4, "M", "倫"), + (0xF9D5, "M", "崙"), + (0xF9D6, "M", "淪"), + (0xF9D7, "M", "輪"), + (0xF9D8, "M", "律"), + (0xF9D9, "M", "慄"), + (0xF9DA, "M", "栗"), + (0xF9DB, "M", "率"), + (0xF9DC, "M", "隆"), + (0xF9DD, "M", "利"), + (0xF9DE, "M", "吏"), + (0xF9DF, "M", "履"), + (0xF9E0, "M", "易"), + (0xF9E1, "M", "李"), + (0xF9E2, "M", "梨"), + (0xF9E3, "M", "泥"), + (0xF9E4, "M", "理"), + (0xF9E5, "M", "痢"), + (0xF9E6, "M", "罹"), + (0xF9E7, "M", "裏"), + (0xF9E8, "M", "裡"), + (0xF9E9, "M", "里"), + (0xF9EA, "M", "離"), + ] + + +def _seg_42() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xF9EB, "M", "匿"), + (0xF9EC, "M", "溺"), + (0xF9ED, "M", "吝"), + (0xF9EE, "M", "燐"), + (0xF9EF, "M", "璘"), + (0xF9F0, "M", "藺"), + (0xF9F1, "M", "隣"), + (0xF9F2, "M", "鱗"), + (0xF9F3, "M", "麟"), + (0xF9F4, "M", "林"), + (0xF9F5, "M", "淋"), + (0xF9F6, "M", "臨"), + (0xF9F7, "M", "立"), + (0xF9F8, "M", "笠"), + (0xF9F9, "M", "粒"), + (0xF9FA, "M", "狀"), + (0xF9FB, "M", "炙"), + (0xF9FC, "M", "識"), + (0xF9FD, "M", "什"), + (0xF9FE, "M", "茶"), + (0xF9FF, "M", "刺"), + (0xFA00, "M", "切"), + (0xFA01, "M", "度"), + (0xFA02, "M", "拓"), + (0xFA03, "M", "糖"), + (0xFA04, "M", "宅"), + (0xFA05, "M", "洞"), + (0xFA06, "M", "暴"), + (0xFA07, "M", "輻"), + (0xFA08, "M", "行"), + (0xFA09, "M", "降"), + (0xFA0A, "M", "見"), + (0xFA0B, "M", "廓"), + (0xFA0C, "M", "兀"), + (0xFA0D, "M", "嗀"), + (0xFA0E, "V"), + (0xFA10, "M", "塚"), + (0xFA11, "V"), + (0xFA12, "M", "晴"), + (0xFA13, "V"), + (0xFA15, "M", "凞"), + (0xFA16, "M", "猪"), + (0xFA17, "M", "益"), + (0xFA18, "M", "礼"), + (0xFA19, "M", "神"), + (0xFA1A, "M", "祥"), + (0xFA1B, "M", "福"), + (0xFA1C, "M", "靖"), + (0xFA1D, "M", "精"), + (0xFA1E, "M", "羽"), + (0xFA1F, "V"), + (0xFA20, "M", "蘒"), + (0xFA21, "V"), + (0xFA22, "M", "諸"), + (0xFA23, "V"), + (0xFA25, "M", "逸"), + (0xFA26, "M", "都"), + (0xFA27, "V"), + (0xFA2A, "M", "飯"), + (0xFA2B, "M", "飼"), + (0xFA2C, "M", "館"), + (0xFA2D, "M", "鶴"), + (0xFA2E, "M", "郞"), + (0xFA2F, "M", "隷"), + (0xFA30, "M", "侮"), + (0xFA31, "M", "僧"), + (0xFA32, "M", "免"), + (0xFA33, "M", "勉"), + (0xFA34, "M", "勤"), + (0xFA35, "M", "卑"), + (0xFA36, "M", "喝"), + (0xFA37, "M", "嘆"), + (0xFA38, "M", "器"), + (0xFA39, "M", "塀"), + (0xFA3A, "M", "墨"), + (0xFA3B, "M", "層"), + (0xFA3C, "M", "屮"), + (0xFA3D, "M", "悔"), + (0xFA3E, "M", "慨"), + (0xFA3F, "M", "憎"), + (0xFA40, "M", "懲"), + (0xFA41, "M", "敏"), + (0xFA42, "M", "既"), + (0xFA43, "M", "暑"), + (0xFA44, "M", "梅"), + (0xFA45, "M", "海"), + (0xFA46, "M", "渚"), + (0xFA47, "M", "漢"), + (0xFA48, "M", "煮"), + (0xFA49, "M", "爫"), + (0xFA4A, "M", "琢"), + (0xFA4B, "M", "碑"), + (0xFA4C, "M", "社"), + (0xFA4D, "M", "祉"), + (0xFA4E, "M", "祈"), + (0xFA4F, "M", "祐"), + (0xFA50, "M", "祖"), + (0xFA51, "M", "祝"), + (0xFA52, "M", "禍"), + (0xFA53, "M", "禎"), + ] + + +def _seg_43() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFA54, "M", "穀"), + (0xFA55, "M", "突"), + (0xFA56, "M", "節"), + (0xFA57, "M", "練"), + (0xFA58, "M", "縉"), + (0xFA59, "M", "繁"), + (0xFA5A, "M", "署"), + (0xFA5B, "M", "者"), + (0xFA5C, "M", "臭"), + (0xFA5D, "M", "艹"), + (0xFA5F, "M", "著"), + (0xFA60, "M", "褐"), + (0xFA61, "M", "視"), + (0xFA62, "M", "謁"), + (0xFA63, "M", "謹"), + (0xFA64, "M", "賓"), + (0xFA65, "M", "贈"), + (0xFA66, "M", "辶"), + (0xFA67, "M", "逸"), + (0xFA68, "M", "難"), + (0xFA69, "M", "響"), + (0xFA6A, "M", "頻"), + (0xFA6B, "M", "恵"), + (0xFA6C, "M", "𤋮"), + (0xFA6D, "M", "舘"), + (0xFA6E, "X"), + (0xFA70, "M", "並"), + (0xFA71, "M", "况"), + (0xFA72, "M", "全"), + (0xFA73, "M", "侀"), + (0xFA74, "M", "充"), + (0xFA75, "M", "冀"), + (0xFA76, "M", "勇"), + (0xFA77, "M", "勺"), + (0xFA78, "M", "喝"), + (0xFA79, "M", "啕"), + (0xFA7A, "M", "喙"), + (0xFA7B, "M", "嗢"), + (0xFA7C, "M", "塚"), + (0xFA7D, "M", "墳"), + (0xFA7E, "M", "奄"), + (0xFA7F, "M", "奔"), + (0xFA80, "M", "婢"), + (0xFA81, "M", "嬨"), + (0xFA82, "M", "廒"), + (0xFA83, "M", "廙"), + (0xFA84, "M", "彩"), + (0xFA85, "M", "徭"), + (0xFA86, "M", "惘"), + (0xFA87, "M", "慎"), + (0xFA88, "M", "愈"), + (0xFA89, "M", "憎"), + (0xFA8A, "M", "慠"), + (0xFA8B, "M", "懲"), + (0xFA8C, "M", "戴"), + (0xFA8D, "M", "揄"), + (0xFA8E, "M", "搜"), + (0xFA8F, "M", "摒"), + (0xFA90, "M", "敖"), + (0xFA91, "M", "晴"), + (0xFA92, "M", "朗"), + (0xFA93, "M", "望"), + (0xFA94, "M", "杖"), + (0xFA95, "M", "歹"), + (0xFA96, "M", "殺"), + (0xFA97, "M", "流"), + (0xFA98, "M", "滛"), + (0xFA99, "M", "滋"), + (0xFA9A, "M", "漢"), + (0xFA9B, "M", "瀞"), + (0xFA9C, "M", "煮"), + (0xFA9D, "M", "瞧"), + (0xFA9E, "M", "爵"), + (0xFA9F, "M", "犯"), + (0xFAA0, "M", "猪"), + (0xFAA1, "M", "瑱"), + (0xFAA2, "M", "甆"), + (0xFAA3, "M", "画"), + (0xFAA4, "M", "瘝"), + (0xFAA5, "M", "瘟"), + (0xFAA6, "M", "益"), + (0xFAA7, "M", "盛"), + (0xFAA8, "M", "直"), + (0xFAA9, "M", "睊"), + (0xFAAA, "M", "着"), + (0xFAAB, "M", "磌"), + (0xFAAC, "M", "窱"), + (0xFAAD, "M", "節"), + (0xFAAE, "M", "类"), + (0xFAAF, "M", "絛"), + (0xFAB0, "M", "練"), + (0xFAB1, "M", "缾"), + (0xFAB2, "M", "者"), + (0xFAB3, "M", "荒"), + (0xFAB4, "M", "華"), + (0xFAB5, "M", "蝹"), + (0xFAB6, "M", "襁"), + (0xFAB7, "M", "覆"), + (0xFAB8, "M", "視"), + (0xFAB9, "M", "調"), + ] + + +def _seg_44() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFABA, "M", "諸"), + (0xFABB, "M", "請"), + (0xFABC, "M", "謁"), + (0xFABD, "M", "諾"), + (0xFABE, "M", "諭"), + (0xFABF, "M", "謹"), + (0xFAC0, "M", "變"), + (0xFAC1, "M", "贈"), + (0xFAC2, "M", "輸"), + (0xFAC3, "M", "遲"), + (0xFAC4, "M", "醙"), + (0xFAC5, "M", "鉶"), + (0xFAC6, "M", "陼"), + (0xFAC7, "M", "難"), + (0xFAC8, "M", "靖"), + (0xFAC9, "M", "韛"), + (0xFACA, "M", "響"), + (0xFACB, "M", "頋"), + (0xFACC, "M", "頻"), + (0xFACD, "M", "鬒"), + (0xFACE, "M", "龜"), + (0xFACF, "M", "𢡊"), + (0xFAD0, "M", "𢡄"), + (0xFAD1, "M", "𣏕"), + (0xFAD2, "M", "㮝"), + (0xFAD3, "M", "䀘"), + (0xFAD4, "M", "䀹"), + (0xFAD5, "M", "𥉉"), + (0xFAD6, "M", "𥳐"), + (0xFAD7, "M", "𧻓"), + (0xFAD8, "M", "齃"), + (0xFAD9, "M", "龎"), + (0xFADA, "X"), + (0xFB00, "M", "ff"), + (0xFB01, "M", "fi"), + (0xFB02, "M", "fl"), + (0xFB03, "M", "ffi"), + (0xFB04, "M", "ffl"), + (0xFB05, "M", "st"), + (0xFB07, "X"), + (0xFB13, "M", "մն"), + (0xFB14, "M", "մե"), + (0xFB15, "M", "մի"), + (0xFB16, "M", "վն"), + (0xFB17, "M", "մխ"), + (0xFB18, "X"), + (0xFB1D, "M", "יִ"), + (0xFB1E, "V"), + (0xFB1F, "M", "ײַ"), + (0xFB20, "M", "ע"), + (0xFB21, "M", "א"), + (0xFB22, "M", "ד"), + (0xFB23, "M", "ה"), + (0xFB24, "M", "כ"), + (0xFB25, "M", "ל"), + (0xFB26, "M", "ם"), + (0xFB27, "M", "ר"), + (0xFB28, "M", "ת"), + (0xFB29, "M", "+"), + (0xFB2A, "M", "שׁ"), + (0xFB2B, "M", "שׂ"), + (0xFB2C, "M", "שּׁ"), + (0xFB2D, "M", "שּׂ"), + (0xFB2E, "M", "אַ"), + (0xFB2F, "M", "אָ"), + (0xFB30, "M", "אּ"), + (0xFB31, "M", "בּ"), + (0xFB32, "M", "גּ"), + (0xFB33, "M", "דּ"), + (0xFB34, "M", "הּ"), + (0xFB35, "M", "וּ"), + (0xFB36, "M", "זּ"), + (0xFB37, "X"), + (0xFB38, "M", "טּ"), + (0xFB39, "M", "יּ"), + (0xFB3A, "M", "ךּ"), + (0xFB3B, "M", "כּ"), + (0xFB3C, "M", "לּ"), + (0xFB3D, "X"), + (0xFB3E, "M", "מּ"), + (0xFB3F, "X"), + (0xFB40, "M", "נּ"), + (0xFB41, "M", "סּ"), + (0xFB42, "X"), + (0xFB43, "M", "ףּ"), + (0xFB44, "M", "פּ"), + (0xFB45, "X"), + (0xFB46, "M", "צּ"), + (0xFB47, "M", "קּ"), + (0xFB48, "M", "רּ"), + (0xFB49, "M", "שּ"), + (0xFB4A, "M", "תּ"), + (0xFB4B, "M", "וֹ"), + (0xFB4C, "M", "בֿ"), + (0xFB4D, "M", "כֿ"), + (0xFB4E, "M", "פֿ"), + (0xFB4F, "M", "אל"), + (0xFB50, "M", "ٱ"), + (0xFB52, "M", "ٻ"), + (0xFB56, "M", "پ"), + ] + + +def _seg_45() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFB5A, "M", "ڀ"), + (0xFB5E, "M", "ٺ"), + (0xFB62, "M", "ٿ"), + (0xFB66, "M", "ٹ"), + (0xFB6A, "M", "ڤ"), + (0xFB6E, "M", "ڦ"), + (0xFB72, "M", "ڄ"), + (0xFB76, "M", "ڃ"), + (0xFB7A, "M", "چ"), + (0xFB7E, "M", "ڇ"), + (0xFB82, "M", "ڍ"), + (0xFB84, "M", "ڌ"), + (0xFB86, "M", "ڎ"), + (0xFB88, "M", "ڈ"), + (0xFB8A, "M", "ژ"), + (0xFB8C, "M", "ڑ"), + (0xFB8E, "M", "ک"), + (0xFB92, "M", "گ"), + (0xFB96, "M", "ڳ"), + (0xFB9A, "M", "ڱ"), + (0xFB9E, "M", "ں"), + (0xFBA0, "M", "ڻ"), + (0xFBA4, "M", "ۀ"), + (0xFBA6, "M", "ہ"), + (0xFBAA, "M", "ھ"), + (0xFBAE, "M", "ے"), + (0xFBB0, "M", "ۓ"), + (0xFBB2, "V"), + (0xFBC3, "X"), + (0xFBD3, "M", "ڭ"), + (0xFBD7, "M", "ۇ"), + (0xFBD9, "M", "ۆ"), + (0xFBDB, "M", "ۈ"), + (0xFBDD, "M", "ۇٴ"), + (0xFBDE, "M", "ۋ"), + (0xFBE0, "M", "ۅ"), + (0xFBE2, "M", "ۉ"), + (0xFBE4, "M", "ې"), + (0xFBE8, "M", "ى"), + (0xFBEA, "M", "ئا"), + (0xFBEC, "M", "ئە"), + (0xFBEE, "M", "ئو"), + (0xFBF0, "M", "ئۇ"), + (0xFBF2, "M", "ئۆ"), + (0xFBF4, "M", "ئۈ"), + (0xFBF6, "M", "ئې"), + (0xFBF9, "M", "ئى"), + (0xFBFC, "M", "ی"), + (0xFC00, "M", "ئج"), + (0xFC01, "M", "ئح"), + (0xFC02, "M", "ئم"), + (0xFC03, "M", "ئى"), + (0xFC04, "M", "ئي"), + (0xFC05, "M", "بج"), + (0xFC06, "M", "بح"), + (0xFC07, "M", "بخ"), + (0xFC08, "M", "بم"), + (0xFC09, "M", "بى"), + (0xFC0A, "M", "بي"), + (0xFC0B, "M", "تج"), + (0xFC0C, "M", "تح"), + (0xFC0D, "M", "تخ"), + (0xFC0E, "M", "تم"), + (0xFC0F, "M", "تى"), + (0xFC10, "M", "تي"), + (0xFC11, "M", "ثج"), + (0xFC12, "M", "ثم"), + (0xFC13, "M", "ثى"), + (0xFC14, "M", "ثي"), + (0xFC15, "M", "جح"), + (0xFC16, "M", "جم"), + (0xFC17, "M", "حج"), + (0xFC18, "M", "حم"), + (0xFC19, "M", "خج"), + (0xFC1A, "M", "خح"), + (0xFC1B, "M", "خم"), + (0xFC1C, "M", "سج"), + (0xFC1D, "M", "سح"), + (0xFC1E, "M", "سخ"), + (0xFC1F, "M", "سم"), + (0xFC20, "M", "صح"), + (0xFC21, "M", "صم"), + (0xFC22, "M", "ضج"), + (0xFC23, "M", "ضح"), + (0xFC24, "M", "ضخ"), + (0xFC25, "M", "ضم"), + (0xFC26, "M", "طح"), + (0xFC27, "M", "طم"), + (0xFC28, "M", "ظم"), + (0xFC29, "M", "عج"), + (0xFC2A, "M", "عم"), + (0xFC2B, "M", "غج"), + (0xFC2C, "M", "غم"), + (0xFC2D, "M", "فج"), + (0xFC2E, "M", "فح"), + (0xFC2F, "M", "فخ"), + (0xFC30, "M", "فم"), + (0xFC31, "M", "فى"), + (0xFC32, "M", "في"), + (0xFC33, "M", "قح"), + ] + + +def _seg_46() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFC34, "M", "قم"), + (0xFC35, "M", "قى"), + (0xFC36, "M", "قي"), + (0xFC37, "M", "كا"), + (0xFC38, "M", "كج"), + (0xFC39, "M", "كح"), + (0xFC3A, "M", "كخ"), + (0xFC3B, "M", "كل"), + (0xFC3C, "M", "كم"), + (0xFC3D, "M", "كى"), + (0xFC3E, "M", "كي"), + (0xFC3F, "M", "لج"), + (0xFC40, "M", "لح"), + (0xFC41, "M", "لخ"), + (0xFC42, "M", "لم"), + (0xFC43, "M", "لى"), + (0xFC44, "M", "لي"), + (0xFC45, "M", "مج"), + (0xFC46, "M", "مح"), + (0xFC47, "M", "مخ"), + (0xFC48, "M", "مم"), + (0xFC49, "M", "مى"), + (0xFC4A, "M", "مي"), + (0xFC4B, "M", "نج"), + (0xFC4C, "M", "نح"), + (0xFC4D, "M", "نخ"), + (0xFC4E, "M", "نم"), + (0xFC4F, "M", "نى"), + (0xFC50, "M", "ني"), + (0xFC51, "M", "هج"), + (0xFC52, "M", "هم"), + (0xFC53, "M", "هى"), + (0xFC54, "M", "هي"), + (0xFC55, "M", "يج"), + (0xFC56, "M", "يح"), + (0xFC57, "M", "يخ"), + (0xFC58, "M", "يم"), + (0xFC59, "M", "يى"), + (0xFC5A, "M", "يي"), + (0xFC5B, "M", "ذٰ"), + (0xFC5C, "M", "رٰ"), + (0xFC5D, "M", "ىٰ"), + (0xFC5E, "M", " ٌّ"), + (0xFC5F, "M", " ٍّ"), + (0xFC60, "M", " َّ"), + (0xFC61, "M", " ُّ"), + (0xFC62, "M", " ِّ"), + (0xFC63, "M", " ّٰ"), + (0xFC64, "M", "ئر"), + (0xFC65, "M", "ئز"), + (0xFC66, "M", "ئم"), + (0xFC67, "M", "ئن"), + (0xFC68, "M", "ئى"), + (0xFC69, "M", "ئي"), + (0xFC6A, "M", "بر"), + (0xFC6B, "M", "بز"), + (0xFC6C, "M", "بم"), + (0xFC6D, "M", "بن"), + (0xFC6E, "M", "بى"), + (0xFC6F, "M", "بي"), + (0xFC70, "M", "تر"), + (0xFC71, "M", "تز"), + (0xFC72, "M", "تم"), + (0xFC73, "M", "تن"), + (0xFC74, "M", "تى"), + (0xFC75, "M", "تي"), + (0xFC76, "M", "ثر"), + (0xFC77, "M", "ثز"), + (0xFC78, "M", "ثم"), + (0xFC79, "M", "ثن"), + (0xFC7A, "M", "ثى"), + (0xFC7B, "M", "ثي"), + (0xFC7C, "M", "فى"), + (0xFC7D, "M", "في"), + (0xFC7E, "M", "قى"), + (0xFC7F, "M", "قي"), + (0xFC80, "M", "كا"), + (0xFC81, "M", "كل"), + (0xFC82, "M", "كم"), + (0xFC83, "M", "كى"), + (0xFC84, "M", "كي"), + (0xFC85, "M", "لم"), + (0xFC86, "M", "لى"), + (0xFC87, "M", "لي"), + (0xFC88, "M", "ما"), + (0xFC89, "M", "مم"), + (0xFC8A, "M", "نر"), + (0xFC8B, "M", "نز"), + (0xFC8C, "M", "نم"), + (0xFC8D, "M", "نن"), + (0xFC8E, "M", "نى"), + (0xFC8F, "M", "ني"), + (0xFC90, "M", "ىٰ"), + (0xFC91, "M", "ير"), + (0xFC92, "M", "يز"), + (0xFC93, "M", "يم"), + (0xFC94, "M", "ين"), + (0xFC95, "M", "يى"), + (0xFC96, "M", "يي"), + (0xFC97, "M", "ئج"), + ] + + +def _seg_47() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFC98, "M", "ئح"), + (0xFC99, "M", "ئخ"), + (0xFC9A, "M", "ئم"), + (0xFC9B, "M", "ئه"), + (0xFC9C, "M", "بج"), + (0xFC9D, "M", "بح"), + (0xFC9E, "M", "بخ"), + (0xFC9F, "M", "بم"), + (0xFCA0, "M", "به"), + (0xFCA1, "M", "تج"), + (0xFCA2, "M", "تح"), + (0xFCA3, "M", "تخ"), + (0xFCA4, "M", "تم"), + (0xFCA5, "M", "ته"), + (0xFCA6, "M", "ثم"), + (0xFCA7, "M", "جح"), + (0xFCA8, "M", "جم"), + (0xFCA9, "M", "حج"), + (0xFCAA, "M", "حم"), + (0xFCAB, "M", "خج"), + (0xFCAC, "M", "خم"), + (0xFCAD, "M", "سج"), + (0xFCAE, "M", "سح"), + (0xFCAF, "M", "سخ"), + (0xFCB0, "M", "سم"), + (0xFCB1, "M", "صح"), + (0xFCB2, "M", "صخ"), + (0xFCB3, "M", "صم"), + (0xFCB4, "M", "ضج"), + (0xFCB5, "M", "ضح"), + (0xFCB6, "M", "ضخ"), + (0xFCB7, "M", "ضم"), + (0xFCB8, "M", "طح"), + (0xFCB9, "M", "ظم"), + (0xFCBA, "M", "عج"), + (0xFCBB, "M", "عم"), + (0xFCBC, "M", "غج"), + (0xFCBD, "M", "غم"), + (0xFCBE, "M", "فج"), + (0xFCBF, "M", "فح"), + (0xFCC0, "M", "فخ"), + (0xFCC1, "M", "فم"), + (0xFCC2, "M", "قح"), + (0xFCC3, "M", "قم"), + (0xFCC4, "M", "كج"), + (0xFCC5, "M", "كح"), + (0xFCC6, "M", "كخ"), + (0xFCC7, "M", "كل"), + (0xFCC8, "M", "كم"), + (0xFCC9, "M", "لج"), + (0xFCCA, "M", "لح"), + (0xFCCB, "M", "لخ"), + (0xFCCC, "M", "لم"), + (0xFCCD, "M", "له"), + (0xFCCE, "M", "مج"), + (0xFCCF, "M", "مح"), + (0xFCD0, "M", "مخ"), + (0xFCD1, "M", "مم"), + (0xFCD2, "M", "نج"), + (0xFCD3, "M", "نح"), + (0xFCD4, "M", "نخ"), + (0xFCD5, "M", "نم"), + (0xFCD6, "M", "نه"), + (0xFCD7, "M", "هج"), + (0xFCD8, "M", "هم"), + (0xFCD9, "M", "هٰ"), + (0xFCDA, "M", "يج"), + (0xFCDB, "M", "يح"), + (0xFCDC, "M", "يخ"), + (0xFCDD, "M", "يم"), + (0xFCDE, "M", "يه"), + (0xFCDF, "M", "ئم"), + (0xFCE0, "M", "ئه"), + (0xFCE1, "M", "بم"), + (0xFCE2, "M", "به"), + (0xFCE3, "M", "تم"), + (0xFCE4, "M", "ته"), + (0xFCE5, "M", "ثم"), + (0xFCE6, "M", "ثه"), + (0xFCE7, "M", "سم"), + (0xFCE8, "M", "سه"), + (0xFCE9, "M", "شم"), + (0xFCEA, "M", "شه"), + (0xFCEB, "M", "كل"), + (0xFCEC, "M", "كم"), + (0xFCED, "M", "لم"), + (0xFCEE, "M", "نم"), + (0xFCEF, "M", "نه"), + (0xFCF0, "M", "يم"), + (0xFCF1, "M", "يه"), + (0xFCF2, "M", "ـَّ"), + (0xFCF3, "M", "ـُّ"), + (0xFCF4, "M", "ـِّ"), + (0xFCF5, "M", "طى"), + (0xFCF6, "M", "طي"), + (0xFCF7, "M", "عى"), + (0xFCF8, "M", "عي"), + (0xFCF9, "M", "غى"), + (0xFCFA, "M", "غي"), + (0xFCFB, "M", "سى"), + ] + + +def _seg_48() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFCFC, "M", "سي"), + (0xFCFD, "M", "شى"), + (0xFCFE, "M", "شي"), + (0xFCFF, "M", "حى"), + (0xFD00, "M", "حي"), + (0xFD01, "M", "جى"), + (0xFD02, "M", "جي"), + (0xFD03, "M", "خى"), + (0xFD04, "M", "خي"), + (0xFD05, "M", "صى"), + (0xFD06, "M", "صي"), + (0xFD07, "M", "ضى"), + (0xFD08, "M", "ضي"), + (0xFD09, "M", "شج"), + (0xFD0A, "M", "شح"), + (0xFD0B, "M", "شخ"), + (0xFD0C, "M", "شم"), + (0xFD0D, "M", "شر"), + (0xFD0E, "M", "سر"), + (0xFD0F, "M", "صر"), + (0xFD10, "M", "ضر"), + (0xFD11, "M", "طى"), + (0xFD12, "M", "طي"), + (0xFD13, "M", "عى"), + (0xFD14, "M", "عي"), + (0xFD15, "M", "غى"), + (0xFD16, "M", "غي"), + (0xFD17, "M", "سى"), + (0xFD18, "M", "سي"), + (0xFD19, "M", "شى"), + (0xFD1A, "M", "شي"), + (0xFD1B, "M", "حى"), + (0xFD1C, "M", "حي"), + (0xFD1D, "M", "جى"), + (0xFD1E, "M", "جي"), + (0xFD1F, "M", "خى"), + (0xFD20, "M", "خي"), + (0xFD21, "M", "صى"), + (0xFD22, "M", "صي"), + (0xFD23, "M", "ضى"), + (0xFD24, "M", "ضي"), + (0xFD25, "M", "شج"), + (0xFD26, "M", "شح"), + (0xFD27, "M", "شخ"), + (0xFD28, "M", "شم"), + (0xFD29, "M", "شر"), + (0xFD2A, "M", "سر"), + (0xFD2B, "M", "صر"), + (0xFD2C, "M", "ضر"), + (0xFD2D, "M", "شج"), + (0xFD2E, "M", "شح"), + (0xFD2F, "M", "شخ"), + (0xFD30, "M", "شم"), + (0xFD31, "M", "سه"), + (0xFD32, "M", "شه"), + (0xFD33, "M", "طم"), + (0xFD34, "M", "سج"), + (0xFD35, "M", "سح"), + (0xFD36, "M", "سخ"), + (0xFD37, "M", "شج"), + (0xFD38, "M", "شح"), + (0xFD39, "M", "شخ"), + (0xFD3A, "M", "طم"), + (0xFD3B, "M", "ظم"), + (0xFD3C, "M", "اً"), + (0xFD3E, "V"), + (0xFD50, "M", "تجم"), + (0xFD51, "M", "تحج"), + (0xFD53, "M", "تحم"), + (0xFD54, "M", "تخم"), + (0xFD55, "M", "تمج"), + (0xFD56, "M", "تمح"), + (0xFD57, "M", "تمخ"), + (0xFD58, "M", "جمح"), + (0xFD5A, "M", "حمي"), + (0xFD5B, "M", "حمى"), + (0xFD5C, "M", "سحج"), + (0xFD5D, "M", "سجح"), + (0xFD5E, "M", "سجى"), + (0xFD5F, "M", "سمح"), + (0xFD61, "M", "سمج"), + (0xFD62, "M", "سمم"), + (0xFD64, "M", "صحح"), + (0xFD66, "M", "صمم"), + (0xFD67, "M", "شحم"), + (0xFD69, "M", "شجي"), + (0xFD6A, "M", "شمخ"), + (0xFD6C, "M", "شمم"), + (0xFD6E, "M", "ضحى"), + (0xFD6F, "M", "ضخم"), + (0xFD71, "M", "طمح"), + (0xFD73, "M", "طمم"), + (0xFD74, "M", "طمي"), + (0xFD75, "M", "عجم"), + (0xFD76, "M", "عمم"), + (0xFD78, "M", "عمى"), + (0xFD79, "M", "غمم"), + (0xFD7A, "M", "غمي"), + (0xFD7B, "M", "غمى"), + (0xFD7C, "M", "فخم"), + ] + + +def _seg_49() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFD7E, "M", "قمح"), + (0xFD7F, "M", "قمم"), + (0xFD80, "M", "لحم"), + (0xFD81, "M", "لحي"), + (0xFD82, "M", "لحى"), + (0xFD83, "M", "لجج"), + (0xFD85, "M", "لخم"), + (0xFD87, "M", "لمح"), + (0xFD89, "M", "محج"), + (0xFD8A, "M", "محم"), + (0xFD8B, "M", "محي"), + (0xFD8C, "M", "مجح"), + (0xFD8D, "M", "مجم"), + (0xFD8E, "M", "مخج"), + (0xFD8F, "M", "مخم"), + (0xFD90, "X"), + (0xFD92, "M", "مجخ"), + (0xFD93, "M", "همج"), + (0xFD94, "M", "همم"), + (0xFD95, "M", "نحم"), + (0xFD96, "M", "نحى"), + (0xFD97, "M", "نجم"), + (0xFD99, "M", "نجى"), + (0xFD9A, "M", "نمي"), + (0xFD9B, "M", "نمى"), + (0xFD9C, "M", "يمم"), + (0xFD9E, "M", "بخي"), + (0xFD9F, "M", "تجي"), + (0xFDA0, "M", "تجى"), + (0xFDA1, "M", "تخي"), + (0xFDA2, "M", "تخى"), + (0xFDA3, "M", "تمي"), + (0xFDA4, "M", "تمى"), + (0xFDA5, "M", "جمي"), + (0xFDA6, "M", "جحى"), + (0xFDA7, "M", "جمى"), + (0xFDA8, "M", "سخى"), + (0xFDA9, "M", "صحي"), + (0xFDAA, "M", "شحي"), + (0xFDAB, "M", "ضحي"), + (0xFDAC, "M", "لجي"), + (0xFDAD, "M", "لمي"), + (0xFDAE, "M", "يحي"), + (0xFDAF, "M", "يجي"), + (0xFDB0, "M", "يمي"), + (0xFDB1, "M", "ممي"), + (0xFDB2, "M", "قمي"), + (0xFDB3, "M", "نحي"), + (0xFDB4, "M", "قمح"), + (0xFDB5, "M", "لحم"), + (0xFDB6, "M", "عمي"), + (0xFDB7, "M", "كمي"), + (0xFDB8, "M", "نجح"), + (0xFDB9, "M", "مخي"), + (0xFDBA, "M", "لجم"), + (0xFDBB, "M", "كمم"), + (0xFDBC, "M", "لجم"), + (0xFDBD, "M", "نجح"), + (0xFDBE, "M", "جحي"), + (0xFDBF, "M", "حجي"), + (0xFDC0, "M", "مجي"), + (0xFDC1, "M", "فمي"), + (0xFDC2, "M", "بحي"), + (0xFDC3, "M", "كمم"), + (0xFDC4, "M", "عجم"), + (0xFDC5, "M", "صمم"), + (0xFDC6, "M", "سخي"), + (0xFDC7, "M", "نجي"), + (0xFDC8, "X"), + (0xFDCF, "V"), + (0xFDD0, "X"), + (0xFDF0, "M", "صلے"), + (0xFDF1, "M", "قلے"), + (0xFDF2, "M", "الله"), + (0xFDF3, "M", "اكبر"), + (0xFDF4, "M", "محمد"), + (0xFDF5, "M", "صلعم"), + (0xFDF6, "M", "رسول"), + (0xFDF7, "M", "عليه"), + (0xFDF8, "M", "وسلم"), + (0xFDF9, "M", "صلى"), + (0xFDFA, "M", "صلى الله عليه وسلم"), + (0xFDFB, "M", "جل جلاله"), + (0xFDFC, "M", "ریال"), + (0xFDFD, "V"), + (0xFE00, "I"), + (0xFE10, "M", ","), + (0xFE11, "M", "、"), + (0xFE12, "X"), + (0xFE13, "M", ":"), + (0xFE14, "M", ";"), + (0xFE15, "M", "!"), + (0xFE16, "M", "?"), + (0xFE17, "M", "〖"), + (0xFE18, "M", "〗"), + (0xFE19, "X"), + (0xFE20, "V"), + (0xFE30, "X"), + (0xFE31, "M", "—"), + (0xFE32, "M", "–"), + ] + + +def _seg_50() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFE33, "M", "_"), + (0xFE35, "M", "("), + (0xFE36, "M", ")"), + (0xFE37, "M", "{"), + (0xFE38, "M", "}"), + (0xFE39, "M", "〔"), + (0xFE3A, "M", "〕"), + (0xFE3B, "M", "【"), + (0xFE3C, "M", "】"), + (0xFE3D, "M", "《"), + (0xFE3E, "M", "》"), + (0xFE3F, "M", "〈"), + (0xFE40, "M", "〉"), + (0xFE41, "M", "「"), + (0xFE42, "M", "」"), + (0xFE43, "M", "『"), + (0xFE44, "M", "』"), + (0xFE45, "V"), + (0xFE47, "M", "["), + (0xFE48, "M", "]"), + (0xFE49, "M", " ̅"), + (0xFE4D, "M", "_"), + (0xFE50, "M", ","), + (0xFE51, "M", "、"), + (0xFE52, "X"), + (0xFE54, "M", ";"), + (0xFE55, "M", ":"), + (0xFE56, "M", "?"), + (0xFE57, "M", "!"), + (0xFE58, "M", "—"), + (0xFE59, "M", "("), + (0xFE5A, "M", ")"), + (0xFE5B, "M", "{"), + (0xFE5C, "M", "}"), + (0xFE5D, "M", "〔"), + (0xFE5E, "M", "〕"), + (0xFE5F, "M", "#"), + (0xFE60, "M", "&"), + (0xFE61, "M", "*"), + (0xFE62, "M", "+"), + (0xFE63, "M", "-"), + (0xFE64, "M", "<"), + (0xFE65, "M", ">"), + (0xFE66, "M", "="), + (0xFE67, "X"), + (0xFE68, "M", "\\"), + (0xFE69, "M", "$"), + (0xFE6A, "M", "%"), + (0xFE6B, "M", "@"), + (0xFE6C, "X"), + (0xFE70, "M", " ً"), + (0xFE71, "M", "ـً"), + (0xFE72, "M", " ٌ"), + (0xFE73, "V"), + (0xFE74, "M", " ٍ"), + (0xFE75, "X"), + (0xFE76, "M", " َ"), + (0xFE77, "M", "ـَ"), + (0xFE78, "M", " ُ"), + (0xFE79, "M", "ـُ"), + (0xFE7A, "M", " ِ"), + (0xFE7B, "M", "ـِ"), + (0xFE7C, "M", " ّ"), + (0xFE7D, "M", "ـّ"), + (0xFE7E, "M", " ْ"), + (0xFE7F, "M", "ـْ"), + (0xFE80, "M", "ء"), + (0xFE81, "M", "آ"), + (0xFE83, "M", "أ"), + (0xFE85, "M", "ؤ"), + (0xFE87, "M", "إ"), + (0xFE89, "M", "ئ"), + (0xFE8D, "M", "ا"), + (0xFE8F, "M", "ب"), + (0xFE93, "M", "ة"), + (0xFE95, "M", "ت"), + (0xFE99, "M", "ث"), + (0xFE9D, "M", "ج"), + (0xFEA1, "M", "ح"), + (0xFEA5, "M", "خ"), + (0xFEA9, "M", "د"), + (0xFEAB, "M", "ذ"), + (0xFEAD, "M", "ر"), + (0xFEAF, "M", "ز"), + (0xFEB1, "M", "س"), + (0xFEB5, "M", "ش"), + (0xFEB9, "M", "ص"), + (0xFEBD, "M", "ض"), + (0xFEC1, "M", "ط"), + (0xFEC5, "M", "ظ"), + (0xFEC9, "M", "ع"), + (0xFECD, "M", "غ"), + (0xFED1, "M", "ف"), + (0xFED5, "M", "ق"), + (0xFED9, "M", "ك"), + (0xFEDD, "M", "ل"), + (0xFEE1, "M", "م"), + (0xFEE5, "M", "ن"), + (0xFEE9, "M", "ه"), + (0xFEED, "M", "و"), + ] + + +def _seg_51() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFEEF, "M", "ى"), + (0xFEF1, "M", "ي"), + (0xFEF5, "M", "لآ"), + (0xFEF7, "M", "لأ"), + (0xFEF9, "M", "لإ"), + (0xFEFB, "M", "لا"), + (0xFEFD, "X"), + (0xFEFF, "I"), + (0xFF00, "X"), + (0xFF01, "M", "!"), + (0xFF02, "M", '"'), + (0xFF03, "M", "#"), + (0xFF04, "M", "$"), + (0xFF05, "M", "%"), + (0xFF06, "M", "&"), + (0xFF07, "M", "'"), + (0xFF08, "M", "("), + (0xFF09, "M", ")"), + (0xFF0A, "M", "*"), + (0xFF0B, "M", "+"), + (0xFF0C, "M", ","), + (0xFF0D, "M", "-"), + (0xFF0E, "M", "."), + (0xFF0F, "M", "/"), + (0xFF10, "M", "0"), + (0xFF11, "M", "1"), + (0xFF12, "M", "2"), + (0xFF13, "M", "3"), + (0xFF14, "M", "4"), + (0xFF15, "M", "5"), + (0xFF16, "M", "6"), + (0xFF17, "M", "7"), + (0xFF18, "M", "8"), + (0xFF19, "M", "9"), + (0xFF1A, "M", ":"), + (0xFF1B, "M", ";"), + (0xFF1C, "M", "<"), + (0xFF1D, "M", "="), + (0xFF1E, "M", ">"), + (0xFF1F, "M", "?"), + (0xFF20, "M", "@"), + (0xFF21, "M", "a"), + (0xFF22, "M", "b"), + (0xFF23, "M", "c"), + (0xFF24, "M", "d"), + (0xFF25, "M", "e"), + (0xFF26, "M", "f"), + (0xFF27, "M", "g"), + (0xFF28, "M", "h"), + (0xFF29, "M", "i"), + (0xFF2A, "M", "j"), + (0xFF2B, "M", "k"), + (0xFF2C, "M", "l"), + (0xFF2D, "M", "m"), + (0xFF2E, "M", "n"), + (0xFF2F, "M", "o"), + (0xFF30, "M", "p"), + (0xFF31, "M", "q"), + (0xFF32, "M", "r"), + (0xFF33, "M", "s"), + (0xFF34, "M", "t"), + (0xFF35, "M", "u"), + (0xFF36, "M", "v"), + (0xFF37, "M", "w"), + (0xFF38, "M", "x"), + (0xFF39, "M", "y"), + (0xFF3A, "M", "z"), + (0xFF3B, "M", "["), + (0xFF3C, "M", "\\"), + (0xFF3D, "M", "]"), + (0xFF3E, "M", "^"), + (0xFF3F, "M", "_"), + (0xFF40, "M", "`"), + (0xFF41, "M", "a"), + (0xFF42, "M", "b"), + (0xFF43, "M", "c"), + (0xFF44, "M", "d"), + (0xFF45, "M", "e"), + (0xFF46, "M", "f"), + (0xFF47, "M", "g"), + (0xFF48, "M", "h"), + (0xFF49, "M", "i"), + (0xFF4A, "M", "j"), + (0xFF4B, "M", "k"), + (0xFF4C, "M", "l"), + (0xFF4D, "M", "m"), + (0xFF4E, "M", "n"), + (0xFF4F, "M", "o"), + (0xFF50, "M", "p"), + (0xFF51, "M", "q"), + (0xFF52, "M", "r"), + (0xFF53, "M", "s"), + (0xFF54, "M", "t"), + (0xFF55, "M", "u"), + (0xFF56, "M", "v"), + (0xFF57, "M", "w"), + (0xFF58, "M", "x"), + (0xFF59, "M", "y"), + (0xFF5A, "M", "z"), + (0xFF5B, "M", "{"), + ] + + +def _seg_52() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFF5C, "M", "|"), + (0xFF5D, "M", "}"), + (0xFF5E, "M", "~"), + (0xFF5F, "M", "⦅"), + (0xFF60, "M", "⦆"), + (0xFF61, "M", "."), + (0xFF62, "M", "「"), + (0xFF63, "M", "」"), + (0xFF64, "M", "、"), + (0xFF65, "M", "・"), + (0xFF66, "M", "ヲ"), + (0xFF67, "M", "ァ"), + (0xFF68, "M", "ィ"), + (0xFF69, "M", "ゥ"), + (0xFF6A, "M", "ェ"), + (0xFF6B, "M", "ォ"), + (0xFF6C, "M", "ャ"), + (0xFF6D, "M", "ュ"), + (0xFF6E, "M", "ョ"), + (0xFF6F, "M", "ッ"), + (0xFF70, "M", "ー"), + (0xFF71, "M", "ア"), + (0xFF72, "M", "イ"), + (0xFF73, "M", "ウ"), + (0xFF74, "M", "エ"), + (0xFF75, "M", "オ"), + (0xFF76, "M", "カ"), + (0xFF77, "M", "キ"), + (0xFF78, "M", "ク"), + (0xFF79, "M", "ケ"), + (0xFF7A, "M", "コ"), + (0xFF7B, "M", "サ"), + (0xFF7C, "M", "シ"), + (0xFF7D, "M", "ス"), + (0xFF7E, "M", "セ"), + (0xFF7F, "M", "ソ"), + (0xFF80, "M", "タ"), + (0xFF81, "M", "チ"), + (0xFF82, "M", "ツ"), + (0xFF83, "M", "テ"), + (0xFF84, "M", "ト"), + (0xFF85, "M", "ナ"), + (0xFF86, "M", "ニ"), + (0xFF87, "M", "ヌ"), + (0xFF88, "M", "ネ"), + (0xFF89, "M", "ノ"), + (0xFF8A, "M", "ハ"), + (0xFF8B, "M", "ヒ"), + (0xFF8C, "M", "フ"), + (0xFF8D, "M", "ヘ"), + (0xFF8E, "M", "ホ"), + (0xFF8F, "M", "マ"), + (0xFF90, "M", "ミ"), + (0xFF91, "M", "ム"), + (0xFF92, "M", "メ"), + (0xFF93, "M", "モ"), + (0xFF94, "M", "ヤ"), + (0xFF95, "M", "ユ"), + (0xFF96, "M", "ヨ"), + (0xFF97, "M", "ラ"), + (0xFF98, "M", "リ"), + (0xFF99, "M", "ル"), + (0xFF9A, "M", "レ"), + (0xFF9B, "M", "ロ"), + (0xFF9C, "M", "ワ"), + (0xFF9D, "M", "ン"), + (0xFF9E, "M", "゙"), + (0xFF9F, "M", "゚"), + (0xFFA0, "I"), + (0xFFA1, "M", "ᄀ"), + (0xFFA2, "M", "ᄁ"), + (0xFFA3, "M", "ᆪ"), + (0xFFA4, "M", "ᄂ"), + (0xFFA5, "M", "ᆬ"), + (0xFFA6, "M", "ᆭ"), + (0xFFA7, "M", "ᄃ"), + (0xFFA8, "M", "ᄄ"), + (0xFFA9, "M", "ᄅ"), + (0xFFAA, "M", "ᆰ"), + (0xFFAB, "M", "ᆱ"), + (0xFFAC, "M", "ᆲ"), + (0xFFAD, "M", "ᆳ"), + (0xFFAE, "M", "ᆴ"), + (0xFFAF, "M", "ᆵ"), + (0xFFB0, "M", "ᄚ"), + (0xFFB1, "M", "ᄆ"), + (0xFFB2, "M", "ᄇ"), + (0xFFB3, "M", "ᄈ"), + (0xFFB4, "M", "ᄡ"), + (0xFFB5, "M", "ᄉ"), + (0xFFB6, "M", "ᄊ"), + (0xFFB7, "M", "ᄋ"), + (0xFFB8, "M", "ᄌ"), + (0xFFB9, "M", "ᄍ"), + (0xFFBA, "M", "ᄎ"), + (0xFFBB, "M", "ᄏ"), + (0xFFBC, "M", "ᄐ"), + (0xFFBD, "M", "ᄑ"), + (0xFFBE, "M", "ᄒ"), + (0xFFBF, "X"), + ] + + +def _seg_53() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFFC2, "M", "ᅡ"), + (0xFFC3, "M", "ᅢ"), + (0xFFC4, "M", "ᅣ"), + (0xFFC5, "M", "ᅤ"), + (0xFFC6, "M", "ᅥ"), + (0xFFC7, "M", "ᅦ"), + (0xFFC8, "X"), + (0xFFCA, "M", "ᅧ"), + (0xFFCB, "M", "ᅨ"), + (0xFFCC, "M", "ᅩ"), + (0xFFCD, "M", "ᅪ"), + (0xFFCE, "M", "ᅫ"), + (0xFFCF, "M", "ᅬ"), + (0xFFD0, "X"), + (0xFFD2, "M", "ᅭ"), + (0xFFD3, "M", "ᅮ"), + (0xFFD4, "M", "ᅯ"), + (0xFFD5, "M", "ᅰ"), + (0xFFD6, "M", "ᅱ"), + (0xFFD7, "M", "ᅲ"), + (0xFFD8, "X"), + (0xFFDA, "M", "ᅳ"), + (0xFFDB, "M", "ᅴ"), + (0xFFDC, "M", "ᅵ"), + (0xFFDD, "X"), + (0xFFE0, "M", "¢"), + (0xFFE1, "M", "£"), + (0xFFE2, "M", "¬"), + (0xFFE3, "M", " ̄"), + (0xFFE4, "M", "¦"), + (0xFFE5, "M", "¥"), + (0xFFE6, "M", "₩"), + (0xFFE7, "X"), + (0xFFE8, "M", "│"), + (0xFFE9, "M", "←"), + (0xFFEA, "M", "↑"), + (0xFFEB, "M", "→"), + (0xFFEC, "M", "↓"), + (0xFFED, "M", "■"), + (0xFFEE, "M", "○"), + (0xFFEF, "X"), + (0x10000, "V"), + (0x1000C, "X"), + (0x1000D, "V"), + (0x10027, "X"), + (0x10028, "V"), + (0x1003B, "X"), + (0x1003C, "V"), + (0x1003E, "X"), + (0x1003F, "V"), + (0x1004E, "X"), + (0x10050, "V"), + (0x1005E, "X"), + (0x10080, "V"), + (0x100FB, "X"), + (0x10100, "V"), + (0x10103, "X"), + (0x10107, "V"), + (0x10134, "X"), + (0x10137, "V"), + (0x1018F, "X"), + (0x10190, "V"), + (0x1019D, "X"), + (0x101A0, "V"), + (0x101A1, "X"), + (0x101D0, "V"), + (0x101FE, "X"), + (0x10280, "V"), + (0x1029D, "X"), + (0x102A0, "V"), + (0x102D1, "X"), + (0x102E0, "V"), + (0x102FC, "X"), + (0x10300, "V"), + (0x10324, "X"), + (0x1032D, "V"), + (0x1034B, "X"), + (0x10350, "V"), + (0x1037B, "X"), + (0x10380, "V"), + (0x1039E, "X"), + (0x1039F, "V"), + (0x103C4, "X"), + (0x103C8, "V"), + (0x103D6, "X"), + (0x10400, "M", "𐐨"), + (0x10401, "M", "𐐩"), + (0x10402, "M", "𐐪"), + (0x10403, "M", "𐐫"), + (0x10404, "M", "𐐬"), + (0x10405, "M", "𐐭"), + (0x10406, "M", "𐐮"), + (0x10407, "M", "𐐯"), + (0x10408, "M", "𐐰"), + (0x10409, "M", "𐐱"), + (0x1040A, "M", "𐐲"), + (0x1040B, "M", "𐐳"), + (0x1040C, "M", "𐐴"), + (0x1040D, "M", "𐐵"), + (0x1040E, "M", "𐐶"), + ] + + +def _seg_54() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1040F, "M", "𐐷"), + (0x10410, "M", "𐐸"), + (0x10411, "M", "𐐹"), + (0x10412, "M", "𐐺"), + (0x10413, "M", "𐐻"), + (0x10414, "M", "𐐼"), + (0x10415, "M", "𐐽"), + (0x10416, "M", "𐐾"), + (0x10417, "M", "𐐿"), + (0x10418, "M", "𐑀"), + (0x10419, "M", "𐑁"), + (0x1041A, "M", "𐑂"), + (0x1041B, "M", "𐑃"), + (0x1041C, "M", "𐑄"), + (0x1041D, "M", "𐑅"), + (0x1041E, "M", "𐑆"), + (0x1041F, "M", "𐑇"), + (0x10420, "M", "𐑈"), + (0x10421, "M", "𐑉"), + (0x10422, "M", "𐑊"), + (0x10423, "M", "𐑋"), + (0x10424, "M", "𐑌"), + (0x10425, "M", "𐑍"), + (0x10426, "M", "𐑎"), + (0x10427, "M", "𐑏"), + (0x10428, "V"), + (0x1049E, "X"), + (0x104A0, "V"), + (0x104AA, "X"), + (0x104B0, "M", "𐓘"), + (0x104B1, "M", "𐓙"), + (0x104B2, "M", "𐓚"), + (0x104B3, "M", "𐓛"), + (0x104B4, "M", "𐓜"), + (0x104B5, "M", "𐓝"), + (0x104B6, "M", "𐓞"), + (0x104B7, "M", "𐓟"), + (0x104B8, "M", "𐓠"), + (0x104B9, "M", "𐓡"), + (0x104BA, "M", "𐓢"), + (0x104BB, "M", "𐓣"), + (0x104BC, "M", "𐓤"), + (0x104BD, "M", "𐓥"), + (0x104BE, "M", "𐓦"), + (0x104BF, "M", "𐓧"), + (0x104C0, "M", "𐓨"), + (0x104C1, "M", "𐓩"), + (0x104C2, "M", "𐓪"), + (0x104C3, "M", "𐓫"), + (0x104C4, "M", "𐓬"), + (0x104C5, "M", "𐓭"), + (0x104C6, "M", "𐓮"), + (0x104C7, "M", "𐓯"), + (0x104C8, "M", "𐓰"), + (0x104C9, "M", "𐓱"), + (0x104CA, "M", "𐓲"), + (0x104CB, "M", "𐓳"), + (0x104CC, "M", "𐓴"), + (0x104CD, "M", "𐓵"), + (0x104CE, "M", "𐓶"), + (0x104CF, "M", "𐓷"), + (0x104D0, "M", "𐓸"), + (0x104D1, "M", "𐓹"), + (0x104D2, "M", "𐓺"), + (0x104D3, "M", "𐓻"), + (0x104D4, "X"), + (0x104D8, "V"), + (0x104FC, "X"), + (0x10500, "V"), + (0x10528, "X"), + (0x10530, "V"), + (0x10564, "X"), + (0x1056F, "V"), + (0x10570, "M", "𐖗"), + (0x10571, "M", "𐖘"), + (0x10572, "M", "𐖙"), + (0x10573, "M", "𐖚"), + (0x10574, "M", "𐖛"), + (0x10575, "M", "𐖜"), + (0x10576, "M", "𐖝"), + (0x10577, "M", "𐖞"), + (0x10578, "M", "𐖟"), + (0x10579, "M", "𐖠"), + (0x1057A, "M", "𐖡"), + (0x1057B, "X"), + (0x1057C, "M", "𐖣"), + (0x1057D, "M", "𐖤"), + (0x1057E, "M", "𐖥"), + (0x1057F, "M", "𐖦"), + (0x10580, "M", "𐖧"), + (0x10581, "M", "𐖨"), + (0x10582, "M", "𐖩"), + (0x10583, "M", "𐖪"), + (0x10584, "M", "𐖫"), + (0x10585, "M", "𐖬"), + (0x10586, "M", "𐖭"), + (0x10587, "M", "𐖮"), + (0x10588, "M", "𐖯"), + (0x10589, "M", "𐖰"), + (0x1058A, "M", "𐖱"), + ] + + +def _seg_55() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1058B, "X"), + (0x1058C, "M", "𐖳"), + (0x1058D, "M", "𐖴"), + (0x1058E, "M", "𐖵"), + (0x1058F, "M", "𐖶"), + (0x10590, "M", "𐖷"), + (0x10591, "M", "𐖸"), + (0x10592, "M", "𐖹"), + (0x10593, "X"), + (0x10594, "M", "𐖻"), + (0x10595, "M", "𐖼"), + (0x10596, "X"), + (0x10597, "V"), + (0x105A2, "X"), + (0x105A3, "V"), + (0x105B2, "X"), + (0x105B3, "V"), + (0x105BA, "X"), + (0x105BB, "V"), + (0x105BD, "X"), + (0x105C0, "V"), + (0x105F4, "X"), + (0x10600, "V"), + (0x10737, "X"), + (0x10740, "V"), + (0x10756, "X"), + (0x10760, "V"), + (0x10768, "X"), + (0x10780, "V"), + (0x10781, "M", "ː"), + (0x10782, "M", "ˑ"), + (0x10783, "M", "æ"), + (0x10784, "M", "ʙ"), + (0x10785, "M", "ɓ"), + (0x10786, "X"), + (0x10787, "M", "ʣ"), + (0x10788, "M", "ꭦ"), + (0x10789, "M", "ʥ"), + (0x1078A, "M", "ʤ"), + (0x1078B, "M", "ɖ"), + (0x1078C, "M", "ɗ"), + (0x1078D, "M", "ᶑ"), + (0x1078E, "M", "ɘ"), + (0x1078F, "M", "ɞ"), + (0x10790, "M", "ʩ"), + (0x10791, "M", "ɤ"), + (0x10792, "M", "ɢ"), + (0x10793, "M", "ɠ"), + (0x10794, "M", "ʛ"), + (0x10795, "M", "ħ"), + (0x10796, "M", "ʜ"), + (0x10797, "M", "ɧ"), + (0x10798, "M", "ʄ"), + (0x10799, "M", "ʪ"), + (0x1079A, "M", "ʫ"), + (0x1079B, "M", "ɬ"), + (0x1079C, "M", "𝼄"), + (0x1079D, "M", "ꞎ"), + (0x1079E, "M", "ɮ"), + (0x1079F, "M", "𝼅"), + (0x107A0, "M", "ʎ"), + (0x107A1, "M", "𝼆"), + (0x107A2, "M", "ø"), + (0x107A3, "M", "ɶ"), + (0x107A4, "M", "ɷ"), + (0x107A5, "M", "q"), + (0x107A6, "M", "ɺ"), + (0x107A7, "M", "𝼈"), + (0x107A8, "M", "ɽ"), + (0x107A9, "M", "ɾ"), + (0x107AA, "M", "ʀ"), + (0x107AB, "M", "ʨ"), + (0x107AC, "M", "ʦ"), + (0x107AD, "M", "ꭧ"), + (0x107AE, "M", "ʧ"), + (0x107AF, "M", "ʈ"), + (0x107B0, "M", "ⱱ"), + (0x107B1, "X"), + (0x107B2, "M", "ʏ"), + (0x107B3, "M", "ʡ"), + (0x107B4, "M", "ʢ"), + (0x107B5, "M", "ʘ"), + (0x107B6, "M", "ǀ"), + (0x107B7, "M", "ǁ"), + (0x107B8, "M", "ǂ"), + (0x107B9, "M", "𝼊"), + (0x107BA, "M", "𝼞"), + (0x107BB, "X"), + (0x10800, "V"), + (0x10806, "X"), + (0x10808, "V"), + (0x10809, "X"), + (0x1080A, "V"), + (0x10836, "X"), + (0x10837, "V"), + (0x10839, "X"), + (0x1083C, "V"), + (0x1083D, "X"), + (0x1083F, "V"), + (0x10856, "X"), + ] + + +def _seg_56() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x10857, "V"), + (0x1089F, "X"), + (0x108A7, "V"), + (0x108B0, "X"), + (0x108E0, "V"), + (0x108F3, "X"), + (0x108F4, "V"), + (0x108F6, "X"), + (0x108FB, "V"), + (0x1091C, "X"), + (0x1091F, "V"), + (0x1093A, "X"), + (0x1093F, "V"), + (0x10940, "X"), + (0x10980, "V"), + (0x109B8, "X"), + (0x109BC, "V"), + (0x109D0, "X"), + (0x109D2, "V"), + (0x10A04, "X"), + (0x10A05, "V"), + (0x10A07, "X"), + (0x10A0C, "V"), + (0x10A14, "X"), + (0x10A15, "V"), + (0x10A18, "X"), + (0x10A19, "V"), + (0x10A36, "X"), + (0x10A38, "V"), + (0x10A3B, "X"), + (0x10A3F, "V"), + (0x10A49, "X"), + (0x10A50, "V"), + (0x10A59, "X"), + (0x10A60, "V"), + (0x10AA0, "X"), + (0x10AC0, "V"), + (0x10AE7, "X"), + (0x10AEB, "V"), + (0x10AF7, "X"), + (0x10B00, "V"), + (0x10B36, "X"), + (0x10B39, "V"), + (0x10B56, "X"), + (0x10B58, "V"), + (0x10B73, "X"), + (0x10B78, "V"), + (0x10B92, "X"), + (0x10B99, "V"), + (0x10B9D, "X"), + (0x10BA9, "V"), + (0x10BB0, "X"), + (0x10C00, "V"), + (0x10C49, "X"), + (0x10C80, "M", "𐳀"), + (0x10C81, "M", "𐳁"), + (0x10C82, "M", "𐳂"), + (0x10C83, "M", "𐳃"), + (0x10C84, "M", "𐳄"), + (0x10C85, "M", "𐳅"), + (0x10C86, "M", "𐳆"), + (0x10C87, "M", "𐳇"), + (0x10C88, "M", "𐳈"), + (0x10C89, "M", "𐳉"), + (0x10C8A, "M", "𐳊"), + (0x10C8B, "M", "𐳋"), + (0x10C8C, "M", "𐳌"), + (0x10C8D, "M", "𐳍"), + (0x10C8E, "M", "𐳎"), + (0x10C8F, "M", "𐳏"), + (0x10C90, "M", "𐳐"), + (0x10C91, "M", "𐳑"), + (0x10C92, "M", "𐳒"), + (0x10C93, "M", "𐳓"), + (0x10C94, "M", "𐳔"), + (0x10C95, "M", "𐳕"), + (0x10C96, "M", "𐳖"), + (0x10C97, "M", "𐳗"), + (0x10C98, "M", "𐳘"), + (0x10C99, "M", "𐳙"), + (0x10C9A, "M", "𐳚"), + (0x10C9B, "M", "𐳛"), + (0x10C9C, "M", "𐳜"), + (0x10C9D, "M", "𐳝"), + (0x10C9E, "M", "𐳞"), + (0x10C9F, "M", "𐳟"), + (0x10CA0, "M", "𐳠"), + (0x10CA1, "M", "𐳡"), + (0x10CA2, "M", "𐳢"), + (0x10CA3, "M", "𐳣"), + (0x10CA4, "M", "𐳤"), + (0x10CA5, "M", "𐳥"), + (0x10CA6, "M", "𐳦"), + (0x10CA7, "M", "𐳧"), + (0x10CA8, "M", "𐳨"), + (0x10CA9, "M", "𐳩"), + (0x10CAA, "M", "𐳪"), + (0x10CAB, "M", "𐳫"), + (0x10CAC, "M", "𐳬"), + (0x10CAD, "M", "𐳭"), + ] + + +def _seg_57() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x10CAE, "M", "𐳮"), + (0x10CAF, "M", "𐳯"), + (0x10CB0, "M", "𐳰"), + (0x10CB1, "M", "𐳱"), + (0x10CB2, "M", "𐳲"), + (0x10CB3, "X"), + (0x10CC0, "V"), + (0x10CF3, "X"), + (0x10CFA, "V"), + (0x10D28, "X"), + (0x10D30, "V"), + (0x10D3A, "X"), + (0x10D40, "V"), + (0x10D50, "M", "𐵰"), + (0x10D51, "M", "𐵱"), + (0x10D52, "M", "𐵲"), + (0x10D53, "M", "𐵳"), + (0x10D54, "M", "𐵴"), + (0x10D55, "M", "𐵵"), + (0x10D56, "M", "𐵶"), + (0x10D57, "M", "𐵷"), + (0x10D58, "M", "𐵸"), + (0x10D59, "M", "𐵹"), + (0x10D5A, "M", "𐵺"), + (0x10D5B, "M", "𐵻"), + (0x10D5C, "M", "𐵼"), + (0x10D5D, "M", "𐵽"), + (0x10D5E, "M", "𐵾"), + (0x10D5F, "M", "𐵿"), + (0x10D60, "M", "𐶀"), + (0x10D61, "M", "𐶁"), + (0x10D62, "M", "𐶂"), + (0x10D63, "M", "𐶃"), + (0x10D64, "M", "𐶄"), + (0x10D65, "M", "𐶅"), + (0x10D66, "X"), + (0x10D69, "V"), + (0x10D86, "X"), + (0x10D8E, "V"), + (0x10D90, "X"), + (0x10E60, "V"), + (0x10E7F, "X"), + (0x10E80, "V"), + (0x10EAA, "X"), + (0x10EAB, "V"), + (0x10EAE, "X"), + (0x10EB0, "V"), + (0x10EB2, "X"), + (0x10EC2, "V"), + (0x10EC5, "X"), + (0x10EFC, "V"), + (0x10F28, "X"), + (0x10F30, "V"), + (0x10F5A, "X"), + (0x10F70, "V"), + (0x10F8A, "X"), + (0x10FB0, "V"), + (0x10FCC, "X"), + (0x10FE0, "V"), + (0x10FF7, "X"), + (0x11000, "V"), + (0x1104E, "X"), + (0x11052, "V"), + (0x11076, "X"), + (0x1107F, "V"), + (0x110BD, "X"), + (0x110BE, "V"), + (0x110C3, "X"), + (0x110D0, "V"), + (0x110E9, "X"), + (0x110F0, "V"), + (0x110FA, "X"), + (0x11100, "V"), + (0x11135, "X"), + (0x11136, "V"), + (0x11148, "X"), + (0x11150, "V"), + (0x11177, "X"), + (0x11180, "V"), + (0x111E0, "X"), + (0x111E1, "V"), + (0x111F5, "X"), + (0x11200, "V"), + (0x11212, "X"), + (0x11213, "V"), + (0x11242, "X"), + (0x11280, "V"), + (0x11287, "X"), + (0x11288, "V"), + (0x11289, "X"), + (0x1128A, "V"), + (0x1128E, "X"), + (0x1128F, "V"), + (0x1129E, "X"), + (0x1129F, "V"), + (0x112AA, "X"), + (0x112B0, "V"), + (0x112EB, "X"), + (0x112F0, "V"), + (0x112FA, "X"), + ] + + +def _seg_58() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x11300, "V"), + (0x11304, "X"), + (0x11305, "V"), + (0x1130D, "X"), + (0x1130F, "V"), + (0x11311, "X"), + (0x11313, "V"), + (0x11329, "X"), + (0x1132A, "V"), + (0x11331, "X"), + (0x11332, "V"), + (0x11334, "X"), + (0x11335, "V"), + (0x1133A, "X"), + (0x1133B, "V"), + (0x11345, "X"), + (0x11347, "V"), + (0x11349, "X"), + (0x1134B, "V"), + (0x1134E, "X"), + (0x11350, "V"), + (0x11351, "X"), + (0x11357, "V"), + (0x11358, "X"), + (0x1135D, "V"), + (0x11364, "X"), + (0x11366, "V"), + (0x1136D, "X"), + (0x11370, "V"), + (0x11375, "X"), + (0x11380, "V"), + (0x1138A, "X"), + (0x1138B, "V"), + (0x1138C, "X"), + (0x1138E, "V"), + (0x1138F, "X"), + (0x11390, "V"), + (0x113B6, "X"), + (0x113B7, "V"), + (0x113C1, "X"), + (0x113C2, "V"), + (0x113C3, "X"), + (0x113C5, "V"), + (0x113C6, "X"), + (0x113C7, "V"), + (0x113CB, "X"), + (0x113CC, "V"), + (0x113D6, "X"), + (0x113D7, "V"), + (0x113D9, "X"), + (0x113E1, "V"), + (0x113E3, "X"), + (0x11400, "V"), + (0x1145C, "X"), + (0x1145D, "V"), + (0x11462, "X"), + (0x11480, "V"), + (0x114C8, "X"), + (0x114D0, "V"), + (0x114DA, "X"), + (0x11580, "V"), + (0x115B6, "X"), + (0x115B8, "V"), + (0x115DE, "X"), + (0x11600, "V"), + (0x11645, "X"), + (0x11650, "V"), + (0x1165A, "X"), + (0x11660, "V"), + (0x1166D, "X"), + (0x11680, "V"), + (0x116BA, "X"), + (0x116C0, "V"), + (0x116CA, "X"), + (0x116D0, "V"), + (0x116E4, "X"), + (0x11700, "V"), + (0x1171B, "X"), + (0x1171D, "V"), + (0x1172C, "X"), + (0x11730, "V"), + (0x11747, "X"), + (0x11800, "V"), + (0x1183C, "X"), + (0x118A0, "M", "𑣀"), + (0x118A1, "M", "𑣁"), + (0x118A2, "M", "𑣂"), + (0x118A3, "M", "𑣃"), + (0x118A4, "M", "𑣄"), + (0x118A5, "M", "𑣅"), + (0x118A6, "M", "𑣆"), + (0x118A7, "M", "𑣇"), + (0x118A8, "M", "𑣈"), + (0x118A9, "M", "𑣉"), + (0x118AA, "M", "𑣊"), + (0x118AB, "M", "𑣋"), + (0x118AC, "M", "𑣌"), + (0x118AD, "M", "𑣍"), + (0x118AE, "M", "𑣎"), + (0x118AF, "M", "𑣏"), + ] + + +def _seg_59() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x118B0, "M", "𑣐"), + (0x118B1, "M", "𑣑"), + (0x118B2, "M", "𑣒"), + (0x118B3, "M", "𑣓"), + (0x118B4, "M", "𑣔"), + (0x118B5, "M", "𑣕"), + (0x118B6, "M", "𑣖"), + (0x118B7, "M", "𑣗"), + (0x118B8, "M", "𑣘"), + (0x118B9, "M", "𑣙"), + (0x118BA, "M", "𑣚"), + (0x118BB, "M", "𑣛"), + (0x118BC, "M", "𑣜"), + (0x118BD, "M", "𑣝"), + (0x118BE, "M", "𑣞"), + (0x118BF, "M", "𑣟"), + (0x118C0, "V"), + (0x118F3, "X"), + (0x118FF, "V"), + (0x11907, "X"), + (0x11909, "V"), + (0x1190A, "X"), + (0x1190C, "V"), + (0x11914, "X"), + (0x11915, "V"), + (0x11917, "X"), + (0x11918, "V"), + (0x11936, "X"), + (0x11937, "V"), + (0x11939, "X"), + (0x1193B, "V"), + (0x11947, "X"), + (0x11950, "V"), + (0x1195A, "X"), + (0x119A0, "V"), + (0x119A8, "X"), + (0x119AA, "V"), + (0x119D8, "X"), + (0x119DA, "V"), + (0x119E5, "X"), + (0x11A00, "V"), + (0x11A48, "X"), + (0x11A50, "V"), + (0x11AA3, "X"), + (0x11AB0, "V"), + (0x11AF9, "X"), + (0x11B00, "V"), + (0x11B0A, "X"), + (0x11BC0, "V"), + (0x11BE2, "X"), + (0x11BF0, "V"), + (0x11BFA, "X"), + (0x11C00, "V"), + (0x11C09, "X"), + (0x11C0A, "V"), + (0x11C37, "X"), + (0x11C38, "V"), + (0x11C46, "X"), + (0x11C50, "V"), + (0x11C6D, "X"), + (0x11C70, "V"), + (0x11C90, "X"), + (0x11C92, "V"), + (0x11CA8, "X"), + (0x11CA9, "V"), + (0x11CB7, "X"), + (0x11D00, "V"), + (0x11D07, "X"), + (0x11D08, "V"), + (0x11D0A, "X"), + (0x11D0B, "V"), + (0x11D37, "X"), + (0x11D3A, "V"), + (0x11D3B, "X"), + (0x11D3C, "V"), + (0x11D3E, "X"), + (0x11D3F, "V"), + (0x11D48, "X"), + (0x11D50, "V"), + (0x11D5A, "X"), + (0x11D60, "V"), + (0x11D66, "X"), + (0x11D67, "V"), + (0x11D69, "X"), + (0x11D6A, "V"), + (0x11D8F, "X"), + (0x11D90, "V"), + (0x11D92, "X"), + (0x11D93, "V"), + (0x11D99, "X"), + (0x11DA0, "V"), + (0x11DAA, "X"), + (0x11EE0, "V"), + (0x11EF9, "X"), + (0x11F00, "V"), + (0x11F11, "X"), + (0x11F12, "V"), + (0x11F3B, "X"), + (0x11F3E, "V"), + (0x11F5B, "X"), + ] + + +def _seg_60() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x11FB0, "V"), + (0x11FB1, "X"), + (0x11FC0, "V"), + (0x11FF2, "X"), + (0x11FFF, "V"), + (0x1239A, "X"), + (0x12400, "V"), + (0x1246F, "X"), + (0x12470, "V"), + (0x12475, "X"), + (0x12480, "V"), + (0x12544, "X"), + (0x12F90, "V"), + (0x12FF3, "X"), + (0x13000, "V"), + (0x13430, "X"), + (0x13440, "V"), + (0x13456, "X"), + (0x13460, "V"), + (0x143FB, "X"), + (0x14400, "V"), + (0x14647, "X"), + (0x16100, "V"), + (0x1613A, "X"), + (0x16800, "V"), + (0x16A39, "X"), + (0x16A40, "V"), + (0x16A5F, "X"), + (0x16A60, "V"), + (0x16A6A, "X"), + (0x16A6E, "V"), + (0x16ABF, "X"), + (0x16AC0, "V"), + (0x16ACA, "X"), + (0x16AD0, "V"), + (0x16AEE, "X"), + (0x16AF0, "V"), + (0x16AF6, "X"), + (0x16B00, "V"), + (0x16B46, "X"), + (0x16B50, "V"), + (0x16B5A, "X"), + (0x16B5B, "V"), + (0x16B62, "X"), + (0x16B63, "V"), + (0x16B78, "X"), + (0x16B7D, "V"), + (0x16B90, "X"), + (0x16D40, "V"), + (0x16D7A, "X"), + (0x16E40, "M", "𖹠"), + (0x16E41, "M", "𖹡"), + (0x16E42, "M", "𖹢"), + (0x16E43, "M", "𖹣"), + (0x16E44, "M", "𖹤"), + (0x16E45, "M", "𖹥"), + (0x16E46, "M", "𖹦"), + (0x16E47, "M", "𖹧"), + (0x16E48, "M", "𖹨"), + (0x16E49, "M", "𖹩"), + (0x16E4A, "M", "𖹪"), + (0x16E4B, "M", "𖹫"), + (0x16E4C, "M", "𖹬"), + (0x16E4D, "M", "𖹭"), + (0x16E4E, "M", "𖹮"), + (0x16E4F, "M", "𖹯"), + (0x16E50, "M", "𖹰"), + (0x16E51, "M", "𖹱"), + (0x16E52, "M", "𖹲"), + (0x16E53, "M", "𖹳"), + (0x16E54, "M", "𖹴"), + (0x16E55, "M", "𖹵"), + (0x16E56, "M", "𖹶"), + (0x16E57, "M", "𖹷"), + (0x16E58, "M", "𖹸"), + (0x16E59, "M", "𖹹"), + (0x16E5A, "M", "𖹺"), + (0x16E5B, "M", "𖹻"), + (0x16E5C, "M", "𖹼"), + (0x16E5D, "M", "𖹽"), + (0x16E5E, "M", "𖹾"), + (0x16E5F, "M", "𖹿"), + (0x16E60, "V"), + (0x16E9B, "X"), + (0x16F00, "V"), + (0x16F4B, "X"), + (0x16F4F, "V"), + (0x16F88, "X"), + (0x16F8F, "V"), + (0x16FA0, "X"), + (0x16FE0, "V"), + (0x16FE5, "X"), + (0x16FF0, "V"), + (0x16FF2, "X"), + (0x17000, "V"), + (0x187F8, "X"), + (0x18800, "V"), + (0x18CD6, "X"), + (0x18CFF, "V"), + (0x18D09, "X"), + ] + + +def _seg_61() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1AFF0, "V"), + (0x1AFF4, "X"), + (0x1AFF5, "V"), + (0x1AFFC, "X"), + (0x1AFFD, "V"), + (0x1AFFF, "X"), + (0x1B000, "V"), + (0x1B123, "X"), + (0x1B132, "V"), + (0x1B133, "X"), + (0x1B150, "V"), + (0x1B153, "X"), + (0x1B155, "V"), + (0x1B156, "X"), + (0x1B164, "V"), + (0x1B168, "X"), + (0x1B170, "V"), + (0x1B2FC, "X"), + (0x1BC00, "V"), + (0x1BC6B, "X"), + (0x1BC70, "V"), + (0x1BC7D, "X"), + (0x1BC80, "V"), + (0x1BC89, "X"), + (0x1BC90, "V"), + (0x1BC9A, "X"), + (0x1BC9C, "V"), + (0x1BCA0, "I"), + (0x1BCA4, "X"), + (0x1CC00, "V"), + (0x1CCD6, "M", "a"), + (0x1CCD7, "M", "b"), + (0x1CCD8, "M", "c"), + (0x1CCD9, "M", "d"), + (0x1CCDA, "M", "e"), + (0x1CCDB, "M", "f"), + (0x1CCDC, "M", "g"), + (0x1CCDD, "M", "h"), + (0x1CCDE, "M", "i"), + (0x1CCDF, "M", "j"), + (0x1CCE0, "M", "k"), + (0x1CCE1, "M", "l"), + (0x1CCE2, "M", "m"), + (0x1CCE3, "M", "n"), + (0x1CCE4, "M", "o"), + (0x1CCE5, "M", "p"), + (0x1CCE6, "M", "q"), + (0x1CCE7, "M", "r"), + (0x1CCE8, "M", "s"), + (0x1CCE9, "M", "t"), + (0x1CCEA, "M", "u"), + (0x1CCEB, "M", "v"), + (0x1CCEC, "M", "w"), + (0x1CCED, "M", "x"), + (0x1CCEE, "M", "y"), + (0x1CCEF, "M", "z"), + (0x1CCF0, "M", "0"), + (0x1CCF1, "M", "1"), + (0x1CCF2, "M", "2"), + (0x1CCF3, "M", "3"), + (0x1CCF4, "M", "4"), + (0x1CCF5, "M", "5"), + (0x1CCF6, "M", "6"), + (0x1CCF7, "M", "7"), + (0x1CCF8, "M", "8"), + (0x1CCF9, "M", "9"), + (0x1CCFA, "X"), + (0x1CD00, "V"), + (0x1CEB4, "X"), + (0x1CF00, "V"), + (0x1CF2E, "X"), + (0x1CF30, "V"), + (0x1CF47, "X"), + (0x1CF50, "V"), + (0x1CFC4, "X"), + (0x1D000, "V"), + (0x1D0F6, "X"), + (0x1D100, "V"), + (0x1D127, "X"), + (0x1D129, "V"), + (0x1D15E, "M", "𝅗𝅥"), + (0x1D15F, "M", "𝅘𝅥"), + (0x1D160, "M", "𝅘𝅥𝅮"), + (0x1D161, "M", "𝅘𝅥𝅯"), + (0x1D162, "M", "𝅘𝅥𝅰"), + (0x1D163, "M", "𝅘𝅥𝅱"), + (0x1D164, "M", "𝅘𝅥𝅲"), + (0x1D165, "V"), + (0x1D173, "I"), + (0x1D17B, "V"), + (0x1D1BB, "M", "𝆹𝅥"), + (0x1D1BC, "M", "𝆺𝅥"), + (0x1D1BD, "M", "𝆹𝅥𝅮"), + (0x1D1BE, "M", "𝆺𝅥𝅮"), + (0x1D1BF, "M", "𝆹𝅥𝅯"), + (0x1D1C0, "M", "𝆺𝅥𝅯"), + (0x1D1C1, "V"), + (0x1D1EB, "X"), + (0x1D200, "V"), + (0x1D246, "X"), + ] + + +def _seg_62() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D2C0, "V"), + (0x1D2D4, "X"), + (0x1D2E0, "V"), + (0x1D2F4, "X"), + (0x1D300, "V"), + (0x1D357, "X"), + (0x1D360, "V"), + (0x1D379, "X"), + (0x1D400, "M", "a"), + (0x1D401, "M", "b"), + (0x1D402, "M", "c"), + (0x1D403, "M", "d"), + (0x1D404, "M", "e"), + (0x1D405, "M", "f"), + (0x1D406, "M", "g"), + (0x1D407, "M", "h"), + (0x1D408, "M", "i"), + (0x1D409, "M", "j"), + (0x1D40A, "M", "k"), + (0x1D40B, "M", "l"), + (0x1D40C, "M", "m"), + (0x1D40D, "M", "n"), + (0x1D40E, "M", "o"), + (0x1D40F, "M", "p"), + (0x1D410, "M", "q"), + (0x1D411, "M", "r"), + (0x1D412, "M", "s"), + (0x1D413, "M", "t"), + (0x1D414, "M", "u"), + (0x1D415, "M", "v"), + (0x1D416, "M", "w"), + (0x1D417, "M", "x"), + (0x1D418, "M", "y"), + (0x1D419, "M", "z"), + (0x1D41A, "M", "a"), + (0x1D41B, "M", "b"), + (0x1D41C, "M", "c"), + (0x1D41D, "M", "d"), + (0x1D41E, "M", "e"), + (0x1D41F, "M", "f"), + (0x1D420, "M", "g"), + (0x1D421, "M", "h"), + (0x1D422, "M", "i"), + (0x1D423, "M", "j"), + (0x1D424, "M", "k"), + (0x1D425, "M", "l"), + (0x1D426, "M", "m"), + (0x1D427, "M", "n"), + (0x1D428, "M", "o"), + (0x1D429, "M", "p"), + (0x1D42A, "M", "q"), + (0x1D42B, "M", "r"), + (0x1D42C, "M", "s"), + (0x1D42D, "M", "t"), + (0x1D42E, "M", "u"), + (0x1D42F, "M", "v"), + (0x1D430, "M", "w"), + (0x1D431, "M", "x"), + (0x1D432, "M", "y"), + (0x1D433, "M", "z"), + (0x1D434, "M", "a"), + (0x1D435, "M", "b"), + (0x1D436, "M", "c"), + (0x1D437, "M", "d"), + (0x1D438, "M", "e"), + (0x1D439, "M", "f"), + (0x1D43A, "M", "g"), + (0x1D43B, "M", "h"), + (0x1D43C, "M", "i"), + (0x1D43D, "M", "j"), + (0x1D43E, "M", "k"), + (0x1D43F, "M", "l"), + (0x1D440, "M", "m"), + (0x1D441, "M", "n"), + (0x1D442, "M", "o"), + (0x1D443, "M", "p"), + (0x1D444, "M", "q"), + (0x1D445, "M", "r"), + (0x1D446, "M", "s"), + (0x1D447, "M", "t"), + (0x1D448, "M", "u"), + (0x1D449, "M", "v"), + (0x1D44A, "M", "w"), + (0x1D44B, "M", "x"), + (0x1D44C, "M", "y"), + (0x1D44D, "M", "z"), + (0x1D44E, "M", "a"), + (0x1D44F, "M", "b"), + (0x1D450, "M", "c"), + (0x1D451, "M", "d"), + (0x1D452, "M", "e"), + (0x1D453, "M", "f"), + (0x1D454, "M", "g"), + (0x1D455, "X"), + (0x1D456, "M", "i"), + (0x1D457, "M", "j"), + (0x1D458, "M", "k"), + (0x1D459, "M", "l"), + (0x1D45A, "M", "m"), + (0x1D45B, "M", "n"), + ] + + +def _seg_63() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D45C, "M", "o"), + (0x1D45D, "M", "p"), + (0x1D45E, "M", "q"), + (0x1D45F, "M", "r"), + (0x1D460, "M", "s"), + (0x1D461, "M", "t"), + (0x1D462, "M", "u"), + (0x1D463, "M", "v"), + (0x1D464, "M", "w"), + (0x1D465, "M", "x"), + (0x1D466, "M", "y"), + (0x1D467, "M", "z"), + (0x1D468, "M", "a"), + (0x1D469, "M", "b"), + (0x1D46A, "M", "c"), + (0x1D46B, "M", "d"), + (0x1D46C, "M", "e"), + (0x1D46D, "M", "f"), + (0x1D46E, "M", "g"), + (0x1D46F, "M", "h"), + (0x1D470, "M", "i"), + (0x1D471, "M", "j"), + (0x1D472, "M", "k"), + (0x1D473, "M", "l"), + (0x1D474, "M", "m"), + (0x1D475, "M", "n"), + (0x1D476, "M", "o"), + (0x1D477, "M", "p"), + (0x1D478, "M", "q"), + (0x1D479, "M", "r"), + (0x1D47A, "M", "s"), + (0x1D47B, "M", "t"), + (0x1D47C, "M", "u"), + (0x1D47D, "M", "v"), + (0x1D47E, "M", "w"), + (0x1D47F, "M", "x"), + (0x1D480, "M", "y"), + (0x1D481, "M", "z"), + (0x1D482, "M", "a"), + (0x1D483, "M", "b"), + (0x1D484, "M", "c"), + (0x1D485, "M", "d"), + (0x1D486, "M", "e"), + (0x1D487, "M", "f"), + (0x1D488, "M", "g"), + (0x1D489, "M", "h"), + (0x1D48A, "M", "i"), + (0x1D48B, "M", "j"), + (0x1D48C, "M", "k"), + (0x1D48D, "M", "l"), + (0x1D48E, "M", "m"), + (0x1D48F, "M", "n"), + (0x1D490, "M", "o"), + (0x1D491, "M", "p"), + (0x1D492, "M", "q"), + (0x1D493, "M", "r"), + (0x1D494, "M", "s"), + (0x1D495, "M", "t"), + (0x1D496, "M", "u"), + (0x1D497, "M", "v"), + (0x1D498, "M", "w"), + (0x1D499, "M", "x"), + (0x1D49A, "M", "y"), + (0x1D49B, "M", "z"), + (0x1D49C, "M", "a"), + (0x1D49D, "X"), + (0x1D49E, "M", "c"), + (0x1D49F, "M", "d"), + (0x1D4A0, "X"), + (0x1D4A2, "M", "g"), + (0x1D4A3, "X"), + (0x1D4A5, "M", "j"), + (0x1D4A6, "M", "k"), + (0x1D4A7, "X"), + (0x1D4A9, "M", "n"), + (0x1D4AA, "M", "o"), + (0x1D4AB, "M", "p"), + (0x1D4AC, "M", "q"), + (0x1D4AD, "X"), + (0x1D4AE, "M", "s"), + (0x1D4AF, "M", "t"), + (0x1D4B0, "M", "u"), + (0x1D4B1, "M", "v"), + (0x1D4B2, "M", "w"), + (0x1D4B3, "M", "x"), + (0x1D4B4, "M", "y"), + (0x1D4B5, "M", "z"), + (0x1D4B6, "M", "a"), + (0x1D4B7, "M", "b"), + (0x1D4B8, "M", "c"), + (0x1D4B9, "M", "d"), + (0x1D4BA, "X"), + (0x1D4BB, "M", "f"), + (0x1D4BC, "X"), + (0x1D4BD, "M", "h"), + (0x1D4BE, "M", "i"), + (0x1D4BF, "M", "j"), + (0x1D4C0, "M", "k"), + (0x1D4C1, "M", "l"), + (0x1D4C2, "M", "m"), + ] + + +def _seg_64() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D4C3, "M", "n"), + (0x1D4C4, "X"), + (0x1D4C5, "M", "p"), + (0x1D4C6, "M", "q"), + (0x1D4C7, "M", "r"), + (0x1D4C8, "M", "s"), + (0x1D4C9, "M", "t"), + (0x1D4CA, "M", "u"), + (0x1D4CB, "M", "v"), + (0x1D4CC, "M", "w"), + (0x1D4CD, "M", "x"), + (0x1D4CE, "M", "y"), + (0x1D4CF, "M", "z"), + (0x1D4D0, "M", "a"), + (0x1D4D1, "M", "b"), + (0x1D4D2, "M", "c"), + (0x1D4D3, "M", "d"), + (0x1D4D4, "M", "e"), + (0x1D4D5, "M", "f"), + (0x1D4D6, "M", "g"), + (0x1D4D7, "M", "h"), + (0x1D4D8, "M", "i"), + (0x1D4D9, "M", "j"), + (0x1D4DA, "M", "k"), + (0x1D4DB, "M", "l"), + (0x1D4DC, "M", "m"), + (0x1D4DD, "M", "n"), + (0x1D4DE, "M", "o"), + (0x1D4DF, "M", "p"), + (0x1D4E0, "M", "q"), + (0x1D4E1, "M", "r"), + (0x1D4E2, "M", "s"), + (0x1D4E3, "M", "t"), + (0x1D4E4, "M", "u"), + (0x1D4E5, "M", "v"), + (0x1D4E6, "M", "w"), + (0x1D4E7, "M", "x"), + (0x1D4E8, "M", "y"), + (0x1D4E9, "M", "z"), + (0x1D4EA, "M", "a"), + (0x1D4EB, "M", "b"), + (0x1D4EC, "M", "c"), + (0x1D4ED, "M", "d"), + (0x1D4EE, "M", "e"), + (0x1D4EF, "M", "f"), + (0x1D4F0, "M", "g"), + (0x1D4F1, "M", "h"), + (0x1D4F2, "M", "i"), + (0x1D4F3, "M", "j"), + (0x1D4F4, "M", "k"), + (0x1D4F5, "M", "l"), + (0x1D4F6, "M", "m"), + (0x1D4F7, "M", "n"), + (0x1D4F8, "M", "o"), + (0x1D4F9, "M", "p"), + (0x1D4FA, "M", "q"), + (0x1D4FB, "M", "r"), + (0x1D4FC, "M", "s"), + (0x1D4FD, "M", "t"), + (0x1D4FE, "M", "u"), + (0x1D4FF, "M", "v"), + (0x1D500, "M", "w"), + (0x1D501, "M", "x"), + (0x1D502, "M", "y"), + (0x1D503, "M", "z"), + (0x1D504, "M", "a"), + (0x1D505, "M", "b"), + (0x1D506, "X"), + (0x1D507, "M", "d"), + (0x1D508, "M", "e"), + (0x1D509, "M", "f"), + (0x1D50A, "M", "g"), + (0x1D50B, "X"), + (0x1D50D, "M", "j"), + (0x1D50E, "M", "k"), + (0x1D50F, "M", "l"), + (0x1D510, "M", "m"), + (0x1D511, "M", "n"), + (0x1D512, "M", "o"), + (0x1D513, "M", "p"), + (0x1D514, "M", "q"), + (0x1D515, "X"), + (0x1D516, "M", "s"), + (0x1D517, "M", "t"), + (0x1D518, "M", "u"), + (0x1D519, "M", "v"), + (0x1D51A, "M", "w"), + (0x1D51B, "M", "x"), + (0x1D51C, "M", "y"), + (0x1D51D, "X"), + (0x1D51E, "M", "a"), + (0x1D51F, "M", "b"), + (0x1D520, "M", "c"), + (0x1D521, "M", "d"), + (0x1D522, "M", "e"), + (0x1D523, "M", "f"), + (0x1D524, "M", "g"), + (0x1D525, "M", "h"), + (0x1D526, "M", "i"), + (0x1D527, "M", "j"), + ] + + +def _seg_65() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D528, "M", "k"), + (0x1D529, "M", "l"), + (0x1D52A, "M", "m"), + (0x1D52B, "M", "n"), + (0x1D52C, "M", "o"), + (0x1D52D, "M", "p"), + (0x1D52E, "M", "q"), + (0x1D52F, "M", "r"), + (0x1D530, "M", "s"), + (0x1D531, "M", "t"), + (0x1D532, "M", "u"), + (0x1D533, "M", "v"), + (0x1D534, "M", "w"), + (0x1D535, "M", "x"), + (0x1D536, "M", "y"), + (0x1D537, "M", "z"), + (0x1D538, "M", "a"), + (0x1D539, "M", "b"), + (0x1D53A, "X"), + (0x1D53B, "M", "d"), + (0x1D53C, "M", "e"), + (0x1D53D, "M", "f"), + (0x1D53E, "M", "g"), + (0x1D53F, "X"), + (0x1D540, "M", "i"), + (0x1D541, "M", "j"), + (0x1D542, "M", "k"), + (0x1D543, "M", "l"), + (0x1D544, "M", "m"), + (0x1D545, "X"), + (0x1D546, "M", "o"), + (0x1D547, "X"), + (0x1D54A, "M", "s"), + (0x1D54B, "M", "t"), + (0x1D54C, "M", "u"), + (0x1D54D, "M", "v"), + (0x1D54E, "M", "w"), + (0x1D54F, "M", "x"), + (0x1D550, "M", "y"), + (0x1D551, "X"), + (0x1D552, "M", "a"), + (0x1D553, "M", "b"), + (0x1D554, "M", "c"), + (0x1D555, "M", "d"), + (0x1D556, "M", "e"), + (0x1D557, "M", "f"), + (0x1D558, "M", "g"), + (0x1D559, "M", "h"), + (0x1D55A, "M", "i"), + (0x1D55B, "M", "j"), + (0x1D55C, "M", "k"), + (0x1D55D, "M", "l"), + (0x1D55E, "M", "m"), + (0x1D55F, "M", "n"), + (0x1D560, "M", "o"), + (0x1D561, "M", "p"), + (0x1D562, "M", "q"), + (0x1D563, "M", "r"), + (0x1D564, "M", "s"), + (0x1D565, "M", "t"), + (0x1D566, "M", "u"), + (0x1D567, "M", "v"), + (0x1D568, "M", "w"), + (0x1D569, "M", "x"), + (0x1D56A, "M", "y"), + (0x1D56B, "M", "z"), + (0x1D56C, "M", "a"), + (0x1D56D, "M", "b"), + (0x1D56E, "M", "c"), + (0x1D56F, "M", "d"), + (0x1D570, "M", "e"), + (0x1D571, "M", "f"), + (0x1D572, "M", "g"), + (0x1D573, "M", "h"), + (0x1D574, "M", "i"), + (0x1D575, "M", "j"), + (0x1D576, "M", "k"), + (0x1D577, "M", "l"), + (0x1D578, "M", "m"), + (0x1D579, "M", "n"), + (0x1D57A, "M", "o"), + (0x1D57B, "M", "p"), + (0x1D57C, "M", "q"), + (0x1D57D, "M", "r"), + (0x1D57E, "M", "s"), + (0x1D57F, "M", "t"), + (0x1D580, "M", "u"), + (0x1D581, "M", "v"), + (0x1D582, "M", "w"), + (0x1D583, "M", "x"), + (0x1D584, "M", "y"), + (0x1D585, "M", "z"), + (0x1D586, "M", "a"), + (0x1D587, "M", "b"), + (0x1D588, "M", "c"), + (0x1D589, "M", "d"), + (0x1D58A, "M", "e"), + (0x1D58B, "M", "f"), + (0x1D58C, "M", "g"), + (0x1D58D, "M", "h"), + ] + + +def _seg_66() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D58E, "M", "i"), + (0x1D58F, "M", "j"), + (0x1D590, "M", "k"), + (0x1D591, "M", "l"), + (0x1D592, "M", "m"), + (0x1D593, "M", "n"), + (0x1D594, "M", "o"), + (0x1D595, "M", "p"), + (0x1D596, "M", "q"), + (0x1D597, "M", "r"), + (0x1D598, "M", "s"), + (0x1D599, "M", "t"), + (0x1D59A, "M", "u"), + (0x1D59B, "M", "v"), + (0x1D59C, "M", "w"), + (0x1D59D, "M", "x"), + (0x1D59E, "M", "y"), + (0x1D59F, "M", "z"), + (0x1D5A0, "M", "a"), + (0x1D5A1, "M", "b"), + (0x1D5A2, "M", "c"), + (0x1D5A3, "M", "d"), + (0x1D5A4, "M", "e"), + (0x1D5A5, "M", "f"), + (0x1D5A6, "M", "g"), + (0x1D5A7, "M", "h"), + (0x1D5A8, "M", "i"), + (0x1D5A9, "M", "j"), + (0x1D5AA, "M", "k"), + (0x1D5AB, "M", "l"), + (0x1D5AC, "M", "m"), + (0x1D5AD, "M", "n"), + (0x1D5AE, "M", "o"), + (0x1D5AF, "M", "p"), + (0x1D5B0, "M", "q"), + (0x1D5B1, "M", "r"), + (0x1D5B2, "M", "s"), + (0x1D5B3, "M", "t"), + (0x1D5B4, "M", "u"), + (0x1D5B5, "M", "v"), + (0x1D5B6, "M", "w"), + (0x1D5B7, "M", "x"), + (0x1D5B8, "M", "y"), + (0x1D5B9, "M", "z"), + (0x1D5BA, "M", "a"), + (0x1D5BB, "M", "b"), + (0x1D5BC, "M", "c"), + (0x1D5BD, "M", "d"), + (0x1D5BE, "M", "e"), + (0x1D5BF, "M", "f"), + (0x1D5C0, "M", "g"), + (0x1D5C1, "M", "h"), + (0x1D5C2, "M", "i"), + (0x1D5C3, "M", "j"), + (0x1D5C4, "M", "k"), + (0x1D5C5, "M", "l"), + (0x1D5C6, "M", "m"), + (0x1D5C7, "M", "n"), + (0x1D5C8, "M", "o"), + (0x1D5C9, "M", "p"), + (0x1D5CA, "M", "q"), + (0x1D5CB, "M", "r"), + (0x1D5CC, "M", "s"), + (0x1D5CD, "M", "t"), + (0x1D5CE, "M", "u"), + (0x1D5CF, "M", "v"), + (0x1D5D0, "M", "w"), + (0x1D5D1, "M", "x"), + (0x1D5D2, "M", "y"), + (0x1D5D3, "M", "z"), + (0x1D5D4, "M", "a"), + (0x1D5D5, "M", "b"), + (0x1D5D6, "M", "c"), + (0x1D5D7, "M", "d"), + (0x1D5D8, "M", "e"), + (0x1D5D9, "M", "f"), + (0x1D5DA, "M", "g"), + (0x1D5DB, "M", "h"), + (0x1D5DC, "M", "i"), + (0x1D5DD, "M", "j"), + (0x1D5DE, "M", "k"), + (0x1D5DF, "M", "l"), + (0x1D5E0, "M", "m"), + (0x1D5E1, "M", "n"), + (0x1D5E2, "M", "o"), + (0x1D5E3, "M", "p"), + (0x1D5E4, "M", "q"), + (0x1D5E5, "M", "r"), + (0x1D5E6, "M", "s"), + (0x1D5E7, "M", "t"), + (0x1D5E8, "M", "u"), + (0x1D5E9, "M", "v"), + (0x1D5EA, "M", "w"), + (0x1D5EB, "M", "x"), + (0x1D5EC, "M", "y"), + (0x1D5ED, "M", "z"), + (0x1D5EE, "M", "a"), + (0x1D5EF, "M", "b"), + (0x1D5F0, "M", "c"), + (0x1D5F1, "M", "d"), + ] + + +def _seg_67() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D5F2, "M", "e"), + (0x1D5F3, "M", "f"), + (0x1D5F4, "M", "g"), + (0x1D5F5, "M", "h"), + (0x1D5F6, "M", "i"), + (0x1D5F7, "M", "j"), + (0x1D5F8, "M", "k"), + (0x1D5F9, "M", "l"), + (0x1D5FA, "M", "m"), + (0x1D5FB, "M", "n"), + (0x1D5FC, "M", "o"), + (0x1D5FD, "M", "p"), + (0x1D5FE, "M", "q"), + (0x1D5FF, "M", "r"), + (0x1D600, "M", "s"), + (0x1D601, "M", "t"), + (0x1D602, "M", "u"), + (0x1D603, "M", "v"), + (0x1D604, "M", "w"), + (0x1D605, "M", "x"), + (0x1D606, "M", "y"), + (0x1D607, "M", "z"), + (0x1D608, "M", "a"), + (0x1D609, "M", "b"), + (0x1D60A, "M", "c"), + (0x1D60B, "M", "d"), + (0x1D60C, "M", "e"), + (0x1D60D, "M", "f"), + (0x1D60E, "M", "g"), + (0x1D60F, "M", "h"), + (0x1D610, "M", "i"), + (0x1D611, "M", "j"), + (0x1D612, "M", "k"), + (0x1D613, "M", "l"), + (0x1D614, "M", "m"), + (0x1D615, "M", "n"), + (0x1D616, "M", "o"), + (0x1D617, "M", "p"), + (0x1D618, "M", "q"), + (0x1D619, "M", "r"), + (0x1D61A, "M", "s"), + (0x1D61B, "M", "t"), + (0x1D61C, "M", "u"), + (0x1D61D, "M", "v"), + (0x1D61E, "M", "w"), + (0x1D61F, "M", "x"), + (0x1D620, "M", "y"), + (0x1D621, "M", "z"), + (0x1D622, "M", "a"), + (0x1D623, "M", "b"), + (0x1D624, "M", "c"), + (0x1D625, "M", "d"), + (0x1D626, "M", "e"), + (0x1D627, "M", "f"), + (0x1D628, "M", "g"), + (0x1D629, "M", "h"), + (0x1D62A, "M", "i"), + (0x1D62B, "M", "j"), + (0x1D62C, "M", "k"), + (0x1D62D, "M", "l"), + (0x1D62E, "M", "m"), + (0x1D62F, "M", "n"), + (0x1D630, "M", "o"), + (0x1D631, "M", "p"), + (0x1D632, "M", "q"), + (0x1D633, "M", "r"), + (0x1D634, "M", "s"), + (0x1D635, "M", "t"), + (0x1D636, "M", "u"), + (0x1D637, "M", "v"), + (0x1D638, "M", "w"), + (0x1D639, "M", "x"), + (0x1D63A, "M", "y"), + (0x1D63B, "M", "z"), + (0x1D63C, "M", "a"), + (0x1D63D, "M", "b"), + (0x1D63E, "M", "c"), + (0x1D63F, "M", "d"), + (0x1D640, "M", "e"), + (0x1D641, "M", "f"), + (0x1D642, "M", "g"), + (0x1D643, "M", "h"), + (0x1D644, "M", "i"), + (0x1D645, "M", "j"), + (0x1D646, "M", "k"), + (0x1D647, "M", "l"), + (0x1D648, "M", "m"), + (0x1D649, "M", "n"), + (0x1D64A, "M", "o"), + (0x1D64B, "M", "p"), + (0x1D64C, "M", "q"), + (0x1D64D, "M", "r"), + (0x1D64E, "M", "s"), + (0x1D64F, "M", "t"), + (0x1D650, "M", "u"), + (0x1D651, "M", "v"), + (0x1D652, "M", "w"), + (0x1D653, "M", "x"), + (0x1D654, "M", "y"), + (0x1D655, "M", "z"), + ] + + +def _seg_68() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D656, "M", "a"), + (0x1D657, "M", "b"), + (0x1D658, "M", "c"), + (0x1D659, "M", "d"), + (0x1D65A, "M", "e"), + (0x1D65B, "M", "f"), + (0x1D65C, "M", "g"), + (0x1D65D, "M", "h"), + (0x1D65E, "M", "i"), + (0x1D65F, "M", "j"), + (0x1D660, "M", "k"), + (0x1D661, "M", "l"), + (0x1D662, "M", "m"), + (0x1D663, "M", "n"), + (0x1D664, "M", "o"), + (0x1D665, "M", "p"), + (0x1D666, "M", "q"), + (0x1D667, "M", "r"), + (0x1D668, "M", "s"), + (0x1D669, "M", "t"), + (0x1D66A, "M", "u"), + (0x1D66B, "M", "v"), + (0x1D66C, "M", "w"), + (0x1D66D, "M", "x"), + (0x1D66E, "M", "y"), + (0x1D66F, "M", "z"), + (0x1D670, "M", "a"), + (0x1D671, "M", "b"), + (0x1D672, "M", "c"), + (0x1D673, "M", "d"), + (0x1D674, "M", "e"), + (0x1D675, "M", "f"), + (0x1D676, "M", "g"), + (0x1D677, "M", "h"), + (0x1D678, "M", "i"), + (0x1D679, "M", "j"), + (0x1D67A, "M", "k"), + (0x1D67B, "M", "l"), + (0x1D67C, "M", "m"), + (0x1D67D, "M", "n"), + (0x1D67E, "M", "o"), + (0x1D67F, "M", "p"), + (0x1D680, "M", "q"), + (0x1D681, "M", "r"), + (0x1D682, "M", "s"), + (0x1D683, "M", "t"), + (0x1D684, "M", "u"), + (0x1D685, "M", "v"), + (0x1D686, "M", "w"), + (0x1D687, "M", "x"), + (0x1D688, "M", "y"), + (0x1D689, "M", "z"), + (0x1D68A, "M", "a"), + (0x1D68B, "M", "b"), + (0x1D68C, "M", "c"), + (0x1D68D, "M", "d"), + (0x1D68E, "M", "e"), + (0x1D68F, "M", "f"), + (0x1D690, "M", "g"), + (0x1D691, "M", "h"), + (0x1D692, "M", "i"), + (0x1D693, "M", "j"), + (0x1D694, "M", "k"), + (0x1D695, "M", "l"), + (0x1D696, "M", "m"), + (0x1D697, "M", "n"), + (0x1D698, "M", "o"), + (0x1D699, "M", "p"), + (0x1D69A, "M", "q"), + (0x1D69B, "M", "r"), + (0x1D69C, "M", "s"), + (0x1D69D, "M", "t"), + (0x1D69E, "M", "u"), + (0x1D69F, "M", "v"), + (0x1D6A0, "M", "w"), + (0x1D6A1, "M", "x"), + (0x1D6A2, "M", "y"), + (0x1D6A3, "M", "z"), + (0x1D6A4, "M", "ı"), + (0x1D6A5, "M", "ȷ"), + (0x1D6A6, "X"), + (0x1D6A8, "M", "α"), + (0x1D6A9, "M", "β"), + (0x1D6AA, "M", "γ"), + (0x1D6AB, "M", "δ"), + (0x1D6AC, "M", "ε"), + (0x1D6AD, "M", "ζ"), + (0x1D6AE, "M", "η"), + (0x1D6AF, "M", "θ"), + (0x1D6B0, "M", "ι"), + (0x1D6B1, "M", "κ"), + (0x1D6B2, "M", "λ"), + (0x1D6B3, "M", "μ"), + (0x1D6B4, "M", "ν"), + (0x1D6B5, "M", "ξ"), + (0x1D6B6, "M", "ο"), + (0x1D6B7, "M", "π"), + (0x1D6B8, "M", "ρ"), + (0x1D6B9, "M", "θ"), + (0x1D6BA, "M", "σ"), + ] + + +def _seg_69() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D6BB, "M", "τ"), + (0x1D6BC, "M", "υ"), + (0x1D6BD, "M", "φ"), + (0x1D6BE, "M", "χ"), + (0x1D6BF, "M", "ψ"), + (0x1D6C0, "M", "ω"), + (0x1D6C1, "M", "∇"), + (0x1D6C2, "M", "α"), + (0x1D6C3, "M", "β"), + (0x1D6C4, "M", "γ"), + (0x1D6C5, "M", "δ"), + (0x1D6C6, "M", "ε"), + (0x1D6C7, "M", "ζ"), + (0x1D6C8, "M", "η"), + (0x1D6C9, "M", "θ"), + (0x1D6CA, "M", "ι"), + (0x1D6CB, "M", "κ"), + (0x1D6CC, "M", "λ"), + (0x1D6CD, "M", "μ"), + (0x1D6CE, "M", "ν"), + (0x1D6CF, "M", "ξ"), + (0x1D6D0, "M", "ο"), + (0x1D6D1, "M", "π"), + (0x1D6D2, "M", "ρ"), + (0x1D6D3, "M", "σ"), + (0x1D6D5, "M", "τ"), + (0x1D6D6, "M", "υ"), + (0x1D6D7, "M", "φ"), + (0x1D6D8, "M", "χ"), + (0x1D6D9, "M", "ψ"), + (0x1D6DA, "M", "ω"), + (0x1D6DB, "M", "∂"), + (0x1D6DC, "M", "ε"), + (0x1D6DD, "M", "θ"), + (0x1D6DE, "M", "κ"), + (0x1D6DF, "M", "φ"), + (0x1D6E0, "M", "ρ"), + (0x1D6E1, "M", "π"), + (0x1D6E2, "M", "α"), + (0x1D6E3, "M", "β"), + (0x1D6E4, "M", "γ"), + (0x1D6E5, "M", "δ"), + (0x1D6E6, "M", "ε"), + (0x1D6E7, "M", "ζ"), + (0x1D6E8, "M", "η"), + (0x1D6E9, "M", "θ"), + (0x1D6EA, "M", "ι"), + (0x1D6EB, "M", "κ"), + (0x1D6EC, "M", "λ"), + (0x1D6ED, "M", "μ"), + (0x1D6EE, "M", "ν"), + (0x1D6EF, "M", "ξ"), + (0x1D6F0, "M", "ο"), + (0x1D6F1, "M", "π"), + (0x1D6F2, "M", "ρ"), + (0x1D6F3, "M", "θ"), + (0x1D6F4, "M", "σ"), + (0x1D6F5, "M", "τ"), + (0x1D6F6, "M", "υ"), + (0x1D6F7, "M", "φ"), + (0x1D6F8, "M", "χ"), + (0x1D6F9, "M", "ψ"), + (0x1D6FA, "M", "ω"), + (0x1D6FB, "M", "∇"), + (0x1D6FC, "M", "α"), + (0x1D6FD, "M", "β"), + (0x1D6FE, "M", "γ"), + (0x1D6FF, "M", "δ"), + (0x1D700, "M", "ε"), + (0x1D701, "M", "ζ"), + (0x1D702, "M", "η"), + (0x1D703, "M", "θ"), + (0x1D704, "M", "ι"), + (0x1D705, "M", "κ"), + (0x1D706, "M", "λ"), + (0x1D707, "M", "μ"), + (0x1D708, "M", "ν"), + (0x1D709, "M", "ξ"), + (0x1D70A, "M", "ο"), + (0x1D70B, "M", "π"), + (0x1D70C, "M", "ρ"), + (0x1D70D, "M", "σ"), + (0x1D70F, "M", "τ"), + (0x1D710, "M", "υ"), + (0x1D711, "M", "φ"), + (0x1D712, "M", "χ"), + (0x1D713, "M", "ψ"), + (0x1D714, "M", "ω"), + (0x1D715, "M", "∂"), + (0x1D716, "M", "ε"), + (0x1D717, "M", "θ"), + (0x1D718, "M", "κ"), + (0x1D719, "M", "φ"), + (0x1D71A, "M", "ρ"), + (0x1D71B, "M", "π"), + (0x1D71C, "M", "α"), + (0x1D71D, "M", "β"), + (0x1D71E, "M", "γ"), + (0x1D71F, "M", "δ"), + (0x1D720, "M", "ε"), + ] + + +def _seg_70() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D721, "M", "ζ"), + (0x1D722, "M", "η"), + (0x1D723, "M", "θ"), + (0x1D724, "M", "ι"), + (0x1D725, "M", "κ"), + (0x1D726, "M", "λ"), + (0x1D727, "M", "μ"), + (0x1D728, "M", "ν"), + (0x1D729, "M", "ξ"), + (0x1D72A, "M", "ο"), + (0x1D72B, "M", "π"), + (0x1D72C, "M", "ρ"), + (0x1D72D, "M", "θ"), + (0x1D72E, "M", "σ"), + (0x1D72F, "M", "τ"), + (0x1D730, "M", "υ"), + (0x1D731, "M", "φ"), + (0x1D732, "M", "χ"), + (0x1D733, "M", "ψ"), + (0x1D734, "M", "ω"), + (0x1D735, "M", "∇"), + (0x1D736, "M", "α"), + (0x1D737, "M", "β"), + (0x1D738, "M", "γ"), + (0x1D739, "M", "δ"), + (0x1D73A, "M", "ε"), + (0x1D73B, "M", "ζ"), + (0x1D73C, "M", "η"), + (0x1D73D, "M", "θ"), + (0x1D73E, "M", "ι"), + (0x1D73F, "M", "κ"), + (0x1D740, "M", "λ"), + (0x1D741, "M", "μ"), + (0x1D742, "M", "ν"), + (0x1D743, "M", "ξ"), + (0x1D744, "M", "ο"), + (0x1D745, "M", "π"), + (0x1D746, "M", "ρ"), + (0x1D747, "M", "σ"), + (0x1D749, "M", "τ"), + (0x1D74A, "M", "υ"), + (0x1D74B, "M", "φ"), + (0x1D74C, "M", "χ"), + (0x1D74D, "M", "ψ"), + (0x1D74E, "M", "ω"), + (0x1D74F, "M", "∂"), + (0x1D750, "M", "ε"), + (0x1D751, "M", "θ"), + (0x1D752, "M", "κ"), + (0x1D753, "M", "φ"), + (0x1D754, "M", "ρ"), + (0x1D755, "M", "π"), + (0x1D756, "M", "α"), + (0x1D757, "M", "β"), + (0x1D758, "M", "γ"), + (0x1D759, "M", "δ"), + (0x1D75A, "M", "ε"), + (0x1D75B, "M", "ζ"), + (0x1D75C, "M", "η"), + (0x1D75D, "M", "θ"), + (0x1D75E, "M", "ι"), + (0x1D75F, "M", "κ"), + (0x1D760, "M", "λ"), + (0x1D761, "M", "μ"), + (0x1D762, "M", "ν"), + (0x1D763, "M", "ξ"), + (0x1D764, "M", "ο"), + (0x1D765, "M", "π"), + (0x1D766, "M", "ρ"), + (0x1D767, "M", "θ"), + (0x1D768, "M", "σ"), + (0x1D769, "M", "τ"), + (0x1D76A, "M", "υ"), + (0x1D76B, "M", "φ"), + (0x1D76C, "M", "χ"), + (0x1D76D, "M", "ψ"), + (0x1D76E, "M", "ω"), + (0x1D76F, "M", "∇"), + (0x1D770, "M", "α"), + (0x1D771, "M", "β"), + (0x1D772, "M", "γ"), + (0x1D773, "M", "δ"), + (0x1D774, "M", "ε"), + (0x1D775, "M", "ζ"), + (0x1D776, "M", "η"), + (0x1D777, "M", "θ"), + (0x1D778, "M", "ι"), + (0x1D779, "M", "κ"), + (0x1D77A, "M", "λ"), + (0x1D77B, "M", "μ"), + (0x1D77C, "M", "ν"), + (0x1D77D, "M", "ξ"), + (0x1D77E, "M", "ο"), + (0x1D77F, "M", "π"), + (0x1D780, "M", "ρ"), + (0x1D781, "M", "σ"), + (0x1D783, "M", "τ"), + (0x1D784, "M", "υ"), + (0x1D785, "M", "φ"), + (0x1D786, "M", "χ"), + ] + + +def _seg_71() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D787, "M", "ψ"), + (0x1D788, "M", "ω"), + (0x1D789, "M", "∂"), + (0x1D78A, "M", "ε"), + (0x1D78B, "M", "θ"), + (0x1D78C, "M", "κ"), + (0x1D78D, "M", "φ"), + (0x1D78E, "M", "ρ"), + (0x1D78F, "M", "π"), + (0x1D790, "M", "α"), + (0x1D791, "M", "β"), + (0x1D792, "M", "γ"), + (0x1D793, "M", "δ"), + (0x1D794, "M", "ε"), + (0x1D795, "M", "ζ"), + (0x1D796, "M", "η"), + (0x1D797, "M", "θ"), + (0x1D798, "M", "ι"), + (0x1D799, "M", "κ"), + (0x1D79A, "M", "λ"), + (0x1D79B, "M", "μ"), + (0x1D79C, "M", "ν"), + (0x1D79D, "M", "ξ"), + (0x1D79E, "M", "ο"), + (0x1D79F, "M", "π"), + (0x1D7A0, "M", "ρ"), + (0x1D7A1, "M", "θ"), + (0x1D7A2, "M", "σ"), + (0x1D7A3, "M", "τ"), + (0x1D7A4, "M", "υ"), + (0x1D7A5, "M", "φ"), + (0x1D7A6, "M", "χ"), + (0x1D7A7, "M", "ψ"), + (0x1D7A8, "M", "ω"), + (0x1D7A9, "M", "∇"), + (0x1D7AA, "M", "α"), + (0x1D7AB, "M", "β"), + (0x1D7AC, "M", "γ"), + (0x1D7AD, "M", "δ"), + (0x1D7AE, "M", "ε"), + (0x1D7AF, "M", "ζ"), + (0x1D7B0, "M", "η"), + (0x1D7B1, "M", "θ"), + (0x1D7B2, "M", "ι"), + (0x1D7B3, "M", "κ"), + (0x1D7B4, "M", "λ"), + (0x1D7B5, "M", "μ"), + (0x1D7B6, "M", "ν"), + (0x1D7B7, "M", "ξ"), + (0x1D7B8, "M", "ο"), + (0x1D7B9, "M", "π"), + (0x1D7BA, "M", "ρ"), + (0x1D7BB, "M", "σ"), + (0x1D7BD, "M", "τ"), + (0x1D7BE, "M", "υ"), + (0x1D7BF, "M", "φ"), + (0x1D7C0, "M", "χ"), + (0x1D7C1, "M", "ψ"), + (0x1D7C2, "M", "ω"), + (0x1D7C3, "M", "∂"), + (0x1D7C4, "M", "ε"), + (0x1D7C5, "M", "θ"), + (0x1D7C6, "M", "κ"), + (0x1D7C7, "M", "φ"), + (0x1D7C8, "M", "ρ"), + (0x1D7C9, "M", "π"), + (0x1D7CA, "M", "ϝ"), + (0x1D7CC, "X"), + (0x1D7CE, "M", "0"), + (0x1D7CF, "M", "1"), + (0x1D7D0, "M", "2"), + (0x1D7D1, "M", "3"), + (0x1D7D2, "M", "4"), + (0x1D7D3, "M", "5"), + (0x1D7D4, "M", "6"), + (0x1D7D5, "M", "7"), + (0x1D7D6, "M", "8"), + (0x1D7D7, "M", "9"), + (0x1D7D8, "M", "0"), + (0x1D7D9, "M", "1"), + (0x1D7DA, "M", "2"), + (0x1D7DB, "M", "3"), + (0x1D7DC, "M", "4"), + (0x1D7DD, "M", "5"), + (0x1D7DE, "M", "6"), + (0x1D7DF, "M", "7"), + (0x1D7E0, "M", "8"), + (0x1D7E1, "M", "9"), + (0x1D7E2, "M", "0"), + (0x1D7E3, "M", "1"), + (0x1D7E4, "M", "2"), + (0x1D7E5, "M", "3"), + (0x1D7E6, "M", "4"), + (0x1D7E7, "M", "5"), + (0x1D7E8, "M", "6"), + (0x1D7E9, "M", "7"), + (0x1D7EA, "M", "8"), + (0x1D7EB, "M", "9"), + (0x1D7EC, "M", "0"), + (0x1D7ED, "M", "1"), + ] + + +def _seg_72() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D7EE, "M", "2"), + (0x1D7EF, "M", "3"), + (0x1D7F0, "M", "4"), + (0x1D7F1, "M", "5"), + (0x1D7F2, "M", "6"), + (0x1D7F3, "M", "7"), + (0x1D7F4, "M", "8"), + (0x1D7F5, "M", "9"), + (0x1D7F6, "M", "0"), + (0x1D7F7, "M", "1"), + (0x1D7F8, "M", "2"), + (0x1D7F9, "M", "3"), + (0x1D7FA, "M", "4"), + (0x1D7FB, "M", "5"), + (0x1D7FC, "M", "6"), + (0x1D7FD, "M", "7"), + (0x1D7FE, "M", "8"), + (0x1D7FF, "M", "9"), + (0x1D800, "V"), + (0x1DA8C, "X"), + (0x1DA9B, "V"), + (0x1DAA0, "X"), + (0x1DAA1, "V"), + (0x1DAB0, "X"), + (0x1DF00, "V"), + (0x1DF1F, "X"), + (0x1DF25, "V"), + (0x1DF2B, "X"), + (0x1E000, "V"), + (0x1E007, "X"), + (0x1E008, "V"), + (0x1E019, "X"), + (0x1E01B, "V"), + (0x1E022, "X"), + (0x1E023, "V"), + (0x1E025, "X"), + (0x1E026, "V"), + (0x1E02B, "X"), + (0x1E030, "M", "а"), + (0x1E031, "M", "б"), + (0x1E032, "M", "в"), + (0x1E033, "M", "г"), + (0x1E034, "M", "д"), + (0x1E035, "M", "е"), + (0x1E036, "M", "ж"), + (0x1E037, "M", "з"), + (0x1E038, "M", "и"), + (0x1E039, "M", "к"), + (0x1E03A, "M", "л"), + (0x1E03B, "M", "м"), + (0x1E03C, "M", "о"), + (0x1E03D, "M", "п"), + (0x1E03E, "M", "р"), + (0x1E03F, "M", "с"), + (0x1E040, "M", "т"), + (0x1E041, "M", "у"), + (0x1E042, "M", "ф"), + (0x1E043, "M", "х"), + (0x1E044, "M", "ц"), + (0x1E045, "M", "ч"), + (0x1E046, "M", "ш"), + (0x1E047, "M", "ы"), + (0x1E048, "M", "э"), + (0x1E049, "M", "ю"), + (0x1E04A, "M", "ꚉ"), + (0x1E04B, "M", "ә"), + (0x1E04C, "M", "і"), + (0x1E04D, "M", "ј"), + (0x1E04E, "M", "ө"), + (0x1E04F, "M", "ү"), + (0x1E050, "M", "ӏ"), + (0x1E051, "M", "а"), + (0x1E052, "M", "б"), + (0x1E053, "M", "в"), + (0x1E054, "M", "г"), + (0x1E055, "M", "д"), + (0x1E056, "M", "е"), + (0x1E057, "M", "ж"), + (0x1E058, "M", "з"), + (0x1E059, "M", "и"), + (0x1E05A, "M", "к"), + (0x1E05B, "M", "л"), + (0x1E05C, "M", "о"), + (0x1E05D, "M", "п"), + (0x1E05E, "M", "с"), + (0x1E05F, "M", "у"), + (0x1E060, "M", "ф"), + (0x1E061, "M", "х"), + (0x1E062, "M", "ц"), + (0x1E063, "M", "ч"), + (0x1E064, "M", "ш"), + (0x1E065, "M", "ъ"), + (0x1E066, "M", "ы"), + (0x1E067, "M", "ґ"), + (0x1E068, "M", "і"), + (0x1E069, "M", "ѕ"), + (0x1E06A, "M", "џ"), + (0x1E06B, "M", "ҫ"), + (0x1E06C, "M", "ꙑ"), + (0x1E06D, "M", "ұ"), + ] + + +def _seg_73() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1E06E, "X"), + (0x1E08F, "V"), + (0x1E090, "X"), + (0x1E100, "V"), + (0x1E12D, "X"), + (0x1E130, "V"), + (0x1E13E, "X"), + (0x1E140, "V"), + (0x1E14A, "X"), + (0x1E14E, "V"), + (0x1E150, "X"), + (0x1E290, "V"), + (0x1E2AF, "X"), + (0x1E2C0, "V"), + (0x1E2FA, "X"), + (0x1E2FF, "V"), + (0x1E300, "X"), + (0x1E4D0, "V"), + (0x1E4FA, "X"), + (0x1E5D0, "V"), + (0x1E5FB, "X"), + (0x1E5FF, "V"), + (0x1E600, "X"), + (0x1E7E0, "V"), + (0x1E7E7, "X"), + (0x1E7E8, "V"), + (0x1E7EC, "X"), + (0x1E7ED, "V"), + (0x1E7EF, "X"), + (0x1E7F0, "V"), + (0x1E7FF, "X"), + (0x1E800, "V"), + (0x1E8C5, "X"), + (0x1E8C7, "V"), + (0x1E8D7, "X"), + (0x1E900, "M", "𞤢"), + (0x1E901, "M", "𞤣"), + (0x1E902, "M", "𞤤"), + (0x1E903, "M", "𞤥"), + (0x1E904, "M", "𞤦"), + (0x1E905, "M", "𞤧"), + (0x1E906, "M", "𞤨"), + (0x1E907, "M", "𞤩"), + (0x1E908, "M", "𞤪"), + (0x1E909, "M", "𞤫"), + (0x1E90A, "M", "𞤬"), + (0x1E90B, "M", "𞤭"), + (0x1E90C, "M", "𞤮"), + (0x1E90D, "M", "𞤯"), + (0x1E90E, "M", "𞤰"), + (0x1E90F, "M", "𞤱"), + (0x1E910, "M", "𞤲"), + (0x1E911, "M", "𞤳"), + (0x1E912, "M", "𞤴"), + (0x1E913, "M", "𞤵"), + (0x1E914, "M", "𞤶"), + (0x1E915, "M", "𞤷"), + (0x1E916, "M", "𞤸"), + (0x1E917, "M", "𞤹"), + (0x1E918, "M", "𞤺"), + (0x1E919, "M", "𞤻"), + (0x1E91A, "M", "𞤼"), + (0x1E91B, "M", "𞤽"), + (0x1E91C, "M", "𞤾"), + (0x1E91D, "M", "𞤿"), + (0x1E91E, "M", "𞥀"), + (0x1E91F, "M", "𞥁"), + (0x1E920, "M", "𞥂"), + (0x1E921, "M", "𞥃"), + (0x1E922, "V"), + (0x1E94C, "X"), + (0x1E950, "V"), + (0x1E95A, "X"), + (0x1E95E, "V"), + (0x1E960, "X"), + (0x1EC71, "V"), + (0x1ECB5, "X"), + (0x1ED01, "V"), + (0x1ED3E, "X"), + (0x1EE00, "M", "ا"), + (0x1EE01, "M", "ب"), + (0x1EE02, "M", "ج"), + (0x1EE03, "M", "د"), + (0x1EE04, "X"), + (0x1EE05, "M", "و"), + (0x1EE06, "M", "ز"), + (0x1EE07, "M", "ح"), + (0x1EE08, "M", "ط"), + (0x1EE09, "M", "ي"), + (0x1EE0A, "M", "ك"), + (0x1EE0B, "M", "ل"), + (0x1EE0C, "M", "م"), + (0x1EE0D, "M", "ن"), + (0x1EE0E, "M", "س"), + (0x1EE0F, "M", "ع"), + (0x1EE10, "M", "ف"), + (0x1EE11, "M", "ص"), + (0x1EE12, "M", "ق"), + (0x1EE13, "M", "ر"), + (0x1EE14, "M", "ش"), + ] + + +def _seg_74() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1EE15, "M", "ت"), + (0x1EE16, "M", "ث"), + (0x1EE17, "M", "خ"), + (0x1EE18, "M", "ذ"), + (0x1EE19, "M", "ض"), + (0x1EE1A, "M", "ظ"), + (0x1EE1B, "M", "غ"), + (0x1EE1C, "M", "ٮ"), + (0x1EE1D, "M", "ں"), + (0x1EE1E, "M", "ڡ"), + (0x1EE1F, "M", "ٯ"), + (0x1EE20, "X"), + (0x1EE21, "M", "ب"), + (0x1EE22, "M", "ج"), + (0x1EE23, "X"), + (0x1EE24, "M", "ه"), + (0x1EE25, "X"), + (0x1EE27, "M", "ح"), + (0x1EE28, "X"), + (0x1EE29, "M", "ي"), + (0x1EE2A, "M", "ك"), + (0x1EE2B, "M", "ل"), + (0x1EE2C, "M", "م"), + (0x1EE2D, "M", "ن"), + (0x1EE2E, "M", "س"), + (0x1EE2F, "M", "ع"), + (0x1EE30, "M", "ف"), + (0x1EE31, "M", "ص"), + (0x1EE32, "M", "ق"), + (0x1EE33, "X"), + (0x1EE34, "M", "ش"), + (0x1EE35, "M", "ت"), + (0x1EE36, "M", "ث"), + (0x1EE37, "M", "خ"), + (0x1EE38, "X"), + (0x1EE39, "M", "ض"), + (0x1EE3A, "X"), + (0x1EE3B, "M", "غ"), + (0x1EE3C, "X"), + (0x1EE42, "M", "ج"), + (0x1EE43, "X"), + (0x1EE47, "M", "ح"), + (0x1EE48, "X"), + (0x1EE49, "M", "ي"), + (0x1EE4A, "X"), + (0x1EE4B, "M", "ل"), + (0x1EE4C, "X"), + (0x1EE4D, "M", "ن"), + (0x1EE4E, "M", "س"), + (0x1EE4F, "M", "ع"), + (0x1EE50, "X"), + (0x1EE51, "M", "ص"), + (0x1EE52, "M", "ق"), + (0x1EE53, "X"), + (0x1EE54, "M", "ش"), + (0x1EE55, "X"), + (0x1EE57, "M", "خ"), + (0x1EE58, "X"), + (0x1EE59, "M", "ض"), + (0x1EE5A, "X"), + (0x1EE5B, "M", "غ"), + (0x1EE5C, "X"), + (0x1EE5D, "M", "ں"), + (0x1EE5E, "X"), + (0x1EE5F, "M", "ٯ"), + (0x1EE60, "X"), + (0x1EE61, "M", "ب"), + (0x1EE62, "M", "ج"), + (0x1EE63, "X"), + (0x1EE64, "M", "ه"), + (0x1EE65, "X"), + (0x1EE67, "M", "ح"), + (0x1EE68, "M", "ط"), + (0x1EE69, "M", "ي"), + (0x1EE6A, "M", "ك"), + (0x1EE6B, "X"), + (0x1EE6C, "M", "م"), + (0x1EE6D, "M", "ن"), + (0x1EE6E, "M", "س"), + (0x1EE6F, "M", "ع"), + (0x1EE70, "M", "ف"), + (0x1EE71, "M", "ص"), + (0x1EE72, "M", "ق"), + (0x1EE73, "X"), + (0x1EE74, "M", "ش"), + (0x1EE75, "M", "ت"), + (0x1EE76, "M", "ث"), + (0x1EE77, "M", "خ"), + (0x1EE78, "X"), + (0x1EE79, "M", "ض"), + (0x1EE7A, "M", "ظ"), + (0x1EE7B, "M", "غ"), + (0x1EE7C, "M", "ٮ"), + (0x1EE7D, "X"), + (0x1EE7E, "M", "ڡ"), + (0x1EE7F, "X"), + (0x1EE80, "M", "ا"), + (0x1EE81, "M", "ب"), + (0x1EE82, "M", "ج"), + (0x1EE83, "M", "د"), + ] + + +def _seg_75() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1EE84, "M", "ه"), + (0x1EE85, "M", "و"), + (0x1EE86, "M", "ز"), + (0x1EE87, "M", "ح"), + (0x1EE88, "M", "ط"), + (0x1EE89, "M", "ي"), + (0x1EE8A, "X"), + (0x1EE8B, "M", "ل"), + (0x1EE8C, "M", "م"), + (0x1EE8D, "M", "ن"), + (0x1EE8E, "M", "س"), + (0x1EE8F, "M", "ع"), + (0x1EE90, "M", "ف"), + (0x1EE91, "M", "ص"), + (0x1EE92, "M", "ق"), + (0x1EE93, "M", "ر"), + (0x1EE94, "M", "ش"), + (0x1EE95, "M", "ت"), + (0x1EE96, "M", "ث"), + (0x1EE97, "M", "خ"), + (0x1EE98, "M", "ذ"), + (0x1EE99, "M", "ض"), + (0x1EE9A, "M", "ظ"), + (0x1EE9B, "M", "غ"), + (0x1EE9C, "X"), + (0x1EEA1, "M", "ب"), + (0x1EEA2, "M", "ج"), + (0x1EEA3, "M", "د"), + (0x1EEA4, "X"), + (0x1EEA5, "M", "و"), + (0x1EEA6, "M", "ز"), + (0x1EEA7, "M", "ح"), + (0x1EEA8, "M", "ط"), + (0x1EEA9, "M", "ي"), + (0x1EEAA, "X"), + (0x1EEAB, "M", "ل"), + (0x1EEAC, "M", "م"), + (0x1EEAD, "M", "ن"), + (0x1EEAE, "M", "س"), + (0x1EEAF, "M", "ع"), + (0x1EEB0, "M", "ف"), + (0x1EEB1, "M", "ص"), + (0x1EEB2, "M", "ق"), + (0x1EEB3, "M", "ر"), + (0x1EEB4, "M", "ش"), + (0x1EEB5, "M", "ت"), + (0x1EEB6, "M", "ث"), + (0x1EEB7, "M", "خ"), + (0x1EEB8, "M", "ذ"), + (0x1EEB9, "M", "ض"), + (0x1EEBA, "M", "ظ"), + (0x1EEBB, "M", "غ"), + (0x1EEBC, "X"), + (0x1EEF0, "V"), + (0x1EEF2, "X"), + (0x1F000, "V"), + (0x1F02C, "X"), + (0x1F030, "V"), + (0x1F094, "X"), + (0x1F0A0, "V"), + (0x1F0AF, "X"), + (0x1F0B1, "V"), + (0x1F0C0, "X"), + (0x1F0C1, "V"), + (0x1F0D0, "X"), + (0x1F0D1, "V"), + (0x1F0F6, "X"), + (0x1F101, "M", "0,"), + (0x1F102, "M", "1,"), + (0x1F103, "M", "2,"), + (0x1F104, "M", "3,"), + (0x1F105, "M", "4,"), + (0x1F106, "M", "5,"), + (0x1F107, "M", "6,"), + (0x1F108, "M", "7,"), + (0x1F109, "M", "8,"), + (0x1F10A, "M", "9,"), + (0x1F10B, "V"), + (0x1F110, "M", "(a)"), + (0x1F111, "M", "(b)"), + (0x1F112, "M", "(c)"), + (0x1F113, "M", "(d)"), + (0x1F114, "M", "(e)"), + (0x1F115, "M", "(f)"), + (0x1F116, "M", "(g)"), + (0x1F117, "M", "(h)"), + (0x1F118, "M", "(i)"), + (0x1F119, "M", "(j)"), + (0x1F11A, "M", "(k)"), + (0x1F11B, "M", "(l)"), + (0x1F11C, "M", "(m)"), + (0x1F11D, "M", "(n)"), + (0x1F11E, "M", "(o)"), + (0x1F11F, "M", "(p)"), + (0x1F120, "M", "(q)"), + (0x1F121, "M", "(r)"), + (0x1F122, "M", "(s)"), + (0x1F123, "M", "(t)"), + (0x1F124, "M", "(u)"), + (0x1F125, "M", "(v)"), + ] + + +def _seg_76() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1F126, "M", "(w)"), + (0x1F127, "M", "(x)"), + (0x1F128, "M", "(y)"), + (0x1F129, "M", "(z)"), + (0x1F12A, "M", "〔s〕"), + (0x1F12B, "M", "c"), + (0x1F12C, "M", "r"), + (0x1F12D, "M", "cd"), + (0x1F12E, "M", "wz"), + (0x1F12F, "V"), + (0x1F130, "M", "a"), + (0x1F131, "M", "b"), + (0x1F132, "M", "c"), + (0x1F133, "M", "d"), + (0x1F134, "M", "e"), + (0x1F135, "M", "f"), + (0x1F136, "M", "g"), + (0x1F137, "M", "h"), + (0x1F138, "M", "i"), + (0x1F139, "M", "j"), + (0x1F13A, "M", "k"), + (0x1F13B, "M", "l"), + (0x1F13C, "M", "m"), + (0x1F13D, "M", "n"), + (0x1F13E, "M", "o"), + (0x1F13F, "M", "p"), + (0x1F140, "M", "q"), + (0x1F141, "M", "r"), + (0x1F142, "M", "s"), + (0x1F143, "M", "t"), + (0x1F144, "M", "u"), + (0x1F145, "M", "v"), + (0x1F146, "M", "w"), + (0x1F147, "M", "x"), + (0x1F148, "M", "y"), + (0x1F149, "M", "z"), + (0x1F14A, "M", "hv"), + (0x1F14B, "M", "mv"), + (0x1F14C, "M", "sd"), + (0x1F14D, "M", "ss"), + (0x1F14E, "M", "ppv"), + (0x1F14F, "M", "wc"), + (0x1F150, "V"), + (0x1F16A, "M", "mc"), + (0x1F16B, "M", "md"), + (0x1F16C, "M", "mr"), + (0x1F16D, "V"), + (0x1F190, "M", "dj"), + (0x1F191, "V"), + (0x1F1AE, "X"), + (0x1F1E6, "V"), + (0x1F200, "M", "ほか"), + (0x1F201, "M", "ココ"), + (0x1F202, "M", "サ"), + (0x1F203, "X"), + (0x1F210, "M", "手"), + (0x1F211, "M", "字"), + (0x1F212, "M", "双"), + (0x1F213, "M", "デ"), + (0x1F214, "M", "二"), + (0x1F215, "M", "多"), + (0x1F216, "M", "解"), + (0x1F217, "M", "天"), + (0x1F218, "M", "交"), + (0x1F219, "M", "映"), + (0x1F21A, "M", "無"), + (0x1F21B, "M", "料"), + (0x1F21C, "M", "前"), + (0x1F21D, "M", "後"), + (0x1F21E, "M", "再"), + (0x1F21F, "M", "新"), + (0x1F220, "M", "初"), + (0x1F221, "M", "終"), + (0x1F222, "M", "生"), + (0x1F223, "M", "販"), + (0x1F224, "M", "声"), + (0x1F225, "M", "吹"), + (0x1F226, "M", "演"), + (0x1F227, "M", "投"), + (0x1F228, "M", "捕"), + (0x1F229, "M", "一"), + (0x1F22A, "M", "三"), + (0x1F22B, "M", "遊"), + (0x1F22C, "M", "左"), + (0x1F22D, "M", "中"), + (0x1F22E, "M", "右"), + (0x1F22F, "M", "指"), + (0x1F230, "M", "走"), + (0x1F231, "M", "打"), + (0x1F232, "M", "禁"), + (0x1F233, "M", "空"), + (0x1F234, "M", "合"), + (0x1F235, "M", "満"), + (0x1F236, "M", "有"), + (0x1F237, "M", "月"), + (0x1F238, "M", "申"), + (0x1F239, "M", "割"), + (0x1F23A, "M", "営"), + (0x1F23B, "M", "配"), + (0x1F23C, "X"), + ] + + +def _seg_77() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1F240, "M", "〔本〕"), + (0x1F241, "M", "〔三〕"), + (0x1F242, "M", "〔二〕"), + (0x1F243, "M", "〔安〕"), + (0x1F244, "M", "〔点〕"), + (0x1F245, "M", "〔打〕"), + (0x1F246, "M", "〔盗〕"), + (0x1F247, "M", "〔勝〕"), + (0x1F248, "M", "〔敗〕"), + (0x1F249, "X"), + (0x1F250, "M", "得"), + (0x1F251, "M", "可"), + (0x1F252, "X"), + (0x1F260, "V"), + (0x1F266, "X"), + (0x1F300, "V"), + (0x1F6D8, "X"), + (0x1F6DC, "V"), + (0x1F6ED, "X"), + (0x1F6F0, "V"), + (0x1F6FD, "X"), + (0x1F700, "V"), + (0x1F777, "X"), + (0x1F77B, "V"), + (0x1F7DA, "X"), + (0x1F7E0, "V"), + (0x1F7EC, "X"), + (0x1F7F0, "V"), + (0x1F7F1, "X"), + (0x1F800, "V"), + (0x1F80C, "X"), + (0x1F810, "V"), + (0x1F848, "X"), + (0x1F850, "V"), + (0x1F85A, "X"), + (0x1F860, "V"), + (0x1F888, "X"), + (0x1F890, "V"), + (0x1F8AE, "X"), + (0x1F8B0, "V"), + (0x1F8BC, "X"), + (0x1F8C0, "V"), + (0x1F8C2, "X"), + (0x1F900, "V"), + (0x1FA54, "X"), + (0x1FA60, "V"), + (0x1FA6E, "X"), + (0x1FA70, "V"), + (0x1FA7D, "X"), + (0x1FA80, "V"), + (0x1FA8A, "X"), + (0x1FA8F, "V"), + (0x1FAC7, "X"), + (0x1FACE, "V"), + (0x1FADD, "X"), + (0x1FADF, "V"), + (0x1FAEA, "X"), + (0x1FAF0, "V"), + (0x1FAF9, "X"), + (0x1FB00, "V"), + (0x1FB93, "X"), + (0x1FB94, "V"), + (0x1FBF0, "M", "0"), + (0x1FBF1, "M", "1"), + (0x1FBF2, "M", "2"), + (0x1FBF3, "M", "3"), + (0x1FBF4, "M", "4"), + (0x1FBF5, "M", "5"), + (0x1FBF6, "M", "6"), + (0x1FBF7, "M", "7"), + (0x1FBF8, "M", "8"), + (0x1FBF9, "M", "9"), + (0x1FBFA, "X"), + (0x20000, "V"), + (0x2A6E0, "X"), + (0x2A700, "V"), + (0x2B73A, "X"), + (0x2B740, "V"), + (0x2B81E, "X"), + (0x2B820, "V"), + (0x2CEA2, "X"), + (0x2CEB0, "V"), + (0x2EBE1, "X"), + (0x2EBF0, "V"), + (0x2EE5E, "X"), + (0x2F800, "M", "丽"), + (0x2F801, "M", "丸"), + (0x2F802, "M", "乁"), + (0x2F803, "M", "𠄢"), + (0x2F804, "M", "你"), + (0x2F805, "M", "侮"), + (0x2F806, "M", "侻"), + (0x2F807, "M", "倂"), + (0x2F808, "M", "偺"), + (0x2F809, "M", "備"), + (0x2F80A, "M", "僧"), + (0x2F80B, "M", "像"), + (0x2F80C, "M", "㒞"), + (0x2F80D, "M", "𠘺"), + (0x2F80E, "M", "免"), + ] + + +def _seg_78() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2F80F, "M", "兔"), + (0x2F810, "M", "兤"), + (0x2F811, "M", "具"), + (0x2F812, "M", "𠔜"), + (0x2F813, "M", "㒹"), + (0x2F814, "M", "內"), + (0x2F815, "M", "再"), + (0x2F816, "M", "𠕋"), + (0x2F817, "M", "冗"), + (0x2F818, "M", "冤"), + (0x2F819, "M", "仌"), + (0x2F81A, "M", "冬"), + (0x2F81B, "M", "况"), + (0x2F81C, "M", "𩇟"), + (0x2F81D, "M", "凵"), + (0x2F81E, "M", "刃"), + (0x2F81F, "M", "㓟"), + (0x2F820, "M", "刻"), + (0x2F821, "M", "剆"), + (0x2F822, "M", "割"), + (0x2F823, "M", "剷"), + (0x2F824, "M", "㔕"), + (0x2F825, "M", "勇"), + (0x2F826, "M", "勉"), + (0x2F827, "M", "勤"), + (0x2F828, "M", "勺"), + (0x2F829, "M", "包"), + (0x2F82A, "M", "匆"), + (0x2F82B, "M", "北"), + (0x2F82C, "M", "卉"), + (0x2F82D, "M", "卑"), + (0x2F82E, "M", "博"), + (0x2F82F, "M", "即"), + (0x2F830, "M", "卽"), + (0x2F831, "M", "卿"), + (0x2F834, "M", "𠨬"), + (0x2F835, "M", "灰"), + (0x2F836, "M", "及"), + (0x2F837, "M", "叟"), + (0x2F838, "M", "𠭣"), + (0x2F839, "M", "叫"), + (0x2F83A, "M", "叱"), + (0x2F83B, "M", "吆"), + (0x2F83C, "M", "咞"), + (0x2F83D, "M", "吸"), + (0x2F83E, "M", "呈"), + (0x2F83F, "M", "周"), + (0x2F840, "M", "咢"), + (0x2F841, "M", "哶"), + (0x2F842, "M", "唐"), + (0x2F843, "M", "啓"), + (0x2F844, "M", "啣"), + (0x2F845, "M", "善"), + (0x2F847, "M", "喙"), + (0x2F848, "M", "喫"), + (0x2F849, "M", "喳"), + (0x2F84A, "M", "嗂"), + (0x2F84B, "M", "圖"), + (0x2F84C, "M", "嘆"), + (0x2F84D, "M", "圗"), + (0x2F84E, "M", "噑"), + (0x2F84F, "M", "噴"), + (0x2F850, "M", "切"), + (0x2F851, "M", "壮"), + (0x2F852, "M", "城"), + (0x2F853, "M", "埴"), + (0x2F854, "M", "堍"), + (0x2F855, "M", "型"), + (0x2F856, "M", "堲"), + (0x2F857, "M", "報"), + (0x2F858, "M", "墬"), + (0x2F859, "M", "𡓤"), + (0x2F85A, "M", "売"), + (0x2F85B, "M", "壷"), + (0x2F85C, "M", "夆"), + (0x2F85D, "M", "多"), + (0x2F85E, "M", "夢"), + (0x2F85F, "M", "奢"), + (0x2F860, "M", "𡚨"), + (0x2F861, "M", "𡛪"), + (0x2F862, "M", "姬"), + (0x2F863, "M", "娛"), + (0x2F864, "M", "娧"), + (0x2F865, "M", "姘"), + (0x2F866, "M", "婦"), + (0x2F867, "M", "㛮"), + (0x2F868, "M", "㛼"), + (0x2F869, "M", "嬈"), + (0x2F86A, "M", "嬾"), + (0x2F86C, "M", "𡧈"), + (0x2F86D, "M", "寃"), + (0x2F86E, "M", "寘"), + (0x2F86F, "M", "寧"), + (0x2F870, "M", "寳"), + (0x2F871, "M", "𡬘"), + (0x2F872, "M", "寿"), + (0x2F873, "M", "将"), + (0x2F874, "M", "当"), + (0x2F875, "M", "尢"), + (0x2F876, "M", "㞁"), + ] + + +def _seg_79() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2F877, "M", "屠"), + (0x2F878, "M", "屮"), + (0x2F879, "M", "峀"), + (0x2F87A, "M", "岍"), + (0x2F87B, "M", "𡷤"), + (0x2F87C, "M", "嵃"), + (0x2F87D, "M", "𡷦"), + (0x2F87E, "M", "嵮"), + (0x2F87F, "M", "嵫"), + (0x2F880, "M", "嵼"), + (0x2F881, "M", "巡"), + (0x2F882, "M", "巢"), + (0x2F883, "M", "㠯"), + (0x2F884, "M", "巽"), + (0x2F885, "M", "帨"), + (0x2F886, "M", "帽"), + (0x2F887, "M", "幩"), + (0x2F888, "M", "㡢"), + (0x2F889, "M", "𢆃"), + (0x2F88A, "M", "㡼"), + (0x2F88B, "M", "庰"), + (0x2F88C, "M", "庳"), + (0x2F88D, "M", "庶"), + (0x2F88E, "M", "廊"), + (0x2F88F, "M", "𪎒"), + (0x2F890, "M", "廾"), + (0x2F891, "M", "𢌱"), + (0x2F893, "M", "舁"), + (0x2F894, "M", "弢"), + (0x2F896, "M", "㣇"), + (0x2F897, "M", "𣊸"), + (0x2F898, "M", "𦇚"), + (0x2F899, "M", "形"), + (0x2F89A, "M", "彫"), + (0x2F89B, "M", "㣣"), + (0x2F89C, "M", "徚"), + (0x2F89D, "M", "忍"), + (0x2F89E, "M", "志"), + (0x2F89F, "M", "忹"), + (0x2F8A0, "M", "悁"), + (0x2F8A1, "M", "㤺"), + (0x2F8A2, "M", "㤜"), + (0x2F8A3, "M", "悔"), + (0x2F8A4, "M", "𢛔"), + (0x2F8A5, "M", "惇"), + (0x2F8A6, "M", "慈"), + (0x2F8A7, "M", "慌"), + (0x2F8A8, "M", "慎"), + (0x2F8A9, "M", "慌"), + (0x2F8AA, "M", "慺"), + (0x2F8AB, "M", "憎"), + (0x2F8AC, "M", "憲"), + (0x2F8AD, "M", "憤"), + (0x2F8AE, "M", "憯"), + (0x2F8AF, "M", "懞"), + (0x2F8B0, "M", "懲"), + (0x2F8B1, "M", "懶"), + (0x2F8B2, "M", "成"), + (0x2F8B3, "M", "戛"), + (0x2F8B4, "M", "扝"), + (0x2F8B5, "M", "抱"), + (0x2F8B6, "M", "拔"), + (0x2F8B7, "M", "捐"), + (0x2F8B8, "M", "𢬌"), + (0x2F8B9, "M", "挽"), + (0x2F8BA, "M", "拼"), + (0x2F8BB, "M", "捨"), + (0x2F8BC, "M", "掃"), + (0x2F8BD, "M", "揤"), + (0x2F8BE, "M", "𢯱"), + (0x2F8BF, "M", "搢"), + (0x2F8C0, "M", "揅"), + (0x2F8C1, "M", "掩"), + (0x2F8C2, "M", "㨮"), + (0x2F8C3, "M", "摩"), + (0x2F8C4, "M", "摾"), + (0x2F8C5, "M", "撝"), + (0x2F8C6, "M", "摷"), + (0x2F8C7, "M", "㩬"), + (0x2F8C8, "M", "敏"), + (0x2F8C9, "M", "敬"), + (0x2F8CA, "M", "𣀊"), + (0x2F8CB, "M", "旣"), + (0x2F8CC, "M", "書"), + (0x2F8CD, "M", "晉"), + (0x2F8CE, "M", "㬙"), + (0x2F8CF, "M", "暑"), + (0x2F8D0, "M", "㬈"), + (0x2F8D1, "M", "㫤"), + (0x2F8D2, "M", "冒"), + (0x2F8D3, "M", "冕"), + (0x2F8D4, "M", "最"), + (0x2F8D5, "M", "暜"), + (0x2F8D6, "M", "肭"), + (0x2F8D7, "M", "䏙"), + (0x2F8D8, "M", "朗"), + (0x2F8D9, "M", "望"), + (0x2F8DA, "M", "朡"), + (0x2F8DB, "M", "杞"), + (0x2F8DC, "M", "杓"), + ] + + +def _seg_80() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2F8DD, "M", "𣏃"), + (0x2F8DE, "M", "㭉"), + (0x2F8DF, "M", "柺"), + (0x2F8E0, "M", "枅"), + (0x2F8E1, "M", "桒"), + (0x2F8E2, "M", "梅"), + (0x2F8E3, "M", "𣑭"), + (0x2F8E4, "M", "梎"), + (0x2F8E5, "M", "栟"), + (0x2F8E6, "M", "椔"), + (0x2F8E7, "M", "㮝"), + (0x2F8E8, "M", "楂"), + (0x2F8E9, "M", "榣"), + (0x2F8EA, "M", "槪"), + (0x2F8EB, "M", "檨"), + (0x2F8EC, "M", "𣚣"), + (0x2F8ED, "M", "櫛"), + (0x2F8EE, "M", "㰘"), + (0x2F8EF, "M", "次"), + (0x2F8F0, "M", "𣢧"), + (0x2F8F1, "M", "歔"), + (0x2F8F2, "M", "㱎"), + (0x2F8F3, "M", "歲"), + (0x2F8F4, "M", "殟"), + (0x2F8F5, "M", "殺"), + (0x2F8F6, "M", "殻"), + (0x2F8F7, "M", "𣪍"), + (0x2F8F8, "M", "𡴋"), + (0x2F8F9, "M", "𣫺"), + (0x2F8FA, "M", "汎"), + (0x2F8FB, "M", "𣲼"), + (0x2F8FC, "M", "沿"), + (0x2F8FD, "M", "泍"), + (0x2F8FE, "M", "汧"), + (0x2F8FF, "M", "洖"), + (0x2F900, "M", "派"), + (0x2F901, "M", "海"), + (0x2F902, "M", "流"), + (0x2F903, "M", "浩"), + (0x2F904, "M", "浸"), + (0x2F905, "M", "涅"), + (0x2F906, "M", "𣴞"), + (0x2F907, "M", "洴"), + (0x2F908, "M", "港"), + (0x2F909, "M", "湮"), + (0x2F90A, "M", "㴳"), + (0x2F90B, "M", "滋"), + (0x2F90C, "M", "滇"), + (0x2F90D, "M", "𣻑"), + (0x2F90E, "M", "淹"), + (0x2F90F, "M", "潮"), + (0x2F910, "M", "𣽞"), + (0x2F911, "M", "𣾎"), + (0x2F912, "M", "濆"), + (0x2F913, "M", "瀹"), + (0x2F914, "M", "瀞"), + (0x2F915, "M", "瀛"), + (0x2F916, "M", "㶖"), + (0x2F917, "M", "灊"), + (0x2F918, "M", "災"), + (0x2F919, "M", "灷"), + (0x2F91A, "M", "炭"), + (0x2F91B, "M", "𠔥"), + (0x2F91C, "M", "煅"), + (0x2F91D, "M", "𤉣"), + (0x2F91E, "M", "熜"), + (0x2F91F, "M", "𤎫"), + (0x2F920, "M", "爨"), + (0x2F921, "M", "爵"), + (0x2F922, "M", "牐"), + (0x2F923, "M", "𤘈"), + (0x2F924, "M", "犀"), + (0x2F925, "M", "犕"), + (0x2F926, "M", "𤜵"), + (0x2F927, "M", "𤠔"), + (0x2F928, "M", "獺"), + (0x2F929, "M", "王"), + (0x2F92A, "M", "㺬"), + (0x2F92B, "M", "玥"), + (0x2F92C, "M", "㺸"), + (0x2F92E, "M", "瑇"), + (0x2F92F, "M", "瑜"), + (0x2F930, "M", "瑱"), + (0x2F931, "M", "璅"), + (0x2F932, "M", "瓊"), + (0x2F933, "M", "㼛"), + (0x2F934, "M", "甤"), + (0x2F935, "M", "𤰶"), + (0x2F936, "M", "甾"), + (0x2F937, "M", "𤲒"), + (0x2F938, "M", "異"), + (0x2F939, "M", "𢆟"), + (0x2F93A, "M", "瘐"), + (0x2F93B, "M", "𤾡"), + (0x2F93C, "M", "𤾸"), + (0x2F93D, "M", "𥁄"), + (0x2F93E, "M", "㿼"), + (0x2F93F, "M", "䀈"), + (0x2F940, "M", "直"), + (0x2F941, "M", "𥃳"), + ] + + +def _seg_81() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2F942, "M", "𥃲"), + (0x2F943, "M", "𥄙"), + (0x2F944, "M", "𥄳"), + (0x2F945, "M", "眞"), + (0x2F946, "M", "真"), + (0x2F948, "M", "睊"), + (0x2F949, "M", "䀹"), + (0x2F94A, "M", "瞋"), + (0x2F94B, "M", "䁆"), + (0x2F94C, "M", "䂖"), + (0x2F94D, "M", "𥐝"), + (0x2F94E, "M", "硎"), + (0x2F94F, "M", "碌"), + (0x2F950, "M", "磌"), + (0x2F951, "M", "䃣"), + (0x2F952, "M", "𥘦"), + (0x2F953, "M", "祖"), + (0x2F954, "M", "𥚚"), + (0x2F955, "M", "𥛅"), + (0x2F956, "M", "福"), + (0x2F957, "M", "秫"), + (0x2F958, "M", "䄯"), + (0x2F959, "M", "穀"), + (0x2F95A, "M", "穊"), + (0x2F95B, "M", "穏"), + (0x2F95C, "M", "𥥼"), + (0x2F95D, "M", "𥪧"), + (0x2F95F, "M", "竮"), + (0x2F960, "M", "䈂"), + (0x2F961, "M", "𥮫"), + (0x2F962, "M", "篆"), + (0x2F963, "M", "築"), + (0x2F964, "M", "䈧"), + (0x2F965, "M", "𥲀"), + (0x2F966, "M", "糒"), + (0x2F967, "M", "䊠"), + (0x2F968, "M", "糨"), + (0x2F969, "M", "糣"), + (0x2F96A, "M", "紀"), + (0x2F96B, "M", "𥾆"), + (0x2F96C, "M", "絣"), + (0x2F96D, "M", "䌁"), + (0x2F96E, "M", "緇"), + (0x2F96F, "M", "縂"), + (0x2F970, "M", "繅"), + (0x2F971, "M", "䌴"), + (0x2F972, "M", "𦈨"), + (0x2F973, "M", "𦉇"), + (0x2F974, "M", "䍙"), + (0x2F975, "M", "𦋙"), + (0x2F976, "M", "罺"), + (0x2F977, "M", "𦌾"), + (0x2F978, "M", "羕"), + (0x2F979, "M", "翺"), + (0x2F97A, "M", "者"), + (0x2F97B, "M", "𦓚"), + (0x2F97C, "M", "𦔣"), + (0x2F97D, "M", "聠"), + (0x2F97E, "M", "𦖨"), + (0x2F97F, "M", "聰"), + (0x2F980, "M", "𣍟"), + (0x2F981, "M", "䏕"), + (0x2F982, "M", "育"), + (0x2F983, "M", "脃"), + (0x2F984, "M", "䐋"), + (0x2F985, "M", "脾"), + (0x2F986, "M", "媵"), + (0x2F987, "M", "𦞧"), + (0x2F988, "M", "𦞵"), + (0x2F989, "M", "𣎓"), + (0x2F98A, "M", "𣎜"), + (0x2F98B, "M", "舁"), + (0x2F98C, "M", "舄"), + (0x2F98D, "M", "辞"), + (0x2F98E, "M", "䑫"), + (0x2F98F, "M", "芑"), + (0x2F990, "M", "芋"), + (0x2F991, "M", "芝"), + (0x2F992, "M", "劳"), + (0x2F993, "M", "花"), + (0x2F994, "M", "芳"), + (0x2F995, "M", "芽"), + (0x2F996, "M", "苦"), + (0x2F997, "M", "𦬼"), + (0x2F998, "M", "若"), + (0x2F999, "M", "茝"), + (0x2F99A, "M", "荣"), + (0x2F99B, "M", "莭"), + (0x2F99C, "M", "茣"), + (0x2F99D, "M", "莽"), + (0x2F99E, "M", "菧"), + (0x2F99F, "M", "著"), + (0x2F9A0, "M", "荓"), + (0x2F9A1, "M", "菊"), + (0x2F9A2, "M", "菌"), + (0x2F9A3, "M", "菜"), + (0x2F9A4, "M", "𦰶"), + (0x2F9A5, "M", "𦵫"), + (0x2F9A6, "M", "𦳕"), + (0x2F9A7, "M", "䔫"), + ] + + +def _seg_82() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2F9A8, "M", "蓱"), + (0x2F9A9, "M", "蓳"), + (0x2F9AA, "M", "蔖"), + (0x2F9AB, "M", "𧏊"), + (0x2F9AC, "M", "蕤"), + (0x2F9AD, "M", "𦼬"), + (0x2F9AE, "M", "䕝"), + (0x2F9AF, "M", "䕡"), + (0x2F9B0, "M", "𦾱"), + (0x2F9B1, "M", "𧃒"), + (0x2F9B2, "M", "䕫"), + (0x2F9B3, "M", "虐"), + (0x2F9B4, "M", "虜"), + (0x2F9B5, "M", "虧"), + (0x2F9B6, "M", "虩"), + (0x2F9B7, "M", "蚩"), + (0x2F9B8, "M", "蚈"), + (0x2F9B9, "M", "蜎"), + (0x2F9BA, "M", "蛢"), + (0x2F9BB, "M", "蝹"), + (0x2F9BC, "M", "蜨"), + (0x2F9BD, "M", "蝫"), + (0x2F9BE, "M", "螆"), + (0x2F9BF, "M", "䗗"), + (0x2F9C0, "M", "蟡"), + (0x2F9C1, "M", "蠁"), + (0x2F9C2, "M", "䗹"), + (0x2F9C3, "M", "衠"), + (0x2F9C4, "M", "衣"), + (0x2F9C5, "M", "𧙧"), + (0x2F9C6, "M", "裗"), + (0x2F9C7, "M", "裞"), + (0x2F9C8, "M", "䘵"), + (0x2F9C9, "M", "裺"), + (0x2F9CA, "M", "㒻"), + (0x2F9CB, "M", "𧢮"), + (0x2F9CC, "M", "𧥦"), + (0x2F9CD, "M", "䚾"), + (0x2F9CE, "M", "䛇"), + (0x2F9CF, "M", "誠"), + (0x2F9D0, "M", "諭"), + (0x2F9D1, "M", "變"), + (0x2F9D2, "M", "豕"), + (0x2F9D3, "M", "𧲨"), + (0x2F9D4, "M", "貫"), + (0x2F9D5, "M", "賁"), + (0x2F9D6, "M", "贛"), + (0x2F9D7, "M", "起"), + (0x2F9D8, "M", "𧼯"), + (0x2F9D9, "M", "𠠄"), + (0x2F9DA, "M", "跋"), + (0x2F9DB, "M", "趼"), + (0x2F9DC, "M", "跰"), + (0x2F9DD, "M", "𠣞"), + (0x2F9DE, "M", "軔"), + (0x2F9DF, "M", "輸"), + (0x2F9E0, "M", "𨗒"), + (0x2F9E1, "M", "𨗭"), + (0x2F9E2, "M", "邔"), + (0x2F9E3, "M", "郱"), + (0x2F9E4, "M", "鄑"), + (0x2F9E5, "M", "𨜮"), + (0x2F9E6, "M", "鄛"), + (0x2F9E7, "M", "鈸"), + (0x2F9E8, "M", "鋗"), + (0x2F9E9, "M", "鋘"), + (0x2F9EA, "M", "鉼"), + (0x2F9EB, "M", "鏹"), + (0x2F9EC, "M", "鐕"), + (0x2F9ED, "M", "𨯺"), + (0x2F9EE, "M", "開"), + (0x2F9EF, "M", "䦕"), + (0x2F9F0, "M", "閷"), + (0x2F9F1, "M", "𨵷"), + (0x2F9F2, "M", "䧦"), + (0x2F9F3, "M", "雃"), + (0x2F9F4, "M", "嶲"), + (0x2F9F5, "M", "霣"), + (0x2F9F6, "M", "𩅅"), + (0x2F9F7, "M", "𩈚"), + (0x2F9F8, "M", "䩮"), + (0x2F9F9, "M", "䩶"), + (0x2F9FA, "M", "韠"), + (0x2F9FB, "M", "𩐊"), + (0x2F9FC, "M", "䪲"), + (0x2F9FD, "M", "𩒖"), + (0x2F9FE, "M", "頋"), + (0x2FA00, "M", "頩"), + (0x2FA01, "M", "𩖶"), + (0x2FA02, "M", "飢"), + (0x2FA03, "M", "䬳"), + (0x2FA04, "M", "餩"), + (0x2FA05, "M", "馧"), + (0x2FA06, "M", "駂"), + (0x2FA07, "M", "駾"), + (0x2FA08, "M", "䯎"), + (0x2FA09, "M", "𩬰"), + (0x2FA0A, "M", "鬒"), + (0x2FA0B, "M", "鱀"), + (0x2FA0C, "M", "鳽"), + ] + + +def _seg_83() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2FA0D, "M", "䳎"), + (0x2FA0E, "M", "䳭"), + (0x2FA0F, "M", "鵧"), + (0x2FA10, "M", "𪃎"), + (0x2FA11, "M", "䳸"), + (0x2FA12, "M", "𪄅"), + (0x2FA13, "M", "𪈎"), + (0x2FA14, "M", "𪊑"), + (0x2FA15, "M", "麻"), + (0x2FA16, "M", "䵖"), + (0x2FA17, "M", "黹"), + (0x2FA18, "M", "黾"), + (0x2FA19, "M", "鼅"), + (0x2FA1A, "M", "鼏"), + (0x2FA1B, "M", "鼖"), + (0x2FA1C, "M", "鼻"), + (0x2FA1D, "M", "𪘀"), + (0x2FA1E, "X"), + (0x30000, "V"), + (0x3134B, "X"), + (0x31350, "V"), + (0x323B0, "X"), + (0xE0100, "I"), + (0xE01F0, "X"), + ] + + +uts46data = tuple( + _seg_0() + + _seg_1() + + _seg_2() + + _seg_3() + + _seg_4() + + _seg_5() + + _seg_6() + + _seg_7() + + _seg_8() + + _seg_9() + + _seg_10() + + _seg_11() + + _seg_12() + + _seg_13() + + _seg_14() + + _seg_15() + + _seg_16() + + _seg_17() + + _seg_18() + + _seg_19() + + _seg_20() + + _seg_21() + + _seg_22() + + _seg_23() + + _seg_24() + + _seg_25() + + _seg_26() + + _seg_27() + + _seg_28() + + _seg_29() + + _seg_30() + + _seg_31() + + _seg_32() + + _seg_33() + + _seg_34() + + _seg_35() + + _seg_36() + + _seg_37() + + _seg_38() + + _seg_39() + + _seg_40() + + _seg_41() + + _seg_42() + + _seg_43() + + _seg_44() + + _seg_45() + + _seg_46() + + _seg_47() + + _seg_48() + + _seg_49() + + _seg_50() + + _seg_51() + + _seg_52() + + _seg_53() + + _seg_54() + + _seg_55() + + _seg_56() + + _seg_57() + + _seg_58() + + _seg_59() + + _seg_60() + + _seg_61() + + _seg_62() + + _seg_63() + + _seg_64() + + _seg_65() + + _seg_66() + + _seg_67() + + _seg_68() + + _seg_69() + + _seg_70() + + _seg_71() + + _seg_72() + + _seg_73() + + _seg_74() + + _seg_75() + + _seg_76() + + _seg_77() + + _seg_78() + + _seg_79() + + _seg_80() + + _seg_81() + + _seg_82() + + _seg_83() +) # type: Tuple[Union[Tuple[int, str], Tuple[int, str, str]], ...] diff --git a/.venv/lib/python3.10/site-packages/jinja2-3.1.6.dist-info/INSTALLER b/.venv/lib/python3.10/site-packages/jinja2-3.1.6.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/.venv/lib/python3.10/site-packages/jinja2-3.1.6.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/.venv/lib/python3.10/site-packages/jinja2-3.1.6.dist-info/METADATA b/.venv/lib/python3.10/site-packages/jinja2-3.1.6.dist-info/METADATA new file mode 100644 index 0000000..ffef2ff --- /dev/null +++ b/.venv/lib/python3.10/site-packages/jinja2-3.1.6.dist-info/METADATA @@ -0,0 +1,84 @@ +Metadata-Version: 2.4 +Name: Jinja2 +Version: 3.1.6 +Summary: A very fast and expressive template engine. +Maintainer-email: Pallets +Requires-Python: >=3.7 +Description-Content-Type: text/markdown +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Text Processing :: Markup :: HTML +Classifier: Typing :: Typed +License-File: LICENSE.txt +Requires-Dist: MarkupSafe>=2.0 +Requires-Dist: Babel>=2.7 ; extra == "i18n" +Project-URL: Changes, https://jinja.palletsprojects.com/changes/ +Project-URL: Chat, https://discord.gg/pallets +Project-URL: Documentation, https://jinja.palletsprojects.com/ +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Source, https://github.com/pallets/jinja/ +Provides-Extra: i18n + +# Jinja + +Jinja is a fast, expressive, extensible templating engine. Special +placeholders in the template allow writing code similar to Python +syntax. Then the template is passed data to render the final document. + +It includes: + +- Template inheritance and inclusion. +- Define and import macros within templates. +- HTML templates can use autoescaping to prevent XSS from untrusted + user input. +- A sandboxed environment can safely render untrusted templates. +- AsyncIO support for generating templates and calling async + functions. +- I18N support with Babel. +- Templates are compiled to optimized Python code just-in-time and + cached, or can be compiled ahead-of-time. +- Exceptions point to the correct line in templates to make debugging + easier. +- Extensible filters, tests, functions, and even syntax. + +Jinja's philosophy is that while application logic belongs in Python if +possible, it shouldn't make the template designer's job difficult by +restricting functionality too much. + + +## In A Nutshell + +```jinja +{% extends "base.html" %} +{% block title %}Members{% endblock %} +{% block content %} +

+{% endblock %} +``` + +## Donate + +The Pallets organization develops and supports Jinja and other popular +packages. In order to grow the community of contributors and users, and +allow the maintainers to devote more time to the projects, [please +donate today][]. + +[please donate today]: https://palletsprojects.com/donate + +## Contributing + +See our [detailed contributing documentation][contrib] for many ways to +contribute, including reporting issues, requesting features, asking or answering +questions, and making PRs. + +[contrib]: https://palletsprojects.com/contributing/ + diff --git a/.venv/lib/python3.10/site-packages/jinja2-3.1.6.dist-info/RECORD b/.venv/lib/python3.10/site-packages/jinja2-3.1.6.dist-info/RECORD new file mode 100644 index 0000000..be19bf4 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/jinja2-3.1.6.dist-info/RECORD @@ -0,0 +1,58 @@ +jinja2-3.1.6.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +jinja2-3.1.6.dist-info/METADATA,sha256=aMVUj7Z8QTKhOJjZsx7FDGvqKr3ZFdkh8hQ1XDpkmcg,2871 +jinja2-3.1.6.dist-info/RECORD,, +jinja2-3.1.6.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +jinja2-3.1.6.dist-info/WHEEL,sha256=_2ozNFCLWc93bK4WKHCO-eDUENDlo-dgc9cU3qokYO4,82 +jinja2-3.1.6.dist-info/entry_points.txt,sha256=OL85gYU1eD8cuPlikifFngXpeBjaxl6rIJ8KkC_3r-I,58 +jinja2-3.1.6.dist-info/licenses/LICENSE.txt,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475 +jinja2/__init__.py,sha256=xxepO9i7DHsqkQrgBEduLtfoz2QCuT6_gbL4XSN1hbU,1928 +jinja2/__pycache__/__init__.cpython-310.pyc,, +jinja2/__pycache__/_identifier.cpython-310.pyc,, +jinja2/__pycache__/async_utils.cpython-310.pyc,, +jinja2/__pycache__/bccache.cpython-310.pyc,, +jinja2/__pycache__/compiler.cpython-310.pyc,, +jinja2/__pycache__/constants.cpython-310.pyc,, +jinja2/__pycache__/debug.cpython-310.pyc,, +jinja2/__pycache__/defaults.cpython-310.pyc,, +jinja2/__pycache__/environment.cpython-310.pyc,, +jinja2/__pycache__/exceptions.cpython-310.pyc,, +jinja2/__pycache__/ext.cpython-310.pyc,, +jinja2/__pycache__/filters.cpython-310.pyc,, +jinja2/__pycache__/idtracking.cpython-310.pyc,, +jinja2/__pycache__/lexer.cpython-310.pyc,, +jinja2/__pycache__/loaders.cpython-310.pyc,, +jinja2/__pycache__/meta.cpython-310.pyc,, +jinja2/__pycache__/nativetypes.cpython-310.pyc,, +jinja2/__pycache__/nodes.cpython-310.pyc,, +jinja2/__pycache__/optimizer.cpython-310.pyc,, +jinja2/__pycache__/parser.cpython-310.pyc,, +jinja2/__pycache__/runtime.cpython-310.pyc,, +jinja2/__pycache__/sandbox.cpython-310.pyc,, +jinja2/__pycache__/tests.cpython-310.pyc,, +jinja2/__pycache__/utils.cpython-310.pyc,, +jinja2/__pycache__/visitor.cpython-310.pyc,, +jinja2/_identifier.py,sha256=_zYctNKzRqlk_murTNlzrju1FFJL7Va_Ijqqd7ii2lU,1958 +jinja2/async_utils.py,sha256=vK-PdsuorOMnWSnEkT3iUJRIkTnYgO2T6MnGxDgHI5o,2834 +jinja2/bccache.py,sha256=gh0qs9rulnXo0PhX5jTJy2UHzI8wFnQ63o_vw7nhzRg,14061 +jinja2/compiler.py,sha256=9RpCQl5X88BHllJiPsHPh295Hh0uApvwFJNQuutULeM,74131 +jinja2/constants.py,sha256=GMoFydBF_kdpaRKPoM5cl5MviquVRLVyZtfp5-16jg0,1433 +jinja2/debug.py,sha256=CnHqCDHd-BVGvti_8ZsTolnXNhA3ECsY-6n_2pwU8Hw,6297 +jinja2/defaults.py,sha256=boBcSw78h-lp20YbaXSJsqkAI2uN_mD_TtCydpeq5wU,1267 +jinja2/environment.py,sha256=9nhrP7Ch-NbGX00wvyr4yy-uhNHq2OCc60ggGrni_fk,61513 +jinja2/exceptions.py,sha256=ioHeHrWwCWNaXX1inHmHVblvc4haO7AXsjCp3GfWvx0,5071 +jinja2/ext.py,sha256=5PF5eHfh8mXAIxXHHRB2xXbXohi8pE3nHSOxa66uS7E,31875 +jinja2/filters.py,sha256=PQ_Egd9n9jSgtnGQYyF4K5j2nYwhUIulhPnyimkdr-k,55212 +jinja2/idtracking.py,sha256=-ll5lIp73pML3ErUYiIJj7tdmWxcH_IlDv3yA_hiZYo,10555 +jinja2/lexer.py,sha256=LYiYio6br-Tep9nPcupWXsPEtjluw3p1mU-lNBVRUfk,29786 +jinja2/loaders.py,sha256=wIrnxjvcbqh5VwW28NSkfotiDq8qNCxIOSFbGUiSLB4,24055 +jinja2/meta.py,sha256=OTDPkaFvU2Hgvx-6akz7154F8BIWaRmvJcBFvwopHww,4397 +jinja2/nativetypes.py,sha256=7GIGALVJgdyL80oZJdQUaUfwSt5q2lSSZbXt0dNf_M4,4210 +jinja2/nodes.py,sha256=m1Duzcr6qhZI8JQ6VyJgUNinjAf5bQzijSmDnMsvUx8,34579 +jinja2/optimizer.py,sha256=rJnCRlQ7pZsEEmMhsQDgC_pKyDHxP5TPS6zVPGsgcu8,1651 +jinja2/parser.py,sha256=lLOFy3sEmHc5IaEHRiH1sQVnId2moUQzhyeJZTtdY30,40383 +jinja2/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +jinja2/runtime.py,sha256=gDk-GvdriJXqgsGbHgrcKTP0Yp6zPXzhzrIpCFH3jAU,34249 +jinja2/sandbox.py,sha256=Mw2aitlY2I8la7FYhcX2YG9BtUYcLnD0Gh3d29cDWrY,15009 +jinja2/tests.py,sha256=VLsBhVFnWg-PxSBz1MhRnNWgP1ovXk3neO1FLQMeC9Q,5926 +jinja2/utils.py,sha256=rRp3o9e7ZKS4fyrWRbELyLcpuGVTFcnooaOa1qx_FIk,24129 +jinja2/visitor.py,sha256=EcnL1PIwf_4RVCOMxsRNuR8AXHbS1qfAdMOE2ngKJz4,3557 diff --git a/.venv/lib/python3.10/site-packages/jinja2-3.1.6.dist-info/REQUESTED b/.venv/lib/python3.10/site-packages/jinja2-3.1.6.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/.venv/lib/python3.10/site-packages/jinja2-3.1.6.dist-info/WHEEL b/.venv/lib/python3.10/site-packages/jinja2-3.1.6.dist-info/WHEEL new file mode 100644 index 0000000..23d2d7e --- /dev/null +++ b/.venv/lib/python3.10/site-packages/jinja2-3.1.6.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: flit 3.11.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/.venv/lib/python3.10/site-packages/jinja2-3.1.6.dist-info/entry_points.txt b/.venv/lib/python3.10/site-packages/jinja2-3.1.6.dist-info/entry_points.txt new file mode 100644 index 0000000..abc3eae --- /dev/null +++ b/.venv/lib/python3.10/site-packages/jinja2-3.1.6.dist-info/entry_points.txt @@ -0,0 +1,3 @@ +[babel.extractors] +jinja2=jinja2.ext:babel_extract[i18n] + diff --git a/.venv/lib/python3.10/site-packages/jinja2-3.1.6.dist-info/licenses/LICENSE.txt b/.venv/lib/python3.10/site-packages/jinja2-3.1.6.dist-info/licenses/LICENSE.txt new file mode 100644 index 0000000..c37cae4 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/jinja2-3.1.6.dist-info/licenses/LICENSE.txt @@ -0,0 +1,28 @@ +Copyright 2007 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/.venv/lib/python3.10/site-packages/jinja2/__init__.py b/.venv/lib/python3.10/site-packages/jinja2/__init__.py new file mode 100644 index 0000000..1a423a3 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/jinja2/__init__.py @@ -0,0 +1,38 @@ +"""Jinja is a template engine written in pure Python. It provides a +non-XML syntax that supports inline expressions and an optional +sandboxed environment. +""" + +from .bccache import BytecodeCache as BytecodeCache +from .bccache import FileSystemBytecodeCache as FileSystemBytecodeCache +from .bccache import MemcachedBytecodeCache as MemcachedBytecodeCache +from .environment import Environment as Environment +from .environment import Template as Template +from .exceptions import TemplateAssertionError as TemplateAssertionError +from .exceptions import TemplateError as TemplateError +from .exceptions import TemplateNotFound as TemplateNotFound +from .exceptions import TemplateRuntimeError as TemplateRuntimeError +from .exceptions import TemplatesNotFound as TemplatesNotFound +from .exceptions import TemplateSyntaxError as TemplateSyntaxError +from .exceptions import UndefinedError as UndefinedError +from .loaders import BaseLoader as BaseLoader +from .loaders import ChoiceLoader as ChoiceLoader +from .loaders import DictLoader as DictLoader +from .loaders import FileSystemLoader as FileSystemLoader +from .loaders import FunctionLoader as FunctionLoader +from .loaders import ModuleLoader as ModuleLoader +from .loaders import PackageLoader as PackageLoader +from .loaders import PrefixLoader as PrefixLoader +from .runtime import ChainableUndefined as ChainableUndefined +from .runtime import DebugUndefined as DebugUndefined +from .runtime import make_logging_undefined as make_logging_undefined +from .runtime import StrictUndefined as StrictUndefined +from .runtime import Undefined as Undefined +from .utils import clear_caches as clear_caches +from .utils import is_undefined as is_undefined +from .utils import pass_context as pass_context +from .utils import pass_environment as pass_environment +from .utils import pass_eval_context as pass_eval_context +from .utils import select_autoescape as select_autoescape + +__version__ = "3.1.6" diff --git a/.venv/lib/python3.10/site-packages/jinja2/__pycache__/__init__.cpython-310.pyc b/.venv/lib/python3.10/site-packages/jinja2/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8e234bebb1999b9f2bc160b8a6c13bc3acd9a045 GIT binary patch literal 1599 zcmbW1%Wm676ox5TvLuSS%aZS=?WBbl5t|n1swi4JG0-A5j5q;`*$@;tk;Wlsh?$`x zWz}ULp|8-_=woQxRbL^io--~bHOrFVk8l1tbLE*4jfQQ()BE%%`>kSGe_>(sDMH}~ z_|&fj%Ze;wMTMvs7m^|=7Ld1qx5$>^5^#x>4430_vQ4%PZv$6I#c(CACN)wsTm`m? zZMX(pCw0R%utOZfb>IeR72Yf`14DSOUlVigN z@k!zm*YF|mDLFNK1bjx$3?BoZlXJr-z)#2%!!Gbs@)Y=#d=Z`9TNmdafB%{BhrngZ z4O~r=G!8U%DW5P--4Bv!O}Wdsn`V-_cMClgeB}P5-BgMhizu|Rx!})!xq0QP1=qpc z)zd(`Doax#wSuNG_C)8Yq)IWtp#_iNb49A57{s;$V=U%0f?;P&3Z77|NA};4AJ#=- z*|=P28j6Ts1>ux}F}!9myEubqU@pUgDlILX0eh7XdI#(p&X-} zptvB*y6?}Z#G~f>e^~MYD^Nb&dQ*{5k47FG-Urwo<*97^PRza03|8#LZ0x1xgu_;S wU%t>>Jp@6Ic2Bt|KDoyAC39FHUIzs literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/jinja2/__pycache__/_identifier.cpython-310.pyc b/.venv/lib/python3.10/site-packages/jinja2/__pycache__/_identifier.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cbcf95af729cd977f867f3a5a3895080c9a60eda GIT binary patch literal 2074 zcmYk7%WvD*6~^VH#RLUrRiOXFptw;Vi*Aade?ftwyJ?Fe6Kgt76Wg$zX=g`K)FYNT z7VSi`Y)hg=y-13tBvKDslmyJW?P3=3B%V&rl~=tR5t!X<+K*jT!0(>#p7ZhEb9p6b z>;3nC5X0w(-+i&sdM_5cizfg7xsS=O!S0VRtjE^Zp2j|mC1U#8`n`*_5AUt7{Vw*w z{ePnt`_1!TV1eKN;jdqe|1PnAxc|(4nPOjNUu*33?DgU%c_ZH_H|d+~R|WRf>6<)z zQ+w09EwbD5+ZwxV+_rB!w-&o~zSh3(v48D<(_-KB-r4M(_ijddk&#{|{S3h%y@}8! z-9&KcqRi;xjErMO#swJ$qehAv*9ZYM=8T$$)YK44)T~p}pjMJmD@CnmD(k0*Qsq#drloVJ1Ob})Pd8K$;^_OBNI+jB~v4_M`oYQAz5%*DY62x;Iz|Z zXAxeI4Xdq^T_@Wh8$HcZPiQ8%D2ypBRnmYf_pusSL^MRH2y)X6dEQl?8-T$$Vq zLXO;h1eM$p^(00;g?cFW73!nh&ru)czDoU9)Gt!MPJM$0*lduZK|ljoJ%v12y&QS4 zdMbIZ$SaapC(j@sOZqADr{o9Z!#z}J2=_2YL%4@34NEkv)6k%iOrsQy_i22{X#A4K zMH-(#)o47Ru}70WO?*a^Yr4XFxcZ!~`*e-O^%Y%D={lfkj?q-5;DmxQ1w#tP6kJg- zr(i*|KBKup^9;?iG*>Yx(HwU?4``9$lFhg@=gA`D$udt?5p*VDY7 z;dPTYbjBMtZ}bqRyi;PlbH>eAjGI+%qGkr%TyP6zYsR}0<6VV!v6`cB2Ms$OzeMs< z=9d=;4tHCOyB_Z~81Id_S76*b;@(Sy4)+}Hp*PRx-WcJEkMZajVT!O=N{eMuS|(pE zQw6q6oi9@t%TyDpw^UA+%H`5?+0yGThl}M{XUp;8PO{jY zv1Y8%X-?urSL&%nG3eID0_@mi!MZQ2%-~}&`;?cR6^|} zvXqfHwINQ?*Lelv+zvH8>Qu*BqZg`m_Ca)-&J~zO0tYbBovC4Bo`ssV4`G!1VZ}nlIzz&$fs07EVKw^RRHY2aMdAd&Qb$p|~)wAv&fBeDyxA%4uZ{K^o^=y0NDa7`py}iWFrWxD$ zKK@((H+=Wo_$OP>67j@(e0yi>N#gO|ZhZIoM;~wfE&lM+#O9~*ryC!|w?EtaWNY*1 z4}bcT`0mDDf^9!~{Fg_6PVB~?Y-~Px^t1S%Hr5lHdmA5bBz7KdfA;plFQ09#KYyC| V)f#r$eSqOX?0fg`tv&e9e*xR8_16FZ literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/jinja2/__pycache__/async_utils.cpython-310.pyc b/.venv/lib/python3.10/site-packages/jinja2/__pycache__/async_utils.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..770776df18ff4931f6743298a00f7d34298901e5 GIT binary patch literal 3451 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 E7i)zvbpQYW literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/jinja2/__pycache__/compiler.cpython-310.pyc b/.venv/lib/python3.10/site-packages/jinja2/__pycache__/compiler.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..51b1bf3eff41e003887eaedc9dc2eba2240242ba GIT binary patch literal 55245 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 CrY=<~gMV1dLiXj%w~%_uU`Rpllg+3`rxN8t!u zgJaB=Tg-~jSuI2=({@BU>_2`xqP%=L9e6(Z@VEZ?(c$oq4gUY!F!+|Q-6EF5Z-?dP z{_yIB{|aaCeBccuHJ_bdcy-klG@qT9EH)YSarkuA(w$Exau?^}bMx#x0R;NhX9;fJ!a+6571G<&?pzjSah#55R5upV6?AwCMzEhSHq~ zXRNVNaD>XpG*SMhoK3)o;3Zcd;!~hG(NS!3xs_j8!VgE>A@A0x0!iSa4mO zrd8^qK-A0|WbNiaHP2FaU9D)kwvncX(Ry(a=ozNbz>L0BVR@ufHWVBvbv1P!poElC zQDrW*lN4elO_AQfJ$VU$GUJ^6E^$ddN*kU{C3?hUx0T6{YKo3Ps!Ij8t}&4=kt{y*$!ZR?;k2%K~McF9=G3h%T2r@r{(8uv-Uu9>(@Ai8pd^WzphF z4T{LVid%gphg$cqvM`ny8Av0~w6ep#*A%YZdSQWu#b~$zVTH=QWiYz%2d1vF8+nWy zXMjM(&X>BidTDzuA}Qrrt0o9oYoUtkh?{~6qY`{StB=;dCT!pJQZl8Rs?z<#06?qB z(JR54KkLqSz0# zp>#9gg|kMVb~=h}^(z~l*riUUh}>yPT?WL$1n94ZvC_fRxr$gnDtDB#GNn+eAsdn3 zf%9}V6dZ$6xzXL`s}gvVi|yWHMEk(Bu^lUw{Ur1ZH_2_BDnV|ZmYUE~Dc)A%=qtx@ z8*v?-vivuo=eE-YqcfY=Q``!Ithx&qBb{8Ms94{rwQI;c>dVslh zY-2u^KaO{#-i{ocQ+chALhe9-*hzc|`OXve(WtxxZ7zveC( OQNFP&y;-8$n|}ejb}v2v literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/jinja2/__pycache__/debug.cpython-310.pyc b/.venv/lib/python3.10/site-packages/jinja2/__pycache__/debug.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9f2c32dc95582bb9a970cd432ab7655be5716d26 GIT binary patch literal 3991 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 L(^%_2+dum+b<%aN literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/jinja2/__pycache__/defaults.cpython-310.pyc b/.venv/lib/python3.10/site-packages/jinja2/__pycache__/defaults.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..05d14939f52784fd8654551d57a3c19a3ddde0a4 GIT binary patch literal 1335 zcmY*Z%W~T`6eTH%dRuSDPEt3m>+xu&6`gj|MW$0lrc=c-tx9szvgvRb0g@^6H2{=E z%=l081O1JD2DV*!-A%@;UeIEr5QB?@gEJQw7Z(i5<$?rXrGAk%=R#CyMp`uwwC9{FbW)p3hEhL-UpuC57b|t)vDo-E^^Zo`?1*T>` zfc_BG%`Z>`RLz*%!(ZY@xPbGxh)byTK{dZZ+vpyWq3uB5Mca;yYUuulocT3)+{Zg$ zznLlVP7lORW2yb{22L*-H!|3^%(Ex`!9*X80cIxpcp`w>TTNX|05#{>$HZpXasz@r z%L(by6N=}70}FuihV5Y*+EW}U?++s7;2OsFk#a4@{Ycrr=B+{B(5>;LJJHW{V`2?Q z`bqyc-iYbm`Pl|}!sSA=$8cxhFxc1qBB-RPf`9Tnh!`);c5j;-=!mKO2qU~H%p9Ws& zKn6NCojQ(18Hox@;yMxT5bQ?fHD)%MV-_{nQ~Zt*+oID;3>k?kj4b^rq^{#){MKGY zjRg(-4qAF4wPvuyoWPH28|2kn@JFL6_~|&0fAl+yIG%?QuO90s-HQQa?tIYi_4RT4 zfU9g3I{uu?jAv(#3)!M1B~DUF#OsUY8HOpN1YU&1%gJJV)jYFgj!TKi08xd>3X_YK zli!EB)%!*7o%W4qymq&p1+ihDLgbVy4DgX*Hcmwg4U_753R|l+lRV(X07Xslwpl*2|+E%o6$Yf$HQ(VGLo!45pVwZvcL+A04Mxofh zgC}%l&oR{&j=!+K*ASlBOPA43xZ=4dUVxS^{z*Jq`W#F_Dk&v7X{wTw)2Xzaw7Oi6 WaS5!FQRJklw@NX=imU>^_whfVV13U3 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/jinja2/__pycache__/environment.cpython-310.pyc b/.venv/lib/python3.10/site-packages/jinja2/__pycache__/environment.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..660c83f7cd97026d96adb8bf8f62673549b61ceb GIT binary patch literal 53443 zcmeIbdyrgLdLPz(`*u%H&wB=MkU$fB42A>-B*5no009C60wgfR0z-1yB)6w$?j4{9 zJ>A25djL$cXO~=1TCQcTcD1WS-qqTGY9*N|M~Uq!m!mk5wN6E4SFBi8?4+)$ls^)s zL`$+|QHr%#lF0A(opbJ^XFzgytxBchA^YImd(S=hJihat?|mA5eT5YMMs9w;dg@P8 zssDo)@xMGSj^OA2S|*ipQl*rWcC1>ul$L+3lBNI6$iH^U#=n_bb}?7VrCHXlbuH#g zdC6yy?=E#qK8JjvRFHgEt!J^f)GPUXt#7fv)Q^0(Q>YCr4weQb-%}e}94-w@z8CqC z(um~yY8w_emNrVhANftCO_Co#esgKF_A~wn}~&`E8|bk{>~SduhAm zHz0pU=?=+nME=gwos!>#{EpHN$!|t}XKAP8w;*3E6(zqF`MXMYNq!shyGpwxza9Cz zOLt5D4&?7C-6Q!sYxgeRSGrH~JCGkOjY@te^1DmBC0|5-tTZP1yO6)Xbid?x)gD;f zQ`#f>yOG~p+AH~ckRLCNOa9*4;Nrg0KFQx#dvNig(nFFTt?getP&y#_-N-*&dRX#f z$UjngMDq979$kE_^qAxyK>qR4!CmicNQMsa9#?cBSqVn-|@xSM-+a&FZ2ncjg+4OVyfN`6=^%gXVx?L?Q&~d3yXGyI=PGj-U0if6RlH`kQbRW9xz6$&Z|09R z9CvzUiTT`_ig#&w>HRcn!ezFOM?NxrEc1+8cfCrp;qj#l>Vhu~K7IQ6W6zZ*r;eA; zPoFzA^$hL}t9$3CkDi;3-97gFnKP49)5)?M%-xRC1IH&%9DU*Rbos=o)6B_jTV-tCSSt8 ze0zldmQ54Ro|`;z>hmlwx6z{MNojHTpzkz0dA2MaWX*%RuJZZG&%H1?B~9uSy6ecD_W&Lj+-AAvUUfOC+0#1HGu^o4*3UORx3Y-)J(HI!wPTHX z)4kfnW$tXn^W}xE=w?sdy;7bF%XEid!VCHGSpfM_?*d;&nYjw9=|aw5UL*wdRTq~U zUbE~sJ%B%M^j7gPuU@Im0q)*I4X4k&aLfSlV%7ImvA(BQnl6i&XWf%mn{M65dO#(G zrz^gDx>0dlFDR7V`sMO0#}eJCU#@zM`l4HBJF;^3eeSZj>RPN^^{Xv6$jsIJz^-@~ ze6E$|vR9wusxW`pY*Q9~&*0||BWb7F>93_$vE8<H~r!g5gM>oBl#(IV;TdT^DkC_d&V-}1V+t!5=oFjquxt-Pa%KvbNenf z7TtZWvv0|3ETCWhK7V<3zHxQm_+=E^SF6tMTUu#eY}5~oKlI=}G{D`vRGGU}x#0Ty z7OM4y%Km-vJ}#{U+X>{cktZyekw1=a`Z*-|?p)eVdq>$Gn-I_%zT#FcdG7o;ey=pg zkJeXS3-V@RC4hl|L0~wBpI=1M24!{0@^ZxTl23WP)ztY^6Ia*L0F6xRehn9xv7+E- zJ>J|1c<(|L-7T^q;~wju^7bJeOM6e_9~ml@9KmJKtENaH`g6GB6P)w5oz7eQdF*D8 zmG9iX<@ccwTf3Y>%h5{J+9t32rS(=jwUCkaTdm#41o{A9MF3=Tr8w7ES}8W>V~v;3 zjZcl)f!)OZ64*|4uIW93VCa) znQfz|H>}l6JHt6^TkXt3?qKS5TP^L@GBJyEHu`dL-fJw%y&6`VY}K<>?BLZVmjh=t z)?~Gw6ck{i$10v{a{Q`w9~c7LG?#W%w<<1u8|w-RRiHqYn**i-+6>aoz@Dr4NV%1J zd(lZ0a=)pX8DC@0a@45UrrN-@U!hyCUq&}Z9_hLDdX?NbBoW@ zDU-vKoRhhn@^|A7s7AhvwUce#f7bP|P8Kn0ex(j5DuTY5yHsot?Ij1f^~fl2zS{Ig zi;K&cmRS%{Mc@>L-!S5%3T=#sd)DZ9>)>pyF?VTC@p8qhR%StKkrD&lMI2YezC4tBN+%TeHjs5pjS zw#HE=xB2<%g|dwK7g5l^2Z?3n(z#ofWq)iF?cB1h+{acX|B;okKkBtD+y2nbdS5`n zIs6iT#A`?J^ZzICvTh2TYpP_u0B9*?91HxaRmwVJJVfh}@(f@9ej<~F%SXET0VoUP6_ z{JR}b?!s@EyAx@jb4SQ^+=-_}6y5D`k+2ih+x5&{7ueul4T?^xC?#SI@ zZ1#b_<#5;#(`pJ1`OOLvb@e9to&Kb0x`Sq}JT+f%KJUDY zw~lmM&ezZv^lsgLmt?MYqWmk)t0;d|`aLC3_B3GZHRlWHcv>*5xj7eIx!H7*u3c&XRmFGvDvL?s)j(DSi>~`q^sdYI>I6M~i)@iT9s# zzA0m?;Czp>3`~95xq>IBovWDL6`A3kDBp74zzm;pACr~c)~y2sAZM_|9;X{6SDh~k zK6^e~O&asyDWPCR-en(eUrXNklJllO!r8EvxA5NQ@WcM1YWmD|ec8Dtb)5_AdfU{4 zf1fpZHO5?fpRtWU<@~hNdtT2%C%muUzXHBTNa%AwDd1ZiwY>8c=N*jtwDVQ{v}0s( zH+BcJ^w*r9!F;^nWI(BY%X<`bP33zdsnj&+(z%Am1hS4gsYpj1gt?(vCtuH>KAL(ORSk>*)oIxV9ECs=c_fyQ2afRCi+c( zk5qA?)|jo-lvuHWZ+bqzqZtWbac^jiqKp?SE2Nbd8z5|};6y5A_ zB#x`|xD$#li&rXW7KJZP(Qg#zE1qIt&PZ*L08wU1f<49&p15y1TP)it%hhp1^4-FF~ADy_)RYsd+7L;z9;T6fE5_6ROE3%S^=T)1nj69i9S65Ql)bDEca)P@r45|jCm-x&o}WfmwG zNL4Ca>VSq&CZ?n&f&m3^fVyvk3)i-_Q%;c_S3$d4vVxJUXbBA(MWH)ChS4~qWj|Wr z0xSRt%gl`07&)!{YlFFm#@ms^!)ka=ZpS|k41v_u)SHJ z=B-F0gDDfOaj&wC#OkO5vxiBPJ~Wn_OUq3?x$e~p+6IX&Ha>m~G&i<_W}>2*nJGL5 z4gnxx{Z^@&17!qkXH+E$ii&_YH{Qp}as+1V-wO zD+J0)aelczN4_V9xP(LUl0Z$o8+Kk5P>NrUWsF^lHE%{#ZDnc;*Ve_mgnObHrIITa zp+GUcRC9!?XJ#IL@IipB!tRT1Mf08PJO9+8o>vGC7xf~_hb;y00O~Zy$4}{&3;8$) zs-d13D8iYPa-p;Wewf1!fpww~hFSmMO=Ha#WhmiVErvvOGc#=io#;R2(=SPgILy(_xh|D`b+Z zbt-SQ%A6xA1XBg$ccu8qgR##DV3j?W1Dl-X^U#><@m5TCY$T*M=(04&jjbQkBx9jR zInhMFvFwqoBk!*|Qrum2Cn!w7x)G9vd!JKjR!H}g$~>jS0vrVX%_N!$BxvR$lRN23wsY3;$z)MC<(1CxPsvqt?@u`~ChAB#got&)*orC<<<TB;OQ4c<$Zt{Gpy=rro1$zc&11zQy0 z8ZFBYFV84^Tdw#k^|{*(P!r4% z8ZUT{{yb_-eD(O+g z@O!WD_K2ZIpkpwm5IdwDF)2ZG%Bh zEn4qkmMKJgRnWsi8l?sO27=V0@%FQHZyZeKHshB0V?Ki)$KL-wk~Yi(XnBP+O{0yn z)wYpl+F7J_JBKve?n0Vt=aF``yOHMG1*F~W9;AhKFVdd&0Mg!eKhnPTAkzN!5YmC> z;Ps&!FlZ!#k_6UqcQsu4fjYzk(Hz3{KyhE3|v$+FyVtv=x z#+~g=NQ=$8XkG%7T9`Jxm!2BiCBWi2=#apN=Q2ll@aCCZU~-X3mB|7VPNqj24VeXR zk-0jP29rS~Fb;u1P0*!yA2*eH=lRKlND^j7G&#!R zClI*>85ppnuEYF=wt*L5VswM^O!F_R_3BZ_Ar^`lznJhlM&ya)TUmF-Nsfrzh(u72 zgxGHi)^*C#XL$)*wJVb~W_fM2NwvLWxcX2_WbQ+IGoPK=l5K5`_dihzE4&E=GrJ5Z znxlo9`J=TJhk-5d_aJGfucvOLU~M(swNgln>IlsGBmKPx|T`9vPuulA7W@^ zZw6+9fCRe|$rWSnWGLDA7@57wX~<3`wvORothi*}rn!mWe<3huSM;70an;3xS3D>H z>K786Hb3q`cn|8s3o9hcISY$JwTUFOE{2i40$~Cv+*wd|q6MhdK~_}7UMmu^V48xg zbTa4yZ^PjXxQu2-7cl;Ltj+``-H!J{xcx(1G*d8$16Eqy+}`Y@52cV=l4c~e52a`-MD4Xm zEeqM}z^)5ff$wa43vg=+X}-Prdbdn`KPGbCZ_W??z)J=*MPZ)tCBZbWMc??N9iDXyxl3pjaUK-bo5YP&wz-f{zF76#f|VVd`RyH9GW^3L^K za|mAnu4Sv*o8-w7aPAi3@AeikW6V_+u!R^)MzPR^SkPQ`4oY91(Xn#X1ZswMWMOI_=_=m8p}zMOI#*PHJCIj zUj&!~qYkeU;WiLhVJl>`g(+7f4gNs!;};?CgCfF0|3gtQ|b5k}185#k0x4K^uG@_-G+FpDG@ZG#3`nRU^B5$5)a@d>)hlx>&GL3deE)W~9Ar=4uM?9uQL^rwO$*YV1@ z_TFOh5R+?6A~J>s!)i;kX_2d_mp6EmCW&L)Rl`W8|G1Rbk500P>AU4!_TJ`ae~L-R zw%nz=_hn-D`%$3qz?O8c)h{HK3g3xhYPhy+q zmd#CGs1VFM9P90rlX(}m!62OM*4QcXEA)+$g-VEyAuR0dPy{!y)vk=M`3QSV z%1!M3@c~?T%eaPDLf*XfUOGr$?VN}F!CGZ;)~Ou+7p7OaRBLa%S7f3h0?Hphs9^ap zGU`nj)^eI@3(vA}gMh;ez*doIO8)JA9VI%yJvqz)CEnEv(R9xRqG9tjwU!4O`YEivg z#J^vO#g#TBs=)h2^l>cf{SyB1{w9;Z#pF5@vV&l5gfx~(`DNZsVjy|(4>%PY@X)fu zDS+n!k)(BN&G5^lewS4V8Wzl)yL3gozv!n%QBRO}u}sTz&8tB-I9|m`&k=E&zkX!G zi7KH1?Jf_JhK1B>-bt@^*CB^kNF#5pcDM7_;eZ0_xzH{+DLB|X?_}ED-+`M$JN+HY z$$mGx+Jj}6mSy)`s~ap-_68>JrBt)4-9uLhEWX^zv+2|-+_GCk?H;_FYxg4U`mVj& z^AZ-DgJ)mtHRaXS6)Zq=r)^!pQpMNP-b?LFJ?-Rw2@AVz%bl6FT~EVJ#%|`Xcee{@ zX&y2JRV|>pf0SJA1=Qr|P3pz8B@c)6PlxZ^?UU z@9XXCLf>kxZj;IfGRf)pa`Ik}yf=XNensC;@jm1<8E^vj_tIbEM$kJI5yw+w0!OVK zN1Is6OCoP>fbF~tU&ta>a&t zq~7B&5`}gG@C^rXmoAPlW`tP?JfZ;Tl`9p|#iJ!?THSTQ0>nBKu_KV{Xl>?W;Wws1 z-u*+2>3dzD1-g{@~s+ASdUiTkm`r_Q=gW&{{-e5FBS_!gmBj!2;^NaAt-IBdi?|wegkm$-s5O`*qBz_un$<0G)0D z2@c<(5O6jM;A~t2I4ngc7X#QkriR)kx zHVRJ71z)C#`}ed^m8Ct|E`Ni$4hYOj6)zI{NX=OTq}+vUOfa%iY7MMq@rJ3vahFa0M^FRt;bIpJuPeCh#9S9D4d>=x@Xi<(?$$4;}GD}L)-fwnEVqa$%cEs ziF*rdHh!sLJ1GEG1GA>R;o3NecgR+N9!rDX1f@y}m2D4KNoECMcJwL%ow{a~{5n<% zLP*FO(eCT(t`y9%2_=HEuoPRVx-}=OIuV(Q70G21=kA5sgA2$|Fr{wDyKtkkLk+68RyliQmxN zSoEoxBKfmMY!!L`7!WW8zKa~O_YEYV5;?*YK*)mfzRxG?Kwgl6RA-5hM<4P0fQ99v zm&`yMX`|E{0OW$n;OFl^(oB6N^_4VyFDdmQqQ;_ujtD?`js7&5*8h1n988Qdd!|i4 zL=sQIZ#c8G$29nlYUWVd9S#h48jPff(($HQj+|$;=(sr5F!>^QxF1s9`=z`dPjo0U zU6^&nB9^TJUgZ2N`^)$Qq9W9hg!7I40k=)V)eysgGs0)3v#Nxzf2 zfiW=xtU@%kV^)y%y?=nB5R3?d6I3V2;t1|~Kab?=22b>-TD#+O6xFki5G&(xy1c)^ zM8G5hhJVU?N0|H;lAmJrf;|hpBCWJPYHeEoGeK6Y8Rl5C`6Fc?25g|nBfe*^QaBi5 zr?!2=UIk}OVIfqE!{8=!*FpV*W6dInL$;ZNqVYb6rLuyDGppIxH?*^YiGS{x0ssgN zWgSXb8xqdYBg%~s)(8j$3$@U26~d4K9+pplUKH3Nw3rl2-u>eM8rK`2=F&PZA$DQ{ z^06)%KDGSv1~z2CgFf|jIs+jtk76(H!Pwv(k%x5bYX1z6KpaV7L|B1BCb?ZetZwT6 zdCt}#%J&zraKVceAXA18(P|}VuCRPifCU!>o>b5z=8bb0?kMEQL{LSW402?cHS8HV za%8P`xC>sSEwpR{8d+1WtJPwd3wg}w7&^Fu**hXdi&~-BBtC_=iPS9EN&f{JCl&_C zQxvN5*>y)!%B~qay@$E~g&91n*8*#+{Bg2rv1`-@)g+{|%W$--zMDl|q>jB!s!v z7^h!?(G0aI7fVGnm|#6f1Z6E{9qU~icWiHGJ53%2a=bJoX7@T7Nbpj?e~`u9Fyi6t z3PS#Ax((RTu{C!CIU2Z|Y~|b7e~+n&E5c)jq&9g2!*UqoO5B$%73?6{tQg}Lx7Z{i zq`8+e+tyS}SeH`nLMlPa*M$ZMIY$}jg>b5ORz3sC+Pnz;CuJA3HHtkauc_?hr6-9`7$?7q_Ha>_4eBFNi}^7a<5tlu8aV(v^K*vZ)Q!eqifi$e zYUE%OwmhtB5pK;Oio_fTJgo$Kg91M?6PSs%7*T_^i7U0|`+R!ILr{;%2yyk#w9{B2DeIuhoy2n%H+Ae0S_gMA&g zMzrvOLUO=PHSLvsA+F1#wyeT+R6I7j7Yfa8Xee?{*A3W)I(eu2-OL5hiNKh>c-ja3 z1nMV#YgZHZJIwliS1&^!_Cgb+-w-0Ts%Agqdl4+u8(cM0)Ctp+L(&S=9M<@PiOUv^>3S&hq40$u zZ`KD;BH5ePrn!sDb$C*W$yhX+Q-U8oGLGaf;mhZd)&eP;Q?jG60THDIgCb~)0gm_2 z`A)`d_)3J>HKz>vyx-^j0gQA!5}Fc-Pz4p_jsoy5)B}48n{Ch|T0HPxU=_tV!23OZ zKhCHH@|JwxBc;8BbhhEF1bMTlI{7ua1CY3mH8%^qB*?jchb5{s3n&??wM=h%5PI%y znGI02wRXfA@3oZ#d2F>5E;~UEk>sGdYz;R2@v|VlP9v_!E9k~+=#hjIDJx}RtGX2Q z)*2V&Qp_g$(0PorQfm4MT@EFoWUOc#w2QXyqgY!YZv&q?XBfC0?&1@$&v!Rv03kClW6#OIY zod4Y~bF?;#l7CBk=sT(JA|@g?J}4?Ot3zKLdi@RcFO~f5uIt12N_w>)&JO+U!E02Z zXPvF`_O^DvdHeM@UP`@VdB6Qm=K9DD^uLag^ZvEDx&j6PZ*3O`1#+Z!R1RPoPr!r@ zs7l+58hBOmIOCrMYz1c!XAkh8K&?Do4A(NHDY7!veTsNz6!1ytoB84lU`z-()-&O}wM3X}^HVJ3m4A|5H)B}L39-(-j(T8!Y;P=Q2d zGx6Ej0Ij!oMdZHOfO-)C3FOpiMn>|cyl(*~Dn}9uI?NyQ{LxskQ_S#9-s_NT{5#w` zi*>0a8|l`8^$@<9wU}{Y9E0E72m>0kcr`JHIS>IdBKN}DJt3B+IEH)b2!4JI3DCyS zJD}j9KZ5w4F|dI|D6K#cU7%R>r3pi{1^asT9msEQSP1rN{p=9K>%w;+eZ9-c+z=G{ z63W{6kG=tX>!Fmt?+VZy|9crf-W#*0s;ShUqyy{9Y+x@p=O2gFUmw>IV}_S$%@yS7 z&jJ1(+iC-5<$={eIByCR0-LghAS=&<9HOy;3xuKHZ=e(2pCf^VCZab4>G}8UpsQ3} zI>lHHf6S-SJX4kFOL!WU@qM9V^ zGia9H62i?Rp8aXWqCbx70r*^Hg!DIs9?G^a!evf(5_u$jpD9WX4gcqRZy>hu-((W->9&>&r=lO0wyH7^P_0Jcge5)A1vjF9$z!U-wV z-fgg$vU)Sa>7teIrm-Ubvj8>rt-%bX@%^|OOmBc_c@xPy{JQ}qU{&>DAy=?ArL7O_ z0a#VNY2Sjy>8;*O>&{PvwFDQ=b<7`HlkzVj0f_7$P@2gkVq)u zZ3Fowc7Gt=GETN>&)Z)~&8NvH%-#~ARy0E`-j}sA>;&Vw`$YyGoVZDZCT^}ynLf?dSXx(4fM@6+L9v-Vl#z0dI ziVBcza60^K^Gam>0b@19;MZ|$X5v%?hD_5O(Xeuv#WYkL+^|)#=743dh{zPURH%Cu z!-9U{$_3rg@geYy4sl0V9k+FL2tXyo0!kb#RG;$pQGGT7Nys4}6xNPFaCa^)FGba< z;nl(o4pD5^Rg+>SJ=DD$lP5yO9yD|UTlmCGXa_EYB?2hH(LGkzC-2}>-UnD7t%G{N zqw%JgLrs0#XxB4X+gNL&+ZcSop^} z!gg-K#RZ^?*Yc~-MN>!bVYB~+^*Tgm5rG0_v^D;q7~7z6f?vbN1%-ob0a4@O@1c!C zzHCXg#y?9NqgP?Fz|F+NnN-?T{0uJ1O*d-BfIr0UIMW6Ux-SjHMj77sj+iR0akQwr z9Nqu}RWVn!fQmQSd7x;hM7Q0(b*&y~kER+5rzOZG)F~+T82**YLmrrX8O9ABF5qg% z?AEs@jkS`<8zHZ_phb=b^&Oe0)1CxV-mKEXYA@0tG~3BjX4YR%L`)S(|3!X))b<76e~0hKs~l zgeY6pgMp24H-@ccj4s4CBDRl>C*&lgn=s&fU+*AnF)WJg*~rVIyNu7_FRV1yNs#)*0+dLQ;fn!RR(GhV_%^RK; zP15enP$aZreMA*1P60`Q#Cedp>o^Mpk`!CJM(|$FyRU68bm6(>jUz`V3FT;P^TZdp z{UfXdl(4DmJ-mM-gSSnclVS=1wZ=iXGXO@dsn%{p&egC)gOX072f-HIISIl$)~j&c z-$FNnE`2}^l8)b!1(7pkhHH z6fH{zu);-zoiY>`vf?^cZO~t4B_T2Uk2ov4@Ls{rgX5tsKea>FE%{~P0cCBn3ZP`| zbP|0gtC{1nHGj05!%t)0()0bV`#P;erW?4v9MulXYmKL%%tt&+?jy za4|(oYp4)?921*4QJi99JC*2I$ZYd?@g>G_WEKl6Y%y1sX&cU!GbhrJ{!;;*_7r#R z+hwF$Vr40qFt%1%h3^tYfrEr(h9?n0^6?Vnd5EYJtzO+!g@Y!FAXC-o>IQeYL zSA&KwhL~uO1SUUq5kW0UPkWV^)~<3HemqBdBGipN!*tV2V_T99I-yGjlC z8T!UqS5Go_X&~A}4YEohJF7y;sM{*si3qOU!T@q#28F` z2knJ_JKzF-31}?{e;u%L+N@vWNUDN6s`cIxu{PY1BS^;~R!Z4UbmZZLQP|obG32En zPT9Ex&kBVbk-5DTL73kEs|;`@Eh7s%C?Nu`Z?(3>NuGFNZyP?6K#SbW_%_?&zlkJ7 zi}Vq+D8g^2{Xy{K)T7fUFAdeh82tFK*@!pcoo(AfDM6uBk&FUuX0at%K%q7*zafvq z=0xiuRnCUTU^72&87rcfQ?Cz0n+{aVt#iz-{3Q`BBhYKEI^F~Ln9yYxnlKO$8dc%M zq*}AeFq)jH*y6hl%uGng+_vtubjm!XJ~@a80)P@}cO zio#U`!Ir4pWPggC?ZAlD5P{9}G)-L)0?_ zZ`9_0Ce$wl9D>gbz8Z%Fzf1RgYOGuBDq}$8-mfv)!6doKc$5fvMI?q!=dPd_CE0Ew z^ZsbhfvEyp6K*> z05VJOD;-V24iD-?B1U*ZbCK-S!>sUlI7@&qaY))jS>1ZO6szLS!!3vKD5XC$5RBzw zmUuFk_i=_~8WD9NBolB#czoVE$b?PYH!+?a-Fy(kDFj1*e?J|kp#o^_>LeJ}zLuaG zXh|LVQ{0aW%mG*^VQMo=;_XF)3$Rjrf}I_VFv79j5cah45t@CvgOSokuG%(OS-J?h zNym5zxfu?AlFf<@s@_CZ9TVDdP}fLdg)$saN~?$pU9$;mV)Flwv^>!)|MW;2=vU#A zCW_~@k2=NJOmk7ladHS$ zktQO6j0Is9h5J8`!e=1kke$Zx8whtT86rRM!Cu)iri76-z2!83m0S72=^4%0{G#ruZ%r>qf*wkNV!^=#jkOcYXCFD`177Ucj5@AruO%Pq}5DSsd z^k$fxW%41D2bhd9nPt+)q?gHdCfk?{FzIJPEsD31$yO$tnQ+;98<@yONmY%v6=N0T z&+8Lhg6s=*Mqq9GR{Scw&ZdzT|5Au2IFZ12je}JI(|F(Lp zzkoa3pId#_2V45BKeGm`f1e+;{&d5T_3w5JTmLpcV*QD=!TMusqxDDmP1e7$HW%LC zb$UY=-UBK6+5Y>hYKir}wWaWf)-$lUuyJfLq}Z^(xP=HcA8#A6`g+lO8@(Sy?>C_L zdGtPy-dpIs-Cg(()`V)k{R58EdL`|A;V-SNpRp8X#{Q5sF?^?XO0e62GuQM;RSh#6zvwsNIApDk^-NMaH8*LmTuUmW* z@X}F&^WXaeyZh72pq-ysPcQ1R?zeBTfAVAB9#mgOtAD`J@5e}BWWWla{x^d5B|(b zg*AK}eHAU;geM=GFZN4K7~hTjR=?H%@f;Ri;*S{b2!4JE8$Yu7Gi-P}T#YvYt^ zgb2ea)i(ZxjtFdIQ<$|y>3CSvWY94fsJQ>N%S zRrO)KoML#Q_FZ_&CtY%)_T5qg+KjWY_1K}_d*w~Gr(d4qTNoqhleFwU)G;dMcRRbC zF`WE)w|h_bfKzfZuI=3K-s{+S8k-NCtj#tj#>N?SQaF)!kF!@!A-&JNN8TRqc(b!6 zzLj_OISDW3?9(SI=llzlT zoC&<6POW|*`2=+;SjstvoWpo?&zk3ZG0Wo|N!0O_a|C7fbq{n8Vgz5osncqt6m$wS zV@96Fh#%8W9>m+xT#dQ|7?0!5Bxd2EAHNnk#r1^q3~Jf`6V`IlIfYsdxDNv!o|QHa zpa-M)g6+sj)i@#f5rLM@r)QigyoqzHomb_IYFO@<9(O+HJ^^TZ0&kyl&SR`5@O+fe z=uA5=$b3F2cXBv?I=67heF9}=^`XRz&P!6_Fy1KOn&(B^rKg+$a6hjJ=~8J}^jgzw zG(=QJHX_V|whS-^Aez`F5v@dX3=RUd6$FNwrjCgm#H~mLrKdoJM1EMi7UxqJ7$>B` z3m63+WOU*x=EArCO7xy6uENF|O_!YAYEH>IB?ofJX_B!6S&F(PG0sB=3sv_1j0-Jn zmS%ftjAbHo$QeP1{lds-qQ6ArK#eWWfojA#ikE2h(9jY*^oZ_o!W2awe9+XbH$sS{ z1y;%oIlRH3%%h*NF+Gu5#Jes&N>Q~EZCs{86b zaH3KeyY6V%5~KbK&%mO{ly-_V0;(>OAp&hVUWA!C3=WK2pmu^LWayzKyU2mmhIWQo z42ELe(dVE%iycqcr6}Z5kWfdg_FPfckL{ow&p%)|iMv*a7AinY_%Tj$~Y&rP1W|K_qizVay*{ z9P%|}7$hDdWD$@=h^szAk-(9(3tl+zD8ex#y$EkF^&e&LubN6Kf+5;cG=g3S;OQOYGM4uZZGbZ9%gP&i^x8*EEhN<3_icLe8OoUK<6dsK{E)JfH6sAUpu<`&4D6(|i0Z>*Khb?KndNJmmzur4WCyL4UR>vZ*aT!p3u%86w<+vHbHf#qi-6}e~ zNrZ4^dz}JM3zhN)U?S*}V7t`@%qo}bL9ZrG8hkl`H=9^_Q5KO~UTKRRE?!%=Jlq%w5vq3?EUAOvnzHUY^*wuEF#AH{9wE$Ti1 z%Rc?0#W078JVfh{Lv5xtEKrH?K~Cmv!Zku~-$?I=Q_d-b9zO}(qoKHK0(FduPP(N2%61@`y33;v|P4Cx9SlQA?y^5TK?sClK;^ zIQXnHk4iTrz!+0x8HXTQH2SnZeH1QQMi5q~;l{KI$?y{$;H!ftYhqLbu{!5$eNcW9 z0EQsV2);U7--*o9P1{*4l(=@$>#)HpjwTcC2DM9(z(ZQ(y4X(;0`2jrRjjt z${$EMsgrO7hY2hlFfxzAx+{uI1)5?L;V@nAfI@FGZr=^0_yNJmdUIQ6|I zNaS@v+l6S&^qyPBbS=7KPVy{j~MrYGLk9$LCnrs2qn-DC6bhK|lT!-UL zw!n6wH$$;(YvZ~N4ni*Cyu`mt3}XhJB+7(x`tsdO%W}rn=60W-_3v!W z2uKAJ1jeUEz!|J0dc=q4W$I8N6;ueHI-$`e_-r_HI06ba(0W&L8p{}`j@gP2o|qv$ z#pv6Bh9EN1`x<|RwcRGtt(cn79JjMMz@`#2ByRQ!p~ojv2}!KmxwR>76>yOFBm938 zKQReCF$3)(%1Y~L^WevZlu#NI`>i}fpn+bf{`vNkp zN6qROHxaoaJOj4{niWMiBE$pxsebc4}b-H zp5P1ft|Gh7%w7_fS3|=?q7o9IG07dkGX^r$?RV|7HE(TGPmx5 zYmCh4<~4JwAUm)xBPgxX#(xDBCHO}}10KTzpX7kv#}ES?V@@d&{{=?B#zQdD6)rj@ z_W(6UhXAun9aF@ge)yT38#ZB zhp^*B@qAZv9hh}+DIx)dOfvLkj>RryIEt_ulrZkb*geqrL}j5-8omUbynM$9av~OD zMxECcI-6*Y3Lq&DVlE!s8cZBQ>`(xK2;+hQ5Kt1FAy%2f43j}No&pyMZ(?1+`Rs%m zzFj8Na1~p9n*bxN4Iyk$Fs6qn0SI^@lDrUiU@41COe9~n9Jh+&y95ZxiN_gGMZ*hi z!x_-FdP=$hmnd_P7M#A}g~F{b<|{#2HqHG)_EL6U?BBwRg*$K@DyUGPB@qmrP**sG zSg+iUv5)d22u*>Bs`A)YIUi$j?pDtf(76W=B9ZjSfa_CG@dr zWXagU*eXqIm!Ck%conYI zbx4@6VagNQT-0tscR)|>s>L}m+&9a`IN|9zn_ z64sN3@8Q4x7mz5rz{?wn0m6G&a0uG<4tEdi96WMtOKR1EkLxbV3M9A(I0Xdquo%cg z$;P0Aw_t<0hb3;HP9FZdz#S)BAq@gdPTpUMlOj}It!r21MHfDMm|NN}V%3EJ2M#%$ zTosg+D!NmPJP(QX_94F@haiwb_EC*S{VHf*_`WF|Gk1hcS;zg-4oVkY;w1VxlD+_< zkQ(u&%hhPBVGB)PoMmxWgN%rbZ%nL!9-|!hHvG8H>g@(*nY?D>W2yia&`_-p5Qv)1 zuh9=zEG`-27UO5!0u?)iN8~#M;gU&;4MtQ=!?Yms2GwB=O=q-%G}ab;3H60_=w`%@ zI0$DzMhydICaLJwd>7k=hmdS+TP#*-c+f9A=%X2v5totGhbOO{u4s#G-FHTX`&A8u zL8|e%Os@8|{0f#(Y6QOzxI;peD}gK82wky&y>e^nn^EA3_tN5Ap*fi#eF--rG=2oH zBXR{Lu2d5p{$*kV93PZ|D~KVR$~5KI@TKv5jFkyr9m~hq3sRy%uZ9(RUi%^-4{XUU z5KmB`4n9Y?8)=ZwyMm#Xn3JZBtn=}25PyiAu@6VCA(#-&ndp$6L%fAgYW2DZ5-yx$2@gqGDHOkllgpd)G!L2An8DJcQr6hupQvn}fIbkSpALv6I<$*rd zVL8nddbP0Mi_F!T$OwdctoJ(Z{rzxiB3^Ty(OHAAqY27-6c8&-g$(v3UW#I)$y~?S zZ@q2pe}^+Lh%o~%fTKWdYX`=EkmDb*p|^cGv18%0;kmsZk%9)!5iGMTD!mtkN&!MbWShgBe) zX%bDx325Vyes%@qBmCDZE3Ow4zB0CKvv{azz;gHK8}}mg#GKav{n0>V+Iv?Y-j7?b z8BllcUEO~mCT!*VkfQ8vj;o$W0cS^1E^MNFMi&`Z6(e5o@+cw(hh>rhe`Wk4ig+yo z!cG^G8${Ki#93%Xl8b3?nNag}%vuLw5#&^Bf1Pk5L`i>4&ZnM95Zc6wB;CmE{1|>d zDN)4&UQ5I0xA#?RRa9E-^rf^n)V7p2@9SBIfl;iMcTRbS5c6uM8wSTM)|VG&L5qX+ zVeqKv2JkD2hGSzyFisTz9l(YXD{9}vW`s959ue|Z0c5NoPxE`6riOF4F&u_9`hB!N z=rhm<`457Kca!dvZ0C4wA&Qmr(0S}3Svx6KZ~QZkU;%XvBNzpZWT7a$%K#HZP3ymP z+a)H^dPpgWrwM2s(FdvpmuWpEn?2?lEOJ$x(2&;wmo*iD8^Ug5OpT-?+_c80rU4V= z$<~7j?=C#}U3Q1;U;%=le7dzM>`EfQ$C~yNGz2V)$gurhzu^fWlSRCt8vqhYx-SrQ z*saaP8>0Wkyv_3%cQKJ4PgHEE<@2ahBpVU{s+Z0;O$1Sa2YSYV==d6fiRDNgu3pL#Dh)q*c5&xV)~f$7ck!JFyg&GcbN5-2|i ztf~XuJkAgEPTJ4Ox5C9@yNOC7M8)4yc`47-a*&O5?YHaqcp|EeJjPfSQOr4-l z%RyETseNkfhoWNsMn1w&J94 zBB*D~X>`i6fucL_AQR#3h4Q+@%W*bd5cp+YPB6L3gb?kunQ+A_@$ez$2x#6{nM4y6 zktkfAOIWA=6iU!BV|X|Z{ck`1yC=O3X&#y`7~!vDG?lz(|1piw*K^9CTLPUj@*PeY zIC1ySw!kUFf>TBwP8l2El(9oQW!M`Fe`Gym<&={EYo%%Xus8|y-ozUSN2$#4mB~Ad z=lj;)+qQk%rfr*xIctjq0RkRID9ewn?QFUIAtc(;US)m{qj|bCtapFtHus0`NL$-& zae%N`Z$Bid16DUQ=ec5fxG;yIP5jZJ=LmkjgT$ELJLyuU+k%-ojk|3(>nIca+(O=k z2|P@DbB+ZQ70ljo)z3`==RtEhwSMy) z79@-&NGMUR(#gPrFgr?1QDEPYY7%QL<*KPR+@@wMWNQs~50D#?Bt&d=MfegP2Xhn> zPX@xF!bpKCSQY)VSV34t#K=*4Q1aCYd2}UWQVkXSf)*rcN=?o{)X{m| z;?c9G!gEcuv znBfTTts?n=dy}whIi8kH#X)~A2X>(szOn|7pHa4QWjTedTu$s$s5hbuDL3N&i~+{J z%q?GIevfiQ<tlZXXgDSJ84Wt(Y7)Xy9+SGjC`jk(@ zgApTLE*H#~As-E?pRo5*B=KQ>^e5S*Q^`%*`?8ulPNDbHOuoWI_TzV$i%|O!d|A+a zADZm_H9TBry3_`(reI**y_O@UHqI&LxTSi>n8-Fu08umdbG-LWCb!*Uh=Trv(6j?@ z<*~(B-O8WLpmlnL^>65hKcJwiITTC$5k!vQCuYrYyy;lLnHk_r7!JVMLk?{y<($0R zwSZW^lG;cmC+;8xrw6#P;PC9lUO5k=^?lNuTJoz8M~oS_uX8+!k-!^8J20vsw$K2c zAs{G#4sjr~=ZNrKS@I?9p+avwY(t$BvsV-!G3HeZ5JP;c185O7>sM%>aK%G~3OOp= z7+{2igqoVmAZz}Z50?O$f9T{=Wmpy>O%tyvD6n`GqsH*Ta2Zim+<7oRh_9zkaWMuW zf;i+;9Uw=L*v?f#wNY z@KGpP+-HO+;1Z~JGYjA-xAL4OhDF@f>_VKWJmP%pa(K@cC{lQRg0Kv<` z?jUz%2@1t3%T3l{NZ)$@85r3o^mU-Z3 z6e^77G9qe%qssD}(gsDMie{q;C6dzogW}PPvr_>LW#tmTKsC{<)DQW&(i+Cp5EP9m z9c5H1#4>aZqK-^SL!yo|cnmr(ic6ei&I7IK6C>|IMxef?pK7^~Xr_yxU{p{2YD*%Y zJ+cSUq#+QjDF4o3=1sqne~d2+EGL1jWD9f%NKoGdyoCUGIMlM`^k zjRw~IQjnL!9xx0z_JMJ)`~>x?)~q6&{9nRna3m+g=7F&XI@>7PF>tU>=Bqf$0+C0c zQeOqjuxi(F1$(%MwEk>VpJB}{5ocIS$om}1q;RMl&k-VWe7Kzj3eAzutryxki0ism zyKpbt?&7`IAElj*_YCgjZor0y424LZZ11eO$Fq6Hx+_Fd$CnqEgoB_$qUOTtO-;BV z@##vUqm;X9%hUU#fI|^~@s*;$3bPKt(cz;JVRBw5V{<;7IyEDFeb&XIQKbpvDv}2T zfjHF13^|M+!{VQ4cx!g9-J>U6#6>B-@rH`Zw7PoN=-9aG*lu!2hj_>vZaL`v?ok8} zt2M?+hsI>VC#G6i91pVhaqllMpVNu`j^N2X?*M*cKJyl&Ij?oohW0u_t>Zu^ON^eZ zXroShAEU77g&~FcMFQq`L+Ct$M?v>NA~fu|htB~#m6G^A(<2R<$E7U5OW_My8?`eD}A!En;*vfGeKc55s7DT2z;|A^`U~5OM z3D)>pn$QQQ9o+vZ>kyGq=Jjsl5IC(w=~>vS;qb`1u(B{63dqV$99jJcbAINd|g?79-yT8kFPT zAWtoWHlJ*2PehYKiYP&Nj|N%*%|g5q2q*{(0EI>Ya%X4VHU?_ zXj>ZamYIdcTf=k z(N=ebBP-hvmRt^|o~@l7IHU88HA@YjRGc>3(l)Gx`tmwUgCsLCL%IAVeB1joycDsj zW~OwBHQ(awaAv$K>@6*Sp~PUP*IR`A5|?VZ{AKo%??Q_aN-@H3sWK4sc;8mTcMv6c z_U(TaT?)xLHnJ|oE+o1Lnj^?Z=!8O6Thq`$|85;G{Vt<2cp<>lXF^7omn zN7~Qe!EW~8KK1~l{gwiv-auq&B8D(J3%TjS?k(93BZWLTYQ8h}1tmbgiPyZttX*2V z6FGWznpi--M3sV1FG5fP+G@U+;R^y;TprM%tSq4mXaTGb7AqdlCa8cy78y>3Wyw(l zd6EFw?mZQ~iT(w0zGDR;cYP&!7a4p%-xy#*zSJ9HLORW(iG+&JM6YHQ!YK;ew3YX^ zG1-nJD1@(DSn29r+M!SOhkbqtA;We;R%%s$Q+-p193tApb}aVXj1+^Kw_uzqSKVH z(F`5U{}ACu=ggg-=wF_AqH657@^&#Tvi)0kP{s~>R7>X|l)SYCGW_05;iKW<{^8V@ U;{PE|46ggX)W5rbq%iaU0H2vQw*UYD literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/jinja2/__pycache__/exceptions.cpython-310.pyc b/.venv/lib/python3.10/site-packages/jinja2/__pycache__/exceptions.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..12f6dade6e1e00ee2aa3d5bece561c1a735b7cfc GIT binary patch literal 5534 zcmb7IOLH5?5#E`7V6gxwKJ=pOC>!NrBc+g*oK&S$PGVV>Y&kC4vFvh;RI*xP2IRuP zEaY6vdup51p^4zpgfgd^Ms zmT;xJZ?`=3JyAiwA}i9D-oD$a;+-$5cvqEG%n8sBL=F8K#_d)O{kmwN-;g!*>*z0t zQ|O;E;|=r|#S;2UvVrjh^q0j7`YWb?3jNdK4EkqGe^IbIR`cv*$Zc&rW~d*rqWWGc zWG6|bXw&=o$DMTa8)!(JQdli6Sj!ewVN0j$N^g};$ve)+R)+~!cn=yaoK85?(GC|C z;XiQpS*!Z7;#}TTDpR9Nuf$rmd$HDGCsSeE>xKDbLMUm5UfU=t zeW`W4B@0i#cCH{Z_E z7uT-5u&$F_{%8=lKZJ~Wy_=-n`0Bd6-@SbK=!WJR>6+U4>*MMfsM)E^=;PWQyJ&vrwA&GK$_rHMP+9 zpcvRFZ#mNKda|-=!6NOKtST2ZSSG!5yH!~cZila0uwZ*S4<5=p@KRW;+X@7J3;V5# z;DOVs2@W;ai^ZwRHnRLyHcZ9n@9)HkmLg0#VSH$|B9l5yvpkgd6P>RGL5OEsi<8(`kYuCc7YgewAL7H&86Xx48+)7|zA*nb_ba>5}XeY_HBV0uZW064& zb0+mH)+?%0EYVG;bPIZ2PB6#)nwOB_T}08#sOqlI>nz|tbGXMnR%fHtubaUC;JCDA zPOi)Lfx)GRadjSVOF5RPbySW5z6C#uqAM6P9viUH`4jdwlgcIQiey#@Tb3fMP-mzj zw^wJWI!6`lTAYfaIE8)22Atr)?t3Zh(r8>=qG^ZHn3i$QXD~oJXj&tHb1ql8>wLM) z`G0(yf61NTi{%wXv)U*}9sr%Y$u4L67R#0$uC`@>$I40>|rz@dQ_b}cyivX8HorT?@&ck+`x3`mY%lP^xLLWe45+=f(1i{Zt z2sg8Q`~Lurcmf!yS+)n%2_YOgwUPNaiU1*|2r@&Dcr$}ul04j$B;d@c=+t^U+ex7_ zAe6!$fEU6l#OZuDgbiZ;F==A~Br+g()ofvmYNK$CR3+9J<2(j9^nwtd073sA)dXbL z4aiu1Mj*3g?Ez+9wSK#@=jMFu8o+sW>>Su*x9d>k|7fA?m2F`kxVe{C#?C%}$o4$p zjJ;2+Px&6teXxbyQ2}_g-vxn|XYh6dt1P;Di2gdn4U<<6y z7xDiEzQ9Hormi#dt{L1ld3m4B+KI43ix&PJ`O#1Utkw6>Eze<4i1t<&s5%6iLl*FT z4EzM8lng+_8=TDp&Dk#$%{c}$M0@Dbze6=;1jGjbGaT$0yp=crSh?4&NC(j3%~};i z|6mSed~kIK41hSf)2fzSyoDLyu{E%PQ^m?uId^u`Jic#&*65W9A;>cr1W{R7#!#0& zlT!~yVL$|-db20{@cDfEi2bZhLbBHbFHf`b8vRbvlO{$RZz1oPK2uLI-m-?b^X%6I zT|Ty9!}i!g?ZCFJ$Q5MO-h@5gf*sAwOHsrzo2sj56`sz93gI@$Rh(*~?V{^E3O)9uzP9xML>XY}j|+M5~I5fV%XBvyKZ*7++cLxO{x9q=3ngR_I3(Sf?I zacF9JgEOcr#5znCGe3UQ*Vvx)IO*_q@7?b=fM;A zocFD?>HrdUZ!$0%W_@6#!HzYy4{E{#(9|DV=PZ+OR1O+r`ypjp{>I3qTMS3uE!0& zGZNv6@bv;le@#-*TuNfV9hvhv2T$VQNxs9s@Lm2n_ZB`|SXw-%Xnq^z$U_=?8Rg%U z&(1@cNk!~pmOWnAKo`1NgFkT{KQ!cLE*;SZpUPzVvf)1Mj8YL$4Gn&QY;_Vn9CMc^g1UrmDWU~H%jGEXv01R)CiKNfvVJh2{tgEEAiyi29X06TL zFb?NM0jGLB+mVn2oZ~qnRw7YgTl4(N{IX1BPPof57ut@s0Z>gTQ=G&2LGPrVK7Po+QsRqWbc%zN*M^U>*1D!dnN5~lEO?> zSE_eL7ebkC!407dO7RqUB2IzN3B!_{8wI>U-xI=qyjzl1oE9NuMjNMz+;xaE=NO0Q zx`BZ|(%>spQSYf|S|DM}hoSN`FP)g@Le;PzggQ#|5gEb^S?95Y6#?yuqP+@X{yY?C$=?5F$wX!}I<;(kX&O=lHk8fiRwJF>%Euyxp&o=Pc|wwcG2)|& zN}z2cK0f%E70Z<68#H|jV*X_&H1(QGg_rLRK;6s0(|GrTw{J!_UcY(cm$x@wJLIZG z_2x7~F&|>oxA5bl_GXrSI2@Rhn5558G6QDDZH%2Mx=}?MQnceq)>-&3m7kY>PLOAE aOCNEk&KB*{wZ-q^@5M!b(OYy*d;bM*x(tH= literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/jinja2/__pycache__/ext.cpython-310.pyc b/.venv/lib/python3.10/site-packages/jinja2/__pycache__/ext.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8e89eb7ccbe9f2583d23032a5c7577acc9ff531e GIT binary patch literal 25873 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/jinja2/__pycache__/filters.cpython-310.pyc b/.venv/lib/python3.10/site-packages/jinja2/__pycache__/filters.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..064126898315eb0de5bc980e4b93a97bc22bfb72 GIT binary patch literal 52117 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�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 AM*si- literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/jinja2/__pycache__/lexer.cpython-310.pyc b/.venv/lib/python3.10/site-packages/jinja2/__pycache__/lexer.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..35581fff211618c341c7f343fec953b80b10c1bc GIT binary patch literal 20442 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/jinja2/__pycache__/loaders.cpython-310.pyc b/.venv/lib/python3.10/site-packages/jinja2/__pycache__/loaders.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6c221a5c5d788abefbcf8f0ab9ebac37a68c77c4 GIT binary patch literal 21252 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

snBro%N8YejQeO{;JtG5C zndb3_m505B;RzguDh>b~-+zcdX$$ZRp;TfrntI21wSf~vg_bvh+z_Zyf19U1PeQvD zh&mMpG%kd*D|Q3S8Tbv{!e@8`XeU6pLjVb|wnl8I!`!!cdV}u^9r0F6e|1NH#CJl< zq+kZ$%P8C6z7=!IoC4{ZfHlmID#cSafk)sqcF8M*2^_h1>XSwT1NXD&qnA!k$D>%5fJ+8 zmf>r)kOn5bcx+QsJ`NA2UzXv)OjC`0t?<#}*{I7%im|BjQnL|W744~>M~8Sx4L%XL z+5wgt?k-ZpX{bGkX&Ny{U}1@>pFY)Y{3I+xDdE`ph^XI zE)1x+W-;dQ)NKYj1Pn1Bv2!vuFN$#&W7il3N%F^Q9v5-^j4M@id$7qwY#Hhw<0&Zd z41VM~LqS6Nq`n_xtbfLG-~&1`=;vqBC@f^71C76e=-r23U^90+r;hUXK4|4_NMtuh zkIGx-nx*+K<#TA<7cGK5IpiMtqjq@&M?fZVAEI~@{rH36dXOMa@?iKlisBPcpW~IRz2E1RjNw^a{e%Tm za8;~|F$KV{cl5yGhXft+r1K}77Ope!b|T-}C1fftLtXvnc_lRumOgpHe?%$j_i)iW zk*RT*Gk*;K5%9Pe$9!bC(ete87ve#`gB<^yLqNQfJm^#jI45}~4grTtifQ&uG*RO7 zID+5C=^%cyZh&7f>H~ZQXK)$0N32HtJiiAr1jP{~+{2?rhIrJcmr{^862^v*H&vst z%W)`Y%%6S_M3kC(0s>+Y$MKf+H10Ew$P;*)W+E96*nsdMjhCcBnFt;6U>j+eCyO+u zJd6Ry!{NmqU4jAbt1R)E*Bv`|`2Z6|JUmT3Aqipxa zp$?)JCAL4tSjajVV9ySxhSm&=j>F#Pfx_^Qakqq3UwFY8;;J!HqZ2V<98rx;KJ(Mb zOZgq*(!;YfGgN)dnQ3>YA-e3|ir`y=IZI{}E_sQ`T@xk_rj5QZX&kI8mG7UEl^d$- zp~&HAUFL&mLD(DjW%xt|5$A*84CQPg4p+*;UZ#2z`$fcu!7UxwmH}`%j{M6+hz*!k z67nfzfqn%TN+~NIt=lwv6PQW{gB|`9NuquiOHuP5L;V4+6ZygGy&Q=0ryk{D}LHEl#smS(p=4` zi7^OEO9CTO;|50I?Y-SNi`4&{-5@Miu}UywpasGPM^MDj!p{T&&yFgGmF!XK$W%4+ z6!lK@ImKtfRYj@eplMg!fS(VT`ai?lKVnf&TL5Q15mmEcsP)sI$d_HJjEG_5QUHDi_DsCoLj-R8 zi0gEf(GjwWuu!ovQS1iIvf~@3a=ip&mt9gr92YuV-3hQuV8g-gl6Y}TH1=F95#sQ< zIMj-PzA#zDU%-M^lEM*In?&>{DlKF4=^=uX2I2PE-CDX+28rxu4TgMK^SbRgEK)*Z{~IL9o}!V*dTcul5u5r?Ru zTDcYw9r|p-b7JN2Um_Kp#b@xN)iplY%VoIkODI#~cM4Dxdq=Z#HDH#s!WyhR`77Xp z3cfUkP*d*+paansu|3y(&D>$U2EdCx793$ShN!OrzG7fbXs?;uPXIuJQ3aYFy zKhpu)nmEVUd8+g}nx|wJ=BVs9z6zD?ce{vHl)-3W!z-CiJ%-{rM7ev5snY6w4+XnmFkWTVWmSIl?ZR? zXchsK?n#3L_^wEFqIk0onqLVM|6JPXqA3wCaivrooXQeY?hk z9I&;cF=1P~rrcNIo`N%sYjD#(1|mO(7&JuD9n$;Bb>H%Oap&PU*a|dkLT`W&H2|?Q zxaJ0UqD7i~*~^T@IG9eFS5L8Ll%WXV2X>DjtcTDF9vSY}aKw(GSAUcB3;6XSL?MromC(?qB&p*#AHZ;R*20i!}c=2b{C0MZN5{GPT4cB%V z(XCV1fiTb^fOd`SkK3<)czjH;qy~U)Ld)IX1psf8wNJm zz$drLI17efLX6RUuGyT3K>EA*Ov-}LgCm_g<>YqA%E`8V=2dy0*i)AwMzh-$W~LYD zcwPwo1t3mp5b!=73;55FQSV^LW=*S1qUL4z(Bv4^g7vfQcj3Im$1kWvF&>@opmO0h ziOF|XyUiAqo^+V>c1+QyxSL`v{(MH_>PrAIJ!HWzV#fR!^qH73yv{6^6b8GDm9Bx5 zquBu-NM(@%W#$(7Y~d>TqY1+|!pNS(1ziYWV3RvmuN=!F_@iHeMq%hMHlG_W8) zN&1jGr=23BiaT`_0=5!M9@t})Jeh7Gdhb)ZHIO=*8*3RqEOquy5c6D5`vxI1Iq2Kr zp}y@CGMp!NMdpTLZ7A-w3^xvfnfvghJkY|VfDPpt3@)$Mkw(3 z-xiaI9N9A`R8!zz19@y>|7a9K= zr98(L&*6e1N5nyZ5F)JWEx;rE8V*t$E)82FeGdOdxn=_>N}`vuSGtXlEGT} zw@A0aUUKD@awS9Y$-dTep`XVg@zTSs=ND4&RU??raChYSZ4`Yy5MN?S+Z0+bSIZtY zB_M4crgm&X<0~g4Lr=vWf~Qq)6ejW{zpNyA#!>bdjzciQ^P7pd%e#kRBJ(Rth+e_> zQfLkzjjDPWuZo4+`;)9(g|#U?n++8Lg!NajgfAESigguBH6k! zk|rr|NMwl2NamW`+hqe>wtAW081A|>_~6QXTwIDH1}j<;T$XJG>N4i%09jz+aRCQ^ zgEmes9H;ztgloQIziVO-3fv0fMFs?bm7g|N7b zy(i*FrthnS5cu+D<$msY_?!_uG{W5{wW@>=6_=tDHU06FWCv$DzO~4>JERDM64QN1 z>I!Z&|NAPhuBNvG^8GrVy@gEb8ZLUX*?CCiRmL4lZvaQ}+)$-lnk4@tI7DV7j%7NN z6Z_Uer2Tdf741y@!Nu~a4U>q(IN^p?ucT(SA;bd>z)K4u2TVRV^^H}oObEEvb+v?vj&A(@wf^MNSDPhZWC`T4v z=r;ZbCQjx3T{d(QkH!lndkQf*<8YPYgGmnyMOx+uHeJN!zClc-%M?n}WVQ=3djKgy z!{rzxKAc=pKExM$YT6-eDbgjvmKd1pMdc0euG>UFZHPe?NjP9yY;ZJAk)6;_?WVW= zcamYAGJB5>wRLaGea&Uf7jeXM4hs^3&o!i(h_1Krl_}^-KS2uhUw9&LxJMpGM_7v< zaS1jji2uW+Nn>Wu+1I2!i3f(g-fm4Zw?S%5{wTRp+m|1xN^D=)fN+xW`!9VP`@XPC zjNgR84l{%(-m|z-MKI$p^(qkLc*fw!b>p7BQ;4I9^4rhCLPjVczz~Ud>K6qJDZWu8 z7!npYOS@&}e1KgDF#>%-zBXWNROC^8irSX?`#1p*mhs}Ez()-L=VL>G z`p>+>E^Zwv2NE8+BH@GsKxIJ0>JM4gJadf8{`7dzh+A?I@V8crLmu|1O_2qvklNHA zv6O@G32IUAaF!fgREn}S1z~2BX_U@bo`DVVuJpr0b4cl-brZcaeXo>#l$CyoC&iPf zC8DZa$8A(a1V`9x=&umyVfwF3Ci;meE*E(FWu8Po9MJ!O>-_|8TWtO_xS(ocmrbnM zWMc|q93Gi8OpC{U6$QJ`nSb^R5_=JirJ;-Sj9gTI74LMg%&WX2Ux^C%q6lC{-K+n^ z$G^qLBbm=7=$)BGIAAsq1u2VKk&3a{@m-EUku^jWe5k{d{rG{X^AWbl!qcO--jCk+ z*0oEui@$Q|;@7S$eI>IjNc?&j&-3aePonm5?MBr&E*kqe5xu~1i){LT5&t6J4Aapw zjPVf1tM~@Qh!-_Yv)Z5V?EwP~f4L^Sa}*H)RZ1J5@+iTro&59ja`F$3S-?>>j$31g e$J>=(cg)ix<0HA>7@r}^+ literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/jinja2/__pycache__/meta.cpython-310.pyc b/.venv/lib/python3.10/site-packages/jinja2/__pycache__/meta.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a30dc862504b997871ff8a28bbda87ceb997192e GIT binary patch literal 3815 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 Y7_RFO4vbp(ml<6*I=p!>XQhq*2jifIkpKVy literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/jinja2/__pycache__/optimizer.cpython-310.pyc b/.venv/lib/python3.10/site-packages/jinja2/__pycache__/optimizer.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a0580e0ad6f8bc64db8e0840a9fb9f40dbb3808a GIT binary patch literal 1955 zcmY*ZL2uhO6ecBEwiP?w+O$R60p)El(AnF%<1n-fvaT4A4r_p+9y);$=~%8LY9y7! zfqP1TownbQ4!iWU|FECI>rVX(1-k7$I!+oHe10OS$M1XZ<5T^9Lg2af_V3)pg#3dq z?>{g{9>6dHj38qos0a!=4n!!TA}phEL<#t1|DuHKOeIsb&CC2qYG!pV4YP`6 zsxp>WmQ7S4m^`etG$w~h#w)=}CGyFfS@`zh)14%*SY7Z;GNWLQTb5g9rmBH2cO{!} zV==U1a-SCsw{n;yU(1X)My^6Iq2Sy~Sv=Ts2*``VFPco%d9}y#YNB+>Enx5v;Orz* zWt|rgd&)iNNe_D=NR~S^N^LS@meINr{k^^8lWZx(aEO}WM@*XRcs##NM zRTOwMVyiy3>_F)kKxhekxh#d>Y?1@dcFOl9;|!8Bky=9b5WO5SOtMi$i_(wHv!Z06!v1CDy>C3><)4+za zXc3&Y7UUIug({*)KO;LVn>@5^ngeUdIu;)43mg=yrAAaxHU^rqdA1UqFG9lL+2yzw zN{f_NvG($PSq%rV>poct)KTD)fuJ;^bP>{at^M5Ob`WYrt=qWJJ(u)rqOZWr+b5%` zD&&Zz2JM&jAnT?#W{3AiRmdbixg)KLjU(ap~!ty_pB#NHV5y!2{6~EfK@@4E@DziH?kCZPE2M zgbUo7bbcihDiX1F(i?*xk#QGN-q&3SWVeS;p>Xc zXh9bwgpkP*7YF!%35ib@e2s-M1sF??$&4=O9$f@~&>u)n7U7@tclwgrU_nuH$ASLh=sI|< zS-ha9?M0yPE&@SskqVOe3cj6n7G%~H!EfP@z$hZHH<{n31b@$f>r-;z?I7IN{`v$i zhU+aWwIsggTBZT1y8fQ5q|UR{%gQAnF5e3?c_z9o=!UMfi5=3dPqZr2rn0($E+<@v zn-ug50=)^md}NnAE^7tdbGML#NMFNwuhi@4-2n5Nx^9|g1ve&5FY>K#!P;FI<~Eqy zVJ`}3OgCr*zs|e$RzRa5co&67H!n(X2|JvIw?SV;;{`EDu!t2eWtzGqO`(xPUje_D zroS}2SgvT4v?r^3=%H9#_^_ILM6Q2^HIqfL!i%NU3=Jy93-k^+2I+M`CP5g{;J@<` z-1yh;8T4H{O@+z;LTu;Q>6fQ1k9Tcf1En=e#`SleeZQ4%e!I2#-Q(>?OK#Z4mMHP& hEpLVgb77X+{c_3mE3Cc2sfcuvUeKd4jN9Qx`+xk02jTz# literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/jinja2/__pycache__/parser.cpython-310.pyc b/.venv/lib/python3.10/site-packages/jinja2/__pycache__/parser.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..45c4b5f68c20b2adc906834901ec7c32509fba57 GIT binary patch literal 28108 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/jinja2/__pycache__/sandbox.cpython-310.pyc b/.venv/lib/python3.10/site-packages/jinja2/__pycache__/sandbox.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6f14770ac52abce02bf64755e11b78f346df8b90 GIT binary patch literal 12235 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 U^a=LE^hx~(`h>29|DNyv2cJAm#sB~S literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/jinja2/__pycache__/utils.cpython-310.pyc b/.venv/lib/python3.10/site-packages/jinja2/__pycache__/utils.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..074c4372d6f6771c274cbaa0061d28225767e9f9 GIT binary patch literal 24822 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.10/site-packages/jinja2/_identifier.py b/.venv/lib/python3.10/site-packages/jinja2/_identifier.py new file mode 100644 index 0000000..928c150 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/jinja2/_identifier.py @@ -0,0 +1,6 @@ +import re + +# generated by scripts/generate_identifier_pattern.py +pattern = re.compile( + r"[\w·̀-ͯ·҃-֑҇-ׇֽֿׁׂׅׄؐ-ًؚ-ٰٟۖ-ۜ۟-۪ۤۧۨ-ܑۭܰ-݊ަ-ް߫-߽߳ࠖ-࠙ࠛ-ࠣࠥ-ࠧࠩ-࡙࠭-࡛࣓-ࣣ࣡-ःऺ-़ा-ॏ॑-ॗॢॣঁ-ঃ়া-ৄেৈো-্ৗৢৣ৾ਁ-ਃ਼ਾ-ੂੇੈੋ-੍ੑੰੱੵઁ-ઃ઼ા-ૅે-ૉો-્ૢૣૺ-૿ଁ-ଃ଼ା-ୄେୈୋ-୍ୖୗୢୣஂா-ூெ-ைொ-்ௗఀ-ఄా-ౄె-ైొ-్ౕౖౢౣಁ-ಃ಼ಾ-ೄೆ-ೈೊ-್ೕೖೢೣഀ-ഃ഻഼ാ-ൄെ-ൈൊ-്ൗൢൣංඃ්ා-ුූෘ-ෟෲෳัิ-ฺ็-๎ັິ-ູົຼ່-ໍ༹༘༙༵༷༾༿ཱ-྄྆྇ྍ-ྗྙ-ྼ࿆ါ-ှၖ-ၙၞ-ၠၢ-ၤၧ-ၭၱ-ၴႂ-ႍႏႚ-ႝ፝-፟ᜒ-᜔ᜲ-᜴ᝒᝓᝲᝳ឴-៓៝᠋-᠍ᢅᢆᢩᤠ-ᤫᤰ-᤻ᨗ-ᨛᩕ-ᩞ᩠-᩿᩼᪰-᪽ᬀ-ᬄ᬴-᭄᭫-᭳ᮀ-ᮂᮡ-ᮭ᯦-᯳ᰤ-᰷᳐-᳔᳒-᳨᳭ᳲ-᳴᳷-᳹᷀-᷹᷻-᷿‿⁀⁔⃐-⃥⃜⃡-⃰℘℮⳯-⵿⳱ⷠ-〪ⷿ-゙゚〯꙯ꙴ-꙽ꚞꚟ꛰꛱ꠂ꠆ꠋꠣ-ꠧꢀꢁꢴ-ꣅ꣠-꣱ꣿꤦ-꤭ꥇ-꥓ꦀ-ꦃ꦳-꧀ꧥꨩ-ꨶꩃꩌꩍꩻ-ꩽꪰꪲ-ꪴꪷꪸꪾ꪿꫁ꫫ-ꫯꫵ꫶ꯣ-ꯪ꯬꯭ﬞ︀-️︠-︯︳︴﹍-﹏_𐇽𐋠𐍶-𐍺𐨁-𐨃𐨅𐨆𐨌-𐨏𐨸-𐨿𐨺𐫦𐫥𐴤-𐽆𐴧-𐽐𑀀-𑀂𑀸-𑁆𑁿-𑂂𑂰-𑂺𑄀-𑄂𑄧-𑄴𑅅𑅆𑅳𑆀-𑆂𑆳-𑇀𑇉-𑇌𑈬-𑈷𑈾𑋟-𑋪𑌀-𑌃𑌻𑌼𑌾-𑍄𑍇𑍈𑍋-𑍍𑍗𑍢𑍣𑍦-𑍬𑍰-𑍴𑐵-𑑆𑑞𑒰-𑓃𑖯-𑖵𑖸-𑗀𑗜𑗝𑘰-𑙀𑚫-𑚷𑜝-𑜫𑠬-𑠺𑨁-𑨊𑨳-𑨹𑨻-𑨾𑩇𑩑-𑩛𑪊-𑪙𑰯-𑰶𑰸-𑰿𑲒-𑲧𑲩-𑲶𑴱-𑴶𑴺𑴼𑴽𑴿-𑵅𑵇𑶊-𑶎𑶐𑶑𑶓-𑶗𑻳-𑻶𖫰-𖫴𖬰-𖬶𖽑-𖽾𖾏-𖾒𛲝𛲞𝅥-𝅩𝅭-𝅲𝅻-𝆂𝆅-𝆋𝆪-𝆭𝉂-𝉄𝨀-𝨶𝨻-𝩬𝩵𝪄𝪛-𝪟𝪡-𝪯𞀀-𞀆𞀈-𞀘𞀛-𞀡𞀣𞀤𞀦-𞣐𞀪-𞣖𞥄-𞥊󠄀-󠇯]+" # noqa: B950 +) diff --git a/.venv/lib/python3.10/site-packages/jinja2/async_utils.py b/.venv/lib/python3.10/site-packages/jinja2/async_utils.py new file mode 100644 index 0000000..f0c1402 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/jinja2/async_utils.py @@ -0,0 +1,99 @@ +import inspect +import typing as t +from functools import WRAPPER_ASSIGNMENTS +from functools import wraps + +from .utils import _PassArg +from .utils import pass_eval_context + +if t.TYPE_CHECKING: + import typing_extensions as te + +V = t.TypeVar("V") + + +def async_variant(normal_func): # type: ignore + def decorator(async_func): # type: ignore + pass_arg = _PassArg.from_obj(normal_func) + need_eval_context = pass_arg is None + + if pass_arg is _PassArg.environment: + + def is_async(args: t.Any) -> bool: + return t.cast(bool, args[0].is_async) + + else: + + def is_async(args: t.Any) -> bool: + return t.cast(bool, args[0].environment.is_async) + + # Take the doc and annotations from the sync function, but the + # name from the async function. Pallets-Sphinx-Themes + # build_function_directive expects __wrapped__ to point to the + # sync function. + async_func_attrs = ("__module__", "__name__", "__qualname__") + normal_func_attrs = tuple(set(WRAPPER_ASSIGNMENTS).difference(async_func_attrs)) + + @wraps(normal_func, assigned=normal_func_attrs) + @wraps(async_func, assigned=async_func_attrs, updated=()) + def wrapper(*args, **kwargs): # type: ignore + b = is_async(args) + + if need_eval_context: + args = args[1:] + + if b: + return async_func(*args, **kwargs) + + return normal_func(*args, **kwargs) + + if need_eval_context: + wrapper = pass_eval_context(wrapper) + + wrapper.jinja_async_variant = True # type: ignore[attr-defined] + return wrapper + + return decorator + + +_common_primitives = {int, float, bool, str, list, dict, tuple, type(None)} + + +async def auto_await(value: t.Union[t.Awaitable["V"], "V"]) -> "V": + # Avoid a costly call to isawaitable + if type(value) in _common_primitives: + return t.cast("V", value) + + if inspect.isawaitable(value): + return await t.cast("t.Awaitable[V]", value) + + return value + + +class _IteratorToAsyncIterator(t.Generic[V]): + def __init__(self, iterator: "t.Iterator[V]"): + self._iterator = iterator + + def __aiter__(self) -> "te.Self": + return self + + async def __anext__(self) -> V: + try: + return next(self._iterator) + except StopIteration as e: + raise StopAsyncIteration(e.value) from e + + +def auto_aiter( + iterable: "t.Union[t.AsyncIterable[V], t.Iterable[V]]", +) -> "t.AsyncIterator[V]": + if hasattr(iterable, "__aiter__"): + return iterable.__aiter__() + else: + return _IteratorToAsyncIterator(iter(iterable)) + + +async def auto_to_list( + value: "t.Union[t.AsyncIterable[V], t.Iterable[V]]", +) -> t.List["V"]: + return [x async for x in auto_aiter(value)] diff --git a/.venv/lib/python3.10/site-packages/jinja2/bccache.py b/.venv/lib/python3.10/site-packages/jinja2/bccache.py new file mode 100644 index 0000000..ada8b09 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/jinja2/bccache.py @@ -0,0 +1,408 @@ +"""The optional bytecode cache system. This is useful if you have very +complex template situations and the compilation of all those templates +slows down your application too much. + +Situations where this is useful are often forking web applications that +are initialized on the first request. +""" + +import errno +import fnmatch +import marshal +import os +import pickle +import stat +import sys +import tempfile +import typing as t +from hashlib import sha1 +from io import BytesIO +from types import CodeType + +if t.TYPE_CHECKING: + import typing_extensions as te + + from .environment import Environment + + class _MemcachedClient(te.Protocol): + def get(self, key: str) -> bytes: ... + + def set( + self, key: str, value: bytes, timeout: t.Optional[int] = None + ) -> None: ... + + +bc_version = 5 +# Magic bytes to identify Jinja bytecode cache files. Contains the +# Python major and minor version to avoid loading incompatible bytecode +# if a project upgrades its Python version. +bc_magic = ( + b"j2" + + pickle.dumps(bc_version, 2) + + pickle.dumps((sys.version_info[0] << 24) | sys.version_info[1], 2) +) + + +class Bucket: + """Buckets are used to store the bytecode for one template. It's created + and initialized by the bytecode cache and passed to the loading functions. + + The buckets get an internal checksum from the cache assigned and use this + to automatically reject outdated cache material. Individual bytecode + cache subclasses don't have to care about cache invalidation. + """ + + def __init__(self, environment: "Environment", key: str, checksum: str) -> None: + self.environment = environment + self.key = key + self.checksum = checksum + self.reset() + + def reset(self) -> None: + """Resets the bucket (unloads the bytecode).""" + self.code: t.Optional[CodeType] = None + + def load_bytecode(self, f: t.BinaryIO) -> None: + """Loads bytecode from a file or file like object.""" + # make sure the magic header is correct + magic = f.read(len(bc_magic)) + if magic != bc_magic: + self.reset() + return + # the source code of the file changed, we need to reload + checksum = pickle.load(f) + if self.checksum != checksum: + self.reset() + return + # if marshal_load fails then we need to reload + try: + self.code = marshal.load(f) + except (EOFError, ValueError, TypeError): + self.reset() + return + + def write_bytecode(self, f: t.IO[bytes]) -> None: + """Dump the bytecode into the file or file like object passed.""" + if self.code is None: + raise TypeError("can't write empty bucket") + f.write(bc_magic) + pickle.dump(self.checksum, f, 2) + marshal.dump(self.code, f) + + def bytecode_from_string(self, string: bytes) -> None: + """Load bytecode from bytes.""" + self.load_bytecode(BytesIO(string)) + + def bytecode_to_string(self) -> bytes: + """Return the bytecode as bytes.""" + out = BytesIO() + self.write_bytecode(out) + return out.getvalue() + + +class BytecodeCache: + """To implement your own bytecode cache you have to subclass this class + and override :meth:`load_bytecode` and :meth:`dump_bytecode`. Both of + these methods are passed a :class:`~jinja2.bccache.Bucket`. + + A very basic bytecode cache that saves the bytecode on the file system:: + + from os import path + + class MyCache(BytecodeCache): + + def __init__(self, directory): + self.directory = directory + + def load_bytecode(self, bucket): + filename = path.join(self.directory, bucket.key) + if path.exists(filename): + with open(filename, 'rb') as f: + bucket.load_bytecode(f) + + def dump_bytecode(self, bucket): + filename = path.join(self.directory, bucket.key) + with open(filename, 'wb') as f: + bucket.write_bytecode(f) + + A more advanced version of a filesystem based bytecode cache is part of + Jinja. + """ + + def load_bytecode(self, bucket: Bucket) -> None: + """Subclasses have to override this method to load bytecode into a + bucket. If they are not able to find code in the cache for the + bucket, it must not do anything. + """ + raise NotImplementedError() + + def dump_bytecode(self, bucket: Bucket) -> None: + """Subclasses have to override this method to write the bytecode + from a bucket back to the cache. If it unable to do so it must not + fail silently but raise an exception. + """ + raise NotImplementedError() + + def clear(self) -> None: + """Clears the cache. This method is not used by Jinja but should be + implemented to allow applications to clear the bytecode cache used + by a particular environment. + """ + + def get_cache_key( + self, name: str, filename: t.Optional[t.Union[str]] = None + ) -> str: + """Returns the unique hash key for this template name.""" + hash = sha1(name.encode("utf-8")) + + if filename is not None: + hash.update(f"|{filename}".encode()) + + return hash.hexdigest() + + def get_source_checksum(self, source: str) -> str: + """Returns a checksum for the source.""" + return sha1(source.encode("utf-8")).hexdigest() + + def get_bucket( + self, + environment: "Environment", + name: str, + filename: t.Optional[str], + source: str, + ) -> Bucket: + """Return a cache bucket for the given template. All arguments are + mandatory but filename may be `None`. + """ + key = self.get_cache_key(name, filename) + checksum = self.get_source_checksum(source) + bucket = Bucket(environment, key, checksum) + self.load_bytecode(bucket) + return bucket + + def set_bucket(self, bucket: Bucket) -> None: + """Put the bucket into the cache.""" + self.dump_bytecode(bucket) + + +class FileSystemBytecodeCache(BytecodeCache): + """A bytecode cache that stores bytecode on the filesystem. It accepts + two arguments: The directory where the cache items are stored and a + pattern string that is used to build the filename. + + If no directory is specified a default cache directory is selected. On + Windows the user's temp directory is used, on UNIX systems a directory + is created for the user in the system temp directory. + + The pattern can be used to have multiple separate caches operate on the + same directory. The default pattern is ``'__jinja2_%s.cache'``. ``%s`` + is replaced with the cache key. + + >>> bcc = FileSystemBytecodeCache('/tmp/jinja_cache', '%s.cache') + + This bytecode cache supports clearing of the cache using the clear method. + """ + + def __init__( + self, directory: t.Optional[str] = None, pattern: str = "__jinja2_%s.cache" + ) -> None: + if directory is None: + directory = self._get_default_cache_dir() + self.directory = directory + self.pattern = pattern + + def _get_default_cache_dir(self) -> str: + def _unsafe_dir() -> "te.NoReturn": + raise RuntimeError( + "Cannot determine safe temp directory. You " + "need to explicitly provide one." + ) + + tmpdir = tempfile.gettempdir() + + # On windows the temporary directory is used specific unless + # explicitly forced otherwise. We can just use that. + if os.name == "nt": + return tmpdir + if not hasattr(os, "getuid"): + _unsafe_dir() + + dirname = f"_jinja2-cache-{os.getuid()}" + actual_dir = os.path.join(tmpdir, dirname) + + try: + os.mkdir(actual_dir, stat.S_IRWXU) + except OSError as e: + if e.errno != errno.EEXIST: + raise + try: + os.chmod(actual_dir, stat.S_IRWXU) + actual_dir_stat = os.lstat(actual_dir) + if ( + actual_dir_stat.st_uid != os.getuid() + or not stat.S_ISDIR(actual_dir_stat.st_mode) + or stat.S_IMODE(actual_dir_stat.st_mode) != stat.S_IRWXU + ): + _unsafe_dir() + except OSError as e: + if e.errno != errno.EEXIST: + raise + + actual_dir_stat = os.lstat(actual_dir) + if ( + actual_dir_stat.st_uid != os.getuid() + or not stat.S_ISDIR(actual_dir_stat.st_mode) + or stat.S_IMODE(actual_dir_stat.st_mode) != stat.S_IRWXU + ): + _unsafe_dir() + + return actual_dir + + def _get_cache_filename(self, bucket: Bucket) -> str: + return os.path.join(self.directory, self.pattern % (bucket.key,)) + + def load_bytecode(self, bucket: Bucket) -> None: + filename = self._get_cache_filename(bucket) + + # Don't test for existence before opening the file, since the + # file could disappear after the test before the open. + try: + f = open(filename, "rb") + except (FileNotFoundError, IsADirectoryError, PermissionError): + # PermissionError can occur on Windows when an operation is + # in progress, such as calling clear(). + return + + with f: + bucket.load_bytecode(f) + + def dump_bytecode(self, bucket: Bucket) -> None: + # Write to a temporary file, then rename to the real name after + # writing. This avoids another process reading the file before + # it is fully written. + name = self._get_cache_filename(bucket) + f = tempfile.NamedTemporaryFile( + mode="wb", + dir=os.path.dirname(name), + prefix=os.path.basename(name), + suffix=".tmp", + delete=False, + ) + + def remove_silent() -> None: + try: + os.remove(f.name) + except OSError: + # Another process may have called clear(). On Windows, + # another program may be holding the file open. + pass + + try: + with f: + bucket.write_bytecode(f) + except BaseException: + remove_silent() + raise + + try: + os.replace(f.name, name) + except OSError: + # Another process may have called clear(). On Windows, + # another program may be holding the file open. + remove_silent() + except BaseException: + remove_silent() + raise + + def clear(self) -> None: + # imported lazily here because google app-engine doesn't support + # write access on the file system and the function does not exist + # normally. + from os import remove + + files = fnmatch.filter(os.listdir(self.directory), self.pattern % ("*",)) + for filename in files: + try: + remove(os.path.join(self.directory, filename)) + except OSError: + pass + + +class MemcachedBytecodeCache(BytecodeCache): + """This class implements a bytecode cache that uses a memcache cache for + storing the information. It does not enforce a specific memcache library + (tummy's memcache or cmemcache) but will accept any class that provides + the minimal interface required. + + Libraries compatible with this class: + + - `cachelib `_ + - `python-memcached `_ + + (Unfortunately the django cache interface is not compatible because it + does not support storing binary data, only text. You can however pass + the underlying cache client to the bytecode cache which is available + as `django.core.cache.cache._client`.) + + The minimal interface for the client passed to the constructor is this: + + .. class:: MinimalClientInterface + + .. method:: set(key, value[, timeout]) + + Stores the bytecode in the cache. `value` is a string and + `timeout` the timeout of the key. If timeout is not provided + a default timeout or no timeout should be assumed, if it's + provided it's an integer with the number of seconds the cache + item should exist. + + .. method:: get(key) + + Returns the value for the cache key. If the item does not + exist in the cache the return value must be `None`. + + The other arguments to the constructor are the prefix for all keys that + is added before the actual cache key and the timeout for the bytecode in + the cache system. We recommend a high (or no) timeout. + + This bytecode cache does not support clearing of used items in the cache. + The clear method is a no-operation function. + + .. versionadded:: 2.7 + Added support for ignoring memcache errors through the + `ignore_memcache_errors` parameter. + """ + + def __init__( + self, + client: "_MemcachedClient", + prefix: str = "jinja2/bytecode/", + timeout: t.Optional[int] = None, + ignore_memcache_errors: bool = True, + ): + self.client = client + self.prefix = prefix + self.timeout = timeout + self.ignore_memcache_errors = ignore_memcache_errors + + def load_bytecode(self, bucket: Bucket) -> None: + try: + code = self.client.get(self.prefix + bucket.key) + except Exception: + if not self.ignore_memcache_errors: + raise + else: + bucket.bytecode_from_string(code) + + def dump_bytecode(self, bucket: Bucket) -> None: + key = self.prefix + bucket.key + value = bucket.bytecode_to_string() + + try: + if self.timeout is not None: + self.client.set(key, value, self.timeout) + else: + self.client.set(key, value) + except Exception: + if not self.ignore_memcache_errors: + raise diff --git a/.venv/lib/python3.10/site-packages/jinja2/compiler.py b/.venv/lib/python3.10/site-packages/jinja2/compiler.py new file mode 100644 index 0000000..a4ff6a1 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/jinja2/compiler.py @@ -0,0 +1,1998 @@ +"""Compiles nodes from the parser into Python code.""" + +import typing as t +from contextlib import contextmanager +from functools import update_wrapper +from io import StringIO +from itertools import chain +from keyword import iskeyword as is_python_keyword + +from markupsafe import escape +from markupsafe import Markup + +from . import nodes +from .exceptions import TemplateAssertionError +from .idtracking import Symbols +from .idtracking import VAR_LOAD_ALIAS +from .idtracking import VAR_LOAD_PARAMETER +from .idtracking import VAR_LOAD_RESOLVE +from .idtracking import VAR_LOAD_UNDEFINED +from .nodes import EvalContext +from .optimizer import Optimizer +from .utils import _PassArg +from .utils import concat +from .visitor import NodeVisitor + +if t.TYPE_CHECKING: + import typing_extensions as te + + from .environment import Environment + +F = t.TypeVar("F", bound=t.Callable[..., t.Any]) + +operators = { + "eq": "==", + "ne": "!=", + "gt": ">", + "gteq": ">=", + "lt": "<", + "lteq": "<=", + "in": "in", + "notin": "not in", +} + + +def optimizeconst(f: F) -> F: + def new_func( + self: "CodeGenerator", node: nodes.Expr, frame: "Frame", **kwargs: t.Any + ) -> t.Any: + # Only optimize if the frame is not volatile + if self.optimizer is not None and not frame.eval_ctx.volatile: + new_node = self.optimizer.visit(node, frame.eval_ctx) + + if new_node != node: + return self.visit(new_node, frame) + + return f(self, node, frame, **kwargs) + + return update_wrapper(new_func, f) # type: ignore[return-value] + + +def _make_binop(op: str) -> t.Callable[["CodeGenerator", nodes.BinExpr, "Frame"], None]: + @optimizeconst + def visitor(self: "CodeGenerator", node: nodes.BinExpr, frame: Frame) -> None: + if ( + self.environment.sandboxed and op in self.environment.intercepted_binops # type: ignore + ): + self.write(f"environment.call_binop(context, {op!r}, ") + self.visit(node.left, frame) + self.write(", ") + self.visit(node.right, frame) + else: + self.write("(") + self.visit(node.left, frame) + self.write(f" {op} ") + self.visit(node.right, frame) + + self.write(")") + + return visitor + + +def _make_unop( + op: str, +) -> t.Callable[["CodeGenerator", nodes.UnaryExpr, "Frame"], None]: + @optimizeconst + def visitor(self: "CodeGenerator", node: nodes.UnaryExpr, frame: Frame) -> None: + if ( + self.environment.sandboxed and op in self.environment.intercepted_unops # type: ignore + ): + self.write(f"environment.call_unop(context, {op!r}, ") + self.visit(node.node, frame) + else: + self.write("(" + op) + self.visit(node.node, frame) + + self.write(")") + + return visitor + + +def generate( + node: nodes.Template, + environment: "Environment", + name: t.Optional[str], + filename: t.Optional[str], + stream: t.Optional[t.TextIO] = None, + defer_init: bool = False, + optimized: bool = True, +) -> t.Optional[str]: + """Generate the python source for a node tree.""" + if not isinstance(node, nodes.Template): + raise TypeError("Can't compile non template nodes") + + generator = environment.code_generator_class( + environment, name, filename, stream, defer_init, optimized + ) + generator.visit(node) + + if stream is None: + return generator.stream.getvalue() # type: ignore + + return None + + +def has_safe_repr(value: t.Any) -> bool: + """Does the node have a safe representation?""" + if value is None or value is NotImplemented or value is Ellipsis: + return True + + if type(value) in {bool, int, float, complex, range, str, Markup}: + return True + + if type(value) in {tuple, list, set, frozenset}: + return all(has_safe_repr(v) for v in value) + + if type(value) is dict: # noqa E721 + return all(has_safe_repr(k) and has_safe_repr(v) for k, v in value.items()) + + return False + + +def find_undeclared( + nodes: t.Iterable[nodes.Node], names: t.Iterable[str] +) -> t.Set[str]: + """Check if the names passed are accessed undeclared. The return value + is a set of all the undeclared names from the sequence of names found. + """ + visitor = UndeclaredNameVisitor(names) + try: + for node in nodes: + visitor.visit(node) + except VisitorExit: + pass + return visitor.undeclared + + +class MacroRef: + def __init__(self, node: t.Union[nodes.Macro, nodes.CallBlock]) -> None: + self.node = node + self.accesses_caller = False + self.accesses_kwargs = False + self.accesses_varargs = False + + +class Frame: + """Holds compile time information for us.""" + + def __init__( + self, + eval_ctx: EvalContext, + parent: t.Optional["Frame"] = None, + level: t.Optional[int] = None, + ) -> None: + self.eval_ctx = eval_ctx + + # the parent of this frame + self.parent = parent + + if parent is None: + self.symbols = Symbols(level=level) + + # in some dynamic inheritance situations the compiler needs to add + # write tests around output statements. + self.require_output_check = False + + # inside some tags we are using a buffer rather than yield statements. + # this for example affects {% filter %} or {% macro %}. If a frame + # is buffered this variable points to the name of the list used as + # buffer. + self.buffer: t.Optional[str] = None + + # the name of the block we're in, otherwise None. + self.block: t.Optional[str] = None + + else: + self.symbols = Symbols(parent.symbols, level=level) + self.require_output_check = parent.require_output_check + self.buffer = parent.buffer + self.block = parent.block + + # a toplevel frame is the root + soft frames such as if conditions. + self.toplevel = False + + # the root frame is basically just the outermost frame, so no if + # conditions. This information is used to optimize inheritance + # situations. + self.rootlevel = False + + # variables set inside of loops and blocks should not affect outer frames, + # but they still needs to be kept track of as part of the active context. + self.loop_frame = False + self.block_frame = False + + # track whether the frame is being used in an if-statement or conditional + # expression as it determines which errors should be raised during runtime + # or compile time. + self.soft_frame = False + + def copy(self) -> "te.Self": + """Create a copy of the current one.""" + rv = object.__new__(self.__class__) + rv.__dict__.update(self.__dict__) + rv.symbols = self.symbols.copy() + return rv + + def inner(self, isolated: bool = False) -> "Frame": + """Return an inner frame.""" + if isolated: + return Frame(self.eval_ctx, level=self.symbols.level + 1) + return Frame(self.eval_ctx, self) + + def soft(self) -> "te.Self": + """Return a soft frame. A soft frame may not be modified as + standalone thing as it shares the resources with the frame it + was created of, but it's not a rootlevel frame any longer. + + This is only used to implement if-statements and conditional + expressions. + """ + rv = self.copy() + rv.rootlevel = False + rv.soft_frame = True + return rv + + __copy__ = copy + + +class VisitorExit(RuntimeError): + """Exception used by the `UndeclaredNameVisitor` to signal a stop.""" + + +class DependencyFinderVisitor(NodeVisitor): + """A visitor that collects filter and test calls.""" + + def __init__(self) -> None: + self.filters: t.Set[str] = set() + self.tests: t.Set[str] = set() + + def visit_Filter(self, node: nodes.Filter) -> None: + self.generic_visit(node) + self.filters.add(node.name) + + def visit_Test(self, node: nodes.Test) -> None: + self.generic_visit(node) + self.tests.add(node.name) + + def visit_Block(self, node: nodes.Block) -> None: + """Stop visiting at blocks.""" + + +class UndeclaredNameVisitor(NodeVisitor): + """A visitor that checks if a name is accessed without being + declared. This is different from the frame visitor as it will + not stop at closure frames. + """ + + def __init__(self, names: t.Iterable[str]) -> None: + self.names = set(names) + self.undeclared: t.Set[str] = set() + + def visit_Name(self, node: nodes.Name) -> None: + if node.ctx == "load" and node.name in self.names: + self.undeclared.add(node.name) + if self.undeclared == self.names: + raise VisitorExit() + else: + self.names.discard(node.name) + + def visit_Block(self, node: nodes.Block) -> None: + """Stop visiting a blocks.""" + + +class CompilerExit(Exception): + """Raised if the compiler encountered a situation where it just + doesn't make sense to further process the code. Any block that + raises such an exception is not further processed. + """ + + +class CodeGenerator(NodeVisitor): + def __init__( + self, + environment: "Environment", + name: t.Optional[str], + filename: t.Optional[str], + stream: t.Optional[t.TextIO] = None, + defer_init: bool = False, + optimized: bool = True, + ) -> None: + if stream is None: + stream = StringIO() + self.environment = environment + self.name = name + self.filename = filename + self.stream = stream + self.created_block_context = False + self.defer_init = defer_init + self.optimizer: t.Optional[Optimizer] = None + + if optimized: + self.optimizer = Optimizer(environment) + + # aliases for imports + self.import_aliases: t.Dict[str, str] = {} + + # a registry for all blocks. Because blocks are moved out + # into the global python scope they are registered here + self.blocks: t.Dict[str, nodes.Block] = {} + + # the number of extends statements so far + self.extends_so_far = 0 + + # some templates have a rootlevel extends. In this case we + # can safely assume that we're a child template and do some + # more optimizations. + self.has_known_extends = False + + # the current line number + self.code_lineno = 1 + + # registry of all filters and tests (global, not block local) + self.tests: t.Dict[str, str] = {} + self.filters: t.Dict[str, str] = {} + + # the debug information + self.debug_info: t.List[t.Tuple[int, int]] = [] + self._write_debug_info: t.Optional[int] = None + + # the number of new lines before the next write() + self._new_lines = 0 + + # the line number of the last written statement + self._last_line = 0 + + # true if nothing was written so far. + self._first_write = True + + # used by the `temporary_identifier` method to get new + # unique, temporary identifier + self._last_identifier = 0 + + # the current indentation + self._indentation = 0 + + # Tracks toplevel assignments + self._assign_stack: t.List[t.Set[str]] = [] + + # Tracks parameter definition blocks + self._param_def_block: t.List[t.Set[str]] = [] + + # Tracks the current context. + self._context_reference_stack = ["context"] + + @property + def optimized(self) -> bool: + return self.optimizer is not None + + # -- Various compilation helpers + + def fail(self, msg: str, lineno: int) -> "te.NoReturn": + """Fail with a :exc:`TemplateAssertionError`.""" + raise TemplateAssertionError(msg, lineno, self.name, self.filename) + + def temporary_identifier(self) -> str: + """Get a new unique identifier.""" + self._last_identifier += 1 + return f"t_{self._last_identifier}" + + def buffer(self, frame: Frame) -> None: + """Enable buffering for the frame from that point onwards.""" + frame.buffer = self.temporary_identifier() + self.writeline(f"{frame.buffer} = []") + + def return_buffer_contents( + self, frame: Frame, force_unescaped: bool = False + ) -> None: + """Return the buffer contents of the frame.""" + if not force_unescaped: + if frame.eval_ctx.volatile: + self.writeline("if context.eval_ctx.autoescape:") + self.indent() + self.writeline(f"return Markup(concat({frame.buffer}))") + self.outdent() + self.writeline("else:") + self.indent() + self.writeline(f"return concat({frame.buffer})") + self.outdent() + return + elif frame.eval_ctx.autoescape: + self.writeline(f"return Markup(concat({frame.buffer}))") + return + self.writeline(f"return concat({frame.buffer})") + + def indent(self) -> None: + """Indent by one.""" + self._indentation += 1 + + def outdent(self, step: int = 1) -> None: + """Outdent by step.""" + self._indentation -= step + + def start_write(self, frame: Frame, node: t.Optional[nodes.Node] = None) -> None: + """Yield or write into the frame buffer.""" + if frame.buffer is None: + self.writeline("yield ", node) + else: + self.writeline(f"{frame.buffer}.append(", node) + + def end_write(self, frame: Frame) -> None: + """End the writing process started by `start_write`.""" + if frame.buffer is not None: + self.write(")") + + def simple_write( + self, s: str, frame: Frame, node: t.Optional[nodes.Node] = None + ) -> None: + """Simple shortcut for start_write + write + end_write.""" + self.start_write(frame, node) + self.write(s) + self.end_write(frame) + + def blockvisit(self, nodes: t.Iterable[nodes.Node], frame: Frame) -> None: + """Visit a list of nodes as block in a frame. If the current frame + is no buffer a dummy ``if 0: yield None`` is written automatically. + """ + try: + self.writeline("pass") + for node in nodes: + self.visit(node, frame) + except CompilerExit: + pass + + def write(self, x: str) -> None: + """Write a string into the output stream.""" + if self._new_lines: + if not self._first_write: + self.stream.write("\n" * self._new_lines) + self.code_lineno += self._new_lines + if self._write_debug_info is not None: + self.debug_info.append((self._write_debug_info, self.code_lineno)) + self._write_debug_info = None + self._first_write = False + self.stream.write(" " * self._indentation) + self._new_lines = 0 + self.stream.write(x) + + def writeline( + self, x: str, node: t.Optional[nodes.Node] = None, extra: int = 0 + ) -> None: + """Combination of newline and write.""" + self.newline(node, extra) + self.write(x) + + def newline(self, node: t.Optional[nodes.Node] = None, extra: int = 0) -> None: + """Add one or more newlines before the next write.""" + self._new_lines = max(self._new_lines, 1 + extra) + if node is not None and node.lineno != self._last_line: + self._write_debug_info = node.lineno + self._last_line = node.lineno + + def signature( + self, + node: t.Union[nodes.Call, nodes.Filter, nodes.Test], + frame: Frame, + extra_kwargs: t.Optional[t.Mapping[str, t.Any]] = None, + ) -> None: + """Writes a function call to the stream for the current node. + A leading comma is added automatically. The extra keyword + arguments may not include python keywords otherwise a syntax + error could occur. The extra keyword arguments should be given + as python dict. + """ + # if any of the given keyword arguments is a python keyword + # we have to make sure that no invalid call is created. + kwarg_workaround = any( + is_python_keyword(t.cast(str, k)) + for k in chain((x.key for x in node.kwargs), extra_kwargs or ()) + ) + + for arg in node.args: + self.write(", ") + self.visit(arg, frame) + + if not kwarg_workaround: + for kwarg in node.kwargs: + self.write(", ") + self.visit(kwarg, frame) + if extra_kwargs is not None: + for key, value in extra_kwargs.items(): + self.write(f", {key}={value}") + if node.dyn_args: + self.write(", *") + self.visit(node.dyn_args, frame) + + if kwarg_workaround: + if node.dyn_kwargs is not None: + self.write(", **dict({") + else: + self.write(", **{") + for kwarg in node.kwargs: + self.write(f"{kwarg.key!r}: ") + self.visit(kwarg.value, frame) + self.write(", ") + if extra_kwargs is not None: + for key, value in extra_kwargs.items(): + self.write(f"{key!r}: {value}, ") + if node.dyn_kwargs is not None: + self.write("}, **") + self.visit(node.dyn_kwargs, frame) + self.write(")") + else: + self.write("}") + + elif node.dyn_kwargs is not None: + self.write(", **") + self.visit(node.dyn_kwargs, frame) + + def pull_dependencies(self, nodes: t.Iterable[nodes.Node]) -> None: + """Find all filter and test names used in the template and + assign them to variables in the compiled namespace. Checking + that the names are registered with the environment is done when + compiling the Filter and Test nodes. If the node is in an If or + CondExpr node, the check is done at runtime instead. + + .. versionchanged:: 3.0 + Filters and tests in If and CondExpr nodes are checked at + runtime instead of compile time. + """ + visitor = DependencyFinderVisitor() + + for node in nodes: + visitor.visit(node) + + for id_map, names, dependency in ( + (self.filters, visitor.filters, "filters"), + ( + self.tests, + visitor.tests, + "tests", + ), + ): + for name in sorted(names): + if name not in id_map: + id_map[name] = self.temporary_identifier() + + # add check during runtime that dependencies used inside of executed + # blocks are defined, as this step may be skipped during compile time + self.writeline("try:") + self.indent() + self.writeline(f"{id_map[name]} = environment.{dependency}[{name!r}]") + self.outdent() + self.writeline("except KeyError:") + self.indent() + self.writeline("@internalcode") + self.writeline(f"def {id_map[name]}(*unused):") + self.indent() + self.writeline( + f'raise TemplateRuntimeError("No {dependency[:-1]}' + f' named {name!r} found.")' + ) + self.outdent() + self.outdent() + + def enter_frame(self, frame: Frame) -> None: + undefs = [] + for target, (action, param) in frame.symbols.loads.items(): + if action == VAR_LOAD_PARAMETER: + pass + elif action == VAR_LOAD_RESOLVE: + self.writeline(f"{target} = {self.get_resolve_func()}({param!r})") + elif action == VAR_LOAD_ALIAS: + self.writeline(f"{target} = {param}") + elif action == VAR_LOAD_UNDEFINED: + undefs.append(target) + else: + raise NotImplementedError("unknown load instruction") + if undefs: + self.writeline(f"{' = '.join(undefs)} = missing") + + def leave_frame(self, frame: Frame, with_python_scope: bool = False) -> None: + if not with_python_scope: + undefs = [] + for target in frame.symbols.loads: + undefs.append(target) + if undefs: + self.writeline(f"{' = '.join(undefs)} = missing") + + def choose_async(self, async_value: str = "async ", sync_value: str = "") -> str: + return async_value if self.environment.is_async else sync_value + + def func(self, name: str) -> str: + return f"{self.choose_async()}def {name}" + + def macro_body( + self, node: t.Union[nodes.Macro, nodes.CallBlock], frame: Frame + ) -> t.Tuple[Frame, MacroRef]: + """Dump the function def of a macro or call block.""" + frame = frame.inner() + frame.symbols.analyze_node(node) + macro_ref = MacroRef(node) + + explicit_caller = None + skip_special_params = set() + args = [] + + for idx, arg in enumerate(node.args): + if arg.name == "caller": + explicit_caller = idx + if arg.name in ("kwargs", "varargs"): + skip_special_params.add(arg.name) + args.append(frame.symbols.ref(arg.name)) + + undeclared = find_undeclared(node.body, ("caller", "kwargs", "varargs")) + + if "caller" in undeclared: + # In older Jinja versions there was a bug that allowed caller + # to retain the special behavior even if it was mentioned in + # the argument list. However thankfully this was only really + # working if it was the last argument. So we are explicitly + # checking this now and error out if it is anywhere else in + # the argument list. + if explicit_caller is not None: + try: + node.defaults[explicit_caller - len(node.args)] + except IndexError: + self.fail( + "When defining macros or call blocks the " + 'special "caller" argument must be omitted ' + "or be given a default.", + node.lineno, + ) + else: + args.append(frame.symbols.declare_parameter("caller")) + macro_ref.accesses_caller = True + if "kwargs" in undeclared and "kwargs" not in skip_special_params: + args.append(frame.symbols.declare_parameter("kwargs")) + macro_ref.accesses_kwargs = True + if "varargs" in undeclared and "varargs" not in skip_special_params: + args.append(frame.symbols.declare_parameter("varargs")) + macro_ref.accesses_varargs = True + + # macros are delayed, they never require output checks + frame.require_output_check = False + frame.symbols.analyze_node(node) + self.writeline(f"{self.func('macro')}({', '.join(args)}):", node) + self.indent() + + self.buffer(frame) + self.enter_frame(frame) + + self.push_parameter_definitions(frame) + for idx, arg in enumerate(node.args): + ref = frame.symbols.ref(arg.name) + self.writeline(f"if {ref} is missing:") + self.indent() + try: + default = node.defaults[idx - len(node.args)] + except IndexError: + self.writeline( + f'{ref} = undefined("parameter {arg.name!r} was not provided",' + f" name={arg.name!r})" + ) + else: + self.writeline(f"{ref} = ") + self.visit(default, frame) + self.mark_parameter_stored(ref) + self.outdent() + self.pop_parameter_definitions() + + self.blockvisit(node.body, frame) + self.return_buffer_contents(frame, force_unescaped=True) + self.leave_frame(frame, with_python_scope=True) + self.outdent() + + return frame, macro_ref + + def macro_def(self, macro_ref: MacroRef, frame: Frame) -> None: + """Dump the macro definition for the def created by macro_body.""" + arg_tuple = ", ".join(repr(x.name) for x in macro_ref.node.args) + name = getattr(macro_ref.node, "name", None) + if len(macro_ref.node.args) == 1: + arg_tuple += "," + self.write( + f"Macro(environment, macro, {name!r}, ({arg_tuple})," + f" {macro_ref.accesses_kwargs!r}, {macro_ref.accesses_varargs!r}," + f" {macro_ref.accesses_caller!r}, context.eval_ctx.autoescape)" + ) + + def position(self, node: nodes.Node) -> str: + """Return a human readable position for the node.""" + rv = f"line {node.lineno}" + if self.name is not None: + rv = f"{rv} in {self.name!r}" + return rv + + def dump_local_context(self, frame: Frame) -> str: + items_kv = ", ".join( + f"{name!r}: {target}" + for name, target in frame.symbols.dump_stores().items() + ) + return f"{{{items_kv}}}" + + def write_commons(self) -> None: + """Writes a common preamble that is used by root and block functions. + Primarily this sets up common local helpers and enforces a generator + through a dead branch. + """ + self.writeline("resolve = context.resolve_or_missing") + self.writeline("undefined = environment.undefined") + self.writeline("concat = environment.concat") + # always use the standard Undefined class for the implicit else of + # conditional expressions + self.writeline("cond_expr_undefined = Undefined") + self.writeline("if 0: yield None") + + def push_parameter_definitions(self, frame: Frame) -> None: + """Pushes all parameter targets from the given frame into a local + stack that permits tracking of yet to be assigned parameters. In + particular this enables the optimization from `visit_Name` to skip + undefined expressions for parameters in macros as macros can reference + otherwise unbound parameters. + """ + self._param_def_block.append(frame.symbols.dump_param_targets()) + + def pop_parameter_definitions(self) -> None: + """Pops the current parameter definitions set.""" + self._param_def_block.pop() + + def mark_parameter_stored(self, target: str) -> None: + """Marks a parameter in the current parameter definitions as stored. + This will skip the enforced undefined checks. + """ + if self._param_def_block: + self._param_def_block[-1].discard(target) + + def push_context_reference(self, target: str) -> None: + self._context_reference_stack.append(target) + + def pop_context_reference(self) -> None: + self._context_reference_stack.pop() + + def get_context_ref(self) -> str: + return self._context_reference_stack[-1] + + def get_resolve_func(self) -> str: + target = self._context_reference_stack[-1] + if target == "context": + return "resolve" + return f"{target}.resolve" + + def derive_context(self, frame: Frame) -> str: + return f"{self.get_context_ref()}.derived({self.dump_local_context(frame)})" + + def parameter_is_undeclared(self, target: str) -> bool: + """Checks if a given target is an undeclared parameter.""" + if not self._param_def_block: + return False + return target in self._param_def_block[-1] + + def push_assign_tracking(self) -> None: + """Pushes a new layer for assignment tracking.""" + self._assign_stack.append(set()) + + def pop_assign_tracking(self, frame: Frame) -> None: + """Pops the topmost level for assignment tracking and updates the + context variables if necessary. + """ + vars = self._assign_stack.pop() + if ( + not frame.block_frame + and not frame.loop_frame + and not frame.toplevel + or not vars + ): + return + public_names = [x for x in vars if x[:1] != "_"] + if len(vars) == 1: + name = next(iter(vars)) + ref = frame.symbols.ref(name) + if frame.loop_frame: + self.writeline(f"_loop_vars[{name!r}] = {ref}") + return + if frame.block_frame: + self.writeline(f"_block_vars[{name!r}] = {ref}") + return + self.writeline(f"context.vars[{name!r}] = {ref}") + else: + if frame.loop_frame: + self.writeline("_loop_vars.update({") + elif frame.block_frame: + self.writeline("_block_vars.update({") + else: + self.writeline("context.vars.update({") + for idx, name in enumerate(sorted(vars)): + if idx: + self.write(", ") + ref = frame.symbols.ref(name) + self.write(f"{name!r}: {ref}") + self.write("})") + if not frame.block_frame and not frame.loop_frame and public_names: + if len(public_names) == 1: + self.writeline(f"context.exported_vars.add({public_names[0]!r})") + else: + names_str = ", ".join(map(repr, sorted(public_names))) + self.writeline(f"context.exported_vars.update(({names_str}))") + + # -- Statement Visitors + + def visit_Template( + self, node: nodes.Template, frame: t.Optional[Frame] = None + ) -> None: + assert frame is None, "no root frame allowed" + eval_ctx = EvalContext(self.environment, self.name) + + from .runtime import async_exported + from .runtime import exported + + if self.environment.is_async: + exported_names = sorted(exported + async_exported) + else: + exported_names = sorted(exported) + + self.writeline("from jinja2.runtime import " + ", ".join(exported_names)) + + # if we want a deferred initialization we cannot move the + # environment into a local name + envenv = "" if self.defer_init else ", environment=environment" + + # do we have an extends tag at all? If not, we can save some + # overhead by just not processing any inheritance code. + have_extends = node.find(nodes.Extends) is not None + + # find all blocks + for block in node.find_all(nodes.Block): + if block.name in self.blocks: + self.fail(f"block {block.name!r} defined twice", block.lineno) + self.blocks[block.name] = block + + # find all imports and import them + for import_ in node.find_all(nodes.ImportedName): + if import_.importname not in self.import_aliases: + imp = import_.importname + self.import_aliases[imp] = alias = self.temporary_identifier() + if "." in imp: + module, obj = imp.rsplit(".", 1) + self.writeline(f"from {module} import {obj} as {alias}") + else: + self.writeline(f"import {imp} as {alias}") + + # add the load name + self.writeline(f"name = {self.name!r}") + + # generate the root render function. + self.writeline( + f"{self.func('root')}(context, missing=missing{envenv}):", extra=1 + ) + self.indent() + self.write_commons() + + # process the root + frame = Frame(eval_ctx) + if "self" in find_undeclared(node.body, ("self",)): + ref = frame.symbols.declare_parameter("self") + self.writeline(f"{ref} = TemplateReference(context)") + frame.symbols.analyze_node(node) + frame.toplevel = frame.rootlevel = True + frame.require_output_check = have_extends and not self.has_known_extends + if have_extends: + self.writeline("parent_template = None") + self.enter_frame(frame) + self.pull_dependencies(node.body) + self.blockvisit(node.body, frame) + self.leave_frame(frame, with_python_scope=True) + self.outdent() + + # make sure that the parent root is called. + if have_extends: + if not self.has_known_extends: + self.indent() + self.writeline("if parent_template is not None:") + self.indent() + if not self.environment.is_async: + self.writeline("yield from parent_template.root_render_func(context)") + else: + self.writeline("agen = parent_template.root_render_func(context)") + self.writeline("try:") + self.indent() + self.writeline("async for event in agen:") + self.indent() + self.writeline("yield event") + self.outdent() + self.outdent() + self.writeline("finally: await agen.aclose()") + self.outdent(1 + (not self.has_known_extends)) + + # at this point we now have the blocks collected and can visit them too. + for name, block in self.blocks.items(): + self.writeline( + f"{self.func('block_' + name)}(context, missing=missing{envenv}):", + block, + 1, + ) + self.indent() + self.write_commons() + # It's important that we do not make this frame a child of the + # toplevel template. This would cause a variety of + # interesting issues with identifier tracking. + block_frame = Frame(eval_ctx) + block_frame.block_frame = True + undeclared = find_undeclared(block.body, ("self", "super")) + if "self" in undeclared: + ref = block_frame.symbols.declare_parameter("self") + self.writeline(f"{ref} = TemplateReference(context)") + if "super" in undeclared: + ref = block_frame.symbols.declare_parameter("super") + self.writeline(f"{ref} = context.super({name!r}, block_{name})") + block_frame.symbols.analyze_node(block) + block_frame.block = name + self.writeline("_block_vars = {}") + self.enter_frame(block_frame) + self.pull_dependencies(block.body) + self.blockvisit(block.body, block_frame) + self.leave_frame(block_frame, with_python_scope=True) + self.outdent() + + blocks_kv_str = ", ".join(f"{x!r}: block_{x}" for x in self.blocks) + self.writeline(f"blocks = {{{blocks_kv_str}}}", extra=1) + debug_kv_str = "&".join(f"{k}={v}" for k, v in self.debug_info) + self.writeline(f"debug_info = {debug_kv_str!r}") + + def visit_Block(self, node: nodes.Block, frame: Frame) -> None: + """Call a block and register it for the template.""" + level = 0 + if frame.toplevel: + # if we know that we are a child template, there is no need to + # check if we are one + if self.has_known_extends: + return + if self.extends_so_far > 0: + self.writeline("if parent_template is None:") + self.indent() + level += 1 + + if node.scoped: + context = self.derive_context(frame) + else: + context = self.get_context_ref() + + if node.required: + self.writeline(f"if len(context.blocks[{node.name!r}]) <= 1:", node) + self.indent() + self.writeline( + f'raise TemplateRuntimeError("Required block {node.name!r} not found")', + node, + ) + self.outdent() + + if not self.environment.is_async and frame.buffer is None: + self.writeline( + f"yield from context.blocks[{node.name!r}][0]({context})", node + ) + else: + self.writeline(f"gen = context.blocks[{node.name!r}][0]({context})") + self.writeline("try:") + self.indent() + self.writeline( + f"{self.choose_async()}for event in gen:", + node, + ) + self.indent() + self.simple_write("event", frame) + self.outdent() + self.outdent() + self.writeline( + f"finally: {self.choose_async('await gen.aclose()', 'gen.close()')}" + ) + + self.outdent(level) + + def visit_Extends(self, node: nodes.Extends, frame: Frame) -> None: + """Calls the extender.""" + if not frame.toplevel: + self.fail("cannot use extend from a non top-level scope", node.lineno) + + # if the number of extends statements in general is zero so + # far, we don't have to add a check if something extended + # the template before this one. + if self.extends_so_far > 0: + # if we have a known extends we just add a template runtime + # error into the generated code. We could catch that at compile + # time too, but i welcome it not to confuse users by throwing the + # same error at different times just "because we can". + if not self.has_known_extends: + self.writeline("if parent_template is not None:") + self.indent() + self.writeline('raise TemplateRuntimeError("extended multiple times")') + + # if we have a known extends already we don't need that code here + # as we know that the template execution will end here. + if self.has_known_extends: + raise CompilerExit() + else: + self.outdent() + + self.writeline("parent_template = environment.get_template(", node) + self.visit(node.template, frame) + self.write(f", {self.name!r})") + self.writeline("for name, parent_block in parent_template.blocks.items():") + self.indent() + self.writeline("context.blocks.setdefault(name, []).append(parent_block)") + self.outdent() + + # if this extends statement was in the root level we can take + # advantage of that information and simplify the generated code + # in the top level from this point onwards + if frame.rootlevel: + self.has_known_extends = True + + # and now we have one more + self.extends_so_far += 1 + + def visit_Include(self, node: nodes.Include, frame: Frame) -> None: + """Handles includes.""" + if node.ignore_missing: + self.writeline("try:") + self.indent() + + func_name = "get_or_select_template" + if isinstance(node.template, nodes.Const): + if isinstance(node.template.value, str): + func_name = "get_template" + elif isinstance(node.template.value, (tuple, list)): + func_name = "select_template" + elif isinstance(node.template, (nodes.Tuple, nodes.List)): + func_name = "select_template" + + self.writeline(f"template = environment.{func_name}(", node) + self.visit(node.template, frame) + self.write(f", {self.name!r})") + if node.ignore_missing: + self.outdent() + self.writeline("except TemplateNotFound:") + self.indent() + self.writeline("pass") + self.outdent() + self.writeline("else:") + self.indent() + + def loop_body() -> None: + self.indent() + self.simple_write("event", frame) + self.outdent() + + if node.with_context: + self.writeline( + f"gen = template.root_render_func(" + "template.new_context(context.get_all(), True," + f" {self.dump_local_context(frame)}))" + ) + self.writeline("try:") + self.indent() + self.writeline(f"{self.choose_async()}for event in gen:") + loop_body() + self.outdent() + self.writeline( + f"finally: {self.choose_async('await gen.aclose()', 'gen.close()')}" + ) + elif self.environment.is_async: + self.writeline( + "for event in (await template._get_default_module_async())" + "._body_stream:" + ) + loop_body() + else: + self.writeline("yield from template._get_default_module()._body_stream") + + if node.ignore_missing: + self.outdent() + + def _import_common( + self, node: t.Union[nodes.Import, nodes.FromImport], frame: Frame + ) -> None: + self.write(f"{self.choose_async('await ')}environment.get_template(") + self.visit(node.template, frame) + self.write(f", {self.name!r}).") + + if node.with_context: + f_name = f"make_module{self.choose_async('_async')}" + self.write( + f"{f_name}(context.get_all(), True, {self.dump_local_context(frame)})" + ) + else: + self.write(f"_get_default_module{self.choose_async('_async')}(context)") + + def visit_Import(self, node: nodes.Import, frame: Frame) -> None: + """Visit regular imports.""" + self.writeline(f"{frame.symbols.ref(node.target)} = ", node) + if frame.toplevel: + self.write(f"context.vars[{node.target!r}] = ") + + self._import_common(node, frame) + + if frame.toplevel and not node.target.startswith("_"): + self.writeline(f"context.exported_vars.discard({node.target!r})") + + def visit_FromImport(self, node: nodes.FromImport, frame: Frame) -> None: + """Visit named imports.""" + self.newline(node) + self.write("included_template = ") + self._import_common(node, frame) + var_names = [] + discarded_names = [] + for name in node.names: + if isinstance(name, tuple): + name, alias = name + else: + alias = name + self.writeline( + f"{frame.symbols.ref(alias)} =" + f" getattr(included_template, {name!r}, missing)" + ) + self.writeline(f"if {frame.symbols.ref(alias)} is missing:") + self.indent() + # The position will contain the template name, and will be formatted + # into a string that will be compiled into an f-string. Curly braces + # in the name must be replaced with escapes so that they will not be + # executed as part of the f-string. + position = self.position(node).replace("{", "{{").replace("}", "}}") + message = ( + "the template {included_template.__name__!r}" + f" (imported on {position})" + f" does not export the requested name {name!r}" + ) + self.writeline( + f"{frame.symbols.ref(alias)} = undefined(f{message!r}, name={name!r})" + ) + self.outdent() + if frame.toplevel: + var_names.append(alias) + if not alias.startswith("_"): + discarded_names.append(alias) + + if var_names: + if len(var_names) == 1: + name = var_names[0] + self.writeline(f"context.vars[{name!r}] = {frame.symbols.ref(name)}") + else: + names_kv = ", ".join( + f"{name!r}: {frame.symbols.ref(name)}" for name in var_names + ) + self.writeline(f"context.vars.update({{{names_kv}}})") + if discarded_names: + if len(discarded_names) == 1: + self.writeline(f"context.exported_vars.discard({discarded_names[0]!r})") + else: + names_str = ", ".join(map(repr, discarded_names)) + self.writeline( + f"context.exported_vars.difference_update(({names_str}))" + ) + + def visit_For(self, node: nodes.For, frame: Frame) -> None: + loop_frame = frame.inner() + loop_frame.loop_frame = True + test_frame = frame.inner() + else_frame = frame.inner() + + # try to figure out if we have an extended loop. An extended loop + # is necessary if the loop is in recursive mode if the special loop + # variable is accessed in the body if the body is a scoped block. + extended_loop = ( + node.recursive + or "loop" + in find_undeclared(node.iter_child_nodes(only=("body",)), ("loop",)) + or any(block.scoped for block in node.find_all(nodes.Block)) + ) + + loop_ref = None + if extended_loop: + loop_ref = loop_frame.symbols.declare_parameter("loop") + + loop_frame.symbols.analyze_node(node, for_branch="body") + if node.else_: + else_frame.symbols.analyze_node(node, for_branch="else") + + if node.test: + loop_filter_func = self.temporary_identifier() + test_frame.symbols.analyze_node(node, for_branch="test") + self.writeline(f"{self.func(loop_filter_func)}(fiter):", node.test) + self.indent() + self.enter_frame(test_frame) + self.writeline(self.choose_async("async for ", "for ")) + self.visit(node.target, loop_frame) + self.write(" in ") + self.write(self.choose_async("auto_aiter(fiter)", "fiter")) + self.write(":") + self.indent() + self.writeline("if ", node.test) + self.visit(node.test, test_frame) + self.write(":") + self.indent() + self.writeline("yield ") + self.visit(node.target, loop_frame) + self.outdent(3) + self.leave_frame(test_frame, with_python_scope=True) + + # if we don't have an recursive loop we have to find the shadowed + # variables at that point. Because loops can be nested but the loop + # variable is a special one we have to enforce aliasing for it. + if node.recursive: + self.writeline( + f"{self.func('loop')}(reciter, loop_render_func, depth=0):", node + ) + self.indent() + self.buffer(loop_frame) + + # Use the same buffer for the else frame + else_frame.buffer = loop_frame.buffer + + # make sure the loop variable is a special one and raise a template + # assertion error if a loop tries to write to loop + if extended_loop: + self.writeline(f"{loop_ref} = missing") + + for name in node.find_all(nodes.Name): + if name.ctx == "store" and name.name == "loop": + self.fail( + "Can't assign to special loop variable in for-loop target", + name.lineno, + ) + + if node.else_: + iteration_indicator = self.temporary_identifier() + self.writeline(f"{iteration_indicator} = 1") + + self.writeline(self.choose_async("async for ", "for "), node) + self.visit(node.target, loop_frame) + if extended_loop: + self.write(f", {loop_ref} in {self.choose_async('Async')}LoopContext(") + else: + self.write(" in ") + + if node.test: + self.write(f"{loop_filter_func}(") + if node.recursive: + self.write("reciter") + else: + if self.environment.is_async and not extended_loop: + self.write("auto_aiter(") + self.visit(node.iter, frame) + if self.environment.is_async and not extended_loop: + self.write(")") + if node.test: + self.write(")") + + if node.recursive: + self.write(", undefined, loop_render_func, depth):") + else: + self.write(", undefined):" if extended_loop else ":") + + self.indent() + self.enter_frame(loop_frame) + + self.writeline("_loop_vars = {}") + self.blockvisit(node.body, loop_frame) + if node.else_: + self.writeline(f"{iteration_indicator} = 0") + self.outdent() + self.leave_frame( + loop_frame, with_python_scope=node.recursive and not node.else_ + ) + + if node.else_: + self.writeline(f"if {iteration_indicator}:") + self.indent() + self.enter_frame(else_frame) + self.blockvisit(node.else_, else_frame) + self.leave_frame(else_frame) + self.outdent() + + # if the node was recursive we have to return the buffer contents + # and start the iteration code + if node.recursive: + self.return_buffer_contents(loop_frame) + self.outdent() + self.start_write(frame, node) + self.write(f"{self.choose_async('await ')}loop(") + if self.environment.is_async: + self.write("auto_aiter(") + self.visit(node.iter, frame) + if self.environment.is_async: + self.write(")") + self.write(", loop)") + self.end_write(frame) + + # at the end of the iteration, clear any assignments made in the + # loop from the top level + if self._assign_stack: + self._assign_stack[-1].difference_update(loop_frame.symbols.stores) + + def visit_If(self, node: nodes.If, frame: Frame) -> None: + if_frame = frame.soft() + self.writeline("if ", node) + self.visit(node.test, if_frame) + self.write(":") + self.indent() + self.blockvisit(node.body, if_frame) + self.outdent() + for elif_ in node.elif_: + self.writeline("elif ", elif_) + self.visit(elif_.test, if_frame) + self.write(":") + self.indent() + self.blockvisit(elif_.body, if_frame) + self.outdent() + if node.else_: + self.writeline("else:") + self.indent() + self.blockvisit(node.else_, if_frame) + self.outdent() + + def visit_Macro(self, node: nodes.Macro, frame: Frame) -> None: + macro_frame, macro_ref = self.macro_body(node, frame) + self.newline() + if frame.toplevel: + if not node.name.startswith("_"): + self.write(f"context.exported_vars.add({node.name!r})") + self.writeline(f"context.vars[{node.name!r}] = ") + self.write(f"{frame.symbols.ref(node.name)} = ") + self.macro_def(macro_ref, macro_frame) + + def visit_CallBlock(self, node: nodes.CallBlock, frame: Frame) -> None: + call_frame, macro_ref = self.macro_body(node, frame) + self.writeline("caller = ") + self.macro_def(macro_ref, call_frame) + self.start_write(frame, node) + self.visit_Call(node.call, frame, forward_caller=True) + self.end_write(frame) + + def visit_FilterBlock(self, node: nodes.FilterBlock, frame: Frame) -> None: + filter_frame = frame.inner() + filter_frame.symbols.analyze_node(node) + self.enter_frame(filter_frame) + self.buffer(filter_frame) + self.blockvisit(node.body, filter_frame) + self.start_write(frame, node) + self.visit_Filter(node.filter, filter_frame) + self.end_write(frame) + self.leave_frame(filter_frame) + + def visit_With(self, node: nodes.With, frame: Frame) -> None: + with_frame = frame.inner() + with_frame.symbols.analyze_node(node) + self.enter_frame(with_frame) + for target, expr in zip(node.targets, node.values): + self.newline() + self.visit(target, with_frame) + self.write(" = ") + self.visit(expr, frame) + self.blockvisit(node.body, with_frame) + self.leave_frame(with_frame) + + def visit_ExprStmt(self, node: nodes.ExprStmt, frame: Frame) -> None: + self.newline(node) + self.visit(node.node, frame) + + class _FinalizeInfo(t.NamedTuple): + const: t.Optional[t.Callable[..., str]] + src: t.Optional[str] + + @staticmethod + def _default_finalize(value: t.Any) -> t.Any: + """The default finalize function if the environment isn't + configured with one. Or, if the environment has one, this is + called on that function's output for constants. + """ + return str(value) + + _finalize: t.Optional[_FinalizeInfo] = None + + def _make_finalize(self) -> _FinalizeInfo: + """Build the finalize function to be used on constants and at + runtime. Cached so it's only created once for all output nodes. + + Returns a ``namedtuple`` with the following attributes: + + ``const`` + A function to finalize constant data at compile time. + + ``src`` + Source code to output around nodes to be evaluated at + runtime. + """ + if self._finalize is not None: + return self._finalize + + finalize: t.Optional[t.Callable[..., t.Any]] + finalize = default = self._default_finalize + src = None + + if self.environment.finalize: + src = "environment.finalize(" + env_finalize = self.environment.finalize + pass_arg = { + _PassArg.context: "context", + _PassArg.eval_context: "context.eval_ctx", + _PassArg.environment: "environment", + }.get( + _PassArg.from_obj(env_finalize) # type: ignore + ) + finalize = None + + if pass_arg is None: + + def finalize(value: t.Any) -> t.Any: # noqa: F811 + return default(env_finalize(value)) + + else: + src = f"{src}{pass_arg}, " + + if pass_arg == "environment": + + def finalize(value: t.Any) -> t.Any: # noqa: F811 + return default(env_finalize(self.environment, value)) + + self._finalize = self._FinalizeInfo(finalize, src) + return self._finalize + + def _output_const_repr(self, group: t.Iterable[t.Any]) -> str: + """Given a group of constant values converted from ``Output`` + child nodes, produce a string to write to the template module + source. + """ + return repr(concat(group)) + + def _output_child_to_const( + self, node: nodes.Expr, frame: Frame, finalize: _FinalizeInfo + ) -> str: + """Try to optimize a child of an ``Output`` node by trying to + convert it to constant, finalized data at compile time. + + If :exc:`Impossible` is raised, the node is not constant and + will be evaluated at runtime. Any other exception will also be + evaluated at runtime for easier debugging. + """ + const = node.as_const(frame.eval_ctx) + + if frame.eval_ctx.autoescape: + const = escape(const) + + # Template data doesn't go through finalize. + if isinstance(node, nodes.TemplateData): + return str(const) + + return finalize.const(const) # type: ignore + + def _output_child_pre( + self, node: nodes.Expr, frame: Frame, finalize: _FinalizeInfo + ) -> None: + """Output extra source code before visiting a child of an + ``Output`` node. + """ + if frame.eval_ctx.volatile: + self.write("(escape if context.eval_ctx.autoescape else str)(") + elif frame.eval_ctx.autoescape: + self.write("escape(") + else: + self.write("str(") + + if finalize.src is not None: + self.write(finalize.src) + + def _output_child_post( + self, node: nodes.Expr, frame: Frame, finalize: _FinalizeInfo + ) -> None: + """Output extra source code after visiting a child of an + ``Output`` node. + """ + self.write(")") + + if finalize.src is not None: + self.write(")") + + def visit_Output(self, node: nodes.Output, frame: Frame) -> None: + # If an extends is active, don't render outside a block. + if frame.require_output_check: + # A top-level extends is known to exist at compile time. + if self.has_known_extends: + return + + self.writeline("if parent_template is None:") + self.indent() + + finalize = self._make_finalize() + body: t.List[t.Union[t.List[t.Any], nodes.Expr]] = [] + + # Evaluate constants at compile time if possible. Each item in + # body will be either a list of static data or a node to be + # evaluated at runtime. + for child in node.nodes: + try: + if not ( + # If the finalize function requires runtime context, + # constants can't be evaluated at compile time. + finalize.const + # Unless it's basic template data that won't be + # finalized anyway. + or isinstance(child, nodes.TemplateData) + ): + raise nodes.Impossible() + + const = self._output_child_to_const(child, frame, finalize) + except (nodes.Impossible, Exception): + # The node was not constant and needs to be evaluated at + # runtime. Or another error was raised, which is easier + # to debug at runtime. + body.append(child) + continue + + if body and isinstance(body[-1], list): + body[-1].append(const) + else: + body.append([const]) + + if frame.buffer is not None: + if len(body) == 1: + self.writeline(f"{frame.buffer}.append(") + else: + self.writeline(f"{frame.buffer}.extend((") + + self.indent() + + for item in body: + if isinstance(item, list): + # A group of constant data to join and output. + val = self._output_const_repr(item) + + if frame.buffer is None: + self.writeline("yield " + val) + else: + self.writeline(val + ",") + else: + if frame.buffer is None: + self.writeline("yield ", item) + else: + self.newline(item) + + # A node to be evaluated at runtime. + self._output_child_pre(item, frame, finalize) + self.visit(item, frame) + self._output_child_post(item, frame, finalize) + + if frame.buffer is not None: + self.write(",") + + if frame.buffer is not None: + self.outdent() + self.writeline(")" if len(body) == 1 else "))") + + if frame.require_output_check: + self.outdent() + + def visit_Assign(self, node: nodes.Assign, frame: Frame) -> None: + self.push_assign_tracking() + + # ``a.b`` is allowed for assignment, and is parsed as an NSRef. However, + # it is only valid if it references a Namespace object. Emit a check for + # that for each ref here, before assignment code is emitted. This can't + # be done in visit_NSRef as the ref could be in the middle of a tuple. + seen_refs: t.Set[str] = set() + + for nsref in node.find_all(nodes.NSRef): + if nsref.name in seen_refs: + # Only emit the check for each reference once, in case the same + # ref is used multiple times in a tuple, `ns.a, ns.b = c, d`. + continue + + seen_refs.add(nsref.name) + ref = frame.symbols.ref(nsref.name) + self.writeline(f"if not isinstance({ref}, Namespace):") + self.indent() + self.writeline( + "raise TemplateRuntimeError" + '("cannot assign attribute on non-namespace object")' + ) + self.outdent() + + self.newline(node) + self.visit(node.target, frame) + self.write(" = ") + self.visit(node.node, frame) + self.pop_assign_tracking(frame) + + def visit_AssignBlock(self, node: nodes.AssignBlock, frame: Frame) -> None: + self.push_assign_tracking() + block_frame = frame.inner() + # This is a special case. Since a set block always captures we + # will disable output checks. This way one can use set blocks + # toplevel even in extended templates. + block_frame.require_output_check = False + block_frame.symbols.analyze_node(node) + self.enter_frame(block_frame) + self.buffer(block_frame) + self.blockvisit(node.body, block_frame) + self.newline(node) + self.visit(node.target, frame) + self.write(" = (Markup if context.eval_ctx.autoescape else identity)(") + if node.filter is not None: + self.visit_Filter(node.filter, block_frame) + else: + self.write(f"concat({block_frame.buffer})") + self.write(")") + self.pop_assign_tracking(frame) + self.leave_frame(block_frame) + + # -- Expression Visitors + + def visit_Name(self, node: nodes.Name, frame: Frame) -> None: + if node.ctx == "store" and ( + frame.toplevel or frame.loop_frame or frame.block_frame + ): + if self._assign_stack: + self._assign_stack[-1].add(node.name) + ref = frame.symbols.ref(node.name) + + # If we are looking up a variable we might have to deal with the + # case where it's undefined. We can skip that case if the load + # instruction indicates a parameter which are always defined. + if node.ctx == "load": + load = frame.symbols.find_load(ref) + if not ( + load is not None + and load[0] == VAR_LOAD_PARAMETER + and not self.parameter_is_undeclared(ref) + ): + self.write( + f"(undefined(name={node.name!r}) if {ref} is missing else {ref})" + ) + return + + self.write(ref) + + def visit_NSRef(self, node: nodes.NSRef, frame: Frame) -> None: + # NSRef is a dotted assignment target a.b=c, but uses a[b]=c internally. + # visit_Assign emits code to validate that each ref is to a Namespace + # object only. That can't be emitted here as the ref could be in the + # middle of a tuple assignment. + ref = frame.symbols.ref(node.name) + self.writeline(f"{ref}[{node.attr!r}]") + + def visit_Const(self, node: nodes.Const, frame: Frame) -> None: + val = node.as_const(frame.eval_ctx) + if isinstance(val, float): + self.write(str(val)) + else: + self.write(repr(val)) + + def visit_TemplateData(self, node: nodes.TemplateData, frame: Frame) -> None: + try: + self.write(repr(node.as_const(frame.eval_ctx))) + except nodes.Impossible: + self.write( + f"(Markup if context.eval_ctx.autoescape else identity)({node.data!r})" + ) + + def visit_Tuple(self, node: nodes.Tuple, frame: Frame) -> None: + self.write("(") + idx = -1 + for idx, item in enumerate(node.items): + if idx: + self.write(", ") + self.visit(item, frame) + self.write(",)" if idx == 0 else ")") + + def visit_List(self, node: nodes.List, frame: Frame) -> None: + self.write("[") + for idx, item in enumerate(node.items): + if idx: + self.write(", ") + self.visit(item, frame) + self.write("]") + + def visit_Dict(self, node: nodes.Dict, frame: Frame) -> None: + self.write("{") + for idx, item in enumerate(node.items): + if idx: + self.write(", ") + self.visit(item.key, frame) + self.write(": ") + self.visit(item.value, frame) + self.write("}") + + visit_Add = _make_binop("+") + visit_Sub = _make_binop("-") + visit_Mul = _make_binop("*") + visit_Div = _make_binop("/") + visit_FloorDiv = _make_binop("//") + visit_Pow = _make_binop("**") + visit_Mod = _make_binop("%") + visit_And = _make_binop("and") + visit_Or = _make_binop("or") + visit_Pos = _make_unop("+") + visit_Neg = _make_unop("-") + visit_Not = _make_unop("not ") + + @optimizeconst + def visit_Concat(self, node: nodes.Concat, frame: Frame) -> None: + if frame.eval_ctx.volatile: + func_name = "(markup_join if context.eval_ctx.volatile else str_join)" + elif frame.eval_ctx.autoescape: + func_name = "markup_join" + else: + func_name = "str_join" + self.write(f"{func_name}((") + for arg in node.nodes: + self.visit(arg, frame) + self.write(", ") + self.write("))") + + @optimizeconst + def visit_Compare(self, node: nodes.Compare, frame: Frame) -> None: + self.write("(") + self.visit(node.expr, frame) + for op in node.ops: + self.visit(op, frame) + self.write(")") + + def visit_Operand(self, node: nodes.Operand, frame: Frame) -> None: + self.write(f" {operators[node.op]} ") + self.visit(node.expr, frame) + + @optimizeconst + def visit_Getattr(self, node: nodes.Getattr, frame: Frame) -> None: + if self.environment.is_async: + self.write("(await auto_await(") + + self.write("environment.getattr(") + self.visit(node.node, frame) + self.write(f", {node.attr!r})") + + if self.environment.is_async: + self.write("))") + + @optimizeconst + def visit_Getitem(self, node: nodes.Getitem, frame: Frame) -> None: + # slices bypass the environment getitem method. + if isinstance(node.arg, nodes.Slice): + self.visit(node.node, frame) + self.write("[") + self.visit(node.arg, frame) + self.write("]") + else: + if self.environment.is_async: + self.write("(await auto_await(") + + self.write("environment.getitem(") + self.visit(node.node, frame) + self.write(", ") + self.visit(node.arg, frame) + self.write(")") + + if self.environment.is_async: + self.write("))") + + def visit_Slice(self, node: nodes.Slice, frame: Frame) -> None: + if node.start is not None: + self.visit(node.start, frame) + self.write(":") + if node.stop is not None: + self.visit(node.stop, frame) + if node.step is not None: + self.write(":") + self.visit(node.step, frame) + + @contextmanager + def _filter_test_common( + self, node: t.Union[nodes.Filter, nodes.Test], frame: Frame, is_filter: bool + ) -> t.Iterator[None]: + if self.environment.is_async: + self.write("(await auto_await(") + + if is_filter: + self.write(f"{self.filters[node.name]}(") + func = self.environment.filters.get(node.name) + else: + self.write(f"{self.tests[node.name]}(") + func = self.environment.tests.get(node.name) + + # When inside an If or CondExpr frame, allow the filter to be + # undefined at compile time and only raise an error if it's + # actually called at runtime. See pull_dependencies. + if func is None and not frame.soft_frame: + type_name = "filter" if is_filter else "test" + self.fail(f"No {type_name} named {node.name!r}.", node.lineno) + + pass_arg = { + _PassArg.context: "context", + _PassArg.eval_context: "context.eval_ctx", + _PassArg.environment: "environment", + }.get( + _PassArg.from_obj(func) # type: ignore + ) + + if pass_arg is not None: + self.write(f"{pass_arg}, ") + + # Back to the visitor function to handle visiting the target of + # the filter or test. + yield + + self.signature(node, frame) + self.write(")") + + if self.environment.is_async: + self.write("))") + + @optimizeconst + def visit_Filter(self, node: nodes.Filter, frame: Frame) -> None: + with self._filter_test_common(node, frame, True): + # if the filter node is None we are inside a filter block + # and want to write to the current buffer + if node.node is not None: + self.visit(node.node, frame) + elif frame.eval_ctx.volatile: + self.write( + f"(Markup(concat({frame.buffer}))" + f" if context.eval_ctx.autoescape else concat({frame.buffer}))" + ) + elif frame.eval_ctx.autoescape: + self.write(f"Markup(concat({frame.buffer}))") + else: + self.write(f"concat({frame.buffer})") + + @optimizeconst + def visit_Test(self, node: nodes.Test, frame: Frame) -> None: + with self._filter_test_common(node, frame, False): + self.visit(node.node, frame) + + @optimizeconst + def visit_CondExpr(self, node: nodes.CondExpr, frame: Frame) -> None: + frame = frame.soft() + + def write_expr2() -> None: + if node.expr2 is not None: + self.visit(node.expr2, frame) + return + + self.write( + f'cond_expr_undefined("the inline if-expression on' + f" {self.position(node)} evaluated to false and no else" + f' section was defined.")' + ) + + self.write("(") + self.visit(node.expr1, frame) + self.write(" if ") + self.visit(node.test, frame) + self.write(" else ") + write_expr2() + self.write(")") + + @optimizeconst + def visit_Call( + self, node: nodes.Call, frame: Frame, forward_caller: bool = False + ) -> None: + if self.environment.is_async: + self.write("(await auto_await(") + if self.environment.sandboxed: + self.write("environment.call(context, ") + else: + self.write("context.call(") + self.visit(node.node, frame) + extra_kwargs = {"caller": "caller"} if forward_caller else None + loop_kwargs = {"_loop_vars": "_loop_vars"} if frame.loop_frame else {} + block_kwargs = {"_block_vars": "_block_vars"} if frame.block_frame else {} + if extra_kwargs: + extra_kwargs.update(loop_kwargs, **block_kwargs) + elif loop_kwargs or block_kwargs: + extra_kwargs = dict(loop_kwargs, **block_kwargs) + self.signature(node, frame, extra_kwargs) + self.write(")") + if self.environment.is_async: + self.write("))") + + def visit_Keyword(self, node: nodes.Keyword, frame: Frame) -> None: + self.write(node.key + "=") + self.visit(node.value, frame) + + # -- Unused nodes for extensions + + def visit_MarkSafe(self, node: nodes.MarkSafe, frame: Frame) -> None: + self.write("Markup(") + self.visit(node.expr, frame) + self.write(")") + + def visit_MarkSafeIfAutoescape( + self, node: nodes.MarkSafeIfAutoescape, frame: Frame + ) -> None: + self.write("(Markup if context.eval_ctx.autoescape else identity)(") + self.visit(node.expr, frame) + self.write(")") + + def visit_EnvironmentAttribute( + self, node: nodes.EnvironmentAttribute, frame: Frame + ) -> None: + self.write("environment." + node.name) + + def visit_ExtensionAttribute( + self, node: nodes.ExtensionAttribute, frame: Frame + ) -> None: + self.write(f"environment.extensions[{node.identifier!r}].{node.name}") + + def visit_ImportedName(self, node: nodes.ImportedName, frame: Frame) -> None: + self.write(self.import_aliases[node.importname]) + + def visit_InternalName(self, node: nodes.InternalName, frame: Frame) -> None: + self.write(node.name) + + def visit_ContextReference( + self, node: nodes.ContextReference, frame: Frame + ) -> None: + self.write("context") + + def visit_DerivedContextReference( + self, node: nodes.DerivedContextReference, frame: Frame + ) -> None: + self.write(self.derive_context(frame)) + + def visit_Continue(self, node: nodes.Continue, frame: Frame) -> None: + self.writeline("continue", node) + + def visit_Break(self, node: nodes.Break, frame: Frame) -> None: + self.writeline("break", node) + + def visit_Scope(self, node: nodes.Scope, frame: Frame) -> None: + scope_frame = frame.inner() + scope_frame.symbols.analyze_node(node) + self.enter_frame(scope_frame) + self.blockvisit(node.body, scope_frame) + self.leave_frame(scope_frame) + + def visit_OverlayScope(self, node: nodes.OverlayScope, frame: Frame) -> None: + ctx = self.temporary_identifier() + self.writeline(f"{ctx} = {self.derive_context(frame)}") + self.writeline(f"{ctx}.vars = ") + self.visit(node.context, frame) + self.push_context_reference(ctx) + + scope_frame = frame.inner(isolated=True) + scope_frame.symbols.analyze_node(node) + self.enter_frame(scope_frame) + self.blockvisit(node.body, scope_frame) + self.leave_frame(scope_frame) + self.pop_context_reference() + + def visit_EvalContextModifier( + self, node: nodes.EvalContextModifier, frame: Frame + ) -> None: + for keyword in node.options: + self.writeline(f"context.eval_ctx.{keyword.key} = ") + self.visit(keyword.value, frame) + try: + val = keyword.value.as_const(frame.eval_ctx) + except nodes.Impossible: + frame.eval_ctx.volatile = True + else: + setattr(frame.eval_ctx, keyword.key, val) + + def visit_ScopedEvalContextModifier( + self, node: nodes.ScopedEvalContextModifier, frame: Frame + ) -> None: + old_ctx_name = self.temporary_identifier() + saved_ctx = frame.eval_ctx.save() + self.writeline(f"{old_ctx_name} = context.eval_ctx.save()") + self.visit_EvalContextModifier(node, frame) + for child in node.body: + self.visit(child, frame) + frame.eval_ctx.revert(saved_ctx) + self.writeline(f"context.eval_ctx.revert({old_ctx_name})") diff --git a/.venv/lib/python3.10/site-packages/jinja2/constants.py b/.venv/lib/python3.10/site-packages/jinja2/constants.py new file mode 100644 index 0000000..41a1c23 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/jinja2/constants.py @@ -0,0 +1,20 @@ +#: list of lorem ipsum words used by the lipsum() helper function +LOREM_IPSUM_WORDS = """\ +a ac accumsan ad adipiscing aenean aliquam aliquet amet ante aptent arcu at +auctor augue bibendum blandit class commodo condimentum congue consectetuer +consequat conubia convallis cras cubilia cum curabitur curae cursus dapibus +diam dictum dictumst dignissim dis dolor donec dui duis egestas eget eleifend +elementum elit enim erat eros est et etiam eu euismod facilisi facilisis fames +faucibus felis fermentum feugiat fringilla fusce gravida habitant habitasse hac +hendrerit hymenaeos iaculis id imperdiet in inceptos integer interdum ipsum +justo lacinia lacus laoreet lectus leo libero ligula litora lobortis lorem +luctus maecenas magna magnis malesuada massa mattis mauris metus mi molestie +mollis montes morbi mus nam nascetur natoque nec neque netus nibh nisi nisl non +nonummy nostra nulla nullam nunc odio orci ornare parturient pede pellentesque +penatibus per pharetra phasellus placerat platea porta porttitor posuere +potenti praesent pretium primis proin pulvinar purus quam quis quisque rhoncus +ridiculus risus rutrum sagittis sapien scelerisque sed sem semper senectus sit +sociis sociosqu sodales sollicitudin suscipit suspendisse taciti tellus tempor +tempus tincidunt torquent tortor tristique turpis ullamcorper ultrices +ultricies urna ut varius vehicula vel velit venenatis vestibulum vitae vivamus +viverra volutpat vulputate""" diff --git a/.venv/lib/python3.10/site-packages/jinja2/debug.py b/.venv/lib/python3.10/site-packages/jinja2/debug.py new file mode 100644 index 0000000..eeeeee7 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/jinja2/debug.py @@ -0,0 +1,191 @@ +import sys +import typing as t +from types import CodeType +from types import TracebackType + +from .exceptions import TemplateSyntaxError +from .utils import internal_code +from .utils import missing + +if t.TYPE_CHECKING: + from .runtime import Context + + +def rewrite_traceback_stack(source: t.Optional[str] = None) -> BaseException: + """Rewrite the current exception to replace any tracebacks from + within compiled template code with tracebacks that look like they + came from the template source. + + This must be called within an ``except`` block. + + :param source: For ``TemplateSyntaxError``, the original source if + known. + :return: The original exception with the rewritten traceback. + """ + _, exc_value, tb = sys.exc_info() + exc_value = t.cast(BaseException, exc_value) + tb = t.cast(TracebackType, tb) + + if isinstance(exc_value, TemplateSyntaxError) and not exc_value.translated: + exc_value.translated = True + exc_value.source = source + # Remove the old traceback, otherwise the frames from the + # compiler still show up. + exc_value.with_traceback(None) + # Outside of runtime, so the frame isn't executing template + # code, but it still needs to point at the template. + tb = fake_traceback( + exc_value, None, exc_value.filename or "", exc_value.lineno + ) + else: + # Skip the frame for the render function. + tb = tb.tb_next + + stack = [] + + # Build the stack of traceback object, replacing any in template + # code with the source file and line information. + while tb is not None: + # Skip frames decorated with @internalcode. These are internal + # calls that aren't useful in template debugging output. + if tb.tb_frame.f_code in internal_code: + tb = tb.tb_next + continue + + template = tb.tb_frame.f_globals.get("__jinja_template__") + + if template is not None: + lineno = template.get_corresponding_lineno(tb.tb_lineno) + fake_tb = fake_traceback(exc_value, tb, template.filename, lineno) + stack.append(fake_tb) + else: + stack.append(tb) + + tb = tb.tb_next + + tb_next = None + + # Assign tb_next in reverse to avoid circular references. + for tb in reversed(stack): + tb.tb_next = tb_next + tb_next = tb + + return exc_value.with_traceback(tb_next) + + +def fake_traceback( # type: ignore + exc_value: BaseException, tb: t.Optional[TracebackType], filename: str, lineno: int +) -> TracebackType: + """Produce a new traceback object that looks like it came from the + template source instead of the compiled code. The filename, line + number, and location name will point to the template, and the local + variables will be the current template context. + + :param exc_value: The original exception to be re-raised to create + the new traceback. + :param tb: The original traceback to get the local variables and + code info from. + :param filename: The template filename. + :param lineno: The line number in the template source. + """ + if tb is not None: + # Replace the real locals with the context that would be + # available at that point in the template. + locals = get_template_locals(tb.tb_frame.f_locals) + locals.pop("__jinja_exception__", None) + else: + locals = {} + + globals = { + "__name__": filename, + "__file__": filename, + "__jinja_exception__": exc_value, + } + # Raise an exception at the correct line number. + code: CodeType = compile( + "\n" * (lineno - 1) + "raise __jinja_exception__", filename, "exec" + ) + + # Build a new code object that points to the template file and + # replaces the location with a block name. + location = "template" + + if tb is not None: + function = tb.tb_frame.f_code.co_name + + if function == "root": + location = "top-level template code" + elif function.startswith("block_"): + location = f"block {function[6:]!r}" + + if sys.version_info >= (3, 8): + code = code.replace(co_name=location) + else: + code = CodeType( + code.co_argcount, + code.co_kwonlyargcount, + code.co_nlocals, + code.co_stacksize, + code.co_flags, + code.co_code, + code.co_consts, + code.co_names, + code.co_varnames, + code.co_filename, + location, + code.co_firstlineno, + code.co_lnotab, + code.co_freevars, + code.co_cellvars, + ) + + # Execute the new code, which is guaranteed to raise, and return + # the new traceback without this frame. + try: + exec(code, globals, locals) + except BaseException: + return sys.exc_info()[2].tb_next # type: ignore + + +def get_template_locals(real_locals: t.Mapping[str, t.Any]) -> t.Dict[str, t.Any]: + """Based on the runtime locals, get the context that would be + available at that point in the template. + """ + # Start with the current template context. + ctx: t.Optional[Context] = real_locals.get("context") + + if ctx is not None: + data: t.Dict[str, t.Any] = ctx.get_all().copy() + else: + data = {} + + # Might be in a derived context that only sets local variables + # rather than pushing a context. Local variables follow the scheme + # l_depth_name. Find the highest-depth local that has a value for + # each name. + local_overrides: t.Dict[str, t.Tuple[int, t.Any]] = {} + + for name, value in real_locals.items(): + if not name.startswith("l_") or value is missing: + # Not a template variable, or no longer relevant. + continue + + try: + _, depth_str, name = name.split("_", 2) + depth = int(depth_str) + except ValueError: + continue + + cur_depth = local_overrides.get(name, (-1,))[0] + + if cur_depth < depth: + local_overrides[name] = (depth, value) + + # Modify the context with any derived context. + for name, (_, value) in local_overrides.items(): + if value is missing: + data.pop(name, None) + else: + data[name] = value + + return data diff --git a/.venv/lib/python3.10/site-packages/jinja2/defaults.py b/.venv/lib/python3.10/site-packages/jinja2/defaults.py new file mode 100644 index 0000000..638cad3 --- /dev/null +++ b/.venv/lib/python3.10/site-packages/jinja2/defaults.py @@ -0,0 +1,48 @@ +import typing as t + +from .filters import FILTERS as DEFAULT_FILTERS # noqa: F401 +from .tests import TESTS as DEFAULT_TESTS # noqa: F401 +from .utils import Cycler +from .utils import generate_lorem_ipsum +from .utils import Joiner +from .utils import Namespace + +if t.TYPE_CHECKING: + import typing_extensions as te + +# defaults for the parser / lexer +BLOCK_START_STRING = "{%" +BLOCK_END_STRING = "%}" +VARIABLE_START_STRING = "{{" +VARIABLE_END_STRING = "}}" +COMMENT_START_STRING = "{#" +COMMENT_END_STRING = "#}" +LINE_STATEMENT_PREFIX: t.Optional[str] = None +LINE_COMMENT_PREFIX: t.Optional[str] = None +TRIM_BLOCKS = False +LSTRIP_BLOCKS = False +NEWLINE_SEQUENCE: "te.Literal['\\n', '\\r\\n', '\\r']" = "\n" +KEEP_TRAILING_NEWLINE = False + +# default filters, tests and namespace + +DEFAULT_NAMESPACE = { + "range": range, + "dict": dict, + "lipsum": generate_lorem_ipsum, + "cycler": Cycler, + "joiner": Joiner, + "namespace": Namespace, +} + +# default policies +DEFAULT_POLICIES: t.Dict[str, t.Any] = { + "compiler.ascii_str": True, + "urlize.rel": "noopener", + "urlize.target": None, + "urlize.extra_schemes": None, + "truncate.leeway": 5, + "json.dumps_function": None, + "json.dumps_kwargs": {"sort_keys": True}, + "ext.i18n.trimmed": False, +} diff --git a/.venv/lib/python3.10/site-packages/jinja2/environment.py b/.venv/lib/python3.10/site-packages/jinja2/environment.py new file mode 100644 index 0000000..0fc6e5b --- /dev/null +++ b/.venv/lib/python3.10/site-packages/jinja2/environment.py @@ -0,0 +1,1672 @@ +"""Classes for managing templates and their runtime and compile time +options. +""" + +import os +import typing +import typing as t +import weakref +from collections import ChainMap +from functools import lru_cache +from functools import partial +from functools import reduce +from types import CodeType + +from markupsafe import Markup + +from . import nodes +from .compiler import CodeGenerator +from .compiler import generate +from .defaults import BLOCK_END_STRING +from .defaults import BLOCK_START_STRING +from .defaults import COMMENT_END_STRING +from .defaults import COMMENT_START_STRING +from .defaults import DEFAULT_FILTERS # type: ignore[attr-defined] +from .defaults import DEFAULT_NAMESPACE +from .defaults import DEFAULT_POLICIES +from .defaults import DEFAULT_TESTS # type: ignore[attr-defined] +from .defaults import KEEP_TRAILING_NEWLINE +from .defaults import LINE_COMMENT_PREFIX +from .defaults import LINE_STATEMENT_PREFIX +from .defaults import LSTRIP_BLOCKS +from .defaults import NEWLINE_SEQUENCE +from .defaults import TRIM_BLOCKS +from .defaults import VARIABLE_END_STRING +from .defaults import VARIABLE_START_STRING +from .exceptions import TemplateNotFound +from .exceptions import TemplateRuntimeError +from .exceptions import TemplatesNotFound +from .exceptions import TemplateSyntaxError +from .exceptions import UndefinedError +from .lexer import get_lexer +from .lexer import Lexer +from .lexer import TokenStream +from .nodes import EvalContext +from .parser import Parser +from .runtime import Context +from .runtime import new_context +from .runtime import Undefined +from .utils import _PassArg +from .utils import concat +from .utils import consume +from .utils import import_string +from .utils import internalcode +from .utils import LRUCache +from .utils import missing + +if t.TYPE_CHECKING: + import typing_extensions as te + + from .bccache import BytecodeCache + from .ext import Extension + from .loaders import BaseLoader + +_env_bound = t.TypeVar("_env_bound", bound="Environment") + + +# for direct template usage we have up to ten living environments +@lru_cache(maxsize=10) +def get_spontaneous_environment(cls: t.Type[_env_bound], *args: t.Any) -> _env_bound: + """Return a new spontaneous environment. A spontaneous environment + is used for templates created directly rather than through an + existing environment. + + :param cls: Environment class to create. + :param args: Positional arguments passed to environment. + """ + env = cls(*args) + env.shared = True + return env + + +def create_cache( + size: int, +) -> t.Optional[t.MutableMapping[t.Tuple["weakref.ref[t.Any]", str], "Template"]]: + """Return the cache class for the given size.""" + if size == 0: + return None + + if size < 0: + return {} + + return LRUCache(size) # type: ignore + + +def copy_cache( + cache: t.Optional[t.MutableMapping[t.Any, t.Any]], +) -> t.Optional[t.MutableMapping[t.Tuple["weakref.ref[t.Any]", str], "Template"]]: + """Create an empty copy of the given cache.""" + if cache is None: + return None + + if type(cache) is dict: # noqa E721 + return {} + + return LRUCache(cache.capacity) # type: ignore + + +def load_extensions( + environment: "Environment", + extensions: t.Sequence[t.Union[str, t.Type["Extension"]]], +) -> t.Dict[str, "Extension"]: + """Load the extensions from the list and bind it to the environment. + Returns a dict of instantiated extensions. + """ + result = {} + + for extension in extensions: + if isinstance(extension, str): + extension = t.cast(t.Type["Extension"], import_string(extension)) + + result[extension.identifier] = extension(environment) + + return result + + +def _environment_config_check(environment: _env_bound) -> _env_bound: + """Perform a sanity check on the environment.""" + assert issubclass( + environment.undefined, Undefined + ), "'undefined' must be a subclass of 'jinja2.Undefined'." + assert ( + environment.block_start_string + != environment.variable_start_string + != environment.comment_start_string + ), "block, variable and comment start strings must be different." + assert environment.newline_sequence in { + "\r", + "\r\n", + "\n", + }, "'newline_sequence' must be one of '\\n', '\\r\\n', or '\\r'." + return environment + + +class Environment: + r"""The core component of Jinja is the `Environment`. It contains + important shared variables like configuration, filters, tests, + globals and others. Instances of this class may be modified if + they are not shared and if no template was loaded so far. + Modifications on environments after the first template was loaded + will lead to surprising effects and undefined behavior. + + Here are the possible initialization parameters: + + `block_start_string` + The string marking the beginning of a block. Defaults to ``'{%'``. + + `block_end_string` + The string marking the end of a block. Defaults to ``'%}'``. + + `variable_start_string` + The string marking the beginning of a print statement. + Defaults to ``'{{'``. + + `variable_end_string` + The string marking the end of a print statement. Defaults to + ``'}}'``. + + `comment_start_string` + The string marking the beginning of a comment. Defaults to ``'{#'``. + + `comment_end_string` + The string marking the end of a comment. Defaults to ``'#}'``. + + `line_statement_prefix` + If given and a string, this will be used as prefix for line based + statements. See also :ref:`line-statements`. + + `line_comment_prefix` + If given and a string, this will be used as prefix for line based + comments. See also :ref:`line-statements`. + + .. versionadded:: 2.2 + + `trim_blocks` + If this is set to ``True`` the first newline after a block is + removed (block, not variable tag!). Defaults to `False`. + + `lstrip_blocks` + If this is set to ``True`` leading spaces and tabs are stripped + from the start of a line to a block. Defaults to `False`. + + `newline_sequence` + The sequence that starts a newline. Must be one of ``'\r'``, + ``'\n'`` or ``'\r\n'``. The default is ``'\n'`` which is a + useful default for Linux and OS X systems as well as web + applications. + + `keep_trailing_newline` + Preserve the trailing newline when rendering templates. + The default is ``False``, which causes a single newline, + if present, to be stripped from the end of the template. + + .. versionadded:: 2.7 + + `extensions` + List of Jinja extensions to use. This can either be import paths + as strings or extension classes. For more information have a + look at :ref:`the extensions documentation `. + + `optimized` + should the optimizer be enabled? Default is ``True``. + + `undefined` + :class:`Undefined` or a subclass of it that is used to represent + undefined values in the template. + + `finalize` + A callable that can be used to process the result of a variable + expression before it is output. For example one can convert + ``None`` implicitly into an empty string here. + + `autoescape` + If set to ``True`` the XML/HTML autoescaping feature is enabled by + default. For more details about autoescaping see + :class:`~markupsafe.Markup`. As of Jinja 2.4 this can also + be a callable that is passed the template name and has to + return ``True`` or ``False`` depending on autoescape should be + enabled by default. + + .. versionchanged:: 2.4 + `autoescape` can now be a function + + `loader` + The template loader for this environment. + + `cache_size` + The size of the cache. Per default this is ``400`` which means + that if more than 400 templates are loaded the loader will clean + out the least recently used template. If the cache size is set to + ``0`` templates are recompiled all the time, if the cache size is + ``-1`` the cache will not be cleaned. + + .. versionchanged:: 2.8 + The cache size was increased to 400 from a low 50. + + `auto_reload` + Some loaders load templates from locations where the template + sources may change (ie: file system or database). If + ``auto_reload`` is set to ``True`` (default) every time a template is + requested the loader checks if the source changed and if yes, it + will reload the template. For higher performance it's possible to + disable that. + + `bytecode_cache` + If set to a bytecode cache object, this object will provide a + cache for the internal Jinja bytecode so that templates don't + have to be parsed if they were not changed. + + See :ref:`bytecode-cache` for more information. + + `enable_async` + If set to true this enables async template execution which + allows using async functions and generators. + """ + + #: if this environment is sandboxed. Modifying this variable won't make + #: the environment sandboxed though. For a real sandboxed environment + #: have a look at jinja2.sandbox. This flag alone controls the code + #: generation by the compiler. + sandboxed = False + + #: True if the environment is just an overlay + overlayed = False + + #: the environment this environment is linked to if it is an overlay + linked_to: t.Optional["Environment"] = None + + #: shared environments have this set to `True`. A shared environment + #: must not be modified + shared = False + + #: the class that is used for code generation. See + #: :class:`~jinja2.compiler.CodeGenerator` for more information. + code_generator_class: t.Type["CodeGenerator"] = CodeGenerator + + concat = "".join + + #: the context class that is used for templates. See + #: :class:`~jinja2.runtime.Context` for more information. + context_class: t.Type[Context] = Context + + template_class: t.Type["Template"] + + def __init__( + self, + block_start_string: str = BLOCK_START_STRING, + block_end_string: str = BLOCK_END_STRING, + variable_start_string: str = VARIABLE_START_STRING, + variable_end_string: str = VARIABLE_END_STRING, + comment_start_string: str = COMMENT_START_STRING, + comment_end_string: str = COMMENT_END_STRING, + line_statement_prefix: t.Optional[str] = LINE_STATEMENT_PREFIX, + line_comment_prefix: t.Optional[str] = LINE_COMMENT_PREFIX, + trim_blocks: bool = TRIM_BLOCKS, + lstrip_blocks: bool = LSTRIP_BLOCKS, + newline_sequence: "te.Literal['\\n', '\\r\\n', '\\r']" = NEWLINE_SEQUENCE, + keep_trailing_newline: bool = KEEP_TRAILING_NEWLINE, + extensions: t.Sequence[t.Union[str, t.Type["Extension"]]] = (), + optimized: bool = True, + undefined: t.Type[Undefined] = Undefined, + finalize: t.Optional[t.Callable[..., t.Any]] = None, + autoescape: t.Union[bool, t.Callable[[t.Optional[str]], bool]] = False, + loader: t.Optional["BaseLoader"] = None, + cache_size: int = 400, + auto_reload: bool = True, + bytecode_cache: t.Optional["BytecodeCache"] = None, + enable_async: bool = False, + ): + # !!Important notice!! + # The constructor accepts quite a few arguments that should be + # passed by keyword rather than position. However it's important to + # not change the order of arguments because it's used at least + # internally in those cases: + # - spontaneous environments (i18n extension and Template) + # - unittests + # If parameter changes are required only add parameters at the end + # and don't change the arguments (or the defaults!) of the arguments + # existing already. + + # lexer / parser information + self.block_start_string = block_start_string + self.block_end_string = block_end_string + self.variable_start_string = variable_start_string + self.variable_end_string = variable_end_string + self.comment_start_string = comment_start_string + self.comment_end_string = comment_end_string + self.line_statement_prefix = line_statement_prefix + self.line_comment_prefix = line_comment_prefix + self.trim_blocks = trim_blocks + self.lstrip_blocks = lstrip_blocks + self.newline_sequence = newline_sequence + self.keep_trailing_newline = keep_trailing_newline + + # runtime information + self.undefined: t.Type[Undefined] = undefined + self.optimized = optimized + self.finalize = finalize + self.autoescape = autoescape + + # defaults + self.filters = DEFAULT_FILTERS.copy() + self.tests = DEFAULT_TESTS.copy() + self.globals = DEFAULT_NAMESPACE.copy() + + # set the loader provided + self.loader = loader + self.cache = create_cache(cache_size) + self.bytecode_cache = bytecode_cache + self.auto_reload = auto_reload + + # configurable policies + self.policies = DEFAULT_POLICIES.copy() + + # load extensions + self.extensions = load_extensions(self, extensions) + + self.is_async = enable_async + _environment_config_check(self) + + def add_extension(self, extension: t.Union[str, t.Type["Extension"]]) -> None: + """Adds an extension after the environment was created. + + .. versionadded:: 2.5 + """ + self.extensions.update(load_extensions(self, [extension])) + + def extend(self, **attributes: t.Any) -> None: + """Add the items to the instance of the environment if they do not exist + yet. This is used by :ref:`extensions ` to register + callbacks and configuration values without breaking inheritance. + """ + for key, value in attributes.items(): + if not hasattr(self, key): + setattr(self, key, value) + + def overlay( + self, + block_start_string: str = missing, + block_end_string: str = missing, + variable_start_string: str = missing, + variable_end_string: str = missing, + comment_start_string: str = missing, + comment_end_string: str = missing, + line_statement_prefix: t.Optional[str] = missing, + line_comment_prefix: t.Optional[str] = missing, + trim_blocks: bool = missing, + lstrip_blocks: bool = missing, + newline_sequence: "te.Literal['\\n', '\\r\\n', '\\r']" = missing, + keep_trailing_newline: bool = missing, + extensions: t.Sequence[t.Union[str, t.Type["Extension"]]] = missing, + optimized: bool = missing, + undefined: t.Type[Undefined] = missing, + finalize: t.Optional[t.Callable[..., t.Any]] = missing, + autoescape: t.Union[bool, t.Callable[[t.Optional[str]], bool]] = missing, + loader: t.Optional["BaseLoader"] = missing, + cache_size: int = missing, + auto_reload: bool = missing, + bytecode_cache: t.Optional["BytecodeCache"] = missing, + enable_async: bool = missing, + ) -> "te.Self": + """Create a new overlay environment that shares all the data with the + current environment except for cache and the overridden attributes. + Extensions cannot be removed for an overlayed environment. An overlayed + environment automatically gets all the extensions of the environment it + is linked to plus optional extra extensions. + + Creating overlays should happen after the initial environment was set + up completely. Not all attributes are truly linked, some are just + copied over so modifications on the original environment may not shine + through. + + .. versionchanged:: 3.1.5 + ``enable_async`` is applied correctly. + + .. versionchanged:: 3.1.2 + Added the ``newline_sequence``, ``keep_trailing_newline``, + and ``enable_async`` parameters to match ``__init__``. + """ + args = dict(locals()) + del args["self"], args["cache_size"], args["extensions"], args["enable_async"] + + rv = object.__new__(self.__class__) + rv.__dict__.update(self.__dict__) + rv.overlayed = True + rv.linked_to = self + + for key, value in args.items(): + if value is not missing: + setattr(rv, key, value) + + if cache_size is not missing: + rv.cache = create_cache(cache_size) + else: + rv.cache = copy_cache(self.cache) + + rv.extensions = {} + for key, value in self.extensions.items(): + rv.extensions[key] = value.bind(rv) + if extensions is not missing: + rv.extensions.update(load_extensions(rv, extensions)) + + if enable_async is not missing: + rv.is_async = enable_async + + return _environment_config_check(rv) + + @property + def lexer(self) -> Lexer: + """The lexer for this environment.""" + return get_lexer(self) + + def iter_extensions(self) -> t.Iterator["Extension"]: + """Iterates over the extensions by priority.""" + return iter(sorted(self.extensions.values(), key=lambda x: x.priority)) + + def getitem( + self, obj: t.Any, argument: t.Union[str, t.Any] + ) -> t.Union[t.Any, Undefined]: + """Get an item or attribute of an object but prefer the item.""" + try: + return obj[argument] + except (AttributeError, TypeError, LookupError): + if isinstance(argument, str): + try: + attr = str(argument) + except Exception: + pass + else: + try: + return getattr(obj, attr) + except AttributeError: + pass + return self.undefined(obj=obj, name=argument) + + def getattr(self, obj: t.Any, attribute: str) -> t.Any: + """Get an item or attribute of an object but prefer the attribute. + Unlike :meth:`getitem` the attribute *must* be a string. + """ + try: + return getattr(obj, attribute) + except AttributeError: + pass + try: + return obj[attribute] + except (TypeError, LookupError, AttributeError): + return self.undefined(obj=obj, name=attribute) + + def _filter_test_common( + self, + name: t.Union[str, Undefined], + value: t.Any, + args: t.Optional[t.Sequence[t.Any]], + kwargs: t.Optional[t.Mapping[str, t.Any]], + context: t.Optional[Context], + eval_ctx: t.Optional[EvalContext], + is_filter: bool, + ) -> t.Any: + if is_filter: + env_map = self.filters + type_name = "filter" + else: + env_map = self.tests + type_name = "test" + + func = env_map.get(name) # type: ignore + + if func is None: + msg = f"No {type_name} named {name!r}." + + if isinstance(name, Undefined): + try: + name._fail_with_undefined_error() + except Exception as e: + msg = f"{msg} ({e}; did you forget to quote the callable name?)" + + raise TemplateRuntimeError(msg) + + args = [value, *(args if args is not None else ())] + kwargs = kwargs if kwargs is not None else {} + pass_arg = _PassArg.from_obj(func) + + if pass_arg is _PassArg.context: + if context is None: + raise TemplateRuntimeError( + f"Attempted to invoke a context {type_name} without context." + ) + + args.insert(0, context) + elif pass_arg is _PassArg.eval_context: + if eval_ctx is None: + if context is not None: + eval_ctx = context.eval_ctx + else: + eval_ctx = EvalContext(self) + + args.insert(0, eval_ctx) + elif pass_arg is _PassArg.environment: + args.insert(0, self) + + return func(*args, **kwargs) + + def call_filter( + self, + name: str, + value: t.Any, + args: t.Optional[t.Sequence[t.Any]] = None, + kwargs: t.Optional[t.Mapping[str, t.Any]] = None, + context: t.Optional[Context] = None, + eval_ctx: t.Optional[EvalContext] = None, + ) -> t.Any: + """Invoke a filter on a value the same way the compiler does. + + This might return a coroutine if the filter is running from an + environment in async mode and the filter supports async + execution. It's your responsibility to await this if needed. + + .. versionadded:: 2.7 + """ + return self._filter_test_common( + name, value, args, kwargs, context, eval_ctx, True + ) + + def call_test( + self, + name: str, + value: t.Any, + args: t.Optional[t.Sequence[t.Any]] = None, + kwargs: t.Optional[t.Mapping[str, t.Any]] = None, + context: t.Optional[Context] = None, + eval_ctx: t.Optional[EvalContext] = None, + ) -> t.Any: + """Invoke a test on a value the same way the compiler does. + + This might return a coroutine if the test is running from an + environment in async mode and the test supports async execution. + It's your responsibility to await this if needed. + + .. versionchanged:: 3.0 + Tests support ``@pass_context``, etc. decorators. Added + the ``context`` and ``eval_ctx`` parameters. + + .. versionadded:: 2.7 + """ + return self._filter_test_common( + name, value, args, kwargs, context, eval_ctx, False + ) + + @internalcode + def parse( + self, + source: str, + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + ) -> nodes.Template: + """Parse the sourcecode and return the abstract syntax tree. This + tree of nodes is used by the compiler to convert the template into + executable source- or bytecode. This is useful for debugging or to + extract information from templates. + + If you are :ref:`developing Jinja extensions ` + this gives you a good overview of the node tree generated. + """ + try: + return self._parse(source, name, filename) + except TemplateSyntaxError: + self.handle_exception(source=source) + + def _parse( + self, source: str, name: t.Optional[str], filename: t.Optional[str] + ) -> nodes.Template: + """Internal parsing function used by `parse` and `compile`.""" + return Parser(self, source, name, filename).parse() + + def lex( + self, + source: str, + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + ) -> t.Iterator[t.Tuple[int, str, str]]: + """Lex the given sourcecode and return a generator that yields + tokens as tuples in the form ``(lineno, token_type, value)``. + This can be useful for :ref:`extension development ` + and debugging templates. + + This does not perform preprocessing. If you want the preprocessing + of the extensions to be applied you have to filter source through + the :meth:`preprocess` method. + """ + source = str(source) + try: + return self.lexer.tokeniter(source, name, filename) + except TemplateSyntaxError: + self.handle_exception(source=source) + + def preprocess( + self, + source: str, + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + ) -> str: + """Preprocesses the source with all extensions. This is automatically + called for all parsing and compiling methods but *not* for :meth:`lex` + because there you usually only want the actual source tokenized. + """ + return reduce( + lambda s, e: e.preprocess(s, name, filename), + self.iter_extensions(), + str(source), + ) + + def _tokenize( + self, + source: str, + name: t.Optional[str], + filename: t.Optional[str] = None, + state: t.Optional[str] = None, + ) -> TokenStream: + """Called by the parser to do the preprocessing and filtering + for all the extensions. Returns a :class:`~jinja2.lexer.TokenStream`. + """ + source = self.preprocess(source, name, filename) + stream = self.lexer.tokenize(source, name, filename, state) + + for ext in self.iter_extensions(): + stream = ext.filter_stream(stream) # type: ignore + + if not isinstance(stream, TokenStream): + stream = TokenStream(stream, name, filename) + + return stream + + def _generate( + self, + source: nodes.Template, + name: t.Optional[str], + filename: t.Optional[str], + defer_init: bool = False, + ) -> str: + """Internal hook that can be overridden to hook a different generate + method in. + + .. versionadded:: 2.5 + """ + return generate( # type: ignore + source, + self, + name, + filename, + defer_init=defer_init, + optimized=self.optimized, + ) + + def _compile(self, source: str, filename: str) -> CodeType: + """Internal hook that can be overridden to hook a different compile + method in. + + .. versionadded:: 2.5 + """ + return compile(source, filename, "exec") + + @typing.overload + def compile( + self, + source: t.Union[str, nodes.Template], + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + raw: "te.Literal[False]" = False, + defer_init: bool = False, + ) -> CodeType: ... + + @typing.overload + def compile( + self, + source: t.Union[str, nodes.Template], + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + raw: "te.Literal[True]" = ..., + defer_init: bool = False, + ) -> str: ... + + @internalcode + def compile( + self, + source: t.Union[str, nodes.Template], + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + raw: bool = False, + defer_init: bool = False, + ) -> t.Union[str, CodeType]: + """Compile a node or template source code. The `name` parameter is + the load name of the template after it was joined using + :meth:`join_path` if necessary, not the filename on the file system. + the `filename` parameter is the estimated filename of the template on + the file system. If the template came from a database or memory this + can be omitted. + + The return value of this method is a python code object. If the `raw` + parameter is `True` the return value will be a string with python + code equivalent to the bytecode returned otherwise. This method is + mainly used internally. + + `defer_init` is use internally to aid the module code generator. This + causes the generated code to be able to import without the global + environment variable to be set. + + .. versionadded:: 2.4 + `defer_init` parameter added. + """ + source_hint = None + try: + if isinstance(source, str): + source_hint = source + source = self._parse(source, name, filename) + source = self._generate(source, name, filename, defer_init=defer_init) + if raw: + return source + if filename is None: + filename = "